ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDA2MGE3MWQuLjhkMTU4MzAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNDUsMyArNDUsNiBAQAogCiAjIGNzY29wZSBmaWxlcwogY3Njb3BlLioKKworKi5vcmlnCisqLnJlagpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKaW5kZXggZjA4Y2E5NS4uOGIwNTYzNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCkBAIC0xMiw2ICsxMiw4IEBACiAKIDAwLUlOREVYCiAJLSB0aGlzIGZpbGUuCitBQkkvCisJLSBpbmZvIG9uIGtlcm5lbCA8LT4gdXNlcnNwYWNlIEFCSSBhbmQgcmVsYXRpdmUgaW50ZXJmYWNlIHN0YWJpbGl0eS4KIEJVRy1IVU5USU5HCiAJLSBicnV0ZSBmb3JjZSBtZXRob2Qgb2YgZG9pbmcgYmluYXJ5IHNlYXJjaCBvZiBwYXRjaGVzIHRvIGZpbmQgYnVnLgogQ2hhbmdlcwpAQCAtMjUsMzcgKzI3LDU3IEBACiBEb2NCb29rLwogCS0gZGlyZWN0b3J5IHdpdGggRG9jQm9vayB0ZW1wbGF0ZXMgZXRjLiBmb3Iga2VybmVsIGRvY3VtZW50YXRpb24uCiBIT1dUTwotCS0gVGhlIHByb2Nlc3MgYW5kIHByb2NlZHVyZXMgb2YgaG93IHRvIGRvIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudC4KKwktIHRoZSBwcm9jZXNzIGFuZCBwcm9jZWR1cmVzIG9mIGhvdyB0byBkbyBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQuCiBJTy1tYXBwaW5nLnR4dAogCS0gaG93IHRvIGFjY2VzcyBJL08gbWFwcGVkIG1lbW9yeSBmcm9tIHdpdGhpbiBkZXZpY2UgZHJpdmVycy4KIElQTUkudHh0CiAJLSBpbmZvIG9uIExpbnV4IEludGVsbGlnZW50IFBsYXRmb3JtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChJUE1JKSBEcml2ZXIuCiBJUlEtYWZmaW5pdHkudHh0CiAJLSBob3cgdG8gc2VsZWN0IHdoaWNoIENQVShzKSBoYW5kbGUgd2hpY2ggaW50ZXJydXB0IGV2ZW50cyBvbiBTTVAuCitJUlEudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB3aGF0IGFuIElSUSBpcy4KIE1hbmFnZW1lbnRTdHlsZQogCS0gaG93IHRvIChhdHRlbXB0IHRvKSBtYW5hZ2Uga2VybmVsIGhhY2tlcnMuCiBNU0ktSE9XVE8udHh0CiAJLSB0aGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHRzIChNU0kpIERyaXZlciBHdWlkZSBIT1dUTyBhbmQgRkFRLgorUENJRUJVUy1IT1dUTy50eHQKKwktIGEgZ3VpZGUgZGVzY3JpYmluZyB0aGUgUENJIEV4cHJlc3MgUG9ydCBCdXMgZHJpdmVyLgogUkNVLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBvbiBSQ1UgKHJlYWQtY29weSB1cGRhdGUpLgogUkVBRE1FLkRBQzk2MAogCS0gaW5mbyBvbiBNeWxleCBEQUM5NjAvREFDMTEwMCBQQ0kgUkFJRCBDb250cm9sbGVyIERyaXZlciBmb3IgTGludXguCitSRUFETUUuY3ljbGFkZXNaCisJLSBpbmZvIG9uIEN5Y2xhZGVzLVogZmlybXdhcmUgbG9hZGluZy4KIFNBSy50eHQKIAktIGluZm8gb24gU2VjdXJlIEF0dGVudGlvbiBLZXlzLgorU2VjdXJpdHlCdWdzCisJLSBwcm9jZWR1cmUgZm9yIHJlcG9ydGluZyBzZWN1cml0eSBidWdzIGZvdW5kIGluIHRoZSBrZXJuZWwuCitTdWJtaXRDaGVja2xpc3QKKwktIExpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdC4KIFN1Ym1pdHRpbmdEcml2ZXJzCiAJLSBwcm9jZWR1cmUgdG8gZ2V0IGEgbmV3IGRyaXZlciBzb3VyY2UgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHRyZWUuCiBTdWJtaXR0aW5nUGF0Y2hlcwogCS0gcHJvY2VkdXJlIHRvIGdldCBhIHNvdXJjZSBwYXRjaCBpbmNsdWRlZCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4KIFZHQS1zb2Z0Y3Vyc29yLnR4dAogCS0gaG93IHRvIGNoYW5nZSB5b3VyIFZHQSBjdXJzb3IgZnJvbSBhIGJsaW5raW5nIHVuZGVyc2NvcmUuCithY2NvdW50aW5nLworCS0gZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50aW5nIGFuZCB0YXNrc3RhdHMuCithb2UvCisJLSBkZXNjcmlwdGlvbiBvZiBBb0UgKEFUQSBvdmVyIEV0aGVybmV0KSBhbG9uZyB3aXRoIGNvbmZpZyBleGFtcGxlcy4KIGFwcGx5aW5nLXBhdGNoZXMudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB2YXJpb3VzIHRyZWVzIGFuZCBob3cgdG8gYXBwbHkgdGhlaXIgcGF0Y2hlcy4KIGFybS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gYWJvdXQgTGludXggb24gdGhlIEFSTSBhcmNoaXRlY3R1cmUuCithdG9taWNfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBhdG9taWMgYW5kIGJpdG1hc2sgb3BlcmF0aW9ucy4KK2F1eGRpc3BsYXkvCisJLSBtaXNjLiBMQ0QgZHJpdmVyIGRvY3VtZW50YXRpb24gKGNmYWcxMjg2NGIsIGtzMDEwOCkuCiBiYXNpY19wcm9maWxpbmcudHh0CiAJLSBiYXNpYyBpbnN0cnVjdGlvbnMgZm9yIHRob3NlIHdobyB3YW50cyB0byBwcm9maWxlIExpbnV4IGtlcm5lbC4KIGJpbmZtdF9taXNjLnR4dAogCS0gaW5mbyBvbiB0aGUga2VybmVsIHN1cHBvcnQgZm9yIGV4dHJhIGJpbmFyeSBmb3JtYXRzLgorYmxhY2tmaW4vCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQmxhY2tmaW4gYXJjaC4KIGJsb2NrLwogCS0gaW5mbyBvbiB0aGUgQmxvY2sgSS9PIChCSU8pIGxheWVyLgogY2FjaGV0bGIudHh0CkBAIC02OCwxNiArOTAsMzIgQEAKIAktIGNsaSgpL3N0aSgpIHJlbW92YWwgZ3VpZGUuCiBjb21wdXRvbmUudHh0CiAJLSBpbmZvIG9uIENvbXB1dG9uZSBJbnRlbGxpcG9ydCBJSS9QbHVzIE11bHRpcG9ydCBTZXJpYWwgRHJpdmVyLgorY29ubmVjdG9yLworCS0gZG9jcyBvbiB0aGUgbmV0bGluayBiYXNlZCB1c2Vyc3BhY2U8LT5rZXJuZWwgc3BhY2UgY29tbXVuaWNhdGlvbiBtb2QuCitjb25zb2xlLworCS0gZG9jdW1lbnRhdGlvbiBvbiBMaW51eCBjb25zb2xlIGRyaXZlcnMuCiBjcHFhcnJheS50eHQKIAktIGluZm8gb24gdXNpbmcgQ29tcGFxJ3MgU01BUlQyIEludGVsbGlnZW50IERpc2sgQXJyYXkgQ29udHJvbGxlcnMuCiBjcHUtZnJlcS8KIAktIGluZm8gb24gQ1BVIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBzY2FsaW5nLgorY3B1LWhvdHBsdWcudHh0CisJLSBkb2N1bWVudCBkZXNjcmliaW5nIENQVSBob3RwbHVnIHN1cHBvcnQgaW4gdGhlIExpbnV4IGtlcm5lbC4KK2NwdS1sb2FkLnR4dAorCS0gZG9jdW1lbnQgZGVzY3JpYmluZyBob3cgQ1BVIGxvYWQgc3RhdGlzdGljcyBhcmUgY29sbGVjdGVkLgorY3B1c2V0cy50eHQKKwktIGRvY3VtZW50cyB0aGUgY3B1c2V0cyBmZWF0dXJlOyBhc3NpZ24gQ1BVcyBhbmQgTWVtIHRvIGEgc2V0IG9mIHRhc2tzLgorY3B1dG9wb2xvZ3kudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGhvdyBDUFUgdG9wb2xvZ3kgaW5mbyBpcyBleHBvcnRlZCB2aWEgc3lzZnMuCiBjcmlzLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBDUklTIGFyY2hpdGVjdHVyZS4KIGNyeXB0by8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIENyeXB0byBBUEkuCitkY2RiYXMudHh0CisJLSBpbmZvcm1hdGlvbiBvbiB0aGUgRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIuCiBkZWJ1Z2dpbmctbW9kdWxlcy50eHQKIAktIHNvbWUgbm90ZXMgb24gZGVidWdnaW5nIG1vZHVsZXMgYWZ0ZXIgTGludXggMi42LjMuCitkZWxsX3JidS50eHQKKwktIGRvY3VtZW50IGRlbW9uc3RyYXRpbmcgdGhlIHVzZSBvZiB0aGUgRGVsbCBSZW1vdGUgQklPUyBVcGRhdGUgZHJpdmVyLgogZGV2aWNlLW1hcHBlci8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gRGV2aWNlIE1hcHBlci4KIGRldmljZXMudHh0CkBAIC04NiwzMiArMTI0LDUyIEBACiAJLSBpbmZvIG9uIERpZ2kgSW50bC4ge1BDLFBDSSxFSVNBfVh4IGFuZCBYZW0gc2VyaWVzIGNhcmRzLgogZG5vdGlmeS50eHQKIAktIGluZm8gYWJvdXQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBpbiBMaW51eC4KK2RvbnRkaWZmCisJLSBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGRpZmYnZWQuCiBkcml2ZXItbW9kZWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IGRyaXZlciBtb2RlbC4KK2RyaXZlcnMvCisJLSBkaXJlY3Rvcnkgd2l0aCBkcml2ZXIgZG9jdW1lbnRhdGlvbiAoY3VycmVudGx5IG9ubHkgRURBQykuCiBkdmIvCiAJLSBpbmZvIG9uIExpbnV4IERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0IChEVkIpIHN1YnN5c3RlbS4KIGVhcmx5LXVzZXJzcGFjZS8KIAktIGluZm8gYWJvdXQgaW5pdHJhbWZzLCBrbGliYywgYW5kIHVzZXJzcGFjZSBlYXJseSBkdXJpbmcgYm9vdC4KK2VjcnlwdGZzLnR4dAorCS0gZG9jcyBvbiBlQ3J5cHRmczogc3RhY2tlZCBjcnlwdG9ncmFwaGljIGZpbGVzeXN0ZW0gZm9yIExpbnV4LgogZWlzYS50eHQKIAktIGluZm8gb24gRUlTQSBidXMgc3VwcG9ydC4KIGV4Y2VwdGlvbi50eHQKIAktIGhvdyBMaW51eCB2Mi4yIGhhbmRsZXMgZXhjZXB0aW9ucyB3aXRob3V0IHZlcmlmeV9hcmVhIGV0Yy4KK2ZhdWx0LWluamVjdGlvbi8KKwktIGRpciB3aXRoIGRvY3MgYWJvdXQgdGhlIGZhdWx0IGluamVjdGlvbiBjYXBhYmlsaXRpZXMgaW5mcmFzdHJ1Y3R1cmUuCiBmYi8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGZyYW1lIGJ1ZmZlciBncmFwaGljcyBhYnN0cmFjdGlvbiBsYXllci4KK2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKwktIGxpc3Qgb2YgZmlsZXMgYW5kIGZlYXR1cmVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlbW92ZWQuCiBmaWxlc3lzdGVtcy8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIHZhcmlvdXMgZmlsZXN5c3RlbXMgdGhhdCBMaW51eCBzdXBwb3J0cy4KIGZpcm13YXJlX2NsYXNzLwogCS0gcmVxdWVzdF9maXJtd2FyZSgpIGhvdHBsdWcgaW50ZXJmYWNlIGluZm8uCiBmbG9wcHkudHh0CiAJLSBub3RlcyBhbmQgZHJpdmVyIG9wdGlvbnMgZm9yIHRoZSBmbG9wcHkgZGlzayBkcml2ZXIuCitmdWppdHN1LworCS0gRnVqaXRzdSBGUi1WIExpbnV4IGRvY3VtZW50YXRpb24uCitncGlvLnR4dAorCS0gb3ZlcnZpZXcgb2YgR1BJTyAoR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCkgYWNjZXNzIGNvbnZlbnRpb25zLgogaGF5ZXMtZXNwLnR4dAogCS0gaW5mbyBvbiB1c2luZyB0aGUgSGF5ZXMgRVNQIHNlcmlhbCBkcml2ZXIuCiBoaWdodWlkLnR4dAogCS0gbm90ZXMgb24gdGhlIGNoYW5nZSBmcm9tIDE2IGJpdCB0byAzMiBiaXQgdXNlci9ncm91cCBJRHMuCiBocGV0LnR4dAogCS0gSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgRHJpdmVyIGZvciBMaW51eC4KK2hydGltZXIvCisJLSBpbmZvIG9uIHRoZSB0aW1lcl9zdGF0cyBkZWJ1Z2dpbmcgZmFjaWxpdHkgZm9yIHRpbWVyIChhYil1c2UuCitocnRpbWVycy8KKwktIGluZm8gb24gdGhlIGhydGltZXJzIHN1YnN5c3RlbSBmb3IgaGlnaC1yZXNvbHV0aW9uIGtlcm5lbCB0aW1lcnMuCiBod19yYW5kb20udHh0CiAJLSBpbmZvIG9uIExpbnV4IHN1cHBvcnQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluIGk4eHggY2hpcHNldHMuCitod21vbi8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3Mgb24gdmFyaW91cyBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlcnMuCiBpMmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IHRoZSBJMkMgYnVzL3Byb3RvY29sICgyIHdpcmUsIGtIeiBzcGVlZCkuCiBpMm8vCkBAIC0xMjIsMTYgKzE4MCwyMiBAQAogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBJbnRlbCA2NCBiaXQgYXJjaGl0ZWN0dXJlLgogaWRlLnR4dAogCS0gaW1wb3J0YW50IGluZm8gZm9yIHVzZXJzIG9mIEFUQSBkZXZpY2VzIChJREUvRUlERSBkaXNrcyBhbmQgQ0QtUk9NUykuCitpbmZpbmliYW5kLworCS0gZGlyZWN0b3J5IHdpdGggZG9jdW1lbnRzIGNvbmNlcm5pbmcgTGludXggSW5maW5pQmFuZCBzdXBwb3J0LgogaW5pdHJkLnR4dAogCS0gaG93IHRvIHVzZSB0aGUgUkFNIGRpc2sgYXMgYW4gaW5pdGlhbC90ZW1wb3Jhcnkgcm9vdCBmaWxlc3lzdGVtLgogaW5wdXQvCiAJLSBpbmZvIG9uIExpbnV4IGlucHV0IGRldmljZSBzdXBwb3J0LgogaW9fb3JkZXJpbmcudHh0CiAJLSBpbmZvIG9uIG9yZGVyaW5nIEkvTyB3cml0ZXMgdG8gbWVtb3J5LW1hcHBlZCBhZGRyZXNzZXMuCitpb2N0bC8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3VtZW50cyBkZXNjcmliaW5nIHZhcmlvdXMgSU9DVEwgY2FsbHMuCiBpb2N0bC1udW1iZXIudHh0CiAJLSBob3cgdG8gaW1wbGVtZW50IGFuZCByZWdpc3RlciBkZXZpY2UvZHJpdmVyIGlvY3RsIGNhbGxzLgogaW9zdGF0cy50eHQKIAktIGluZm8gb24gSS9PIHN0YXRpc3RpY3MgTGludXgga2VybmVsIHByb3ZpZGVzLgoraXJxZmxhZ3MtdHJhY2luZy50eHQKKwktIGhvdyB0byB1c2UgdGhlIGlycS1mbGFncyB0cmFjaW5nIGZlYXR1cmUuCiBpc2FwbnAudHh0CiAJLSBpbmZvIG9uIExpbnV4IElTQSBQbHVnICYgUGxheSBzdXBwb3J0LgogaXNkbi8KQEAgLTE0MCwyNiArMjA0LDQwIEBACiAJLSBpbmZvIG9uIHRoZSBpbi1rZXJuZWwgYmluYXJ5IHN1cHBvcnQgZm9yIEphdmEodG0pLgoga2J1aWxkLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCB0aGUga2VybmVsIGJ1aWxkIHByb2Nlc3MuCi1rZHVtcHQudHh0Ci0gICAgICAgLSBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgora2R1bXAvCisJLSBkaXJlY3Rvcnkgd2l0aCBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgoga2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAogCS0gbWluaSBIb3dUbyBvbiBnZW5lcmF0aW9uIGFuZCBsb2NhdGlvbiBvZiBrZXJuZWwgZG9jdW1lbnRhdGlvbiBmaWxlcy4KIGtlcm5lbC1kb2NzLnR4dAogCS0gbGlzdGluZyBvZiB2YXJpb3VzIFdXVyArIGJvb2tzIHRoYXQgZG9jdW1lbnQga2VybmVsIGludGVybmFscy4KIGtlcm5lbC1wYXJhbWV0ZXJzLnR4dAogCS0gc3VtbWFyeSBsaXN0aW5nIG9mIGNvbW1hbmQgbGluZSAvIGJvb3QgcHJvbXB0IGFyZ3MgZm9yIHRoZSBrZXJuZWwuCitrZXlzLXJlcXVlc3Qta2V5LnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIGtlcm5lbCBrZXkgcmVxdWVzdCBzZXJ2aWNlLgora2V5cy50eHQKKwktIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXJuZWwga2V5IHJldGVudGlvbiBzZXJ2aWNlLgoga29iamVjdC50eHQKIAktIGluZm8gb2YgdGhlIGtvYmplY3QgaW5mcmFzdHJ1Y3R1cmUgb2YgdGhlIExpbnV4IGtlcm5lbC4KK2twcm9iZXMudHh0CisJLSBkb2N1bWVudHMgdGhlIGtlcm5lbCBwcm9iZXMgZGVidWdnaW5nIGZlYXR1cmUuCitrcmVmLnR4dAorCS0gZG9jcyBvbiBhZGRpbmcgcmVmZXJlbmNlIGNvdW50ZXJzIChrcmVmcykgdG8ga2VybmVsIG9iamVjdHMuCiBsYXB0b3AtbW9kZS50eHQKLQktIEhvdyB0byBjb25zZXJ2ZSBiYXR0ZXJ5IHBvd2VyIHVzaW5nIGxhcHRvcC1tb2RlLgorCS0gaG93IHRvIGNvbnNlcnZlIGJhdHRlcnkgcG93ZXIgdXNpbmcgbGFwdG9wLW1vZGUuCiBsZG0udHh0CiAJLSBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIExETSAoV2luZG93cyBEeW5hbWljIERpc2tzKS4KK2xlZHMtY2xhc3MudHh0CisJLSBkb2N1bWVudHMgTEVEIGhhbmRsaW5nIHVuZGVyIExpbnV4LgorbG9jYWxfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBsb2NhbCBhdG9taWMgb3BlcmF0aW9ucy4KK2xvY2tkZXAtZGVzaWduLnR4dAorCS0gZG9jdW1lbnRhdGlvbiBvbiB0aGUgcnVudGltZSBsb2NraW5nIGNvcnJlY3RuZXNzIHZhbGlkYXRvci4KIGxvY2tzLnR4dAogCS0gaW5mbyBvbiBmaWxlIGxvY2tpbmcgaW1wbGVtZW50YXRpb25zLCBmbG9jaygpIHZzLiBmY250bCgpLCBldGMuCiBsb2dvLmdpZgotCS0gRnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4pLgorCS0gZnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4gLSBUdXgpLgogbG9nby50eHQKLQktIEluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KKwktIGluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KIG02OGsvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIE1vdG9yb2xhIDY4ayBhcmNoaXRlY3R1cmUuCiBtYWdpYy1udW1iZXIudHh0CkBAIC0xNzAsNiArMjQ4LDggQEAKIAktIGluZm8gb24gc3VwcG9ydGluZyBNaWNybyBDaGFubmVsIEFyY2hpdGVjdHVyZSAoZS5nLiBQUy8yKSBzeXN0ZW1zLgogbWQudHh0CiAJLSBpbmZvIG9uIGJvb3QgYXJndW1lbnRzIGZvciB0aGUgbXVsdGlwbGUgZGV2aWNlcyBkcml2ZXIuCittZW1vcnktYmFycmllcnMudHh0CisJLSBpbmZvIG9uIExpbnV4IGtlcm5lbCBtZW1vcnkgYmFycmllcnMuCiBtZW1vcnkudHh0CiAJLSBpbmZvIG9uIHR5cGljYWwgTGludXggbWVtb3J5IHByb2JsZW1zLgogbWlwcy8KQEAgLTE3Nyw5ICsyNTcsMTEgQEAKIG1vbm8udHh0CiAJLSBob3cgdG8gZXhlY3V0ZSBNb25vLWJhc2VkIC5ORVQgYmluYXJpZXMgd2l0aCB0aGUgaGVscCBvZiBCSU5GTVRfTUlTQy4KIG1veGEtc21hcnRpbwotCS0gaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisJLSBmaWxlIHdpdGggaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBtdHJyLnR4dAogCS0gaG93IHRvIHVzZSBQUHJvIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZS4KK211dGV4LWRlc2lnbi50eHQKKwktIGluZm8gb24gdGhlIGdlbmVyaWMgbXV0ZXggc3Vic3lzdGVtLgogbmJkLnR4dAogCS0gaW5mbyBvbiBhIFRDUCBpbXBsZW1lbnRhdGlvbiBvZiBhIG5ldHdvcmsgYmxvY2sgZGV2aWNlLgogbmV0bGFiZWwvCkBAIC0xOTAsNiArMjcyLDggQEAKIAktIHNob3J0IGd1aWRlIG9uIHNldHRpbmcgdXAgYSBkaXNrbGVzcyBib3ggd2l0aCBORlMgcm9vdCBmaWxlc3lzdGVtLgogbm1pX3dhdGNoZG9nLnR4dAogCS0gaW5mbyBvbiBOTUkgd2F0Y2hkb2cgZm9yIFNNUCBzeXN0ZW1zLgorbm9tbXUtbW1hcC50eHQKKwktIGRvY3VtZW50YXRpb24gYWJvdXQgbm8tbW11IG1lbW9yeSBtYXBwaW5nIHN1cHBvcnQuCiBudW1hc3RhdC50eHQKIAktIGluZm8gb24gaG93IHRvIHJlYWQgTnVtYSBwb2xpY3kgaGl0L21pc3Mgc3RhdGlzdGljcyBpbiBzeXNmcy4KIG9vcHMtdHJhY2luZy50eHQKQEAgLTIwMiw4ICsyODYsMTYgQEAKIAktIGhvdyB0byB1c2UgdGhlIHBhcmFsbGVsLXBvcnQgZHJpdmVyLgogcGFycG9ydC1sb3dsZXZlbC50eHQKIAktIGRlc2NyaXB0aW9uIGFuZCB1c2FnZSBvZiB0aGUgbG93IGxldmVsIHBhcmFsbGVsIHBvcnQgZnVuY3Rpb25zLgorcGNpLWVycm9yLXJlY292ZXJ5LnR4dAorCS0gaW5mbyBvbiBQQ0kgZXJyb3IgcmVjb3ZlcnkuCiBwY2kudHh0CiAJLSBpbmZvIG9uIHRoZSBQQ0kgc3Vic3lzdGVtIGZvciBkZXZpY2UgZHJpdmVyIGF1dGhvcnMuCitwY2llYWVyLWhvd3RvLnR4dAorCS0gdGhlIFBDSSBFeHByZXNzIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyBEcml2ZXIgR3VpZGUgSE9XVE8uCitwY21jaWEvCisJLSBpbmZvIG9uIHRoZSBMaW51eCBQQ01DSUEgZHJpdmVyLgorcGktZnV0ZXgudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGxpZ2h0d2VpZ2h0IFBJLWZ1dGV4ZXMuCiBwbS50eHQKIAktIGluZm8gb24gTGludXggcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0LgogcG5wLnR4dApAQCAtMjE0LDE4ICszMDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggd2l0aCB0aGUgUG93ZXJQQy4KIHByZWVtcHQtbG9ja2luZy50eHQKIAktIGluZm8gb24gbG9ja2luZyB1bmRlciBhIHByZWVtcHRpdmUga2VybmVsLgorcHJpb190cmVlLnR4dAorCS0gaW5mbyBvbiByYWRpeC1wcmlvcml0eS1zZWFyY2gtdHJlZSB1c2UgZm9yIGluZGV4aW5nIHZtYXMuCiByYW1kaXNrLnR4dAogCS0gc2hvcnQgZ3VpZGUgb24gaG93IHRvIHNldCB1cCBhbmQgdXNlIHRoZSBSQU0gZGlzay4KK3JidHJlZS50eHQKKwktIGluZm8gb24gd2hhdCByZWQtYmxhY2sgdHJlZXMgYXJlIGFuZCB3aGF0IHRoZXkgYXJlIGZvci4KIHJpc2NvbTgudHh0CiAJLSBub3RlcyBvbiB1c2luZyB0aGUgUklTQ29tLzggbXVsdGktcG9ydCBzZXJpYWwgZHJpdmVyLgorcm9idXN0LWZ1dGV4LUFCSS50eHQKKwktIGRvY3VtZW50YXRpb24gb2YgdGhlIHJvYnVzdCBmdXRleCBBQkkuCityb2J1c3QtZnV0ZXhlcy50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCByb2J1c3QgZnV0ZXhlcyBhcmUuCiByb2NrZXQudHh0CiAJLSBpbmZvIG9uIHRoZSBDb210cm9sIFJvY2tldFBvcnQgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBycGMtY2FjaGUudHh0CiAJLSBpbnRyb2R1Y3Rpb24gdG8gdGhlIGNhY2hpbmcgbWVjaGFuaXNtcyBpbiB0aGUgc3VucnBjIGxheWVyLgorcnQtbXV0ZXgtZGVzaWduLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIFJlYWxUaW1lIG11dGV4IGltcGxlbWVudGF0aW9uIGRlc2lnbi4KK3J0LW11dGV4LnR4dAorCS0gZGVzYy4gb2YgUlQtbXV0ZXggc3Vic3lzdGVtIHdpdGggUEkgKFByaW9yaXR5IEluaGVyaXRhbmNlKSBzdXBwb3J0LgogcnRjLnR4dAogCS0gbm90ZXMgb24gaG93IHRvIHVzZSB0aGUgUmVhbCBUaW1lIENsb2NrIChha2EgQ01PUyBjbG9jaykgZHJpdmVyLgogczM5MC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggb24gdGhlIElCTSBTMzkwLgorc2NoZWQtYXJjaC50eHQKKwktIENQVSBTY2hlZHVsZXIgaW1wbGVtZW50YXRpb24gaGludHMgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgogc2NoZWQtY29kaW5nLnR4dAogCS0gcmVmZXJlbmNlIGZvciB2YXJpb3VzIHNjaGVkdWxlci1yZWxhdGVkIG1ldGhvZHMgaW4gdGhlIE8oMSkgc2NoZWR1bGVyLgogc2NoZWQtZGVzaWduLnR4dApAQCAtMjQwLDIyICszNDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGxvdyBsZXZlbCBzZXJpYWwgQVBJLgogc2VyaWFsLWNvbnNvbGUudHh0CiAJLSBob3cgdG8gc2V0IHVwIExpbnV4IHdpdGggYSBzZXJpYWwgbGluZSBjb25zb2xlIGFzIHRoZSBkZWZhdWx0Lgorc2dpLWlvYzQudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB0aGUgU0dJIElPQzQgUENJIChtdWx0aSBmdW5jdGlvbikgZGV2aWNlLgogc2dpLXZpc3dzLnR4dAogCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgorc2hhcmVkc3VidHJlZS50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygc2hhcmVkIHN1YnRyZWVzIGZvciBuYW1lc3BhY2VzLgogc21hcnQtY29uZmlnLnR4dAogCS0gZGVzY3JpcHRpb24gb2YgdGhlIFNtYXJ0IENvbmZpZyBtYWtlZmlsZSBmZWF0dXJlLgogc21wLnR4dAogCS0gYSBmZXcgbm90ZXMgb24gc3ltbWV0cmljIG11bHRpLXByb2Nlc3NpbmcuCitzb255LWxhcHRvcC50eHQKKwktIFNvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIgKFNOQykgUmVhZG1lLgogc29ueXBpLnR4dAogCS0gaW5mbyBvbiBMaW51eCBTb255IFByb2dyYW1tYWJsZSBJL08gRGV2aWNlIHN1cHBvcnQuCiBzb3VuZC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gc291bmQgY2FyZCBzdXBwb3J0Lgogc3BhcmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHVzaW5nIExpbnV4IG9uIFNwYXJjIGFyY2hpdGVjdHVyZS4KK3NwYXJzZS50eHQKKwktIGluZm8gb24gaG93IHRvIG9idGFpbiBhbmQgdXNlIHRoZSBzcGFyc2UgdG9vbCBmb3IgdHlwZWNoZWNraW5nLgogc3BlY2lhbGl4LnR4dAogCS0gaW5mbyBvbiBoYXJkd2FyZS9kcml2ZXIgZm9yIHNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBzZXJpYWwgY2FyZC4KK3NwaS8KKwktIG92ZXJ2aWV3IG9mIExpbnV4IGtlcm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgc3VwcG9ydC4KIHNwaW5sb2Nrcy50eHQKIAktIGluZm8gb24gdXNpbmcgc3BpbmxvY2tzIHRvIHByb3ZpZGUgZXhjbHVzaXZlIGFjY2VzcyBpbiBrZXJuZWwuCiBzdGFibGVfYXBpX25vbnNlbnNlLnR4dApAQCAtMjc0LDI0ICszOTAsMzIgQEAKIAktIGluZm8gb24gdGhlIG1hZ2ljIFN5c1JxIGtleS4KIHRlbGVwaG9ueS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGVsZXBob255IChlLmcuIHZvaWNlIG92ZXIgSVApIHN1cHBvcnQuCit0aGlua3BhZC1hY3BpLnR4dAorCS0gaW5mb3JtYXRpb24gb24gdGhlIChJQk0gYW5kIExlbm92bykgVGhpbmtQYWQgQUNQSSBFeHRyYXMgZHJpdmVyLgogdGltZV9pbnRlcnBvbGF0b3JzLnR4dAogCS0gaW5mbyBvbiB0aW1lIGludGVycG9sYXRvcnMuCiB0aXBhci50eHQKIAktIGluZm9ybWF0aW9uIGFib3V0IFBhcmFsbGVsIGxpbmsgY2FibGUgZm9yIFRleGFzIEluc3RydW1lbnRzIGhhbmRoZWxkcy4KIHR0eS50eHQKIAktIGd1aWRlIHRvIHRoZSBsb2NraW5nIHBvbGljaWVzIG9mIHRoZSB0dHkgbGF5ZXIuCi11bmljb2RlLnR4dAotCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCiB1bWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBVc2VyIE1vZGUgTGludXguCit1bmljb2RlLnR4dAorCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCit1bnNoYXJlLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIExpbnV4IHVuc2hhcmUgc3lzdGVtIGNhbGwuCiB1c2IvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIHJlZ2FyZGluZyB0aGUgVW5pdmVyc2FsIFNlcmlhbCBCdXMuCit2aWRlby1vdXRwdXQudHh0CisJLSBzeXNmcyBjbGFzcyBkcml2ZXIgaW50ZXJmYWNlIHRvIGVuYWJsZS9kaXNhYmxlIGEgdmlkZW8gb3V0cHV0IGRldmljZS4KIHZpZGVvNGxpbnV4LwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyByZWdhcmRpbmcgdmlkZW8vVFYvcmFkaW8gY2FyZHMgYW5kIGxpbnV4Lgogdm0vCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHRoZSBMaW51eCB2bSBjb2RlLgogdm95YWdlci50eHQKIAktIGd1aWRlIHRvIHJ1bm5pbmcgTGludXggb24gdGhlIFZveWFnZXIgYXJjaGl0ZWN0dXJlLgordzEvCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudHMgcmVnYXJkaW5nIHRoZSAxLXdpcmUgKHcxKSBzdWJzeXN0ZW0uCiB3YXRjaGRvZy8KIAktIGhvdyB0byBhdXRvLXJlYm9vdCBMaW51eCBpZiBpdCBoYXMgImZhbGxlbiBhbmQgY2FuJ3QgZ2V0IHVwIi4gOy0pCiB4ODZfNjQvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBiNDliOTJlLi5hNjY3ZWIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTIxOCw2ICsyMTgsMTggQEAKIAogYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgJy4nIGFuZCAiLT4iIHN0cnVjdHVyZSBtZW1iZXIgb3BlcmF0b3JzLgogCitEbyBub3QgbGVhdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhdCB0aGUgZW5kcyBvZiBsaW5lcy4gIFNvbWUgZWRpdG9ycyB3aXRoCisic21hcnQiIGluZGVudGF0aW9uIHdpbGwgaW5zZXJ0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBuZXcgbGluZXMgYXMKK2FwcHJvcHJpYXRlLCBzbyB5b3UgY2FuIHN0YXJ0IHR5cGluZyB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgcmlnaHQgYXdheS4KK0hvd2V2ZXIsIHNvbWUgc3VjaCBlZGl0b3JzIGRvIG5vdCByZW1vdmUgdGhlIHdoaXRlc3BhY2UgaWYgeW91IGVuZCB1cCBub3QKK3B1dHRpbmcgYSBsaW5lIG9mIGNvZGUgdGhlcmUsIHN1Y2ggYXMgaWYgeW91IGxlYXZlIGEgYmxhbmsgbGluZS4gIEFzIGEgcmVzdWx0LAoreW91IGVuZCB1cCB3aXRoIGxpbmVzIGNvbnRhaW5pbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworR2l0IHdpbGwgd2FybiB5b3UgYWJvdXQgcGF0Y2hlcyB0aGF0IGludHJvZHVjZSB0cmFpbGluZyB3aGl0ZXNwYWNlLCBhbmQgY2FuCitvcHRpb25hbGx5IHN0cmlwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZvciB5b3U7IGhvd2V2ZXIsIGlmIGFwcGx5aW5nIGEgc2VyaWVzCitvZiBwYXRjaGVzLCB0aGlzIG1heSBtYWtlIGxhdGVyIHBhdGNoZXMgaW4gdGhlIHNlcmllcyBmYWlsIGJ5IGNoYW5naW5nIHRoZWlyCitjb250ZXh0IGxpbmVzLgorCiAKIAkJQ2hhcHRlciA0OiBOYW1pbmcKIApAQCAtNzI2LDYgKzczOCwzMyBAQAogZGVmaW5lZCB0aGF0IHlvdSBzaG91bGRuJ3QgcmVwcm9kdWNlIGluIHlvdXIgY29kZS4KIAogCisJCUNoYXB0ZXIgMTg6ICBFZGl0b3IgbW9kZWxpbmVzIGFuZCBvdGhlciBjcnVmdAorCitTb21lIGVkaXRvcnMgY2FuIGludGVycHJldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHNvdXJjZSBmaWxlcywKK2luZGljYXRlZCB3aXRoIHNwZWNpYWwgbWFya2Vycy4gIEZvciBleGFtcGxlLCBlbWFjcyBpbnRlcnByZXRzIGxpbmVzIG1hcmtlZAorbGlrZSB0aGlzOgorCistKi0gbW9kZTogYyAtKi0KKworT3IgbGlrZSB0aGlzOgorCisvKgorTG9jYWwgVmFyaWFibGVzOgorY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETUFHSUNfREVCVUdfRkxBRyBmb28uYyIKK0VuZDoKKyovCisKK1ZpbSBpbnRlcnByZXRzIG1hcmtlcnMgdGhhdCBsb29rIGxpa2UgdGhpczoKKworLyogdmltOnNldCBzdz04IG5vZXQgKi8KKworRG8gbm90IGluY2x1ZGUgYW55IG9mIHRoZXNlIGluIHNvdXJjZSBmaWxlcy4gIFBlb3BsZSBoYXZlIHRoZWlyIG93biBwZXJzb25hbAorZWRpdG9yIGNvbmZpZ3VyYXRpb25zLCBhbmQgeW91ciBzb3VyY2UgZmlsZXMgc2hvdWxkIG5vdCBvdmVycmlkZSB0aGVtLiAgVGhpcworaW5jbHVkZXMgbWFya2VycyBmb3IgaW5kZW50YXRpb24gYW5kIG1vZGUgY29uZmlndXJhdGlvbi4gIFBlb3BsZSBtYXkgdXNlIHRoZWlyCitvd24gY3VzdG9tIG1vZGUsIG9yIG1heSBoYXZlIHNvbWUgb3RoZXIgbWFnaWMgbWV0aG9kIGZvciBtYWtpbmcgaW5kZW50YXRpb24KK3dvcmsgY29ycmVjdGx5LgorCisKIAogCQlBcHBlbmRpeCBJOiBSZWZlcmVuY2VzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IDQ2YmNmZjIuLmZkMmVmNGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMTM5LDggKzEzOSwxMCBAQAogIUVsaWIvY21kbGluZS5jCiAgICAgIDwvc2VjdDE+CiAKLSAgICAgPHNlY3QxPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyAgICAgPHNlY3QxIGlkPSJjcmMiPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyFFbGliL2NyYzcuYwogIUVsaWIvY3JjMTYuYworIUVsaWIvY3JjLWl0dS10LmMKICFFbGliL2NyYzMyLmMKICFFbGliL2NyYy1jY2l0dC5jCiAgICAgIDwvc2VjdDE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwKaW5kZXggNDVjYWQyMy4uMmRlODRkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmcy1ndWlkZS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnMtZ3VpZGUudG1wbApAQCAtMzUyLDQ5ICszNTIsOTMgQEAKICAgICAgIDxmdW5jc3lub3BzaXM+CiAJPGZ1bmNwcm90b3R5cGU+CiAJICA8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+PC9mdW5jZGVmPgotCSAgPHBhcmFtZGVmPmNoYXIqIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJICA8cGFyYW1kZWY+Y2hhciogPHBhcmFtZXRlcj5idWZmZXI8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCSAgPHBhcmFtZGVmPmNoYXIqKiA8cGFyYW1ldGVyPnN0YXJ0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj5vZmZfdCA8cGFyYW1ldGVyPm9mZjwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CiAJICA8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+Y291bnQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5lb2Y8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj52b2lkKiA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCTwvZnVuY3Byb3RvdHlwZT4KICAgICAgIDwvZnVuY3N5bm9wc2lzPgogCiAgICAgICA8cGFyYT4KICAgICAgICAgVGhlIHJlYWQgZnVuY3Rpb24gc2hvdWxkIHdyaXRlIGl0cyBpbmZvcm1hdGlvbiBpbnRvIHRoZQotICAgICAgICA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uIEZvciBwcm9wZXIgdXNlLCB0aGUgZnVuY3Rpb24KLSAgICAgICAgc2hvdWxkIHN0YXJ0IHdyaXRpbmcgYXQgYW4gb2Zmc2V0IG9mCi0gICAgICAgIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGluIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPiBhbmQKLSAgICAgICAgd3JpdGUgYXQgbW9zdCA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IGJ5dGVzLCBidXQgYmVjYXVzZQotICAgICAgICBtb3N0IHJlYWQgZnVuY3Rpb25zIGFyZSBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmV0dXJuIGEgc21hbGwKLSAgICAgICAgYW1vdW50IG9mIGluZm9ybWF0aW9uLCB0aGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdXN1YWxseQotICAgICAgICBpZ25vcmVkIChpdCBicmVha3MgcGFnZXJzIGxpa2UgPGxpdGVyYWw+bW9yZTwvbGl0ZXJhbD4gYW5kCi0gICAgICAgIDxsaXRlcmFsPmxlc3M8L2xpdGVyYWw+LCBidXQgPGxpdGVyYWw+Y2F0PC9saXRlcmFsPiBzdGlsbAotICAgICAgICB3b3JrcykuCisgICAgICAgIDxwYXJhbWV0ZXI+YnVmZmVyPC9wYXJhbWV0ZXI+LCB3aGljaCB3aWxsIGJlIGV4YWN0bHkKKyAgICAgICAgPGxpdGVyYWw+UEFHRV9TSVpFPC9saXRlcmFsPiBieXRlcyBsb25nLgogICAgICAgPC9wYXJhPgogCiAgICAgICA8cGFyYT4KLSAgICAgICAgSWYgdGhlIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGFuZAotICAgICAgICA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IHBhcmFtZXRlcnMgYXJlIHByb3Blcmx5IHVzZWQsCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHNob3VsZCBiZSB1c2VkIHRvIHNpZ25hbCB0aGF0IHRoZQorICAgICAgICBUaGUgcGFyYW1ldGVyCisgICAgICAgIDxwYXJhbWV0ZXI+cGVvZjwvcGFyYW1ldGVyPiBzaG91bGQgYmUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUKICAgICAgICAgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgYnkgd3JpdGluZwogICAgICAgICA8bGl0ZXJhbD4xPC9saXRlcmFsPiB0byB0aGUgbWVtb3J5IGxvY2F0aW9uCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KKyAgICAgICAgPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KICAgICAgIDwvcGFyYT4KIAogICAgICAgPHBhcmE+Ci0gICAgICAgIFRoZSBwYXJhbWV0ZXIgPHBhcmFtZXRlcj5zdGFydDwvcGFyYW1ldGVyPiBkb2Vzbid0IHNlZW0gdG8gYmUKLSAgICAgICAgdXNlZCBhbnl3aGVyZSBpbiB0aGUga2VybmVsLiBUaGUgPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+CisgICAgICAgIFRoZSA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj4KICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHNpbmdsZSBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yCiAgICAgICAgIHNldmVyYWwgZmlsZXMsIHNlZSA8eHJlZiBsaW5rZW5kPSJ1c2luZ2RhdGEiLz4uCiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+IGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIHRoZSA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uCisgICAgICAgIFRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGFyZSBkZXNjcmliZWQKKwlieSBhIGNvbW1lbnQgaW4gPGZpbGVuYW1lPmZzL3Byb2MvZ2VuZXJpYy5jPC9maWxlbmFtZT4gYXMgZm9sbG93czoKICAgICAgIDwvcGFyYT4KIAorICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgIDxwYXJhPgorCVlvdSBoYXZlIHRocmVlIHdheXMgdG8gcmV0dXJuIGRhdGE6CisgICAgICAgCTwvcGFyYT4KKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorCSAgICAgIExlYXZlIDxsaXRlcmFsPipzdGFydCA9IE5VTEw8L2xpdGVyYWw+LiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKQorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGF0CisJICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgYnVmZmVyLiAgUmV0dXJuIHRoZSBudW1iZXIgKDxsaXRlcmFsPm48L2xpdGVyYWw+KQorCSAgICAgIG9mIGJ5dGVzIHRoZXJlIGFyZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJICAgICAgYnVmZmVyIHVwIHRvIHRoZSBsYXN0IGJ5dGUgb2YgZGF0YS4gIElmIHRoZQorCSAgICAgIG51bWJlciBvZiBzdXBwbGllZCBieXRlcyAoPGxpdGVyYWw+PSBuIC0gb2Zmc2V0PC9saXRlcmFsPikgaXMKKwkgICAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91IGRpZG4ndCBzaWduYWwgZW9mCisJICAgICAgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8gdGFrZSBtb3JlIGRhdGEKKwkgICAgICB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgcmVxdWVzdGVkCisJICAgICAgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4gIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWZ1bCBmb3IgZmlsZXMKKwkgICAgICBubyBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyLgorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gdW5zaWduZWQgbG9uZyB2YWx1ZSBsZXNzIHRoYW4KKwkgICAgICB0aGUgYnVmZmVyIGFkZHJlc3MgYnV0IGdyZWF0ZXIgdGhhbiB6ZXJvLgorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGUKKwkgICAgICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gIFJldHVybiB0aGUgbnVtYmVyIG9mCisJICAgICAgYnl0ZXMgb2YgZGF0YSBwbGFjZWQgdGhlcmUuICBJZiB0aGlzIG51bWJlciBpcworCSAgICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB5b3UgZGlkbid0IHNpZ25hbCBlb2YKKwkgICAgICBhbmQgdGhlIHJlYWRlciBpcyBwcmVwYXJlZCB0byB0YWtlIG1vcmUgZGF0YQorCSAgICAgIHlvdSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIHRoZSByZXF1ZXN0ZWQKKwkgICAgICBvZmZzZXQgYWR2YW5jZWQgYnkgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4gIFRoaXMgaW50ZXJmYWNlIGlzCisJICAgICAgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBsYXJnZSBmaWxlIGNvbnNpc3RpbmcKKwkgICAgICBvZiBhIHNlcmllcyBvZiBibG9ja3Mgd2hpY2ggeW91IHdhbnQgdG8gY291bnQKKwkgICAgICBhbmQgcmV0dXJuIGFzIHdob2xlcy4KKwkgICAgICAoSGFjayBieSBQYXVsLlJ1c3NlbGxAcnVzdGNvcnAuY29tLmF1KQorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gYWRkcmVzcyB3aXRoaW4gdGhlIGJ1ZmZlci4KKwkgICAgICBQdXQgdGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBvZmZzZXQgYXQgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4KKwkgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHBsYWNlZCB0aGVyZS4KKwkgICAgICBJZiB0aGlzIG51bWJlciBpcyBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91CisJICAgICAgZGlkbid0IHNpZ25hbCBlb2YgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8KKwkgICAgICB0YWtlIG1vcmUgZGF0YSB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUKKwkgICAgICByZXF1ZXN0ZWQgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4KKwkgICAgPC9wYXJhPgorCSAgPC9saXN0aXRlbT4KKwk8L29yZGVyZWRsaXN0PgorICAgICAgPC9ibG9ja3F1b3RlPgorCiAgICAgICA8cGFyYT4KICAgICAgICAgPHhyZWYgbGlua2VuZD0iZXhhbXBsZSIvPiBzaG93cyBob3cgdG8gdXNlIGEgcmVhZCBjYWxsIGJhY2sKICAgICAgICAgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCBmNGRmZmFkLi40MmIwMWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTIyMiw3ICsyMjIsMTUgQEAKIAlkZWFkbG9jayBhcyBzb29uIGFzIHRoZSBSQ1UgY2FsbGJhY2sgaGFwcGVucyB0byBpbnRlcnJ1cHQgdGhhdAogCWFjcXVpc2l0aW9uJ3MgY3JpdGljYWwgc2VjdGlvbi4KIAotMTMuCVNSQ1UgKHNyY3VfcmVhZF9sb2NrKCksIHNyY3VfcmVhZF91bmxvY2soKSwgYW5kIHN5bmNocm9uaXplX3NyY3UoKSkKKzEzLglSQ1UgY2FsbGJhY2tzIGNhbiBiZSBhbmQgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgSW4gbWFueSBjYXNlcywKKwl0aGUgY2FsbGJhY2sgY29kZSBzaW1wbHkgd3JhcHBlcnMgYXJvdW5kIGtmcmVlKCksIHNvIHRoYXQgdGhpcworCWlzIG5vdCBhbiBpc3N1ZSAob3IsIG1vcmUgYWNjdXJhdGVseSwgdG8gdGhlIGV4dGVudCB0aGF0IGl0IGlzCisJYW4gaXNzdWUsIHRoZSBtZW1vcnktYWxsb2NhdG9yIGxvY2tpbmcgaGFuZGxlcyBpdCkuICBIb3dldmVyLAorCWlmIHRoZSBjYWxsYmFja3MgZG8gbWFuaXB1bGF0ZSBhIHNoYXJlZCBkYXRhIHN0cnVjdHVyZSwgdGhleQorCW11c3QgdXNlIHdoYXRldmVyIGxvY2tpbmcgb3Igb3RoZXIgc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkCisJdG8gc2FmZWx5IGFjY2VzcyBhbmQvb3IgbW9kaWZ5IHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCisKKzE0LglTUkNVIChzcmN1X3JlYWRfbG9jaygpLCBzcmN1X3JlYWRfdW5sb2NrKCksIGFuZCBzeW5jaHJvbml6ZV9zcmN1KCkpCiAJbWF5IG9ubHkgYmUgaW52b2tlZCBmcm9tIHByb2Nlc3MgY29udGV4dC4gIFVubGlrZSBvdGhlciBmb3JtcyBvZgogCVJDVSwgaXQgLWlzLSBwZXJtaXNzaWJsZSB0byBibG9jayBpbiBhbiBTUkNVIHJlYWQtc2lkZSBjcml0aWNhbAogCXNlY3Rpb24gKGRlbWFya2VkIGJ5IHNyY3VfcmVhZF9sb2NrKCkgYW5kIHNyY3VfcmVhZF91bmxvY2soKSksCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CmluZGV4IDZlYmZmYjUuLjE5ZTdmNjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CkBAIC0xLDQgKzEsNCBAQAotTGludXggS2VybmVsIHBhdGNoIHN1bWJpdHRhbCBjaGVja2xpc3QKK0xpbnV4IEtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogSGVyZSBhcmUgc29tZSBiYXNpYyB0aGluZ3MgdGhhdCBkZXZlbG9wZXJzIHNob3VsZCBkbyBpZiB0aGV5IHdhbnQgdG8gc2VlIHRoZWlyCkBAIC05LDcgKzksNiBAQAoga2VybmVsIHBhdGNoZXMuCiAKIAotCiAxOiBCdWlsZHMgY2xlYW5seSB3aXRoIGFwcGxpY2FibGUgb3IgbW9kaWZpZWQgQ09ORklHIG9wdGlvbnMgPXksID1tLCBhbmQKICAgID1uLiAgTm8gZ2NjIHdhcm5pbmdzL2Vycm9ycywgbm8gbGlua2VyIHdhcm5pbmdzL2Vycm9ycy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggMDk1OGU5Ny4uM2Y5YTc5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC00NjQsOSArNDY0LDI1IEBACiBOdWZmIHNhaWQuICBJZiB5b3VyIGNvZGUgZGV2aWF0ZXMgdG9vIG11Y2ggZnJvbSB0aGlzLCBpdCBpcyBsaWtlbHkKIHRvIGJlIHJlamVjdGVkIHdpdGhvdXQgZnVydGhlciByZXZpZXcsIGFuZCB3aXRob3V0IGNvbW1lbnQuCiAKK09uY2Ugc2lnbmlmaWNhbnQgZXhjZXB0aW9uIGlzIHdoZW4gbW92aW5nIGNvZGUgZnJvbSBvbmUgZmlsZSB0bworYW5vdGhlciBpbiB0aGlzIGNhc2UgeW91IHNob3VsZCBub3QgbW9kaWZ5IHRoZSBtb3ZlZCBjb2RlIGF0IGFsbCBpbgordGhlIHNhbWUgcGF0Y2ggd2hpY2ggbW92ZXMgaXQuICBUaGlzIGNsZWFybHkgZGVsaW5lYXRlcyB0aGUgYWN0IG9mCittb3ZpbmcgdGhlIGNvZGUgYW5kIHlvdXIgY2hhbmdlcy4gIFRoaXMgZ3JlYXRseSBhaWRzIHJldmlldyBvZiB0aGUKK2FjdHVhbCBkaWZmZXJlbmNlcyBhbmQgYWxsb3dzIHRvb2xzIHRvIGJldHRlciB0cmFjayB0aGUgaGlzdG9yeSBvZgordGhlIGNvZGUgaXRzZWxmLgorCiBDaGVjayB5b3VyIHBhdGNoZXMgd2l0aCB0aGUgcGF0Y2ggc3R5bGUgY2hlY2tlciBwcmlvciB0byBzdWJtaXNzaW9uCi0oc2NyaXB0cy9jaGVja3BhdGNoLnBsKS4gIFlvdSBzaG91bGQgYmUgYWJsZSB0byBqdXN0aWZ5IGFsbAotdmlvbGF0aW9ucyB0aGF0IHJlbWFpbiBpbiB5b3VyIHBhdGNoLgorKHNjcmlwdHMvY2hlY2twYXRjaC5wbCkuICBUaGUgc3R5bGUgY2hlY2tlciBzaG91bGQgYmUgdmlld2VkIGFzCithIGd1aWRlIG5vdCBhcyB0aGUgZmluYWwgd29yZC4gIElmIHlvdXIgY29kZSBsb29rcyBiZXR0ZXIgd2l0aAorYSB2aW9sYXRpb24gdGhlbiBpdHMgcHJvYmFibHkgYmVzdCBsZWZ0IGFsb25lLgorCitUaGUgY2hlY2tlciByZXBvcnRzIGF0IHRocmVlIGxldmVsczoKKyAtIEVSUk9SOiB0aGluZ3MgdGhhdCBhcmUgdmVyeSBsaWtlbHkgdG8gYmUgd3JvbmcKKyAtIFdBUk5JTkc6IHRoaW5ncyByZXF1aXJpbmcgY2FyZWZ1bCByZXZpZXcKKyAtIENIRUNLOiB0aGluZ3MgcmVxdWlyaW5nIHRob3VnaHQKKworWW91IHNob3VsZCBiZSBhYmxlIHRvIGp1c3RpZnkgYWxsIHZpb2xhdGlvbnMgdGhhdCByZW1haW4gaW4geW91cgorcGF0Y2guCiAKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKaW5kZXggNzFhY2MyOC4uMjRjNWFhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCisrKyBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYwpAQCAtNDksNiArNDksNyBAQAogaW50IGRiZzsKIGludCBwcmludF9kZWxheXM7CiBpbnQgcHJpbnRfaW9fYWNjb3VudGluZzsKK2ludCBwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50czsKIF9fdTY0IHN0aW1lLCB1dGltZTsKIAogI2RlZmluZSBQUklOVEYoZm10LCBhcmcuLi4pIHsJCQlcCkBAIC0xOTUsNyArMTk2LDcgQEAKIAkgICAgICAgIklPICAgICUxNXMlMTVzXG4iCiAJICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcbiIKIAkgICAgICAgIk1FTSAgICUxNXMlMTVzXG4iCi0JICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcblxuIiwKKwkgICAgICAgIiAgICAgICUxNWxsdSUxNWxsdVxuIgogCSAgICAgICAiY291bnQiLCAicmVhbCB0b3RhbCIsICJ2aXJ0dWFsIHRvdGFsIiwgImRlbGF5IHRvdGFsIiwKIAkgICAgICAgdC0+Y3B1X2NvdW50LCB0LT5jcHVfcnVuX3JlYWxfdG90YWwsIHQtPmNwdV9ydW5fdmlydHVhbF90b3RhbCwKIAkgICAgICAgdC0+Y3B1X2RlbGF5X3RvdGFsLApAQCAtMjA0LDYgKzIwNSwxNCBAQAogCSAgICAgICAiY291bnQiLCAiZGVsYXkgdG90YWwiLCB0LT5zd2FwaW5fY291bnQsIHQtPnN3YXBpbl9kZWxheV90b3RhbCk7CiB9CiAKK3ZvaWQgdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tzdGF0cyAqdCkKK3sKKwlwcmludGYoIlxuXG5UYXNrICAgJTE1cyUxNXNcbiIKKwkgICAgICAgIiAgICAgICAlMTVsdSUxNWx1XG4iLAorCSAgICAgICAidm9sdW50YXJ5IiwgIm5vbnZvbHVudGFyeSIsCisJICAgICAgIHQtPm52Y3N3LCB0LT5uaXZjc3cpOworfQorCiB2b2lkIHByaW50X2lvYWNjdChzdHJ1Y3QgdGFza3N0YXRzICp0KQogewogCXByaW50ZigiJXM6IHJlYWQ9JWxsdSwgd3JpdGU9JWxsdSwgY2FuY2VsbGVkX3dyaXRlPSVsbHVcbiIsCkBAIC0yMzUsNyArMjQ0LDcgQEAKIAlzdHJ1Y3QgbXNndGVtcGxhdGUgbXNnOwogCiAJd2hpbGUgKDEpIHsKLQkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGl3OnI6bTp0OnA6dmwiKTsKKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAicWRpdzpyOm06dDpwOnZsIik7CiAJCWlmIChjIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yNDgsNiArMjU3LDEwIEBACiAJCQlwcmludGYoInByaW50aW5nIElPIGFjY291bnRpbmdcbiIpOwogCQkJcHJpbnRfaW9fYWNjb3VudGluZyA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlwcmludGYoInByaW50aW5nIHRhc2svcHJvY2VzcyBjb250ZXh0IHN3aXRjaCByYXRlc1xuIik7CisJCQlwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyA9IDE7CisJCQlicmVhazsKIAkJY2FzZSAndyc6CiAJCQlsb2dmaWxlID0gc3RyZHVwKG9wdGFyZyk7CiAJCQlwcmludGYoIndyaXRlIHRvIGZpbGUgJXNcbiIsIGxvZ2ZpbGUpOwpAQCAtMzg5LDYgKzQwMiw4IEBACiAJCQkJCQkJcHJpbnRfZGVsYXlhY2N0KChzdHJ1Y3QgdGFza3N0YXRzICopIE5MQV9EQVRBKG5hKSk7CiAJCQkJCQlpZiAocHJpbnRfaW9fYWNjb3VudGluZykKIAkJCQkJCQlwcmludF9pb2FjY3QoKHN0cnVjdCB0YXNrc3RhdHMgKikgTkxBX0RBVEEobmEpKTsKKwkJCQkJCWlmIChwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cykKKwkJCQkJCQl0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cygoc3RydWN0IHRhc2tzdGF0cyAqKSBOTEFfREFUQShuYSkpOwogCQkJCQkJaWYgKGZkKSB7CiAJCQkJCQkJaWYgKHdyaXRlKGZkLCBOTEFfREFUQShuYSksIG5hLT5ubGFfbGVuKSA8IDApIHsKIAkJCQkJCQkJZXJyKDEsIndyaXRlIGVycm9yXG4iKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dCBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dAppbmRleCA2NjFjNzk3Li44YWE3NTI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLXN0cnVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL3Rhc2tzdGF0cy1zdHJ1Y3QudHh0CkBAIC0yMiw2ICsyMiw4IEBACiAgICAgLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgZW5kICovCiAgICAgVGhlaXIgdmFsdWVzIGFyZSBjb2xsZWN0ZWQgaWYgQ09ORklHX1RBU0tfWEFDQ1QgaXMgc2V0LgogCis0KSBQZXItdGFzayBhbmQgcGVyLXRocmVhZCBjb250ZXh0IHN3aXRjaCBjb3VudCBzdGF0aXN0aWNzCisKIEZ1dHVyZSBleHRlbnNpb24gc2hvdWxkIGFkZCBmaWVsZHMgdG8gdGhlIGVuZCBvZiB0aGUgdGFza3N0YXRzIHN0cnVjdCwgYW5kCiBzaG91bGQgbm90IGNoYW5nZSB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgZWFjaCBmaWVsZCB3aXRoaW4gdGhlIHN0cnVjdC4KIApAQCAtMTU4LDQgKzE2MCw4IEBACiAKIAkvKiBFeHRlbmRlZCBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KIAorNCkgUGVyLXRhc2sgYW5kIHBlci10aHJlYWQgc3RhdGlzdGljcworCV9fdTY0CW52Y3N3OwkJCS8qIENvbnRleHQgdm9sdW50YXJ5IHN3aXRjaCBjb3VudGVyICovCisJX191NjQJbml2Y3N3OwkJCS8qIENvbnRleHQgaW52b2x1bnRhcnkgc3dpdGNoIGNvdW50ZXIgKi8KKwogfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAppbmRleCBkZWJmNjgxLi44NjZiNzYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dApAQCAtMjUzLDcgKzI1Myw3IEBACiAKIAlUaGUgZmlyc3Qgb2YgdGhlc2UgdHdvIHJvdXRpbmVzIGlzIGludm9rZWQgYWZ0ZXIgbWFwX3ZtX2FyZWEoKQogCWhhcyBpbnN0YWxsZWQgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gIFRoZSBzZWNvbmQgaXMgaW52b2tlZAotCWJlZm9yZSB1bm1hcF92bV9hcmVhKCkgZGVsZXRlcyB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzLgorCWJlZm9yZSB1bm1hcF9rZXJuZWxfcmFuZ2UoKSBkZWxldGVzIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuCiAKIFRoZXJlIGV4aXN0cyBhbm90aGVyIHdob2xlIGNsYXNzIG9mIGNwdSBjYWNoZSBpc3N1ZXMgd2hpY2ggY3VycmVudGx5CiByZXF1aXJlIGEgd2hvbGUgZGlmZmVyZW50IHNldCBvZiBpbnRlcmZhY2VzIHRvIGhhbmRsZSBwcm9wZXJseS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2Nkcm9tLzAwLUlOREVYCmluZGV4IDkxNmRhZmUuLjQzM2VkZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS8wMC1JTkRFWApAQCAtMiwzMiArMiwxMCBAQAogCS0gdGhpcyBmaWxlIChpbmZvIG9uIENELVJPTXMgYW5kIExpbnV4KQogTWFrZWZpbGUKIAktIG9ubHkgdXNlZCB0byBnZW5lcmF0ZSBUZVggb3V0cHV0IGZyb20gdGhlIGRvY3VtZW50YXRpb24uCi1henRjZAotCS0gaW5mbyBvbiBBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMvQ29ucmFkL0N5Q0RST00gZHJpdmVyLgogY2Ryb20tc3RhbmRhcmQudGV4CiAJLSBMYVRlWCBkb2N1bWVudCBvbiBzdGFuZGFyZGl6aW5nIHRoZSBDRC1ST00gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgotY2R1MzFhCi0JLSBpbmZvIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0QtUk9NIGRyaXZlci4KLWNtMjA2Ci0JLSBpbmZvIG9uIHRoZSBQaGlsaXBzL0xNUyBjbTIwNi9jbTI2MCBDRC1ST00gZHJpdmVyLgotZ3NjZAotCS0gaW5mbyBvbiB0aGUgR29sZHN0YXIgUjQyMCBDRC1ST00gZHJpdmVyLgogaWRlLWNkCiAJLSBpbmZvIG9uIHNldHRpbmcgdXAgYW5kIHVzaW5nIEFUQVBJIChha2EgSURFKSBDRC1ST01zLgotaXNwMTYKLQktIGluZm8gb24gdGhlIENELVJPTSBpbnRlcmZhY2Ugb24gSVNQMTYsIE1BRDE2IG9yIE1vemFydCBzb3VuZCBjYXJkLgotbWNkCi0JLSBpbmZvIG9uIGxpbWl0YXRpb25zIG9mIHN0YW5kYXJkIE1pdHN1bWkgQ0QtUk9NIGRyaXZlci4KLW1jZHgKLQktIGluZm8gb24gaW1wcm92ZWQgTWl0c3VtaSBDRC1ST00gZHJpdmVyLgotb3B0Y2QKLQktIGluZm8gb24gdGhlIE9wdGljcyBTdG9yYWdlIDgwMDAgQVQgQ0QtUk9NIGRyaXZlcgogcGFja2V0LXdyaXRpbmcudHh0CiAJLSBJbmZvIG9uIHRoZSBDRFJXIHBhY2tldCB3cml0aW5nIG1vZHVsZQotc2JwY2QKLQktIGluZm8gb24gdGhlIFNvdW5kQmxhc3Rlci9QYW5hc29uaWMgQ0QtUk9NIGludGVyZmFjZSBkcml2ZXIuCi1zamNkCi0JLSBpbmZvIG9uIHRoZSBTQU5ZTyBDRFItSDk0QSBDRC1ST00gaW50ZXJmYWNlIGRyaXZlci4KLXNvbnljZDUzNQotCS0gaW5mbyBvbiB0aGUgU29ueSBDRFUtNTM1IChhbmQgNTMxKSBDRC1ST00gZHJpdmVyLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9henRjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMDI5MC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkCisrKyAvZGV2L251bGwKQEAgLTEsODIyICswLDAgQEAKLSRJZDogUkVBRE1FLmF6dGNkLHYgMi42MCAxOTk3LzExLzI5IDA5OjUxOjI1IHJvb3QgRXhwIHJvb3QgJAotICAgICAgICAgIFJlYWRtZS1GaWxlIERvY3VtZW50YXRpb24vY2Ryb20vYXp0Y2QKLSAgICAgICAgICAgCQkJZm9yIAotCSAgICAgQVpURUNIIENELVJPTSBDREEyNjgtMDFBLCBPUkNISUQgQ0QtMzExMCwKLSAgICAgIE9LQU5PL1dFQVJORVMgQ0REMTEwLCBDT05SQUQgVFhDLCBDeUNEUk9NIENSNTIwLCBDUjU0MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0QtUk9NIERyaXZlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjYgYW5kIG5ld2VyCi0gICAgICAgICAgICAgICAgICAgKGZvciBvdGhlciBkcml2ZXMgc2VlIDYuLTguKQotCi1OT1RFOiBUSElTIERSSVZFUiBXSUxMIFdPUksgV0lUSCBUSEUgQ0QtUk9NIERSSVZFUyBMSVNURUQsIFdISUNIIEhBVkUKLSAgICAgIEEgUFJPUFJJRVRBUlkgSU5URVJGQUNFIChpbXBsZW1lbnRlZCBvbiBhIHNvdW5kIGNhcmQgb3Igb24gYW4KLSAgICAgIElTQS1BVC1idXMgY2FyZCkuIAotICAgICAgSVQgV0lMTCBERUZJTklURUxZIE5PVCBXT1JLIFdJVEggQ0QtUk9NIERSSVZFUyBXSVRIICpJREUqLUlOVEVSRkFDRSwKLSAgICAgIHN1Y2ggYXMgdGhlIEF6dGVjaCBDREEyNjktMDMxU0UgISEhIChUaGUgb25seSBrbm93biBleGNlcHRpb25zIGFyZQotICAgICAgJ2Zha2VkJyBJREUgZHJpdmVzIGxpa2UgdGhlIEN5Q0RST00gQ1I1MjBpZSB3aGljaCB3b3JrIHdpdGggYXp0Y2QKLSAgICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgc2VlIDcuKS4gSUYgWU9VJ1JFIFVTSU5HIEEgQ0QtUk9NIERSSVZFCi0gICAgICBXSVRIIElERS1JTlRFUkZBQ0UsIFNPTUVUSU1FUyBBTFNPIENBTExFRCBBVEFQSS1DT01QQVRJQkxFLCBQTEVBU0UgCi0gICAgICBVU0UgVEhFIGlkZS1jZC5jIERSSVZFUiwgV1JJVFRFTiBCWSBNQVJLIExPUkQgQU5EIFNDT1RUIFNOWURFUiAhCi0gICAgICBUSEUgU1RBTkRBUkQtS0VSTkVMIDEuMi54IE5PVyBBTFNPIFNVUFBPUlRTIElERS1DRFJPTS1EUklWRVMsIFNFRSBUSEUKLSAgICAgIEhBUkRESVNLICghKSBTRUNUSU9OIE9GIG1ha2UgY29uZmlnLCBXSEVOIENPTVBJTElORyBBIE5FVyBLRVJORUwhISEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29udGVudHMgb2YgdGhpcyBmaWxlOgotICAgICAgICAgICAgICAgICAgICAgICAgIDEuICBOT1RFCi0gICAgICAgICAgICAgICAgICAgICAgICAgMi4gIElOU1RBTExBVElPTgotICAgICAgICAgICAgICAgICAgICAgICAgIDMuICBDT05GSUdVUklORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuICBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuMSAgIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgNC4yICAgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi0gICAgICAgICAgICAgICAgICAgICAgICAgNS4gIEtOT1dOIFBST0JMRU1TLCBGVVRVUkUgREVWRUxPUE1FTlRTCi0JCQkgNS4xICAgTVVMVElTRVNTSU9OIFNVUFBPUlQKLQkJCSA1LjIgICBTVEFUVVMgUkVDT0dOSVRJT04KLQkJCSA1LjMgICBET1NFTVUncyBDRFJPTSBTVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgICAgICAgNi4gIEJVRyBSRVBPUlRTCi0gICAgICAgICAgICAgICAgICAgICAgICAgNy4gIE9USEVSIERSSVZFUwotICAgICAgICAgICAgICAgICAgICAgICAgIDguICBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCAuLi4gREVCVUdHSU5HICAKLSAgICAgICAgICAgICAgICAgICAgICAgICA5LiAgVEVDSE5JQ0FMIEhJU1RPUlkgT0YgVEhFIERSSVZFUgotICAgICAgICAgICAgICAgICAgICAgICAgMTAuICBBQ0tOT1dMRURHTUVOVFMKLSAgICAgICAgICAgICAgICAgICAgICAgIDExLiAgUFJPR1JBTU1JTkcgQUREIE9OUzogQ0RQTEFZLkMKLSAgICAgICAgICAgICAgICAgICAgICAgIEFQUEVORElYOiBTb3VyY2UgY29kZSBvZiBjZHBsYXkuYwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBOT1RFIAotVGhpcyBzb2Z0d2FyZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW4gYWxwaGEgYW5kIGJldGEgdGVzdCBhbmQgaXMgcGFydCBvZgotdGhlIHN0YW5kYXJkIGtlcm5lbCBzaW5jZSBrZXJuZWwgMS4xLjh4IHNpbmNlIERlY2VtYmVyIDE5OTQuIEl0IHdvcmtzIHdpdGgKLUFaVEVDSCBDREEyNjgtMDFBLCBPUkNISUQgQ0RTLTMxMTAsIE9SQ0hJRC9XRUFSTkVTIENERDExMCBhbmQgQ09OUkFEIFRYQyAKLShOci45OSAzMSAyMyAtc2VyaWVzIDA0KSBhbmQgaGFzIHByb3ZlbiB0byBiZSBzdGFibGUgd2l0aCBrZXJuZWwgCi12ZXJzaW9ucyAxLjAuOSBhbmQgbmV3ZXIuIEJ1dCB3aXRoIGFueSBzb2Z0d2FyZSB0aGVyZSBzdGlsbCBtYXkgYmUgYnVncyBpbiBpdC4gCi1TbyBpZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zLCB5b3UgYXJlIGludml0ZWQgdG8gaGVscCB1cyBpbXByb3ZlIHRoaXMgc29mdHdhcmUuIAotUGxlYXNlIHNlbmQgbWUgYSBkZXRhaWxlZCBidWcgcmVwb3J0IChzZWUgY2hhcHRlciBCVUcgUkVQT1JUUykuIFlvdSBhcmUgYWxzbyAKLWludml0ZWQgaW4gaGVscGluZyB1cyB0byBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGRyaXZlcywgd2hpY2ggYXJlIHN1cHBvcnRlZC4KLQotUGxlYXNlIHJlYWQgdGhlIFJFQURNRS1maWxlcyBjYXJlZnVsbHkgYW5kIGFsd2F5cyBrZWVwIGEgYmFja3VwIGNvcHkgb2YgeW91ciAKLW9sZCBrZXJuZWwsIGluIG9yZGVyIHRvIHJlYm9vdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyEKLQotMi4gSU5TVEFMTEFUSU9OCi1UaGUgZHJpdmVyIGNvbnNpc3RzIG9mIGEgaGVhZGVyIGZpbGUgJ2F6dGNkLmgnLCB3aGljaCBub3JtYWxseSBzaG91bGQgcmVzaWRlIAotaW4gL3Vzci9zcmMvbGludXgvZHJpdmVycy9jZHJvbSBhbmQgdGhlIHNvdXJjZSBjb2RlICdhenRjZC5jJywgd2hpY2ggbm9ybWFsbHkgCi1yZXNpZGVzIGluIHRoZSBzYW1lIHBsYWNlLiBJdCB1c2VzIC9kZXYvYXp0Y2QgKC9kZXYvYXp0Y2QwIGluIHNvbWUgZGlzdHJpLQotYnV0aW9ucyksIHdoaWNoIG11c3QgYmUgYSB2YWxpZCBibG9jayBkZXZpY2Ugd2l0aCBtYWpvciBudW1iZXIgMjkgYW5kIHJlc2lkZSAKLWluIGRpcmVjdG9yeSAvZGV2LiBUbyBtb3VudCBhIENELVJPTSwgeW91ciBrZXJuZWwgbmVlZHMgdG8gaGF2ZSB0aGUgSVNPOTY2MC0KLWZpbGVzeXN0ZW0gc3VwcG9ydCBpbmNsdWRlZC4KLQotUExFQVNFIE5PVEU6IGF6dGNkLmMgaGFzIGJlZW4gZGV2ZWxvcGVkIGluIHBhcmFsbGVsIHRvIHRoZSBsaW51eCBrZXJuZWwsCi13aGljaCBoYWQgYW5kIGlzIGhhdmluZyBtYW55IG1ham9yIGFuZCBtaW5vciBjaGFuZ2VzIHdoaWNoIGFyZSBub3QgYmFja3dhcmQKLWNvbXBhdGlibGUuIFF1aXRlIGRlZmluaXRlbHkgYXp0Y2QuYyB2ZXJzaW9uIDEuODAgYW5kIG5ld2VyIHdpbGwgTk9UIHdvcmsKLWluIGtlcm5lbHMgb2xkZXIgdGhhbiAxLjMuMzMuIFNvIHBsZWFzZSBhbHdheXMgdXNlIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uCi1vZiBhenRjZC5jIHdpdGggdGhlIGFwcHJvcHJpYXRlIGxpbnV4LWtlcm5lbC4KLQotMy4gIENPTkZJR1VSSU5HIFlPVVIgS0VSTkVMCi1JZiB5b3VyIGtlcm5lbCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIHVzaW5nIHRoZSBBWlRFQ0ggZHJpdmVyIHlvdSB3aWxsCi1zZWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzOgotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRHJpdmVyVmVyc2lvbj08dmVyc2lvbiBudW1iZXI+IEJhc2VBZGRyZXNzPTxiYXNlYWRkcmVzcz4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEZpcm13YXJlVmVyc2lvbj08ZmlybXdhcmUgdmVyc2lvbiBpZCBvZiB5b3VyIEkvTy1jYXJkPj4+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiA8ZHJpdmUgdHlwZT4gZGV0ZWN0ZWQKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEVuZAotSWYgdGhlIG1lc3NhZ2UgbG9va3MgZGlmZmVyZW50IGFuZCB5b3UgYXJlIHN1cmUgdG8gaGF2ZSBhIHN1cHBvcnRlZCBkcml2ZSwKLWl0IG1heSBoYXZlIGEgZGlmZmVyZW50IGJhc2UgYWRkcmVzcy4gVGhlIEF6dGVjaCBkcml2ZXIgZG9lcyBsb29rIGZvciB0aGUgCi1DRC1ST00gZHJpdmUgYXQgdGhlIGJhc2UgYWRkcmVzcyBzcGVjaWZpZWQgaW4gYXp0Y2QuaCBhdCBjb21waWxlIHRpbWUuIFRoaXMgCi1hZGRyZXNzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBib290IHBhcmFtZXRlciBhenRjZD0uLi4uWW91IHNob3VsZCByZWJvb3QgYW5kIAotc3RhcnQgTGludXggd2l0aCBib290IHBhcmFtZXRlciBhenRjZD08YmFzZSBhZGRyZXNzPiwgZS5nLiBhenRjZD0weDMyMC4gSWYgCi15b3UgZG8gbm90IGtub3cgdGhlIGJhc2UgYWRkcmVzcywgc3RhcnQgeW91ciBQQyB3aXRoIERPUyBhbmQgbG9vayBhdCB0aGUgYm9vdCAKLW1lc3NhZ2Ugb2YgeW91ciBDRC1ST00ncyBET1MgZHJpdmVyLiBJZiB0aGF0IHN0aWxsIGRvZXMgbm90IGhlbHAsIHVzZSBib290Ci1wYXJhbWV0ZXIgYXp0Y2Q9PGJhc2UgYWRkcmVzcz4sMHg3OSAsIHRoaXMgdGVsbHMgYXp0Y2QgdG8gdHJ5IGEgbGl0dGxlIGhhcmRlci4KLWF6dGNkIG1heSBiZSBjb25maWd1cmVkIHRvIHVzZSBhdXRvcHJvYmluZyB0aGUgYmFzZSBhZGRyZXNzIGJ5IHJlY29tcGlsaW5nCi1pdCAoc2VlIGNoYXB0ZXIgNC4pLgotCi1JZiB0aGUgbWVzc2FnZSBsb29rcyBjb3JyZWN0LCBhcyB1c2VyICdyb290JyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gbW91bnQgdGhlIAotZHJpdmUgYnkKLSAgICAgICAgICBtb3VudCAtdCBpc285NjYwIC1yIC9kZXYvYXp0Y2QwIC9tbnQKLWFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0vZGV2L2F6dGNkMCBhbmQgL21udCBkbyBleGlzdCBhbmQgY3JlYXRlIHRoZW0sIGlmIG5lY2Vzc2FyeSBieSBkb2luZwotICAgICAgbWtub2QgL2Rldi9henRjZDAgYiAyOSAwCi0gICAgICBta2RpciAvbW50ICAgICAgICAgICAgICAgICAgICAgICAKLQotSWYgeW91IHN0aWxsIGdldCBhIGRpZmZlcmVudCBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzIG9yIHdoZW4geW91IGdldCB0aGUgCi1tZXNzYWdlLCB0aGF0IHRoZSBJU085NjYwLWZpbGVzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGtlcm5lbCwgd2hlbgoteW91IHRyeSB0byBtb3VudCB0aGUgQ0QtUk9NIGRyaXZlLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWwuCi0KLUlmIHlvdSBkbyAqbm90KiBoYXZlIGFuIEF6dGVjaC9PcmNoaWQvT2thbm8vV2Vhcm5lcy9UWEMgZHJpdmUgYW5kIHdhbnQgdG8gCi1ieXBhc3MgZHJpdmUgZGV0ZWN0aW9uIGR1cmluZyBMaW51eCBib290IHVwLCBzdGFydCB3aXRoIGJvb3QgcGFyYW1ldGVyIGF6dGNkPTAuCi0KLU1vc3QgZGlzdHJpYnV0aW9ucyBub3dhZGF5cyBkbyBjb250YWluIGEgYm9vdCBkaXNrIGltYWdlIGNvbnRhaW5pbmcgYXp0Y2QuCi1QbGVhc2Ugbm90ZSwgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG5vdCB3b3JrIHdpdGggSURFL0FUQVBJIGRyaXZlcyEgV2l0aCB0aGVzZSAKLXlvdSBtdXN0IHVzZSBpZGUtY2QuYyBpbnN0ZWFkLgotCi00LiBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotSWYgeW91ciBrZXJuZWwgaXMgbm90IHlldCBjb25maWd1cmVkIGZvciB0aGUgQVpURUNIIGRyaXZlciBhbmQgdGhlIElTTzk2NjAtCi1maWxlc3lzdGVtLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWw6IAotCi0tIEVkaXQgYXp0Y2QuaCB0byBzZXQgdGhlIEkvTy1hZGRyZXNzIHRvIHlvdXIgSS9PLUJhc2UgYWRkcmVzcyAoQVpUX0JBU0VfQUREUiksIAotICB0aGUgZHJpdmVyIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzIG9yIERNQSwgc28gaWYgeW91IGFyZSB1c2luZyBhbiBBWlRFQ0gKLSAgQ0QyNjgsIGFuIE9SQ0hJRCBDRC0zMTEwIG9yIE9SQ0hJRC9XRUFSTkVTIENERDExMCB0aGF0J3MgdGhlIG9ubHkgaXRlbSB5b3UgCi0gIGhhdmUgdG8gc2V0IHVwLiBJZiB5b3UgaGF2ZSBhIHNvdW5kY2FyZCwgcmVhZCBjaGFwdGVyIDQuMi4KLSAgVXNlcnMgb2Ygb3RoZXIgZHJpdmVzIHNob3VsZCByZWFkIGNoYXB0ZXIgT1RIRVIgRFJJVkVTIG9mIHRoaXMgZmlsZS4KLSAgWW91IGFsc28gY2FuIGNvbmZpZ3VyZSB0aGF0IGFkZHJlc3MgYnkga2VybmVsIGJvb3QgcGFyYW1ldGVyIGF6dGNkPS4uLiAKLS0gYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotICBBWlRfQkFTRV9BRERSIHRvICctMScuIEluIHRoYXQgY2FzZSBhenRjZCBwcm9iZXMgdGhlIGFkZHJlc3NlcyBsaXN0ZWQgCi0gIHVuZGVyIEFaVF9CQVNFX0FVVE8uIEJ1dCBwbGVhc2UgcmVtZW1iZXIsIHRoYXQgYXV0b3Byb2JpbmcgYWx3YXlzIG1heSAKLSAgaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotLSBUaGVyZSBhcmUgc29tZSBvdGhlciBwb2ludHMsIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIGF1dG8tZWplY3QgdGhlCi0gIENEIHdoZW4gdW5tb3VudGluZyBhIGRyaXZlLCB0cmF5IGxvY2tpbmcgZXRjLiwgc2VlIGF6dGNkLmggZm9yIGRldGFpbHMuCi0tIElmIHlvdSdyZSB1c2luZyBhIGxpbnV4IGtlcm5lbCB2ZXJzaW9uIHByaW9yIHRvIDIuMS4wLCBpbiBhenRjZC5oCi0gIHVuY29tbWVudCB0aGUgbGluZSAnI2RlZmluZSBBWlRfS0VSTkVMX1BSSU9SXzJfMScKLS0gQnVpbGQgYSBuZXcga2VybmVsLCBjb25maWd1cmUgaXQgZm9yICdBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMgc3VwcG9ydCcgCi0gIChpZiB5b3Ugd2FudCBhenRjZCB0byBiZSBwYXJ0IG9mIHRoZSBrZXJuZWwpLiBEbyBub3QgY29uZmlndXJlIGl0IGZvcgotICAnQXp0ZWNoLi4uIHN1cHBvcnQnLCBpZiB5b3Ugd2FudCB0byB1c2UgYXp0Y2QgYXMgYSBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUuIAotICBCdXQgaW4gYW55IGNhc2UgeW91IG11c3QgaGF2ZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGluY2x1ZGVkIGluIHlvdXIKLSAga2VybmVsLgotLSBBY3RpdmF0ZSB0aGUgbmV3IGtlcm5lbCwgbm9ybWFsbHkgdGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgTElMTyAoZG9uJ3QgZm9yLQotICBnZXQgdG8gY29uZmlndXJlIGl0IGJlZm9yZSBhbmQgdG8ga2VlcCBhIGNvcHkgb2YgeW91ciBvbGQga2VybmVsIGluIGNhc2UKLSAgc29tZXRoaW5nIGdvZXMgd3JvbmchKS4KLS0gUmVib290Ci0tIElmIHlvdSd2ZSBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgeW91IG5vdyBzaG91bGQgc2VlIGR1cmluZyBib290IAotICBzb21lIG1lc3NhZ2VzIGxpa2UKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IERyaXZlclZlcnNpb249PHZlcnNpb24gbnVtYmVyPiBCYXNlQWRkcmVzcz08YmFzZWFkZHJlc3M+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiBGaXJtd2FyZVZlcnNpb249PGZpcm13YXJlIHZlcnNpb24gaWQgb2YgeW91ciBJL08tY2FyZD4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IDxkcml2ZSB0eXBlPiBkZXRlY3RlZAotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRW5kCi0tIElmIHlvdSBoYXZlIG5vdCBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgYnV0IHdhbnQgdG8gbG9hZCBhenRjZCBhcyBhIAotICBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUgc2VlIDQuMS4gCi0tIElmIHRoZSBtZXNzYWdlIGxvb2tzIGNvcnJlY3QsIGFzIHVzZXIgJ3Jvb3QnIHlvdSBzaG91bGQgYmUgYWJsZSB0byBtb3VudCAKLSAgdGhlIGRyaXZlIGJ5Ci0gICAgICAgICAgbW91bnQgLXQgaXNvOTY2MCAtciAvZGV2L2F6dGNkMCAvbW50Ci0gIGFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0gIC9kZXYvYXp0Y2QwIGFuZCAvbW50IGRvIGV4aXN0IGFuZCBjcmVhdGUgdGhlbSwgaWYgbmVjZXNzYXJ5IGJ5IGRvaW5nCi0gICAgICBta25vZCAvZGV2L2F6dGNkMCBiIDI5IDAKLSAgICAgIG1rZGlyIC9tbnQgICAgICAgICAgICAgICAgICAgICAgIAotLSBJZiB0aGlzIHN0aWxsIGRvZXMgbm90IGhlbHAsIHNlZSBjaGFwdGVycyBPVEhFUiBEUklWRVMgYW5kIERFQlVHR0lORy4KLQotNC4xIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi1JZiB5b3UgZG8gbm90IG5lZWQgYXp0Y2QgcGVybWFuZW50bHksIHlvdSBjYW4gYWxzbyBsb2FkIGFuZCByZW1vdmUgdGhlIGRyaXZlcgotZHVyaW5nIHJ1bnRpbWUgdmlhIGluc21vZCBhbmQgcm1tb2QuIFRvIGJ1aWxkIGF6dGNkIGFzIGEgbG9hZGFibGUgbW9kdWxlIHlvdSAKLW11c3QgY29uZmlndXJlIHlvdXIga2VybmVsIGZvciBBWlRFQ0ggbW9kdWxlIHN1cHBvcnQgKGFuc3dlciAnbScgd2hlbiBjb24tCi1maWd1cmluZyB0aGUga2VybmVsKS4gQW55aG93LCB5b3UgbWF5IHJ1biBpbnRvIHByb2JsZW1zLCBpZiB0aGUgdmVyc2lvbiBvZiAKLXlvdXIgYm9vdCBrZXJuZWwgaXMgbm90IHRoZSBzYW1lIHRoYW4gdGhlIHNvdXJjZSBrZXJuZWwgdmVyc2lvbiwgZnJvbSB3aGljaCAKLXlvdSBjcmVhdGUgdGhlIG1vZHVsZXMuIFNvIHJlYnVpbGQgeW91ciBrZXJuZWwsIGlmIG5lY2Vzc2FyeS4gCi0KLU5vdyBlZGl0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgeW91ciBBWlRFQ0ggaW50ZXJmYWNlIGNhcmQgaW4KLS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vYXp0Y2QuaCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuIAotYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotQVpUX0JBU0VfQUREUiB0byAnLTEnLiBJbiB0aGF0IGNhc2UgYXp0Y2QgcHJvYmVzIHRoZSBhZGRyZXNzZXMgbGlzdGVkIAotdW5kZXIgQVpUX0JBU0VfQVVUTy4gQnV0IHBsZWFzZSByZW1lbWJlciwgdGhhdCBhdXRvcHJvYmluZyBhbHdheXMgbWF5IAotaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotVGhlcmUgYXJlIGFsc28gc29tZSBzcGVjaWFsIGZlYXR1cmVzIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIAotYXV0by1lamVjdCBhIENEIHdoZW4gdW5tb3VudGluZyB0aGUgZHJpdmUgZXRjOyBzZWUgYXp0Y2QuaCBmb3IgZGV0YWlscy4gCi1UaGVuIGNoYW5nZSB0byAvdXNyL3NyYy9saW51eCBhbmQgZG8gYSAKLSAgICAgICAgICAgICAgICAgICAgbWFrZSBtb2R1bGVzICAKLQkgICAgICAgICAgICBtYWtlIG1vZHVsZXNfaW5zdGFsbAotQWZ0ZXIgdGhhdCB5b3UgY2FuIHJ1bi10aW1lIGxvYWQgdGhlIGRyaXZlciB2aWEKLSAgICAgICAgICAgICAgICAgICAgaW5zbW9kIC9saWIvbW9kdWxlcy9YLlguWC9taXNjL2F6dGNkLm8KLWFuZCByZW1vdmUgaXQgdmlhICAgcm1tb2QgIGF6dGNkLgotSWYgeW91IGRpZCBub3Qgc2V0IHRoZSBjb3JyZWN0IGJhc2UgYWRkcmVzcyBpbiBhenRjZC5oLCB5b3UgY2FuIGFsc28gc3VwcGx5IHRoZQotYmFzZSBhZGRyZXNzIHdoZW4gbG9hZGluZyB0aGUgZHJpdmVyIHZpYQotICAgICAgICAgICAgICAgICAgICBpbnNtb2QgL2xpYi9tb2R1bGVzL1guWC5YL21pc2MvYXp0Y2QubyBhenRjZD08YmFzZSBhZGRyZXNzPgotQWdhaW4gc3BlY2lmeWluZyBhenRjZD0tMSB3aWxsIGNhdXNlIGF1dG9wcm9iaW5nLgotSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBpc285NjYwLWZpbGVzeXN0ZW0gaW4geW91ciBib290IGtlcm5lbCwgeW91IGFsc28gaGF2ZQotdG8gbG9hZCBpdCBiZWZvcmUgeW91IGNhbiBtb3VudCB0aGUgQ0RST006Ci0gICAgICAgICAgICAgICAgICAgIGluc21vZCAvbGliL21vZHVsZXMvWC5YLlgvZnMvaXNvZnMubwotVGhlIG1vdW50IHByb2NlZHVyZSB3b3JrcyBhcyBkZXNjcmliZWQgaW4gNC4gYWJvdmUuCi0oSW4gYWxsIGNvbW1hbmRzICdYLlguWCcgaXMgdGhlIGN1cnJlbnQgbGludXgga2VybmVsIHZlcnNpb24gbnVtYmVyKQotCi00LjIgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi1Nb3N0IHNvdW5kY2FyZHMgZG8gaGF2ZSBhIGJ1cyBpbnRlcmZhY2UgdG8gdGhlIENEUk9NLWRyaXZlLiBJbiBtYW55IGNhc2VzCi10aGlzIHNvdW5kY2FyZCBuZWVkcyB0byBiZSBjb25maWd1cmVkLCBiZWZvcmUgdGhlIENEUk9NIGNhbiBiZSB1c2VkLiBUaGlzCi1jb25maWd1cmF0aW9uIHByb2NlZHVyZSBjb25zaXN0cyBvZiB3cml0aW5nIHNvbWUga2luZCBvZiBpbml0aWFsaXphdGlvbgotZGF0YSB0byB0aGUgc291bmRjYXJkIHJlZ2lzdGVycy4gVGhlIEFaVEVDSC1DRFJPTSBkcml2ZXIgaW4gdGhlIG1vbWVudCBkb2VzCi1vbmx5IHN1cHBvcnQgb25lIHR5cGUgb2Ygc291bmRjYXJkIChTb3VuZFdhdmUzMikuIFVzZXJzIG9mIG90aGVyIHNvdW5kY2FyZHMKLXNob3VsZCB0cnkgdG8gYm9vdCBET1MgZmlyc3QgYW5kIGxldCB0aGVpciBET1MgZHJpdmVycyBpbml0aWFsaXplIHRoZQotc291bmRjYXJkIGFuZCBDRFJPTSwgdGhlbiB3YXJtIGJvb3QgKG9yIHVzZSBsb2FkbGluKSB0aGVpciBQQyB0byBzdGFydAotTGludXguCi1TdXBwb3J0IGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIFNvdW5kV2F2ZTMyLXNvdW5kY2FyZHMgaXMgZGlyZWN0bHkKLWltcGxlbWVudGVkIGluIHRoZSBBWlRFQ0ggZHJpdmVyLiBQbGVhc2UgZWRpdCBsaW51eC9kcml2ZXJzL2Nkcm9tL2F6dGRjLmgsCi11bmNvbW1lbnQgbGluZSAnI2RlZmluZSBBWlRfU1czMicgYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yCi1BWlRfQkFTRV9BRERSIGFuZCBBWlRfU1czMl9CQVNFX0FERFIuIFRoaXMgc3VwcG9ydCB3YXMgdGVzdGVkIHdpdGggYW4gT3JjaGlkCi1DRFMtMzExMCBjb25uZWN0ZWQgdG8gYSBTb3VuZFdhdmUzMi4KLUlmIHlvdSB3YW50IHlvdXIgc291bmRjYXJkIHRvIGJlIHN1cHBvcnRlZCwgZmluZCBvdXQsIGhvdyBpdCBuZWVkcyB0byBiZQotY29uZmlndXJlZCBhbmQgbWFpbCBtZSAoc2VlIDYuKSB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIAotCi01LiBLTk9XTiBQUk9CTEVNUywgRlVUVVJFIERFVkVMT1BNRU5UUwotNS4xIE1VTFRJU0VTU0lPTiBTVVBQT1JUCi1NdWx0aXNlc3Npb24gc3VwcG9ydCBmb3IgQ0QncyBzdGlsbCBpcyBhIG15dGguIEkgaW1wbGVtZW50ZWQgYW5kIHRlc3RlZCBhIGJhc2ljCi1zdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gYW5kIFhBIENEcywgYnV0IEkgc3RpbGwgaGF2ZSBub3QgZW5vdWdoIENEcyBhbmQgYXBwbGktCi1jYXRpb25zIHRvIHRlc3QgaXQgcmlnb3JvdXNseS4gU28gaWYgeW91J2QgbGlrZSB0byBoZWxwIG1lLCBwbGVhc2UgY29udGFjdCBtZQotKEVtYWlsIGFkZHJlc3Mgc2VlIGJlbG93KS4gQXMgb2YgdmVyc2lvbiAxLjQgYW5kIG5ld2VyIHlvdSBjYW4gZW5hYmxlIHRoZSAKLW11bHRpc2Vzc2lvbiBzdXBwb3J0IGluIGF6dGNkLmggYnkgc2V0dGluZyBBWlRfTVVMVElTRVNTSU9OIHRvIDEuIERvaW5nIHNvIAotd2lsbCBjYXVzZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIHRvIGRlYWwgd2l0aCBtdWx0aXNlc3Npb24gQ0RzLCBpZS4gcmVkaXJlY3QgCi1yZXF1ZXN0cyB0byB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCBzZXNzaW9uLCAKLXdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvIG9mIGFsbCBwcmV2aW91cyBzZXNzaW9ucyBldGMuLiBJZiB5b3UgZG8gc2V0IAotQVpUX01VTFRJU0VTU0lPTiB0byAwLCB5b3UgY2FuIHVzZSBtdWx0aXNlc3Npb24gQ0RzIGFueXdheS4gSW4gdGhhdCBjYXNlIHRoZSAKLWRyaXZlJ3MgZmlybXdhcmUgd2lsbCBkbyBhdXRvbWF0aWMgcmVkaXJlY3Rpb24uIEZvciB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGFueSAKLW11bHRpc2Vzc2lvbiBDRCAgd2lsbCB0aGVuIGxvb2sgbGlrZSBhICdub3JtYWwnIHNpbmdsZSBzZXNzaW9uIENELiBCdXQgbmV2ZXItCi10aGVsZXNzIHRoZSBkYXRhIG9mIGFsbCBzZXNzaW9ucyBhcmUgdmlld2FibGUgYW5kIGFjY2Vzc2libGUuIFNvIHdpdGggcHJhY3RpY2FsLQotbHkgYWxsIHJlYWwgd29ybGQgYXBwbGljYXRpb25zIHlvdSB3b24ndCBub3RpY2UgdGhlIGRpZmZlcmVuY2UuIEJ1dCBhcyBmdXR1cmUKLWFwcGxpY2F0aW9ucyBtYXkgbWFrZSB1c2Ugb2YgYWR2YW5jZWQgbXVsdGlzZXNzaW9uIGZlYXR1cmVzLCBJJ3ZlIHN0YXJ0ZWQgdG8KLWltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGZvciB0aGUgSVNPOTY2MCBtdWx0aXNlc3Npb24gaW50ZXJmYWNlIHZpYSBpb2N0bAotQ0RST01NVUxUSVNFU1NJT04uCi0KLTUuMiBTVEFUVVMgUkVDT0dOSVRJT04KLVRoZSBkcml2ZSBzdGF0dXMgcmVjb2duaXRpb24gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLiBDaGFuZ2luZwotYSBkaXNrIG9yIGhhdmluZyB0aGUgZG9vciBvcGVuLCB3aGVuIGEgZHJpdmUgaXMgYWxyZWFkeSBtb3VudGVkLCBpcyBkZXRlY3RlZCAKLWJ5IHRoZSBBenRlY2ggZHJpdmVyIGl0c2VsZiwgYnV0IG5ldmVydGhlbGVzcyBjYXVzZXMgbXVsdGlwbGUgcmVhZCBhdHRlbXB0cwotYnkgdGhlIGRpZmZlcmVudCBsYXllcnMgb2YgdGhlIElTTzk2NjAtZmlsZXN5c3RlbSBkcml2ZXIsIHdoaWNoIGZpbmFsbHkgdGltZW91dCwKLXNvIHlvdSBoYXZlIHRvIHdhaXQgcXVpdGUgYSBsaXR0bGUuLi4gQnV0IGlzbid0IGl0IGJhZCBzdHlsZSB0byBjaGFuZ2UgYSBkaXNrIAotaW4gYSBtb3VudGVkIGRyaXZlLCBhbnlob3cgPyEKLQotVGhlIGRyaXZlciB1c2VzIGJ1c3kgd2FpdCBpbiBtb3N0IGNhc2VzIGZvciB0aGUgZHJpdmUgaGFuZHNoYWtlIChtYWNyb3MKLVNURU5fTE9XIGFuZCBEVEVOX0xPVykuIEkgdGVzdGVkIHdpdGggYSA0ODYvRFgyIGF0IDY2TUh6IGFuZCBhIFBlbnRpdW0gYXQKLTYwTUh6IGFuZCA5ME1Iei4gV2hlbmV2ZXIgeW91IHVzZSBhIG11Y2ggZmFzdGVyIG1hY2hpbmUgeW91IGFyZSBsaWtlbHkgdG8gZ2V0IAotdGltZW91dCBtZXNzYWdlcy4gSW4gdGhhdCBjYXNlIGVkaXQgYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgCi1BWlRfVElNRU9VVC4gCi0KLUZvciBzb21lICdzbG93JyBkcml2ZSBjb21tYW5kcyBJIGltcGxlbWVudGVkIHdhaXRpbmcgd2l0aCBhIHRpbWVyIHdhaXRxdWV1ZQotKG1hY3JvIFNURU5fTE9XX1dBSVQpLiBJZiB5b3UgZ2V0IHRoaXMgdGltZW91dCBtZXNzYWdlLCB5b3UgbWF5IGFsc28gZWRpdAotYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgQVpUX1NUQVRVU19ERUxBWS4gVGhlIHdhaXRxdWV1ZSBoYXMKLXNob3duIHRvIGJlIGEgbGl0dGxlIGNyaXRpY2FsLiBJZiB5b3UgZ2V0IGtlcm5lbCBwYW5pYyBtZXNzYWdlcywgZWRpdCBhenRjZC5jCi1hbmQgc3Vic3RpdHV0ZSBTVEVOX0xPV19XQUlUIGJ5IFNURU5fTE9XLiBCdXN5IHdhaXRpbmcgd2l0aCBTVEVOX0xPVyBpcyBtb3JlCi1zdGFibGUsIGJ1dCBhbHNvIGNhdXNlcyBDUFUgb3ZlcmhlYWQuCi0KLTUuMyBET1NFTVUncyBDRC1ST00gU1VQUE9SVAotV2l0aCByZWxlYXNlIDEuMjAgYXp0Y2Qgd2FzIG1vZGlmaWVkIHRvIGFsbG93IGFjY2VzcyB0byBDRC1ST01TIHdoZW4gcnVubmluZwotdW5kZXIgZG9zZW11LTAuNjAuMCBhenRjZC12ZXJzaW9ucyBiZWZvcmUgMS4yMCBhcmUgbW9zdCBsaWtlbHkgdG8gY3Jhc2gKLUxpbnV4LCB3aGVuIGEgQ0QtUk9NIGlzIGFjY2Vzc2VkIHVuZGVyIGRvc2VtdS4gVGhpcyBwcm9ibGVtIGhhcyBwYXJ0bHkgYmVlbgotZml4ZWQsIGJ1dCBzdGlsbCB3aGVuIGFjY2Vzc2luZyBhIGRpcmVjdG9yeSBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlIHN5c3RlbQotbWlnaHQgaGFuZyBmb3Igc29tZSAzMHNlYy4gU28gYmUgcGF0aWVudCwgd2hlbiB1c2luZyBkb3NlbXUncyBDRC1ST00gc3VwcG9ydAotaW4gY29tYmluYXRpb24gd2l0aCBhenRjZCA6LSkgISAKLVRoaXMgcHJvYmxlbSBoYXMgbm93IChKdWx5IDE5OTUpIGJlZW4gZml4ZWQgYnkgYSBtb2RpZmljYXRpb24gdG8gZG9zZW11J3MKLUNELVJPTSBkcml2ZXIuIFRoZSBuZXcgdmVyc2lvbiBjYW1lIHdpdGggZG9zZW11LTAuNjAuMiwgc2VlIGRvc2VtdSdzCi1SRUFETUUuQ0RST00uCi0KLTYuIEJVRyBSRVBPUlRTCi1QbGVhc2Ugc2VuZCBkZXRhaWxlZCBidWcgcmVwb3J0cyBhbmQgYnVnIGZpeGVzIHZpYSBFTWFpbCB0bwotCi0gICAgICAgIFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUKLQotUGxlYXNlIGluY2x1ZGUgYSBkZXNjcmlwdGlvbiBvZiB5b3VyIENELVJPTSBkcml2ZSB0eXBlIGFuZCBpbnRlcmZhY2UgY2FyZCwgCi10aGUgZXhhY3QgZmlybXdhcmUgbWVzc2FnZSBkdXJpbmcgTGludXggYm9vdHVwLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIAotQVpURUNILUNEUk9NLWRyaXZlciBhbmQgdGhlIExpbnV4IGtlcm5lbCB2ZXJzaW9uLiBBbHNvIGEgZGVzY3JpcHRpb24gb2YgeW91ciAKLXN5c3RlbSdzIG90aGVyIGhhcmR3YXJlIGNvdWxkIGJlIG9mIGludGVyZXN0LCBlc3BlY2lhbGx5IG1pY3JvcHJvY2Vzc29yIHR5cGUsIAotY2xvY2sgZnJlcXVlbmN5LCBvdGhlciBpbnRlcmZhY2UgY2FyZHMgc3VjaCBhcyBzb3VuZGNhcmRzLCBldGhlcm5ldCBhZGFwdGVyLCAKLWdhbWUgY2FyZHMgZXRjLi4KLQotSSB3aWxsIHRyeSB0byBjb2xsZWN0IHRoZSByZXBvcnRzIGFuZCBtYWtlIHRoZSBuZWNlc3NhcnkgbW9kaWZpY2F0aW9ucyBmcm9tIAotdGltZSB0byB0aW1lLiBJIG1heSBhbHNvIGNvbWUgYmFjayB0byB5b3UgZGlyZWN0bHkgd2l0aCBzb21lIGJ1ZyBmaXhlcyBhbmQgCi1hc2sgeW91IHRvIGRvIGZ1cnRoZXIgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCi1FZGl0b3JzIG9mIENELVJPTXMgYXJlIGludml0ZWQgdG8gc2VuZCBhICdjb29wZXJhdGlvbicgY29weSBvZiB0aGVpcgotQ0QtUk9NcyB0byB0aGUgdm9sdW50ZWVycywgd2hvIHByb3ZpZGVkIHRoZSBDRC1ST00gc3VwcG9ydCBmb3IgTGludXguIE15Ci1zbmFpbCBtYWlsIGFkZHJlc3MgZm9yIHN1Y2ggJ3N0dWZmJyBpcwotICAgICAgICAgICBQcm9mLiBEci4gVy4gWmltbWVybWFubgotICAgICAgICAgICBGYWNoaG9jaHNjaHVsZSBmdWVyIFRlY2huaWsgRXNzbGluZ2VuCi0gICAgICAgICAgIEZhY2hiZXJlaWNoIElUCi0gICAgICAgICAgIEZsYW5kZXJuc3RyYXNzZSAxMDEKLSAgICAgICAgICAgRC03MzczMiBFc3NsaW5nZW4KLSAgICAgICAgICAgR2VybWFueQotCi0KLTcuIE9USEVSIERSSVZFUwotVGhlIGZvbGxvd2luZyBkcml2ZXMgT1JDSElEIENEUzMxMTAsIE9LQU5PIENERDExMCwgV0VBUk5FUyBDREQxMTAgYW5kIENvbnJhZAotVFhDIE5yLiA5OTMxMjMtc2VyaWVzIDA0IG5lYXJseSBsb29rIHRoZSBzYW1lIGFzIEFaVEVDSCBDREEyNjgtMDFBLCBlc3BlY2lhbGx5IAotdGhleSBzZWVtIHRvIHVzZSB0aGUgc2FtZSBjb21tYW5kIGNvZGVzLiBTbyBpdCB3YXMgcXVpdGUgc2ltcGxlIHRvIG1ha2UgdGhlIAotQVpURUNIIGRyaXZlciB3b3JrIHdpdGggdGhlc2UgZHJpdmVzLiAKLQotVW5mb3J0dW5hdGVseSBJIGRvIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBkcml2ZXMgYXZhaWxhYmxlLCBzbyBJIGNvdWxkbid0IHRlc3QKLWl0IG15c2VsZi4gSW4gc29tZSBpbnN0YWxsYXRpb25zLCBpdCBzZWVtcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZHJpdmUgCi13aXRoIHRoZSBET1MgZHJpdmVyIGJlZm9yZSAoZXNwZWNpYWxseSBpZiBjb21iaW5lZCB3aXRoIGEgc291bmQgY2FyZCkgYW5kIHRoZW4gCi1kbyBhIHdhcm0gYm9vdCAoQ1RSTC1BTFQtUkVTRVQpIG9yIHN0YXJ0IExpbnV4IGZyb20gRE9TLCBlLmcuIHdpdGggJ2xvYWRsaW4nLgotCi1JZiB5b3UgZG8gbm90IHN1Y2NlZWQsIHJlYWQgY2hhcHRlciBERUJVR0dJTkcuIFRoYW5rcyBpbiBhZHZhbmNlIQotCi1Tb3JyeSBmb3IgdGhlIGluY29udmVuaWVuY2UsIGJ1dCBpdCBpcyBkaWZmaWN1bHQgdG8gZGV2ZWxvcCBmb3IgaGFyZHdhcmUsIAotd2hpY2ggeW91IGRvbid0IGhhdmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nLiBTbyBpZiB5b3UgbGlrZSwgcGxlYXNlIGhlbHAgdXMuCi0KLUlmIHlvdSBkbyBoYXZlIGEgQ3lDRFJPTSBDUjUyMGllIHRoYW5rcyB0byBIaWxtYXIgQmVyZ2VyJ3MgaGVscCB5b3VyIGNoYW5jZXMKLWFyZSBnb29kLCB0aGF0IGl0IHdpbGwgd29yayB3aXRoIGF6dGNkLiBUaGUgQ1I1MjBpZSBpcyBzb2xkIGFzIGFuIElERS1kcml2ZQotYW5kIHJlYWxseSBpcyBjb25uZWN0ZWQgdG8gdGhlIElERSBpbnRlcmZhY2UgKHByaW1hcnkgYXQgMHgxRjAgb3Igc2Vjb25kYXJ5Ci1hdCAweDE3MCwgY29uZmlndXJlZCBhcyBzbGF2ZSwgbm90IGFzIG1hc3RlcikuIE5ldmVydGhlbGVzcyBpdCBpcyBub3QgQVRBUEkKLWNvbXBhdGlibGUgYnV0IHN0aWxsIHVzZXMgQXp0ZWNoJ3MgY29tbWFuZCBjb2Rlcy4KLQotCi04LiBERUJVR0dJTkcgOiBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCwgVFJZIFRIRSBGT0xMT1dJTkcKLS1yZXJlYWQgdGhlIGNvbXBsZXRlIFJFQURNRSBmaWxlCi0tbWFrZSBzdXJlLCB0aGF0IHlvdXIgZHJpdmUgaXMgaGFyZHdhcmUgY29uZmlndXJlZCBmb3IgCi0gICAgdHJhbnNmZXIgbW9kZTogcG9sbGVkCi0gICAgSVJROiAgICAgICAgICAgbm90IHVzZWQKLSAgICBETUE6ICAgICAgICAgICBub3QgdXNlZAotICAgIEJhc2UgQWRkcmVzczogIHNvbWV0aGluZyBsaWtlIDMwMCwgMzIwIC4uLgotIFlvdSBjYW4gY2hlY2sgdGhpcywgd2hlbiB5b3Ugc3RhcnQgdGhlIERPUyBkcml2ZXIsIHdoaWNoIGNhbWUgd2l0aCB5b3VyCi0gZHJpdmUuIEJ5IGFwcHJvcHJpYXRlbHkgY29uZmlndXJpbmcgdGhlIGRyaXZlIGFuZCB0aGUgRE9TIGRyaXZlciB5b3UgY2FuCi0gY2hlY2ssIHdoZXRoZXIgeW91ciBkcml2ZSBkb2VzIG9wZXJhdGUgaW4gdGhpcyBtb2RlIGNvcnJlY3RseSB1bmRlciBET1MuIElmCi0gaXQgZG9lcyBub3Qgb3BlcmF0ZSB1bmRlciBET1MsIGl0IHdvbid0IHVuZGVyIExpbnV4LgotIElmIHlvdXIgZHJpdmUncyBiYXNlIGFkZHJlc3MgaXMgc29tZXRoaW5nIGxpa2UgMHgxNzAgb3IgMHgxRjAgKGFuZCBpdCBpcwotIG5vdCBhIEN5Q0RST00gQ1I1MjBpZSBvciBDUiA5NDBpZSkgeW91IG1vc3QgbGlrZWx5IGFyZSBoYXZpbmcgYW4gSURFL0FUQVBJLQotIGNvbXBhdGlibGUgZHJpdmUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYXp0Y2QuYywgdXNlIGlkZS1jZC5jIGluc3RlYWQuCi0gTWFrZSBzdXJlIHRoZSBCYXNlIEFkZHJlc3MgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgaW4gYXp0Y2QuaCwgYWxzbyBtYWtlCi0gc3VyZSwgdGhhdCAvZGV2L2F6dGNkMCBleGlzdHMgd2l0aCB0aGUgY29ycmVjdCBtYWpvciBudW1iZXIgKGNvbXBhcmUgaXQgd2l0aAotIHRoZSBlbnRyeSBpbiBmaWxlIC91c3IvaW5jbHVkZS9saW51eC9tYWpvci5oIGZvciB0aGUgQXp0ZWNoIGRyaXZlKS4gCi0taW5zZXJ0IGEgQ0QtUk9NIGFuZCBjbG9zZSB0aGUgdHJheQotLWNvbGQgYm9vdCB5b3VyIFBDIChpLmUuIHZpYSB0aGUgcG93ZXIgb24gc3dpdGNoIG9yIHRoZSByZXNldCBidXR0b24pCi0taWYgeW91IHN0YXJ0IExpbnV4IHZpYSBET1MsIGUuZy4gdXNpbmcgbG9hZGxpbiwgbWFrZSBzdXJlLCB0aGF0IHRoZSBET1MKLSBkcml2ZXIgZm9yIHRoZSBDRC1ST00gZHJpdmUgaXMgbm90IGxvYWRlZCAoY29tbWVudCBvdXQgdGhlIGNhbGxpbmcgbGluZXMgCi0gaW4gRE9TJyBjb25maWcuc3lzISkKLS1sb29rIGZvciB0aGUgYXp0Y2Q6IGluaXQgbWVzc2FnZSBkdXJpbmcgTGludXggaW5pdCBhbmQgbm90ZSB0aGVtIGV4YWN0bHkKLS1sb2cgaW4gYXMgcm9vdCBhbmQgZG8gYSBtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQKLS1pZiB5b3UgZG9uJ3Qgc3VjY2VlZCBpbiB0aGUgZmlyc3QgdGltZSwgdHJ5IHNldmVyYWwgdGltZXMuIFRyeSBhbHNvIHRvIG9wZW4KLSBhbmQgY2xvc2UgdGhlIHRyYXksIHRoZW4gbW91bnQgYWdhaW4uIFBsZWFzZSBub3RlIGNhcmVmdWxseSBhbGwgY29tbWFuZHMKLSB5b3UgdHlwZWQgaW4gYW5kIHRoZSBhenRjZC1tZXNzYWdlcywgd2hpY2ggeW91IGdldC4KLS1pZiB5b3UgZ2V0IGFuICdBenRlY2ggQ0QtUk9NIGluaXQ6IGFib3J0ZWQnIG1lc3NhZ2UsIHJlYWQgdGhlIHJlbWFya3MgYWJvdXQKLSB0aGUgdmVyc2lvbiBzdHJpbmcgYmVsb3cuCi0KLUlmIHRoaXMgZG9lcyBub3QgaGVscCwgZG8gdGhlIHNhbWUgd2l0aCB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzIAotLXN0YXJ0IERPUyBiZWZvcmU7IG1ha2Ugbm93IHN1cmUsIHRoYXQgdGhlIERPUyBkcml2ZXIgZm9yIHRoZSBDRC1ST00gaXMgCi0gbG9hZGVkIHVuZGVyIERPUyAoaS5lLiB1bmNvbW1lbnQgaXQgYWdhaW4gaW4gY29uZmlnLnN5cykKLS13YXJtIGJvb3QgeW91ciBQQyAoaS5lLiB2aWEgQ1RSTC1BTFQtREVMKQotIGlmIHlvdSBoYXZlIGl0LCB5b3UgY2FuIGFsc28gc3RhcnQgdmlhIGxvYWRsaW4gKHRyeSBib3RoKS4KLSAuLi4KLSBBZ2FpbiBub3RlIGFsbCBjb21tYW5kcyBhbmQgdGhlIGF6dGNkLW1lc3NhZ2VzLgotCi1JZiB5b3Ugc2VlIFNURU5fTE9XIG9yIFNURU5fTE9XX1dBSVQgZXJyb3IgbWVzc2FnZXMsIGluY3JlYXNlIHRoZSB0aW1lb3V0Ci12YWx1ZXMuCi0KLUlmIHRoaXMgc3RpbGwgZG9lcyBub3QgaGVscCwgCi0tbG9vayBpbiBhenRjZC5jIGZvciB0aGUgbGluZXMgICNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQVpUX1RFU1QxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKLSBhbmQgc3Vic3RpdHV0ZSAnI2lmIDAnIGJ5ICcjaWYgMScuCi0tcmVjb21waWxlIHlvdXIga2VybmVsIGFuZCByZXBlYXQgdGhlIGFib3ZlIHR3byBwcm9jZWR1cmVzLiBZb3Ugd2lsbCBub3cgZ2V0IAotIGEgYnVuZGxlIG9mIGRlYnVnZ2luZyBtZXNzYWdlcyBmcm9tIHRoZSBkcml2ZXIuIEFnYWluIG5vdGUgeW91ciBjb21tYW5kcwotIGFuZCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZXMuIElmIHlvdSBoYXZlIHN5c2xvZ2QgcnVubmluZywgdGhlc2UgbWVzc2FnZXMKLSBtYXkgYWxzbyBiZSBmb3VuZCBpbiBzeXNsb2dkJ3Mga2VybmVsIGxvZyBmaWxlLiBOZXZlcnRoZWxlc3MgaW4gc29tZQotIGluc3RhbGxhdGlvbnMgc3lzbG9nZCBkb2VzIG5vdCB5ZXQgcnVuLCB3aGVuIGluaXQoKSBpcyBjYWxsZWQsIHRodXMgbG9vayBmb3IKLSB0aGUgYXp0Y2QtbWVzc2FnZXMgZHVyaW5nIGluaXQsIGJlZm9yZSB0aGUgbG9naW4tcHJvbXB0IGFwcGVhcnMuCi0gVGhlbiBsb29rIGluIGF6dGNkLmMsIHRvIGZpbmQgb3V0LCB3aGF0IGhhcHBlbmVkLiBUaGUgbm9ybWFsIGNhbGxpbmcgc2VxdWVuY2UgCi0gaXM6IGF6dGNkX2luaXQoKSBkdXJpbmcgTGludXggYm9vdHVwIHByb2NlZHVyZSBpbml0KCkKLSBhZnRlciBkb2luZyBhICdtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQnIHRoZSBub3JtYWwgY2FsbGluZyBzZXF1ZW5jZSBpcwotICAgICBhenRjZF9vcGVuKCkgICAgLT4gU3RhdHVzIDJjIGFmdGVyIGNvbGQgcmVib290IHdpdGggQ0RST00gb3IgYXVkaW8gQ0QgaW5zZXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA4ICBhZnRlciB3YXJtIHJlYm9vdCB3aXRoIENEUk9NIGluc2VydGVkICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgLT4gU3RhdHVzIDJlIGFmdGVyIGNvbGQgcmVib290IHdpdGggbm8gZGlzaywgY2xvc2VkIHRyYXkKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA2ZSBhZnRlciBjb2xkIHJlYm9vdCwgbW91bnQgd2l0aCBkb29yIG9wZW4KLSAgICAgYXp0VXBkYXRlVG9jKCkKLSAgICAgYXp0R2V0RGlza0luZm8oKQotICAgICBhenRHZXRRQ2hhbm5lbEluZm8oKSAgIHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0R2V0VG9jKCkKLSAgICAgYXp0R2V0UUNoYW5uZWxJbmZvKCkgICByZXBlYXRlZCBzZXZlcmFsIHRpbWVzCi0gICAgIGEgbGlzdCBvZiB0cmFjayBpbmZvcm1hdGlvbgotICAgICBkb19henRjZF9yZXF1ZXN0KCkgIH0gIAotICAgICBhenRfdHJhbnNmZXIoKSAgICB9IHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0X3BvbGwgICAgICAgICAgfQotIENoZWNrLCBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb3IgdGhlIHN0YXR1cyBmbGFncyEKLSAKLSBUaGVyZSBhcmUgYSBsb3Qgb2Ygb3RoZXIgbWVzc2FnZXMsIGVnLiB0aGUgQUNNRC1jb21tYW5kIGNvZGUgKGRlZmluZWQgaW4KLSBhenRjZC5oKSwgc3RhdHVzIGluZm8gZnJvbSB0aGUgZ2V0QXp0U3RhdHVzLWNvbW1hbmQgYW5kIHRoZSBzdGF0ZSBzZXF1ZW5jZSBvZgotIHRoZSBmaW5pdGUgc3RhdGUgbWFjaGluZSBpbiBhenRfcG9sbCgpLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXJlIHRoZSBzdGF0dXMKLSBtZXNzYWdlcywgbG9vayBob3cgdGhleSBhcmUgZGVmaW5lZCBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQsIGlmIHRoZXkgbWFrZQotIHNlbnNlIGluIHRoZSBjb250ZXh0IHdoZXJlIHRoZXkgYXBwZWFyLiBXaXRoIGEgQ0QtUk9NIGluc2VydGVkIHRoZSBzdGF0dXMgCi0gc2hvdWxkIGFsd2F5cyBiZSA4LCBleGNlcHQgaW4gYXp0Y2Rfb3BlbigpLiBUcnkgdG8gb3BlbiB0aGUgdHJheSwgaW5zZXJ0IGFuCi0gYXVkaW8gZGlzaywgaW5zZXJ0IG5vIGRpc2sgb3IgcmVpbnNlcnQgdGhlIENELVJPTSBhbmQgY2hlY2ssIGlmIHRoZSBzdGF0dXMKLSBiaXRzIGNoYW5nZSBhY2NvcmRpbmdseS4gVGhlIHN0YXR1cyBiaXRzIGFyZSB0aGUgbW9zdCBsaWtlbHkgcG9pbnQsIHdoZXJlIAotIHRoZSBkcml2ZSBtYW51ZmFjdHVyZXJzIG1heSBpbXBsZW1lbnQgY2hhbmdlcy4KLSAgICAgICAgICAgIAotSWYgeW91IHN0aWxsIGRvbid0IHN1Y2NlZWQsIGEgZ29vZCBwb2ludCB0byBzdGFydCBpcyB0byBsb29rIGluIGF6dGNkLmMgaW4gCi1mdW5jdGlvbiBhenRjZF9pbml0LCB3aGVyZSB0aGUgZHJpdmUgc2hvdWxkIGJlIGRldGVjdGVkIGR1cmluZyBpbml0LiBEbyB0aGUKLWZvbGxvd2luZzoKLS1yZWJvb3QgdGhlIHN5c3RlbSB3aXRoIGJvb3QgcGFyYW1ldGVyICdhenRjZD08eW91ciBiYXNlIGFkZHJlc3M+LDB4NzknLiBXaXRoCi0gcGFyYW1ldGVyIDB4NzkgbW9zdCBvZiB0aGUgZHJpdmUgdmVyc2lvbiBkZXRlY3Rpb24gaXMgYnlwYXNzZWQuIEFmdGVyIHRoYXQgCi0geW91IHNob3VsZCBzZWUgdGhlIGNvbXBsZXRlIHZlcnNpb24gc3RyaW5nIGluY2x1ZGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyAKLSBibGFua3MgZHVyaW5nIGluaXQuIAotIE5vdyBhZGFwdCB0aGUgc3RhdGVtZW50Ci0gICAgICBpZiAoKHJlc3VsdFsxXT09J0EnKSYmKHJlc3VsdFsyXT09J1onIC4uLikKLSBpbiBhenRjZF9pbml0KCkgdG8gZXhhY3RseSBtYXRjaCB0aGUgZmlyc3QgMyBvciA0IGxldHRlcnMgeW91IGhhdmUgc2Vlbi4KLS1Bbm90aGVyIHBvaW50IGlzIHRoZSAnc21hcnQnIGNhcmQgZGV0ZWN0aW9uIGZlYXR1cmUgaW4gYXp0Y2RfaW5pdCgpLiBOb3JtYWxseQotIHRoZSBDRC1ST00gZHJpdmUgaXMgcmVhZHksIHdoZW4gYXp0Y2RfaW5pdCBpcyB0cnlpbmcgdG8gcmVhZCB0aGUgdmVyc2lvbgotIHN0cmluZyBhbmQgYSB0aW1lIGNvbnN1bWluZyBBQ01EX1NPRlRfUkVTRVQgY29tbWFuZCBjYW4gYmUgYXZvaWRlZC4gVGhpcyBpcwotIGRldGVjdGVkIGJ5IGxvb2tpbmcsIGlmIEFGTF9PUF9PSyBjYW4gYmUgcmVhZCBjb3JyZWN0bHkuIElmIHRoZSBDRC1ST00gZHJpdmUgCi0gaGFuZ3MgaW4gc29tZSB1bmtub3duIHN0YXRlLCBlLmcuIGJlY2F1c2Ugb2YgYW4gZXJyb3IgYmVmb3JlIGEgd2FybSBzdGFydCBvciAKLSBiZWNhdXNlIHlvdSBmaXJzdCBvcGVyYXRlZCB1bmRlciBET1MsIGV2ZW4gdGhlIHZlcnNpb24gc3RyaW5nIG1heSBiZSBjb3JyZWN0LCAKLSBidXQgdGhlIGZvbGxvd2luZyBjb21tYW5kcyB3aWxsIG5vdC4gVGhlbiBjaGFuZ2UgdGhlIGNvZGUgaW4gc3VjaCBhIHdheSwgCi0gdGhhdCB0aGUgQUNNRF9TT0ZUX1JFU0VUIGlzIGlzc3VlZCBpbiBhbnkgY2FzZSwgYnkgc3Vic3RpdHV0aW5nIHRoZQotIGlmLXN0YXRlbWVudCAnaWYgKCAuLi49QUZMX09QX09LKScgYnkgJ2lmICgxKScuCi0KLUlmIHlvdSBzdWNjZWVkLCBwbGVhc2UgbWFpbCBtZSB0aGUgZXhhY3QgdmVyc2lvbiBzdHJpbmcgb2YgeW91ciBkcml2ZSBhbmQKLXRoZSBjb2RlIG1vZGlmaWNhdGlvbnMsIHlvdSBoYXZlIG1hZGUgdG9nZXRoZXIgd2l0aCBhIHNob3J0IGV4cGxhbmF0aW9uLgotSWYgeW91IGRvbid0IHN1Y2NlZWQsIHlvdSBtYXkgbWFpbCBtZSB0aGUgb3V0cHV0IG9mIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi1CdXQgcmVtZW1iZXIsIHRoZXkgYXJlIG9ubHkgdXNlZnVsLCBpZiB0aGV5IGFyZSBleGFjdCBhbmQgY29tcGxldGUgYW5kIHlvdQotZGVzY3JpYmUgaW4gZGV0YWlsIHlvdXIgaGFyZHdhcmUgc2V0dXAgYW5kIHdoYXQgeW91IGRpZCAoY29sZC93YXJtIHJlYm9vdCwKLXdpdGgvd2l0aG91dCBET1MsIERPUy1kcml2ZXIgc3RhcnRlZC9ub3Qgc3RhcnRlZCwgd2hpY2ggTGludXgtY29tbWFuZHMgZXRjLikKLQotCi05LiBURUNITklDQUwgSElTVE9SWSBPRiBUSEUgRFJJVkVSCi1UaGUgQVpURUNILURyaXZlciBpcyBhIHJld29yayBvZiB0aGUgTWl0c3VtaS1Ecml2ZXIuIEZvdXIgbWFqb3IgaXRlbXMgaGFkIHRvCi1iZSByZXdvcmtlZDoKLQotYSkgVGhlIE1pdHN1bWkgZHJpdmUgZG9lcyBpc3N1ZSBjb21wbGV0ZSBzdGF0dXMgaW5mb3JtYXRpb24gYWNrbm93bGVkZ2luZwotZWFjaCBjb21tYW5kLCB0aGUgQXp0ZWNoIGRyaXZlIGRvZXMgb25seSBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCB3YXMKLXByb2Nlc3NlZC4gU28gd2hlbmV2ZXIgdGhlIGNvbXBsZXRlIHN0YXR1cyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQsIGFuIGV4dHJhCi1BQ01EX0dFVF9TVEFUVVMgY29tbWFuZCBpcyBpc3N1ZWQuIFRoZSBoYW5kc2hha2UgcHJvY2VkdXJlIGZvciB0aGUgZHJpdmUKLWNhbiBiZSBmb3VuZCBpbiB0aGUgZnVuY3Rpb25zIGF6dFNlbmRDbWQoKSwgc2VuZEF6dENtZCgpIGFuZCBnZXRBenRTdGF0dXMoKS4KLQotYikgVGhlIEF6dGVjaCBEcml2ZSBkb2VzIG5vdCBoYXZlIGEgQUNNRF9HRVRfRElTS19JTkZPIGNvbW1hbmQsIHNvIHRoZQotbmVjZXNzYXJ5IGluZm8gYWJvdXQgdGhlIG51bWJlciBvZiB0cmFja3MgKGZpcnN0VHJhY2ssIGxhc3RUcmFjayksIGRpc2sKLWxlbmd0aCBldGMuIGhhcyB0byBiZSByZWFkIGZyb20gdGhlIFRPQyBpbiB0aGUgbGVhZCBpbiB0cmFjayAoc2VlIGZ1bmN0aW9uCi1henRHZXREaXNrSW5mbygpKS4KLQotYykgV2hlbmV2ZXIgZGF0YSBpcyByZWFkIGZyb20gdGhlIGRyaXZlLCB0aGUgTWl0c3VtaSBkcml2ZSBpcyBzdGFydGVkIHdpdGggYQotY29tbWFuZCB0byByZWFkIGFuIGluZGVmaW5pdGUgKDB4ZmZmZmZmKSBudW1iZXIgb2Ygc2VjdG9ycy4gV2hlbiB0aGUgYXBwcm9wcmlhdGUgCi1udW1iZXIgb2Ygc2VjdG9ycyBpcyByZWFkLCB0aGUgZHJpdmUgaXMgc3RvcHBlZCBieSBhIEFDRE1fU1RPUCBjb21tYW5kLiBUaGlzCi1kb2VzIG5vdCB3b3JrIHdpdGggdGhlIEF6dGVjaCBkcml2ZS4gSSBkaWQgbm90IGZpbmQgYSB3YXkgdG8gc3RvcCBpdC4gVGhlCi1zdG9wIGFuZCBwYXVzZSBjb21tYW5kcyBkbyBvbmx5IHdvcmsgaW4gQVVESU8gbW9kZSBidXQgbm90IGluIERBVEEgbW9kZS4KLVRoZXJlZm9yZSBJIGhhZCB0byBtb2RpZnkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgaW4gZnVuY3Rpb24gYXp0X3BvbGwgdG8KLW9ubHkgcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIHNlY3RvcnMgYW5kIHRoZW4gc3RhcnQgYSBuZXcgcmVhZCBvbiBkZW1hbmQuIEFzIEkgCi1oYXZlIG5vdCBjb21wbGV0ZWx5IHVuZGVyc3Rvb2QsIGhvdyB0aGUgYnVmZmVyL2NhY2hpbmcgc2NoZW1lIG9mIHRoZSBNaXRzdW1pIAotZHJpdmVyIHdhcyBpbXBsZW1lbnRlZCwgSSBhbSBub3Qgc3VyZSwgaWYgSSBoYXZlIGNvdmVyZWQgYWxsIGNhc2VzIGNvcnJlY3RseSwgCi13aGVuZXZlciB5b3UgZ2V0IHRpbWVvdXQgbWVzc2FnZXMsIHRoZSBidWcgaXMgbW9zdCBsaWtlbHkgdG8gYmUgaW4gdGhhdAotZnVuY3Rpb24gYXp0X3BvbGwoKSBhcm91bmQgc3dpdGNoKGNtZCkgLi4uLiBjYXNlIEFDRF9TX0RBVEEuIAotCi1kKSBJIGRpZCBub3QgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGNoYW5naW5nIGRyaXZlIG1vZGUuIFNvIEkgZG91YnQsIHRoYXQgdGhlCi1jb2RlIGFyb3VuZCBmdW5jdGlvbiBhenRfcG9sbCgpIGNhc2UgQVpUX1NfTU9ERSBkb2VzIHdvcmsuIEluIG15IHRlc3QgSSBoYXZlCi1ub3QgYmVlbiBhYmxlIHRvIHN3aXRjaCB0byByZWFkaW5nIGluIHJhdyBtb2RlLiBGb3IgcmVhZGluZyByYXcgbW9kZSwgQXp0ZWNoCi11c2VzIGEgZGlmZmVyZW50IGNvbW1hbmQgdGhhbiBmb3IgY29va2VkIG1vZGUsIHdoaWNoIEkgb25seSBoYXZlIGltcGxlbWVuLQotdGVkIGluIHRoZSBpb2N0bC1zZWN0aW9uIGJ1dCBub3QgaW4gdGhlIHNlY3Rpb24gd2hpY2ggaXMgdXNlZCBieSB0aGUgSVNPOTY2MC4gCi0KLVRoZSBkcml2ZXIgd2FzIGRldmVsb3BlZCBvbiBhbiBBU1QgUEMgd2l0aCBJbnRlbCA0ODYvRFgyLCA4TUIgUkFNLCAzNDBNQiBJREUgCi1oYXJkIGRpc2sgYW5kIG9uIGFuIEFTVCBQQyB3aXRoIEludGVsIFBlbnRpdW0gNjBNSHosIDE2TUIgUkFNLCA1MjBNQiBJREUgCi1ydW5uaW5nIExpbnV4IGtlcm5lbCB2ZXJzaW9uIDEuMC45IGZyb20gdGhlIExTVCAxLjggRGlzdHJpYnV0aW9uLiBUaGUga2VybmVsIAotd2FzIGNvbXBpbGVkIHdpdGggZ2NjLjIuNS44LiBNeSBDRC1ST00gZHJpdmUgaXMgYW4gQXp0ZWNoIENEQTI2OC0wMUEuIE15Ci1kcml2ZSBzYXlzLCB0aGF0IGl0IGhhcyBGaXJtd2FyZSBWZXJzaW9uIEFaVDI2ODAxQTEuMy4gSXQgY2FtZSB3aXRoIGFuIElTQS1idXMKLWludGVyZmFjZSBjYXJkIGFuZCB3b3JrcyB3aXRoIHBvbGxlZCBJL08gd2l0aG91dCBETUEgYW5kIHdpdGhvdXQgaW50ZXJydXB0cy4KLVRoZSBjb2RlIGZvciBhbGwgb3RoZXIgZHJpdmVzIHdhcyAncmVtb3RlJyB0ZXN0ZWQgYW5kIGRlYnVnZ2VkIGJ5IGEgbnVtYmVyIG9mIAotdm9sdW50ZWVycyBvbiB0aGUgSW50ZXJuZXQuCi0KLVBvaW50cywgd2hlcmUgSSBmZWVsIHRoYXQgcG9zc2libGUgcHJvYmxlbXMgbWlnaHQgYmUgYW5kIGFsbCBwb2ludHMgd2hlcmUgSSAKLWRpZCBub3QgY29tcGxldGVseSB1bmRlcnN0YW5kIHRoZSBkcml2ZSdzIGJlaGF2aW91ciBvciB0cnVzdCBteSBvd24gY29kZSBhcmUgCi1tYXJrZWQgd2l0aCAvKj8/PyovIGluIHRoZSBzb3VyY2UgY29kZS4gVGhlcmUgYXJlIGFsc28gc29tZSBwYXJ0cyBpbiB0aGUgCi1NaXRzdW1pIGRyaXZlciwgd2hlcmUgSSBkaWQgbm90IGNvbXBsZXRlbHkgdW5kZXJzdGFuZCB0aGVpciBjb2RlLgotCi0KLTEwLiBBQ0tOT1dMRURHTUVOVFMKLVdpdGhvdXQgdGhlIGhlbHAgb2YgUC5CdXNoLCBBenRlY2gsIHdobyBkZWxpdmVyZWQgdGVjaG5pY2FsIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgQXp0ZWNoIERyaXZlIGFuZCB3aXRob3V0IHRoZSBoZWxwIG9mIEUuTW9lbmtlYmVyZywgR1dERywgd2hvIGRpZCBhCi1ncmVhdCBqb2IgaW4gYW5hbHl6aW5nIHRoZSBjb21tYW5kIHN0cnVjdHVyZSBvZiB2YXJpb3VzIENELVJPTSBkcml2ZXMsIHRoaXMKLXdvcmsgd291bGQgbm90IGhhdmUgYmVlbiBwb3NzaWJsZS4gRS5Nb2Vua2ViZXJnIHdhcyBhbHNvIGEgZ3JlYXQgaGVscCBpbiAKLW1ha2luZyB0aGUgc29mdHdhcmUgJ2tlcm5lbCByZWFkeScgYW5kIGluIGFuc3dlcmluZyBtYW55IG9mIHRoZSBDRFJPTS1yZWxhdGVkIAotcXVlc3Rpb25zIGluIHRoZSBuZXdzZ3JvdXBzLiBIZSByZWFsbHkgaXMgKnRoZSogTGludXggQ0QtUk9NIGd1cnUuIFRoYW5rcyAKLWFsc28gdG8gYWxsIHRoZSBndXlzIG9uIHRoZSBJbnRlcm5ldCwgd2hvIGNvbGxlY3RlZCB2YWx1YWJsZSB0ZWNobmljYWwgCi1pbmZvcm1hdGlvbiBhYm91dCBDRFJPTXMuIAotCi1Kb2UgTmFyZG9uZSAoam9lQGFjY2Vzcy5kaWdleC5uZXQpIHdhcyBhIHBhdGllbnQgdGVzdGVyIGV2ZW4gZm9yIG15IGZpcnN0Ci10cmlhbCwgd2hpY2ggd2FzIG1vcmUgdGhhbiBzbG93LCBhbmQgbWFkZSBzdWdnZXN0aW9ucyBmb3IgY29kZSBpbXByb3ZlbWVudC4KLUVzcGVjaWFsbHkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgYXp0X3BvbGwoKSB3YXMgcmV3cml0dGVuIGJ5IEpvZSB0byBnZXQKLWNsZWFuIEMgY29kZSBhbmQgYXZvaWQgdGhlIHVnbHkgJ2dvdG9zJywgd2hpY2ggSSBjb3BpZWQgZnJvbSBtY2QuYy4KLQotUm9iYnkgU2NoaXJtZXIgKHNjaGlybWVyQGZtaS51bmktcGFzc2F1LmRlKSB0ZXN0ZWQgdGhlIGF1ZGlvIHN0dWZmIChpb2N0bHMpIAotYW5kIHN1Z2dlc3RlZCBhIGxvdCBvZiBwYXRjaGVzIGZvciB0aGVtLgotCi1Kb3NlcGggUGlza29yIGFuZCBQZXRlciBOdWdlbnQgd2VyZSB0aGUgZmlyc3QgdXNlcnMgd2l0aCB0aGUgT1JDSElEIENEMzExMAotYW5kIGFsc28gd2VyZSB2ZXJ5IHBhdGllbnQgd2l0aCB0aGUgcHJvYmxlbXMgd2hpY2ggb2NjdXJyZWQuCi0KLVJlaW5oYXJkIE1heCBkZWxpdmVyZWQgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIHRoZQotU291bmRXYXZlMzIgc291bmRjYXJkcy4KLQotSm9jaGVuIEt1bnogYW5kIE9sYWYgS2FsdXphIGRlbGl2ZXJlZCB0aGUgaW5mb3JtYXRpb24gZm9yIHN1cHBvcnRpbmcgQ29ucmFkJ3MgCi1UWEMgZHJpdmUuCi0KLUhpbG1hciBCZXJnZXIgZGVsaXZlcmVkIHRoZSBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIEN5Q0RST00gQ1I1MjBpZS4KLQotQW55Ym9keSwgd2hvIGlzIGludGVyZXN0ZWQgaW4gdGhlc2UgaXRlbXMgc2hvdWxkIGhhdmUgYSBsb29rIGF0ICdmdHAuZ3dkZy5kZScsCi1kaXJlY3RvcnkgJ3B1Yi9saW51eC9jZHJvbScgYW5kIGF0ICdmdHAuY2Ryb20uY29tJywgZGlyZWN0b3J5ICdwdWIvY2Ryb20nLgotCi0xMS4gUFJPR1JBTU1JTkcgQUREIE9OczogY2RwbGF5LmMKLVlvdSBjYW4gdXNlIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW5jbHVkZWQgaW4gYXp0Y2QuYyBpbiB5b3VyIG93biBwcm9ncmFtcy4gQXMKLWFuIGV4YW1wbGUgb24gaG93IHRvIGRvIHRoaXMsIHlvdSB3aWxsIGZpbmQgYSB0aW55IENEIFBsYXllciBmb3IgYXVkaW8gQ0RzIAotbmFtZWQgJ2NkcGxheS5jJy4gSXQgYWxsb3dzIHlvdSB0byBwbGF5IGF1ZGlvIENEcy4gWW91IGNhbiBwbGF5IGEgc3BlY2lmaWVkIAotdHJhY2ssIHBhdXNlIGFuZCByZXN1bWUgb3Igc2tpcCB0cmFja3MgZm9yd2FyZCBhbmQgYmFja3dhcmRzLiBJZiB5b3UgcXVpdCB0aGUgCi1wcm9ncmFtIHdpdGhvdXQgc3RvcHBpbmcgdGhlICBkcml2ZSwgcGxheWluZyBpcyBjb250aW51ZWQuIFlvdSBjYW4gYWxzbyAKLShtaXMpdXNlIGNkcGxheSB0byByZWFkIGFuZCBoZXhkdW1wIGRhdGEgZGlza3MuIFlvdSBjYW4gZmluZCB0aGUgY29kZSBpbiB0aGUgCi1BUFBFTkRJWCBvZiB0aGlzIGZpbGUsIHdoaWNoIHlvdSBzaG91bGQgY3V0IG91dCB3aXRoIGFuIGVkaXRvciBhbmQgc3RvcmUgaW4gYSAKLXNlcGFyYXRlIGZpbGUgJ2NkcGxheS5jJy4gVG8gY29tcGlsZSBpdCBhbmQgbWFrZSBpdCBleGVjdXRhYmxlLCBkbwotICBnY2MgLXMgLVdhbGwgLU8yIC1ML3Vzci9saWIgY2RwbGF5LmMgLW8gL3Vzci9sb2NhbC9iaW4vY2RwbGF5ICMgY29tcGlsZXMgaXQKLSAgY2htb2QgKzc1NSAvdXNyL2xvY2FsL2Jpbi9jZHBsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2VzIGl0IGV4ZWN1dGFibGUKLSAgbG4gLXMgL2Rldi9henRjZDAgL2Rldi9jZHJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyZWF0ZXMgYSBsaW5rCi0gICAoZm9yIC91c3IvbGliIHN1YnN0aXR1dGUgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnksIHdoZXJlIHlvdXIgaW5jbHVkZSBmaWxlcyAKLSAgICByZXNpZGUsICBhbmQgZm9yIC91c3IvbG9jYWwvYmluIHRoZSBkaXJlY3RvcnksIHdoZXJlIHlvdSB3YW50IHRoZSBleGVjdXRhYmxlIAotICAgIGJpbmFyeSB0byByZXNpZGUgKQotCi1Zb3UgaGF2ZSB0byBzZXQgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgZm9yIGNkcGxheSAqYW5kKiBmb3IgL2Rldi9tY2QwIG9yCi0vZGV2L2F6dGNkMCBpbiBvcmRlciB0byB1c2UgaXQuIFJlbWVtYmVyLCB0aGF0IHlvdSBzaG91bGQgbm90IGhhdmUgL2Rldi9jZHJvbSAKLW1vdW50ZWQsIHdoZW4geW91J3JlIHBsYXlpbmcgYXVkaW8gQ0RzLiAKLQotVGhpcyBwcm9ncmFtIGlzIGp1c3QgYSBoYWNrIGZvciB0ZXN0aW5nIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW4gYXp0Y2QuYy4gSSB3aWxsIAotbm90IG1haW50YWluIGl0LCBzbyBpZiB5b3UgcnVuIGludG8gcHJvYmxlbXMsIGRpc2NhcmQgaXQgb3IgaGF2ZSBhIGxvb2sgaW50byAKLXRoZSBzb3VyY2UgY29kZSAnY2RwbGF5LmMnLiBUaGUgcHJvZ3JhbSBkb2VzIG9ubHkgY29udGFpbiBhIG1pbmltdW0gb2YgdXNlciAKLXByb3RlY3Rpb24gYW5kIGlucHV0IGVycm9yIGRldGVjdGlvbi4gSWYgeW91IHVzZSB0aGUgY29tbWFuZHMgaW4gdGhlIHdyb25nIAotb3JkZXIgb3IgaWYgeW91IHRyeSB0byByZWFkIGEgQ0QgYXQgd3JvbmcgYWRkcmVzc2VzLCB5b3UgbWF5IGdldCBlcnJvciBtZXNzYWdlcwotb3IgZXZlbiBoYW5nIHlvdXIgbWFjaGluZS4gSWYgeW91IGdldCBTVEVOX0xPVywgU1RFTl9MT1dfV0FJVCBvciBzZWdtZW50IHZpb2xhdGlvbiAKLWVycm9yIG1lc3NhZ2VzIHdoZW4gdXNpbmcgY2RwbGF5LCBhZnRlciB0aGF0LCB0aGUgc3lzdGVtIG1pZ2h0IG5vdCBiZSBzdGFibGUgCi1hbnkgbW9yZSwgc28geW91J2QgYmV0dGVyIHJlYm9vdC4gQXMgdGhlIGlvY3RsLWZ1bmN0aW9ucyBydW4gaW4ga2VybmVsIG1vZGUsCi1tb3N0IG5vcm1hbCBMaW51eC1tdWx0aXRhc2tpbmcgcHJvdGVjdGlvbiBmZWF0dXJlcyBkbyBub3Qgd29yay4gQnkgdXNpbmcKLXVuaW5pdGlhbGl6ZWQgJ3dpbGQnIHBvaW50ZXJzIGV0Yy4sIGl0IGlzIGVhc3kgdG8gd3JpdGUgdG8gb3RoZXIgdXNlcnMnIGRhdGEgCi1hbmQgcHJvZ3JhbSBhcmVhcywgZGVzdHJveSBrZXJuZWwgdGFibGVzIGV0Yy4uIFNvIGlmIHlvdSBleHBlcmltZW50IHdpdGggaW9jdGxzCi1hcyBhbHdheXMgd2hlbiB5b3UgYXJlIGRvaW5nIHN5c3RlbXMgcHJvZ3JhbW1pbmcgYW5kIGtlcm5lbCBoYWNraW5nLCB5b3UKLXNob3VsZCBoYXZlIGEgYmFja3VwIGNvcHkgb2YgeW91ciBzeXN0ZW0gaW4gYSBzYWZlIHBsYWNlIChhbmQgeW91IGFsc28KLXNob3VsZCB0cnkgcmVzdG9yaW5nIGZyb20gYSBiYWNrdXAgY29weSBmaXJzdCkhCi0KLUEgcmV3b3JrZWQgYW5kIGltcHJvdmVkIHZlcnNpb24gY2FsbGVkICdjZHRlc3Rlci5jJywgd2hpY2ggaGFzIHlldCBtb3JlCi1mZWF0dXJlcyBmb3IgdGVzdGluZyBDRFJPTS1kcml2ZXMgY2FuIGJlIGZvdW5kIGluCi1Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkLCB3cml0dGVuIGJ5IEUuTW9lbmtlYmVyZy4KLQotV2VybmVyIFppbW1lcm1hbm4KLUZhY2hob2Noc2NodWxlIGZ1ZXIgVGVjaG5payBFc3NsaW5nZW4KLShFTWFpbDogV2VybmVyLlppbW1lcm1hbm5AZmh0LWVzc2xpbmdlbi5kZSkKLU9jdG9iZXIsIDE5OTcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BUFBFTkRJWDogU291cmNlIGNvZGUgb2YgY2RwbGF5LmMKLQotLyogVGlueSBBdWRpbyBDRCBQbGF5ZXIKLQotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYgV2VybmVyIFppbW1lcm1hbm4gKFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUpCi0KLVRoaXMgcHJvZ3JhbSBvcmlnaW5hbGx5IHdhcyB3cml0dGVuIHRvIHRlc3QgdGhlIGF1ZGlvIGZ1bmN0aW9ucyBvZiB0aGUKLUFaVEVDSC5DRFJPTS1kcml2ZXIsIGJ1dCBpdCBzaG91bGQgd29yayB3aXRoIGV2ZXJ5IENELVJPTSBkcml2ZS4gQmVmb3JlIAotdXNpbmcgaXQsIHlvdSBzaG91bGQgc2V0IGEgc3ltbGluayBmcm9tIC9kZXYvY2Ryb20gdG8geW91ciByZWFsIENEUk9NCi1kZXZpY2UuCi0KLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIHRoaXMgcHJvZ3JhbS4KLQotSGlzdG9yeTogIFYwLjEgIFcuWmltbWVybWFubjogRmlyc3QgcmVsZWFzZS4gTm92LiA4LCAxOTk0Ci0gICAgICAgICAgVjAuMiAgVy5aaW1tZXJtYW5uOiBFbmhhbmNlZCBmdW5jdGlvbmFsaXR5LiBOb3YuIDksIDE5OTQKLSAgICAgICAgICBWMC4zICBXLlppbW1lcm1hbm46IEFkZGl0aW9uYWwgZnVuY3Rpb25zLiBOb3YuIDI4LCAxOTk0ICAgICAgICAgIAotICAgICAgICAgIFYwLjQgIFcuWmltbWVybWFubjogZml4ZWQgc29tZSBidWdzLiBEZWMuIDE3LCAxOTk0Ci0gICAgICAgICAgVjAuNSAgVy5aaW1tZXJtYW5uOiBjbGVhbiAnc2NhbmYnIGNvbW1hbmRzIHdpdGhvdXQgY29tcGlsZXIgd2FybmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gNiwgMTk5NQotICAgICAgICAgIFYwLjYgIFcuWmltbWVybWFubjogdm9sdW1lIGNvbnRyb2wgKHN0aWxsIGV4cGVyaW1lbnRhbCkuIEphbi4gMjQsIDE5OTUKLSAgICAgICAgICBWMC43ICBXLlppbW1lcm1hbm46IHJlYWQgcmF3IG1vZGlmaWVkLiBKdWx5IDI2LCA5NQotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+Ci0jaW5jbHVkZSA8bGludXgvLi4vLi4vZHJpdmVycy9jZHJvbS9henRjZC5oPgotCi12b2lkIGhlbHAodm9pZCkKLXsgcHJpbnRmKCJBdmFpbGFibGUgQ29tbWFuZHM6ICBTVE9QICAgICAgICAgcyAgICAgIEVKRUNUL0NMT1NFICBlICAgICAgIFFVSVQgICAgICAgICBxXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBQTEFZIFRSQUNLICAgdCAgICAgIFBBVVNFICAgICAgICBwICAgICAgIFJFU1VNRSAgICAgICByXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBORVhUIFRSQUNLICAgbiAgICAgIFJFUEVBVCBMQVNUICBsICAgICAgIEhFTFAgICAgICAgICBoXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBTVUIgQ0hBTk5FTCAgYyAgICAgIFRSQUNLIElORk8gICBpICAgICAgIFBMQVkgQVQgICAgICBhXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBSRUFEICAgICAgICAgZCAgICAgIFJFQUQgUkFXICAgICB3ICAgICAgIFZPTFVNRSAgICAgICB2XG4iKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsgaW50IGhhbmRsZTsKLSAgdW5zaWduZWQgY2hhciBjb21tYW5kPScgJywgaW5pPTAsIGZpcnN0PTEsIGxhc3Q9MTsKLSAgdW5zaWduZWQgaW50IGNtZCwgaSxqLGssIGFyZzEsYXJnMixhcmczOwotICBzdHJ1Y3QgY2Ryb21fdGkgICAgICAgdGk7Ci0gIHN0cnVjdCBjZHJvbV90b2NoZHIgICB0b2NIZHI7Ci0gIHN0cnVjdCBjZHJvbV9zdWJjaG5sICBzdWJjaG5sOwotICBzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgZW50cnk7Ci0gIHN0cnVjdCBjZHJvbV9tc2YgICAgICBtc2Y7Ci0gIHVuaW9uICB7IHN0cnVjdCBjZHJvbV9tc2YgbXNmOwotICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZltDRF9GUkFNRVNJWkVfUkFXXTsKLSAgICAgICAgIH0gYXp0OwotICBzdHJ1Y3QgY2Ryb21fdm9sY3RybCAgdm9sY3RybDsKLQotICBwcmludGYoIlxuTWluaS1BdWRpbyBDRC1QbGF5ZXIgVjAuNzIgICAoQykgMTk5NCwxOTk1LDE5OTYgIFcuWmltbWVybWFublxuIik7Ci0gIGhhbmRsZT1vcGVuKCIvZGV2L2Nkcm9tIixPX1JEV1IpOwotICBpb2N0bChoYW5kbGUsQ0RST01SRVNVTUUpOwotICAKLSAgaWYgKGhhbmRsZTw9MCkgCi0gICAgeyBwcmludGYoIkRyaXZlIEVycm9yOiBhbHJlYWR5IHBsYXlpbmcsIG5vIGF1ZGlvIGRpc2ssIGRvb3Igb3BlblxuIik7Ci0gICAgICBwcmludGYoIiAgICAgICAgICAgICBvciBubyBwZXJtaXNzaW9uICh5b3UgbXVzdCBiZSBST09UIGluIG9yZGVyIHRvIHVzZSB0aGlzIHByb2dyYW0pXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7IGhlbHAoKTsKLSAgICAgIHdoaWxlICgxKQotICAgICAgICB7IHByaW50ZigiVHlwZSBjb21tYW5kIChoID0gaGVscCk6ICAiKTsKLSAgICAgICAgICBzY2FuZigiJXMiLCZjb21tYW5kKTsgCi0gICAgICAgICAgc3dpdGNoIChjb21tYW5kKQotICAgICAgICAgICAgeyBjYXNlICdlJzogICBjbWQ9Q0RST01FSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwoaGFuZGxlLGNtZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgICAgICAgIGNhc2UgJ3AnOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiQ29tbWFuZCBub3QgYWxsb3dlZCAtIHBsYXkgdHJhY2sgZmlyc3RcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01QQVVTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdyJzogICBpZiAoIWluaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkNvbW1hbmQgbm90IGFsbG93ZWQgLSBwbGF5IHRyYWNrIGZpcnN0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY21kPUNEUk9NUkVTVU1FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3MnOiAgIGNtZD1DRFJPTVBBVVNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgZXJyb3Igb3IgYWxyZWFkeSBzdG9wcGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY21kPUNEUk9NU1RPUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQpKSBwcmludGYoIkRyaXZlIGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3QnOiAgIGNtZD1DRFJPTVJFQURUT0NIRFI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZ0b2NIZHIpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiLS1maXJzdCB0cmFjazogJWQgICAtLWxhc3QgdHJhY2s6ICVkICAgLS1lbnRlciB0cmFjayBudW1iZXI6ICIsZmlyc3QsbGFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9Q0RST01QTEFZVFJLSU5EOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVpIiwmYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA+bGFzdCkgIHRpLmNkdGlfdHJrMD1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnbic6ICAgaWYgKCFpbmkrKykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKyt0aS5jZHRpX3RyazAgPiBsYXN0KSAgdGkuY2R0aV90cmswPWxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX2luZDA9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMT1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQxPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdGkpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaT0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2wnOiAgIGlmICghaW5pKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdCsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS10aS5jZHRpX3RyazAgPCBmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2MnOiAgIHN1YmNobmwuY2RzY19mb3JtYXQ9Q0RST01fTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkF1ZGlvU3RhdHVzOiVzICAgVHJhY2s6JWQgIE1vZGU6JWQgICBNU0Y9JWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY19hdWRpb3N0YXR1cz09Q0RST01fQVVESU9fUExBWSA/ICJQTEFZSU5HIjoiTk9UIFBMQVlJTkciLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLmZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNhc2UgJ2knOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJDb21tYW5kIG5vdCBhbGxvd2VkIC0gcGxheSB0cmFjayBmaXJzdFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01SRUFEVE9DRU5UUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRyYWNrIE5vLjogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfdHJhY2s9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jZHRlX3RyYWNrPGZpcnN0KSBlbnRyeS5jZHRlX3RyYWNrPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNkdGVfdHJhY2s+bGFzdCkgIGVudHJ5LmNkdGVfdHJhY2s9bGFzdDsKLQkJCSAgICAgIGVudHJ5LmNkdGVfZm9ybWF0PUNEUk9NX01TRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZlbnRyeSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIHRyYWNrIG5vLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5jZHRlX2FkcixlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2Yuc2Vjb25kLGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdhJzogICBjbWQ9Q0RST01QTEFZTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJhbWUpICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkOiVkOiVkIiwmYXJnMSwmYXJnMiwmYXJnMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzAgID1hcmcyOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfZnJhbWUwPWFyZzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgbXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZi5jZG1zZl9mcmFtZTA+IDc0KSBtc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfbWluMT02MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9mcmFtZTE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZtc2YpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIGFkZHJlc3NcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLypub3Qgc3VwcG9ydGVkIGJ5IGV2ZXJ5IENEUk9NIGRyaXZlciovCi0gICAgICAgICAgICAgIGNhc2UgJ2QnOiAgIGNtZD1DRFJPTVJFQURDT09LRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgYXp0Lm1zZi5jZG1zZl9zZWMwICA9NTk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD4gNzQpIGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmYXp0Lm1zZikpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yLCBpbnZhbGlkIGFkZHJlc3Mgb3IgdW5zdXBwb3J0ZWQgY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Y2hhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPDEyODtpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiJTRkOiIsaSoxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8MTY7aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlMnggIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaXNhbG51bShhenQuYnVmW2kqMTYral0pKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsYXp0LmJ1ZltpKjE2K2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrPj0yMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJwcmVzcyBFTlRFUiB0byBjb250aW51ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGNoYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3cnOiAgIGNtZD1DRFJPTVJFQURSQVc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXp0Lm1zZi5jZG1zZl9zZWMwICA+IDU5KSBhenQubXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPiA3NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZhenQpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciwgaW52YWxpZCBhZGRyZXNzIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBrPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8MTQ3O2krKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlNGQ6IixpKjE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIiUyeCAiLGF6dC5idWZbaSoxNitqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPDE2O2orKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmIChpc2FsbnVtKGF6dC5idWZbaSoxNitqXSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGs+PTIwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXRjaGFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgIGNhc2UgJ3YnOiAgIGNtZD1DRFJPTVZPTENUUkw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS1DaGFubmVsIDAgTGVmdCAgKDAtMjU1KTogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsJmFyZzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi0tQ2hhbm5lbCAxIFJpZ2h0ICgwLTI1NSk6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMD1hcmcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xjdHJsLmNoYW5uZWwxPWFyZzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGN0cmwuY2hhbm5lbDI9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdm9sY3RybCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAotICAgICAgICAgICAgICBjYXNlICdxJzogICBpZiAoY2xvc2UoaGFuZGxlKSkgcHJpbnRmKCJEcml2ZSBFcnJvcjogQ0xPU0VcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgICBjYXNlICdoJzogICBoZWxwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OiAgICBwcmludGYoInVua25vd24gY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jZHUzMWEgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NjdkYS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0KLQkJQ0RVMzFBL0NEVTMzQSBEcml2ZXIgSW5mbwotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluZm9ybWF0aW9uIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0RST00gZHJpdmVyIGZvciB0aGUgTGludXgKLWtlcm5lbC4KLQotICAgQ29yZXkgTWlueWFyZCAobWlueWFyZEBtZXRyb25ldC5jb20pCi0gIAotICAgQ29sb3NzaWFucyAzOjE3Ci0KLUNydWRlIFRhYmxlIG9mIENvbnRlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFNldHRpbmcgVXAgdGhlIEhhcmR3YXJlCi0gIENvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLSAgQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLSAgRHJpdmVyIFNwZWNpYWwgRmVhdHVyZXMKLQotICAKLVRoaXMgZGV2aWNlIGRyaXZlciBoYW5kbGVzIFNvbnkgQ0RVMzFBL0NEVTMzQSBDRFJPTSBkcml2ZXMgYW5kCi1wcm92aWRlcyBhIGNvbXBsZXRlIGJsb2NrLWxldmVsIGludGVyZmFjZSBhcyB3ZWxsIGFzIGFuIGlvY3RsKCkKLWludGVyZmFjZSBhcyBzcGVjaWZpZWQgaW4gaW5jbHVkZS9saW51eC9jZHJvbS5oKS4gIFdpdGggdGhpcwotaW50ZXJmYWNlLCBDRFJPTXMgY2FuIGJlIGFjY2Vzc2VkLCBzdGFuZGFyZCBhdWRpbyBDRHMgY2FuIGJlIHBsYXllZAotYmFjayBub3JtYWxseSwgYW5kIENEIGF1ZGlvIGluZm9ybWF0aW9uIGNhbiBiZSByZWFkIG9mZiB0aGUgZHJpdmUuCi0KLU5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSB3b3JrIGZvciBDRFUzMUEvQ0RVMzNBIGRyaXZlcy4gIFNvbWUgdmVuZG9ycwotbWFya2V0IHRoZWlyIGRyaXZlcyBhcyBDRFUzMUEgY29tcGF0aWJsZS4gIFRoZXkgbGllLiAgVGhlaXIgZHJpdmVzIGFyZQotcmVhbGx5IENEVTMxQSBoYXJkd2FyZSBpbnRlcmZhY2UgY29tcGF0aWJsZSAodGhleSBjYW4gcGx1ZyBpbnRvIHRoZQotc2FtZSBjYXJkKS4gIFRoZXkgYXJlIG5vdCBzb2Z0d2FyZSBjb21wYXRpYmxlLgotCi1TZXR0aW5nIFVwIHRoZSBIYXJkd2FyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIENEVTMxQSBkcml2ZXIgaXMgdW5hYmxlIHRvIHNhZmVseSB0ZWxsIGlmIGFuIGludGVyZmFjZSBjYXJkIGlzCi1wcmVzZW50IHRoYXQgaXQgY2FuIHVzZSBiZWNhdXNlIHRoZSBpbnRlcmZhY2UgY2FyZCBkb2VzIG5vdCBhbm5vdW5jZQotaXRzIHByZXNlbmNlIGluIGFueSB3YXkgYmVzaWRlcyBwbGFjaW5nIDQgSS9PIGxvY2F0aW9ucyBpbiBtZW1vcnkuICBJdAotdXNlZCB0byBqdXN0IHByb2JlIG1lbW9yeSBhbmQgYXR0ZW1wdCBjb21tYW5kcywgYnV0IExpbnVzIHdpc2VseSBhc2tlZAotbWUgdG8gcmVtb3ZlIHRoYXQgYmVjYXVzZSBpdCBjb3VsZCByZWFsbHkgc2NyZXcgdXAgb3RoZXIgaGFyZHdhcmUgaW4KLXRoZSBzeXN0ZW0uCi0KLUJlY2F1c2Ugb2YgdGhpcywgeW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpbnRlcmZhY2UKLWlzLCB3aGF0IGludGVycnVwdHMgYXJlIHVzZWQsIGFuZCBwb3NzaWJseSBpZiB5b3UgYXJlIG9uIGEgUEFTLTE2Ci1zb3VuZGNhcmQuCi0KLUlmIHlvdSBoYXZlIHRoZSBTb255IENEVTMxQS9DRFUzM0EgZHJpdmUgaW50ZXJmYWNlIGNhcmQsIHRoZSBmb2xsb3dpbmcKLWRpYWdyYW0gd2lsbCBoZWxwIHlvdSBzZXQgaXQgdXAuICBJZiB5b3UgaGF2ZSBhbm90aGVyIGNhcmQsIHlvdSBhcmUgb24KLXlvdXIgb3duLiAgWW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEkvTyBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgaXMKLW5vdCB1c2VkIGJ5IGFub3RoZXIgY2FyZCBpbiB0aGUgc3lzdGVtLiAgWW91IHdpbGwgbmVlZCB0byBrbm93IHRoZSBJL08KLWFkZHJlc3MgYW5kIGludGVycnVwdCB5b3UgaGF2ZSBzZXQuICBOb3RlIHRoYXQgdXNlIG9mIGludGVycnVwdHMgaXMKLWhpZ2hseSByZWNvbW1lbmRlZCwgaWYgcG9zc2libGUsIGl0IHJlYWxseSBjdXRzIGRvd24gb24gQ1BVIHVzZWQuCi1VbmZvcnR1bmF0ZWx5LCBtb3N0IHNvdW5kY2FyZHMgZG8gbm90IHN1cHBvcnQgaW50ZXJydXB0cyBmb3IgdGhlaXIKLUNEUk9NIGludGVyZmFjZXMuICBCeSBkZWZhdWx0LCB0aGUgU29ueSBpbnRlcmZhY2UgY2FyZCBjb21lcyB3aXRoCi1pbnRlcnJ1cHRzIGRpc2FibGVkLgotICAgCi0gICAgICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgIHwgIEpQMSAgICAgfCAgMzQgUGluIENvbm4gICAgfCAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0rCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLSsKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgRXh0ZXJuYWwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgQ29ubmVjdG9yCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8IHwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgCi0gICAgICBKUDEgc2V0cyB0aGUgQmFzZSBBZGRyZXNzLCB1c2luZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgotICAgCi0gICAgICAgIEFkZHJlc3MgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIKLSAgICAgICAgLS0tLS0tLSAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAweDMyMCAgICAgICAgICAgU2hvcnQgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzMwICAgICAgICAgICBTaG9ydCAgICAgICAgICAgT3BlbgotICAgICAgICAweDM0MCAgICAgICAgICAgT3BlbiAgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzYwICAgICAgICAgICBPcGVuICAgICAgICAgICAgT3BlbgotICAgCi0gICAgICBKUDIgYW5kIEpQMyBjb25maWd1cmUgdGhlIERNQSBjaGFubmVsOyB0aGV5IG11c3QgYmUgc2V0IHRoZSBzYW1lLgotICAgCi0gICAgICAgIERNQSAgICAgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIgICAgICAgICAgIFBpbiAzCi0gICAgICAgIC0tLSAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tCi0gICAgICAgIDEgICAgICAgICAgICAgICBPbiAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDIgICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICAzICAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPbgotICAgCi0gICAgICBKUDQgQ29uZmlndXJlcyB0aGUgSVJROgotICAgCi0gICAgICAgIElSUSAgICAgUGluIDEgICAgICAgICAgIFBpbiAyICAgICAgICAgICBQaW4gMyAgICAgICAgICAgUGluIDQKLSAgICAgICAgLS0tICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAzICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICA0ICAgICAgIE9mZiAgICAgICAgICAgICBPZmYqICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDUgICAgICAgT24gICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAgICAgIDYgICAgICAgT2ZmICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAKLSAgICAgICAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0byBzZXQgdGhpcyBmb3IgaW50ZXJydXB0Ci0gICAgICAgICAgICAgICAgICA0LCBidXQgSSB0aGluayB0aGF0IGlzIGEgbWlzdGFrZS4KLQotTm90ZSB0aGF0IGlmIHlvdSBoYXZlIGFub3RoZXIgaW50ZXJmYWNlIGNhcmQsIHlvdSB3aWxsIG5lZWQgdG8gbG9vayBhdAotdGhlIGRvY3VtZW50YXRpb24gdG8gZmluZCB0aGUgSS9PIGJhc2UgYWRkcmVzcy4gIFRoaXMgaXMgc3BlY2lmaWVkIHRvCi10aGUgU0xDRC5TWVMgZHJpdmVyIGZvciBET1Mgd2l0aCB0aGUgL0I6IHBhcmFtZXRlciwgc28geW91IGNhbiBsb29rIGF0Ci15b3UgRE9TIGRyaXZlciBzZXR1cCB0byBmaW5kIHRoZSBhZGRyZXNzLCBpZiBuZWNlc3NhcnkuCi0KLUNvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotWW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpcyBhdCBib290IHRpbWUuICBUaGlzIGNhbiBiZQotZG9uZSBhdCB0aGUgTGludXggYm9vdCBwcm9tcHQsIGJ5IHVzaW5nIExJTE8sIG9yIGJ5IHVzaW5nIEJvb3RsaW4uCi1Ob3RlIHRoYXQgdGhpcyBpcyBubyBzdWJzdGl0dXRlIGZvciBIT1dUT3MgYW5kIExJTE8gZG9jdW1lbnRhdGlvbiwgaWYKLXlvdSBhcmUgY29uZnVzZWQgcGxlYXNlIHJlYWQgdGhvc2UgZm9yIGluZm8gb24gYm9vdGxpbmUgY29uZmlndXJhdGlvbgotYW5kIExJTE8uCi0KLUF0IHRoZSBsaW51eCBib290IHByb21wdCwgcHJlc3MgdGhlIEFMVCBrZXkgYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUKLWFmdGVyIHRoZSBib290IG5hbWUgKHlvdSBjYW4gbGV0IHRoZSBrZXJuZWwgYm9vdCwgaXQgd2lsbCB0ZWxsIHlvdSB0aGUKLWRlZmF1bHQgYm9vdCBuYW1lIHdoaWxlIGJvb3RpbmcpOgotCi0JY2R1MzFhPTxiYXNlIGFkZHJlc3M+LDxpbnRlcnJ1cHQ+WyxQQVNdCi0KLVRoZSBiYXNlIGFkZHJlc3MgbmVlZHMgdG8gaGF2ZSAiMHgiIGluIGZyb250IG9mIGl0LCBzaW5jZSBpdCBpcyBpbgotaGV4LiAgRm9yIGluc3RhbmNlLCB0byBjb25maWd1cmUgYSBkcml2ZSBhdCBhZGRyZXNzIDMyMCBvbiBpbnRlcnJ1cHQgNSwKLXVzZSB0aGUgZm9sbG93aW5nOgotCi0JY2R1MzFhPTB4MzIwLDUKLQotSSB1c2UgdGhlIGZvbGxvd2luZyBib290IGxpbmU6Ci0KLQljZHUzMWE9MHgxZjg4LDAsUEFTCi0KLWJlY2F1c2UgSSBoYXZlIGEgUEFTLTE2IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJydXB0IGZvciB0aGUKLUNEVTMxQSBpbnRlcmZhY2UuCi0KLUFkZGluZyB0aGlzIGFzIGFuIGFwcGVuZCBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIC9ldGMvbGlsby5jb25mCi1maWxlIHdpbGwgc2V0IGl0IGZvciBsaWxvIGNvbmZpZ3VyYXRpb25zLiAgSSBoYXZlIHRoZSBmb2xsb3dpbmcgYXMgdGhlCi1maXJzdCBsaW5lIGluIG15IGxpbG8uY29uZiBmaWxlOgotCi0JYXBwZW5kPSJjZHUzMWE9MHgxZjg4LDAiCi0KLUknbSBub3Qgc3VyZSBob3cgdG8gc2V0IHVwIEJvb3RsaW4gKEkgaGF2ZSBuZXZlciB1c2VkIGl0KSwgaWYgc29tZW9uZQotd291bGQgbGlrZSB0byBmaWxsIGluIHRoaXMgc2VjdGlvbiBwbGVhc2UgZG8uCi0KLQotQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgc3VwcG9ydHMgbG9hZGluZyBhcyBhIG1vZHVsZS4gIEhvd2V2ZXIsIHlvdSBtdXN0IHNwZWNpZnkKLXRoZSBib290IGFkZHJlc3MgYW5kIGludGVycnVwdCBvbiB0aGUgYm9vdCBsaW5lIHRvIGluc21vZC4gIFlvdSBjYW4ndAotdXNlIG1vZHByb2JlIHRvIGxvYWQgaXQsIHNpbmNlIG1vZHByb2JlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nCi12YXJpYWJsZXMuCi0KLUFueXdheSwgSSB1c2UgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGxvYWQgbXkgZHJpdmVyIGFzIGEgbW9kdWxlCi0KLSAgL3NiaW4vaW5zbW9kIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL21pc2MvY2R1MzFhLm8gY2R1MzFhX3BvcnQ9MHgxZjg4Ci0KLVlvdSBjYW4gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluIHRoZSBkcml2ZXI6Ci0KLSAgY2R1MzFhX3BvcnQ9PEkvTyBhZGRyZXNzPiAtIHNldHMgdGhlIGJhc2UgSS9PLiAgSWYgaGV4LCBwdXQgMHggaW4KLQkJCSAgICAgIGZyb250IG9mIGl0LiAgVGhpcyBtdXN0IGJlIHNwZWNpZmllZC4KLQotICBjZHUzMWFfaXJxPTxpbnRlcnJ1cHQ+IC0gU2V0cyB0aGUgaW50ZXJydXB0IG51bWJlci4gIExlYXZpbmcgdGhpcwotCQkJICAgb2ZmIHdpbGwgdHVybiBpbnRlcnJ1cHRzIG9mZi4KLQotCi1Ecml2ZXIgU3BlY2lhbCBGZWF0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmZWF0dXJlcyBiZXlvbmQgdGhlIG5vcm1hbCBhdWRpbyBhbmQgQ0QtUk9NCi1mdW5jdGlvbnMgb2YgdGhlIGRyaXZlLgotCi0yMDQ4IGJ5dGUgYnVmZmVyIG1vZGUKLQotSWYgYSBkaXNrIGlzIG1vdW50ZWQgd2l0aCAtbyBibG9jaz0yMDQ4LCBkYXRhIGlzIGNvcGllZCBzdHJhaWdodCBmcm9tCi10aGUgZHJpdmUgZGF0YSBwb3J0IHRvIHRoZSBidWZmZXIuICBPdGhlcndpc2UsIHRoZSByZWFkYWhlYWQgYnVmZmVyCi1tdXN0IGJlIGludm9sdmVkIHRvIGhvbGQgdGhlIG90aGVyIDFLIG9mIGRhdGEgd2hlbiBhIDFLIGJsb2NrCi1vcGVyYXRpb24gaXMgZG9uZS4gIE5vdGUgdGhhdCB3aXRoIDIwNDggYnl0ZSBibG9ja3MgeW91IGNhbm5vdCBleGVjdXRlCi1maWxlcyBmcm9tIHRoZSBDRC4KLQotWEEgY29tcGF0aWJpbGl0eQotCi1UaGUgZHJpdmVyIHNob3VsZCBzdXBwb3J0IFhBIGRpc2tzIGZvciBib3RoIHRoZSBDRFUzMUEgYW5kIENEVTMzQS4gIEl0Ci1kb2VzIHRoaXMgdHJhbnNwYXJlbnRseSwgdGhlIHVzaW5nIHByb2dyYW0gZG9lc24ndCBuZWVkIHRvIHNldCBpdC4KLQotTXVsdGktU2Vzc2lvbgotCi1BIG11bHRpLXNlc3Npb24gZGlzayBsb29rcyBqdXN0IGxpa2UgYSBub3JtYWwgZGlzayB0byB0aGUgdXNlci4gIEp1c3QKLW1vdW50IG9uZSBub3JtYWxseSwgYW5kIGFsbCB0aGUgZGF0YSBzaG91bGQgYmUgdGhlcmUuICBBIHNwZWNpYWwKLXRoYW5rcyB0byBLb2VuIGZvciBoZWxwIHdpdGggdGhpcyEKLQotUmF3IHNlY3RvciBJL08KLQotVXNpbmcgdGhlIENEUk9NUkVBREFVRElPIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgcmF3IGF1ZGlvIGFuZCBkYXRhCi10cmFja3MuICBCb3RoIG9wZXJhdGlvbnMgcmV0dXJuIDIzNTIgYnl0ZXMgcGVyIHNlY3Rvci4gIE9uIHRoZSBkYXRhCi10cmFja3MsIHRoZSBmaXJzdCAxMiBieXRlcyBpcyBub3QgcmV0dXJuZWQgYnkgdGhlIGRyaXZlIGFuZCB0aGUgdmFsdWUKLW9mIHRoYXQgZGF0YSBpcyBpbmRldGVybWluYXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNiBiL0RvY3VtZW50YXRpb24vY2Ryb20vY20yMDYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDM2OGYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNgorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi1UaGlzIGlzIHRoZSByZWFkbWUgZmlsZSBmb3IgdGhlIGRyaXZlciBmb3IgdGhlIFBoaWxpcHMvTE1TIGNkcm9tIGRyaXZlCi1jbTIwNiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBjbTI2MCBob3N0IGFkYXB0ZXIgY2FyZC4gCi0KLQkJCQkoYykgMTk5NSBEYXZpZCBBLiB2YW4gTGVldXdlbgotICAgCi1DaGFuZ2VzIHNpbmNlIHZlcnNpb24gMC45OQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gSW50ZXJmYWNpbmcgdG8gdGhlIGtlcm5lbCBpcyByb3V0ZWQgdGhvdWdoIGFuIGV4dHJhIGludGVyZmFjZSBsYXllciwgCi0gIGNkcm9tLmMuIFRoaXMgYWxsb3dzIHJ1bnRpbWUtY29uZmlndXJhYmxlIGBiZWhhdmlvcicgb2YgdGhlIGNkcm9tLWRyaXZlLCAKLSAgaW5kZXBlbmRlbnQgb2YgdGhlIGRyaXZlci4gCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4zMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgYXVkaW8gc3VwcG9ydCwgdGhhdCBpcywgYm90aCAgd29ya21hbiwgd29ya2JvbmUgYW5kIGNkcCB3b3JrCi0gIG5vdyByZWFzb25hYmx5LiBSZWFkaW5nIFRPQyBzdGlsbCB0YWtlcyBzb21lIHRpbWUuIHhtY2QgaGFzIGJlZW4KLSAgcmVwb3J0ZWQgdG8gcnVuIHN1Y2Nlc3NmdWxseS4gCi0tIE1hZGUgYXV0by1wcm9iZSBjb2RlIGEgbGl0dGxlIGJldHRlciwgSSBob3BlCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4yOAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgc3BlZWQgdHJhbnNmZXIgcmF0ZSAoMzAwIGtCL3MpLgotLSBNaW5pbXVtIGtlcm5lbCBtZW1vcnkgdXNhZ2UgZm9yIGJ1ZmZlcmluZyAobGVzcyB0aGFuIDMga0IpLgotLSBNdWx0aXNlc3Npb24gc3VwcG9ydC4KLS0gVHJheSBsb2NraW5nLgotLSBTdGF0aXN0aWNzIG9mIGRyaXZlciBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyLgotLSBNb2R1bGUgc3VwcG9ydC4KLS0gQXV0by1wcm9iaW5nIG9mIGFkYXB0ZXIgY2FyZCdzIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUsCi0gIGFsc28gY29uZmlndXJhYmxlIGF0IGJvb3QgdGltZSBvciBtb2R1bGUgbG9hZCB0aW1lLgotCi0KLURlY2lkZSBob3cgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlIGRyaXZlci4gVGhlcmUgYXJlIHR3bwotb3B0aW9uczoKLQotICAgKGEpIGluc3RhbGxpbmcgdGhlIGRyaXZlciBhcyBhIHJlc2lkZW50IHBhcnQgb2YgdGhlIGtlcm5lbAotICAgKGIpIGNvbXBpbGluZyB0aGUgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlCi0KLSAgIEZ1cnRoZXIsIHlvdSBtdXN0IGRlY2lkZSBpZiB5b3UgYXJlIGdvaW5nIHRvIHNwZWNpZnkgdGhlIGJhc2UgcG9ydAotICAgYWRkcmVzcyBhbmQgdGhlIGludGVycnVwdCByZXF1ZXN0IGxpbmUgb2YgdGhlIGFkYXB0ZXIgY2FyZCBjbTI2MCBhcwotICAgYm9vdCBvcHRpb25zIGZvciAoYSksIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciAoYiksIHVzZSBhdXRvbWF0aWMKLSAgIHByb2Jpbmcgb2YgdGhlc2UgdmFsdWVzLCBvciBoYXJkLXdpcmUgeW91ciBhZGFwdG9yIGNhcmQncyBzZXR0aW5ncwotICAgaW50byB0aGUgc291cmNlIGNvZGUuIElmIHlvdSBkb24ndCBjYXJlLCB5b3UgY2FuIGNob29zZSAKLSAgIGF1dG9wcm9iaW5nLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4gSW4gdGhhdCBjYXNlIHlvdSBjYW4gbW92ZSBvbiB0bwotICAgdGhlIG5leHQgc3RlcC4KLQotQ29tcGlsaW5nIHRoZSBrZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBtb3ZlIHRvIC91c3Ivc3JjL2xpbnV4IGFuZCBkbyBhIAotCi0JbWFrZSBjb25maWcKLQotICAgSWYgeW91IGhhdmUgY2hvc2VuIG9wdGlvbiAoYSksIGFuc3dlciB5ZXMgdG8gQ09ORklHX0NNMjA2IGFuZAotICAgQ09ORklHX0lTTzk2NjBfRlMuCi0KLSAgIElmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGIpLCBhbnN3ZXIgeWVzIHRvIENPTkZJR19NT0RWRVJTSU9OUwotICAgYW5kIG5vICghKSB0byBDT05GSUdfQ00yMDYgYW5kIENPTkZJR19JU085NjYwX0ZTLiAKLQotMikgdGhlbiBkbyBhIAotCQotCW1ha2UgY2xlYW47IG1ha2UgekltYWdlOyBtYWtlIG1vZHVsZXMKLQotMykgZG8gdGhlIHVzdWFsIHRoaW5ncyB0byBpbnN0YWxsIGEgbmV3IGltYWdlIChiYWNrdXAgdGhlIG9sZCBvbmUsIHJ1bgotICAgYHJkZXYgLVIgekltYWdlIDEnLCBjb3B5IHRoZSBuZXcgaW1hZ2UgaW4gcGxhY2UsIHJ1biBsaWxvKS4gIE1pZ2h0Ci0gICBiZSBgbWFrZSB6bGlsbycuCi0KLVVzaW5nIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSB3aWxsIG9ubHkgb2NjYXNpb25hbGx5IHVzZSB0aGUgY2Qtcm9tIGRyaXZlciwgeW91IGNhbiBjaG9vc2UKLW9wdGlvbiAoYiksIGluc3RhbGwgYXMgYSBsb2FkYWJsZSBtb2R1bGUuIFlvdSBtYXkgaGF2ZSB0byByZS1jb21waWxlCi10aGUgbW9kdWxlIHdoZW4geW91IHVwZ3JhZGUgdGhlIGtlcm5lbCB0byBhIG5ldyB2ZXJzaW9uLiAKLQotU2luY2UgdmVyc2lvbiAwLjk2LCBtdWNoIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvCi1hIGdlbmVyaWMgY2Ryb20gaW50ZXJmYWNlIGluIHRoZSBmaWxlIGNkcm9tLmMuIFRoZSBtb2R1bGUgY20yMDYubwotZGVwZW5kcyBvbiBjZHJvbS5vLiBJZiB0aGUgbGF0dGVyIGlzIG5vdCBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsCi15b3UgbXVzdCBleHBsaWNpdGx5IGxvYWQgaXQgYmVmb3JlIGNtMjA2Lm86Ci0KLQkgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvY2Ryb20ubwotCi1UbyBpbnN0YWxsIHRoZSBtb2R1bGUsIHlvdSB1c2UgdGhlIGNvbW1hbmQsIGFzIHJvb3QKLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8KLQotWW91IGNhbiBzcGVjaWZ5IHRoZSBiYXNlIGFkZHJlc3Mgb24gdGhlIGNvbW1hbmQgbGluZSBhcyB3ZWxsIGFzIHRoZSBpcnEgCi1saW5lIHRvIGJlIHVzZWQsIGUuZy4KLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8gY20yMDY9MHgzMDAsMTEKLQotVGhlIG9yZGVyIG9mIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUgZG9lc24ndCBtYXR0ZXI7IGlmIHlvdSBzcGVjaWZ5IG9ubHkKLW9uZSwgdGhlIG90aGVyIHdpbGwgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGVkLWluIGRlZmF1bHQuICBZb3UKLW1heSBhbHNvIGhhdmUgdG8gaW5zdGFsbCB0aGUgZmlsZS1zeXN0ZW0gbW9kdWxlIGBpc285NjYwLm8nLCBpZiB5b3UKLWRpZG4ndCBjb21waWxlIHRoYXQgaW50byB0aGUga2VybmVsLiAKLQotCi1Vc2luZyB0aGUgZHJpdmVyIGFzIHBhcnQgb2YgdGhlIGtlcm5lbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGEpLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGJhc2UtcG9ydAotYWRkcmVzcyBhbmQgaXJxIG9uIHRoZSBsaWxvIGJvb3QgY29tbWFuZCBsaW5lLCBlLmcuOgotCi0JTElMTzogbGludXggY20yMDY9MHgzNDAsMTEKLQotVGhpcyBhc3N1bWVzIHRoYXQgeW91ciBsaW51eCBrZXJuZWwgaW1hZ2Uga2V5d29yZCBpcyBgbGludXgnLiAKLUlmIHlvdSBzcGVjaWZ5IGVpdGhlciBJUlEgKDMtLTExKSBvciBiYXNlIHBvcnQgKDB4MzAwLS0weDM3MCksCi1hdXRvIHByb2JpbmcgaXMgdHVybmVkIG9mZiBmb3IgYm90aCBzZXR0aW5ncywgdGh1cyBzZXR0aW5nIHRoZSAKLW90aGVyIHZhbHVlIHRvIHRoZSBjb21waWxlZC1pbiBkZWZhdWx0LgotCi1Ob3RlIHRoYXQgeW91IGNhbiBhbHNvIHB1dCB0aGVzZSBwYXJhbWV0ZXJzIGluIHRoZSBsaWxvIGNvbmZpZ3VyYXRpb24gZmlsZToKLQotIyBsaW51eCBjb25maWcKLWltYWdlID0gL3ZtbGludXoKLSAgIHJvb3QgPSAvZGV2L2hkYTEKLSAgIGxhYmVsID0gTGludXgKLSAgIGFwcGVuZCA9ICJjbTIwNj0weDM0MCwxMSIKLSAgIHJlYWQtb25seQotCi0KLUlmIG1vZHVsZSBwYXJhbWV0ZXJzIGFuZCBMSUxPIGNvbmZpZyBvcHRpb25zIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIGF1dG9wcm9iaW5nIGRvZXMgbm90IHdvcmssIHlvdSBjYW4gaGFyZC13aXJlIHRoZSBkZWZhdWx0IHZhbHVlcwotb2YgdGhlIGJhc2UgcG9ydCBhZGRyZXNzIChDTTIwNl9CQVNFKSBhbmQgaW50ZXJydXB0IHJlcXVlc3QgbGluZQotKENNMjA2X0lSUSkgaW50byB0aGUgZmlsZSAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL2NtMjA2LmguIENoYW5nZQotdGhlIGRlZmluZXMgb2YgQ00yMDZfSVJRIGFuZCBDTTIwNl9CQVNFLgotCi0KLU1vdW50aW5nIHRoZSBjZHJvbQotLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBNYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgZGV2aWNlIGlzIGluc3RhbGxlZCBpbiAvZGV2LgotCi0gIAlta25vZCAvZGV2L2NtMjA2Y2QgYiAzMiAwCi0KLTIpIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIG1vdW50IHBvaW50LCBlLmcuLCAvY2Ryb20gCi0KLQlta2RpciAvY2Ryb20KLQotMykgbW91bnQgdXNpbmcgYSBjb21tYW5kIGxpa2UgdGhpcyAocnVuIGFzIHJvb3QpOgotCi0JbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9jbTIwNmNkIC9jZHJvbQotCi00KSBGb3IgdXNlci1tb3VudHMsIGFkZCBhIGxpbmUgaW4gL2V0Yy9mc3RhYgotCi0JL2Rldi9jbTIwNmNkICAgICAgL2Nkcm9tICAgICBpc285NjYwIAlybyxub2F1dG8sdXNlcgotCi0gICBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gZ2l2ZSB0aGUgY29tbWFuZHMKLQotCW1vdW50IC9jZHJvbQotCXVtb3VudCAvY2Ryb20KLQotSWYgdGhpbmdzIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gVHJ5IHRvIGRvIGEgYGRtZXNnJyB0byBmaW5kIG91dCBpZiB0aGUgZHJpdmVyIHNhaWQgYW55dGhpbmcgYWJvdXQKLSAgd2hhdCBpcyBnb2luZyB3cm9uZyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLgotCi0tIFRyeSB0byBkbyBhIGBkZCBpZj0vZGV2L2NtMjA2Y2QgfCBvZCAtdGMgfCBsZXNzJyB0byByZWFkIGZyb20gdGhlCi0gIENELgotCi0tIExvb2sgaW4gdGhlIC9wcm9jIGRpcmVjdG9yeSB0byBzZWUgaWYgYGNtMjA2JyBzaG93cyB1cCB1bmRlciBvbmUgb2YKLSAgYGludGVycnVwdHMnLCBgaW9wb3J0cycsIGBkZXZpY2VzJyBvciBgbW9kdWxlcycgKGlmIGFwcGxpY2FibGUpLgotCi0KLURJU0NMQUlNRVIgCi0tLS0tLS0tLS0tIAotSSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgdGhpcyBkcml2ZXIgd29ya3MsIG9yIHRoYXQgdGhlIGhhcmR3YXJlIHdpbGwKLW5vdCBiZSBoYXJtZWQsIGFsdGhvdWdoIEkgY29uc2lkZXIgaXQgbW9zdCB1bmxpa2VseS4gCi0KLUkgaG9wZSB0aGF0IHlvdSdsbCBmaW5kIHRoaXMgZHJpdmVyIGluIHNvbWUgd2F5IHVzZWZ1bC4gCi0KLQkJCQkJRGF2aWQgdmFuIExlZXV3ZW4KLQkJCQkJZGF2aWRAdG0udG5vLm5sCi0KLU5vdGUgZm9yIExpbnV4IENEUk9NIHZlbmRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Zb3UgYXJlIGVuY291cmFnZWQgdG8gaW5jbHVkZSB0aGlzIGRyaXZlciBvbiB5b3VyIExpbnV4IENEUk9NLiBJZgoteW91IGRvLCB5b3UgbWlnaHQgY29uc2lkZXIgc2VuZGluZyBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4KLVlvdSBjYW4gY29udGFjdCBtZSB0aHJvdWdoIG15IGUtbWFpbCBhZGRyZXNzLCBkYXZpZEB0bS50bm8ubmwuIAotSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgaW50byBhIGtlcm5lbCB0byBib290IG9mZiBhIGNkcm9tLCAKLXlvdSBzaG91bGQgYWN0dWFsbHkgc2VuZCBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4gCi0KLUNvcHlyaWdodAotLS0tLS0tLS0tCi1UaGUgY29weXJpZ2h0IG9mIHRoZSBjbTIwNiBkcml2ZXIgZm9yIExpbnV4IGlzIAotCi0gICAgKGMpIDE5OTUgRGF2aWQgQS4gdmFuIExlZXV3ZW4KLQotVGhlIGRyaXZlciBpcyByZWxlYXNlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgR05VIGdlbmVyYWwgcHVibGljCi1saWNlbnNlLCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdCBvZiB0aGlzCi1zb3VyY2UgdHJlZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxY2EzNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2dzY2QKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0JR29sZHN0YXIgUjQyMCBDRC1Sb20gZGV2aWNlIGRyaXZlciBSRUFETUUKLQotRm9yIGFsbCBraW5kIG9mIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHb2xkU3RhciBSNDIwIENEUk9NCi1hbmQgdGhpcyBMaW51eCBkZXZpY2UgZHJpdmVyIHNlZSB0aGUgV1dXIHBhZ2U6Ci0KLSAgICAgICAgaHR0cDovL2xpbnV4LnJ6LmZoLWhhbm5vdmVyLmRlL35yYXVwYWNoICAgICAgICAKLQotCi0gICAgICBJZiB5b3UgYXJlIHRoZSBlZGl0b3Igb2YgYSBMaW51eCBDRCwgeW91IHNob3VsZAotICAgICAgZW5hYmxlIGdzY2QuYyB3aXRoaW4geW91ciBib290IGZsb3BweSBrZXJuZWwuIFBsZWFzZSwKLSAgICAgIHNlbmQgbWUgb25lIG9mIHlvdXIgQ0RzIGZvciBmcmVlLgotCi0KLVRoaXMgY3VycmVudCBkcml2ZXIgdmVyc2lvbiAwLjRhIG9ubHkgc3VwcG9ydHMgcmVhZGluZyBkYXRhIGZyb20gdGhlIGRpc2suCi1DdXJyZW50bHkgd2UgaGF2ZSBubyBhdWRpbyBhbmQgbm8gbXVsdGlzZXNzaW9uIG9yIFhBIHN1cHBvcnQuCi1UaGUgcG9sbGluZyBpbnRlcmZhY2UgaXMgdXNlZCwgbm8gRE1BLgotCi0KLVNvbWV0aW1lcyB0aGUgR29sZFN0YXIgUjQyMCBpcyBzb2xkIGluIGEgJ1JldmVhbCBNdWx0aW1lZGlhIEtpdCcuIFRoaXMga2l0J3MKLWRyaXZlIGludGVyZmFjZSBpcyBjb21wYXRpYmxlLCB0b28uCi0KLQotSW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlIHRvICcvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tJyBhbmQgZWRpdCB0aGUgZmlsZSAnZ3NjZC5oJy4gSW5zZXJ0Ci10aGUgaS9vIGFkZHJlc3Mgb2YgeW91ciBpbnRlcmZhY2UgY2FyZC4KLQotVGhlIGRlZmF1bHQgYmFzZSBhZGRyZXNzIGlzIDB4MzQwLiBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuIAotQWRkcmVzcyBzZWxlY3Rpb24gaXMgYWNjb21wbGlzaGVkIGJ5IGp1bXBlcnMgUE44MDEtMSB0byBQTjgwMS00IG9uIHRoZSAKLUdvbGRTdGFyIEludGVyZmFjZSBDYXJkLgotQXBwcm9wcmlhdGUgc2V0dGluZ3MgYXJlOiAweDMwMCwgMHgzMTAsIDB4MzIwLCAweDMzMCwgMHgzNDAsIDB4MzUwLCAweDM2MAotMHgzNzAsIDB4MzgwLCAweDM5MCwgMHgzQTAsIDB4M0IwLCAweDNDMCwgMHgzRDAsIDB4M0UwLCAweDNGMCAgICAgICAgICAgICAKLQotVGhlbiBnbyBiYWNrIHRvICcvdXNyL3NyYy9saW51eC8nIGFuZCAnbWFrZSBjb25maWcnIHRvIGJ1aWxkIHRoZSBuZXcKLWNvbmZpZ3VyYXRpb24gZm9yIHlvdXIga2VybmVsLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIEdvbGRTdGFyIGRyaXZlcgotbGlrZSBhIG1vZHVsZSwgZG9uJ3Qgc2VsZWN0ICdHb2xkU3RhciBDRFJPTSBzdXBwb3J0Jy4gQnkgdGhlIHdheSwgeW91Ci1oYXZlIHRvIGluY2x1ZGUgdGhlIGlzbzk2NjAgZmlsZXN5c3RlbS4KLQotTm93IHN0YXJ0IGNvbXBpbGluZyB0aGUga2VybmVsIHdpdGggJ21ha2UgekltYWdlJy4KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCB5b3UgaGF2ZSB0byBkbyAnbWFrZSBtb2R1bGVzJyAKLWFuZCAnbWFrZSBtb2R1bGVzX2luc3RhbGwnLCBhZGRpdGlvbmFsbHkuCi1JbnN0YWxsIHlvdXIgbmV3IGtlcm5lbCBhcyB1c3VhbCAtIG1heWJlIHlvdSBkbyBpdCB3aXRoICdtYWtlIHpsaWxvJy4KLQotQmVmb3JlIHlvdSBjYW4gdXNlIHRoZSBkcml2ZXIsIHlvdSBoYXZlIHRvCi0gICBta25vZCAvZGV2L2dzY2QwIGIgMTYgMAotdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgZmlsZSAoeW91IG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UpLgotCi1JZiB5b3UgdXNlIG1vZHVsZXMsIHlvdSBjYW4gdHJ5IHRvIGluc2VydCB0aGUgZHJpdmVyLgotU2F5OiAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vJwotb3I6ICAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vIGdzY2Q9PGFkZHJlc3M+JwotVGhlIGRyaXZlciBzaG91bGQgcmVwb3J0IGl0cyByZXN1bHRzLgotCi1UaGF0J3MgaXQhIE1vdW50IGEgZGlzaywgaS5lLiAnbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9nc2NkMCAvY2Ryb20nCi0KLUZlZWwgZnJlZSB0byByZXBvcnQgZXJyb3JzIGFuZCBzdWdnZXN0aW9ucyB0byB0aGUgZm9sbG93aW5nIGFkZHJlc3MuCi1CZSBzdXJlLCBJJ20gdmVyeSBoYXBweSB0byByZWNlaXZlIHlvdXIgY29tbWVudHMhCi0gCi0gICAgICAgIE9saXZlciBSYXVwYWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5ub3ZlciwgSnVuaSAxOTk1Ci0ocmF1cGFjaEBud2ZzMS5yei5maC1oYW5ub3Zlci5kZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2lzcDE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg2NTMzLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIC0tIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKLQotRG9jcyBieSBFcmljIHZhbiBkZXIgTWFhcmVsIDxILlQuTS52LmQuTWFhcmVsQG1hcmluLm5sPgotCi1UaGlzIGlzIHRoZSBSRUFETUUgZm9yIHZlcnNpb24gMC42IG9mIHRoZSBjZHJvbSBpbnRlcmZhY2Ugb24gYW4KLUlTUDE2LCBNQUQxNiBvciBNb3phcnQgc291bmQgY2FyZC4KLQotVGhlIGRldGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB1c2VkIHRvIGJlIGluY2x1ZGVkCi1pbiBib3RoIHRoZSBzamNkIGFuZCBvcHRjZCBjZHJvbSBkcml2ZXIuIERyaXZlcyBzdXBwb3J0ZWQgYnkgdGhlc2UKLWRyaXZlcnMgY2FtZSBwYWNrZWQgd2l0aCBNZWRpYSBNYWdpYydzIG11bHRpIG1lZGlhIGtpdCwgd2hpY2ggYWxzbwotaW5jbHVkZWQgdGhlIElTUDE2IGNhcmQuIFRoZSBpZGVhICh0aGFua3MgTGVvIFNwaWVrbWFuKQotdG8gbW92ZSBpdCBmcm9tIHRoZXNlIGRyaXZlcnMgaW50byBhIHNlcGFyYXRlIG1vZHVsZSBhbmQgbW9yZW92ZXIsIG5vdCB0bwotcmVseSBvbiB0aGUgTUFEMTYgc291bmQgZHJpdmVyLCBhcmUgYXMgZm9sbG93czoKLS1kdXBsaWNhdGlvbiBvZiBjb2RlIGluIHRoZSBrZXJuZWwgaXMgYSB3YXN0ZSBvZiByZXNvdXJjZXMgYW5kIHNob3VsZAotIGJlIGF2b2lkZWQ7Ci0taG93ZXZlciwga2VybmVscyBhbmQgbm90YWJseSB0aG9zZSBpbmNsdWRlZCB3aXRoIExpbnV4IGRpc3RyaWJ1dGlvbnMKLSAoY2YgU2xhY2t3YXJlIDMuMCBpbmNsdWRlZCB2ZXJzaW9uIDAuNSBvZiB0aGUgaXNwMTYgY29uZmlndXJhdGlvbgotIGNvZGUgaW5jbHVkZWQgaW4gdGhlIGRyaXZlcnMpIGRvbid0IGFsd2F5cyBjb21lIHdpdGggc291bmQgc3VwcG9ydAotIGluY2x1ZGVkLiBFc3BlY2lhbGx5IHdoZW4gdGhleSBhbHJlYWR5IGluY2x1ZGUgYSBidW5jaCBvZiBjZHJvbSBkcml2ZXJzLgotIEhlbmNlLCB0aGUgY2Ryb20gaW50ZXJmYWNlIHNob3VsZCBiZSBjb25maWd1cmFibGUgX2luZGVwZW5kZW50bHlfIG9mCi0gc291bmQgc3VwcG9ydC4KLQotVGhlIElTUDE2LCBNQUQxNiBhbmQgTW96YXJ0IHNvdW5kIGNhcmRzIGhhdmUgYW4gT1BUaSA4MkM5Mjggb3IgYW4KLU9QVGkgODJDOTI5IGNoaXAuICBUaGUgaW50ZXJmYWNlIG9uIHRoZXNlIGNhcmRzIHNob3VsZCB3b3JrIHdpdGgKLWFueSBjZHJvbSBhdHRhY2hlZCB0byB0aGUgY2FyZCwgd2hpY2ggaXMgJ2VsZWN0cmljYWxseScgY29tcGF0aWJsZQotd2l0aCBTYW55by9QYW5hc29uaWMsIFNvbnkgb3IgTWl0c3VtaSBub24taWRlIGRyaXZlcy4gSG93ZXZlciwgdGhlCi1jb21tYW5kIHNldHMgZm9yIGFueSBwcm9wcmlldGFyeSBkcml2ZXMgbWF5IGRpZmZlcgotKGFuZCBoZW5jZSBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUga2VybmVsKSBmcm9tIHRoZXNlIGZvdXIgdHlwZXMuCi1Gb3IgYSBmYWN0IEkga25vdyB0aGUgaW50ZXJmYWNlIHdvcmtzIGFuZCB0aGUgd2F5IG9mIGNvbmZpZ3VyYXRpb24KLWFzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50YXRpb24gd29ya3MgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKLXNqY2QgKGluIFNhbnlvL1BhbmFzb25pYyBjb21wYXRpYmlsaXR5IG1vZGUpIGNkcm9tIGRyaXZlcnMKLShwcm9iYWJseSB3aXRoIHRoZSBvcHRjZCAoaW4gU29ueSBjb21wYXRpYmlsaXR5IG1vZGUpIGFzIHdlbGwpLgotSWYgeW91IGhhdmUgc3VjaCBhbiBPUFRpIGJhc2VkIHNvdW5kIGNhcmQgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKLWNkcm9tIGludGVyZmFjZSB3aXRoIGEgY2Ryb20gZHJpdmUgc3VwcG9ydGVkIGJ5IGFueSBvZiB0aGUgb3RoZXIgY2Ryb20KLWRyaXZlcnMsIGl0IHdpbGwgcHJvYmFibHkgd29yay4gUGxlYXNlIGxldCBtZSBrbm93IGFueSBleHBlcmllbmNlIHlvdQotbWlnaHQgaGF2ZSkuCi1JIHVuZGVyc3RhbmQgdGhhdCBjYXJkcyBiYXNlZCBvbiB0aGUgT1BUaSA4MkM5MjkgY2hpcHMgbWF5IGJlIGNvbmZpZ3VyZWQKLShoYXJkd2FyZSBqdW1wZXJzIHRoYXQgaXMpIGFzIGFuIElERSBpbnRlcmZhY2UuIEluaXRpYWxpc2F0aW9uIG9mIHN1Y2ggYQotY2FyZCBpbiB0aGlzIG1vZGUgaXMgbm90IHN1cHBvcnRlZCAoeWV0PykuCi0KLVRoZSBzdWdnZXN0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgSVNQMTYgZXRjLiBzb3VuZCBjYXJkIGJ5IGJvb3RpbmcgRE9TIGFuZCAKLWRvIGEgd2FybSByZWJvb3QgdG8gYm9vdCBMaW51eCBzb21laG93IGRvZXNuJ3Qgd29yaywgYXQgbGVhc3Qgbm90Ci1vbiBteSBtYWNoaW5lIChJUEMgUDkwKSwgd2l0aCB0aGUgT1BUaSA4MkM5MjggYmFzZWQgY2FyZC4KLQotQm9vdGluZyB0aGUga2VybmVsIHRocm91Z2ggdGhlIGJvb3QgbWFuYWdlciBMSUxPIGFsbG93cyB0aGUgdXNlCi1vZiBzb21lIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uIHRoZSAnTElMTyBib290OicgcHJvbXB0LiBBdCBib290IHRpbWUKLXByZXNzIEFsdCBvciBTaGlmdCB3aGlsZSB0aGUgTElMTyBwcm9tcHQgaXMgd3JpdHRlbiBvbiB0aGUgc2NyZWVuIGFuZCBlbnRlcgotYW55IGtlcm5lbCBvcHRpb25zLiBBbHRlcm5hdGl2ZWx5IHRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgaW4KLXRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIGluIC9ldGMvbGlsby5jb25mLiBBZGRpbmcgJ2FwcGVuZD0iPGNtZF9saW5lX29wdGlvbnM+IicKLXdpbGwgZG8gdGhlIHRyaWNrIGFzIHdlbGwuCi1UaGUgc3ludGF4IG9mICdjbWRfbGluZV9vcHRpb25zJyBpcwotCi0gICAgICAgIGlzcDE2PVs8cG9ydD5bLDxpcnE+Wyw8ZG1hPl1dXVtbLF08ZHJpdmVfdHlwZT5dCi0KLUlmIHRoZXJlIGlzIG5vIElTUDE2IG9yIGNvbXBhdGlibGVzIGRldGVjdGVkLCB0aGVyZSdzIHByb2JhYmx5IG5vIGhhcm0gZG9uZS4KLVRoZXNlIG9wdGlvbnMgaW5kaWNhdGUgdGhlIHZhbHVlcyB0aGF0IHlvdXIgY2Ryb20gZHJpdmUgaGFzIGJlZW4gKG9yIHdpbGwgYmUpCi1jb25maWd1cmVkIHRvIHVzZS4KLVZhbGlkIHZhbHVlcyBmb3IgdGhlIGJhc2UgaS9vIGFkZHJlc3MgYXJlOgotICBwb3J0PTB4MzQwLDB4MzIwLDB4MzMwLDB4MzYwCi1mb3IgdGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciAKLSAgaXJxPTAsMyw1LDcsOSwxMCwxMQotZm9yIHRoZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBsaW5lCi0gIGRtYT0wLDMsNSw2LDcKLWFuZCBmb3IgdGhlIHR5cGUgb2YgZHJpdmUKLSAgZHJpdmVfdHlwZT1ub2lzcDE2LFNhbnlvLFBhbmFzb25pYyxTb255LE1pdHN1bWkuCi1Ob3RlIHRoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgY2FzZSBzZW5zaXRpdmUuCi1UaGUgdmFsdWVzIDAgZm9yIGlycSBhbmQgZG1hIGluZGljYXRlIHRoYXQgdGhleSBhcmUgbm90IHVzZWQsIGFuZAotdGhlIGRyaXZlIHdpbGwgYmUgdXNlZCBpbiAncG9sbGluZycgbW9kZS4gVGhlIHZhbHVlcyA1IGFuZCA3IGZvciBpcnEKLXNob3VsZCBiZSBhdm9pZGVkIGluIG9yZGVyIHRvIGF2b2lkIGFueSBjb25mbGljdHMgd2l0aCBvcHRpb25hbAotc291bmQgY2FyZCBjb25maWd1cmF0aW9uLgotVGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBsaW5lIGRvZXMgbm90IGFsbG93IHRoZSBzcGVjaWZpY2F0aW9uIG9mCi1pcnEgd2hlbiB0aGVyZSdzIG5vdGhpbmcgc3BlY2lmaWVkIGZvciB0aGUgYmFzZSBhZGRyZXNzIGFuZCBubwotc3BlY2lmaWNhdGlvbiBvZiBkbWEgd2hlbiB0aGVyZSBpcyBubyBzcGVjaWZpY2F0aW9uIG9mIGlycS4KLVRoZSB2YWx1ZSAnbm9pc3AxNicgZm9yIGRyaXZlX3R5cGUsIHdoaWNoIG1heSBiZSB1c2VkIGFzIHRoZSBmaXJzdAotbm9uLWludGVnZXIgb3B0aW9uIHZhbHVlIChlLmcuICdpc3AxNj1ub2lzcDE2JyksIG1ha2VzIHN1cmUgdGhhdCBwcm9iaW5nCi1mb3IgYW5kIHN1YnNlcXVlbnQgY29uZmlndXJhdGlvbiBvZiBhbiBJU1AxNi1jb21wYXRpYmxlIGNhcmQgaXMgc2tpcHBlZAotYWxsIHRvZ2V0aGVyLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gb3ZlcmNvbWUgcG9zc2libGUgY29uZmxpY3RzIHdoaWNoCi1tYXkgYXJpc2Ugd2hpbGUgdGhlIGtlcm5lbCBpcyBwcm9iaW5nIHlvdXIgaGFyZHdhcmUuCi1UaGUgZGVmYXVsdCB2YWx1ZXMgYXJlCi0gIHBvcnQ9MHgzNDAKLSAgaXJxPTAKLSAgZG1hPTAKLSAgZHJpdmVfdHlwZT1TYW55bwotcmVmbGVjdGluZyBteSBvd24gY29uZmlndXJhdGlvbi4gVGhlIGRlZmF1bHRzIGNhbiBiZSBjaGFuZ2VkIGluCi10aGUgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL2lwczE2LmguCi0KLVRoZSBjZHJvbSBpbnRlcmZhY2UgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgcnVuIHRpbWUgYnkgbG9hZGluZyB0aGUKLWluaXRpYWxpc2F0aW9uIGRyaXZlciBhcyBhIG1vZHVsZS4gSW4gdGhhdCBjYXNlLCB0aGUgaW50ZXJmYWNlCi1wYXJhbWV0ZXJzIGNhbiBiZSBzZXQgYnkgZ2l2aW5nIGFwcHJvcHJpYXRlIHZhbHVlcyBvbiB0aGUgY29tbWFuZAotbGluZS4gQ29uZmlndXJpbmcgdGhlIGRyaXZlciBjYW4gdGhlbiBiZSBkb25lIGJ5IHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQgKGFzc3VtaW5nIHlvdSBoYXZlIGlzbzE2Lm8gaW5zdGFsbGVkIGluIGEgcHJvcGVyIHBsYWNlKToKLQotICBpbnNtb2QgaXNwMTYubyBpc3AxNl9jZHJvbV9iYXNlPTxwb3J0PiBpc3AxNl9jZHJvbV9pcnE9PGlycT4gXAotICAgIGlzcDE2X2Nkcm9tX2RtYT08ZG1hPiBpc3AxNl9jZHJvbV90eXBlPTxkcml2ZV90eXBlPgotCi13aGVyZSBwb3J0LCBpcnEsIGRtYSBhbmQgZHJpdmVfdHlwZSBjYW4gaGF2ZSBhbnkgb2YgdGhlIHZhbHVlcyBtZW50aW9uZWQKLWFib3ZlLgotCi0KLUhhdmUgZnVuIQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4IGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFjNGI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vbWNkeAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUlmIHlvdSBhcmUgdXNpbmcgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgeW91IGNhbiBzcGVjaWZ5IHlvdXIgcG9ydHMgYW5kIElSUXMKLWxpa2UKLQotICMgaW5zbW9kIG1jZHgubyBtY2R4PTB4MzAwLDExLDB4MzA0LDUKLQotYW5kIHNvIG9uICgiYWRkcmVzcyxJUlEiIHBhaXJzKS4KLVRoaXMgd2lsbCBvdmVycmlkZSB0aGUgY29uZmlndXJhdGlvbiBpbiBtY2R4LmguCi0KLVRoaXMgZHJpdmVyOgotCi0gICAgbyAgIGhhbmRsZXMgWEEgYW5kIChob3BlZnVsbHkpIG11bHRpIHNlc3Npb24gQ0RzIGFzIHdlbGwgYXMKLSAgICAgICAgb3JkaW5hcnkgQ0RzOwotICAgIG8gICBzdXBwb3J0cyB1cCB0byA1IGRyaXZlcyAob2YgY291cnNlLCB5b3UnbGwgbmVlZCBmcmVlIAotICAgICAgICBJUlFzLCBpL28gcG9ydHMgYW5kIHNsb3RzKTsKLSAgICBvICAgcGxheXMgYXVkaW8KLQotVGhpcyB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB5ZXQ6Ci0KLSAgICBvICAgc2hhcmVkIElSUXMgKGJ1dCBpdCBzZWVtcyB0byBiZSBwb3NzaWJsZSAtIEkndmUgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgICAgICAgICAgY29ubmVjdGVkIHR3byBkcml2ZXMgdG8gdGhlIHNhbWUgaXJxLiAgU28gaXQncyBgb25seScgYSAKLSAgICAgICAgICAgICAgICBwcm9ibGVtIG9mIHRoZSBkcml2ZXIuKQotCi1UaGlzIGRyaXZlciBuZXZlciB3aWxsOgotCi0gICAgbyAgIFJlYWQgZGlnaXRhbCBhdWRpbyAoaS5lLiBjb3B5IGRpcmVjdGx5KSwgZHVlIHRvIG1pc3NpbmcKLSAgICAgICAgaGFyZHdhcmUgZmVhdHVyZXMuIAotCi0KLWhlaWtvQGxvdHRlLnNheC5kZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vb3B0Y2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDZjN2EuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLVRoaXMgaXMgdGhlIFJFQURNRSBmaWxlIGZvciB0aGUgT3B0aWNzIFN0b3JhZ2UgODAwMCBBVCBDRFJPTSBkZXZpY2UgZHJpdmVyLgotCi1UaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBzby1jYWxsZWQgJ0RPTFBISU4nIGRyaXZlLCB3aXRoIHRoZSAzNC1waW4KLVNvbnktY29tcGF0aWJsZSBpbnRlcmZhY2UuIEZvciB0aGUgSURFLWNvbXBhdGlibGUgT3B0aWNzIFN0b3JhZ2UgODAwMQotZHJpdmUsIHlvdSB3aWxsIHdhbnQgdGhlIEFUQVBJIENEUk9NIGRyaXZlci4gVGhlIGRyaXZlciBhbHNvIHNlZW1zIHRvCi13b3JrIHdpdGggdGhlIExhc2VybWF0ZSBDUjMyOEEuIElmIHlvdSBoYXZlIGEgZHJpdmUgdGhhdCB3b3JrcyB3aXRoCi10aGlzIGRyaXZlciwgYW5kIHRoYXQgZG9lc24ndCByZXBvcnQgaXRzZWxmIGFzIERPTFBISU4sIHBsZWFzZSBkcm9wIG1lCi1hIG1haWwuCi0KLVRoZSBzdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gQ0RzIGlzIGluIEFMUEhBIHN0YWdlLiBJZiB5b3UgdXNlIGl0LAotcGxlYXNlIG1haWwgbWUgeW91ciBleHBlcmllbmNlcy4gTXVsdGlzZXNzaW9uIHN1cHBvcnQgY2FuIGJlIGRpc2FibGVkCi1hdCBjb21waWxlIHRpbWUuCi0KLVlvdSBjYW4gZmluZCBzb21lIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgYXQKLSAgICAgIGR1dGV0dGUuZXQudHVkZWxmdC5ubDovcHViL2xpbnV4LwotYW5kIGF0IEViZXJoYXJkJ3MgbWlycm9yCi0gICAgICBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2Nkcm9tL2RyaXZlcnMvb3B0aWNzLwotCi1CZWZvcmUgeW91IGNhbiB1c2UgdGhlIGRyaXZlciwgeW91IGhhdmUgdG8gY3JlYXRlIHRoZSBkZXZpY2UgZmlsZSBvbmNlOgotICMgbWtub2QgL2Rldi9vcHRjZDAgYiAxNyAwCi0KLVRvIHNwZWNpZnkgdGhlIGJhc2UgYWRkcmVzcyBpZiB0aGUgZHJpdmVyIGlzICJjb21waWxlZC1pbiIgdG8geW91ciBrZXJuZWwsCi15b3UgY2FuIHVzZSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBpdGVtIChMSUxPIG9wdGlvbikKLSAgICAgICAgICAgICBvcHRjZD0weDM0MAotd2l0aCB0aGUgcmlnaHQgYWRkcmVzcy4KLQotSWYgeW91IGhhdmUgY29tcGlsZWQgb3B0Y2QgYXMgYSBtb2R1bGUsIHlvdSBjYW4gbG9hZCBpdCB3aXRoCi0gIyBpbnNtb2QgL3Vzci9zcmMvbGludXgvbW9kdWxlcy9vcHRjZC5vCi1vcgotICMgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvb3B0Y2QubyBvcHRjZD0weDM0MAotd2l0aCB0aGUgbWF0Y2hpbmcgYWRkcmVzcyB2YWx1ZSBvZiB5b3VyIGludGVyZmFjZSBjYXJkLgotCi1UaGUgZHJpdmVyIGVtcGxveXMgYSBudW1iZXIgb2YgYnVmZmVycyB0byBkbyByZWFkLWFoZWFkIGFuZCBibG9jayBzaXplCi1jb252ZXJzaW9uLiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgY29uZmlndXJhYmxlIGluIG9wdGNkLmgsIGFuZCBoYXMKLWluZmx1ZW5jZSBvbiB0aGUgZHJpdmVyIHBlcmZvcm1hbmNlLiBGb3IgbXkgbWFjaGluZSAoYSBQNzUpLCA2IGJ1ZmZlcnMKLXNlZW1zIG9wdGltYWwsIGFzIGNhbiBiZSBzZWVuIGZyb20gdGhpcyB0YWJsZToKLQotI2J1ZnMJa2IvcwklY3B1Ci0xCTk3CTAuMQotMgkxOTEJMC4zCi0zCTE4OAkwLjIKLTQJMjQ2CTAuMwotNQkxODkJMTkKLTYJMjgwCTAuNAotNwkyODEJNy4wCi04CTI0NgkyLjgKLTE2CTI4MQkzLjQKLQotSWYgeW91IGdldCBhIHRocm91Z2hwdXQgc2lnbmlmaWNhbnRseSBiZWxvdyAzMDAga2IvcywgdHJ5IHR3ZWFraW5nCi1OX0JVRlMsIGFuZCBkb24ndCBmb3JnZXQgdG8gbWFpbCBtZSB5b3VyIHJlc3VsdHMhCi0KLUknZCBhcHByZWNpYXRlIHN1Y2Nlc3MvZmFpbHVyZSByZXBvcnRzLiBJZiB5b3UgZmluZCBhIGJ1ZywgdHJ5Ci1yZWNvbXBpbGluZyB0aGUgZHJpdmVyIHdpdGggc29tZSBzdHJhdGVnaWNhbGx5IGNob3NlbiBkZWJ1ZyBvcHRpb25zCi0odGhlc2UgY2FuIGJlIGZvdW5kIGluIG9wdGNkLmgpIGFuZCBpbmNsdWRlIHRoZSBtZXNzYWdlcyBnZW5lcmF0ZWQgaW4KLXlvdXIgYnVnIHJlcG9ydC4gR29vZCBsdWNrLgotCi1MZW8gU3BpZWttYW4gKHNwaWVrbWFuQGR1dGV0dGUuZXQudHVkZWxmdC5ubCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JhNjNmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLVRoaXMgUkVBRE1FIGJlbG9uZ3MgdG8gcmVsZWFzZSA0LjIgb3IgbmV3ZXIgb2YgdGhlIFNvdW5kQmxhc3RlciBQcm8KLShNYXRzdXNoaXRhLCBLb3RvYnVraSwgUGFuYXNvbmljLCBDcmVhdGl2ZUxhYnMsIExvbmdzaGluZSBhbmQgVGVhYykKLUNELVJPTSBkcml2ZXIgZm9yIExpbnV4LgotCi1zYnBjZCByZWFsbHksIHJlYWxseSBpcyBOT1QgZm9yIEFOWSBJREUvQVRBUEkgZHJpdmUhCi1Ob3QgZXZlbiBpZiB5b3UgaGF2ZSBhbiAib3JpZ2luYWwiIFNvdW5kQmxhc3RlciBjYXJkIHdpdGggYW4gSURFIGludGVyZmFjZSEKLVNvLCB5b3UnZCBiZXR0ZXIgaGF2ZSBhIGxvb2sgaW50byBSRUFETUUuaWRlIGlmIHlvdXIgcG9ydCBhZGRyZXNzIGlzIDB4MUYwLAotMHgxNzAsIDB4MUU4LCAweDE2OCBvciBzaW1pbGFyLgotSSBnZXQgdG9ucyBvZiBtYWlscyBmcm9tIElERS9BVEFQSSBkcml2ZSB1c2VycyAtIEkgcmVhbGx5IGNhbid0IGNvbnRpbnVlCi1hbnkgbW9yZSB0byBhbnN3ZXIgdGhlbSBhbGwuIFNvLCBpZiB5b3VyIGRyaXZlL2ludGVyZmFjZSBpbmZvcm1hdGlvbiBzaGVldHMKLW1lbnRpb24gIklERSIgKHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnksIHF1YXRlcm5hcnkpIGFuZCB0aGUgRE9TIGRyaXZlcgotaW52b2tpbmcgbGluZSB3aXRoaW4geW91ciBDT05GSUcuU1lTIGlzIHVzaW5nIGFuIGFkZHJlc3MgYmVsb3cgMHgyMzA6Ci1ET04nVCBST0IgTVkgTEFTVCBORVJWRSAtIGp1bXBlciB5b3VyIGludGVyZmFjZSB0byBhZGRyZXNzIDB4MTcwIGFuZCBJUlEgMTUKLSh0aGF0IGlzIHRoZSAic2Vjb25kYXJ5IElERSIgY29uZmlndXJhdGlvbiksIHNldCB5b3VyIGRyaXZlIHRvICJtYXN0ZXIiIGFuZAotdXNlIGlkZS1jZCBhcyB5b3VyIGRyaXZlci4gSWYgeW91IGRvIG5vdCBoYXZlIGEgc2Vjb25kIElERSBoYXJkIGRpc2ssIHVzZSB0aGUKLUxJTE8gY29tbWFuZHMKLSAgIGhkYj1ub3Byb2JlIGhkYz1jZHJvbQotYW5kIGdldCBsdWNreS4KLVRvIG1ha2UgaXQgZnVsbHkgY2xlYXIgdG8geW91OiBpZiB5b3UgbWFpbCBtZSBhYm91dCBJREUvQVRBUEkgZHJpdmUgcHJvYmxlbXMsCi1teSBhbnN3ZXIgaXMgYWJvdmUsIGFuZCBJIHNpbXBseSB3aWxsIGRpc2NhcmQgeW91ciBtYWlsLCBob3BpbmcgdG8gc3RvcCB0aGUKLWZsb29kIGFuZCB0byBmaW5kIHRpbWUgdG8gbGVhZCBteSAxMi15ZWFyIG9sZCBzb24gdG93YXJkcyBoYXBweSBjb21wdXRpbmcuCi0KLVRoZSBkcml2ZXIgaXMgYWJsZSB0byBkcml2ZSB0aGUgd2hvbGUgZmFtaWx5IG9mICJ0cmFkaXRpb25hbCIgQVQtc3R5bGUgKHRoYXQKLWlzIE5PVCB0aGUgbmV3ICJFbmhhbmNlZCBJREUiIG9yICJBVEFQSSIgZHJpdmUgc3RhbmRhcmQpIE1hdHN1c2hpdGEsCi1Lb3RvYnVraSwgUGFuYXNvbmljIGRyaXZlcywgc29tZXRpbWVzIGxhYmVsbGVkIGFzICJDcmVhdGl2ZUxhYnMiLiBUaGUKLXdlbGwta25vd24gZHJpdmVzIGFyZSBDUi01MjEsIENSLTUyMiwgQ1ItNTIzLCBDUi01NjIsIENSLTU2My4KLUNSLTU3NCBpcyBhbiBJREUvQVRBUEkgZHJpdmUuCi0KLVRoZSBMb25nc2hpbmUgTENTLTcyNjAgaXMgYSBkb3VibGUtc3BlZWQgZHJpdmUgd2hpY2ggdXNlcyB0aGUgIm9sZCIKLU1hdHN1c2hpdGEgY29tbWFuZCBzZXQuIEl0IGlzIHN1cHBvcnRlZCAtIHdpdGggaGVscCBieSBTZXJnZSBSb2J5bnMuCi1WZXJ0b3MgKCJFbGl0ZWdyb3VwIENvbXB1dGVyIFN5c3RlbXMiLCBFQ1MpIGhhcyBhIHNpbWlsYXIgZHJpdmUgLSBzdXBwb3J0Ci1oYXMgc3RhcnRlZDsgZ2V0IGluIGNvbnRhY3QgaWYgeW91IGhhdmUgc3VjaCBhICJWZXJ0b3MgMTAwIiBvciAiRUNTLUFUIgotZHJpdmUuCi0KLVRoZXJlIGV4aXN0cyBhbiAiSUJNIEV4dGVybmFsIElTQSBDRC1ST00gRHJpdmUiIHdoaWNoIGluIGZhY3QgaXMgYSBDUi01NjMKLXdpdGggYSBzcGVjaWFsIGNvbnRyb2xsZXIgYm9hcmQuIFRoaXMgZHJpdmUgaXMgc3VwcG9ydGVkICh0aGUgaW50ZXJmYWNlIGlzCi1vZiB0aGUgIkxhc2VyTWF0ZSIgdHlwZSksIGFuZCBpdCBpcyBwb3NzaWJseSB0aGUgYmVzdCBidXkgdG9kYXkgKGNoZWFwZXIgdGhhbgotYW4gaW50ZXJuYWwgZHJpdmUsIGFuZCB5b3UgY2FuIHVzZSBpdCBhcyBhbiBpbnRlcm5hbCwgdG9vIC0gZS5nLiBwbHVnIGl0IGludG8KLWEgc291bmRjYXJkKS4KLQotQ3JlYXRpdmVMYWJzIGhhcyBhIG5ldyBkcml2ZSAiQ0QyMDAiIGFuZCBhIHNpbWlsYXIgZHJpdmUgIkNEMjAwRiIuIFRoZSBsYXR0ZXIKLWlzIG1hZGUgYnkgRnVuYWkgYW5kIHNvbWV0aW1lcyBuYW1lZCAiRTI1NTBVQSIsIG5ld2VyIG1vZGVscyBtYXkgYmUgbmFtZWQKLSJNSzQwMTUiLiBUaGUgQ0QyMDBGIGRyaXZlcyBzaG91bGQgZnVsbHkgd29yay4KLUNEMjAwIGRyaXZlcyB3aXRob3V0ICJGIiBhcmUgc3RpbGwgZ2l2aW5nIHByb2JsZW1zOiBkcml2ZSBkZXRlY3Rpb24gYW5kCi1wbGF5aW5nIGF1ZGlvIHNob3VsZCB3b3JrLCBkYXRhIGFjY2VzcyB3aWxsIHJlc3VsdCBpbiBlcnJvcnMuIEkgbmVlZCBxdWFsaWZpZWQKLWZlZWRiYWNrIGFib3V0IHRoZSBidWdzIHdpdGhpbiB0aGUgZGF0YSBmdW5jdGlvbnMgb3IgYSBkcml2ZSAoSSBuZXZlciBzYXcgYQotQ0QyMDApLgotCi1UaGUgcXVhZC1zcGVlZCBUZWFjIENELTU1QSBkcml2ZSBpcyBzdXBwb3J0ZWQsIGJ1dCBzdGlsbCBkb2VzIG5vdCByZWFjaCAiZnVsbAotc3BlZWQiLiBUaGUgZGF0YSByYXRlIGFscmVhZHkgcmVhY2hlcyA1MDAga0Ivc2VjIGlmIHlvdSBzZXQgU0JQX0JVRkZFUl9GUkFNRVMKLXRvIDY0IChpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZG8gdGhhdCBmb3Igbm9ybWFsICJmaWxlIGFjY2VzcyIgdXNhZ2UsIGJ1dCBpdAotY2FuIHNwZWVkIHVwIHRoaW5ncyBhIGxvdCBpZiB5b3UgdXNlIHNvbWV0aGluZyBsaWtlICJkZCIgdG8gcmVhZCBmcm9tIHRoZQotZHJpdmU7IEkgdXNlIGl0IGZvciB2ZXJpZnlpbmcgc2VsZi13cml0dGVuIENEcyB0aGlzIHdheSkuCi1UaGUgZHJpdmUgaXRzZWxmIGlzIGFibGUgdG8gZGVsaXZlciA2MDAga0Ivc2VjLCBzbyB0aGlzIG5lZWRzCi13b3JrOyB3aXRoIHRoZSBub3JtYWwgc2V0dXAsIHRoZSBwZXJmb3JtYW5jZSBjdXJyZW50bHkgaXMgbm90IGV2ZW4gYXMgZ29vZCBhcwotZG91YmxlLXNwZWVkLgotCi1UaGlzIGRyaXZlciBpcyBOT1QgZm9yIE1pdHN1bWkgb3IgU29ueSBvciBBenRlY2ggb3IgUGhpbGlwcyBvciBYWFggZHJpdmVzLAotYW5kIGFnYWluOiB0aGlzIGRyaXZlciBpcyBpbiBubyB3YXkgdXNhYmxlIGZvciBhbnkgSURFL0FUQVBJIGRyaXZlLiBJZiB5b3UgCi10aGluayB5b3VyIGRyaXZlIHNob3VsZCB3b3JrIGFuZCBpdCBkb2Vzbid0OiBzZW5kIG1lIHRoZSBET1MgZHJpdmVyIGZvciB5b3VyCi1iZWFzdCAoZ3ppcHBlZCArIHV1ZW5jb2RlZCkgYW5kIHlvdXIgQ09ORklHLlNZUyBpZiB5b3Ugd2FudCB0byBhc2sgbWUgZm9yIGhlbHAsCi1hbmQgaW5jbHVkZSBhbiBvcmlnaW5hbCBsb2cgbWVzc2FnZSBleGNlcnB0LCBhbmQgdHJ5IHRvIGdpdmUgYWxsIGluZm9ybWF0aW9uCi1hIGNvbXBsZXRlIGlkaW90IG5lZWRzIHRvIHVuZGVyc3RhbmQgeW91ciBoYXNzbGUgYWxyZWFkeSB3aXRoIHlvdXIgZmlyc3QKLW1haWwuIEFuZCBpZiB5b3Ugd2FudCB0byBzYXkgImFzIEkgaGF2ZSBtYWlsZWQgeW91IGJlZm9yZSIsIGJlIHN1cmUgdGhhdCBJCi1kb24ndCByZW1lbWJlciB5b3VyICJjYXNlIiBieSBzdWNoIHJlbWFya3M7IGF0IHRoZSBtb21lbnQsIEkgaGF2ZSBzb21lIAotaHVuZHJlZHMgb2Ygb3BlbiBjb3JyZXNwb25kZW5jZXMgYWJvdXQgTGludXggQ0RST00gcXVlc3Rpb25zIChob3BlIHRvIHJlZHVjZSBpZgotdGhlIElERS9BVEFQSSB1c2VyIHF1ZXN0aW9ucyBkaXNhcHBlYXIpLiAKLQotCi1UaGlzIGRyaXZlciB3aWxsIHdvcmsgd2l0aCB0aGUgc291bmRjYXJkIGludGVyZmFjZXMgKFNCIFBybywgU0IgMTYsIEdhbGF4eSwKLVNvdW5kRlgsIE1vemFydCwgTUFEMTYgLi4uKSBhbmQgd2l0aCB0aGUgIm5vLXNvdW5kIiBjYXJkcyAoUGFuYXNvbmljIENJLTEwMVAsCi1MYXNlck1hdGUsIFdESC03MDAxQywgTG9uZ3NoaW5lIExDUy02ODUzLCBUZWFjIC4uLikuCi0KLUl0IHdvcmtzIHdpdGggdGhlICJjb25maWd1cmFibGUiIGludGVyZmFjZSAiU2VxdW9pYSBTLTEwMDAiLCB0b28sIHdoaWNoIGlzIAotdXNlZCBvbiB0aGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pYyBTb3VuZHNjYXBlIHNvdW5kIGNhcmRzLiBZb3UgaGF2ZSB0bwotc3BlY2lmeSB0aGUgdHlwZSAiU0JQUk8gMiIgYW5kIHRoZSB0cnVlIENEUk9NIHBvcnQgYWRkcmVzcyB3aXRoIGl0LCBub3QgdGhlCi0iY29uZmlndXJhdGlvbiBwb3J0IiBhZGRyZXNzLgotCi1JZiB5b3UgaGF2ZSBhIHNvdW5kIGNhcmQgd2hpY2ggbmVlZHMgYSAiY29uZmlndXJhdGlvbiBkcml2ZXIiIGluc3RlYWQgb2YKLWp1bXBlcnMgZm9yIGludGVyZmFjZSB0eXBlcyBhbmQgYWRkcmVzc2VzIChsaWtlIE1vemFydCBjYXJkcykgLSB0aG9zZQotZHJpdmVycyBnZXQgaW52b2tlZCBiZWZvcmUgdGhlIERPUyBDRFJPTSBkcml2ZXIgaW4geW91ciBDT05GSUcuU1lTLCB0eXBpY2FsCi1uYW1lcyBhcmUgImNkc2V0dXAuc3lzIiBhbmQgIm16dGluaXQuc3lzIiAtIGxldCB0aGUgc291bmQgZHJpdmVyIGRvIHRoZQotQ0RST00gcG9ydCBjb25maWd1cmF0aW9uICh0aGUgbGVhZGluZyBjb21tZW50cyBpbiBsaW51eC9kcml2ZXJzL3NvdW5kL21hZDE2LmMKLWFyZSBqdXN0IGZvciB5b3UhKS4gSGFubnUgU2F2b2xhaW5lbidzIG1hZDE2LmMgY29kZSBpcyBhYmxlIHRvIHNldCB1cCBteQotTW96YXJ0IGNhcmQgLSBJIHNpbXBseSBoYWQgdG8gYWRkCi0gICAjZGVmaW5lIE1BRDE2X0NPTkYgMHgwNgotICAgI2RlZmluZSBNQUQxNl9DRFNFTCAweDAzCi10byBjb25maWd1cmUgdGhlIENEUk9NIGludGVyZmFjZSBmb3IgdHlwZSAiUGFuYXNvbmljIiAoTGFzZXJNYXRlKSBhbmQgYWRkcmVzcwotMHgzNDAuCi0KLVRoZSBpbnRlcmZhY2UgdHlwZSBoYXMgdG8gZ2V0IGNvbmZpZ3VyZWQgaW4gbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZC5oLCAKLWJlY2F1c2UgdGhlIHJlZ2lzdGVyIGxheW91dCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgIlNvdW5kQmxhc3RlciIgYW5kIHRoZQotIkxhc2VyTWF0ZSIgdHlwZS4KLQotSSBnb3QgYSByZXBvcnQgdGhhdCB0aGUgVGVhYyBpbnRlcmZhY2UgY2FyZCAiSS9GIEUxMTcwOTgiIGlzIG9mIHR5cGUKLSJTb3VuZEJsYXN0ZXIiIChpLmUuIHlvdSBoYXZlIHRvIHNldCBTQlBSTyB0byAxKSBldmVuIHdpdGggdGhlIGFkZHJlc3NlcwotMHgzMDAgYW5kIGFib3ZlLiBUaGlzIGlzIHVudXN1YWwsIGFuZCBpdCBjYW4ndCBnZXQgY292ZXJlZCBieSB0aGUgYXV0bwotcHJvYmluZyBzY2hlbWUuCi1UaGUgVGVhYyAxNi1iaXQgaW50ZXJmYWNlIGNhcmRzIChsaWtlIFAvTiBFOTUwMjI4LTAwQSwgZGVmYXVsdCBhZGRyZXNzIDB4MkMwKQotbmVlZCB0aGUgU0JQUk8gMyBzZXR1cC4KLQotSWYgYXV0by1wcm9iaW5nIGZvdW5kIHRoZSBkcml2ZSwgdGhlIGFkZHJlc3MgaXMgY29ycmVjdC4gVGhlIHJlcG9ydGVkIHR5cGUKLW1heSBiZSB3cm9uZy4gQSAibW91bnQiIHdpbGwgZ2l2ZSBzdWNjZXNzIG9ubHkgaWYgdGhlIGludGVyZmFjZSB0eXBlIGlzIHNldAotcmlnaHQuIFBsYXlpbmcgYXVkaW8gc2hvdWxkIHdvcmsgd2l0aCBhIHdyb25nIHNldCBpbnRlcmZhY2UgdHlwZSwgdG9vLgotCi1XaXRoIHNvbWUgVGVhYyBhbmQgc29tZSBDRDIwMCBkcml2ZXMgSSBoYXZlIHNlZW4gaW50ZXJmYWNlIGNhcmRzIHdoaWNoIHNlZW0KLXRvIGxhY2sgdGhlICJkcml2ZSBzZWxlY3QiIGxpbmVzOyBhbHdheXMgZHJpdmUgMCBnZXRzIGFkZHJlc3NlZC4gVG8gYXZvaWQKLSJtaXJyb3IgZHJpdmVzIiAoZm91ciBkcml2ZXMgZGV0ZWN0ZWQgd2hlcmUgeW91IG9ubHkgaGF2ZSBvbmUpIHdpdGggc3VjaAotaW50ZXJmYWNlIGNhcmRzLCBzZXQgTUFYX0RSSVZFUyB0byAxIGFuZCBqdW1wZXIgeW91ciBkcml2ZSB0byBJRCAwIChpZgotcG9zc2libGUpLgotCi0KLVVwIHRvIDQgZHJpdmVzIHBlciBpbnRlcmZhY2UgY2FyZCwgYW5kIHVwIHRvIDQgaW50ZXJmYWNlIGNhcmRzIGFyZSBzdXBwb3J0ZWQuCi1BbGwgc3VwcG9ydGVkIGRyaXZlIGZhbWlsaWVzIGNhbiBiZSBtaXhlZCwgYnV0IHRoZSBDUi01MjEgZHJpdmVzIGFyZSAKLWhhcmQtd2lyZWQgdG8gZHJpdmUgSUQgMC4gVGhlIGRyaXZlcyBoYXZlIHRvIHVzZSBkaWZmZXJlbnQgZHJpdmUgSURzLCBhbmQgZWFjaAotZHJpdmUgaGFzIHRvIGdldCBhIHVuaXF1ZSBtaW5vciBudW1iZXIgKDAuLi4zKSwgY29ycmVzcG9uZGluZyBpbmRpcmVjdGx5IHRvIAotaXRzIGRyaXZlIElELgotVGhlIGRyaXZlIElEcyBtYXkgYmUgc2VsZWN0ZWQgZnJlZWx5IGZyb20gMCB0byAzIC0gdGhleSBkbyBub3QgaGF2ZSB0byBiZSBpbgotY29uc2VjdXRpdmUgb3JkZXIuCi0KLUFzIERvbiBDYXJyb2xsLCBkb25AZHM5LnVzLmRlbGwuY29tIG9yIEZJRE8gMTozODIvMTQsIHRvbGQgbWUsIGl0IGlzIHBvc3NpYmxlCi10byBjaGFuZ2Ugb2xkIGRyaXZlcyB0byBhbnkgSUQsIHRvby4gSGUgd3JpdGVzIGluIHRoaXMgc2Vuc2U6Ci0gICAiSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgbW9yZSB0aGFuIG9uZSBzaW5nbGUgc3BlZWQgZHJpdmUKLSAgICh0aGV5IGRvIG5vdCBoYXZlIHRoZSBJRCBqdW1wZXJzKSB5b3UgbXVzdCBhZGQgYSBESVAgc3dpdGNoCi0gICBhbmQgdHdvIHJlc2lzdG9ycy4gVGhlIHBhZHMgYXJlIGFscmVhZHkgb24gdGhlIGJvYXJkIG5leHQgdG8KLSAgIHRoZSBwb3dlciBjb25uZWN0b3IuIFlvdSB3aWxsIHNlZSB0aGUgc2lsa3NjcmVlbiBmb3IgdGhlCi0gICBzd2l0Y2ggaWYgeW91IHJlbW92ZSB0aGUgdG9wIGNvdmVyLgotICAgICAgICAgICAgICAgICAgICAxIDIgMyA0Ci0gICAgICAgICAgICAgSUQgMCA9IHggRiBGIHggICAgICAgICAgICAgTyA9ICJvbiIKLSAgICAgICAgICAgICBJRCAxID0geCBPIEYgeCAgICAgICAgICAgICBGID0gIm9mZiIKLSAgICAgICAgICAgICBJRCAyID0geCBGIE8geCAgICAgICAgICAgICB4ID0gImRvbid0IGNhcmUiCi0gICAgICAgICAgICAgSUQgMyA9IHggTyBPIHgKLSAgIE5leHQgdG8gdGhlIHN3aXRjaCBhcmUgdGhlIHBvc2l0aW9ucyBmb3IgUjc2ICg3aykgYW5kIFI3OAotICAgKDEyaykuIEkgaGFkIHRvIHBsYXkgYXJvdW5kIHdpdGggdGhlIHJlc2lzdG9yIHZhbHVlcyAtIElEIDMKLSAgIGRpZCBub3Qgd29yayB3aXRoIG90aGVyIHZhbHVlcy4gSWYgdGhlIHZhbHVlcyBhcmUgbm90IGdvb2QsCi0gICBJRCAzIGJlaGF2ZXMgbGlrZSBJRCAwLiIKLQotVG8gdXNlIG1vcmUgdGhhbiA0IGRyaXZlcywgeW91IHNpbXBseSBuZWVkIGEgc2Vjb25kIGNvbnRyb2xsZXIgY2FyZCBhdCBhIAotZGlmZmVyZW50IGFkZHJlc3MgYW5kIGEgc2Vjb25kIGNhYmxlLgotCi1UaGUgZHJpdmVyIHN1cHBvcnRzIHJlYWRpbmcgb2YgZGF0YSBmcm9tIHRoZSBDRCBhbmQgcGxheWluZyBvZiBhdWRpbyB0cmFja3MuCi1UaGUgYXVkaW8gcGFydCBzaG91bGQgcnVuIHdpdGggV29ya01hbiwgeGNkcGxheWVyLCB3aXRoIHRoZSAibm9uLVgxMSIgcHJvZHVjdHMKLUNEcGxheWVyIGFuZCBXb3JrQm9uZSAtIHRlbGwgbWUgaWYgaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBzb2Z0d2FyZS4KLVRoZSBvbmx5IGFjY2VwdGVkIG1lYXN1cmUgZm9yIGNvcnJlY3RuZXNzIHdpdGggdGhlIGF1ZGlvIGZ1bmN0aW9ucyBpcyB0aGUKLSJjZHRlc3RlciIgdXRpbGl0eSAoYXBwZW5kZWQpIC0gbW9zdCBhdWRpbyBwbGF5ZXIgcHJvZ3JhbW1lcnMgc2VlbSB0byBiZQotYmV0dGVyIG11c2ljaWFucyB0aGFuIHByb2dyYW1tZXJzLiA7LSkKLQotV2l0aCB0aGUgQ1ItNTZ4IGFuZCB0aGUgQ0QyMDAgZHJpdmVzLCB0aGUgcmVhZGluZyBvZiBhdWRpbyBmcmFtZXMgaXMgcG9zc2libGUuCi1UaGlzIGlzIGltcGxlbWVudGVkIGJ5IGFuIElPQ1RMIGZ1bmN0aW9uIHdoaWNoIHJlYWRzIFJFQURfQVVESU8gZnJhbWVzIG9mCi0yMzUyIGJ5dGVzIGF0IG9uY2UgKGNvbmZpZ3VyYWJsZSB3aXRoIHRoZSAiUkVBRF9BVURJTyIgZGVmaW5lLCBkZWZhdWx0IGlzIDApLgotUmVhZGluZyB0aGUgc2FtZSBmcmFtZSBhIHNlY29uZCB0aW1lIGdpdmVzIGRpZmZlcmVudCBkYXRhOyB0aGUgZnJhbWUgZGF0YSAKLXN0YXJ0IGF0IGEgZGlmZmVyZW50IHBvc2l0aW9uLCBidXQgYWxsIHJlYWQgYnl0ZXMgYXJlIHZhbGlkLCBhbmQgd2UgYWx3YXlzCi1yZWFkIDk4IGNvbnNlY3V0aXZlIGNodW5rcyAob2YgMjQgQnl0ZXMpIGFzIGEgZnJhbWUuIFJlYWRpbmcgbW9yZSB0aGFuIDEgZnJhbWUKLWF0IG9uY2UgcG9zc2libHkgbWlzc2VzIHNvbWUgY2h1bmtzIGF0IGVhY2ggZnJhbWUgYm91bmRhcnkuIFRoaXMgbGFjayBoYXMgdG8KLWdldCBjb3JyZWN0ZWQgYnkgZXh0ZXJuYWwsICJoaWdoZXIgbGV2ZWwiIHNvZnR3YXJlIHdoaWNoIHJlYWRzIHRoZSBzYW1lIGZyYW1lIAotYWdhaW4gYW5kIHRyaWVzIHRvIGZpbmQgYW5kIGVsaW1pbmF0ZSBvdmVybGFwcGluZyBjaHVua3MgKDI0LWJ5dGUtcGllY2VzKS4KLQotVGhlIHRyYW5zZmVyIHJhdGUgd2l0aCByZWFkaW5nIGF1ZGlvICgxLWZyYW1lLXBpZWNlcykgY3VycmVudGx5IGlzIHZlcnkgc2xvdy4KLVRoaXMgY2FuIGJlIGJldHRlciByZWFkaW5nIGJpZ2dlciBjaHVua3MsIGJ1dCB0aGUgIm1pc3NpbmciIGNodW5rcyBwb3NzaWJseQotb2NjdXIgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNpbmdsZSBmcmFtZS4KLVRoZSBzb2Z0d2FyZSBpbnRlcmZhY2UgcG9zc2libHkgbWF5IGNoYW5nZSBhIGJpdCB0aGUgZGF5IHRoZSBTQ1NJIGRyaXZlcgotc3VwcG9ydHMgaXQgdG9vLgotCi1XaXRoIGFsbCBidXQgdGhlIENSLTUyeCBkcml2ZXMsIE11bHRpU2Vzc2lvbiBpcyBzdXBwb3J0ZWQuCi1QaG90byBDRHMgd29yayAodGhlICJvbGQiIGRyaXZlcyBsaWtlIENSLTUyMSBjYW4gYWNjZXNzIG9ubHkgdGhlIGZpcnN0Ci1zZXNzaW9uIG9mIGEgcGhvdG9DRCkuCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2hwY2R0b3BwbS8geW91IHdpbGwgZmluZCBIYWRtdXQgRGFuaXNjaCdzIHBhY2thZ2UgdG8KLWNvbnZlcnQgcGhvdG8gQ0QgaW1hZ2UgZmlsZXMgYW5kIEdlcmQgS25vcnIncyB2aWV3aW5nIHV0aWxpdHkuCi0KLVRoZSB0cmFuc2ZlciByYXRlIHdpbGwgcmVhY2ggMTUwIGtCL3NlYyB3aXRoIENSLTUyeCBkcml2ZXMsIDMwMCBrQi9zZWMgd2l0aAotQ1ItNTZ4IGRyaXZlcywgYW5kIGN1cnJlbnRseSBub3QgbW9yZSB0aGFuIDUwMCBrQi9zZWMgKHVzdWFsbHkgbGVzcyB0aGFuCi0yNTAga0Ivc2VjKSB3aXRoIHRoZSBUZWFjIHF1YWQgc3BlZWQgZHJpdmVzLgotWEEgKFBob3RvQ0QpIGRpc2tzIHdpdGggIm9sZCIgZHJpdmVzIGdpdmUgb25seSA1MCBrQi9zZWMuCi0KLVRoaXMgcmVsZWFzZSBjb25zaXN0cyBvZgotLSB0aGlzIFJFQURNRSBmaWxlCi0tIHRoZSBkcml2ZXIgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmMKLS0gdGhlIHN0dWIgZmlsZXMgbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZFsyMzRdLmMKLS0gdGhlIGhlYWRlciBmaWxlIGxpbnV4L2RyaXZlcnMvY2Ryb20vc2JwY2QuaC4KLQotCi1UbyBpbnN0YWxsOgotLS0tLS0tLS0tLS0KLQotMS4gU2V0dXAgeW91ciBoYXJkd2FyZSBwYXJhbWV0ZXJzLiBUaG91Z2ggdGhlIGRyaXZlciBkb2VzICJhdXRvLXByb2JpbmciIGF0IGEKLSAgIGxvdCBvZiAobm90IGFsbCBwb3NzaWJsZSEpIGFkZHJlc3NlcywgdGhpcyBzdGVwIGlzIHJlY29tbWVuZGVkIGZvcgotICAgZXZlcnlkYXkgdXNlLiBZb3Ugc2hvdWxkIGxldCBzYnBjZCBhdXRvLXByb2JlIG9uY2UgYW5kIHVzZSB0aGUgcmVwb3J0ZWQKLSAgIGFkZHJlc3MgaWYgYSBkcml2ZSBnb3QgZm91bmQuIFRoZSByZXBvcnRlZCB0eXBlIG1heSBiZSBpbmNvcnJlY3Q7IGl0IGlzCi0gICBjb3JyZWN0IGlmIHlvdSBjYW4gbW91bnQgYSBkYXRhIENELiBUaGVyZSBpcyBubyBjaG9pY2UgZm9yIHlvdSB3aXRoIHRoZQotICAgdHlwZTsgb25seSBvbmUgaXMgcmlnaHQsIHRoZSBvdGhlcnMgYXJlIGRlYWRseSB3cm9uZy4KLQotICAgYS4gR28gaW50byAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmggYW5kIGNvbmZpZ3VyZSBpdCBmb3IgeW91cgotICAgICAgaGFyZHdhcmUgKG5lYXIgdGhlIGJlZ2lubmluZyk6Ci0gICAgICBhMS4gU2V0IGl0IHVwIGZvciB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBpbnRlcmZhY2UgYm9hcmQuCi0gICAgICAgICAgIk9yaWdpbmFsIiBDcmVhdGl2ZUxhYnMgc291bmQgY2FyZHMgbmVlZCAiU0JQUk8gMSIuCi0gICAgICAgICAgTW9zdCAiY29tcGF0aWJsZSIgc291bmQgY2FyZHMgKGFsbW9zdCBhbGwgIm5vbi1DcmVhdGl2ZUxhYnMiIGNhcmRzKQotICAgICAgICAgIG5lZWQgIlNCUFJPIDAiLgotICAgICAgICAgIFRoZSAibm8tc291bmQiIGJvYXJkIGZyb20gT21uaUNkIG5lZWRzIHRoZSAiU0JQUk8gMSIgc2V0dXAuCi0gICAgICAgICAgVGhlIFRlYWMgOC1iaXQgIm5vLXNvdW5kIiBib2FyZHMgbmVlZCB0aGUgIlNCUFJPIDEiIHNldHVwLgotICAgICAgICAgIFRoZSBUZWFjIDE2LWJpdCAibm8tc291bmQiIGJvYXJkcyBuZWVkIHRoZSAiU0JQUk8gMyIgc2V0dXAuCi0gICAgICAgICAgQWxsIG90aGVyICJuby1zb3VuZCIgYm9hcmRzIG5lZWQgdGhlICJTQlBSTyAwIiBzZXR1cC4KLSAgICAgICAgICBUaGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pcSBTb3VuZFNjYXBlIGNhcmRzIG5lZWQgIlNCUFJPIDIiLgotICAgICAgICAgIHNicGNkLmMgaG9sZHMgc29tZSBleGFtcGxlcyBpbiBpdHMgYXV0by1wcm9iZSBsaXN0LgotICAgICAgICAgIElmIHlvdSBjb25maWd1cmUgIlNCUFJPIiB3cm9uZywgdGhlIHBsYXlpbmcgb2YgYXVkaW8gQ0RzIHdpbGwgd29yaywKLSAgICAgICAgICBidXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gbW91bnQgYSBkYXRhIENELgotICAgICAgYTIuIFRlbGwgdGhlIGFkZHJlc3Mgb2YgeW91ciBDRFJPTV9QT1JUIChub3Qgb2YgdGhlIHNvdW5kIHBvcnQpLgotICAgICAgYTMuIElmIDQgZHJpdmVzIGdldCBmb3VuZCwgYnV0IHlvdSBoYXZlIG9ubHkgb25lLCBzZXQgTUFYX0RSSVZFUyB0byAxLgotICAgICAgYTQuIFNldCBESVNUUklCVVRJT04gdG8gMC4KLSAgIGIuIEFkZGl0aW9uYWxseSBmb3IgMi5hMSBhbmQgMi5hMiwgdGhlIHNldHVwIG1heSBiZSBkb25lIGR1cmluZwotICAgICAgYm9vdCB0aW1lICh2aWEgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBvciAiTElMTyBvcHRpb24iKToKLSAgICAgICAgICBzYnBjZD0weDMyMCxMYXNlck1hdGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyMzAsU291bmRCbGFzdGVyCi0gICAgICBvcgotICAgICAgICAgIHNicGNkPTB4MzM4LFNvdW5kU2NhcGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyQzAsVGVhYzE2Yml0Ci0gICAgICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSBpbnN0YWxsIGEgZnJlc2ggZGlzdHJpYnV0aW9uLgotICAgICAgSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIGl0IGdldHMgdGFrZW4gYXMgdGhlIHR5cGUKLSAgICAgIHNldHRpbmc7IDAgaXMgIkxhc2VyTWF0ZSIsIDEgaXMgIlNvdW5kQmxhc3RlciIsIDIgaXMgIlNvdW5kU2NhcGUiLAotICAgICAgMyBpcyAiVGVhYzE2Yml0Ii4KLSAgICAgIFNvLCBmb3IgZXhhbXBsZQotICAgICAgICAgIHNicGNkPTB4MjMwLDEKLSAgICAgIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgICBzYnBjZD0weDIzMCxTb3VuZEJsYXN0ZXIKLQotMi4gImNkIC91c3Ivc3JjL2xpbnV4IiBhbmQgZG8gYSAibWFrZSBjb25maWciIGFuZCBzZWxlY3QgInkiIGZvciBNYXRzdXNoaXRhCi0gICBDRC1ST00gc3VwcG9ydCBhbmQgZm9yIElTTzk2NjAgRmlsZVN5c3RlbSBzdXBwb3J0LiBJZiB5b3UgZG8gbm90IGhhdmUgYQotICAgc2Vjb25kLCB0aGlyZCwgb3IgZm91cnRoIGNvbnRyb2xsZXIgaW5zdGFsbGVkLCBkbyBub3Qgc2F5ICJ5IiB0byB0aGUgCi0gICBzZWNvbmRhcnkgTWF0c3VzaGl0YSBDRC1ST00gcXVlc3Rpb25zLgotCi0zLiBUaGVuIG1ha2UgdGhlIGtlcm5lbCBpbWFnZSAoIm1ha2UgemxpbG8iIG9yIHNpbWlsYXIpLgotCi00LiBNYWtlIHRoZSBkZXZpY2UgZmlsZShzKS4gVGhpcyBzdGVwIHVzdWFsbHkgYWxyZWFkeSBoYXMgYmVlbiBkb25lIGJ5IHRoZQotICAgTUFLRURFViBzY3JpcHQuCi0gICBUaGUgZHJpdmVyIHVzZXMgTUFKT1IgMjUsIHNvLCBpZiBuZWNlc3NhcnksIGRvCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QgIGIgMjUgMCAgICAgICAoaWYgeW91IGhhdmUgb25seSBvbmUgZHJpdmUpCi0gICBhbmQvb3IKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDAgYiAyNSAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QxIGIgMjUgMQotICAgICAgICBta25vZCAvZGV2L3NicGNkMiBiIDI1IDIKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDMgYiAyNSAzCi0gICB0byBtYWtlIHRoZSBub2RlKHMpLgotCi0gICBUaGUgImZpcnN0IGZvdW5kIiBkcml2ZSBnZXRzIE1JTk9SIDAgKHJlZ2FyZGxlc3Mgb2YgaXRzIGp1bXBlcmVkIElEKSwgdGhlCi0gICAibmV4dCBmb3VuZCIgKGF0IHRoZSBzYW1lIGNhYmxlKSBnZXRzIE1JTk9SIDEsIC4uLgotICAgCi0gICBGb3IgYSBzZWNvbmQgaW50ZXJmYWNlIGJvYXJkLCB5b3UgaGF2ZSB0byBtYWtlIG5vZGVzIGxpa2UKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDQgYiAyNiAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2Q1IGIgMjYgMQotICAgYW5kIHNvIG9uLiBVc2UgdGhlIE1BSk9ScyAyNiwgMjcsIDI4LgotCi0gICBJZiB5b3UgZnVydGhlciBtYWtlIGEgbGluayBsaWtlCi0gICAgICAgIGxuIC1zIHNicGNkIC9kZXYvY2Ryb20KLSAgIHlvdSBjYW4gdXNlIHRoZSBuYW1lIC9kZXYvY2Ryb20sIHRvby4KLQotNS4gUmVib290IHdpdGggdGhlIG5ldyBrZXJuZWwuCi0KLVlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG8KLSAgICAgICAgICAgICAgbWtkaXIgL0NECi1hbmQgCi0gICAgICAgICAgICAgIG1vdW50IC1ydCBpc285NjYwIC9kZXYvc2JwY2QgL0NECi1vcgotICAgICAgICAgICAgICBtb3VudCAtcnQgaXNvOTY2MCAtbyBibG9jaz0yMDQ4IC9kZXYvc2JwY2QgL0NECi1hbmQgc2VlIHRoZSBjb250ZW50cyBvZiB5b3VyIENEIGluIHRoZSAvQ0QgZGlyZWN0b3J5LgotVG8gdXNlIGF1ZGlvIENEcywgYSBtb3VudGluZyBpcyBub3QgcmVjb21tZW5kZWQgKGFuZCBpdCB3b3VsZCBmYWlsIGlmIHRoZQotZmlyc3QgdHJhY2sgaXMgbm90IGEgZGF0YSB0cmFjaykuCi0KLQotVXNpbmcgc2JwY2QgYXMgYSAibG9hZGFibGUgbW9kdWxlIjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIHlvdSBkbyBOT1Qgc2VsZWN0ICJNYXRzdXNoaXRhL1BhbmFzb25pYyBDRFJPTSBkcml2ZXIgc3VwcG9ydCIgZHVyaW5nIHRoZQotIm1ha2UgY29uZmlnIiBvZiB5b3VyIGtlcm5lbCwgeW91IGNhbiBidWlsZCB0aGUgImxvYWRhYmxlIG1vZHVsZSIgc2JwY2Quby4KLQotSWYgc2JwY2QgZ2V0cyB1c2VkIGFzIGEgbW9kdWxlLCB0aGUgc3VwcG9ydCBvZiBtb3JlIHRoYW4gb25lIGludGVyZmFjZQotY2FyZCAoaS5lLiBkcml2ZXMgNC4uLjE1KSBpcyBkaXNhYmxlZC4KLQotWW91IGNhbiBzcGVjaWZ5IGludGVyZmFjZSBhZGRyZXNzIGFuZCB0eXBlIHdpdGggdGhlICJpbnNtb2QiIGNvbW1hbmQgbGlrZToKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzNDAsMAotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgyMzAsMQotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzMzgsMgotd2hlcmUgdGhlIGxhc3QgbnVtYmVyIHJlcHJlc2VudHMgdGhlIFNCUFJPIHNldHRpbmcgKG5vIHN0cmluZ3MgYWxsb3dlZCBoZXJlKS4KLQotCi1UaGluZ3Mgb2YgaW50ZXJlc3Q6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgaXMgY29uZmlndXJlZCB0byB0cnkgdGhlIExhc2VyTWF0ZSB0eXBlIG9mIGludGVyZmFjZSBhdCBJL08gcG9ydAotMHgwMzQwIGZpcnN0LiBJZiB0aGlzIGlzIG5vdCBhcHByb3ByaWF0ZSwgc2JwY2QuaCBzaG91bGQgZ2V0IGNoYW5nZWQKLSh5b3Ugd2lsbCBmaW5kIHRoZSByaWdodCBwbGFjZSAtIGp1c3QgYXQgdGhlIGJlZ2lubmluZykuCi0KLU5vIERNQSBhbmQgbm8gSVJRIGlzIHVzZWQuCi0KLVRvIHJlZHVjZSBvciBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIGtlcm5lbCBtZXNzYWdlcywgZWRpdCBzYnBjZC5jIGFuZCBwbGF5Ci13aXRoIHRoZSAiREJHX3h4eCIgc3dpdGNoZXMgKGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YXJpYWJsZSAic2JwY2RfZGVidWciKS4KLURvbid0IGZvcmdldCB0byByZWZsZWN0IG9uIHdoYXQgeW91IGRvOyBlbmFibGluZyBhbGwgREJHX3h4eCBzd2l0Y2hlcyBhdCBvbmNlCi1tYXkgY3Jhc2ggeW91ciBzeXN0ZW0sIGFuZCBlYWNoIG1lc3NhZ2UgbGluZSBpcyBhY2NvbXBhbmllZCBieSBhIGRlbGF5LgotCi1UaGUgZHJpdmVyIHVzZXMgdGhlICJ2YXJpYWJsZSBCTE9DS19TSVpFIiBmZWF0dXJlLiBUbyB1c2UgaXQsIHlvdSBoYXZlIHRvCi1zcGVjaWZ5ICJibG9jaz0yMDQ4IiBhcyBhIG1vdW50IG9wdGlvbi4gRG9pbmcgdGhpcyB3aWxsIGRpc2FibGUgdGhlIGRpcmVjdAotZXhlY3V0aW9uIG9mIGEgYmluYXJ5IGZyb20gdGhlIENEOyB5b3UgaGF2ZSB0byBjb3B5IGl0IHRvIGEgZGV2aWNlIHdpdGggdGhlCi1zdGFuZGFyZCBCTE9DS19TSVpFICgxMDI0KSBmaXJzdC4gU28sIGRvIG5vdCB1c2UgdGhpcyBpZiB5b3VyIHN5c3RlbSBpcwotZGlyZWN0bHkgInJ1bm5pbmcgZnJvbSB0aGUgQ0RST00iIChsaWtlIHNvbWUgb2YgWWdnZHJhc2lsJ3MgaW5zdGFsbGF0aW9uCi12YXJpYW50cykuIFRoZXJlIGFyZSBDRHMgb24gdGhlIG1hcmtldCAobGlrZSB0aGUgR2VybWFuICJ1bmlmaXgiIExpbnV4Ci1kaXN0cmlidXRpb24pIHdoaWNoIE1VU1QgZ2V0IGhhbmRsZWQgd2l0aCBhIGJsb2NrX3NpemUgb2YgMTAyNC4gR2VuZXJhbGx5LAotb25lIGNhbiBzYXkgYWxsIHRoZSBDRHMgd2hpY2ggaG9sZCBmaWxlcyBvZiB0aGUgbmFtZSBZTVRSQU5TLlRCTCBhcmUgZGVmZWN0aXZlOwotZG8gbm90IHVzZSBibG9jaz0yMDQ4IHdpdGggdGhvc2UuCi0KLVdpdGhpbiBzYnBjZC5oLCB5b3Ugd2lsbCBmaW5kIHNvbWUgIiNkZWZpbmUicyAoZS5nLiBFSkVDVCBhbmQgSlVLRUJPWCkuIFdpdGgKLXRoZXNlLCB5b3UgY2FuIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGZvciBzb21lIHNwZWNpYWwgdGhpbmdzLgotWW91IGNhbiB1c2UgdGhlIGFwcGVuZGVkIHByb2dyYW0gImNkdGVzdGVyIiB0byBzZXQgdGhlIGF1dG8tZWplY3QgZmVhdHVyZQotZHVyaW5nIHJ1bnRpbWUuIEplZmYgVHJhbnRlcidzICJlamVjdCIgdXRpbGl0eSBjYW4gZG8gdGhpcywgdG9vIChhbmQgbW9yZSkKLWZvciB5b3UuCi0KLVRoZXJlIGlzIGFuIGlvY3RsIENEUk9NTVVMVElTRVNTSU9OIHRvIG9idGFpbiB3aXRoIGEgdXNlciBwcm9ncmFtIGlmCi10aGUgQ0QgaXMgYW4gWEEgZGlzayBhbmQgLSBpZiBpdCBpcyAtIHdoZXJlIHRoZSBsYXN0IHNlc3Npb24gc3RhcnRzLiBUaGUKLSJjZHRlc3RlciIgcHJvZ3JhbSBpbGx1c3RyYXRlcyBob3cgdG8gY2FsbCBpdC4KLQotCi1BdXRvLXByb2JpbmcgYXQgYm9vdCB0aW1lOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGRyaXZlciBkb2VzIGF1dG8tcHJvYmluZyBhdCBtYW55IHdlbGwta25vd24gaW50ZXJmYWNlIGNhcmQgYWRkcmVzc2VzLAotYnV0IG5vdCBhbGw6Ci1Tb21lIHByb2JpbmdzIGNhbiBjYXVzZSBhIGhhbmcgaWYgYW4gTkUyMDAwIGV0aGVybmV0IGNhcmQgZ2V0cyB0b3VjaGVkLCBiZWNhdXNlCi1TQlBDRCdzIGF1dG8tcHJvYmluZyBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG5ldCBkcml2ZXJzLgotVGhvc2UgImhhemFyZG91cyIgYWRkcmVzc2VzIGFyZSBleGNsdWRlZCBmcm9tIGF1dG8tcHJvYmluZzsgdGhlICJrZXJuZWwgCi1jb21tYW5kIGxpbmUiIGZlYXR1cmUgaGFzIHRvIGJlIHVzZWQgZHVyaW5nIGluc3RhbGxhdGlvbiBpZiB5b3UgaGF2ZSB5b3VyIAotZHJpdmUgYXQgdGhvc2UgYWRkcmVzc2VzLiBUaGUgIm1vZHVsZSIgdmVyc2lvbiBpcyBhbGxvd2VkIHRvIHByb2JlIGF0IHRob3NlCi1hZGRyZXNzZXMsIHRvby4KLQotVGhlIGF1dG8tcHJvYmluZyBsb29rcyBmaXJzdCBhdCB0aGUgY29uZmlndXJlZCBhZGRyZXNzIHJlc3AuIHRoZSBhZGRyZXNzCi1zdWJtaXR0ZWQgYnkgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFdpdGggdGhpcywgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoaXMKLWRyaXZlciB3aXRoaW4gaW5zdGFsbGF0aW9uIGJvb3QgZmxvcHBpZXMsIGFuZCBmb3IgYW55IG5vbi1zdGFuZGFyZCBhZGRyZXNzLAotdG9vLgotCi1BdXRvLXByb2Jpbmcgd2lsbCBtYWtlIGFuIGFzc3VtcHRpb24gYWJvdXQgdGhlIGludGVyZmFjZSB0eXBlICgiU0JQUk8iIG9yIG5vdCksCi1iYXNlZCB1cG9uIHRoZSBhZGRyZXNzLiBUaGF0IGFzc3VtcHRpb24gbWF5IGJlIHdyb25nIChpbml0aWFsaXphdGlvbiB3aWxsIGJlCi1vLmsuLCBidXQgeW91IHdpbGwgZ2V0IEkvTyBlcnJvcnMgZHVyaW5nIG1vdW50KS4gSW4gdGhhdCBjYXNlLCB1c2UgdGhlICJrZXJuZWwKLWNvbW1hbmQgbGluZSIgZmVhdHVyZSBhbmQgc3BlY2lmeSBhZGRyZXNzICYgdHlwZSBhdCBib290IHRpbWUgdG8gZmluZCBvdXQgdGhlCi1yaWdodCBzZXR1cC4KLQotRm9yIGV2ZXJ5ZGF5IHVzZSwgYWRkcmVzcyBhbmQgdHlwZSBzaG91bGQgZ2V0IGNvbmZpZ3VyZWQgd2l0aGluIHNicGNkLmguIFRoYXQKLXdpbGwgc3RvcCB0aGUgYXV0by1wcm9iaW5nIGR1ZSB0byBzdWNjZXNzIHdpdGggdGhlIGZpcnN0IHRyeS4KLQotVGhlIGtlcm5lbCBjb21tYW5kICJzYnBjZD0wIiBzdXBwcmVzc2VzIGVhY2ggYXV0by1wcm9iaW5nIGFuZCBjYXVzZXMKLXRoZSBkcml2ZXIgbm90IHRvIGZpbmQgYW55IGRyaXZlOyBpdCBpcyBtZWFudCBmb3IgcGVvcGxlIHdobyBsb3ZlIHNicGNkCi1zbyBtdWNoIHRoYXQgdGhleSBkbyBub3Qgd2FudCB0byBtaXNzIGl0LCBldmVuIGlmIHRoZXkgbWlzcyB0aGUgZHJpdmVzLiA7LSkgIAotCi1JZiB5b3UgY29uZmlndXJlICIjZGVmaW5lIENEUk9NX1BPUlQgMCIgaW4gc2JwY2QuaCwgdGhlIGF1dG8tcHJvYmluZyBpcwotaW5pdGlhbGx5IGRpc2FibGVkIGFuZCBuZWVkcyBhbiBleHBsaWNpdCBrZXJuZWwgY29tbWFuZCB0byBnZXQgYWN0aXZhdGVkLgotT25jZSBhY3RpdmF0ZWQsIGl0IGRvZXMgbm90IHN0b3AgYmVmb3JlIHN1Y2Nlc3Mgb3IgZW5kLW9mLWxpc3QuIFRoaXMgbWF5IGJlCi11c2VmdWwgd2l0aGluICJ1bml2ZXJzYWwiIENEUk9NIGluc3RhbGxhdGlvbiBib290IGZsb3BwaWVzIChidXQgdXNpbmcgdGhlIAotbG9hZGFibGUgbW9kdWxlIHdvdWxkIGJlIGJldHRlciBiZWNhdXNlIGl0IGFsbG93cyBhbiAiZXh0ZW5kZWQiIGF1dG8tcHJvYmluZwotd2l0aG91dCBmZWFyaW5nIE5FMjAwMCBjYXJkcykuCi0KLVRvIHNob3J0ZW4gdGhlIGF1dG8tcHJvYmluZyBsaXN0IHRvIGEgc2luZ2xlIGVudHJ5LCBzZXQgRElTVFJJQlVUSU9OIDAgd2l0aGluCi1zYnBjZC5oLgotCi0KLVNldHRpbmcgdXAgYWRkcmVzcyBhbmQgaW50ZXJmYWNlIHR5cGU6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3VyIEkvTyBwb3J0IGFkZHJlc3MgaXMgbm90IDB4MzQwLCB5b3UgaGF2ZSB0byBsb29rIGZvciB0aGUgI2RlZmluZXMgbmVhcgotdGhlIGJlZ2lubmluZyBvZiBzYnBjZC5oIGFuZCBjb25maWd1cmUgdGhlbTogc2V0IFNCUFJPIHRvIDAgb3IgMSBvciAyLCBhbmQKLWNoYW5nZSBDRFJPTV9QT1JUIHRvIHRoZSBhZGRyZXNzIG9mIHlvdXIgQ0RST00gSS9PIHBvcnQuCi0KLUFsbW9zdCBhbGwgb2YgdGhlICJTb3VuZEJsYXN0ZXIgY29tcGF0aWJsZSIgY2FyZHMgYmVoYXZlIGxpa2UgdGhlIG5vLXNvdW5kCi1pbnRlcmZhY2VzLCBpLmUuIG5lZWQgU0JQUk8gMCEgCi0KLVdpdGggIm9yaWdpbmFsIiBTQiBQcm8gY2FyZHMsIGFuIGluaXRpYWwgc2V0dGluZyBvZiBDRF92b2x1bWUgdGhyb3VnaCB0aGUKLXNvdW5kIGNhcmQncyBNSVhFUiByZWdpc3RlciBnZXRzIGRvbmUuCi1JZiB5b3UgYXJlIHVzaW5nIGEgImNvbXBhdGlibGUiIHNvdW5kIGNhcmQgb2YgdHlwZXMgIkxhc2VyTWF0ZSIgb3IgIlNQRUEiLAoteW91IGNhbiBzZXQgU09VTkRfQkFTRSAoaW4gc2JwY2QuaCkgdG8gZ2V0IGl0IGRvbmUgd2l0aCB5b3VyIGNhcmQsIHRvby4uLgotCi0KLVVzaW5nIGF1ZGlvIENEczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotV29ya21hbiwgV29ya0JvbmUsIHhjZHBsYXllciwgY2RwbGF5ZXIgYW5kIHRoZSBuaWNlIGxpdHRsZSB0b29sICJjZHBsYXkiIChzZWUKLVJFQURNRS5henRjZCBmcm9tIHRoZSBBenRlY2ggZHJpdmVyIHBhY2thZ2UpIHNob3VsZCB3b3JrLgotCi1UaGUgcHJvZ3JhbSBDRHBsYXllciBsaWtlcyB0byB0YWxrIHRvICIvZGV2L21jZCIgb25seSwgeGNkcGxheWVyIHdhbnRzCi0iL2Rldi9yc3IwIiwgd29ya21hbiBsb3ZlcyAiL2Rldi9zcjAiIG9yICIvZGV2L2Nkcm9tIiAtIHNvLCBtYWtlIHRoZSAKLWFwcHJvcHJpYXRlIGxpbmtzIHRvIHVzZSB0aGVtIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3VwcGx5IHBhcmFtZXRlcnMuCi0KLQotQ29weWluZyBhdWRpbyB0cmFja3M6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBwcm9ncmFtIHdpbGwgY29weSB0cmFjayAxIChvciBhIHBpZWNlIG9mIGl0KSBmcm9tIGFuIGF1ZGlvIENECi1pbnRvIHRoZSBmaWxlICJ0cmFjazAxIjoKLQotLyo9PT09PT09PT09PT09PT09PT09IGJlZ2luIHByb2dyYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogcmVhZCBhbiBhdWRpbyB0cmFjayBmcm9tIGEgQ0QKLSAqCi0gKiAoYykgMTk5NCBFYmVyaGFyZCBNb2Vua2ViZXJnIDxlbW9lbmtlQGd3ZGcuZGU+Ci0gKiAgICAgICAgICBtYXkgYmUgdXNlZCAmIGVuaGFuY2VkIGZyZWVseQotICoKLSAqIER1ZSB0byBub24tZXhpc3RlbnQgc3luYyBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggYXVkaW8gZnJhbWUgKG9yIGR1ZQotICogdG8gYSBmaXJtd2FyZSBidWcgd2l0aGluIGFsbCBrbm93biBkcml2ZXM/KSwgaXQgaXMgY3VycmVudGx5IGEga2luZCBvZgotICogZm9ydHVuZSBpZiB0d28gY29uc2VjdXRpdmUgZnJhbWVzIGZpdCB0b2dldGhlci4KLSAqIFVzdWFsbHksIHRoZXkgb3ZlcmxhcCwgb3IgYSBsaXR0bGUgcGllY2UgaXMgbWlzc2luZy4gVGhpcyBoYXBwZW5zIGluIHVuaXRzCi0gKiBvZiAyNC1ieXRlIGNodW5rcy4gSXQgaGFzIHRvIGdldCBmaXhlZCBieSBoaWdoZXItbGV2ZWwgc29mdHdhcmUgKHJlYWRpbmcKLSAqIHVudGlsIGFuIG92ZXJsYXAgb2NjdXJzLCBhbmQgdGhlbiBlbGltaW5hdGUgdGhlIG92ZXJsYXBwaW5nIGNodW5rcykuIAotICogZnRwLmd3ZGcuZGU6L3B1Yi9saW51eC9taXNjL2NkZGEyd2F2LXNicGNkLioudGFyLmd6IGhvbGRzIGFuIGV4YW1wbGUgb2YKLSAqIHN1Y2ggYW4gYWxnb3JpdGhtLgotICogVGhpcyBleGFtcGxlIHByb2dyYW0gZnVydGhlciBpcyBtaXNzaW5nIHRvIG9idGFpbiB0aGUgU3ViQ2hhbm5lbCBkYXRhCi0gKiB3aGljaCBiZWxvbmcgdG8gZWFjaCBmcmFtZS4KLSAqCi0gKiBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZSBvZiB0aGUgbG93LWxldmVsIGFjY2VzcyByb3V0aW5lLiBUaGUgcmVhZCBkYXRhIGFyZQotICogcHVyZSAxNi1iaXQgQ0REQSB2YWx1ZXM7IHRoZXkgaGF2ZSB0byBnZXQgY29udmVydGVkIHRvIG1ha2Ugc291bmQgb3V0IG9mCi0gKiB0aGVtLgotICogSXQgaXMgbm8gZnVuIHRvIGxpc3RlbiB0byBpdCB3aXRob3V0IHByaW9yIG92ZXJsYXAvdW5kZXJsYXAgY29ycmVjdGlvbiEKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NoZHIgaGRyOwotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NlbnRyeSBlbnRyeVsxMDFdOwotc3RhdGljIHN0cnVjdCBjZHJvbV9yZWFkX2F1ZGlvIGFyZzsKLXN0YXRpYyB1X2NoYXIgYnVmZmVyW0NEX0ZSQU1FU0laRV9SQVddOwotc3RhdGljIGludCBkYXRhZmlsZSwgZHJpdmU7Ci1zdGF0aWMgaW50IGksIGosIGxpbWl0LCB0cmFjaywgZXJyOwotc3RhdGljIGNoYXIgZmlsZW5hbWVbMzJdOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotLyoKLSAqIG9wZW4gL2Rldi9jZHJvbQotICovCi0gIGRyaXZlPW9wZW4oIi9kZXYvY2Ryb20iLCAwKTsKLSAgaWYgKGRyaXZlPDApCi0gICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuIGRyaXZlLlxuIik7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotLyoKLSAqIGdldCBUb2NIZWFkZXIKLSAqLwotICBmcHJpbnRmKHN0ZG91dCwgImdldHRpbmcgVG9jSGVhZGVyLi4uXG4iKTsKLSAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURUT0NIRFIsICZoZHIpOwotICBpZiAoZXJyIT0wKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0hlYWRlciAoZXJyb3IgJWQpLlxuIiwgZXJyKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlRvY0hlYWRlcjogJWQgJWRcbiIsIGhkci5jZHRoX3RyazAsIGhkci5jZHRoX3RyazEpOwotLyoKLSAqIGdldCBhbmQgZGlzcGxheSBhbGwgVG9jRW50cmllcwotICovCi0gIGZwcmludGYoc3Rkb3V0LCAiZ2V0dGluZyBUb2NFbnRyaWVzLi4uXG4iKTsKLSAgZm9yIChpPTE7aTw9aGRyLmNkdGhfdHJrMSsxO2krKykKLSAgICB7Ci0gICAgICBpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBlbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLSAgICAgIGVsc2UgZW50cnlbaV0uY2R0ZV90cmFjayA9IENEUk9NX0xFQURPVVQ7Ci0gICAgICBlbnRyeVtpXS5jZHRlX2Zvcm1hdCA9IENEUk9NX0xCQTsKLSAgICAgIGVycj1pb2N0bChkcml2ZSwgQ0RST01SRUFEVE9DRU5UUlksICZlbnRyeVtpXSk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0VudHJ5ICMlZCAoZXJyb3IgJWQpLlxuIiwgaSwgZXJyKTsKLQkgIGV4aXQgKC0xKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZihzdGRvdXQsICJUb2NFbnRyeSAjJWQ6ICUxWCAlMVggJTA2WCAlMDJYXG4iLAotCQkgZW50cnlbaV0uY2R0ZV90cmFjaywKLQkJIGVudHJ5W2ldLmNkdGVfYWRyLAotCQkgZW50cnlbaV0uY2R0ZV9jdHJsLAotCQkgZW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJIGVudHJ5W2ldLmNkdGVfZGF0YW1vZGUpOwotCX0KLSAgICB9Ci0gIGZwcmludGYoc3Rkb3V0LCAiZ290IGFsbCBUb2NFbnRyaWVzLlxuIik7Ci0vKgotICogYXNrIGZvciB0cmFjayBudW1iZXIgKG5vdCBpbXBsZW1lbnRlZCBoZXJlKQotICovCi10cmFjaz0xOwotI2lmIDAgLyoganVzdCByZWFkIGEgbGl0dGxlIHBpZWNlICg0IHNlY29uZHMpICovCi1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhPWVudHJ5W3RyYWNrXS5jZHRlX2FkZHIubGJhKzMwMDsKLSNlbmRpZgotLyoKLSAqIHJlYWQgdHJhY2sgaW50byBmaWxlCi0gKi8KLSAgc3ByaW50ZihmaWxlbmFtZSwgInRyYWNrJTAyZFwwIiwgdHJhY2spOwotICBkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0gIGlmIChkYXRhZmlsZTwwKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiBkYXRhZmlsZSAlcy5cbiIsIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGFyZy5hZGRyLmxiYT1lbnRyeVt0cmFja10uY2R0ZV9hZGRyLmxiYTsKLSAgYXJnLmFkZHJfZm9ybWF0PUNEUk9NX0xCQTsgLyogQ0RST01fTVNGIHdvdWxkIGJlIHBvc3NpYmxlIGhlcmUsIHRvby4gKi8KLSAgYXJnLm5mcmFtZXM9MTsKLSAgYXJnLmJ1Zj0mYnVmZmVyWzBdOwotICBsaW1pdD1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhOwotICBmb3IgKDthcmcuYWRkci5sYmE8bGltaXQ7YXJnLmFkZHIubGJhKyspCi0gICAgewotICAgICAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURBVURJTywgJmFyZyk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgcmVhZCBhYnMuIGZyYW1lICMlZCAoZXJyb3IgJWQpLlxuIiwgCi0JCSBhcmcuYWRkci5sYmEsIGVycik7Ci0JfQotICAgICAgaj13cml0ZShkYXRhZmlsZSwgJmJ1ZmZlclswXSwgQ0RfRlJBTUVTSVpFX1JBVyk7Ci0gICAgICBpZiAoaiE9Q0RfRlJBTUVTSVpFX1JBVykKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiSS9PIGVycm9yIChkYXRhZmlsZSkgYXQgcmVsLiBmcmFtZSAlZFxuIiwKLQkJCSBhcmcuYWRkci5sYmEtZW50cnlbdHJhY2tdLmNkdGVfYWRkci5sYmEpOwotCX0KLSAgICAgIGFyZy5hZGRyLmxiYSsrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09IGVuZCBwcm9ncmFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L21pc2MvY2RkYTJ3YXYtc2JwY2QuKi50YXIuZ3ogaXMgYW4gYWRhcHRlZCB2ZXJzaW9uIG9mCi1IZWlrbyBFaXNzZmVsZHQncyBkaWdpdGFsLWF1ZGlvIHRvIC5XQVYgY29udmVydGVyICh0aGUgb3JpZ2luYWwgaXMgdGhlcmUsIHRvbykuCi1UaGlzIGlzIHByZWxpbWluYXJ5LCBhcyBIZWlrbyBoaW1zZWxmIHdpbGwgY2FyZSBhYm91dCBpdC4KLQotCi1Lbm93biBwcm9ibGVtczoKLS0tLS0tLS0tLS0tLS0tLQotCi1DdXJyZW50bHksIHRoZSBkZXRlY3Rpb24gb2YgZGlzayBjaGFuZ2Ugb3IgcmVtb3ZhbCBpcyBhY3RpdmVseSBkaXNhYmxlZC4KLQotTW9zdCBhdHRlbXB0cyB0byByZWFkIHRoZSBVUEMvRUFOIGNvZGUgcmVzdWx0IGluIGEgc3RyZWFtIG9mIHplcm9lcy4gQWxsIG15Ci1kcml2ZXMgYXJlIG1vc3RseSB0ZWxsaW5nIHRoZXJlIGlzIG5vIFVQQy9FQU4gY29kZSBvbiBkaXNrIG9yIHRoZXJlIGlzLCBidXQgaXQKLWlzIGFuIGFsbC16ZXJvIG51bWJlci4gSSBndWVzcyBub3cgYWxtb3N0IG5vIENEIGhvbGRzIHN1Y2ggYSBudW1iZXIuCi0KLUJ1ZyByZXBvcnRzLCBjb21tZW50cywgd2lzaGVzLCBkb25hdGlvbnMgKHRlY2huaWNhbCBpbmZvcm1hdGlvbiBpcyBhIGRvbmF0aW9uLAotdG9vIDotKSBldGMuIHRvIGVtb2Vua2VAZ3dkZy5kZS4KLQotU25haWxNYWlsIGFkZHJlc3MsIHByZWZlcmFibGUgZm9yIENEIGVkaXRvcnMgaWYgdGhleSB3YW50IHRvIHN1Ym1pdCBhIGZyZWUKLSJjb29wZXJhdGlvbiIgY29weToKLSAgICAgICAgICAgICAgICAgICAgICAgICBFYmVyaGFyZCBNb2Vua2ViZXJnCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVpbmhvbGRzdHIuIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgRC0zNzA4MyBHb2V0dGluZ2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2VybWFueQotLS0tCi0KLQotQXBwZW5kaXggLS0gdGhlICJjZHRlc3RlciIgdXRpbGl0eToKLQotLyoKLSAqIGNkdGVzdGVyLmMgLS0gdGVzdCB0aGUgYXVkaW8gZnVuY3Rpb25zIG9mIGEgQ0QgZHJpdmVyCi0gKgotICogKGMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPgotICogICAgICAgICAgcHVibGlzaGVkIHVuZGVyIHRoZSBHUEwKLSAqCi0gKiAgICAgICAgICBtYWRlIHVuZGVyIGhlYXZ5IHVzZSBvZiB0aGUgIlRpbnkgQXVkaW8gQ0QgUGxheWVyIgotICogICAgICAgICAgZnJvbSBXZXJuZXIgWmltbWVybWFubiA8emltbWVybWFAcnouZmh0LWVzc2xpbmdlbi5kZT4KLSAqICAgICAgICAgIChzZWUgbGludXgvZHJpdmVycy9ibG9jay9SRUFETUUuYXp0Y2QpCi0gKi8KLSN1bmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLyogbm90IHN1cHBvcnRlZCBieSBldmVyeSBDRFJPTSBkcml2ZXIgKi8KLSNkZWZpbmUgU0JQX1BSSVZBVEVfSU9DVExTIC8qIG5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUwotI2luY2x1ZGUgPGxpbnV4Ly4uLy4uL2RyaXZlcnMvY2Ryb20vYXp0Y2QuaD4KLSNlbmRpZiAvKiBBWlRfUFJJVkFURV9JT0NUTFMgKi8KLSNpZmRlZiBTQlBfUFJJVkFURV9JT0NUTFMKLSNpbmNsdWRlIDxsaW51eC8uLi8uLi9kcml2ZXJzL2Nkcm9tL3NicGNkLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQotc3RydWN0IGNkcm9tX3RvY2hkciBoZHI7Ci1zdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvY0hkcjsKLXN0cnVjdCBjZHJvbV90b2NlbnRyeSBUb2NFbnRyeVsxMDFdOwotc3RydWN0IGNkcm9tX3RvY2VudHJ5IGVudHJ5Owotc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiBtc19pbmZvOwotc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8gcmVhZF9hdWRpbzsKLXN0cnVjdCBjZHJvbV90aSB0aTsKLXN0cnVjdCBjZHJvbV9zdWJjaG5sIHN1YmNobmw7Ci1zdHJ1Y3QgY2Ryb21fbXNmIG1zZjsKLXN0cnVjdCBjZHJvbV92b2xjdHJsIHZvbGN0cmw7Ci0jaWZkZWYgQVpUX1BSSVZBVEVfSU9DVExTCi11bmlvbgotewotCXN0cnVjdCBjZHJvbV9tc2YgbXNmOwotCXVuc2lnbmVkIGNoYXIgYnVmW0NEX0ZSQU1FU0laRV9SQVddOwotfSBhenQ7Ci0jZW5kaWYgLyogQVpUX1BSSVZBVEVfSU9DVExTICovCi1pbnQgaSwgaTEsIGkyLCBpMywgaiwgazsKLXVuc2lnbmVkIGNoYXIgc2VxdWVuY2U9MDsKLXVuc2lnbmVkIGNoYXIgY29tbWFuZFs4MF07Ci11bnNpZ25lZCBjaGFyIGZpcnN0PTEsIGxhc3Q9MTsKLWNoYXIgKmRlZmF1bHRfZGV2aWNlPSIvZGV2L2Nkcm9tIjsKLWNoYXIgZGV2WzIwXTsKLWNoYXIgZmlsZW5hbWVbMjBdOwotaW50IGRyaXZlOwotaW50IGRhdGFmaWxlOwotaW50IHJjOwotCi12b2lkIGhlbHAodm9pZCkKLXsKLQlwcmludGYoIkF2YWlsYWJsZSBDb21tYW5kczpcbiIpOwotCXByaW50ZigiU1RPUCAgICAgICAgICBzICAgICAgRUpFQ1QgICAgICAgIGUgICAgICAgUVVJVCAgICAgICAgIHFcbiIpOwotCXByaW50ZigiUExBWSBUUkFDSyAgICB0ICAgICAgUEFVU0UgICAgICAgIHAgICAgICAgUkVTVU1FICAgICAgIHJcbiIpOwotCXByaW50ZigiTkVYVCBUUkFDSyAgICBuICAgICAgUkVQRUFUIExBU1QgIGwgICAgICAgSEVMUCAgICAgICAgIGhcbiIpOwotCXByaW50ZigiU1VCQ0hBTk5FTF9RICBjICAgICAgVFJBQ0sgSU5GTyAgIGkgICAgICAgUExBWSBBVCAgICAgIGFcbiIpOwotCXByaW50ZigiUkVBRCAgICAgICAgICBkICAgICAgUkVBRCBSQVcgICAgIHcgICAgICAgUkVBRCBBVURJTyAgIEFcbiIpOwotCXByaW50ZigiTVMtSU5GTyAgICAgICBNICAgICAgVE9DICAgICAgICAgIFQgICAgICAgU1RBUlQgICAgICAgIFNcbiIpOwotCXByaW50ZigiU0VUIEVKRUNUU1cgICBYICAgICAgREVWSUNFICAgICAgIEQgICAgICAgREVCVUcgICAgICAgIFlcbiIpOwotCXByaW50ZigiQVVESU9fQlVGU0laICBaICAgICAgUkVTRVQgICAgICAgIFIgICAgICAgU0VUIFZPTFVNRSAgIHZcbiIpOwotCXByaW50ZigiR0VUIFZPTFVNRSAgICBWXG4iKTsKLX0KLQotLyoKLSAqICBjb252ZXJ0IE1TRiBudW1iZXIgKDMgYnl0ZXMgb25seSkgdG8gTG9naWNhbF9CbG9ja19BZGRyZXNzIAotICovCi1pbnQgbXNmMmxiYSh1X2NoYXIgKm1zZikKLXsKLQlpbnQgaTsKLQkKLQlpPShtc2ZbMF0gKiBDRF9TRUNTICsgbXNmWzFdKSAqIENEX0ZSQU1FUyArIG1zZlsyXSAtIENEX0JMT0NLX09GRlNFVDsKLQlpZiAoaTwwKSByZXR1cm4gKDApOwotCXJldHVybiAoaSk7Ci19Ci0vKgotICogIGNvbnZlcnQgbG9naWNhbF9ibG9ja19hZGRyZXNzIHRvIG0tcy1mX251bWJlciAoMyBieXRlcyBvbmx5KQotICovCi12b2lkIGxiYTJtc2YoaW50IGxiYSwgdW5zaWduZWQgY2hhciAqbXNmKQotewotCWxiYSArPSBDRF9CTE9DS19PRkZTRVQ7Ci0JbXNmWzBdID0gbGJhIC8gKENEX1NFQ1MqQ0RfRlJBTUVTKTsKLQlsYmEgJT0gQ0RfU0VDUypDRF9GUkFNRVM7Ci0JbXNmWzFdID0gbGJhIC8gQ0RfRlJBTUVTOwotCW1zZlsyXSA9IGxiYSAlIENEX0ZSQU1FUzsKLX0KLQotaW50IGluaXRfZHJpdmUoY2hhciAqZGV2KQotewotCXVuc2lnbmVkIGNoYXIgbXNmX2VudFszXTsKLQotCS8qCi0JICogb3BlbiB0aGUgZGV2aWNlCi0JICovCi0JZHJpdmU9b3BlbihkZXYsMCk7Ci0JaWYgKGRyaXZlPDApIHJldHVybiAoLTEpOwotCS8qCi0JICogZ2V0IFRvY0hlYWRlcgotCSAqLwotCXByaW50ZigiZ2V0dGluZyBUb2NIZWFkZXIuLi5cbiIpOwotCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmaGRyKTsKLQlpZiAocmMhPTApCi0JewotCQlwcmludGYoImNhbid0IGdldCBUb2NIZWFkZXIgKGVycm9yICVkKS5cbiIscmMpOwotCQlyZXR1cm4gKC0yKTsKLQl9Ci0JZWxzZQotCQlmaXJzdD1oZHIuY2R0aF90cmswOwotCQlsYXN0PWhkci5jZHRoX3RyazE7Ci0JCXByaW50ZigiVG9jSGVhZGVyOiAlZCAlZFxuIixoZHIuY2R0aF90cmswLGhkci5jZHRoX3RyazEpOwotCS8qCi0JICogZ2V0IGFuZCBkaXNwbGF5IGFsbCBUb2NFbnRyaWVzCi0JICovCi0JcHJpbnRmKCJnZXR0aW5nIFRvY0VudHJpZXMuLi5cbiIpOwotCWZvciAoaT0xO2k8PWhkci5jZHRoX3RyazErMTtpKyspCi0JewotCQlpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLQkJZWxzZSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gQ0RST01fTEVBRE9VVDsKLQkJVG9jRW50cnlbaV0uY2R0ZV9mb3JtYXQgPSBDRFJPTV9MQkE7Ci0JCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0VOVFJZLCZUb2NFbnRyeVtpXSk7Ci0JCWlmIChyYyE9MCkKLQkJewotCQkJcHJpbnRmKCJjYW4ndCBnZXQgVG9jRW50cnkgIyVkIChlcnJvciAlZCkuXG4iLGkscmMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbGJhMm1zZihUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLCZtc2ZfZW50WzBdKTsKLQkJCWlmIChUb2NFbnRyeVtpXS5jZHRlX3RyYWNrPT1DRFJPTV9MRUFET1VUKQotCQkJewotCQkJCXByaW50ZigiVG9jRW50cnkgIyUwMlg6ICUxWCAlMVggJTAyZDolMDJkOiUwMmQgKGxiYTogMHglMDZYKSAlMDJYXG4iLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkciwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9jdHJsLAotCQkJCSAgICAgICBtc2ZfZW50WzBdLAotCQkJCSAgICAgICBtc2ZfZW50WzFdLAotCQkJCSAgICAgICBtc2ZfZW50WzJdLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2RhdGFtb2RlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIlRvY0VudHJ5ICMlMDJkOiAlMVggJTFYICUwMmQ6JTAyZDolMDJkIChsYmE6IDB4JTA2WCkgJTAyWFxuIiwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV90cmFjaywKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZHIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfY3RybCwKLQkJCQkgICAgICAgbXNmX2VudFswXSwKLQkJCQkgICAgICAgbXNmX2VudFsxXSwKLQkJCQkgICAgICAgbXNmX2VudFsyXSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIChoZHIuY2R0aF90cmsxKTsgLyogbnVtYmVyIG9mIHRyYWNrcyAqLwotfQotCi12b2lkIGRpc3BsYXkoaW50IHNpemUsdW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotCWs9MDsKLQlnZXRjaGFyKCk7Ci0JZm9yIChpPTA7aTwoc2l6ZSsxKS8xNjtpKyspCi0JewotCQlwcmludGYoIiU0ZDoiLGkqMTYpOwotCQlmb3IgKGo9MDtqPDE2O2orKykKLQkJewotCQkJcHJpbnRmKCIgJTAyWCIsYnVmZmVyW2kqMTYral0pOwotCQl9Ci0JCXByaW50ZigiICAiKTsKLQkJZm9yIChqPTA7ajwxNjtqKyspCi0JCXsKLQkJCWlmIChpc2FsbnVtKGJ1ZmZlcltpKjE2K2pdKSkgCi0JCQkJcHJpbnRmKCIlYyIsYnVmZmVyW2kqMTYral0pOwotCQkJZWxzZQotCQkJCXByaW50ZigiLiIpOwotCQl9Ci0JCXByaW50ZigiXG4iKTsgCi0JCWsrKzsKLQkJaWYgKGs+PTIwKQotCQl7Ci0JCQlwcmludGYoInByZXNzIEVOVEVSIHRvIGNvbnRpbnVlXG4iKTsKLQkJCWdldGNoYXIoKTsKLQkJCWs9MDsKLQkJfQotCX0gCi19IAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXByaW50ZigiXG5UZXN0aW5nIHRvb2wgZm9yIGEgQ0RST00gZHJpdmVyJ3MgYXVkaW8gZnVuY3Rpb25zIFYwLjFcbiIpOwotCXByaW50ZigiKEMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPlxuIik7Ci0JcHJpbnRmKCJpbml0aWFsaXppbmcuLi5cbiIpOwotCQotCXJjPWluaXRfZHJpdmUoZGVmYXVsdF9kZXZpY2UpOwotCWlmIChyYzwwKSBwcmludGYoImNvdWxkIG5vdCBvcGVuICVzIChyYz0lZCkuXG4iLGRlZmF1bHRfZGV2aWNlLHJjKTsKLQloZWxwKCk7Ci0Jd2hpbGUgKDEpCi0JewotCQlwcmludGYoIkdpdmUgYSBvbmUtbGV0dGVyIGNvbW1hbmQgKGggPSBoZWxwKTogIik7Ci0JCXNjYW5mKCIlcyIsY29tbWFuZCk7Ci0JCWNvbW1hbmRbMV09MDsKLQkJc3dpdGNoIChjb21tYW5kWzBdKQotCQl7Ci0JCWNhc2UgJ0QnOgotCQkJcHJpbnRmKCJkZXZpY2UgbmFtZSAoZi5lLiAvZGV2L3NicGNkMyk6ID8gIik7Ci0JCQlzY2FuZigiJXMiLCZkZXYpOwotCQkJY2xvc2UoZHJpdmUpOwotCQkJcmM9aW5pdF9kcml2ZShkZXYpOwotCQkJaWYgKHJjPDApIHByaW50ZigiY291bGQgbm90IG9wZW4gJXMgKHJjICVkKS5cbiIsZGV2LHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdlJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NRUpFQ1QpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01FSkVDVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUEFVU0UpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QQVVTRTogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTVU1FKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVTVU1FOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NU1RPUDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdTJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RBUlQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01TVEFSVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICd0JzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKTsKLQkJCWlmIChyYzwwKQotCQkJewotCQkJCXByaW50ZigiQ0RST01SRUFEVE9DSERSOiByYz0lZC5cbiIscmMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLQkJCWxhc3Q9IHRvY0hkci5jZHRoX3RyazE7Ci0JCQlpZiAoKGZpcnN0PT0wKXx8KGZpcnN0Pmxhc3QpKQotCQkJewotCQkJCXByaW50ZiAoIi0tZ290IGludmFsaWQgVE9DIGRhdGEuXG4iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIi0tZW50ZXIgdHJhY2sgbnVtYmVyKGZpcnN0PSVkLCBsYXN0PSVkKTogIixmaXJzdCxsYXN0KTsKLQkJCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQkJdGkuY2R0aV90cmswPWkxOwotCQkJCWlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLQkJCQlpZiAodGkuY2R0aV90cmswPmxhc3QpIHRpLmNkdGlfdHJrMD1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJCXRpLmNkdGlfdHJrMT1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgrK3RpLmNkdGlfdHJrMD5sYXN0KSB0aS5jZHRpX3RyazA9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJdGkuY2R0aV90cmsxPWxhc3Q7Ci0JCQl0aS5jZHRpX2luZDE9MDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUExBWVRSS0lORCwmdGkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgtLXRpLmNkdGlfdHJrMDxmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotCQkJdGkuY2R0aV9pbmQwPTA7Ci0JCQl0aS5jZHRpX3RyazE9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlUUktJTkQ6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQlzdWJjaG5sLmNkc2NfZm9ybWF0PUNEUk9NX01TRjsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVNVQkNITkw6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJBdWRpb1N0YXR1czolcyAgVHJhY2s6JWQgIE1vZGU6JWQgIE1TRj0lMDJkOiUwMmQ6JTAyZFxuIiwKLQkJCQkgICAgICAgc3ViY2hubC5jZHNjX2F1ZGlvc3RhdHVzPT1DRFJPTV9BVURJT19QTEFZID8gIlBMQVlJTkciOiJOT1QgUExBWUlORyIsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5taW51dGUsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5mcmFtZSk7Ci0JCQl9Ci0JCQlicmVhazsgICAgICAgICAgICAgIAotCQljYXNlICdpJzoKLQkJCXByaW50ZigiVHJhY2sgTm8uOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCWVudHJ5LmNkdGVfdHJhY2s9aTE7Ci0JCQlpZiAoZW50cnkuY2R0ZV90cmFjazxmaXJzdCkgZW50cnkuY2R0ZV90cmFjaz1maXJzdDsKLQkJCWlmIChlbnRyeS5jZHRlX3RyYWNrPmxhc3QpICBlbnRyeS5jZHRlX3RyYWNrPWxhc3Q7Ci0JCQllbnRyeS5jZHRlX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURUT0NFTlRSWSwmZW50cnkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRUFEVE9DRU5UUlk6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJTAyZDolMDJkOiUwMmRcbiIsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRyLAotCQkJCSAgICAgICBlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwKLQkJCQkgICAgICAgZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQkJcHJpbnRmKCJBZGRyZXNzIChtaW46c2VjOmZybSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQltc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCW1zZi5jZG1zZl9zZWMwPWkyOwotCQkJbXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChtc2YuY2Rtc2Zfc2VjMD41OSkgbXNmLmNkbXNmX3NlYzA9NTk7Ci0JCQlpZiAobXNmLmNkbXNmX2ZyYW1lMD43NCkgbXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCWxiYTJtc2YoVG9jRW50cnlbbGFzdCsxXS5jZHRlX2FkZHIubGJhLTEsJm1zZi5jZG1zZl9taW4xKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVBMQVlNU0YsJm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlNU0Y6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnVic6Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTFJFQUQsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJcHJpbnRmKCJWb2x1bWU6IGNoYW5uZWwgMCAobGVmdCkgJWQsIGNoYW5uZWwgMSAocmlnaHQpICVkXG4iLHZvbGN0cmwuY2hhbm5lbDAsdm9sY3RybC5jaGFubmVsMSk7Ci0JCQlicmVhazsgIAotCQljYXNlICdSJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTRVQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRVNFVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUyAvKm5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyKi8KLQkJY2FzZSAnZCc6Ci0JCQlwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJtKSAgIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCWF6dC5tc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCWF6dC5tc2YuY2Rtc2Zfc2VjMD1pMjsKLQkJCWF6dC5tc2YuY2Rtc2ZfZnJhbWUwPWkzOwotCQkJaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMD41OSkgYXp0Lm1zZi5jZG1zZl9zZWMwPTU5OwotCQkJaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPjc0KSBhenQubXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRE1PREUxLCZhenQubXNmKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVBRE1PREUxOiByYz0lZC5cbiIscmMpOwotCQkJZWxzZSBkaXNwbGF5KENEX0ZSQU1FU0laRSxhenQuYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlICd3JzoKLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQlhenQubXNmLmNkbXNmX21pbjA9aTE7Ci0JCQlhenQubXNmLmNkbXNmX3NlYzA9aTI7Ci0JCQlhenQubXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChhenQubXNmLmNkbXNmX3NlYzA+NTkpIGF6dC5tc2YuY2Rtc2Zfc2VjMD01OTsKLQkJCWlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD43NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURNT0RFMiwmYXp0Lm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVJFQURNT0RFMjogcmM9JWQuXG4iLHJjKTsKLQkJCWVsc2UgZGlzcGxheShDRF9GUkFNRVNJWkVfUkFXLGF6dC5idWYpOyAvKiBjdXJyZW50bHkgb25seSAyMzM2ICovCi0JCQlicmVhazsgIAotI2VuZGlmCi0JCWNhc2UgJ3YnOgotCQkJcHJpbnRmKCItLUNoYW5uZWwgMCAoTGVmdCkgICgwLTI1NSk6ICIpOwotCQkJc2NhbmYoIiVkIiwmaTEpOwotCQkJdm9sY3RybC5jaGFubmVsMD1pMTsKLQkJCXByaW50ZigiLS1DaGFubmVsIDEgKFJpZ2h0KSAoMC0yNTUpOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCXZvbGN0cmwuY2hhbm5lbDE9aTE7Ci0JCQl2b2xjdHJsLmNoYW5uZWwyPTA7Ci0JCQl2b2xjdHJsLmNoYW5uZWwzPTA7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTENUUkwsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7ICAKLQkJY2FzZSAncSc6Ci0JCQljbG9zZShkcml2ZSk7Ci0JCQlleGl0KDApOwotCQljYXNlICdoJzoKLQkJCWhlbHAoKTsKLQkJCWJyZWFrOwotCQljYXNlICdUJzogLyogZGlzcGxheSBUT0MgZW50cnkgLSB3aXRob3V0IGludm9sdmluZyB0aGUgZHJpdmVyICovCi0JCQlzY2FuZigiJWQiLCZpKTsKLQkJCWlmICgoaTxoZHIuY2R0aF90cmswKXx8KGk+aGRyLmNkdGhfdHJrMSkpCi0JCQkJcHJpbnRmKCJpbnZhbGlkIHRyYWNrIG51bWJlci5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ZigiVG9jRW50cnkgJTAyZDogYWRyPSUwMVggY3RybD0lMDFYIG1zZj0lMDJkOiUwMmQ6JTAyZCBtb2RlPSUwMlhcbiIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfdHJhY2ssCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRyLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2N0cmwsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRkci5tc2YubWludXRlLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubXNmLnNlY29uZCwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLm1zZi5mcmFtZSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnQSc6IC8qIHJlYWQgYXVkaW8gZGF0YSBpbnRvIGZpbGUgKi8KLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcm0pID8gIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCXJlYWRfYXVkaW8uYWRkci5tc2YubWludXRlPWkxOwotCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQ9aTI7Ci0JCQlyZWFkX2F1ZGlvLmFkZHIubXNmLmZyYW1lPWkzOwotCQkJcmVhZF9hdWRpby5hZGRyX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlwcmludGYoIiMgb2YgZnJhbWVzID8gIik7Ci0JCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQlyZWFkX2F1ZGlvLm5mcmFtZXM9aTE7Ci0JCQlrPXJlYWRfYXVkaW8ubmZyYW1lcypDRF9GUkFNRVNJWkVfUkFXOwotCQkJcmVhZF9hdWRpby5idWY9bWFsbG9jKGspOwotCQkJaWYgKHJlYWRfYXVkaW8uYnVmPT1OVUxMKQotCQkJewotCQkJCXByaW50ZigiY2FuJ3QgbWFsbG9jICVkIGJ5dGVzLlxuIixrKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwcmludGYoZmlsZW5hbWUsImF1ZGlvXyUwMmQlMDJkJTAyZF8lMDJkLiUwMmRcMCIsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5taW51dGUsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5mcmFtZSwKLQkJCQlyZWFkX2F1ZGlvLm5mcmFtZXMsCi0JCQkJKytzZXF1ZW5jZSk7Ci0JCQlkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0JCQlpZiAoZGF0YWZpbGU8MCkKLQkJCXsKLQkJCQlwcmludGYoImNhbid0IG9wZW4gZGF0YWZpbGUgJXMuXG4iLGZpbGVuYW1lKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBREFVRElPLCZyZWFkX2F1ZGlvKTsKLQkJCWlmIChyYyE9MCkKLQkJCXsKLQkJCQlwcmludGYoIkNEUk9NUkVBREFVRElPOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJjPXdyaXRlKGRhdGFmaWxlLCZyZWFkX2F1ZGlvLmJ1ZixrKTsKLQkJCQlpZiAocmMhPWspIHByaW50ZigiZGF0YWZpbGUgSS9PIGVycm9yICglZCkuXG4iLHJjKTsKLQkJCX0KLQkJCWNsb3NlKGRhdGFmaWxlKTsKLQkJCWJyZWFrOwotCQljYXNlICdYJzogLyogc2V0IEVKRUNUX1NXICgwOiBkaXNhYmxlLCAxOiBlbmFibGUgYXV0by1lamVjdGluZykgKi8KLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01FSkVDVF9TVyxpKTsKLQkJCWlmIChyYyE9MCkKLQkJCQlwcmludGYoIkNEUk9NRUpFQ1RfU1c6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCJFSkVDVF9TVyBzZXQgdG8gJWRcbiIsaSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnTSc6IC8qIGdldCB0aGUgbXVsdGlzZXNzaW9uIHJlZGlyZWN0aW9uIGluZm8gKi8KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTEJBOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obGJhKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKSBwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKGxiYSk6ICVkICgweCUwNlgpXG4iLG1zX2luZm8uYWRkci5sYmEsbXNfaW5mby5hZGRyLmxiYSk7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRmKCJ0aGlzIENEIGlzIG5vdCBhbiBYQSBkaXNrLlxuIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTVNGOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obXNmKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKQotCQkJCQlwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKG1zZik6ICUwMmQ6JTAyZDolMDJkICgweCUwMlglMDJYJTAyWClcbiIsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLm1pbnV0ZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2Yuc2Vjb25kLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5mcmFtZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2YubWludXRlLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLmZyYW1lKTsKLQkJCQllbHNlIHByaW50ZigidGhpcyBDRCBpcyBub3QgYW4gWEEgZGlzay5cbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgU0JQX1BSSVZBVEVfSU9DVExTCi0JCWNhc2UgJ1knOiAvKiBzZXQgdGhlIGRyaXZlcidzIG1lc3NhZ2UgbGV2ZWwgKi8KLSNpZiAwIC8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQkJCXByaW50ZigiZW50ZXIgc3dpdGNoIG5hbWUgKGYuZS4gREJHX0NNRCk6ICIpOwotCQkJc2NhbmYoIiVzIiwmZGJnX3N3aXRjaCk7Ci0JCQlqPWdldF9kYmdfbnVtKGRiZ19zd2l0Y2gpOwotI2Vsc2UKLQkJCXByaW50ZigiZW50ZXIgRERJT0NTREJHIHN3aXRjaCBudW1iZXI6ICIpOwotCQkJc2NhbmYoIiVkIiwmaik7Ci0jZW5kaWYKLQkJCXByaW50ZigiZW50ZXIgMCBmb3IgXCJvZmZcIiwgMSBmb3IgXCJvblwiOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJaWYgKGk9PTApIGp8PTB4ODA7Ci0JCQlwcmludGYoImNhbGxpbmcgXCJpb2N0bChkcml2ZSxERElPQ1NEQkcsJWQpXCJcbiIsaik7Ci0JCQlyYz1pb2N0bChkcml2ZSxERElPQ1NEQkcsaik7Ci0JCQlwcmludGYoIkRESU9DU0RCRzogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdaJzogLyogc2V0IHRoZSBhdWRpbyBidWZmZXIgc2l6ZSAqLwotCQkJcHJpbnRmKCIjIGZyYW1lcyB3YW50ZWQ6ID8gIik7Ci0JCQlzY2FuZigiJWQiLCZqKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NQVVESU9CVUZTSVosaik7Ci0JCQlwcmludGYoIiVkIGZyYW1lcyBncmFudGVkLlxuIixyYyk7Ci0JCQlicmVhazsKLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQkJZGVmYXVsdDoKLQkJCXByaW50ZigidW5rbm93biBjb21tYW5kOiBcIiVzXCIuXG4iLGNvbW1hbmQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGExNDg0Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2pjZAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSAtLSBEb2N1bWVudGF0aW9uL2Nkcm9tL3NqY2QKLQkJCQk4MCUgb2YgdGhlIHdvcmsgdGFrZXMgMjAlIG9mIHRoZSB0aW1lLAotCQkJCTIwJSBvZiB0aGUgd29yayB0YWtlcyA4MCUgb2YgdGhlIHRpbWUuLi4KLQkJCQkJCShNdXJwaHkncyBsYXcpCi0KLQkJCQlPbmNlIHN0YXJ0ZWQsIHRyYWluaW5nIGNhbiBub3QgYmUgc3RvcHBlZC4uLgotCQkJCQkJKFN0YXIgV2FycykKLQotVGhpcyBpcyB0aGUgUkVBRE1FIGZvciB0aGUgc2pjZCBjZHJvbSBkcml2ZXIsIHZlcnNpb24gMS42LgotCi1UaGlzIGZpbGUgaXMgbWVhbnQgYXMgYSB0aXBzICYgdHJpY2tzIGVkZ2UgZm9yIHRoZSB1c2FnZSBvZiB0aGUgU0FOWU8gQ0RSLUg5NEEKLWNkcm9tIGRyaXZlLiBJdCB3aWxsIGdyb3cgYXMgdGhlIHF1ZXN0aW9ucyBhcmlzZS4gOy0pCi1Gb3IgaW5mbyBvbiBjb25maWd1cmluZyB0aGUgSVNQMTYgc291bmQgY2FyZCBsb29rIGF0IERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBhbnkgb2YgdGhlIFBhbmFzb25pYywgU29ueSBvciBNaXRzdW1pIHN0eWxlCi1DRFJPTSBpbnRlcmZhY2VzLgotVGhlIGNkcm9tIGludGVyZmFjZSBvbiBNZWRpYSBNYWdpYydzIHNvZnQgY29uZmlndXJhYmxlIHNvdW5kIGNhcmQgSVNQMTYsCi13aGljaCB1c2VkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIsIGlzIG5vdyBzdXBwb3J0ZWQgaW4gYSBzZXBhcmF0ZSBtb2R1bGUuCi1UaGlzIGluaXRpYWxpc2F0aW9uIG1vZHVsZSB3aWxsIHByb2JhYmx5IGFsc28gd29yayB3aXRoIG90aGVyIGludGVyZmFjZXMKLWJhc2VkIG9uIGFuIE9QVGkgODJDOTI4IG9yIDgyQzkyOSBjaGlwIChsaWtlIE1BRDE2IGFuZCBNb3phcnQpOiBzZWUgdGhlCi1kb2N1bWVudGF0aW9uIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkZXZpY2UgbWFqb3IgZm9yIHNqY2QgaXMgMTgsIGFuZCBtaW5vciBpcyAwLiBDcmVhdGUgYSBibG9jayBzcGVjaWFsCi1maWxlIGluIHlvdXIgL2RldiBkaXJlY3RvcnkgKGUuZy4sIC9kZXYvc2pjZCkgd2l0aCB0aGVzZSBudW1iZXJzLgotKEZvciB0aG9zZSB3aG8gZG9uJ3Qga25vdywgYmVpbmcgcm9vdCBhbmQgZG9pbmcgdGhlIGZvbGxvd2luZyBzaG91bGQgZG8KLXRoZSB0cmljazoKLSAgbWtub2QgLW0gNjQ0IC9kZXYvc2pjZCBiIDE4IDAKLWFuZCBtb3VudCB0aGUgY2Ryb20gYnkgL2Rldi9zamNkKS4KLQotVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZToKLSAgYmFzZSBhZGRyZXNzIDB4MzQwCi0gIG5vIGlycQotICBubyBkbWEKLShBY3R1YWxseSB0aGUgQ0RSLUg5NEEgZG9lc24ndCBrbm93IGhvdyB0byB1c2UgaXJxIGFuZCBkbWEuKQotQXMgb2YgdmVyc2lvbiAxLjIsIHNldHRpbmcgYmFzZSBhZGRyZXNzIGF0IGJvb3QgdGltZSBpcyBzdXBwb3J0ZWQKLXRocm91Z2ggdGhlIHVzZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9uczogdHlwZSBhdCB0aGUgImJvb3Q6IiBwcm9tcHQ6Ci0gIGxpbnV4IHNqY2Q9PGJhc2VfYWRkcmVzcz4KLSh3aGVyZSB5b3Ugd291bGQgdXNlIHRoZSBrZXJuZWwgbGFiZWxlZCAibGludXgiIGluIGxpbG8ncyBjb25maWd1cmF0aW9uCi1maWxlIC9ldGMvbGlsby5jb25mKS4gWW91IGNvdWxkIGFsc28gdXNlICdhcHBlbmQ9InNqY2Q9PGNvbmZpZ3VyYXRpb25faW5mbz4iJwotaW4gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24gb2YgL2V0Yy9saWxvLmNvbmYKLUlmIHlvdSdyZSBidWlsZGluZyBhIGtlcm5lbCB5b3Vyc2VsZiB5b3UgY2FuIHNldCB5b3VyIGRlZmF1bHQgYmFzZQotaS9vIGFkZHJlc3Mgd2l0aCBTSkNEX0JBU0VfQUREUiBpbiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NqY2QuaC4KLQotVGhlIHNqY2QgZHJpdmVyIHN1cHBvcnRzIGJlaW5nIGxvYWRlZCBhcyBhIG1vZHVsZS4gVGhlIGZvbGxvd2luZwotY29tbWFuZCB3aWxsIHNldCB0aGUgYmFzZSBpL28gYWRkcmVzcyBvbiB0aGUgZmx5IChhc3N1bWluZyB5b3UKLWhhdmUgaW5zdGFsbGVkIHRoZSBtb2R1bGUgaW4gYW4gYXBwcm9wcmlhdGUgcGxhY2UpLgotICBpbnNtb2Qgc2pjZC5vIHNqY2RfYmFzZT08YmFzZV9hZGRyZXNzPgotCi0KLUhhdmUgZnVuIQotCi1JZiBzb21ldGhpbmcgaXMgd3JvbmcsIHBsZWFzZSBlbWFpbCB0bwkJdmFkaW1AcmJyZi5ydQotCQkJCQlvciAJdmFkaW1AaXBzdW4ucmFzLnJ1Ci0JCQkJCW9yCW1vZGVsQGNlY21vdy5lbmV0LmRlYy5jb20KLQkJCQkJb3IJSC5ULk0udi5kLk1hYXJlbEBtYXJpbi5ubAotCi1JdCBoYXBwZW5zIHNvbWV0aW1lcyB0aGF0IFZhZGltIGlzIG5vdCByZWFjaGFibGUgYnkgbWFpbC4gRm9yIHRoZXNlCi1pbnN0YW5jZXMsIEVyaWMgdmFuIGRlciBNYWFyZWwgd2lsbCBoZWxwIHRvby4KLQotCQlWYWRpbSBWLiBNb2RlbCwgRXJpYyB2YW4gZGVyIE1hYXJlbCwgRWJlcmhhcmQgTW9lbmtlYmVyZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zb255Y2Q1MzUgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZTEwOS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0gICAgICAgICAgICAgIFJFQURNRSBGT1IgTElOVVggU09OWSBDRFUtNTM1LzUzMSBEUklWRVIKLSAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGlzIHRoZSBTb255IENEVS01MzUgKGFuZCA1MzEpIGRyaXZlciB2ZXJzaW9uIDAuNyBmb3IgTGludXguCi1JIGRvIG5vdCB0aGluayBJIGhhdmUgdGhlIGRvY3VtZW50YXRpb24gdG8gYWRkIGZlYXR1cmVzIGxpa2UgRE1BIHN1cHBvcnQKLXNvIGlmIGFueW9uZSBlbHNlIHdhbnRzIHRvIHB1cnN1ZSBpdCBvciBoZWxwIG1lIHdpdGggaXQsIHBsZWFzZSBkby4KLShJIG5lZWQgdG8gc2VlIHdoYXQgd2FzIGRvbmUgZm9yIHRoZSBDRFUtMzFBIGRyaXZlciAtLSBwZXJoYXBzIEkgY2FuCi1zdGVhbCBzb21lIG9mIHRoYXQgY29kZS4pCi0KLVRoaXMgaXMgYSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU29ueSBDRFUtNTM1IENEUk9NIGRyaXZlLiAgVGhpcyBpcwotb25lIG9mIHRoZSBvbGRlciBTb255IGRyaXZlcyB3aXRoIGl0cyBvd24gaW50ZXJmYWNlIGNhcmQgKFNvbnkgYnVzKS4KLVRoZSBET1MgZHJpdmVyIGZvciB0aGlzIGRyaXZlIGlzIG5hbWVkIFNPTllfQ0RVLlNZUyAtIHdoZW4geW91IGJvb3QgRE9TCi15b3VyIGRyaXZlIHNob3VsZCBiZSBpZGVudGlmaWVkIGFzIGEgU09OWSBDRFUtNTM1LiAgVGhlIGRyaXZlciB3b3Jrcwotd2l0aCBhIENEVS01MzEgYWxzby4gIE9uZSB1c2VyIHJlcG9ydGVkIHRoYXQgdGhlIGRyaXZlciB3b3JrZWQgb24gZHJpdmVzCi1PRU0nZWQgYnkgUHJvY29tbSwgZHJpdmUgYW5kIGludGVyZmFjZSBib2FyZCB3ZXJlIGxhYmVsbGVkIFByb2NvbW0uCi0KLVRoZSBMaW51eCBkcml2ZXIgaXMgYmFzZWQgb24gQ29yZXkgTWlueWFyZCdzIHNvbnljZCAwLjMgZHJpdmVyIGZvcgotdGhlIENEVS0zMUEuICBSb24gSmVwcGVzZW4ganVzdCBjaGFuZ2VkIHRoZSBjb21tYW5kcyB0aGF0IHdlcmUgc2VudAotdG8gdGhlIGRyaXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIENEVS01MzUgY29tbWFuZHMgYW5kIHJlZ2lzdGVycy4KLVRoZXJlIHdlcmUgZW5vdWdoIGNoYW5nZXMgdG8gbGV0IGJ1Z3MgY3JlZXAgaW4gYnV0IGl0IHNlZW1zIHRvIGJlIHN0YWJsZS4KLVJvbiB3YXMgYWJsZSB0byB0YXIgYW4gZW50aXJlIENEUk9NIChzaG91bGQgcmVhZCBhbGwgYmxvY2tzKSBhbmQgYnVpbHQKLWdob3N0dmlldyBhbmQgeGZpZyBvZmYgV2FsbnV0IENyZWVrJ3MgWDExUjUvR05VIENEUk9NLiAgeGNkcGxheWVyIGFuZAotd29ya21hbiB3b3JrIHdpdGggdGhlIGRyaXZlci4gIE90aGVycyBoYXZlIHVzZWQgdGhlIGRyaXZlciB3aXRob3V0Ci1wcm9ibGVtcyBleGNlcHQgdGhvc2UgZGVhbGluZyB3aXRoIHdhaXQgbG9vcHMgKGZpeGVkIGluIHRoaXJkIHJlbGVhc2UpLgotTGlrZSBNaW55YXJkJ3Mgb3JpZ2luYWwgZHJpdmVyIHRoaXMgb25lIHVzZXMgYSBwb2xsZWQgaW50ZXJmYWNlICh0aGlzCi1pcyBhbHNvIHRoZSBkZWZhdWx0IHNldHVwIGZvciB0aGUgRE9TIGRyaXZlcikuICBJdCBoYXMgbm90IGJlZW4gdHJpZWQKLXdpdGggaW50ZXJydXB0cyBvciBETUEgZW5hYmxlZCBvbiB0aGUgYm9hcmQuCi0KLVJFUVVJUkVNRU5UUwotPT09PT09PT09PT09Ci0KLQktIFNvbnkgQ0RVLTUzNSBkcml2ZSwgcHJlZmVyYWJseSB3aXRob3V0IGludGVycnVwdHMgYW5kIERNQSAKLQkgIGVuYWJsZWQgb24gdGhlIGNhcmQuCi0KLQktIERyaXZlIG11c3QgYmUgc2V0IHVwIGFzIHVuaXQgMS4gIE9ubHkgdGhlIGZpcnN0IHVuaXQgd2lsbCBiZSAKLQkgIHJlY29nbml6ZWQKLQotCS0gWW91IG11c3QgZW50ZXIgeW91ciBpbnRlcmZhY2UgYWRkcmVzcyBpbnRvIAotICAgICAgICAgIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmggYW5kIGJ1aWxkIHRoZQotICAgICAgICAgIGFwcHJvcHJpYXRlIGtlcm5lbCBvciB1c2UgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICBzb255Y2Q1MzU9MHgzMjAKLSAgICAgICAgICB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSBhZGRyZXNzLgotCi1OT1RFUzoKLT09PT09PQotCi0xKSBUaGUgZHJpdmUgTVVTVCBiZSB0dXJuZWQgb24gd2hlbiBib290aW5nIG9yIGl0IHdpbGwgbm90IGJlIHJlY29nbml6ZWQhCi0gICAoYnV0IHNlZSBjb21tZW50cyBvbiBtb2R1bGFyaXplZCB2ZXJzaW9uIGJlbG93KQotCi0yKSB3aGVuIHRoZSBjZHJvbSBkZXZpY2UgaXMgb3BlbmVkIHRoZSBlamVjdCBidXR0b24gaXMgZGlzYWJsZWQgdG8ga2VlcCB0aGUKLSAgIHVzZXIgZnJvbSBlamVjdGluZyBhIG1vdW50ZWQgZGlzayBhbmQgcmVwbGFjaW5nIGl0IHdpdGggYW5vdGhlci4KLSAgIFVuZm9ydHVuYXRlbHkgeGNkcGxheWVyIGFuZCB3b3JrbWFuIGFsc28gb3BlbiB0aGUgY2Ryb20gZGV2aWNlIHNvIHlvdQotICAgaGF2ZSB0byB1c2UgdGhlIGVqZWN0IGJ1dHRvbiBpbiB0aGUgc29mdHdhcmUuICBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3VyCi0gICBjZHJvbSBwbGF5ZXIgcmVmdXNlcyB0byBnaXZlIHVwIGl0cyBkaXNrIC0tIGV4aXQgd29ya21hbiBvciB4Y2RwbGF5ZXIsIG9yCi0gICB1bW91bnQgdGhlIGRyaXZlIGlmIGl0IGhhcyBiZWVuIG1vdW50ZWQuCi0KLVRIQU5LUwotPT09PT09Ci0KLU1hbnkgdGhhbmtzIHRvIFJvbiBKZXBwZXNlbiAocm9uai5hbkBzaXRlMDA3LnNhaWMuY29tKSBmb3IgZ2V0dGluZwotdGhpcyBwcm9qZWN0IG9mZiB0aGUgZ3JvdW5kLiAgSGUgd3JvdGUgdGhlIGluaXRpYWwgcmVsZWFzZQotYW5kIHRoZSBmaXJzdCB0d28gcGF0Y2hlcyB0byB0aGlzIGRyaXZlciAoMC4xLCAwLjIsIGFuZCAwLjMpLgotVGhhbmtzIGFsc28gdG8gRWJlcmhhcmQgTW9lbmtlYmVyZyAoZW1vZW5rZUBnd2RnLmRlKSBmb3IgcHJvZGRpbmcKLW1lIHRvIHBsYWNlIHRoaXMgY29kZSBpbnRvIHRoZSBtYWluc3RyZWFtIExpbnV4IHNvdXJjZSB0cmVlCi0oYXMgb2YgTGludXggdmVyc2lvbiAxLjEuOTEpLCBhcyB3ZWxsIGFzIHNvbWUgcGF0Y2hlcyB0byBtYWtlCi1pdCBhIGJldHRlciBkZXZpY2UgY2l0aXplbi4gIEZ1cnRoZXIgdGhhbmtzIHRvIEpvZWwgS2F0egotPGpvZWxrYXR6QHdlYmNoYXQub3JnPiBmb3IgaGlzIE1PRFVMRSBwYXRjaGVzIChzZWUgZGV0YWlscyBiZWxvdyksCi1Qb3JmaXJpIENsYXVkaW8gPEMuUG9yZmlyaUBuaXNtcy50ZWkuZXJpY3Nzb24uc2U+IGZvciBwYXRjaGVzCi10byBtYWtlIHRoZSBkcml2ZXIgd29yayB3aXRoIHRoZSBvbGRlciBDRFUtNTEwLzUxNSBzZXJpZXMsIGFuZAotSGVpa28gRWlzc2ZlbGR0IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+IGZvciBwb2ludGluZyBvdXQgdGhhdAotdGhlIHZlcmlmeV9hcmVhKCkgY2hlY2tzIHdlcmUgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2Ygc2FpZCBjaGVja3MKLShub3RlOiB2ZXJpZnlfYXJlYSgpIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KLQotKEFja25vd2xlZGdtZW50cyBmcm9tIFJvbiBKZXBwZXNlbiBpbiB0aGUgMC4zIHJlbGVhc2U6KQotVGhhbmtzIHRvIENvcmV5IE1pbnlhcmQgd2hvIHdyb3RlIHRoZSBvcmlnaW5hbCBDRFUtMzFBIGRyaXZlciBvbiB3aGljaAotdGhpcyBkcml2ZXIgaXMgYmFzZWQuICBUaGFua3MgdG8gS2VuIFBpenppbmkgYW5kIEJvYiBCbGFpciB3aG8gcHJvdmlkZWQgCi1wYXRjaGVzIGFuZCBmZWVkYmFjayBvbiB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGlzIGRyaXZlci4KLQotS2VuIFBpenppbmkKLWtlbkBoYWxjeW9uLmNvbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShUaGUgZm9sbG93aW5nIGlzIGZyb20gSm9lbCBLYXR6IDxqb2Vsa2F0ekB3ZWJjaGF0Lm9yZz4uKQotCi0JVG8gYnVpbGQgYSB2ZXJzaW9uIG9mIHNvbnk1MzUubyB0aGF0IGNhbiBiZSBpbnN0YWxsZWQgYXMgYSBtb2R1bGUsCi11c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi1nY2MgLWMgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1PMiBzb255Y2Q1MzUuYyAtbyBzb255Y2Q1MzUubwotCi0JVG8gaW5zdGFsbCB0aGUgbW9kdWxlLCBzaW1wbHkgdHlwZToKLQotaW5zbW9kIHNvbnk1MzUubwotCW9yCi1pbnNtb2Qgc29ueTUzNS5vIHNvbnljZDUzNT08YWRkcmVzcz4KLQotCUFuZCB0byByZW1vdmUgaXQ6Ci0KLXJtbW9kIHNvbnk1MzUKLQotCVRoZSBjb2RlIGNoZWNrcyB0byBzZWUgaWYgTU9EVUxFIGlzIGRlZmluZWQgYW5kIGJlaGF2ZXMgYXMgaXQgdXNlZAotdG8gaWYgTU9EVUxFIGlzIG5vdCBkZWZpbmVkLiBUaGF0IG1lYW5zIHlvdXIgcGF0Y2hlZCBmaWxlIHNob3VsZCBiZWhhdmUKLWV4YWN0bHkgYXMgaXQgdXNlZCB0byBpZiBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuCi0KLQlJIGhhdmUgYW4gZXh0ZXJuYWwgZHJpdmUsIGFuZCBJIHVzdWFsbHkgbGVhdmUgaXQgcG93ZXJlZCBvZmYuIEkgdXNlZAotdG8gaGF2ZSB0byByZWJvb3QgaWYgSSBuZWVkZWQgdG8gdXNlIHRoZSBDRFJPTSBkcml2ZS4gTm93IEkgZG9uJ3QuCi0KLQlFdmVuIGlmIHlvdSBoYXZlIGFuIGludGVybmFsIGRyaXZlLCB3aHkgd2FzdGUgdGhlIDk2SyBvZiBtZW1vcnkKLSh1bnN3YXBwYWJsZSkgdGhhdCB0aGUgZHJpdmVyIHVzZXMgaWYgeW91IHVzZSB5b3VyIENELVJPTSBkcml2ZSBpbmZyZXF1ZW50bHk/Ci0KLQlUaGlzIGRyaXZlciB3aWxsIG5vdCBpbnN0YWxsICh3aGV0aGVyIGNvbXBpbGVkIGluIG9yIGxvYWRlZCBhcyBhCi1tb2R1bGUpIGlmIHRoZSBDRFJPTSBkcml2ZSBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24uIFRoaXMKLW1lYW5zIHRoYXQgeW91IGNhbiBoYXZlIHRoZSBkcml2ZXIgY29tcGlsZWQgaW50byB0aGUga2VybmVsIGFuZCBzdGlsbCBsb2FkCi10aGUgbW9kdWxlIGxhdGVyIChhc3N1bWluZyB0aGUgZHJpdmVyIGRvZXNuJ3QgaW5zdGFsbCBpdHNlbGYgZHVyaW5nCi1wb3dlci1vbikuIFRoaXMgb25seSB3YXN0ZXMgMTJLIHdoZW4geW91IGJvb3Qgd2l0aCB0aGUgQ0RST00gZHJpdmUgb2ZmLgotCi0JVGhpcyBpcyB3aGF0IEkgdXN1YWxseSBkbzsgSSBsZWF2ZSB0aGUgZHJpdmVyIGNvbXBpbGVkIGludG8gdGhlCi1rZXJuZWwsIGJ1dCBsb2FkIGl0IGFzIGEgbW9kdWxlIGlmIEkgcG93ZXJlZCB0aGUgc3lzdGVtIHVwIHdpdGggdGhlIGRyaXZlCi1vZmYgYW5kIHRoZW4gbGF0ZXIgZGVjaWRlZCB0byB1c2UgdGhlIENEUk9NIGRyaXZlLgotCi0JU2luY2UgdGhlIGRyaXZlciBvbmx5IHVzZXMgYSBzaW5nbGUgcGFnZSB0byBwb2ludCB0byB0aGUgY2h1bmtzLAotYXR0ZW1wdGluZyB0byBzZXQgdGhlIGJ1ZmZlciBjYWNoZSB0byBtb3JlIHRoYW4gMiBNZWdhYnl0ZXMgd291bGQgYmUgdmVyeQotYmFkOyBkb24ndCBkbyB0aGF0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxjbWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc3YWIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZWNobyAxID4gL3Byb2Mvc2VsZi9tYWtlLWl0LWZhaWwKLWV4ZWMgJCoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2ggYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsbW9kdWxlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRhOGI5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBVc2FnZTogZmFpbG1vZHVsZSA8ZmFpbG5hbWU+IDxtb2R1bGVuYW1lPiBbc3RhY2t0cmFjZS1kZXB0aF0KLSMKLSMJPGZhaWxuYW1lPjogImZhaWxzbGFiIiwgImZhaWxfYWxsb2NfcGFnZSIsIG9yICJmYWlsX21ha2VfcmVxdWVzdCIKLSMKLSMJPG1vZHVsZW5hbWU+OiBtb2R1bGUgbmFtZSB0aGF0IHlvdSB3YW50IHRvIGluamVjdCBmYXVsdHMuCi0jCi0jCVtzdGFja3RyYWNlLWRlcHRoXTogdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrdHJhY2Ugd2Fsa2luZyBhbGxvd2VkCi0jCi0KLVNUQUNLVFJBQ0VfREVQVEg9NQotaWYgWyAkIyAtZ3QgMiBdOyB0aGVuCi0JU1RBQ0tUUkFDRV9ERVBUSD0kMwotZmkKLQotaWYgWyAhIC1kIC9kZWJ1Zy8kMSBdOyB0aGVuCi0JZWNobyAiRmF1bHQtaW5qZWN0aW9uICQxIGRvZXMgbm90IGV4aXN0IiA+JjIKLQlleGl0IDEKLWZpCi1pZiBbICEgLWQgL3N5cy9tb2R1bGUvJDIgXTsgdGhlbgotCWVjaG8gIk1vZHVsZSAkMiBkb2VzIG5vdCBleGlzdCIgPiYyCi0JZXhpdCAxCi1maQotCi0jIERpc2FibGUgYW55IGZhdWx0IGluamVjdGlvbgotZWNobyAwID4gL2RlYnVnLyQxL3N0YWNrdHJhY2UtZGVwdGgKLQotZWNobyBgY2F0IC9zeXMvbW9kdWxlLyQyL3NlY3Rpb25zLy50ZXh0YCA+IC9kZWJ1Zy8kMS9yZXF1aXJlLXN0YXJ0Ci1lY2hvIGBjYXQgL3N5cy9tb2R1bGUvJDIvc2VjdGlvbnMvLmV4aXQudGV4dGAgPiAvZGVidWcvJDEvcmVxdWlyZS1lbmQKLWVjaG8gJFNUQUNLVFJBQ0VfREVQVEggPiAvZGVidWcvJDEvc3RhY2t0cmFjZS1kZXB0aApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKaW5kZXggYjdjYTU2MC4uNGJjMzc0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CkBAIC0xMDMsNiArMTAzLDExIEBACiAJZGVmYXVsdCBpcyAnTicsIHNldHRpbmcgaXQgdG8gJ1knIHdpbGwgaW5qZWN0IGZhaWx1cmVzCiAJb25seSBpbnRvIG5vbi1zbGVlcCBhbGxvY2F0aW9ucyAoR0ZQX0FUT01JQyBhbGxvY2F0aW9ucykuCiAKKy0gL2RlYnVnL2ZhaWxfcGFnZV9hbGxvYy9taW4tb3JkZXI6CisKKwlzcGVjaWZpZXMgdGhlIG1pbmltdW0gcGFnZSBhbGxvY2F0aW9uIG9yZGVyIHRvIGJlIGluamVjdGVkCisJZmFpbHVyZXMuCisKIG8gQm9vdCBvcHRpb24KIAogSW4gb3JkZXIgdG8gaW5qZWN0IGZhdWx0cyB3aGlsZSBkZWJ1Z2ZzIGlzIG5vdCBhdmFpbGFibGUgKGVhcmx5IGJvb3QgdGltZSksCkBAIC0xNTYsNzAgKzE2MSw3NyBAQAogQXBwbGljYXRpb24gRXhhbXBsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW8gaW5qZWN0IHNsYWIgYWxsb2NhdGlvbiBmYWlsdXJlcyBpbnRvIG1vZHVsZSBpbml0L2NsZWFudXAgY29kZQorbyBJbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIGludG8gbW9kdWxlIGluaXQvZXhpdCBjb2RlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyEvYmluL2Jhc2gKIAotRkFJTENNRD1Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsY21kLnNoCi1CTEFDS0xJU1Q9InJvb3RfcGx1ZyBldmJ1ZyIKK0ZBSUxUWVBFPWZhaWxzbGFiCitlY2hvIFkgPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAogCi1GQUlMTkFNRT1mYWlsc2xhYgotZWNobyBZID4gL2RlYnVnLyRGQUlMTkFNRS90YXNrLWZpbHRlcgotZWNobyAxMCA+IC9kZWJ1Zy8kRkFJTE5BTUUvcHJvYmFiaWxpdHkKLWVjaG8gMTAwID4gL2RlYnVnLyRGQUlMTkFNRS9pbnRlcnZhbAotZWNobyAtMSA+IC9kZWJ1Zy8kRkFJTE5BTUUvdGltZXMKLWVjaG8gMiA+IC9kZWJ1Zy8kRkFJTE5BTUUvdmVyYm9zZQotZWNobyAxID4gL2RlYnVnLyRGQUlMTkFNRS9pZ25vcmUtZ2ZwLXdhaXQKLQotYmxhY2tsaXN0KCkKK2ZhdWx0eV9zeXN0ZW0oKQogewotCWVjaG8gJEJMQUNLTElTVCB8IGdyZXAgJDEgPiAvZGV2L251bGwgMj4mMQorCWJhc2ggLWMgImVjaG8gMSA+IC9wcm9jL3NlbGYvbWFrZS1pdC1mYWlsICYmIGV4ZWMgJCoiCiB9CiAKLW9vcHMoKQotewotCWRtZXNnIHwgZ3JlcCBCVUcgPiAvZGV2L251bGwgMj4mMQotfQoraWYgWyAkIyAtZXEgMCBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIG1vZHVsZW5hbWUgWyBtb2R1bGVuYW1lIC4uLiBdIgorCWV4aXQgMQorZmkKIAotZmluZCAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCAtbmFtZSAnKi5rbycgLWV4ZWMgYmFzZW5hbWUge30gLmtvIFw7IHwKLQl3aGlsZSByZWFkIGkKLQlkbwotCQlvb3BzICYmIGV4aXQgMQorZm9yIG0gaW4gJCoKK2RvCisJZWNobyBpbnNlcnRpbmcgJG0uLi4KKwlmYXVsdHlfc3lzdGVtIG1vZHByb2JlICRtCiAKLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyBpbnNlcnRpbmcgJGkuLi4KLQkJCWJhc2ggJEZBSUxDTUQgbW9kcHJvYmUgJGkKLQkJZmkKLQlkb25lCi0KLWxzbW9kIHwgYXdrICd7IGlmICgkMyA9PSAwKSB7IHByaW50ICQxIH0gfScgfAotCXdoaWxlIHJlYWQgaQotCWRvCi0JCW9vcHMgJiYgZXhpdCAxCi0KLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyByZW1vdmluZyAkaS4uLgotCQkJYmFzaCAkRkFJTENNRCBtb2Rwcm9iZSAtciAkaQotCQlmaQotCWRvbmUKKwllY2hvIHJlbW92aW5nICRtLi4uCisJZmF1bHR5X3N5c3RlbSBtb2Rwcm9iZSAtciAkbQorZG9uZQogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotbyBpbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIG9ubHkgZm9yIGEgc3BlY2lmaWMgbW9kdWxlCitvIEluamVjdCBwYWdlIGFsbG9jYXRpb24gZmFpbHVyZXMgb25seSBmb3IgYSBzcGVjaWZpYyBtb2R1bGUKIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIS9iaW4vYmFzaAogCi1GQUlMTU9EPURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKK0ZBSUxUWVBFPWZhaWxfcGFnZV9hbGxvYworbW9kdWxlPSQxCiAKLWVjaG8gaW5qZWN0aW5nIGVycm9ycyBpbnRvIHRoZSBtb2R1bGUgJDEuLi4KK2lmIFsgLXogJG1vZHVsZSBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIDxtb2R1bGVuYW1lPiIKKwlleGl0IDEKK2ZpCiAKLW1vZHByb2JlICQxCi1iYXNoICRGQUlMTU9EIGZhaWxzbGFiICQxIDEwCi1lY2hvIDI1ID4gL2RlYnVnL2ZhaWxzbGFiL3Byb2JhYmlsaXR5Cittb2Rwcm9iZSAkbW9kdWxlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgWyAhIC1kIC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMgXQordGhlbgorCWVjaG8gTW9kdWxlICRtb2R1bGUgaXMgbm90IGxvYWRlZAorCWV4aXQgMQorZmkKKworY2F0IC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMvLnRleHQgPiAvZGVidWcvJEZBSUxUWVBFL3JlcXVpcmUtc3RhcnQKK2NhdCAvc3lzL21vZHVsZS8kbW9kdWxlL3NlY3Rpb25zLy5kYXRhID4gL2RlYnVnLyRGQUlMVFlQRS9yZXF1aXJlLWVuZAorCitlY2hvIE4gPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAorZWNobyAxID4gL2RlYnVnLyRGQUlMVFlQRS9pZ25vcmUtZ2ZwLWhpZ2htZW0KK2VjaG8gMTAgPiAvZGVidWcvJEZBSUxUWVBFL3N0YWNrdHJhY2UtZGVwdGgKKwordHJhcCAiZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eSIgU0lHSU5UIFNJR1RFUk0gRVhJVAorCitlY2hvICJJbmplY3RpbmcgZXJyb3JzIGludG8gdGhlIG1vZHVsZSAkbW9kdWxlLi4uIChpbnRlcnJ1cHQgdG8gc3RvcCkiCitzbGVlcCAxMDAwMDAwCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAwOTJjNjVkLi5kMDVlNjI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC00MSwxNCArNDEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJUkFXIGRyaXZlciAoQ09ORklHX1JBV19EUklWRVIpCi1XaGVuOglEZWNlbWJlciAyMDA1Ci1XaHk6CWRlY2xhcmVkIG9ic29sZXRlIHNpbmNlIGtlcm5lbCAyLjYuMwotCU9fRElSRUNUIGNhbiBiZSB1c2VkIGluc3RlYWQKLVdobzoJQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJb2xkIE5DUjUzQzl4IGRyaXZlcgogV2hlbjoJT2N0b2JlciAyMDA3CiBXaHk6CVJlcGxhY2VkIGJ5IHRoZSBtdWNoIGJldHRlciBlc3Bfc2NzaSBkcml2ZXIuICBBY3R1YWwgbG93LWxldmVsCkBAIC0xMTksMTMgKzExMSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OiAgZHJpdmVycyBkZXBlbmRpbmcgb24gT1NTX09CU09MRVRFX0RSSVZFUgotV2hlbjogIG9wdGlvbnMgaW4gMi42LjIwLCBjb2RlIGluIDIuNi4yMgotV2h5OiAgIE9TUyBkcml2ZXJzIHdpdGggQUxTQSByZXBsYWNlbWVudHMKLVdobzogICBBZHJpYW4gQnVuayA8YnVua0BzdHVzdGEuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglVbnVzZWQgRVhQT1JUX1NZTUJPTC9FWFBPUlRfU1lNQk9MX0dQTCBleHBvcnRzCiAJKHRlbXBvcmFyeSB0cmFuc2l0aW9uIGNvbmZpZyBvcHRpb24gcHJvdmlkZWQgdW50aWwgdGhlbikKIAlUaGUgdHJhbnNpdGlvbiBjb25maWcgb3B0aW9uIHdpbGwgYWxzbyBiZSByZW1vdmVkIGF0IHRoZSBzYW1lIHRpbWUuCkBAIC0yNjQsNiArMjQ5LDE0IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OgkndGltZScga2VybmVsIGJvb3QgcGFyYW1ldGVyCitXaGVuOglKYW51YXJ5IDIwMDgKK1doeToJcmVwbGFjZWQgYnkgJ3ByaW50ay50aW1lPTx2YWx1ZT4nIHNvIHRoYXQgcHJpbnRrIHRpbWVzdGFtcHMgY2FuIGJlCisJZW5hYmxlZCBvciBkaXNhYmxlZCBhcyBuZWVkZWQKK1dobzoJUmFuZHkgRHVubGFwIDxyYW5keS5kdW5sYXBAb3JhY2xlLmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIFdoYXQ6ICBkcml2ZXJzIGRlcGVuZGluZyBvbiBPU1NfT0JTT0xFVEUKIFdoZW46ICBvcHRpb25zIGluIDIuNi4yMywgY29kZSBpbiAyLjYuMjUKIFdoeTogICBvYnNvbGV0ZSBPU1MgZHJpdmVycwpAQCAtMzA0LDMgKzI5NywxNiBAQAogV2hvOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6IFRoZSBhcmNoL3BwYyBhbmQgaW5jbHVkZS9hc20tcHBjIGRpcmVjdG9yaWVzCitXaGVuOiBKdW4gMjAwOAorV2h5OiAgVGhlIGFyY2gvcG93ZXJwYyB0cmVlIGlzIHRoZSBtZXJnZWQgYXJjaGl0ZWN0dXJlIGZvciBwcGMzMiBhbmQgcHBjNjQKKyAgICAgIHBsYXRmb3Jtcy4gIEN1cnJlbnRseSB0aGVyZSBhcmUgZWZmb3J0cyB1bmRlcndheSB0byBwb3J0IHRoZSByZW1haW5pbmcKKyAgICAgIGFyY2gvcHBjIHBsYXRmb3JtcyB0byB0aGUgbWVyZ2VkIHRyZWUuICBOZXcgc3VibWlzc2lvbnMgdG8gdGhlIGFyY2gvcHBjCisgICAgICB0cmVlIGhhdmUgYmVlbiBmcm96ZW4gd2l0aCB0aGUgMi42LjIyIGtlcm5lbCByZWxlYXNlIGFuZCB0aGF0IHRyZWUgd2lsbAorICAgICAgcmVtYWluIGluIGJ1Zy1maXggb25seSBtb2RlIHVudGlsIGl0cyBzY2hlZHVsZWQgcmVtb3ZhbC4gIFBsYXRmb3JtcworICAgICAgdGhhdCBhcmUgbm90IHBvcnRlZCBieSBKdW5lIDIwMDggd2lsbCBiZSByZW1vdmVkIGR1ZSB0byB0aGUgbGFjayBvZiBhbgorICAgICAgaW50ZXJlc3RlZCBtYWludGFpbmVyLgorV2hvOiAgbGludXhwcGMtZGV2QG96bGFicy5vcmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CmluZGV4IGIzNGNkYjUuLmQxYjk4MjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CkBAIC0yMzgsNiArMjM4LDggQEAKIAkJc3RydWN0IGNvbmZpZ19ncm91cCAqKCptYWtlX2dyb3VwKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOwogCQlpbnQgKCpjb21taXRfaXRlbSkoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKKwkJdm9pZCAoKmRpc2Nvbm5lY3Rfbm90aWZ5KShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKKwkJCQkJICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogCQl2b2lkICgqZHJvcF9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkgIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CiAJfTsKQEAgLTI2OCw2ICsyNzAsMTYgQEAKIGZvciB0aGUgaXRlbSB0byBhY3R1YWxseSBkaXNhcHBlYXIgZnJvbSB0aGUgc3Vic3lzdGVtJ3MgdXNhZ2UuICBCdXQgaXQKIGlzIGdvbmUgZnJvbSBjb25maWdmcy4KIAorV2hlbiBkcm9wX2l0ZW0oKSBpcyBjYWxsZWQsIHRoZSBpdGVtJ3MgbGlua2FnZSBoYXMgYWxyZWFkeSBiZWVuIHRvcm4KK2Rvd24uICBJdCBubyBsb25nZXIgaGFzIGEgcmVmZXJlbmNlIG9uIGl0cyBwYXJlbnQgYW5kIGhhcyBubyBwbGFjZSBpbgordGhlIGl0ZW0gaGllcmFyY2h5LiAgSWYgYSBjbGllbnQgbmVlZHMgdG8gZG8gc29tZSBjbGVhbnVwIGJlZm9yZSB0aGlzCit0ZWFyZG93biBoYXBwZW5zLCB0aGUgc3Vic3lzdGVtIGNhbiBpbXBsZW1lbnQgdGhlCitjdF9ncm91cF9vcHMtPmRpc2Nvbm5lY3Rfbm90aWZ5KCkgbWV0aG9kLiAgVGhlIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKK2NvbmZpZ2ZzIGhhcyByZW1vdmVkIHRoZSBpdGVtIGZyb20gdGhlIGZpbGVzeXN0ZW0gdmlldyBidXQgYmVmb3JlIHRoZQoraXRlbSBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBncm91cC4gIExpa2UgZHJvcF9pdGVtKCksCitkaXNjb25uZWN0X25vdGlmeSgpIGlzIHZvaWQgYW5kIGNhbm5vdCBmYWlsLiAgQ2xpZW50IHN1YnN5c3RlbXMgc2hvdWxkCitub3QgZHJvcCBhbnkgcmVmZXJlbmNlcyBoZXJlLCBhcyB0aGV5IHN0aWxsIG11c3QgZG8gaXQgaW4gZHJvcF9pdGVtKCkuCisKIEEgY29uZmlnX2dyb3VwIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIGl0IHN0aWxsIGhhcyBjaGlsZCBpdGVtcy4gIFRoaXMKIGlzIGltcGxlbWVudGVkIGluIHRoZSBjb25maWdmcyBybWRpcigyKSBjb2RlLiAgLT5kcm9wX2l0ZW0oKSB3aWxsIG5vdCBiZQogY2FsbGVkLCBhcyB0aGUgaXRlbSBoYXMgbm90IGJlZW4gZHJvcHBlZC4gIHJtZGlyKDIpIHdpbGwgZmFpbCwgYXMgdGhlCkBAIC0yODAsMTggKzI5MiwxOCBAQAogCiAJc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSB7CiAJCXN0cnVjdCBjb25maWdfZ3JvdXAJc3VfZ3JvdXA7Ci0JCXN0cnVjdCBzZW1hcGhvcmUJc3Vfc2VtOworCQlzdHJ1Y3QgbXV0ZXgJCXN1X211dGV4OwogCX07CiAKIAlpbnQgY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiAJdm9pZCBjb25maWdmc191bnJlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogCi0JQSBzdWJzeXN0ZW0gY29uc2lzdHMgb2YgYSB0b3BsZXZlbCBjb25maWdfZ3JvdXAgYW5kIGEgc2VtYXBob3JlLgorCUEgc3Vic3lzdGVtIGNvbnNpc3RzIG9mIGEgdG9wbGV2ZWwgY29uZmlnX2dyb3VwIGFuZCBhIG11dGV4LgogVGhlIGdyb3VwIGlzIHdoZXJlIGNoaWxkIGNvbmZpZ19pdGVtcyBhcmUgY3JlYXRlZC4gIEZvciBhIHN1YnN5c3RlbSwKIHRoaXMgZ3JvdXAgaXMgdXN1YWxseSBkZWZpbmVkIHN0YXRpY2FsbHkuICBCZWZvcmUgY2FsbGluZwogY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCksIHRoZSBzdWJzeXN0ZW0gbXVzdCBoYXZlIGluaXRpYWxpemVkIHRoZQogZ3JvdXAgdmlhIHRoZSB1c3VhbCBncm91cCBfaW5pdCgpIGZ1bmN0aW9ucywgYW5kIGl0IG11c3QgYWxzbyBoYXZlCi1pbml0aWFsaXplZCB0aGUgc2VtYXBob3JlLgoraW5pdGlhbGl6ZWQgdGhlIG11dGV4LgogCVdoZW4gdGhlIHJlZ2lzdGVyIGNhbGwgcmV0dXJucywgdGhlIHN1YnN5c3RlbSBpcyBsaXZlLCBhbmQgaXQKIHdpbGwgYmUgdmlzaWJsZSB2aWEgY29uZmlnZnMuICBBdCB0aGF0IHBvaW50LCBta2RpcigyKSBjYW4gYmUgY2FsbGVkIGFuZAogdGhlIHN1YnN5c3RlbSBtdXN0IGJlIHJlYWR5IGZvciBpdC4KQEAgLTMwMyw3ICszMTUsNyBAQAogc2hvd3MgYSB0cml2aWFsIG9iamVjdCBkaXNwbGF5aW5nIGFuZCBzdG9yaW5nIGFuIGF0dHJpYnV0ZSwgYW5kIGEgc2ltcGxlCiBncm91cCBjcmVhdGluZyBhbmQgZGVzdHJveWluZyB0aGVzZSBjaGlsZHJlbi4KIAotW0hpZXJhcmNoeSBOYXZpZ2F0aW9uIGFuZCB0aGUgU3Vic3lzdGVtIFNlbWFwaG9yZV0KK1tIaWVyYXJjaHkgTmF2aWdhdGlvbiBhbmQgdGhlIFN1YnN5c3RlbSBNdXRleF0KIAogVGhlcmUgaXMgYW4gZXh0cmEgYm9udXMgdGhhdCBjb25maWdmcyBwcm92aWRlcy4gIFRoZSBjb25maWdfZ3JvdXBzIGFuZAogY29uZmlnX2l0ZW1zIGFyZSBhcnJhbmdlZCBpbiBhIGhpZXJhcmNoeSBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGV5CkBAIC0zMTQsMTkgKzMyNiwxOSBAQAogCiBBIHN1YnN5c3RlbSBjYW4gbmF2aWdhdGUgdGhlIGNnX2NoaWxkcmVuIGxpc3QgYW5kIHRoZSBjaV9wYXJlbnQgcG9pbnRlcgogdG8gc2VlIHRoZSB0cmVlIGNyZWF0ZWQgYnkgdGhlIHN1YnN5c3RlbS4gIFRoaXMgY2FuIHJhY2Ugd2l0aCBjb25maWdmcycKLW1hbmFnZW1lbnQgb2YgdGhlIGhpZXJhcmNoeSwgc28gY29uZmlnZnMgdXNlcyB0aGUgc3Vic3lzdGVtIHNlbWFwaG9yZSB0bworbWFuYWdlbWVudCBvZiB0aGUgaGllcmFyY2h5LCBzbyBjb25maWdmcyB1c2VzIHRoZSBzdWJzeXN0ZW0gbXV0ZXggdG8KIHByb3RlY3QgbW9kaWZpY2F0aW9ucy4gIFdoZW5ldmVyIGEgc3Vic3lzdGVtIHdhbnRzIHRvIG5hdmlnYXRlIHRoZQogaGllcmFyY2h5LCBpdCBtdXN0IGRvIHNvIHVuZGVyIHRoZSBwcm90ZWN0aW9uIG9mIHRoZSBzdWJzeXN0ZW0KLXNlbWFwaG9yZS4KK211dGV4LgogCi1BIHN1YnN5c3RlbSB3aWxsIGJlIHByZXZlbnRlZCBmcm9tIGFjcXVpcmluZyB0aGUgc2VtYXBob3JlIHdoaWxlIGEgbmV3bHkKK0Egc3Vic3lzdGVtIHdpbGwgYmUgcHJldmVudGVkIGZyb20gYWNxdWlyaW5nIHRoZSBtdXRleCB3aGlsZSBhIG5ld2x5CiBhbGxvY2F0ZWQgaXRlbSBoYXMgbm90IGJlZW4gbGlua2VkIGludG8gdGhpcyBoaWVyYXJjaHkuICAgU2ltaWxhcmx5LCBpdAotd2lsbCBub3QgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKK3dpbGwgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbXV0ZXggd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKIHlldCBiZWVuIHVubGlua2VkLiAgVGhpcyBtZWFucyB0aGF0IGFuIGl0ZW0ncyBjaV9wYXJlbnQgcG9pbnRlciB3aWxsCiBuZXZlciBiZSBOVUxMIHdoaWxlIHRoZSBpdGVtIGlzIGluIGNvbmZpZ2ZzLCBhbmQgdGhhdCBhbiBpdGVtIHdpbGwgb25seQogYmUgaW4gaXRzIHBhcmVudCdzIGNnX2NoaWxkcmVuIGxpc3QgZm9yIHRoZSBzYW1lIGR1cmF0aW9uLiAgVGhpcyBhbGxvd3MKIGEgc3Vic3lzdGVtIHRvIHRydXN0IGNpX3BhcmVudCBhbmQgY2dfY2hpbGRyZW4gd2hpbGUgdGhleSBob2xkIHRoZQotc2VtYXBob3JlLgorbXV0ZXguCiAKIFtJdGVtIEFnZ3JlZ2F0aW9uIFZpYSBzeW1saW5rKDIpXQogCkBAIC0zODYsNiArMzk4LDMzIEBACiBybWRpcigyKS4gIFRoZXkgYWxzbyBhcmUgbm90IGNvbnNpZGVyZWQgd2hlbiBybWRpcigyKSBvbiB0aGUgcGFyZW50CiBncm91cCBpcyBjaGVja2luZyBmb3IgY2hpbGRyZW4uCiAKK1tEZXBlbmRhbnQgU3Vic3lzdGVtc10KKworU29tZXRpbWVzIG90aGVyIGRyaXZlcnMgZGVwZW5kIG9uIHBhcnRpY3VsYXIgY29uZmlnZnMgaXRlbXMuICBGb3IKK2V4YW1wbGUsIG9jZnMyIG1vdW50cyBkZXBlbmQgb24gYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBJZiB0aGF0CityZWdpb24gaXRlbSBpcyByZW1vdmVkIHdpdGggcm1kaXIoMiksIHRoZSBvY2ZzMiBtb3VudCBtdXN0IEJVRyBvciBnbworcmVhZG9ubHkuICBOb3QgaGFwcHkuCisKK2NvbmZpZ2ZzIHByb3ZpZGVzIHR3byBhZGRpdGlvbmFsIEFQSSBjYWxsczogY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBhbmQKK2NvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oKS4gIEEgY2xpZW50IGRyaXZlciBjYW4gY2FsbAorY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBvbiBhbiBleGlzdGluZyBpdGVtIHRvIHRlbGwgY29uZmlnZnMgdGhhdCBpdCBpcworZGVwZW5kZWQgb24uICBjb25maWdmcyB3aWxsIHRoZW4gcmV0dXJuIC1FQlVTWSBmcm9tIHJtZGlyKDIpIGZvciB0aGF0CitpdGVtLiAgV2hlbiB0aGUgaXRlbSBpcyBubyBsb25nZXIgZGVwZW5kZWQgb24sIHRoZSBjbGllbnQgZHJpdmVyIGNhbGxzCitjb25maWdmc191bmRlcGVuZF9pdGVtKCkgb24gaXQuCisKK1RoZXNlIEFQSSBjYW5ub3QgYmUgY2FsbGVkIHVuZGVybmVhdGggYW55IGNvbmZpZ2ZzIGNhbGxiYWNrcywgYXMKK3RoZXkgd2lsbCBjb25mbGljdC4gIFRoZXkgY2FuIGJsb2NrIGFuZCBhbGxvY2F0ZS4gIEEgY2xpZW50IGRyaXZlcgorcHJvYmFibHkgc2hvdWxkbid0IGNhbGxpbmcgdGhlbSBvZiBpdHMgb3duIGd1bXB0aW9uLiAgUmF0aGVyIGl0IHNob3VsZAorYmUgcHJvdmlkaW5nIGFuIEFQSSB0aGF0IGV4dGVybmFsIHN1YnN5c3RlbXMgY2FsbC4KKworSG93IGRvZXMgdGhpcyB3b3JrPyAgSW1hZ2luZSB0aGUgb2NmczIgbW91bnQgcHJvY2Vzcy4gIFdoZW4gaXQgbW91bnRzLAoraXQgYXNrcyBmb3IgYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBUaGlzIGlzIGRvbmUgdmlhIGEgY2FsbCBpbnRvIHRoZQoraGVhcnRiZWF0IGNvZGUuICBJbnNpZGUgdGhlIGhlYXJ0YmVhdCBjb2RlLCB0aGUgcmVnaW9uIGl0ZW0gaXMgbG9va2VkCit1cC4gIEhlcmUsIHRoZSBoZWFydGJlYXQgY29kZSBjYWxscyBjb25maWdmc19kZXBlbmRfaXRlbSgpLiAgSWYgaXQKK3N1Y2NlZWRzLCB0aGVuIGhlYXJ0YmVhdCBrbm93cyB0aGUgcmVnaW9uIGlzIHNhZmUgdG8gZ2l2ZSB0byBvY2ZzMi4KK0lmIGl0IGZhaWxzLCBpdCB3YXMgYmVpbmcgdG9ybiBkb3duIGFueXdheSwgYW5kIGhlYXJ0YmVhdCBjYW4gZ3JhY2VmdWxseQorcGFzcyB1cCBhbiBlcnJvci4KKwogW0NvbW1pdHRhYmxlIEl0ZW1zXQogCiBOT1RFOiBDb21taXR0YWJsZSBpdGVtcyBhcmUgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2V4YW1wbGUuYyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCmluZGV4IDJkNmExNGEuLmU1NmQ0OTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAkJc3Vic3lzID0gZXhhbXBsZV9zdWJzeXNbaV07CiAKIAkJY29uZmlnX2dyb3VwX2luaXQoJnN1YnN5cy0+c3VfZ3JvdXApOwotCQlpbml0X01VVEVYKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2luaXQoJnN1YnN5cy0+c3VfbXV0ZXgpOwogCQlyZXQgPSBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oc3Vic3lzKTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCB3aGlsZSByZWdpc3RlcmluZyBzdWJzeXN0ZW0gJXNcbiIsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZWNyeXB0ZnMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9lY3J5cHRmcy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDg3NTZhMDcuLmViZmZkZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTcxLDcgKzE3MSw5IEBACiBUaGlzIHNob3dzIHlvdSBuZWFybHkgdGhlIHNhbWUgaW5mb3JtYXRpb24geW91IHdvdWxkIGdldCBpZiB5b3Ugdmlld2VkIGl0IHdpdGgKIHRoZSBwcyAgY29tbWFuZC4gIEluICBmYWN0LCAgcHMgIHVzZXMgIHRoZSAgcHJvYyAgZmlsZSAgc3lzdGVtICB0byAgb2J0YWluIGl0cwogaW5mb3JtYXRpb24uIFRoZSAgc3RhdG0gIGZpbGUgIGNvbnRhaW5zICBtb3JlICBkZXRhaWxlZCAgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1wcm9jZXNzIG1lbW9yeSB1c2FnZS4gSXRzIHNldmVuIGZpZWxkcyBhcmUgZXhwbGFpbmVkIGluIFRhYmxlIDEtMi4KK3Byb2Nlc3MgbWVtb3J5IHVzYWdlLiBJdHMgc2V2ZW4gZmllbGRzIGFyZSBleHBsYWluZWQgaW4gVGFibGUgMS0yLiAgVGhlIHN0YXQKK2ZpbGUgY29udGFpbnMgZGV0YWlscyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvY2VzcyBpdHNlbGYuICBJdHMgZmllbGRzIGFyZQorZXhwbGFpbmVkIGluIFRhYmxlIDEtMy4KIAogCiBUYWJsZSAxLTI6IENvbnRlbnRzIG9mIHRoZSBzdGF0bSBmaWxlcyAoYXMgb2YgMi42LjgtcmMzKQpAQCAtMTg4LDE2ICsxOTAsNjUgQEAKICBkdCAgICAgICBudW1iZXIgb2YgZGlydHkgcGFnZXMJCQkoYWx3YXlzIDAgb24gMi42KQogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKKworVGFibGUgMS0zOiBDb250ZW50cyBvZiB0aGUgc3RhdCBmaWxlcyAoYXMgb2YgMi42LjIyLXJjMykKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIEZpZWxkICAgICAgICAgIENvbnRlbnQKKyAgcGlkICAgICAgICAgICBwcm9jZXNzIGlkCisgIHRjb21tICAgICAgICAgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUKKyAgc3RhdGUgICAgICAgICBzdGF0ZSAoUiBpcyBydW5uaW5nLCBTIGlzIHNsZWVwaW5nLCBEIGlzIHNsZWVwaW5nIGluIGFuCisgICAgICAgICAgICAgICAgdW5pbnRlcnJ1cHRpYmxlIHdhaXQsIFogaXMgem9tYmllLCBUIGlzIHRyYWNlZCBvciBzdG9wcGVkKQorICBwcGlkICAgICAgICAgIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBwcm9jZXNzCisgIHBncnAgICAgICAgICAgcGdycCBvZiB0aGUgcHJvY2VzcworICBzaWQgICAgICAgICAgIHNlc3Npb24gaWQKKyAgdHR5X25yICAgICAgICB0dHkgdGhlIHByb2Nlc3MgdXNlcworICB0dHlfcGdycCAgICAgIHBncnAgb2YgdGhlIHR0eQorICBmbGFncyAgICAgICAgIHRhc2sgZmxhZ3MKKyAgbWluX2ZsdCAgICAgICBudW1iZXIgb2YgbWlub3IgZmF1bHRzCisgIGNtaW5fZmx0ICAgICAgbnVtYmVyIG9mIG1pbm9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgbWFqX2ZsdCAgICAgICBudW1iZXIgb2YgbWFqb3IgZmF1bHRzCisgIGNtYWpfZmx0ICAgICAgbnVtYmVyIG9mIG1ham9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgdXRpbWUgICAgICAgICB1c2VyIG1vZGUgamlmZmllcworICBzdGltZSAgICAgICAgIGtlcm5lbCBtb2RlIGppZmZpZXMKKyAgY3V0aW1lICAgICAgICB1c2VyIG1vZGUgamlmZmllcyB3aXRoIGNoaWxkJ3MKKyAgY3N0aW1lICAgICAgICBrZXJuZWwgbW9kZSBqaWZmaWVzIHdpdGggY2hpbGQncworICBwcmlvcml0eSAgICAgIHByaW9yaXR5IGxldmVsCisgIG5pY2UgICAgICAgICAgbmljZSBsZXZlbAorICBudW1fdGhyZWFkcyAgIG51bWJlciBvZiB0aHJlYWRzCisgIHN0YXJ0X3RpbWUgICAgdGltZSB0aGUgcHJvY2VzcyBzdGFydGVkIGFmdGVyIHN5c3RlbSBib290CisgIHZzaXplICAgICAgICAgdmlydHVhbCBtZW1vcnkgc2l6ZQorICByc3MgICAgICAgICAgIHJlc2lkZW50IHNldCBtZW1vcnkgc2l6ZQorICByc3NsaW0gICAgICAgIGN1cnJlbnQgbGltaXQgaW4gYnl0ZXMgb24gdGhlIHJzcworICBzdGFydF9jb2RlICAgIGFkZHJlc3MgYWJvdmUgd2hpY2ggcHJvZ3JhbSB0ZXh0IGNhbiBydW4KKyAgZW5kX2NvZGUgICAgICBhZGRyZXNzIGJlbG93IHdoaWNoIHByb2dyYW0gdGV4dCBjYW4gcnVuCisgIHN0YXJ0X3N0YWNrICAgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrCisgIGVzcCAgICAgICAgICAgY3VycmVudCB2YWx1ZSBvZiBFU1AKKyAgZWlwICAgICAgICAgICBjdXJyZW50IHZhbHVlIG9mIEVJUAorICBwZW5kaW5nICAgICAgIGJpdG1hcCBvZiBwZW5kaW5nIHNpZ25hbHMgKG9ic29sZXRlKQorICBibG9ja2VkICAgICAgIGJpdG1hcCBvZiBibG9ja2VkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdpZ24gICAgICAgIGJpdG1hcCBvZiBpZ25vcmVkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdjYXRjaCAgICAgIGJpdG1hcCBvZiBjYXRjaGVkIHNpZ25hbHMgKG9ic29sZXRlKQorICB3Y2hhbiAgICAgICAgIGFkZHJlc3Mgd2hlcmUgcHJvY2VzcyB3ZW50IHRvIHNsZWVwCisgIDAgICAgICAgICAgICAgKHBsYWNlIGhvbGRlcikKKyAgMCAgICAgICAgICAgICAocGxhY2UgaG9sZGVyKQorICBleGl0X3NpZ25hbCAgIHNpZ25hbCB0byBzZW5kIHRvIHBhcmVudCB0aHJlYWQgb24gZXhpdAorICB0YXNrX2NwdSAgICAgIHdoaWNoIENQVSB0aGUgdGFzayBpcyBzY2hlZHVsZWQgb24KKyAgcnRfcHJpb3JpdHkgICByZWFsdGltZSBwcmlvcml0eQorICBwb2xpY3kgICAgICAgIHNjaGVkdWxpbmcgcG9saWN5IChtYW4gc2NoZWRfc2V0c2NoZWR1bGVyKQorICBibGtpb190aWNrcyAgIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgYmxvY2sgSU8KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisKIDEuMiBLZXJuZWwgZGF0YQogLS0tLS0tLS0tLS0tLS0tCiAKIFNpbWlsYXIgdG8gIHRoZSAgcHJvY2VzcyBlbnRyaWVzLCB0aGUga2VybmVsIGRhdGEgZmlsZXMgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dAogdGhlIHJ1bm5pbmcga2VybmVsLiBUaGUgZmlsZXMgdXNlZCB0byBvYnRhaW4gdGhpcyBpbmZvcm1hdGlvbiBhcmUgY29udGFpbmVkIGluCi0vcHJvYyBhbmQgIGFyZSAgbGlzdGVkICBpbiBUYWJsZSAxLTMuIE5vdCBhbGwgb2YgdGhlc2Ugd2lsbCBiZSBwcmVzZW50IGluIHlvdXIKKy9wcm9jIGFuZCAgYXJlICBsaXN0ZWQgIGluIFRhYmxlIDEtNC4gTm90IGFsbCBvZiB0aGVzZSB3aWxsIGJlIHByZXNlbnQgaW4geW91cgogc3lzdGVtLiBJdCAgZGVwZW5kcyAgb24gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGFuZCB0aGUgbG9hZGVkIG1vZHVsZXMsIHdoaWNoCiBmaWxlcyBhcmUgdGhlcmUsIGFuZCB3aGljaCBhcmUgbWlzc2luZy4KIAotVGFibGUgMS0zOiBLZXJuZWwgaW5mbyBpbiAvcHJvYyAKK1RhYmxlIDEtNDogS2VybmVsIGluZm8gaW4gL3Byb2MKIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIEZpbGUgICAgICAgIENvbnRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgYXBtICAgICAgICAgQWR2YW5jZWQgcG93ZXIgbWFuYWdlbWVudCBpbmZvICAgICAgICAgICAgICAgICAgICAKQEAgLTQ3MywxMCArNTI0LDEwIEBACiAKIE1vcmUgZGV0YWlsZWQgIGluZm9ybWF0aW9uICBjYW4gIGJlICBmb3VuZCAgaW4gIHRoZSAgY29udHJvbGxlciAgc3BlY2lmaWMKIHN1YmRpcmVjdG9yaWVzLiBUaGVzZSAgYXJlICBuYW1lZCAgaWRlMCwgIGlkZTEgIGFuZCAgc28gIG9uLiAgRWFjaCAgb2YgIHRoZXNlCi1kaXJlY3RvcmllcyBjb250YWlucyB0aGUgZmlsZXMgc2hvd24gaW4gdGFibGUgMS00LgorZGlyZWN0b3JpZXMgY29udGFpbnMgdGhlIGZpbGVzIHNob3duIGluIHRhYmxlIDEtNS4KIAogCi1UYWJsZSAxLTQ6IElERSBjb250cm9sbGVyIGluZm8gaW4gIC9wcm9jL2lkZS9pZGU/IAorVGFibGUgMS01OiBJREUgY29udHJvbGxlciBpbmZvIGluICAvcHJvYy9pZGUvaWRlPwogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2hhbm5lbCBJREUgY2hhbm5lbCAoMCBvciAxKSAgICAgICAgICAgICAgICAgICAgCkBAIC00ODYsMTEgKzUzNywxMSBAQAogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKIEVhY2ggZGV2aWNlICBjb25uZWN0ZWQgIHRvICBhICBjb250cm9sbGVyICBoYXMgIGEgc2VwYXJhdGUgc3ViZGlyZWN0b3J5IGluIHRoZQotY29udHJvbGxlcnMgZGlyZWN0b3J5LiAgVGhlICBmaWxlcyAgbGlzdGVkIGluIHRhYmxlIDEtNSBhcmUgY29udGFpbmVkIGluIHRoZXNlCitjb250cm9sbGVycyBkaXJlY3RvcnkuICBUaGUgIGZpbGVzICBsaXN0ZWQgaW4gdGFibGUgMS02IGFyZSBjb250YWluZWQgaW4gdGhlc2UKIGRpcmVjdG9yaWVzLgogCiAKLVRhYmxlIDEtNTogSURFIGRldmljZSBpbmZvcm1hdGlvbiAKK1RhYmxlIDEtNjogSURFIGRldmljZSBpbmZvcm1hdGlvbgogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2FjaGUgICAgICAgICAgICBUaGUgY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xMjk3LDYgKzEzNDgsMjEgQEAKIGh1Z2V0bGJfc2htX2dyb3VwIGNvbnRhaW5zIGdyb3VwIGlkIHRoYXQgaXMgYWxsb3dlZCB0byBjcmVhdGUgU3lzViBzaGFyZWQKIG1lbW9yeSBzZWdtZW50IHVzaW5nIGh1Z2V0bGIgcGFnZS4KIAoraHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZnVsIHdoZW4ga2VybmVsY29yZT0gaXMgc3BlY2lmaWVkIGF0IGJvb3QgdGltZSB0bworY3JlYXRlIFpPTkVfTU9WQUJMRSBmb3IgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1pZ3JhdGVkLiBIdWdlIHBhZ2VzCithcmUgbm90IG1vdmFibGUgc28gYXJlIG5vdCBub3JtYWxseSBhbGxvY2F0ZWQgZnJvbSBaT05FX01PVkFCTEUuIEEgbm9uLXplcm8KK3ZhbHVlIHdyaXR0ZW4gdG8gaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUgYWxsb3dzIGh1Z2UgcGFnZXMgdG8gYmUgYWxsb2NhdGVkCitmcm9tIFpPTkVfTU9WQUJMRS4KKworT25jZSBlbmFibGVkLCB0aGUgWk9ORV9NT1ZBQkxFIGlzIHRyZWF0ZWQgYXMgYW4gYXJlYSBvZiBtZW1vcnkgdGhlIGh1Z2UKK3BhZ2VzIHBvb2wgY2FuIGVhc2lseSBncm93IG9yIHNocmluayB3aXRoaW4uIEFzc3VtaW5nIHRoYXQgYXBwbGljYXRpb25zIGFyZQorbm90IHJ1bm5pbmcgdGhhdCBtbG9jaygpIGEgbG90IG9mIG1lbW9yeSwgaXQgaXMgbGlrZWx5IHRoZSBodWdlIHBhZ2VzIHBvb2wKK2NhbiBncm93IHRvIHRoZSBzaXplIG9mIFpPTkVfTU9WQUJMRSBieSByZXBlYXRlZGx5IGVudGVyaW5nIHRoZSBkZXNpcmVkIHZhbHVlCitpbnRvIG5yX2h1Z2VwYWdlcyBhbmQgdHJpZ2dlcmluZyBwYWdlIHJlY2xhaW0uCisKIGxhcHRvcF9tb2RlCiAtLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKaW5kZXggYTQ3Y2M4MS4uMDQ1ZjNlMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dApAQCAtMyw3ICszLDcgQEAKIAogCU9yaWdpbmFsIGF1dGhvcjogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAKLQkJICBMYXN0IHVwZGF0ZWQgb24gT2N0b2JlciAyOCwgMjAwNQorCQkgIExhc3QgdXBkYXRlZCBvbiBKdW5lIDI0LCAyMDA3LgogCiAgIENvcHlyaWdodCAoQykgMTk5OSBSaWNoYXJkIEdvb2NoCiAgIENvcHlyaWdodCAoQykgMjAwNSBQZWtrYSBFbmJlcmcKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZGVzY3JpYmVzIHRoZSBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nCitUaGlzIGRlc2NyaWJlcyB0aGUgZmlsZXN5c3RlbS4gQXMgb2Yga2VybmVsIDIuNi4yMiwgdGhlIGZvbGxvd2luZwogbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewpAQCAtMTE5LDYgKzExOSw4IEBACiAgICAgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyOwogICAgICAgICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqIG5leHQ7CiAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZnNfc3VwZXJzOworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX2xvY2tfa2V5OworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX3Vtb3VudF9rZXk7CiB9OwogCiAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGUsIHN1Y2ggYXMgImV4dDIiLCAiaXNvOTY2MCIsCkBAIC0xMzcsMTEgKzEzOSwxMiBAQAogCiAgIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpemUgdGhpcyB0byBOVUxMCiAKKyAgc19sb2NrX2tleSwgc191bW91bnRfa2V5OiBsb2NrZGVwLXNwZWNpZmljCisKIFRoZSBnZXRfc2IoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogCi0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2I6IHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4gVGhpcyBpcyBwYXJ0aWFsbHkKLQlpbml0aWFsaXplZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IHRoZQotCWdldF9zYigpIG1ldGhvZAorICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZTogZGVjcmliZXMgdGhlIGZpbGVzeXN0ZW0sIHBhcnRseSBpbml0aWFsaXplZAorICAJYnkgdGhlIHNwZWNpZmljIGZpbGVzeXN0ZW0gY29kZQogCiAgIGludCBmbGFnczogbW91bnQgZmxhZ3MKIApAQCAtMTUwLDEyICsxNTMsMTMgQEAKICAgdm9pZCAqZGF0YTogYXJiaXRyYXJ5IG1vdW50IG9wdGlvbnMsIHVzdWFsbHkgY29tZXMgYXMgYW4gQVNDSUkKIAlzdHJpbmcKIAotICBpbnQgc2lsZW50OiB3aGV0aGVyIG9yIG5vdCB0byBiZSBzaWxlbnQgb24gZXJyb3IKKyAgc3RydWN0IHZmc21vdW50ICptbnQ6IGEgdmZzLWludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbW91bnQgcG9pbnQKIAogVGhlIGdldF9zYigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAotaW4gdGhlIHN1cGVyYmxvY2sgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKLXN1cHBvcnRzLiBPbiBzdWNjZXNzIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgc3VwZXJibG9jayBwb2ludGVyLCBvbgotZmFpbHVyZSBpdCByZXR1cm5zIE5VTEwuCitpbiB0aGUgZGV2X25hbWUgYW5kIGZzX3R5cGUgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKK3N1cHBvcnRzLiBJZiBpdCBzdWNjZWVkcyBpbiBvcGVuaW5nIHRoZSBuYW1lZCBibG9jayBkZXZpY2UsIGl0IGluaXRpYWxpemVzIGEKK3N0cnVjdCBzdXBlcl9ibG9jayBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZXN5c3RlbSBjb250YWluZWQgYnkgdGhlIGJsb2NrIGRldmljZS4KK09uIGZhaWx1cmUgaXQgcmV0dXJucyBhbiBlcnJvci4KIAogVGhlIG1vc3QgaW50ZXJlc3RpbmcgbWVtYmVyIG9mIHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZSB0aGF0IHRoZQogZ2V0X3NiKCkgbWV0aG9kIGZpbGxzIGluIGlzIHRoZSAic19vcCIgZmllbGQuIFRoaXMgaXMgYSBwb2ludGVyIHRvCkBAIC0xOTMsNyArMTk3LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIHRoZSBzdXBlcmJsb2NrIG9mIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgewogICAgICAgICBzdHJ1Y3QgaW5vZGUgKigqYWxsb2NfaW5vZGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMjE2LDggKzIyMCw2IEBACiAgICAgICAgIHZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKICAgICAgICAgdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAotICAgICAgICB2b2lkICgqc3luY19pbm9kZXMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiAgICAgICAgIGludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAogICAgICAgICBzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CkBAIC0zMDAsOSArMzAyLDYgQEAKIAogICB1bW91bnRfYmVnaW46IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgdW5tb3VudGluZyBhIGZpbGVzeXN0ZW0uCiAKLSAgc3luY19pbm9kZXM6IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgd3JpdGluZyBvdXQgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGgKLSAgCWEgc3VwZXJibG9jay4KLQogICBzaG93X29wdGlvbnM6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHNob3cgbW91bnQgb3B0aW9ucyBmb3IgL3Byb2MvPHBpZD4vbW91bnRzLgogCiAgIHF1b3RhX3JlYWQ6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJlYWQgZnJvbSBmaWxlc3lzdGVtIHF1b3RhIGZpbGUuCkBAIC0zMjQsNyArMzIzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIGlub2RlIGluIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgewogCWludCAoKmNyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CkBAIC0zNDgsNiArMzQ3LDcgQEAKIAlzc2l6ZV90ICgqZ2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOwogCXNzaXplX3QgKCpsaXN0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIAlpbnQgKCpyZW1vdmV4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKwl2b2lkICgqdHJ1bmNhdGVfcmFuZ2UpKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QsIGxvZmZfdCk7CiB9OwogCiBBZ2FpbiwgYWxsIG1ldGhvZHMgYXJlIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrcyBiZWluZyBoZWxkLCB1bmxlc3MKQEAgLTQ0NCw2ICs0NDQsOSBAQAogICByZW1vdmV4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmcm9tCiAgIAlhIGZpbGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZW1vdmV4YXR0cigyKSBzeXN0ZW0gY2FsbC4KIAorICB0cnVuY2F0ZV9yYW5nZTogYSBtZXRob2QgcHJvdmlkZWQgYnkgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSB0byB0cnVuY2F0ZSBhCisgIAlyYW5nZSBvZiBibG9ja3MgLCBpLmUuIHB1bmNoIGEgaG9sZSBzb21ld2hlcmUgaW4gYSBmaWxlLgorCiAKIFRoZSBBZGRyZXNzIFNwYWNlIE9iamVjdAogPT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MjIsNyArNTI1LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhpcyBkZXNjcmliZXMgaG93IHRoZSBWRlMgY2FuIG1hbmlwdWxhdGUgbWFwcGluZyBvZiBhIGZpbGUgdG8gcGFnZSBjYWNoZSBpbgoteW91ciBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjE2LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6Cit5b3VyIGZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB7CiAJaW50ICgqd3JpdGVwYWdlKShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwpAQCAtNTQzLDYgKzU0Niw3IEBACiAJCQlpbnQpOwogCS8qIG1pZ3JhdGUgdGhlIGNvbnRlbnRzIG9mIGEgcGFnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCAqLwogCWludCAoKm1pZ3JhdGVwYWdlKSAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CisJaW50ICgqbGF1bmRlcl9wYWdlKSAoc3RydWN0IHBhZ2UgKik7CiB9OwogCiAgIHdyaXRlcGFnZTogY2FsbGVkIGJ5IHRoZSBWTSB0byB3cml0ZSBhIGRpcnR5IHBhZ2UgdG8gYmFja2luZyBzdG9yZS4KQEAgLTY4OSw2ICs2OTMsMTAgQEAKIAl0cmFuc2ZlciBhbnkgcHJpdmF0ZSBkYXRhIGFjcm9zcyBhbmQgdXBkYXRlIGFueSByZWZlcmVuY2VzCiAgICAgICAgIHRoYXQgaXQgaGFzIHRvIHRoZSBwYWdlLgogCisgIGxhdW5kZXJfcGFnZTogQ2FsbGVkIGJlZm9yZSBmcmVlaW5nIGEgcGFnZSAtIGl0IHdyaXRlcyBiYWNrIHRoZSBkaXJ0eSBwYWdlLiBUbworICAJcHJldmVudCByZWRpcnR5aW5nIHRoZSBwYWdlLCBpdCBpcyBrZXB0IGxvY2tlZCBkdXJpbmcgdGhlIHdob2xlCisJb3BlcmF0aW9uLgorCiBUaGUgRmlsZSBPYmplY3QKID09PT09PT09PT09PT09PQogCkBAIC02OTksOSArNzA3LDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIG9wZW4gZmlsZS4gQXMgb2Yga2VybmVsCi0yLjYuMTcsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKKzIuNi4yMiwgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGFyZSBkZWZpbmVkOgogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlsb2ZmX3QgKCpsbHNlZWspIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiAJc3NpemVfdCAoKnJlYWQpIChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIAlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKQEAgLTcyOCwxMCArNzM3LDggQEAKIAlpbnQgKCpjaGVja19mbGFncykoaW50KTsKIAlpbnQgKCpkaXJfbm90aWZ5KShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCWludCAoKmZsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwotCXNzaXplX3QgKCpzcGxpY2Vfd3JpdGUpKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc2l6ZV90LCB1bnNpZ25lZCAKLWludCk7Ci0Jc3NpemVfdCAoKnNwbGljZV9yZWFkKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgIAotaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3dyaXRlKShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHN0cnVjdCBmaWxlICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3JlYWQpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogfTsKIAogQWdhaW4sIGFsbCBtZXRob2RzIGFyZSBjYWxsZWQgd2l0aG91dCBhbnkgbG9ja3MgYmVpbmcgaGVsZCwgdW5sZXNzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dAppbmRleCAyMmIwODE0Li4yMGQzNjhjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKQEAgLTY3LDMgKzY3LDcgQEAKIAogICAgIFRob21hcywgSW5nbwogCitBZGRlZCBmbGFnIHRvIGluZGljYXRlICdkZWZlcnJhYmxlIHRpbWVyJyBpbiAvcHJvYy90aW1lcl9zdGF0cy4gQSBkZWZlcnJhYmxlCit0aW1lciB3aWxsIGFwcGVhciBhcyBmb2xsb3dzCisgIDEwRCwgICAgIDEgc3dhcHBlciAgICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmtfb24gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0CmluZGV4IDNkZTdkMzcuLjVjN2ZiZjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsLW51bWJlci50eHQKQEAgLTY3LDcgKzY3LDcgQEAKIDB4MDAJMDAtMUYJbGludXgvd2F2ZWZyb250LmgJY29uZmxpY3QhCiAweDAyCWFsbAlsaW51eC9mZC5oCiAweDAzCWFsbAlsaW51eC9oZHJlZy5oCi0weDA0CWFsbAlsaW51eC91bXNkb3NfZnMuaAorMHgwNAlEMi1EQwlsaW51eC91bXNkb3NfZnMuaAlEZWFkIHNpbmNlIDIuNi4xMSwgYnV0IGRvbid0IHJldXNlIHRoZXNlLgogMHgwNglhbGwJbGludXgvbHAuaAogMHgwOQlhbGwJbGludXgvbWQuaAogMHgxMglhbGwJbGludXgvZnMuaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA0ZDg4MGIzLi45YTU0MTQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMzQsNyArMzQsNiBAQAogCUFQSUMJQVBJQyBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJQVBNCUFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBpcyBlbmFibGVkLgogCUFYMjUJQXBwcm9wcmlhdGUgQVguMjUgc3VwcG9ydCBpcyBlbmFibGVkLgotCUNECUFwcHJvcHJpYXRlIENEIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlEUk0JRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VtZW50IHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlFREQJQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIFNlcnZpY2VzIChFREQpIGlzIGVuYWJsZWQKIAlFRkkJRUZJIFBhcnRpdGlvbmluZyAoR1BUKSBpcyBlbmFibGVkCkBAIC0yMzgsMTYgKzIzNyw5IEBACiAJCQlEaXNhYmxlIFBJTiAxIG9mIEFQSUMgdGltZXIKIAkJCUNhbiBiZSB1c2VmdWwgdG8gd29yayBhcm91bmQgY2hpcHNldCBidWdzLgogCi0JYWQxODE2PQkJW0hXLE9TU10KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4KLQkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNi4KLQogCWFkMTg0OD0JCVtIVyxPU1NdCiAJCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDx0eXBlPgogCi0JYWRsaWI9CQlbSFcsT1NTXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlhZHZhbnN5cz0JW0hXLFNDU0ldCiAJCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS9hZHZhbnN5cy5jLgogCkBAIC0zMjYsOSArMzE4LDYgQEAKIAogCWF1dG90ZXN0CVtJQTY0XQogCi0JYXp0Y2Q9CQlbSFcsQ0RdIEF6dGVjaCBDRDI2OCBDRFJPTSBkcml2ZXIKLQkJCUZvcm1hdDogPGlvPiwweDc5ICg/KQotCiAJYmF5Y29tX2VwcD0JW0hXLEFYMjVdCiAJCQlGb3JtYXQ6IDxpbz4sPG1vZGU+CiAKQEAgLTM3MSwxMCArMzYwLDYgQEAKIAkJCXBvc3NpYmxlIHRvIGRldGVybWluZSB3aGF0IHRoZSBjb3JyZWN0IHNpemUgc2hvdWxkIGJlLgogCQkJVGhpcyBvcHRpb24gcHJvdmlkZXMgYW4gb3ZlcnJpZGUgZm9yIHRoZXNlIHNpdHVhdGlvbnMuCiAKLQljZHUzMWE9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT5bLFBBU10KLQkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9jZHJvbS9jZHUzMWEuYy4KLQogCWNoYW5kZXY9CVtIVyxORVRdIEdlbmVyaWMgY2hhbm5lbCBkZXZpY2UgaW5pdGlhbGlzYXRpb24KIAogCWNoZWNrcmVxcHJvdAlbU0VMSU5VWF0gU2V0IGluaXRpYWwgY2hlY2tyZXFwcm90IGZsYWcgdmFsdWUuCkBAIC00MjgsOSArNDEzLDYgQEAKIAlocGV0PQkJW0lBLTMyLEhQRVRdIG9wdGlvbiB0byBkaXNhYmxlIEhQRVQgYW5kIHVzZSBQSVQuCiAJCQlGb3JtYXQ6IGRpc2FibGUKIAotCWNtMjA2PQkJW0hXLENEXQotCQkJRm9ybWF0OiB7IGF1dG8gfCBbPGlvPixdWzxpcnE+XSB9Ci0KIAljb20yMDAyMD0JW0hXLE5FVF0gQVJDbmV0IC0gQ09NMjAwMjAgY2hpcHNldAogCQkJRm9ybWF0OgogCQkJPGlvPlssPGlycT5bLDxub2RlSUQ+Wyw8YmFja3BsYW5lPlssPGNrcD5bLDx0aW1lb3V0Pl1dXV1dCkBAIC00NjIsMTMgKzQ0NCwyMCBAQAogCQkJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGNvbnNvbGUudHh0IGZvciBhbgogCQkJYWx0ZXJuYXRpdmUuCiAKLQkJdWFydCxpbyw8YWRkcj5bLG9wdGlvbnNdCi0JCXVhcnQsbW1pbyw8YWRkcj5bLG9wdGlvbnNdCisJCXVhcnRbODI1MF0saW8sPGFkZHI+WyxvcHRpb25zXQorCQl1YXJ0WzgyNTBdLG1taW8sPGFkZHI+WyxvcHRpb25zXQogCQkJU3RhcnQgYW4gZWFybHksIHBvbGxlZC1tb2RlIGNvbnNvbGUgb24gdGhlIDgyNTAvMTY1NTAKIAkJCVVBUlQgYXQgdGhlIHNwZWNpZmllZCBJL08gcG9ydCBvciBNTUlPIGFkZHJlc3MsCiAJCQlzd2l0Y2hpbmcgdG8gdGhlIG1hdGNoaW5nIHR0eVMgZGV2aWNlIGxhdGVyLiAgVGhlCiAJCQlvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgdHR5UywgYWJvdmUuCiAKKwllYXJseWNvbj0JW0tOTF0gT3V0cHV0IGVhcmx5IGNvbnNvbGUgZGV2aWNlIGFuZCBvcHRpb25zLgorCQl1YXJ0WzgyNTBdLGlvLDxhZGRyPlssb3B0aW9uc10KKwkJdWFydFs4MjUwXSxtbWlvLDxhZGRyPlssb3B0aW9uc10KKwkJCVN0YXJ0IGFuIGVhcmx5LCBwb2xsZWQtbW9kZSBjb25zb2xlIG9uIHRoZSA4MjUwLzE2NTUwCisJCQlVQVJUIGF0IHRoZSBzcGVjaWZpZWQgSS9PIHBvcnQgb3IgTU1JTyBhZGRyZXNzLgorCQkJVGhlIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0dHlTLCBhYm92ZS4KKwogCWNwY2locF9nZW5lcmljPQlbSFcsUENJXSBHZW5lcmljIHBvcnQgSS9PIENvbXBhY3RQQ0kgZHJpdmVyCiAJCQlGb3JtYXQ6CiAJCQk8Zmlyc3Rfc2xvdD4sPGxhc3Rfc2xvdD4sPHBvcnQ+LDxlbnVtX2JpdD5bLDxkZWJ1Zz5dCkBAIC02NjAsOSArNjQ5LDYgQEAKIAlncHQJCVtFRkldIEZvcmNlcyBkaXNrIHdpdGggdmFsaWQgR1BUIHNpZ25hdHVyZSBidXQKIAkJCWludmFsaWQgUHJvdGVjdGl2ZSBNQlIgdG8gYmUgdHJlYXRlZCBhcyBHUFQuCiAKLQlnc2NkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlndnAxMT0JCVtIVyxTQ1NJXQogCiAJaGFzaGRpc3Q9CVtLTkwsTlVNQV0gTGFyZ2UgaGFzaGVzIGFsbG9jYXRlZCBkdXJpbmcgYm9vdApAQCAtODI2LDE0ICs4MTIsMzcgQEAKIAkJCXRhc2tzIGluIHRoZSBzeXN0ZW0gLS0gY2FuIGNhdXNlIHByb2JsZW1zIGFuZAogCQkJc3Vib3B0aW1hbCBsb2FkIGJhbGFuY2VyIHBlcmZvcm1hbmNlLgogCi0JaXNwMTY9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPHNldHVwPgotCiAJaXVjdj0JCVtIVyxORVRdCiAKIAlqcz0JCVtIVyxKT1ldIEFuYWxvZyBqb3lzdGljawogCQkJU2VlIERvY3VtZW50YXRpb24vaW5wdXQvam95c3RpY2sudHh0LgogCisJa2VybmVsY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCXNwZWNpZmllcyB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2FibGUgYnkgdGhlIGtlcm5lbAorCQkJZm9yIG5vbi1tb3ZhYmxlIGFsbG9jYXRpb25zLiAgVGhlIHJlcXVlc3RlZCBhbW91bnQgaXMKKwkJCXNwcmVhZCBldmVubHkgdGhyb3VnaG91dCBhbGwgbm9kZXMgaW4gdGhlIHN5c3RlbS4gVGhlCisJCQlyZW1haW5pbmcgbWVtb3J5IGluIGVhY2ggbm9kZSBpcyB1c2VkIGZvciBNb3ZhYmxlCisJCQlwYWdlcy4gSW4gdGhlIGV2ZW50LCBhIG5vZGUgaXMgdG9vIHNtYWxsIHRvIGhhdmUgYm90aAorCQkJa2VybmVsY29yZSBhbmQgTW92YWJsZSBwYWdlcywga2VybmVsY29yZSBwYWdlcyB3aWxsCisJCQl0YWtlIHByaW9yaXR5IGFuZCBvdGhlciBub2RlcyB3aWxsIGhhdmUgYSBsYXJnZXIgbnVtYmVyCisJCQlvZiBrZXJuZWxjb3JlIHBhZ2VzLiAgVGhlIE1vdmFibGUgem9uZSBpcyB1c2VkIGZvciB0aGUKKwkJCWFsbG9jYXRpb24gb2YgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1vdmVkCisJCQlieSB0aGUgcGFnZSBtaWdyYXRpb24gc3Vic3lzdGVtLiAgVGhpcyBtZWFucyB0aGF0CisJCQlIdWdlVExCIHBhZ2VzIG1heSBub3QgYmUgYWxsb2NhdGVkIGZyb20gdGhpcyB6b25lLgorCQkJTm90ZSB0aGF0IGFsbG9jYXRpb25zIGxpa2UgUFRFcy1mcm9tLUhpZ2hNZW0gc3RpbGwKKwkJCXVzZSB0aGUgSGlnaE1lbSB6b25lIGlmIGl0IGV4aXN0cywgYW5kIHRoZSBOb3JtYWwKKwkJCXpvbmUgaWYgaXQgZG9lcyBub3QuCisKKwltb3ZhYmxlY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCWlzIHNpbWlsYXIgdG8ga2VybmVsY29yZSBleGNlcHQgaXQgc3BlY2lmaWVzIHRoZQorCQkJYW1vdW50IG9mIG1lbW9yeSB1c2VkIGZvciBtaWdyYXRhYmxlIGFsbG9jYXRpb25zLgorCQkJSWYgYm90aCBrZXJuZWxjb3JlIGFuZCBtb3ZhYmxlY29yZSBpcyBzcGVjaWZpZWQsCisJCQl0aGVuIGtlcm5lbGNvcmUgd2lsbCBiZSBhdCAqbGVhc3QqIHRoZSBzcGVjaWZpZWQKKwkJCXZhbHVlIGJ1dCBtYXkgYmUgbW9yZS4gSWYgbW92YWJsZWNvcmUgb24gaXRzIG93bgorCQkJaXMgc3BlY2lmaWVkLCB0aGUgYWRtaW5pc3RyYXRvciBtdXN0IGJlIGNhcmVmdWwKKwkJCXRoYXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNhYmxlIGZvciBhbGwgYWxsb2NhdGlvbnMKKwkJCWlzIG5vdCB0b28gc21hbGwuCisKIAlrZWVwaW5pdHJkCVtIVyxBUk1dCiAKIAlrc3RhY2s9TglbSUEtMzIsWDg2LTY0XSBQcmludCBOIHdvcmRzIGZyb20gdGhlIGtlcm5lbCBzdGFjawpAQCAtOTY3LDExICs5NzYsNiBAQAogCiAJbWNhdGVzdD0JW0lBLTY0XQogCi0JbWNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8cG9ydD4sPGlycT4sPG1pdHN1bWlfYnVnXzkzX3dhaXQ+Ci0KLQltY2R4PQkJW0hXLENEXQotCiAJbWNlCQlbSUEtMzJdIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uCiAKIAltZD0JCVtIV10gUkFJRCBzdWJzeXN0ZW1zIGRldmljZXMgYW5kIGxldmVsCkBAIC0xMTgxLDYgKzExODUsOCBAQAogCiAJbm9zbXAJCVtTTVBdIFRlbGxzIGFuIFNNUCBrZXJuZWwgdG8gYWN0IGFzIGEgVVAga2VybmVsLgogCisJbm9zb2Z0bG9ja3VwCVtLTkxdIERpc2FibGUgdGhlIHNvZnQtbG9ja3VwIGRldGVjdG9yLgorCiAJbm9zeW5jCQlbSFcsTTY4S10gRGlzYWJsZXMgc3luYyBuZWdvdGlhdGlvbiBmb3IgYWxsIGRldmljZXMuCiAKIAlub3RzYwkJW0JVR1M9SUEtMzJdIERpc2FibGUgVGltZSBTdGFtcCBDb3VudGVyCkBAIC0xMTg5LDIwICsxMTk1LDE5IEBACiAKIAlub3diCQlbQVJNXQogCisJbnVtYV96b25lbGlzdF9vcmRlcj0gW0tOTCwgQk9PVF0gU2VsZWN0IHpvbmVsaXN0IG9yZGVyIGZvciBOVU1BLgorCQkJb25lIG9mIFsnem9uZScsICdub2RlJywgJ2RlZmF1bHQnXSBjYW4gYmUgc3BlY2lmaWVkCisJCQlUaGlzIGNhbiBiZSBzZXQgZnJvbSBzeXNjdGwgYWZ0ZXIgYm9vdC4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgZm9yIGRldGFpbHMuCisKIAlucl91YXJ0cz0JW1NFUklBTF0gbWF4aW11bSBudW1iZXIgb2YgVUFSVHMgdG8gYmUgcmVnaXN0ZXJlZC4KIAogCW9wbDM9CQlbSFcsT1NTXQogCQkJRm9ybWF0OiA8aW8+CiAKLQlvcGwzc2EyPQlbSFcsT1NTXSBGb3JtYXQ6Ci0JCQk8aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXNzX2lvPiw8bXB1X2lvPiw8eW1vZGU+LDxsb29wYmFjaz5bLDxpc2FwbnA+LDxtdWx0aXBsZV0KLQogCW9wcm9maWxlLnRpbWVyPQlbSFddCiAJCQlVc2UgdGltZXIgaW50ZXJydXB0IGluc3RlYWQgb2YgcGVyZm9ybWFuY2UgY291bnRlcnMKIAotCW9wdGNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlvc3N0PQkJW0hXLFNDU0ldIFNDU0kgVGFwZSBEcml2ZXIKIAkJCUZvcm1hdDogPGJ1ZmZlcl9zaXplPiw8d3JpdGVfdGhyZXNob2xkPgogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dC4KQEAgLTEzODEsNiArMTM4NiwxNSBAQAogCQkJYXV0b2NvbmZpZ3VyYXRpb24uCiAJCQlSYW5nZXMgYXJlIGluIHBhaXJzIChtZW1vcnkgYmFzZSBhbmQgc2l6ZSkuCiAKKwlwcmludC1mYXRhbC1zaWduYWxzPQorCQkJW0tOTF0gZGVidWc6IHByaW50IGZhdGFsIHNpZ25hbHMKKwkJCXByaW50LWZhdGFsLXNpZ25hbHM9MTogcHJpbnQgc2VnZmF1bHQgaW5mbyB0bworCQkJdGhlIGtlcm5lbCBjb25zb2xlLgorCQkJZGVmYXVsdDogb2ZmLgorCisJcHJpbnRrLnRpbWU9CVNob3cgdGltaW5nIGRhdGEgcHJlZml4ZWQgdG8gZWFjaCBwcmludGsgbWVzc2FnZSBsaW5lCisJCQlGb3JtYXQ6IDxib29sPiAgKDEvWS95PWVuYWJsZSwgMC9OL249ZGlzYWJsZSkKKwogCXByb2ZpbGU9CVtLTkxdIEVuYWJsZSBrZXJuZWwgcHJvZmlsaW5nIHZpYSAvcHJvYy9wcm9maWxlCiAJCQlGb3JtYXQ6IFtzY2hlZHVsZSxdPG51bWJlcj4KIAkJCVBhcmFtOiAic2NoZWR1bGUiIC0gcHJvZmlsZSBzY2hlZHVsZSBwb2ludHMuCkBAIC0xNDkzLDYgKzE1MDcsMTAgQEAKIAogCXJvb3Rmc3R5cGU9CVtLTkxdIFNldCByb290IGZpbGVzeXN0ZW0gdHlwZQogCisJcm9vdHdhaXQJW0tOTF0gV2FpdCAoaW5kZWZpbml0ZWx5KSBmb3Igcm9vdCBkZXZpY2UgdG8gc2hvdyB1cC4KKwkJCVVzZWZ1bCBmb3IgZGV2aWNlcyB0aGF0IGFyZSBkZXRlY3RlZCBhc3luY2hyb25vdXNseQorCQkJKGUuZy4gVVNCIGFuZCBNTUMgZGV2aWNlcykuCisKIAlydwkJW0tOTF0gTW91bnQgcm9vdCBkZXZpY2UgcmVhZC13cml0ZSBvbiBib290CiAKIAlTCQlbS05MXSBSdW4gaW5pdCBpbiBzaW5nbGUgbW9kZQpAQCAtMTUwNSwxMSArMTUyMyw2IEBACiAKIAlzYm5pPQkJW05FVF0gR3JhbmNoIFNCTkkxMiBsZWFzZWQgbGluZSBhZGFwdGVyCiAKLQlzYnBjZD0JCVtIVyxDRF0gU291bmRibGFzdGVyIENEIGFkYXB0ZXIKLQkJCUZvcm1hdDogPGlvPiw8dHlwZT4KLQkJCVNlZSBhIGNvbW1lbnQgYmVmb3JlIGZ1bmN0aW9uIHNicGNkX3NldHVwKCkgaW4KLQkJCWRyaXZlcnMvY2Ryb20vc2JwY2QuYy4KLQogCXNjMTIwMHdkdD0JW0hXLFdEVF0gU0MxMjAwIFdEVCAod2F0Y2hkb2cpIGRyaXZlcgogCQkJRm9ybWF0OiA8aW8+Wyw8dGltZW91dD5bLDxpc2FwbnA+XV0KIApAQCAtMTU2Miw0MSArMTU3NSw0MSBAQAogCXNpbWV0aD0JCVtJQS02NF0KIAlzaW1zY3NpPQogCi0Jc2pjZD0JCVtIVyxDRF0KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPgotCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL2Nkcm9tL3NqY2QuYy4KLQogCXNscmFtPQkJW0hXLE1URF0KIAotCXNsdWJfZGVidWcJW01NLCBTTFVCXQotCQkJRW5hYmxpbmcgc2x1Yl9kZWJ1ZyBhbGxvd3Mgb25lIHRvIGRldGVybWluZSB0aGUgY3VscHJpdAotCQkJaWYgc2xhYiBvYmplY3RzIGJlY29tZSBjb3JydXB0ZWQuIEVuYWJsaW5nIHNsdWJfZGVidWcKLQkJCWNyZWF0ZXMgZ3VhcmQgem9uZXMgYXJvdW5kIG9iamVjdHMgYW5kIHBvaXNvbnMgb2JqZWN0cwotCQkJd2hlbiBub3QgaW4gdXNlLiBBbHNvIHRyYWNrcyB0aGUgbGFzdCBhbGxvYyAvIGZyZWUuCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwlzbHViX2RlYnVnWz1vcHRpb25zWyxzbGFic11dCVtNTSwgU0xVQl0KKwkJCUVuYWJsaW5nIHNsdWJfZGVidWcgYWxsb3dzIG9uZSB0byBkZXRlcm1pbmUgdGhlCisJCQljdWxwcml0IGlmIHNsYWIgb2JqZWN0cyBiZWNvbWUgY29ycnVwdGVkLiBFbmFibGluZworCQkJc2x1Yl9kZWJ1ZyBjYW4gY3JlYXRlIGd1YXJkIHpvbmVzIGFyb3VuZCBvYmplY3RzIGFuZAorCQkJbWF5IHBvaXNvbiBvYmplY3RzIHdoZW4gbm90IGluIHVzZS4gQWxzbyB0cmFja3MgdGhlCisJCQlsYXN0IGFsbG9jIC8gZnJlZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisJCQlEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc2x1Yl9tYXhfb3JkZXI9IFtNTSwgU0xVQl0KLQkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuIFNldHRpbmcKLQkJCXRoaXMgdG9vIGhpZ2ggbWF5IGNhdXNlIGZyYWdtZW50YXRpb24uCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuCisJCQlBIGhpZ2ggc2V0dGluZyBtYXkgY2F1c2UgT09NcyBkdWUgdG8gbWVtb3J5CisJCQlmcmFnbWVudGF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUKKwkJCURvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX21pbl9vYmplY3RzPQlbTU0sIFNMVUJdCi0JCQlUaGUgbWluaW11bSBvYmplY3RzIHBlciBzbGFiLiBTTFVCIHdpbGwgaW5jcmVhc2UgdGhlCi0JCQlzbGFiIG9yZGVyIHVwIHRvIHNsdWJfbWF4X29yZGVyIHRvIGdlbmVyYXRlIGEKLQkJCXN1ZmZpY2llbnRseSBiaWcgc2xhYiB0byBzYXRpc2Z5IHRoZSBudW1iZXIgb2Ygb2JqZWN0cy4KLQkJCVRoZSBoaWdoZXIgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoZSBzbWFsbGVyIHRoZSBvdmVyaGVhZAotCQkJb2YgdHJhY2tpbmcgc2xhYnMuCisJCQlUaGUgbWluaW11bSBudW1iZXIgb2Ygb2JqZWN0cyBwZXIgc2xhYi4gU0xVQiB3aWxsCisJCQlpbmNyZWFzZSB0aGUgc2xhYiBvcmRlciB1cCB0byBzbHViX21heF9vcmRlciB0bworCQkJZ2VuZXJhdGUgYSBzdWZmaWNpZW50bHkgbGFyZ2Ugc2xhYiBhYmxlIHRvIGNvbnRhaW4KKwkJCXRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbmRpY2F0ZWQuIFRoZSBoaWdoZXIgdGhlIG51bWJlcgorCQkJb2Ygb2JqZWN0cyB0aGUgc21hbGxlciB0aGUgb3ZlcmhlYWQgb2YgdHJhY2tpbmcgc2xhYnMKKwkJCWFuZCB0aGUgbGVzcyBmcmVxdWVudGx5IGxvY2tzIG5lZWQgdG8gYmUgYWNxdWlyZWQuCiAJCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KIAogCXNsdWJfbWluX29yZGVyPQlbTU0sIFNMVUJdCiAJCQlEZXRlcm1pbmVzIHRoZSBtaW5pbnVtIHBhZ2Ugb3JkZXIgZm9yIHNsYWJzLiBNdXN0IGJlCi0JCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyCisJCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyLgogCQkJRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIERvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX25vbWVyZ2UJW01NLCBTTFVCXQotCQkJRGlzYWJsZSBtZXJnaW5nIG9mIHNsYWJzIG9mIHNpbWlsYXIgc2l6ZS4gTWF5IGJlCisJCQlEaXNhYmxlIG1lcmdpbmcgb2Ygc2xhYnMgd2l0aCBzaW1pbGFyIHNpemUuIE1heSBiZQogCQkJbmVjZXNzYXJ5IGlmIHRoZXJlIGlzIHNvbWUgcmVhc29uIHRvIGRpc3Rpbmd1aXNoCi0JCQlhbGxvY3MgdG8gZGlmZmVyZW50IHNsYWJzLgorCQkJYWxsb2NzIHRvIGRpZmZlcmVudCBzbGFicy4gRGVidWcgb3B0aW9ucyBkaXNhYmxlCisJCQltZXJnaW5nIG9uIHRoZWlyIG93bi4KIAkJCUZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc21hcnQyPQkJW0hXXQpAQCAtMTczOCw5ICsxNzUxLDYgQEAKIAogCXNuZC15bWZwY2k9CVtIVyxBTFNBXQogCi0Jc29ueWNkNTM1PQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz5bLDxpcnE+XQotCiAJc29ueXBpLio9CVtIV10gU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlcgogCQkJU2VlIERvY3VtZW50YXRpb24vc29ueXBpLnR4dAogCkBAIC0xODEyLDYgKzE4MjIsNyBAQAogCQkJU2V0IG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIFRDUCBjb25uZWN0aW9uCiAKIAl0aW1lCQlTaG93IHRpbWluZyBkYXRhIHByZWZpeGVkIHRvIGVhY2ggcHJpbnRrIG1lc3NhZ2UgbGluZQorCQkJW2RlcHJlY2F0ZWQsIHNlZSAncHJpbnRrLnRpbWUnXQogCiAJdGlwYXIudGltZW91dD0JW0hXLFBQVF0KIAkJCVNldCBjb21tdW5pY2F0aW9ucyB0aW1lb3V0IGluIHRlbnRocyBvZiBhIHNlY29uZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKaW5kZXggMWM0MWRiMi4uNTkxMDhjZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CkBAIC04MiwxMyArODIsNiBAQAogICAvZGV2L2ZkIDogLT4gMHgwMjAwIChmbG9wcHkgZGlzaykKICAgL2Rldi94ZGE6IC0+IDB4MGMwMCAoZmlyc3QgWFQgZGlzaywgdW51c2VkIGluIExpbnV4L202OGspCiAgIC9kZXYveGRiOiAtPiAweDBjNDAgKHNlY29uZCBYVCBkaXNrLCB1bnVzZWQgaW4gTGludXgvbTY4aykKLSAgL2Rldi9hZGE6IC0+IDB4MWMwMCAoZmlyc3QgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRiOiAtPiAweDFjMTAgKHNlY29uZCBBQ1NJIGRldmljZSkKLSAgL2Rldi9hZGM6IC0+IDB4MWMyMCAodGhpcmQgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRkOiAtPiAweDFjMzAgKGZvcnRoIEFDU0kgZGV2aWNlKQotCi1UaGUgbGFzdCBmb3VyIG5hbWVzIGFyZSBhdmFpbGFibGUgb25seSBpZiB0aGUga2VybmVsIGhhcyBiZWVuIGNvbXBpbGVkCi13aXRoIEF0YXJpIGFuZCBBQ1NJIHN1cHBvcnQuCiAKICAgVGhlIG5hbWUgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgbnVtYmVyLCB0aGF0IHN0YW5kcyBmb3IgdGhlCiBwYXJ0aXRpb24gbnVtYmVyLiBJbnRlcm5hbGx5LCB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBpcyBqdXN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dAppbmRleCAwYjI3ODYzLi45OGM0MzkyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQKQEAgLTE0NiwxMiArMTQ2LDYgQEAKIAlpcnEgPSAwCiAJKFByb2JlcyBwb3J0czogMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyNDAsIDB4MzQwLCAweDMyMCwgMHgzODAsIDB4MzAwKQogCi1hdGFyaV9iaW9uZXQuYzoKLQlTdXBwb3J0cyBmdWxsIGF1dG9wcm9iaW5nLiAobTY4ay9BdGFyaSkKLQotYXRhcmlfcGFtc25ldC5jOgotCVN1cHBvcnRzIGZ1bGwgYXV0b3Byb2JpbmcuIChtNjhrL0F0YXJpKQotCiBhdGFyaWxhbmNlLmM6CiAJU3VwcG9ydHMgZnVsbCBhdXRvcHJvYmluZy4gKG02OGsvQXRhcmkpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAppbmRleCA3ZDViNjBkLi43ZjYwZGZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CkBAIC04Niw2ICs4NiwyMCBAQAogYW5kIGRvIGEgcmVwbGFjZSBvZiBzcGFjZXMgdG8gIlx4IiAtIHRoYXQncyB3aGF0IEkgZG8sIGFzIEknbSB0b28gbGF6eSAKIHRvIHdyaXRlIGEgcHJvZ3JhbSB0byBhdXRvbWF0ZSB0aGlzIGFsbCkuCiAKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBzaGVsbCBzY3JpcHQgaW4gc2NyaXB0cy9kZWNvZGVjb2RlLgorSXRzIHVzYWdlIGlzOiAgZGVjb2RlY29kZSA8IG9vcHMudHh0CisKK1RoZSBoZXggYnl0ZXMgdGhhdCBmb2xsb3cgIkNvZGU6IiBtYXkgKGluIHNvbWUgYXJjaGl0ZWN0dXJlcykgaGF2ZSBhIHNlcmllcworb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgYXMgd2VsbCBhcyBieXRlcyBhdCBhbmQKK2ZvbGxvd2luZyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyLiAgSW4gc29tZSBjYXNlcywgb25lIGluc3RydWN0aW9uCitieXRlIG9yIHdvcmQgaXMgc3Vycm91bmRlZCBieSA8PiBvciAoKSwgYXMgaW4gIjw4Nj4iIG9yICIoZjAwZCkiLiAgVGhlc2UKKzw+IG9yICgpIG1hcmtpbmdzIGluZGljYXRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIuICBFeGFtcGxlIGZyb20KK2kzODYsIHNwbGl0IGludG8gbXVsdGlwbGUgbGluZXMgZm9yIHJlYWRhYmlsaXR5OgorCitDb2RlOiBmOSAwZiA4ZCBmOSAwMCAwMCAwMCA4ZCA0MiAwYyBlOCBkZCAyNiAxMSBjNyBhMSA2MCBlYSAyYiBmOSA4YiA1MCAwOCBhMQorNjQgZWEgMmIgZjkgOGQgMzQgODIgOGIgMWUgODUgZGIgNzQgNmQgOGIgMTUgNjAgZWEgMmIgZjkgPDhiPiA0MyAwNCAzOSA0MiA1NAorN2UgMDQgNDAgODkgNDIgNTQgOGIgNDMgMDQgM2IgMDUgMDAgZjYgNTIgYzAKKwogRmluYWxseSwgaWYgeW91IHdhbnQgdG8gc2VlIHdoZXJlIHRoZSBjb2RlIGNvbWVzIGZyb20sIHlvdSBjYW4gZG8KIAogCWNkIC91c3Ivc3JjL2xpbnV4CkBAIC0yMzcsNiArMjUxLDggQEAKICAgNzogJ1UnIGlmIGEgdXNlciBvciB1c2VyIGFwcGxpY2F0aW9uIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgdGhhdCB0aGUKICAgICAgVGFpbnRlZCBmbGFnIGJlIHNldCwgJyAnIG90aGVyd2lzZS4KIAorICA4OiAnRCcgaWYgdGhlIGtlcm5lbCBoYXMgZGllZCByZWNlbnRseSwgaS5lLiB0aGVyZSB3YXMgYW4gT09QUyBvciBCVUcuCisKIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhlICdUYWludGVkOiAnIHN0cmluZyBpcyB0byB0ZWxsIGtlcm5lbAogZGVidWdnZXJzIGlmIHRoaXMgaXMgYSBjbGVhbiBrZXJuZWwgb3IgaWYgYW55dGhpbmcgdW51c3VhbCBoYXMKIG9jY3VycmVkLiAgVGFpbnRpbmcgaXMgcGVybWFuZW50OiBldmVuIGlmIGFuIG9mZmVuZGluZyBtb2R1bGUgaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9mcmVlemluZy1vZi10YXNrcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYTI4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CkBAIC0wLDAgKzEsMTYwIEBACitGcmVlemluZyBvZiB0YXNrcworCShDKSAyMDA3IFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4sIEdQTAorCitJLiBXaGF0IGlzIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworVGhlIGZyZWV6aW5nIG9mIHRhc2tzIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lCitrZXJuZWwgdGhyZWFkcyBhcmUgY29udHJvbGxlZCBkdXJpbmcgaGliZXJuYXRpb24gb3Igc3lzdGVtLXdpZGUgc3VzcGVuZCAob24gc29tZQorYXJjaGl0ZWN0dXJlcykuCisKK0lJLiBIb3cgZG9lcyBpdCB3b3JrPworCitUaGVyZSBhcmUgZm91ciBwZXItdGFzayBmbGFncyB1c2VkIGZvciB0aGF0LCBQRl9OT0ZSRUVaRSwgUEZfRlJPWkVOLCBUSUZfRlJFRVpFCithbmQgUEZfRlJFRVpFUl9TS0lQICh0aGUgbGFzdCBvbmUgaXMgYXV4aWxpYXJ5KS4gIFRoZSB0YXNrcyB0aGF0IGhhdmUKK1BGX05PRlJFRVpFIHVuc2V0IChhbGwgdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUga2VybmVsIHRocmVhZHMpIGFyZQorcmVnYXJkZWQgYXMgJ2ZyZWV6YWJsZScgYW5kIHRyZWF0ZWQgaW4gYSBzcGVjaWFsIHdheSBiZWZvcmUgdGhlIHN5c3RlbSBlbnRlcnMgYQorc3VzcGVuZCBzdGF0ZSBhcyB3ZWxsIGFzIGJlZm9yZSBhIGhpYmVybmF0aW9uIGltYWdlIGlzIGNyZWF0ZWQgKGluIHdoYXQgZm9sbG93cword2Ugb25seSBjb25zaWRlciBoaWJlcm5hdGlvbiwgYnV0IHRoZSBkZXNjcmlwdGlvbiBhbHNvIGFwcGxpZXMgdG8gc3VzcGVuZCkuCisKK05hbWVseSwgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIGhpYmVybmF0aW9uIHByb2NlZHVyZSB0aGUgZnVuY3Rpb24KK2ZyZWV6ZV9wcm9jZXNzZXMoKSAoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSBpcyBjYWxsZWQuICBJdCBleGVjdXRlcwordHJ5X3RvX2ZyZWV6ZV90YXNrcygpIHRoYXQgc2V0cyBUSUZfRlJFRVpFIGZvciBhbGwgb2YgdGhlIGZyZWV6YWJsZSB0YXNrcyBhbmQKK3NlbmRzIGEgZmFrZSBzaWduYWwgdG8gZWFjaCBvZiB0aGVtLiAgQSB0YXNrIHRoYXQgcmVjZWl2ZXMgc3VjaCBhIHNpZ25hbCBhbmQgaGFzCitUSUZfRlJFRVpFIHNldCwgc2hvdWxkIHJlYWN0IHRvIGl0IGJ5IGNhbGxpbmcgdGhlIHJlZnJpZ2VyYXRvcigpIGZ1bmN0aW9uCisoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSwgd2hpY2ggc2V0cyB0aGUgdGFzaydzIFBGX0ZST1pFTiBmbGFnLAorY2hhbmdlcyBpdHMgc3RhdGUgdG8gVEFTS19VTklOVEVSUlVQVElCTEUgYW5kIG1ha2VzIGl0IGxvb3AgdW50aWwgUEZfRlJPWkVOIGlzCitjbGVhcmVkIGZvciBpdC4gIFRoZW4sIHdlIHNheSB0aGF0IHRoZSB0YXNrIGlzICdmcm96ZW4nIGFuZCB0aGVyZWZvcmUgdGhlIHNldCBvZgorZnVuY3Rpb25zIGhhbmRsaW5nIHRoaXMgbWVjaGFuaXNtIGlzIGNhbGxlZCAndGhlIGZyZWV6ZXInICh0aGVzZSBmdW5jdGlvbnMgYXJlCitkZWZpbmVkIGluIGtlcm5lbC9wb3dlci9wcm9jZXNzLmMgYW5kIGluY2x1ZGUvbGludXgvZnJlZXplci5oKS4gIFVzZXIgc3BhY2UKK3Byb2Nlc3NlcyBhcmUgZ2VuZXJhbGx5IGZyb3plbiBiZWZvcmUga2VybmVsIHRocmVhZHMuCisKK0l0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjYWxsIHJlZnJpZ2VyYXRvcigpIGRpcmVjdGx5LiAgSW5zdGVhZCwgaXQgaXMKK3JlY29tbWVuZGVkIHRvIHVzZSB0aGUgdHJ5X3RvX2ZyZWV6ZSgpIGZ1bmN0aW9uIChkZWZpbmVkIGluCitpbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCksIHRoYXQgY2hlY2tzIHRoZSB0YXNrJ3MgVElGX0ZSRUVaRSBmbGFnIGFuZCBtYWtlcyB0aGUKK3Rhc2sgZW50ZXIgcmVmcmlnZXJhdG9yKCkgaWYgdGhlIGZsYWcgaXMgc2V0LgorCitGb3IgdXNlciBzcGFjZSBwcm9jZXNzZXMgdHJ5X3RvX2ZyZWV6ZSgpIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCitzaWduYWwtaGFuZGxpbmcgY29kZSwgYnV0IHRoZSBmcmVlemFibGUga2VybmVsIHRocmVhZHMgbmVlZCB0byBjYWxsIGl0CitleHBsaWNpdGx5IGluIHN1aXRhYmxlIHBsYWNlcy4gIFRoZSBjb2RlIHRvIGRvIHRoaXMgbWF5IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCisJZG8geworCQlodWJfZXZlbnRzKCk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisKKyhmcm9tIGRyaXZlcnMvdXNiL2NvcmUvaHViLmM6Omh1Yl90aHJlYWQoKSkuCisKK0lmIGEgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgZmFpbHMgdG8gY2FsbCB0cnlfdG9fZnJlZXplKCkgYWZ0ZXIgdGhlIGZyZWV6ZXIgaGFzCitzZXQgVElGX0ZSRUVaRSBmb3IgaXQsIHRoZSBmcmVlemluZyBvZiB0YXNrcyB3aWxsIGZhaWwgYW5kIHRoZSBlbnRpcmUKK2hpYmVybmF0aW9uIG9wZXJhdGlvbiB3aWxsIGJlIGNhbmNlbGxlZC4gIEZvciB0aGlzIHJlYXNvbiwgZnJlZXphYmxlIGtlcm5lbAordGhyZWFkcyBtdXN0IGNhbGwgdHJ5X3RvX2ZyZWV6ZSgpIHNvbWV3aGVyZS4KKworQWZ0ZXIgdGhlIHN5c3RlbSBtZW1vcnkgc3RhdGUgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIGhpYmVybmF0aW9uIGltYWdlIGFuZAorZGV2aWNlcyBoYXZlIGJlZW4gcmVpbml0aWFsaXplZCwgdGhlIGZ1bmN0aW9uIHRoYXdfcHJvY2Vzc2VzKCkgaXMgY2FsbGVkIGluCitvcmRlciB0byBjbGVhciB0aGUgUEZfRlJPWkVOIGZsYWcgZm9yIGVhY2ggZnJvemVuIHRhc2suICBUaGVuLCB0aGUgdGFza3MgdGhhdAoraGF2ZSBiZWVuIGZyb3plbiBsZWF2ZSByZWZyaWdlcmF0b3IoKSBhbmQgY29udGludWUgcnVubmluZy4KKworSUlJLiBXaGljaCBrZXJuZWwgdGhyZWFkcyBhcmUgZnJlZXphYmxlPworCitLZXJuZWwgdGhyZWFkcyBhcmUgbm90IGZyZWV6YWJsZSBieSBkZWZhdWx0LiAgSG93ZXZlciwgYSBrZXJuZWwgdGhyZWFkIG1heSBjbGVhcgorUEZfTk9GUkVFWkUgZm9yIGl0c2VsZiBieSBjYWxsaW5nIHNldF9mcmVlemFibGUoKSAodGhlIHJlc2V0dGluZyBvZiBQRl9OT0ZSRUVaRQorZGlyZWN0bHkgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQpLiAgRnJvbSB0aGlzIHBvaW50IGl0IGlzIHJlZ2FyZGVkIGFzIGZyZWV6YWJsZQorYW5kIG11c3QgY2FsbCB0cnlfdG9fZnJlZXplKCkgaW4gYSBzdWl0YWJsZSBwbGFjZS4KKworSVYuIFdoeSBkbyB3ZSBkbyB0aGF0PworCitHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGlzIGEgY291cGxlIG9mIHJlYXNvbnMgdG8gdXNlIHRoZSBmcmVlemluZyBvZiB0YXNrczoKKworMS4gVGhlIHByaW5jaXBhbCByZWFzb24gaXMgdG8gcHJldmVudCBmaWxlc3lzdGVtcyBmcm9tIGJlaW5nIGRhbWFnZWQgYWZ0ZXIKK2hpYmVybmF0aW9uLiAgQXQgdGhlIG1vbWVudCB3ZSBoYXZlIG5vIHNpbXBsZSBtZWFucyBvZiBjaGVja3BvaW50aW5nCitmaWxlc3lzdGVtcywgc28gaWYgdGhlcmUgYXJlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gZmlsZXN5c3RlbSBkYXRhIGFuZC9vcgorbWV0YWRhdGEgb24gZGlza3MsIHdlIGNhbm5vdCBicmluZyB0aGVtIGJhY2sgdG8gdGhlIHN0YXRlIGZyb20gYmVmb3JlIHRoZQorbW9kaWZpY2F0aW9ucy4gIEF0IHRoZSBzYW1lIHRpbWUgZWFjaCBoaWJlcm5hdGlvbiBpbWFnZSBjb250YWlucyBzb21lCitmaWxlc3lzdGVtLXJlbGF0ZWQgaW5mb3JtYXRpb24gdGhhdCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3RhdGUgb2YgdGhlCitvbi1kaXNrIGRhdGEgYW5kIG1ldGFkYXRhIGFmdGVyIHRoZSBzeXN0ZW0gbWVtb3J5IHN0YXRlIGhhcyBiZWVuIHJlc3RvcmVkIGZyb20KK3RoZSBpbWFnZSAob3RoZXJ3aXNlIHRoZSBmaWxlc3lzdGVtcyB3aWxsIGJlIGRhbWFnZWQgaW4gYSBuYXN0eSB3YXksIHVzdWFsbHkKK21ha2luZyB0aGVtIGFsbW9zdCBpbXBvc3NpYmxlIHRvIHJlcGFpcikuICBXZSB0aGVyZWZvcmUgZnJlZXplIHRhc2tzIHRoYXQgbWlnaHQKK2NhdXNlIHRoZSBvbi1kaXNrIGZpbGVzeXN0ZW1zJyBkYXRhIGFuZCBtZXRhZGF0YSB0byBiZSBtb2RpZmllZCBhZnRlciB0aGUKK2hpYmVybmF0aW9uIGltYWdlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGJlZm9yZSB0aGUgc3lzdGVtIGlzIGZpbmFsbHkgcG93ZXJlZCBvZmYuCitUaGUgbWFqb3JpdHkgb2YgdGhlc2UgYXJlIHVzZXIgc3BhY2UgcHJvY2Vzc2VzLCBidXQgaWYgYW55IG9mIHRoZSBrZXJuZWwgdGhyZWFkcworbWF5IGNhdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gaGFwcGVuLCB0aGV5IGhhdmUgdG8gYmUgZnJlZXphYmxlLgorCisyLiBUaGUgc2Vjb25kIHJlYXNvbiBpcyB0byBwcmV2ZW50IHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lIGtlcm5lbCB0aHJlYWRzCitmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHN1c3BlbmRpbmcgYW5kIHJlc3VtaW5nIG9mIGRldmljZXMuICBBIHVzZXIgc3BhY2UKK3Byb2Nlc3MgcnVubmluZyBvbiBhIHNlY29uZCBDUFUgd2hpbGUgd2UgYXJlIHN1c3BlbmRpbmcgZGV2aWNlcyBtYXksIGZvcgorZXhhbXBsZSwgYmUgdHJvdWJsZXNvbWUgYW5kIHdpdGhvdXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHdlIHdvdWxkIG5lZWQgc29tZQorc2FmZWd1YXJkcyBhZ2FpbnN0IHJhY2UgY29uZGl0aW9ucyB0aGF0IG1pZ2h0IG9jY3VyIGluIHN1Y2ggYSBjYXNlLgorCitBbHRob3VnaCBMaW51cyBUb3J2YWxkcyBkb2Vzbid0IGxpa2UgdGhlIGZyZWV6aW5nIG9mIHRhc2tzLCBoZSBzYWlkIHRoaXMgaW4gb25lCitvZiB0aGUgZGlzY3Vzc2lvbnMgb24gTEtNTCAoaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNy80LzI3LzYwOCk6CisKKyJSSlc6PiBXaHkgd2UgZnJlZXplIHRhc2tzIGF0IGFsbCBvciB3aHkgd2UgZnJlZXplIGtlcm5lbCB0aHJlYWRzPworCitMaW51czogSW4gbWFueSB3YXlzLCAnYXQgYWxsJy4KKworSSBfZG9fIHJlYWxpemUgdGhlIElPIHJlcXVlc3QgcXVldWUgaXNzdWVzLCBhbmQgdGhhdCB3ZSBjYW5ub3QgYWN0dWFsbHkgZG8KK3MycmFtIHdpdGggc29tZSBkZXZpY2VzIGluIHRoZSBtaWRkbGUgb2YgYSBETUEuICBTbyB3ZSB3YW50IHRvIGJlIGFibGUgdG8KK2F2b2lkICp0aGF0KiwgdGhlcmUncyBubyBxdWVzdGlvbiBhYm91dCB0aGF0LiAgQW5kIEkgc3VzcGVjdCB0aGF0IHN0b3BwaW5nCit1c2VyIHRocmVhZHMgYW5kIHRoZW4gd2FpdGluZyBmb3IgYSBzeW5jIGlzIHByYWN0aWNhbGx5IG9uZSBvZiB0aGUgZWFzaWVyCit3YXlzIHRvIGRvIHNvLgorCitTbyBpbiBwcmFjdGljZSwgdGhlICdhdCBhbGwnIG1heSBiZWNvbWUgYSAnd2h5IGZyZWV6ZSBrZXJuZWwgdGhyZWFkcz8nIGFuZAorZnJlZXppbmcgdXNlciB0aHJlYWRzIEkgZG9uJ3QgZmluZCByZWFsbHkgb2JqZWN0aW9uYWJsZS4iCisKK1N0aWxsLCB0aGVyZSBhcmUga2VybmVsIHRocmVhZHMgdGhhdCBtYXkgd2FudCB0byBiZSBmcmVlemFibGUuICBGb3IgZXhhbXBsZSwgaWYKK2Ega2VybmVsIHRoYXQgYmVsb25ncyB0byBhIGRldmljZSBkcml2ZXIgYWNjZXNzZXMgdGhlIGRldmljZSBkaXJlY3RseSwgaXQgaW4KK3ByaW5jaXBsZSBuZWVkcyB0byBrbm93IHdoZW4gdGhlIGRldmljZSBpcyBzdXNwZW5kZWQsIHNvIHRoYXQgaXQgZG9lc24ndCB0cnkgdG8KK2FjY2VzcyBpdCBhdCB0aGF0IHRpbWUuICBIb3dldmVyLCBpZiB0aGUga2VybmVsIHRocmVhZCBpcyBmcmVlemFibGUsIGl0IHdpbGwgYmUKK2Zyb3plbiBiZWZvcmUgdGhlIGRyaXZlcidzIC5zdXNwZW5kKCkgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIGl0IHdpbGwgYmUKK3RoYXdlZCBhZnRlciB0aGUgZHJpdmVyJ3MgLnJlc3VtZSgpIGNhbGxiYWNrIGhhcyBydW4sIHNvIGl0IHdvbid0IGJlIGFjY2Vzc2luZwordGhlIGRldmljZSB3aGlsZSBpdCdzIHN1c3BlbmRlZC4KKworMy4gQW5vdGhlciByZWFzb24gZm9yIGZyZWV6aW5nIHRhc2tzIGlzIHRvIHByZXZlbnQgdXNlciBzcGFjZSBwcm9jZXNzZXMgZnJvbQorcmVhbGl6aW5nIHRoYXQgaGliZXJuYXRpb24gKG9yIHN1c3BlbmQpIG9wZXJhdGlvbiB0YWtlcyBwbGFjZS4gIElkZWFsbHksIHVzZXIKK3NwYWNlIHByb2Nlc3NlcyBzaG91bGQgbm90IG5vdGljZSB0aGF0IHN1Y2ggYSBzeXN0ZW0td2lkZSBvcGVyYXRpb24gaGFzIG9jY3VycmVkCithbmQgc2hvdWxkIGNvbnRpbnVlIHJ1bm5pbmcgd2l0aG91dCBhbnkgcHJvYmxlbXMgYWZ0ZXIgdGhlIHJlc3RvcmUgKG9yIHJlc3VtZQorZnJvbSBzdXNwZW5kKS4gIFVuZm9ydHVuYXRlbHksIGluIHRoZSBtb3N0IGdlbmVyYWwgY2FzZSB0aGlzIGlzIHF1aXRlIGRpZmZpY3VsdAordG8gYWNoaWV2ZSB3aXRob3V0IHRoZSBmcmVlemluZyBvZiB0YXNrcy4gIENvbnNpZGVyLCBmb3IgZXhhbXBsZSwgYSBwcm9jZXNzCit0aGF0IGRlcGVuZHMgb24gYWxsIENQVXMgYmVpbmcgb25saW5lIHdoaWxlIGl0J3MgcnVubmluZy4gIFNpbmNlIHdlIG5lZWQgdG8KK2Rpc2FibGUgbm9uYm9vdCBDUFVzIGR1cmluZyB0aGUgaGliZXJuYXRpb24sIGlmIHRoaXMgcHJvY2VzcyBpcyBub3QgZnJvemVuLCBpdAorbWF5IG5vdGljZSB0aGF0IHRoZSBudW1iZXIgb2YgQ1BVcyBoYXMgY2hhbmdlZCBhbmQgbWF5IHN0YXJ0IHRvIHdvcmsgaW5jb3JyZWN0bHkKK2JlY2F1c2Ugb2YgdGhhdC4KKworVi4gQXJlIHRoZXJlIGFueSBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworWWVzLCB0aGVyZSBhcmUuCisKK0ZpcnN0IG9mIGFsbCwgdGhlIGZyZWV6aW5nIG9mIGtlcm5lbCB0aHJlYWRzIG1heSBiZSB0cmlja3kgaWYgdGhleSBkZXBlbmQgb25lCitvbiBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGlmIGtlcm5lbCB0aHJlYWQgQSB3YWl0cyBmb3IgYSBjb21wbGV0aW9uIChpbiB0aGUKK1RBU0tfVU5JTlRFUlJVUFRJQkxFIHN0YXRlKSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgYnkgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgQgorYW5kIEIgaXMgZnJvemVuIGluIHRoZSBtZWFudGltZSwgdGhlbiBBIHdpbGwgYmUgYmxvY2tlZCB1bnRpbCBCIGlzIHRoYXdlZCwgd2hpY2gKK21heSBiZSB1bmRlc2lyYWJsZS4gIFRoYXQncyB3aHkga2VybmVsIHRocmVhZHMgYXJlIG5vdCBmcmVlemFibGUgYnkgZGVmYXVsdC4KKworU2Vjb25kLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyB0d28gcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YgdXNlcgorc3BhY2UgcHJvY2Vzc2VzOgorMS4gUHV0dGluZyBwcm9jZXNzZXMgaW50byBhbiB1bmludGVycnVwdGlibGUgc2xlZXAgZGlzdG9ydHMgdGhlIGxvYWQgYXZlcmFnZS4KKzIuIE5vdyB0aGF0IHdlIGhhdmUgRlVTRSwgcGx1cyB0aGUgZnJhbWV3b3JrIGZvciBkb2luZyBkZXZpY2UgZHJpdmVycyBpbgordXNlcnNwYWNlLCBpdCBnZXRzIGV2ZW4gbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIHNvbWUgdXNlcnNwYWNlIHByb2Nlc3NlcyBhcmUKK25vdyBkb2luZyB0aGUgc29ydHMgb2YgdGhpbmdzIHRoYXQga2VybmVsIHRocmVhZHMgZG8KKyhodHRwczovL2xpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnL3BpcGVybWFpbC9saW51eC1wbS8yMDA3LU1heS8wMTIzMDkuaHRtbCkuCisKK1RoZSBwcm9ibGVtIDEuIHNlZW1zIHRvIGJlIGZpeGFibGUsIGFsdGhvdWdoIGl0IGhhc24ndCBiZWVuIGZpeGVkIHNvIGZhci4gIFRoZQorb3RoZXIgb25lIGlzIG1vcmUgc2VyaW91cywgYnV0IGl0IHNlZW1zIHRoYXQgd2UgY2FuIHdvcmsgYXJvdW5kIGl0IGJ5IHVzaW5nCitoaWJlcm5hdGlvbiAoYW5kIHN1c3BlbmQpIG5vdGlmaWVycyAoaW4gdGhhdCBjYXNlLCB0aG91Z2gsIHdlIHdvbid0IGJlIGFibGUgdG8KK2F2b2lkIHRoZSByZWFsaXphdGlvbiBieSB0aGUgdXNlciBzcGFjZSBwcm9jZXNzZXMgdGhhdCB0aGUgaGliZXJuYXRpb24gaXMgdGFraW5nCitwbGFjZSkuCisKK1RoZXJlIGFyZSBhbHNvIHByb2JsZW1zIHRoYXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHRlbmRzIHRvIGV4cG9zZSwgYWx0aG91Z2gKK3RoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHJlcXVlc3RfZmlybXdhcmUoKSBpcworY2FsbGVkIGZyb20gYSBkZXZpY2UgZHJpdmVyJ3MgLnJlc3VtZSgpIHJvdXRpbmUsIGl0IHdpbGwgdGltZW91dCBhbmQgZXZlbnR1YWxseQorZmFpbCwgYmVjYXVzZSB0aGUgdXNlciBsYW5kIHByb2Nlc3MgdGhhdCBzaG91bGQgcmVzcG9uZCB0byB0aGUgcmVxdWVzdCBpcyBmcm96ZW4KK2F0IHRoaXMgcG9pbnQuICBTbywgc2VlbWluZ2x5LCB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gdGhlIGZyZWV6aW5nIG9mIHRhc2tzLgorU3VwcG9zZSwgaG93ZXZlciwgdGhhdCB0aGUgZmlybXdhcmUgZmlsZSBpcyBsb2NhdGVkIG9uIGEgZmlsZXN5c3RlbSBhY2Nlc3NpYmxlCitvbmx5IHRocm91Z2ggYW5vdGhlciBkZXZpY2UgdGhhdCBoYXNuJ3QgYmVlbiByZXN1bWVkIHlldC4gIEluIHRoYXQgY2FzZSwKK3JlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGZhaWwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZnJlZXppbmcgb2YgdGFza3MKK2lzIHVzZWQuICBDb25zZXF1ZW50bHksIHRoZSBwcm9ibGVtIGlzIG5vdCByZWFsbHkgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YKK3Rhc2tzLCBzaW5jZSBpdCBnZW5lcmFsbHkgZXhpc3RzIGFueXdheS4gIFtUaGUgc29sdXRpb24gdG8gdGhpcyBwYXJ0aWN1bGFyCitwcm9ibGVtIGlzIHRvIGtlZXAgdGhlIGZpcm13YXJlIGluIG1lbW9yeSBhZnRlciBpdCdzIGxvYWRlZCBmb3IgdGhlIGZpcnN0IHRpbWUKK2FuZCB1cGxvYWQgaWYgZnJvbSBtZW1vcnkgdG8gdGhlIGRldmljZSB3aGVuZXZlciBuZWNlc3NhcnkuXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9rZXJuZWxfdGhyZWFkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1Nzc4NC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUtFUk5FTCBUSFJFQURTCi0KLQotRnJlZXplcgotCi1VcG9uIGVudGVyaW5nIGEgc3VzcGVuZGVkIHN0YXRlIHRoZSBzeXN0ZW0gd2lsbCBmcmVlemUgYWxsCi10YXNrcy4gVGhpcyBpcyBkb25lIGJ5IGRlbGl2ZXJpbmcgcHNldWRvc2lnbmFscy4gVGhpcyBhZmZlY3RzCi1rZXJuZWwgdGhyZWFkcywgdG9vLiBUbyBzdWNjZXNzZnVsbHkgZnJlZXplIGEga2VybmVsIHRocmVhZAotdGhlIHRocmVhZCBoYXMgdG8gY2hlY2sgZm9yIHRoZSBwc2V1ZG9zaWduYWwgYW5kIGVudGVyIHRoZQotcmVmcmlnZXJhdG9yLiBDb2RlIHRvIGRvIHRoaXMgbG9va3MgbGlrZSB0aGlzOgotCi0JZG8gewotCQlodWJfZXZlbnRzKCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LCAhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7Ci0KLWZyb20gZHJpdmVycy91c2IvY29yZS9odWIuYzo6aHViX3RocmVhZCgpCi0KLQotVGhlIFVuZnJlZXphYmxlCi0KLVNvbWUga2VybmVsIHRocmVhZHMgaG93ZXZlciwgbXVzdCBub3QgYmUgZnJvemVuLiBUaGUga2VybmVsIG11c3QKLWJlIGFibGUgdG8gZmluaXNoIHBlbmRpbmcgSU8gb3BlcmF0aW9ucyBhbmQgbGF0ZXIgb24gYmUgYWJsZSB0bwotd3JpdGUgdGhlIG1lbW9yeSBpbWFnZSB0byBkaXNrLiBLZXJuZWwgdGhyZWFkcyBuZWVkZWQgdG8gZG8gSU8KLW11c3Qgc3RheSBhd2FrZS4gU3VjaCB0aHJlYWRzIG11c3QgbWFyayB0aGVtc2VsdmVzIHVuZnJlZXphYmxlCi1saWtlIHRoaXM6Ci0KLQkvKgotCSAqIFRoaXMgdGhyZWFkIGRvZXNuJ3QgbmVlZCBhbnkgdXNlci1sZXZlbCBhY2Nlc3MsCi0JICogc28gZ2V0IHJpZCBvZiBhbGwgb3VyIHJlc291cmNlcy4KLQkgKi8KLQlkYWVtb25pemUoInVzYi1zdG9yYWdlIik7Ci0KLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQotZnJvbSBkcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jOjp1c2Jfc3Rvcl9jb250cm9sX3RocmVhZCgpCi0KLVN1Y2ggZHJpdmVycyBhcmUgdGhlbXNlbHZlcyByZXNwb25zaWJsZSBmb3Igc3RheWluZyBxdWlldCBkdXJpbmcKLXRoZSBhY3R1YWwgc25hcHNob3R0aW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IDE1MmI1MTAuLmFlYTdlOTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTE0MCwyMSArMTQwLDExIEBACiB3ZWJzaXRlLCBhbmQgbm90IHRvIHRoZSBMaW51eCBLZXJuZWwgTWFpbGluZyBMaXN0LiBXZSBhcmUgd29ya2luZwogdG93YXJkIG1lcmdpbmcgc3VzcGVuZDIgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgogCi1ROiBBIGtlcm5lbCB0aHJlYWQgbXVzdCB2b2x1bnRhcmlseSBmcmVlemUgaXRzZWxmIChjYWxsICdyZWZyaWdlcmF0b3InKS4KLUkgZm91bmQgc29tZSBrZXJuZWwgdGhyZWFkcyB0aGF0IGRvbid0IGRvIGl0LCBhbmQgdGhleSBkb24ndCBmcmVlemUKLXNvIHRoZSBzeXN0ZW0gY2FuJ3Qgc2xlZXAuIElzIHRoaXMgYSBrbm93biBiZWhhdmlvcj8KK1E6IFdoYXQgaXMgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIGFuZCB3aHkgYXJlIHdlIHVzaW5nIGl0PwogCi1BOiBBbGwgc3VjaCBrZXJuZWwgdGhyZWFkcyBuZWVkIHRvIGJlIGZpeGVkLCBvbmUgYnkgb25lLiBTZWxlY3QgdGhlCi1wbGFjZSB3aGVyZSB0aGUgdGhyZWFkIGlzIHNhZmUgdG8gYmUgZnJvemVuIChubyBrZXJuZWwgc2VtYXBob3Jlcwotc2hvdWxkIGJlIGhlbGQgYXQgdGhhdCBwb2ludCBhbmQgaXQgbXVzdCBiZSBzYWZlIHRvIHNsZWVwIHRoZXJlKSwgYW5kCi1hZGQ6Ci0KLSAgICAgICB0cnlfdG9fZnJlZXplKCk7Ci0KLUlmIHRoZSB0aHJlYWQgaXMgbmVlZGVkIGZvciB3cml0aW5nIHRoZSBpbWFnZSB0byBzdG9yYWdlLCB5b3Ugc2hvdWxkCi1pbnN0ZWFkIHNldCB0aGUgUEZfTk9GUkVFWkUgcHJvY2VzcyBmbGFnIHdoZW4gY3JlYXRpbmcgdGhlIHRocmVhZCAoYW5kCi1iZSB2ZXJ5IGNhcmVmdWwpLgotCitBOiBUaGUgZnJlZXppbmcgb2YgdGFza3MgaXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUKK2tlcm5lbCB0aHJlYWRzIGFyZSBjb250cm9sbGVkIGR1cmluZyBoaWJlcm5hdGlvbiBvciBzeXN0ZW0td2lkZSBzdXNwZW5kIChvbiBzb21lCithcmNoaXRlY3R1cmVzKS4gIFNlZSBmcmVlemluZy1vZi10YXNrcy50eHQgZm9yIGRldGFpbHMuCiAKIFE6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAicGxhdGZvcm0iIGFuZCAic2h1dGRvd24iPwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CmluZGV4IGQ0MmQ5ODEuLjBjMjQzNDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CkBAIC00MiwxNSArNDIsMTYgQEAKICAgICAxKSBEZWZpbmluZyBjaGlsZCBub2RlcyBvZiBhbiBTT0MKICAgICAyKSBSZXByZXNlbnRpbmcgZGV2aWNlcyB3aXRob3V0IGEgY3VycmVudCBPRiBzcGVjaWZpY2F0aW9uCiAgICAgICBhKSBNRElPIElPIGRldmljZQotICAgICAgYykgUEhZIG5vZGVzCiAgICAgICBiKSBHaWFuZmFyLWNvbXBhdGlibGUgZXRoZXJuZXQgbm9kZXMKKyAgICAgIGMpIFBIWSBub2RlcwogICAgICAgZCkgSW50ZXJydXB0IGNvbnRyb2xsZXJzCiAgICAgICBlKSBJMkMKICAgICAgIGYpIEZyZWVzY2FsZSBTT0MgVVNCIGNvbnRyb2xsZXJzCiAgICAgICBnKSBGcmVlc2NhbGUgU09DIFNFQyBTZWN1cml0eSBFbmdpbmVzCiAgICAgICBoKSBCb2FyZCBDb250cm9sIGFuZCBTdGF0dXMgKEJDU1IpCiAgICAgICBpKSBGcmVlc2NhbGUgUVVJQ0MgRW5naW5lIG1vZHVsZSAoUUUpCi0gICAgICBnKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBqKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBrKSBHbG9iYWwgVXRpbGl0aWVzIEJsb2NrCiAKICAgVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKICAgICAxKSBpbnRlcnJ1cHRzIHByb3BlcnR5CkBAIC02MjYsNiArNjI3LDE0IEBACiBhIGxpc3Qgb2YgcHJvcGVydGllcywgYSBsaXN0IG9mIGNoaWxkIG5vZGVzLCBhbmQgYW4gZW5kIHRva2VuLiBFdmVyeQogY2hpbGQgbm9kZSBpcyBhIGZ1bGwgbm9kZSBzdHJ1Y3R1cmUgaXRzZWxmIGFzIGRlZmluZWQgYWJvdmUuCiAKK05PVEU6IFRoZSBhYm92ZSBkZWZpbml0aW9uIHJlcXVpcmVzIHRoYXQgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zIGZvcgorYSBwYXJ0aWN1bGFyIG5vZGUgTVVTVCBwcmVjZWRlIGFueSBzdWJub2RlIGRlZmluaXRpb25zIGZvciB0aGF0IG5vZGUuCitBbHRob3VnaCB0aGUgc3RydWN0dXJlIHdvdWxkIG5vdCBiZSBhbWJpZ3VvdXMgaWYgcHJvcGVydGllcyBhbmQKK3N1Ym5vZGVzIHdlcmUgaW50ZXJtaW5nbGVkLCB0aGUga2VybmVsIHBhcnNlciByZXF1aXJlcyB0aGF0IHRoZQorcHJvcGVydGllcyBjb21lIGZpcnN0ICh1cCB1bnRpbCBhdCBsZWFzdCAyLjYuMjIpLiAgQW55IHRvb2xzCittYW5pcHVsYXRpbmcgYSBmbGF0dGVuZWQgdHJlZSBtdXN0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGlzCitjb25zdHJhaW50LgorCiA0KSBEZXZpY2UgdHJlZSAic3RyaW5ncyIgYmxvY2sKIAogSW4gb3JkZXIgdG8gc2F2ZSBzcGFjZSwgcHJvcGVydHkgbmFtZXMsIHdoaWNoIGFyZSBnZW5lcmFsbHkgcmVkdW5kYW50LApAQCAtMTc4Miw2ICsxNzkxLDMzIEBACiAgCQlwYXJ0aXRpb24tbmFtZXMgPSAiZnNcMGZpcm13YXJlIjsKICAJfTsKIAorICAgaykgR2xvYmFsIFV0aWxpdGllcyBCbG9jaworCisgICBUaGUgZ2xvYmFsIHV0aWxpdGllcyBibG9jayBjb250cm9scyBwb3dlciBtYW5hZ2VtZW50LCBJL08gZGV2aWNlCisgICBlbmFibGluZywgcG93ZXItb24tcmVzZXQgY29uZmlndXJhdGlvbiBtb25pdG9yaW5nLCBnZW5lcmFsLXB1cnBvc2UKKyAgIEkvTyBzaWduYWwgY29uZmlndXJhdGlvbiwgYWx0ZXJuYXRlIGZ1bmN0aW9uIHNlbGVjdGlvbiBmb3IgbXVsdGlwbGV4ZWQKKyAgIHNpZ25hbHMsIGFuZCBjbG9jayBjb250cm9sLgorCisgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgICAgLSBjb21wYXRpYmxlIDogU2hvdWxkIGRlZmluZSB0aGUgY29tcGF0aWJsZSBkZXZpY2UgdHlwZSBmb3IKKyAgICAgIGdsb2JhbC11dGlsaXRpZXMuCisgICAgLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgorCisgIFJlY29tbWVuZGVkIHByb3BlcnRpZXM6CisKKyAgICAtIGZzbCxoYXMtcnN0Y3IgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgZ2xvYmFsIHV0aWxpdGllcyByZWdpc3RlciBzZXQKKyAgICAgIGNvbnRhaW5zIGEgZnVuY3Rpb25pbmcgInJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIiIChpLmUuIHRoZSBib2FyZAorICAgICAgaXMgd2lyZWQgdG8gcmVzZXQgdXBvbiBzZXR0aW5nIHRoZSBIUkVTRVRfUkVRIGJpdCBpbiB0aGlzIHJlZ2lzdGVyKS4KKworICAgIEV4YW1wbGU6CisKKwlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLyogZ2xvYmFsIHV0aWxpdGllcyBibG9jayAqLworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOworCQlyZWcgPSA8ZTAwMDAgMTAwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJfTsKKwogICAgTW9yZSBkZXZpY2VzIHdpbGwgYmUgZGVmaW5lZCBhcyB0aGlzIHNwZWMgbWF0dXJlcy4KIAogVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcnRjLnR4dCBiL0RvY3VtZW50YXRpb24vcnRjLnR4dAppbmRleCA3YzcwMWI4Li5jOTMxZDYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CkBAIC0zODUsNyArMzg1LDcgQEAKIAkJLyogbm90IGFsbCBSVENzIHN1cHBvcnQgcGVyaW9kaWMgSVJRcyAqLwogCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwgIlxuTm8gcGVyaW9kaWMgSVJRIHN1cHBvcnRcbiIpOwotCQkJcmV0dXJuIDA7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJcGVycm9yKCJSVENfSVJRUF9SRUFEIGlvY3RsIik7CiAJCWV4aXQoZXJybm8pOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJkOGYyLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNgorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLURvY3VtZW50YXRpb24gZm9yIHRoZSBBRDE4MTYoQSkgc291bmQgZHJpdmVyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbnN0YWxsYXRpb246Ci0tLS0tLS0tLS0tLS0tCi0KLVRvIGdldCB5b3VyIEFEMTgxNihBKSBiYXNlZCBzb3VuZCBjYXJkIHdvcmssIHlvdSdsbCBoYXZlIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotZXhwZXJpbWVudGFsIGNvZGUgKCJQcm9tcHQgZm9yIGRldmVsb3BtZW50IGFuZC9vciBpbmNvbXBsZXRlIGNvZGUvZHJpdmVycyIpCi1hbmQgaXNhcG5wICgiUGx1ZyBhbmQgUGxheSBzdXBwb3J0IiwgIklTQSBQbHVnIGFuZCBQbGF5IHN1cHBvcnQiKS4gRW5hYmxlCi0iU291bmQgY2FyZCBzdXBwb3J0IiwgIk9TUyBtb2R1bGVzIHN1cHBvcnQiIGFuZCAiU3VwcG9ydCBmb3IgQUQxODE2KEEpIGJhc2VkCi1jYXJkcyAoRVhQRVJJTUVOVEFMKSIgaW4gdGhlIHNvdW5kIGNvbmZpZ3VyYXRpb24gbWVudSwgdG9vLiBOb3cgYnVpbGQsIGluc3RhbGwKLWFuZCByZWJvb3QgdGhlIG5ldyBrZXJuZWwgYXMgdXN1YWwuCi0KLUZlYXR1cmVzOgotLS0tLS0tLS0tCi0KLUxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgotLSBmdWxsLWR1cGxleCBzdXBwb3J0Ci0tIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzOiB1bnNpZ25lZCA4Yml0LCBzaWduZWQgMTZiaXQgbGl0dGxlIGVuZGlhbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgMTZiaXQgYmlnIGVuZGlhbiwgtS1sYXcsIEEtbGF3Ci0tIHN1cHBvcnRlZCBjaGFubmVsczogbW9ubyBhbmQgc3RlcmVvCi0tIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlczogTWFzdGVyLCBDRCwgTGluZSwgTGluZTEsIExpbmUyLCBNaWMKLS0gc3VwcG9ydHMgcGhhdCAzZCBzdGVyZW8gY2lyY3VpdCAoTGluZSAzKQotCi0KLVN1cHBvcnRlZCBjYXJkczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBjYXJkcyBhcmUga25vd24gdG8gd29yayB3aXRoIHRoaXMgZHJpdmVyOgotLSBUZXJyYXRlYyBCYXNlIDEgCi0tIFRlcnJhdGVjIEJhc2UgNjQgCi0tIEhQIEtheWFrIAotLSBBY2VyIEZYLTNECi0tIFNZLTE4MTYgCi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAzMiBXYXZlIDNECi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAxNiAKLS0gQVZNIEFwZXggUHJvIGNhcmQgCi0tIChBenRlY2ggU0MtMTYgM0QpIAotLSAoTmV3Y29tIFNDLTE2IDNEKSAKLS0gKFRlcnJhdGVjIEVXUzY0UykgCi0KLUNhcmRzIGxpc3RlZCBpbiBicmFja2V0cyBhcmUgbm90IHN1cHBvcnRlZCByZWxpYWJsZS4gSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQgCi15b3Ugc2hvdWxkIGFkZCB0aGUgZXh0cmEgcGFyYW1ldGVyOgotICBvcHRpb25zPTEKLXdoZW4gbG9hZGluZyB0aGUgYWQxODE2IG1vZHVsZSB2aWEgbW9kcHJvYmUuIAotCi0KLVRyb3VibGVzaG9vdGluZzoKLS0tLS0tLS0tLS0tLS0tLS0KLQotRmlyc3Qgb2YgYWxsIHlvdSBzaG91bGQgY2hlY2ssIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4gbG9hZGVkCi1wcm9wZXJseS4KLQotSWYgbG9hZGluZyBvZiB0aGUgZHJpdmVyIHN1Y2NlZWRzLCBidXQgcGxheWJhY2svY2FwdHVyZSBmYWlscywgY2hlY2sKLWlmIHlvdSB1c2VkIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgaXJxLCBkbWEgYW5kIGRtYTIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCi1JZiBvbmUgb2YgdGhlbSBpcyB3cm9uZyB5b3UgdXN1YWxseSBnZXQgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotCi1Ob3YgIDYgMTc6MDY6MTMgdGVrMDEga2VybmVsOiBTb3VuZDogRE1BIChvdXRwdXQpIHRpbWVkIG91dCAtIElSUS9EUlEgY29uZmlnIGVycm9yPwotCi1JZiBwbGF5YmFjay9jYXB0dXJlIGlzIHRvbyBmYXN0IG9yIHRvIHNsb3csIHlvdSBzaG91bGQgaGF2ZSBhIGxvb2sgYXQKLXRoZSBjbG9jayBjaGlwIG9mIHlvdXIgc291bmQgY2FyZC4gVGhlIEFEMTgxNiB3YXMgZGVzaWduZWQgZm9yIGEgMzNNSHoKLW9zY2lsbGF0b3IsIGhvd2V2ZXIgbW9zdCBzb3VuZCBjYXJkIG1hbnVmYWN0dXJlciB1c2Ugc2xpZ2h0bHkKLWRpZmZlcmVudCBvc2NpbGxhdG9ycyBhcyB0aGV5IGFyZSBjaGVhcGVyIHRoYW4gMzNNSHogb3NjaWxsYXRvcnMuIElmCi15b3UgaGF2ZSBzdWNoIGEgY2FyZCB5b3UgaGF2ZSB0byBhZGp1c3QgdGhlIGFkMTgxNl9jbG9ja2ZyZXEgcGFyYW1ldGVyCi1hYm92ZS4gRm9yIGV4YW1wbGU6IEZvciBhIGNhcmQgdXNpbmcgYSAzMi44NzVNSHogb3NjaWxsYXRvciB1c2UKLWFkMTgxNl9jbG9ja2ZyZXE9MzI4NzUgaW5zdGVhZCBvZiBhZDE4MTZfY2xvY2tmcmVxPTMzMDAwLgotCi0KLVVwZGF0ZXMsIGJ1Z2ZpeGVzIGFuZCBidWdyZXBvcnRzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXMgdGhlIGRyaXZlciBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHVuZGVyIGRldmVsb3BtZW50LCB5b3Ugc2hvdWxkCi13YXRjaCBvdXQgZm9yIHVwZGF0ZXMuICBVcGRhdGVzIG9mIHRoZSBkcml2ZXIgYXJlIGF2YWlsYWJsZSBvbiB0aGUKLUludGVybmV0IGZyb20gb25lIG9mIG15IGhvbWUgcGFnZXM6Ci0gIGh0dHA6Ly93d3cuc3R1ZGVudC5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZS9+dGVrL3Byb2plY3RzL2xpbnV4Lmh0bWwKLW9yOgotICBodHRwOi8vd3d3LnR1LWRhcm1zdGFkdC5kZS9+dGVrMDEvcHJvamVjdHMvbGludXguaHRtbAotCi1CdWdyZXBvcnRzLCBidWdmaXhlcyBhbmQgcmVsYXRlZCBxdWVzdGlvbnMgc2hvdWxkIGJlIHNlbnQgdmlhIEUtTWFpbCB0bzoKLSAgdGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZQotCi1UaG9yc3RlbiBLbmFiZSA8dGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZT4KLUNocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KLQlMYXN0IG1vZGlmaWVkOiAyMDAwLzA5LzIwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9OTTI1NiBiL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTAzMjE3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBOZW9NYWdpYyAyNTZBVi8yNTZaWCBzb3VuZCBkcml2ZXIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotWW91J3JlIGxvb2tpbmcgYXQgdmVyc2lvbiAxLjEgb2YgdGhlIGRyaXZlci4gIChXb29ob28hKSBJdCBoYXMgYmVlbgotc3VjY2Vzc2Z1bGx5IHRlc3RlZCBhZ2FpbnN0IHRoZSBmb2xsb3dpbmcgbGFwdG9wIG1vZGVsczoKLQotCVNvbnkgWjUwNVMvWjUwNVNYL1o1MDVEWC9aNTA1UlgKLQlTb255IEYxNTAsIEYxNjAsIEYxODAsIEYyNTAsIEYyNzAsIEYyODAsIFBDRy1GMjYKLQlEZWxsIExhdGl0dWRlIENQaSwgQ1B0ICh2YXJpb3VzIHN1Ym1vZGVscykKLQotVGhlcmUgYXJlIGEgZmV3IGNhdmVhdHMsIHdoaWNoIGlzIHdoeSB5b3Ugc2hvdWxkIHJlYWQgdGhlIGVudGlyZXR5IG9mCi10aGlzIGRvY3VtZW50IGZpcnN0LgotCi1UaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIHdpdGhvdXQgYW55IHN1cHBvcnQgb3IgYXNzaXN0YW5jZSBmcm9tCi1OZW9NYWdpYy4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5LCBleHByZXNzZWQsIGltcGxpZWQsIG9yIG90aGVyd2lzZS4gIEl0Ci1pcyBmcmVlIHNvZnR3YXJlIGluIHRoZSBwdWJsaWMgZG9tYWluOyBmZWVsIGZyZWUgdG8gdXNlIGl0LCBzZWxsIGl0LAotZ2l2ZSBpdCB0byB5b3VyIGJlc3QgZnJpZW5kcywgZXZlbiBjbGFpbSB0aGF0IHlvdSB3cm90ZSBpdCAoYnV0IHdoeT8hKQotYnV0IGRvbid0IGdvIHdoaW5pbmcgdG8gbWUsIE5lb01hZ2ljLCBTb255LCBEZWxsLCBvciBhbnlvbmUgZWxzZQotd2hlbiBpdCBibG93cyB1cCB5b3VyIGNvbXB1dGVyLgotCi1WZXJzaW9uIDEuMSBjb250YWlucyBhIGNoYW5nZSB0byB0cnkgYW5kIGRldGVjdCBub24tQUM5NyB2ZXJzaW9ucyBvZgotdGhlIGhhcmR3YXJlLCBhbmQgbm90IGluc3RhbGwgaXRzZWxmIGFwcHJvcHJpYXRlbHkuICBJdCBzaG91bGQgYWxzbwotcmVpbml0aWFsaXplIHRoZSBoYXJkd2FyZSBvbiBhbiBBUE0gcmVzdW1lIGV2ZW50LCBhc3N1bWluZyB0aGF0IEFQTQotd2FzIGNvbmZpZ3VyZWQgaW50byB5b3VyIGtlcm5lbC4KLQotPT09PT09PT09PT09Ci1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1FbmFibGUgdGhlIHNvdW5kIGRyaXZlcnMsIHRoZSBPU1Mgc291bmQgZHJpdmVycywgYW5kIHRoZW4gdGhlIE5NMjU2Ci1kcml2ZXIuICBUaGUgTk0yNTYgZHJpdmVyICptdXN0KiBiZSBjb25maWd1cmVkIGFzIGEgbW9kdWxlIChpdCB3b24ndAotZ2l2ZSB5b3UgYW55IG90aGVyIGNob2ljZSkuCi0KLU5leHQsIGRvIHRoZSB1c3VhbCAibWFrZSBtb2R1bGVzIiBhbmQgIm1ha2UgbW9kdWxlc19pbnN0YWxsIi4KLUZpbmFsbHksIGluc21vZCB0aGUgc291bmRjb3JlLCBzb3VuZCBhbmQgbm0yNTYgbW9kdWxlcy4KLQotV2hlbiB0aGUgbm0yNTYgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQsIHlvdSBzaG91bGQgc2VlIGEgY291cGxlIG9mCi1jb25maXJtYXRpb24gbWVzc2FnZXMgaW4gdGhlIGtlcm5lbCBsb2dmaWxlIGluZGljYXRpbmcgdGhhdCBpdCBmb3VuZAotdGhlIGRldmljZSAodGhlIGRldmljZSBkb2VzICpub3QqIHVzZSBhbnkgSS9PIHBvcnRzIG9yIERNQSBjaGFubmVscykuCi1Ob3cgdHJ5IHBsYXlpbmcgYSB3YXYgZmlsZSwgZnV0eiB3aXRoIHRoZSBDRC1ST00gaWYgeW91IGhhdmUgb25lLCBldGMuCi0KLVRoZSBOTTI1NiBpcyBlbnRpcmVseSBhIFBDSS1iYXNlZCBkZXZpY2UsIGFuZCBhbGwgdGhlIG5lY2Vzc2FyeQotaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBjYXJkLiAgSXQgY2FuIG9ubHkgYmUKLWNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUgaW4gYSB2YWluIGF0dGVtcHQgdG8gcHJldmVudCBwZW9wbGUgZnJvbQotaHVydGluZyB0aGVtc2VsdmVzLiAgSXQgd29ya3MgY29ycmVjdGx5IGlmIGl0IHNoYXJlcyBhbiBJUlEgd2l0aAotYW5vdGhlciBkZXZpY2UgKGl0IG5vcm1hbGx5IHNoYXJlcyBJUlEgOSB3aXRoIHRoZSBidWlsdGluIGVlcHJvMTAwCi1ldGhlcm5ldCBvbiB0aGUgU29ueSBaNTA1IGxhcHRvcHMpLiAKLQotSXQgZG9lcyBub3QgcnVuIHRoZSBjYXJkIGluIGFueSBzb3J0IG9mIGNvbXBhdGliaWxpdHkgbW9kZS4gSXQgd2lsbAotbm90IHdvcmsgb24gbGFwdG9wcyB0aGF0IGhhdmUgdGhlIFNCMTYtY29tcGF0aWJsZSwgQUQxODQ4LWNvbXBhdGlibGUKLW9yIENTNDIzMi1jb21wYXRpYmxlIGNvZGVjL21peGVyOyB5b3Ugd2lsbCB3YW50IHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUKLWNvbXBhdGlibGUgT1NTIGRyaXZlciB3aXRoIHRoZXNlIGNoaXBzZXRzLiAgSSBjYW5ub3QgcHJvdmlkZSBhbnkKLWFzc2lzdGFuY2Ugd2l0aCBtYWNoaW5lcyB1c2luZyB0aGUgU0IxNiwgQUQxODQ4IG9yIENTNDIzMiBjb21wYXRpYmxlCi12ZXJzaW9ucy4gIChUaGUgZHJpdmVyIG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIG1peGVyIHZlcnNpb24sIGFuZAotd2lsbCByZWZ1c2UgdG8gbG9hZCBpZiBpdCBiZWxpZXZlcyB0aGUgaGFyZHdhcmUgaXMgbm90Ci1BQzk3LWNvbXBhdGlibGUuKQotCi1UaGUgc291bmQgc3VwcG9ydCBpcyB2ZXJ5IGJhc2ljLCBidXQgaXQgZG9lcyBpbmNsdWRlIHNpbXVsdGFuZW91cwotcGxheWJhY2sgYW5kIHJlY29yZCBjYXBhYmlsaXR5LiAgVGhlIG1peGVyIHN1cHBvcnQgaXMgYWxzbyBxdWl0ZQotc2ltcGxlLCBhbHRob3VnaCB0aGlzIGlzIGluIGtlZXBpbmcgd2l0aCB0aGUgcmF0aGVyIGxpbWl0ZWQKLWZ1bmN0aW9uYWxpdHkgb2YgdGhlIGNoaXBzZXQuCi0KLVRoZXJlIGlzIG5vIGhhcmR3YXJlIHN5bnRoZXNpemVyIGF2YWlsYWJsZSwgYXMgdGhlIExvc2Vkb3dzIE9QTC0zIGFuZAotTUlESSBzdXBwb3J0IGlzIGRvbmUgdmlhIGhhcmR3YXJlIGVtdWxhdGlvbi4KLQotT25seSB0aHJlZSByZWNvcmRpbmcgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBTb255OiB0aGUKLW1pY3JvcGhvbmUsIHRoZSBDRC1ST00gaW5wdXQsIGFuZCB0aGUgdm9sdW1lIGRldmljZSAod2hpY2ggY29ycmVzcG9uZHMKLXRvIHRoZSBzdGVyZW8gb3V0cHV0KS4gIChPdGhlciBkZXZpY2VzIG1heSBiZSBhdmFpbGFibGUgb24gb3RoZXIKLW1vZGVscyBvZiBsYXB0b3BzLikgIFRoZSBaNTA1IHNlcmllcyBkb2VzIG5vdCBoYXZlIGEgYnVpbHRpbiBDRC1ST00sCi1zbyBvZiBjb3Vyc2UgdGhlIENELVJPTSBpbnB1dCBkb2Vzbid0IHdvcmsuICBJdCBkb2VzIHdvcmsgb24gbGFwdG9wcwotd2l0aCBhIGJ1aWx0aW4gQ0QtUk9NIGRyaXZlLgotCi1UaGUgbWl4ZXIgZGV2aWNlIGRvZXMgbm90IGFwcGVhciB0byBoYXZlIGFueSB0b25lIGNvbnRyb2xzLCBhdCBsZWFzdAotb24gdGhlIFo1MDUgc2VyaWVzLiAgVGhlIG1peGVyIG1vZHVsZSBjaGVja3MgZm9yIHRvbmUgY29udHJvbHMgaW4gdGhlCi1BQzk3IG1peGVyLCBhbmQgd2lsbCBlbmFibGUgdGhlbSBpZiB0aGV5IGFyZSBhdmFpbGFibGUuCi0KLT09PT09PT09PT09PT09Ci1Lbm93biBwcm9ibGVtcwotPT09PT09PT09PT09PT0KLQotICAqIFRoZXJlIGFyZSBrbm93biBwcm9ibGVtcyB3aXRoIFBDTUNJQSBjYXJkcyBhbmQgdGhlIGVlcHJvMTAwIGV0aGVybmV0IAotICAgIGRyaXZlciBvbiB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWC4gIEtlZXAgcmVhZGluZy4KLQotICAqIFRoZXJlIGFyZSBhbHNvIHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIHVzaW5nIGEgdmlydHVhbCBYIGRpc3BsYXksIGFuZAotICAgIGFsc28gcHJvYmxlbXMgbG9hZGluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBYIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkLiAKLSAgICBLZWVwIHJlYWRpbmcuCi0KLSAgKiBUaGUgdm9sdW1lIGNvbnRyb2wgaXNuJ3QgYW55d2hlcmUgbmVhciBsaW5lYXIuICBTb3JyeS4gIFRoaXMgd2lsbCBiZQotICAgIGZpeGVkIGV2ZW50dWFsbHksIHdoZW4gSSBnZXQgc3VmZmljaWVudGx5IGFubm95ZWQgd2l0aCBpdC4gIChJIGRvdWJ0Ci0gICAgaXQgd2lsbCBldmVyIGJlIGZpeGVkIG5vdywgc2luY2UgSSd2ZSBuZXZlciBnb3R0ZW4gc3VmZmljaWVudGx5Ci0gICAgYW5ub3llZCB3aXRoIGl0IGFuZCBub2JvZHkgZWxzZSBzZWVtcyB0byBjYXJlLikKLQotICAqIFRoZXJlIGFyZSByZXBvcnRzIHRoYXQgdGhlIENELVJPTSB2b2x1bWUgaXMgdmVyeSBsb3cuICBTaW5jZSBJIGRvIG5vdAotICAgIGhhdmUgYSBDRC1ST00gZXF1aXBwZWQgbGFwdG9wLCBJIGNhbm5vdCB0ZXN0IHRoaXMgKGl0J3Mga2luZGEgaGFyZCB0bwotICAgIGRvIHJlbW90ZWx5KS4KLQotICAqIE9ubHkgOCBmaXhlZC1yYXRlIHNwZWVkcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBpcyBtYWlubHkgYSBjaGlwc2V0Ci0gICAgbGltaXRhdGlvbi4gIEl0IG1heSBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IG90aGVyIHNwZWVkcyBpbiB0aGUgZnV0dXJlLgotCi0gICogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgdGhlIHRlbGVwaG9uZSBtaXhlci9jb2RlYy4gIFRoZXJlIGlzIHN1cHBvcnQKLSAgICBmb3IgYSBwaG9uZWluL3Bob25lb3V0IGRldmljZSBpbiB0aGUgbWl4ZXIgZHJpdmVyOyAgd2hldGhlciBvciBub3QgCi0gICAgaXQgZG9lcyBhbnl0aGluZyBpcyBhbnlvbmUncyBndWVzcy4gIChSZXBvcnRzIG9uIHRoaXMgd291bGQgYmUKLSAgICBhcHByZWNpYXRlZC4gIFlvdSdsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0aGUgcGhvbmUgdG8KLSAgICBnbyBvZmYtaG9vayBiZWZvcmUgaXQnbGwgd29yaywgdGhvLikKLQotICAqIFRoaXMgZHJpdmVyIHdhcyBub3Qgd3JpdHRlbiB3aXRoIGFueSBjb29wZXJhdGlvbiBvciBzdXBwb3J0IGZyb20KLSAgICBOZW9NYWdpYy4gIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYWJvdXQgdGhpcywgc2VlIHRoZWlyIHdlYnNpdGUKLSAgICBmb3IgdGhlaXIgb2ZmaWNpYWwgc3RhbmNlIG9uIHN1cHBvcnRpbmcgb3BlbiBzb3VyY2UgZHJpdmVycy4KLQotPT09PT09PT09PT09Ci1WaWRlbyBtZW1vcnkKLT09PT09PT09PT09PQotCi1UaGUgTmVvTWFnaWMgc291bmQgZW5naW5lIHVzZXMgYSBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5IG1lbW9yeSB0byBob2xkCi10aGUgc291bmQgYnVmZmVyLiAgKENyYXp5LCBlaD8pICBUaGUgTmVvTWFnaWMgdmlkZW8gQklPUyBzZXRzIHVwIGEKLXNwZWNpYWwgcG9pbnRlciBhdCB0aGUgdG9wIG9mIHZpZGVvIFJBTSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgdG9wIG9mCi10aGUgYXVkaW8gYnVmZmVyIHNob3VsZCBiZSBwbGFjZWQuCi0KLUF0IHRoZSBwcmVzZW50IHRpbWUgWEZyZWU4NiBpcyBhcHBhcmVudGx5IG5vdCBhd2FyZSBvZiB0aGlzLiAgSXQgd2lsbAotdGh1cyB3cml0ZSBvdmVyIGVpdGhlciB0aGUgcG9pbnRlciBvciB0aGUgc291bmQgYnVmZmVyIHdpdGggYWJhbmRvbi4KLShBY2NlbGVyYXRlZC1YIHNlZW1zIHRvIGRvIGEgYmV0dGVyIGpvYiBoZXJlLikKLQotVGhpcyBpbXBsaWVzIGEgZmV3IHRoaW5nczoKLQotICAqIFNvbWV0aW1lcyB0aGUgTk0yNTYgZHJpdmVyIGhhcyB0byBndWVzcyBhdCB3aGVyZSB0aGUgYnVmZmVyIAotICAgIHNob3VsZCBiZSBwbGFjZWQsIGVzcGVjaWFsbHkgaWYgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYWZ0ZXIgdGhlCi0gICAgWCBzZXJ2ZXIgaXMgc3RhcnRlZC4gIEl0J3MgdXN1YWxseSBjb3JyZWN0LCBidXQgaXQgd2lsbCBjb25zaXN0ZW50bHkKLSAgICBmYWlsIG9uIHRoZSBTb255IEYyNTAuCi0KLSAgKiBWaXJ0dWFsIHNjcmVlbnMgZ3JlYXRlciB0aGFuIDEwMjR4NzY4eDE2IHVuZGVyIFhGcmVlODYgYXJlCi0gICAgcHJvYmxlbWF0aWMgb24gbGFwdG9wcyB3aXRoIG9ubHkgMi41TUIgb2Ygc2NyZWVuIFJBTS4gVGhpcwotICAgIGluY2x1ZGVzIGFsbCBvZiB0aGUgMjU2QVYtZXF1aXBwZWQgbGFwdG9wcy4gIChWaXJ0dWFsIGRpc3BsYXlzCi0gICAgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgMjU2WlgsIHdoaWNoIGhhcyBhdCBsZWFzdCA0TUIgb2YKLSAgICB2aWRlbyBSQU0uKQotCi1JZiB5b3Ugc3RhcnQgaGF2aW5nIHByb2JsZW1zIHdpdGggcmFuZG9tIG5vaXNlIGJlaW5nIG91dHB1dCBlaXRoZXIKLWNvbnN0YW50bHkgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gb24gdGhlIEYyNTApLCBvciB3aGVuIHdpbmRvd3MKLWFyZSBtb3ZlZCBhcm91bmQgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gd2hlbiB1c2luZyBhIHZpcnR1YWwKLXNjcmVlbiksIHRoZSBiZXN0IGZpeCBpcyB0bwotCi0gICogRG9uJ3QgdXNlIGEgdmlydHVhbCBmcmFtZSBidWZmZXIuCi0gICogTWFrZSBzdXJlIHlvdSBsb2FkIHRoZSBOTTI1NiBtb2R1bGUgYmVmb3JlIHRoZSBYIHNlcnZlciBpcwotICAgIHN0YXJ0ZWQuCi0KLU9uIHRoZSBGMjUwLCBpdCBpcyBwb3NzaWJsZSB0byBmb3JjZSB0aGUgZHJpdmVyIHRvIGxvYWQgcHJvcGVybHkgZXZlbgotYWZ0ZXIgdGhlIFhGcmVlODYgc2VydmVyIGlzIHN0YXJ0ZWQgYnkgZG9pbmc6Ci0KLQlpbnNtb2Qgbm0yNTYgYnVmZmVydG9wPTB4MjVhODAwCi0KLVRoaXMgZm9yY2VzIHRoZSBhdWRpbyBidWZmZXJzIHRvIHRoZSBjb3JyZWN0IG9mZnNldCBpbiBzY3JlZW4gUkFNLgotCi1PbmUgdXNlciBoYXMgcmVwb3J0ZWQgYSBzaW1pbGFyIHByb2JsZW0gb24gdGhlIFNvbnkgRjI3MCwgYWx0aG91Z2gKLW90aGVycyBhcHBhcmVudGx5IGFyZW4ndCBzZWVpbmcgYW55IHByb2JsZW1zLiAgSGlzIHN1Z2dlc3RlZCBjb21tYW5kCi1pcwotCi0JaW5zbW9kIG5tMjU2IGJ1ZmZlcnRvcD0weDI3MjgwMAotCi09PT09PT09PT09PT09PT09PQotT2ZmaWNpYWwgV1dXIHNpdGUKLT09PT09PT09PT09PT09PT09Ci0KLVRoZSBvZmZpY2lhbCBzaXRlIGZvciB0aGUgTk0yNTYgZHJpdmVyIGlzOgotCi0JaHR0cDovL3d3dy51Z2x4Lm9yZy9zb255Lmh0bWwKLQotWW91IHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgdGhlcmUsCi1hbmQgdGhlIGRyaXZlciB3aWxsIGJlIHN1cHBvcnRlZCBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4KLQotPT09PT09PT09PT09PT0KLVo1MDVSWCBhbmQgSURFCi09PT09PT09PT09PT09PQotCi1UaGVyZSBhcHBlYXJzIHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBJREUgY2hpcHNldCBvbiB0aGUgWjUwNVJYOyBvbmUKLW9mIHRoZSBzeW1wdG9tcyBpcyB0aGF0IHNvdW5kIHBsYXliYWNrIHBlcmlvZGljYWxseSBoYW5ncyAod2hlbiB0aGUKLWRpc2sgaXMgYWNjZXNzZWQpLiAgVGhlIHVzZXIgcmVwb3J0aW5nIHRoZSBwcm9ibGVtIGFsc28gcmVwb3J0ZWQgdGhhdAotZW5hYmxpbmcgYWxsIG9mIHRoZSBJREUgY2hpcHNldCB3b3JrYXJvdW5kcyBpbiB0aGUga2VybmVsIHNvbHZlZCB0aGUKLXByb2JsZW0sIHRobyBvYnZpb3VzbHkgb25seSBvbmUgb2YgdGhlbSBzaG91bGQgYmUgbmVlZGVkLS1pZiBzb21lb25lCi1jYW4gZ2l2ZSBtZSBtb3JlIGRldGFpbHMgSSB3b3VsZCBhcHByZWNpYXRlIGl0LgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVo1MDVTL1o1MDVTWCBvbi1ib2FyZCBFdGhlcm5ldAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdSdyZSB1c2luZyB0aGUgb24tYm9hcmQgRXRoZXJuZXQgUHJvLzEwMCBldGhlcm5ldCBzdXBwb3J0IG9uIHRoZSBaNTA1Ci1zZXJpZXMsIEkgc3Ryb25nbHkgZW5jb3VyYWdlIHlvdSB0byBkb3dubG9hZCB0aGUgbGF0ZXN0IGVlcHJvMTAwIGRyaXZlciBmcm9tCi1Eb25hbGQgQmVja2VyJ3Mgc2l0ZToKLQotCWZ0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L3B1Yi9saW51eC9kcml2ZXJzL3Rlc3QvZWVwcm8xMDAuYwotCi1UaGVyZSB3YXMgYSByZXBvcnRlZCBwcm9ibGVtIG9uIHRoZSBaNTA1U1ggdGhhdCBpZiB0aGUgZXRoZXJuZXQKLWludGVyZmFjZSBpcyBkaXNhYmxlZCBhbmQgcmVlbmFibGVkIHdoaWxlIHRoZSBzb3VuZCBkcml2ZXIgaXMgbG9hZGVkLAotdGhlIG1hY2hpbmUgd291bGQgbG9jayB1cC4gIEkgaGF2ZSBpbmNsdWRlZCBhIHdvcmthcm91bmQgdGhhdCBpcwotd29ya2luZyBzYXRpc2ZhY3RvcmlseS4gIEhvd2V2ZXIsIHlvdSBtYXkgb2NjYXNpb25hbGx5IHNlZSBhIG1lc3NhZ2UKLWFib3V0ICJSZWxlYXNpbmcgaW50ZXJydXB0cywgb3ZlciAxMDAwIGJhZCBpbnRlcnJ1cHRzIiB3aGljaCBpbmRpY2F0ZXMKLXRoYXQgdGhlIHdvcmthcm91bmQgaXMgZG9pbmcgaXRzIGpvYi4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUENNQ0lBIGFuZCB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBpcyBhbHNvIGEga25vd24gcHJvYmxlbSB3aXRoIHRoZSBTb255IFo1MDVTIGFuZCBaNTA1U1ggaGFuZ2luZwotaWYgYSBQQ01DSUEgY2FyZCBpcyBpbnNlcnRlZCB3aGlsZSB0aGUgZXRoZXJuZXQgZHJpdmVyIGlzIGxvYWRlZCwgb3IKLWluIHNvbWUgY2FzZXMgaWYgdGhlIGxhcHRvcCBpcyBzdXNwZW5kZWQuICBUaGlzIGlzIGNhdXNlZCBieSB0b25zIG9mCi1zcHVyaW91cyBJUlEgOXMsIHByb2JhYmx5IGdlbmVyYXRlZCBmcm9tIHRoZSBQQ01DSUEgb3IgQUNQSSBicmlkZ2VzLgotCi1UaGVyZSBpcyBjdXJyZW50bHkgbm8gZml4IGZvciB0aGUgcHJvYmxlbSB0aGF0IHdvcmtzIGluIGV2ZXJ5IGNhc2UuCi1UaGUgb25seSBrbm93biB3b3JrYXJvdW5kcyBhcmUgdG8gZGlzYWJsZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlCi1iZWZvcmUgaW5zZXJ0aW5nIG9yIHJlbW92aW5nIGEgUENNQ0lBIGNhcmQsIG9yIHdpdGggc29tZSBjYXJkcwotZGlzYWJsaW5nIHRoZSBQQ01DSUEgY2FyZCBiZWZvcmUgZWplY3RpbmcgaXQgd2lsbCBhbHNvIGhlbHAgdGhlCi1wcm9ibGVtIHdpdGggdGhlIGxhcHRvcCBoYW5naW5nIHdoZW4gdGhlIGNhcmQgaXMgZWplY3RlZC4KLQotT25lIHVzZXIgaGFzIHJlcG9ydGVkIHRoYXQgc2V0dGluZyB0aGUgdGNpYydzIGNzX2lycSB0byBzb21lIHZhbHVlCi1vdGhlciB0aGFuIDkgKGxpa2UgMTEpIGZpeGVkIHRoZSBwcm9ibGVtLiAgVGhpcyBkb2Vzbid0IHdvcmsgb24gbXkKLVo1MDVTLCBob3dldmVyLS1jaGFuZ2luZyB0aGUgdmFsdWUgY2F1c2VzIHRoZSBjYXJkbWdyIHRvIHN0b3Agc2VlaW5nCi1jYXJkIGluc2VydGlvbnMgYW5kIHJlbW92YWxzLCBjYXJkcyBkb24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5LCBhbmQKLUkgc3RpbGwgZ2V0IGhhbmdzIGlmIGEgY2FyZCBpcyBpbnNlcnRlZCB3aGVuIHRoZSBrZXJuZWwgaXMgYm9vdGVkLgotCi1Vc2luZyB0aGUgbGF0ZXN0IGV0aGVybmV0IGRyaXZlciBhbmQgcGNtY2lhIHBhY2thZ2UgYWxsb3dzIG1lIHRvCi1pbnNlcnQgYW4gQWRhcHRlYyAxNDgwQSBTbGltU2NzaSBjYXJkIHdpdGhvdXQgdGhlIGxhcHRvcCBoYW5naW5nLAotYWx0aG91Z2ggSSBzdGlsbCBoYXZlIHRvIHNodXQgZG93biB0aGUgY2FyZCBiZWZvcmUgZWplY3Rpbmcgb3IKLXBvd2VyaW5nIGRvd24gdGhlIGxhcHRvcC4gIEhvd2V2ZXIsIHNpbWlsYXIgZXhwZXJpbWVudHMgd2l0aCBhIERFLTY2MAotZXRoZXJuZXQgY2FyZCBzdGlsbCByZXN1bHQgaW4gaGFuZ3Mgd2hlbiB0aGUgY2FyZCBpcyBpbnNlcnRlZC4gIEkgYW0KLWJlZ2lubmluZyB0byB0aGluayB0aGF0IHRoZSBpbnRlcnJ1cHRzIGFyZSBDYXJkQnVzLXJlbGF0ZWQsIHNpbmNlIHRoZQotQWRhcHRlYyBjYXJkIGlzIGEgQ2FyZEJ1cyBjYXJkLCBhbmQgdGhlIERFLTY2MCBpcyBub3Q7IGhvd2V2ZXIsIEkKLWRvbid0IGhhdmUgYW55IG90aGVyIENhcmRCdXMgY2FyZHMgdG8gdGVzdCB3aXRoLgotCi09PT09PT0KLVRoYW5rcwotPT09PT09Ci0KLUZpcnN0LCBJIHdhbnQgdG8gdGhhbmsgZXZlcnlvbmUgKGV4Y2VwdCBOZW9NYWdpYyBvZiBjb3Vyc2UpIGZvciB0aGVpcgotZ2VuZXJvdXMgc3VwcG9ydCBhbmQgZW5jb3VyYWdlbWVudC4gIEknZCBsaWtlIHRvIGxpc3QgZXZlcnlvbmUncyBuYW1lCi1oZXJlIHRoYXQgcmVwbGllZCBkdXJpbmcgdGhlIGRldmVsb3BtZW50IHBoYXNlLCBidXQgdGhlIGxpc3QgaXMKLWFtYXppbmdseSBsb25nLgotCi1JIHdpbGwgYmUgcmF0aGVyIHVuZmFpciBhbmQgc2luZ2xlIG91dCBhIGZldyBwZW9wbGUsIGhvd2V2ZXI6Ci0KLQlKdXN0aW4gTWF1cmVyLCBmb3IgYmVpbmcgdGhlIGZpcnN0IHJhbmRvbSBuZXQucGVyc29uIHRvIHRyeSBpdCwKLQlhbmQgZm9yIGxldHRpbmcgbWUgbG9naW4gdG8gaGlzIFo1MDVTWCB0byBnZXQgaXQgd29ya2luZyB0aGVyZQotCi0JRWRpIFdlaXR6IGZvciB0cnlpbmcgb3V0IHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zLCBhbmQgZ2l2aW5nCi0JbWUgYSBsb3Qgb2YgdXNlZnVsIGZlZWRiYWNrCi0KLQlHcmVnIFJ1bXBsZSBmb3IgbGV0dGluZyBtZSBsb2dpbiByZW1vdGVseSB0byBnZXQgdGhlIGRyaXZlciAKLQlmdW5jdGlvbmFsIG9uIHRoZSAyNTZaWCwgZm9yIGhpcyBhc3Npc3RhbmNlIG9uIHRyYWNraW5nCi0JZG93biBhbGwgc29ydHMgb2YgcmFuZG9tIHN0dWZmLCBhbmQgZm9yIHRyeWluZyBvdXQgQWNjZWwtWAotCi0JWmFjaCBCcm93biwgZm9yIHRoZSBpbml0aWFsIEFDOTcgbWl4ZXIgaW50ZXJmYWNlIGRlc2lnbgotCi0JSmVmZiBHYXJ6aWssIGZvciB2YXJpb3VzIGhlbHBmdWwgc3VnZ2VzdGlvbnMgb24gdGhlIEFDOTcKLQlpbnRlcmZhY2UKLQotCSJNci4gQnVtcHkiIGZvciBmZWVkYmFjayBvbiB0aGUgWjUwNVJYCi0KLQlCaWxsIE5vdHRpbmdoYW0sIGZvciBnZW5lcm91cyBhc3Npc3RhbmNlIGluIGdldHRpbmcgdGhlIG1peGVyIElECi0JY29kZSB3b3JraW5nCi0KLT09PT09PT09PT09PT09PT09Ci1QcmV2aW91cyB2ZXJzaW9ucwotPT09PT09PT09PT09PT09PT0KLQotVmVyc2lvbnMgcHJpb3IgdG8gMC4zIChha2EgYG5vbmFtZScpIGhhZCBwcm9ibGVtcyB3aXRoIHdlaXJkIGFydGlmYWN0cwotaW4gdGhlIG91dHB1dCBhbmQgZmFpbGVkIHRvIHNldCB0aGUgcmVjb3JkaW5nIHJhdGUgcHJvcGVybHkuICBUaGVzZQotcHJvYmxlbXMgaGF2ZSBsb25nIHNpbmNlIGJlZW4gZml4ZWQuCi0KLVZlcnNpb25zIHByaW9yIHRvIDAuNSBoYWQgcHJvYmxlbXMgd2l0aCBjbGlja3MgaW4gdGhlIG91dHB1dCB3aGVuCi1hbnl0aGluZyBvdGhlciB0aGFuIDE2LWJpdCBzdGVyZW8gc291bmQgd2FzIGJlaW5nIHBsYXllZCwgYW5kIGFsc28gaGFkCi1wZXJpb2RpYyBjbGlja3Mgd2hlbiByZWNvcmRpbmcuCi0KLVZlcnNpb24gMC43IGZpcnN0IGluY29ycG9yYXRlZCBzdXBwb3J0IGZvciB0aGUgTk0yNTZaWCBjaGlwc2V0LCB3aGljaAotaXMgZm91bmQgb24gc29tZSBEZWxsIExhdGl0dWRlIGxhcHRvcHMgKHRoZSBDUHQsIGFuZCBhcHBhcmVudGx5Ci1zb21lIENQaSBtb2RlbHMgYXMgd2VsbCkuICBJdCBhbHNvIGluY2x1ZGVkIHRoZSBnZW5lcmljIEFDOTcKLW1peGVyIG1vZHVsZS4KLQotVmVyc2lvbiAwLjc1IHJlbmFtZWQgYWxsIHRoZSBmdW5jdGlvbnMgYW5kIGZpbGVzIHdpdGggc2xpZ2h0bHkgbW9yZQotZ2VuZXJpYyBuYW1lcy4KLQotTm90ZSB0aGF0IHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQgY2xhaW1lZCB0aGF0IHJlY29yZGluZyB3YXMKLTgtYml0IG9ubHk7IGl0IGFjdHVhbGx5IGhhcyBiZWVuIHdvcmtpbmcgZm9yIDE2LWJpdHMgYWxsIGFsb25nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvT1BMMy1TQTIgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNmQyYi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi1Eb2N1bWVudGF0aW9uIGZvciB0aGUgT1BMMy1TQTIsIFNBMywgYW5kIFNBeCBkcml2ZXIgKG9wbDNzYTIubykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TY290dCBNdXJyYXksIHNjb3R0QHNwaXRlZnVsLm9yZwotSmFudWFyeSA3LCAyMDAxCi0KLU5PVEU6IEFsbCB0cmFkZS1tYXJrZWQgdGVybXMgbWVudGlvbmVkIGJlbG93IGFyZSBwcm9wZXJ0aWVzIG9mIHRoZWlyCi0gICAgICByZXNwZWN0aXZlIG93bmVycy4KLQotCi1TdXBwb3J0ZWQgRGV2aWNlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBkcml2ZXIgaXMgZm9yIFBuUCBzb3VuZGNhcmRzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgWWFtYWhhIGF1ZGlvCi1jb250cm9sbGVyIGNoaXBzZXRzOgotCi1ZTUY3MTEgYWthIE9QTDMtU0EyCi1ZTUY3MTUgYW5kIFlNRjcxOSBha2EgT1BMMy1TQTMKLQotVXAgdW50aWwgcmVjZW50bHkgKERlY2VtYmVyIDIwMDApLCBJJ2QgdGhvdWdodCB0aGUgNzE5IHRvIGJlIGEKLWRpZmZlcmVudCBjaGlwc2V0LCB0aGUgT1BMMy1TQXguICBBZnRlciBhbiBlbWFpbCBleGhhbmdlIHdpdGgKLVlhbWFoYSwgaG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIDcxOSBpcyBqdXN0IGEgcmUtYmFkZ2VkCi03MTUsIGFuZCB0aGUgY2hpcHNldHMgYXJlIGlkZW50aWNhbC4gIFRoZSBjaGlwc2V0IGRldGVjdGlvbiBjb2RlCi1oYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcy4KLQotQW55d2F5cywgYWxsIG9mIHRoZXNlIGNoaXBzZXRzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGRldmljZXM6Ci0KLU9QTDMgRk0gc3ludGhlc2l6ZXIKLVNvdW5kYmxhc3RlciBQcm8KLU1pY3Jvc29mdC9XaW5kb3dzIFNvdW5kIFN5c3RlbQotTVBVNDAxIE1JREkgaW50ZXJmYWNlCi0KLU5vdGUgdGhhdCB0aGlzIGRyaXZlciB1c2VzIHRoZSBNU1MgZGV2aWNlLCBhbmQgdG8gbXkga25vd2xlZGdlIHRoZXNlCi1jaGlwc2V0cyBlbmZvcmNlIGFuIGVpdGhlci9vciBzaXR1YXRpb24gd2l0aCB0aGUgU291bmRibGFzdGVyIFBybwotZGV2aWNlIGFuZCB0aGUgTVNTIGRldmljZS4gIFNpbmNlIHRoZSBNU1MgZGV2aWNlIGhhcyBiZXR0ZXIKLWNhcGFiaWxpdGllcywgSSBoYXZlIGltcGxlbWVudGVkIHRoZSBkcml2ZXIgdG8gdXNlIGl0LgotCi0KLU1peGVyIENoYW5uZWxzCi0tLS0tLS0tLS0tLS0tLQotCi1PbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlciAocHJlLURlY2VtYmVyIDIwMDApIGhhZCB0d28gbWl4ZXJzLAotYW4gT1BMMy1TQTIgb3IgU0EzIG1peGVyIGFuZCBhIE1TUyBtaXhlci4gIFRoZSBPUEwzLVNBWzIzXSBtaXhlcgotZGV2aWNlIGNvbnRhaW5lZCBhIHN1cGVyc2V0IG9mIG1peGVyIGNoYW5uZWxzIGNvbnNpc3Rpbmcgb2YgaXRzIG93bgotY2hhbm5lbHMgYW5kIGFsbCBvZiB0aGUgTVNTIG1peGVyIGNoYW5uZWxzLiAgVG8gc2ltcGxpZnkgdGhlIGRyaXZlcgotY29uc2lkZXJhYmx5LCBhbmQgdG8gcGFydGl0aW9uIGZ1bmN0aW9uYWxpdHkgYmV0dGVyLCB0aGUgT1BMMy1TQVsyM10KLW1peGVyIGRldmljZSBub3cgY29udGFpbnMgaGFzIGl0cyBvd24gc3BlY2lmaWMgbWl4ZXIgY2hhbm5lbHMuICBUaGV5Ci1hcmU6Ci0KLVZvbHVtZSAgICAgLSBIYXJkd2FyZSBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wKLUJhc3MgICAgICAgLSBTQTMgb25seSwgbm93IHN1cHBvcnRzIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzCi1UcmVibGUgICAgIC0gU0EzIG9ubHksIG5vdyBzdXBwb3J0cyBsZWZ0IGFuZCByaWdodCBjaGFubmVscwotTWljcm9waG9uZSAtIEhhcmR3YXJlIG1pY3JvcGhvbmUgaW5wdXQgdm9sdW1lIGNvbnRyb2wKLURpZ2l0YWwxICAgLSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgIldpZGUiIG1peGVyCi0KLUFsbCBvdGhlciBtaXhlciBjaGFubmVscyAoZS5nLiAiUENNIiwgIkNEIiwgZXRjLikgbm93IGhhdmUgdG8gYmUKLWNvbnRyb2xsZWQgdmlhIHRoZSAiTVMgU291bmQgU3lzdGVtIChDUzQyMzEpIiBtaXhlci4gIFRvIGZhY2lsaXRhdGUKLXRoaXMsIHRoZSBtaXhlciBkZXZpY2UgY3JlYXRpb24gb3JkZXIgaGFzIGJlZW4gc3dpdGNoZWQgc28gdGhhdAotdGhlIE1TUyBtaXhlciBpcyBjcmVhdGVkIGZpcnN0LiAgVGhpcyBhbGxvd3MgYWNjZXNzaW5nIHRoZSBtYWpvcml0eQotb2YgdGhlIHVzZWZ1bCBtaXhlciBjaGFubmVscyBldmVuIHZpYSBzaW5nbGUgbWl4ZXItYXdhcmUgdG9vbHMKLXN1Y2ggYXMgImF1bWl4Ii4KLQotCi1QbHVnICduIFBsYXkKLS0tLS0tLS0tLS0tLQotCi1JbiBwcmV2aW91cyBrZXJuZWxzICgyLjIueCksIHNvbWUgY29uZmlndXJhdGlvbiB3YXMgcmVxdWlyZWQgdG8KLWdldCB0aGUgZHJpdmVyIHRvIHRhbGsgdG8gdGhlIGNhcmQuICBCZWluZyB0aGUgbmV3IG1pbGxlbm5pdW0gYW5kCi1hbGwsIHRoZSAyLjQueCBrZXJuZWxzIG5vdyBzdXBwb3J0IGF1dG8tY29uZmlndXJhdGlvbiBpZiBJU0EgUG5QCi1zdXBwb3J0IGlzIGNvbmZpZ3VyZWQgaW4uICBUaGVvcmV0aWNhbGx5LCB0aGUgZHJpdmVyIGV2ZW4gc3VwcG9ydHMKLWhhdmluZyBtb3JlIHRoYW4gb25lIGNhcmQgaW4gdGhpcyBjYXNlLgotCi1XaXRoIHRoZSBhZGRpdGlvbiBvZiBQblAgc3VwcG9ydCB0byB0aGUgZHJpdmVyLCB0d28gbmV3IHBhcmFtZXRlcnMKLWhhdmUgYmVlbiBhZGRlZCB0byBjb250cm9sIGl0OgotCi1pc2FwbnAgICAtIHNldCB0byAwIHRvIGRpc2FibGUgSVNBIFBuUCBjYXJkIGRldGVjdGlvbgotCi1tdWx0aXBsZSAtIHNldCB0byAwIHRvIGRpc2FibGUgbXVsdGlwbGUgUG5QIGNhcmQgZGV0ZWN0aW9uCi0KLQotT3B0aW9uYWwgUGFyYW1ldGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWNlbnQgKERlY2VtYmVyIDIwMDApIGFkZGl0aW9ucyB0byB0aGUgZHJpdmVyIChiYXNlZCBvbiBhIHBhdGNoCi1wcm92aWRlZCBieSBQZXRlciBFbmdsbWFpZXIpIGFyZSB0d28gbmV3IHBhcmFtZXRlcnM6Ci0KLXltb2RlIC0gICAgU2V0IFlhbWFoYSAzRCBlbmhhbmNlbWVudCBtb2RlOgotICAgICAgICAgICAwID0gRGVza3RvcC9Ob3JtYWwgIDUtMTIgY20gc3BlYWtlcnMKLSAgICAgICAgICAgMSA9IE5vdGVib29rIFBDICgxKSAzIGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDIgPSBOb3RlYm9vayBQQyAoMikgMS41IGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDMgPSBIaS1GaSAgICAgICAgICAgMTYtMzggY20gc3BlYWtlcnMKLQotbG9vcGJhY2sgLSBTZXQgQS9EIGlucHV0IHNvdXJjZS4gVXNlZnVsIGZvciBlY2hvIGNhbmNlbGxhdGlvbjoKLSAgICAgICAgICAgMCA9IE1pYyBSaWdodCBjaGFubmVsIChkZWZhdWx0KQotICAgICAgICAgICAxID0gTW9ubyBvdXRwdXQgbG9vcGJhY2sKLQotVGhlIHltb2RlIHBhcmFtZXRlciBoYXMgYmVlbiB0ZXN0ZWQgYW5kIGRvZXMgd29yay4gIFRoZSBsb29wYmFjawotcGFyYW1ldGVyLCBob3dldmVyLCBpcyB1bnRlc3RlZC4gIEFueSBmZWVkYmFjayBvbiBpdHMgdXNlZnVsbmVzcwotd291bGQgYmUgYXBwcmVjaWF0ZWQuCi0KLQotTWFudWFsIENvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGZvciBzb21lIHJlYXNvbiB5b3UgZGVjaWRlIG5vdCB0byBjb21waWxlIElTQSBQblAgc3VwcG9ydCBpbnRvCi15b3VyIGtlcm5lbCwgb3IgZGlzYWJsZWQgdGhlIGRyaXZlcidzIHVzYWdlIG9mIGl0IGJ5IHNldHRpbmcgdGhlCi1pc2FwbnAgcGFyYW1ldGVyIGFzIGRpc2N1c3NlZCBhYm92ZSwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGRvIHNvbWUKLW1hbnVhbCBjb25maWd1cmF0aW9uLiAgVGhlcmUgYXJlIHR3byB3YXlzIG9mIGRvaW5nIHRoaXMuICBUaGUgbW9zdAotY29tbW9uIGlzIHRvIHVzZSB0aGUgaXNhcG5wdG9vbHMgcGFja2FnZSB0byBpbml0aWFsaXplIHRoZSBjYXJkLCBhbmQKLXVzZSB0aGUga2VybmVsIG1vZHVsZSBmb3JtIG9mIHRoZSBzb3VuZCBzdWJzeXN0ZW0gYW5kIHNvdW5kIGRyaXZlcnMuCi1BbHRlcm5hdGl2ZWx5LCBzb21lIEJJT1MncyBhbGxvdyBtYW51YWwgY29uZmlndXJhdGlvbiBvZiBpbnN0YWxsZWQKLVBuUCBkZXZpY2VzIGluIGEgQklPUyBtZW51LCB3aGljaCBzaG91bGQgYWxsb3cgdXNpbmcgdGhlIG5vbi1tb2R1bGFyCi1zb3VuZCBkcml2ZXJzLCBpLmUuIGJ1aWx0IGludG8gdGhlIGtlcm5lbC4KLQotSSBwZXJzb25hbGx5IHVzZSBpc2FwbnAgYW5kIG1vZHVsZXMsIGFuZCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gYSBQblAKLUJJT1MgbWFjaGluZSB0byB0ZXN0LiAgSWYgeW91IGhhdmUgc3VjaCBhIGJlYXN0LCBjb25maWd1cmluZyB0aGUKLWRyaXZlciB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwgc2hvdWxkIGp1c3Qgd29yayAodGhhbmtzIHRvIHdvcmsKLWRvbmUgYnkgRGF2aWQgTHV5ZXIgPGx1eWVyQHVjcy51d2EuZWR1LmF1PikuICBZb3Ugd2lsbCBzdGlsbCBuZWVkCi10byBzcGVjaWZ5IHNldHRpbmdzLCB3aGljaCBjYW4gYmUgZG9uZSBieSBhZGRpbmc6Ci0KLW9wbDNzYTI9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4sPG1zc2lvPiw8bXB1aW8+Ci0KLXRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6Ci0KLW9wbDNzYTI9MHgzNzAsNSwwLDEsMHg1MzAsMHgzMzAKLQotSWYgeW91IGFyZSBpbnN0ZWFkIHVzaW5nIHRoZSBpc2FwbnAgdG9vbHMgKGFzIG1vc3QgcGVvcGxlIGhhdmUgYmVlbgotYmVmb3JlIExpbnV4IDIuNC54KSwgZm9sbG93IHRoZSBkaXJlY3Rpb25zIGluIHRoZWlyIGRvY3VtZW50YXRpb24gdG8KLXByb2R1Y2UgYSBjb25maWd1cmF0aW9uIGZpbGUuICBIZXJlIGlzIHRoZSByZWxldmFudCBleGNlcnB0IEkgdXNlZCB0bwotdXNlIGZvciBteSBTQTMgY2FyZCBmcm9tIG15IGlzYXBucC5jb25mOgotCi0oQ09ORklHVVJFIFlNSDA4MDAvLTEgKExEIDAKLQotIyBOT1RFOiBJTyAwIGlzIGZvciB0aGUgdW51c2VkIFNvdW5kQmxhc3RlciBwYXJ0IG9mIHRoZSBjaGlwc2V0LgotKElPIDAgKEJBU0UgMHgwMjIwKSkKLShJTyAxIChCQVNFIDB4MDUzMCkpCi0oSU8gMiAoQkFTRSAweDAzODgpKQotKElPIDMgKEJBU0UgMHgwMzMwKSkKLShJTyA0IChCQVNFIDB4MDM3MCkpCi0oSU5UIDAgKElSUSA1IChNT0RFICtFKSkpCi0oRE1BIDAgKENIQU5ORUwgMCkpCi0oRE1BIDEgKENIQU5ORUwgMSkpCi0KLUhlcmUsIG5vdGUgdGhhdDoKLQotUG9ydCAgQWNjZXB0YWJsZSBSYW5nZSAgUHVycG9zZQotLS0tLSAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLQotSU8gMCAgMHgwMjIwIC0gMHgwMjgwICAgU0IgYmFzZSBhZGRyZXNzLCB1bnVzZWQuCi1JTyAxICAweDA1MzAgLSAweDBGNDggICBNU1MgYmFzZSBhZGRyZXNzCi1JTyAyICAweDAzODggLSAweDAzRjggICBPUEwzIGJhc2UgYWRkcmVzcwotSU8gMyAgMHgwMzAwIC0gMHgwMzM0ICAgTVBVIGJhc2UgYWRkcmVzcwotSU8gNCAgMHgwMTAwIC0gMHgwRkZFICAgY2FyZCdzIG93biBiYXNlIGFkZHJlc3MgZm9yIGl0cyBjb250cm9sIEkvTyBwb3J0cwotCi1UaGUgSVJRIGFuZCBETUEgdmFsdWVzIGNhbiBiZSBhbnkgdGhhdCBhcmUgY29uc2lkZXJlZCBhY2NlcHRhYmxlIGZvciBhCi1NU1MuICBBc3N1bWluZyB5b3UndmUgZ290IGlzYXBucCBhbGwgaGFwcHksIHRoZW4geW91IHNob3VsZCBiZSBhYmxlIHRvCi1kbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nICh3aGljaCBtYXRjaGVzIHVwIHdpdGggdGhlIGlzYXBucAotY29uZmlndXJhdGlvbiBhYm92ZSk6Ci0KLW1vZHByb2JlIG1wdTQwMQotbW9kcHJvYmUgYWQxODQ4Ci1tb2Rwcm9iZSBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTUgZG1hPTAgZG1hMj0xCi1tb2Rwcm9iZSBvcGwzIGlvPTB4Mzg4Ci0KLVNlZSB0aGUgc2VjdGlvbiAiQXV0b21hdGljIE1vZHVsZSBMb2FkaW5nIiBiZWxvdyBmb3IgaG93IHRvIHNldCB1cAotL2V0Yy9tb2Rwcm9iZS5jb25mIHRvIGF1dG9tYXRlIHRoaXMuCi0KLUFuIGltcG9ydGFudCB0aGluZyB0byByZW1lbWJlciB0aGF0IHRoZSBvcGwzc2EyIG1vZHVsZSdzIGlvIGFyZ3VtZW50IGlzCi1mb3IgaXQncyBvd24gY29udHJvbCBwb3J0LCB3aGljaCBoYW5kbGVzIHRoZSBjYXJkJ3MgbWFzdGVyIG1peGVyIGZvcgotdm9sdW1lIChvbiBhbGwgY2FyZHMpLCBhbmQgYmFzcyBhbmQgdHJlYmxlIChvbiBTQTMgY2FyZHMpLgotCi0KLVRyb3VibGVzaG9vdGluZwotLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGFsbCBnb2VzIHdlbGwgYW5kIHlvdSBzZWUgbm8gZXJyb3IgbWVzc2FnZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0bwotc3RhcnQgdXNpbmcgdGhlIHNvdW5kIGNhcGFiaWxpdGllcyBvZiB5b3VyIHN5c3RlbS4gIElmIHlvdSBnZXQgYW4KLWVycm9yIG1lc3NhZ2Ugd2hpbGUgdHJ5aW5nIHRvIGluc2VydCB0aGUgb3BsM3NhMiBtb2R1bGUsIHRoZW4gbWFrZQotc3VyZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlvdXMgYXJndW1lbnRzIG1hdGNoIHdoYXQgeW91IHNwZWNpZmllZAotaW4geW91ciBpc2FwbnAgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQgdGhhdCB0aGVyZSBpcyBubyBjb25mbGljdCB3aXRoCi1hbm90aGVyIGRldmljZSBmb3IgYW4gSS9PIHBvcnQgb3IgaW50ZXJydXB0LiAgQ2hlY2tpbmcgdGhlIGNvbnRlbnRzIG9mCi0vcHJvYy9pb3BvcnRzIGFuZCAvcHJvYy9pbnRlcnJ1cHRzIGNhbiBiZSB1c2VmdWwgdG8gc2VlIGlmIHlvdSdyZQotYnV0dGluZyBoZWFkcyB3aXRoIGFub3RoZXIgZGV2aWNlLgotCi1JZiB5b3Ugc3RpbGwgY2Fubm90IGdldCB0aGUgbW9kdWxlIHRvIGxvYWQsIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mCi15b3VyIHN5c3RlbSBsb2cgZmlsZSwgdXN1YWxseSAvdmFyL2xvZy9tZXNzYWdlcy4gIElmIHlvdSBzZWUgdGhlCi1tZXNzYWdlICJvcGwzc2EyOiBVbmtub3duIFlhbWFoYSBhdWRpbyBjb250cm9sbGVyIHZlcnNpb24iLCB0aGVuIHlvdQotaGF2ZSBhIGRpZmZlcmVudCBjaGlwc2V0IHZlcnNpb24gdGhhbiBJJ3ZlIGVuY291bnRlcmVkIHNvIGZhci4gIExvb2sKLWZvciBhbGwgbWVzc2FnZXMgaW4gdGhlIGxvZyBmaWxlIHRoYXQgc3RhcnQgd2l0aCAib3BsM3NhMjogIiBhbmQgc2VlCi1pZiB0aGV5IHByb3ZpZGUgYW55IGNsdWVzLiAgSWYgeW91IGRvIG5vdCBzZWUgdGhlIGNoaXBzZXQgdmVyc2lvbgotbWVzc2FnZSwgYW5kIG5vbmUgb2YgdGhlIG90aGVyIG1lc3NhZ2VzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSBsb2cgYXJlCi1oZWxwZnVsLCBlbWFpbCBtZSBzb21lIGRldGFpbHMgYW5kIEknbGwgdHJ5IG15IGJlc3QgdG8gaGVscC4KLQotCi1BdXRvbWF0aWMgTW9kdWxlIExvYWRpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXN0bHksIGlmIHlvdSdyZSB1c2luZyBtb2R1bGVzIGFuZCB3YW50IHRvIHNldCB1cCBhdXRvbWF0aWMgbW9kdWxlCi1sb2FkaW5nIHdpdGgga21vZCwgdGhlIGtlcm5lbCBtb2R1bGUgbG9hZGVyLCBoZXJlIGlzIHRoZSBzZWN0aW9uIEkKLWN1cnJlbnRseSB1c2UgaW4gbXkgbW9kcHJvYmUuY29uZiBmaWxlOgotCi0jIFNvdW5kCi1hbGlhcyBzb3VuZC1zbG90LTAgb3BsM3NhMgotb3B0aW9ucyBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTcgZG1hPTAgZG1hMj0zCi1vcHRpb25zIG9wbDMgaW89MHgzODgKLQotVGhhdCdzIGFsbCBpdCBjdXJyZW50bHkgdGFrZXMgdG8gZ2V0IGFuIE9QTDMtU0EzIGNhcmQgd29ya2luZyBvbiBteQotc3lzdGVtLiAgT25jZSBhZ2FpbiwgaWYgeW91IGhhdmUgYW55IG90aGVyIHByb2JsZW1zLCBlbWFpbCBtZSBhdCB0aGUKLWFkZHJlc3MgbGlzdGVkIGFib3ZlLgotCi1TY290dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvVklBLWNoaXBzZXQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NjUyMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVJ1bm5pbmcgc291bmQgY2FyZHMgb24gVklBIGNoaXBzZXRzCi0KLW8JVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggVklBIGNoaXBzZXRzIGFuZCBzb3VuZCBjYXJkcyB0aGF0IGFwcGVhciB0bwotCWxvY2sgdGhlIGhhcmR3YXJlIHNvbGlkbHkuIFRlc3QgcHJvZ3JhbXMgdW5kZXIgRE9TIGhhdmUgdmVyaWZpZWQgdGhlCi0JcHJvYmxlbSBleGlzdHMgb24gYXQgbGVhc3Qgc29tZSAoYnV0IGFwcGFyZW50bHkgbm90IGFsbCkgVklBIGJvYXJkcwotCi1vCVZJQSBoYXZlIHNvIGZhciBmYWlsZWQgdG8gYm90aGVyIHRvIGFuc3dlciBzdXBwb3J0IG1haWwgb24gdGhlIHN1YmplY3QKLQlzbyBpZiB5b3UgYXJlIGEgVklBIGVuZ2luZWVyIGZlZWxpbmcgYWdncmlldmVkIGFzIHlvdSByZWFkIHRoaXMgCi0JZG9jdW1lbnQgZ28gY2hhc2UgeW91ciBvd24gcGVvcGxlLiBJZiB0aGVyZSBpcyBhIHdvcmthcm91bmQgcGxlYXNlCi0JbGV0IHVzIGtub3cgc28gd2UgY2FuIGltcGxlbWVudCBpdC4KLQotCi1DZXJ0YWluIHBhdHRlcm5zIG9mIElTQSBETUEgYWNjZXNzIHVzZWQgZm9yIG1vc3QgUEMgc291bmQgY2FyZHMgY2F1c2UgdGhlCi1WSUEgY2hpcHNldHMgdG8gbG9jayB1cC4gRnJvbSB0aGUgY29sbGVjdGVkIHJlcG9ydHMgdGhpcyBhcHBlYXJzIHRvIGNvdmVyIGEKLXdpZGUgcmFuZ2Ugb2YgYm9hcmRzLiBTb21lIGFsc28gbG9jayB1cCB3aXRoIHNvdW5kIGNhcmRzIHVuZGVyIFdpbiogYXMgd2VsbC4KLQotTGludXggaW1wbGVtZW50cyBhIHdvcmthcm91bmQgcHJvdmlkaW5nIHlvdXIgY2hpcHNldCBpcyBQQ0kgYW5kIHlvdSBjb21waWxlZAotd2l0aCBQQ0kgUXVpcmtzIGVuYWJsZWQuIElmIHNvIHlvdSB3aWxsIHNlZSBhIG1lc3NhZ2UKLQkiQWN0aXZhdGluZyBJU0EgRE1BIGJ1ZyB3b3JrYXJvdW5kcyIKLQotZHVyaW5nIGJvb3RpbmcuIElmIHlvdSBoYXZlIGEgVklBIFBDSSBjaGlwc2V0IHRoYXQgaGFuZ3Mgd2hlbiB5b3UgdXNlIHRoZQotc291bmQgYW5kIGlzIG5vdCBnZW5lcmF0aW5nIHRoaXMgbWVzc2FnZSBldmVuIHdpdGggUENJIHF1aXJrcyBlbmFibGVkCi1wbGVhc2UgcmVwb3J0IHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgbGludXgta2VybmVsIGxpc3QgKHNlZSBSRVBPUlRJTkctQlVHUykuCi0KLUlmIHlvdSBhcmUgb25lIG9mIHRoZSB0aW55IG51bWJlciBvZiB1bmZvcnR1bmF0ZXMgd2l0aCBhIDQ4NiBJU0EvVkxCIFZJQQotY2hpcHNldCBib2FyZCB5b3UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIHRvIGJ1aWxkIGEgc3BlY2lhbCBrZXJuZWwgZm9yCi15b3VyIGJvYXJkCi0KLQllZGl0IGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvZG1hLmgKLQotY2hhbmdlCi0KLSNkZWZpbmUgaXNhX2RtYV9icmlkZ2VfYnVnZ3kgCSgwKQotCi10bwotCi0jZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5IAkoMSkKLQotYW5kIHJlYnVpbGQgYSBrZXJuZWwgd2l0aG91dCBQQ0kgcXVpcmsgc3VwcG9ydC4KLQotCi1PdGhlciB0aGFuIHRoaXMgcGFydGljdWxhciBnbGl0Y2ggdGhlIFZJQSBbTV1WUCogY2hpcHNldHMgYXBwZWFyIHRvIHdvcmsKLXBlcmZlY3RseSB3aXRoIExpbnV4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQ0MzI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL2NzNDZ4eAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBDaXJydXMgTG9naWMvQ3J5c3RhbCBTb3VuZEZ1c2lvbiBjczQ2eHgvY3M0MjgwIGF1ZGlvIAotY29udHJvbGxlciBjaGlwcyAoMjAwMS8wNS8xMSkKLQotVGhlIGNzNDZ4eCBhdWRpbyBkcml2ZXIgc3VwcG9ydHMgdGhlIERTUCBsaW5lIG9mIENpcnJ1cyBjb250cm9sbGVycy4gCi1TcGVjaWZpY2FsbHksIHRoZSBjczQ2MTAsIGNzNDYxMiwgY3M0NjE0LCBjczQ2MjIsIGNzNDYyNCwgY3M0NjMwIGFuZCB0aGUgY3M0MjgwCi1wcm9kdWN0cy4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGdlbmVyaWMgYWM5N19jb2RlYyBkcml2ZXIgZm9yIEFDOTcgY29kZWMKLXN1cHBvcnQuICAKLQotCi1GZWF0dXJlczoKLQotRnVsbCBEdXBsZXggUGxheWJhY2svQ2FwdHVyZSBzdXBwb3J0ZWQgZnJvbSA4ay00OGsuCi0xNkJpdCBTaWduZWQgTEUgJiA4Qml0IFVuc2lnbmVkLCB3aXRoIE1vbm8gb3IgU3RlcmVvIHN1cHBvcnRlZC4KLQotQVBNL1BNIC0gMi4yLnggUE0gaXMgZW5hYmxlZCBhbmQgZnVuY3Rpb25hbC4gQVBNIGNhbiBhbHNvCi1iZSBlbmFibGVkIGZvciAyLjQueCBieSBtb2RpZnlpbmcgdGhlIENTNDZYWF9BQ1BJX1NVUFBPUlQgbWFjcm8KLWRlZmluaXRpb24uCi0KLURNQSBwbGF5YmFjayBidWZmZXIgc2l6ZSBpcyBjb25maWd1cmFibGUgZnJvbSAxNmsgKGRlZmF1bHRvcmRlcj0yKSB1cCB0byAyTWVnIAotKGRlZmF1bHRvcmRlcj0xMSkuICBETUEgY2FwdHVyZSBidWZmZXIgc2l6ZSBpcyBmaXhlZCBhdCBhIHNpbmdsZSA0ayBwYWdlIGFzCi10d28gMmsgZnJhZ21lbnRzLgotCi1NTUFQIHNlZW1zIHRvIHdvcmsgd2VsbCB3aXRoIFF1YWtlSUlJLCBhbmQgdGVzdCBYTU1TIHBsdWdpbi4KLQotTXl0aDIgd29ya3MsIGJ1dCB0aGUgcG9sbGluZyBsb2dpYyBpcyBub3QgZnVsbHkgY29ycmVjdCwgYnV0IGlzIGZ1bmN0aW9uYWwuCi0KLVRoZSAyLjQuNC1hYzYgZ2FtZXBvcnQgY29kZSBpbiB0aGUgY3M0NjF4IGpveXN0aWNrIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgCi13aXRoIGEgTWljcm9zb2Z0IFNpZGV3aW5kZXIgam95c3RpY2sgKGNzNDYxeC5vIGFuZCBzaWRld2luZGVyLm8pLiAgVGhpcyAKLWF1ZGlvIGRyaXZlciBtdXN0IGJlIGxvYWRlZCBwcmlvciB0byB0aGUgam95c3RpY2sgZHJpdmVyIHRvIGVuYWJsZSB0aGUKLURTUCB0YXNrIGltYWdlIHN1cHBvcnRpbmcgdGhlIGpveXN0aWNrIGRldmljZS4KLQotCi1MaW1pdGF0aW9uczoKLQotU1BESUYgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCi0KLVByaW1hcnkgY29kZWMgc3VwcG9ydCBvbmx5LiAgTm8gc2Vjb25kYXJ5IGNvZGVjIHN1cHBvcnQgaXMgaW1wbGVtZW50ZWQuCi0KLQotCi1OT1RFUzoKLQotSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIC0gdGhlIEVHUElPMiBwaW4gY29udHJvbHMgdGhlIGV4dGVybmFsIEFtcCwKLWFuZCBoYXMgYmVlbiB0ZXN0ZWQuCi1Nb2R1bGUgcGFyYW1ldGVyIGhlcmN1bGVzX2VncGlvX2Rpc2FibGUgc2V0IHRvIDEsIHdpbGwgZm9yY2UgYSAwIHRvIEVHUElPRFIKLXRvIGRpc2FibGUgdGhlIGV4dGVybmFsIGFtcGxpZmllci4KLQotVlRCIFNhbnRhIENydXogLSB0aGUgR1BJTzcvR1BJTzggb24gdGhlIFNlY29uZGFyeSBDb2RlYyBjb250cm9sCi10aGUgZXh0ZXJuYWwgYW1wbGlmaWVyIGZvciB0aGUgImJhY2siIHNwZWFrZXJzLCBzaW5jZSB3ZSBkbyBub3QKLXN1cHBvcnQgdGhlIHNlY29uZGFyeSBjb2RlYyB0aGVuIHRoaXMgZXh0ZXJuYWwgYW1wIGlzIG5vdAotdHVybmVkIG9uLiAgVGhlIHByaW1hcnkgY29kZWMgZXh0ZXJuYWwgYW1wbGlmaWVyIGlzIHN1cHBvcnRlZCBidXQKLW5vdGUgdGhhdCB0aGUgQUM5NyBFQVBEIGJpdCBpcyBpbnZlcnRlZCBsb2dpYyAoYW1wX3ZveWV0cmEoKSkuCi0KLURNQSBidWZmZXIgc2l6ZSAtIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCBtYW55IG9mIHRoZSBMaW51eCBhcHBsaWNhdGlvbnMKLWNvbmNlcm5pbmcgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUuICBTZXZlcmFsIGFwcGxpY2F0aW9ucyByZXF1ZXN0IGEgCi1jZXJ0YWluIGZyYWdtZW50IHNpemUgYW5kIG51bWJlciBhbmQgdGhlbiBkbyBub3QgdmVyaWZ5IHRoYXQgdGhlIGRyaXZlcgotaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLiAgCi1TTkRDVExfRFNQX1NFVEZSQUdNRU5UIGlvY3RsIGlzIHVzZWQgdG8gcmVxdWVzdCBhIGZyYWdtZW50IHNpemUgYW5kCi1udW1iZXIgb2YgZnJhZ21lbnRzLiAgU29tZSBhcHBsaWNhdGlvbnMgZXhpdCBpZiBhbiBlcnJvciBpcyByZXR1cm5lZAotb24gdGhpcyBwYXJ0aWN1bGFyIGlvY3RsLiBUaGVyZWZvcmUsIGluIGFsaWdubWVudCB3aXRoIHRoZSBvdGhlciBPU1MgYXVkaW8gCi1kcml2ZXJzLCBubyBlcnJvciBpcyByZXR1cm5lZCB3aGVuIGEgU0VURlJBR3MgSU9DVEwgaXMgcmVjZWl2ZWQsIGJ1dCB0aGUgCi12YWx1ZXMgcGFzc2VkIGZyb20gdGhlIGFwcCBhcmUgbm90IHVzZWQgaW4gYW55IGJ1ZmZlciBjYWxjdWxhdGlvbiAKLShvc3NmcmFnc2hpZnQvb3NzbWF4ZnJhZ3MgYXJlIG5vdCB1c2VkKS4KLVVzZSB0aGUgImRlZmF1bHRvcmRlcj1OIiBtb2R1bGUgcGFyYW1ldGVyIHRvIGNoYW5nZSB0aGUgYnVmZmVyIHNpemUgaWYKLXlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBzcGVjaWZpYyBudW1iZXIgb2YgZnJhZ21lbnRzCi1vciBhIHNwZWNpZmljIGJ1ZmZlciBzaXplIChzZWUgYmVsb3cpLgotCi1EZWJ1ZyBJbnRlcmZhY2UKLS0tLS0tLS0tLS0tLS0tLQotVGhlcmUgaXMgYW4gaW9jdGwgZGVidWcgaW50ZXJmYWNlIHRvIGFsbG93IHJ1bnRpbWUgbW9kaWZpY2F0aW9uIG9mIHRoZSAKLWRlYnVnIHByaW50IGxldmVscy4gIFRoaXMgZGVidWcgaW50ZXJmYWNlIGNvZGUgY2FuIGJlIGRpc2FibGVkIGZyb20gdGhlIAotY29tcGlsYXRpb24gcHJvY2VzcyB3aXRoIGNvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBkZWZpbmU6Ci0jZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKLVRoZXJlIGlzIGFsc28gYSBkZWJ1ZyBwcmludCBtZXRob2RvbGd5IHRvIHNlbGVjdCBwcmludGYgc3RhdGVtZW50cyBmcm9tCi1kaWZmZXJlbnQgYXJlYXMgb2YgdGhlIGRyaXZlci4gIEEgZGVidWcgcHJpbnQgbGV2ZWwgaXMgYWxzbyB1c2VkIHRvIGFsbG93Ci1hZGRpdGlvbmFsIHByaW50ZnMgdG8gYmUgYWN0aXZlLiAgQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZQotZHJpdmVyIHRvIGRpc2FibGUgY29tcGlsYXRpb24gb2YgdGhlIENTX0RCR09VVCBwcmludCBzdGF0ZW1lbnRzOgotI2RlZmluZSBDU0RFQlVHIDEKLSAKLVBsZWFzZSBzZWUgdGhlIGRlZmluaXRpb25zIGZvciBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgZm9yIGFkZGl0aW9uYWwKLWluZm9ybWF0aW9uIG9uIHRoZSBkZWJ1ZyBsZXZlbHMgYW5kIHNlY3Rpb25zLgotCi1UaGVyZSBpcyBhbHNvIGEgY3NkYmcgZXhlY3V0YWJsZSB0byBhbGxvdyBydW50aW1lIG1hbmlwdWxhdGlvbiBvZiB0aGVzZSAKLXBhcmFtZXRlcnMuICBmb3IgYSBjb3B5IGVtYWlsOiB0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbQotCi0KLQotTU9EVUxFX1BBUk1TIGRlZmluaXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW1vZHVsZV9wYXJhbShkZWZhdWx0b3JkZXIsIHVsb25nLCAwKTsKLWRlZmF1bHRvcmRlcj1OCi13aGVyZSBOIGlzIGEgdmFsdWUgZnJvbSAxIHRvIDEyCi1UaGUgYnVmZmVyIG9yZGVyIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGRtYSBidWZmZXIgZm9yIHRoZSBkcml2ZXIuCi11bmRlciBMaW51eCwgYSBzbWFsbGVyIGJ1ZmZlciBhbGxvd3MgbW9yZSByZXNwb25zaXZlbmVzcyBmcm9tIG1hbnkgb2YgdGhlIAotYXBwbGljYXRpb25zIChlLmcuIGdhbWVzKS4gIEEgbGFyZ2VyIGJ1ZmZlciBhbGxvd3Mgc29tZSBvZiB0aGUgYXBwcyAoZXNvdW5kKSAKLXRvIG5vdCB1bmRlcnJ1biB0aGUgZG1hIGJ1ZmZlciBhcyBlYXNpbHkuICBBcyBkZWZhdWx0LCB1c2UgMzJrIChvcmRlcj0zKQotcmF0aGVyIHRoYW4gNjRrIGFzIHNvbWUgb2YgdGhlIGdhbWVzIHdvcmsgbW9yZSByZXNwb25zaXZlbHkuCi0oMl5OKSAqIFBBR0VfU0laRSA9IGFsbG9jYXRlZCBidWZmZXIgc2l6ZQotCi1tb2R1bGVfcGFyYW0oY3NfZGVidWdsZXZlbCwgdWxvbmcsIDA2NDQpOwotbW9kdWxlX3BhcmFtKGNzX2RlYnVnbWFzaywgdWxvbmcsIDA2NDQpOwotY3NfZGVidWdsZXZlbD1OCi1jc19kZWJ1Z21hc2s9MHhNTU1NTU1NTQotd2hlcmUgTiBpcyBhIHZhbHVlIGZyb20gMCAobm8gZGVidWcgcHJpbnRmcyksIHRvIDkgKG1heGltdW0pCi0weE1NTU1NTU1NIGlzIGEgZGVidWcgbWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBDU194eHggYml0cyAoc2VlIGRyaXZlciBzb3VyY2UpLgotCi1tb2R1bGVfcGFyYW0oaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSwgdWxvbmcsIDApOwotaGVyY3VsZXNfZWdwaW9fZGlzYWJsZT1OCi13aGVyZSBOIGlzIGEgMCAoZW5hYmxlIGVncGlvKSwgb3IgYSAxIChkaXNhYmxlIGVncGlvIHN1cHBvcnQpCi0KLW1vZHVsZV9wYXJhbShpbml0ZGVsYXksIHVsb25nLCAwKTsKLWluaXRkZWxheT1OCi1UaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtaWxsZXNjb25kIGRlbGF5IGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24KLWNvZGUgcHJpb3IgdG8gcG93ZXJpbmcgdXAgdGhlIFBMTC4gIE9uIGxhcHRvcHMgdGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0bwotYXNzaXN0IHdpdGggZXJyb3JzIG9uIHJlc3VtZSwgbW9zdGx5IHdpdGggSUJNIGxhcHRvcHMuICBCYXNpY2FsbHksIGlmIHRoZSAKLXN5c3RlbSBpcyBib290ZWQgdW5kZXIgYmF0dGVyeSBwb3dlciB0aGVuIHRoZSBtZGVsYXkoKS91ZGVsYXkoKSBmdW5jdGlvbnMgZmFpbCB0byAKLXByb3Blcmx5IGRlbGF5IHRoZSByZXF1aXJlZCB0aW1lLiAgQWxzbywgaWYgdGhlIHN5c3RlbSBpcyBib290ZWQgdW5kZXIgQUMgcG93ZXIKLWFuZCB0aGVuIHRoZSBwb3dlciByZW1vdmVkLCB0aGUgbWRlbGF5KCkvdWRlbGF5KCkgZnVuY3Rpb25zIHdpbGwgbm90IGRlbGF5IHByb3Blcmx5LgotIAotbW9kdWxlX3BhcmFtKHBvd2VyZG93biwgdWxvbmcsIDApOwotcG93ZXJkb3duPU4KLXdoZXJlIE4gaXMgMCAoZGlzYWJsZSBhbnkgcG93ZXJkb3duIG9mIHRoZSBpbnRlcm5hbCBibG9ja3MpIG9yIDEgKGVuYWJsZSBwb3dlcmRvd24pCi0KLQotbW9kdWxlX3BhcmFtKGV4dGVybmFsX2FtcCwgYm9vbCwgMCk7Ci1leHRlcm5hbF9hbXA9MQotaWYgTiBpcyBzZXQgdG8gMSwgdGhlbiBmb3JjZSBlbmFibGluZyB0aGUgRUFQRCBzdXBwb3J0IGluIHRoZSBwcmltYXJ5IEFDOTcgY29kZWMuCi1vdmVycmlkZSB0aGUgZGV0ZWN0aW9uIGxvZ2ljIGFuZCBmb3JjZSB0aGUgZXh0ZXJuYWwgYW1wIGJpdCBpbiB0aGUgQUM5NyAweDI2IHJlZ2lzdGVyCi10byBiZSByZXNldCAoMCkuICBFQVBEIHNob3VsZCBiZSAwIGZvciBwb3dlcnVwLCBhbmQgMSBmb3IgcG93ZXJkb3duLiAgVGhlIFZUQiBTYW50YSBDcnV6Ci1jYXJkIGhhcyBpbnZlcnRlZCBsb2dpYywgc28gdGhlcmUgaXMgYSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGVzZSBjYXJkcy4KLQotbW9kdWxlX3BhcmFtKHRoaW5rcGFkLCBib29sLCAwKTsKLXRoaW5rcGFkPTEKLWlmIE4gaXMgc2V0IHRvIDEsIHRoZW4gZm9yY2UgZW5hYmxpbmcgdGhlIGNsa3J1biBmdW5jdGlvbmFsaXR5LgotQ3VycmVudGx5LCB3aGVuIHRoZSBwYXJ0IGlzIGJlaW5nIHVzZWQsIHRoZW4gY2xrcnVuIGlzIGRpc2FibGVkIGZvciB0aGUgZW50aXJlIHN5c3RlbSwKLWJ1dCByZS1lbmFibGVkIHdoZW4gdGhlIGRyaXZlciBpcyByZWxlYXNlZCBvciB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBvcGVuIGNvdW50LgotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscCBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1sbTcwbGxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGJkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscApAQCAtMCwwICsxLDY5IEBACitzcGlfbG03MGxscCA6ICBMTTcwLUxMUCBwYXJwb3J0LXRvLVNQSSBhZGFwdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBib2FyZC9jaGlwOgorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAgZXZhbHVhdGlvbiBib2FyZAorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisKK0F1dGhvcjoKKyAgICAgICAgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorVGhpcyBkcml2ZXIgcHJvdmlkZXMgZ2x1ZSBjb2RlIGNvbm5lY3RpbmcgYSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTExQCit0ZW1wZXJhdHVyZSBzZW5zb3IgZXZhbHVhdGlvbiBib2FyZCB0byB0aGUga2VybmVsJ3MgU1BJIGNvcmUgc3Vic3lzdGVtLgorCitJbiBlZmZlY3QsIHRoaXMgZHJpdmVyIHR1cm5zIHRoZSBwYXJhbGxlbCBwb3J0IGludGVyZmFjZSBvbiB0aGUgZXZhbCBib2FyZAoraW50byBhIFNQSSBidXMgd2l0aCBhIHNpbmdsZSBkZXZpY2UsIHdoaWNoIHdpbGwgYmUgZHJpdmVuIGJ5IHRoZSBnZW5lcmljCitMTTcwIGRyaXZlciAoZHJpdmVycy9od21vbi9sbTcwLmMpLgorCitUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKKworICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgICAgIFBvcnQgICAgICBEaXJlY3Rpb24gICBKUDIgSGVhZGVyCisgICAtLS0tLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRDAgICAgIDIgICAgICAtICAgICAgICAgLQorICAgICAgRDEgICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDIgICAgIDQgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDMgICAgIDUgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDQgICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDUgICAgIDcgICAgIC0tPiAgICAgIG5DUyAgOAorICAgICAgRDYgICAgIDggICAgIC0tPiAgICAgIFNDTEsgMworICAgICAgRDcgICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICAgICBHTkQgICAgMjUgICAgICAtICAgICAgIEdORCAgNworICAgIFNlbGVjdCAgMTMgICAgIDwtLSAgICAgIFNJL08gMQorICAgLS0tLS0tLS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHNpbmNlIHRoZSBMTTcwIHVzZXMgYSAiMy13aXJlIiB2YXJpYW50IG9mIFNQSSwgdGhlIFNJL1NPIHBpbgoraXMgY29ubmVjdGVkIHRvIGJvdGggcGluIEQ3IChhcyBNYXN0ZXIgT3V0KSBhbmQgU2VsZWN0IChhcyBNYXN0ZXIgSW4pCit1c2luZyBhbiBhcnJhbmdtZW50IHRoYXQgbGV0cyBlaXRoZXIgdGhlIHBhcnBvcnQgb3IgdGhlIExNNzAgcHVsbCB0aGUKK3BpbiBsb3cuICBUaGlzIGNhbid0IGJlIHNoYXJlZCB3aXRoIHRydWUgU1BJIGRldmljZXMsIGJ1dCBvdGhlciAzLXdpcmUKK2RldmljZXMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgU0kvU08gcGluLgorCitUaGUgYml0YmFuZ2VyIHJvdXRpbmUgaW4gdGhpcyBkcml2ZXIgKGxtNzBfdHhyeCkgaXMgY2FsbGVkIGJhY2sgZnJvbQordGhlIGJvdW5kICJod21vbi9sbTcwIiBwcm90b2NvbCBkcml2ZXIgdGhyb3VnaCBpdHMgc3lzZnMgaG9vaywgdXNpbmcgYQorc3BpX3dyaXRlX3RoZW5fcmVhZCgpIGNhbGwuICBJdCBwZXJmb3JtcyBNb2RlIDAgKFNQSS9NaWNyb3dpcmUpIGJpdGJhbmdpbmcuCitUaGUgbG03MCBkcml2ZXIgdGhlbiBpbnRlcHJldHMgdGhlIHJlc3VsdGluZyBkaWdpdGFsIHRlbXBlcmF0dXJlIHZhbHVlCithbmQgZXhwb3J0cyBpdCB0aHJvdWdoIHN5c2ZzLgorCitBICJnb3RjaGEiOiBOYXRpb25hbCBTZW1pY29uZHVjdG9yJ3MgTE03MCBMTFAgZXZhbCBib2FyZCBjaXJjdWl0IHNjaGVtYXRpYworc2hvd3MgdGhhdCB0aGUgU0kvTyBsaW5lIGZyb20gdGhlIExNNzAgY2hpcCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJhc2Ugb2YgYQordHJhbnNpc3RvciBRMSAoYW5kIGFsc28gYSBwdWxsdXAsIGFuZCBhIHplbmVyIGRpb2RlIHRvIEQ3KTsgd2hpbGUgdGhlCitjb2xsZWN0b3IgaXMgdGllZCB0byBWQ0MuCisKK0ludGVycHJldGluZyB0aGlzIGNpcmN1aXQsIHdoZW4gdGhlIExNNzAgU0kvTyBsaW5lIGlzIEhpZ2ggKG9yIHRyaXN0YXRlCithbmQgbm90IGdyb3VuZGVkIGJ5IHRoZSBob3N0IHZpYSBENyksIHRoZSB0cmFuc2lzdG9yIGNvbmR1Y3RzIGFuZCBzd2l0Y2hlcwordGhlIGNvbGxlY3RvciB0byB6ZXJvLCB3aGljaCBpcyByZWZsZWN0ZWQgb24gcGluIDEzIG9mIHRoZSBEQjI1IHBhcnBvcnQKK2Nvbm5lY3Rvci4gIFdoZW4gU0kvTyBpcyBMb3cgKGRyaXZlbiBieSB0aGUgTE03MCBvciB0aGUgaG9zdCkgb24gdGhlIG90aGVyCitoYW5kLCB0aGUgdHJhbnNpc3RvciBpcyBjdXQgb2ZmIGFuZCB0aGUgdm9sdGFnZSB0aWVkIHRvIGl0J3MgY29sbGVjdG9yIGlzCityZWZsZWN0ZWQgb24gcGluIDEzIGFzIGEgSGlnaCBsZXZlbC4KKworU286IHRoZSBnZXRtaXNvIGlubGluZSByb3V0aW5lIGluIHRoaXMgZHJpdmVyIHRha2VzIHRoaXMgZmFjdCBpbnRvIGFjY291bnQsCitpbnZlcnRpbmcgdGhlIHZhbHVlIHJlYWQgYXQgcGluIDEzLgorCisKK1RoYW5rcyB0bworLS0tLS0tLS0tCitvIERhdmlkIEJyb3duZWxsIGZvciBtZW50b3JpbmcgdGhlIFNQSS1zaWRlIGRyaXZlciBkZXZlbG9wbWVudC4KK28gRHIuQ3JhaWcgSG9sbGFiYXVnaCBmb3IgdGhlIChlYXJseSkgIm1hbnVhbCIgYml0YmFuZ2luZyBkcml2ZXIgdmVyc2lvbi4KK28gTmFkaXIgQmlsbGltb3JpYSBmb3IgaGVscCBpbnRlcnByZXRpbmcgdGhlIGNpcmN1aXQgc2NoZW1hdGljLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IGE2NjFkNjguLjQ3MWU3NTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEsNyArMSwxMiBAQAotVVBEQVRFIE1hcmNoIDIxIDIwMDUgQW1pdCBHdWQgPGd1ZEBldGgubmV0PgorU1BJTl9MT0NLX1VOTE9DS0VEIGFuZCBSV19MT0NLX1VOTE9DS0VEIGRlZmVhdCBsb2NrZGVwIHN0YXRlIHRyYWNraW5nIGFuZAorYXJlIGhlbmNlIGRlcHJlY2F0ZWQuCiAKLU1hY3JvcyBTUElOX0xPQ0tfVU5MT0NLRUQgYW5kIFJXX0xPQ0tfVU5MT0NLRUQgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUKLXJlbW92ZWQgc29vbi4gU28gZm9yIGFueSBuZXcgY29kZSBkeW5hbWljIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSB1c2VkOgorUGxlYXNlIHVzZSBERUZJTkVfU1BJTkxPQ0soKS9ERUZJTkVfUldMT0NLKCkgb3IKK19fU1BJTl9MT0NLX1VOTE9DS0VEKCkvX19SV19MT0NLX1VOTE9DS0VEKCkgYXMgYXBwcm9wcmlhdGUgZm9yIHN0YXRpYworaW5pdGlhbGl6YXRpb24uCisKK0R5bmFtaWMgaW5pdGlhbGl6YXRpb24sIHdoZW4gbmVjZXNzYXJ5LCBtYXkgYmUgcGVyZm9ybWVkIGFzCitkZW1vbnN0cmF0ZWQgYmVsb3cuCiAKICAgIHNwaW5sb2NrX3QgeHh4X2xvY2s7CiAgICByd2xvY2tfdCB4eHhfcndfbG9jazsKQEAgLTE1LDEyICsyMCw5IEBACiAKICAgIG1vZHVsZV9pbml0KHh4eF9pbml0KTsKIAotUmVhc29ucyBmb3IgZGVwcmVjYXRpb24KLSAgLSBpdCBodXJ0cyBhdXRvbWF0aWMgbG9jayB2YWxpZGF0b3JzCi0gIC0gaXQgYmVjb21lcyBpbnRydXNpdmUgZm9yIHRoZSByZWFsdGltZSBwcmVlbXB0aW9uIHBhdGNoZXMKLQotRm9sbG93aW5nIGRpc2N1c3Npb24gaXMgc3RpbGwgdmFsaWQsIGhvd2V2ZXIsIHdpdGggdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24KLW9mIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIHN0YXRpYy4KK1RoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiBpcyBzdGlsbCB2YWxpZCwgaG93ZXZlciwgd2l0aCB0aGUgZHluYW1pYworaW5pdGlhbGl6YXRpb24gb2Ygc3BpbmxvY2tzIG9yIHdpdGggREVGSU5FX1NQSU5MT0NLLCBldGMuLCB1c2VkCitpbnN0ZWFkIG9mIFNQSU5fTE9DS19VTkxPQ0tFRC4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKQEAgLTAsMCArMSwyMiBAQAorCitFeGNlcHQgZm9yIGEgZmV3IGV4dHJlbWVseSByYXJlIGV4Y2VwdGlvbnMgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZQordGhlIGJpbmFyeSBzeXNjdGwgaW50ZXJmYWNlLiAgSW5zdGVhZCBldmVyeW9uZSB1c2VzIC9wcm9jL3N5cy8uLi4gIHdpdGgKK3JlYWRhYmxlIGFzY2lpIG5hbWVzLgorCitSZWNlbnRseSB0aGUga2VybmVsIGhhcyBzdGFydGVkIHN1cHBvcnRpbmcgc2V0dGluZyB0aGUgYmluYXJ5IHN5c2N0bCB2YWx1ZSB0bworQ1RMX1VOTlVNQkVSRUQgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gYXNzaWduIGEgYmluYXJ5IHN5c2N0bCBwYXRoIHRvIGFsbG93CitzeXNjdGxzIHRvIHNob3cgdXAgaW4gL3Byb2Mvc3lzLgorCitBc3NpZ25pbmcgYmluYXJ5IHN5c2N0bCBudW1iZXJzIGlzIGFuIGVuZGxlc3Mgc291cmNlIG9mIGNvbmZsaWN0cyBpbiBzeXNjdGwuaCwKK2JyZWFraW5nIG9mIHRoZSB1c2VyIHNwYWNlIEFCSSAoYmVjYXVzZSBvZiB0aG9zZSBjb25mbGljdHMpLCBhbmQgbWFpbnRlbmFuY2UKK3Byb2JsZW1zLiAgQSBjb21wbGV0ZSBwYXNzIHRocm91Z2ggYWxsIG9mIHRoZSBzeXNjdGwgdXNlcnMgcmV2ZWFsZWQgbXVsdGlwbGUKK2luc3RhbmNlcyB3aGVyZSB0aGUgc3lzY3RsIGJpbmFyeSBpbnRlcmZhY2Ugd2FzIGJyb2tlbiBhbmQgaGFkIGdvbmUgdW5kZXRlY3RlZAorZm9yIHllYXJzLgorCitTbyBwbGVhc2UgZG8gbm90IGFkZCBuZXcgYmluYXJ5IHN5c2N0bCBudW1iZXJzLiAgVGhleSBhcmUgdW5uZWVkZWQgYW5kCitwcm9ibGVtYXRpYy4KKworSWYgeW91IHJlYWxseSBuZWVkIGEgbmV3IGJpbmFyeSBzeXNjdGwgbnVtYmVyIHBsZWFzZSBmaXJzdCBtZXJnZSB5b3VyIHN5c2N0bAoraW50byB0aGUga2VybmVsIGFuZCB0aGVuIGFzIGEgc2VwYXJhdGUgcGF0Y2ggYWxsb2NhdGUgYSBiaW5hcnkgc3lzY3RsIG51bWJlci4KKworKGViaWVkZXJtQHhtaXNzaW9uLmNvbSwgSnVuZSAyMDA3KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CmluZGV4IDhjZmNhMTcuLmEwY2NjNWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKQEAgLTMyLDEyICszMiwxNCBAQAogLSBtaW5fc2xhYl9yYXRpbwogLSBwYW5pY19vbl9vb20KIC0gbW1hcF9taW5fYWRkcmVzcworLSBudW1hX3pvbmVsaXN0X29yZGVyCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGRpcnR5X3JhdGlvLCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvLCBkaXJ0eV9leHBpcmVfY2VudGlzZWNzLAogZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcywgdmZzX2NhY2hlX3ByZXNzdXJlLCBsYXB0b3BfbW9kZSwKLWJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwgZHJvcC1jYWNoZXM6CitibG9ja19kdW1wLCBzd2FwX3Rva2VuX3RpbWVvdXQsIGRyb3AtY2FjaGVzLAoraHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGU6CiAKIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CiAKQEAgLTIzMSwzICsyMzMsNDcgQEAKIHZhc3QgbWFqb3JpdHkgb2YgYXBwbGljYXRpb25zIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBwcm92aWRlIGRlZmVuc2UgaW4gZGVwdGgKIGFnYWluc3QgZnV0dXJlIHBvdGVudGlhbCBrZXJuZWwgYnVncy4KIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbnVtYV96b25lbGlzdF9vcmRlcgorCitUaGlzIHN5c2N0bCBpcyBvbmx5IGZvciBOVU1BLgorJ3doZXJlIHRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20nIGlzIGNvbnRyb2xsZWQgYnkgem9uZWxpc3RzLgorKFRoaXMgZG9jdW1lbnRhdGlvbiBpZ25vcmVzIFpPTkVfSElHSE1FTS9aT05FX0RNQTMyIGZvciBzaW1wbGUgZXhwbGFuYXRpb24uCisgeW91IG1heSBiZSBhYmxlIHRvIHJlYWQgWk9ORV9ETUEgYXMgWk9ORV9ETUEzMi4uLikKKworSW4gbm9uLU5VTUEgY2FzZSwgYSB6b25lbGlzdCBmb3IgR0ZQX0tFUk5FTCBpcyBvcmRlcmVkIGFzIGZvbGxvd2luZy4KK1pPTkVfTk9STUFMIC0+IFpPTkVfRE1BCitUaGlzIG1lYW5zIHRoYXQgYSBtZW1vcnkgYWxsb2NhdGlvbiByZXF1ZXN0IGZvciBHRlBfS0VSTkVMIHdpbGwKK2dldCBtZW1vcnkgZnJvbSBaT05FX0RNQSBvbmx5IHdoZW4gWk9ORV9OT1JNQUwgaXMgbm90IGF2YWlsYWJsZS4KKworSW4gTlVNQSBjYXNlLCB5b3UgY2FuIHRoaW5rIG9mIGZvbGxvd2luZyAyIHR5cGVzIG9mIG9yZGVyLgorQXNzdW1lIDIgbm9kZSBOVU1BIGFuZCBiZWxvdyBpcyB6b25lbGlzdCBvZiBOb2RlKDApJ3MgR0ZQX0tFUk5FTAorCisoQSkgTm9kZSgwKSBaT05FX05PUk1BTCAtPiBOb2RlKDApIFpPTkVfRE1BIC0+IE5vZGUoMSkgWk9ORV9OT1JNQUwKKyhCKSBOb2RlKDApIFpPTkVfTk9STUFMIC0+IE5vZGUoMSkgWk9ORV9OT1JNQUwgLT4gTm9kZSgwKSBaT05FX0RNQS4KKworVHlwZShBKSBvZmZlcnMgdGhlIGJlc3QgbG9jYWxpdHkgZm9yIHByb2Nlc3NlcyBvbiBOb2RlKDApLCBidXQgWk9ORV9ETUEKK3dpbGwgYmUgdXNlZCBiZWZvcmUgWk9ORV9OT1JNQUwgZXhoYXVzdGlvbi4gVGhpcyBpbmNyZWFzZXMgcG9zc2liaWxpdHkgb2YKK291dC1vZi1tZW1vcnkoT09NKSBvZiBaT05FX0RNQSBiZWNhdXNlIFpPTkVfRE1BIGlzIHRlbmQgdG8gYmUgc21hbGwuCisKK1R5cGUoQikgY2Fubm90IG9mZmVyIHRoZSBiZXN0IGxvY2FsaXR5IGJ1dCBpcyBtb3JlIHJvYnVzdCBhZ2FpbnN0IE9PTSBvZgordGhlIERNQSB6b25lLgorCitUeXBlKEEpIGlzIGNhbGxlZCBhcyAiTm9kZSIgb3JkZXIuIFR5cGUgKEIpIGlzICJab25lIiBvcmRlci4KKworIk5vZGUgb3JkZXIiIG9yZGVycyB0aGUgem9uZWxpc3RzIGJ5IG5vZGUsIHRoZW4gYnkgem9uZSB3aXRoaW4gZWFjaCBub2RlLgorU3BlY2lmeSAiW05uXW9kZSIgZm9yIHpvbmUgb3JkZXIKKworIlpvbmUgT3JkZXIiIG9yZGVycyB0aGUgem9uZWxpc3RzIGJ5IHpvbmUgdHlwZSwgdGhlbiBieSBub2RlIHdpdGhpbiBlYWNoCit6b25lLiAgU3BlY2lmeSAiW1p6XW9uZSJmb3Igem9kZSBvcmRlci4KKworU3BlY2lmeSAiW0RkXWVmYXVsdCIgdG8gcmVxdWVzdCBhdXRvbWF0aWMgY29uZmlndXJhdGlvbi4gIEF1dG9jb25maWd1cmF0aW9uCit3aWxsIHNlbGVjdCAibm9kZSIgb3JkZXIgaW4gZm9sbG93aW5nIGNhc2UuCisoMSkgaWYgdGhlIERNQSB6b25lIGRvZXMgbm90IGV4aXN0IG9yCisoMikgaWYgdGhlIERNQSB6b25lIGNvbXByaXNlcyBncmVhdGVyIHRoYW4gNTAlIG9mIHRoZSBhdmFpbGFibGUgbWVtb3J5IG9yCisoMykgaWYgYW55IG5vZGUncyBETUEgem9uZSBjb21wcmlzZXMgZ3JlYXRlciB0aGFuIDYwJSBvZiBpdHMgbG9jYWwgbWVtb3J5IGFuZAorICAgIHRoZSBhbW91bnQgb2YgbG9jYWwgbWVtb3J5IGlzIGJpZyBlbm91Z2guCisKK090aGVyd2lzZSwgInpvbmUiIG9yZGVyIHdpbGwgYmUgc2VsZWN0ZWQuIERlZmF1bHQgb3JkZXIgaXMgcmVjb21tZW5kZWQgdW5sZXNzCit0aGlzIGlzIGNhdXNpbmcgcHJvYmxlbXMgZm9yIHlvdXIgc3lzdGVtL2FwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAppbmRleCA2ODcxMDRiLi41MWNjYzQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dApAQCAtNzcsOCArNzcsOSBAQAogY2FsbCwgdGhlbiBpdCBpcyByZXF1aXJlZCB0aGF0IHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1vdW50IGEgZmlsZSBzeXN0ZW0gb2YKIHR5cGUgaHVnZXRsYmZzOgogCi0JbW91bnQgbm9uZSAvbW50L2h1Z2UgLXQgaHVnZXRsYmZzIDx1aWQ9dmFsdWU+IDxnaWQ9dmFsdWU+IDxtb2RlPXZhbHVlPgotCQkgPHNpemU9dmFsdWU+IDxucl9pbm9kZXM9dmFsdWU+CisgIG1vdW50IC10IGh1Z2V0bGJmcyBcCisJLW8gdWlkPTx2YWx1ZT4sZ2lkPTx2YWx1ZT4sbW9kZT08dmFsdWU+LHNpemU9PHZhbHVlPixucl9pbm9kZXM9PHZhbHVlPiBcCisJbm9uZSAvbW50L2h1Z2UKIAogVGhpcyBjb21tYW5kIG1vdW50cyBhIChwc2V1ZG8pIGZpbGVzeXN0ZW0gb2YgdHlwZSBodWdldGxiZnMgb24gdGhlIGRpcmVjdG9yeQogL21udC9odWdlLiAgQW55IGZpbGVzIGNyZWF0ZWQgb24gL21udC9odWdlIHVzZXMgaHVnZXBhZ2VzLiAgVGhlIHVpZCBhbmQgZ2lkCkBAIC04OCwxMSArODksMTAgQEAKIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIDA3NTUgaXMgcGlja2VkLiBUaGUgc2l6ZSBvcHRpb24gc2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBvZgogbWVtb3J5IChodWdlIHBhZ2VzKSBhbGxvd2VkIGZvciB0aGF0IGZpbGVzeXN0ZW0gKC9tbnQvaHVnZSkuIFRoZSBzaXplIGlzCiByb3VuZGVkIGRvd24gdG8gSFBBR0VfU0laRS4gIFRoZSBvcHRpb24gbnJfaW5vZGVzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi1pbm9kZXMgdGhhdCAvbW50L2h1Z2UgY2FuIHVzZS4gIElmIHRoZSBzaXplIG9yIG5yX2lub2RlcyBvcHRpb25zIGFyZSBub3QKK2lub2RlcyB0aGF0IC9tbnQvaHVnZSBjYW4gdXNlLiAgSWYgdGhlIHNpemUgb3IgbnJfaW5vZGVzIG9wdGlvbiBpcyBub3QKIHByb3ZpZGVkIG9uIGNvbW1hbmQgbGluZSB0aGVuIG5vIGxpbWl0cyBhcmUgc2V0LiAgRm9yIHNpemUgYW5kIG5yX2lub2Rlcwogb3B0aW9ucywgeW91IGNhbiB1c2UgW0d8Z10vW018bV0vW0t8a10gdG8gcmVwcmVzZW50IGdpZ2EvbWVnYS9raWxvLiBGb3IKLWV4YW1wbGUsIHNpemU9MksgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgc2l6ZT0yMDQ4LiBBbiBleGFtcGxlIGlzIGdpdmVuIGF0Ci10aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuCitleGFtcGxlLCBzaXplPTJLIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHNpemU9MjA0OC4KIAogcmVhZCBhbmQgd3JpdGUgc3lzdGVtIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGZpbGVzIHRoYXQgcmVzaWRlIG9uIGh1Z2V0bGIKIGZpbGUgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0CmluZGV4IDE1MjMzMjAuLmQxN2YzMjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dApAQCAtNDEsNiArNDEsOCBAQAogCVAJCVBvaXNvbmluZyAob2JqZWN0IGFuZCBwYWRkaW5nKQogCVUJCVVzZXIgdHJhY2tpbmcgKGZyZWUgYW5kIGFsbG9jKQogCVQJCVRyYWNlIChwbGVhc2Ugb25seSB1c2Ugb24gc2luZ2xlIHNsYWJzKQorCS0JCVN3aXRjaCBhbGwgZGVidWdnaW5nIG9mZiAodXNlZnVsIGlmIHRoZSBrZXJuZWwgaXMKKwkJCWNvbmZpZ3VyZWQgd2l0aCBDT05GSUdfU0xVQl9ERUJVR19PTikKIAogRi5lLiBpbiBvcmRlciB0byBib290IGp1c3Qgd2l0aCBzYW5pdHkgY2hlY2tzIGFuZCByZWQgem9uaW5nIG9uZSB3b3VsZCBzcGVjaWZ5OgogCkBAIC0xMjUsMTMgKzEyNywyMCBAQAogCiBIZXJlIGlzIGEgc2FtcGxlIG9mIHNsdWIgZGVidWcgb3V0cHV0OgogCi0qKiogU0xVQiBrbWFsbG9jLTg6IFJlZHpvbmUgQWN0aXZlQDB4YzkwZjZkMjAgc2xhYiAweGM1MjhjNTMwIG9mZnNldD0zMzYwIGZsYWdzPTB4NDAwMDAwYzMgaW51c2U9NjEgZnJlZWxpc3Q9MHhjOTBmNmQ1OAotICBCeXRlcyBiNCAweGM5MGY2ZDEwOiAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgLi4uLi4uLi5aWlpaWlpaWgotICAgIE9iamVjdCAweGM5MGY2ZDIwOiAgMzEgMzAgMzEgMzkgMmUgMzAgMzAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgMTAxOS4wMDUKLSAgIFJlZHpvbmUgMHhjOTBmNmQyODogIDAwIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLUZyZWVQb2ludGVyIDB4YzkwZjZkMmMgLT4gMHhjOTBmNmQ1OAotTGFzdCBhbGxvYzogZ2V0X21vZGFsaWFzKzB4NjEvMHhmNSBqaWZmaWVzX2Fnbz01MyBjcHU9MSBwaWQ9NTU0Ci1GaWxsZXIgMHhjOTBmNmQ1MDogIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhICAgICAgICAgICAgICAgICAgICAgICAgIFpaWlpaWlpaCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQlVHIGttYWxsb2MtODogUmVkem9uZSBvdmVyd3JpdHRlbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5GTzogMHhjOTBmNmQyOC0weGM5MGY2ZDJiLiBGaXJzdCBieXRlIDB4MDAgaW5zdGVhZCBvZiAweGNjCitJTkZPOiBTbGFiIDB4YzUyOGM1MzAgZmxhZ3M9MHg0MDAwMDBjMyBpbnVzZT02MSBmcD0weGM5MGY2ZDU4CitJTkZPOiBPYmplY3QgMHhjOTBmNmQyMCBAb2Zmc2V0PTMzNjAgZnA9MHhjOTBmNmQ1OAorSU5GTzogQWxsb2NhdGVkIGluIGdldF9tb2RhbGlhcysweDYxLzB4ZjUgYWdlPTUzIGNwdT0xIHBpZD01NTQKKworQnl0ZXMgYjQgMHhjOTBmNmQxMDogIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhIC4uLi4uLi4uWlpaWlpaWloKKyAgT2JqZWN0IDB4YzkwZjZkMjA6ICAzMSAzMCAzMSAzOSAyZSAzMCAzMCAzNSAgICAgICAgICAgICAgICAgICAgICAgICAxMDE5LjAwNQorIFJlZHpvbmUgMHhjOTBmNmQyODogIDAwIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyBQYWRkaW5nIDB4YzkwZjZkNTA6ICA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICBaWlpaWlpaWgorCiAgIFs8YzAxMDUyM2Q+XSBkdW1wX3RyYWNlKzB4NjMvMHgxZWIKICAgWzxjMDEwNTNkZj5dIHNob3dfdHJhY2VfbG9nX2x2bCsweDFhLzB4MmYKICAgWzxjMDEwNjAxZD5dIHNob3dfdHJhY2UrMHgxMi8weDE0CkBAIC0xNTMsNzQgKzE2MiwxMDggQEAKICAgWzxjMDEwNDExMj5dIHN5c2VudGVyX3Bhc3RfZXNwKzB4NWYvMHg5OQogICBbPGI3ZjdiNDEwPl0gMHhiN2Y3YjQxMAogICA9PT09PT09PT09PT09PT09PT09PT09PQotQEBAIFNMVUIga21hbGxvYy04OiBSZXN0b3JpbmcgcmVkem9uZSAoMHhjYykgZnJvbSAweGM5MGY2ZDI4LTB4YzkwZjZkMmIKIAorRklYIGttYWxsb2MtODogUmVzdG9yaW5nIFJlZHpvbmUgMHhjOTBmNmQyOC0weGM5MGY2ZDJiPTB4Y2MKIAorSWYgU0xVQiBlbmNvdW50ZXJzIGEgY29ycnVwdGVkIG9iamVjdCAoZnVsbCBkZXRlY3Rpb24gcmVxdWlyZXMgdGhlIGtlcm5lbAordG8gYmUgYm9vdGVkIHdpdGggc2x1Yl9kZWJ1ZykgdGhlbiB0aGUgZm9sbG93aW5nIG91dHB1dCB3aWxsIGJlIGR1bXBlZAoraW50byB0aGUgc3lzbG9nOgogCi1JZiBTTFVCIGVuY291bnRlcnMgYSBjb3JydXB0ZWQgb2JqZWN0IHRoZW4gaXQgd2lsbCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcKLWFjdGlvbnM6Ci0KLTEuIElzb2xhdGlvbiBhbmQgcmVwb3J0IG9mIHRoZSBpc3N1ZQorMS4gRGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gZW5jb3VudGVyZWQKIAogVGhpcyB3aWxsIGJlIGEgbWVzc2FnZSBpbiB0aGUgc3lzdGVtIGxvZyBzdGFydGluZyB3aXRoCiAKLSoqKiBTTFVCIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPFdoYXQgd2VudCB3cm9uZz5APG9iamVjdCBhZGRyZXNzPgotb2Zmc2V0PTxvZmZzZXQgb2Ygb2JqZWN0IGludG8gc2xhYj4gZmxhZ3M9PHNsYWJmbGFncz4KLWludXNlPTxvYmplY3RzIGluIHVzZSBpbiB0aGlzIHNsYWI+IGZyZWVsaXN0PTxmaXJzdCBmcmVlIG9iamVjdCBpbiBzbGFiPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0JVRyA8c2xhYiBjYWNoZSBhZmZlY3RlZD46IDxXaGF0IHdlbnQgd3Jvbmc+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0yLiBSZXBvcnQgb24gaG93IHRoZSBwcm9ibGVtIHdhcyBkZWFsdCB3aXRoIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgY29udGludWVkCi1vcGVyYXRpb24gb2YgdGhlIHN5c3RlbS4KK0lORk86IDxjb3JydXB0aW9uIHN0YXJ0Pi08Y29ycnVwdGlvbl9lbmQ+IDxtb3JlIGluZm8+CitJTkZPOiBTbGFiIDxhZGRyZXNzPiA8c2xhYiBpbmZvcm1hdGlvbj4KK0lORk86IE9iamVjdCA8YWRkcmVzcz4gPG9iamVjdCBpbmZvcm1hdGlvbj4KK0lORk86IEFsbG9jYXRlZCBpbiA8a2VybmVsIGZ1bmN0aW9uPiBhZ2U9PGppZmZpZXMgc2luY2UgYWxsb2M+IGNwdT08YWxsb2NhdGVkIGJ5CisJY3B1PiBwaWQ9PHBpZCBvZiB0aGUgcHJvY2Vzcz4KK0lORk86IEZyZWVkIGluIDxrZXJuZWwgZnVuY3Rpb24+IGFnZT08amlmZmllcyBzaW5jZSBmcmVlPiBjcHU9PGZyZWVkIGJ5IGNwdT4KKwkgcGlkPTxwaWQgb2YgdGhlIHByb2Nlc3M+CiAKLVRoZXNlIGFyZSBtZXNzYWdlcyBpbiB0aGUgc3lzdGVtIGxvZyBiZWdpbm5pbmcgd2l0aAorKE9iamVjdCBhbGxvY2F0aW9uIC8gZnJlZSBpbmZvcm1hdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpZiBTTEFCX1NUT1JFX1VTRVIgaXMKK3NldCBmb3IgdGhlIHNsYWIuIHNsdWJfZGVidWcgc2V0cyB0aGF0IG9wdGlvbikKIAotQEBAIFNMVUIgPHNsYWIgY2FjaGUgYWZmZWN0ZWQ+OiA8Y29ycmVjdGl2ZSBhY3Rpb24gdGFrZW4+CisyLiBUaGUgb2JqZWN0IGNvbnRlbnRzIGlmIGFuIG9iamVjdCB3YXMgaW52b2x2ZWQuCiAKLQotSW4gdGhlIGFib3ZlIHNhbXBsZSBTTFVCIGZvdW5kIHRoYXQgdGhlIFJlZHpvbmUgb2YgYW4gYWN0aXZlIG9iamVjdCBoYXMKLWJlZW4gb3ZlcndyaXR0ZW4uIEhlcmUgYSBzdHJpbmcgb2YgOCBjaGFyYWN0ZXJzIHdhcyB3cml0dGVuIGludG8gYSBzbGFiIHRoYXQKLWhhcyB0aGUgbGVuZ3RoIG9mIDggY2hhcmFjdGVycy4gSG93ZXZlciwgYSA4IGNoYXJhY3RlciBzdHJpbmcgbmVlZHMgYQotdGVybWluYXRpbmcgMC4gVGhhdCB6ZXJvIGhhcyBvdmVyd3JpdHRlbiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgUmVkem9uZSBmaWVsZC4KLUFmdGVyIHJlcG9ydGluZyB0aGUgZGV0YWlscyBvZiB0aGUgaXNzdWUgZW5jb3VudGVyZWQgdGhlIEBAQCBTTFVCIG1lc3NhZ2UKLXRlbGwgdXMgdGhhdCBTTFVCIGhhcyByZXN0b3JlZCB0aGUgcmVkem9uZSB0byBpdHMgcHJvcGVyIHZhbHVlIGFuZCB0aGVuCi1zeXN0ZW0gb3BlcmF0aW9ucyBjb250aW51ZS4KLQotVmFyaW91cyB0eXBlcyBvZiBsaW5lcyBjYW4gZm9sbG93IHRoZSBAQEAgU0xVQiBsaW5lOgorVmFyaW91cyB0eXBlcyBvZiBsaW5lcyBjYW4gZm9sbG93IHRoZSBCVUcgU0xVQiBsaW5lOgogCiBCeXRlcyBiNCA8YWRkcmVzcz4gOiA8Ynl0ZXM+Ci0JU2hvdyBhIGZldyBieXRlcyBiZWZvcmUgdGhlIG9iamVjdCB3aGVyZSB0aGUgcHJvYmxlbSB3YXMgZGV0ZWN0ZWQuCisJU2hvd3MgYSBmZXcgYnl0ZXMgYmVmb3JlIHRoZSBvYmplY3Qgd2hlcmUgdGhlIHByb2JsZW0gd2FzIGRldGVjdGVkLgogCUNhbiBiZSB1c2VmdWwgaWYgdGhlIGNvcnJ1cHRpb24gZG9lcyBub3Qgc3RvcCB3aXRoIHRoZSBzdGFydCBvZiB0aGUKIAlvYmplY3QuCiAKIE9iamVjdCA8YWRkcmVzcz4gOiA8Ynl0ZXM+CiAJVGhlIGJ5dGVzIG9mIHRoZSBvYmplY3QuIElmIHRoZSBvYmplY3QgaXMgaW5hY3RpdmUgdGhlbiB0aGUgYnl0ZXMKLQl0eXBpY2FsbHkgY29udGFpbiBwb2lzb25pbmcgdmFsdWVzLiBBbnkgbm9uLXBvaXNvbiB2YWx1ZSBzaG93cyBhCisJdHlwaWNhbGx5IGNvbnRhaW4gcG9pc29uIHZhbHVlcy4gQW55IG5vbi1wb2lzb24gdmFsdWUgc2hvd3MgYQogCWNvcnJ1cHRpb24gYnkgYSB3cml0ZSBhZnRlciBmcmVlLgogCiBSZWR6b25lIDxhZGRyZXNzPiA6IDxieXRlcz4KLQlUaGUgcmVkem9uZSBmb2xsb3dpbmcgdGhlIG9iamVjdC4gVGhlIHJlZHpvbmUgaXMgdXNlZCB0byBkZXRlY3QKKwlUaGUgUmVkem9uZSBmb2xsb3dpbmcgdGhlIG9iamVjdC4gVGhlIFJlZHpvbmUgaXMgdXNlZCB0byBkZXRlY3QKIAl3cml0ZXMgYWZ0ZXIgdGhlIG9iamVjdC4gQWxsIGJ5dGVzIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgc2FtZQogCXZhbHVlLiBJZiB0aGVyZSBpcyBhbnkgZGV2aWF0aW9uIHRoZW4gaXQgaXMgZHVlIHRvIGEgd3JpdGUgYWZ0ZXIKIAl0aGUgb2JqZWN0IGJvdW5kYXJ5LgogCi1GcmVlcG9pbnRlcgotCVRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGZyZWUgb2JqZWN0IGluIHRoZSBzbGFiLiBNYXkgYmVjb21lCi0JY29ycnVwdGVkIGlmIG92ZXJ3cml0aW5nIGNvbnRpbnVlcyBhZnRlciB0aGUgcmVkIHpvbmUuCisJKFJlZHpvbmUgaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgU0xBQl9SRURfWk9ORSBpcyBzZXQuCisJc2x1Yl9kZWJ1ZyBzZXRzIHRoYXQgb3B0aW9uKQogCi1MYXN0IGFsbG9jOgotTGFzdCBmcmVlOgotCVNob3dzIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIG9iamVjdCB3YXMgYWxsb2NhdGVkL2ZyZWVkIGxhc3QuCi0JV2Ugbm90ZSB0aGUgcGlkLCB0aGUgdGltZSBhbmQgdGhlIENQVSB0aGF0IGRpZCBzby4gVGhpcyBpcyB1c3VhbGx5Ci0JdGhlIG1vc3QgdXNlZnVsIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhpbmdzIHdlbnQgd3JvbmcuCi0JSGVyZSBnZXRfbW9kYWxpYXMoKSBkaWQgYW4ga21hbGxvYyg4KSBpbnN0ZWFkIG9mIGEga21hbGxvYyg5KS4KLQotRmlsbGVyIDxhZGRyZXNzPiA6IDxieXRlcz4KK1BhZGRpbmcgPGFkZHJlc3M+IDogPGJ5dGVzPgogCVVudXNlZCBkYXRhIHRvIGZpbGwgdXAgdGhlIHNwYWNlIGluIG9yZGVyIHRvIGdldCB0aGUgbmV4dCBvYmplY3QKIAlwcm9wZXJseSBhbGlnbmVkLiBJbiB0aGUgZGVidWcgY2FzZSB3ZSBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUKLQlhdCBsZWFzdCA0IGJ5dGVzIG9mIGZpbGxlci4gVGhpcyBhbGxvdyBmb3IgdGhlIGRldGVjdGlvbiBvZiB3cml0ZXMKKwlhdCBsZWFzdCA0IGJ5dGVzIG9mIHBhZGRpbmcuIFRoaXMgYWxsb3dzIHRoZSBkZXRlY3Rpb24gb2Ygd3JpdGVzCiAJYmVmb3JlIHRoZSBvYmplY3QuCiAKLUZvbGxvd2luZyB0aGUgZmlsbGVyIHdpbGwgYmUgYSBzdGFja2R1bXAuIFRoYXQgc3RhY2tkdW1wIGRlc2NyaWJlcyB0aGUKLWxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuIFRoZSBjYXVzZSBvZiB0aGUgY29ycnVwdGlvbiBpcyBtb3JlCi1saWtlbHkgdG8gYmUgZm91bmQgYnkgbG9va2luZyBhdCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgYWxsb2MgLyBmcmVlLgorMy4gQSBzdGFja2R1bXAKIAotQ2hyaXN0b3BoIExhbWV0ZXIsIDxjbGFtZXRlckBzZ2kuY29tPiwgTWF5IDIzLCAyMDA3CitUaGUgc3RhY2tkdW1wIGRlc2NyaWJlcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gVGhlIGNhdXNlCitvZiB0aGUgY29ycnVwdGlvbiBpcyBtYXkgYmUgbW9yZSBsaWtlbHkgZm91bmQgYnkgbG9va2luZyBhdCB0aGUgZnVuY3Rpb24gdGhhdAorYWxsb2NhdGVkIG9yIGZyZWVkIHRoZSBvYmplY3QuCisKKzQuIFJlcG9ydCBvbiBob3cgdGhlIHByb2JsZW0gd2FzIGRlYWx0IHdpdGggaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBjb250aW51ZWQKK29wZXJhdGlvbiBvZiB0aGUgc3lzdGVtLgorCitUaGVzZSBhcmUgbWVzc2FnZXMgaW4gdGhlIHN5c3RlbSBsb2cgYmVnaW5uaW5nIHdpdGgKKworRklYIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPGNvcnJlY3RpdmUgYWN0aW9uIHRha2VuPgorCitJbiB0aGUgYWJvdmUgc2FtcGxlIFNMVUIgZm91bmQgdGhhdCB0aGUgUmVkem9uZSBvZiBhbiBhY3RpdmUgb2JqZWN0IGhhcworYmVlbiBvdmVyd3JpdHRlbi4gSGVyZSBhIHN0cmluZyBvZiA4IGNoYXJhY3RlcnMgd2FzIHdyaXR0ZW4gaW50byBhIHNsYWIgdGhhdAoraGFzIHRoZSBsZW5ndGggb2YgOCBjaGFyYWN0ZXJzLiBIb3dldmVyLCBhIDggY2hhcmFjdGVyIHN0cmluZyBuZWVkcyBhCit0ZXJtaW5hdGluZyAwLiBUaGF0IHplcm8gaGFzIG92ZXJ3cml0dGVuIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBSZWR6b25lIGZpZWxkLgorQWZ0ZXIgcmVwb3J0aW5nIHRoZSBkZXRhaWxzIG9mIHRoZSBpc3N1ZSBlbmNvdW50ZXJlZCB0aGUgRklYIFNMVUIgbWVzc2FnZQordGVsbCB1cyB0aGF0IFNMVUIgaGFzIHJlc3RvcmVkIHRoZSBSZWR6b25lIHRvIGl0cyBwcm9wZXIgdmFsdWUgYW5kIHRoZW4KK3N5c3RlbSBvcGVyYXRpb25zIGNvbnRpbnVlLgorCitFbWVyZ2VuY3kgb3BlcmF0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNaW5pbWFsIGRlYnVnZ2luZyAoc2FuaXR5IGNoZWNrcyBhbG9uZSkgY2FuIGJlIGVuYWJsZWQgYnkgYm9vdGluZyB3aXRoCisKKwlzbHViX2RlYnVnPUYKKworVGhpcyB3aWxsIGJlIGdlbmVyYWxseSBiZSBlbm91Z2ggdG8gZW5hYmxlIHRoZSByZXNpbGllbmN5IGZlYXR1cmVzIG9mIHNsdWIKK3doaWNoIHdpbGwga2VlcCB0aGUgc3lzdGVtIHJ1bm5pbmcgZXZlbiBpZiBhIGJhZCBrZXJuZWwgY29tcG9uZW50IHdpbGwKK2tlZXAgY29ycnVwdGluZyBvYmplY3RzLiBUaGlzIG1heSBiZSBpbXBvcnRhbnQgZm9yIHByb2R1Y3Rpb24gc3lzdGVtcy4KK1BlcmZvcm1hbmNlIHdpbGwgYmUgaW1wYWN0ZWQgYnkgdGhlIHNhbml0eSBjaGVja3MgYW5kIHRoZXJlIHdpbGwgYmUgYQorY29udGludWFsIHN0cmVhbSBvZiBlcnJvciBtZXNzYWdlcyB0byB0aGUgc3lzbG9nIGJ1dCBubyBhZGRpdGlvbmFsIG1lbW9yeQord2lsbCBiZSB1c2VkICh1bmxpa2UgZnVsbCBkZWJ1Z2dpbmcpLgorCitObyBndWFyYW50ZWVzLiBUaGUga2VybmVsIGNvbXBvbmVudCBzdGlsbCBuZWVkcyB0byBiZSBmaXhlZC4gUGVyZm9ybWFuY2UKK21heSBiZSBvcHRpbWl6ZWQgZnVydGhlciBieSBsb2NhdGluZyB0aGUgc2xhYiB0aGF0IGV4cGVyaWVuY2VzIGNvcnJ1cHRpb24KK2FuZCBlbmFibGluZyBkZWJ1Z2dpbmcgb25seSBmb3IgdGhhdCBjYWNoZQorCitJLmUuCisKKwlzbHViX2RlYnVnPUYsZGVudHJ5CisKK0lmIHRoZSBjb3JydXB0aW9uIG9jY3VycyBieSB3cml0aW5nIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG9iamVjdCB0aGVuIGl0CittYXkgYmUgYWR2aXNhYmxlIHRvIGVuYWJsZSBhIFJlZHpvbmUgdG8gYXZvaWQgY29ycnVwdGluZyB0aGUgYmVnaW5uaW5nCitvZiBvdGhlciBvYmplY3RzLgorCisJc2x1Yl9kZWJ1Zz1GWixkZW50cnkKKworQ2hyaXN0b3BoIExhbWV0ZXIsIDxjbGFtZXRlckBzZ2kuY29tPiwgTWF5IDMwLCAyMDA3CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDM5MTQyNjkuLjVhYmVjMTQgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xOTQsMTMgKzE5NCw2IEBACiBMOglsaW51eC1hY2VuaWNAc3Vuc2l0ZS5kawogUzoJTWFpbnRhaW5lZAogCi1BQ0kgTUlYRVIgRFJJVkVSCi1QOglSb2JlcnQgU2llbWVyCi1NOglSb2JlcnQuU2llbWVyQGdteC5kZQotTDoJbGludXgtc291bmRAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3LnN0dWQudW5pLWthcmxzcnVoZS5kZS9+dWgxYi8KLVM6CU1haW50YWluZWQKLQogSVBTIFNDU0kgUkFJRCBEUklWRVIKIFA6CUFkYXB0ZWMgT0VNIFJhaWQgU29sdXRpb25zCiBNOglhYWNyYWlkQGFkYXB0ZWMuY29tCkBAIC0yNzIsMjEgKzI2NSw2IEBACiBXOglodHRwOi8vYWNwaS5zb3VyY2Vmb3JnZS5uZXQvCiBTOglTdXBwb3J0ZWQKIAotQUQxODE2IFNPVU5EIERSSVZFUgotUDoJVGhvcnN0ZW4gS25hYmUKLU06CVRob3JzdGVuIEtuYWJlIDxsaW51eEB0aG9yc3Rlbi1rbmFiZS5kZT4KLVc6CWh0dHA6Ly9saW51eC50aG9yc3Rlbi1rbmFiZS5kZQotUzoJTWFpbnRhaW5lZAotCi1BRDE4ODkgU09VTkQgRFJJVkVSCi1QOglLeWxlIE1jTWFydGluCi1NOglreWxlQHBhcmlzYy1saW51eC5vcmcKLVA6CVRoaWJhdXQgVmFyZW5lCi1NOglULUJvbmVAcGFyaXNjLWxpbnV4Lm9yZwotVzoJaHR0cDovL3dpa2kucGFyaXNjLWxpbnV4Lm9yZy9BRDE4ODkKLUw6CXBhcmlzYy1saW51eEBsaXN0cy5wYXJpc2MtbGludXgub3JnCi1TOglNYWludGFpbmVkCi0KIEFETTEwMjUgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKIFA6CUplYW4gRGVsdmFyZQogTToJa2hhbGlAbGludXgtZnIub3JnCkBAIC0xMjc2LDYgKzEyNTQsMTIgQEAKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorRE1BIEdFTkVSSUMgTUVNQ1BZIFNVQlNZU1RFTQorUDoJU2hhbm5vbiBOZWxzb24KK006CXNoYW5ub24ubmVsc29uQGludGVsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCiBET0NCT09LIEZPUiBET0NVTUVOVEFUSU9OCiBQOglSYW5keSBEdW5sYXAKIE06CXJkdW5sYXBAeGVub3RpbWUubmV0CkBAIC0xMzk4LDEzICsxMzgyLDYgQEAKIEw6CWdlbmVyYWxAbGlzdHMub3BlbmZhYnJpY3Mub3JnCiBTOglTdXBwb3J0ZWQKIAotRU1VMTBLMSBTT1VORCBEUklWRVIKLVA6CUphbWVzIENvdXJ0aWVyLUR1dHRvbgotTToJSmFtZXNAc3VwZXJidWcuZGVtb24uY28udWsKLUw6CWVtdTEwazEtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1XOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2VtdTEwazEvCi1TOglNYWludGFpbmVkCi0KIEVNVUxFWCBMUEZDIEZDIFNDU0kgRFJJVkVSCiBQOglKYW1lcyBTbWFydAogTToJamFtZXMuc21hcnRAZW11bGV4LmNvbQpAQCAtMTkwMCw2ICsxODc3LDEyIEBACiBNOgl0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWsKIFM6CU1haW50YWluZWQKIAorSU5URUwgSS9PQVQgRE1BIERSSVZFUgorUDoJU2hhbm5vbiBOZWxzb24KK006CXNoYW5ub24ubmVsc29uQGludGVsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIElOVEVMIElYUDRYWCBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBTVVBQT1JUCiBQOglEZWVwYWsgU2F4ZW5hCiBNOglkc2F4ZW5hQHBsZXhpdHkubmV0CkBAIC0yMjk3LDYgKzIyODAsMTQgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK00zMlIgQVJDSElURUNUVVJFCitQOglIaXJva2F6dSBUYWthdGEKK006CXRha2F0YUBsaW51eC1tMzJyLm9yZworTDoJbGludXgtbTMyckBtbC5saW51eC1tMzJyLm9yZworTDoJbGludXgtbTMyci1qYUBtbC5saW51eC1tMzJyLm9yZyAoaW4gSmFwYW5lc2UpCitXOglodHRwOi8vd3d3LmxpbnV4LW0zMnIub3JnLworUzoJTWFpbnRhaW5lZAorCiBNNjhLIEFSQ0hJVEVDVFVSRQogUDoJR2VlcnQgVXl0dGVyaG9ldmVuCiBNOglnZWVydEBsaW51eC1tNjhrLm9yZwpAQCAtMjYyMiwxMiArMjYxMyw2IEBACiBXOglodHRwOi8vd3d3Lm5ldGxhYi5pcy50c3VrdWJhLmFjLmpwL355b2tvdGEvaXp1bWkvbmluamEvCiBTOglNYWludGFpbmVkCiAKLU5PTi1JREUvTk9OLVNDU0kgQ0RST00gRFJJVkVSUyBbR0VORVJBTF0gKGNvbWUgb24sIGNyZXcgLSBtYXJrIHlvdXIgcmVzcG9uc2liaWxpdHkpCi1QOglFYmVyaGFyZCBNb2Vua2ViZXJnCi1NOgllbW9lbmtlQGd3ZGcuZGUKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogTlRGUyBGSUxFU1lTVEVNCiBQOglBbnRvbiBBbHRhcGFybWFrb3YKIE06CWFpYTIxQGNhbnRhYi5uZXQKQEAgLTI3MTAsMTIgKzI2OTUsNiBAQAogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAotT1BMMy1TQTIsIFNBMywgYW5kIFNBeCBEUklWRVIKLVA6CVp3YW5lIE13YWlrYW1ibwotTToJendhbmVAYXJtLmxpbnV4Lm9yZy51awotTDoJbGludXgtc291bmRAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIE9QUk9GSUxFCiBQOglQaGlsaXBwZSBFbGllCiBNOglwaGlsLmVsQHdhbmFkb28uZnIKQEAgLTMxMjAsMTIgKzMwOTksNiBAQAogVzoJaHR0cDovL3d3dy5taWh1LmRlL2xpbnV4L3NhYTcxNDYKIFM6CU1haW50YWluZWQKIAotU0JQQ0QgQ0RST00gRFJJVkVSCi1QOglFYmVyaGFyZCBNb2Vua2ViZXJnCi1NOgllbW9lbmtlQGd3ZGcuZGUKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogU0MxMjAwIFdEVCBEUklWRVIKIFA6CVp3YW5lIE13YWlrYW1ibwogTToJendhbmVAYXJtLmxpbnV4Lm9yZy51awpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBkZTRmOGY3Li5kZGJmY2FjIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMzEzLDcgKzMxMyw4IEBACiBDUFBGTEFHUyAgICAgICAgOj0gLURfX0tFUk5FTF9fICQoTElOVVhJTkNMVURFKQogCiBDRkxBR1MgICAgICAgICAgOj0gLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIFwKLSAgICAgICAgICAgICAgICAgICAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbgorCQkgICAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiBcCisJCSAgIC1XZXJyb3ItaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24KIEFGTEFHUyAgICAgICAgICA6PSAtRF9fQVNTRU1CTFlfXwogCiAjIFJlYWQgS0VSTkVMUkVMRUFTRSBmcm9tIGluY2x1ZGUvY29uZmlnL2tlcm5lbC5yZWxlYXNlIChpZiBpdCBleGlzdHMpCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCmluZGV4IDBjZDA2MDUuLjgzYTc4MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCkBAIC0zMTUsOSArMzE1LDcgQEAKIAkvKiBXaGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXRtcCA9IGRhdGE7Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMSk7Ci0JCXJldCA9IChjb3BpZWQgPT0gc2l6ZW9mKHRtcCkpID8gMCA6IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCmluZGV4IDgwY2ZiNzUuLmIyODczMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCkBAIC02NSw3ICs2NSw3IEBACiB9OwogCiAvKiBTZXQgdG8gYSBzZWNvbmRhcnkncyBjcHVpZCB3aGVuIGl0IGNvbWVzIG9ubGluZS4gICovCi1zdGF0aWMgaW50IHNtcF9zZWNvbmRhcnlfYWxpdmUgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHNtcF9zZWNvbmRhcnlfYWxpdmUgX19kZXZpbml0ZGF0YSA9IDA7CiAKIC8qIFdoaWNoIGNwdXMgaWRzIGNhbWUgb25saW5lLiAgKi8KIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKQEAgLTE3Myw3ICsxNzMsNyBAQAogfQogCiAvKiBXYWl0IHVudGlsIGh3cnBiLT50eHJkeSBpcyBjbGVhciBmb3IgY3B1LiAgUmV0dXJuIC0xIG9uIHRpbWVvdXQuICAqLwotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQgX19kZXZpbml0CiB3YWl0X2Zvcl90eHJkeSAodW5zaWduZWQgbG9uZyBjcHVtYXNrKQogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKQEAgLTM1OCw3ICszNTgsNyBAQAogLyoKICAqIEJyaW5nIG9uZSBjcHUgb25saW5lLgogICovCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIHNtcF9ib290X29uZV9jcHUoaW50IGNwdWlkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYwppbmRleCA5MzBjZWRjLi43ODNmNGU1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zcm1jb25zLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3JtY29ucy5jCkBAIC0yODksNyArMjg5LDcgQEAKIAlyZXR1cm4gc3JtY29uc19kcml2ZXI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50CiBzcm1fY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKaW5kZXggMGJjYjk2OC4uOTIyMTQzZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCWlvN19jbGVhcl9lcnJvcnMoaW83KTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyB2b2lkIF9faW5pdAogbWFydmVsX2luaXRfcnRjKHZvaWQpCiB7CiAJaW5pdF9ydGNfaXJxKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKaW5kZXggNDc0OGUxNC4uMWRkNTBkMCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCit2b2lkIF9faW5pdAogY29tbW9uX2luaXRfcnRjKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciB4OwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMKaW5kZXggZDZlNjY1ZC4uZWMwZjA1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90cmFwcy5jCkBAIC0xODQsNiArMTg0LDcgQEAKICNlbmRpZgogCXByaW50aygiJXMoJWQpOiAlcyAlbGRcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc3RyLCBlcnIpOwogCWRpa19zaG93X3JlZ3MocmVncywgcjlfMTUpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWRpa19zaG93X3RyYWNlKCh1bnNpZ25lZCBsb25nICopKHJlZ3MrMSkpOwogCWRpa19zaG93X2NvZGUoKHVuc2lnbmVkIGludCAqKXJlZ3MtPnBjKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYyBiL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMKaW5kZXggYWIzNzYxYy4uODY5OGUwNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jCkBAIC02OSw2ICs2OSw3IEBACiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CiAKIC8qCiAgKiBEbyBhIDY0LWJpdCBjaGVja3N1bSBvbiBhbiBhcmJpdHJhcnkgbWVtb3J5IGFyZWEuLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCmluZGV4IDZmMmY0NmMuLjc4YzlmMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKQEAgLTY1Nyw3ICs2NTcsNiBAQAogCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHJldDsKIAogCXN3aXRjaCAocmVxdWVzdCkgewpAQCAtNjY2LDEyICs2NjUsNyBAQAogCQkgKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgotCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDApOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC02ODMsMTIgKzY3Nyw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDEpOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggMjM3ZjQ5OS4uZjIxMTRiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTI0OSw2ICsyNDksNyBAQAogCWJ1c3Rfc3BpbmxvY2tzKDEpOwogCV9fZGllKHN0ciwgZXJyLCB0aHJlYWQsIHJlZ3MpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCmluZGV4IGUxOGE0MWUuLmRkZTA4OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCkBAIC04Myw2ICs4NCwxMyBAQAogCS5wdWxsdXBfcGluCT0gQVQ5MV9QSU5fUEEyNCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBjc2IzMzdfaTJjX2RldmljZXNbXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJydGMtZHMxMzA3IiwgMHg2OCksCisJICAudHlwZSA9ICJkczEzMDciLAorCX0sCit9OworCisKIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9jZl9kYXRhIF9faW5pdGRhdGEgY3NiMzM3X2NmX2RhdGEgPSB7CiAJLyoKIAkgKiBjb25uZWN0b3IgUDQgb24gdGhlIENTQiAzMzcgbWF0ZXMgdG8KQEAgLTE2MSw2ICsxNjksOCBAQAogCWF0OTFfYWRkX2RldmljZV91ZGMoJmNzYjMzN191ZGNfZGF0YSk7CiAJLyogSTJDICovCiAJYXQ5MV9hZGRfZGV2aWNlX2kyYygpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGNzYjMzN19pMmNfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUoY3NiMzM3X2kyY19kZXZpY2VzKSk7CiAJLyogQ29tcGFjdCBGbGFzaCAqLwogCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyMiwgMSk7CQkvKiBJT0lTMTYgKi8KIAlhdDkxX2FkZF9kZXZpY2VfY2YoJmNzYjMzN19jZl9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCmluZGV4IDM5MGE5N2QuLjE4NzNiZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgpAQCAtMTk5LDYgKzIwMCwxMiBAQAogCS5yZXNvdXJjZQk9ICZuMjEwMF91YXJ0X3Jlc291cmNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIG4yMTAwX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicnRjLXJzNWMzNzIiLCAweDMyKSwKKwkJLnR5cGUgPSAicnM1YzM3MmIiLAorCX0sCit9OwogCiAvKgogICogUHVsbCBQQ0E5NTMyIEdQSU8gIzggbG93IHRvIHBvd2VyIG9mZiB0aGUgbWFjaGluZS4KQEAgLTI0OCw2ICsyNTUsOSBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaW9wM3h4X2RtYV8wX2NoYW5uZWwpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaW9wM3h4X2RtYV8xX2NoYW5uZWwpOwogCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbjIxMDBfaTJjX2RldmljZXMsCisJCUFSUkFZX1NJWkUobjIxMDBfaTJjX2RldmljZXMpKTsKKwogCXBtX3Bvd2VyX29mZiA9IG4yMTAwX3Bvd2VyX29mZjsKIAogCWluaXRfdGltZXIoJnBvd2VyX2J1dHRvbl9wb2xsX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvS2NvbmZpZyBiL2FyY2gvYXJtMjYvS2NvbmZpZwppbmRleCAyMDY4OGJjLi45MDQ0ZjMzIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L0tjb25maWcKKysrIGIvYXJjaC9hcm0yNi9LY29uZmlnCkBAIC0xNyw2ICsxNyw5IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgTk9fRE1BCisJZGVmX2Jvb2wgeQorCiBjb25maWcgQVJDSF9BQ09STgogICAgICAgICBib29sCiAgICAgICAgIGRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9kZWZjb25maWcgYi9hcmNoL2FybTI2L2RlZmNvbmZpZwppbmRleCBjNGE4OTcwLi4yYjdkNDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2RlZmNvbmZpZworKysgYi9hcmNoL2FybTI2L2RlZmNvbmZpZwpAQCAtMjQ4LDcgKzI0OCw2IEBACiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfRkFUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VNU0RPU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNDE2OTI3OS4uMGZlZmI4NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCkBAIC01MzEsNyArNTMxLDYgQEAKIAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKQEAgLTU0MCwxMiArNTM5LDcgQEAKIAkJICovCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgogCQljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC01NTcsMTIgKzU1MSw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDEpOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jCmluZGV4IGQ1OTRmYjUuLjI5MTFlMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYwpAQCAtMTg1LDYgKzE4NSw3IEBACiAJcHJpbnRrKCJJbnRlcm5hbCBlcnJvcjogJXM6ICV4XG4iLCBzdHIsIGVycik7CiAJcHJpbnRrKCJDUFU6ICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXNob3dfcmVncyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHN0YWNrIGxpbWl0ID0gMHglcClcbiIsCiAJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZW5kX29mX3N0YWNrKHRzaykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L21tL2luaXQuYyBiL2FyY2gvYXJtMjYvbW0vaW5pdC5jCmluZGV4IDU2MmZhYzEuLjM2ZTdlZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtMjYvbW0vaW5pdC5jCkBAIC0zMyw5ICszMyw2IEBACiAKICNpbmNsdWRlIDxhc20vbWFwLmg+CiAKLQotI2RlZmluZSBUQUJMRV9TSVpFCVBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCkpCi0KIHN0cnVjdCBtbXVfZ2F0aGVyIG1tdV9nYXRoZXJzW05SX0NQVVNdOwogCiBleHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2MzNmMyZC4uMzkwNjBjYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE1Myw3ICsxNTMsNiBAQAogCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHJldDsKIAogCXByX2RlYnVnKCJhcmNoX3B0cmFjZSglbGQsICVkLCAlI2x4LCAlI2x4KVxuIiwKQEAgLTE2NiwxMSArMTY1LDcgQEAKIAkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoKIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKHJldCA9PSBzaXplb2YodG1wKSkKLQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgpAQCAtMTgxLDExICsxNzYsNyBAQAogCS8qIFdyaXRlIHRoZSB3b3JkIGluIGRhdGEgYXQgbG9jYXRpb24gYWRkciAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKGRhdGEpKQotCQkJcmV0ID0gMDsKLQkJZWxzZQotCQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYwppbmRleCA4NmQxMDc1Li45YTczY2U3IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKQEAgLTU2LDYgKzU2LDcgQEAKIAlzaG93X3JlZ3NfbG9nX2x2bChyZWdzLCBLRVJOX0VNRVJHKTsKIAlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncy0+c3AsIHJlZ3MsIEtFUk5fRU1FUkcpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpAQCAtMTg0LDcgKzE4NSw3IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykgJiYgKGVjciA9PSBFQ1JfSUxMRUdBTF9PUENPREUpKSB7CiAJCWVudW0gYnVnX3RyYXBfdHlwZSB0eXBlOwogCi0JCXR5cGUgPSByZXBvcnRfYnVnKHJlZ3MtPnBjKTsKKwkJdHlwZSA9IHJlcG9ydF9idWcocmVncy0+cGMsIHJlZ3MpOwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBCVUdfVFJBUF9UWVBFX05PTkU6CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kZWZjb25maWcgYi9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCmluZGV4IDJhMzQxMWVhLi43MTBjMjBiIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kZWZjb25maWcKQEAgLTQyOSw3ICs0MjksNiBAQAogIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTVNET1NfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBmZDIxMjlhLi5mNGY5ZGI2OSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jCkBAIC04MywxOSArODMsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiBSZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcy4gKi8gCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgotCQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCQlpbnQgY29waWVkOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCQotCQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCQlicmVhazsKLQkJCQotCQkJcmV0ID0gcHV0X3VzZXIodG1wLGRhdGFwKTsKKwkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKLQkJfQogCiAJCS8qIFJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCQljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xMTMsMTIgKzEwMyw3IEBACiAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQkKLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCQkJCi0JCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAgCiAgCQkvKiBXcml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyZXNzIGluIHRoZSBVU0VSIGFyZWEuICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCmluZGV4IDFhMDcxZjEuLmU4OTE0ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCkBAIC0yNjcsMTAgKzI2NywxMCBAQAogCiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3J5cHRvY29wX2ZvcHMgPSB7Ci0Jb3duZXI6IFRISVNfTU9EVUxFLAotCW9wZW46IGNyeXB0b2NvcF9vcGVuLAotCXJlbGVhc2U6IGNyeXB0b2NvcF9yZWxlYXNlLAotCWlvY3RsOiBjcnlwdG9jb3BfaW9jdGwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQljcnlwdG9jb3Bfb3BlbiwKKwkucmVsZWFzZSA9CWNyeXB0b2NvcF9yZWxlYXNlLAorCS5pb2N0bCA9CWNyeXB0b2NvcF9pb2N0bAogfTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCmluZGV4IDVkNmM1MjcuLmUxMmY2Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCkBAIC01NzQsMTAgKzU3NCwxMCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMmNfZm9wcyA9IHsKLQlvd25lcjogICAgVEhJU19NT0RVTEUsCi0JaW9jdGw6ICAgIGkyY19pb2N0bCwKLQlvcGVuOiAgICAgaTJjX29wZW4sCi0JcmVsZWFzZTogIGkyY19yZWxlYXNlLAorCS5vd25lciA9ICAgIFRISVNfTU9EVUxFLAorCS5pb2N0bCA9ICAgIGkyY19pb2N0bCwKKwkub3BlbiA9ICAgICBpMmNfb3BlbiwKKwkucmVsZWFzZSA9ICBpMmNfcmVsZWFzZSwKIH07CiAKIGludCBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYwppbmRleCAyNGI5MTliLi5mYThkNTAwIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNmODU2My5jCkBAIC01MSwxMCArNTEsMTAgQEAKIGludCBwY2Y4NTYzX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwY2Y4NTYzX2ZvcHMgPSB7Ci0Jb3duZXI6IFRISVNfTU9EVUxFLAotCWlvY3RsOiBwY2Y4NTYzX2lvY3RsLAotCW9wZW46IHBjZjg1NjNfb3BlbiwKLQlyZWxlYXNlOiBwY2Y4NTYzX3JlbGVhc2UsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmlvY3RsID0JcGNmODU2M19pb2N0bCwKKwkub3BlbiA9CQlwY2Y4NTYzX29wZW4sCisJLnJlbGVhc2UgPQlwY2Y4NTYzX3JlbGVhc2UsCiB9OwogCiB1bnNpZ25lZCBjaGFyCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYwppbmRleCBkNGQ1N2I3Li4zOGVjZTBjIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE0NiwxMiArMTQ2LDcgQEAKIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcy4gKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6CiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gMDsKLQotCQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQkJYnJlYWs7Ci0KLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwppbmRleCA0M2RjMDhlLi4yNzU2NzNjIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwpAQCAtMTQ5Miw2ICsxNDkyLDEwIEBACiAJLmxvbmcgc3lzX21vdmVfcGFnZXMKIAkubG9uZyBzeXNfZ2V0Y3B1CiAJLmxvbmcgc3lzX2Vwb2xsX3B3YWl0CisJLmxvbmcgc3lzX3V0aW1lbnNhdAkJLyogMzIwICovCisJLmxvbmcgc3lzX3NpZ25hbGZkCisJLmxvbmcgc3lzX3RpbWVyZmQKKwkubG9uZyBzeXNfZXZlbnRmZAogCiAKIHN5c2NhbGxfdGFibGVfc2l6ZSA9ICguIC0gc3lzX2NhbGxfdGFibGUpCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCmluZGV4IDFlN2ExMDEuLmU4OWNhZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCkBAIC02NDcsMTcgKzY0NywxMSBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfR0RCU1RVQl9DT05TT0xFCi0KLXN0YXRpYyBrZGV2X3QgZ2Ric3R1Yl9jb25zb2xlX2RldihzdHJ1Y3QgY29uc29sZSAqY29uKQotewotCXJldHVybiBNS0RFVigxLDMpOyAvKiAvZGV2L251bGwgKi8KLX0KKyNpZmRlZiBDT05GSUdfR0RCX0NPTlNPTEUKIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIGdkYnN0dWJfY29uc29sZSA9IHsKIAkubmFtZQk9ICJnZGIiLAogCS53cml0ZQk9IGdkYnN0dWJfY29uc29sZV93cml0ZSwJLyogaW4gYnJlYWsuUyAqLwotCS5kZXZpY2UJPSBnZGJzdHViX2NvbnNvbGVfZGV2LAogCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKIAkuaW5kZXgJPSAtMSwKIH07CkBAIC0yMDIxLDcgKzIwMTUsNyBAQAogCXB0ciA9IG1lbTJoZXgoZ2Ric3R1Yl9iYW5uZXIsIHB0ciwgc2l6ZW9mKGdkYnN0dWJfYmFubmVyKSAtIDEsIDApOwogCWdkYnN0dWJfc2VuZF9wYWNrZXQob3V0cHV0X2J1ZmZlcik7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX0dEQlNUVUJfSU1NRURJQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0dEQl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKIAlyZWdpc3Rlcl9jb25zb2xlKCZnZGJzdHViX2NvbnNvbGUpOwogI2VuZGlmCiAKQEAgLTIwMzEsNyArMjAyNSw3IEBACiAvKgogICogcmVnaXN0ZXIgdGhlIGNvbnNvbGUgYXQgYSBtb3JlIGFwcHJvcHJpYXRlIHRpbWUKICAqLwotI2lmIGRlZmluZWQgKENPTkZJR19HREJTVFVCX0NPTlNPTEUpICYmICFkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKKyNpZiBkZWZpbmVkIChDT05GSUdfR0RCX0NPTlNPTEUpICYmICFkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKIHN0YXRpYyBpbnQgX19pbml0IGdkYnN0dWJfcG9zdGluaXQodm9pZCkKIHsKIAlwcmludGsoInJlZ2lzdGVyaW5nIGNvbnNvbGVcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jCmluZGV4IGNlODhmYjkuLjcwOWU5YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMKQEAgLTExMiwyMCArMTEyLDEyIEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJaW50IGNvcGllZDsKLQorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgogCQlyZXQgPSAtRUlPOwogCQlpZiAoaXNfdXNlcl9hZGRyX3ZhbGlkKGNoaWxkLCBhZGRyLCBzaXplb2YodG1wKSkgPCAwKQogCQkJYnJlYWs7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMTc2LDkgKzE2OCw3IEBACiAJCXJldCA9IC1FSU87CiAJCWlmIChpc191c2VyX2FkZHJfdmFsaWQoY2hpbGQsIGFkZHIsIHNpemVvZih0bXApKSA8IDApCiAJCQlicmVhazsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gMDsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwppbmRleCBhYTNjNzk1Li5jMWMzMmU0IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwpAQCAtNjAsMTAgKzYwLDYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF91Y2xpbnV4X21lbW9yeSh2b2lkKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0NPTlNPTEUKLWV4dGVybiBzdHJ1Y3QgY29uc3cgKmNvbnN3aXRjaHA7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19NQjkzMDkwX01CMDAKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgbWI5MzA5MF9iYW5uZXJbXSA9ICJGSi9SSCBGUi1WIExpbnV4IjsKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgbWI5MzA5MF92ZXJzaW9uW10gPSBVVFNfUkVMRUFTRTsKQEAgLTc5NSwxMyArNzkxLDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DSFJfREVWX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZMQVNIKQotCS8qIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRmxhc2hyb20gZGV2aWNlIGhlcmUgc2luY2Ugd2UgbWlnaHQKLQkgKiBkbyB0aGluZ3Mgd2l0aCBmbGFzaCBlYXJseSBvbiBpbiB0aGUgYm9vdAotCSAqLwotCWZsYXNoX3Byb2JlKCk7Ci0jZW5kaWYKLQogCS8qIGRlYWwgd2l0aCB0aGUgY29tbWFuZCBsaW5lIC0gUmVkQm9vdCBtYXkgaGF2ZSBwYXNzZWQgb25lIHRvIHRoZSBrZXJuZWwgKi8KIAltZW1jcHkoY29tbWFuZF9saW5lLCBib290X2NvbW1hbmRfbGluZSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwogCSpjbWRsaW5lX3AgPSAmY29tbWFuZF9saW5lWzBdOwpAQCAtODM3LDExICs4MjYsNiBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0JMS01FTQotCVJPT1RfREVWID0gTUtERVYoQkxLTUVNX01BSk9SLDApOwotI2VuZGlmCi0JLypyb21fbGVuZ3RoID0gKHVuc2lnbmVkIGxvbmcpJl9mbGFzaGVuZCAtICh1bnNpZ25lZCBsb25nKSZfcm9tdmVjOyovCi0KICNpZmRlZiBDT05GSUdfTU1VCiAJc2V0dXBfbGludXhfbWVtb3J5KCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnIGIvYXJjaC9oODMwMC9LY29uZmlnCmluZGV4IDYxOGRiYWQuLmUzNWY3NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvS2NvbmZpZworKysgYi9hcmNoL2g4MzAwL0tjb25maWcKQEAgLTY4LDYgKzY4LDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBJU0EKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL01ha2VmaWxlIGIvYXJjaC9oODMwMC9NYWtlZmlsZQppbmRleCBiMmQ4OTZhLi41M2I1YzFlIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvTWFrZWZpbGUKQEAgLTYxLDEwICs2MSwxMSBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotdm1saW51eC5zcmVjIHZtbGludXguYmluOiB2bWxpbnV4Cit2bWxpbnV4LnNyZWMgdm1saW51eC5iaW4gekltYWdlOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkKGJvb3QpLyRACiAKIGRlZmluZSBhcmNoaGVscAotICBlY2hvICAndm1saW51eC5iaW4gIC0gQ3JlYXRlIHJhdyBiaW5hcnknCi0gIGVjaG8gICd2bWxpbnV4LnNyZWMgLSBDcmVhdGUgc3JlYyBiaW5hcnknCisgIEBlY2hvICAndm1saW51eC5iaW4gIC0gQ3JlYXRlIHJhdyBiaW5hcnknCisgIEBlY2hvICAndm1saW51eC5zcmVjIC0gQ3JlYXRlIHNyZWMgYmluYXJ5JworICBAZWNobyAgJ3pJbWFnZSAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJwogZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggNzFhYWM4Mi4uZDYxODllMCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTE1LDEwICsxNSwxMCBAQAogIyBpbiBvcmRlciB0byBzdXBwcmVzcyBlcnJvciBtZXNzYWdlLgogIwogQ09ORklHX01FTU9SWV9TVEFSVCAgICAgPz0gMHgwMDQwMDAwMAotQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDQwMDAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDE0MDAwMAogSU1BR0VfT0ZGU0VUIDo9ICQoc2hlbGwgcHJpbnRmICIweCUwOHgiICQkWyQoQ09ORklHX01FTU9SWV9TVEFSVCkrJChDT05GSUdfQk9PVF9MSU5LX09GRlNFVCldKQogCi1MREZMQUdTX3ZtbGludXggOj0gLVQgJChvYmopL3ZtbGludXgubGRzCitMREZMQUdTX3ZtbGludXggOj0gLVR0ZXh0ICQoSU1BR0VfT0ZGU0VUKSAtZXN0YXJ0dXAgJChvYmopL3ZtbGludXgubGRzCiAKICQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggYjhlOTBkMS4uOTg1YTgxYSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtNCw3ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgWW9zaGlub3JpIFNhdG8KICAqLwogCi0uaDgzMDBoCisJLmg4MzAwaAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogI2RlZmluZSBTUkFNX1NUQVJUIDB4ZmY0MDAwCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcwpAQCAtMCwwICsxLDMyIEBACitTRUNUSU9OUworeworICAgICAgICAudGV4dCA6CisgICAgICAgIHsKKyAgICAgICAgX19zdGV4dCA9IC4gOworCV9fdGV4dCA9IC47CisJICAgICAgICooLnRleHQuc3RhcnR1cCkKKwkgICAgICAgKigudGV4dCkKKyAgICAgICAgX19ldGV4dCA9IC4gOworICAgICAgICB9CisKKwkucm9kYXRhIDoKKwl7CisJCSooLnJvZGF0YSkKKwl9CisgICAgICAgIC5kYXRhIDoKKworICAgICAgICB7CisgICAgICAgIF9fc2RhdGEgPSAuIDsKKyAgICAgICAgX19fZGF0YV9zdGFydCA9IC4gOworICAgICAgICAgICAgICAgICooLmRhdGEuKikKKwl9CisgICAgICAgIC5ic3MgOgorICAgICAgICB7CisgICAgICAgIC4gPSBBTElHTigweDQpIDsKKyAgICAgICAgX19zYnNzID0gLiA7CisgICAgICAgICAgICAgICAgKiguYnNzKikKKyAgICAgICAgLiA9IEFMSUdOKDB4NCkgOworICAgICAgICBfX2Vic3MgPSAuIDsKKyAgICAgICAgX19lbmQgPSAuIDsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LnNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGY2OTYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKQEAgLTAsMCArMSw5IEBACitTRUNUSU9OUworeworICAuZGF0YSA6IHsKKwlfaW5wdXRfbGVuID0gLjsKKwlMT05HKF9pbnB1dF9kYXRhX2VuZCAtIF9pbnB1dF9kYXRhKSBfaW5wdXRfZGF0YSA9IC47CisJKiguZGF0YSkKKwlfaW5wdXRfZGF0YV9lbmQgPSAuOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2NjMWE3Zi4uODc0ZjZhZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKQEAgLTYsNiArNiw3IEBACiAKIG9iai15IDo9IHByb2Nlc3MubyB0cmFwcy5vIHB0cmFjZS5vIGlycS5vIFwKIAkgc3lzX2g4MzAwLm8gdGltZS5vIHNlbWFwaG9yZS5vIHNpZ25hbC5vIFwKLSAgICAgICAgIHNldHVwLm8gZ3Bpby5vIGluaXRfdGFzay5vIHN5c2NhbGxzLm8KKyAgICAgICAgIHNldHVwLm8gZ3Bpby5vIGluaXRfdGFzay5vIHN5c2NhbGxzLm8gXAorCSBlbnRyeS5vCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubyBoODMwMF9rc3ltcy5vIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUyBiL2FyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUwpyZW5hbWUgdG8gYXJjaC9oODMwMC9rZXJuZWwvZW50cnkuUwppbmRleCBmM2Q2YjhlLi5jYTc0MzE2IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9lbnRyeS5TCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKQEAgLTEsMTEgKzEsMTAgQEAKIC8qIC0qLSBtb2RlOiBhc20gLSotCiAgKgotICogIGxpbnV4L2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2VudHJ5LlMKKyAqICBsaW51eC9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCiAgKgogICogIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KKyAqICBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgogICoKLSAqCWZhaXJseSBoZWF2eSBjaGFuZ2VzIHRvIGZpeCBzeXNjYWxsIGFyZ3MgYW5kIHNpZ25hbCBwcm9jZXNzaW5nCi0gKglieSBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgogICovCiAKIC8qCkBAIC0yMywxMyArMjIsNjYgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IODMwMEgpCisjZGVmaW5lIFVTRVJSRVQgOAorSU5URVJSVVBUUyA9IDY0CisJLmg4MzAwaAorCS5tYWNybwlTSExMMiByZWcKKwlzaGxsLmwJXHJlZworCXNobGwubAlccmVnCisJLmVuZG0KKwkubWFjcm8JU0hMUjIgcmVnCisJc2hsci5sCVxyZWcKKwlzaGxyLmwJXHJlZworCS5lbmRtCisJLm1hY3JvCVNBVkVSRUdTCisJbW92LmwJZXIwLEAtc3AKKwltb3YubAllcjEsQC1zcAorCW1vdi5sCWVyMixALXNwCisJbW92LmwJZXIzLEAtc3AKKwkuZW5kbQorCS5tYWNybwlSRVNUT1JFUkVHUworCW1vdi5sCUBzcCssZXIzCisJbW92LmwJQHNwKyxlcjIKKwkuZW5kbQorCS5tYWNybwlTQVZFRVhSCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRUVYUgorCS5lbmRtCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDhTKQorI2RlZmluZSBVU0VSUkVUIDEwCisjZGVmaW5lIFVTRVJFWFIgOAorSU5URVJSVVBUUyA9IDEyOAogCS5oODMwMHMKKwkubWFjcm8JU0hMTDIgcmVnCisJc2hsbC5sCSMyLFxyZWcKKwkuZW5kbQorCS5tYWNybwlTSExSMiByZWcKKwlzaGxyLmwJIzIsXHJlZworCS5lbmRtCisJLm1hY3JvCVNBVkVSRUdTCisJc3RtLmwJZXIwLWVyMyxALXNwCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRVJFR1MKKwlsZG0ubAlAc3ArLGVyMi1lcjMKKwkuZW5kbQorCS5tYWNybwlTQVZFRVhSCisJbW92LncJQChVU0VSRVhSOjE2LGVyMCkscjEKKwltb3YudwlyMSxAKExFWFItTEVSMzoxNixzcCkJCS8qIGNvcHkgRVhSICovCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRUVYUgorCW1vdi53CUAoTEVYUi1MRVIxOjE2LHNwKSxyMQkJLyogcmVzdG9yZSBFWFIgKi8KKwltb3YuYglyMWwscjFoCisJbW92LncJcjEsQChVU0VSRVhSOjE2LGVyMCkKKwkuZW5kbQorI2VuZGlmCisKIAogLyogQ1BVIGNvbnRleHQgc2F2ZS9yZXN0b3JlIG1hY3Jvcy4gKi8KLQkKKwogCS5tYWNybwlTQVZFX0FMTAogCW1vdi5sCWVyMCxALXNwCi0KIAlzdGMJY2NyLHIwbAkJCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwogCWJ0c3QJIzQscjBsCiAJYm5lCTVmCkBAIC0zOSw0MiArOTEsMzggQEAKIAltb3YubAlAc3AsZXIwCQkJCS8qIHJlc3RvcmUgc2F2ZWQgZXIwICovCiAJb3JjCSMweDEwLGNjcgkJCS8qIHN3aXRjaCBrZXJuZWwgc3RhY2sgKi8KIAltb3YubAlAU1lNQk9MX05BTUUoc3dfa3NwKSxzcAotCXN1Yi5sCSMoTFJFVC1MT1JJRyksc3AJCS8qIGFsbG9jYXRlIExPUklHIC0gTFJFVCAqLyAKLQlzdG0ubAllcjAtZXIzLEAtc3AKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKDEwOjE2LGVyMCksZXIxCQkvKiBjb3B5IHRoZSBSRVQgYWRkciAqLwotCW1vdi5sCWVyMSxAKExSRVQtTEVSMzoxNixzcCkKLQltb3YudwlAKDg6MTYsZXIwKSxyMQotCW1vdi53CXIxLEAoTEVYUi1MRVIzOjE2LHNwKQkJLyogY29weSBFWFIgKi8KKwlzdWIubAkjKExSRVQtTE9SSUcpLHNwCQkvKiBhbGxvY2F0ZSBMT1JJRyAtIExSRVQgKi8KKwlTQVZFUkVHUworCW1vdi5sICAgQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCisJbW92LmwgICBAKFVTRVJSRVQ6MTYsZXIwKSxlcjEgICAgICAgICAgIC8qIGNvcHkgdGhlIFJFVCBhZGRyICovCisJbW92LmwgICBlcjEsQChMUkVULUxFUjM6MTYsc3ApCisJU0FWRUVYUgogCi0JbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KLQlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCi0Jc3ViLncJcjAscjAKLQltb3YuYglyMWgscjBsCi0JbW92LncJcjAsQChMQ0NSLUxFUjM6MTYsc3ApCQkvKiBjb3B5IGNjciAqLwogCW1vdi5sCUAoTE9SSUctTEVSMzoxNixzcCksZXIwCiAJbW92LmwJZXIwLEAoTEVSMC1MRVIzOjE2LHNwKQkJLyogY29weSBFUjAgKi8KKwltb3YudwllMSxyMQkJCQkvKiBlMSBoaWdoYnl0ZSA9IGNjciAqLworCWFuZAkjMHhlZixyMWgJCQkvKiBtYXNrIG1vZGU/IGZsYWcgKi8KIAlicmEJNmYKIDU6CiAJLyoga2VybmVsIG1vZGUgKi8KIAltb3YubAlAc3AsZXIwCQkJCS8qIHJlc3RvcmUgc2F2ZWQgZXIwICovCiAJc3VicwkjMixzcAkJCQkvKiBzZXQgZHVtbXkgY2NyICovCi0Jc3RtLmwJZXIwLWVyMyxALXNwCisJU0FWRVJFR1MKIAltb3YudwlAKExSRVQtTEVSMzoxNixzcCkscjEJCS8qIGNvcHkgb2xkIGNjciAqLworNjoKIAltb3YuYglyMWgscjFsCiAJbW92LmIJIzAscjFoCi0JbW92LncJcjEsQChMQ0NSLUxFUjM6MTYsc3ApCi02OgkKKwltb3YudwlyMSxAKExDQ1ItTEVSMzoxNixzcCkJCS8qIHNldCBjY3IgKi8KIAltb3YubAllcjYsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM2ICovCiAJbW92LmwJZXI1LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNSAqLwogCW1vdi5sCWVyNCxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzQgKi8KLQkuZW5kbQorCS5lbmRtCQkJCQkvKiByMSA9IGNjciAqLwogCiAJLm1hY3JvCVJFU1RPUkVfQUxMCiAJbW92LmwJQHNwKyxlcjQKIAltb3YubAlAc3ArLGVyNQogCW1vdi5sCUBzcCssZXI2Ci0JbGRtLmwJQHNwKyxlcjItZXIzCisJUkVTVE9SRVJFR1MKIAltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjAJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCiAJYnRzdAkjNCxyMGwKIAlibmUJN2YKQEAgLTgzLDE4ICsxMzEsMTYgQEAKIAltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKIAltb3YubAlAKExFUjAtTEVSMToxNixzcCksZXIxCQkvKiByZXN0b3JlIEVSMCAqLwogCW1vdi5sCWVyMSxAZXIwCi0JbW92LncJQChMRVhSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIEVYUiAqLwotCW1vdi5iCXIxbCxyMWgKLQltb3YudwlyMSxAKDg6MTYsZXIwKQorCVJFU1RPUkVFWFIKIAltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjEJCS8qIHJlc3RvcmUgdGhlIFJFVCBhZGRyICovCiAJbW92LmIJcjFsLHIxaAogCW1vdi5iCUAoTFJFVCsxLUxFUjE6MTYsc3ApLHIxbAogCW1vdi53CXIxLGUxCiAJbW92LncJQChMUkVUKzItTEVSMToxNixzcCkscjEKLQltb3YubAllcjEsQCgxMDoxNixlcjApCisJbW92LmwJZXIxLEAoVVNFUlJFVDoxNixlcjApCiAKIAltb3YubAlAc3ArLGVyMQotCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8gCisJYWRkLmwJIyhMUkVULUxFUjEpLHNwCQkJLyogcmVtb3ZlIExPUklHIC0gTFJFVCAqLwogCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd19rc3ApCiAJYW5kYwkjMHhlZixjY3IJCQkvKiBzd2l0Y2ggdG8gdXNlciBtb2RlICovCiAJbW92LmwJZXIwLHNwCkBAIC0xMDgsNyArMTU0LDcgQEAKIAlhZGRzCSM0LHNwCQkJCS8qIHJlbW92ZSB0aGUgc3cgY3JlYXRlZCBMVkVDICovCiAJcnRlCiAJLmVuZG0KLQkKKwogLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQogLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKIC5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9mb3JrKQpAQCAtMTE2LDE2ICsxNjIsMjUgQEAKIC5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCiAuZ2xvYmwgU1lNQk9MX05BTUUoc3dfa3NwKSxTWU1CT0xfTkFNRShzd191c3ApCiAuZ2xvYmwgU1lNQk9MX05BTUUocmVzdW1lKQotLmdsb2JsIFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQogLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkKLQkJCi1JTlRFUlJVUFRTID0gMTI4CisuZ2xvYmwgU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCisKICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCiAJLnNlY3Rpb24gLmludF9yZWRpcmVjdCwiYXgiCiBTWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4MzAwSCkKIAkucmVwdAk3CiAJLmxvbmcJMAogCS5lbmRyCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDhTKQorCS5yZXB0CTUKKwkubG9uZwkwCisJLmVuZHIKKwlqbXAJQFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQorCS5sb25nCTAKKyNlbmRpZgorCiAJanNyCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCS8qIE5NSSAqLwogCWptcAlAU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCS8qIFRSQVBBICMwIChTeXN0ZW0gY2FsbCkgKi8KIAkubG9uZwkwCkBAIC0xNDEsMjAgKzE5NiwyMCBAQAogU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQogCS5zcGFjZQk0CiAjZW5kaWYKLQkKKwogCS5zZWN0aW9uIC50ZXh0CiAJLmFsaWduCTIKIFNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9lbnRyeSkKIAlTQVZFX0FMTAotCW1vdi53CUAoTENDUixzcCkscjAKLQlidHN0CSM0LHIwbAorCW1vdi5sCXNwLGVyMAorCWFkZC5sCSNMVkVDLGVyMAorCWJ0c3QJIzQscjFsCiAJYm5lCTFmCisJLyogdXNlciBMVkVDICovCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQCg0OjE2LGVyMCksZXIwCi0JYnJhCTJmCisJYWRkcwkjNCxlcjAKIDE6Ci0JbW92LmwJQChMVkVDOjE2LHNwKSxlcjAKLTI6CisJbW92LmwJQGVyMCxlcjAJCQkvKiBMVkVDIGFkZHJlc3MgKi8KICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCiAJc3ViLmwJI1NZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSksZXIwCiAjZW5kaWYKQEAgLTE2Miw2OSArMjE3LDYyIEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSksZXIxCiAJc3ViLmwJZXIxLGVyMAogI2VuZGlmCi0Jc2hsci5sCSMyLGVyMAorCVNITFIyCWVyMAogCWRlYy5sCSMxLGVyMAogCW1vdi5sCXNwLGVyMQogCXN1YnMJIzQsZXIxCQkJCS8qIGFkanVzdCByZXRfcGMgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKHByb2Nlc3NfaW50KQotCW1vdi5sCUBTWU1CT0xfTkFNRShpcnFfc3RhdCkrQ1BVU1RBVF9TT0ZUSVJRX1BFTkRJTkcsZXIwCi0JYmVxCTFmCi0JanNyCUBTWU1CT0xfTkFNRShkb19zb2Z0aXJxKQotMToKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX0lSUSkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKIAogU1lNQk9MX05BTUVfTEFCRUwoc3lzdGVtX2NhbGwpCiAJc3VicwkjNCxzcAkJCQkvKiBkdW1teSBMVkVDICovCiAJU0FWRV9BTEwKKwlhbmRjCSMweDdmLGNjcgogCW1vdi5sCWVyMCxlcjQKLQltb3YubAkjLUVOT1NZUyxlcjAKLQltb3YubAllcjAsQChMRVIwOjE2LHNwKQogCiAJLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KIAltb3YubAlzcCxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWNtcC5sCSNOUl9zeXNjYWxscyxlcjQKLQliY2MJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgotCXNobGwubAkjMixlcjQKLQltb3YubAkjU1lNQk9MX05BTUUoc3lzX2NhbGxfdGFibGUpLGVyMAotCWFkZC5sCWVyNCxlcjAKLQltb3YubAlAZXIwLGVyMAotCW1vdi5sCWVyMCxlcjQKLQliZXEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgkKIAltb3YubAlzcCxlcjIKIAlhbmQudwkjMHhlMDAwLHIyCi0JbW92LmIJQCgoVEFTS19GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKKwltb3YuYglAKChUSV9GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKIAlidHN0CSMoVElGX1NZU0NBTExfVFJBQ0UgJiA3KSxyMmwKLQltb3YubAlAKExFUjE6MTYsc3ApLGVyMAotCW1vdi5sCUAoTEVSMjoxNixzcCksZXIxCi0JbW92LmwJQChMRVIzOjE2LHNwKSxlcjIKLQlhbmRjCSMweDdmLGNjcgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TWVNDQUxMX1BSSU5UKQotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF9wcmludCkKLSNlbmRpZgotCWJyYQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjgKKwliZXEJMWYKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX3N5c2NhbGxfdHJhY2UpCiAxOgotCWpzcglTWU1CT0xfTkFNRShzeXNjYWxsX3RyYWNlKQorCWNtcC5sCSNOUl9zeXNjYWxscyxlcjQKKwliY2MJYmFkc3lzCisJU0hMTDIJZXI0CisJbW92LmwJI1NZTUJPTF9OQU1FKHN5c19jYWxsX3RhYmxlKSxlcjAKKwlhZGQubAllcjQsZXIwCisJbW92LmwJQGVyMCxlcjQKKwliZXEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgogCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCiAJbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKIAltb3YubAlAKExFUjM6MTYsc3ApLGVyMgogCWpzcglAZXI0CiAJbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4CisJbW92LmwJc3AsZXIyCisJYW5kLncJIzB4ZTAwMCxyMgorCW1vdi5iCUAoKFRJX0ZMQUdTKzMtKFRJRl9TWVNDQUxMX1RSQUNFID4+IDMpKToxNixlcjIpLHIybAorCWJ0c3QJIyhUSUZfU1lTQ0FMTF9UUkFDRSAmIDcpLHIybAorCWJlcQkyZgorCWpzcglAU1lNQk9MX05BTUUoZG9fc3lzY2FsbF90cmFjZSkKKzI6CisjaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKKwlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCisjZW5kaWYKKwlvcmMJIzB4ODAsY2NyCisJYnJhCXJlc3VtZV91c2Vyc3BhY2UKIAotU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21fZm9yaykKLQltb3YubAllcjIsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzY2hlZHVsZV90YWlsKQotCWJyYQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjgKK2JhZHN5czoKKwltb3YubAkjLUVOT1NZUyxlcjAKKwltb3YubAllcjAsQChMRVIwOjE2LHNwKQorCWJyYQlyZXN1bWVfdXNlcnNwYWNlCiAKLVNZTUJPTF9OQU1FX0xBQkVMKHJlc2NoZWR1bGUpCi0JLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCisjaWYgIWRlZmluZWQoQ09ORklHX1BSRUVNUFQpCisjZGVmaW5lIHJlc3VtZV9rZXJuZWwgcmVzdG9yZV9hbGwKKyNlbmRpZgogCiBTWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9leGNlcHRpb24pCiAjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKQEAgLTIzMiw1OCArMjgwLDY4IEBACiAjZW5kaWYKIFNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ludGVycnVwdCkKIAltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCi0JYnRzdAkjNCxyMGwJCQkvKiBjaGVjayBpZiByZXR1cm5pbmcgdG8ga2VybmVsICovCi0JYm5lCWRvbmU6OAkJCS8qIGlmIHNvLCBza2lwIHJlc2NoZWQsIHNpZ25hbHMgKi8KKwlidHN0CSM0LHIwbAorCWJuZQlyZXN1bWVfa2VybmVsOjgJCS8qIHJldHVybiBmcm9tIGtlcm5lbCAqLworcmVzdW1lX3VzZXJzcGFjZToKIAlhbmRjCSMweDdmLGNjcgogCW1vdi5sCXNwLGVyNAotCWFuZC53CSMweGUwMDAscjQKKwlhbmQudwkjMHhlMDAwLHI0CQkvKiBlcjQgPC0gY3VycmVudCB0aHJlYWQgaW5mbyAqLwogCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKIAlhbmQubAkjX1RJRl9XT1JLX01BU0ssZXIxCi0JYmVxCWRvbmU6OAotMToKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCisJYmVxCXJlc3RvcmVfYWxsOjgKK3dvcmtfcGVuZGluZzoKIAlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIxbAotCWJuZQlTWU1CT0xfTkFNRShyZXNjaGVkdWxlKToxNgorCWJuZQl3b3JrX3Jlc2NoZWQ6OAorCS8qIHdvcmsgbm90aWZ5c2lnICovCiAJbW92LmwJc3AsZXIwCi0Jc3VicwkjNCxlcjAJCQkvKiBhZGp1c3QgcmV0cGMgKi8KLQltb3YubAllcjIsZXIxCi0JanNyCUBTWU1CT0xfTkFNRShkb19zaWduYWwpCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLQlicmEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi0zOgotCWJ0c3QJIzQscjBsCi0JYmVxCWRvbmU6OAkJCS8qIHVzZXJzcGFjZSB0aG9ydSAqLwotNDoKLQltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMQotCWJuZQlkb25lOjgKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQliZXEJZG9uZTo4Ci0JbW92LmIJcjBsLHIwbAotCWJwbAlkb25lOjgJCQkvKiBpbnRlcnJ1cHQgb2ZmIChleGNlcHRpb24gcGF0aD8pICovCi0JbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0JYW5kYwkjMHg3ZixjY3IKKwlzdWJzCSM0LGVyMAkJCS8qIGVyMDogcHRfcmVncyAqLworCWpzcglAU1lNQk9MX05BTUUoZG9fbm90aWZ5X3Jlc3VtZSkKKwlicmEJcmVzdG9yZV9hbGw6OAord29ya19yZXNjaGVkOgorCW1vdi5sCXNwLGVyMAorCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCiAJanNyCUBTWU1CT0xfTkFNRShzY2hlZHVsZSkKLQlzdWIubAllcjEsZXIxCi0JbW92LmwJZXIxLEAoVElfUFJFX0NPVU5UOjE2LGVyNCkKLQlvcmMJIzB4ODAsY2NyCi0JYnJhCTRiOjgKLSNlbmRpZgotZG9uZToKKwlicmEJcmVzdW1lX3VzZXJzcGFjZTo4CityZXN0b3JlX2FsbDoKIAlSRVNUT1JFX0FMTAkJCS8qIERvZXMgUlRFICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorcmVzdW1lX2tlcm5lbDoKKwltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMAorCWJuZQlyZXN0b3JlX2FsbDo4CituZWVkX3Jlc2NoZWQ6CisJbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMAorCWJ0c3QJI1RJRl9ORUVEX1JFU0NIRUQscjBsCisJYmVxCXJlc3RvcmVfYWxsOjgKKwltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCS8qIEludGVycnVwdCBFbmFibGVkPyAqLworCWJtaQlyZXN0b3JlX2FsbDo4CisJbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMAorCW1vdi5sCWVyMCxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCisJYW5kYwkjMHg3ZixjY3IKKwltb3YubAlzcCxlcjAKKwlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQorCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCisJb3JjCSMweDgwLGNjcgorCWJyYQluZWVkX3Jlc2NoZWQ6OAorI2VuZGlmCisKK1NZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCisJbW92LmwJZXIyLGVyMAorCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKKwogU1lNQk9MX05BTUVfTEFCRUwocmVzdW1lKQogCS8qCi0JICoJZXIwID0gcHJldgotCSAqCWVyMSA9IG5leHQKLQkgKglyZXR1cm4gbGFzdCBpbiBlcjIKKwkgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgb2Zmc2V0IG9mIHRzcyBpcyBpbiBkMSwKKwkgKiBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcyBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKQorCSAqIGlzIGluIGExIGFuZCBkMi5iIGlzIG5vbi16ZXJvIGlmIHRoZSBtbSBzdHJ1Y3R1cmUgaXMKKwkgKiBzaGFyZWQgYmV0d2VlbiB0aGUgdGFza3MsIHNvIGRvbid0IGNoYW5nZSB0aGVzZQorCSAqIHJlZ2lzdGVycyB1bnRpbCB0aGVpciBjb250ZW50cyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KIAkgKi8KIAogCS8qIHNhdmUgc3IgKi8KIAlzdWIudwlyMyxyMwogCXN0YwljY3IscjNsCi0Jc3RjCWV4cixyM2gKIAltb3YudwlyMyxAKFRIUkVBRF9DQ1IrMjoxNixlcjApCiAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KQEAgLTI5MSw0MSArMzQ5LDQ1IEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIzCiAJbW92LmwJZXIzLEAoVEhSRUFEX1VTUDoxNixlcjApCiAJbW92LmwJc3AsQChUSFJFQURfS1NQOjE2LGVyMCkKLQkKKwogCS8qIFNraXAgYWRkcmVzcyBzcGFjZSBzd2l0Y2hpbmcgaWYgdGhleSBhcmUgdGhlIHNhbWUuICovCiAJLyogRklYTUU6IHdoYXQgZGlkIHdlIGhhY2sgb3V0IG9mIGhlcmUsIHRoaXMgZG9lcyBub3RoaW5nISAqLwogCiAJbW92LmwJQChUSFJFQURfVVNQOjE2LGVyMSksZXIwCiAJbW92LmwJZXIwLEBTWU1CT0xfTkFNRShzd191c3ApCiAJbW92LmwJQChUSFJFQURfS1NQOjE2LGVyMSksc3AKLQkJCQorCiAJLyogcmVzdG9yZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAltb3YudwlAKFRIUkVBRF9DQ1IrMjoxNixlcjEpLHIzCiAKIAlsZGMJcjNsLGNjcgotCWxkYwlyM2gsZXhyCi0KIAlydHMKIAogU1lNQk9MX05BTUVfTEFCRUwodHJhY2VfYnJlYWspCi0Jc3VicwkjNCxzcAkJCS8qIGR1bW15IExWRUMgKi8KKwlzdWJzCSM0LHNwCiAJU0FWRV9BTEwKIAlzdWIubAllcjEsZXIxCiAJZGVjLmwJIzEsZXIxCi0JbW92LmwJZXIxLEAoTE9SSUcsc3ApCQorCW1vdi5sCWVyMSxAKExPUklHLHNwKQogCW1vdi5sCXNwLGVyMAogCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCiAJbW92LmwJQGVyMCxlcjEKKwltb3YudwlAKC0yOjE2LGVyMSkscjIKKwljbXAudwkjMHg1NzMwLHIyCisJYmVxCTFmCiAJc3VicwkjMixlcjEKLQltb3YubAllcjEsQGVyMAkKKwltb3YubAllcjEsQGVyMAorMToKIAlhbmQudwkjMHhmZixlMQogCW1vdi5sCWVyMSxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHRyYWNlX3RyYXApCi0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCQorCWptcAlAU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKQogCiAJLnNlY3Rpb24JLmJzcwogU1lNQk9MX05BTUVfTEFCRUwoc3dfa3NwKQotCS5zcGFjZQk0CQorCS5zcGFjZQk0CiBTWU1CT0xfTkFNRV9MQUJFTChzd191c3ApCi0JLnNwYWNlCTQJCisJLnNwYWNlCTQKKworCS5lbmQKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL2ludHMuYyBiL2FyY2gvaDgzMDAva2VybmVsL2ludHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZjQ3OS4uMDAwMDAwMAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvaDgzMDAva2VybmVsL2ludHMuYwotICoKLSAqIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KLSAqCi0gKiBCYXNlZCBvbiBsaW51eC9hcmNoLyQoQVJDSCkvcGxhdGZvcm0vJChQTEFURk9STSkvaW50cy5jCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAxOTk2IFJvbWFuIFppcHBlbAotICogQ29weXJpZ2h0IDE5OTkgRC4gSmVmZiBEaW9ubmUgPGplZmZAcnQtY29udHJvbC5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaGFzIG9ubHkgNCBlbGVtZW50cyBmb3Igc3BlZWQgcmVhc29ucwotICovCi10eXBlZGVmIHN0cnVjdCBpcnFfaGFuZGxlciB7Ci0JaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0JaW50ICAgICAgICAgZmxhZ3M7Ci0JaW50ICAgICAgICAgY291bnQ7Ci0Jdm9pZAkgICAgKmRldl9pZDsKLQljb25zdCBjaGFyICAqZGV2bmFtZTsKLX0gaXJxX2hhbmRsZXJfdDsKLQotc3RhdGljIGlycV9oYW5kbGVyX3QgKmlycV9saXN0W05SX0lSUVNdOwotc3RhdGljIGludCB1c2Vfa21hbGxvYzsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKmludGVycnVwdF9yZWRpcmVjdF90YWJsZTsKLWV4dGVybiBjb25zdCBpbnQgaDgzMDBfc2F2ZWRfdmVjdG9yc1tdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgaDgzMDBfdHJhcF90YWJsZVtdOwotaW50IGg4MzAwX2VuYWJsZV9pcnFfcGluKHVuc2lnbmVkIGludCBpcnEpOwotdm9pZCBoODMwMF9kaXNhYmxlX2lycV9waW4odW5zaWduZWQgaW50IGlycSk7Ci0KLSNkZWZpbmUgQ1BVX1ZFQ1RPUiAoKHVuc2lnbmVkIGxvbmcgKikweDAwMDAwMCkKLSNkZWZpbmUgQUREUl9NQVNLICgweGZmZmZmZikKLQotI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCAqZ2V0X3ZlY3Rvcl9hZGRyZXNzKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyAqcm9tX3ZlY3RvciA9IENQVV9WRUNUT1I7Ci0JdW5zaWduZWQgbG9uZyBiYXNlLHRtcDsKLQlpbnQgdmVjX25vOwotCi0JYmFzZSA9IHJvbV92ZWN0b3JbRVhUX0lSUTBdICYgQUREUl9NQVNLOwotCQotCS8qIGNoZWNrIHJvbXZlY3RvciBmb3JtYXQgKi8KLQlmb3IgKHZlY19ubyA9IEVYVF9JUlExOyB2ZWNfbm8gPD0gRVhUX0lSUTArRVhUX0lSUVM7IHZlY19ubysrKSB7Ci0JCWlmICgoYmFzZSsodmVjX25vIC0gRVhUX0lSUTApKjQpICE9IChyb21fdmVjdG9yW3ZlY19ub10gJiBBRERSX01BU0spKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogcmFtdmVjdG9yIGJhc2UgYWRkcmVzcyAqLwotCWJhc2UgLT0gRVhUX0lSUTAqNDsKLQotCS8qIHdyaXRlcmJsZSBjaGVjayAqLwotCXRtcCA9IH4oKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopYmFzZSk7Ci0JKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWJhc2UpID0gdG1wOwotCWlmICgoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopYmFzZSkgIT0gdG1wKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKiliYXNlOwotfQotI2VuZGlmCi0KLXZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgKnJhbXZlYywqcmFtdmVjX3A7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqdHJhcF9lbnRyeTsKLQljb25zdCBpbnQgKnNhdmVkX3ZlY3RvcjsKLQotCXJhbXZlYyA9IGdldF92ZWN0b3JfYWRkcmVzcygpOwotCWlmIChyYW12ZWMgPT0gTlVMTCkKLQkJcGFuaWMoImludGVycnVwdCB2ZWN0b3Igc2VydXAgZmFpbGVkLiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAidmlydHVhbCB2ZWN0b3IgYXQgMHglMDhseFxuIiwodW5zaWduZWQgbG9uZylyYW12ZWMpOwotCi0JLyogY3JlYXRlIHJlZGlyZWN0IHRhYmxlICovCi0JcmFtdmVjX3AgPSByYW12ZWM7Ci0JdHJhcF9lbnRyeSA9IGg4MzAwX3RyYXBfdGFibGU7Ci0Jc2F2ZWRfdmVjdG9yID0gaDgzMDBfc2F2ZWRfdmVjdG9yczsKLQlmb3IgKCBpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpZiAoaSA9PSAqc2F2ZWRfdmVjdG9yKSB7Ci0JCQlyYW12ZWNfcCsrOwotCQkJc2F2ZWRfdmVjdG9yKys7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIGkgPCBOUl9UUkFQUyApIHsKLQkJCQlpZiAoKnRyYXBfZW50cnkpCi0JCQkJCSpyYW12ZWNfcCA9IFZFQ1RPUigqdHJhcF9lbnRyeSk7Ci0JCQkJcmFtdmVjX3ArKzsKLQkJCQl0cmFwX2VudHJ5Kys7Ci0JCQl9IGVsc2UKLQkJCQkqcmFtdmVjX3ArKyA9IFJFRElSRUNUKGludGVycnVwdF9lbnRyeSk7Ci0JCX0KLQl9Ci0JaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlID0gcmFtdmVjOwotI2lmZGVmIERVTVBfVkVDVE9SCi0JcmFtdmVjX3AgPSByYW12ZWM7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpZiAoKGkgJSA4KSA9PSAwKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuJXA6ICIscmFtdmVjX3ApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXAgIiwqcmFtdmVjX3ApOwotCQlyYW12ZWNfcCsrOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLWludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCAKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCWlycV9oYW5kbGVyX3QgKmlycV9oYW5kbGU7Ci0JaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgSVJRICVkIGZyb20gJXNcbiIsIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChpcnFfbGlzdFtpcnFdIHx8IChoODMwMF9lbmFibGVfaXJxX3BpbihpcnEpID09IC1FQlVTWSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAodXNlX2ttYWxsb2MpCi0JCWlycV9oYW5kbGUgPSBrbWFsbG9jKHNpemVvZihpcnFfaGFuZGxlcl90KSwgR0ZQX0FUT01JQyk7Ci0JZWxzZSB7Ci0JCS8qIHVzZSBib290bWVtIGFsbG9jYXRlciAqLwotCQlpcnFfaGFuZGxlID0gKGlycV9oYW5kbGVyX3QgKilhbGxvY19ib290bWVtKHNpemVvZihpcnFfaGFuZGxlcl90KSk7Ci0JCWlycV9oYW5kbGUgPSAoaXJxX2hhbmRsZXJfdCAqKSgodW5zaWduZWQgbG9uZylpcnFfaGFuZGxlIHwgMHg4MDAwMDAwMCk7Ci0JfQotCi0JaWYgKGlycV9oYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpcnFfaGFuZGxlLT5oYW5kbGVyID0gaGFuZGxlcjsKLQlpcnFfaGFuZGxlLT5mbGFncyAgID0gZmxhZ3M7Ci0JaXJxX2hhbmRsZS0+Y291bnQgICA9IDA7Ci0JaXJxX2hhbmRsZS0+ZGV2X2lkICA9IGRldl9pZDsKLQlpcnFfaGFuZGxlLT5kZXZuYW1lID0gZGV2bmFtZTsKLQlpcnFfbGlzdFtpcnFdID0gaXJxX2hhbmRsZTsKLQotCWlmIChpcnFfaGFuZGxlLT5mbGFncyAmIElSUUZfU0FNUExFX1JBTkRPTSkKLQkJcmFuZF9pbml0aWFsaXplX2lycShpcnEpOwotCi0JZW5hYmxlX2lycShpcnEpOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHJlcXVlc3RfaXJxKTsKLQotdm9pZCBmcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA+PSBOUl9JUlFTKQotCQlyZXR1cm47Ci0KLQlpZiAoIWlycV9saXN0W2lycV0gfHwgaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICE9IGRldl9pZCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVtb3ZpbmcgcHJvYmFibHkgd3JvbmcgSVJRICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICBpcnEsIGlycV9saXN0W2lycV0tPmRldm5hbWUpOwotCWRpc2FibGVfaXJxKGlycSk7Ci0JaDgzMDBfZGlzYWJsZV9pcnFfcGluKGlycSk7Ci0JaWYgKCgodW5zaWduZWQgbG9uZylpcnFfbGlzdFtpcnFdICYgMHg4MDAwMDAwMCkgPT0gMCkgewotCQlrZnJlZShpcnFfbGlzdFtpcnFdKTsKLQkJaXJxX2xpc3RbaXJxXSA9IE5VTEw7Ci0JfQotfQotCi1FWFBPUlRfU1lNQk9MKGZyZWVfaXJxKTsKLQotLyoKLSAqIERvIHdlIG5lZWQgdGhlc2UgcHJvYmUgZnVuY3Rpb25zIG9uIHRoZSBtNjhrPwotICovCi11bnNpZ25lZCBsb25nIHByb2JlX2lycV9vbiAodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb24pOwotCi1pbnQgcHJvYmVfaXJxX29mZiAodW5zaWduZWQgbG9uZyBpcnFzKQotewotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHByb2JlX2lycV9vZmYpOwotCi12b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID49IEVYVF9JUlEwICYmIGlycSA8PSAoRVhUX0lSUTAgKyBFWFRfSVJRUykpCi0JCUlFUl9SRUdTIHw9IDEgPDwgKGlycSAtIEVYVF9JUlEwKTsKLX0KLQotdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmIChpcnEgPj0gRVhUX0lSUTAgJiYgaXJxIDw9IChFWFRfSVJRMCArIEVYVF9JUlFTKSkKLQkJSUVSX1JFR1MgJj0gfigxIDw8IChpcnEgLSBFWFRfSVJRMCkpOwotfQotCi1hc21saW5rYWdlIHZvaWQgcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlycV9lbnRlcigpOwotCWg4MzAwX2NsZWFyX2lzcihpcnEpOwotCWlmIChpcnEgPj0gTlJfVFJBUFMgJiYgaXJxIDwgTlJfSVJRUykgewotCQlpZiAoaXJxX2xpc3RbaXJxXSkgewotCQkJaXJxX2xpc3RbaXJxXS0+aGFuZGxlcihpcnEsIGlycV9saXN0W2lycV0tPmRldl9pZCwgZnApOwotCQkJaXJxX2xpc3RbaXJxXS0+Y291bnQrKzsKLQkJCWlmIChpcnFfbGlzdFtpcnFdLT5mbGFncyAmIElSUUZfU0FNUExFX1JBTkRPTSkKLQkJCQlhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaXJxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCUJVRygpOwotCX0KLQlpcnFfZXhpdCgpOwotfQotCi1pbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaSA9ICoobG9mZl90ICopIHY7Ci0KLQlpZiAoKGkgPCBOUl9JUlFTKSAmJiAoaXJxX2xpc3RbaV0hPU5VTEwpKSB7Ci0JCXNlcV9wcmludGYocCwgIiUzZDogJTEwdSAiLGksaXJxX2xpc3RbaV0tPmNvdW50KTsKLQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIGlycV9saXN0W2ldLT5kZXZuYW1lKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpbml0X2lycV9wcm9jKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVuYWJsZV9rbWFsbG9jKHZvaWQpCi17Ci0JdXNlX2ttYWxsb2MgPSAxOwotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChlbmFibGVfa21hbGxvYyk7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCmluZGV4IDhmMjQxMWQuLmQzMmJiZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCkBAIC0xMTEsMTAgKzExMSw3IEBACiAgICAgICAvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gMDsKLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMjE5LDcgKzIxNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBkb19zeXNjYWxsX3RyYWNlKHZvaWQpCiB7CiAJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwppbmRleCAwMjk1NTYwLi42MmVhMTJkIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwpAQCAtNTQ3LDMgKzU0Nyw5IEBACiAJfQogCXJldHVybiAwOwogfQorCithc21saW5rYWdlIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTMyIHRocmVhZF9pbmZvX2ZsYWdzKQoreworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIChfVElGX1NJR1BFTkRJTkcgfCBfVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCWRvX3NpZ25hbChyZWdzLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKaW5kZXggYjI0ZWEwOC4uYzUwOTYzNiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKQEAgLTQsNCArNCw0IEBACiAjIFJldXNlIGFueSBmaWxlcyB3ZSBjYW4gZnJvbSB0aGUgSDgvMzAwSAogIwogCi1vYmoteSA6PSBlbnRyeS5vIGlycV9waW4ubyBwdHJhY2VfaDgzMDBoLm8KK29iai15IDo9IGlycV9waW4ubyBwdHJhY2VfaDgzMDBoLm8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODZhYzNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyogLSotIG1vZGU6IGFzbSAtKi0KLSAqCi0gKiAgbGludXgvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZW50cnkuUwotICoKLSAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+Ci0gKiAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KLSAqCi0gKi8KLQotLyoKLSAqICBlbnRyeS5TCi0gKiAgaW5jbHVkZSBleGNlcHRpb24vaW50ZXJydXB0IGdhdGV3YXkKLSAqICAgICAgICAgIHN5c3RlbSBjYWxsIGVudHJ5Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0KLQkuaDgzMDBoCi0KLS8qIENQVSBjb250ZXh0IHNhdmUvcmVzdG9yZSBtYWNyb3MuICovCi0JCi0JLm1hY3JvCVNBVkVfQUxMCi0JbW92LmwJZXIwLEAtc3AKLQotCXN0YwljY3IscjBsCQkJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCi0JYnRzdAkjNCxyMGwKLQlibmUJNWYKLQotCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd191c3ApCQkvKiB1c2VyIG1vZGUgKi8KLQltb3YubAlAc3AsZXIwCi0Jb3JjCSMweDEwLGNjcgotCW1vdi5sCUBTWU1CT0xfTkFNRShzd19rc3ApLHNwCi0Jc3ViLmwJIyhMUkVULUxPUklHKSxzcAkJLyogYWxsb2NhdGUgTE9SSUcgLSBMUkVUICovIAotCW1vdi5sCWVyMCxALXNwCi0JbW92LmwJZXIxLEAtc3AKLQltb3YubCAgIEBTWU1CT0xfTkFNRShzd191c3ApLGVyMAotCW1vdi5sICAgQCg4OjE2LGVyMCksZXIxICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBSRVQgYWRkciAqLwotCW1vdi5sICAgZXIxLEAoTFJFVC1MRVIxOjE2LHNwKQotCi0JbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KLQlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCi0Jc3ViLncJcjAscjAKLQltb3YuYglyMWgscjBsCi0JbW92LncJcjAsQChMQ0NSLUxFUjE6MTYsc3ApCQkvKiBjb3B5IGNjciAqLwotCW1vdi5sCUAoTE9SSUctTEVSMToxNixzcCksZXIwCi0JbW92LmwJZXIwLEAoTEVSMC1MRVIxOjE2LHNwKQkJLyogY29weSBFUjAgKi8KLQlicmEJNmYKLTU6Ci0JbW92LmwJQHNwLGVyMAkJCQkvKiBrZXJuZWwgbW9kZSAqLwotCXN1YnMJIzIsc3AJCQkJLyogZHVtbXkgY2NyICovCi0JbW92LmwJZXIwLEAtc3AKLQltb3YubAllcjEsQC1zcAotCW1vdi53CUAoTFJFVC1MRVIxOjE2LHNwKSxyMQkJLyogY29weSBvbGQgY2NyICovCi0JbW92LmIJcjFoLHIxbAotCW1vdi5iCSMwLHIxaAotCW1vdi53CXIxLEAoTENDUi1MRVIxOjE2LHNwKQkJLyogc2V0IGNjciAqLwotNjoKLQltb3YubAllcjIsQC1zcAotCW1vdi5sCWVyMyxALXNwCi0JbW92LmwJZXI2LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNiAqLwotCW1vdi5sCWVyNSxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzUgKi8KLQltb3YubAllcjQsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM0ICovCi0JLmVuZG0KLQotCS5tYWNybwlSRVNUT1JFX0FMTAotCW1vdi5sCUBzcCssZXI0Ci0JbW92LmwJQHNwKyxlcjUKLQltb3YubAlAc3ArLGVyNgotCW1vdi5sCUBzcCssZXIzCi0JbW92LmwJQHNwKyxlcjIKLQltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjAJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCi0JYnRzdAkjNCxyMGwKLQlibmUJN2YKLQotCW9yYwkjMHg4MCxjY3IKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKExFUjAtTEVSMToxNixzcCksZXIxCQkvKiByZXN0b3JlIEVSMCAqLwotCW1vdi5sCWVyMSxAZXIwCi0JbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIHRoZSBSRVQgYWRkciAqLwotCW1vdi5iCXIxbCxyMWgKLQltb3YuYglAKExSRVQrMS1MRVIxOjE2LHNwKSxyMWwKLQltb3YudwlyMSxlMQotCW1vdi53CUAoTFJFVCsyLUxFUjE6MTYsc3ApLHIxCi0JbW92LmwJZXIxLEAoODoxNixlcjApCi0KLQltb3YubAlAc3ArLGVyMQotCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8gCi0JbW92LmwJc3AsQFNZTUJPTF9OQU1FKHN3X2tzcCkKLQltb3YubAllcjAsc3AKLQlicmEJOGYKLTc6Ci0JbW92LmwJQHNwKyxlcjEKLQlhZGRzCSM0LHNwCi0JYWRkcwkjMixzcAotODoKLQltb3YubAlAc3ArLGVyMAotCWFkZHMJIzQsc3AJCQkJLyogcmVtb3ZlIHRoZSBzdyBjcmVhdGVkIExWRUMgKi8KLQlydGUKLQkuZW5kbQotCQotLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKLS5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9mb3JrKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCi0uZ2xvYmwgU1lNQk9MX05BTUUoc3dfa3NwKSxTWU1CT0xfTkFNRShzd191c3ApCi0uZ2xvYmwgU1lNQk9MX05BTUUocmVzdW1lKQotLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCi0uZ2xvYmwgU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCi0uZ2xvYmwgU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCi0KLSNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCi1JTlRFUlJVUFRTID0gNjQJCQotCS5zZWN0aW9uIC5pbnRfcmVkaXJlY3QsImF4IgotU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotCS5yZXB0CTcKLQkubG9uZwkwCi0JLmVuZHIKLQlqc3IJQFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkJLyogTk1JICovCi0Jam1wCUBTWU1CT0xfTkFNRShzeXN0ZW1fY2FsbCkJLyogVFJBUEEgIzAgKFN5c3RlbSBjYWxsKSAqLwotCS5sb25nCTAKLQkubG9uZwkwCi0Jam1wCUBTWU1CT0xfTkFNRSh0cmFjZV9icmVhaykJLyogVFJBUEEgIzMgKGJyZWFrcG9pbnQpICovCi0JLnJlcHQJSU5URVJSVVBUUy0xMgotCWpzcglAU1lNQk9MX05BTUUoaW50ZXJydXB0X2VudHJ5KQotCS5lbmRyCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19SQU1LRVJORUwpCi0uZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotCS5zZWN0aW9uIC5ic3MKLVNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLQkuc3BhY2UJNAotI2VuZGlmCi0KLQkuc2VjdGlvbiAudGV4dAotCS5hbGlnbgkyCi1TWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfZW50cnkpCi0JU0FWRV9BTEwKLQltb3YudwlAKExDQ1Isc3ApLHIwCi0JYnRzdAkjNCxyMGwKLQlibmUJMWYKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKDQ6MTYsZXIwKSxlcjAKLQlicmEJMmYKLTE6Ci0JbW92LmwJQChMVkVDLHNwKSxlcjAKLTI6Ci0jaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQotCXN1Yi5sCSNTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMAotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotCW1vdi5sCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMQotCXN1Yi5sCWVyMSxlcjAKLSNlbmRpZgotCXNobHIubAllcjAKLQlzaGxyLmwJZXIwCi0JZGVjLmwJIzEsZXIwCi0JbW92LmwJc3AsZXIxCi0Jc3VicwkjNCxlcjEJCQkJLyogYWRqdXN0IHJldF9wYyAqLwotCWpzcglAU1lNQk9MX05BTUUoZG9fSVJRKQotCW1vdi5sCUBTWU1CT0xfTkFNRShpcnFfc3RhdCkrQ1BVU1RBVF9TT0ZUSVJRX1BFTkRJTkcsZXIwCi0JYmVxCTFmCi0JanNyCUBTWU1CT0xfTkFNRShkb19zb2Z0aXJxKQotMToKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKLQkKLVNZTUJPTF9OQU1FX0xBQkVMKHN5c3RlbV9jYWxsKQotCXN1YnMJIzQsc3AJCQkJLyogZHVtbXkgTFZFQyAqLwotCVNBVkVfQUxMCi0JbW92LncJQChMQ0NSOjE2LHNwKSxyMQotCWJzZXQJIzQscjFsCi0JbGRjCXIxbCxjY3IKLQltb3YubAllcjAsZXI0Ci0JbW92LmwJIy1FTk9TWVMsZXIwCi0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkKLQotCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCi0JbW92LmwJc3AsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQljbXAubAkjTlJfc3lzY2FsbHMsZXI0Ci0JYmNjCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYKLQlzaGxsLmwJZXI0Ci0Jc2hsbC5sCWVyNAotCW1vdi5sCSNTWU1CT0xfTkFNRShzeXNfY2FsbF90YWJsZSksZXIwCi0JYWRkLmwJZXI0LGVyMAotCW1vdi5sCUBlcjAsZXI0Ci0JYmVxCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYJCi0JbW92LmwJc3AsZXIyCi0JYW5kLncJIzB4ZTAwMCxyMgotCW1vdi5iCUAoKFRBU0tfRkxBR1MrMy0oVElGX1NZU0NBTExfVFJBQ0UgPj4gMykpOjE2LGVyMikscjJsCi0JYnRzdAkjKFRJRl9TWVNDQUxMX1RSQUNFICYgNykscjJsCi0JYm5lCTFmCi0JbW92LmwJQChMRVIxOjE2LHNwKSxlcjAKLQltb3YubAlAKExFUjI6MTYsc3ApLGVyMQotCW1vdi5sCUAoTEVSMzoxNixzcCksZXIyCi0JanNyCUBlcjQKLQltb3YubAllcjAsQChMRVIwOjE2LHNwKQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCi0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCi0jZW5kaWYKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0xOgotCWpzcglTWU1CT0xfTkFNRShzeXNjYWxsX3RyYWNlKQotCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCi0JbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKLQltb3YubAlAKExFUjM6MTYsc3ApLGVyMgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0KLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCi0JbW92LmwJZXIyLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0KLVNZTUJPTF9OQU1FX0xBQkVMKHJlc2NoZWR1bGUpCi0JLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0KLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2V4Y2VwdGlvbikKLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCW9yYwkjMHg4MCxjY3IKLSNlbmRpZgotU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21faW50ZXJydXB0KQotCW1vdi5iCUAoTENDUisxOjE2LHNwKSxyMGwKLQlidHN0CSM0LHIwbAkJCS8qIGNoZWNrIGlmIHJldHVybmluZyB0byBrZXJuZWwgKi8KLQlibmUJZG9uZTo4CQkJLyogaWYgc28sIHNraXAgcmVzY2hlZCwgc2lnbmFscyAqLwotCWFuZGMJIzB4N2YsY2NyCi0JbW92LmwJc3AsZXI0Ci0JYW5kLncJIzB4ZTAwMCxyNAotCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKLQlhbmQubAkjX1RJRl9XT1JLX01BU0ssZXIxCi0JYmVxCWRvbmU6OAotMToKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQlibmUJU1lNQk9MX05BTUUocmVzY2hlZHVsZSk6MTYKLQltb3YubAlzcCxlcjAKLQlzdWJzCSM0LGVyMAkJCS8qIGFkanVzdCByZXRwYyAqLwotCW1vdi5sCWVyMixlcjEKLQlqc3IJQFNZTUJPTF9OQU1FKGRvX3NpZ25hbCkKLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCWJyYQlkb25lOjgJCQkvKiB1c2Vyc3BhY2UgdGhvcnUgKi8KLTM6Ci0JYnRzdAkjNCxyMGwKLQliZXEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi00OgotCW1vdi5sCUAoVElfUFJFX0NPVU5UOjE2LGVyNCksZXIxCi0JYm5lCWRvbmU6OAotCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKLQlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIxbAotCWJlcQlkb25lOjgKLQltb3YuYglyMGwscjBsCi0JYnBsCWRvbmU6OAkJCS8qIGludGVycnVwdCBvZmYgKGV4Y2VwdGlvbiBwYXRoPykgKi8KLQltb3YubAkjUFJFRU1QVF9BQ1RJVkUsZXIxCi0JbW92LmwJZXIxLEAoVElfUFJFX0NPVU5UOjE2LGVyNCkKLQlhbmRjCSMweDdmLGNjcgotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0Jc3ViLmwJZXIxLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0Jb3JjCSMweDgwLGNjcgotCWJyYQk0Yjo4Ci0jZW5kaWYKLWRvbmU6Ci0JUkVTVE9SRV9BTEwJCQkvKiBEb2VzIFJURSAqLwotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXN1bWUpCi0JLyoKLQkgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgb2Zmc2V0IG9mIHRzcyBpcyBpbiBkMSwKLQkgKiBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcyBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKQotCSAqIGlzIGluIGExIGFuZCBkMi5iIGlzIG5vbi16ZXJvIGlmIHRoZSBtbSBzdHJ1Y3R1cmUgaXMKLQkgKiBzaGFyZWQgYmV0d2VlbiB0aGUgdGFza3MsIHNvIGRvbid0IGNoYW5nZSB0aGVzZQotCSAqIHJlZ2lzdGVycyB1bnRpbCB0aGVpciBjb250ZW50cyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKi8KLQotCS8qIHNhdmUgc3IgKi8KLQlzdWIudwlyMyxyMwotCXN0YwljY3IscjNsCi0JbW92LncJcjMsQChUSFJFQURfQ0NSKzI6MTYsZXIwKQotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0Jb3JjCSMweDgwLGNjcgotCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMwotCW1vdi5sCWVyMyxAKFRIUkVBRF9VU1A6MTYsZXIwKQotCW1vdi5sCXNwLEAoVEhSRUFEX0tTUDoxNixlcjApCi0KLQkvKiBTa2lwIGFkZHJlc3Mgc3BhY2Ugc3dpdGNoaW5nIGlmIHRoZXkgYXJlIHRoZSBzYW1lLiAqLwotCS8qIEZJWE1FOiB3aGF0IGRpZCB3ZSBoYWNrIG91dCBvZiBoZXJlLCB0aGlzIGRvZXMgbm90aGluZyEgKi8KLQotCW1vdi5sCUAoVEhSRUFEX1VTUDoxNixlcjEpLGVyMAotCW1vdi5sCWVyMCxAU1lNQk9MX05BTUUoc3dfdXNwKQotCW1vdi5sCUAoVEhSRUFEX0tTUDoxNixlcjEpLHNwCi0JCQkKLQkvKiByZXN0b3JlIHN0YXR1cyByZWdpc3RlciAqLwotCW1vdi53CUAoVEhSRUFEX0NDUisyOjE2LGVyMSkscjMKLQotCWxkYwlyM2wsY2NyCi0JcnRzCi0JCi1TWU1CT0xfTkFNRV9MQUJFTCh0cmFjZV9icmVhaykKLQlzdWJzCSM0LHNwCi0JU0FWRV9BTEwKLQlzdWIubAllcjEsZXIxCi0JZGVjLmwJIzEsZXIxCi0JbW92LmwJZXIxLEAoTE9SSUcsc3ApCQotCW1vdi5sCXNwLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQGVyMCxlcjEKLQlzdWJzCSMyLGVyMQotCW1vdi5sCWVyMSxAZXIwCQotCWFuZC53CSMweGZmLGUxCi0JbW92LmwJZXIxLGVyMAotCWpzcglAU1lNQk9MX05BTUUodHJhY2VfdHJhcCkKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikJCi0KLQkuc2VjdGlvbgkuYnNzCi1TWU1CT0xfTkFNRV9MQUJFTChzd19rc3ApCi0JLnNwYWNlCTQJCi1TWU1CT0xfTkFNRV9MQUJFTChzd191c3ApCi0JLnNwYWNlCTQJCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCmluZGV4IDA4NDdiMTUuLmJmMTI0MTggMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogIyBSZXVzZSBhbnkgZmlsZXMgd2UgY2FuIGZyb20gdGhlIEg4UwogIwogCi1vYmoteSA6PSBlbnRyeS5vIGludHNfaDhzLm8gcHRyYWNlX2g4cy5vCitvYmoteSA6PSBpbnRzX2g4cy5vIHB0cmFjZV9oOHMubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCBiMWIyYjMwLi5jN2M5YzJhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtMTIxMiwyMSArMTIxMiwyNiBAQAogCiBzb3VyY2UgImZzL0tjb25maWciCiAKLW1lbnUgIkluc3RydW1lbnRhdGlvbiBTdXBwb3J0IgorbWVudWNvbmZpZyBJTlNUUlVNRU5UQVRJT04KKwlib29sICJJbnN0cnVtZW50YXRpb24gU3VwcG9ydCIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgeQorCitpZiBJTlNUUlVNRU5UQVRJT04KIAogc291cmNlICJhcmNoL2kzODYvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwogCSAgYSBwcm9iZXBvaW50IGFuZCBzcGVjaWZpZXMgdGhlIGNhbGxiYWNrLiAgS3Byb2JlcyBpcyB1c2VmdWwKIAkgIGZvciBrZXJuZWwgZGVidWdnaW5nLCBub24taW50cnVzaXZlIGluc3RydW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KIAkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgotZW5kbWVudQorCitlbmRpZiAjIElOU1RSVU1FTlRBVElPTgogCiBzb3VyY2UgImFyY2gvaTM4Ni9LY29uZmlnLmRlYnVnIgogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggYmQyOGY5Zi4uMTgxY2MyOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMTA4LDYgKzEwOCw3IEBACiAjIG11c3QgYmUgbGlua2VkIGFmdGVyIGtlcm5lbC8KIGRyaXZlcnMtJChDT05GSUdfT1BST0ZJTEUpCQkrPSBhcmNoL2kzODYvb3Byb2ZpbGUvCiBkcml2ZXJzLSQoQ09ORklHX1BNKQkJCSs9IGFyY2gvaTM4Ni9wb3dlci8KK2RyaXZlcnMtJChDT05GSUdfRkIpICAgICAgICAgICAgICAgICAgICArPSBhcmNoL2kzODYvdmlkZW8vCiAKIENGTEFHUyArPSAkKG1mbGFncy15KQogQUZMQUdTICs9ICQobWZsYWdzLXkpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYwppbmRleCA0MTEyYWZlLi40NzAwMWQ1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwbS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKQEAgLTIyMiw2ICsyMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgpAQCAtMjMxMSw3ICsyMzEyLDYgQEAKIAkJcmVtb3ZlX3Byb2NfZW50cnkoImFwbSIsIE5VTEwpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlrYXBtZF90YXNrLT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAl3YWtlX3VwX3Byb2Nlc3Moa2FwbWRfdGFzayk7CiAKIAlpZiAobnVtX29ubGluZV9jcHVzKCkgPiAxICYmICFzbXAgKSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCmluZGV4IGY3NGRmYzQuLjgyNzE0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCkBAIC0xNjgsNiArMTY4LDEyIEBACiAuc2VjdGlvbiAuaW5pdC50ZXh0LCJheCIsQHByb2diaXRzCiAjZW5kaWYKIAorCS8qIERvIGFuIGVhcmx5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBmaXhtYXAgYXJlYSAqLworCW1vdmwgJChzd2FwcGVyX3BnX2RpciAtIF9fUEFHRV9PRkZTRVQpLCAlZWR4CisJbW92bCAkKHN3YXBwZXJfcGdfcG1kIC0gX19QQUdFX09GRlNFVCksICVlYXgKKwlhZGRsICQweDAwNywgJWVheAkJCS8qIDB4MDA3ID0gUFJFU0VOVCtSVytVU0VSICovCisJbW92bCAlZWF4LCA0MDkyKCVlZHgpCisKICNpZmRlZiBDT05GSUdfU01QCiBFTlRSWShzdGFydHVwXzMyX3NtcCkKIAljbGQKQEAgLTUwNyw2ICs1MTMsOCBAQAogLnNlY3Rpb24gIi5ic3MucGFnZV9hbGlnbmVkIiwidyIKIEVOVFJZKHN3YXBwZXJfcGdfZGlyKQogCS5maWxsIDEwMjQsNCwwCitFTlRSWShzd2FwcGVyX3BnX3BtZCkKKwkuZmlsbCAxMDI0LDQsMAogRU5UUlkoZW1wdHlfemVyb19wYWdlKQogCS5maWxsIDQwOTYsMSwwCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggN2Y4YjdhZi4uMjFkYjhmNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTY2Nyw2ICs2NjcsNyBAQAogCQlzZXRfcGVuZGluZ19pcnEoaSwgY3B1bWFza19vZl9jcHUoMCkpOwogCX0KIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKCA7IDsgKSB7CiAJCXRpbWVfcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVfcmVtYWluaW5nKTsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKaW5kZXggZmJhMTIxZi4uMDNiN2Y1NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAlsYXN0X2lycV9zdW1zIFtOUl9DUFVTXSwKIAlhbGVydF9jb3VudGVyIFtOUl9DUFVTXTsKIAotdm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2cgKHZvaWQpCit2b2lkIHRvdWNoX25taV93YXRjaGRvZyh2b2lkKQogewogCWlmIChubWlfd2F0Y2hkb2cgPiAwKSB7CiAJCXVuc2lnbmVkIGNwdTsKQEAgLTMwNCw4ICszMDQsMTAgQEAKIAkJICogSnVzdCByZXNldCB0aGUgYWxlcnQgY291bnRlcnMsIChvdGhlciBDUFVzIG1pZ2h0IGJlCiAJCSAqIHNwaW5uaW5nIG9uIGxvY2tzIHdlIGhvbGQpOgogCQkgKi8KLQkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKLQkJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQkJaWYgKGFsZXJ0X2NvdW50ZXJbY3B1XSkKKwkJCQlhbGVydF9jb3VudGVyW2NwdV0gPSAwOworCQl9CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMDZkZmE2NS4uNmM0OWFjYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTUzOCw4ICs1MzgsMzEgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIG5vaW5saW5lIHZvaWQgX19zd2l0Y2hfdG9feHRyYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCwKLQkJCQkgICAgc3RydWN0IHRzc19zdHJ1Y3QgKnRzcykKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAordm9pZCBoYXJkX2Rpc2FibGVfVFNDKHZvaWQpCit7CisJd3JpdGVfY3I0KHJlYWRfY3I0KCkgfCBYODZfQ1I0X1RTRCk7Cit9Cit2b2lkIGRpc2FibGVfVFNDKHZvaWQpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfdGhyZWFkX2ZsYWcoVElGX05PVFNDKSkKKwkJLyoKKwkJICogTXVzdCBmbGlwIHRoZSBDUFUgc3RhdGUgc3luY2hyb25vdXNseSB3aXRoCisJCSAqIFRJRl9OT1RTQyBpbiB0aGUgY3VycmVudCBydW5uaW5nIGNvbnRleHQuCisJCSAqLworCQloYXJkX2Rpc2FibGVfVFNDKCk7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KK3ZvaWQgaGFyZF9lbmFibGVfVFNDKHZvaWQpCit7CisJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9UU0QpOworfQorI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCisKK3N0YXRpYyBub2lubGluZSB2b2lkCitfX3N3aXRjaF90b194dHJhKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCwKKwkJIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpCiB7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKm5leHQ7CiAKQEAgLTU1NSw2ICs1NzgsMTcgQEAKIAkJc2V0X2RlYnVncmVnKG5leHQtPmRlYnVncmVnWzddLCA3KTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhwcmV2X3AsIFRJRl9OT1RTQykgXgorCSAgICB0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9OT1RTQykpIHsKKwkJLyogcHJldiBhbmQgbmV4dCBhcmUgZGlmZmVyZW50ICovCisJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9OT1RTQykpCisJCQloYXJkX2Rpc2FibGVfVFNDKCk7CisJCWVsc2UKKwkJCWhhcmRfZW5hYmxlX1RTQygpOworCX0KKyNlbmRpZgorCiAJaWYgKCF0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9JT19CSVRNQVApKSB7CiAJCS8qCiAJCSAqIERpc2FibGUgdGhlIGJpdG1hcCB2aWEgYW4gaW52YWxpZCBvZmZzZXQuIFdlIHN0aWxsIGNhY2hlCkBAIC01ODYsMzMgKzYyMCw2IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgdGhlIGNvbnRleHQgc3dpdGNoIGZyb20gcHJldiB0byBuZXh0Ci0gKiBoYXMgdG8gdHdlYWsgdGhlIFRTQyBkaXNhYmxlIGJpdCBpbiB0aGUgY3I0LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV90c2Moc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsCi0JCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3ApCi17Ci0Jc3RydWN0IHRocmVhZF9pbmZvICpwcmV2LCAqbmV4dDsKLQotCS8qCi0JICogZ2NjIHNob3VsZCBlbGltaW5hdGUgdGhlIC0+dGhyZWFkX2luZm8gZGVyZWZlcmVuY2UgaWYKLQkgKiBoYXNfc2VjdXJlX2NvbXB1dGluZyByZXR1cm5zIDAgYXQgY29tcGlsZSB0aW1lIChTRUNDT01QPW4pLgotCSAqLwotCXByZXYgPSB0YXNrX3RocmVhZF9pbmZvKHByZXZfcCk7Ci0JbmV4dCA9IHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKTsKLQotCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSB8fCBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgewotCQkvKiBzbG93IHBhdGggaGVyZSAqLwotCQlpZiAoaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgJiYKLQkJICAgICFoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgewotCQkJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9UU0QpOwotCQl9IGVsc2UgaWYgKCFoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSAmJgotCQkJICAgaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpCi0JCQl3cml0ZV9jcjQocmVhZF9jcjQoKSB8IFg4Nl9DUjRfVFNEKTsKLQl9Ci19Ci0KLS8qCiAgKglzd2l0Y2hfdG8oeCx5bikgc2hvdWxkIHN3aXRjaCB0YXNrcyBmcm9tIHggdG8geS4KICAqCiAgKiBXZSBmc2F2ZS9md2FpdCBzbyB0aGF0IGFuIGV4Y2VwdGlvbiBnb2VzIG9mZiBhdCB0aGUgcmlnaHQgdGltZQpAQCAtNjg5LDExICs2OTYsOSBAQAogCS8qCiAJICogTm93IG1heWJlIGhhbmRsZSBkZWJ1ZyByZWdpc3RlcnMgYW5kL29yIElPIGJpdG1hcHMKIAkgKi8KLQlpZiAodW5saWtlbHkoKHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKS0+ZmxhZ3MgJiBfVElGX1dPUktfQ1RYU1cpCi0JICAgIHx8IHRlc3RfdHNrX3RocmVhZF9mbGFnKHByZXZfcCwgVElGX0lPX0JJVE1BUCkpKQotCQlfX3N3aXRjaF90b194dHJhKG5leHRfcCwgdHNzKTsKLQotCWRpc2FibGVfdHNjKHByZXZfcCwgbmV4dF9wKTsKKwlpZiAodW5saWtlbHkodGFza190aHJlYWRfaW5mbyhwcmV2X3ApLT5mbGFncyAmIF9USUZfV09SS19DVFhTV19QUkVWIHx8CisJCSAgICAgdGFza190aHJlYWRfaW5mbyhuZXh0X3ApLT5mbGFncyAmIF9USUZfV09SS19DVFhTV19ORVhUKSkKKwkJX19zd2l0Y2hfdG9feHRyYShwcmV2X3AsIG5leHRfcCwgdHNzKTsKIAogCS8qCiAJICogTGVhdmUgbGF6eSBtb2RlLCBmbHVzaGluZyBhbnkgaHlwZXJjYWxscyBtYWRlIGhlcmUuCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCAwYzBjZWVjLi4xYzA3NWY1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1OCwxNyArMzU4LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgZGF0YXApOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTM5NSwxMCArMzg3LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCmluZGV4IDkwZGEwNTcuLjE4YzFjMjggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTM5MCw3ICszOTAsNyBAQAogCQl1bnNpZ25lZCBsb25nIGVzcDsKIAkJdW5zaWduZWQgc2hvcnQgc3M7CiAKLQkJcmVwb3J0X2J1ZyhyZWdzLT5laXApOworCQlyZXBvcnRfYnVnKHJlZ3MtPmVpcCwgcmVncyk7CiAKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOwogI2lmZGVmIENPTkZJR19QUkVFTVBUCkBAIC00MzMsNiArNDMzLDcgQEAKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRpZS5sb2NrX293bmVyID0gLTE7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllLmxvY2ssIGZsYWdzKTsKIAogCWlmICghcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZSBiL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQ0N2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3ZpZGVvL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19GQikgICAgICAgICAgICAgICArPSBmYmRldi5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYyBiL2FyY2gvaTM4Ni92aWRlby9mYmRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmIzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogYXJjaC9pMzg2L3ZpZGVvL2ZiZGV2LmMgLSBpMzg2IEZyYW1lYnVmZmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFudG9uaW5vIERhcGxhcyA8YWRhcGxhc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK2ludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSBpbmZvLT5kZXZpY2U7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkZXZpY2UpCisJCXBjaV9kZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisKKwlpZiAocGNpX2RldikKKwkJcmVzID0gJnBjaV9kZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCisJaWYgKHJlcyAmJiByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fU0hBRE9XKQorCQlyZXR2YWwgPSAxOworCisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woZmJfaXNfcHJpbWFyeV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCBkYjlkZGZmLi42MTZjOTZlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtNTgyLDggKzU4Miw4IEBACiBzb3VyY2UgImFyY2gvaWE2NC9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwppbmRleCBjMWRjYTIyLi5jZDRhZGY1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPiAgICAgICAgIC8qIGh3ZWlnaHQ2NCgpICovCisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogCiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CQkvKiBpYTY0X2dldF9pdGMoKSAqLwogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDMsNiArNDQsOCBAQAogCiAjaW5jbHVkZSA8YXNtL2FjcGktZXh0Lmg+CiAKK2V4dGVybiBpbnQgc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUgKHNpemVfdCBzaXplKTsKKwogI2RlZmluZSBQRlggIklPQzogIgogCiAvKgpAQCAtMjAyNiwxMSArMjAyOSwyNCBAQAogCWlmICghaWE2NF9wbGF0Zm9ybV9pcygiaHB6eDEiKSAmJiAhaWE2NF9wbGF0Zm9ybV9pcygiaHB6eDFfc3dpb3RsYiIpKQogCQlyZXR1cm4gMDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgJiYgZGVmaW5lZChDT05GSUdfQ1JBU0hfRFVNUCkKKwkvKiBJZiB3ZSBhcmUgYm9vdGluZyBhIGtkdW1wIGtlcm5lbCwgdGhlIHNiYV9pb21tdSB3aWxsCisJICogY2F1c2UgZGV2aWNlcyB0aGF0IHdlcmUgbm90IHNodXRkb3duIHByb3Blcmx5IHRvIE1DQQorCSAqIGFzIHNvb24gYXMgdGhleSBhcmUgdHVybmVkIGJhY2sgb24uICBPdXIgb25seSBvcHRpb24gZm9yCisJICogYSBzdWNjZXNzZnVsIGtkdW1wIGtlcm5lbCBib290IGlzIHRvIHVzZSB0aGUgc3dpb3RsYi4KKwkgKi8KKwlpZiAoZWxmY29yZWhkcl9hZGRyIDwgRUxGQ09SRV9BRERSX01BWCkgeworCQlpZiAoc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUoNjQgKiAoMTw8MjApKSAhPSAwKQorCQkJcGFuaWMoIlVuYWJsZSB0byBpbml0aWFsaXplIHNvZnR3YXJlIEkvTyBUTEI6IgorCQkJCSAgIiBUcnkgbWFjaHZlYz1kaWcgYm9vdCBvcHRpb24iKTsKKwkJbWFjaHZlY19pbml0KCJkaWciKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKIAlhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfc2JhX2lvY19kcml2ZXIpOwogCWlmICghaW9jX2xpc3QpIHsKICNpZmRlZiBDT05GSUdfSUE2NF9HRU5FUklDCi0JCWV4dGVybiBpbnQgc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUgKHNpemVfdCBzaXplKTsKLQogCQkvKgogCQkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBzb21ldGhpbmcgc2JhX2lvbW11IGNhbiBjbGFpbSwgd2UKIAkJICogbmVlZCB0byBzZXR1cCB0aGUgc3dpb3RsYiBhbmQgc3dpdGNoIHRvIHRoZSBkaWcgbWFjaHZlYy4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYyBiL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYwppbmRleCAzMDBhY2Q5Li4xMTg5ZDAzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL2Jvb3QvZnctZW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jCkBAIC0zMjksMTEgKzMyOSw2IEBACiAJc3RyY3B5KHNhbF9zeXN0YWItPnByb2R1Y3RfaWQsICJIUC1zaW11bGF0b3IiKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0lBNjRfU0RWCi0Jc3RyY3B5KHNhbF9zeXN0YWItPm9lbV9pZCwgIkludGVsIik7Ci0Jc3RyY3B5KHNhbF9zeXN0YWItPnByb2R1Y3RfaWQsICJTRFYiKTsKLSNlbmRpZgotCiAJLyogZmlsbCBpbiBhbiBlbnRyeSBwb2ludDogKi8KIAlzYWxfZWQtPnR5cGUgPSBTQUxfREVTQ19FTlRSWV9QT0lOVDsKIAlzYWxfZWQtPnBhbF9wcm9jID0gX19wYShwYWxfZGVzY1swXSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwppbmRleCAzMjRlYTc1Li5lZjI1MmRmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKQEAgLTM2LDEwICszNiw2IEBACiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpZmRlZiBDT05GSUdfS0RCCi0jIGluY2x1ZGUgPGxpbnV4L2tkYi5oPgotI2VuZGlmCi0KICN1bmRlZiBTSU1TRVJJQUxfREVCVUcJLyogZGVmaW5lIHRoaXMgdG8gZ2V0IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gKi8KIAogI2RlZmluZSBLRVlCT0FSRF9JTlRSCTMJLyogbXVzdCBtYXRjaCB3aXRoIHNpbXVsYXRvciEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKaW5kZXggYzA1YmRhNi4uNmY0ZDNkMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZwotZWxmMzJfbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlKQorZWxmMzJfbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBnb2ZmID0gKGVwcG50LT5wX3ZhZGRyKSAmIH5JQTMyX1BBR0VfTUFTSzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCmluZGV4IDk5YjY2NWUuLjA2ZWZkMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKQEAgLTMwNCw3ICszMDQsNyBAQAogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIGluaXRfbW9kdWxlICovCiAJZGF0YTggc3lzX25pX3N5c2NhbGwJLyogZGVsZXRlX21vZHVsZSAqLwogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIGdldF9rZXJuZWxfc3ltcyAqLyAgLyogMTMwICovCi0JZGF0YTggc3lzX3F1b3RhY3RsCisJZGF0YTggc3lzMzJfcXVvdGFjdGwKIAlkYXRhOCBzeXNfZ2V0cGdpZAogCWRhdGE4IHN5c19mY2hkaXIKIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfYmRmbHVzaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKaW5kZXggNzVlYzM0Ny4uNzNjYTg2ZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9rcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwppbmRleCA4NTg5ZTg0Li4zZjkyNmMyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwpAQCAtMjQ3LDYgKzI0Nyw5IEBACiAudGltZV9yZWRvOgogCS5wcmVkLnJlbC5tdXRleCBwOCxwOSxwMTAKIAlsZDQuYWNxIHIyOCA9IFtyMjldCS8vIHh0aW1lX2xvY2suc2VxdWVuY2UuIE11c3QgY29tZSBmaXJzdCBmb3IgbG9ja2luZyBwdXJwb3NlcworCTs7CisJYW5kIHIyOCA9IH4xLHIyOAkvLyBNYWtlIHNlcXVlbmNlIGV2ZW4gdG8gZm9yY2UgcmV0cnkgaWYgb2RkCisJOzsKIChwOCkJbW92IHIyID0gYXIuaXRjCQkvLyBDUFVfVElNRVIuIDM2IGNsb2NrcyBsYXRlbmN5ISEhCiAJYWRkIHIyMiA9IElBNjRfVElNRV9JTlRFUlBPTEFUT1JfTEFTVF9DT1VOVEVSX09GRlNFVCxyMjAKIChwOSkJbGQ4IHIyID0gW3IzMF0JCS8vIHJlYWRxKHRpLT5hZGRyZXNzKS4gQ291bGQgYWxzbyBoYXZlIGxhdGVuY3kgaXNzdWVzLi4KQEAgLTI4NCw3ICsyODcsNiBAQAogKHAxNSkJbGQ4IHIxNyA9IFtyMTldLC1JQTY0X1RJTUVTUEVDX1RWX05TRUNfT0ZGU0VUCiAocDcpCWNtcC5uZSBwNyxwMCA9IHIyNSxyMwkvLyBpZiBjbXB4Y2hnIG5vdCBzdWNjZXNzZnVsIHJlZG8KIAkvLyBzaW11bGF0ZSB0Yml0Lm56Lm9yIHA3LHAwID0gcjI4LDAKLQlhbmQgcjI4ID0gfjEscjI4CS8vIE1ha2Ugc2VxdWVuY2UgZXZlbiB0byBmb3JjZSByZXRyeSBpZiBvZGQKIAlnZXRmLnNpZyByMiA9IGY4CiAJbWYKIAlhZGQgcjggPSByOCxyMTgJCS8vIEFkZCB0aW1lIGludGVycG9sYXRvciBvZmZzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwppbmRleCAxODhmYjczLi40ZDk4NjRjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCkBAIC0zOTAsMTAgKzM5MCw2IEBACiAJaWYgKCFlZmlfc2V0dXBfcGNkcF9jb25zb2xlKGNtZGxpbmUpKQogCQllYXJseWNvbnMrKzsKICNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCi0JaWYgKCFlYXJseV9zZXJpYWxfY29uc29sZV9pbml0KGNtZGxpbmUpKQotCQllYXJseWNvbnMrKzsKLSNlbmRpZgogCiAJcmV0dXJuIChlYXJseWNvbnMpID8gMCA6IC0xOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDE1YWQ4NWQuLjNhZWFmMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRpZS5sb2NrX293bmVyID0gLTE7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWUubG9jayk7CiAKIAlpZiAocGFuaWNfb25fb29wcykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYyBiL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYwppbmRleCA0NDExZDliLi45ZmM5NTUwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jCkBAIC02MCw2ICs2MCw3IEBACiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX2NzdW0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgbG9uZyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKaW5kZXggNmRhOTg1NC4uZGY4ZDViZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKQEAgLTc1MCw5ICs3NTAsMTAgQEAKIAkJCWdvdG8gZXJyb3I7CiAJCX0gZWxzZQogCQlpZiAoKHIgPSBzbl9od3BlcmZfZW51bV9vYmplY3RzKCZub2JqLCAmb2JqcykpID09IDApIHsKKwkJCWludCBjcHVvYmpfaW5kZXggPSAwOworCiAJCQltZW1zZXQocCwgMCwgYS5zeik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbm9iajsgaSsrKSB7Ci0JCQkJaW50IGNwdW9ial9pbmRleCA9IDA7CiAJCQkJaWYgKCFTTl9IV1BFUkZfSVNfTk9ERShvYmpzICsgaSkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCW5vZGUgPSBzbl9od3BlcmZfb2JqX3RvX2Nub2RlKG9ianMgKyBpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9LY29uZmlnIGIvYXJjaC9tMzJyL0tjb25maWcKaW5kZXggYzNiYjhhNy4uOGNjZjNlNCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTMxLDYgKzMxLDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCmluZGV4IDVmMDJiMzEuLjU3YTkyZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYwpAQCAtNTk1LDcgKzU5NSw2IEBACiBzdGF0aWMgaW50CiBkb19wdHJhY2UobG9uZyByZXF1ZXN0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CkBAIC02MDQsMTEgKzYwMyw3IEBACiAJICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwotCQllbHNlCi0JCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyoKQEAgLTYyNCwxNSArNjE5LDkgQEAKIAkgKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpOwotCQlpZiAocmV0ID09IHNpemVvZihkYXRhKSkgewotCQkJcmV0ID0gMDsKLQkJCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QT0tFVEVYVCkgewotCQkJCWludmFsaWRhdGVfY2FjaGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU87Ci0JCX0KKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOworCQlpZiAocmV0ID09IDAgJiYgcmVxdWVzdCA9PSBQVFJBQ0VfUE9LRVRFWFQpCisJCQlpbnZhbGlkYXRlX2NhY2hlKCk7CiAJCWJyZWFrOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL202OGsva2VybmVsL3B0cmFjZS5jCmluZGV4IGNkYmE5ZmQuLjJjZjA2OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTI4LDEwICsxMjgsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWkgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoaSAhPSBzaXplb2YodG1wKSkKLQkJCWdvdG8gb3V0X2VpbzsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCkBAIC0xNjAsOCArMTU3LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCi0JCQlnb3RvIG91dF9laW87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCBhMjdhNGZhLi40ZTI3NTJhIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC0xMTcwLDYgKzExNzAsNyBAQAogCWNvbnNvbGVfdmVyYm9zZSgpOwogCXByaW50aygiJXM6ICUwOHhcbiIsc3RyLG5yKTsKIAlzaG93X3JlZ2lzdGVycyhmcCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCmluZGV4IGNmNmJiNTEuLjYyMTZmMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKQEAgLTQyMiwzICs0MjIsNCBAQAogCSAgICApOwogICAgIHJldHVybihzdW0pOwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDk0MTk1NWQuLjg0NmY5NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJZnAgPSAoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilwLT50aHJlYWQua3NwKS0+YTY7CiAJZG8gewogCQlpZiAoZnAgPCBzdGFja19wYWdlK3NpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pIHx8Ci0JCSAgICBmcCA+PSA4MTg0K3N0YWNrX3BhZ2UpCisJCSAgICBmcCA+PSBUSFJFQURfU0laRS04K3N0YWNrX3BhZ2UpCiAJCQlyZXR1cm4gMDsKIAkJcGMgPSAoKHVuc2lnbmVkIGxvbmcgKilmcClbMV07CiAJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKHBjKSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYwppbmRleCBmNTRiNmEzLi5lZjcwY2EwIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jCkBAIC0xMDYsMTcgKzEwNiw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCQkJaW50IGNvcGllZDsKLQotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwotCQl9CiAKIAkJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE1OSwxMCArMTUxLDcgQEAKIAkJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKaW5kZXggODEzM2IxMC4uODBmNGU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogIGxpbnV4L2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCiAgKgotICogIENvcHlyaWdodCAoQykgMTk5OS0yMDA0ICBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQotICogIENvcHlyaWdodCAoQykgMTk5OCwxOTk5ICBELiBKZWZmIERpb25uZSA8amVmZkBsaW5lby5jYT4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSAgRC4gSmVmZiBEaW9ubmUgPGplZmZAdUNsaW51eC5vcmc+CiAgKiAgQ29weWxlZnQgICgpKSAyMDAwICAgICAgIEphbWVzIEQuIFNjaGV0dGluZSB7amFtZXNAdGVsb3Mtc3lzdGVtcy5jb219CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk4ICAgICAgIEtlbm5ldGggQWxiYW5vd3NraSA8a2phaGRzQGtqYWhkcy5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICAgICAgIEhhbWlzaCBNYWNkb25hbGQKQEAgLTIwLDE3ICsyMCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00NiwzNCArNDIsMTkgQEAKIAogY2hhciBfX2luaXRkYXRhIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CiAKLS8qIHNldHVwIHNvbWUgZHVtbXkgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkIGR1bW15X3dhaXRidXQodm9pZCkKLXsKLX0KK3ZvaWQgKCptYWNoX3RyYXBfaW5pdCkodm9pZCk7CiAKLXZvaWQgKCptYWNoX3NjaGVkX2luaXQpIChpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwotdm9pZCAoKm1hY2hfdGljaykoIHZvaWQgKTsKLS8qIG1hY2hpbmUgZGVwZW5kZW50IGtleWJvYXJkIGZ1bmN0aW9ucyAqLwotaW50ICgqbWFjaF9rZXliX2luaXQpICh2b2lkKTsKLWludCAoKm1hY2hfa2JkcmF0ZSkgKHN0cnVjdCBrYmRfcmVwZWF0ICopOwotdm9pZCAoKm1hY2hfa2JkX2xlZHMpICh1bnNpZ25lZCBpbnQpOwotLyogbWFjaGluZSBkZXBlbmRlbnQgaXJxIGZ1bmN0aW9ucyAqLwotdm9pZCAoKm1hY2hfaW5pdF9JUlEpICh2b2lkKTsKLWlycV9oYW5kbGVyX3QgbWFjaF9kZWZhdWx0X2hhbmRsZXI7Ci1pbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotdm9pZCAoKm1hY2hfcHJvY2Vzc19pbnQpIChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotdm9pZCAoKm1hY2hfdHJhcF9pbml0KSAodm9pZCk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCB0aW1lciBmdW5jdGlvbnMgKi8KLXVuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpICh2b2lkKTsKLXZvaWQgKCptYWNoX2dldHRvZCkgKGludCosIGludCosIGludCosIGludCosIGludCosIGludCopOwotaW50ICgqbWFjaF9od2NsaykgKGludCwgc3RydWN0IHJ0Y190aW1lKik7Ci1pbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSAodW5zaWduZWQgbG9uZyk7Ci12b2lkICgqbWFjaF9ta3NvdW5kKSggdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgdGlja3MgKTsKLXZvaWQgKCptYWNoX3Jlc2V0KSggdm9pZCApOwotdm9pZCAoKndhaXRidXQpKHZvaWQpID0gZHVtbXlfd2FpdGJ1dDsKLXZvaWQgKCptYWNoX2RlYnVnX2luaXQpKHZvaWQpOwotdm9pZCAoKm1hY2hfaGFsdCkoIHZvaWQgKTsKLXZvaWQgKCptYWNoX3Bvd2VyX29mZikoIHZvaWQgKTsKK3ZvaWQgKCptYWNoX3NjaGVkX2luaXQpKGlycV9oYW5kbGVyX3QgaGFuZGxlcik7Cit2b2lkICgqbWFjaF90aWNrKSh2b2lkKTsKK3ZvaWQgKCptYWNoX2dldHRvZCkoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50Kik7CitpbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSh1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpKHZvaWQpOworCisvKiBtYWNoaW5lIGRlcGVuZGVudCByZWJvb3QgZnVuY3Rpb25zICovCit2b2lkICgqbWFjaF9yZXNldCkodm9pZCk7Cit2b2lkICgqbWFjaF9oYWx0KSh2b2lkKTsKK3ZvaWQgKCptYWNoX3Bvd2VyX29mZikodm9pZCk7CiAKIAogI2lmZGVmIENPTkZJR19NNjgwMDAKQEAgLTEzNCwxMyArMTE1LDYgQEAKIAkjZGVmaW5lCUNQVSAiVU5LTk9XTiIKICNlbmRpZgogCi0vKiAoZXMpICovCi0vKiBub3RlOiB3aHkgaXMgdGhpcyBkZWZpbmVkIGhlcmU/ICB0aGUgbXVzdCBiZSBhIGJldHRlciBwbGFjZSB0byBwdXQgdGhpcyAqLwotI2lmIGRlZmluZWQoIENPTkZJR19URUxPUykgfHwgZGVmaW5lZCggQ09ORklHX1VDRElNTSApIHx8IGRlZmluZWQoIENPTkZJR19VQ1NJTU0gKSB8fCBkZWZpbmVkKENPTkZJR19EUkFHRU4yKSB8fCAoZGVmaW5lZCggQ09ORklHX1BJTE9UICkgJiYgZGVmaW5lZCggQ09ORklHX002ODMyOCApKQotI2RlZmluZSBDQVRfUk9NQVJSQVkKLSNlbmRpZgotLyogKC9lcykgKi8KLQogZXh0ZXJuIGludCBfc3RleHQsIF9ldGV4dCwgX3NkYXRhLCBfZWRhdGEsIF9zYnNzLCBfZWJzcywgX2VuZDsKIGV4dGVybiBpbnQgX3JhbXN0YXJ0LCBfcmFtZW5kOwogCkBAIC0xNDgsMTUgKzEyMiw4IEBACiB7CiAJaW50IGJvb3RtYXBfc2l6ZTsKIAotI2lmIGRlZmluZWQoQ0FUX1JPTUFSUkFZKSAmJiBkZWZpbmVkKERFQlVHKQotCWV4dGVybiBpbnQgX19kYXRhX3JvbV9zdGFydDsKLQlleHRlcm4gaW50IF9fZGF0YV9zdGFydDsKLQlpbnQgKnJvbWFycmF5ID0gKGludCAqKSgoaW50KSAmX19kYXRhX3JvbV9zdGFydCArCi0JCQkgICAgICAoaW50KSZfZWRhdGEgLSAoaW50KSZfX2RhdGFfc3RhcnQpOwotI2VuZGlmCi0KIAltZW1vcnlfc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7Ci0JbWVtb3J5X2VuZCA9IF9yYW1lbmQ7IC8qIGJ5IG5vdyB0aGUgc3RhY2sgaXMgcGFydCBvZiB0aGUgaW5pdCB0YXNrICovCisJbWVtb3J5X2VuZCA9IF9yYW1lbmQ7CiAKIAlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9zdGV4dDsKIAlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CkBAIC0yMjAsMTEgKzE4Nyw3IEBACiAJCShpbnQpICZfc2JzcywgKGludCkgJl9lYnNzKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiS0VSTkVMIC0+IFJPTUZTPTB4JTA2eC0weCUwNnggTUVNPTB4JTA2eC0weCUwNnggIgogCQkiU1RBQ0s9MHglMDZ4LTB4JTA2eFxuIiwKLSNpZmRlZiBDQVRfUk9NQVJSQVkKLQkJKGludCkgcm9tYXJyYXksICgoaW50KSByb21hcnJheSkgKyByb21hcnJheVsyXSwKLSNlbHNlCiAJCShpbnQpICZfZWJzcywgKGludCkgbWVtb3J5X3N0YXJ0LAotI2VuZGlmCiAJCShpbnQpIG1lbW9yeV9zdGFydCwgKGludCkgbWVtb3J5X2VuZCwKIAkJKGludCkgbWVtb3J5X2VuZCwgKGludCkgX3JhbWVuZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKaW5kZXggYmVkNWY0Ny4uZmRlMDRlMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKQEAgLTgzLDYgKzgzLDcgQEAKIAlwcmludGsoS0VSTl9FTUVSRyAiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKIAkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBQQUdFX1NJWkUrKHVuc2lnbmVkIGxvbmcpY3VycmVudCk7CiAJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKWZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9tbS9tZW1vcnkuYyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCmluZGV4IDQxMWU0NTIuLjFhNjZiNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCisrKyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCkBAIC0xNyw5MCArMTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyoKLSAqIGNhY2hlX2NsZWFyKCkgc2VtYW50aWNzOiBDbGVhciBhbnkgY2FjaGUgZW50cmllcyBmb3IgdGhlIGFyZWEgaW4gcXVlc3Rpb24sCi0gKiB3aXRob3V0IHdyaXRpbmcgYmFjayBkaXJ0eSBlbnRyaWVzIGZpcnN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgZGF0YSB3aWxsCi0gKiBiZSBvdmVyd3JpdHRlbiBhbnl3YXksIGUuZy4gYnkgRE1BIHRvIG1lbW9yeS4gVGhlIHJhbmdlIGlzIGRlZmluZWQgYnkgYQotICogX3BoeXNpY2FsXyBhZGRyZXNzLgotICovCi0KLXZvaWQgY2FjaGVfY2xlYXIgKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci19Ci0KLQotLyoKLSAqCURlZmluZSBjYWNoZSBpbnZhbGlkYXRlIGZ1bmN0aW9ucy4gVGhlIENvbGRGaXJlIDU0MDcgaXMgcmVhbGx5Ci0gKgl0aGUgb25seSBwcm9jZXNzb3IgdGhhdCBuZWVkcyB0byBkbyBzb21lIHdvcmsgaGVyZS4gQW55dGhpbmcKLSAqCXRoYXQgaGFzIHNlcGFyYXRlIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlcyB3aWxsIGJlIGEgcHJvYmxlbS4KLSAqLwotI2lmZGVmIENPTkZJR19NNTQwNwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNhY2hlX2ludmFsaWRhdGVfbGluZXModW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nCXNzZXQsIGVzZXQ7Ci0KLQlzc2V0ID0gKHBhZGRyICYgMHgwMDAwMGZmMCk7Ci0JZXNldCA9ICgocGFkZHIgKyBsZW4pICYgMHgwMDAwZmYwKSArIDB4MTA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJub3Bcblx0IgotCQkiY2xybAklJWQwXG5cdCIKLQkJIjE6XG5cdCIKLQkJIm1vdmVsCSUwLCUlYTBcblx0IgotCQkiYWRkbAklJWQwLCUlYTBcblx0IgotCQkiMjpcblx0IgotCQkiLndvcmQJMHhmNGU4XG5cdCIKLQkJImFkZGwJIzB4MTAsJSVhMFxuXHQiCi0JCSJjbXBsCSUxLCUlYTBcblx0IgotCQkiYmx0CTJiXG5cdCIKLQkJImFkZHFsCSMxLCUlZDBcblx0IgotCQkiY21waWwJIzQsJSVkMFxuXHQiCi0JCSJibmUJMWIiCi0JCTogOiAiYSIgKHNzZXQpLCAiYSIgKGVzZXQpIDogImQwIiwgImEwIiApOwotfQotCi0jZWxzZQotI2RlZmluZQljYWNoZV9pbnZhbGlkYXRlX2xpbmVzKGEsYikKLSNlbmRpZgotCi0KLS8qCi0gKiBjYWNoZV9wdXNoKCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbiBhcmVhLAotICogYW5kIGludmFsaWRhdGUgdGhlIHJhbmdlIGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gSXQgbmVlZHMgbm90IChidXQgbWF5KQotICogaW52YWxpZGF0ZSB0aG9zZSBlbnRyaWVzIGFsc28gaW4gdGhlIGRhdGEgY2FjaGUuIFRoZSByYW5nZSBpcyBkZWZpbmVkIGJ5IGEKLSAqIF9waHlzaWNhbF8gYWRkcmVzcy4KLSAqLwotCi12b2lkIGNhY2hlX3B1c2ggKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci0JY2FjaGVfaW52YWxpZGF0ZV9saW5lcyhwYWRkciwgbGVuKTsKLX0KLQotCi0vKgotICogY2FjaGVfcHVzaF92KCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbgotICogYXJlYSwgYW5kIGludmFsaWRhdGUgdGhvc2UgZW50cmllcyBhdCBsZWFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuIFRoaXMKLSAqIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGFzCi0gKiBjb2RlIGxhdGVyLiBUaGUgcmFuZ2UgaXMgZGVmaW5lZCBieSBhIF91c2VyX21vZGVfIF92aXJ0dWFsXyBhZGRyZXNzICAob3IsCi0gKiBtb3JlIGV4YWN0bHksIHRoZSBzcGFjZSBpcyBkZWZpbmVkIGJ5IHRoZSAlc2ZjLyVkZmMgcmVnaXN0ZXIuKQotICovCi0KLXZvaWQgY2FjaGVfcHVzaF92ICh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgbGVuKQotewotCWNhY2hlX2ludmFsaWRhdGVfbGluZXModmFkZHIsIGxlbik7Ci19Ci0KLS8qIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuIFRoZQotICogY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KKyAqIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCisgKiBUaGUgY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KICAqLwogCiB1bnNpZ25lZCBsb25nIGtlcm5lbF9tYXAodW5zaWduZWQgbG9uZyBwYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYjVhN2I0Ni4uODkzZTdiYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC0xNzQsMTcgKzE3NCw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzEzLDExICszMDUsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCAzN2M1NjJjLi5jZTI3N2NiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC0zMjYsNiArMzI2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAJcHJpbnRrKCIlc1sjJWRdOlxuIiwgc3RyLCArK2RpZV9jb3VudGVyKTsKIAlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKaW5kZXggYmRhYWMzNC4uODlmMjkyMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc2V0dXAuYwppbmRleCBmNGE2MTY5Li4yZDVjNmQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogRVhQT1JUX1NZTUJPTCh6YmJ1c19taHopOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCmluZGV4IDhhMGRiMzcuLjI2ZWM3NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTg3LDEwICs4Nyw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKIAljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQlpbnQgY29waWVkOwotCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJCWlmIChfX2lzX2NvbXBhdF90YXNrKGNoaWxkKSkgeworCQkJaW50IGNvcGllZDsKIAkJCXVuc2lnbmVkIGludCB0bXA7CiAKIAkJCWFkZHIgJj0gMHhmZmZmZmZmZkw7CkBAIC0xMDUsMTUgKzEwNCw3IEBACiAJCX0KIAkJZWxzZQogI2VuZGlmCi0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQkJZ290byBvdXRfdHNrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQl9CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0X3RzazsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKaW5kZXggYzNlYzlmMS4uYmJmMDI5YSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKQEAgLTI2NCw2ICsyNjQsNyBAQAogCiAJc2hvd19yZWdzKHJlZ3MpOwogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMwMiw3ICszMDMsNyBAQAogCWlmICh1bmxpa2VseShpaXIgPT0gUEFSSVNDX0JVR19CUkVBS19JTlNOICYmICF1c2VyX21vZGUocmVncykpKSB7CiAJCS8qIGNoZWNrIGlmIGEgQlVHKCkgb3IgV0FSTigpIHRyYXBwZWQgaGVyZS4gICovCiAJCWVudW0gYnVnX3RyYXBfdHlwZSB0dDsKLQkJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPmlhb3FbMF0gJiB+Myk7CisJCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5pYW9xWzBdICYgfjMsIHJlZ3MpOwogCQlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5pYW9xWzBdICs9IDQ7CiAJCQlyZWdzLT5pYW9xWzFdICs9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKaW5kZXggMzIyMTY3Ny4uY2Y3ODBjYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAJCS8qIEhhbmRsZSBzb21lIGZyZXF1ZW50IHNwZWNpYWwgY2FzZXMuLi4uICovCiAJCXsKLQkJCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOKzFdOworCQkJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCQkJY2hhciAqbW9kbmFtZTsKIAogCQkJa2FsbHN5bXNfbG9va3VwKGluZm8tPmlwLCBOVUxMLCBOVUxMLCAmbW9kbmFtZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNmJlZWUzMi4uZDg2MGI2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTQsMTcgKzQsNyBAQAogCiBtYWlubWVudSAiTGludXgvUG93ZXJQQyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAotY29uZmlnIFBQQzY0Ci0JYm9vbCAiNjQtYml0IGtlcm5lbCIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCi0JICB3aWxsIGJlIGJ1aWx0LgotCi1jb25maWcgUFBDX1BNX05FRURTX1JUQ19MSUIKLQlib29sCi0Jc2VsZWN0IFJUQ19MSUIKLQlkZWZhdWx0IHkgaWYgUE0KK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUiCiAKIGNvbmZpZyBQUEMzMgogCWJvb2wKQEAgLTY2LDYgKzU2LDkgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX05PX1ZJUlRfVE9fQlVTCisJZGVmX2Jvb2wgUFBDNjQKKwogY29uZmlnIFBQQwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTEzMiwxMjMgKzEyNSw2IEBACiAJZGVwZW5kcyBvbiBQUEM2NCAmJiAoQlJPS0VOIHx8IChQUENfUE1BQzY0ICYmIEVYUEVSSU1FTlRBTCkpCiAJZGVmYXVsdCB5CiAKLW1lbnUgIlByb2Nlc3NvciBzdXBwb3J0IgotY2hvaWNlCi0JcHJvbXB0ICJQcm9jZXNzb3IgVHlwZSIKLQlkZXBlbmRzIG9uIFBQQzMyCi0JZGVmYXVsdCA2eHgKLQotY29uZmlnIENMQVNTSUMzMgotCWJvb2wgIjUyeHgvNnh4Lzd4eC83NHh4IgotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IDZ4eAotCWhlbHAKLQkgIFRoZXJlIGFyZSBmb3VyIGZhbWlsaWVzIG9mIFBvd2VyUEMgY2hpcHMgc3VwcG9ydGVkLiAgVGhlIG1vcmUgY29tbW9uCi0JICB0eXBlcyAoNjAxLCA2MDMsIDYwNCwgNzQwLCA3NTAsIDc0MDApLCB0aGUgTW90b3JvbGEgZW1iZWRkZWQKLQkgIHZlcnNpb25zICg4MjEsIDgyMywgODUwLCA4NTUsIDg2MCwgNTJ4eCwgODJ4eCwgODN4eCksIHRoZSBBTUNDCi0JICBlbWJlZGRlZCB2ZXJzaW9ucyAoNDAzIGFuZCA0MDUpIGFuZCB0aGUgaGlnaCBlbmQgNjQgYml0IFBvd2VyCi0JICBwcm9jZXNzb3JzIChQT1dFUiAzLCBQT1dFUjQsIGFuZCBJQk0gUFBDOTcwIGFsc28ga25vd24gYXMgRzUpLgotCi0JICBUaGlzIG9wdGlvbiBpcyB0aGUgY2F0Y2gtYWxsIGZvciA2eHggdHlwZXMsIGluY2x1ZGluZyBzb21lIG9mIHRoZQotCSAgZW1iZWRkZWQgdmVyc2lvbnMuICBVbmxlc3MgdGhlcmUgaXMgc2VlIGFuIG9wdGlvbiBmb3IgdGhlIHNwZWNpZmljCi0JICBjaGlwIGZhbWlseSB5b3UgYXJlIHVzaW5nLCB5b3Ugd2FudCB0aGlzIG9wdGlvbi4KLQkgIAotCSAgWW91IGRvIG5vdCB3YW50IHRoaXMgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSA2NCBiaXQKLQkgIElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgotCSAgCi0JICBJZiB1bnN1cmUsIHNlbGVjdCB0aGlzIG9wdGlvbgotCSAgCi0JICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBydW5zIGluIDMyLWJpdCBtb2RlIGV2ZW4gb24gNjQtYml0IGNoaXBzLgotCi1jb25maWcgUFBDXzgyeHgKLQlib29sICJGcmVlc2NhbGUgODJ4eCIKLQlzZWxlY3QgNnh4Ci0Jc2VsZWN0IFBQQ19GUFUKLQotY29uZmlnIFBQQ184M3h4Ci0JYm9vbCAiRnJlZXNjYWxlIDgzeHgiCi0Jc2VsZWN0IDZ4eAotCXNlbGVjdCBGU0xfU09DCi0Jc2VsZWN0IDgzeHgKLQlzZWxlY3QgUFBDX0ZQVQotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODV4eAotCWJvb2wgIkZyZWVzY2FsZSA4NXh4IgotCXNlbGVjdCBFNTAwCi0Jc2VsZWN0IEZTTF9TT0MKLQlzZWxlY3QgODV4eAotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODZ4eAotCWJvb2wgIkZyZWVzY2FsZSA4Nnh4IgotCXNlbGVjdCA2eHgKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCBGU0xfUENJRQotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IEFMVElWRUMKLQloZWxwCi0JICBUaGUgRnJlZXNjYWxlIEU2MDAgU29DcyBoYXZlIDc0eHggY29yZXMuCi0KLWNvbmZpZyBQUENfOHh4Ci0JYm9vbCAiRnJlZXNjYWxlIDh4eCIKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCA4eHgKLQotY29uZmlnIDQweAotCWJvb2wgIkFNQ0MgNDB4IgotCXNlbGVjdCBQUENfRENSX05BVElWRQotCi1jb25maWcgNDR4Ci0JYm9vbCAiQU1DQyA0NHgiCi0Jc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCi0Jc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKLQotY29uZmlnIEUyMDAKLQlib29sICJGcmVlc2NhbGUgZTIwMCIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBQT1dFUjRfT05MWQotCWJvb2wgIk9wdGltaXplIGZvciBQT1dFUjQiCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIENhdXNlIHRoZSBjb21waWxlciB0byBvcHRpbWl6ZSBmb3IgUE9XRVI0L1BPV0VSNS9QUEM5NzAgcHJvY2Vzc29ycy4KLQkgIFRoZSByZXN1bHRpbmcgYmluYXJ5IHdpbGwgbm90IHdvcmsgb24gUE9XRVIzIG9yIFJTNjQgcHJvY2Vzc29ycwotCSAgd2hlbiBjb21waWxlZCB3aXRoIGJpbnV0aWxzIDIuMTUgb3IgbGF0ZXIuCi0KLWNvbmZpZyBQT1dFUjMKLQlib29sCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgeSBpZiAhUE9XRVI0X09OTFkKLQotY29uZmlnIFBPV0VSNAotCWRlcGVuZHMgb24gUFBDNjQKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyA2eHgKLQlib29sCi0KLSMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYwotY29uZmlnIDh4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODN4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODV4eAotCWJvb2wKLQotY29uZmlnIEU1MDAKLQlib29sCi0KLWNvbmZpZyBQUENfRlBVCi0JYm9vbAotCWRlZmF1bHQgeSBpZiBQUEM2NAotCiBjb25maWcgUFBDX0RDUl9OQVRJVkUKIAlib29sCiAJZGVmYXVsdCBuCkBAIC0yNjcsMTM0ICsxNDMsNiBAQAogCWRlcGVuZHMgb24gUFBDNjQgIyBub3Qgc3VwcG9ydGVkIG9uIDMyIGJpdHMgeWV0CiAJZGVmYXVsdCBuCiAKLWNvbmZpZyA0eHgKLQlib29sCi0JZGVwZW5kcyBvbiA0MHggfHwgNDR4Ci0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBCT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMCB8fCA0NHgKLQlkZWZhdWx0IHkKLQotY29uZmlnIEZTTF9CT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCi1jb25maWcgUFRFXzY0QklUCi0JYm9vbAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlkZWZhdWx0IHkgaWYgNDR4Ci0JZGVmYXVsdCB5IGlmIEU1MDAgJiYgUEhZU182NEJJVAotCi1jb25maWcgUEhZU182NEJJVAotCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCi0JZGVmYXVsdCB5IGlmIDQ0eAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIGxhcmdlciB0aGFuIDMyLWJpdCBwaHlzaWNhbAotCSAgYWRkcmVzc2VzLiAgVGhpcyBmZWF0dXJlcyBpcyBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBlNTAwIGNvcmVzLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KLQotY29uZmlnIEFMVElWRUMKLQlib29sICJBbHRpVmVjIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDTEFTU0lDMzIgfHwgUE9XRVI0Ci0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIEFsdGl2ZWMgZXh0ZW5zaW9ucyB0byB0aGUKLQkgIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseSBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZwotCSAgYWx0aXZlYyByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZSAnYWx0aXZlYyBlbmFibGUnIGJpdCBzbyB1c2VyCi0JICBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgYWx0aXZlYyBpbnN0cnVjdGlvbnMuCi0KLQkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsbHkgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgYWx0aXZlYyAoRzQsIG90aGVyd2lzZSBrbm93biBhcyA3NHh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlCi0JICBhbnkgYWZmZWN0IG9uIGEgbm9uLWFsdGl2ZWMgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZQotCSAga2VybmVsKS4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTUEUKLQlib29sICJTUEUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHRoZSBTaWduYWwgUHJvY2Vzc2luZwotCSAgRXh0ZW5zaW9ucyAoU1BFKSB0byB0aGUgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5Ci0JICBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZyBTUEUgcmVnaXN0ZXJzLCBhbmQgdHVybmluZyBvbiB0aGUKLQkgICdzcGUgZW5hYmxlJyBiaXQgc28gdXNlciBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgU1BFIGluc3RydWN0aW9ucy4KLQotCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgU1BFIChlNTAwLCBvdGhlcndpc2Uga25vd24gYXMgODV4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZSBhbnkKLQkgIGVmZmVjdCBvbiBhIG5vbi1zcGUgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZSBrZXJuZWwpLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KLQotY29uZmlnIFBQQ19TVERfTU1VCi0JYm9vbAotCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMyB8fCBQT1dFUjQgfHwgUFBDNjQKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQ19TVERfTU1VXzMyCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUFBDX1NURF9NTVUgJiYgUFBDMzIKLQotY29uZmlnIFBQQ19NTV9TTElDRVMKLQlib29sCi0JZGVmYXVsdCB5IGlmIEhVR0VUTEJfUEFHRQotCWRlZmF1bHQgbgotCi1jb25maWcgVklSVF9DUFVfQUNDT1VOVElORwotCWJvb2wgIkRldGVybWluaXN0aWMgdGFzayBhbmQgQ1BVIHRpbWUgYWNjb3VudGluZyIKLQlkZXBlbmRzIG9uIFBQQzY0Ci0JZGVmYXVsdCB5Ci0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBtb3JlIGFjY3VyYXRlIHRhc2sgYW5kIENQVSB0aW1lCi0JICBhY2NvdW50aW5nLiAgVGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBDUFUgY291bnRlciBvbiBlYWNoCi0JICBrZXJuZWwgZW50cnkgYW5kIGV4aXQgYW5kIG9uIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUga2VybmVsCi0JICBiZXR3ZWVuIHN5c3RlbSwgc29mdGlycSBhbmQgaGFyZGlycSBzdGF0ZSwgc28gdGhlcmUgaXMgYQotCSAgc21hbGwgcGVyZm9ybWFuY2UgaW1wYWN0LiAgVGhpcyBhbHNvIGVuYWJsZXMgYWNjb3VudGluZyBvZgotCSAgc3RvbGVuIHRpbWUgb24gbG9naWNhbGx5LXBhcnRpdGlvbmVkIHN5c3RlbXMgcnVubmluZyBvbgotCSAgSUJNIFBPV0VSNS1iYXNlZCBtYWNoaW5lcy4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTTVAKLQlkZXBlbmRzIG9uIFBQQ19TVERfTU1VCi0JYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQotCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUKLQkgIHRoYW4gb25lIENQVSwgc2F5IFkuICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBjdXJyZW50bHkKLQkgIHN1cHBvcnQgU01QIG1hY2hpbmVzIHdpdGggNjAzLzYwM2UvNjAzZXYgb3IgUFBDNzUwICgiRzMiKSBwcm9jZXNzb3JzCi0JICBzaW5jZSB0aGV5IGhhdmUgaW5hZGVxdWF0ZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBtdWx0aXByb2Nlc3NvcgotCSAgb3BlcmF0aW9uLgotCi0JICBJZiB5b3Ugc2F5IE4gaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUgYW5kIG11bHRpcHJvY2Vzc29yCi0JICBtYWNoaW5lcywgYnV0IHdpbGwgdXNlIG9ubHkgb25lIENQVSBvZiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuIElmCi0JICB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmVzLgotCSAgT24gYSBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gZmFzdGVyIGlmIHlvdSBzYXkKLQkgIE4gaGVyZS4KLQotCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KLQotY29uZmlnIE5SX0NQVVMKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMTI4KSIKLQlyYW5nZSAyIDEyOAotCWRlcGVuZHMgb24gU01QCi0JZGVmYXVsdCAiMzIiIGlmIFBQQzY0Ci0JZGVmYXVsdCAiNCIKLQotY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQotCWJvb2wKLQlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAotCWRlZmF1bHQgeQotCi1jb25maWcgQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWQotCWJvb2wKLWVuZG1lbnUKLQogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIgpAQCAtNjc0LDEwICs0MjIsNiBAQAogY29uZmlnIEZTTF9TT0MKIAlib29sCiAKLWNvbmZpZyBGU0xfUENJRQotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ184Nnh4Ci0KICMgWWVzIE1DQSBSUy82MDAwcyBleGlzdCBidXQgTGludXgtUFBDIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGFueQogY29uZmlnIE1DQQogCWJvb2wKQEAgLTY4NSwxMCArNDI5LDEwIEBACiBjb25maWcgUENJCiAJYm9vbCAiUENJIHN1cHBvcnQiIGlmIDQweCB8fCBDUE0yIHx8IFBQQ184M3h4IHx8IFBQQ184NXh4IHx8IFBQQ184Nnh4IFwKIAkJfHwgUFBDX01QQzUyeHggfHwgKEVNQkVEREVEICYmIChQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUykpIFwKLQkJfHwgTVBDNzQ0OEhQQzIgfHwgUFBDX1BTMyB8fCBQUENfSE9MTFkKLQlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFBUFVTICYmICFQUENfODN4eCBcCisJCXx8IFBQQ19QUzMKKwlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFQUENfODN4eCBcCiAJCSYmICFQUENfODV4eCAmJiAhUFBDXzg2eHgKLQlkZWZhdWx0IFBDSV9QRVJNRURJQSBpZiAhNHh4ICYmICFDUE0yICYmICE4eHggJiYgQVBVUworCWRlZmF1bHQgUENJX1BFUk1FRElBIGlmICE0eHggJiYgIUNQTTIgJiYgITh4eAogCWRlZmF1bHQgUENJX1FTUEFOIGlmICE0eHggJiYgIUNQTTIgJiYgOHh4CiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJaGVscApAQCAtODk2LDggKzY0MCw4IEBACiBzb3VyY2UgImFyY2gvcG93ZXJwYy9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggZmJhZmQ5Ni4uMTg3YTM5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIENQUEZMQUdTX3ZtbGludXgubGRzCTo9IC1VcG93ZXJwYwogCi1CT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB6SW1hZ2UuZHRzIHpJbWFnZS5kdHNfaW5pdHJkIHVJbWFnZQorQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgdUltYWdlCiAKIFBIT05ZICs9ICQoQk9PVF9UQVJHRVRTKQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguYyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCmluZGV4IGQ1MTM3N2QuLjlmNjRlODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCkBAIC0zOCwzICszOCw0OCBAQAogCiAJZHRfZml4dXBfbWVtb3J5KDAsIG1lbXNpemUpOwogfQorCisjZGVmaW5lIFNQUk5fREJDUjAJCTB4MTM0CisjZGVmaW5lICAgREJDUjBfUlNUX1NZU1RFTQkweDMwMDAwMDAwCisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWFzbSB2b2xhdGlsZSAoCisJCSJtZnNwcgklMCwlMVxuIgorCQkib3JpcwklMCwlMCwlMkBoXG4iCisJCSJtdHNwcgklMSwlMCIKKwkJOiAiPSZyIih0bXApIDogImkiKFNQUk5fREJDUjApLCAiaSIoREJDUjBfUlNUX1NZU1RFTSkKKwkJKTsKKworfQorCisvKiBSZWFkIDR4eCBFQkMgYnVzIGJyaWRnZSByZWdpc3RlcnMgdG8gZ2V0IG1hcHBpbmdzIG9mIHRoZSBwZXJpcGhlcmFsCisgKiBiYW5rcyBpbnRvIHRoZSBPUEIgYWRkcmVzcyBzcGFjZSAqLwordm9pZCBpYm00eHhfZml4dXBfZWJjX3Jhbmdlcyhjb25zdCBjaGFyICplYmMpCit7CisJdm9pZCAqZGV2cDsKKwl1MzIgYnhjcjsKKwl1MzIgcmFuZ2VzW0VCQ19OVU1fQkFOS1MqNF07CisJdTMyICpwID0gcmFuZ2VzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVCQ19OVU1fQkFOS1M7IGkrKykgeworCQltdGRjcihEQ1JOX0VCQzBfQ0ZHQUREUiwgRUJDX0JYQ1IoaSkpOworCQlieGNyID0gbWZkY3IoRENSTl9FQkMwX0NGR0RBVEEpOworCisJCWlmICgoYnhjciAmIEVCQ19CWENSX0JVKSAhPSBFQkNfQlhDUl9CVV9PRkYpIHsKKwkJCSpwKysgPSBpOworCQkJKnArKyA9IDA7CisJCQkqcCsrID0gYnhjciAmIEVCQ19CWENSX0JBUzsKKwkJCSpwKysgPSBFQkNfQlhDUl9CQU5LX1NJWkUoYnhjcik7CisJCX0KKwl9CisKKwlkZXZwID0gZmluZGRldmljZShlYmMpOworCWlmICghIGRldnApCisJCWZhdGFsKCJDb3VsZG4ndCBsb2NhdGUgRUJDIG5vZGUgJXNcblxyIiwgZWJjKTsKKworCXNldHByb3AoZGV2cCwgInJhbmdlcyIsIHJhbmdlcywgKHAgLSByYW5nZXMpICogc2l6ZW9mKHUzMikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmggYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAppbmRleCA3YjEyOWFkLi41Nzc5ODJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaApAQCAtMTEsNiArMTEsOSBAQAogI2RlZmluZSBfUFBDX0JPT1RfNDRYX0hfCiAKIHZvaWQgaWJtNDR4X2ZpeHVwX21lbXNpemUodm9pZCk7Cit2b2lkIGlibTR4eF9maXh1cF9lYmNfcmFuZ2VzKGNvbnN0IGNoYXIgKmViYyk7CisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCk7CiB2b2lkIGVib255X2luaXQodm9pZCAqbWFjMCwgdm9pZCAqbWFjMSk7CiAKICNlbmRpZiAvKiBfUFBDX0JPT1RfNDRYX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGZmMjcwMTkuLjYxYTZmMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC00MywxMCArNDMsMTEgQEAKIAogc3JjLXdsaWIgOj0gc3RyaW5nLlMgY3J0MC5TIHN0ZGlvLmMgbWFpbi5jIGZsYXRkZXZ0cmVlLmMgZmxhdGRldnRyZWVfbWlzYy5jIFwKIAkJbnMxNjU1MC5jIHNlcmlhbC5jIHNpbXBsZV9hbGxvYy5jIGRpdjY0LlMgdXRpbC5TIFwKLQkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIFwKLQkJNDR4LmMgZWJvbnkuYyBtdjY0eDYwLmMgbXBzYy5jIG12NjR4NjBfaTJjLmMKKwkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIG9mbGliLmMgb2Zjb25zb2xlLmMgXAorCQk0NHguYyBlYm9ueS5jIG12NjR4NjAuYyBtcHNjLmMgbXY2NHg2MF9pMmMuYyBjdWJvb3QuYwogc3JjLXBsYXQgOj0gb2YuYyBjdWJvb3QtODN4eC5jIGN1Ym9vdC04NXh4LmMgaG9sbHkuYyBcCi0JCWN1Ym9vdC1lYm9ueS5jIHRyZWVib290LWVib255LmMgcHJwbWMyODAwLmMKKwkJY3Vib290LWVib255LmMgdHJlZWJvb3QtZWJvbnkuYyBwcnBtYzI4MDAuYyBcCisJCXBzMy1oZWFkLlMgcHMzLWh2Y2FsbC5TIHBzMy5jCiBzcmMtYm9vdCA6PSAkKHNyYy13bGliKSAkKHNyYy1wbGF0KSBlbXB0eS5jCiAKIHNyYy1ib290IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLWJvb3QpKQpAQCAtNzUsMTEgKzc2LDExIEBACiAkKG9iaikvZW1wdHkuYzoKIAlAdG91Y2ggJEAKIAotJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkczogJChvYmopLyU6ICQoc3JjdHJlZSkvJChzcmMpLyUuUworJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHM6ICQob2JqKS8lOiAkKHNyY3RyZWUpLyQoc3JjKS8lLlMKIAlAY3AgJDwgJEAKIAogY2xlYW4tZmlsZXMgOj0gJCh6bGliKSAkKHpsaWJoZWFkZXIpICQoemxpYmxpbnV4aGVhZGVyKSBcCi0JCWVtcHR5LmMgekltYWdlLmNvZmYubGRzIHpJbWFnZS5sZHMKKwkJZW1wdHkuYyB6SW1hZ2UgekltYWdlLmNvZmYubGRzIHpJbWFnZS5wczMubGRzIHpJbWFnZS5sZHMKIAogcXVpZXRfY21kX2Jvb3RjYyA9IEJPT1RDQyAgJEAKICAgICAgIGNtZF9ib290Y2MgPSAkKENST1NTMzJDQykgLVdwLC1NRCwkKGRlcGZpbGUpICQoQk9PVENGTEFHUykgLWMgLW8gJEAgJDwKQEAgLTEwMiw3ICsxMDMsNyBAQAogCiB0YXJnZXRzCQkrPSAkKHBhdHN1YnN0ICQob2JqKS8lLCUsJChvYmotYm9vdCkgd3JhcHBlci5hKQogZXh0cmEteQkJOj0gJChvYmopL3dyYXBwZXIuYSAkKG9iai1wbGF0KSAkKG9iaikvZW1wdHkubyBcCi0JCSAgICQob2JqKS96SW1hZ2UubGRzICQob2JqKS96SW1hZ2UuY29mZi5sZHMKKwkJICAgJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHMKIAogd3JhcHBlcgkJOj0kKHNyY3RyZWUpLyQoc3JjKS93cmFwcGVyCiB3cmFwcGVyYml0cwk6PSAkKGV4dHJhLXkpICQoYWRkcHJlZml4ICQob2JqKS8sYWRkbm90ZSBoYWNrLWNvZmYgbWt0cmVlKSBcCkBAIC0xMzIsNyArMTMzLDcgQEAKIGltYWdlLSQoQ09ORklHX1BQQ19DSFJQKQkJKz0gekltYWdlLmNocnAKIGltYWdlLSQoQ09ORklHX1BQQ19FRklLQSkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfUE1BQykJCSs9IHpJbWFnZS5wbWFjCi1pbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHktZWxmCitpbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHkKIGltYWdlLSQoQ09ORklHX1BQQ19QUlBNQzI4MDApCQkrPSB6SW1hZ2UucHJwbWMyODAwCiBpbWFnZS0kKENPTkZJR19QUENfSVNFUklFUykJCSs9IHpJbWFnZS5pc2VyaWVzCiBpbWFnZS0kKENPTkZJR19ERUZBVUxUX1VJTUFHRSkJCSs9IHVJbWFnZQpAQCAtMTU3LDU1ICsxNTgsNDMgQEAKIAogJChhZGRwcmVmaXggJChvYmopLywgJChpbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negogCi1kdHMtICA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHMlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0cy15IDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0cyUsICQoaW1hZ2UteSkpCi1kdHMteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHMteSkpCi10YXJnZXRzCSs9ICQoaW1hZ2UteSkgJChkdHMteSkKLQotZHRzX2luaXRyZC0gIDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0c19pbml0cmQlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0c19pbml0cmQteSA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHNfaW5pdHJkJSwgJChpbWFnZS15KSkKLWR0c19pbml0cmQteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHNfaW5pdHJkLXkpKQotdGFyZ2V0cwkrPSAkKGltYWdlLXkpICQoZHRzX2luaXRyZC15KQotCi0kKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negorIyBJZiBDT05GSUdfV0FOVF9ERVZJQ0VfVFJFRSBpcyBzZXQgYW5kIENPTkZJR19ERVZJQ0VfVFJFRSBpc24ndCBhbgorIyBlbXB0eSBzdHJpbmcsIGRlZmluZSAnZHRzJyB0byBiZSBwYXRoIHRvIHRoZSBkdHMKKyMgQ09ORklHX0RFVklDRV9UUkVFIHdpbGwgaGF2ZSAiIiBhcm91bmQgaXQsIG1ha2Ugc3VyZSB0byBzdHJpcCB0aGVtCitpZmVxICgkKENPTkZJR19XQU5UX0RFVklDRV9UUkVFKSx5KQoraWZuZXEgKCQoQ09ORklHX0RFVklDRV9UUkVFKSwiIikKK2R0cyA9ICQoaWYgJChzaGVsbCBlY2hvICQoQ09ORklHX0RFVklDRV9UUkVFKSB8IGdyZXAgJ14vJyksXAorCSwkKHNyY3RyZWUpLyQoc3JjKS9kdHMvKSQoQ09ORklHX0RFVklDRV9UUkVFOiIlIj0lKQorZW5kaWYKK2VuZGlmCiAKICMgRG9uJ3QgcHV0IHRoZSByYW1kaXNrIG9uIHRoZSBwYXR0ZXJuIHJ1bGU7IHdoZW4gaXRzIG1pc3NpbmcgbWFrZSB3aWxsIHRyeQogIyB0aGUgcGF0dGVybiBydWxlIHdpdGggbGVzcyBkZXBlbmRlbmNpZXMgdGhhdCBhbHNvIG1hdGNoZXMgKGV2ZW4gd2l0aCB0aGUKICMgaGFyZCBkZXBlbmRlbmN5IGxpc3RlZCkuCi0kKG9iaikvekltYWdlLmR0c19pbml0cmQuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0cykgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKKyQob2JqKS96SW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChkdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwkKGR0cyksLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQogCi0kKG9iaikvekltYWdlLmR0cy4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQorJChvYmopL3pJbWFnZS4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosJChkdHMpKQogCi0kKG9iaikvekltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQotCi0kKG9iaikvekltYWdlLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqKQorIyBUaGlzIGNhbm5vdCBiZSBpbiB0aGUgcm9vdCBvZiAkKHNyYykgYXMgdGhlIHpJbWFnZSBydWxlIGFsd2F5cyBhZGRzIGEgJChvYmopCisjIHByZWZpeAorJChvYmopL3ZtbGludXguc3RyaXA6IHZtbGludXgKKwkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCiAkKG9iaikvekltYWdlLmlzZXJpZXM6IHZtbGludXgKIAkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCi0kKG9iaikvekltYWdlLnBzMzogdm1saW51eAotCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vICRACiskKG9iaikvekltYWdlLnBzMzogdm1saW51eCAgJCh3cmFwcGVyKSAkKHdyYXBwZXJiaXRzKSAkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cworCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vIHZtbGludXguc3RyaXAKKwkkKGNhbGwgY21kLHdyYXAscHMzLCQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzLCwpCiAKLSQob2JqKS96SW1hZ2UuaW5pdHJkLnBzMzogdm1saW51eAotCUBlY2hvICIgIFdBUk5JTkcgekltYWdlLmluaXRyZC5wczMgbm90IHN1cHBvcnRlZCAoeWV0KSIKLQotJChvYmopL3pJbWFnZS5ob2xseS1lbGY6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLGhvbGx5LCQob2JqKS9kdHMvaG9sbHkuZHRzLCwpCi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLmhvbGx5LWVsZjogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKG9iaikvcmFtZGlzay5pbWFnZS5negotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsaG9sbHksJChvYmopL2R0cy9ob2xseS5kdHMsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQorJChvYmopL3pJbWFnZS5pbml0cmQucHMzOiB2bWxpbnV4ICAkKHdyYXBwZXIpICQod3JhcHBlcmJpdHMpICQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzICQob2JqKS9yYW1kaXNrLmltYWdlLmd6CisJJChjYWxsIGNtZCx3cmFwLHBzMywkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cywsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCiAKICQob2JqKS91SW1hZ2U6IHZtbGludXggJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHVib290KQogCi0jIENPTkZJR19ERVZJQ0VfVFJFRSB3aWxsIGhhdmUgIiIgYXJvdW5kIGl0LCBtYWtlIHN1cmUgdG8gc3RyaXAgdGhlbQotZHRzID0gJChpZiAkKHNoZWxsIGVjaG8gJChDT05GSUdfREVWSUNFX1RSRUUpIHwgZ3JlcCAnXi8nKSxcCi0JLCQoc3JjdHJlZSkvJChzcmMpL2R0cy8pJChDT05GSUdfREVWSUNFX1RSRUU6IiUiPSUpCi0KICQob2JqKS9jdUltYWdlLiU6IHZtbGludXggJChkdHMpICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCxjdWJvb3QtJCosJChkdHMpKQogCkBAIC0yMTUsMjIgKzIwNCwyMiBAQAogJChvYmopL3RyZWVJbWFnZS4lOiB2bWxpbnV4ICQoZHRzKSAkKHdyYXBwZXJiaXRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosJChkdHMpKQogCisjIElmIHRoZXJlIGlzbid0IGEgcGxhdGZvcm0gc2VsZWN0ZWQgdGhlbiBqdXN0IHN0cmlwIHRoZSB2bWxpbnV4LgoraWZlcSAoLCQoaW1hZ2UteSkpCitpbWFnZS15IDo9IHZtbGludXguc3RyaXAKK2VuZGlmCisKICQob2JqKS96SW1hZ2U6CQkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCUBybSAtZiAkQDsgbG4gJDwgJEAKICQob2JqKS96SW1hZ2UuaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGluaXRyZC15KSkKIAlAcm0gLWYgJEA7IGxuICQ8ICRACi0kKG9iaikvekltYWdlLmR0czoJJChhZGRwcmVmaXggJChvYmopLywgJChkdHMteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotJChvYmopL3pJbWFnZS5kdHNfaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotCiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAogCiAjIGFueXRoaW5nIG5vdCBpbiAkKHRhcmdldHMpCi1jbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSB6SW1hZ2UgekltYWdlLmluaXRyZCBjdUltYWdlLiogXAotCXRyZWVJbWFnZS4qIHpJbWFnZS5kdHMgekltYWdlLmR0c19pbml0cmQKK2NsZWFuLWZpbGVzICs9ICQoaW1hZ2UtKSAkKGluaXRyZC0pIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIGN1SW1hZ2UuKiB0cmVlSW1hZ2UuKiBcCisJb3RoZXJvcy5ibGQKIAogIyBjbGVhbiB1cCBmaWxlcyBjYWNoZWQgYnkgd3JhcHBlcgogY2xlYW4ta2VybmVsIDo9IHZtbGludXguc3RyaXAgdm1saW51eC5iaW4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODN4eC5jCmluZGV4IDlhZjU1NGUuLjI5NjAyNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYwpAQCAtMTIsMTIgKzEyLDEyIEBACiAKICNpbmNsdWRlICJvcHMuaCIKICNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgImN1Ym9vdC5oIgogCiAjZGVmaW5lIFRBUkdFVF84M3h4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKIGV4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKIAogc3RhdGljIHZvaWQgcGxhdGZvcm1fZml4dXBzKHZvaWQpCkBAIC01MiwxNiArNTIsNyBAQAogdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKIHsKLQl1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0gPSBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemU7Ci0JdW5zaWduZWQgbG9uZyBhdmFpbF9yYW0gPSBlbmRfb2ZfcmFtIC0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKLQotCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOwotCWxvYWRlcl9pbmZvLmluaXRyZF9hZGRyID0gcjQ7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IC0gcjQgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSAtIDEwMjQqMTAyNCwgMzIsIDY0KTsKKwlDVUJPT1RfSU5JVCgpOwogCWZ0X2luaXQoX2R0Yl9zdGFydCwgX2R0Yl9lbmQgLSBfZHRiX3N0YXJ0LCAzMik7CiAJc2VyaWFsX2NvbnNvbGVfaW5pdCgpOwogCXBsYXRmb3JtX29wcy5maXh1cHMgPSBwbGF0Zm9ybV9maXh1cHM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYwppbmRleCBlMjU2MDMxLi4xMGYwZjY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04NXh4LmMKQEAgLTEyLDEyICsxMiwxMiBAQAogCiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfODV4eAogI2luY2x1ZGUgInBwY2Jvb3QuaCIKIAogc3RhdGljIGJkX3QgYmQ7Ci1leHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciBfZHRiX3N0YXJ0W10sIF9kdGJfZW5kW107CiAKIHN0YXRpYyB2b2lkIHBsYXRmb3JtX2ZpeHVwcyh2b2lkKQpAQCAtNTMsMTYgKzUzLDcgQEAKIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCiB7Ci0JdW5zaWduZWQgbG9uZyBlbmRfb2ZfcmFtID0gYmQuYmlfbWVtc3RhcnQgKyBiZC5iaV9tZW1zaXplOwotCXVuc2lnbmVkIGxvbmcgYXZhaWxfcmFtID0gZW5kX29mX3JhbSAtICh1bnNpZ25lZCBsb25nKV9lbmQ7Ci0KLQltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKLQlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OwotCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSAtIHI0IDogMDsKLQlsb2FkZXJfaW5mby5jbWRsaW5lID0gKGNoYXIgKilyNjsKLQlsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiA9IHI3IC0gcjY7Ci0KLQlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBhdmFpbF9yYW0gLSAxMDI0KjEwMjQsIDMyLCA2NCk7CisJQ1VCT09UX0lOSVQoKTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwogCXNlcmlhbF9jb25zb2xlX2luaXQoKTsKIAlwbGF0Zm9ybV9vcHMuZml4dXBzID0gcGxhdGZvcm1fZml4dXBzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWVib255LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwppbmRleCA0NDY0YzVmLi5jNWYzN2NlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwpAQCAtMTUsMjggKzE1LDE2IEBACiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKICNpbmNsdWRlICI0NHguaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfNDR4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKLQotQlNTX1NUQUNLKDQwOTYpOwogCiB2b2lkIHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQogewotCXVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSA9IGJkLmJpX21lbXN0YXJ0ICsgYmQuYmlfbWVtc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOwotCi0JbWVtY3B5KCZiZCwgKGJkX3QgKilyMywgc2l6ZW9mKGJkKSk7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKLQlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSwgMzIsIDY0KTsKLQorCUNVQk9PVF9JTklUKCk7CiAJZWJvbnlfaW5pdCgmYmQuYmlfZW5ldGFkZHIsICZiZC5iaV9lbmV0MWFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc5NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvbXBhdGliaWxpdHkgZm9yIG9sZCAobm90IGRldmljZSB0cmVlIGF3YXJlKSBVLUJvb3QgdmVyc2lvbnMKKyAqCisgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgorICogQ29uc29saWRhdGVkIHVzaW5nIG1hY3JvcyBieSBEYXZpZCBHaWJzb24gPGRhdmlkQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisKKyNpbmNsdWRlICJwcGNib290LmgiCisKK2V4dGVybiBjaGFyIF9lbmRbXTsKK2V4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOworCisJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKKwlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgLSByNCA6IDA7CisJbG9hZGVyX2luZm8uY21kbGluZSA9IChjaGFyICopcjY7CisJbG9hZGVyX2luZm8uY21kbGluZV9sZW4gPSByNyAtIHI2OworCisJc2ltcGxlX2FsbG9jX2luaXQoX2VuZCwgYXZhaWxfcmFtIC0gMTAyNCoxMDI0LCAzMiwgNjQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmggYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJhYTdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfUFBDX0JPT1RfQ1VCT09UX0hfCisjZGVmaW5lIF9QUENfQk9PVF9DVUJPT1RfSF8KKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSk7CisKKyNkZWZpbmUgQ1VCT09UX0lOSVQoKSBcCisJZG8geyBcCisJCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOyBcCisJCWN1Ym9vdF9pbml0KHI0LCByNSwgcjYsIHI3LCBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemUpOyBcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9QUENfQk9PVF9DVUJPT1RfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKaW5kZXggODc3YmM5Ny4uMTRiNDRhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKQEAgLTI2LDYgKzI2LDQzIEBACiAjZGVmaW5lCQkJU0RSQU1fQ09ORklHX0JBTktfU0laRShyZWcpCVwKIAkoMHgwMDQwMDAwMCA8PCAoKHJlZyAmIFNEUkFNX0NPTkZJR19TSVpFX01BU0spID4+IDE3KSkKIAorLyogNDQwR1AgRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgKEVCQykgKi8KKyNkZWZpbmUgRENSTl9FQkMwX0NGR0FERFIJCQkJMHgwMTIKKyNkZWZpbmUgRENSTl9FQkMwX0NGR0RBVEEJCQkJMHgwMTMKKyNkZWZpbmUgICBFQkNfTlVNX0JBTktTCQkJCQkgIDgKKyNkZWZpbmUgICBFQkNfQjBDUgkJCQkJICAweDAwCisjZGVmaW5lICAgRUJDX0IxQ1IJCQkJCSAgMHgwMQorI2RlZmluZSAgIEVCQ19CMkNSCQkJCQkgIDB4MDIKKyNkZWZpbmUgICBFQkNfQjNDUgkJCQkJICAweDAzCisjZGVmaW5lICAgRUJDX0I0Q1IJCQkJCSAgMHgwNAorI2RlZmluZSAgIEVCQ19CNUNSCQkJCQkgIDB4MDUKKyNkZWZpbmUgICBFQkNfQjZDUgkJCQkJICAweDA2CisjZGVmaW5lICAgRUJDX0I3Q1IJCQkJCSAgMHgwNworI2RlZmluZSAgIEVCQ19CWENSKG4pCQkJCQkgIChuKQorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFTCQkJCSAgICAweGZmZjAwMDAwCisjZGVmaW5lCSAgICBFQkNfQlhDUl9CUwkJCQkgIAkgICAgMHgwMDBlMDAwMAorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFOS19TSVpFKHJlZykgXAorCSgweDEwMDAwMCA8PCAoKChyZWcpICYgRUJDX0JYQ1JfQlMpID4+IDE3KSkKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JVCQkJCSAgCSAgICAweDAwMDE4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX09GRgkJCSAgCSAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICAgICAgRUJDX0JYQ1JfQlVfUk8JCQkgIAkgICAgICAweDAwMDA4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX1dPCQkJICAJICAgICAgMHgwMDAxMDAwMAorI2RlZmluZQkgICAgICBFQkNfQlhDUl9CVV9SVwkJCSAgCSAgICAgIDB4MDAwMTgwMDAKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JXCQkJCSAgCSAgICAweDAwMDA2MDAwCisjZGVmaW5lICAgRUJDX0IwQVAJCQkJCSAgMHgxMAorI2RlZmluZSAgIEVCQ19CMUFQCQkJCQkgIDB4MTEKKyNkZWZpbmUgICBFQkNfQjJBUAkJCQkJICAweDEyCisjZGVmaW5lICAgRUJDX0IzQVAJCQkJCSAgMHgxMworI2RlZmluZSAgIEVCQ19CNEFQCQkJCQkgIDB4MTQKKyNkZWZpbmUgICBFQkNfQjVBUAkJCQkJICAweDE1CisjZGVmaW5lICAgRUJDX0I2QVAJCQkJCSAgMHgxNgorI2RlZmluZSAgIEVCQ19CN0FQCQkJCQkgIDB4MTcKKyNkZWZpbmUgICBFQkNfQlhBUChuKQkJCQkJICAoMHgxMCsobikpCisjZGVmaW5lICAgRUJDX0JFQVIJCQkJCSAgMHgyMAorI2RlZmluZSAgIEVCQ19CRVNSCQkJCQkgIDB4MjEKKyNkZWZpbmUgICBFQkNfQ0ZHCQkJCQkgIDB4MjMKKyNkZWZpbmUgICBFQkNfQ0lECQkJCQkgIDB4MjQKKwogLyogNDQwR1AgQ2xvY2ssIFBNLCBjaGlwIGNvbnRyb2wgKi8KICNkZWZpbmUgRENSTl9DUEMwX1NSCQkJCQkweDBiMAogI2RlZmluZSBEQ1JOX0NQQzBfRVIJCQkJCTB4MGIxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2Vib255LmR0cwppbmRleCAwZWMwMmY0Li5jNWY5OTYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9lYm9ueS5kdHMKQEAgLTMxLDggKzMxLDggQEAKIAkJCXJlZyA9IDwwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRmlsbGVkIGluIGJ5IHpJbWFnZQogCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OyAvLyBGaWxsZWQgaW4gYnkgekltYWdlCi0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CiAJCQlpLWNhY2hlLXNpemUgPSA8ODAwMD47IC8qIDMyIGtCICovCiAJCQlkLWNhY2hlLXNpemUgPSA8ODAwMD47IC8qIDMyIGtCICovCiAJCQlkY3ItY29udHJvbGxlcjsKQEAgLTEzNSwxMSArMTM1LDkgQEAKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZpbGxlZCBpbiBieSB6SW1hZ2UKLQkJCQlyYW5nZXMgPSA8MCAwMDAwMDAwMCBmZmYwMDAwMCAxMDAwMDAKLQkJCQkJICAxIDAwMDAwMDAwIDQ4MDAwMDAwIDEwMDAwMAotCQkJCQkgIDIgMDAwMDAwMDAgZmY4MDAwMDAgNDAwMDAwCi0JCQkJCSAgMyAwMDAwMDAwMCA0ODIwMDAwMCAxMDAwMDAKLQkJCQkJICA3IDAwMDAwMDAwIDQ4MzAwMDAwIDEwMDAwMD47CisJCQkJLy8gcmFuZ2VzIHByb3BlcnR5IGlzIHN1cHBsaWVkIGJ5IHpJbWFnZQorCQkJCS8vIGJhc2VkIG9uIGZpcm13YXJlJ3MgY29uZmlndXJhdGlvbiBvZiB0aGUKKwkJCQkvLyBFQkMgYnJpZGdlCiAJCQkJaW50ZXJydXB0cyA9IDw1IDQ+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cwppbmRleCAyNTQ0OTliLi44MGE0ZmFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob2xseS5kdHMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICAJdHNpMTA5QGMwMDAwMDAwIHsKIAkJZGV2aWNlX3R5cGUgPSAidHNpLWJyaWRnZSI7Ci0JCWNvbXBhdGlibGUgPSAidHNpLWJyaWRnZSI7CisJCWNvbXBhdGlibGUgPSAidHNpMTA5LWJyaWRnZSIsICJ0c2kxMDgtYnJpZGdlIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyYW5nZXMgPSA8MDAwMDAwMDAgYzAwMDAwMDAgMDAwMTAwMDA+OwpAQCAtNTQsNTIgKzU0LDU1IEBACiAKIAkJaTJjQDcwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKLQkJCWNvbXBhdGlibGUgID0gInRzaS1pMmMiOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWNvbXBhdGlibGUgID0gInRzaTEwOS1pMmMiLCAidHNpMTA4LWkyYyI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8ZSAyPjsKIAkJCXJlZyA9IDw3MDAwIDQwMD47CiAJCX07CiAKLQkJbWRpb0A2MDAwIHsKKwkJTURJTzogbWRpb0A2MDAwIHsKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktbWRpbyIsICJ0c2kxMDgtbWRpbyI7CisJCQlyZWcgPSA8NjAwMCA1MD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCi0JCQlQSFkxOiBldGhlcm5ldC1waHlANjAwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQljb21wYXRpYmxlID0gImJjbTU0eHgiOwotCQkJCXJlZyA9IDw2MDAwIDUwPjsKLQkJCQlwaHktaWQgPSA8MT47CisJCQlQSFkxOiBldGhlcm5ldC1waHlAMSB7CisJCQkJY29tcGF0aWJsZSA9ICJiY201NDYxYSI7CisJCQkJcmVnID0gPDE+OworCQkJCXR4Yy1yeGMtZGVsYXktZGlzYWJsZTsKIAkJCX07CiAKLQkJCVBIWTI6IGV0aGVybmV0LXBoeUA2NDAwIHsKLQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwotCQkJCWNvbXBhdGlibGUgPSAiYmNtNTR4eCI7Ci0JCQkJcmVnID0gPDYwMDAgNTA+OwotCQkJCXBoeS1pZCA9IDwyPjsKKwkJCVBIWTI6IGV0aGVybmV0LXBoeUAyIHsKKwkJCQljb21wYXRpYmxlID0gImJjbTU0NjFhIjsKKwkJCQlyZWcgPSA8Mj47CisJCQkJdHhjLXJ4Yy1kZWxheS1kaXNhYmxlOwogCQkJfTsKIAkJfTsKIAogCQlldGhlcm5ldEA2MjAwIHsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktZXRoZXJuZXQiLCAidHNpMTA4LWV0aGVybmV0IjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlyZWcgPSA8NjAwMCAyMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmUEhZMT47CiAJCX07CiAKIAkJZXRoZXJuZXRANjYwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA5LWV0aGVybmV0IiwgInRzaTEwOC1ldGhlcm5ldCI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcmVnID0gPDY0MDAgMjAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJaW50ZXJydXB0cyA9IDwxMSAyPjsKKwkJCW1kaW8taGFuZGxlID0gPCZNRElPPjsKIAkJCXBoeS1oYW5kbGUgPSA8JlBIWTI+OwogCQl9OwogCkBAIC0xMTAsNyArMTEzLDcgQEAKIAkJCXZpcnR1YWwtcmVnID0gPGMwMDA3ODA4PjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzRjlDNjAwMD47CiAJCQljdXJyZW50LXNwZWVkID0gPDFjMjAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8YyAyPjsKIAkJfTsKIApAQCAtMTIxLDcgKzEyNCw3IEBACiAJCQl2aXJ0dWFsLXJlZyA9IDxjMDAwN2MwOD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8M0Y5QzYwMDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDwxYzIwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPGQgMj47CiAJCX07CiAKQEAgLTEzNiw3ICsxMzksNyBAQAogCiAJCXBjaUAxMDAwIHsKIAkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQljb21wYXRpYmxlID0gInRzaTEwOSI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOS1wY2kiLCAidHNpMTA4LXBjaSI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKQEAgLTE1MCw3ICsxNTMsNyBAQAogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgNDAwMDAwMDAgNDAwMDAwMDAgMCAxMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCA3ZTAwMDAwMCAwIDAwMDEwMDAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw3ZjI4MTU0PjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8MTcgMj47CiAJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CiAJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCkBAIC0xODYsMTMgKzE4OSwxMiBAQAogIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKICAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKICAJCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJfTsKIAkJfTsKIAl9OwogCiAJY2hvc2VuIHsKIAkJbGludXgsc3Rkb3V0LXBhdGggPSAiL3RzaTEwOUBjMDAwMDAwMC9zZXJpYWxANzgwOCI7Ci0JCWJvb3RhcmdzID0gImNvbnNvbGU9dHR5UzAsMTE1MjAwIjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCmluZGV4IDc2NWMzMDYuLjBlM2QzMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwpAQCAtNDUsNyArNDUsNyBAQAogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCWRldmljZV90eXBlID0gInRzaS1icmlkZ2UiOworCQlkZXZpY2VfdHlwZSA9ICJ0c2kxMDgtYnJpZGdlIjsKIAkJcmFuZ2VzID0gPDAwMDAwMDAwIGMwMDAwMDAwIDAwMDEwMDAwPjsKIAkJcmVnID0gPGMwMDAwMDAwIDAwMDEwMDAwPjsKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKQEAgLTU1LDI3ICs1NSwyNiBAQAogCQkJaW50ZXJydXB0cyA9IDxFIDA+OwogCQkJcmVnID0gPDcwMDAgNDAwPjsKIAkJCWRldmljZV90eXBlID0gImkyYyI7Ci0JCQljb21wYXRpYmxlICA9ICJ0c2ktaTJjIjsKKwkJCWNvbXBhdGlibGUgID0gInRzaTEwOC1pMmMiOwogCQl9OwogCi0JCW1kaW9ANjAwMCB7CisJCU1ESU86IG1kaW9ANjAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJtZGlvIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LW1kaW8iOworCQkJcmVnID0gPDYwMDAgNTA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAotCQkJcGh5ODogZXRoZXJuZXQtcGh5QDYwMDAgeworCQkJcGh5ODogZXRoZXJuZXQtcGh5QDggewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDg+OwotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJcmVnID0gPDg+OwogCQkJfTsKIAotCQkJcGh5OTogZXRoZXJuZXQtcGh5QDY0MDAgeworCQkJcGh5OTogZXRoZXJuZXQtcGh5QDkgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDk+OwotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJcmVnID0gPDk+OwogCQkJfTsKIAogCQl9OwpAQCAtODMsMTIgKzgyLDEyIEBACiAJCWV0aGVybmV0QDYyMDAgewogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gIlRTSS1FVEgiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDgtZXRoZXJuZXQiOwogCQkJcmVnID0gPDYwMDAgMjAwPjsKIAkJCWFkZHJlc3MgPSBbIDAwIDA2IEQyIDAwIDAwIDAxIF07CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQltZGlvLWhhbmRsZSA9IDwmTURJTz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHk4PjsKIAkJfTsKIApAQCAtOTYsMTIgKzk1LDEyIEBACiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJUU0ktRVRIIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LWV0aGVybmV0IjsKIAkJCXJlZyA9IDw2NDAwIDIwMD47CiAJCQlhZGRyZXNzID0gWyAwMCAwNiBEMiAwMCAwMCAwMiBdOwogCQkJaW50ZXJydXB0cyA9IDwxMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5OT47CiAJCX07CiAKQEAgLTEzNSw3ICsxMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAJYmlnLWVuZGlhbjsKIAkJfTsKIAkJcGNpQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJ0c2kxMHgiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDgtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMKaW5kZXggNDIzZWVkYy4uMTkzNGI4MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MjcyYWRzLmR0cwpAQCAtMTQsMTIgKzE0LDEwIEBACiAgICAgICAgY29tcGF0aWJsZSA9ICJNUEM4MjYwQURTIjsKICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKLSAgICAgICBsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKICAgICAgICBjcHVzIHsKICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47Ci0gICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKICAgICAgICAgICAgICAgIFBvd2VyUEMsODI3MkAwIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUgPSAiY3B1IjsKQEAgLTMyLDEyICszMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICBidXMtZnJlcXVlbmN5ID0gPDA+OwogICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1mcmVxdWVuY3kgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgIDMyLWJpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyMDE+OwogICAgICAgICAgICAgICAgfTsKICAgICAgICB9OwogCi0gICAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXJAZjgyMDAwMDAgewotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDxmODIwMDAwMD47CisJCXBjaV9waWM6IGludGVycnVwdC1jb250cm9sbGVyQGY4MjAwMDAwIHsKICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDA+OwogICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwyPjsKICAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyOwpAQCAtNDcsMTUgKzQzLDEzIEBACiAgICAgICAgfTsKICAgICAgICBtZW1vcnkgewogICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLSAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MzAwPjsKICAgICAgICAgICAgICAgIHJlZyA9IDwwMDAwMDAwMCA0MDAwMDAwIGY0NTAwMDAwIDAwMDAwMDIwPjsKICAgICAgICB9OwogCiAgICAgICAgY2hvc2VuIHsKICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hvc2VuIjsKICAgICAgICAgICAgICAgIGxpbnV4LHBsYXRmb3JtID0gPDA+OwotICAgICAgICAgICAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXIgPSA8MTBjMDA+OwotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDw0MDA+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlciA9IDwmQ3BtX3BpYz47CiAgICAgICAgfTsKIAogICAgICAgIHNvYzgyNzJAZjAwMDAwMDAgewpAQCAtNzAsMjAgKzY0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gIm1kaW8iOwogICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gImZzX2VuZXQiOwogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MCAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyNDUyMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJuZXQtcGh5QDAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjQ1MjAwMD47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQlwaHkwOmV0aGVybmV0LXBoeUAwIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDE3IDQ+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYW5nID0gWyAxMiAxMiAxMyAwMiAwMiAwMSBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0LXBoeUAxIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDI0NTIwMDE+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJcGh5MTpldGhlcm5ldC1waHlAMSB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNyA0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYW5nID0gWyAxMiAxMiAxMyAwMiAwMiAwMSBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwzPjsKQEAgLTEwMSw4ICs5Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMTMwMCAyMCA4NDAwIDEwMCAxMTM4MCAzMD47CiAgICAgICAgICAgICAgICAgICAgICAgIG1hYy1hZGRyZXNzID0gWyAwMCAxMSAyRiA5OSA0MyA1NCBdOwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDIwIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5LWhhbmRsZSA9IDwyNDUyMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5MD47CiAgICAgICAgICAgICAgICAgICAgICAgIHJ4LWNsb2NrID0gPDEzPjsKICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MTI+OwogICAgICAgICAgICAgICAgfTsKQEAgLTExNSwxNCArMTA2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMTMyMCAyMCA4NTAwIDEwMCAxMTNiMCAzMD47CiAgICAgICAgICAgICAgICAgICAgICAgIG1hYy1hZGRyZXNzID0gWyAwMCAxMSAyRiA5OSA0NCA1NCBdOwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDIxIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5LWhhbmRsZSA9IDwyNDUyMDAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5MT47CiAgICAgICAgICAgICAgICAgICAgICAgIHJ4LWNsb2NrID0gPDE3PjsKICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MTg+OwogICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgY3BtQGYwMDAwMDAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDxmMDAwMDAwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTE0Miw3ICsxMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMWEwMCAyMCA4MDAwIDEwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC1zcGVlZCA9IDwxYzIwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyOCAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1zZXR1cCA9IDwwIDAwZmZmZmZmPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC1jbG9jayA9IDwxPjsKQEAgLTE1NiwxNSArMTQ2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDExYTYwIDIwIDgzMDAgMTAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LXNwZWVkID0gPDFjMjAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDJiIDI+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLXNldHVwID0gPDFiIGZmZmZmZjAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC1jbG9jayA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyQDEwYzAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwxMGMwMD47CisJCQljcG1fcGljOmludGVycnVwdC1jb250cm9sbGVyQDEwYzAwIHsKICAgICAgICAgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyOwpAQCAtMTc0LDcgKzE2Myw2IEBACiAJCSAgICAgICBjb21wYXRpYmxlID0gIkNQTTIiOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHBjaUAwNTAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwwNTAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDM+OwpAQCAtMjAyLDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMiBmODIwMDAwMCA0MyA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMyBmODIwMDAwMCA0MCA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgNCBmODIwMDAwMCA0MSA4PjsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNCA4PjsKICAgICAgICAgICAgICAgICAgICAgICAgYnVzLXJhbmdlID0gPDAgMD47CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgNDAwMDAwMDAKQEAgLTIxNiw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInRhbGl0b3MiOwogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MzAwMDAgMTAwMDA+OwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPGIgMj47Ci0gICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgIG51bS1jaGFubmVscyA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC1maWZvLWxlbiA9IDwxOD47CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMtdW5pdHMtbWFzayA9IDwwMDAwMDA3ZT47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cwppbmRleCAxMTJkZDUxLi40ZmMwYzRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKQEAgLTI3Miw3ICsyNzIsMTMgQEAKIAkJCXJlZyA9IDwyMjAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZxZWljID47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgMDAgMjMgMjMgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDE5PjsKIAkJCXR4LWNsb2NrID0gPDFhPjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkzID47CkBAIC0yODcsNyArMjkzLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMz47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwxNz47CiAJCQl0eC1jbG9jayA9IDwxOD47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5NCA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKaW5kZXggYmU0YzM1Ny4uNDQ3YzAzZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCkBAIC0yMzEsNyArMjMxLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwNCA5ZiBlZiAwMyAwMiBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MjA+OwogCQkJdHgtY2xvY2sgPSA8MTM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MDA+OwpAQCAtMjQ2LDcgKzI1MiwxMyBAQAogCQkJcmVnID0gPDIyMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgZWYgMDMgMDEgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDE5PjsKIAkJCXR4LWNsb2NrID0gPDFhPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA0PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKaW5kZXggZGIwZDAwMy4uYWU5YmNhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKQEAgLTEzMSw2ICsxMzEsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIwIDggMjEgOCAyMiA4PjsKQEAgLTE0NSw2ICsxNTAsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIzIDggMjQgOCAyNSA4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCmluZGV4IGRmNzczZmEuLjMxMGU4NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwpAQCAtMTM2LDYgKzEzNiwxMSBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjAgOCAyMSA4IDIyIDg+OwpAQCAtMTUwLDYgKzE1NSwxMSBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjMgOCAyNCA4IDI1IDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKaW5kZXggMzhjODU5NC4uMWU5MTRmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCkBAIC0zMDEsNyArMzAxLDEzIEBACiAJCQlyZWcgPSA8MjAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIDAwIDIzIDIzIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE5PjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkwID47CkBAIC0zMTcsNyArMzIzLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE0PjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkxID47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKaW5kZXggZDkxZTgxYy4uMzY0YTk2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8NDAwMDA+OwkvLyBMMiwgMjU2SwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDE5ICs4MSwxOSBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzcgMT47CisJCQkJaW50ZXJydXB0cyA9IDw3IDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwNiw5ICsxMDYsMTQgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMjAsOSArMTI1LDE0IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlhZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAxIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCX07CkBAIC0xMzQsOSArMTQ0LDE0IEBACiAJCQltb2RlbCA9ICJGRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAyIF07Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDIgXTsKLQkJCWludGVycnVwdHMgPSA8MTkgMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyOSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNDYsNyArMTYxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTU1LDcgKzE3MCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIAkJcGNpQDgwMDAgewpAQCAtMTYzLDc4ICsxNzgsNzggQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDAyICovCi0JCQkJMTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMTAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJMTAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJMTAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkxMDAwIDAgMCAyICZtcGljIDIgMQorCQkJCTEwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMTAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCS8qIElEU0VMIDB4MDMgKi8KLQkJCQkxODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkxODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkxODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkxODAwIDAgMCAxICZtcGljIDQgMQorCQkJCTE4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkxODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgwNCAqLwotCQkJCTIwMDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCTIwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCTIwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTIwMDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCTIwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMjAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkyMDAwIDAgMCAzICZtcGljIDEgMQorCQkJCTIwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBJRFNFTCAweDA1ICovCi0JCQkJMjgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJMjgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMjgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJMjgwMCAwIDAgNCAmbXBpYyAzMSAxCisJCQkJMjgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkyODAwIDAgMCAyICZtcGljIDMgMQorCQkJCTI4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJMjgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MGMgKi8KLQkJCQk2MDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQk2MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQk2MDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQk2MDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQk2MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCTYwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJNjAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQk2MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJLyogSURTRUwgMHgwZCAqLwotCQkJCTY4MDAgMCAwIDEgJm1waWMgMzQgMQotCQkJCTY4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTY4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTY4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTY4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJNjgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQk2ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTY4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDBlICovCi0JCQkJNzAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJNzAwMCAwIDAgMiAmbXBpYyAzNCAxCi0JCQkJNzAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJNzAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJNzAwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQk3MDAwIDAgMCAyICZtcGljIDQgMQorCQkJCTcwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJNzAwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIElEU0VMIDB4MGYgKi8KLQkJCQk3ODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQk3ODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQk3ODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQk3ODAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQk3ODAwIDAgMCAxICZtcGljIDIgMQorCQkJCTc4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJNzgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQk3ODAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxMiAqLwotCQkJCTkwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTkwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTkwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCTkwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCTkwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJOTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQk5MDAwIDAgMCAzICZtcGljIDMgMQorCQkJCTkwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkvKiBJRFNFTCAweDEzICovCi0JCQkJOTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJOTgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJOTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJOTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJOTgwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQk5ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTk4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJOTgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTQgKi8KLQkJCQlhMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQlhMDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQlhMDAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQlhMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQlhMDAwIDAgMCAxICZtcGljIDMgMQorCQkJCWEwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJYTAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQlhMDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJLyogSURTRUwgMHgxNSAqLwotCQkJCWE4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCWE4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCWE4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCWE4MDAgMCAwIDQgJm1waWMgMzEgMT47CisJCQkJYTgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQlhODAwIDAgMCAyICZtcGljIDMgMQorCQkJCWE4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJYTgwMCAwIDAgNCAmbXBpYyAxIDE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDA4IDI+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAwMTAwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cwppbmRleCA0ZjJjM2FmLi4wNzAyMDZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCkBAIC01Miw3ICs1Miw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTQxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODEsMTMgKzgxLDEzIEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMDAsOCArMTAwLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMTMsOCArMTEzLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNDIsNDkgKzE0Miw0OSBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTAgKi8KLQkJCQkwODAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDg4MDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDg4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4ODAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKFNsb3QgMikgKi8KLQkJCQkwOTgwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTA5ODAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkwOTgwMCAwIDAgNCAmbXBpYyAzMCAxCisJCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCiAKIAkJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCi0JCQkJMGEwMDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkwYTAwMCAwIDAgMyAmbXBpYyAzMCAxCi0JCQkJMGEwMDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxNSAoU2xvdCA0KSAqLwotCQkJCTBhODAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAzMCAxCi0JCQkJMGE4MDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTBhODAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKKwkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIEJ1cyAxIChUdW5kcmEgQnJpZGdlKSAqLwogCQkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCi0JCQkJMTkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTkwMDAgMCAwIDQgJm1waWMgMzMgMT47CisJCQkJMTkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMTkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTkwMDAgMCAwIDQgJm1waWMgMyAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CkBAIC0yMTYsMTIgKzIxNiwxMiBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDNiIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgYiAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOSAyPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCmluZGV4IDMwMzM1OTkuLjgyODU5MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCkBAIC01Miw3ICs1Miw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTQ0LW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODEsMTMgKzgxLDEzIEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8M2EgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDNhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTExNCw3ICsxMTQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxmIDIgMTAgMiAxMSAyPjsKKwkJCWludGVycnVwdHMgPSA8MWYgMiAyMCAyIDIxIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCmluZGV4IGFkOTYzODEuLjlkMGI4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDgwMDAwPjsJLy8gTDIsIDUxMksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwyNSArODEsMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTEyLDggKzExMiw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTEyNSw4ICsxMjUsOCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEzOSw4ICsxMzksOCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMiBdOwotCQkJaW50ZXJydXB0cyA9IDxmIDIgMTAgMiAxMSAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQl9OwpAQCAtMTUyLDggKzE1Miw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI3MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAzIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDE1IDIgMTYgMiAxNyAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyNSAyIDI2IDIgMjcgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTM+OwogCQl9OwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ1MDAgMTAwPjsgCS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE3Myw1OCArMTczLDY0IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIAorCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIHJlZworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1ndXRzIjsKKwkJCXJlZyA9IDxlMDAwMCAxMDAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCX07CisKIAkJcGNpMTogcGNpQDgwMDAgewogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDFmODAwIDAgMCA3PjsKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMSAqLwotCQkJCTA4ODAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDg4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKFNsb3QgMSkgKi8KLQkJCQkwOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDkwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTA5ODAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMzAgMQorCQkJCTA5ODAwIDAgMCAxICZtcGljIDEgMQorCQkJCTA5ODAwIDAgMCAyICZtcGljIDIgMQorCQkJCTA5ODAwIDAgMCAzICZtcGljIDMgMQorCQkJCTA5ODAwIDAgMCA0ICZtcGljIDAgMQogCiAJCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMGEwMDAgMCAwIDMgJm1waWMgMzAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMGE4MDAgMCAwIDIgJm1waWMgMzAgMQotCQkJCTBhODAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMCAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KIAkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkxOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMzIDE+OworCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpAQCAtMjU2LDEyICsyNjIsMTIgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzYiAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIGIgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDkgMj47CisJCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBhMDAwMDAwMCBhMDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCmluZGV4IDk1MWVkOTIuLjE3ZTQ1ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwxMyArODEsMTMgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMCw4ICsxMDAsOCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDBkIDIgMGUgMiAxMiAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTEzLDggKzExMyw4IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCX07CkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTQyLDQ5ICsxNDIsNDkgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMSAqLwotCQkJCTA4ODAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDg4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKFNsb3QgMSkgKi8KLQkJCQkwOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDkwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTA5ODAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMzAgMQorCQkJCTA5ODAwIDAgMCAxICZtcGljIDEgMQorCQkJCTA5ODAwIDAgMCAyICZtcGljIDIgMQorCQkJCTA5ODAwIDAgMCAzICZtcGljIDMgMQorCQkJCTA5ODAwIDAgMCA0ICZtcGljIDAgMQogCiAJCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMGEwMDAgMCAwIDMgJm1waWMgMzAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMGE4MDAgMCAwIDIgJm1waWMgMzAgMQotCQkJCTBhODAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMCAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KIAkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkxOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMzIDE+OworCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpAQCAtMjE2LDEyICsyMTYsMTIgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzYiAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIGIgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDkgMj47CisJCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBhMDAwMDAwMCBhMDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCmluZGV4IDgwNjgyMTUuLjIxY2NhYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSw3ICs2MSw3IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJbWRpb0AyNDUyMCB7CkBAIC03MiwyNSArNzIsMjUgQEAKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMT47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDcgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzcgMT47CisJCQkJaW50ZXJydXB0cyA9IDw3IDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMSw4ICsxMDEsMTQgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAwIEZEIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTE0LDggKzEyMCwxNCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEzMiw3OSArMTQ0LDc5IEBACiAJCQlpbnRlcnJ1cHQtbWFwID0gPAogCiAJCQkJCS8qIElEU0VMIDB4MiAqLwotCQkJCQkgMTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSAxMDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDEwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgMTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSAxMDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgMTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDEwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSAxMDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDB4MyAqLwotCQkJCQkgMTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJCSAxODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkJIDE4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCQkgMTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJCSAxODAwIDAgMCAxICZtcGljIDQgMQorCQkJCQkgMTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkJIDE4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCSAxODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJCS8qIElEU0VMIDB4NCAqLwotCQkJCQkgMjAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJCSAyMDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQkJIDIwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCQkgMjAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJCSAyMDAwIDAgMCAxICZtcGljIDMgMQorCQkJCQkgMjAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkJIDIwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJCSAyMDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJCS8qIElEU0VMIDB4NSAgKi8KLQkJCQkJIDI4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgMjgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSAyODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIDI4MDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCQkgMjgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkJIDI4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJCSAyODAwIDAgMCAzICZtcGljIDQgMQorCQkJCQkgMjgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCQkvKiBJRFNFTCAxMiAqLwotCQkJCQkgNjAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSA2MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDYwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgNjAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSA2MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgNjAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDYwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSA2MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDEzICovCi0JCQkJCSA2ODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkJIDY4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCQkgNjgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJCSA2ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkJIDY4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJCSA2ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCQkgNjgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkJIDY4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkJLyogSURTRUwgMTQqLwotCQkJCQkgNzAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJCSA3MDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQkJIDcwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCQkgNzAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJCSA3MDAwIDAgMCAxICZtcGljIDMgMQorCQkJCQkgNzAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkJIDcwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJCSA3MDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJCS8qIElEU0VMIDE1ICovCi0JCQkJCSA3ODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkJIDc4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCQkgNzgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJCSA3ODAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkJIDc4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJCSA3ODAwIDAgMCAyICZtcGljIDMgMQorCQkJCQkgNzgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQkJIDc4MDAgMCAwIDQgJm1waWMgMSAxCiAKIAkJCQkJLyogSURTRUwgMTggKi8KLQkJCQkJIDkwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCQkgOTAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJCSA5MDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkJIDkwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCQkgOTAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkJIDkwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJCSA5MDAwIDAgMCAzICZtcGljIDMgMQorCQkJCQkgOTAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCQkvKiBJRFNFTCAxOSAqLwotCQkJCQkgOTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJCSA5ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkJIDk4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCQkgOTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJCSA5ODAwIDAgMCAxICZtcGljIDQgMQorCQkJCQkgOTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkJIDk4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCSA5ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJCS8qIElEU0VMIDIwICovCi0JCQkJCSBhMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkJIGEwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCQkgYTAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJCSBhMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkJIGEwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJCSBhMDAwIDAgMCAyICZtcGljIDQgMQorCQkJCQkgYTAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkJIGEwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkJLyogSURTRUwgMjEgKi8KLQkJCQkJIGE4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgYTgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSBhODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIGE4MDAgMCAwIDQgJm1waWMgMzEgMT47CisJCQkJCSBhODAwIDAgMCAxICZtcGljIDIgMQorCQkJCQkgYTgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkJIGE4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJCSBhODAwIDAgMCA0ICZtcGljIDEgMT47CiAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDw4IDA+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAxMDAwMDAwPjsKQEAgLTIzNCw3ICsyNDYsNyBAQAogCQkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDwxZSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDJlIDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCXJlZyA9IDw5MGMwMCA4MD47CiAJCQkJYnVpbHQtaW47CkBAIC0yNzUsNyArMjg3LDEzIEBACiAJCQkJbW9kZWwgPSAiRkNDIjsKIAkJCQlkZXZpY2UtaWQgPSA8Mj47CiAJCQkJcmVnID0gPDkxMzIwIDIwIDg4NTAwIDEwMCA5MTNhMCAzMD47Ci0JCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAyIEZEIF07CisJCQkJLyoKKwkJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJCSAqLworCQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJCWNsb2NrLXNldHVwID0gPGZmMDBmZmZmIDI1MDAwMD47CiAJCQkJcngtY2xvY2sgPSA8MTU+OwogCQkJCXR4LWNsb2NrID0gPDE2PjsKQEAgLTI5MCw3ICszMDgsMTMgQEAKIAkJCQltb2RlbCA9ICJGQ0MiOwogCQkJCWRldmljZS1pZCA9IDwzPjsKIAkJCQlyZWcgPSA8OTEzNDAgMjAgODg2MDAgMTAwIDkxM2QwIDMwPjsKLQkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKKwkJCQkvKgorCQkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkJICovCisJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQkJY2xvY2stc2V0dXAgPSA8ZmZmZjAwZmYgMzcwMD47CiAJCQkJcngtY2xvY2sgPSA8MTc+OwogCQkJCXR4LWNsb2NrID0gPDE4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cwppbmRleCBhMTIzZWM5Li42YmIxOGYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCkBAIC02MSw3ICs2MSw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTY4LW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNzAsMTQgKzcwLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw4MDAwMD47CS8vIEwyLCA1MTJLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODYsNyArODYsNyBAQAogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzEwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtOTksMjUgKzk5LDI1IEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEzMCw4ICsxMzAsMTQgQEAKIAkJCW1vZGVsID0gImVUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisgCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQl9OwpAQCAtMTQzLDggKzE0OSwxNCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKyAJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNTQsNyArMTY2LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTYzLDcgKzE3NSw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE3Miw3ICsxODQsNyBAQAogCQkJbW9kZWwgPSAiU0VDMiI7CiAJCQljb21wYXRpYmxlID0gInRhbGl0b3MiOwogCQkJcmVnID0gPDMwMDAwIGYwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxZCAyPjsKKwkJCWludGVycnVwdHMgPSA8MmQgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCW51bS1jaGFubmVscyA9IDw0PjsKIAkJCWNoYW5uZWwtZmlmby1sZW4gPSA8MTg+OwpAQCAtMzAwLDcgKzMxMiwxMyBAQAogCQkJcmVnID0gPDIwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgMDAgMjMgMjMgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDA+OwogCQkJdHgtY2xvY2sgPSA8MTk+OwogCQkJcGh5LWhhbmRsZSA9IDwmcWVfcGh5MD47CkBAIC0zMTYsNyArMzM0LDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAxMSAyMiAzMyA0NCA1NSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MD47CiAJCQl0eC1jbG9jayA9IDwxND47CiAJCQlwaHktaGFuZGxlID0gPCZxZV9waHkxPjsKQEAgLTMzNSwyNSArMzU5LDI1IEBACiAJCQkgKiBnaWFuZmFyJ3MgTURJTyBidXMgKi8KIAkJCXFlX3BoeTA6IGV0aGVybmV0LXBoeUAwMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5MTogZXRoZXJuZXQtcGh5QDAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHkyOiBldGhlcm5ldC1waHlAMDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDE+OwogCQkJCXJlZyA9IDwyPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTM6IGV0aGVybmV0LXBoeUAwMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMiAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMzY3LDcgKzM5MSw3IEBACiAJCQlyZWcgPSA8ODAgODA+OwogCQkJYnVpbHQtaW47CiAJCQliaWctZW5kaWFuOwotCQkJaW50ZXJydXB0cyA9IDwxZSAyIDFlIDI+OyAvL2hpZ2g6MzAgbG93OjMwCisJCQlpbnRlcnJ1cHRzID0gPDJlIDIgMmUgMj47IC8vaGlnaDozMCBsb3c6MzAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCmluZGV4IDI2MGIyNjQuLmRiNTZhMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCkBAIC01Niw4ICs1NiwxMiBAQAogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJcmFuZ2VzID0gPDAgZjgwMDAwMDAgMDAxMDAwMDA+OwotCQlyZWcgPSA8ZjgwMDAwMDAgMDAxMDAwMDA+OwkvLyBDQ1NSQkFSIDFNCisJCXJhbmdlcyA9IDwwMDAwMTAwMCBmODAwMTAwMCAwMDBmZjAwMAorCQkJICA4MDAwMDAwMCA4MDAwMDAwMCAyMDAwMDAwMAorCQkJICBlMjAwMDAwMCBlMjAwMDAwMCAwMDEwMDAwMAorCQkJICBhMDAwMDAwMCBhMDAwMDAwMCAyMDAwMDAwMAorCQkJICBlMzAwMDAwMCBlMzAwMDAwMCAwMDEwMDAwMD47CisJCXJlZyA9IDxmODAwMDAwMCAwMDAwMTAwMD47CS8vIENDU1JCQVIKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKIAogCQlpMmNAMzAwMCB7CkBAIC04NiwyNSArOTAsMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NGEgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDRhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTE3LDcgKzEyMSwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CkBAIC0xMzAsNyArMTQwLDEzIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKQEAgLTE0Myw3ICsxNTksMTMgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCAwMiBGRCBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwxRiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwpAQCAtMTU2LDcgKzE3OCwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI3MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDAzIEZEIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDI1IDIgMjYgMiAyNyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CkBAIC0xODYsNyArMjE0LDcgQEAKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODAwMCAxMDAwPjsKLQkJCWJ1cy1yYW5nZSA9IDwwIGZlPjsKKwkJCWJ1cy1yYW5nZSA9IDwwIGZmPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MWZjYTA1NT47CkBAIC0yODUsMTcgKzMxMyw4NCBAQAogCQkJCWY4MDAgMCAwIDMgJmk4MjU5IDAgMAogCQkJCWY4MDAgMCAwIDQgJmk4MjU5IDAgMAogCQkJCT47Ci0JCQlpODI1OTogaTgyNTlANGQwIHsKLQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJYnVpbHQtaW47Ci0JCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7Ci0gICAgICAgICAgICAgICAgCSAgICAgICAgYmlnLWVuZGlhbjsKLQkJCQlpbnRlcnJ1cHRzID0gPDQ5IDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdWxpMTU3NUAwIHsKKwkJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkgIDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJICAwIDIwMDAwMDAwCisJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJICAwIDAwMTAwMDAwPjsKKworCQkJCXBjaV9icmlkZ2VAMCB7CisJCQkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwCisJCQkJCQkgIDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJCSAgMCAyMDAwMDAwMAorCQkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJCSAgMCAwMDEwMDAwMD47CisKKwkJCQkJaXNhQDFlIHsKKwkJCQkJCWRldmljZV90eXBlID0gImlzYSI7CisJCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJCQkJCXJlZyA9IDxmMDAwIDAgMCAwIDA+OworCQkJCQkJcmFuZ2VzID0gPDEgMCAwMTAwMDAwMCAwIDAKKwkJCQkJCQkgIDAwMDAxMDAwPjsKKwkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKKworCQkJCQkJaTgyNTk6IGludGVycnVwdC1jb250cm9sbGVyQDIwIHsKKwkJCQkJCQlyZWcgPSA8MSAyMCAyCisJCQkJCQkJICAgICAgIDEgYTAgMgorCQkJCQkJCSAgICAgICAxIDRkMCAyPjsKKwkJCQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOworCQkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJCQkJYnVpbHQtaW47CisJCQkJCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7CisJCQkJCQkJaW50ZXJydXB0cyA9IDw5IDI+OworCQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJCQk8Jm1waWM+OworCQkJCQkJfTsKKworCQkJCQkJaTgwNDJANjAgeworCQkJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJCXJlZyA9IDwxIDYwIDEgMSA2NCAxPjsKKwkJCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyBjIDM+OworCQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJCQk8Jmk4MjU5PjsKKworCQkJCQkJCWtleWJvYXJkQDAgeworCQkJCQkJCQlyZWcgPSA8MD47CisJCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLDMwMyI7CisJCQkJCQkJfTsKKworCQkJCQkJCW1vdXNlQDEgeworCQkJCQkJCQlyZWcgPSA8MT47CisJCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGYwMyI7CisJCQkJCQkJfTsKKwkJCQkJCX07CisKKwkJCQkJCXJ0Y0A3MCB7CisJCQkJCQkJY29tcGF0aWJsZSA9CisJCQkJCQkJCSJwbnBQTlAsYjAwIjsKKwkJCQkJCQlyZWcgPSA8MSA3MCAyPjsKKwkJCQkJCX07CisKKwkJCQkJCWdwaW9ANDAwIHsKKwkJCQkJCQlyZWcgPSA8MSA0MDAgODA+OworCQkJCQkJfTsKKwkJCQkJfTsKKwkJCQl9OwogCQkJfTsKIAogCQl9OwpAQCAtMzE2LDEwICs0MTEsMTAgQEAKIAkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKIAkJCWludGVycnVwdC1tYXAgPSA8CiAJCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0NCAxCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyA0NSAxCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyA0NiAxCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyA0NyAxCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMQorCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEKIAkJCQk+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY2YWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCmluZGV4IGMwZDA2ZmQuLmU1ZTc3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCkBAIC0xNSwxMiArMTUsMTAgQEAKIAljb21wYXRpYmxlID0gIm1wYzh4eCI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47Ci0JbGludXgscGhhbmRsZSA9IDwxMDA+OwogCiAJY3B1cyB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJbGludXgscGhhbmRsZSA9IDwyMDA+OwogCiAJCVBvd2VyUEMsODY2QDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKQEAgLTM0LDE0ICszMiwxMiBAQAogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJMzItYml0OwogCQkJaW50ZXJydXB0cyA9IDxmIDI+OwkvLyBkZWNyZW1lbnRlciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJbGludXgscGhhbmRsZSA9IDwyMDE+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCX07CiAJfTsKIAogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCWxpbnV4LHBoYW5kbGUgPSA8MzAwPjsKIAkJcmVnID0gPDAwMDAwMDAwIDgwMDAwMD47CiAJfTsKIApAQCAtNTcsMTEgKzUzLDkgQEAKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwogCQkJY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKIAkJCXJlZyA9IDxlODAgOD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPGU4MD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJZXRoZXJuZXQtcGh5QGYgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMGY+OworCQkJcGh5OiBldGhlcm5ldC1waHlAZiB7CiAJCQkJcmVnID0gPGY+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtNzUsMTIgKzY5LDExIEBACiAJCQlyZWcgPSA8ZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwZj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeT47CiAJCX07CiAKLQkJcGljQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OworCQltcGM4eHhfcGljOiBwaWNAZmYwMDAwMDAgewogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC05MSw3ICs4NCw2IEBACiAJCX07CiAKIAkJY3BtQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMDIsMTUgKzk0LDE0IEBACiAJCQljb21tYW5kLXByb2MgPSA8OWMwPjsKIAkJCWJyZy1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMj47CS8vIGNwbSBlcnJvciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCi0JCQlwaWNAOTMwIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPDkzMD47CisJCQljcG1fcGljOiBwaWNAOTMwIHsKIAkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJCWludGVycnVwdHMgPSA8NSAyIDAgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCQkJcmVnID0gPDkzMCAyMD47CiAJCQkJYnVpbHQtaW47CiAJCQkJZGV2aWNlX3R5cGUgPSAiY3BtLXBpYyI7CkBAIC0xMjgsNyArMTE5LDcgQEAKIAkJCQl0eC1jbG9jayA9IDwxPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8NCAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzbWNAYTkwIHsKQEAgLTE0Miw3ICsxMzMsNyBAQAogCQkJCXR4LWNsb2NrID0gPDI+OwogCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CiAJCQkJaW50ZXJydXB0cyA9IDwzIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAKIAkJCXNjY0BhMDAgewpAQCAtMTUzLDcgKzE0NCw3IEBACiAJCQkJcmVnID0gPGEwMCAxOCAzYzAwIDgwPjsKIAkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKIAkJCQlpbnRlcnJ1cHRzID0gPDFlIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4ODVhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKaW5kZXggMTEwYmY2MS4uZGM3YWI5YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKQEAgLTE1LDEyICsxNSwxMCBAQAogCWNvbXBhdGlibGUgPSAibXBjOHh4IjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKLQlsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKIAljcHVzIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwotCQlsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKIAkJUG93ZXJQQyw4ODVAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwpAQCAtMzQsMTQgKzMyLDEyIEBACiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQkzMi1iaXQ7CiAJCQlpbnRlcnJ1cHRzID0gPGYgMj47CS8vIGRlY3JlbWVudGVyIGludGVycnVwdAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPDIwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKIAkJfTsKIAl9OwogCiAJbWVtb3J5IHsKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJbGludXgscGhhbmRsZSA9IDwzMDA+OwogCQlyZWcgPSA8MDAwMDAwMDAgODAwMDAwPjsKIAl9OwogCkBAIC01NywyMSArNTMsMTcgQEAKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwogCQkJY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKIAkJCXJlZyA9IDxlODAgOD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPGU4MD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJZXRoZXJuZXQtcGh5QDAgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMDA+OworCQkJUGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKLQkJCWV0aGVybmV0LXBoeUAxIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPGU4MDAxPjsKKwkJCVBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07Ci0JCQlldGhlcm5ldC1waHlAMiB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDxlODAwMj47CisJCQlQaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtODUsOCArNzcsOCBAQAogCQkJcmVnID0gPGUwMCAxODg+OwogCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAxIEZEIF07CiAJCQlpbnRlcnJ1cHRzID0gPDMgMT47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPGZmMDAwMDAwPjsKLQkJCXBoeS1oYW5kbGUgPSA8ZTgwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CisJCQlwaHktaGFuZGxlID0gPCZQaHkxPjsKIAkJfTsKIAogCQlmZWNAMWUwMCB7CkBAIC05NywxMiArODksMTEgQEAKIAkJCXJlZyA9IDwxZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDIgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8NyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTI+OwogCQl9OwogCi0JCXBpY0BmZjAwMDAwMCB7Ci0JCQlsaW51eCxwaGFuZGxlID0gPGZmMDAwMDAwPjsKKwkJTXBjOHh4X3BpYzogcGljQGZmMDAwMDAwIHsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwpAQCAtMTEyLDggKzEwMywxOCBAQAogCQkJY29tcGF0aWJsZSA9ICJDUE0iOwogCQl9OwogCisJCXBjbWNpYUAwMDgwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscHEtcGNtY2lhIjsKKwkJCWRldmljZV90eXBlID0gInBjbWNpYSI7CisJCQlyZWcgPSA8ODAgODA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CisJCQlpbnRlcnJ1cHRzID0gPGQgMT47CisJCX07CisKIAkJY3BtQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMjQsMTUgKzEyNSwxNCBAQAogCQkJY29tbWFuZC1wcm9jID0gPDljMD47CiAJCQlicmctZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwwIDI+OwkvLyBjcG0gZXJyb3IgaW50ZXJydXB0Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAotCQkJcGljQDkzMCB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDw5MzA+OworCQkJQ3BtX3BpYzogcGljQDkzMCB7CiAJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDUgMiAwIDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OwogCQkJCXJlZyA9IDw5MzAgMjA+OwogCQkJCWJ1aWx0LWluOwogCQkJCWRldmljZV90eXBlID0gImNwbS1waWMiOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCQkJdHgtY2xvY2sgPSA8MT47CiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDQgMz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCQkJfTsKIAogCQkJc21jQGE5MCB7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJCQl0eC1jbG9jayA9IDwyPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8MyAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzY2NAYTQwIHsKQEAgLTE3NSw4ICsxNzUsOCBAQAogCQkJCXJlZyA9IDxhNDAgMTggM2UwMCA4MD47CiAJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAzIEZEIF07CiAJCQkJaW50ZXJydXB0cyA9IDwxYyAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47Ci0JCQkJcGh5LWhhbmRsZSA9IDxlODAwMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CisJCQkJcGh5LWhhbmRsZSA9IDwmUGh5Mj47CiAJCQl9OwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHJwbWMyODAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCmluZGV4IDU2ODk2NWEuLjY5OWQwZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCkBAIC0zMDksNyArMzA5LDcgQEAKIAl9OwogCiAJY2hvc2VuIHsKLQkJYm9vdGFyZ3MgPSAiaXA9b24gY29uc29sZT10dHlNTTAiOworCQlib290YXJncyA9ICJpcD1vbiI7CiAJCWxpbnV4LHN0ZG91dC1wYXRoID0gIi9tdjY0eDYwQGYxMDAwMDAwL21wc2NAODAwMCI7CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHMzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wczMuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHMzLmR0cwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIFBTMyBHYW1lIENvbnNvbGUgZGV2aWNlIHRyZWUuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvIHsKKwltb2RlbCA9ICJTb255UFMzIjsKKwljb21wYXRpYmxlID0gInNvbnkscHMzIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKworCWNob3NlbiB7CisJfTsKKworCS8qCisJICogV2UnbGwgZ2V0IHRoZSBzaXplIG9mIHRoZSBib290bWVtIGJsb2NrIGZyb20gbHYxIGFmdGVyIHN0YXJ0dXAsCisJICogc28gd2UnbGwgcHV0IGEgbnVsbCBlbnRyeSBoZXJlLgorCSAqLworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDAgMCAwIDA+OworCX07CisKKwkvKgorCSAqIFRoZSBib290IGNwdSBpcyBhbHdheXMgemVybyBmb3IgUFMzLgorCSAqCisJICogZHRjIGV4cGVjdHMgYSBjbG9jay1mcmVxdWVuY3kgYW5kIHRpbWViYXNlLWZyZXF1ZW5jeSBlbnRyaWVzLCBzbworCSAqIHdlJ2xsIHB1dCBhIG51bGwgZW50cmllcyBoZXJlLiAgVGhlc2Ugd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlcgorCSAqIHN0YXJ0dXAgd2l0aCBkYXRhIGZyb20gbHYxLgorCSAqCisJICogU2VlbXMgdGhlIG9ubHkgd2F5IGN1cnJlbnRseSB0byBpbmRpY2F0ZSBhIHByb2Nlc3NvciBoYXMgbXVsdGlwbGUKKwkgKiB0aHJlYWRzIGlzIHdpdGggYW4gaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MgZW50cnkuICBXZSdsbCBwdXQgb25lCisJICogaGVyZSBzbyB3ZSBjYW4gYnJpbmcgdXAgYm90aCBvZiBvdXJzLiAgU2VlIHNtcF9zZXR1cF9jcHVfbWFwcygpLgorCSAqLworCisJY3B1cyB7CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKworCQljcHVAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MgPSA8MCAxPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWktY2FjaGUtc2l6ZSA9IDw4MDAwPjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDw4MDAwPjsKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDgwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDgwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9lYm9ueS5jCmluZGV4IGIxMjUxZWUuLjc1ZGFlZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZWJvbnkuYwpAQCAtMTAwLDI4ICsxMDAsMTMgQEAKIAlpYm00NDBncF9maXh1cF9jbG9ja3Moc3lzY2xrLCA2ICogMTg0MzIwMCk7CiAJaWJtNDR4X2ZpeHVwX21lbXNpemUoKTsKIAlkdF9maXh1cF9tYWNfYWRkcmVzc2VzKGVib255X21hYzAsIGVib255X21hYzEpOwotfQotCi0jZGVmaW5lIFNQUk5fREJDUjAJCTB4MTM0Ci0jZGVmaW5lICAgREJDUjBfUlNUX1NZU1RFTQkweDMwMDAwMDAwCi0KLXN0YXRpYyB2b2lkIGVib255X2V4aXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWFzbSB2b2xhdGlsZSAoCi0JCSJtZnNwcgklMCwlMVxuIgotCQkib3JpcwklMCwlMCwlMkBoXG4iCi0JCSJtdHNwcgklMSwlMCIKLQkJOiAiPSZyIih0bXApIDogImkiKFNQUk5fREJDUjApLCAiaSIoREJDUjBfUlNUX1NZU1RFTSkKLQkJKTsKLQorCWlibTR4eF9maXh1cF9lYmNfcmFuZ2VzKCIvcGxiL29wYi9lYmMiKTsKIH0KIAogdm9pZCBlYm9ueV9pbml0KHZvaWQgKm1hYzAsIHZvaWQgKm1hYzEpCiB7CiAJcGxhdGZvcm1fb3BzLmZpeHVwcyA9IGVib255X2ZpeHVwczsKLQlwbGF0Zm9ybV9vcHMuZXhpdCA9IGVib255X2V4aXQ7CisJcGxhdGZvcm1fb3BzLmV4aXQgPSBpYm00NHhfZGJjcl9yZXNldDsKIAllYm9ueV9tYWMwID0gbWFjMDsKIAllYm9ueV9tYWMxID0gbWFjMTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCmluZGV4IDU2YjU2YTguLjQxNmRjMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L21haW4uYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKQEAgLTM2LDggKzM2LDYgQEAKIAl1bnNpZ25lZCBsb25nIHNpemU7CiB9OwogCi10eXBlZGVmIHZvaWQgKCprZXJuZWxfZW50cnlfdCkodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKLQogI3VuZGVmIERFQlVHCiAKIHN0YXRpYyBzdHJ1Y3QgYWRkcl9yYW5nZSBwcmVwX2tlcm5lbCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmMKaW5kZXggZDE2ZWUzZS4uMzg1ZTA4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jCkBAIC0xNSw4ICsxNSw3IEBACiAjaW5jbHVkZSAicGFnZS5oIgogI2luY2x1ZGUgIm9wcy5oIgogCi10eXBlZGVmIHZvaWQgKmloYW5kbGU7Ci10eXBlZGVmIHZvaWQgKnBoYW5kbGU7CisjaW5jbHVkZSAib2YuaCIKIAogZXh0ZXJuIGNoYXIgX2VuZFtdOwogCkBAIC0yNSwxNTQgKzI0LDEwIEBACiAjZGVmaW5lIFJBTV9FTkQJCSg1MTI8PDIwKQkvKiBGaXhtZTogdXNlIE9GICovCiAjZGVmaW5lCU9ORV9NQgkJMHgxMDAwMDAKIAotaW50ICgqcHJvbSkgKHZvaWQgKik7CiAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xhaW1fYmFzZTsKIAotc3RhdGljIGludCBjYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKQotewotCWludCBpOwotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljb25zdCBjaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07Ci0JfSBhcmdzOwotCXZhX2xpc3QgbGlzdDsKLQotCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7Ci0JYXJncy5uYXJncyA9IG5hcmdzOwotCWFyZ3MubnJldCA9IG5yZXQ7Ci0KLQl2YV9zdGFydChsaXN0LCBucmV0KTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7Ci0JdmFfZW5kKGxpc3QpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKLQkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKLQotCWlmIChwcm9tKCZhcmdzKSA8IDApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAobnJldCA+IDApPyBhcmdzLmFyZ3NbbmFyZ3NdOiAwOwotfQotCi1zdGF0aWMgaW50IGNhbGxfcHJvbV9yZXQoY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwKLQkJICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY29uc3QgY2hhciAqc2VydmljZTsKLQkJaW50IG5hcmdzOwotCQlpbnQgbnJldDsKLQkJdW5zaWduZWQgaW50IGFyZ3NbMTJdOwotCX0gYXJnczsKLQl2YV9saXN0IGxpc3Q7Ci0KLQlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCWFyZ3MubmFyZ3MgPSBuYXJnczsKLQlhcmdzLm5yZXQgPSBucmV0OwotCi0JdmFfc3RhcnQobGlzdCwgcmV0cyk7Ci0JZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCi0JCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOwotCXZhX2VuZChsaXN0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCi0JCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7Ci0KLQlpZiAocHJvbSgmYXJncykgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQotCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQotCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOwotCi0JcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Ci19Ci0KLS8qCi0gKiBPbGRlciBPRidzIHJlcXVpcmUgdGhhdCB3aGVuIGNsYWltaW5nIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgYWRkcmVzc2VzLAotICogd2UgY2xhaW0gdGhlIHBoeXNpY2FsIHNwYWNlIGluIHRoZSAvbWVtb3J5IG5vZGUgYW5kIHRoZSB2aXJ0dWFsCi0gKiBzcGFjZSBpbiB0aGUgY2hvc2VuIG1tdSBub2RlLCBhbmQgdGhlbiBkbyBhIG1hcCBvcGVyYXRpb24gdG8KLSAqIG1hcCB2aXJ0dWFsIHRvIHBoeXNpY2FsLgotICovCi1zdGF0aWMgaW50IG5lZWRfbWFwID0gLTE7Ci1zdGF0aWMgaWhhbmRsZSBjaG9zZW5fbW11Owotc3RhdGljIHBoYW5kbGUgbWVtb3J5OwotCi0vKiByZXR1cm5zIHRydWUgaWYgczIgaXMgYSBwcmVmaXggb2YgczEgKi8KLXN0YXRpYyBpbnQgc3RyaW5nX21hdGNoKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKLXsKLQlmb3IgKDsgKnMyOyArK3MyKQotCQlpZiAoKnMxKysgIT0gKnMyKQotCQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfb2ZfdmVyc2lvbih2b2lkKQotewotCXBoYW5kbGUgb3Byb20sIGNob3NlbjsKLQljaGFyIHZlcnNpb25bNjRdOwotCi0Jb3Byb20gPSBmaW5kZGV2aWNlKCIvb3BlbnByb20iKTsKLQlpZiAob3Byb20gPT0gKHBoYW5kbGUpIC0xKQotCQlyZXR1cm4gMDsKLQlpZiAoZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQotCQlyZXR1cm4gMDsKLQl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7Ci0JcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKLQlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQotCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKLQkJcmV0dXJuIDA7Ci0JY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOwotCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7Ci0JCWNob3NlbiA9IGZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOwotCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgewotCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKGdldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgewotCQlwcmludGYoIm5vIG1tdVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQltZW1vcnkgPSAoaWhhbmRsZSkgY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnkiKTsKLQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgewotCQltZW1vcnkgPSAoaWhhbmRsZSkgY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnlAMCIpOwotCQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgewotCQkJcHJpbnRmKCJubyBtZW1vcnkgbm9kZVxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHJlc3VsdDsKLQotCWlmIChuZWVkX21hcCA8IDApCi0JCW5lZWRfbWFwID0gY2hlY2tfb2ZfdmVyc2lvbigpOwotCWlmIChhbGlnbiB8fCAhbmVlZF9tYXApCi0JCXJldHVybiAodm9pZCAqKSBjYWxsX3Byb20oImNsYWltIiwgMywgMSwgdmlydCwgc2l6ZSwgYWxpZ24pOwotCi0JcmV0ID0gY2FsbF9wcm9tX3JldCgiY2FsbC1tZXRob2QiLCA1LCAyLCAmcmVzdWx0LCAiY2xhaW0iLCBtZW1vcnksCi0JCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOwotCWlmIChyZXQgIT0gMCB8fCByZXN1bHQgPT0gLTEpCi0JCXJldHVybiAodm9pZCAqKSAtMTsKLQlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIGNob3Nlbl9tbXUsCi0JCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOwotCS8qIDB4MTIgPT0gY29oZXJlbnQgKyByZWFkL3dyaXRlICovCi0JcmV0ID0gY2FsbF9wcm9tKCJjYWxsLW1ldGhvZCIsIDYsIDEsICJtYXAiLCBjaG9zZW5fbW11LAotCQkJMHgxMiwgc2l6ZSwgdmlydCwgdmlydCk7Ci0JcmV0dXJuICh2b2lkICopIHZpcnQ7Ci19Ci0KIHN0YXRpYyB2b2lkICpvZl90cnlfY2xhaW0odW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CkBAIC0xODQsNyArMzksNyBAQAogI2lmZGVmIERFQlVHCiAJCXByaW50ZigiICAgIHRyeWluZzogMHglMDhseFxuXHIiLCBjbGFpbV9iYXNlKTsKICNlbmRpZgotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpY2xhaW0oY2xhaW1fYmFzZSwgc2l6ZSwgMCk7CisJCWFkZHIgPSAodW5zaWduZWQgbG9uZylvZl9jbGFpbShjbGFpbV9iYXNlLCBzaXplLCAwKTsKIAkJaWYgKCh2b2lkICopYWRkciAhPSAodm9pZCAqKS0xKQogCQkJYnJlYWs7CiAJfQpAQCAtMjA4LDY0ICs2Myw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKLQotCWlmICghcCkKLQkJZmF0YWwoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Iga2VybmVsIGltYWdlIVxuXHIiKTsKLQotCXJldHVybiBwOwotfQotCi1zdGF0aWMgdm9pZCBvZl9leGl0KHZvaWQpCi17Ci0JY2FsbF9wcm9tKCJleGl0IiwgMCwgMCk7Ci19Ci0KLS8qCi0gKiBPRiBkZXZpY2UgdHJlZSByb3V0aW5lcwotICovCi1zdGF0aWMgdm9pZCAqb2ZfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiAocGhhbmRsZSkgY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCi0JCWNvbnN0IGludCBidWZsZW4pCi17Ci0JcmV0dXJuIGNhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKLX0KLQotc3RhdGljIGludCBvZl9zZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJY29uc3QgaW50IGJ1ZmxlbikKLXsKLQlyZXR1cm4gY2FsbF9wcm9tKCJzZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOwotfQotCi0vKgotICogT0YgY29uc29sZSByb3V0aW5lcwotICovCi1zdGF0aWMgdm9pZCAqb2Zfc3Rkb3V0X2hhbmRsZTsKLQotc3RhdGljIGludCBvZl9jb25zb2xlX29wZW4odm9pZCkKLXsKLQl2b2lkICpkZXZwOwotCi0JaWYgKCgoZGV2cCA9IGZpbmRkZXZpY2UoIi9jaG9zZW4iKSkgIT0gTlVMTCkKLQkJCSYmIChnZXRwcm9wKGRldnAsICJzdGRvdXQiLCAmb2Zfc3Rkb3V0X2hhbmRsZSwKLQkJCQlzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpCi0JCQkJPT0gc2l6ZW9mKG9mX3N0ZG91dF9oYW5kbGUpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIG9mX2NvbnNvbGVfd3JpdGUoY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWNhbGxfcHJvbSgid3JpdGUiLCAzLCAxLCBvZl9zdGRvdXRfaGFuZGxlLCBidWYsIGxlbik7Ci19Ci0KIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLCB2b2lkICpwcm9tcHRyKQogewogCXBsYXRmb3JtX29wcy5pbWFnZV9oZHIgPSBvZl9pbWFnZV9oZHI7CkBAIC0yNzcsMTAgKzc0LDkgQEAKIAlkdF9vcHMuZ2V0cHJvcCA9IG9mX2dldHByb3A7CiAJZHRfb3BzLnNldHByb3AgPSBvZl9zZXRwcm9wOwogCi0JY29uc29sZV9vcHMub3BlbiA9IG9mX2NvbnNvbGVfb3BlbjsKLQljb25zb2xlX29wcy53cml0ZSA9IG9mX2NvbnNvbGVfd3JpdGU7CisJb2ZfY29uc29sZV9pbml0KCk7CiAKLQlwcm9tID0gKGludCAoKikodm9pZCAqKSlwcm9tcHRyOworCW9mX2luaXQocHJvbXB0cik7CiAJbG9hZGVyX2luZm8ucHJvbXB0ciA9IHByb21wdHI7CiAJaWYgKGExICYmIGEyICYmIGEyICE9IDB4ZGVhZGJlZWYpIHsKIAkJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSBhMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29mLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzY4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX1BQQ19CT09UX09GX0hfCisjZGVmaW5lIF9QUENfQk9PVF9PRl9IXworCit0eXBlZGVmIHZvaWQgKnBoYW5kbGU7Cit0eXBlZGVmIHZvaWQgKmloYW5kbGU7CisKK3ZvaWQgb2ZfaW5pdCh2b2lkICpwcm9tcHRyKTsKK2ludCBvZl9jYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKTsKK3ZvaWQgKm9mX2NsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKTsKK3ZvaWQgKm9mX3ZtbGludXhfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKK3ZvaWQgb2ZfZXhpdCh2b2lkKTsKK3ZvaWQgKm9mX2ZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pOworaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAorCSAgICAgICBjb25zdCBpbnQgYnVmbGVuKTsKKworLyogQ29uc29sZSBmdW5jdGlvbnMgKi8KK3ZvaWQgb2ZfY29uc29sZV9pbml0KHZvaWQpOworCisjZW5kaWYgLyogX1BQQ19CT09UX09GX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZmNvbnNvbGUuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGUwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZmNvbnNvbGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogT0YgY29uc29sZSByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMTk5Ny4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbGYuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInBhZ2UuaCIKKyNpbmNsdWRlICJvcHMuaCIKKworI2luY2x1ZGUgIm9mLmgiCisKK3N0YXRpYyB2b2lkICpvZl9zdGRvdXRfaGFuZGxlOworCitzdGF0aWMgaW50IG9mX2NvbnNvbGVfb3Blbih2b2lkKQoreworCXZvaWQgKmRldnA7CisKKwlpZiAoKChkZXZwID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbiIpKSAhPSBOVUxMKQorCSAgICAmJiAob2ZfZ2V0cHJvcChkZXZwLCAic3Rkb3V0IiwgJm9mX3N0ZG91dF9oYW5kbGUsCisJCQkgICBzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpCisJCT09IHNpemVvZihvZl9zdGRvdXRfaGFuZGxlKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBvZl9jb25zb2xlX3dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlvZl9jYWxsX3Byb20oIndyaXRlIiwgMywgMSwgb2Zfc3Rkb3V0X2hhbmRsZSwgYnVmLCBsZW4pOworfQorCit2b2lkIG9mX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWNvbnNvbGVfb3BzLm9wZW4gPSBvZl9jb25zb2xlX29wZW47CisJY29uc29sZV9vcHMud3JpdGUgPSBvZl9jb25zb2xlX3dyaXRlOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2ZsaWIuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViOGZkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mbGliLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDE5OTcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAib3BzLmgiCisKKyNpbmNsdWRlICJvZi5oIgorCitzdGF0aWMgaW50ICgqcHJvbSkgKHZvaWQgKik7CisKK3ZvaWQgb2ZfaW5pdCh2b2lkICpwcm9tcHRyKQoreworCXByb20gPSAoaW50ICgqKSh2b2lkICopKXByb21wdHI7Cit9CisKK2ludCBvZl9jYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKQoreworCWludCBpOworCXN0cnVjdCBwcm9tX2FyZ3MgeworCQljb25zdCBjaGFyICpzZXJ2aWNlOworCQlpbnQgbmFyZ3M7CisJCWludCBucmV0OworCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07CisJfSBhcmdzOworCXZhX2xpc3QgbGlzdDsKKworCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7CisJYXJncy5uYXJncyA9IG5hcmdzOworCWFyZ3MubnJldCA9IG5yZXQ7CisKKwl2YV9zdGFydChsaXN0LCBucmV0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKKwkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKKworCWlmIChwcm9tKCZhcmdzKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAobnJldCA+IDApPyBhcmdzLmFyZ3NbbmFyZ3NdOiAwOworfQorCitzdGF0aWMgaW50IG9mX2NhbGxfcHJvbV9yZXQoY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcHJvbV9hcmdzIHsKKwkJY29uc3QgY2hhciAqc2VydmljZTsKKwkJaW50IG5hcmdzOworCQlpbnQgbnJldDsKKwkJdW5zaWduZWQgaW50IGFyZ3NbMTJdOworCX0gYXJnczsKKwl2YV9saXN0IGxpc3Q7CisKKwlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOworCWFyZ3MubmFyZ3MgPSBuYXJnczsKKwlhcmdzLm5yZXQgPSBucmV0OworCisJdmFfc3RhcnQobGlzdCwgcmV0cyk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCisJCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7CisKKwlpZiAocHJvbSgmYXJncykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQorCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQorCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOworCisJcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Cit9CisKKy8qIHJldHVybnMgdHJ1ZSBpZiBzMiBpcyBhIHByZWZpeCBvZiBzMSAqLworc3RhdGljIGludCBzdHJpbmdfbWF0Y2goY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCWZvciAoOyAqczI7ICsrczIpCisJCWlmICgqczErKyAhPSAqczIpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE9sZGVyIE9GJ3MgcmVxdWlyZSB0aGF0IHdoZW4gY2xhaW1pbmcgYSBzcGVjaWZpYyByYW5nZSBvZiBhZGRyZXNzZXMsCisgKiB3ZSBjbGFpbSB0aGUgcGh5c2ljYWwgc3BhY2UgaW4gdGhlIC9tZW1vcnkgbm9kZSBhbmQgdGhlIHZpcnR1YWwKKyAqIHNwYWNlIGluIHRoZSBjaG9zZW4gbW11IG5vZGUsIGFuZCB0aGVuIGRvIGEgbWFwIG9wZXJhdGlvbiB0bworICogbWFwIHZpcnR1YWwgdG8gcGh5c2ljYWwuCisgKi8KK3N0YXRpYyBpbnQgbmVlZF9tYXAgPSAtMTsKK3N0YXRpYyBpaGFuZGxlIGNob3Nlbl9tbXU7CitzdGF0aWMgcGhhbmRsZSBtZW1vcnk7CisKK3N0YXRpYyBpbnQgY2hlY2tfb2ZfdmVyc2lvbih2b2lkKQoreworCXBoYW5kbGUgb3Byb20sIGNob3NlbjsKKwljaGFyIHZlcnNpb25bNjRdOworCisJb3Byb20gPSBvZl9maW5kZGV2aWNlKCIvb3BlbnByb20iKTsKKwlpZiAob3Byb20gPT0gKHBoYW5kbGUpIC0xKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZfZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQorCQlyZXR1cm4gMDsKKwl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7CisJcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKKwlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQorCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKKwkJcmV0dXJuIDA7CisJY2hvc2VuID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbiIpOworCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCWNob3NlbiA9IG9mX2ZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOworCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKG9mX2dldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgeworCQlwcmludGYoIm5vIG1tdVxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1vcnkgPSAoaWhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnkiKTsKKwlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgeworCQltZW1vcnkgPSAoaWhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnlAMCIpOworCQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBtZW1vcnkgbm9kZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCAqb2ZfY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCisJaWYgKG5lZWRfbWFwIDwgMCkKKwkJbmVlZF9tYXAgPSBjaGVja19vZl92ZXJzaW9uKCk7CisJaWYgKGFsaWduIHx8ICFuZWVkX21hcCkKKwkJcmV0dXJuICh2b2lkICopIG9mX2NhbGxfcHJvbSgiY2xhaW0iLCAzLCAxLCB2aXJ0LCBzaXplLCBhbGlnbik7CisKKwlyZXQgPSBvZl9jYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIG1lbW9yeSwKKwkJCSAgICAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJaWYgKHJldCAhPSAwIHx8IHJlc3VsdCA9PSAtMSkKKwkJcmV0dXJuICh2b2lkICopIC0xOworCXJldCA9IG9mX2NhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgY2hvc2VuX21tdSwKKwkJCSAgICAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJLyogMHgxMiA9PSBjb2hlcmVudCArIHJlYWQvd3JpdGUgKi8KKwlyZXQgPSBvZl9jYWxsX3Byb20oImNhbGwtbWV0aG9kIiwgNiwgMSwgIm1hcCIsIGNob3Nlbl9tbXUsCisJCQkgICAweDEyLCBzaXplLCB2aXJ0LCB2aXJ0KTsKKwlyZXR1cm4gKHZvaWQgKikgdmlydDsKK30KKwordm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKworCWlmICghcCkKKwkJZmF0YWwoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Iga2VybmVsIGltYWdlIVxuXHIiKTsKKworCXJldHVybiBwOworfQorCit2b2lkIG9mX2V4aXQodm9pZCkKK3sKKwlvZl9jYWxsX3Byb20oImV4aXQiLCAwLCAwKTsKK30KKworLyoKKyAqIE9GIGRldmljZSB0cmVlIHJvdXRpbmVzCisgKi8KK3ZvaWQgKm9mX2ZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKHBoYW5kbGUpIG9mX2NhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIG5hbWUpOworfQorCitpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pCit7CisJcmV0dXJuIG9mX2NhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KKworaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAorCSAgICAgICBjb25zdCBpbnQgYnVmbGVuKQoreworCXJldHVybiBvZl9jYWxsX3Byb20oInNldHByb3AiLCA0LCAxLCBwaGFuZGxlLCBuYW1lLCBidWYsIGJ1Zmxlbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaCBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCmluZGV4IDk1OTEyNGYuLjg2MDc3MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCkBAIC0xOSw2ICsxOSw4IEBACiAjZGVmaW5lCU1BWF9QQVRIX0xFTgkJMjU2CiAjZGVmaW5lCU1BWF9QUk9QX0xFTgkJMjU2IC8qIFdoYXQgc2hvdWxkIHRoaXMgYmU/ICovCiAKK3R5cGVkZWYgdm9pZCAoKmtlcm5lbF9lbnRyeV90KSh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB2b2lkICpyNSk7CisKIC8qIFBsYXRmb3JtIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KIHN0cnVjdCBwbGF0Zm9ybV9vcHMgewogCXZvaWQJKCpmaXh1cHMpKHZvaWQpOwpAQCAtNTEsNyArNTMsNyBAQAogLyogQ29uc29sZSBvcGVyYXRpb25zICovCiBzdHJ1Y3QgY29uc29sZV9vcHMgewogCWludAkoKm9wZW4pKHZvaWQpOwotCXZvaWQJKCp3cml0ZSkoY2hhciAqYnVmLCBpbnQgbGVuKTsKKwl2b2lkCSgqd3JpdGUpKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAJdm9pZAkoKmVkaXRfY21kbGluZSkoY2hhciAqYnVmLCBpbnQgbGVuKTsKIAl2b2lkCSgqY2xvc2UpKHZvaWQpOwogCXZvaWQJKmRhdGE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaGVhZC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWhlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWhlYWQuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICogIFBTMyBib290d3JhcHBlciBlbnRyeS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJwcGNfYXNtLmgiCisKKwkudGV4dAorCisvKgorICogX19zeXN0ZW1fcmVzZXRfb3ZlcmxheSAtIFRoZSBQUzMgZmlyc3Qgc3RhZ2UgZW50cnkuCisgKgorICogVGhlIGJvb3R3cmFwZXIgYnVpbGQgc2NyaXB0IGNvcGllcyB0aGUgMHgxMDAgYnl0ZXMgYXQgc3ltYm9sCisgKiBfX3N5c3RlbV9yZXNldF9vdmVybGF5IHRvIG9mZnNldCAweDEwMCBvZiB0aGUgcm9tIGltYWdlLgorICoKKyAqIFRoZSBQUzMgaGFzIGEgc2luZ2xlIHByb2Nlc3NvciB3aXRoIHR3byB0aHJlYWRzLgorICovCisKKwkuZ2xvYmwgX19zeXN0ZW1fcmVzZXRfb3ZlcmxheQorX19zeXN0ZW1fcmVzZXRfb3ZlcmxheToKKworCS8qIFN3aXRjaCB0byAzMi1iaXQgbW9kZS4gKi8KKworCW1mbXNyCXI5CisJY2xybGRpCXI5LHI5LDEKKwltdG1zcmQJcjkKKwlub3AKKworCS8qIEdldCB0aHJlYWQgbnVtYmVyIGluIHIzIGFuZCBicmFuY2guICovCisKKwltZnNwcglyMywgMHg4OAorCWNudGx6dy4JcjMsIHIzCisJbGkJcjQsIDAKKwlsaQlyNSwgMAorCWJlcQkxZgorCisJLyogU2Vjb25kYXJ5IGdvZXMgdG8gX19zZWNvbmRhcnlfaG9sZCBpbiBrZXJuZWwuICovCisKKwlsaQlyNCwgMHg2MAorCW10Y3RyCXI0CisJYmN0cgorCisJLyogUHJpbWFyeSBkZWxheXMgdGhlbiBnb2VzIHRvIF96aW1hZ2Vfc3RhcnQgaW4gd3JhcHBlci4gKi8KKzE6CisJb3IJMzEsIDMxLCAzMSAvKiBkYjE2Y3ljICovCisJb3IJMzEsIDMxLCAzMSAvKiBkYjE2Y3ljICovCisKKwlsaXMJcjQsIF96aW1hZ2Vfc3RhcnRAaGEKKwlhZGRpCXI0LCByNCwgX3ppbWFnZV9zdGFydEBsCisJbXRjdHIJcjQKKwliY3RyCisKKy8qCisgKiBfX3N5c3RlbV9yZXNldF9rZXJuZWwgLSBQbGFjZSBob2xkZXIgZm9yIHRoZSBrZXJuZWwgcmVzZXQgdmVjdG9yLgorICoKKyAqIFRoZSBib290d3JhcHBlciBidWlsZCBzY3JpcHQgY29waWVzIDB4MTAwIGJ5dGVzIGZyb20gb2Zmc2V0IDB4MTAwCisgKiBvZiB0aGUgcm9tIGltYWdlIHRvIHRoZSBzeW1ib2wgX19zeXN0ZW1fcmVzZXRfa2VybmVsLiAgQXQgcnVudGltZQorICogdGhlIGJvb3R3cmFwcGVyIHByb2dyYW0gY29waWVzIHRoZSAweDEwMCBieXRlcyBhdCBfX3N5c3RlbV9yZXNldF9rZXJuZWwKKyAqIHRvIHJhbSBhZGRyZXNzIDB4MTAwLiAgVGhpcyBzeW1ib2wgbXVzdCBvY2N1cHkgMHgxMDAgYnl0ZXMuCisgKi8KKworCS5nbG9ibCBfX3N5c3RlbV9yZXNldF9rZXJuZWwKK19fc3lzdGVtX3Jlc2V0X2tlcm5lbDoKKworCS4gPSBfX3N5c3RlbV9yZXNldF9rZXJuZWwgKyAweDEwMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWh2Y2FsbC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWh2Y2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjdkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaHZjYWxsLlMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiAgUFMzIGJvb3R3cmFwcGVyIGh2Y2FsbHMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAicHBjX2FzbS5oIgorCisvKgorICogVGhlIFBTMyBoeXBlcnZpc29yIHVzZXMgYSA2NCBiaXQgIkMiIGxhbmd1YWdlIGNhbGxpbmcgY29udmVudGlvbi4KKyAqIFRoZSByb3V0aW5lcyBoZXJlIG1hcnNoYWwgYXJndW1lbnRzIGJldHdlZW4gdGhlIDMyIGJpdCB3cmFwcGVyCisgKiBwcm9ncmFtIGFuZCB0aGUgNjQgYml0IGh2Y2FsbHMuCisgKgorICogIHdyYXBwZXIgICAgICAgICAgIGx2MQorICogIDMyLWJpdCAoaCxsKSAgICAgIDY0LWJpdAorICoKKyAqICAxOiByMyxyNCAgICAgICAgICA8LT4gcjMKKyAqICAyOiByNSxyNiAgICAgICAgICA8LT4gcjQKKyAqICAzOiByNyxyOCAgICAgICAgICA8LT4gcjUKKyAqICA0OiByOSxyMTAgICAgICAgICA8LT4gcjYKKyAqICA1OiA4KHIxKSwxMihyMSkgICA8LT4gcjcKKyAqICA2OiAxNihyMSksMjAocjEpICA8LT4gcjgKKyAqICA3OiAyNChyMSksMjgocjEpICA8LT4gcjkKKyAqICA4OiAzMihyMSksMzYocjEpICA8LT4gcjEwCisgKgorICovCisKKy5tYWNybyBHTE9CQUwgbmFtZQorCS5zZWN0aW9uICIudGV4dCIKKwkuYmFsaWduIDQKKwkuZ2xvYmwgXG5hbWUKK1xuYW1lOgorLmVuZG0KKworLm1hY3JvIE5PX1NVUFBPUlQgbmFtZQorCUdMT0JBTCBcbmFtZQorCWIgcHMzX25vX3N1cHBvcnQKKy5lbmRtCisKKy5tYWNybyBIVkNBTEwgbnVtCisJbGkgcjExLCBcbnVtCisJLmxvbmcgMHg0NDAwMDAyMgorCWV4dHN3IHIzLCByMworLmVuZG0KKworLm1hY3JvIFNBVkVfTFIgb2Zmc2V0PTQKKwltZmxyIHIwCisJc3R3IHIwLCBcb2Zmc2V0KHIxKQorLmVuZG0KKworLm1hY3JvIExPQURfTFIgb2Zmc2V0PTQKKwlsd3ogcjAsIFxvZmZzZXQocjEpCisJbXRsciByMAorLmVuZG0KKworLm1hY3JvIExPQURfNjRfUkVHIHRhcmdldCxoaWdoLGxvdworCXNsZGkgcjExLCBcaGlnaCwgMzIKKwlvciBcdGFyZ2V0LCByMTEsIFxsb3cKKy5lbmRtCisKKy5tYWNybyBMT0FEXzY0X1NUQUNLIHRhcmdldCxvZmZzZXQKKwlsZCBcdGFyZ2V0LCBcb2Zmc2V0KHIxKQorLmVuZG0KKworLm1hY3JvIExPQURfUjMKKwlMT0FEXzY0X1JFRyByMyxyMyxyNAorLmVuZG0KKworLm1hY3JvIExPQURfUjQKKwlMT0FEXzY0X1JFRyByNCxyNSxyNgorLmVuZG0KKworLm1hY3JvIExPQURfUjUKKwlMT0FEXzY0X1JFRyByNSxyNyxyOAorLmVuZG0KKworLm1hY3JvIExPQURfUjYKKwlMT0FEXzY0X1JFRyByNixyOSxyMTAKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I3CisJTE9BRF82NF9TVEFDSyByNyw4CisuZW5kbQorCisubWFjcm8gTE9BRF9SOAorCUxPQURfNjRfU1RBQ0sgcjgsMTYKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I5CisJTE9BRF82NF9TVEFDSyByOSwyNAorLmVuZG0KKworLm1hY3JvIExPQURfUjEwCisJTE9BRF82NF9TVEFDSyByMTAsMzIKKy5lbmRtCisKKy5tYWNybyBMT0FEX1JFR1NfMAorCXN0d3UgMSwtMTYoMSkKKwlzdHcgMywgOCgxKQorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU181CisJTE9BRF9SMworCUxPQURfUjQKKwlMT0FEX1I1CisJTE9BRF9SNgorCUxPQURfUjcKKy5lbmRtCisKKy5tYWNybyBMT0FEX1JFR1NfNgorCUxPQURfUkVHU181CisJTE9BRF9SOAorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU184CisJTE9BRF9SRUdTXzYKKwlMT0FEX1I5CisJTE9BRF9SMTAKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzBfMQorCWx3eiByMTEsIDgocjEpCisJc3RkIHI0LCAwKHIxMSkKKwltciByNCwgcjMKKwlsaSByMywgMAorCWFkZGkgcjEscjEsMTYKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzVfMgorCWx3eiByMTEsIDE2KHIxKQorCXN0ZCByNCwgMChyMTEpCisJbHd6IHIxMSwgMjQocjEpCisJc3RkIHI1LCAwKHIxMSkKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzZfMQorCWx3eiByMTEsIDI0KHIxKQorCXN0ZCByNCwgMChyMTEpCisuZW5kbQorCitHTE9CQUwgbHYxX2dldF9sb2dpY2FsX3BwZV9pZAorCVNBVkVfTFIKKwlMT0FEX1JFR1NfMAorCUhWQ0FMTCA2OQorCVNUT1JFX1JFR1NfMF8xCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZAorCVNBVkVfTFIKKwlMT0FEX1JFR1NfMAorCUhWQ0FMTCA3NAorCVNUT1JFX1JFR1NfMF8xCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUKKwlTQVZFX0xSCisJTE9BRF9SRUdTXzUKKwlIVkNBTEwgOTEKKwlTVE9SRV9SRUdTXzVfMgorCUxPQURfTFIKKwlibHIKKworR0xPQkFMIGx2MV9wYW5pYworCVNBVkVfTFIKKwlMT0FEX1JFR1NfOAorCUhWQ0FMTCAyNTUKKwlMT0FEX0xSCisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMuYyBiL2FyY2gvcG93ZXJwYy9ib290L3BzMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2Q1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqICBQUzMgYm9vdHdyYXBwZXIgc3VwcG9ydC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImVsZi5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAicGFnZS5oIgorI2luY2x1ZGUgIm9wcy5oIgorCitleHRlcm4gczY0IGx2MV9wYW5pYyh1NjQgaW5fMSk7CitleHRlcm4gczY0IGx2MV9nZXRfbG9naWNhbF9wYXJ0aXRpb25faWQodTY0ICpvdXRfMSk7CitleHRlcm4gczY0IGx2MV9nZXRfbG9naWNhbF9wcGVfaWQodTY0ICpvdXRfMSk7CitleHRlcm4gczY0IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlKHU2NCBpbl8xLCB1NjQgaW5fMiwgdTY0IGluXzMsCisJdTY0IGluXzQsIHU2NCBpbl81LCB1NjQgKm91dF8xLCB1NjQgKm91dF8yKTsKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ZihmbXQpCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIERCRygKKwljb25zdCBjaGFyICpmbXQsIC4uLikge3JldHVybiAwO30KKyNlbmRpZgorCitCU1NfU1RBQ0soNDA5Nik7CisKKy8qIEEgYnVmZmVyIHRoYXQgbWF5IGJlIGVkaXRlZCBieSB0b29scyBvcGVyYXRpbmcgb24gYSB6SW1hZ2UgYmluYXJ5IHNvIGFzIHRvCisgKiBlZGl0IHRoZSBjb21tYW5kIGxpbmUgcGFzc2VkIHRvIHZtbGludXggKGJ5IHNldHRpbmcgL2Nob3Nlbi9ib290YXJncykuCisgKiBUaGUgYnVmZmVyIGlzIHB1dCBpbiBpdCdzIG93biBzZWN0aW9uIHNvIHRoYXQgdG9vbHMgbWF5IGxvY2F0ZSBpdCBlYXNpZXIuCisgKi8KK3N0YXRpYyBjaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIl9fYnVpbHRpbl9jbWRsaW5lIikpKTsKKworc3RhdGljIHZvaWQgcHJlcF9jbWRsaW5lKHZvaWQgKmNob3NlbikKK3sKKwlpZiAoY21kbGluZVswXSA9PSAnXDAnKQorCQlnZXRwcm9wKGNob3NlbiwgImJvb3RhcmdzIiwgY21kbGluZSwgQ09NTUFORF9MSU5FX1NJWkUtMSk7CisJZWxzZQorCQlzZXRwcm9wX3N0cihjaG9zZW4sICJib290YXJncyIsIGNtZGxpbmUpOworCisJcHJpbnRmKCJjbWRsaW5lOiAnJXMnXG4iLCBjbWRsaW5lKTsKK30KKworc3RhdGljIHZvaWQgcHMzX2NvbnNvbGVfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworfQorCitzdGF0aWMgdm9pZCBwczNfZXhpdCh2b2lkKQoreworCXByaW50ZigicHMzX2V4aXRcbiIpOworCisJLyogbHYxX3BhbmljIHdpbGwgc2h1dGRvd24gdGhlIGxwYXIuICovCisKKwlsdjFfcGFuaWMoMCk7IC8qIHplcm8gPSBkbyBub3QgcmVib290ICovCisJd2hpbGUgKDEpOworfQorCitzdGF0aWMgaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfcm1fc2l6ZSh1NjQgKnJtX3NpemUpCit7CisJczY0IHJlc3VsdDsKKwl1NjQgbHBhcl9pZDsKKwl1NjQgcHBlX2lkOworCXU2NCB2MjsKKworCXJlc3VsdCA9IGx2MV9nZXRfbG9naWNhbF9wYXJ0aXRpb25faWQoJmxwYXJfaWQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC0xOworCisJcmVzdWx0ID0gbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcHBlX2lkKTsKKworCWlmIChyZXN1bHQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogbjE6IDAwMDAwMDAwNjI2OTAwMDAgOiAuLi4uYmkuLgorCSAqIG4yOiA3MDc1MDAwMDAwMDAwMDAwIDogcHUuLi4uLi4KKwkgKiBuMzogMDAwMDAwMDAwMDAwMDAwMSA6IC4uLi4uLi4uCisJICogbjQ6IDcyNmQ1ZjczNjk3YTY1MDAgOiBybV9zaXplLgorCSovCisKKwlyZXN1bHQgPSBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZShscGFyX2lkLCAweDAwMDAwMDAwNjI2OTAwMDBVTEwsCisJCTB4NzA3NTAwMDAwMDAwMDAwMFVMTCwgcHBlX2lkLCAweDcyNmQ1ZjczNjk3YTY1MDBVTEwsIHJtX3NpemUsCisJCSZ2Mik7CisKKwlwcmludGYoIiVzOiVkOiBwcGVfaWQgICVsdSBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGxvbmcpcHBlX2lkKTsKKwlwcmludGYoIiVzOiVkOiBscGFyX2lkICVsdSBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGxvbmcpbHBhcl9pZCk7CisJcHJpbnRmKCIlczolZDogcm1fc2l6ZSAlbGx4aCBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKnJtX3NpemUpOworCisJcmV0dXJuIHJlc3VsdCA/IC0xIDogMDsKK30KKwordm9pZCBwczNfY29weV92ZWN0b3JzKHZvaWQpCit7CisJZXh0ZXJuIGNoYXIgX19zeXN0ZW1fcmVzZXRfa2VybmVsW107CisKKwltZW1jcHkoKHZvaWQgKikweDEwMCwgX19zeXN0ZW1fcmVzZXRfa2VybmVsLCAweDEwMCk7CisJZmx1c2hfY2FjaGUoKHZvaWQgKikweDEwMCwgMHgxMDApOworfQorCit2b2lkIHBsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlleHRlcm4gY2hhciBfZW5kW107CisJZXh0ZXJuIGNoYXIgX2R0Yl9zdGFydFtdOworCWV4dGVybiBjaGFyIF9pbml0cmRfc3RhcnRbXTsKKwlleHRlcm4gY2hhciBfaW5pdHJkX2VuZFtdOworCWNvbnN0IHUzMiBoZWFwc2l6ZSA9IDB4MTAwMDAwMCAtICh1MzIpX2VuZDsgLyogMTZNaUIgKi8KKwl2b2lkICpjaG9zZW47CisJdW5zaWduZWQgbG9uZyBmdF9hZGRyOworCXU2NCBybV9zaXplOworCisJY29uc29sZV9vcHMud3JpdGUgPSBwczNfY29uc29sZV93cml0ZTsKKwlwbGF0Zm9ybV9vcHMuZXhpdCA9IHBzM19leGl0OworCisJcHJpbnRmKCJcbi0tIFBTMyBib290d3JhcHBlciAtLVxuIik7CisKKwlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBoZWFwc2l6ZSwgMzIsIDY0KTsKKwlmdF9pbml0KF9kdGJfc3RhcnQsIDAsIDQpOworCisJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOworCisJcHMzX3JlcG9zaXRvcnlfcmVhZF9ybV9zaXplKCZybV9zaXplKTsKKwlkdF9maXh1cF9tZW1vcnkoMCwgcm1fc2l6ZSk7CisKKwlpZiAoX2luaXRyZF9lbmQgPiBfaW5pdHJkX3N0YXJ0KSB7CisJCXNldHByb3BfdmFsKGNob3NlbiwgImxpbnV4LGluaXRyZC1zdGFydCIsICh1MzIpKF9pbml0cmRfc3RhcnQpKTsKKwkJc2V0cHJvcF92YWwoY2hvc2VuLCAibGludXgsaW5pdHJkLWVuZCIsICh1MzIpKF9pbml0cmRfZW5kKSk7CisJfQorCisJcHJlcF9jbWRsaW5lKGNob3Nlbik7CisKKwlmdF9hZGRyID0gZHRfb3BzLmZpbmFsaXplKCk7CisKKwlwczNfY29weV92ZWN0b3JzKCk7CisKKwlwcmludGYoIiBmbGF0IHRyZWUgYXQgMHglbHhcblxyIiwgZnRfYWRkcik7CisKKwkoKGtlcm5lbF9lbnRyeV90KTApKGZ0X2FkZHIsIDAsIE5VTEwpOworCisJcHMzX2V4aXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKaW5kZXggN2ZkMzIzMy4uZWFhMGQzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAlyZXR1cm4gc2NkcC0+b3BlbigpOwogfQogCi1zdGF0aWMgdm9pZCBzZXJpYWxfd3JpdGUoY2hhciAqYnVmLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgc2VyaWFsX3dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3Qgc2VyaWFsX2NvbnNvbGVfZGF0YSAqc2NkcCA9IGNvbnNvbGVfb3BzLmRhdGE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCmluZGV4IDBhOWZlZWIuLjViNTc4MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYwpAQCAtMTkwLDcgKzE5MCwxMSBAQAogCiAJCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KIAkJcXVhbGlmaWVyID0gLTE7Ci0JCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fCAqZm10ID09J1onKSB7CisJCWlmICgqZm10ID09ICdsJyAmJiAqKGZtdCArIDEpID09ICdsJykgeworCQkJcXVhbGlmaWVyID0gJ3EnOworCQkJZm10ICs9IDI7CisJCX0gZWxzZSBpZiAoKmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcKKwkJCXx8ICpmbXQgPT0gJ1onKSB7CiAJCQlxdWFsaWZpZXIgPSAqZm10OwogCQkJKytmbXQ7CiAJCX0KQEAgLTI4MSw2ICsyODUsMTAgQEAKIAkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKIAkJCWlmIChmbGFncyAmIFNJR04pCiAJCQkJbnVtID0gKHNpZ25lZCBsb25nKSBudW07CisJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdxJykgeworCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgbG9uZyBsb25nKSBudW07CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewogCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaCBiL2FyY2gvcG93ZXJwYy9ib290L3R5cGVzLmgKaW5kZXggNzlkMjZlNy4uMzEzOTNkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oCkBAIC03LDYgKzcsMTAgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXUxNjsKIHR5cGVkZWYgdW5zaWduZWQgaW50CQl1MzI7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwl1NjQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyCQlzODsKK3R5cGVkZWYgc2hvcnQJCQlzMTY7Cit0eXBlZGVmIGludAkJCXMzMjsKK3R5cGVkZWYgbG9uZyBsb25nCQlzNjQ7CiAKICNkZWZpbmUgbWluKHgseSkgKHsgXAogCXR5cGVvZih4KSBfeCA9ICh4KTsJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlciBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKaW5kZXggZGE3N2FkYy4uNjVmNjg1NCAxMDA3NTUKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCkBAIC0xNDQsNiArMTQ0LDE1IEBACiBjdWJvb3QqKQogICAgIGd6aXA9CiAgICAgOzsKK3BzMykKKyAgICBwbGF0Zm9ybW89IiRvYmplY3QvcHMzLWhlYWQubyAkb2JqZWN0L3BzMy1odmNhbGwubyAkb2JqZWN0L3BzMy5vIgorICAgIGxkcz0kb2JqZWN0L3pJbWFnZS5wczMubGRzCisgICAgZ3ppcD0KKyAgICBleHQ9YmluCisgICAgb2JqZmxhZ3M9Ii1PIGJpbmFyeSAtLXNldC1zZWN0aW9uLWZsYWdzPS5ic3M9Y29udGVudHMsYWxsb2MsbG9hZCxkYXRhIgorICAgIGtzZWN0aW9uPS5rZXJuZWw6dm1saW51eC5iaW4KKyAgICBpc2VjdGlvbj0ua2VybmVsOmluaXRyZAorICAgIDs7CiBlc2FjCiAKIHZtej0iJHRtcGRpci9gYmFzZW5hbWUgXCIka2VybmVsXCJgLiRleHQiCkBAIC0yMzksNCArMjQ4LDUwIEBACiAgICAgZmkKICAgICBleGl0IDAKICAgICA7OworcHMzKQorICAgICMgVGhlIHBzMydzIGxvYWRlciBzdXBwb3J0cyBsb2FkaW5nIGd6aXBwZWQgYmluYXJ5IGltYWdlcyBmcm9tIGZsYXNoCisgICAgIyByb20gdG8gYWRkciB6ZXJvLiBUaGUgbG9hZGVyIGVudGVycyB0aGUgaW1hZ2UgYXQgYWRkciAweDEwMC4gIEEKKyAgICAjIGJvb3R3cmFwcGVyIG92ZXJsYXkgaXMgdXNlIHRvIGFycmFuZ2UgZm9yIHRoZSBrZXJuZWwgdG8gYmUgbG9hZGVkCisgICAgIyB0byBhZGRyIHplcm8gYW5kIHRvIGhhdmUgYSBzdWl0YWJsZSBib290d3JhcHBlciBlbnRyeSBhdCAweDEwMC4KKyAgICAjIFRvIGNvbnN0cnVjdCB0aGUgcm9tIGltYWdlLCAweDEwMCBieXRlcyBmcm9tIG9mZnNldCAweDEwMCBpbiB0aGUKKyAgICAjIGtlcm5lbCBpcyBjb3BpZWQgdG8gdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9rZXJuZWwuCisgICAgIyBUaGUgMHgxMDAgYnl0ZXMgYXQgdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9vdmVybGF5IGlzCisgICAgIyB0aGVuIGNvcGllZCB0byBvZmZzZXQgMHgxMDAuICBBdCBydW50aW1lIHRoZSBib290d3JhcHBlciBwcm9ncmFtCisgICAgIyBjb3BpZXMgdGhlIDB4MTAwIGJ5dGVzIGF0IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCB0byBhZGRyIDB4MTAwLgorCisgICAgc3lzdGVtX3Jlc2V0X292ZXJsYXk9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X292ZXJsYXkkJyAgICAgICBcCisgICAgICAgIHwgY3V0IC1kJyAnIC1mMWAKKyAgICBzeXN0ZW1fcmVzZXRfb3ZlcmxheT1gcHJpbnRmICIlZCIgJHN5c3RlbV9yZXNldF9vdmVybGF5YAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCQnICAgICAgIFwKKyAgICAgICAgfCBjdXQgLWQnICcgLWYxYAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9YHByaW50ZiAiJWQiICRzeXN0ZW1fcmVzZXRfa2VybmVsYAorICAgIG92ZXJsYXlfZGVzdD0iMjU2IgorICAgIG92ZXJsYXlfc2l6ZT0iMjU2IgorCisgICAgcm0gLWYgIiRvYmplY3Qvb3RoZXJvcy5ibGQiCisKKyAgICAke0NST1NTfW9iamNvcHkgLU8gYmluYXJ5ICIkb2ZpbGUiICIkb2ZpbGUuYmluIgorCisgICAgbXNnPSQoZGQgaWY9IiRvZmlsZS5iaW4iIG9mPSIkb2ZpbGUuYmluIiBjb252PW5vdHJ1bmMgXAorICAgICAgICBza2lwPSRvdmVybGF5X2Rlc3Qgc2Vlaz0kc3lzdGVtX3Jlc2V0X2tlcm5lbCAgICAgIFwKKyAgICAgICAgY291bnQ9JG92ZXJsYXlfc2l6ZSBicz0xIDI+JjEpCisKKyAgICBpZiBbICQ/IC1uZSAiMCIgXTsgdGhlbgorICAgICAgIGVjaG8gJG1zZworICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBtc2c9JChkZCBpZj0iJG9maWxlLmJpbiIgb2Y9IiRvZmlsZS5iaW4iIGNvbnY9bm90cnVuYyBcCisgICAgICAgIHNraXA9JHN5c3RlbV9yZXNldF9vdmVybGF5IHNlZWs9JG92ZXJsYXlfZGVzdCAgICAgXAorICAgICAgICBjb3VudD0kb3ZlcmxheV9zaXplIGJzPTEgMj4mMSkKKworICAgIGlmIFsgJD8gLW5lICIwIiBdOyB0aGVuCisgICAgICAgZWNobyAkbXNnCisgICAgICAgZXhpdCAyCisgICAgZmkKKworICAgIGd6aXAgLS1mb3JjZSAtOSAtLXN0ZG91dCAiJG9maWxlLmJpbiIgPiAiJG9iamVjdC9vdGhlcm9zLmJsZCIKKyAgICA7OwogZXNhYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLnBzMy5sZHMuUyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5wczMubGRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhNDY5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5wczMubGRzLlMKQEAgLTAsMCArMSw1MCBAQAorT1VUUFVUX0FSQ0gocG93ZXJwYzpjb21tb24pCitFTlRSWShfemltYWdlX3N0YXJ0KQorRVhURVJOKF96aW1hZ2Vfc3RhcnQpCitTRUNUSU9OUworeworICBfdm1saW51eF9zdGFydCA9ICAuOworICAua2VybmVsOnZtbGludXguYmluIDogeyAqKC5rZXJuZWw6dm1saW51eC5iaW4pIH0KKyAgX3ZtbGludXhfZW5kID0gIC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfZHRiX3N0YXJ0ID0gLjsKKyAgLmtlcm5lbDpkdGIgOiB7ICooLmtlcm5lbDpkdGIpIH0KKyAgX2R0Yl9lbmQgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2luaXRyZF9zdGFydCA9ICAuOworICAua2VybmVsOmluaXRyZCA6IHsgKigua2VybmVsOmluaXRyZCkgfQorICBfaW5pdHJkX2VuZCA9ICAuOworCisgIF9zdGFydCA9IC47CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgfQorICBfZXRleHQgPSAuOworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSopCisgICAgKiguZGF0YSopCisgICAgKiguc2RhdGEqKQorICAgIF9fZ290Ml9zdGFydCA9IC47CisgICAgKiguZ290MikKKyAgICBfX2dvdDJfZW5kID0gLjsKKyAgfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2VkYXRhICA9ICAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykKKyAgICooLmJzcykKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9lbmQgPSAuIDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2hvbGx5X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2hvbGx5X2RlZmNvbmZpZwppbmRleCAzMjc4MTg0Li4wNGI5NGY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9ob2xseV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvaG9sbHlfZGVmY29uZmlnCkBAIC0xOTAsMTAgKzE5MCwxMiBAQAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMTE1MjAwIgogIyBDT05GSUdfUE0gaXMgbm90IHNldAogIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5UX0RFVklDRV9UUkVFIGlzIG5vdCBzZXQKK0NPTkZJR19XQU5UX0RFVklDRV9UUkVFPXkKK0NPTkZJR19ERVZJQ0VfVFJFRT0iaG9sbHkuZHRzIgogQ09ORklHX0lTQV9ETUFfQVBJPXkKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKaW5kZXggOTU2ZDFkZi4uZDBiNDNkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCkBAIC0xNTYsNyArMTU2LDExIEBACiBDT05GSUdfUFMzX1VTRV9MUEFSX0FERFI9eQogQ09ORklHX1BTM19WVUFSVD15CiBDT05GSUdfUFMzX1BTM0FWPXkKLUNPTkZJR19QUzNfU1lTX01BTkFHRVI9eQorQ09ORklHX1BTM19TWVNfTUFOQUdFUj1tCitDT05GSUdfUFMzX1NUT1JBR0U9eQorQ09ORklHX1BTM19ESVNLPXkKK0NPTkZJR19QUzNfUk9NPXkKK0NPTkZJR19QUzNfRkxBU0g9eQogQ09ORklHX1BQQ19DRUxMPXkKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfSUJNX0NFTExfQkxBREUgaXMgbm90IHNldApAQCAtMzM1LDcgKzMzOSw3IEBACiBDT05GSUdfQlRfTDJDQVA9bQogQ09ORklHX0JUX1NDTz1tCiBDT05GSUdfQlRfUkZDT01NPW0KLSMgQ09ORklHX0JUX1JGQ09NTV9UVFkgaXMgbm90IHNldAorQ09ORklHX0JUX1JGQ09NTV9UVFk9eQogIyBDT05GSUdfQlRfQk5FUCBpcyBub3Qgc2V0CiBDT05GSUdfQlRfSElEUD1tCiAKQEAgLTM0NCw3ICszNDgsOSBAQAogIwogQ09ORklHX0JUX0hDSVVTQj1tCiBDT05GSUdfQlRfSENJVVNCX1NDTz15Ci0jIENPTkZJR19CVF9IQ0lVQVJUIGlzIG5vdCBzZXQKK0NPTkZJR19CVF9IQ0lVQVJUPW0KK0NPTkZJR19CVF9IQ0lVQVJUX0g0PXkKK0NPTkZJR19CVF9IQ0lVQVJUX0JDU1A9eQogIyBDT05GSUdfQlRfSENJQkNNMjAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CVF9IQ0lCUEExMFggaXMgbm90IHNldAogIyBDT05GSUdfQlRfSENJQkZVU0IgaXMgbm90IHNldApAQCAtNDM1LDcgKzQ0MSw3IEBACiAjCiAjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwogIwotIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldApAQCAtNDc5LDYgKzQ4NSw3IEBACiBDT05GSUdfTUlJPW0KIENPTkZJR19ORVRERVZfMTAwMD15CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKK0NPTkZJR19HRUxJQ19ORVQ9eQogCiAjCiAjIFdpcmVsZXNzIExBTgpAQCAtNTQ2LDcgKzU1MywyNyBAQAogIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0pPWVNUSUNLPXkKKyMgQ09ORklHX0pPWVNUSUNLX0FOQUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19BM0QgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfQURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0NPQlJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0dGMksgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfR1JJUCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19HUklQX01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0dVSUxMRU1PVCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19JTlRFUkFDVCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19TSURFV0lOREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1RNREMgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfSUZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfTUFHRUxMQU4gaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VPUkIgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VCQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1NUSU5HRVIgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfVFdJREpPWSBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19KT1lEVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1hQQUQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldApAQCAtNTYzLDcgKzU5MCw3IEBACiBDT05GSUdfVlQ9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA4Niw3ICsxMTEzLDcgQEAKICMKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMTE2LDE2ICsxMTQzLDcgQEAKICMgQ09ORklHX0RFQlVHR0VSIGlzIG5vdCBzZXQKIENPTkZJR19JUlFTVEFDS1M9eQogIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0VBUkxZX0RFQlVHPXkKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19QQU5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19NQVBMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfSVNFUklFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUEFTX1JFQUxNT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19CRUFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCAzZTc3OWYwLi40MmM0MmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDggQEAKIAogb2JqLXkJCQkJOj0gc2VtYXBob3JlLm8gY3B1dGFibGUubyBwdHJhY2UubyBzeXNjYWxscy5vIFwKIAkJCQkgICBpcnEubyBhbGlnbi5vIHNpZ25hbF8zMi5vIHBtYy5vIHZkc28ubyBcCi0JCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubworCQkJCSAgIGluaXRfdGFzay5vIHByb2Nlc3MubyBzeXN0YmwubyBpZGxlLm8gXAorCQkJCSAgIHNpZ25hbC5vCiBvYmoteQkJCQkrPSB2ZHNvMzIvCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBzZXR1cF82NC5vIGJpbmZtdF9lbGYzMi5vIHN5c19wcGMzMi5vIFwKIAkJCQkgICBzaWduYWxfNjQubyBwdHJhY2UzMi5vIFwKQEAgLTY1LDkgKzY2LDkgQEAKIG1vZHVsZS0kKENPTkZJR19QUEM2NCkJCSs9IG1vZHVsZV82NC5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9ICQobW9kdWxlLXkpCiAKLXBjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8KK3BjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8gaXNhLWJyaWRnZS5vCiBwY2kzMi0kKENPTkZJR19QUEMzMikJCTo9IHBjaV8zMi5vCi1vYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpCitvYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpIHBjaS1jb21tb24ubwogb2JqLSQoQ09ORklHX1BDSV9NU0kpCQkrPSBtc2kubwoga2V4ZWMtJChDT05GSUdfUFBDNjQpCQk6PSBtYWNoaW5lX2tleGVjXzY0Lm8KIGtleGVjLSQoQ09ORklHX1BQQzMyKQkJOj0gbWFjaGluZV9rZXhlY18zMi5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggYjJiNWQ2Ni4uYjFmODAwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMjk0LDYgKzI5NCwyMSBAQAogCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IE1NQ1JBX1NJUFIsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI1IiwKIAl9LAorCXsJLyogUG93ZXI1KysgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNiMDMwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjUrIChncykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI1X1BMVVMsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDYsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjUrKyIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5vcHJvZmlsZV9tbWNyYV9zaWh2CT0gTU1DUkFfU0lIViwKKwkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBNTUNSQV9TSVBSLAorCQkucGxhdGZvcm0JCT0gInBvd2VyNSsiLAorCX0sCiAJewkvKiBQb3dlcjUgR1MgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCiAJCS5wdnJfdmFsdWUJCT0gMHgwMDNiMDAwMCwKQEAgLTExNzgsOCArMTE5Myw4IEBACiAJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1AgUmV2LiBBICovCi0JCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLAotCQkucHZyX3ZhbHVlCQk9IDB4NTMwMDA4OTEsCisJCS5wdnJfbWFzawkJPSAweGZmZjAwZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4NTMyMDA4OTEsCiAJCS5jcHVfbmFtZQkJPSAiNDQwU1AgUmV2LiBBIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLApAQCAtMTE4OCw5ICsxMjAzLDE5IEBACiAJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1BlIFJldi4gQSAqLwotCQkucHZyX21hc2sJCT0gMHhmZjAwMGZmZiwKLQkJLnB2cl92YWx1ZQkJPSAweDUzMDAwODkwLAotCQkuY3B1X25hbWUJCT0gIjQ0MFNQZSBSZXYuIEEiLAorCQkucHZyX21hc2sgICAgICAgICAgICAgICA9IDB4ZmZmMDBmZmYsCisJCS5wdnJfdmFsdWUgICAgICAgICAgICAgID0gMHg1MzQwMDg5MCwKKwkJLmNwdV9uYW1lICAgICAgICAgICAgICAgPSAiNDQwU1BlIFJldi4gQSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMgICAgICA9IENPTU1PTl9VU0VSX0JPT0tFLAorCQkuaWNhY2hlX2JzaXplICAgICAgICAgICA9IDMyLAorCQkuZGNhY2hlX2JzaXplICAgICAgICAgICA9IDMyLAorCQkucGxhdGZvcm0gICAgICAgICAgICAgICA9ICJwcGM0NDAiLAorCX0sCisJeyAvKiA0NDBTUGUgUmV2LiBCICovCisJCS5wdnJfbWFzawkJPSAweGZmZjAwZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4NTM0MDA4OTEsCisJCS5jcHVfbmFtZQkJPSAiNDQwU1BlIFJldi4gQiIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggYzg5NzIwMy4uN2Q3M2ExMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTksNyArOSw2IEBACiAgKiAgcmV3cml0dGVuIGJ5IFBhdWwgTWFja2VycmFzLgogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgogICogIE1QQzh4eCBtb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMTk5NyBEYW4gTWFsZWsgKGRtYWxla0BqbGMubmV0KS4KLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93LWxldmVsIHN1cHBvcnQgYW5kIHNldHVwIGZvciB0aGUKICAqICBQb3dlclBDIHBsYXRmb3JtLCBpbmNsdWRpbmcgdHJhcCBhbmQgaW50ZXJydXB0IGRpc3BhdGNoLgpAQCAtMzIsMTAgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCi0jaWZkZWYgQ09ORklHX0FQVVMKLSNpbmNsdWRlIDxhc20vYW1pZ2FwcGMuaD4KLSNlbmRpZgotCiAvKiA2MDEgb25seSBoYXZlIElCQVQ7IGNyMC5lcSBpcyBzZXQgb24gNjAxIHdoZW4gdXNpbmcgdGhpcyBtYWNybyAqLwogI2RlZmluZSBMT0FEX0JBVChuLCByZWcsIFJBLCBSQikJXAogCS8qIHNlZSB0aGUgY29tbWVudCBmb3IgY2xlYXJfYmF0cygpIC0tIENvcnQgKi8gXApAQCAtOTIsMTEgKzg3LDYgQEAKICAqICByNDogdmlydHVhbCBhZGRyZXNzIG9mIGJvb3RfaW5mb3NfdAogICogIHI1OiAwCiAgKgotICogQVBVUwotICogICByMzogJ0FQVVMnCi0gKiAgIHI0OiBwaHlzaWNhbCBhZGRyZXNzIG9mIG1lbW9yeSBiYXNlCi0gKiAgIExpbnV4L202OGsgc3R5bGUgQm9vdEluZm8gc3RydWN0dXJlIGF0ICZfZW5kLgotICoKICAqIFBSRVAKICAqIFRoaXMgaXMganVtcGVkIHRvIG9uIHByZXAgc3lzdGVtcyByaWdodCBhZnRlciB0aGUga2VybmVsIGlzIHJlbG9jYXRlZAogICogdG8gaXRzIHByb3BlciBwbGFjZSBpbiBtZW1vcnkgYnkgdGhlIGJvb3QgbG9hZGVyLiAgVGhlIGV4cGVjdGVkIGxheW91dApAQCAtMTUwLDE0ICsxNDAsNiBAQAogICovCiAJYmwJZWFybHlfaW5pdAogCi0jaWZkZWYgQ09ORklHX0FQVVMKLS8qIE9uIEFQVVMgdGhlIF9fdmEvX19wYSBjb25zdGFudHMgbmVlZCB0byBiZSBzZXQgdG8gdGhlIGNvcnJlY3QKLSAqIHZhbHVlcyBiZWZvcmUgY29udGludWluZy4KLSAqLwotCW1yCXI0LHIzMAotCWJsCWZpeF9tZW1fY29uc3RhbnRzCi0jZW5kaWYgLyogQ09ORklHX0FQVVMgKi8KLQogLyogU3dpdGNoIE1NVSBvZmYsIGNsZWFyIEJBVHMgYW5kIGZsdXNoIFRMQi4gQXQgdGhpcyBwb2ludCwgcjMgY29udGFpbnMKICAqIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdlIGFyZSBydW5uaW5nIGF0LCByZXR1cm5lZCBieSBlYXJseV9pbml0KCkKICAqLwpAQCAtMTY3LDcgKzE0OSw3IEBACiAJYmwJZmx1c2hfdGxicwogCiAJYmwJaW5pdGlhbF9iYXRzCi0jaWYgIWRlZmluZWQoQ09ORklHX0FQVVMpICYmIGRlZmluZWQoQ09ORklHX0JPT1RYX1RFWFQpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKIAlibAlzZXR1cF9kaXNwX2JhdAogI2VuZGlmCiAKQEAgLTE4Myw3ICsxNjUsNiBAQAogI2VuZGlmIC8qIENPTkZJR182eHggKi8KIAogCi0jaWZuZGVmIENPTkZJR19BUFVTCiAvKgogICogV2UgbmVlZCB0byBydW4gd2l0aCBfc3RhcnQgYXQgcGh5c2ljYWwgYWRkcmVzcyAwLgogICogT24gQ0hSUCwgd2UgYXJlIGxvYWRlZCBhdCAweDEwMDAwIHNpbmNlIE9GIG9uIENIUlAgdXNlcwpAQCAtMTk2LDcgKzE3Nyw2IEBACiAJYWRkaXMJcjQscjMsS0VSTkVMQkFTRUBoCS8qIGN1cnJlbnQgYWRkcmVzcyBvZiBfc3RhcnQgKi8KIAljbXB3aQkwLHI0LDAJCQkvKiBhcmUgd2UgYWxyZWFkeSBydW5uaW5nIGF0IDA/ICovCiAJYm5lCXJlbG9jYXRlX2tlcm5lbAotI2VuZGlmIC8qIENPTkZJR19BUFVTICovCiAvKgogICogd2Ugbm93IGhhdmUgdGhlIDFzdCAxNk0gb2YgcmFtIG1hcHBlZCB3aXRoIHRoZSBiYXRzLgogICogcHJlcCBuZWVkcyB0aGUgbW11IHRvIGJlIHR1cm5lZCBvbiBoZXJlLCBidXQgcG1hYyBhbHJlYWR5IGhhcyBpdCBvbi4KQEAgLTg4MSw4NSArODYxLDYgQEAKIAlhZGRpCXI2LHI2LDQKIAlibHIKIAotI2lmZGVmIENPTkZJR19BUFVTCi0vKgotICogT24gQVBVUyB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgaXMgbm90IGtub3duIGF0IGNvbXBpbGUKLSAqIHRpbWUsIHdoaWNoIG1lYW5zIHRoZSBfX3BhL19fdmEgY29uc3RhbnRzIHVzZWQgYXJlIGluY29ycmVjdC4gSW4gdGhlCi0gKiBfX2luaXQgc2VjdGlvbiBpcyByZWNvcmRlZCB0aGUgdmlydHVhbCBhZGRyZXNzZXMgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nCi0gKiB0aGVzZSBjb25zdGFudHMsIHNvIGFsbCB0aGF0IGhhcyB0byBiZSBkb25lIGlzIGZpeCB0aGVzZSBiZWZvcmUKLSAqIGNvbnRpbnVpbmcgdGhlIGtlcm5lbCBib290LgotICoKLSAqIHI0ID0gVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCBiYXNlLgotICovCi1maXhfbWVtX2NvbnN0YW50czoKLQltcglyMTAscjQKLQlhZGRpcwlyMTAscjEwLC1LRVJORUxCQVNFQGggICAgLyogdmlydF90b19waHlzIGNvbnN0YW50ICovCi0JbmVnCXIxMSxyMTAJICAgICAgICAgICAgICAgICAvKiBwaHlzX3RvX3ZpcnQgY29uc3RhbnQgKi8KLQotCWxpcwlyMTIsX192dG9wX3RhYmxlX2JlZ2luQGgKLQlvcmkJcjEyLHIxMixfX3Z0b3BfdGFibGVfYmVnaW5AbAotCWFkZAlyMTIscjEyLHIxMAkgICAgICAgICAvKiB0YWJsZSBiZWdpbiBwaHlzIGFkZHJlc3MgKi8KLQlsaXMJcjEzLF9fdnRvcF90YWJsZV9lbmRAaAotCW9yaQlyMTMscjEzLF9fdnRvcF90YWJsZV9lbmRAbAotCWFkZAlyMTMscjEzLHIxMAkgICAgICAgICAvKiB0YWJsZSBlbmQgcGh5cyBhZGRyZXNzICovCi0Jc3ViaQlyMTIscjEyLDQKLQlzdWJpCXIxMyxyMTMsNAotMToJbHd6dQlyMTQsNChyMTIpICAgICAgICAgICAgICAgLyogdmlydCBhZGRyZXNzIG9mIGluc3RydWN0aW9uICovCi0JYWRkICAgICByMTQscjE0LHIxMCAgICAgICAgICAgICAgLyogcGh5cyBhZGRyZXNzIG9mIGluc3RydWN0aW9uICovCi0JbHd6ICAgICByMTUsMChyMTQpICAgICAgICAgICAgICAgLyogaW5zdHJ1Y3Rpb24sIG5vdyBpbnNlcnQgdG9wICovCi0Jcmx3aW1pICByMTUscjEwLDE2LDE2LDMxICAgICAgICAgLyogaGFsZiBvZiB2cCBjb25zdCBpbiBsb3cgaGFsZiAqLwotCXN0dwlyMTUsMChyMTQpICAgICAgICAgICAgICAgLyogb2YgaW5zdHJ1Y3Rpb24gYW5kIHJlc3RvcmUuICovCi0JZGNic3QJcjAscjE0CQkJIC8qIHdyaXRlIGl0IHRvIG1lbW9yeSAqLwotCXN5bmMKLQlpY2JpCXIwLHIxNAkJCSAvKiBmbHVzaCB0aGUgaWNhY2hlIGxpbmUgKi8KLQljbXB3CXIxMixyMTMKLQlibmUgICAgIDFiCi0Jc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMKLQotLyoKLSAqIE1hcCB0aGUgbWVtb3J5IHdoZXJlIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgd2lsbAotICogYmUgY29waWVkIHRvIHdoZW4gaGFzaCBjb25zdGFudHMgaGF2ZSBiZWVuIHBhdGNoZWQuCi0gKi8KLSNpZmRlZiBDT05GSUdfQVBVU19GQVNUX0VYQ0VQVAotCWxpcwlyOCwweGZmZjAKLSNlbHNlCi0JbGlzCXI4LDAKLSNlbmRpZgotCW9yaQlyOCxyOCwweDIJCS8qIDEyOEtCLCBzdXBlcnZpc29yICovCi0JbXRzcHIJU1BSTl9EQkFUM1UscjgKLQltdHNwcglTUFJOX0RCQVQzTCxyOAotCi0JbGlzCXIxMixfX3B0b3ZfdGFibGVfYmVnaW5AaAotCW9yaQlyMTIscjEyLF9fcHRvdl90YWJsZV9iZWdpbkBsCi0JYWRkCXIxMixyMTIscjEwCSAgICAgICAgIC8qIHRhYmxlIGJlZ2luIHBoeXMgYWRkcmVzcyAqLwotCWxpcwlyMTMsX19wdG92X3RhYmxlX2VuZEBoCi0Jb3JpCXIxMyxyMTMsX19wdG92X3RhYmxlX2VuZEBsCi0JYWRkCXIxMyxyMTMscjEwCSAgICAgICAgIC8qIHRhYmxlIGVuZCBwaHlzIGFkZHJlc3MgKi8KLQlzdWJpCXIxMixyMTIsNAotCXN1YmkJcjEzLHIxMyw0Ci0xOglsd3p1CXIxNCw0KHIxMikgICAgICAgICAgICAgICAvKiB2aXJ0IGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlhZGQgICAgIHIxNCxyMTQscjEwICAgICAgICAgICAgICAvKiBwaHlzIGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlsd3ogICAgIHIxNSwwKHIxNCkgICAgICAgICAgICAgICAvKiBpbnN0cnVjdGlvbiwgbm93IGluc2VydCB0b3AgKi8KLQlybHdpbWkgIHIxNSxyMTEsMTYsMTYsMzEgICAgICAgICAvKiBoYWxmIG9mIHB2IGNvbnN0IGluIGxvdyBoYWxmKi8KLQlzdHcJcjE1LDAocjE0KSAgICAgICAgICAgICAgIC8qIG9mIGluc3RydWN0aW9uIGFuZCByZXN0b3JlLiAqLwotCWRjYnN0CXIwLHIxNAkJCSAvKiB3cml0ZSBpdCB0byBtZW1vcnkgKi8KLQlzeW5jCi0JaWNiaQlyMCxyMTQJCQkgLyogZmx1c2ggdGhlIGljYWNoZSBsaW5lICovCi0JY21wdwlyMTIscjEzCi0JYm5lICAgICAxYgotCi0Jc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMJCQkJLyogTm8gc3BlY3VsYXRpdmUgbG9hZGluZyB1bnRpbCBub3cgKi8KLQlibHIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGxlYXNlIG5vdGUgdGhhdCBvbiBBUFVTIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgYXJlIGxvY2F0ZWQgYXQgdGhlCi0gKiAgcGh5c2ljYWwgYWRkcmVzcyAweGZmZjAwMDAuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycwotICogIGNhbm5vdCB1c2UgcmVsYXRpdmUgYnJhbmNoZXMgdG8gYWNjZXNzIHRoZSBjb2RlIGJlbG93LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmIC8qIENPTkZJR19BUFVTICovCi0KICNpZmRlZiBDT05GSUdfU01QCiAjaWZkZWYgQ09ORklHX0dFTUlOSQogCS5nbG9ibAlfX3NlY29uZGFyeV9zdGFydF9nZW1pbmkKQEAgLTExMzUsMTkgKzEwMzYsNiBAQAogCWJsCV9fc2F2ZV9jcHVfc2V0dXAKIAlibAlNTVVfaW5pdAogCi0jaWZkZWYgQ09ORklHX0FQVVMKLQkvKiBDb3B5IGV4Y2VwdGlvbiBjb2RlIHRvIGV4Y2VwdGlvbiB2ZWN0b3IgYmFzZSBvbiBBUFVTLiAqLwotCWxpcwlyNCxLRVJORUxCQVNFQGgKLSNpZmRlZiBDT05GSUdfQVBVU19GQVNUX0VYQ0VQVAotCWxpcwlyMywweGZmZjAJCS8qIENvcHkgdG8gMHhmZmYwMDAwMCAqLwotI2Vsc2UKLQlsaXMJcjMsMAkJCS8qIENvcHkgdG8gMHgwMDAwMDAwMCAqLwotI2VuZGlmCi0JbGkJcjUsMHg0MDAwCQkvKiAjIGJ5dGVzIG9mIG1lbW9yeSB0byBjb3B5ICovCi0JbGkJcjYsMAotCWJsCWNvcHlfYW5kX2ZsdXNoCQkvKiBjb3B5IHRoZSBmaXJzdCAweDQwMDAgYnl0ZXMgKi8KLSNlbmRpZiAgLyogQ09ORklHX0FQVVMgKi8KLQogLyoKICAqIEdvIGJhY2sgdG8gcnVubmluZyB1bm1hcHBlZCBzbyB3ZSBjYW4gbG9hZCB1cCBuZXcgdmFsdWVzCiAgKiBmb3IgU0RSMSAoaGFzaCB0YWJsZSBwb2ludGVyKSBhbmQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzCkBAIC0xMzI0LDExICsxMjEyLDcgQEAKICNlbHNlCiAJb3JpCXI4LHI4LDIJCQkvKiBSL1cgYWNjZXNzICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwotI2lmZGVmIENPTkZJR19BUFVTCi0Jb3JpCXIxMSxyMTEsQkxfOE08PDJ8MHgyCS8qIHNldCB1cCA4TUIgQkFUIHJlZ2lzdGVycyBmb3IgNjA0ICovCi0jZWxzZQogCW9yaQlyMTEscjExLEJMXzI1Nk08PDJ8MHgyCS8qIHNldCB1cCBCQVQgcmVnaXN0ZXJzIGZvciA2MDQgKi8KLSNlbmRpZiAvKiBDT05GSUdfQVBVUyAqLwogCiAJbXRzcHIJU1BSTl9EQkFUMEwscjgJCS8qIE4uQi4gNnh4IChub3QgNjAxKSBoYXZlIHZhbGlkICovCiAJbXRzcHIJU1BSTl9EQkFUMFUscjExCQkvKiBiaXQgaW4gdXBwZXIgQkFUIHJlZ2lzdGVyICovCkBAIC0xMzM4LDcgKzEyMjIsNyBAQAogCWJscgogCiAKLSNpZiAhZGVmaW5lZChDT05GSUdfQVBVUykgJiYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKKyNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAogc2V0dXBfZGlzcF9iYXQ6CiAJLyoKIAkgKiBzZXR1cCB0aGUgZGlzcGxheSBiYXQgcHJlcGFyZWQgZm9yIHVzIGluIHByb20uYwpAQCAtMTM2Miw3ICsxMjQ2LDcgQEAKIDE6CW10c3ByCVNQUk5fSUJBVDNMLHI4CiAJbXRzcHIJU1BSTl9JQkFUM1UscjExCiAJYmxyCi0jZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX0FQVVMpICYmIGRlZmluZWQoQ09ORklHX0JPT1RYX1RFWFQpICovCisjZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KIAogI2lmZGVmIENPTkZJR184MjYwCiAvKiBKdW1wIGludG8gdGhlIHN5c3RlbSByZXNldCBmb3IgdGhlIHJvbS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggMTExMWZjZS4uOGNkZDQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTEwMyw4ICsxMDMsOCBAQAogCiAJLiA9IDB4NjAKIC8qCi0gKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCBvbiBwU2VyaWVzIHRvIGhvbGQgc2Vjb25kYXJ5IHByb2Nlc3NvcnMKLSAqIGluIGEgc3BpbiBsb29wIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGZyZWVkIGZyb20gT3BlbkZpcm13YXJlLCBidXQKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkIHRvIGhvbGQgc2Vjb25kYXJ5IHByb2Nlc3NvcnMKKyAqIGluIGEgc3BpbiBsb29wIGFmdGVyIHRoZXkgaGF2ZSBlbnRlcmVkIHRoZSBrZXJuZWwsIGJ1dAogICogYmVmb3JlIHRoZSBidWxrIG9mIHRoZSBrZXJuZWwgaGFzIGJlZW4gcmVsb2NhdGVkLiAgVGhpcyBjb2RlCiAgKiBpcyByZWxvY2F0ZWQgdG8gcGh5c2ljYWwgYWRkcmVzcyAweDYwIGJlZm9yZSBwcm9tX2luaXQgaXMgcnVuLgogICogQWxsIG9mIGl0IG11c3QgZml0IGJlbG93IHRoZSBmaXJzdCBleGNlcHRpb24gdmVjdG9yIGF0IDB4MTAwLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCmluZGV4IDM0YWUxMTQuLmUzMWFjYTkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCkBAIC0zNSw3ICszNSw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC02Niw3ICs2Niw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC05Nyw3ICs5Nyw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC0xNTUsMjEgKzE1NSwyMSBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwogCXdoaWxlKG4gJiYgKCFJT19DSEVDS19BTElHTih2c3JjLCA0KSB8fCAhSU9fQ0hFQ0tfQUxJR04oZGVzdCwgNCkpKSB7CiAJCSooKHU4ICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1OCAqKXZzcmMpOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJCWVpZWlvKCk7CiAJCXZzcmMrKzsKIAkJZGVzdCsrOwogCQluLS07CiAJfQogCXdoaWxlKG4gPiA0KSB7CiAJCSooKHUzMiAqKWRlc3QpID0gKigodm9sYXRpbGUgdTMyICopdnNyYyk7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKKwkJZWllaW8oKTsKIAkJdnNyYyArPSA0OwogCQlkZXN0ICs9IDQ7CiAJCW4gLT0gNDsKIAl9CiAJd2hpbGUobikgewogCQkqKCh1OCAqKWRlc3QpID0gKigodm9sYXRpbGUgdTggKil2c3JjKTsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOworCQllaWVpbygpOwogCQl2c3JjKys7CiAJCWRlc3QrKzsKIAkJbi0tOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggYzJiODRjNi4uMmZjODc4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC03LDcgKzcsNiBAQAogICogICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEgQ29ydCBEb3VnYW4KICAqICBBZGFwdGVkIGZvciBQb3dlciBNYWNpbnRvc2ggYnkgUGF1bCBNYWNrZXJyYXMKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0zMzcsNyArMzM2LDggQEAKIAogdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKIHsKLQlwcGNfbWQuaW5pdF9JUlEoKTsKKwlpZiAocHBjX21kLmluaXRfSVJRKQorCQlwcGNfbWQuaW5pdF9JUlEoKTsKICNpZmRlZiBDT05GSUdfUFBDNjQKIAlpcnFfY3R4X2luaXQoKTsKICNlbmRpZgpAQCAtNTk3LDYgKzU5Nyw0OSBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBpcnFfc2V0dXBfdmlycShzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgIGlycV9od19udW1iZXJfdCBod2lycSkKK3sKKwkvKiBDbGVhciBJUlFfTk9SRVFVRVNUIGZsYWcgKi8KKwlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKKworCS8qIG1hcCBpdCAqLworCXNtcF93bWIoKTsKKwlpcnFfbWFwW3ZpcnFdLmh3aXJxID0gaHdpcnE7CisJc21wX21iKCk7CisKKwlpZiAoaG9zdC0+b3BzLT5tYXAoaG9zdCwgdmlycSwgaHdpcnEpKSB7CisJCXByX2RlYnVnKCJpcnE6IC0+IG1hcHBpbmcgZmFpbGVkLCBmcmVlaW5nXG4iKTsKKwkJaXJxX2ZyZWVfdmlydCh2aXJxLCAxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9kaXJlY3RfbWFwcGluZyhzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlob3N0ID0gaXJxX2RlZmF1bHRfaG9zdDsKKworCUJVR19PTihob3N0ID09IE5VTEwpOworCVdBUk5fT04oaG9zdC0+cmV2bWFwX3R5cGUgIT0gSVJRX0hPU1RfTUFQX05PTUFQKTsKKworCXZpcnEgPSBpcnFfYWxsb2NfdmlydChob3N0LCAxLCAwKTsKKwlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJcHJfZGVidWcoImlycTogY3JlYXRlX2RpcmVjdCB2aXJxIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5PX0lSUTsKKwl9CisKKwlwcl9kZWJ1ZygiaXJxOiBjcmVhdGVfZGlyZWN0IG9idGFpbmVkIHZpcnEgJWRcbiIsIHZpcnEpOworCisJaWYgKGlycV9zZXR1cF92aXJxKGhvc3QsIHZpcnEsIHZpcnEpKQorCQlyZXR1cm4gTk9fSVJROworCisJcmV0dXJuIHZpcnE7Cit9CiAKIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0LAogCQkJCWlycV9od19udW1iZXJfdCBod2lycSkKQEAgLTY0NSwxOCArNjg4LDkgQEAKIAl9CiAJcHJfZGVidWcoImlycTogLT4gb2J0YWluZWQgdmlycSAlZFxuIiwgdmlycSk7CiAKLQkvKiBDbGVhciBJUlFfTk9SRVFVRVNUIGZsYWcgKi8KLQlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKLQotCS8qIG1hcCBpdCAqLwotCXNtcF93bWIoKTsKLQlpcnFfbWFwW3ZpcnFdLmh3aXJxID0gaHdpcnE7Ci0Jc21wX21iKCk7Ci0JaWYgKGhvc3QtPm9wcy0+bWFwKGhvc3QsIHZpcnEsIGh3aXJxKSkgewotCQlwcl9kZWJ1ZygiaXJxOiAtPiBtYXBwaW5nIGZhaWxlZCwgZnJlZWluZ1xuIik7Ci0JCWlycV9mcmVlX3ZpcnQodmlycSwgMSk7CisJaWYgKGlycV9zZXR1cF92aXJxKGhvc3QsIHZpcnEsIGh3aXJxKSkKIAkJcmV0dXJuIE5PX0lSUTsKLQl9CisKIAlyZXR1cm4gdmlycTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9jcmVhdGVfbWFwcGluZyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lzYS1icmlkZ2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjQ5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lzYS1icmlkZ2UuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIFJvdXRpbmVzIGZvciB0cmFja2luZyBhIGxlZ2FjeSBJU0EgYnJpZGdlCisgKgorICogQ29weXJpZ2ggMjAwNyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqCisgKiBTb21lIGJpdHMgYW5kIHBpZWNlcyBtb3ZlZCBvdmVyIGZyb20gcGNpXzY0LmMKKyAqCisgKiBDb3B5cmlnaCAyMDAzIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTSBDb3JwLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKK3Vuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2U7CS8qIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLworRVhQT1JUX1NZTUJPTChpc2FfaW9fYmFzZSk7CisKKy8qIENhY2hlZCBJU0EgYnJpZGdlIGRldi4gKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYV9icmlkZ2VfZGV2bm9kZTsKK3N0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlX3BjaWRldjsKK0VYUE9SVF9TWU1CT0xfR1BMKGlzYV9icmlkZ2VfcGNpZGV2KTsKKworI2RlZmluZSBJU0FfU1BBQ0VfTUFTSyAweDEKKyNkZWZpbmUgSVNBX1NQQUNFX0lPIDB4MQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3Byb2Nlc3NfSVNBX09GX3JhbmdlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYV9ub2RlLAorCQkJCQkJdW5zaWduZWQgbG9uZyBwaGJfaW9fYmFzZV9waHlzKQoreworCS8qIFdlIHNob3VsZCBnZXQgc29tZSBzYW5lciBwYXJzaW5nIGhlcmUgYW5kIHJlbW92ZSB0aGVzZSBzdHJ1Y3RzICovCisJc3RydWN0IHBjaV9hZGRyZXNzIHsKKwkJdTMyIGFfaGk7CisJCXUzMiBhX21pZDsKKwkJdTMyIGFfbG87CisJfTsKKworCXN0cnVjdCBpc2FfYWRkcmVzcyB7CisJCXUzMiBhX2hpOworCQl1MzIgYV9sbzsKKwl9OworCisJc3RydWN0IGlzYV9yYW5nZSB7CisJCXN0cnVjdCBpc2FfYWRkcmVzcyBpc2FfYWRkcjsKKwkJc3RydWN0IHBjaV9hZGRyZXNzIHBjaV9hZGRyOworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl9OworCisJY29uc3Qgc3RydWN0IGlzYV9yYW5nZSAqcmFuZ2U7CisJdW5zaWduZWQgbG9uZyBwY2lfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaXNhX2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHJsZW4gPSAwOworCisJcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoaXNhX25vZGUsICJyYW5nZXMiLCAmcmxlbik7CisJaWYgKHJhbmdlID09IE5VTEwgfHwgKHJsZW4gPCBzaXplb2Yoc3RydWN0IGlzYV9yYW5nZSkpKQorCQlnb3RvIGludmFsX3JhbmdlOworCisJLyogRnJvbSAiSVNBIEJpbmRpbmcgdG8gMTI3NSIKKwkgKiBUaGUgcmFuZ2VzIHByb3BlcnR5IGlzIGxhaWQgb3V0IGFzIGFuIGFycmF5IG9mIGVsZW1lbnRzLAorCSAqIGVhY2ggb2Ygd2hpY2ggY29tcHJpc2VzOgorCSAqICAgY2VsbHMgMCAtIDE6CWFuIElTQSBhZGRyZXNzCisJICogICBjZWxscyAyIC0gNDoJYSBQQ0kgYWRkcmVzcworCSAqCQkJKHNpemUgZGVwZW5kaW5nIG9uIGRldi0+bl9hZGRyX2NlbGxzKQorCSAqICAgY2VsbCA1OgkJdGhlIHNpemUgb2YgdGhlIHJhbmdlCisJICovCisJaWYgKChyYW5nZS0+aXNhX2FkZHIuYV9oaSAmJiBJU0FfU1BBQ0VfTUFTSykgIT0gSVNBX1NQQUNFX0lPKSB7CisJCXJhbmdlKys7CisJCXJsZW4gLT0gc2l6ZW9mKHN0cnVjdCBpc2FfcmFuZ2UpOworCQlpZiAocmxlbiA8IHNpemVvZihzdHJ1Y3QgaXNhX3JhbmdlKSkKKwkJCWdvdG8gaW52YWxfcmFuZ2U7CisJfQorCWlmICgocmFuZ2UtPmlzYV9hZGRyLmFfaGkgJiYgSVNBX1NQQUNFX01BU0spICE9IElTQV9TUEFDRV9JTykKKwkJZ290byBpbnZhbF9yYW5nZTsKKworCWlzYV9hZGRyID0gcmFuZ2UtPmlzYV9hZGRyLmFfbG87CisJcGNpX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmFuZ2UtPnBjaV9hZGRyLmFfbWlkIDw8IDMyIHwKKwkJcmFuZ2UtPnBjaV9hZGRyLmFfbG87CisKKwkvKiBBc3N1bWUgdGhlc2UgYXJlIGJvdGggemVyby4gTm90ZTogV2UgY291bGQgZml4IHRoYXQgYW5kCisJICogZG8gYSBwcm9wZXIgcGFyc2luZyBpbnN0ZWFkIC4uLiBvaCB3ZWxsLCB0aGF0IHdpbGwgZG8gZm9yCisJICogbm93IGFzIG5vYm9keSB1c2VzIGZhbmN5IG1hcHBpbmdzIGZvciBJU0EgYnJpZGdlcworCSAqLworCWlmICgocGNpX2FkZHIgIT0gMCkgfHwgKGlzYV9hZGRyICE9IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBpc2EgdG8gcGNpIG1hcHBpbmc6ICVzXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsaWduIHNpemUgYW5kIG1ha2Ugc3VyZSBpdCdzIGNyb3BwZWQgdG8gNjRLICovCisJc2l6ZSA9IFBBR0VfQUxJR04ocmFuZ2UtPnNpemUpOworCWlmIChzaXplID4gMHgxMDAwMCkKKwkJc2l6ZSA9IDB4MTAwMDA7CisKKwlwcmludGsoS0VSTl9FUlIgIm5vIElTQSBJTyByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2UsIgorCSAgICAgICAibWFwcGluZyA2NGtcbiIpOworCisJX19pb3JlbWFwX2F0KHBoYl9pb19iYXNlX3BoeXMsICh2b2lkICopSVNBX0lPX0JBU0UsCisJCSAgICAgc2l6ZSwgX1BBR0VfTk9fQ0FDSEV8X1BBR0VfR1VBUkRFRCk7CisJcmV0dXJuOworCitpbnZhbF9yYW5nZToKKwlwcmludGsoS0VSTl9FUlIgIm5vIElTQSBJTyByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2UsIgorCSAgICAgICAibWFwcGluZyA2NGtcbiIpOworCV9faW9yZW1hcF9hdChwaGJfaW9fYmFzZV9waHlzLCAodm9pZCAqKUlTQV9JT19CQVNFLAorCQkgICAgIDB4MTAwMDAsIF9QQUdFX05PX0NBQ0hFfF9QQUdFX0dVQVJERUQpOworfQorCisKKy8qKgorICogaXNhX2JyaWRnZV9maW5kX2Vhcmx5IC0gRmluZCBhbmQgbWFwIHRoZSBJU0EgSU8gc3BhY2UgZWFybHkgYmVmb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBtYWluIFBDSSBkaXNjb3ZlcnkuIFRoaXMgaXMgb3B0aW9uYWxseSBjYWxsZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcmNoIGNvZGUgd2hlbiBhZGRpbmcgUENJIFBIQnMgdG8gZ2V0IGVhcmx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgdG8gSVNBIElPIHBvcnRzCisgKi8KK3ZvaWQgX19pbml0IGlzYV9icmlkZ2VfZmluZF9lYXJseShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnBhcmVudCA9IE5VTEwsICp0bXA7CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gSVNBIGJyaWRnZSwgYmFpbCBvZmYgKi8KKwlpZiAoaXNhX2JyaWRnZV9kZXZub2RlICE9IE5VTEwpCisJCXJldHVybjsKKworCS8qIEZvciBlYWNoICJpc2EiIG5vZGUgaW4gdGhlIHN5c3RlbS4gTm90ZSA6IHdlIGRvIGEgc2VhcmNoIGJ5CisJICogdHlwZSBhbmQgbm90IGJ5IG5hbWUuIEl0IG1pZ2h0IGJlIGJldHRlciB0byBkbyBieSBuYW1lIGJ1dCB0aGF0J3MKKwkgKiB3aGF0IHRoZSBjb2RlIHVzZWQgdG8gZG8gYW5kIEkgZG9uJ3Qgd2FudCB0byBicmVhayB0b28gbXVjaCBhdAorCSAqIG9uY2UuIFdlIGNhbiBsb29rIGludG8gY2hhbmdpbmcgdGhhdCBzZXBhcmF0ZWx5CisJICovCisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiaXNhIikgeworCQkvKiBMb29rIGZvciBvdXIgaG9zZSBiZWluZyBhIHBhcmVudCAqLworCQlmb3IgKHBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOyBwYXJlbnQ7KSB7CisJCQlpZiAocGFyZW50ID09IGhvc2UtPmFyY2hfZGF0YSkgeworCQkJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0bXAgPSBwYXJlbnQ7CisJCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KHBhcmVudCk7CisJCQlvZl9ub2RlX3B1dCh0bXApOworCQl9CisJCWlmIChwYXJlbnQgIT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKwlpZiAobnAgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlzYV9icmlkZ2VfZGV2bm9kZSA9IG5wOworCisJLyogTm93IHBhcnNlIHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSBhbmQgc2V0dXAgdGhlIElTQSBtYXBwaW5nICovCisJcGNpX3Byb2Nlc3NfSVNBX09GX3JhbmdlcyhucCwgaG9zZS0+aW9fYmFzZV9waHlzKTsKKworCS8qIFNldCB0aGUgZ2xvYmFsIElTQSBpbyBiYXNlIHRvIGluZGljYXRlIHdlIGhhdmUgYW4gSVNBIGJyaWRnZSAqLworCWlzYV9pb19iYXNlID0gSVNBX0lPX0JBU0U7CisKKwlwcl9kZWJ1ZygiSVNBIGJyaWRnZSAoZWFybHkpIGlzICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKK30KKworLyoqCisgKiBpc2FfYnJpZGdlX2ZpbmRfbGF0ZSAtIEZpbmQgYW5kIG1hcCB0aGUgSVNBIElPIHNwYWNlIHVwb24gZGlzY292ZXJ5IG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGEgbmV3IElTQSBicmlkZ2UKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGlzYV9icmlkZ2VfZmluZF9sYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldm5vZGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CisKKwkvKiBTdG9yZSBJU0EgZGV2aWNlIG5vZGUgYW5kIFBDSSBkZXZpY2UgKi8KKwlpc2FfYnJpZGdlX2Rldm5vZGUgPSBvZl9ub2RlX2dldChkZXZub2RlKTsKKwlpc2FfYnJpZGdlX3BjaWRldiA9IHBkZXY7CisKKwkvKiBOb3cgcGFyc2UgdGhlICJyYW5nZXMiIHByb3BlcnR5IGFuZCBzZXR1cCB0aGUgSVNBIG1hcHBpbmcgKi8KKwlwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKGRldm5vZGUsIGhvc2UtPmlvX2Jhc2VfcGh5cyk7CisKKwkvKiBTZXQgdGhlIGdsb2JhbCBJU0EgaW8gYmFzZSB0byBpbmRpY2F0ZSB3ZSBoYXZlIGFuIElTQSBicmlkZ2UgKi8KKwlpc2FfaW9fYmFzZSA9IElTQV9JT19CQVNFOworCisJcHJfZGVidWcoIklTQSBicmlkZ2UgKGxhdGUpIGlzICVzIG9uICVzXG4iLAorCQkgZGV2bm9kZS0+ZnVsbF9uYW1lLCBwY2lfbmFtZShwZGV2KSk7Cit9CisKKy8qKgorICogaXNhX2JyaWRnZV9yZW1vdmUgLSBSZW1vdmUvdW5tYXAgYW4gSVNBIGJyaWRnZQorICovCitzdGF0aWMgdm9pZCBpc2FfYnJpZGdlX3JlbW92ZSh2b2lkKQoreworCXByX2RlYnVnKCJJU0EgYnJpZGdlIHJlbW92ZWQgIVxuIik7CisKKwkvKiBDbGVhciB0aGUgZ2xvYmFsIElTQSBpbyBiYXNlIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBubyBtb3JlCisJICogSVNBIGJyaWRnZS4gTm90ZSB0aGF0IGRyaXZlcnMgZG9uJ3QgcXVpdGUgaGFuZGxlIHRoYXQsIHRob3VnaAorCSAqIHdlIHNob3VsZCBwcm9iYWJseSBkbyBzb21ldGhpbmcgYWJvdXQgaXQuIEJ1dCBkbyB3ZSBldmVyIHJlYWxseQorCSAqIGhhdmUgSVNBIGJyaWRnZXMgYmVpbmcgcmVtb3ZlZCBvbiBtYWNoaW5lcyB1c2luZyBsZWdhY3kgZGV2aWNlcyA/CisJICovCisJaXNhX2lvX2Jhc2UgPSBJU0FfSU9fQkFTRTsKKworCS8qIENsZWFyIHJlZmVyZW5jZXMgdG8gdGhlIGJyaWRnZSAqLworCW9mX25vZGVfcHV0KGlzYV9icmlkZ2VfZGV2bm9kZSk7CisJaXNhX2JyaWRnZV9kZXZub2RlID0gTlVMTDsKKwlpc2FfYnJpZGdlX3BjaWRldiA9IE5VTEw7CisKKwkvKiBVbm1hcCB0aGUgSVNBIGFyZWEgKi8KKwlfX2lvdW5tYXBfYXQoKHZvaWQgKilJU0FfSU9fQkFTRSwgMHgxMDAwMCk7Cit9CisKKy8qKgorICogaXNhX2JyaWRnZV9ub3RpZnkgLSBHZXQgbm90aWZpZWQgb2YgUENJIGRldmljZXMgYWRkaXRpb24vcmVtb3ZhbAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2FfYnJpZGdlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2bm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKworCXN3aXRjaChhY3Rpb24pIHsKKwljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbiBlYXJseSBJU0EgZGV2aWNlLCB3aXRob3V0IFBDSSBkZXYgKi8KKwkJaWYgKGlzYV9icmlkZ2VfZGV2bm9kZSAmJiBpc2FfYnJpZGdlX2Rldm5vZGUgPT0gZGV2bm9kZSAmJgorCQkgICAgIWlzYV9icmlkZ2VfcGNpZGV2KSB7CisJCQlwcl9kZWJ1ZygiSVNBIGJyaWRnZSBQQ0kgYXR0YWNoZWQ6ICVzXG4iLAorCQkJCSBwY2lfbmFtZShwZGV2KSk7CisJCQlpc2FfYnJpZGdlX3BjaWRldiA9IHBkZXY7CisJCX0KKworCQkvKiBDaGVjayBpZiB3ZSBoYXZlIG5vIElTQSBkZXZpY2UsIGFuZCB0aGlzIGhhcHBlbnMgdG8gYmUgb25lLAorCQkgKiByZWdpc3RlciBpdCBhcyBzdWNoIGlmIGl0IGhhcyBhbiBPRiBkZXZpY2UKKwkJICovCisJCWlmICghaXNhX2JyaWRnZV9kZXZub2RlICYmIGRldm5vZGUgJiYgZGV2bm9kZS0+dHlwZSAmJgorCQkgICAgIXN0cmNtcChkZXZub2RlLT50eXBlLCAiaXNhIikpCisJCQlpc2FfYnJpZGdlX2ZpbmRfbGF0ZShwZGV2LCBkZXZub2RlKTsKKworCQlyZXR1cm4gMDsKKwljYXNlIEJVU19OT1RJRllfREVMX0RFVklDRToKKwkJLyogQ2hlY2sgaWYgdGhpcyBvdXIgZXhpc3RpbmcgSVNBIGRldmljZSAqLworCQlpZiAocGRldiA9PSBpc2FfYnJpZGdlX3BjaWRldiB8fAorCQkgICAgKGRldm5vZGUgJiYgZGV2bm9kZSA9PSBpc2FfYnJpZGdlX2Rldm5vZGUpKQorCQkJaXNhX2JyaWRnZV9yZW1vdmUoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlzYV9icmlkZ2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpc2FfYnJpZGdlX25vdGlmeQorfTsKKworLyoqCisgKiBpc2FfYnJpZGdlX2luaXQgLSByZWdpc3RlciB0byBiZSBub3RpZmllZCBvZiBJU0EgYnJpZGdlIGFkZGl0aW9uL3JlbW92YWwKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlzYV9icmlkZ2VfaW5pdCh2b2lkKQoreworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm4gMDsKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBjaV9idXNfdHlwZSwgJmlzYV9icmlkZ2Vfbm90aWZpZXIpOworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChpc2FfYnJpZGdlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCA5OGRlY2Y4Li5lNzA4YWI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtMzkyLDcgKzM5Miw3IEBACiAJbXRzcHIgICBTUFJOX0wxQ1NSMCxyMwogCWlzeW5jCiAJYmxyCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCiAJbWZzcHIJcjMsU1BSTl9MMUNTUjEKIAlvcmkJcjMscjMsTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSCiAJbXRzcHIJU1BSTl9MMUNTUjEscjMKQEAgLTQxOSw3ICs0MTksNyBAQAogX0dMT0JBTChfX2ZsdXNoX2ljYWNoZV9yYW5nZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKIAlhbmRjCXIzLHIzLHI1CiAJc3ViZglyNCxyMyxyNApAQCAtNTE0LDggKzUxNCw4IEBACiAgKi8KIF9HTE9CQUwoX19mbHVzaF9kY2FjaGVfaWNhY2hlKQogQkVHSU5fRlRSX1NFQ1RJT04KLQlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorCWJscgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCXJsd2lubQlyMyxyMywwLDAsMTkJCQkvKiBHZXQgcGFnZSBiYXNlIGFkZHJlc3MgKi8KIAlsaQlyNCw0MDk2L0wxX0NBQ0hFX0JZVEVTCS8qIE51bWJlciBvZiBsaW5lcyBpbiBhIHBhZ2UgKi8KIAltdGN0cglyNApAQCAtNTQzLDcgKzU0Myw3IEBACiBfR0xPQkFMKF9fZmx1c2hfZGNhY2hlX2ljYWNoZV9waHlzKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCW1mbXNyCXIxMAogCXJsd2lubQlyMCxyMTAsMCwyOCwyNgkJCS8qIGNsZWFyIERSICovCiAJbXRtc3IJcjAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggNTE5ODYxZC4uYmJiM2JhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTY0Niw2ICs2NDYsMTkgQEAKIAkvKiB0dXJuIG9mZiBtbXUgKi8KIAlibAlyZWFsX21vZGUKIAorCS8qIGNvcHkgIDB4MTAwIGJ5dGVzIHN0YXJ0aW5nIGF0IHN0YXJ0IHRvIDAgKi8KKwlsaQlyMywwCisJbXIJcjQscjMwCQkvKiBzdGFydCwgYWthIHBoeXMgbWVtIG9mZnNldCAqLworCWxpCXI1LDB4MTAwCisJbGkJcjYsMAorCWJsCS5jb3B5X2FuZF9mbHVzaAkvKiAoZGVzdCwgc3JjLCBjb3B5IGxpbWl0LCBzdGFydCBvZmZzZXQpICovCisxOgkvKiBhc3N1bWUgbm9ybWFsIGJsciByZXR1cm4gKi8KKworCS8qIHJlbGVhc2Ugb3RoZXIgY3B1cyB0byB0aGUgbmV3IGtlcm5lbCBzZWNvbmRhcnkgc3RhcnQgYXQgMHg2MCAqLworCW1mbHIJcjUKKwlsaQlyNiwxCisJc3R3CXI2LGtleGVjX2ZsYWctMWIoNSkKKwogCS8qIGNsZWFyIG91dCBoYXJkd2FyZSBoYXNoIHBhZ2UgdGFibGUgYW5kIHRsYiAqLwogCWxkCXI1LDAocjI3KQkJLyogZGVyZWYgZnVuY3Rpb24gZGVzY3JpcHRvciAqLwogCW10Y3RyCXI1CkBAIC02NzYsMTkgKzY4OSw2IEBACiAgKiAgICBhcmUgdGhlIGJvb3QgY3B1ID8/Pz8/CiAgKiAgICBvdGhlciBkZXZpY2UgdHJlZSBkaWZmZXJlbmNlcyAocHJvcCBzaXplcywgdmEgdnMgcGEsIGV0YykuLi4KICAqLwotCi0JLyogY29weSAgMHgxMDAgYnl0ZXMgc3RhcnRpbmcgYXQgc3RhcnQgdG8gMCAqLwotCWxpCXIzLDAKLQltcglyNCxyMzAKLQlsaQlyNSwweDEwMAotCWxpCXI2LDAKLQlibAkuY29weV9hbmRfZmx1c2gJLyogKGRlc3QsIHNyYywgY29weSBsaW1pdCwgc3RhcnQgb2Zmc2V0KSAqLwotMToJLyogYXNzdW1lIG5vcm1hbCBibHIgcmV0dXJuICovCi0KLQkvKiByZWxlYXNlIG90aGVyIGNwdXMgdG8gdGhlIG5ldyBrZXJuZWwgc2Vjb25kYXJ5IHN0YXJ0IGF0IDB4NjAgKi8KLQltZmxyCXI1Ci0JbGkJcjYsMQotCXN0dwlyNixrZXhlY19mbGFnLTFiKDUpCiAJbXIJcjMscjI1CSMgbXkgcGh5cyBjcHUKIAltcglyNCxyMzAJIyBzdGFydCwgYWthIHBoeXMgbWVtIG9mZnNldAogCW10bHIJNApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCmluZGV4IGQ0NTRmNjEuLjk1MzZlZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKQEAgLTQyNywxNCArNDI3LDYgQEAKIAkvKiBQcm9jZXNzICJyYW5nZXMiIHByb3BlcnR5ICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIGRldi0+bm9kZSwgMCk7CiAKLQkvKiBTZXR1cCBJTyBzcGFjZS4gV2UgdXNlIHRoZSBub24tZHluYW1pYyB2ZXJzaW9uIG9mIHRoYXQgY29kZSBoZXJlLAotCSAqIHdoaWNoIGRvZXNuJ3QgcXVpdGUgc3VwcG9ydCB1bnBsdWdnaW5nLiBOZXh0IGtlcm5lbCByZWxlYXNlIHdpbGwKLQkgKiBoYXZlIGEgYmV0dGVyIGZpeCBmb3IgdGhpcy4KLQkgKiBOb3RlIGFsc28gdGhhdCB3ZSBkb24ndCBkbyBJU0EsIHRoaXMgd2lsbCBhbHNvIGJlIGZpeGVkIHdpdGggYQotCSAqIG1vcmUgbWFzc2l2ZSByZXdvcmsuCi0JICovCi0JcGNpX3NldHVwX3BoYl9pbyhwaGIsIHBjaV9pb19iYXNlID09IDApOwotCiAJLyogSW5pdCBwY2lfZG4gZGF0YSBzdHJ1Y3R1cmVzICovCiAJcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhwaGIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjVlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvbnRhaW5zIGNvbW1vbiBwY2kgcm91dGluZXMgZm9yIEFMTCBwcGMgcGxhdGZvcm0KKyAqIChiYXNlZCBvbiBwY2lfMzIuYyBhbmQgcGNpXzY0LmMpCisgKgorICogUG9ydCBmb3IgUFBDNjQgRGF2aWQgRW5nZWJyZXRzZW4sIElCTSBDb3JwLgorICogQ29udGFpbnMgY29tbW9uIHBjaSByb3V0aW5lcyBmb3IgcHBjNjQgcGxhdGZvcm0sIHBTZXJpZXMgYW5kIGlTZXJpZXMgYnJhbmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KKyAqICAgUmV3b3JrLCBiYXNlZCBvbiBhbHBoYSBQQ0kgY29kZS4KKyAqCisgKiBDb21tb24gcG1hYy9wcmVwL2NocnAgcGNpIHJvdXRpbmVzLiAtLSBDb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhmbXQpCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKQorI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zZV9zcGlubG9jayk7CisKKy8qIFhYWCBraWxsIHRoYXQgc29tZSBkYXkgLi4uICovCitpbnQgZ2xvYmFsX3BoYl9udW1iZXI7CQkvKiBHbG9iYWwgcGhiIGNvdW50ZXIgKi8KKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaG9zZV9saXN0OworCisvKgorICogcGNpX2NvbnRyb2xsZXIocGhiKSBpbml0aWFsaXplZCBjb21tb24gdmFyaWFibGVzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3NldHVwX3BjaV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwltZW1zZXQoaG9zZSwgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlcikpOworCisJc3Bpbl9sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwlob3NlLT5nbG9iYWxfbnVtYmVyID0gZ2xvYmFsX3BoYl9udW1iZXIrKzsKKwlsaXN0X2FkZF90YWlsKCZob3NlLT5saXN0X25vZGUsICZob3NlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZob3NlX3NwaW5sb2NrKTsKK30KKworc3RydWN0IHBjaV9jb250cm9sbGVyICogcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOworCisJaWYgKG1lbV9pbml0X2RvbmUpCisJCXBoYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlciksIEdGUF9LRVJORUwpOworCWVsc2UKKwkJcGhiID0gYWxsb2NfYm9vdG1lbShzaXplb2YgKHN0cnVjdCBwY2lfY29udHJvbGxlcikpOworCWlmIChwaGIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcGNpX3NldHVwX3BjaV9jb250cm9sbGVyKHBoYik7CisJcGhiLT5hcmNoX2RhdGEgPSBkZXY7CisJcGhiLT5pc19keW5hbWljID0gbWVtX2luaXRfZG9uZTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlpZiAoZGV2KSB7CisJCWludCBuaWQgPSBvZl9ub2RlX3RvX25pZChkZXYpOworCisJCWlmIChuaWQgPCAwIHx8ICFub2RlX29ubGluZShuaWQpKQorCQkJbmlkID0gLTE7CisKKwkJUEhCX1NFVF9OT0RFKHBoYiwgbmlkKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcGhiOworfQorCit2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQoreworCXNwaW5fbG9jaygmaG9zZV9zcGlubG9jayk7CisJbGlzdF9kZWwoJnBoYi0+bGlzdF9ub2RlKTsKKwlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7CisKKwlpZiAocGhiLT5pc19keW5hbWljKQorCQlrZnJlZShwaGIpOworfQorCisvKgorICogUmV0dXJuIHRoZSBkb21haW4gbnVtYmVyIGZvciB0aGlzIGJ1cy4KKyAqLworaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCisJCXJldHVybiBob3NlLT5nbG9iYWxfbnVtYmVyOworCX0KK30KKworRVhQT1JUX1NZTUJPTChwY2lfZG9tYWluX25yKTsKKworI2lmZGVmIENPTkZJR19QUENfT0YKKworLyogVGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGJlIHVzZWQgZWFybHkgZHVyaW5nIGJvb3QsIHdoZW4gdGhlCisgKiBQQ0kgYnVzIG51bWJlcnMgaGF2ZSBub3QgeWV0IGJlZW4gYXNzaWduZWQsIGFuZCB5b3UgbmVlZCB0bworICogaXNzdWUgUENJIGNvbmZpZyBjeWNsZXMgdG8gYW4gT0YgZGV2aWNlLgorICogSXQgY291bGQgYWxzbyBiZSB1c2VkIHRvICJmaXgiIFJUQVMgY29uZmlnIGN5Y2xlcyBpZiB5b3Ugd2FudAorICogdG8gc2V0IHBjaV9hc3NpZ25fYWxsX2J1c2VzIHRvIDEgYW5kIHN0aWxsIHVzZSBSVEFTIGZvciBQQ0kKKyAqIGNvbmZpZyBjeWNsZXMuCisgKi8KK3N0cnVjdCBwY2lfY29udHJvbGxlciogcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSkKK3sKKwlpZiAoIWhhdmVfb2YpCisJCXJldHVybiBOVUxMOworCXdoaWxlKG5vZGUpIHsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpCisJCQlpZiAoaG9zZS0+YXJjaF9kYXRhID09IG5vZGUpCisJCQkJcmV0dXJuIGhvc2U7CisJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCBwY2lfc2hvd19kZXZzcGVjKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJcGRldiA9IHRvX3BjaV9kZXYgKGRldik7CisJbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisJaWYgKG5wID09IE5VTEwgfHwgbnAtPmZ1bGxfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyIsIG5wLT5mdWxsX25hbWUpOworfQorc3RhdGljIERFVklDRV9BVFRSKGRldnNwZWMsIFNfSVJVR08sIHBjaV9zaG93X2RldnNwZWMsIE5VTEwpOworI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KKworLyogQWRkIHN5c2ZzIHByb3BlcnRpZXMgKi8KK3ZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyNpZmRlZiBDT05GSUdfUFBDX09GCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCit9CisKK2NoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gc3RyOworfQorCisvKgorICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KKyAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZQorICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCisgKi8KK2ludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlEQkcoIlRyeSB0byBtYXAgaXJxIGZvciAlcy4uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOworCisjaWZkZWYgREVCVUcKKwltZW1zZXQoJm9pcnEsIDB4ZmYsIHNpemVvZihvaXJxKSk7CisjZW5kaWYKKwkvKiBUcnkgdG8gZ2V0IGEgbWFwcGluZyBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLworCWlmIChvZl9pcnFfbWFwX3BjaShwY2lfZGV2LCAmb2lycSkpIHsKKwkJdTggbGluZSwgcGluOworCisJCS8qIElmIHRoYXQgZmFpbHMsIGxldHMgZmFsbGJhY2sgdG8gd2hhdCBpcyBpbiB0aGUgY29uZmlnCisJCSAqIHNwYWNlIGFuZCBtYXAgdGhhdCB0aHJvdWdoIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuIFdlCisJCSAqIGFsc28gc2V0IHRoZSB0eXBlIHRvIGxldmVsIGxvdyBzaW5jZSB0aGF0J3Mgd2hhdCBQQ0kKKwkJICogaW50ZXJydXB0cyBhcmUuIElmIHlvdXIgcGxhdGZvcm0gZG9lcyBkaWZmZXJlbnRseSwgdGhlbgorCQkgKiBlaXRoZXIgcHJvdmlkZSBhIHByb3BlciBpbnRlcnJ1cHQgdHJlZSBvciBkb24ndCB1c2UgdGhpcworCQkgKiBmdW5jdGlvbi4KKwkJICovCisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbikpCisJCQlyZXR1cm4gLTE7CisJCWlmIChwaW4gPT0gMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJmxpbmUpIHx8CisJCSAgICBsaW5lID09IDB4ZmYpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlEQkcoIiAtPiBubyBtYXAgISBVc2luZyBpcnEgbGluZSAlZCBmcm9tIFBDSSBjb25maWdcbiIsIGxpbmUpOworCisJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgbGluZSk7CisJCWlmICh2aXJxICE9IE5PX0lSUSkKKwkJCXNldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCX0gZWxzZSB7CisJCURCRygiIC0+IGdvdCBvbmUsIHNwZWMgJWQgY2VsbHMgKDB4JTA4eCAweCUwOHguLi4pIG9uICVzXG4iLAorCQkgICAgb2lycS5zaXplLCBvaXJxLnNwZWNpZmllclswXSwgb2lycS5zcGVjaWZpZXJbMV0sCisJCSAgICBvaXJxLmNvbnRyb2xsZXItPmZ1bGxfbmFtZSk7CisKKwkJdmlycSA9IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAorCQkJCQkgICAgIG9pcnEuc2l6ZSk7CisJfQorCWlmKHZpcnEgPT0gTk9fSVJRKSB7CisJCURCRygiIC0+IGZhaWxlZCB0byBtYXAgIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlEQkcoIiAtPiBtYXBwZWQgdG8gbGludXggaXJxICVkXG4iLCB2aXJxKTsKKworCXBjaV9kZXYtPmlycSA9IHZpcnE7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOworCisvKgorICogUGxhdGZvcm0gc3VwcG9ydCBmb3IgL3Byb2MvYnVzL3BjaS9YL1kgbW1hcCgpcywKKyAqIG1vZGVsbGVkIG9uIHRoZSBzcGFyYzY0IGltcGxlbWVudGF0aW9uIGJ5IERhdmUgTWlsbGVyLgorICogIC0tIHBhdWx1cy4KKyAqLworCisvKgorICogQWRqdXN0IHZtX3Bnb2ZmIG9mIFZNQSBzdWNoIHRoYXQgaXQgaXMgdGhlIHBoeXNpY2FsIHBhZ2Ugb2Zmc2V0CisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSAzMi1iaXQgcGNpIGJ1cyBvZmZzZXQgZm9yIERFViByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCisgKgorICogQmFzaWNhbGx5LCB0aGUgdXNlciBmaW5kcyB0aGUgYmFzZSBhZGRyZXNzIGZvciBoaXMgZGV2aWNlIHdoaWNoIGhlIHdpc2hlcworICogdG8gbW1hcC4gIFRoZXkgcmVhZCB0aGUgMzItYml0IHZhbHVlIGZyb20gdGhlIGNvbmZpZyBzcGFjZSBiYXNlIHJlZ2lzdGVyLAorICogYWRkIHdoYXRldmVyIFBBR0VfU0laRSBtdWx0aXBsZSBvZmZzZXQgdGhleSB3aXNoLCBhbmQgZmVlZCB0aGlzIGludG8gdGhlCisgKiBvZmZzZXQgcGFyYW1ldGVyIG9mIG1tYXAgb24gL3Byb2MvYnVzL3BjaS9YWFggZm9yIHRoYXQgZGV2aWNlLgorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9fcGNpX21tYXBfbWFrZV9vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgIHJlc291cmNlX3NpemVfdCAqb2Zmc2V0LAorCQkJCQkgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CisJdW5zaWduZWQgbG9uZyBpb19vZmZzZXQgPSAwOworCWludCBpLCByZXNfYml0OworCisJaWYgKGhvc2UgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisKKwkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgeworI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gcGNpX3Jlc291cmNlX3RvX3VzZXIoKSBmb3Igd2h5IHRoaXMgaXMgZGlzYWJsZWQgKi8KKwkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKyNlbmRpZgorCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07CisJfSBlbHNlIHsKKwkJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJCSpvZmZzZXQgKz0gaW9fb2Zmc2V0OworCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9JTzsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCByZXF1ZXN0ZWQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZQorCSAqIHJlc291cmNlcyBvZiB0aGUgZGV2aWNlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKwkJaW50IGZsYWdzID0gcnAtPmZsYWdzOworCisJCS8qIHRyZWF0IFJPTSBhcyBtZW1vcnkgKHNob3VsZCBiZSBhbHJlYWR5KSAqLworCQlpZiAoaSA9PSBQQ0lfUk9NX1JFU09VUkNFKQorCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07CisKKwkJLyogQWN0aXZlIGFuZCBzYW1lIHR5cGU/ICovCisJCWlmICgoZmxhZ3MgJiByZXNfYml0KSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCisJCWlmICgqb2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwgKm9mZnNldCA+IHJwLT5lbmQpCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCBpdCEgY29uc3RydWN0IHRoZSBmaW5hbCBwaHlzaWNhbCBhZGRyZXNzICovCisJCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQorCQkJKm9mZnNldCArPSBob3NlLT5pb19iYXNlX3BoeXMgLSBpb19vZmZzZXQ7CisJCXJldHVybiBycDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNldCB2bV9wYWdlX3Byb3Qgb2YgVk1BLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUsIGZvciBhIHBjaQorICogZGV2aWNlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBwZ3Byb3RfdCBfX3BjaV9tbWFwX3NldF9wZ3Byb3Qoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpycCwKKwkJCQkgICAgICBwZ3Byb3RfdCBwcm90ZWN0aW9uLAorCQkJCSAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKKwkJCQkgICAgICBpbnQgd3JpdGVfY29tYmluZSkKK3sKKwl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOworCisJLyogV3JpdGUgY29tYmluZSBpcyBhbHdheXMgMCBvbiBub24tbWVtb3J5IHNwYWNlIG1hcHBpbmdzLiBPbgorCSAqIG1lbW9yeSBzcGFjZSwgaWYgdGhlIHVzZXIgZGlkbid0IHBhc3MgMSwgd2UgY2hlY2sgZm9yIGEKKwkgKiAicHJlZmV0Y2hhYmxlIiByZXNvdXJjZS4gVGhpcyBpcyBhIGJpdCBoYWNraXNoLCBidXQgd2UgdXNlCisJICogdGhpcyB0byB3b3JrYXJvdW5kIHRoZSBpbmFiaWxpdHkgb2YgL3N5c2ZzIHRvIHByb3ZpZGUgYSB3cml0ZQorCSAqIGNvbWJpbmUgYml0CisJICovCisJaWYgKG1tYXBfc3RhdGUgIT0gcGNpX21tYXBfbWVtKQorCQl3cml0ZV9jb21iaW5lID0gMDsKKwllbHNlIGlmICh3cml0ZV9jb21iaW5lID09IDApIHsKKwkJaWYgKHJwLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQl3cml0ZV9jb21iaW5lID0gMTsKKwl9CisKKwkvKiBYWFggd291bGQgYmUgbmljZSB0byBoYXZlIGEgd2F5IHRvIGFzayBmb3Igd3JpdGUtdGhyb3VnaCAqLworCXByb3QgfD0gX1BBR0VfTk9fQ0FDSEU7CisJaWYgKHdyaXRlX2NvbWJpbmUpCisJCXByb3QgJj0gfl9QQUdFX0dVQVJERUQ7CisJZWxzZQorCQlwcm90IHw9IF9QQUdFX0dVQVJERUQ7CisKKwlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Cit9CisKKy8qCisgKiBUaGlzIG9uZSBpcyB1c2VkIGJ5IC9kZXYvbWVtIGFuZCBmYmRldiB3aG8gaGF2ZSBubyBjbHVlIGFib3V0IHRoZQorICogUENJIGRldmljZSwgaXQgdHJpZXMgdG8gZmluZCB0aGUgUENJIGRldmljZSBmaXJzdCBhbmQgY2FsbHMgdGhlCisgKiBhYm92ZSByb3V0aW5lCisgKi8KK3BncHJvdF90IHBjaV9waHlzX21lbV9hY2Nlc3NfcHJvdChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgcGdwcm90X3QgcHJvdGVjdGlvbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpmb3VuZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBwcm90ID0gcGdwcm90X3ZhbChwcm90ZWN0aW9uKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBmbiA8PCBQQUdFX1NISUZUOworCWludCBpOworCisJaWYgKHBhZ2VfaXNfcmFtKHBmbikpCisJCXJldHVybiBfX3BncHJvdChwcm90KTsKKworCXByb3QgfD0gX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJnBkZXYtPnJlc291cmNlW2ldOworCQkJaW50IGZsYWdzID0gcnAtPmZsYWdzOworCisJCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KKwkJCWlmICgoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCS8qIEluIHRoZSByYW5nZSBvZiB0aGlzIHJlc291cmNlPyAqLworCQkJaWYgKG9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8CisJCQkgICAgb2Zmc2V0ID4gcnAtPmVuZCkKKwkJCQljb250aW51ZTsKKwkJCWZvdW5kID0gcnA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKSB7CisJCWlmIChmb3VuZC0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQorCQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJfQorCisJREJHKCJub24tUENJIG1hcCBmb3IgJWx4LCBwcm90OiAlbHhcbiIsIG9mZnNldCwgcHJvdCk7CisKKwlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZW1hcCBvZiB0aGUgcGFnZXMgZm9yIGEgUENJIGRldmljZSBtYXBwaW5nLCBhcworICogYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgVGhlIHJlZ2lvbiBpbiB0aGUgcHJvY2VzcyB0byBtYXAKKyAqIGlzIGRlc2NyaWJlZCBieSB2bV9zdGFydCBhbmQgdm1fZW5kIG1lbWJlcnMgb2YgVk1BLCB0aGUgYmFzZSBwaHlzaWNhbAorICogYWRkcmVzcyBpcyBmb3VuZCBpbiB2bV9wZ29mZi4KKyAqIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBpcyBwcm92aWRlZCBzbyB0aGF0IGFyY2hpdGVjdHVyZXMgbWF5IG1ha2UgbWFwcGluZworICogZGVjaXNpb25zIG9uIGEgcGVyLWRldmljZSBvciBwZXItYnVzIGJhc2lzLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIHplcm8gb24gc3VjY2Vzcy4KKyAqLworaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsIGludCB3cml0ZV9jb21iaW5lKQoreworCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJc3RydWN0IHJlc291cmNlICpycDsKKwlpbnQgcmV0OworCisJcnAgPSBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KGRldiwgJm9mZnNldCwgbW1hcF9zdGF0ZSk7CisJaWYgKHJwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOworCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCisJCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAorCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKKworCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCisJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKKwkJCSAgcmVzb3VyY2Vfc2l6ZV90ICpzdGFydCwgcmVzb3VyY2Vfc2l6ZV90ICplbmQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKKworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOworCisJLyogV2UgcGFzcyBhIGZ1bGx5IGZpeGVkIHVwIGFkZHJlc3MgdG8gdXNlcmxhbmQgZm9yIE1NSU8gaW5zdGVhZCBvZgorCSAqIGEgQkFSIHZhbHVlIGJlY2F1c2UgWCBpcyBsYW1lIGFuZCBleHBlY3RzIHRvIGJlIGFibGUgdG8gdXNlIHRoYXQKKwkgKiB0byBwYXNzIHRvIC9kZXYvbWVtICEKKwkgKgorCSAqIFRoYXQgbWVhbnMgdGhhdCB3ZSdsbCBoYXZlIHBvdGVudGlhbGx5IDY0IGJpdHMgdmFsdWVzIHdoZXJlIHNvbWUKKwkgKiB1c2VybGFuZCBhcHBzIG9ubHkgZXhwZWN0IDMyIChsaWtlIFggaXRzZWxmIHNpbmNlIGl0IHRoaW5rcyBvbmx5CisJICogU3BhcmMgaGFzIDY0IGJpdHMgTU1JTykgYnV0IGlmIHdlIGRvbid0IGRvIHRoYXQsIHdlIGJyZWFrIGl0IG9uCisJICogMzIgYml0cyBDSFJQcyA6LSgKKwkgKgorCSAqIEhvcGVmdWxseSwgdGhlIHN5c2ZzIGluc3RlcmZhY2UgaXMgaW1tdW5lIHRvIHRoYXQgZ3Vuay4gT25jZSBYCisJICogaGFzIGJlZW4gZml4ZWQgKGFuZCB0aGUgZml4IHNwcmVhZCBlbm91Z2gpLCB3ZSBjYW4gcmUtZW5hYmxlIHRoZQorCSAqIDIgbGluZXMgYmVsb3cgYW5kIHBhc3MgZG93biBhIEJBUiB2YWx1ZSB0byB1c2VybGFuZC4gSW4gdGhhdCBjYXNlCisJICogd2UnbGwgYWxzbyBoYXZlIHRvIHJlLWVuYWJsZSB0aGUgbWF0Y2hpbmcgY29kZSBpbgorCSAqIF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoKS4KKwkgKgorCSAqIEJlbkguCisJICovCisjaWYgMAorCWVsc2UgaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworI2VuZGlmCisKKwkqc3RhcnQgPSByc3JjLT5zdGFydCAtIG9mZnNldDsKKwkqZW5kID0gcnNyYy0+ZW5kIC0gb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggODY5ODIxMS4uMGFkZjA3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC01NSw4ICs1NSw3IEBACiAgKi8KIGludCBwY2lfYXNzaWduX2FsbF9idXNlczsKIAotc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlX2hlYWQ7Ci1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqKiBob3NlX3RhaWwgPSAmaG9zZV9oZWFkOworTElTVF9IRUFEKGhvc2VfbGlzdCk7CiAKIHN0YXRpYyBpbnQgcGNpX2J1c19jb3VudDsKIApAQCAtNTczLDU4ICs1NzIsNiBAQAogCX0KIH0KIAotCi1pbnQKLXBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQl1MTYgY21kLCBvbGRfY21kOwotCWludCBpZHg7Ci0Jc3RydWN0IHJlc291cmNlICpyOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0Jb2xkX2NtZCA9IGNtZDsKLQlmb3IgKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKLQkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwotCQlpZiAoIShtYXNrICYgKDE8PGlkeCkpKQotCQkJY29udGludWU7Ci0JCi0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwotCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfSU87Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQl9Ci0JaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCi0JCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JaWYgKGNtZCAhPSBvbGRfY21kKSB7Ci0JCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBuZXh0X2NvbnRyb2xsZXJfaW5kZXg7Ci0KLXN0cnVjdCBwY2lfY29udHJvbGxlciAqIF9faW5pdAotcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCi0JaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilhbGxvY19ib290bWVtKHNpemVvZigqaG9zZSkpOwotCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0KLQkqaG9zZV90YWlsID0gaG9zZTsKLQlob3NlX3RhaWwgPSAmaG9zZS0+bmV4dDsKLQotCWhvc2UtPmluZGV4ID0gbmV4dF9jb250cm9sbGVyX2luZGV4Kys7Ci0KLQlyZXR1cm4gaG9zZTsKLX0KLQogI2lmZGVmIENPTkZJR19QUENfT0YKIC8qCiAgKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgb24gT3BlbkZpcm13YXJlIG1hY2hpbmVzLgpAQCAtNjcwLDcgKzYxNyw3IEBACiBwY2liaW9zX21ha2VfT0ZfYnVzX21hcCh2b2lkKQogewogCWludCBpOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAJc3RydWN0IHByb3BlcnR5ICptYXBfcHJvcDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCkBAIC02ODcsNyArNjM0LDcgQEAKIAkJcGNpX3RvX09GX2J1c19tYXBbaV0gPSAweGZmOwogCiAJLyogRm9yIGVhY2ggaG9zZSwgd2UgYmVnaW4gc2VhcmNoaW5nIGJyaWRnZXMgKi8KLQlmb3IoaG9zZT1ob3NlX2hlYWQ7IGhvc2U7IGhvc2U9aG9zZS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGU7CQogCQlub2RlID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKWhvc2UtPmFyY2hfZGF0YTsKIAkJaWYgKCFub2RlKQpAQCAtNzY1LDcgKzcxMiw3IEBACiAKIAkvKiBBcmUgd2UgYSByb290IGJ1cyA/ICovCiAJaWYgKGJ1cy0+c2VsZiA9PSBOVUxMIHx8IGJ1cy0+cGFyZW50ID09IE5VTEwpIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cy0+bnVtYmVyKTsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CiAJCWlmIChob3NlID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKIAkJcmV0dXJuIG9mX25vZGVfZ2V0KGhvc2UtPmFyY2hfZGF0YSk7CkBAIC04MTgsMjcgKzc2NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSk7CiAKLS8qIFRoaXMgcm91dGluZSBpcyBtZWFudCB0byBiZSB1c2VkIGVhcmx5IGR1cmluZyBib290LCB3aGVuIHRoZQotICogUENJIGJ1cyBudW1iZXJzIGhhdmUgbm90IHlldCBiZWVuIGFzc2lnbmVkLCBhbmQgeW91IG5lZWQgdG8KLSAqIGlzc3VlIFBDSSBjb25maWcgY3ljbGVzIHRvIGFuIE9GIGRldmljZS4KLSAqIEl0IGNvdWxkIGFsc28gYmUgdXNlZCB0byAiZml4IiBSVEFTIGNvbmZpZyBjeWNsZXMgaWYgeW91IHdhbnQKLSAqIHRvIHNldCBwY2lfYXNzaWduX2FsbF9idXNlcyB0byAxIGFuZCBzdGlsbCB1c2UgUlRBUyBmb3IgUENJCi0gKiBjb25maWcgY3ljbGVzLgotICovCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpCi17Ci0JaWYgKCFoYXZlX29mKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZShub2RlKSB7Ci0JCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKLQkJZm9yIChob3NlPWhvc2VfaGVhZDtob3NlO2hvc2U9aG9zZS0+bmV4dCkKLQkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKLQkJCQlyZXR1cm4gaG9zZTsKLQkJbm9kZT1ub2RlLT5wYXJlbnQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgaW50CiBmaW5kX09GX3BjaV9kZXZpY2VfZmlsdGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgdm9pZCogZGF0YSkKIHsKQEAgLTEwMjcsMzQgKzk1MywxMiBAQAogCX0KIH0KIAotc3RhdGljIHNzaXplX3QgcGNpX3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCXBkZXYgPSB0b19wY2lfZGV2IChkZXYpOwotCW5wID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwotCWlmIChucCA9PSBOVUxMIHx8IG5wLT5mdWxsX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXMiLCBucC0+ZnVsbF9uYW1lKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZXZzcGVjLCBTX0lSVUdPLCBwY2lfc2hvd19kZXZzcGVjLCBOVUxMKTsKLQogI2Vsc2UgLyogQ09ORklHX1BQQ19PRiAqLwogdm9pZCBwY2liaW9zX21ha2VfT0ZfYnVzX21hcCh2b2lkKQogewogfQogI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KIAotLyogQWRkIHN5c2ZzIHByb3BlcnRpZXMgKi8KLWludCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotI2lmZGVmIENPTkZJR19QUENfT0YKLQlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCi19Ci0KLQogI2lmZGVmIENPTkZJR19QUENfUE1BQwogLyoKICAqIFRoaXMgc2V0IG9mIHJvdXRpbmVzIGNoZWNrcyBmb3IgUENJPC0+UENJIGJyaWRnZXMgdGhhdCBoYXZlIGNsb3NlZApAQCAtMTI2OSwxNCArMTE3MywxNCBAQAogc3RhdGljIGludCBfX2luaXQKIHBjaWJpb3NfaW5pdCh2b2lkKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKLQlpbnQgbmV4dF9idXNubzsKKwlpbnQgbmV4dF9idXNubyA9IDA7CiAKIAlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlXG4iKTsKIAogCS8qIFNjYW4gYWxsIG9mIHRoZSByZWNvcmRlZCBQQ0kgY29udHJvbGxlcnMuICAqLwotCWZvciAobmV4dF9idXNubyA9IDAsIGhvc2UgPSBob3NlX2hlYWQ7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7CiAJCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcykKIAkJCWhvc2UtPmZpcnN0X2J1c25vID0gbmV4dF9idXNubzsKIAkJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CkBAIC0xMzE5LDEyICsxMjIzLDYgQEAKIAogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLXVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZml4dXAoc3RydWN0IHBjaV9kZXYgKiBkZXYsIHN0cnVjdCByZXNvdXJjZSAqIHJlcywKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBzdGFydDsKLX0KLQogdm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKQEAgLTEzNDIsNyArMTI0MCw3IEBACiAJCWlmICghcmVzLT5mbGFncykgewogCQkJaWYgKGlvX29mZnNldCkKIAkJCQlwcmludGsoS0VSTl9FUlIgIkkvTyByZXNvdXJjZSBub3Qgc2V0IGZvciBob3N0IgotCQkJCSAgICAgICAiIGJyaWRnZSAlZFxuIiwgaG9zZS0+aW5kZXgpOworCQkJCSAgICAgICAiIGJyaWRnZSAlZFxuIiwgaG9zZS0+Z2xvYmFsX251bWJlcik7CiAJCQlyZXMtPnN0YXJ0ID0gMDsKIAkJCXJlcy0+ZW5kID0gSU9fU1BBQ0VfTElNSVQ7CiAJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKQEAgLTEzNTYsNyArMTI1NCw3IEBACiAJCQkJaWYgKGkgPiAwKQogCQkJCQljb250aW51ZTsKIAkJCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSByZXNvdXJjZSBub3Qgc2V0IGZvciAiCi0JCQkJICAgICAgICJob3N0IGJyaWRnZSAlZFxuIiwgaG9zZS0+aW5kZXgpOworCQkJCSAgICAgICAiaG9zdCBicmlkZ2UgJWRcbiIsIGhvc2UtPmdsb2JhbF9udW1iZXIpOwogCQkJCXJlcy0+c3RhcnQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKIAkJCQlyZXMtPmVuZCA9IH4wVTsKIAkJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CkBAIC0xMzcwLDcgKzEyNjgsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CiAJCQlpZiAoKHJlcyA9IGJ1cy0+cmVzb3VyY2VbaV0pID09IE5VTEwpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIXJlcy0+ZmxhZ3MpCisJCQlpZiAoIXJlcy0+ZmxhZ3MgfHwgYnVzLT5zZWxmLT50cmFuc3BhcmVudCkKIAkJCQljb250aW51ZTsKIAkJCWlmIChpb19vZmZzZXQgJiYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkgewogCQkJCXJlcy0+c3RhcnQgKz0gaW9fb2Zmc2V0OwpAQCAtMTM5NSwxMSArMTI5Myw2IEBACiAJfQogfQogCi1jaGFyIF9faW5pdCAqcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JcmV0dXJuIHN0cjsKLX0KLQogLyogdGhlIG5leHQgb25lIGlzIHN0b2xlbiBmcm9tIHRoZSBhbHBoYSBwb3J0Li4uICovCiB2b2lkIF9faW5pdAogcGNpYmlvc191cGRhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpcnEpCkBAIC0xNDA4LDY0ICsxMzAxLDYgQEAKIAkvKiBYWFggRklYTUUgLSB1cGRhdGUgT0YgZGV2aWNlIHRyZWUgbm9kZSBpbnRlcnJ1cHQgcHJvcGVydHkgKi8KIH0KIAotI2lmZGVmIENPTkZJR19QUENfTUVSR0UKLS8qIFhYWCBUaGlzIGlzIGEgY29weSBvZiB0aGUgcHBjNjQgdmVyc2lvbi4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2Ugc3RhcnQKLSAqIG1lcmdpbmcgdGhlIDIgUENJIGxheWVycwotICovCi0vKgotICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KLSAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZQotICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCi0gKi8KLWludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7Ci0JdW5zaWduZWQgaW50IHZpcnE7Ci0KLQlEQkcoIlRyeSB0byBtYXAgaXJxIGZvciAlcy4uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOwotCi0JLyogVHJ5IHRvIGdldCBhIG1hcHBpbmcgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKi8KLQlpZiAob2ZfaXJxX21hcF9wY2kocGNpX2RldiwgJm9pcnEpKSB7Ci0JCXU4IGxpbmUsIHBpbjsKLQotCQkvKiBJZiB0aGF0IGZhaWxzLCBsZXRzIGZhbGxiYWNrIHRvIHdoYXQgaXMgaW4gdGhlIGNvbmZpZwotCQkgKiBzcGFjZSBhbmQgbWFwIHRoYXQgdGhyb3VnaCB0aGUgZGVmYXVsdCBjb250cm9sbGVyLiBXZQotCQkgKiBhbHNvIHNldCB0aGUgdHlwZSB0byBsZXZlbCBsb3cgc2luY2UgdGhhdCdzIHdoYXQgUENJCi0JCSAqIGludGVycnVwdHMgYXJlLiBJZiB5b3VyIHBsYXRmb3JtIGRvZXMgZGlmZmVyZW50bHksIHRoZW4KLQkJICogZWl0aGVyIHByb3ZpZGUgYSBwcm9wZXIgaW50ZXJydXB0IHRyZWUgb3IgZG9uJ3QgdXNlIHRoaXMKLQkJICogZnVuY3Rpb24uCi0JCSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocGluID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZsaW5lKSB8fAotCQkgICAgbGluZSA9PSAweGZmKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJREJHKCIgLT4gbm8gbWFwICEgVXNpbmcgaXJxIGxpbmUgJWQgZnJvbSBQQ0kgY29uZmlnXG4iLCBsaW5lKTsKLQotCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGxpbmUpOwotCQlpZiAodmlycSAhPSBOT19JUlEpCi0JCQlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQl9IGVsc2UgewotCQlEQkcoIiAtPiBnb3Qgb25lLCBzcGVjICVkIGNlbGxzICgweCUwOHguLi4pIG9uICVzXG4iLAotCQkgICAgb2lycS5zaXplLCBvaXJxLnNwZWNpZmllclswXSwgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLCBvaXJxLnNwZWNpZmllciwKLQkJCQkJICAgICBvaXJxLnNpemUpOwotCX0KLQlpZih2aXJxID09IE5PX0lSUSkgewotCQlEQkcoIiAtPiBmYWlsZWQgdG8gbWFwICFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBjaV9kZXYtPmlycSA9IHZpcnE7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOwotI2VuZGlmIC8qIENPTkZJR19QUENfTUVSR0UgKi8KLQogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIHsKIAl1MTYgY21kLCBvbGRfY21kOwpAQCAtMTQ5NywyODEgKzEzMzIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHBjaV9jb250cm9sbGVyKgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlcioKIHBjaV9idXNfdG9faG9zZShpbnQgYnVzKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IGhvc2VfaGVhZDsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAKLQlmb3IgKDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQogCQlpZiAoYnVzID49IGhvc2UtPmZpcnN0X2J1c25vICYmIGJ1cyA8PSBob3NlLT5sYXN0X2J1c25vKQogCQkJcmV0dXJuIGhvc2U7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19pb21lbSAqCi1wY2lfYnVzX2lvX2Jhc2UodW5zaWduZWQgaW50IGJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0KLQlob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cyk7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaG9zZS0+aW9fYmFzZV92aXJ0OwotfQotCi11bnNpZ25lZCBsb25nCi1wY2lfYnVzX2lvX2Jhc2VfcGh5cyh1bnNpZ25lZCBpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAwOwotCXJldHVybiBob3NlLT5pb19iYXNlX3BoeXM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXBjaV9idXNfbWVtX2Jhc2VfcGh5cyh1bnNpZ25lZCBpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAwOwotCXJldHVybiBob3NlLT5wY2lfbWVtX29mZnNldDsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCi17Ci0JLyogSGFjayBhbGVydCBhZ2FpbiAhIFNlZSBjb21tZW50cyBpbiBjaHJwX3BjaS5jCi0JICovCi0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0KLQkJKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKXBkZXYtPnN5c2RhdGE7Ci0JaWYgKGhvc2UgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlyZXR1cm4gcmVzLT5zdGFydCAtIGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotCS8qIFdlIG1heSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIElPcyBoZXJlLi4uICovCi0JcmV0dXJuIHJlcy0+c3RhcnQ7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19wY2lfbW1hcF9tYWtlX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LAotCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90ICpvZmZzZXQsCi0JCQkJCSAgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGRldi0+YnVzLT5udW1iZXIpOwotCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0ID0gMDsKLQlpbnQgaSwgcmVzX2JpdDsKLQotCWlmIChob3NlID09IDApCi0JCXJldHVybiBOVUxMOwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCi0JLyogSWYgbWVtb3J5LCBhZGQgb24gdGhlIFBDSSBicmlkZ2UgYWRkcmVzcyBvZmZzZXQgKi8KLQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9tZW0pIHsKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIHBjaV9yZXNvdXJjZV90b191c2VyKCkgZm9yIHdoeSB0aGlzIGlzIGRpc2FibGVkICovCi0JCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0jZW5kaWYKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwotCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9IGhvc2UtPmlvX2Jhc2VfdmlydCAtICh2b2lkIF9faW9tZW0gKilfSU9fQkFTRTsKLQkJKm9mZnNldCArPSBpb19vZmZzZXQ7Ci0JCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHJlcXVlc3RlZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlCi0JICogcmVzb3VyY2VzIG9mIHRoZSBkZXZpY2UuCi0JICovCi0JZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpycCA9ICZkZXYtPnJlc291cmNlW2ldOwotCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJLyogdHJlYXQgUk9NIGFzIG1lbW9yeSAoc2hvdWxkIGJlIGFscmVhZHkpICovCi0JCWlmIChpID09IFBDSV9ST01fUkVTT1VSQ0UpCi0JCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKLQotCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KLQkJaWYgKChmbGFncyAmIHJlc19iaXQpID09IDApCi0JCQljb250aW51ZTsKLQotCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KLQkJaWYgKCpvZmZzZXQgPCAocnAtPnN0YXJ0ICYgUEFHRV9NQVNLKSB8fCAqb2Zmc2V0ID4gcnAtPmVuZCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZvdW5kIGl0ISBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pCi0JCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKLQkJcmV0dXJuIHJwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCi0gKiBkZXZpY2UgbWFwcGluZy4KLSAqLwotc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAotCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCi0JCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQotewotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0KLQkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCi0JICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQotCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKLQkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCi0JICogY29tYmluZSBiaXQKLQkgKi8KLQlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCi0JCXdyaXRlX2NvbWJpbmUgPSAwOwotCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgewotCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXdyaXRlX2NvbWJpbmUgPSAxOwotCX0KLQotCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKLQlpZiAod3JpdGVfY29tYmluZSkKLQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKLQllbHNlCi0JCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotLyoKLSAqIFRoaXMgb25lIGlzIHVzZWQgYnkgL2Rldi9tZW0gYW5kIGZiZGV2IHdobyBoYXZlIG5vIGNsdWUgYWJvdXQgdGhlCi0gKiBQQ0kgZGV2aWNlLCBpdCB0cmllcyB0byBmaW5kIHRoZSBQQ0kgZGV2aWNlIGZpcnN0IGFuZCBjYWxscyB0aGUKLSAqIGFib3ZlIHJvdXRpbmUKLSAqLwotcGdwcm90X3QgcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICBwZ3Byb3RfdCBwcm90ZWN0aW9uKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IGk7Ci0KLQlpZiAocGFnZV9pc19yYW0ocGZuKSkKLQkJcmV0dXJuIF9fcGdwcm90KHByb3QpOwotCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0JCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCi0JCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKLQkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQotCQkJCWNvbnRpbnVlOwotCQkJZm91bmQgPSBycDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZm91bmQpIHsKLQkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCi0JCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9Ci0KLQlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotCi0vKgotICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCi0gKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAotICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCi0gKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgotICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCi0gKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCi0gKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1pbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKLQkJCWludCB3cml0ZV9jb21iaW5lKQotewotCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0Jc3RydWN0IHJlc291cmNlICpycDsKLQlpbnQgcmV0OwotCi0JcnAgPSBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KGRldiwgJm9mZnNldCwgbW1hcF9zdGF0ZSk7Ci0JaWYgKHJwID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCi0JCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAotCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKLQotCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCi0JCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBPYnNvbGV0ZSBmdW5jdGlvbnMuIFNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIHN5bWJpb3MgZHJpdmVyCi0gKiBpcyBmaXhlZAotICovCi11bnNpZ25lZCBsb25nCi1waHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlpbnQgaTsKLQotCWZvciAoaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpIHsKLQkJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotCQkJaWYgKHBhID49IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQKLQkJCSAgICAmJiBwYSA8PSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZCkgewotCQkJCS8qCi0JCQkJICogWFhYIHRoZSBob3NlLT5wY2lfbWVtX29mZnNldCByZWFsbHkKLQkJCQkgKiBvbmx5IGFwcGxpZXMgdG8gbWVtX3Jlc291cmNlc1swXS4KLQkJCQkgKiBXZSBuZWVkIGEgd2F5IHRvIHN0b3JlIGFuIG9mZnNldCBmb3IKLQkJCQkgKiB0aGUgb3RoZXJzLiAgLS0gcGF1bHVzCi0JCQkJICovCi0JCQkJaWYgKGkgPT0gMCkKLQkJCQkJcGEgLT0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0JCQkJcmV0dXJuIHBhOwotCQkJfQotCQl9Ci0JfQotCS8qIGhtbW0sIGRpZG4ndCBmaW5kIGl0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXBjaV9waHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhLCBpbnQgYnVzbnIpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gcGNpX2J1c190b19ob3NlKGJ1c25yKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiBwYTsKLQlyZXR1cm4gcGEgLSBob3NlLT5wY2lfbWVtX29mZnNldDsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX2J1c190b19waHlzKHVuc2lnbmVkIGludCBiYSwgaW50IGJ1c25yKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXNucik7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gYmE7Ci0JcmV0dXJuIGJhICsgaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci19Ci0KIC8qIFByb3ZpZGUgaW5mb3JtYXRpb24gb24gbG9jYXRpb25zIG9mIHZhcmlvdXMgSS9PIHJlZ2lvbnMgaW4gcGh5c2ljYWwKICAqIG1lbW9yeS4gIERvIHRoaXMgb24gYSBwZXItY2FyZCBiYXNpcyBzbyB0aGF0IHdlIGNob29zZSB0aGUgcmlnaHQKICAqIHJvb3QgYnJpZGdlLgpAQCAtMTgxNCw2MiArMTM4NSwxMSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKLQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAotCQkJICByZXNvdXJjZV9zaXplX3QgKnN0YXJ0LCByZXNvdXJjZV9zaXplX3QgKmVuZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQlpZiAoaG9zZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKLQotCS8qIFdlIHBhc3MgYSBmdWxseSBmaXhlZCB1cCBhZGRyZXNzIHRvIHVzZXJsYW5kIGZvciBNTUlPIGluc3RlYWQgb2YKLQkgKiBhIEJBUiB2YWx1ZSBiZWNhdXNlIFggaXMgbGFtZSBhbmQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHVzZSB0aGF0Ci0JICogdG8gcGFzcyB0byAvZGV2L21lbSAhCi0JICoKLQkgKiBUaGF0IG1lYW5zIHRoYXQgd2UnbGwgaGF2ZSBwb3RlbnRpYWxseSA2NCBiaXRzIHZhbHVlcyB3aGVyZSBzb21lCi0JICogdXNlcmxhbmQgYXBwcyBvbmx5IGV4cGVjdCAzMiAobGlrZSBYIGl0c2VsZiBzaW5jZSBpdCB0aGlua3Mgb25seQotCSAqIFNwYXJjIGhhcyA2NCBiaXRzIE1NSU8pIGJ1dCBpZiB3ZSBkb24ndCBkbyB0aGF0LCB3ZSBicmVhayBpdCBvbgotCSAqIDMyIGJpdHMgQ0hSUHMgOi0oCi0JICoKLQkgKiBIb3BlZnVsbHksIHRoZSBzeXNmcyBpbnN0ZXJmYWNlIGlzIGltbXVuZSB0byB0aGF0IGd1bmsuIE9uY2UgWAotCSAqIGhhcyBiZWVuIGZpeGVkIChhbmQgdGhlIGZpeCBzcHJlYWQgZW5vdWdoKSwgd2UgY2FuIHJlLWVuYWJsZSB0aGUKLQkgKiAyIGxpbmVzIGJlbG93IGFuZCBwYXNzIGRvd24gYSBCQVIgdmFsdWUgdG8gdXNlcmxhbmQuIEluIHRoYXQgY2FzZQotCSAqIHdlJ2xsIGFsc28gaGF2ZSB0byByZS1lbmFibGUgdGhlIG1hdGNoaW5nIGNvZGUgaW4KLQkgKiBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KCkuCi0JICoKLQkgKiBCZW5ILgotCSAqLwotI2lmIDAKLQllbHNlIGlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCi0JKnN0YXJ0ID0gcnNyYy0+c3RhcnQgLSBvZmZzZXQ7Ci0JKmVuZCA9IHJzcmMtPmVuZCAtIG9mZnNldDsKLX0KLQotdm9pZCBfX2luaXQgcGNpX2luaXRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHJlc291cmNlX3NpemVfdCBzdGFydCwKLQkJCSAgICAgIHJlc291cmNlX3NpemVfdCBlbmQsIGludCBmbGFncywgY2hhciAqbmFtZSkKLXsKLQlyZXMtPnN0YXJ0ID0gc3RhcnQ7Ci0JcmVzLT5lbmQgPSBlbmQ7Ci0JcmVzLT5mbGFncyA9IGZsYWdzOwotCXJlcy0+bmFtZSA9IG5hbWU7Ci0JcmVzLT5wYXJlbnQgPSBOVUxMOwotCXJlcy0+c2libGluZyA9IE5VTEw7Ci0JcmVzLT5jaGlsZCA9IE5VTEw7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gaG9zZV9oZWFkOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKIAotCWZvciAoOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IGhvc2UtPmlvX3Jlc291cmNlLmVuZCAtCiAJCQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArIDE7CiAJCWlmIChhZGRyZXNzID49IGhvc2UtPmlvX2Jhc2VfcGh5cyAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggZTMwMDlhNC4uYTk3ZTIzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDEsMzUgKzQyLDIzIEBACiAKIHVuc2lnbmVkIGxvbmcgcGNpX3Byb2JlX29ubHkgPSAxOwogaW50IHBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMDsKLXN0YXRpYyBpbnQgcGNpX2luaXRpYWxfc2Nhbl9kb25lOwogCiBzdGF0aWMgdm9pZCBmaXh1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgc3RydWN0IHBjaV9kZXYgKmRldik7CiBzdGF0aWMgdm9pZCBkb19idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci1zdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpOwogCiAvKiBwY2lfaW9fYmFzZSAtLSB0aGUgYmFzZSBhZGRyZXNzIGZyb20gd2hpY2ggaW8gYmFycyBhcmUgb2Zmc2V0cy4KICAqIFRoaXMgaXMgdGhlIGxvd2VzdCBJL08gYmFzZSBhZGRyZXNzIChzbyBiYXIgdmFsdWVzIGFyZSBhbHdheXMgcG9zaXRpdmUpLAogICogYW5kIGl0ICptdXN0KiBiZSB0aGUgc3RhcnQgb2YgSVNBIHNwYWNlIGlmIGFuIElTQSBidXMgZXhpc3RzIGJlY2F1c2UKLSAqIElTQSBkcml2ZXJzIHVzZSBoYXJkIGNvZGVkIG9mZnNldHMuICBJZiBubyBJU0EgYnVzIGV4aXN0cyBhIGR1bW15Ci0gKiBwYWdlIGlzIG1hcHBlZCBhbmQgaXNhX2lvX2xpbWl0IHByZXZlbnRzIGFjY2VzcyB0byBpdC4KKyAqIElTQSBkcml2ZXJzIHVzZSBoYXJkIGNvZGVkIG9mZnNldHMuICBJZiBubyBJU0EgYnVzIGV4aXN0cyBub3RoaW5nCisgKiBpcyBtYXBwZWQgb24gdGhlIGZpcnN0IDY0SyBvZiBJTyBzcGFjZQogICovCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlOwkvKiBOVUxMIGlmIG5vIElTQSBidXMgKi8KLUVYUE9SVF9TWU1CT0woaXNhX2lvX2Jhc2UpOwotdW5zaWduZWQgbG9uZyBwY2lfaW9fYmFzZTsKK3Vuc2lnbmVkIGxvbmcgcGNpX2lvX2Jhc2UgPSBJU0FfSU9fQkFTRTsKIEVYUE9SVF9TWU1CT0wocGNpX2lvX2Jhc2UpOwogCi12b2lkIGlTZXJpZXNfcGNpYmlvc19pbml0KHZvaWQpOwotCiBMSVNUX0hFQUQoaG9zZV9saXN0KTsKIAogc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKnBjaV9kbWFfb3BzOwogCi1pbnQgZ2xvYmFsX3BoYl9udW1iZXI7CQkvKiBHbG9iYWwgcGhiIGNvdW50ZXIgKi8KLQotLyogQ2FjaGVkIElTQSBicmlkZ2UgZGV2LiAqLwotc3RydWN0IHBjaV9kZXYgKnBwYzY0X2lzYWJyaWRnZV9kZXYgPSBOVUxMOwotRVhQT1JUX1NZTUJPTF9HUEwocHBjNjRfaXNhYnJpZGdlX2Rldik7Ci0KIHZvaWQgc2V0X3BjaV9kbWFfb3BzKHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMpCiB7CiAJcGNpX2RtYV9vcHMgPSBkbWFfb3BzOwpAQCAtMTAwLDcgKzg5LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCSAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7CisJICAgICAgICBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCiAJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwpAQCAtMTE5LDcgKzEwOCw3IEBACiAJCXJldHVybjsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkgICAgICAgIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOworCSAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CiAKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQogCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKQEAgLTE1Niw3ICsxNDUsNyBAQAogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtCi0JCQkJCXBjaV9pb19iYXNlOworCQkJCQlfSU9fQkFTRTsKIAkJLyogTWFrZSBzdXJlIHdlIHN0YXJ0IGF0IG91ciBtaW4gb24gYWxsIGhvc2VzICovCiAJCWlmIChzdGFydCAtIG9mZnNldCA8IFBDSUJJT1NfTUlOX0lPKQogCQkJc3RhcnQgPSBQQ0lCSU9TX01JTl9JTyArIG9mZnNldDsKQEAgLTE4MCw1NSArMTY5LDYgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiB9CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zZV9zcGlubG9jayk7Ci0KLS8qCi0gKiBwY2lfY29udHJvbGxlcihwaGIpIGluaXRpYWxpemVkIGNvbW1vbiB2YXJpYWJsZXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQotewotCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0KLQlzcGluX2xvY2soJmhvc2Vfc3BpbmxvY2spOwotCWhvc2UtPmdsb2JhbF9udW1iZXIgPSBnbG9iYWxfcGhiX251bWJlcisrOwotCWxpc3RfYWRkX3RhaWwoJmhvc2UtPmxpc3Rfbm9kZSwgJmhvc2VfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmhvc2Vfc3BpbmxvY2spOwotfQotCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0KLQlpZiAobWVtX2luaXRfZG9uZSkKLQkJcGhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQlwaGIgPSBhbGxvY19ib290bWVtKHNpemVvZiAoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0JaWYgKHBoYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIocGhiKTsKLQlwaGItPmFyY2hfZGF0YSA9IGRldjsKLQlwaGItPmlzX2R5bmFtaWMgPSBtZW1faW5pdF9kb25lOwotCWlmIChkZXYpIHsKLQkJaW50IG5pZCA9IG9mX25vZGVfdG9fbmlkKGRldik7Ci0KLQkJaWYgKG5pZCA8IDAgfHwgIW5vZGVfb25saW5lKG5pZCkpCi0JCQluaWQgPSAtMTsKLQotCQlQSEJfU0VUX05PREUocGhiLCBuaWQpOwotCX0KLQlyZXR1cm4gcGhiOwotfQotCi12b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQotewotCXNwaW5fbG9jaygmaG9zZV9zcGlubG9jayk7Ci0JbGlzdF9kZWwoJnBoYi0+bGlzdF9ub2RlKTsKLQlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7Ci0KLQlpZiAocGhiLT5pc19keW5hbWljKQotCQlrZnJlZShwaGIpOwotfQotCiB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9idXMgKmIpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKQEAgLTI5MSw3ICsyMzEsNiBAQAogCXJldHVybiBmbGFnczsKIH0KIAotI2RlZmluZSBHRVRfNjRCSVQocHJvcCwgaSkJKCgoKHU2NCkgKHByb3ApWyhpKV0pIDw8IDMyKSB8IChwcm9wKVsoaSkrMV0pCiAKIHN0YXRpYyB2b2lkIHBjaV9wYXJzZV9vZl9hZGRycyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0zMTAsOCArMjQ5LDggQEAKIAkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MoYWRkcnNbMF0pOwogCQlpZiAoIWZsYWdzKQogCQkJY29udGludWU7Ci0JCWJhc2UgPSBHRVRfNjRCSVQoYWRkcnMsIDEpOwotCQlzaXplID0gR0VUXzY0QklUKGFkZHJzLCAzKTsKKwkJYmFzZSA9IG9mX3JlYWRfbnVtYmVyKCZhZGRyc1sxXSwgMik7CisJCXNpemUgPSBvZl9yZWFkX251bWJlcigmYWRkcnNbM10sIDIpOwogCQlpZiAoIXNpemUpCiAJCQljb250aW51ZTsKIAkJaSA9IGFkZHJzWzBdICYgMHhmZjsKQEAgLTQ3OSw3ICs0MTgsNyBAQAogCWkgPSAxOwogCWZvciAoOyBsZW4gPj0gMzI7IGxlbiAtPSAzMiwgcmFuZ2VzICs9IDgpIHsKIAkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MocmFuZ2VzWzBdKTsKLQkJc2l6ZSA9IEdFVF82NEJJVChyYW5nZXMsIDYpOworCQlzaXplID0gb2ZfcmVhZF9udW1iZXIoJnJhbmdlc1s2XSwgMik7CiAJCWlmIChmbGFncyA9PSAwIHx8IHNpemUgPT0gMCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CkBAIC00OTgsNyArNDM3LDcgQEAKIAkJCXJlcyA9IGJ1cy0+cmVzb3VyY2VbaV07CiAJCQkrK2k7CiAJCX0KLQkJcmVzLT5zdGFydCA9IEdFVF82NEJJVChyYW5nZXMsIDEpOworCQlyZXMtPnN0YXJ0ID0gb2ZfcmVhZF9udW1iZXIoJnJhbmdlc1sxXSwgMik7CiAJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIHNpemUgLSAxOwogCQlyZXMtPmZsYWdzID0gZmxhZ3M7CiAJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKQEAgLTUzNywxMCArNDc2LDE2IEBACiAJYnVzLT5zZWNvbmRhcnkgPSBob3NlLT5maXJzdF9idXNubzsKIAlob3NlLT5idXMgPSBidXM7CiAKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCisJCXBjaWJpb3NfbWFwX2lvX3NwYWNlKGJ1cyk7CisKIAlidXMtPnJlc291cmNlWzBdID0gcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCWlmIChyZXMtPmZsYWdzICYmIHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgcmVzKSkKKwlpZiAocmVzLT5mbGFncyAmJiByZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsIHJlcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBQQ0kgSU8gcmVnaW9uICIKIAkJICAgICAgICJvbiBQQ0kgZG9tYWluICUwNHhcbiIsIGhvc2UtPmdsb2JhbF9udW1iZXIpOworCQlEQkcoInJlcy0+c3RhcnQgPSAweCUwMTZseCwgcmVzLT5lbmQgPSAweCUwMTZseFxuIiwKKwkJICAgIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CiAJCXJlcyA9ICZob3NlLT5tZW1fcmVzb3VyY2VzW2ldOwpAQCAtNTk4LDE3ICs1NDMsNiBAQAogCWlmIChwcGNfbWQucGNpYmlvc19maXh1cCkKIAkJcHBjX21kLnBjaWJpb3NfZml4dXAoKTsKIAotCS8qIENhY2hlIHRoZSBsb2NhdGlvbiBvZiB0aGUgSVNBIGJyaWRnZSAoaWYgd2UgaGF2ZSBvbmUpICovCi0JcHBjNjRfaXNhYnJpZGdlX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9JU0EgPDwgOCwgTlVMTCk7Ci0JaWYgKHBwYzY0X2lzYWJyaWRnZV9kZXYgIT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIklTQSBicmlkZ2UgYXQgJXNcbiIsIHBjaV9uYW1lKHBwYzY0X2lzYWJyaWRnZV9kZXYpKTsKLQotCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKLQkJLyogbWFwIGluIFBDSSBJL08gc3BhY2UgKi8KLQkJcGhic19yZW1hcF9pbygpOwotCi0JcGNpX2luaXRpYWxfc2Nhbl9kb25lID0gMTsKLQogCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIGRvbmVcbiIpOwogCiAJcmV0dXJuIDA7CkBAIC02MTYsMTEgKzU1MCw2IEBACiAKIHN1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwogCi1jaGFyIF9faW5pdCAqcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JcmV0dXJuIHN0cjsKLX0KLQogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIHsKIAl1MTYgY21kLCBvbGRjbWQ7CkBAIC02NTEsMjIgKzU4MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBSZXR1cm4gdGhlIGRvbWFpbiBudW1iZXIgZm9yIHRoaXMgYnVzLgotICovCi1pbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm4gMDsKLQllbHNlIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7Ci0KLQkJcmV0dXJuIGhvc2UtPmdsb2JhbF9udW1iZXI7Ci0JfQotfQotCi1FWFBPUlRfU1lNQk9MKHBjaV9kb21haW5fbnIpOwotCiAvKiBEZWNpZGUgd2hldGhlciB0byBkaXNwbGF5IHRoZSBkb21haW4gbnVtYmVyIGluIC9wcm9jICovCiBpbnQgcGNpX3Byb2NfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CkBAIC02NzgsMjgxICs1OTEsNiBAQAogCX0KIH0KIAotLyoKLSAqIFBsYXRmb3JtIHN1cHBvcnQgZm9yIC9wcm9jL2J1cy9wY2kvWC9ZIG1tYXAoKXMsCi0gKiBtb2RlbGxlZCBvbiB0aGUgc3BhcmM2NCBpbXBsZW1lbnRhdGlvbiBieSBEYXZlIE1pbGxlci4KLSAqICAtLSBwYXVsdXMuCi0gKi8KLQotLyoKLSAqIEFkanVzdCB2bV9wZ29mZiBvZiBWTUEgc3VjaCB0aGF0IGl0IGlzIHRoZSBwaHlzaWNhbCBwYWdlIG9mZnNldAotICogY29ycmVzcG9uZGluZyB0byB0aGUgMzItYml0IHBjaSBidXMgb2Zmc2V0IGZvciBERVYgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLgotICoKLSAqIEJhc2ljYWxseSwgdGhlIHVzZXIgZmluZHMgdGhlIGJhc2UgYWRkcmVzcyBmb3IgaGlzIGRldmljZSB3aGljaCBoZSB3aXNoZXMKLSAqIHRvIG1tYXAuICBUaGV5IHJlYWQgdGhlIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBjb25maWcgc3BhY2UgYmFzZSByZWdpc3RlciwKLSAqIGFkZCB3aGF0ZXZlciBQQUdFX1NJWkUgbXVsdGlwbGUgb2Zmc2V0IHRoZXkgd2lzaCwgYW5kIGZlZWQgdGhpcyBpbnRvIHRoZQotICogb2Zmc2V0IHBhcmFtZXRlciBvZiBtbWFwIG9uIC9wcm9jL2J1cy9wY2kvWFhYIGZvciB0aGF0IGRldmljZS4KLSAqCi0gKiBSZXR1cm5zIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICpfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQkJCSAgICAgICByZXNvdXJjZV9zaXplX3QgKm9mZnNldCwKLQkJCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOwotCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0ID0gMDsKLQlpbnQgaSwgcmVzX2JpdDsKLQotCWlmIChob3NlID09IDApCi0JCXJldHVybiBOVUxMOwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCi0JLyogSWYgbWVtb3J5LCBhZGQgb24gdGhlIFBDSSBicmlkZ2UgYWRkcmVzcyBvZmZzZXQgKi8KLQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9tZW0pIHsKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIHBjaV9yZXNvdXJjZV90b191c2VyKCkgZm9yIHdoeSB0aGlzIGlzIGRpc2FibGVkICovCi0JCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0jZW5kaWYKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwotCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCQkqb2Zmc2V0ICs9IGlvX29mZnNldDsKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfSU87Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgcmVxdWVzdGVkIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUKLQkgKiByZXNvdXJjZXMgb2YgdGhlIGRldmljZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJmRldi0+cmVzb3VyY2VbaV07Ci0JCWludCBmbGFncyA9IHJwLT5mbGFnczsKLQotCQkvKiB0cmVhdCBST00gYXMgbWVtb3J5IChzaG91bGQgYmUgYWxyZWFkeSkgKi8KLQkJaWYgKGkgPT0gUENJX1JPTV9SRVNPVVJDRSkKLQkJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOwotCi0JCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQlpZiAoKGZsYWdzICYgcmVzX2JpdCkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEluIHRoZSByYW5nZSBvZiB0aGlzIHJlc291cmNlPyAqLwotCQlpZiAoKm9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8ICpvZmZzZXQgPiBycC0+ZW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogZm91bmQgaXQhIGNvbnN0cnVjdCB0aGUgZmluYWwgcGh5c2ljYWwgYWRkcmVzcyAqLwotCQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykKLQkJICAgICAgIAkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKLQkJcmV0dXJuIHJwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCi0gKiBkZXZpY2UgbWFwcGluZy4KLSAqLwotc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAotCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCi0JCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQotewotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0KLQkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCi0JICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQotCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKLQkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCi0JICogY29tYmluZSBiaXQKLQkgKi8KLQlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCi0JCXdyaXRlX2NvbWJpbmUgPSAwOwotCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgewotCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXdyaXRlX2NvbWJpbmUgPSAxOwotCX0KLQotCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKLQlpZiAod3JpdGVfY29tYmluZSkKLQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKLQllbHNlCi0JCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotLyoKLSAqIFRoaXMgb25lIGlzIHVzZWQgYnkgL2Rldi9tZW0gYW5kIGZiZGV2IHdobyBoYXZlIG5vIGNsdWUgYWJvdXQgdGhlCi0gKiBQQ0kgZGV2aWNlLCBpdCB0cmllcyB0byBmaW5kIHRoZSBQQ0kgZGV2aWNlIGZpcnN0IGFuZCBjYWxscyB0aGUKLSAqIGFib3ZlIHJvdXRpbmUKLSAqLwotcGdwcm90X3QgcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICBwZ3Byb3RfdCBwcm90ZWN0aW9uKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IGk7Ci0KLQlpZiAocGFnZV9pc19yYW0ocGZuKSkKLQkJcmV0dXJuIF9fcGdwcm90KHByb3QpOwotCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0JCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCi0JCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKLQkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQotCQkJCWNvbnRpbnVlOwotCQkJZm91bmQgPSBycDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZm91bmQpIHsKLQkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCi0JCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9Ci0KLQlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotCi0vKgotICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCi0gKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAotICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCi0gKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgotICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCi0gKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCi0gKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1pbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCi17Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJwOwotCWludCByZXQ7Ci0KLQlycCA9IF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoZGV2LCAmb2Zmc2V0LCBtbWFwX3N0YXRlKTsKLQlpZiAocnAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2bWEtPnZtX3Bnb2ZmID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0Jdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKLQkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCi0JCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwotCi0JcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKLQkJCSAgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBjaV9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlwZGV2ID0gdG9fcGNpX2RldiAoZGV2KTsKLQlucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKLQlpZiAobnAgPT0gTlVMTCB8fCBucC0+ZnVsbF9uYW1lID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgbnAtPmZ1bGxfbmFtZSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGV2c3BlYywgU19JUlVHTywgcGNpX3Nob3dfZGV2c3BlYywgTlVMTCk7Ci0KLWludCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWMpOwotfQotCi0jZGVmaW5lIElTQV9TUEFDRV9NQVNLIDB4MQotI2RlZmluZSBJU0FfU1BBQ0VfSU8gMHgxCi0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX25vZGUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwaGJfaW9fYmFzZV9waHlzLAotCQkJCSAgICAgIHZvaWQgX19pb21lbSAqIHBoYl9pb19iYXNlX3ZpcnQpCi17Ci0JLyogUmVtb3ZlIHRoZXNlIGFzYXAgKi8KLQotCXN0cnVjdCBwY2lfYWRkcmVzcyB7Ci0JCXUzMiBhX2hpOwotCQl1MzIgYV9taWQ7Ci0JCXUzMiBhX2xvOwotCX07Ci0KLQlzdHJ1Y3QgaXNhX2FkZHJlc3MgewotCQl1MzIgYV9oaTsKLQkJdTMyIGFfbG87Ci0JfTsKLQotCXN0cnVjdCBpc2FfcmFuZ2UgewotCQlzdHJ1Y3QgaXNhX2FkZHJlc3MgaXNhX2FkZHI7Ci0JCXN0cnVjdCBwY2lfYWRkcmVzcyBwY2lfYWRkcjsKLQkJdW5zaWduZWQgaW50IHNpemU7Ci0JfTsKLQotCWNvbnN0IHN0cnVjdCBpc2FfcmFuZ2UgKnJhbmdlOwotCXVuc2lnbmVkIGxvbmcgcGNpX2FkZHI7Ci0JdW5zaWduZWQgaW50IGlzYV9hZGRyOwotCXVuc2lnbmVkIGludCBzaXplOwotCWludCBybGVuID0gMDsKLQotCXJhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGlzYV9ub2RlLCAicmFuZ2VzIiwgJnJsZW4pOwotCWlmIChyYW5nZSA9PSBOVUxMIHx8IChybGVuIDwgc2l6ZW9mKHN0cnVjdCBpc2FfcmFuZ2UpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm5vIElTQSByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2Ugc2l6ZSwiCi0JCSAgICAgICAibWFwcGluZyA2NGtcbiIpOwotCQlfX2lvcmVtYXBfZXhwbGljaXQocGhiX2lvX2Jhc2VfcGh5cywKLQkJCQkgICAodW5zaWduZWQgbG9uZylwaGJfaW9fYmFzZV92aXJ0LAotCQkJCSAgIDB4MTAwMDAsIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JCXJldHVybjsJCi0JfQotCQotCS8qIEZyb20gIklTQSBCaW5kaW5nIHRvIDEyNzUiCi0JICogVGhlIHJhbmdlcyBwcm9wZXJ0eSBpcyBsYWlkIG91dCBhcyBhbiBhcnJheSBvZiBlbGVtZW50cywKLQkgKiBlYWNoIG9mIHdoaWNoIGNvbXByaXNlczoKLQkgKiAgIGNlbGxzIDAgLSAxOglhbiBJU0EgYWRkcmVzcwotCSAqICAgY2VsbHMgMiAtIDQ6CWEgUENJIGFkZHJlc3MgCi0JICoJCQkoc2l6ZSBkZXBlbmRpbmcgb24gZGV2LT5uX2FkZHJfY2VsbHMpCi0JICogICBjZWxsIDU6CQl0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UKLQkgKi8KLQlpZiAoKHJhbmdlLT5pc2FfYWRkci5hX2hpICYmIElTQV9TUEFDRV9NQVNLKSA9PSBJU0FfU1BBQ0VfSU8pIHsKLQkJaXNhX2FkZHIgPSByYW5nZS0+aXNhX2FkZHIuYV9sbzsKLQkJcGNpX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmFuZ2UtPnBjaV9hZGRyLmFfbWlkIDw8IDMyIHwgCi0JCQlyYW5nZS0+cGNpX2FkZHIuYV9sbzsKLQotCQkvKiBBc3N1bWUgdGhlc2UgYXJlIGJvdGggemVybyAqLwotCQlpZiAoKHBjaV9hZGRyICE9IDApIHx8IChpc2FfYWRkciAhPSAwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmV4cGVjdGVkIGlzYSB0byBwY2kgbWFwcGluZzogJXNcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNpemUgPSBQQUdFX0FMSUdOKHJhbmdlLT5zaXplKTsKLQotCQlfX2lvcmVtYXBfZXhwbGljaXQocGhiX2lvX2Jhc2VfcGh5cywgCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpIHBoYl9pb19iYXNlX3ZpcnQsIAotCQkJCSAgIHNpemUsIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JfQotfQotCiB2b2lkIF9fZGV2aW5pdCBwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgcHJpbSkKIHsKQEAgLTEwNDcsMTU1ICs2ODUsMTIyIEBACiAJfQogfQogCi12b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGhiX2lvKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IHByaW1hcnkpCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKKworaW50IHBjaWJpb3NfdW5tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSBob3NlLT5wY2lfaW9fc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGlvX3ZpcnRfb2Zmc2V0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX2RuOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAotCWlmIChzaXplID09IDApCi0JCXJldHVybjsKKwlXQVJOX09OKGJ1cyA9PSBOVUxMKTsKIAotCWhvc2UtPmlvX2Jhc2VfdmlydCA9IHJlc2VydmVfcGhiX2lvc3BhY2Uoc2l6ZSk7Ci0JREJHKCJwaGIlZCBpb19iYXNlX3BoeXMgMHglbHggaW9fYmFzZV92aXJ0IDB4JWx4XG4iLAotCQlob3NlLT5nbG9iYWxfbnVtYmVyLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCSh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQpOwotCi0JaWYgKHByaW1hcnkpIHsKLQkJcGNpX2lvX2Jhc2UgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQ7Ci0JCWlzYV9kbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpc2EiKTsKLQkJaWYgKGlzYV9kbikgewotCQkJaXNhX2lvX2Jhc2UgPSBwY2lfaW9fYmFzZTsKLQkJCXBjaV9wcm9jZXNzX0lTQV9PRl9yYW5nZXMoaXNhX2RuLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCQkJCQlob3NlLT5pb19iYXNlX3ZpcnQpOwotCQkJb2Zfbm9kZV9wdXQoaXNhX2RuKTsKLQkJfQotCX0KLQotCWlvX3ZpcnRfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7Ci0JcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCXJlcy0+c3RhcnQgKz0gaW9fdmlydF9vZmZzZXQ7Ci0JcmVzLT5lbmQgKz0gaW9fdmlydF9vZmZzZXQ7Ci0KLQkvKiBJZiB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgaW5pdGlhbCBQQ0kgc2NhbiwgdGhlbiB3ZSBuZWVkIHRvCi0JICogcHJvY2VlZCB0byBJTyBtYXBwaW5ncyBub3cKKwkvKiBJZiB0aGlzIGlzIG5vdCBhIFBIQiwgd2Ugb25seSBmbHVzaCB0aGUgaGFzaCB0YWJsZSBvdmVyCisJICogdGhlIGFyZWEgbWFwcGVkIGJ5IHRoaXMgYnJpZGdlLiBXZSBkb24ndCBwbGF5IHdpdGggdGhlIFBURQorCSAqIG1hcHBpbmdzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgdG8gZGVhbCB3aXRoIHN1Yi1wYWdlIGFsaWduZW1udHMKKwkgKiBzbyBmbHVzaGluZyB0aGUgaGFzaCB0YWJsZSBpcyB0aGUgb25seSBzYW5lIHdheSB0byBtYWtlIHN1cmUKKwkgKiB0aGF0IG5vIGhhc2ggZW50cmllcyBhcmUgY292ZXJpbmcgdGhhdCByZW1vdmVkIGJyaWRnZSBhcmVhCisJICogd2hpbGUgc3RpbGwgYWxsb3dpbmcgb3RoZXIgYnVzc2VzIG92ZXJsYXBwaW5nIHRob3NlIHBhZ2VzCiAJICovCi0JaWYgKHBjaV9pbml0aWFsX3NjYW5fZG9uZSkKLQkJX19pb3JlbWFwX2V4cGxpY2l0KGhvc2UtPmlvX2Jhc2VfcGh5cywKLQkJCQkgICAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQsCi0JCQkJICAgaG9zZS0+cGNpX2lvX3NpemUsCi0JCQkJICAgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKLX0KKwlpZiAoYnVzLT5zZWxmKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKIAotdm9pZCBfX2RldmluaXQgcGNpX3NldHVwX3BoYl9pb19keW5hbWljKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkJaW50IHByaW1hcnkpCisJCURCRygiSU8gdW5tYXBwaW5nIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKKwkJICAgIHBjaV9uYW1lKGJ1cy0+c2VsZikpOworCisJCV9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZSgmaW5pdF9tbSwgcmVzLT5zdGFydCArIF9JT19CQVNFLAorCQkJCQkgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEdldCB0aGUgaG9zdCBicmlkZ2UgKi8KKwlob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIElPcyBhbGxvY2F0ZWQgKi8KKwlpZiAoaG9zZS0+aW9fYmFzZV9hbGxvYyA9PSAwKQorCQlyZXR1cm4gMDsKKworCURCRygiSU8gdW5tYXBwaW5nIGZvciBQSEIgJXNcbiIsCisJICAgICgoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhKS0+ZnVsbF9uYW1lKTsKKwlEQkcoIiAgYWxsb2M9MHglcFxuIiwgaG9zZS0+aW9fYmFzZV9hbGxvYyk7CisKKwkvKiBUaGlzIGlzIGEgUEhCLCB3ZSBmdWxseSB1bm1hcCB0aGUgSU8gYXJlYSAqLworCXZ1bm1hcChob3NlLT5pb19iYXNlX2FsbG9jKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc191bm1hcF9pb19zcGFjZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLworCitpbnQgX19kZXZpbml0IHBjaWJpb3NfbWFwX2lvX3NwYWNlKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gaG9zZS0+cGNpX2lvX3NpemU7CisJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfcGFnZTsKKwl1bnNpZ25lZCBsb25nIHNpemVfcGFnZTsKIAl1bnNpZ25lZCBsb25nIGlvX3ZpcnRfb2Zmc2V0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAotCWlmIChzaXplID09IDApCi0JCXJldHVybjsKKwlXQVJOX09OKGJ1cyA9PSBOVUxMKTsKIAotCWhvc2UtPmlvX2Jhc2VfdmlydCA9IF9faW9yZW1hcChob3NlLT5pb19iYXNlX3BoeXMsIHNpemUsCi0JCQkJCV9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JREJHKCJwaGIlZCBpb19iYXNlX3BoeXMgMHglbHggaW9fYmFzZV92aXJ0IDB4JWx4XG4iLAotCQlob3NlLT5nbG9iYWxfbnVtYmVyLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCSh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQpOwotCi0JaWYgKHByaW1hcnkpCi0JCXBjaV9pb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0OwotCi0JaW9fdmlydF9vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQlyZXMgPSAmaG9zZS0+aW9fcmVzb3VyY2U7Ci0JcmVzLT5zdGFydCArPSBpb192aXJ0X29mZnNldDsKLQlyZXMtPmVuZCArPSBpb192aXJ0X29mZnNldDsKLX0KLQotCi1zdGF0aWMgaW50IGdldF9idXNfaW9fcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgbG9uZyAqc3RhcnRfcGh5cywKLQkJCQl1bnNpZ25lZCBsb25nICpzdGFydF92aXJ0LCB1bnNpZ25lZCBsb25nICpzaXplKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCi0JaWYgKGJ1cy0+c2VsZikKLQkJcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKLQllbHNlCi0JCS8qIFJvb3QgQnVzICovCi0JCXJlcyA9ICZob3NlLT5pb19yZXNvdXJjZTsKLQotCWlmIChyZXMtPmVuZCA9PSAwICYmIHJlcy0+c3RhcnQgPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQkqc3RhcnRfdmlydCA9IHBjaV9pb19iYXNlICsgcmVzLT5zdGFydDsKLQkqc3RhcnRfcGh5cyA9ICpzdGFydF92aXJ0ICsgaG9zZS0+aW9fYmFzZV9waHlzCi0JCS0gKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydDsKLQotCWlmIChyZXMtPmVuZCA+IHJlcy0+c3RhcnQpCi0JCSpzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKLQllbHNlIHsKLQkJcHJpbnRrKCIlcygpOiB1bmV4cGVjdGVkIHJlZ2lvbiAweCVseC0+MHglbHhcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKLQkJcmV0dXJuIDE7CisJLyogSWYgdGhpcyBub3QgYSBQSEIsIG5vdGhpbmcgdG8gZG8sIHBhZ2UgdGFibGVzIHN0aWxsIGV4aXN0IGFuZAorCSAqIHRodXMgSFBURXMgd2lsbCBiZSBmYXVsdGVkIGluIHdoZW4gbmVlZGVkCisJICovCisJaWYgKGJ1cy0+c2VsZikgeworCQlEQkcoIklPIG1hcHBpbmcgZm9yIFBDSS1QQ0kgYnJpZGdlICVzXG4iLAorCQkgICAgcGNpX25hbWUoYnVzLT5zZWxmKSk7CisJCURCRygiICB2aXJ0PTB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJCSAgICBidXMtPnJlc291cmNlWzBdLT5zdGFydCArIF9JT19CQVNFLAorCQkgICAgYnVzLT5yZXNvdXJjZVswXS0+ZW5kICsgX0lPX0JBU0UpOworCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBHZXQgdGhlIGhvc3QgYnJpZGdlICovCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXBoeXNfcGFnZSA9IF9BTElHTl9ET1dOKGhvc2UtPmlvX2Jhc2VfcGh5cywgUEFHRV9TSVpFKTsKKwlzaXplX3BhZ2UgPSBfQUxJR05fVVAoaG9zZS0+cGNpX2lvX3NpemUsIFBBR0VfU0laRSk7CisKKwkvKiBNYWtlIHN1cmUgSU8gYXJlYSBhZGRyZXNzIGlzIGNsZWFyICovCisJaG9zZS0+aW9fYmFzZV9hbGxvYyA9IE5VTEw7CisKKwkvKiBJZiB0aGVyZSdzIG5vIElPIHRvIG1hcCBvbiB0aGF0IGJ1cywgZ2V0IGF3YXkgdG9vICovCisJaWYgKGhvc2UtPnBjaV9pb19zaXplID09IDAgfHwgaG9zZS0+aW9fYmFzZV9waHlzID09IDApCisJCXJldHVybiAwOworCisJLyogTGV0J3MgYWxsb2NhdGUgc29tZSBJTyBzcGFjZSBmb3IgdGhhdCBndXkuIFdlIGRvbid0IHBhc3MKKwkgKiBWTV9JT1JFTUFQIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCBhbGlnbm1lbnQgdHJpY2tzIHRoYXQKKwkgKiB0aGUgY29yZSBkb2VzIGluIHRoYXQgY2FzZS4gTWF5YmUgd2Ugc2hvdWxkIGR1ZSB0byBzdHVwaWQgY2FyZAorCSAqIHdpdGggaW5jb21wbGV0ZSBhZGRyZXNzIGRlY29kaW5nIGJ1dCBJJ2QgcmF0aGVyIG5vdCBkZWFsIHdpdGgKKwkgKiB0aG9zZSBvdXRzaWRlIG9mIHRoZSByZXNlcnZlZCA2NEsgbGVnYWN5IHJlZ2lvbi4KKwkgKi8KKwlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplX3BhZ2UsIDAsIFBIQl9JT19CQVNFLCBQSEJfSU9fRU5EKTsKKwlpZiAoYXJlYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3NlLT5pb19iYXNlX2FsbG9jID0gYXJlYS0+YWRkcjsKKwlob3NlLT5pb19iYXNlX3ZpcnQgPSAodm9pZCBfX2lvbWVtICopKGFyZWEtPmFkZHIgKworCQkJCQkgICAgICBob3NlLT5pb19iYXNlX3BoeXMgLSBwaHlzX3BhZ2UpOworCisJREJHKCJJTyBtYXBwaW5nIGZvciBQSEIgJXNcbiIsCisJICAgICgoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhKS0+ZnVsbF9uYW1lKTsKKwlEQkcoIiAgcGh5cz0weCUwMTZseCwgdmlydD0weCVwIChhbGxvYz0weCVwKVxuIiwKKwkgICAgaG9zZS0+aW9fYmFzZV9waHlzLCBob3NlLT5pb19iYXNlX3ZpcnQsIGhvc2UtPmlvX2Jhc2VfYWxsb2MpOworCURCRygiICBzaXplPTB4JTAxNmx4IChhbGxvYz0weCUwMTZseClcbiIsCisJICAgIGhvc2UtPnBjaV9pb19zaXplLCBzaXplX3BhZ2UpOworCisJLyogRXN0YWJsaXNoIHRoZSBtYXBwaW5nICovCisJaWYgKF9faW9yZW1hcF9hdChwaHlzX3BhZ2UsIGFyZWEtPmFkZHIsIHNpemVfcGFnZSwKKwkJCSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRml4dXAgaG9zZSBJTyByZXNvdXJjZSAqLworCWlvX3ZpcnRfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gaW9fdmlydF9vZmZzZXQ7CisJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IGlvX3ZpcnRfb2Zmc2V0OworCisJREJHKCIgIGhvc2UtPmlvX3Jlc291cmNlPTB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOworCiAJcmV0dXJuIDA7CiB9Ci0KLWludCB1bm1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BoeXM7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF92aXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCWlmICghYnVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSBleHBlY3RlZCBidXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlpZiAoZ2V0X2J1c19pb19yYW5nZShidXMsICZzdGFydF9waHlzLCAmc3RhcnRfdmlydCwgJnNpemUpKQotCQlyZXR1cm4gMTsKLQlpZiAoX19pb3VubWFwX2V4cGxpY2l0KCh2b2lkIF9faW9tZW0gKikgc3RhcnRfdmlydCwgc2l6ZSkpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHVubWFwX2J1c19yYW5nZSk7Ci0KLWludCByZW1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BoeXM7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF92aXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCWlmICghYnVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSBleHBlY3RlZCBidXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQkKLQlpZiAoZ2V0X2J1c19pb19yYW5nZShidXMsICZzdGFydF9waHlzLCAmc3RhcnRfdmlydCwgJnNpemUpKQotCQlyZXR1cm4gMTsKLQlpZiAoc3RhcnRfcGh5cyA9PSAwKQotCQlyZXR1cm4gMTsKLQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGluZyBJTyAlbHggLT4gJWx4LCBzaXplOiAlbHhcbiIsIHN0YXJ0X3BoeXMsIHN0YXJ0X3ZpcnQsIHNpemUpOwotCWlmIChfX2lvcmVtYXBfZXhwbGljaXQoc3RhcnRfcGh5cywgc3RhcnRfdmlydCwgc2l6ZSwKLQkJCSAgICAgICBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChyZW1hcF9idXNfcmFuZ2UpOwotCi1zdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQotCQlyZW1hcF9idXNfcmFuZ2UoaG9zZS0+YnVzKTsKLX0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaWJpb3NfbWFwX2lvX3NwYWNlKTsKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewpAQCAtMTIwMyw4ICs4MDgsNyBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7Ci0JCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCQlyZXMtPnN0YXJ0ICs9IG9mZnNldDsKIAkJcmVzLT5lbmQgKz0gb2Zmc2V0OwogCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CkBAIC0xMjE5LDkgKzgyMywyMCBAQAogCS8qIFVwZGF0ZSBkZXZpY2UgcmVzb3VyY2VzLiAgKi8KIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKQotCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncykKLQkJCWZpeHVwX3Jlc291cmNlKCZkZXYtPnJlc291cmNlW2ldLCBkZXYpOworCURCRygiJXM6IEZpeHVwIHJlc291cmNlczpcbiIsIHBjaV9uYW1lKGRldikpOworCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07CisJCWlmICghcmVzLT5mbGFncykKKwkJCWNvbnRpbnVlOworCisJCURCRygiICAweCUwMnggPCAlMDhseDoweCUwMTZseC4uLjB4JTAxNmx4XG4iLAorCQkgICAgaSwgcmVzLT5mbGFncywgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCisJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKKworCQlEQkcoIiAgICAgICA+ICUwOGx4OjB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJCSAgICByZXMtPmZsYWdzLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJfQogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMpOwogCkBAIC0xMjkxLDExOSArOTA2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpYmlvc19maXh1cF9idXMpOwogCi0vKgotICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KLSAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZSAKLSAqIG9wZW5maXJtd2FyZSBhbmQgc2V0cyBpdCBpbiB0aGUgcGNpX2RldiBhbmQgcGNpX2NvbmZpZyBsaW5lLgotICovCi1pbnQgcGNpX3JlYWRfaXJxX2xpbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IG9mX2lycSBvaXJxOwotCXVuc2lnbmVkIGludCB2aXJxOwotCi0JREJHKCJUcnkgdG8gbWFwIGlycSBmb3IgJXMuLi5cbiIsIHBjaV9uYW1lKHBjaV9kZXYpKTsKLQotI2lmZGVmIERFQlVHCi0JbWVtc2V0KCZvaXJxLCAweGZmLCBzaXplb2Yob2lycSkpOwotI2VuZGlmCi0JLyogVHJ5IHRvIGdldCBhIG1hcHBpbmcgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKi8KLQlpZiAob2ZfaXJxX21hcF9wY2kocGNpX2RldiwgJm9pcnEpKSB7Ci0JCXU4IGxpbmUsIHBpbjsKLQotCQkvKiBJZiB0aGF0IGZhaWxzLCBsZXRzIGZhbGxiYWNrIHRvIHdoYXQgaXMgaW4gdGhlIGNvbmZpZwotCQkgKiBzcGFjZSBhbmQgbWFwIHRoYXQgdGhyb3VnaCB0aGUgZGVmYXVsdCBjb250cm9sbGVyLiBXZQotCQkgKiBhbHNvIHNldCB0aGUgdHlwZSB0byBsZXZlbCBsb3cgc2luY2UgdGhhdCdzIHdoYXQgUENJCi0JCSAqIGludGVycnVwdHMgYXJlLiBJZiB5b3VyIHBsYXRmb3JtIGRvZXMgZGlmZmVyZW50bHksIHRoZW4KLQkJICogZWl0aGVyIHByb3ZpZGUgYSBwcm9wZXIgaW50ZXJydXB0IHRyZWUgb3IgZG9uJ3QgdXNlIHRoaXMKLQkJICogZnVuY3Rpb24uCi0JCSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocGluID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZsaW5lKSB8fAotCQkgICAgbGluZSA9PSAweGZmKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJREJHKCIgLT4gbm8gbWFwICEgVXNpbmcgaXJxIGxpbmUgJWQgZnJvbSBQQ0kgY29uZmlnXG4iLCBsaW5lKTsKLQotCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGxpbmUpOwotCQlpZiAodmlycSAhPSBOT19JUlEpCi0JCQlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQl9IGVsc2UgewotCQlEQkcoIiAtPiBnb3Qgb25lLCBzcGVjICVkIGNlbGxzICgweCUwOHggMHglMDh4Li4uKSBvbiAlc1xuIiwKLQkJICAgIG9pcnEuc2l6ZSwgb2lycS5zcGVjaWZpZXJbMF0sIG9pcnEuc3BlY2lmaWVyWzFdLAotCQkgICAgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLCBvaXJxLnNwZWNpZmllciwKLQkJCQkJICAgICBvaXJxLnNpemUpOwotCX0KLQlpZih2aXJxID09IE5PX0lSUSkgewotCQlEQkcoIiAtPiBmYWlsZWQgdG8gbWFwICFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JREJHKCIgLT4gbWFwcGVkIHRvIGxpbnV4IGlycSAlZFxuIiwgdmlycSk7Ci0KLQlwY2lfZGV2LT5pcnEgPSB2aXJxOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHBjaV9yZWFkX2lycV9saW5lKTsKLQotdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAotCQkJICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCi0JCQkgIHJlc291cmNlX3NpemVfdCAqc3RhcnQsIHJlc291cmNlX3NpemVfdCAqZW5kKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQlpZiAoaG9zZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQotCS8qIFdlIHBhc3MgYSBmdWxseSBmaXhlZCB1cCBhZGRyZXNzIHRvIHVzZXJsYW5kIGZvciBNTUlPIGluc3RlYWQgb2YKLQkgKiBhIEJBUiB2YWx1ZSBiZWNhdXNlIFggaXMgbGFtZSBhbmQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHVzZSB0aGF0Ci0JICogdG8gcGFzcyB0byAvZGV2L21lbSAhCi0JICoKLQkgKiBUaGF0IG1lYW5zIHRoYXQgd2UnbGwgaGF2ZSBwb3RlbnRpYWxseSA2NCBiaXRzIHZhbHVlcyB3aGVyZSBzb21lCi0JICogdXNlcmxhbmQgYXBwcyBvbmx5IGV4cGVjdCAzMiAobGlrZSBYIGl0c2VsZiBzaW5jZSBpdCB0aGlua3Mgb25seQotCSAqIFNwYXJjIGhhcyA2NCBiaXRzIE1NSU8pIGJ1dCBpZiB3ZSBkb24ndCBkbyB0aGF0LCB3ZSBicmVhayBpdCBvbgotCSAqIDMyIGJpdHMgQ0hSUHMgOi0oCi0JICoKLQkgKiBIb3BlZnVsbHksIHRoZSBzeXNmcyBpbnN0ZXJmYWNlIGlzIGltbXVuZSB0byB0aGF0IGd1bmsuIE9uY2UgWAotCSAqIGhhcyBiZWVuIGZpeGVkIChhbmQgdGhlIGZpeCBzcHJlYWQgZW5vdWdoKSwgd2UgY2FuIHJlLWVuYWJsZSB0aGUKLQkgKiAyIGxpbmVzIGJlbG93IGFuZCBwYXNzIGRvd24gYSBCQVIgdmFsdWUgdG8gdXNlcmxhbmQuIEluIHRoYXQgY2FzZQotCSAqIHdlJ2xsIGFsc28gaGF2ZSB0byByZS1lbmFibGUgdGhlIG1hdGNoaW5nIGNvZGUgaW4KLQkgKiBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KCkuCi0JICoKLQkgKiBCZW5ILgotCSAqLwotI2lmIDAKLQllbHNlIGlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCi0JKnN0YXJ0ID0gcnNyYy0+c3RhcnQgLSBvZmZzZXQ7Ci0JKmVuZCA9IHJzcmMtPmVuZCAtIG9mZnNldDsKLX0KLQotc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKQotewotCWlmICghaGF2ZV9vZikKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUobm9kZSkgewotCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKLQkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKLQkJCQlyZXR1cm4gaG9zZTsKLQkJbm9kZSA9IG5vZGUtPnBhcmVudDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwpAQCAtMTQxMiw3ICs5MTQsNyBAQAogCQlpZiAoYWRkcmVzcyA+PSBob3NlLT5pb19iYXNlX3BoeXMgJiYKIAkJICAgIGFkZHJlc3MgPCAoaG9zZS0+aW9fYmFzZV9waHlzICsgaG9zZS0+cGNpX2lvX3NpemUpKSB7CiAJCQl1bnNpZ25lZCBsb25nIGJhc2UgPQotCQkJCSh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOworCQkJCSh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCQkJcmV0dXJuIGJhc2UgKyAoYWRkcmVzcyAtIGhvc2UtPmlvX2Jhc2VfcGh5cyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBjOTZmYTliLi5hMjBmMTk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTY3LDcgKzY3LDYgQEAKIEVYUE9SVF9TWU1CT0woRE1BX01PREVfUkVBRCk7CiBFWFBPUlRfU1lNQk9MKERNQV9NT0RFX1dSSVRFKTsKIAotRVhQT1JUX1NZTUJPTChkb19zaWduYWwpOwogRVhQT1JUX1NZTUJPTCh0cmFuc2Zlcl90b19oYW5kbGVyKTsKIEVYUE9SVF9TWU1CT0woZG9fSVJRKTsKIEVYUE9SVF9TWU1CT0wobWFjaGluZV9jaGVja19leGNlcHRpb24pOwpAQCAtMTA2LDEwICsxMDUsNiBAQAogRVhQT1JUX1NZTUJPTChwY2lfZHJhbV9vZmZzZXQpOwogRVhQT1JUX1NZTUJPTChwY2lfYWxsb2NfY29uc2lzdGVudCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9mcmVlX2NvbnNpc3RlbnQpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX2lvX2Jhc2UpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX2lvX2Jhc2VfcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfbWVtX2Jhc2VfcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfdG9faG9zZSk7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiBFWFBPUlRfU1lNQk9MKHN0YXJ0X3RocmVhZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDZlMmYwMzUuLjg0ZjAwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMTksMjIgKzIxOSwyNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2lmZGVmIENPTkZJR19QUENfTUVSR0UJCS8qIFhYWCBmb3Igbm93ICovCiBpbnQgc2V0X2RhYnIodW5zaWduZWQgbG9uZyBkYWJyKQogeworI2lmZGVmIENPTkZJR19QUENfTUVSR0UJCS8qIFhYWCBmb3Igbm93ICovCiAJaWYgKHBwY19tZC5zZXRfZGFicikKIAkJcmV0dXJuIHBwY19tZC5zZXRfZGFicihkYWJyKTsKKyNlbmRpZgogCisJLyogWFhYIHNob3VsZCB3ZSBoYXZlIGEgQ1BVX0ZUUl9IQVNfREFCUiA/ICovCisjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHXzZ4eCkKIAltdHNwcihTUFJOX0RBQlIsIGRhYnIpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUEM2NAogREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV91c2FnZSwgY3B1X3VzYWdlX2FycmF5KTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjdXJyZW50X2RhYnIpOwogI2VuZGlmCiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjdXJyZW50X2RhYnIpOworCiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldykKIHsKQEAgLTI5OSwxMiArMzAzLDEwIEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLSNpZmRlZiBDT05GSUdfUFBDNjQJLyogZm9yIG5vdyAqLwogCWlmICh1bmxpa2VseShfX2dldF9jcHVfdmFyKGN1cnJlbnRfZGFicikgIT0gbmV3LT50aHJlYWQuZGFicikpIHsKIAkJc2V0X2RhYnIobmV3LT50aHJlYWQuZGFicik7CiAJCV9fZ2V0X2NwdV92YXIoY3VycmVudF9kYWJyKSA9IG5ldy0+dGhyZWFkLmRhYnI7CiAJfQotI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAJbmV3X3RocmVhZCA9ICZuZXctPnRocmVhZDsKIAlvbGRfdGhyZWFkID0gJmN1cnJlbnQtPnRocmVhZDsKQEAgLTQ3MywxMiArNDc1LDEwIEBACiAKIAlkaXNjYXJkX2xhenlfY3B1X3N0YXRlKCk7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQJLyogZm9yIG5vdyAqLwogCWlmIChjdXJyZW50LT50aHJlYWQuZGFicikgewogCQljdXJyZW50LT50aHJlYWQuZGFiciA9IDA7CiAJCXNldF9kYWJyKDApOwogCX0KLSNlbmRpZgogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IGFmNDJkZGEuLjM3ZmY5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8YXNtL3BTZXJpZXNfcmVjb25maWcuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhLRVJOX0VSUiBmbXQpCkBAIC0xMDA1LDcgKzEwMDYsNyBAQAogCiB2b2lkIF9faW5pdCBlYXJseV9pbml0X2RldnRyZWUodm9pZCAqcGFyYW1zKQogewotCURCRygiIC0+IGVhcmx5X2luaXRfZGV2dHJlZSgpXG4iKTsKKwlEQkcoIiAtPiBlYXJseV9pbml0X2RldnRyZWUoJXApXG4iLCBwYXJhbXMpOwogCiAJLyogU2V0dXAgZmxhdCBkZXZpY2UtdHJlZSBwb2ludGVyICovCiAJaW5pdGlhbF9ib290X3BhcmFtcyA9IHBhcmFtczsKQEAgLTEwNTUsOCArMTA1Niw2IEBACiAJREJHKCIgPC0gZWFybHlfaW5pdF9kZXZ0cmVlKClcbiIpOwogfQogCi0jdW5kZWYgcHJpbnRrCi0KIGludCBvZl9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCkKIHsKIAljb25zdCBpbnQgKmlwOwpAQCAtMTM3NSw4ICsxMzc0LDE3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0ga3JlZl90b19kZXZpY2Vfbm9kZShrcmVmKTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBub2RlLT5wcm9wZXJ0aWVzOwogCi0JaWYgKCFPRl9JU19EWU5BTUlDKG5vZGUpKQorCS8qIFdlIHNob3VsZCBuZXZlciBiZSByZWxlYXNpbmcgbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGV0YWNoZWQuICovCisJaWYgKCFvZl9ub2RlX2NoZWNrX2ZsYWcobm9kZSwgT0ZfREVUQUNIRUQpKSB7CisJCXByaW50aygiV0FSTklORzogQmFkIG9mX25vZGVfcHV0KCkgb24gJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWR1bXBfc3RhY2soKTsKKwkJa3JlZl9pbml0KCZub2RlLT5rcmVmKTsKIAkJcmV0dXJuOworCX0KKworCWlmICghb2Zfbm9kZV9jaGVja19mbGFnKG5vZGUsIE9GX0RZTkFNSUMpKQorCQlyZXR1cm47CisKIAl3aGlsZSAocHJvcCkgewogCQlzdHJ1Y3QgcHJvcGVydHkgKm5leHQgPSBwcm9wLT5uZXh0OwogCQlrZnJlZShwcm9wLT5uYW1lKTsKQEAgLTE0MzIsNiArMTQ0MCw4IEBACiAJd3JpdGVfbG9jaygmZGV2dHJlZV9sb2NrKTsKIAogCXBhcmVudCA9IG5wLT5wYXJlbnQ7CisJaWYgKCFwYXJlbnQpCisJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmIChhbGxub2RlcyA9PSBucCkKIAkJYWxsbm9kZXMgPSBucC0+YWxsbmV4dDsKQEAgLTE0NTUsNiArMTQ2NSw5IEBACiAJCXByZXZzaWItPnNpYmxpbmcgPSBucC0+c2libGluZzsKIAl9CiAKKwlvZl9ub2RlX3NldF9mbGFnKG5wLCBPRl9ERVRBQ0hFRCk7CisKK291dF91bmxvY2s6CiAJd3JpdGVfdW5sb2NrKCZkZXZ0cmVlX2xvY2spOwogfQogCkBAIC0xNzE2LDIyICsxNzI5LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldF9jcHVfbm9kZSk7CiAKLSNpZmRlZiBERUJVRworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiBkZWZpbmVkKERFQlVHKQogc3RhdGljIHN0cnVjdCBkZWJ1Z2ZzX2Jsb2Jfd3JhcHBlciBmbGF0X2R0X2Jsb2I7CiAKIHN0YXRpYyBpbnQgX19pbml0IGV4cG9ydF9mbGF0X2RldmljZV90cmVlKHZvaWQpCiB7CiAJc3RydWN0IGRlbnRyeSAqZDsKIAotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInBvd2VycGMiLCBOVUxMKTsKLQlpZiAoIWQpCi0JCXJldHVybiAxOwotCiAJZmxhdF9kdF9ibG9iLmRhdGEgPSBpbml0aWFsX2Jvb3RfcGFyYW1zOwogCWZsYXRfZHRfYmxvYi5zaXplID0gaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplOwogCiAJZCA9IGRlYnVnZnNfY3JlYXRlX2Jsb2IoImZsYXQtZGV2aWNlLXRyZWUiLCBTX0lGUkVHIHwgU19JUlVTUiwKLQkJCQlkLCAmZmxhdF9kdF9ibG9iKTsKKwkJCQlwb3dlcnBjX2RlYnVnZnNfcm9vdCwgJmZsYXRfZHRfYmxvYik7CiAJaWYgKCFkKQogCQlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggZDYwNDdjNC4uYTFkNTgyZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC02MzUsNiArNjM1LDcgQEAKIC8qIGlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkgcHJvcGVydHkgc3VwcG9ydGVkICovCiAjZGVmaW5lIE9WNV9EUkNPTkZfTUVNT1JZCTB4MjAKICNkZWZpbmUgT1Y1X0xBUkdFX1BBR0VTCQkweDEwCS8qIGxhcmdlIHBhZ2VzIHN1cHBvcnRlZCAqLworI2RlZmluZSBPVjVfRE9OQVRFX0RFRElDQVRFX0NQVSAweDAyCS8qIGRvbmF0ZSBkZWRpY2F0ZWQgQ1BVIHN1cHBvcnQgKi8KIC8qIFBDSWUvTVNJIHN1cHBvcnQuICBXaXRob3V0IE1TSSBmdWxsIFBDSWUgaXMgbm90IHN1cHBvcnRlZCAqLwogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAjZGVmaW5lIE9WNV9NU0kJCQkweDAxCS8qIFBDSWUvTVNJIHN1cHBvcnQgKi8KQEAgLTY4NSw3ICs2ODYsOCBAQAogCS8qIG9wdGlvbiB2ZWN0b3IgNTogUEFQUi9PRiBvcHRpb25zICovCiAJMyAtIDIsCQkJCS8qIGxlbmd0aCAqLwogCTAsCQkJCS8qIGRvbid0IGlnbm9yZSwgZG9uJ3QgaGFsdCAqLwotCU9WNV9MUEFSIHwgT1Y1X1NQTFBBUiB8IE9WNV9MQVJHRV9QQUdFUyB8IE9WNV9EUkNPTkZfTUVNT1JZIHwgT1Y1X01TSSwKKwlPVjVfTFBBUiB8IE9WNV9TUExQQVIgfCBPVjVfTEFSR0VfUEFHRVMgfCBPVjVfRFJDT05GX01FTU9SWSB8CisJT1Y1X0RPTkFURV9ERURJQ0FURV9DUFUgfCBPVjVfTVNJLAogfTsKIAogLyogT2xkIG1ldGhvZCAtIEVMRiBoZWFkZXIgd2l0aCBQVF9OT1RFIHNlY3Rpb25zICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk3YWU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiAgICBDb3B5cmlnaHQgKGMpIDIwMDIgU3RlcGhlbiBSb3Rod2VsbCwgSUJNIENvcHJvcmF0aW9uCi0gKiAgICBFeHRyYWN0ZWQgZnJvbSBwdHJhY2UuYyBhbmQgcHRyYWNlMzIuYwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIFJFQURNRS5sZWdhbCBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKLSAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX1BQQzY0X1BUUkFDRV9DT01NT05fSAotI2RlZmluZSBfUFBDNjRfUFRSQUNFX0NPTU1PTl9ICi0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLS8qCi0gKiBTZXQgb2YgbXNyIGJpdHMgdGhhdCBnZGIgY2FuIGNoYW5nZSBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzLgotICovCi0jZGVmaW5lIE1TUl9ERUJVR0NIQU5HRQkoTVNSX0ZFMCB8IE1TUl9TRSB8IE1TUl9CRSB8IE1TUl9GRTEpCi0KLS8qCi0gKiBHZXQgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHTk8gaW4gdGFzayBUQVNLLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKLXsKLQl1bnNpZ25lZCBsb25nIHRtcCA9IDA7Ci0KLQkvKgotCSAqIFB1dCB0aGUgY29ycmVjdCBGUCBiaXRzIGluLCB0aGV5IG1pZ2h0IGJlIHdyb25nIGFzIGEgcmVzdWx0Ci0JICogb2Ygb3VyIGxhenkgRlAgcmVzdG9yZS4KLQkgKi8KLQlpZiAocmVnbm8gPT0gUFRfTVNSKSB7Ci0JCXRtcCA9ICgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtQVF9NU1JdOwotCQl0bXAgfD0gdGFzay0+dGhyZWFkLmZwZXhjX21vZGU7Ci0JfSBlbHNlIGlmIChyZWdubyA8IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkgewotCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dOwotCX0KLQotCXJldHVybiB0bXA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBjb250ZW50cyBvZiByZWdpc3RlciBSRUdOTyBpbiB0YXNrIFRBU0suCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB1dF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8sCi0JCQkgIHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlpZiAocmVnbm8gPCBQVF9TT0ZURSkgewotCQlpZiAocmVnbm8gPT0gUFRfTVNSKQotCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQotCQkJCXwgKHRhc2stPnRocmVhZC5yZWdzLT5tc3IgJiB+TVNSX0RFQlVHQ0hBTkdFKTsKLQkJKCh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnJlZ3MpW3JlZ25vXSA9IGRhdGE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKLQlpZiAocmVncyAhPSBOVUxMKQotCQlyZWdzLT5tc3IgfD0gTVNSX1NFOwotCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7Ci0JaWYgKHJlZ3MgIT0gTlVMTCkKLQkJcmVncy0+bXNyICY9IH5NU1JfU0U7Ci0JY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKLX0KLQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0vKgotICogR2V0L3NldCBhbGwgdGhlIGFsdGl2ZWMgcmVnaXN0ZXJzIHZyMC4udnIzMSwgdnNjciwgdnJzYXZlLCBpbiBvbmUgZ28uCi0gKiBUaGUgdHJhbnNmZXIgdG90YWxzIDM0IHF1YWR3b3JkLiAgUXVhZHdvcmRzIDAtMzEgY29udGFpbiB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHJlZ2lzdGVycy4gIFF1YWR3b3JkIDMyIGNvbnRhaW5zIHRoZSB2c2NyIGFzIHRoZQotICogbGFzdCB3b3JkIChvZmZzZXQgMTIpIHdpdGhpbiB0aGF0IHF1YWR3b3JkLiAgUXVhZHdvcmQgMzMgY29udGFpbnMgdGhlCi0gKiB2cnNhdmUgYXMgdGhlIGZpcnN0IHdvcmQgKG9mZnNldCAwKSB3aXRoaW4gdGhlIHF1YWR3b3JkLgotICoKLSAqIFRoaXMgZGVmaW5pdGlvbiBvZiB0aGUgVk1YIHN0YXRlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBQUEMzMgotICogcHRyYWNlIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIHNpZ25hbCBoYW5kbGluZyBhbmQgcHRyYWNlIHRvIHVzZSB0aGUKLSAqIHNhbWUgc3RydWN0dXJlcy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGJpLWFyY2gKLSAqIChjb21iaW5lZCAoMzItIGFuZCA2NC1iaXQpIGdkYi4KLSAqLwotCi0vKgotICogR2V0IGNvbnRlbnRzIG9mIEFsdGlWZWMgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92cnJlZ3ModW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEsCi0JCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ3NpemU7Ci0KLQkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCXJlZ3NpemUgPSAzMiAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgdGFzay0+dGhyZWFkLnZyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZTQ1IgKi8KLQlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRhc2stPnRocmVhZC52c2NyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChwdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogV3JpdGUgY29udGVudHMgb2YgQWx0aVZlYyByZWdpc3RlciBzdGF0ZSBpbnRvIHRhc2sgVEFTSy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgc2V0X3ZycmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgX191c2VyICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKLQotCS8qIGNvcHkgQWx0aVZlYyByZWdpc3RlcnMgVlJbMF0gLi4gVlJbMzFdICovCi0JcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC52ciwgZGF0YSwgcmVnc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCi0JLyogY29weSBWU0NSICovCi0JcmVnc2l6ZSA9IDEgKiBzaXplb2YodmVjdG9yMTI4KTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRhc2stPnRocmVhZC52c2NyLCBkYXRhLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChnZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9zZXRfZGVidWdyZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgREFCUiBhbmQgbm8gSUFCUlMgYXQgdGhlIG1vbWVudCAqLwotCWlmIChhZGRyID4gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBUaGUgYm90dG9tIDMgYml0cyBhcmUgZmxhZ3MgKi8KLQlpZiAoKGRhdGEgJiB+MHg3VUwpID49IFRBU0tfU0laRSkKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBFbnN1cmUgdHJhbnNsYXRpb24gaXMgb24gKi8KLQlpZiAoZGF0YSAmJiAhKGRhdGEgJiBEQUJSX1RSQU5TTEFUSU9OKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQl0YXNrLT50aHJlYWQuZGFiciA9IGRhdGE7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBfUFBDNjRfUFRSQUNFX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwppbmRleCBiZjc2NTYyLi44YTE3N2JkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1LDExICszNSwxMSBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0jaW5jbHVkZSAicHRyYWNlLWNvbW1vbi5oIgotI2VuZGlmCisvKgorICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgorICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICovCiAKLSNpZmRlZiBDT05GSUdfUFBDMzIKIC8qCiAgKiBTZXQgb2YgbXNyIGJpdHMgdGhhdCBnZGIgY2FuIGNoYW5nZSBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzLgogICovCkBAIC00OCw2NSArNDgsMTE3IEBACiAjZWxzZQogI2RlZmluZSBNU1JfREVCVUdDSEFOR0UJKE1TUl9TRSB8IE1TUl9CRSkKICNlbmRpZgotI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogCiAvKgotICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgotICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICogTWF4IHJlZ2lzdGVyIHdyaXRlYWJsZSB2aWEgcHV0X3JlZwogICovCi0KICNpZmRlZiBDT05GSUdfUFBDMzIKKyNkZWZpbmUgUFRfTUFYX1BVVF9SRUcJUFRfTVEKKyNlbHNlCisjZGVmaW5lIFBUX01BWF9QVVRfUkVHCVBUX0NDUgorI2VuZGlmCisKIC8qCiAgKiBHZXQgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHTk8gaW4gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKK3Vuc2lnbmVkIGxvbmcgcHRyYWNlX2dldF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8pCiB7Ci0JaWYgKHJlZ25vIDwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKQotCSAgICAmJiB0YXNrLT50aHJlYWQucmVncyAhPSBOVUxMKQorCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKKworCWlmICh0YXNrLT50aHJlYWQucmVncyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyZWdubyA9PSBQVF9NU1IpIHsKKwkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnJlZ3MpW1BUX01TUl07CisJCXJldHVybiB0bXAgfCB0YXNrLT50aHJlYWQuZnBleGNfbW9kZTsKKwl9CisKKwlpZiAocmVnbm8gPCAoc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCiAJCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dOwotCXJldHVybiAoMCk7CisKKwlyZXR1cm4gLUVJTzsKIH0KIAogLyoKICAqIFdyaXRlIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIFJFR05PIGluIHRhc2sgVEFTSy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubywKLQkJCSAgdW5zaWduZWQgbG9uZyBkYXRhKQoraW50IHB0cmFjZV9wdXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vLCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaWYgKHJlZ25vIDw9IFBUX01RICYmIHRhc2stPnRocmVhZC5yZWdzICE9IE5VTEwpIHsKKwlpZiAodGFzay0+dGhyZWFkLnJlZ3MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocmVnbm8gPD0gUFRfTUFYX1BVVF9SRUcgfHwgcmVnbm8gPT0gUFRfVFJBUCkgewogCQlpZiAocmVnbm8gPT0gUFRfTVNSKQogCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQogCQkJCXwgKHRhc2stPnRocmVhZC5yZWdzLT5tc3IgJiB+TVNSX0RFQlVHQ0hBTkdFKTsKKwkJLyogV2UgcHJldmVudCBtdWNraW5nIGFyb3VuZCB3aXRoIHRoZSByZXNlcnZlZCBhcmVhIG9mIHRyYXAKKwkJICogd2hpY2ggYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsCisJCSAqLworCQlpZiAocmVnbm8gPT0gUFRfVFJBUCkKKwkJCWRhdGEgJj0gMHhmZmYwOwogCQkoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dID0gZGF0YTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRUlPOwogfQogCisKK3N0YXRpYyBpbnQgZ2V0X2ZwcmVncyh2b2lkIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgICAgICBpbnQgaGFzX2Zwc2NyKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IGhhc19mcHNjciA/IDMzIDogMzI7CisKKwlpZiAoY29weV90b191c2VyKGRhdGEsIHRhc2stPnRocmVhZC5mcHIsIGNvdW50ICogc2l6ZW9mKGRvdWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZnByZWdzKHZvaWQgX191c2VyICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICAgIGludCBoYXNfZnBzY3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gaGFzX2Zwc2NyID8gMzMgOiAzMjsKKworCWlmIChjb3B5X2Zyb21fdXNlcih0YXNrLT50aHJlYWQuZnByLCBkYXRhLCBjb3VudCAqIHNpemVvZihkb3VibGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAvKgorICogR2V0L3NldCBhbGwgdGhlIGFsdGl2ZWMgcmVnaXN0ZXJzIHZyMC4udnIzMSwgdnNjciwgdnJzYXZlLCBpbiBvbmUgZ28uCisgKiBUaGUgdHJhbnNmZXIgdG90YWxzIDM0IHF1YWR3b3JkLiAgUXVhZHdvcmRzIDAtMzEgY29udGFpbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHJlZ2lzdGVycy4gIFF1YWR3b3JkIDMyIGNvbnRhaW5zIHRoZSB2c2NyIGFzIHRoZQorICogbGFzdCB3b3JkIChvZmZzZXQgMTIpIHdpdGhpbiB0aGF0IHF1YWR3b3JkLiAgUXVhZHdvcmQgMzMgY29udGFpbnMgdGhlCisgKiB2cnNhdmUgYXMgdGhlIGZpcnN0IHdvcmQgKG9mZnNldCAwKSB3aXRoaW4gdGhlIHF1YWR3b3JkLgorICoKKyAqIFRoaXMgZGVmaW5pdGlvbiBvZiB0aGUgVk1YIHN0YXRlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBQUEMzMgorICogcHRyYWNlIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIHNpZ25hbCBoYW5kbGluZyBhbmQgcHRyYWNlIHRvIHVzZSB0aGUKKyAqIHNhbWUgc3RydWN0dXJlcy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGJpLWFyY2gKKyAqIChjb21iaW5lZCAoMzItIGFuZCA2NC1iaXQpIGdkYi4KKyAqLworCisvKgogICogR2V0IGNvbnRlbnRzIG9mIEFsdGlWZWMgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92cnJlZ3ModW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBpbnQgZ2V0X3ZycmVncyh1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCWludCBpLCBqOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhLCAxMzMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CiAKIAkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrLCBkYXRhKyspCi0JCQlpZiAoX19wdXRfdXNlcih0YXNrLT50aHJlYWQudnJbaV0udVtqXSwgZGF0YSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCB0YXNrLT50aHJlYWQudnIsIHJlZ3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkYXRhICs9IChyZWdzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAogCS8qIGNvcHkgVlNDUiAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGRhdGErKykKLQkJaWYgKF9fcHV0X3VzZXIodGFzay0+dGhyZWFkLnZzY3IudVtpXSwgZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRhc2stPnRocmVhZC52c2NyLCByZWdzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKLSAgICAgICAgLyogY29weSBWUlNBVkUgKi8KLQlpZiAoX19wdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCBkYXRhKSkKKwkvKiBjb3B5IFZSU0FWRSAqLworCWlmIChwdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiAwOwpAQCAtMTE1LDMxICsxNjcsMjkgQEAKIC8qCiAgKiBXcml0ZSBjb250ZW50cyBvZiBBbHRpVmVjIHJlZ2lzdGVyIHN0YXRlIGludG8gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEpCitzdGF0aWMgaW50IHNldF92cnJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSkKIHsKLQlpbnQgaSwgajsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhLCAxMzMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CiAKIAkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrLCBkYXRhKyspCi0JCQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnJbaV0udVtqXSwgZGF0YSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC52ciwgZGF0YSwgcmVnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAJLyogY29weSBWU0NSICovCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgZGF0YSsrKQotCQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnNjci51W2ldLCBkYXRhKSkKLQkJCXJldHVybiAtRUZBVUxUOworCXJlZ3NpemUgPSAxICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0YXNrLT50aHJlYWQudnNjciwgZGF0YSwgcmVnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAJLyogY29weSBWUlNBVkUgKi8KLQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCBkYXRhKSkKKwlpZiAoZ2V0X3VzZXIodGFzay0+dGhyZWFkLnZyc2F2ZSwgKHUzMiBfX3VzZXIgKilkYXRhKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKICNpZmRlZiBDT05GSUdfU1BFCiAKQEAgLTE1Niw3ICsyMDYsNyBAQAogLyoKICAqIEdldCBjb250ZW50cyBvZiBTUEUgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfZXZycmVncyh1bnNpZ25lZCBsb25nICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCitzdGF0aWMgaW50IGdldF9ldnJyZWdzKHVuc2lnbmVkIGxvbmcgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlpbnQgaTsKIApAQCAtMTgyLDcgKzIzMiw3IEBACiAvKgogICogV3JpdGUgY29udGVudHMgb2YgU1BFIHJlZ2lzdGVyIHN0YXRlIGludG8gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfZXZycmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmRhdGEpCitzdGF0aWMgaW50IHNldF9ldnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZGF0YSkKIHsKIAlpbnQgaTsKIApAQCAtMjA1LDggKzI1NSw4IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NQRSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisKK3N0YXRpYyB2b2lkIHNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKIApAQCAtMjIxLDggKzI3MSw3IEBACiAJc2V0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFU1RFUCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7CiAKQEAgLTIzNiw3ICsyODUsMjUgQEAKIAl9CiAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KKworc3RhdGljIGludCBwdHJhY2Vfc2V0X2RlYnVncmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvKiBXZSBvbmx5IHN1cHBvcnQgb25lIERBQlIgYW5kIG5vIElBQlJTIGF0IHRoZSBtb21lbnQgKi8KKwlpZiAoYWRkciA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlIGJvdHRvbSAzIGJpdHMgYXJlIGZsYWdzICovCisJaWYgKChkYXRhICYgfjB4N1VMKSA+PSBUQVNLX1NJWkUpCisJCXJldHVybiAtRUlPOworCisJLyogRW5zdXJlIHRyYW5zbGF0aW9uIGlzIG9uICovCisJaWYgKGRhdGEgJiYgIShkYXRhICYgREFCUl9UUkFOU0xBVElPTikpCisJCXJldHVybiAtRUlPOworCisJdGFzay0+dGhyZWFkLmRhYnIgPSBkYXRhOworCXJldHVybiAwOworfQogCiAvKgogICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCkBAIC0yNDksNiArMzE2LDYyIEBACiAJY2xlYXJfc2luZ2xlX3N0ZXAoY2hpbGQpOwogfQogCisvKgorICogSGVyZSBhcmUgdGhlIG9sZCAibGVnYWN5IiBwb3dlcnBjIHNwZWNpZmljIGdldHJlZ3Mvc2V0cmVncyBwdHJhY2UgY2FsbHMsCisgKiB3ZSBtYXJrIHRoZW0gYXMgb2Jzb2xldGUgbm93LCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uCisgKi8KK3N0YXRpYyBsb25nIGFyY2hfcHRyYWNlX29sZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwKKwkJCSAgICBsb25nIGRhdGEpCit7CisJaW50IHJldCA9IC1FUEVSTTsKKworCXN3aXRjaChyZXF1ZXN0KSB7CisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBwdXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCisJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CisJCXJldCA9IGdldF9mcHJlZ3MoKHZvaWQgX191c2VyICopYWRkciwgY2hpbGQsIDApOworCQlicmVhazsKKwl9CisKKwljYXNlIFBQQ19QVFJBQ0VfU0VURlBSRUdTOiB7IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKKwkJcmV0ID0gc2V0X2ZwcmVncygodm9pZCBfX3VzZXIgKilhZGRyLCBjaGlsZCwgMCk7CisJCWJyZWFrOworCX0KKworCX0KKwlyZXR1cm4gcmV0OworfQorCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7CiAJaW50IHJldCA9IC1FUEVSTTsKQEAgLTI1NiwxNyArMzc5LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0yODQsMTEgKzM5OSw5IEBACiAjZW5kaWYKIAkJCWJyZWFrOwogCi0jaWZkZWYgQ09ORklHX1BQQzMyCiAJCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotI2VuZGlmCiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIChpbnQpIGluZGV4KTsKKwkJCXRtcCA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCAoaW50KSBpbmRleCk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpW2luZGV4IC0gUFRfRlBSMF07CkBAIC0zMDAsMTEgKzQxMyw3IEBACiAJLyogSWYgSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCQkJPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KQEAgLTMyMywxMyArNDMyLDkgQEAKICNlbmRpZgogCQkJYnJlYWs7CiAKLSNpZmRlZiBDT05GSUdfUFBDMzIKIAkJQ0hFQ0tfRlVMTF9SRUdTKGNoaWxkLT50aHJlYWQucmVncyk7Ci0jZW5kaWYKLQkJaWYgKGluZGV4ID09IFBUX09SSUdfUjMpCi0JCQlicmVhazsKIAkJaWYgKGluZGV4IDwgUFRfRlBSMCkgewotCQkJcmV0ID0gcHV0X3JlZyhjaGlsZCwgaW5kZXgsIGRhdGEpOworCQkJcmV0ID0gcHRyYWNlX3B1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKIAkJfSBlbHNlIHsKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CiAJCQkoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcilbaW5kZXggLSBQVF9GUFIwXSA9IGRhdGE7CkBAIC0zODQsNyArNDg5LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0jaWZkZWYgQ09ORklHX1BQQzY0CiAJY2FzZSBQVFJBQ0VfR0VUX0RFQlVHUkVHOiB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgREFCUiBhbmQgbm8gSUFCUlMgYXQgdGhlIG1vbWVudCAqLwpAQCAtMzk4LDczICs1MDIsNjEgQEAKIAljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6CiAJCXJldCA9IHB0cmFjZV9zZXRfZGVidWdyZWcoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLSNlbmRpZgogCiAJY2FzZSBQVFJBQ0VfREVUQUNIOgogCQlyZXQgPSBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKIAkJYnJlYWs7CiAKLQljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgR1BScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKLQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFkZHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYXNlIFBUUkFDRV9HRVRSRUdTNjQ6CisjZW5kaWYKKwljYXNlIFBUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBhbGwgcHRfcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KKwkJaW50IHVpOworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopZGF0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWZvciAodWkgPSAwOyB1aSA8IFBUX1JFR1NfQ09VTlQ7IHVpICsrKSB7CisJCQlyZXQgfD0gX19wdXRfdXNlcihwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgdWkpLAorCQkJCQkgICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGxvbmcpOwogCQl9CiAJCWJyZWFrOwogCX0KIAotCWNhc2UgUFBDX1BUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYXNlIFBUUkFDRV9TRVRSRUdTNjQ6CisjZW5kaWYKKwljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWRhdGEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0ID0gX19nZXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKIAkJCWlmIChyZXQpCiAJCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOworCQkJcHRyYWNlX3B1dF9yZWcoY2hpbGQsIHVpLCB0bXApOworCQkJZGF0YSArPSBzaXplb2YobG9uZyk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQorCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZSAoRlBSMC4uLjMxICsgRlBTQ1IpICovCiAJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQorCQlyZXQgPSBnZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWRhdGEsIGNoaWxkLCAxKTsKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBTZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZSAoRlBSMC4uLjMxICsgRlBTQ1IpICovCiAJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQorCQlyZXQgPSBzZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWRhdGEsIGNoaWxkLCAxKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00OTksMTEgKzU5MSwxOCBAQAogCQlicmVhazsKICNlbmRpZgogCisJLyogT2xkIHJldmVyc2UgYXJncyBwdHJhY2UgY2FsbHNzICovCisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCWNhc2UgUFBDX1BUUkFDRV9HRVRGUFJFR1M6IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VURlBSRUdTOiAvKiBHZXQgRlBScyAwIC0gMzEuICovCisJCXJldCA9IGFyY2hfcHRyYWNlX29sZChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAl9Ci0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKaW5kZXggOWI5YTIzMC4uOWU2YmFlYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYwpAQCAtMzMsMTMgKzMzLDU1IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlICJwdHJhY2UtY29tbW9uLmgiCi0KIC8qCiAgKiBkb2VzIG5vdCB5ZXQgY2F0Y2ggc2lnbmFscyBzZW50IHdoZW4gdGhlIGNoaWxkIGRpZXMuCiAgKiBpbiBleGl0LmMgb3IgaW4gc2lnbmFsLmMuCiAgKi8KIAorLyoKKyAqIEhlcmUgYXJlIHRoZSBvbGQgImxlZ2FjeSIgcG93ZXJwYyBzcGVjaWZpYyBnZXRyZWdzL3NldHJlZ3MgcHRyYWNlIGNhbGxzLAorICogd2UgbWFyayB0aGVtIGFzIG9ic29sZXRlIG5vdywgdGhleSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbgorICovCitzdGF0aWMgbG9uZyBjb21wYXRfcHRyYWNlX29sZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsCisJCQkgICAgICBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlpbnQgcmV0ID0gLUVQRVJNOworCisJc3dpdGNoKHJlcXVlc3QpIHsKKwljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgR1BScyAwIC0gMzEuICovCisJCWludCBpOworCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKKwkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBwdXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGludCBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopYWRkcjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZWcrKzsKKwkJCXRtcCsrOworCQl9CisJCWJyZWFrOworCX0KKworCX0KKwlyZXR1cm4gcmV0OworfQorCiBsb25nIGNvbXBhdF9zeXNfcHRyYWNlKGludCByZXF1ZXN0LCBpbnQgcGlkLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhdGEpCiB7CkBAIC0xMjMsNyArMTY1LDcgQEAKIAkJCWJyZWFrOwogCiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIGluZGV4KTsKKwkJCXRtcCA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCBpbmRleCk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJLyoKQEAgLTE2Miw3ICsyMDQsOSBAQAogCQllbHNlCiAJCQlwYXJ0ID0gMDsgIC8qIHdhbnQgdGhlIDFzdCBoYWxmIG9mIHRoZSByZWdpc3RlciAobGVmdC1tb3N0KS4gKi8KIAotCQkvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgLSBjaGVjayB0byBzZWUgaWYgYWRkcmVzcyBpcyBvbiB0aGUgd3JvbmcgYm91bmRhcnkgb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHVzZXIgYXJlYSAqLworCQkvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgLSBjaGVjayB0byBzZWUgaWYgYWRkcmVzcyBpcyBvbiB0aGUgd3JvbmcgYm91bmRhcnkKKwkJICogb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHVzZXIgYXJlYQorCQkgKi8KIAkJaWYgKChhZGRyICYgMykgfHwgbnVtUmVnID4gUFRfRlBTQ1IpCiAJCQlicmVhazsKIApAQCAtMTcwLDcgKzIxNCw3IEBACiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nIGludCAqKWNoaWxkLT50aHJlYWQuZnByKVtudW1SZWcgLSBQVF9GUFIwXTsKIAkJfSBlbHNlIHsgLyogcmVnaXN0ZXIgd2l0aGluIFBUX1JFR1Mgc3RydWN0ICovCi0JCQl0bXAgPSBnZXRfcmVnKGNoaWxkLCBudW1SZWcpOworCQkJdG1wID0gcHRyYWNlX2dldF9yZWcoY2hpbGQsIG51bVJlZyk7CiAJCX0gCiAJCXJlZzMyYml0cyA9ICgodTMyKikmdG1wKVtwYXJ0XTsKIAkJcmV0ID0gcHV0X3VzZXIocmVnMzJiaXRzLCAodTMyIF9fdXNlciAqKWRhdGEpOwpAQCAtMjI2LDEwICsyNzAsOCBAQAogCQlpZiAoKGFkZHIgJiAzKSB8fCAoaW5kZXggPiBQVF9GUFNDUjMyKSkKIAkJCWJyZWFrOwogCi0JCWlmIChpbmRleCA9PSBQVF9PUklHX1IzKQotCQkJYnJlYWs7CiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXJldCA9IHB1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKKwkJCXJldCA9IHB0cmFjZV9wdXRfcmVnKGNoaWxkLCBpbmRleCwgZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJLyoKQEAgLTI1OCw3MCArMzAwLDI1IEBACiAJCS8qIERldGVybWluZSB3aGljaCByZWdpc3RlciB0aGUgdXNlciB3YW50cyAqLwogCQlpbmRleCA9ICh1NjQpYWRkciA+PiAyOwogCQludW1SZWcgPSBpbmRleCAvIDI7CisKIAkJLyoKIAkJICogVmFsaWRhdGUgdGhlIGlucHV0IC0gY2hlY2sgdG8gc2VlIGlmIGFkZHJlc3MgaXMgb24gdGhlCiAJCSAqIHdyb25nIGJvdW5kYXJ5IG9yIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB1c2VyIGFyZWEKIAkJICovCiAJCWlmICgoYWRkciAmIDMpIHx8IChudW1SZWcgPiBQVF9GUFNDUikpCiAJCQlicmVhazsKLQkJLyogSW5zdXJlIGl0IGlzIGEgcmVnaXN0ZXIgd2UgbGV0IHRoZW0gY2hhbmdlICovCi0JCWlmICgobnVtUmVnID09IFBUX09SSUdfUjMpCi0JCQkJfHwgKChudW1SZWcgPiBQVF9DQ1IpICYmIChudW1SZWcgPCBQVF9GUFIwKSkpCi0JCQlicmVhazsKLQkJaWYgKG51bVJlZyA+PSBQVF9GUFIwKSB7CisJCWlmIChudW1SZWcgPCBQVF9GUFIwKSB7CisJCQl1bnNpZ25lZCBsb25nIGZyZWcgPSBwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgbnVtUmVnKTsKKwkJCWlmIChpbmRleCAlIDIpCisJCQkJZnJlZyA9IChmcmVnICYgfjB4ZmZmZmZmZmZ1bCkgfCAoZGF0YSAmIDB4ZmZmZmZmZmZ1bCk7CisJCQllbHNlCisJCQkJZnJlZyA9IChmcmVnICYgMHhmZmZmZmZmZnVsKSB8IChkYXRhIDw8IDMyKTsKKwkJCXJldCA9IHB0cmFjZV9wdXRfcmVnKGNoaWxkLCBudW1SZWcsIGZyZWcpOworCQl9IGVsc2UgewogCQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKKwkJCSgodW5zaWduZWQgaW50ICopY2hpbGQtPnRocmVhZC5yZWdzKVtpbmRleF0gPSBkYXRhOworCQkJcmV0ID0gMDsKIAkJfQotCQlpZiAobnVtUmVnID09IFBUX01TUikKLQkJCWRhdGEgPSAoZGF0YSAmIE1TUl9ERUJVR0NIQU5HRSkKLQkJCQl8IChjaGlsZC0+dGhyZWFkLnJlZ3MtPm1zciAmIH5NU1JfREVCVUdDSEFOR0UpOwotCQkoKHUzMiopY2hpbGQtPnRocmVhZC5yZWdzKVtpbmRleF0gPSBkYXRhOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TWVNDQUxMOiAvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLwotCWNhc2UgUFRSQUNFX0NPTlQ6IHsgLyogcmVzdGFydCBhZnRlciBzaWduYWwuICovCi0JCXJldCA9IC1FSU87Ci0JCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQotCQkJYnJlYWs7Ci0JCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9TWVNDQUxMKQotCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQllbHNlCi0JCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBtYWtlIHRoZSBjaGlsZCBleGl0LiAgQmVzdCBJIGNhbiBkbyBpcyBzZW5kIGl0IGEgc2lna2lsbC4KLQkgKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvCi0JICogZXhpdC4KLQkgKi8KLQljYXNlIFBUUkFDRV9LSUxMOiB7Ci0JCXJldCA9IDA7Ci0JCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkJLyogYWxyZWFkeSBkZWFkICovCi0JCQlicmVhazsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7Ci0JCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDogeyAgLyogc2V0IHRoZSB0cmFwIGZsYWcuICovCi0JCXJldCA9IC1FSU87Ci0JCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQotCQkJYnJlYWs7Ci0JCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQlzZXRfc2luZ2xlX3N0ZXAoY2hpbGQpOwotCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKLQkJLyogZ2l2ZSBpdCBhIGNoYW5jZSB0byBydW4uICovCi0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXJldCA9IDA7CiAJCWJyZWFrOwogCX0KIApAQCAtMzM0LDk1ICszMzEsNjcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQVFJBQ0VfU0VUX0RFQlVHUkVHOgotCQlyZXQgPSBwdHJhY2Vfc2V0X2RlYnVncmVnKGNoaWxkLCBhZGRyLCBkYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBUUkFDRV9ERVRBQ0g6Ci0JCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgR1BScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOwotCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsKLQkJCXJlZysrOwotCQkJdG1wKys7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gcHV0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6IHsgLyogR2V0IEZQUnMgMCAtIDMxLiAqLwotCQlpbnQgaTsKLQkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQuZnByKVswXTsKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOwotCi0JCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKLQl9Ci0KIAljYXNlIFBUUkFDRV9HRVRFVkVOVE1TRzoKIAkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnB0cmFjZV9tZXNzYWdlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBkYXRhKTsKIAkJYnJlYWs7CiAKLSNpZmRlZiBDT05GSUdfQUxUSVZFQworCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IGFsbCBwdF9yZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIFBUX1JFR1NfQ09VTlQgKiBzaXplb2YoaW50KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0IHw9IF9fcHV0X3VzZXIocHRyYWNlX2dldF9yZWcoY2hpbGQsIHVpKSwKKwkJCQkJICAodW5zaWduZWQgaW50IF9fdXNlciAqKSBkYXRhKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGludCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgYWxsIGdwIHJlZ3MgaW4gdGhlIGNoaWxkLiAqLworCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJaW50IHVpOworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIFBUX1JFR1NfQ09VTlQgKiBzaXplb2YoaW50KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0ID0gX19nZXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXB0cmFjZV9wdXRfcmVnKGNoaWxkLCB1aSwgdG1wKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGludCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOgorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzoKIAljYXNlIFBUUkFDRV9HRVRWUlJFR1M6Ci0JCS8qIEdldCB0aGUgY2hpbGQgYWx0aXZlYyByZWdpc3RlciBzdGF0ZS4gKi8KLQkJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY2hpbGQpOwotCQlyZXQgPSBnZXRfdnJyZWdzKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEsIGNoaWxkKTsKKwljYXNlIFBUUkFDRV9TRVRWUlJFR1M6CisJY2FzZSBQVFJBQ0VfR0VUUkVHUzY0OgorCWNhc2UgUFRSQUNFX1NFVFJFR1M2NDoKKwljYXNlIFBQQ19QVFJBQ0VfR0VURlBSRUdTOgorCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6CisJY2FzZSBQVFJBQ0VfS0lMTDoKKwljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOgorCWNhc2UgUFRSQUNFX0RFVEFDSDoKKwljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6CisJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoKKwljYXNlIFBUUkFDRV9DT05UOgorCQlyZXQgPSBhcmNoX3B0cmFjZShjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCi0JY2FzZSBQVFJBQ0VfU0VUVlJSRUdTOgotCQkvKiBTZXQgdGhlIGNoaWxkIGFsdGl2ZWMgcmVnaXN0ZXIgc3RhdGUuICovCi0JCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKGNoaWxkKTsKLQkJcmV0ID0gc2V0X3ZycmVncyhjaGlsZCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7CisJLyogT2xkIHJldmVyc2UgYXJncyBwdHJhY2UgY2FsbHNzICovCisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlyZXQgPSBjb21wYXRfcHRyYWNlX29sZChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotI2VuZGlmCiAKIAlkZWZhdWx0OgogCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKaW5kZXggZjIyODY4Mi4uYTVkZTYyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYwpAQCAtMjc4LDEwICsyNzgsOCBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAotCWluZGV4ID0gMDsKIAlmb3IgKG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBOVUxMKTsKIAkgICAgIG5vZGUgIT0gTlVMTDsKIAkgICAgIG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBub2RlKSkgewpAQCAtMjk1LDggKzI5Myw3IEBACiAJCQljb250aW51ZTsKIAkJcnRhc19zZXR1cF9waGIocGhiKTsKIAkJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIG5vZGUsIDApOwotCQlwY2lfc2V0dXBfcGhiX2lvKHBoYiwgaW5kZXggPT0gMCk7Ci0JCWluZGV4Kys7CisJCWlzYV9icmlkZ2VfZmluZF9lYXJseShwaGIpOwogCX0KIAogCW9mX25vZGVfcHV0KHJvb3QpOwpAQCAtMzM1LDcgKzMzMiw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCXJjID0gdW5tYXBfYnVzX3JhbmdlKGIpOworCXJjID0gcGNpYmlvc191bm1hcF9pb19zcGFjZShiKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIElPIG9uIGJ1cyAlc1xuIiwKIAkJCV9fRlVOQ1RJT05fXywgYi0+bmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwppbmRleCBlZDA3YTE5Li40OTI0YzQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTQ4Niw2ICs0ODcsMTQgQEAKIAogCXN3aXRjaChiYXNlX3BvcnQpIHsKIAljYXNlIEk4MDQyX0RBVEFfUkVHOgorCQlpZiAoIShucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJwbnBQTlAsMzAzIikpKQorCQkJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicG5wUE5QLGYwMyIpOworCQlpZiAobnApIHsKKwkJCXBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOworCQkJb2Zfbm9kZV9wdXQobnApOworCQkJbnAgPSBwYXJlbnQ7CisJCQlicmVhazsKKwkJfQogCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICI4MDQyIik7CiAJCWJyZWFrOwogCWNhc2UgRkRDX0JBU0U6IC8qIEZEQzEgKi8KQEAgLTU3MSwzICs1ODAsMTUgQEAKIAogbGF0ZV9pbml0Y2FsbChjaGVja19jYWNoZV9jb2hlcmVuY3kpOwogI2VuZGlmIC8qIENPTkZJR19DSEVDS19DQUNIRV9DT0hFUkVOQ1kgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RydWN0IGRlbnRyeSAqcG93ZXJwY19kZWJ1Z2ZzX3Jvb3Q7CisKK3N0YXRpYyBpbnQgcG93ZXJwY19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlwb3dlcnBjX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicG93ZXJwYyIsIE5VTEwpOworCisJcmV0dXJuIHBvd2VycGNfZGVidWdmc19yb290ID09IE5VTEw7Cit9CithcmNoX2luaXRjYWxsKHBvd2VycGNfZGVidWdmc19pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDM1ZjhmNDQuLjdlYzZiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKQEAgLTI2MiwxMyArMjYyLDExIEBACiAJICogU3lzdGVtcyB3aXRoIE9GIGNhbiBsb29rIGluIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBjcHUgbm9kZShzKQogCSAqIGZvciBhIHBvc3NpYmx5IG1vcmUgYWNjdXJhdGUgdmFsdWUuCiAJICovCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKSkgewotCQlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKLQkJaWNhY2hlX2JzaXplID0gY3VyX2NwdV9zcGVjLT5pY2FjaGVfYnNpemU7Ci0JCXVjYWNoZV9ic2l6ZSA9IDA7Ci0JfSBlbHNlCi0JCXVjYWNoZV9ic2l6ZSA9IGRjYWNoZV9ic2l6ZSA9IGljYWNoZV9ic2l6ZQotCQkJPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKKwlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKKwlpY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmljYWNoZV9ic2l6ZTsKKwl1Y2FjaGVfYnNpemUgPSAwOworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKSkKKwkJdWNhY2hlX2JzaXplID0gaWNhY2hlX2JzaXplID0gZGNhY2hlX2JzaXplOwogCiAJLyogcmVib290IG9uIHBhbmljICovCiAJcGFuaWNfdGltZW91dCA9IDE4MDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCA2MDE4MTc4Li5iYzQzYmJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0zNTAsMTMgKzM1MCwxMSBAQAogewogCURCRygiIC0+IHNldHVwX3N5c3RlbSgpXG4iKTsKIAotCS8qIEFwcGx5IHRoZSBDUFVzLXNwZWNpZmljIGFuZCBmaXJtd2FyZSBzcGVjaWZpYyBmaXh1cHMgdG8ga2VybmVsCi0JICogdGV4dCAobm9wIG91dCBzZWN0aW9ucyBub3QgcmVsZXZhbnQgdG8gdGhpcyBDUFUgb3IgdGhpcyBmaXJtd2FyZSkKKwkvKiBBcHBseSBDUFVzLXNwZWNpZmljIGZpeHVwcyB0byBrZXJuZWwgdGV4dCAobm9wIG91dCBzZWN0aW9ucworCSAqIG5vdCByZWxldmFudCB0byB0aGlzIENQVSkKIAkgKi8KIAlkb19mZWF0dXJlX2ZpeHVwcyhjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcywKIAkJCSAgJl9fc3RhcnRfX19mdHJfZml4dXAsICZfX3N0b3BfX19mdHJfZml4dXApOwotCWRvX2ZlYXR1cmVfZml4dXBzKHBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMsCi0JCQkgICZfX3N0YXJ0X19fZndfZnRyX2ZpeHVwLCAmX19zdG9wX19fZndfZnRyX2ZpeHVwKTsKIAogCS8qCiAJICogVW5mbGF0dGVuIHRoZSBkZXZpY2UtdHJlZSBwYXNzZWQgYnkgcHJvbV9pbml0IG9yIGtleGVjCkBAIC0zOTQsNiArMzkyLDEyIEBACiAJaWYgKHBwY19tZC5pbml0X2Vhcmx5KQogCQlwcGNfbWQuaW5pdF9lYXJseSgpOwogCisJLyogQXBwbHkgZmlybXdhcmUgc3BlY2lmaWMgZml4dXBzIHRvIGtlcm5lbCB0ZXh0IChub3Agb3V0CisJICogc2VjdGlvbnMgbm90IHJlbGV2YW50IHRvIHRoaXMgZmlybXdhcmUpCisJICovCisJZG9fZmVhdHVyZV9maXh1cHMocG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcywKKwkJCSAgJl9fc3RhcnRfX19md19mdHJfZml4dXAsICZfX3N0b3BfX19md19mdHJfZml4dXApOworCiAgCS8qCiAJICogV2UgY2FuIGRpc2NvdmVyIHNlcmlhbCBwb3J0cyBub3cgc2luY2UgdGhlIGFib3ZlIGRpZCBzZXR1cCB0aGUKIAkgKiBoYXNoIHRhYmxlIG1hbmFnZW1lbnQgZm9yIHVzLCB0aHVzIGlvcmVtYXAgd29ya3MuIFdlIGRvIHRoYXQgZWFybHkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzRkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29tbW9uIHNpZ25hbCBoYW5kbGluZyBjb2RlIGZvciBib3RoIDMyIGFuZCA2NCBiaXRzCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDA3IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3Byb3JhdGlvbgorICogICAgRXh0cmFjdGVkIGZyb20gc2lnbmFsXzMyLmMgYW5kIHNpZ25hbF82NC5jCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaW5jbHVkZSAic2lnbmFsLmgiCisKKy8qCisgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNpZ25hbCBmcmFtZQorICovCit2b2lkIF9fdXNlciAqIGdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgIHNpemVfdCBmcmFtZV9zaXplKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIG9sZHNwLCBuZXdzcDsKKworICAgICAgICAvKiBEZWZhdWx0IHRvIHVzaW5nIG5vcm1hbCBzdGFjayAqLworICAgICAgICBvbGRzcCA9IHJlZ3MtPmdwclsxXTsKKworCS8qIENoZWNrIGZvciBhbHQgc3RhY2sgKi8KKwlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICYmCisJICAgIGN1cnJlbnQtPnNhc19zc19zaXplICYmICFvbl9zaWdfc3RhY2sob2xkc3ApKQorCQlvbGRzcCA9IChjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZSk7CisKKwkvKiBHZXQgYWxpZ25lZCBmcmFtZSAqLworCW5ld3NwID0gKG9sZHNwIC0gZnJhbWVfc2l6ZSkgJiB+MHhGVUw7CisKKwkvKiBDaGVjayBhY2Nlc3MgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKW5ld3NwLCBvbGRzcCAtIG5ld3NwKSkKKwkJcmV0dXJuIE5VTEw7CisKKyAgICAgICAgcmV0dXJuICh2b2lkIF9fdXNlciAqKW5ld3NwOworfQorCisKKy8qCisgKiBSZXN0b3JlIHRoZSB1c2VyIHByb2Nlc3MncyBzaWduYWwgbWFzaworICovCit2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqc2V0KQoreworCXNpZ2RlbHNldG1hc2soc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9ICpzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjaGVja19zeXNjYWxsX3Jlc3RhcnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkJICBpbnQgaGFzX2hhbmRsZXIpCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSByZWdzLT5ncHJbM107CisJaW50IHJlc3RhcnQgPSAxOworCisJLyogc3lzY2FsbCA/ICovCisJaWYgKFRSQVAocmVncykgIT0gMHgwQzAwKQorCQlyZXR1cm47CisKKwkvKiBlcnJvciBzaWduYWxsZWQgPyAqLworCWlmICghKHJlZ3MtPmNjciAmIDB4MTAwMDAwMDApKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCWNhc2UgRVJFU1RBUlROT0hBTkQ6CisJCS8qIEVSRVNUQVJUTk9IQU5EIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIG9ubHkgYmUKKwkJICogcmVzdGFydGVkIGlmIHRoZXJlIHdhcyBubyBoYW5kbGVyIGZvciB0aGUgc2lnbmFsLCBhbmQgc2luY2UKKwkJICogd2Ugb25seSBnZXQgaGVyZSBpZiB0aGVyZSBpcyBhIGhhbmRsZXIsIHdlIGRvbnQgcmVzdGFydC4KKwkJICovCisJCXJlc3RhcnQgPSAhaGFzX2hhbmRsZXI7CisJCWJyZWFrOworCWNhc2UgRVJFU1RBUlRTWVM6CisJCS8qIEVSRVNUQVJUU1lTIG1lYW5zIHRvIHJlc3RhcnQgdGhlIHN5c2NhbGwgaWYgdGhlcmUgaXMgbm8KKwkJICogaGFuZGxlciBvciB0aGUgaGFuZGxlciB3YXMgcmVnaXN0ZXJlZCB3aXRoIFNBX1JFU1RBUlQKKwkJICovCisJCXJlc3RhcnQgPSAhaGFzX2hhbmRsZXIgfHwgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpICE9IDA7CisJCWJyZWFrOworCWNhc2UgRVJFU1RBUlROT0lOVFI6CisJCS8qIEVSRVNUQVJUTk9JTlRSIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIGJlCisJCSAqIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgcmV0dXJucy4KKwkJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3RhcnQpIHsKKwkJaWYgKHJldCA9PSBFUkVTVEFSVF9SRVNUQVJUQkxPQ0spCisJCQlyZWdzLT5ncHJbMF0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJZWxzZQorCQkJcmVncy0+Z3ByWzNdID0gcmVncy0+b3JpZ19ncHIzOworCQlyZWdzLT5uaXAgLT0gNDsKKwkJcmVncy0+cmVzdWx0ID0gMDsKKwl9IGVsc2UgeworCQlyZWdzLT5yZXN1bHQgPSAtRUlOVFI7CisJCXJlZ3MtPmdwclszXSA9IEVJTlRSOworCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKKwl9Cit9CisKK2ludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2lnaW5mb190IGluZm87CisJaW50IHNpZ25yOworCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKwlpbnQgcmV0OworCWludCBpczMyID0gaXNfMzJiaXRfdGFzaygpOworCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UgaWYgKCFvbGRzZXQpCisJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOworCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisKKwkvKiBJcyB0aGVyZSBhbnkgc3lzY2FsbCByZXN0YXJ0IGJ1c2luZXNzIGhlcmUgPyAqLworCWNoZWNrX3N5c2NhbGxfcmVzdGFydChyZWdzLCAma2EsIHNpZ25yID4gMCk7CisKKwlpZiAoc2lnbnIgPD0gMCkgeworCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCQl9CisJCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG5vIHNpZ25hbHMgZGVsaXZlcmVkICovCisJfQorCisgICAgICAgIC8qCisJICogUmVlbmFibGUgdGhlIERBQlIgYmVmb3JlIGRlbGl2ZXJpbmcgdGhlIHNpZ25hbCB0bworCSAqIHVzZXIgc3BhY2UuIFRoZSBEQUJSIHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQgaWYgaXQKKwkgKiB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBrZXJuZWwuCisJICovCisJaWYgKGN1cnJlbnQtPnRocmVhZC5kYWJyKQorCQlzZXRfZGFicihjdXJyZW50LT50aHJlYWQuZGFicik7CisKKwlpZiAoaXMzMikgeworICAgICAgICAJaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKwkJCXJldCA9IGhhbmRsZV9ydF9zaWduYWwzMihzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LAorCQkJCQlyZWdzKTsKKwkJZWxzZQorCQkJcmV0ID0gaGFuZGxlX3NpZ25hbDMyKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsCisJCQkJCXJlZ3MpOworCX0gZWxzZSB7CisJCXJldCA9IGhhbmRsZV9ydF9zaWduYWw2NChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLAorCQkJICAma2Euc2Euc2FfbWFzayk7CisJCWlmICghKGthLnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCisJCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ25yKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCQkvKgorCQkgKiBBIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KKwkJICogaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcuCisJCSAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2xvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLAorCQl1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQl1bnNpZ25lZCBsb25nIHI4LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJbMV0pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZmIzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAwNyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29wcm9yYXRpb24KKyAqICAgIEV4dHJhY3RlZCBmcm9tIHNpZ25hbF8zMi5jIGFuZCBzaWduYWxfNjQuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIFJFQURNRS5sZWdhbCBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1BPV0VSUENfQVJDSF9TSUdOQUxfSAorI2RlZmluZSBfUE9XRVJQQ19BUkNIX1NJR05BTF9ICisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKK2V4dGVybiB2b2lkIF9fdXNlciAqIGdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgIHNpemVfdCBmcmFtZV9zaXplKTsKK2V4dGVybiB2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqc2V0KTsKKworZXh0ZXJuIGludCBoYW5kbGVfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK2V4dGVybiBpbnQgaGFuZGxlX3J0X3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJICAgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LAorCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKworc3RhdGljIGlubGluZSBpbnQgaXNfMzJiaXRfdGFzayh2b2lkKQoreworCXJldHVybiB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCk7Cit9CisKK2V4dGVybiBpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCSAgICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKnNldCwKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzXzMyYml0X3Rhc2sodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCQkgICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKnNldCwKKwkJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAtRUZBVUxUOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BQQzY0KSAqLworCisjZW5kaWYgIC8qIF9QT1dFUlBDX0FSQ0hfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IGRkMWRjYTUuLjU5MDA1N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtNTEsMTIgKzUxLDExIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNlbmRpZgogCisjaW5jbHVkZSAic2lnbmFsLmgiCisKICN1bmRlZiBERUJVR19TSUcKIAotI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKLQogI2lmZGVmIENPTkZJR19QUEM2NAotI2RlZmluZSBkb19zaWduYWwJZG9fc2lnbmFsMzIKICNkZWZpbmUgc3lzX3NpZ3N1c3BlbmQJY29tcGF0X3N5c19zaWdzdXNwZW5kCiAjZGVmaW5lIHN5c19ydF9zaWdzdXNwZW5kCWNvbXBhdF9zeXNfcnRfc2lnc3VzcGVuZAogI2RlZmluZSBzeXNfcnRfc2lncmV0dXJuCWNvbXBhdF9zeXNfcnRfc2lncmV0dXJuCkBAIC0yMzEsOCArMjMwLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi1pbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQogLyoKICAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCiAgKi8KQEAgLTI1MSwxNCArMjQ4LDYgQEAKICAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAotI2lmZGVmIENPTkZJR19QUEMzMgotbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsIGludCByNSwKLQkJaW50IHI2LCBpbnQgcjcsIGludCByOCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+Z3ByWzFdKTsKLX0KLSNlbmRpZgotCiBsb25nIHN5c19zaWdhY3Rpb24oaW50IHNpZywgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICphY3QsCiAJCXN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKIHsKQEAgLTI5MywxNCArMjgyLDE3IEBACiAvKgogICogV2hlbiB3ZSBoYXZlIHNpZ25hbHMgdG8gZGVsaXZlciwgd2Ugc2V0IHVwIG9uIHRoZQogICogdXNlciBzdGFjaywgZ29pbmcgZG93biBmcm9tIHRoZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyOgotICoJYSBzaWdyZWdzIHN0cnVjdAorICoJYW4gQUJJIGdhcCBvZiA1NiB3b3JkcworICoJYW4gbWNvbnRleHQgc3RydWN0CiAgKglhIHNpZ2NvbnRleHQgc3RydWN0CiAgKglhIGdhcCBvZiBfX1NJR05BTF9GUkFNRVNJWkUgYnl0ZXMKICAqCi0gKiBFYWNoIG9mIHRoZXNlIHRoaW5ncyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgaW4gc2l6ZS4KKyAqIEVhY2ggb2YgdGhlc2UgdGhpbmdzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBieXRlcyBpbiBzaXplLiBUaGUgZm9sbG93aW5nCisgKiBzdHJ1Y3R1cmUgcmVwcmVzZW50IGFsbCBvZiB0aGlzIGV4Y2VwdCB0aGUgX19TSUdOQUxfRlJBTUVTSVpFIGdhcAogICoKICAqLwotc3RydWN0IHNpZ3JlZ3Mgeworc3RydWN0IHNpZ2ZyYW1lIHsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzY3R4OwkJLyogdGhlIHNpZ2NvbnRleHQgKi8KIAlzdHJ1Y3QgbWNvbnRleHQJbWN0eDsJCS8qIGFsbCB0aGUgcmVnaXN0ZXIgdmFsdWVzICovCiAJLyoKIAkgKiBQcm9ncmFtcyB1c2luZyB0aGUgcnM2MDAwL3hjb2ZmIGFiaSBjYW4gc2F2ZSB1cCB0byAxOSBncApAQCAtNzAzLDQ0ICs2OTUsMjIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAotCi0vKgotICogUmVzdG9yZSB0aGUgdXNlciBwcm9jZXNzJ3Mgc2lnbmFsIG1hc2sKLSAqLwotI2lmZGVmIENPTkZJR19QUEM2NAotZXh0ZXJuIHZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpOwotI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCi1zdGF0aWMgdm9pZCByZXN0b3JlX3NpZ21hc2soc2lnc2V0X3QgKnNldCkKLXsKLQlzaWdkZWxzZXRtYXNrKHNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSAqc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLX0KLSNlbmRpZgotCiAvKgogICogU2V0IHVwIGEgc2lnbmFsIGZyYW1lIGZvciBhICJyZWFsLXRpbWUiIHNpZ25hbCBoYW5kbGVyCiAgKiAob25lIHdoaWNoIGdldHMgc2lnaW5mbykuCiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX3J0X3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKK2ludCBoYW5kbGVfcnRfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAJCXNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3ApCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKnJ0X3NmOwogCXN0cnVjdCBtY29udGV4dCBfX3VzZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgb3JpZ3NwID0gbmV3c3A7CisJdW5zaWduZWQgbG9uZyBuZXdzcCA9IDA7CiAKIAkvKiBTZXQgdXAgU2lnbmFsIEZyYW1lICovCiAJLyogUHV0IGEgUmVhbCBUaW1lIENvbnRleHQgb250byBzdGFjayAqLwotCW5ld3NwIC09IHNpemVvZigqcnRfc2YpOwotCXJ0X3NmID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKiluZXdzcDsKLQotCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCi0JbmV3c3AgLT0gX19TSUdOQUxfRlJBTUVTSVpFICsgMTY7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKW5ld3NwLCBvcmlnc3AgLSBuZXdzcCkpCisJcnRfc2YgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqcnRfc2YpKTsKKwlpZiAodW5saWtlbHkocnRfc2YgPT0gTlVMTCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAkvKiBQdXQgdGhlIHNpZ2luZm8gJiBmaWxsIGluIG1vc3Qgb2YgdGhlIHVjb250ZXh0ICovCkBAIC03NzAsOCArNzQwLDEyIEBACiAKIAljdXJyZW50LT50aHJlYWQuZnBzY3IudmFsID0gMDsJLyogdHVybiBvZmYgYWxsIGZwIGV4Y2VwdGlvbnMgKi8KIAorCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCisJbmV3c3AgPSAoKHVuc2lnbmVkIGxvbmcpcnRfc2YpIC0gKF9fU0lHTkFMX0ZSQU1FU0laRSArIDE2KTsKIAlpZiAocHV0X3VzZXIocmVncy0+Z3ByWzFdLCAodTMyIF9fdXNlciAqKW5ld3NwKSkKIAkJZ290byBiYWRmcmFtZTsKKworCS8qIEZpbGwgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPmdwclsxXSA9IG5ld3NwOwogCXJlZ3MtPmdwclszXSA9IHNpZzsKIAlyZWdzLT5ncHJbNF0gPSAodW5zaWduZWQgbG9uZykgJnJ0X3NmLT5pbmZvOwpAQCAtMTAxNSwyNyArOTg5LDE4IEBACiAvKgogICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgogICovCi1zdGF0aWMgaW50IGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JCXNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgbmV3c3ApCitpbnQgaGFuZGxlX3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjOwotCXN0cnVjdCBzaWdyZWdzIF9fdXNlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBvcmlnc3AgPSBuZXdzcDsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKwl1bnNpZ25lZCBsb25nIG5ld3NwID0gMDsKIAogCS8qIFNldCB1cCBTaWduYWwgRnJhbWUgKi8KLQluZXdzcCAtPSBzaXplb2Yoc3RydWN0IHNpZ3JlZ3MpOwotCWZyYW1lID0gKHN0cnVjdCBzaWdyZWdzIF9fdXNlciAqKSBuZXdzcDsKLQotCS8qIFB1dCBhIHNpZ2NvbnRleHQgb24gdGhlIHN0YWNrICovCi0JbmV3c3AgLT0gc2l6ZW9mKCpzYyk7Ci0Jc2MgPSAoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICopIG5ld3NwOwotCi0JLyogY3JlYXRlIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZXIgb2YgdGhlIGhhbmRsZXIgKi8KLQluZXdzcCAtPSBfX1NJR05BTF9GUkFNRVNJWkU7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKSBuZXdzcCwgb3JpZ3NwIC0gbmV3c3ApKQorCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisJaWYgKHVubGlrZWx5KGZyYW1lID09IE5VTEwpKQogCQlnb3RvIGJhZGZyYW1lOworCXNjID0gKHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqKSAmZnJhbWUtPnNjdHg7CiAKICNpZiBfTlNJRyAhPSA2NAogI2Vycm9yICJQbGVhc2UgYWRqdXN0IGhhbmRsZV9zaWduYWwoKSIKQEAgLTEwNDcsNyArMTAxMiw3IEBACiAjZWxzZQogCSAgICB8fCBfX3B1dF91c2VyKG9sZHNldC0+c2lnWzFdLCAmc2MtPl91bnVzZWRbM10pCiAjZW5kaWYKLQkgICAgfHwgX19wdXRfdXNlcih0b191c2VyX3B0cihmcmFtZSksICZzYy0+cmVncykKKwkgICAgfHwgX19wdXRfdXNlcih0b191c2VyX3B0cigmZnJhbWUtPm1jdHgpLCAmc2MtPnJlZ3MpCiAJICAgIHx8IF9fcHV0X3VzZXIoc2lnLCAmc2MtPnNpZ25hbCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKQEAgLTEwNjMsOCArMTAyOCwxMSBAQAogCiAJY3VycmVudC0+dGhyZWFkLmZwc2NyLnZhbCA9IDA7CS8qIHR1cm4gb2ZmIGFsbCBmcCBleGNlcHRpb25zICovCiAKKwkvKiBjcmVhdGUgYSBzdGFjayBmcmFtZSBmb3IgdGhlIGNhbGxlciBvZiB0aGUgaGFuZGxlciAqLworCW5ld3NwID0gKCh1bnNpZ25lZCBsb25nKWZyYW1lKSAtIF9fU0lHTkFMX0ZSQU1FU0laRTsKIAlpZiAocHV0X3VzZXIocmVncy0+Z3ByWzFdLCAodTMyIF9fdXNlciAqKW5ld3NwKSkKIAkJZ290byBiYWRmcmFtZTsKKwogCXJlZ3MtPmdwclsxXSA9IG5ld3NwOwogCXJlZ3MtPmdwclszXSA9IHNpZzsKIAlyZWdzLT5ncHJbNF0gPSAodW5zaWduZWQgbG9uZykgc2M7CkBAIC0xMTI2LDEwNiArMTA5NCwzIEBACiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwogfQotCi0vKgotICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0Ci0gKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKLSAqIG1pc3Rha2UuCi0gKi8KLWludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnaW5mb190IGluZm87Ci0Jc3RydWN0IGtfc2lnYWN0aW9uIGthOwotCXVuc2lnbmVkIGludCBuZXdzcDsKLQlpbnQgc2lnbnIsIHJldDsKLQotI2lmZGVmIENPTkZJR19QUEMzMgotCWlmICh0cnlfdG9fZnJlZXplKCkpIHsKLQkJc2lnbnIgPSAwOwotCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJZ290byBub19zaWduYWw7Ci0JfQotI2VuZGlmCi0KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7Ci0JZWxzZSBpZiAoIW9sZHNldCkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7Ci0KLQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLSNpZmRlZiBDT05GSUdfUFBDMzIKLW5vX3NpZ25hbDoKLSNlbmRpZgotCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMAkJLyogU3lzdGVtIENhbGwhICovCi0JICAgICYmIHJlZ3MtPmNjciAmIDB4MTAwMDAwMDAJCS8qIGVycm9yIHNpZ25hbGxlZCAqLwotCSAgICAmJiAoKHJldCA9IHJlZ3MtPmdwclszXSkgPT0gRVJFU1RBUlRTWVMKLQkJfHwgcmV0ID09IEVSRVNUQVJUTk9IQU5EIHx8IHJldCA9PSBFUkVTVEFSVE5PSU5UUgotCQl8fCByZXQgPT0gRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSkgewotCi0JCWlmIChzaWduciA+IDAKLQkJICAgICYmIChyZXQgPT0gRVJFU1RBUlROT0hBTkQgfHwgcmV0ID09IEVSRVNUQVJUX1JFU1RBUlRCTE9DSwotCQkJfHwgKHJldCA9PSBFUkVTVEFSVFNZUwotCQkJICAgICYmICEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkpKSB7Ci0JCQkvKiBtYWtlIHRoZSBzeXN0ZW0gY2FsbCByZXR1cm4gYW4gRUlOVFIgZXJyb3IgKi8KLQkJCXJlZ3MtPnJlc3VsdCA9IC1FSU5UUjsKLQkJCXJlZ3MtPmdwclszXSA9IEVJTlRSOwotCQkJLyogbm90ZSB0aGF0IHRoZSBjcjAuU08gYml0IGlzIGFscmVhZHkgc2V0ICovCi0JCX0gZWxzZSB7Ci0JCQlyZWdzLT5uaXAgLT0gNDsJLyogQmFjayB1cCAmIHJldHJ5IHN5c3RlbSBjYWxsICovCi0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQkJcmVncy0+dHJhcCA9IDA7Ci0JCQlpZiAocmV0ID09IEVSRVNUQVJUX1JFU1RBUlRCTE9DSykKLQkJCQlyZWdzLT5ncHJbMF0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKLQkJCWVsc2UKLQkJCQlyZWdzLT5ncHJbM10gPSByZWdzLT5vcmlnX2dwcjM7Ci0JCX0KLQl9Ci0KLQlpZiAoc2lnbnIgPT0gMCkgewotCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLwotCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgewotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0JCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOwotCQl9Ci0JCXJldHVybiAwOwkJLyogbm8gc2lnbmFscyBkZWxpdmVyZWQgKi8KLQl9Ci0KLQlpZiAoKGthLnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYgY3VycmVudC0+c2FzX3NzX3NpemUKLQkgICAgJiYgIW9uX3NpZ19zdGFjayhyZWdzLT5ncHJbMV0pKQotCQluZXdzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwotCWVsc2UKLQkJbmV3c3AgPSByZWdzLT5ncHJbMV07Ci0JbmV3c3AgJj0gfjB4ZlVMOwotCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JLyoKLQkgKiBSZWVuYWJsZSB0aGUgREFCUiBiZWZvcmUgZGVsaXZlcmluZyB0aGUgc2lnbmFsIHRvCi0JICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAotCSAqIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGtlcm5lbC4KLQkgKi8KLQlpZiAoY3VycmVudC0+dGhyZWFkLmRhYnIpCi0JCXNldF9kYWJyKGN1cnJlbnQtPnRocmVhZC5kYWJyKTsKLSNlbmRpZgotCi0JLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJcmV0ID0gaGFuZGxlX3J0X3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzLCBuZXdzcCk7Ci0JZWxzZQotCQlyZXQgPSBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MsIG5ld3NwKTsKLQotCWlmIChyZXQpIHsKLQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsCi0JCQkgICZrYS5zYS5zYV9tYXNrKTsKLQkJaWYgKCEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2lnbnIpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQkvKiBBIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KLQkJICAgaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KLQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCi0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKaW5kZXggYjI3ZTI2OC4uZGU4OTVlNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCkBAIC0zNCw5ICszNCw5IEBACiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAotI2RlZmluZSBERUJVR19TSUcgMAorI2luY2x1ZGUgInNpZ25hbC5oIgogCi0jZGVmaW5lIF9CTE9DS0FCTEUgKH4oc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpKQorI2RlZmluZSBERUJVR19TSUcgMAogCiAjZGVmaW5lIEdQX1JFR1NfU0laRQltaW4oc2l6ZW9mKGVsZl9ncmVnc2V0X3QpLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKQogI2RlZmluZSBGUF9SRUdTX1NJWkUJc2l6ZW9mKGVsZl9mcHJlZ3NldF90KQpAQCAtNjQsMTQgKzY0LDYgQEAKIAljaGFyIGFiaWdhcFsyODhdOwogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CiAKLWxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLCB1bnNpZ25lZCBsb25nIHI1LAotCQkgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsIHVuc2lnbmVkIGxvbmcgcjgsCi0JCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+Z3ByWzFdKTsKLX0KLQotCiAvKgogICogU2V0IHVwIHRoZSBzaWdjb250ZXh0IGZvciB0aGUgc2lnbmFsIGZyYW1lLgogICovCkBAIC0yMDgsMjUgKzIwMCw2IEBACiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNpZ25hbCBmcmFtZQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX191c2VyICogZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCSAgc2l6ZV90IGZyYW1lX3NpemUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3A7Ci0KLSAgICAgICAgLyogRGVmYXVsdCB0byB1c2luZyBub3JtYWwgc3RhY2sgKi8KLSAgICAgICAgbmV3c3AgPSByZWdzLT5ncHJbMV07Ci0KLQlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICYmIGN1cnJlbnQtPnNhc19zc19zaXplKSB7Ci0JCWlmICghIG9uX3NpZ19zdGFjayhyZWdzLT5ncHJbMV0pKQotCQkJbmV3c3AgPSAoY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemUpOwotCX0KLQotICAgICAgICByZXR1cm4gKHZvaWQgX191c2VyICopKChuZXdzcCAtIGZyYW1lX3NpemUpICYgLTE2dWwpOwotfQotCi0vKgogICogU2V0dXAgdGhlIHRyYW1wb2xpbmUgY29kZSBvbiB0aGUgc3RhY2sKICAqLwogc3RhdGljIGxvbmcgc2V0dXBfdHJhbXBvbGluZSh1bnNpZ25lZCBpbnQgc3lzY2FsbCwgdW5zaWduZWQgaW50IF9fdXNlciAqdHJhbXApCkBAIC0yNTMsMTkgKzIyNiw2IEBACiB9CiAKIC8qCi0gKiBSZXN0b3JlIHRoZSB1c2VyIHByb2Nlc3MncyBzaWduYWwgbWFzayAoYWxzbyB1c2VkIGJ5IHNpZ25hbDMyLmMpCi0gKi8KLXZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpCi17Ci0Jc2lnZGVsc2V0bWFzayhzZXQsIH5fQkxPQ0tBQkxFKTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gKnNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci19Ci0KLQotLyoKICAqIEhhbmRsZSB7Z2V0LHNldCxzd2FwfV9jb250ZXh0IG9wZXJhdGlvbnMKICAqLwogaW50IHN5c19zd2FwY29udGV4dChzdHJ1Y3QgdWNvbnRleHQgX191c2VyICpvbGRfY3R4LApAQCAtMzU5LDcgKzMxOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZ25yLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCitpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQlzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBIYW5kbGVyIGlzICpyZWFsbHkqIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBmb3IKQEAgLTM3Myw4ICszMzMsNyBAQAogCWxvbmcgZXJyID0gMDsKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJaWYgKHVubGlrZWx5KGZyYW1lID09IE5VTEwpKQogCQlnb3RvIGJhZGZyYW1lOwogCiAJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKQEAgLTQxMSw3ICszNzAsNyBAQAogCWZ1bmN0X2Rlc2NfcHRyID0gKGZ1bmNfZGVzY3JfdCBfX3VzZXIgKikga2EtPnNhLnNhX2hhbmRsZXI7CiAKIAkvKiBBbGxvY2F0ZSBhIGR1bW15IGNhbGxlciBmcmFtZSBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyLiAqLwotCW5ld3NwID0gKHVuc2lnbmVkIGxvbmcpZnJhbWUgLSBfX1NJR05BTF9GUkFNRVNJWkU7CisJbmV3c3AgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUpIC0gX19TSUdOQUxfRlJBTUVTSVpFOwogCWVyciB8PSBwdXRfdXNlcihyZWdzLT5ncHJbMV0sICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKW5ld3NwKTsKIAogCS8qIFNldCB1cCAicmVncyIgc28gd2UgInJldHVybiIgdG8gdGhlIHNpZ25hbCBoYW5kbGVyLiAqLwpAQCAtNDQyLDEzNCArNDAxLDMgQEAKIAlmb3JjZV9zaWdzZWd2KHNpZ25yLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKIH0KLQotCi0vKgotICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgotICovCi1zdGF0aWMgaW50IGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JCQkgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgcmV0OwotCi0JLyogU2V0IHVwIFNpZ25hbCBGcmFtZSAqLwotCXJldCA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7Ci0KLQlpZiAocmV0KSB7Ci0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOwotCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX3Jlc3RhcnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EpCi17Ci0Jc3dpdGNoICgoaW50KXJlZ3MtPnJlc3VsdCkgewotCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKLQljYXNlIC1FUkVTVEFSVE5PSEFORDoKLQkJLyogRVJFU1RBUlROT0hBTkQgbWVhbnMgdGhhdCB0aGUgc3lzY2FsbCBzaG91bGQgb25seSBiZQotCQkgKiByZXN0YXJ0ZWQgaWYgdGhlcmUgd2FzIG5vIGhhbmRsZXIgZm9yIHRoZSBzaWduYWwsIGFuZCBzaW5jZQotCQkgKiB3ZSBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIGlzIGEgaGFuZGxlciwgd2UgZG9udCByZXN0YXJ0LgotCQkgKi8KLQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCQlyZWdzLT5ncHJbM10gPSBFSU5UUjsKLQkJcmVncy0+Y2NyIHw9IDB4MTAwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgLUVSRVNUQVJUU1lTOgotCQkvKiBFUkVTVEFSVFNZUyBtZWFucyB0byByZXN0YXJ0IHRoZSBzeXNjYWxsIGlmIHRoZXJlIGlzIG5vCi0JCSAqIGhhbmRsZXIgb3IgdGhlIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQgd2l0aCBTQV9SRVNUQVJUCi0JCSAqLwotCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkgewotCQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCQkJcmVncy0+Z3ByWzNdID0gRUlOVFI7Ci0JCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGZhbGx0aHJvdWdoICovCi0JY2FzZSAtRVJFU1RBUlROT0lOVFI6Ci0JCS8qIEVSRVNUQVJUTk9JTlRSIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIGJlCi0JCSAqIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgcmV0dXJucy4KLQkJICovCi0JCXJlZ3MtPmdwclszXSA9IHJlZ3MtPm9yaWdfZ3ByMzsKLQkJcmVncy0+bmlwIC09IDQ7Ci0JCXJlZ3MtPnJlc3VsdCA9IDA7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIE5vdGUgdGhhdCAnaW5pdCcgaXMgYSBzcGVjaWFsIHByb2Nlc3M6IGl0IGRvZXNuJ3QgZ2V0IHNpZ25hbHMgaXQgZG9lc24ndAotICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5Ci0gKiBtaXN0YWtlLgotICovCi1pbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ2luZm9fdCBpbmZvOwotCWludCBzaWducjsKLQlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7Ci0KLQkvKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyAzMiBiaXQgLSBpbnZva2UgdGhlCi0JICogMzIgYml0IHNpZ25hbCBoYW5kbGluZyBjb2RlCi0JICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkKLQkJcmV0dXJuIGRvX3NpZ25hbDMyKG9sZHNldCwgcmVncyk7Ci0KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7Ci0JZWxzZSBpZiAoIW9sZHNldCkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7Ci0KLQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLQlpZiAoc2lnbnIgPiAwKSB7Ci0JCWludCByZXQ7Ci0KLQkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMCkKLQkJCXN5c2NhbGxfcmVzdGFydChyZWdzLCAma2EpOwotCi0JCS8qCi0JCSAqIFJlZW5hYmxlIHRoZSBEQUJSIGJlZm9yZSBkZWxpdmVyaW5nIHRoZSBzaWduYWwgdG8KLQkJICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAotCQkgKiB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBrZXJuZWwuCi0JCSAqLwotCQlpZiAoY3VycmVudC0+dGhyZWFkLmRhYnIpCi0JCQlzZXRfZGFicihjdXJyZW50LT50aHJlYWQuZGFicik7Ci0KLQkJcmV0ID0gaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKLQotCQkvKiBJZiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCwgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KLQkJICAgaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KLQkJaWYgKHJldCAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoVFJBUChyZWdzKSA9PSAweDBDMDApIHsJLyogU3lzdGVtIENhbGwhICovCi0JCWlmICgoaW50KXJlZ3MtPnJlc3VsdCA9PSAtRVJFU1RBUlROT0hBTkQgfHwKLQkJICAgIChpbnQpcmVncy0+cmVzdWx0ID09IC1FUkVTVEFSVFNZUyB8fAotCQkgICAgKGludClyZWdzLT5yZXN1bHQgPT0gLUVSRVNUQVJUTk9JTlRSKSB7Ci0JCQlyZWdzLT5ncHJbM10gPSByZWdzLT5vcmlnX2dwcjM7Ci0JCQlyZWdzLT5uaXAgLT0gNDsgLyogQmFjayB1cCAmIHJldHJ5IHN5c3RlbSBjYWxsICovCi0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQl9IGVsc2UgaWYgKChpbnQpcmVncy0+cmVzdWx0ID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKLQkJCXJlZ3MtPmdwclswXSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOwotCQkJcmVncy0+bmlwIC09IDQ7Ci0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQl9Ci0JfQotCS8qIE5vIHNpZ25hbCB0byBkZWxpdmVyIC0tIHB1dCB0aGUgc2F2ZWQgc2lnbWFzayBiYWNrICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGRvX3NpZ25hbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggNjg5OTFjMi4uNTVkMjllZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtNDQyLDEyICs0NDIsMTQgQEAKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJm5vZGUtPnN5c2Rldi5rb2JqLCAmZGV2LT5rb2JqLAogCQkJa29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZSk7CiAKIHZvaWQgc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgaW50IG5pZCkKIHsKIAlzdHJ1Y3Qgbm9kZSAqbm9kZSA9ICZub2RlX2RldmljZXNbbmlkXTsKIAlzeXNmc19yZW1vdmVfbGluaygmbm9kZS0+c3lzZGV2LmtvYmosIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZGV2aWNlX2Zyb21fbm9kZSk7CiAKICNlbHNlCiBzdGF0aWMgdm9pZCByZWdpc3Rlcl9ub2Rlcyh2b2lkKQpAQCAtNDU3LDkgKzQ1OSw2IEBACiAKICNlbmRpZgogCi1FWFBPUlRfU1lNQk9MX0dQTChzeXNmc19hZGRfZGV2aWNlX3RvX25vZGUpOwotRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUpOwotCiAvKiBPbmx5IHZhbGlkIGlmIENQVSBpcyBwcmVzZW50LiAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19waHlzaWNhbF9pZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IDJjODU2NGQuLmU1ZGYxNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC03Nyw5ICs3Nyw4IEBACiAvKiBrZWVwIHRyYWNrIG9mIHdoZW4gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHJ0YyAqLwogdGltZV90IGxhc3RfcnRjX3VwZGF0ZTsKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLXVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90aXRhbiA9IDA7Ci11bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGIgPSAwOyAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpcnN0X3NldHRpbWVvZmRheSA9IDE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGlTZXJpZXNfcmVjYWxfdGl0YW47CitzdGF0aWMgc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBpU2VyaWVzX3JlY2FsX3RiOwogI2VuZGlmCiAKIC8qIFRoZSBkZWNyZW1lbnRlciBjb3VudHMgZG93biBieSAxMjggZXZlcnkgMTI4bnMgb24gYSA2MDEuICovCkBAIC0xMTMsOCArMTEyLDkgQEAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfbG9jayk7CiAKLXU2NCB0Yl90b19uc19zY2FsZTsKLXVuc2lnbmVkIHRiX3RvX25zX3NoaWZ0Oworc3RhdGljIHU2NCB0Yl90b19uc19zY2FsZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIHRiX3RvX25zX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib290X3RiIF9fcmVhZF9tb3N0bHk7CiAKIHN0cnVjdCBnZXR0aW1lb2ZkYXlfc3RydWN0IGRvX2d0b2Q7CiAKQEAgLTIxNCw3ICsyMTQsNiBAQAogIAlydW5fcG9zaXhfY3B1X3RpbWVycyhjdXJyZW50KTsKIH0KIAotI2lmZGVmIENPTkZJR19QUENfU1BMUEFSCiAvKgogICogU3R1ZmYgZm9yIGFjY291bnRpbmcgc3RvbGVuIHRpbWUuCiAgKi8KQEAgLTIyMiwxOSArMjIxLDI4IEBACiAJaW50CWluaXRpYWxpemVkOwkJCS8qIHRocmVhZCBpcyBydW5uaW5nICovCiAJdTY0CXRiOwkJCS8qIGxhc3QgVEIgdmFsdWUgcmVhZCAqLwogCXU2NAlwdXJyOwkJCS8qIGxhc3QgUFVSUiB2YWx1ZSByZWFkICovCi0Jc3BpbmxvY2tfdCBsb2NrOwogfTsKIAorLyoKKyAqIEVhY2ggZW50cnkgaW4gdGhlIGNwdV9wdXJyX2RhdGEgYXJyYXkgaXMgbWFuaXB1bGF0ZWQgb25seSBieSBpdHMKKyAqICJvd25lciIgY3B1IC0tIHVzdWFsbHkgaW4gdGhlIHRpbWVyIGludGVycnVwdCBidXQgYWxzbyBvY2Nhc2lvbmFsbHkKKyAqIGluIHByb2Nlc3MgY29udGV4dCBmb3IgY3B1IG9ubGluZS4gIEFzIGxvbmcgYXMgY3B1cyBkbyBub3QgdG91Y2gKKyAqIGVhY2ggb3RoZXJzJyBjcHVfcHVycl9kYXRhLCBkaXNhYmxpbmcgbG9jYWwgaW50ZXJydXB0cyBpcworICogc3VmZmljaWVudCB0byBzZXJpYWxpemUgYWNjZXNzZXMuCisgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X3B1cnJfZGF0YSwgY3B1X3B1cnJfZGF0YSk7CiAKIHN0YXRpYyB2b2lkIHNuYXBzaG90X3RiX2FuZF9wdXJyKHZvaWQgKmRhdGEpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgY3B1X3B1cnJfZGF0YSAqcCA9ICZfX2dldF9jcHVfdmFyKGNwdV9wdXJyX2RhdGEpOwogCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXAtPnRiID0gbWZ0YigpOwogCXAtPnB1cnIgPSBtZnNwcihTUFJOX1BVUlIpOwogCXdtYigpOwogCXAtPmluaXRpYWxpemVkID0gMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCkBAIC0yNDIsMTUgKzI1MCwxNCBAQAogICovCiB2b2lkIHNuYXBzaG90X3RpbWViYXNlcyh2b2lkKQogewotCWludCBjcHU7Ci0KIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgY3B1KS5sb2NrKTsKIAlvbl9lYWNoX2NwdShzbmFwc2hvdF90Yl9hbmRfcHVyciwgTlVMTCwgMCwgMSk7CiB9CiAKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KIHZvaWQgY2FsY3VsYXRlX3N0ZWFsX3RpbWUodm9pZCkKIHsKIAl1NjQgdGIsIHB1cnI7CkBAIC0yNjIsNyArMjY5LDYgQEAKIAlwbWUgPSAmcGVyX2NwdShjcHVfcHVycl9kYXRhLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWlmICghcG1lLT5pbml0aWFsaXplZCkKIAkJcmV0dXJuOwkJLyogdGhpcyBjYW4gaGFwcGVuIGluIGVhcmx5IGJvb3QgKi8KLQlzcGluX2xvY2soJnBtZS0+bG9jayk7CiAJdGIgPSBtZnRiKCk7CiAJcHVyciA9IG1mc3ByKFNQUk5fUFVSUik7CiAJc3RvbGVuID0gKHRiIC0gcG1lLT50YikgLSAocHVyciAtIHBtZS0+cHVycik7CkBAIC0yNzAsOSArMjc2LDkgQEAKIAkJYWNjb3VudF9zdGVhbF90aW1lKGN1cnJlbnQsIHN0b2xlbik7CiAJcG1lLT50YiA9IHRiOwogCXBtZS0+cHVyciA9IHB1cnI7Ci0Jc3Bpbl91bmxvY2soJnBtZS0+bG9jayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDX1NQTFBBUgogLyoKICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3B1IGlzIGFkZGVkIHRvIHRoZSBvbmxpbmUgbWFwIHdoZW4KICAqIGEgY3B1IGlzIGJlaW5nIGJyb3VnaHQgdXAgYXQgcnVudGltZS4KQEAgLTI4NCwxMiArMjkwLDEyIEBACiAKIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXBtZSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBtZS0+bG9jaywgZmxhZ3MpOwogCXBtZS0+dGIgPSBtZnRiKCk7CiAJcG1lLT5wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKIAlwbWUtPmluaXRpYWxpemVkID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWUtPmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1NQTFBBUiAqLwpAQCAtNTUwLDEwICs1NTYsMTUgQEAKICAqIHJldHVybmVkIGJ5IHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBmb3IgdGhlIHRpbWViYXNlIGZyZXF1ZW5jeS4gIAogICovCiAKLXN0YXRpYyB2b2lkIGlTZXJpZXNfdGJfcmVjYWwodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGlTZXJpZXNfdGJfcmVjYWwodm9pZCkKIHsKIAlzdHJ1Y3QgZGl2X3Jlc3VsdCBkaXZyZXM7CiAJdW5zaWduZWQgbG9uZyB0aXRhbiwgdGI7CisKKwkvKiBNYWtlIHN1cmUgd2Ugb25seSBydW4gb24gaVNlcmllcyAqLworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAl0YiA9IGdldF90YigpOwogCXRpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOwogCWlmICggaVNlcmllc19yZWNhbF90aXRhbiApIHsKQEAgLTU5NCw4ICs2MDUsMTggQEAKIAl9CiAJaVNlcmllc19yZWNhbF90aXRhbiA9IHRpdGFuOwogCWlTZXJpZXNfcmVjYWxfdGIgPSB0YjsKKworCXJldHVybiAwOwogfQotI2VuZGlmCitsYXRlX2luaXRjYWxsKGlTZXJpZXNfdGJfcmVjYWwpOworCisvKiBDYWxsZWQgZnJvbSBwbGF0Zm9ybSBlYXJseSBpbml0ICovCit2b2lkIF9faW5pdCBpU2VyaWVzX3RpbWVfaW5pdF9lYXJseSh2b2lkKQoreworCWlTZXJpZXNfcmVjYWxfdGIgPSBnZXRfdGIoKTsKKwlpU2VyaWVzX3JlY2FsX3RpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOworfQorI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCiAvKgogICogRm9yIGlTZXJpZXMgc2hhcmVkIHByb2Nlc3NvcnMsIHdlIGhhdmUgdG8gbGV0IHRoZSBoeXBlcnZpc29yCkBAIC03MzUsNyArNzU2LDcgQEAKIHsKIAlpZiAoX19VU0VfUlRDKCkpCiAJCXJldHVybiBnZXRfcnRjKCk7Ci0JcmV0dXJuIG11bGhkdShnZXRfdGIoKSwgdGJfdG9fbnNfc2NhbGUpIDw8IHRiX3RvX25zX3NoaWZ0OworCXJldHVybiBtdWxoZHUoZ2V0X3RiKCkgLSBib290X3RiLCB0Yl90b19uc19zY2FsZSkgPDwgdGJfdG9fbnNfc2hpZnQ7CiB9CiAKIGludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKQEAgLTc1OSwxMiArNzgwLDYgQEAKIAkgKiB0byB0aGUgUlRDIGFnYWluLCBvciB3cml0ZSB0byB0aGUgUlRDIGJ1dCB0aGVuIHRoZXkgZG9uJ3QgY2FsbAogCSAqIHNldHRpbWVvZmRheSB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLgogCSAqLwotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpICYmIGZpcnN0X3NldHRpbWVvZmRheSkgewotCQlpU2VyaWVzX3RiX3JlY2FsKCk7Ci0JCWZpcnN0X3NldHRpbWVvZmRheSA9IDA7Ci0JfQotI2VuZGlmCiAKIAkvKiBNYWtlIHVzZXJzcGFjZSBnZXR0aW1lb2ZkYXkgc3BpbiB1bnRpbCB3ZSdyZSBkb25lLiAqLwogCSsrdmRzb19kYXRhLT50Yl91cGRhdGVfY291bnQ7CkBAIC05NjAsNiArOTc1LDggQEAKIAl9CiAJdGJfdG9fbnNfc2NhbGUgPSBzY2FsZTsKIAl0Yl90b19uc19zaGlmdCA9IHNoaWZ0OworCS8qIFNhdmUgdGhlIGN1cnJlbnQgdGltZWJhc2UgdG8gcHJldHR5IHVwIENPTkZJR19QUklOVEtfVElNRSAqLworCWJvb3RfdGIgPSBnZXRfdGIoKTsKIAogCXRtID0gZ2V0X2Jvb3RfdGltZSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggYmY2NDQ1YS4uMmJiMWNiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMTQ5LDYgKzE0OSw3IEBACiAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpZS5sb2NrLCBmbGFncyk7CiAKIAlpZiAoa2V4ZWNfc2hvdWxkX2NyYXNoKGN1cnJlbnQpIHx8CkBAIC03NzcsNyArNzc4LDcgQEAKIAkJCXJldHVybjsKIAogCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfUFIpICYmICAvKiBub3QgdXNlci1tb2RlICovCi0JCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCkgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CisJCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCwgcmVncykgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5uaXAgKz0gNDsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwppbmRleCA0MjQ1NTc5Li5jZWYwMWU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJLyoKIAkgKiBGaWxsIHVwIHRoZSAic3lzdGVtY2ZnIiBzdHVmZiBmb3IgYmFja3dhcmQgY29tcGF0aWJsaXR5CiAJICovCi0Jc3RyY3B5KHZkc29fZGF0YS0+ZXllX2NhdGNoZXIsICJTWVNURU1DRkc6UFBDNjQiKTsKKwlzdHJjcHkoKGNoYXIgKil2ZHNvX2RhdGEtPmV5ZV9jYXRjaGVyLCAiU1lTVEVNQ0ZHOlBQQzY0Iik7CiAJdmRzb19kYXRhLT52ZXJzaW9uLm1ham9yID0gU1lTVEVNQ0ZHX01BSk9SOwogCXZkc29fZGF0YS0+dmVyc2lvbi5taW5vciA9IFNZU1RFTUNGR19NSU5PUjsKIAl2ZHNvX2RhdGEtPnByb2Nlc3NvciA9IG1mc3ByKFNQUk5fUFZSKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAyMWMzOWZmLi5hZTRhY2Q4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBQUk9WSURFMzIoeCkJUFJPVklERSh4KQogI2VuZGlmCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogRU5UUlkoX3N0ZXh0KQogCkBAIC0yMTEsNiArMjEyLDExIEBACiAJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCiAJfQogCisJLiA9IEFMSUdOKEwxX0NBQ0hFX0JZVEVTKTsKKwkuZGF0YS5yZWFkX21vc3RseSA6IHsKKwkJKiguZGF0YS5yZWFkX21vc3RseSkKKwl9CisKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfX2RhdGFfbm9zYXZlIDogewogCQlfX25vc2F2ZV9iZWdpbiA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jIGIvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYwppbmRleCBjYTRkY2IwLi5jM2RmNTA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS80NHhfbW11LmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tLzR4eF9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS80eHhfbW11LmMKaW5kZXggODM4ZTA5ZC4uN2ZmMjYwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tLzR4eF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vNHh4X21tdS5jCkBAIC05LDcgKzksNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKaW5kZXggNGY4MzljNi4uN2U0ZDI3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQpAQCAtMTEsOCArMTEsNyBAQAogaGFzaC0kKENPTkZJR19QUENfTkFUSVZFKQk6PSBoYXNoX25hdGl2ZV82NC5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBpbml0XzY0Lm8gcGd0YWJsZV82NC5vIG1tdV9jb250ZXh0XzY0Lm8gXAogCQkJCSAgIGhhc2hfdXRpbHNfNjQubyBoYXNoX2xvd182NC5vIHRsYl82NC5vIFwKLQkJCQkgICBzbGJfbG93Lm8gc2xiLm8gc3RhYi5vIG1tYXAubyBpbWFsbG9jLm8gXAotCQkJCSAgICQoaGFzaC15KQorCQkJCSAgIHNsYl9sb3cubyBzbGIubyBzdGFiLm8gbW1hcC5vICQoaGFzaC15KQogb2JqLSQoQ09ORklHX1BQQ19TVERfTU1VXzMyKQkrPSBwcGNfbW11XzMyLm8gaGFzaF9sb3dfMzIubyB0bGJfMzIubwogb2JqLSQoQ09ORklHXzQweCkJCSs9IDR4eF9tbXUubwogb2JqLSQoQ09ORklHXzQ0eCkJCSs9IDQ0eF9tbXUubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCAxMTViMjVmLi4wZWNlNTEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtMzgwLDcgKzM4MCw3IEBACiAJfQogCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAJaWYgKHVzZXJfbW9kZShyZWdzKSkKLQkJZG9fZXhpdChTSUdLSUxMKTsKKwkJZG9fZ3JvdXBfZXhpdChTSUdLSUxMKTsKIAlyZXR1cm4gU0lHS0lMTDsKIAogZG9fc2lnYnVzOgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKaW5kZXggMTIzZGEwMy4uYWZhYjI0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKICAqICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCAgTGludXMgVG9ydmFsZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKaW5kZXggNGEyMGQ4OS4uNmJhOWI0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQlzcGluX3VubG9jaygmbmF0aXZlX3RsYmllX2xvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX2xvY2tfaHB0ZShocHRlX3QgKmhwdGVwKQorc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9sb2NrX2hwdGUoc3RydWN0IGhhc2hfcHRlICpocHRlcCkKIHsKIAl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT52OwogCkBAIC0xMTYsNyArMTE2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZV90ICpocHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoc3RydWN0IGhhc2hfcHRlICpocHRlcCkKIHsKIAl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT52OwogCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgcmZsYWdzLAogCQkJdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIGludCBwc2l6ZSkKIHsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOwogCWludCBpOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKIAogCWhwdGVwLT5yID0gaHB0ZV9yOwogCS8qIEd1YXJhbnRlZSB0aGUgc2Vjb25kIGR3b3JkIGlzIHZpc2libGUgYmVmb3JlIHRoZSB2YWxpZCBiaXQgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJZWllaW8oKTsKIAkvKgogCSAqIE5vdyBzZXQgdGhlIGZpcnN0IGR3b3JkIGluY2x1ZGluZyB0aGUgdmFsaWQgYml0CiAJICogTk9URTogdGhpcyBhbHNvIHVubG9ja3MgdGhlIGhwdGUKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9yZW1vdmUodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwKQogewotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAlpbnQgaTsKIAlpbnQgc2xvdF9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBocHRlX3Y7CkBAIC0yMTcsNyArMjE3LDcgQEAKIHN0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX3VwZGF0ZXBwKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyBuZXdwcCwKIAkJCQkgdW5zaWduZWQgbG9uZyB2YSwgaW50IHBzaXplLCBpbnQgbG9jYWwpCiB7Ci0JaHB0ZV90ICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7CiAJdW5zaWduZWQgbG9uZyBocHRlX3YsIHdhbnRfdjsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjMzLDE1ICsyMzMsMTQgQEAKIAkvKiBFdmVuIGlmIHdlIG1pc3MsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgVExCICovCiAJaWYgKCFIUFRFX1ZfQ09NUEFSRShocHRlX3YsIHdhbnRfdikgfHwgIShocHRlX3YgJiBIUFRFX1ZfVkFMSUQpKSB7CiAJCURCR19MT1coIiAtPiBtaXNzXG4iKTsKLQkJbmF0aXZlX3VubG9ja19ocHRlKGhwdGVwKTsKIAkJcmV0ID0gLTE7CiAJfSBlbHNlIHsKIAkJREJHX0xPVygiIC0+IGhpdFxuIik7CiAJCS8qIFVwZGF0ZSB0aGUgSFBURSAqLwogCQlocHRlcC0+ciA9IChocHRlcC0+ciAmIH4oSFBURV9SX1BQIHwgSFBURV9SX04pKSB8CiAJCQkobmV3cHAgJiAoSFBURV9SX1BQIHwgSFBURV9SX04gfCBIUFRFX1JfQykpOwotCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCX0KKwluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCiAJLyogRW5zdXJlIGl0IGlzIG91dCBvZiB0aGUgdGxiIHRvby4gKi8KIAl0bGJpZSh2YSwgcHNpemUsIGxvY2FsKTsKQEAgLTI1MSw3ICsyNTAsNyBAQAogCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9maW5kKHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSkKIHsKLQlocHRlX3QgKmhwdGVwOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXA7CiAJdW5zaWduZWQgbG9uZyBoYXNoOwogCXVuc2lnbmVkIGxvbmcgaSwgajsKIAlsb25nIHNsb3Q7CkBAIC0yOTQsNyArMjkzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHZzaWQsIHZhOwogCWxvbmcgc2xvdDsKLQlocHRlX3QgKmhwdGVwOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXA7CiAKIAl2c2lkID0gZ2V0X2tlcm5lbF92c2lkKGVhKTsKIAl2YSA9ICh2c2lkIDw8IDI4KSB8IChlYSAmIDB4MGZmZmZmZmYpOwpAQCAtMzE1LDcgKzMxNCw3IEBACiBzdGF0aWMgdm9pZCBuYXRpdmVfaHB0ZV9pbnZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyB2YSwKIAkJCQkgICBpbnQgcHNpemUsIGludCBsb2NhbCkKIHsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzQ1LDcgKzM0NCw3IEBACiAjZGVmaW5lIExQX0JJVFMJCTgKICNkZWZpbmUgTFBfTUFTSyhpKQkoKDB4RkYgPj4gKGkpKSA8PCBMUF9TSElGVCkKIAotc3RhdGljIHZvaWQgaHB0ZV9kZWNvZGUoaHB0ZV90ICpocHRlLCB1bnNpZ25lZCBsb25nIHNsb3QsCitzdGF0aWMgdm9pZCBocHRlX2RlY29kZShzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHVuc2lnbmVkIGxvbmcgc2xvdCwKIAkJCWludCAqcHNpemUsIHVuc2lnbmVkIGxvbmcgKnZhKQogewogCXVuc2lnbmVkIGxvbmcgaHB0ZV9yID0gaHB0ZS0+cjsKQEAgLTQxNSw3ICs0MTQsNyBAQAogc3RhdGljIHZvaWQgbmF0aXZlX2hwdGVfY2xlYXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNsb3QsIHNsb3RzLCBmbGFnczsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXAgPSBodGFiX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBocHRlX3YsIHZhOwogCXVuc2lnbmVkIGxvbmcgcHRlZ19jb3VudDsKIAlpbnQgcHNpemU7CkBAIC00NjIsNyArNDYxLDcgQEAKIHN0YXRpYyB2b2lkIG5hdGl2ZV9mbHVzaF9oYXNoX3JhbmdlKHVuc2lnbmVkIGxvbmcgbnVtYmVyLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyB2YSwgaGFzaCwgaW5kZXgsIGhpZHgsIHNoaWZ0LCBzbG90OwotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggNGYyZjQ1My4uMmNlOTQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfU0RSMTsKIHN0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXTsKIAotaHB0ZV90ICpodGFiX2FkZHJlc3M7CitzdHJ1Y3QgaGFzaF9wdGUgKmh0YWJfYWRkcmVzczsKIHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplX2J5dGVzOwogdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIGludCBtbXVfbGluZWFyX3BzaXplID0gTU1VX1BBR0VfNEs7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jIGIvYXJjaC9wb3dlcnBjL21tL2ltYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzMTgxNS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qCi0gKiBjIDIwMDEgUFBDIDY0IFRlYW0sIElCTSBDb3JwCi0gKiAKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLQotI2luY2x1ZGUgIm1tdV9kZWNsLmgiCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoaW1saXN0X211dGV4KTsKLXN0cnVjdCB2bV9zdHJ1Y3QgKiBpbWxpc3QgPSBOVUxMOwotCi1zdGF0aWMgaW50IGdldF9mcmVlX2ltX2FkZHIodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbV9hZGRyKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcDsKLQotCWFkZHIgPSBpb3JlbWFwX2JvdDsKLQlmb3IgKHAgPSAmaW1saXN0OyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKLQkJaWYgKHNpemUgKyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHRtcC0+YWRkcikKLQkJCWJyZWFrOwotCQlpZiAoKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyID49IGlvcmVtYXBfYm90KQotCQkJYWRkciA9IHRtcC0+c2l6ZSArICh1bnNpZ25lZCBsb25nKSB0bXAtPmFkZHI7Ci0JCWlmIChhZGRyID49IElNQUxMT0NfRU5ELXNpemUpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JKmltX2FkZHIgPSBhZGRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IHZfYWRkciBhbmQgc2l6ZSBpcyBhIHN1YnNldAotICogb2YgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgcGFyZW50Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGltX3JlZ2lvbl9pc19zdWJzZXQodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCXN0cnVjdCB2bV9zdHJ1Y3QgKnBhcmVudCkKLXsKLQlyZXR1cm4gKGludCkgKHZfYWRkciA+PSAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyICYmCi0JICAgICAgICAgICAgICB2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyICsgcGFyZW50LT5zaXplICYmCi0JICAgIAkgICAgICBzaXplIDwgcGFyZW50LT5zaXplKTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgdl9hZGRyIGFuZCBzaXplIGlzIGEgc3VwZXJzZXQKLSAqIG9mIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IGNoaWxkCi0gKi8KLXN0YXRpYyBpbnQgaW1fcmVnaW9uX2lzX3N1cGVyc2V0KHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCXN0cnVjdCB2bV9zdHJ1Y3QgKmNoaWxkKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgcGFyZW50OwotCi0JcGFyZW50LmFkZHIgPSAodm9pZCAqKSB2X2FkZHI7Ci0JcGFyZW50LnNpemUgPSBzaXplOwotCi0JcmV0dXJuIGltX3JlZ2lvbl9pc19zdWJzZXQoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyLCBjaGlsZC0+c2l6ZSwKLQkJCSZwYXJlbnQpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieSB2X2FkZHIgYW5kIHNpemUgb3ZlcmxhcHMKLSAqIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IHZtLiAgT3ZlcmxhcHBpbmcgcmVnaW9ucyBtZWV0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAxKSBUaGUgcmVnaW9ucyBzaGFyZSBzb21lIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UKLSAqIDIpIFRoZSByZWdpb25zIGFyZW4ndCBpZGVudGljYWwKLSAqIDMpIE5laXRoZXIgcmVnaW9uIGlzIGEgc3Vic2V0IG9mIHRoZSBvdGhlcgotICovCi1zdGF0aWMgaW50IGltX3JlZ2lvbl9vdmVybGFwcyh1bnNpZ25lZCBsb25nIHZfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkgICAgIHN0cnVjdCB2bV9zdHJ1Y3QgKnZtKQotewotCWlmIChpbV9yZWdpb25faXNfc3VwZXJzZXQodl9hZGRyLCBzaXplLCB2bSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuICh2X2FkZHIgKyBzaXplID4gKHVuc2lnbmVkIGxvbmcpIHZtLT5hZGRyICsgdm0tPnNpemUgJiYKLQkJdl9hZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHZtLT5hZGRyICsgdm0tPnNpemUpIHx8Ci0JICAgICAgICh2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgdm0tPmFkZHIgJiYKLQkJdl9hZGRyICsgc2l6ZSA+ICh1bnNpZ25lZCBsb25nKSB2bS0+YWRkcik7Ci19Ci0KLS8qIERldGVybWluZSBpbWFsbG9jIHN0YXR1cyBvZiByZWdpb24gZGVzY3JpYmVkIGJ5IHZfYWRkciBhbmQgc2l6ZS4KLSAqIENhbiByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiBJTV9SRUdJT05fVU5VU0VEICAgLSAgRW50aXJlIHJlZ2lvbiBpcyB1bmFsbG9jYXRlZCBpbiBpbWFsbG9jIHNwYWNlLgotICogSU1fUkVHSU9OX1NVQlNFVCAtICAgIFJlZ2lvbiBpcyBhIHN1YnNldCBvZiBhIHJlZ2lvbiB0aGF0IGlzIGFscmVhZHkKLSAqIAkJCSBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqIAkJICAgICAgICAgdm0gd2lsbCBiZSBhc3NpZ25lZCB0byBhIHB0ciB0byB0aGUgcGFyZW50IHJlZ2lvbi4KLSAqIElNX1JFR0lPTl9FWElTVFMgLSAgICBFeGFjdCByZWdpb24gYWxyZWFkeSBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICB2bSB3aWxsIGJlIGFzc2lnbmVkIHRvIGEgcHRyIHRvIHRoZSBleGlzdGluZyBpbWxpc3QKLSAqICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuCi0gKiBJTV9SRUdJT05fT1ZFUkxBUFMgLSAgUmVnaW9uIG92ZXJsYXBzIGFuIGFsbG9jYXRlZCByZWdpb24gaW4gaW1hbGxvYyBzcGFjZS4KLSAqIElNX1JFR0lPTl9TVVBFUlNFVCAtICBSZWdpb24gaXMgYSBzdXBlcnNldCBvZiBhIHJlZ2lvbiB0aGF0IGlzIGFscmVhZHkKLSAqICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqLwotc3RhdGljIGludCBpbV9yZWdpb25fc3RhdHVzKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCSAgICBzdHJ1Y3Qgdm1fc3RydWN0ICoqdm0pCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdG1wOwotCi0JZm9yICh0bXAgPSBpbWxpc3Q7IHRtcDsgdG1wID0gdG1wLT5uZXh0KQotCQlpZiAodl9hZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHRtcC0+YWRkciArIHRtcC0+c2l6ZSkKLQkJCWJyZWFrOwotCi0JKnZtID0gTlVMTDsKLQlpZiAodG1wKSB7Ci0JCWlmIChpbV9yZWdpb25fb3ZlcmxhcHModl9hZGRyLCBzaXplLCB0bXApKQotCQkJcmV0dXJuIElNX1JFR0lPTl9PVkVSTEFQOwotCi0JCSp2bSA9IHRtcDsKLQkJaWYgKGltX3JlZ2lvbl9pc19zdWJzZXQodl9hZGRyLCBzaXplLCB0bXApKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gc3VwZXJzZXQgKi8KLQkJCXJldHVybiBJTV9SRUdJT05fU1VCU0VUOwotCQl9Ci0JCWlmIChpbV9yZWdpb25faXNfc3VwZXJzZXQodl9hZGRyLCBzaXplLCB0bXApKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gZmlyc3Qgc3Vic2V0ICovCi0JCQlyZXR1cm4gSU1fUkVHSU9OX1NVUEVSU0VUOwotCQl9Ci0JCWVsc2UgaWYgKHZfYWRkciA9PSAodW5zaWduZWQgbG9uZykgdG1wLT5hZGRyICYmCi0JCSAJIHNpemUgPT0gdG1wLT5zaXplKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gZXhhY3QgcmVnaW9uICovCi0JCQlyZXR1cm4gSU1fUkVHSU9OX0VYSVNUUzsKLQkJfQotCX0KLQotCXJldHVybiBJTV9SRUdJT05fVU5VU0VEOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqIHNwbGl0X2ltX3JlZ2lvbih1bnNpZ25lZCBsb25nIHZfYWRkciwgCi0JCXVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHZtX3N0cnVjdCAqcGFyZW50KQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtMSA9IE5VTEw7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdm0yID0gTlVMTDsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICpuZXdfdm0gPSBOVUxMOwotCQotCXZtMSA9IGttYWxsb2Moc2l6ZW9mKCp2bTEpLCBHRlBfS0VSTkVMKTsKLQlpZiAodm0xCT09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICh2X2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpIHBhcmVudC0+YWRkcikgewotCSAgICAgICAgLyogVXNlIGV4aXN0aW5nIHBhcmVudCB2bV9zdHJ1Y3QgdG8gcmVwcmVzZW50IGNoaWxkLCBhbGxvY2F0ZQotCQkgKiBuZXcgb25lIGZvciB0aGUgcmVtYWluZGVyIG9mIHBhcmVudCByYW5nZQotCQkgKi8KLQkJdm0xLT5zaXplID0gcGFyZW50LT5zaXplIC0gc2l6ZTsKLQkJdm0xLT5hZGRyID0gKHZvaWQgKikgKHZfYWRkciArIHNpemUpOwotCQl2bTEtPm5leHQgPSBwYXJlbnQtPm5leHQ7Ci0KLQkJcGFyZW50LT5zaXplID0gc2l6ZTsKLQkJcGFyZW50LT5uZXh0ID0gdm0xOwotCQluZXdfdm0gPSBwYXJlbnQ7Ci0JfSBlbHNlIGlmICh2X2FkZHIgKyBzaXplID09ICh1bnNpZ25lZCBsb25nKSBwYXJlbnQtPmFkZHIgKyAKLQkJCXBhcmVudC0+c2l6ZSkgewotCQkvKiBBbGxvY2F0ZSBuZXcgdm1fc3RydWN0IHRvIHJlcHJlc2VudCBjaGlsZCwgdXNlIGV4aXN0aW5nCi0JCSAqIHBhcmVudCBvbmUgZm9yIHJlbWFpbmRlciBvZiBwYXJlbnQgcmFuZ2UKLQkJICovCi0JCXZtMS0+c2l6ZSA9IHNpemU7Ci0JCXZtMS0+YWRkciA9ICh2b2lkICopIHZfYWRkcjsKLQkJdm0xLT5uZXh0ID0gcGFyZW50LT5uZXh0OwotCQluZXdfdm0gPSB2bTE7Ci0KLQkJcGFyZW50LT5zaXplIC09IHNpemU7Ci0JCXBhcmVudC0+bmV4dCA9IHZtMTsKLQl9IGVsc2UgewotCSAgICAgICAgLyogQWxsb2NhdGUgdHdvIG5ldyB2bV9zdHJ1Y3RzIGZvciB0aGUgbmV3IGNoaWxkIGFuZCAKLQkJICogdXBwZXJtb3N0IHJlbWFpbmRlciwgYW5kIHVzZSBleGlzdGluZyBwYXJlbnQgb25lIGZvciB0aGUKLQkJICogbG93ZXIgcmVtYWluZGVyIG9mIHBhcmVudCByYW5nZQotCQkgKi8KLQkJdm0yID0ga21hbGxvYyhzaXplb2YoKnZtMiksIEdGUF9LRVJORUwpOwotCQlpZiAodm0yID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJa2ZyZWUodm0xKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJdm0xLT5zaXplID0gc2l6ZTsKLQkJdm0xLT5hZGRyID0gKHZvaWQgKikgdl9hZGRyOwotCQl2bTEtPm5leHQgPSB2bTI7Ci0JCW5ld192bSA9IHZtMTsKLQotCQl2bTItPnNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIHBhcmVudC0+YWRkciArIHBhcmVudC0+c2l6ZSkgLSAKLQkJCQkodl9hZGRyICsgc2l6ZSk7Ci0JCXZtMi0+YWRkciA9ICh2b2lkICopIHZfYWRkciArIHNpemU7Ci0JCXZtMi0+bmV4dCA9IHBhcmVudC0+bmV4dDsKLQotCQlwYXJlbnQtPnNpemUgPSB2X2FkZHIgLSAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyOwotCQlwYXJlbnQtPm5leHQgPSB2bTE7Ci0JfQotCi0JcmV0dXJuIG5ld192bTsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKiBfX2FkZF9uZXdfaW1fYXJlYSh1bnNpZ25lZCBsb25nIHJlcV9hZGRyLCAKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcCwgKmFyZWE7Ci0JCQotCWZvciAocCA9ICZpbWxpc3Q7ICh0bXAgPSAqcCkgOyBwID0gJnRtcC0+bmV4dCkgewotCQlpZiAocmVxX2FkZHIgKyBzaXplIDw9ICh1bnNpZ25lZCBsb25nKXRtcC0+YWRkcikKLQkJCWJyZWFrOwotCX0KLQkKLQlhcmVhID0ga21hbGxvYyhzaXplb2YoKmFyZWEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCWFyZWEtPmZsYWdzID0gMDsKLQlhcmVhLT5hZGRyID0gKHZvaWQgKilyZXFfYWRkcjsKLQlhcmVhLT5zaXplID0gc2l6ZTsKLQlhcmVhLT5uZXh0ID0gKnA7Ci0JKnAgPSBhcmVhOwotCi0JcmV0dXJuIGFyZWE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0ICogX19pbV9nZXRfYXJlYSh1bnNpZ25lZCBsb25nIHJlcV9hZGRyLCAKLQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCQlpbnQgY3JpdGVyaWEpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdG1wOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBpbV9yZWdpb25fc3RhdHVzKHJlcV9hZGRyLCBzaXplLCAmdG1wKTsKLQlpZiAoKGNyaXRlcmlhICYgc3RhdHVzKSA9PSAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgSU1fUkVHSU9OX1VOVVNFRDoKLQkJdG1wID0gX19hZGRfbmV3X2ltX2FyZWEocmVxX2FkZHIsIHNpemUpOwotCQlicmVhazsKLQljYXNlIElNX1JFR0lPTl9TVUJTRVQ6Ci0JCXRtcCA9IHNwbGl0X2ltX3JlZ2lvbihyZXFfYWRkciwgc2l6ZSwgdG1wKTsKLQkJYnJlYWs7Ci0JY2FzZSBJTV9SRUdJT05fRVhJU1RTOgotCQkvKiBSZXR1cm4gcmVxdWVzdGVkIHJlZ2lvbiAqLwotCQlicmVhazsKLQljYXNlIElNX1JFR0lPTl9TVVBFUlNFVDoKLQkJLyogUmV0dXJuIGZpcnN0IGV4aXN0aW5nIHN1YnNldCBvZiByZXF1ZXN0ZWQgcmVnaW9uICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSB1bmV4cGVjdGVkIGltYWxsb2MgcmVnaW9uIHN0YXR1c1xuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOwotCQl0bXAgPSBOVUxMOwotCX0KLQotCXJldHVybiB0bXA7Ci19Ci0KLXN0cnVjdCB2bV9zdHJ1Y3QgKiBpbV9nZXRfZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQkKLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWlmIChnZXRfZnJlZV9pbV9hZGRyKHNpemUsICZhZGRyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgY2Fubm90IG9idGFpbiBhZGRyIGZvciBzaXplIDB4JWx4XG4iLAotCQkJCV9fRlVOQ1RJT05fXywgc2l6ZSk7Ci0JCWFyZWEgPSBOVUxMOwotCQlnb3RvIG5leHRfaW1fZG9uZTsKLQl9Ci0KLQlhcmVhID0gX19pbV9nZXRfYXJlYShhZGRyLCBzaXplLCBJTV9SRUdJT05fVU5VU0VEKTsKLQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAKLQkJICAgICAgICIlcygpIGNhbm5vdCBvYnRhaW4gYXJlYSBmb3IgYWRkciAweCVseCBzaXplIDB4JWx4XG4iLAotCQkJX19GVU5DVElPTl9fLCBhZGRyLCBzaXplKTsKLQl9Ci1uZXh0X2ltX2RvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCXJldHVybiBhcmVhOwotfQotCi1zdHJ1Y3Qgdm1fc3RydWN0ICogaW1fZ2V0X2FyZWEodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJaW50IGNyaXRlcmlhKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWFyZWEgPSBfX2ltX2dldF9hcmVhKHZfYWRkciwgc2l6ZSwgY3JpdGVyaWEpOwotCW11dGV4X3VubG9jaygmaW1saXN0X211dGV4KTsKLQlyZXR1cm4gYXJlYTsKLX0KLQotdm9pZCBpbV9mcmVlKHZvaWQgKiBhZGRyKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wOwotICAKLQlpZiAoIWFkZHIpCi0JCXJldHVybjsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpIGFkZHIgJiB+UEFHRV9NQVNLKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvICVzIGJhZCBhZGRyZXNzICglcClcbiIsIF9fRlVOQ1RJT05fXywJCQlhZGRyKTsKLQkJcmV0dXJuOwotCX0KLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWZvciAocCA9ICZpbWxpc3QgOyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKLQkJaWYgKHRtcC0+YWRkciA9PSBhZGRyKSB7Ci0JCQkqcCA9IHRtcC0+bmV4dDsKLQkJCXVubWFwX3ZtX2FyZWEodG1wKTsKLQkJCWtmcmVlKHRtcCk7Ci0JCQltdXRleF91bmxvY2soJmltbGlzdF9tdXRleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvICVzIG5vbmV4aXN0ZW50IGFyZWEgKCVwKVxuIiwgX19GVU5DVElPTl9fLAotCQkJYWRkcik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCA1ZmNlNmNjLi5lMWY1ZGVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTUsNyArNSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKiAgUFBDNDR4LzM2LWJpdCBjaGFuZ2VzIGJ5IE1hdHQgUG9ydGVyIChtcG9ydGVyQG12aXN0YS5jb20pCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCmluZGV4IDczMTJhMjYuLjFkNmVkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYwpAQCAtNSw3ICs1LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDAyNjZhOTQuLmYwZTdlZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTUsNyArNSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKiAgUFBDNDR4LzM2LWJpdCBjaGFuZ2VzIGJ5IE1hdHQgUG9ydGVyIChtcG9ydGVyQG12aXN0YS5jb20pCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKQEAgLTEyOSw4ICsxMjgsNiBAQAogCXpvbmUgPSBwZ2RhdGEtPm5vZGVfem9uZXM7CiAKIAlyZXR1cm4gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKaW5kZXggNzkyMDg2Yi4uY2MzMmJhNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKQEAgLTExLDcgKzExLDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmggYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAppbmRleCAyNTU4YzM0Li5jOTRhNjRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAorKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaApAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtNDAsOCArMzksOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9yZW1hcF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGludCBydGFzX2RhdGEsIHJ0YXNfc2l6ZTsKIAotc3RydWN0IF9QVEU7Ci1leHRlcm4gc3RydWN0IF9QVEUgKkhhc2gsICpIYXNoX2VuZDsKK3N0cnVjdCBoYXNoX3B0ZTsKK2V4dGVybiBzdHJ1Y3QgaGFzaF9wdGUgKkhhc2gsICpIYXNoX2VuZDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIEhhc2hfc2l6ZSwgSGFzaF9tYXNrOwogCiBleHRlcm4gdW5zaWduZWQgaW50IG51bV90bGJjYW1fZW50cmllczsKQEAgLTkwLDE2ICs4OSw0IEBACiAJZWxzZQogCQlfdGxiaWUodmEpOwogfQotI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCi0vKiBpbWFsbG9jIHJlZ2lvbiB0eXBlcyAqLwotI2RlZmluZSBJTV9SRUdJT05fVU5VU0VECTB4MQotI2RlZmluZSBJTV9SRUdJT05fU1VCU0VUCTB4MgotI2RlZmluZSBJTV9SRUdJT05fRVhJU1RTCTB4NAotI2RlZmluZSBJTV9SRUdJT05fT1ZFUkxBUAkweDgKLSNkZWZpbmUgSU1fUkVHSU9OX1NVUEVSU0VUCTB4MTAKLQotZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKiBpbV9nZXRfZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqIGltX2dldF9hcmVhKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICAgICAgaW50IHJlZ2lvbl90eXBlKTsKLWV4dGVybiB2b2lkIGltX2ZyZWUodm9pZCAqYWRkcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCmluZGV4IGY2YWUxYTUuLjY0NDg4NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwpAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMzcsNyArMzYsNiBAQAogdW5zaWduZWQgbG9uZyBpb3JlbWFwX2Jhc2U7CiB1bnNpZ25lZCBsb25nIGlvcmVtYXBfYm90OwogRVhQT1JUX1NZTUJPTChpb3JlbWFwX2JvdCk7CS8qIGFrYSBWTUFMTE9DX0VORCAqLwotaW50IGlvX2JhdF9pbmRleDsKIAogI2lmIGRlZmluZWQoQ09ORklHXzZ4eCkgfHwgZGVmaW5lZChDT05GSUdfUE9XRVIzKQogI2RlZmluZSBIQVZFX0JBVFMJMQpAQCAtMzAwLDUxICsyOTgsNiBAQAogCX0KIH0KIAotLyogaXMgeCBhIHBvd2VyIG9mIDQ/ICovCi0jZGVmaW5lIGlzX3Bvd2VyX29mXzQoeCkJaXNfcG93ZXJfb2ZfMih4KSAmJiAoZmZzKHgpICYgMSkKLQotLyoKLSAqIFNldCB1cCBhIG1hcHBpbmcgZm9yIGEgYmxvY2sgb2YgSS9PLgotICogdmlydCwgcGh5cywgc2l6ZSBtdXN0IGFsbCBiZSBwYWdlLWFsaWduZWQuCi0gKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgaW9yZW1hcCBpcyBjYWxsZWQuCi0gKi8KLXZvaWQgX19pbml0IGlvX2Jsb2NrX21hcHBpbmcodW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKQotewotCWludCBpOwotCi0JaWYgKHZpcnQgPiBLRVJORUxCQVNFICYmIHZpcnQgPCBpb3JlbWFwX2JvdCkKLQkJaW9yZW1hcF9ib3QgPSBpb3JlbWFwX2Jhc2UgPSB2aXJ0OwotCi0jaWZkZWYgSEFWRV9CQVRTCi0JLyoKLQkgKiBVc2UgYSBCQVQgZm9yIHRoaXMgaWYgcG9zc2libGUuLi4KLQkgKi8KLQlpZiAoaW9fYmF0X2luZGV4IDwgMiAmJiBpc19wb3dlcl9vZl8yKHNpemUpCi0JICAgICYmICh2aXJ0ICYgKHNpemUgLSAxKSkgPT0gMCAmJiAocGh5cyAmIChzaXplIC0gMSkpID09IDApIHsKLQkJc2V0YmF0KGlvX2JhdF9pbmRleCwgdmlydCwgcGh5cywgc2l6ZSwgZmxhZ3MpOwotCQkrK2lvX2JhdF9pbmRleDsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvKiBIQVZFX0JBVFMgKi8KLQotI2lmZGVmIEhBVkVfVExCQ0FNCi0JLyoKLQkgKiBVc2UgYSBDQU0gZm9yIHRoaXMgaWYgcG9zc2libGUuLi4KLQkgKi8KLQlpZiAodGxiY2FtX2luZGV4IDwgbnVtX3RsYmNhbV9lbnRyaWVzICYmIGlzX3Bvd2VyX29mXzQoc2l6ZSkKLQkgICAgJiYgKHZpcnQgJiAoc2l6ZSAtIDEpKSA9PSAwICYmIChwaHlzICYgKHNpemUgLSAxKSkgPT0gMCkgewotCQlzZXR0bGJjYW0odGxiY2FtX2luZGV4LCB2aXJ0LCBwaHlzLCBzaXplLCBmbGFncywgMCk7Ci0JCSsrdGxiY2FtX2luZGV4OwotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8qIEhBVkVfVExCQ0FNICovCi0KLQkvKiBObyBCQVRzIGF2YWlsYWJsZSwgcHV0IGl0IGluIHRoZSBwYWdlIHRhYmxlcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBQQUdFX1NJWkUpCi0JCW1hcF9wYWdlKHZpcnQgKyBpLCBwaHlzICsgaSwgZmxhZ3MpOwotfQotCiAvKiBTY2FuIHRoZSByZWFsIExpbnV4IHBhZ2UgdGFibGVzIGFuZCByZXR1cm4gYSBQVEUgcG9pbnRlciBmb3IKICAqIGEgdmlydHVhbCBhZGRyZXNzIGluIGEgY29udGV4dC4KICAqIFJldHVybnMgdHJ1ZSAoMSkgaWYgUFRFIHdhcyBmb3VuZCwgemVybyBvdGhlcndpc2UuICBUaGUgcG9pbnRlciB0bwpAQCAtMzc5LDgyICszMzIsNiBAQAogICAgICAgICByZXR1cm4ocmV0dmFsKTsKIH0KIAotLyogRmluZCBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGlzIHZpcnR1YWwgYWRkcmVzcy4gIE5vcm1hbGx5IHVzZWQgYnkKLSAqIEkvTyBmdW5jdGlvbnMsIGJ1dCBhbnlvbmUgY2FuIGNhbGwgaXQuCi0gKi8KLXVuc2lnbmVkIGxvbmcgaW9wYSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyBwYTsKLQotCS8qIEkgZG9uJ3Qga25vdyB3aHkgdGhpcyB3b24ndCB3b3JrIG9uIFBNYWNzIG9yIENIUlAuICBJdAotCSAqIGFwcGVhcnMgdGhlcmUgaXMgc29tZSBidWcsIG9yIHRoZXJlIGlzIHNvbWUgaW1wbGljaXQKLQkgKiBtYXBwaW5nIGRvbmUgbm90IHByb3Blcmx5IHJlcHJlc2VudGVkIGJ5IEJBVHMgb3IgaW4gcGFnZQotCSAqIHRhYmxlcy4uLi4uLi5JIGFtIGFjdGl2ZWx5IHdvcmtpbmcgb24gcmVzb2x2aW5nIHRoaXMsIGJ1dAotCSAqIGNhbid0IGhvbGQgdXAgb3RoZXIgc3R1ZmYuICAtLSBEYW4KLQkgKi8KLQlwdGVfdCAqcHRlOwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCi0JLyogQ2hlY2sgdGhlIEJBVHMgKi8KLQlwYSA9IHZfbWFwcGVkX2J5X2JhdHMoYWRkcik7Ci0JaWYgKHBhKQotCQlyZXR1cm4gcGE7Ci0KLQkvKiBBbGxvdyBtYXBwaW5nIG9mIHVzZXIgYWRkcmVzc2VzICh3aXRoaW4gdGhlIHRocmVhZCkKLQkgKiBmb3IgRE1BIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlpZiAoYWRkciA8IFRBU0tfU0laRSkKLQkJbW0gPSBjdXJyZW50LT5tbTsKLQllbHNlCi0JCW1tID0gJmluaXRfbW07Ci0KLQlwYSA9IDA7Ci0JaWYgKGdldF9wdGVwdHIobW0sIGFkZHIsICZwdGUsIE5VTEwpKSB7Ci0JCXBhID0gKHB0ZV92YWwoKnB0ZSkgJiBQQUdFX01BU0spIHwgKGFkZHIgJiB+UEFHRV9NQVNLKTsKLQkJcHRlX3VubWFwKHB0ZSk7Ci0JfQotCi0JcmV0dXJuKHBhKTsKLX0KLQotLyogVGhpcyBpcyB3aWxsIGZpbmQgdGhlIHZpcnR1YWwgYWRkcmVzcyBmb3IgYSBwaHlzaWNhbCBvbmUuLi4uCi0gKiBTd2lwZWQgZnJvbSBBUFVTLCBjb3VsZCBiZSBkYW5nZXJvdXMgOi0pLgotICogVGhpcyBpcyBvbmx5IGEgcGxhY2Vob2xkZXIgdW50aWwgSSByZWFsbHkgZmluZCBhIHdheSB0byBtYWtlIHRoaXMKLSAqIHdvcmsuICAtLSBEYW4KLSAqLwotdW5zaWduZWQgbG9uZwotbW1fcHRvdiAodW5zaWduZWQgbG9uZyBwYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLSNpZiAwCi0JaWYgKHBhZGRyIDwgMTYqMTAyNCoxMDI0KQotCQlyZXQgPSBaVFdPX1ZBRERSKHBhZGRyKTsKLQllbHNlIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGttYXBfY2h1bmtfY291bnQ7KXsKLQkJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IGttYXBfY2h1bmtzW2krK107Ci0JCQl1bnNpZ25lZCBsb25nIHNpemUgPSBrbWFwX2NodW5rc1tpKytdOwotCQkJdW5zaWduZWQgbG9uZyB2aXJ0ID0ga21hcF9jaHVua3NbaSsrXTsKLQkJCWlmIChwYWRkciA+PSBwaHlzCi0JCQkgICAgJiYgcGFkZHIgPCAocGh5cyArIHNpemUpKXsKLQkJCQlyZXQgPSB2aXJ0ICsgcGFkZHIgLSBwaHlzOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCQotCQlyZXQgPSAodW5zaWduZWQgbG9uZykgX192YShwYWRkcik7Ci0JfQotZXhpdDoKLSNpZmRlZiBERUJVR1BWCi0JcHJpbnRrICgiUFRPViglbHgpPSVseFxuIiwgcGFkZHIsIHJldCk7Ci0jZW5kaWYKLSNlbHNlCi0JcmV0ID0gKHVuc2lnbmVkIGxvbmcpcGFkZHIgKyBLRVJORUxCQVNFOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKIAogc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IHBhZ2UgKnBhZ2UsIHBncHJvdF90IHByb3QpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwppbmRleCBhZDZlMTM1Li4zZGZkMTBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKQEAgLTcsNyArNyw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAc2FtYmEub3JnKQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMzQsNDEgKzMzLDI3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRyLmg+Ci0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9sbWIuaD4KLSNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgotI2luY2x1ZGUgPGFzbS9lZWguaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KLSNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogCiAjaW5jbHVkZSAibW11X2RlY2wuaCIKIAotdW5zaWduZWQgbG9uZyBpb3JlbWFwX2JvdCA9IElNQUxMT0NfQkFTRTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBoYnNfaW9fYm90ID0gUEhCU19JT19CQVNFOwordW5zaWduZWQgbG9uZyBpb3JlbWFwX2JvdCA9IElPUkVNQVBfQkFTRTsKIAogLyoKICAqIG1hcF9pb19wYWdlIGN1cnJlbnRseSBvbmx5IGNhbGxlZCBieSBfX2lvcmVtYXAKQEAgLTEwMiw4ICs4Nyw4IEBACiAJCSAqIGVudHJ5IGluIHRoZSBoYXJkd2FyZSBwYWdlIHRhYmxlLgogCQkgKgogCQkgKi8KLQkJaWYgKGh0YWJfYm9sdF9tYXBwaW5nKGVhLCBlYSArIFBBR0VfU0laRSwgcGEsIGZsYWdzLAotCQkJCSAgICAgIG1tdV9pb19wc2l6ZSkpIHsKKwkJaWYgKGh0YWJfYm9sdF9tYXBwaW5nKGVhLCAodW5zaWduZWQgbG9uZyllYSArIFBBR0VfU0laRSwKKwkJCQkgICAgICBwYSwgZmxhZ3MsIG1tdV9pb19wc2l6ZSkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGRvIGJvbHRlZCBtYXBwaW5nIElPICIKIAkJCSAgICAgICAibWVtb3J5IGF0ICUwMTZseCAhXG4iLCBwYSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExMyw4ICs5OCwxMSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfY29tKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgcGEsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBzaXplLAorLyoqCisgKiBfX2lvcmVtYXBfYXQgLSBMb3cgbGV2ZWwgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBwYWdlIHRhYmxlcworICogICAgICAgICAgICAgICAgZm9yIGFuIElPIG1hcHBpbmcKKyAqLwordm9pZCBfX2lvbWVtICogX19pb3JlbWFwX2F0KHBoeXNfYWRkcl90IHBhLCB2b2lkICplYSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBpOwpAQCAtMTIyLDE3ICsxMTAsMzUgQEAKIAlpZiAoKGZsYWdzICYgX1BBR0VfUFJFU0VOVCkgPT0gMCkKIAkJZmxhZ3MgfD0gcGdwcm90X3ZhbChQQUdFX0tFUk5FTCk7CiAKKwlXQVJOX09OKHBhICYgflBBR0VfTUFTSyk7CisJV0FSTl9PTigoKHVuc2lnbmVkIGxvbmcpZWEpICYgflBBR0VfTUFTSyk7CisJV0FSTl9PTihzaXplICYgflBBR0VfTUFTSyk7CisKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBQQUdFX1NJWkUpCi0JCWlmIChtYXBfaW9fcGFnZShlYStpLCBwYStpLCBmbGFncykpCisJCWlmIChtYXBfaW9fcGFnZSgodW5zaWduZWQgbG9uZyllYStpLCBwYStpLCBmbGFncykpCiAJCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiAodm9pZCBfX2lvbWVtICopIChlYSArIChhZGRyICYgflBBR0VfTUFTSykpOworCXJldHVybiAodm9pZCBfX2lvbWVtICopZWE7Cit9CisKKy8qKgorICogX19pb3VubWFwX2Zyb20gLSBMb3cgbGV2ZWwgZnVuY3Rpb24gdG8gdGVhciBkb3duIHRoZSBwYWdlIHRhYmxlcworICogICAgICAgICAgICAgICAgICBmb3IgYW4gSU8gbWFwcGluZy4gVGhpcyBpcyB1c2VkIGZvciBtYXBwaW5ncyB0aGF0CisgKiAgICAgICAgICAgICAgICAgIGFyZSBtYW5pcHVsYXRlZCBtYW51YWxseSwgbGlrZSBwYXJ0aWFsIHVubWFwcGluZyBvZgorICogICAgICAgICAgICAgICAgICBQQ0kgSU9zIG9yIElTQSBzcGFjZS4KKyAqLwordm9pZCBfX2lvdW5tYXBfYXQodm9pZCAqZWEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlXQVJOX09OKCgodW5zaWduZWQgbG9uZyllYSkgJiB+UEFHRV9NQVNLKTsKKwlXQVJOX09OKHNpemUgJiB+UEFHRV9NQVNLKTsKKworCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZyllYSwgc2l6ZSk7CiB9CiAKIHZvaWQgX19pb21lbSAqIF9faW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQl1bnNpZ25lZCBsb25nIHBhLCBlYTsKKwlwaHlzX2FkZHJfdCBwYWxpZ25lZDsKIAl2b2lkIF9faW9tZW0gKnJldDsKIAogCS8qCkBAIC0xNDQsMjcgKzE1MCwzMCBAQAogCSAqIElNQUxMT0NfRU5ECiAJICogCiAJICovCi0JcGEgPSBhZGRyICYgUEFHRV9NQVNLOwotCXNpemUgPSBQQUdFX0FMSUdOKGFkZHIgKyBzaXplKSAtIHBhOworCXBhbGlnbmVkID0gYWRkciAmIFBBR0VfTUFTSzsKKwlzaXplID0gUEFHRV9BTElHTihhZGRyICsgc2l6ZSkgLSBwYWxpZ25lZDsKIAotCWlmICgoc2l6ZSA9PSAwKSB8fCAocGEgPT0gMCkpCisJaWYgKChzaXplID09IDApIHx8IChwYWxpZ25lZCA9PSAwKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAobWVtX2luaXRfZG9uZSkgewogCQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCQlhcmVhID0gaW1fZ2V0X2ZyZWVfYXJlYShzaXplKTsKKworCQlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQLAorCQkJCSAgICAgaW9yZW1hcF9ib3QsIElPUkVNQVBfRU5EKTsKIAkJaWYgKGFyZWEgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwotCQllYSA9ICh1bnNpZ25lZCBsb25nKShhcmVhLT5hZGRyKTsKLQkJcmV0ID0gX19pb3JlbWFwX2NvbShhZGRyLCBwYSwgZWEsIHNpemUsIGZsYWdzKTsKKwkJcmV0ID0gX19pb3JlbWFwX2F0KHBhbGlnbmVkLCBhcmVhLT5hZGRyLCBzaXplLCBmbGFncyk7CiAJCWlmICghcmV0KQotCQkJaW1fZnJlZShhcmVhLT5hZGRyKTsKKwkJCXZ1bm1hcChhcmVhLT5hZGRyKTsKIAl9IGVsc2UgewotCQllYSA9IGlvcmVtYXBfYm90OwotCQlyZXQgPSBfX2lvcmVtYXBfY29tKGFkZHIsIHBhLCBlYSwgc2l6ZSwgZmxhZ3MpOworCQlyZXQgPSBfX2lvcmVtYXBfYXQocGFsaWduZWQsICh2b2lkICopaW9yZW1hcF9ib3QsIHNpemUsIGZsYWdzKTsKIAkJaWYgKHJldCkKIAkJCWlvcmVtYXBfYm90ICs9IHNpemU7CiAJfQorCisJaWYgKHJldCkKKwkJcmV0ICs9IGFkZHIgJiB+UEFHRV9NQVNLOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4Nyw2MiArMTk2LDkgQEAKIH0KIAogCi0jZGVmaW5lIElTX1BBR0VfQUxJR05FRChfdmFsKSAoKF92YWwpID09ICgoX3ZhbCkgJiBQQUdFX01BU0spKQotCi1pbnQgX19pb3JlbWFwX2V4cGxpY2l0KHBoeXNfYWRkcl90IHBhLCB1bnNpZ25lZCBsb25nIGVhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0Jdm9pZCBfX2lvbWVtICpyZXQ7Ci0JCi0JLyogRm9yIG5vdywgcmVxdWlyZSBwYWdlLWFsaWduZWQgdmFsdWVzIGZvciBwYSwgZWEsIGFuZCBzaXplICovCi0JaWYgKCFJU19QQUdFX0FMSUdORUQocGEpIHx8ICFJU19QQUdFX0FMSUdORUQoZWEpIHx8Ci0JICAgICFJU19QQUdFX0FMSUdORUQoc2l6ZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCSJ1bmFsaWduZWQgdmFsdWUgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlpZiAoIW1lbV9pbml0X2RvbmUpIHsKLQkJLyogVHdvIHRoaW5ncyB0byBjb25zaWRlciBpbiB0aGlzIGNhc2U6Ci0JCSAqIDEpIE5vIHJlY29yZHMgd2lsbCBiZSBrZXB0IChpbWFsbG9jLCBldGMpIHRoYXQgdGhlIHJlZ2lvbgotCQkgKiAgICBoYXMgYmVlbiByZW1hcHBlZAotCQkgKiAyKSBJdCB3b24ndCBiZSBlYXN5IHRvIGlvdW5tYXAoKSB0aGUgcmVnaW9uIGxhdGVyIChiZWNhdXNlCi0JCSAqICAgIG9mIDEpCi0JCSAqLwotCQk7Ci0JfSBlbHNlIHsKLQkJYXJlYSA9IGltX2dldF9hcmVhKGVhLCBzaXplLAotCQkJSU1fUkVHSU9OX1VOVVNFRHxJTV9SRUdJT05fU1VCU0VUfElNX1JFR0lPTl9FWElTVFMpOwotCQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCQkvKiBFeHBlY3RlZCB3aGVuIFBIQi1kbHBhciBpcyBpbiBwbGF5ICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCQlpZiAoZWEgIT0gKHVuc2lnbmVkIGxvbmcpIGFyZWEtPmFkZHIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBhZGRyIHJldHVybiBmcm9tICIKLQkJCSAgICAgICAiaW1fZ2V0X2FyZWFcbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JCi0JcmV0ID0gX19pb3JlbWFwX2NvbShwYSwgcGEsIGVhLCBzaXplLCBmbGFncyk7Ci0JaWYgKHJldCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW9yZW1hcF9leHBsaWNpdCgpIGFsbG9jYXRpb24gZmFpbHVyZSAhXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChyZXQgIT0gKHZvaWQgKikgZWEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJfX2lvcmVtYXBfY29tKCkgcmV0dXJuZWQgdW5leHBlY3RlZCBhZGRyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qICAKICAqIFVubWFwIGFuIElPIHJlZ2lvbiBhbmQgcmVtb3ZlIGl0IGZyb20gaW1hbGxvYydkIGxpc3QuCiAgKiBBY2Nlc3MgdG8gSU8gbWVtb3J5IHNob3VsZCBiZSBzZXJpYWxpemVkIGJ5IGRyaXZlci4KLSAqIFRoaXMgY29kZSBpcyBtb2RlbGVkIGFmdGVyIHZtYWxsb2MgY29kZSAtIHVubWFwX3ZtX2FyZWEoKQotICoKLSAqIFhYWAl3aGF0IGFib3V0IGNhbGxzIGJlZm9yZSBtZW1faW5pdF9kb25lIChpZSBweXRob25fY291bnRlcm1lYXN1cmVzKCkpCiAgKi8KIHZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqdG9rZW4pCiB7CkBAIC0yNTEsOSArMjA3LDE0IEBACiAJaWYgKCFtZW1faW5pdF9kb25lKQogCQlyZXR1cm47CiAJCi0JYWRkciA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSB0b2tlbiAmIFBBR0VfTUFTSyk7Ci0KLQlpbV9mcmVlKGFkZHIpOworCWFkZHIgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcgX19mb3JjZSkKKwkJCSBQQ0lfRklYX0FERFIodG9rZW4pICYgUEFHRV9NQVNLKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpYWRkciA8IGlvcmVtYXBfYm90KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkF0dGVtcHQgdG8gaW91bm1hcCBlYXJseSBib2x0ZWQgbWFwcGluZyIKKwkJICAgICAgICIgYXQgMHglcFxuIiwgYWRkcik7CisJCXJldHVybjsKKwl9CisJdnVubWFwKGFkZHIpOwogfQogCiB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKQEAgLTI2NCw3NyArMjI1LDggQEAKIAkJX19pb3VubWFwKHRva2VuKTsKIH0KIAotc3RhdGljIGludCBpb3VubWFwX3N1YnNldF9yZWdpb25zKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQkvKiBDaGVjayB3aGV0aGVyIHN1YnNldHMgb2YgdGhpcyByZWdpb24gZXhpc3QgKi8KLQlhcmVhID0gaW1fZ2V0X2FyZWEoYWRkciwgc2l6ZSwgSU1fUkVHSU9OX1NVUEVSU0VUKTsKLQlpZiAoYXJlYSA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCXdoaWxlIChhcmVhKSB7Ci0JCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBhcmVhLT5hZGRyKTsKLQkJYXJlYSA9IGltX2dldF9hcmVhKGFkZHIsIHNpemUsCi0JCQkJSU1fUkVHSU9OX1NVUEVSU0VUKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW91bm1hcF9leHBsaWNpdCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IHJjOwotCQotCWFkZHIgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBzdGFydCAmIFBBR0VfTUFTSzsKLQotCS8qIFZlcmlmeSB0aGF0IHRoZSByZWdpb24gZWl0aGVyIGV4aXN0cyBvciBpcyBhIHN1YnNldCBvZiBhbiBleGlzdGluZwotCSAqIHJlZ2lvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc3BsaXQgdGhlIHBhcmVudCByZWdpb24gdG8gY3JlYXRlIAotCSAqIHRoZSBleGFjdCByZWdpb24gCi0JICovCi0JYXJlYSA9IGltX2dldF9hcmVhKGFkZHIsIHNpemUsIAotCQkJICAgIElNX1JFR0lPTl9FWElTVFMgfCBJTV9SRUdJT05fU1VCU0VUKTsKLQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCS8qIERldGVybWluZSB3aGV0aGVyIHN1YnNldCByZWdpb25zIGV4aXN0LiAgSWYgc28sIHVubWFwICovCi0JCXJjID0gaW91bm1hcF9zdWJzZXRfcmVnaW9ucyhhZGRyLCBzaXplKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXMoKSBjYW5ub3QgdW5tYXAgbm9uZXhpc3RlbnQgcmFuZ2UgMHglbHhcbiIsCi0gCQkJCV9fRlVOQ1RJT05fXywgYWRkcik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBhcmVhLT5hZGRyKTsKLQl9Ci0JLyoKLQkgKiBGSVhNRSEgVGhpcyBjYW4ndCBiZSByaWdodDoKLQlpb3VubWFwKGFyZWEtPmFkZHIpOwotCSAqIE1heWJlIGl0IHNob3VsZCBiZSAiaW91bm1hcChhcmVhKTsiCi0JICovCi0JcmV0dXJuIDA7Ci19Ci0KIEVYUE9SVF9TWU1CT0woaW9yZW1hcCk7CiBFWFBPUlRfU1lNQk9MKGlvcmVtYXBfZmxhZ3MpOwogRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwogRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKIEVYUE9SVF9TWU1CT0woX19pb3VubWFwKTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhwaGJfaW9fbG9jayk7Ci0KLXZvaWQgX19pb21lbSAqIHJlc2VydmVfcGhiX2lvc3BhY2UodW5zaWduZWQgbG9uZyBzaXplKQotewotCXZvaWQgX19pb21lbSAqdmlydF9hZGRyOwotCQkKLQlpZiAocGhic19pb19ib3QgPj0gSU1BTExPQ19CQVNFKSAKLQkJcGFuaWMoInJlc2VydmVfcGhiX2lvc3BhY2UoKTogcGhiIGlvIHNwYWNlIG92ZXJmbG93XG4iKTsKLQkJCQotCXNwaW5fbG9jaygmcGhiX2lvX2xvY2spOwotCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgcGhic19pb19ib3Q7Ci0JcGhic19pb19ib3QgKz0gc2l6ZTsKLQlzcGluX3VubG9jaygmcGhiX2lvX2xvY2spOwotCi0JcmV0dXJuIHZpcnRfYWRkcjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcHBjX21tdV8zMi5jCmluZGV4IGVjMTQyMWEuLjVjNDVkNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYwpAQCAtMTEsNyArMTEsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCkBAIC0zNSwxMiArMzQsMTIgQEAKIAogI2luY2x1ZGUgIm1tdV9kZWNsLmgiCiAKLVBURSAqSGFzaCwgKkhhc2hfZW5kOworc3RydWN0IGhhc2hfcHRlICpIYXNoLCAqSGFzaF9lbmQ7CiB1bnNpZ25lZCBsb25nIEhhc2hfc2l6ZSwgSGFzaF9tYXNrOwogdW5zaWduZWQgbG9uZyBfU0RSMTsKIAogdW5pb24gdWJhdCB7CQkJLyogQkFUIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSBsb2FkZWQgKi8KLQlCQVQJYmF0OworCXN0cnVjdCBwcGNfYmF0IGJhdDsKIAl1MzIJd29yZFsyXTsKIH0gQkFUU1s4XVsyXTsJCQkvKiA4IHBhaXJzIG9mIElCQVQsIERCQVQgKi8KIApAQCAtMjQ1LDcgKzI0NCw3IEBACiAJY2FjaGVhYmxlX21lbXplcm8oSGFzaCwgSGFzaF9zaXplKTsKIAlfU0RSMSA9IF9fcGEoSGFzaCkgfCBTRFIxX0xPV19CSVRTOwogCi0JSGFzaF9lbmQgPSAoUFRFICopICgodW5zaWduZWQgbG9uZylIYXNoICsgSGFzaF9zaXplKTsKKwlIYXNoX2VuZCA9IChzdHJ1Y3QgaGFzaF9wdGUgKikgKCh1bnNpZ25lZCBsb25nKUhhc2ggKyBIYXNoX3NpemUpOwogCiAJcHJpbnRrKCJUb3RhbCBtZW1vcnkgPSAlbGRNQjsgdXNpbmcgJWxka0IgZm9yIGhhc2ggdGFibGUgKGF0ICVwKVxuIiwKIAkgICAgICAgdG90YWxfbWVtb3J5ID4+IDIwLCBIYXNoX3NpemUgPj4gMTAsIEhhc2gpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYyBiL2FyY2gvcG93ZXJwYy9tbS9zdGFiLmMKaW5kZXggMTMyYzZiYy4uMjg0OTJiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jCkBAIC01NSw3ICs1NSw3IEBACiAJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IDg7IGVudHJ5KyssIHN0ZSsrKSB7CiAJCQlpZiAoIShzdGUtPmVzaWRfZGF0YSAmIFNURV9FU0lEX1YpKSB7CiAJCQkJc3RlLT52c2lkX2RhdGEgPSB2c2lkX2RhdGE7Ci0JCQkJYXNtIHZvbGF0aWxlKCJlaWVpbyI6OjoibWVtb3J5Iik7CisJCQkJZWllaW8oKTsKIAkJCQlzdGUtPmVzaWRfZGF0YSA9IGVzaWRfZGF0YTsKIAkJCQlyZXR1cm4gKGdsb2JhbF9lbnRyeSB8IGVudHJ5KTsKIAkJCX0KQEAgLTEwMSw3ICsxMDEsNyBAQAogCWFzbSB2b2xhdGlsZSgic3luYyIgOiA6IDogIm1lbW9yeSIpOyAgICAvKiBPcmRlciB1cGRhdGUgKi8KIAogCWNhc3RvdXRfc3RlLT52c2lkX2RhdGEgPSB2c2lkX2RhdGE7Ci0JYXNtIHZvbGF0aWxlKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOyAgIC8qIE9yZGVyIHVwZGF0ZSAqLworCWVpZWlvKCk7CQkJCS8qIE9yZGVyIHVwZGF0ZSAqLwogCWNhc3RvdXRfc3RlLT5lc2lkX2RhdGEgPSBlc2lkX2RhdGE7CiAKIAlhc20gdm9sYXRpbGUoInNsYmllICAlMCIgOiA6ICJyIiAob2xkX2VzaWQgPDwgU0lEX1NISUZUKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMKaW5kZXggNmE2OTQxNy4uMDZjN2U3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYwpAQCAtMTEsNyArMTEsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMKaW5kZXggMmJmYzRkNy4uY2JkMzRmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYwpAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMjM5LDMgKzIzOCw1OSBAQAogCXB0ZV9mcmVlX3N1Ym1pdCgqYmF0Y2hwKTsKIAkqYmF0Y2hwID0gTlVMTDsKIH0KKworLyoqCisgKiBfX2ZsdXNoX2hhc2hfdGFibGVfcmFuZ2UgLSBGbHVzaCBhbGwgSFBURXMgZm9yIGEgZ2l2ZW4gYWRkcmVzcyByYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgaGFzaCB0YWJsZSAoYW5kIHRoZSBUTEIpLiBCdXQga2VlcHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW51eCBQVEVzIGludGFjdC4KKyAqCisgKiBAbW0JCTogbW1fc3RydWN0IG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZSAoZ2VuZXJhbGx5IGluaXRfbW0pCisgKiBAc3RhcnQJOiBzdGFydGluZyBhZGRyZXNzCisgKiBAZW5kICAgICAgICAgOiBlbmRpbmcgYWRkcmVzcyAobm90IGluY2x1ZGVkIGluIHRoZSBmbHVzaCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3RseSB0byBiZSB1c2VkIGJ5IHNvbWUgSU8gaG90cGx1ZyBjb2RlIGluIG9yZGVyCisgKiB0byByZW1vdmUgYWxsIGhhc2ggZW50cmllcyBmcm9tIGEgZ2l2ZW4gYWRkcmVzcyByYW5nZSB1c2VkIHRvIG1hcCBJTworICogc3BhY2Ugb24gYSByZW1vdmVkIFBDSS1QQ0kgYmlkZ2Ugd2l0aG91dCB0ZWFyaW5nIGRvd24gdGhlIGZ1bGwgbWFwcGluZworICogc2luY2UgNjRLIHBhZ2VzIG1heSBvdmVybGFwIHdpdGggb3RoZXIgYnJpZGdlcyB3aGVuIHVzaW5nIDY0SyBwYWdlcworICogd2l0aCA0SyBIVyBwYWdlcyBvbiBJTyBzcGFjZS4KKyAqCisgKiBCZWNhdXNlIG9mIHRoYXQgdXNhZ2UgcGF0dGVybiwgaXQncyBvbmx5IGF2YWlsYWJsZSB3aXRoIENPTkZJR19IT1RQTFVHCisgKiBhbmQgaXMgaW1wbGVtZW50ZWQgZm9yIHNtYWxsIHNpemUgcmF0aGVyIHRoYW4gc3BlZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfSE9UUExVRworCit2b2lkIF9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdGFydCA9IF9BTElHTl9ET1dOKHN0YXJ0LCBQQUdFX1NJWkUpOworCWVuZCA9IF9BTElHTl9VUChlbmQsIFBBR0VfU0laRSk7CisKKwlCVUdfT04oIW1tLT5wZ2QpOworCisJLyogTm90ZTogTm9ybWFsbHksIHdlIHNob3VsZCBvbmx5IGV2ZXIgdXNlIGEgYmF0Y2ggd2l0aGluIGEKKwkgKiBQVEUgbG9ja2VkIHNlY3Rpb24uIFRoaXMgdmlvbGF0ZXMgdGhlIHJ1bGUsIGJ1dCB3aWxsIHdvcmsKKwkgKiBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseSBtb2RpZnkgdGhlIFBURXMsIHdlIGp1c3QgZmx1c2ggdGhlCisJICogaGFzaCB3aGlsZSBsZWF2aW5nIHRoZSBQVEVzIGludGFjdCAoaW5jbHVkaW5nIHRoZWlyIHJlZmVyZW5jZQorCSAqIHRvIGJlaW5nIGhhc2hlZCkuIFRoaXMgaXMgbm90IHRoZSBtb3N0IHBlcmZvcm1hbmNlIG9yaWVudGVkCisJICogd2F5IHRvIGRvIHRoaW5ncyBidXQgaXMgZmluZSBmb3Igb3VyIG5lZWRzIGhlcmUuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOworCWZvciAoOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gUEFHRV9TSVpFKSB7CisJCXB0ZV90ICpwdGVwID0gZmluZF9saW51eF9wdGUobW0tPnBnZCwgc3RhcnQpOworCQl1bnNpZ25lZCBsb25nIHB0ZTsKKworCQlpZiAocHRlcCA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXB0ZSA9IHB0ZV92YWwoKnB0ZXApOworCQlpZiAoIShwdGUgJiBfUEFHRV9IQVNIUFRFKSkKKwkJCWNvbnRpbnVlOworCQlocHRlX25lZWRfZmx1c2gobW0sIHN0YXJ0LCBwdGVwLCBwdGUsIDApOworCX0KKwlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IGZlNTk3YTEuLmE3YzIwNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTEsNSArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQorICogQWRkZWQgbW1jcmFbc2xvdF0gc3VwcG9ydDoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFdpbGwgU2NobWlkdCA8d2lsbHNjaG1AdXMuaWJtLmNvbT4sIElCTQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0xODEsMTEgKzE4MywxNyBAQAogICogT24gR1EgYW5kIG5ld2VyIHRoZSBNTUNSQSBzdG9yZXMgdGhlIEhWIGFuZCBQUiBiaXRzIGF0IHRoZSB0aW1lCiAgKiB0aGUgU0lBUiB3YXMgc2FtcGxlZC4gV2UgdXNlIHRoYXQgdG8gd29yayBvdXQgaWYgdGhlIFNJQVIgd2FzIHNhbXBsZWQgaW4KICAqIHRoZSBoeXBlcnZpc29yLCBvdXIgZXhjZXB0aW9uIHZlY3RvcnMgb3IgUlRBUy4KKyAqIElmIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBpcyBzZXQsIHdlIGNhbiB1c2UgdGhlIE1NQ1JBW3Nsb3RdIGJpdHMKKyAqIHRvIG1vcmUgYWNjdXJhdGVseSBpZGVudGlmeSB0aGUgYWRkcmVzcyBvZiB0aGUgc2FtcGxlZCBpbnN0cnVjdGlvbi4gVGhlCisgKiBtbWNyYVtzbG90XSBiaXRzIHJlcHJlc2VudCB0aGUgc2xvdCBudW1iZXIgb2YgYSBzYW1wbGVkIGluc3RydWN0aW9uCisgKiB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24gZ3JvdXAuICBUaGUgc2xvdCB3aWxsIGNvbnRhaW4gYSB2YWx1ZSBiZXR3ZWVuIDEKKyAqIGFuZCA1IGlmIE1NQ1JBX1NBTVBMRV9FTkFCTEUgaXMgc2V0LCBvdGhlcndpc2UgMC4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgcGMgPSBtZnNwcihTUFJOX1NJQVIpOwogCXVuc2lnbmVkIGxvbmcgbW1jcmE7CisJdW5zaWduZWQgbG9uZyBzbG90OwogCiAJLyogQ2FudCBkbyBtdWNoIGFib3V0IGl0ICovCiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX21tY3JhX3NpaHYpCkBAIC0xOTMsNiArMjAxLDEyIEBACiAKIAltbWNyYSA9IG1mc3ByKFNQUk5fTU1DUkEpOwogCisJaWYgKG1tY3JhICYgTU1DUkFfU0FNUExFX0VOQUJMRSkgeworCQlzbG90ID0gKChtbWNyYSAmIE1NQ1JBX1NMT1QpID4+IE1NQ1JBX1NMT1RfU0hJRlQpOworCQlpZiAoc2xvdCA+IDEpCisJCQlwYyArPSA0ICogKHNsb3QgLSAxKTsKKwl9CisKIAkvKiBXZXJlIHdlIGluIHRoZSBoeXBlcnZpc29yPyAqLwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpICYmCiAJICAgIChtbWNyYSAmIGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW1jcmFfc2lodikpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCmluZGV4IGY1OTFhOWYuLjRiZTZlN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCkBAIC01NCw3ICs1NCw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IChvZmZzZXQgJiAweGZmKSB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQogCSAgICB8ICgoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+Zmlyc3RfYnVzbm8pICYgMHhmZikgPDwgMTYpCi0JICAgIHwgKGhvc2UtPmluZGV4IDw8IDI0KTsKKwkgICAgfCAoaG9zZS0+Z2xvYmFsX251bWJlciA8PCAyNCk7CiAJaW50IHJldCA9IC0xOwogCWludCBydmFsOwogCkBAIC02OSw3ICs2OSw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IChvZmZzZXQgJiAweGZmKSB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQogCSAgICB8ICgoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+Zmlyc3RfYnVzbm8pICYgMHhmZikgPDwgMTYpCi0JICAgIHwgKGhvc2UtPmluZGV4IDw8IDI0KTsKKwkgICAgfCAoaG9zZS0+Z2xvYmFsX251bWJlciA8PCAyNCk7CiAJaW50IHJ2YWw7CiAKIAlydmFsID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oIndyaXRlLXBjaS1jb25maWciKSwgMywgMSwgTlVMTCwKQEAgLTgzLDcgKzgzLDcgQEAKIH07CiAKIAotdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBlZmlrYV9wY2lzZXR1cCh2b2lkKQogewogCWNvbnN0IGludCAqYnVzX3JhbmdlOwogCWludCBsZW47CkBAIC0xMjgsNyArMTI4LDcgQEAKIAlwcmludGsoIiBjb250cm9sbGVkIGJ5ICVzXG4iLCBwY2ljdHJsLT5mdWxsX25hbWUpOwogCXByaW50aygiXG4iKTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG9mX25vZGVfZ2V0KHBjaWN0cmwpKTsKIAlpZiAoIWhvc2UpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBFRklLQV9QTEFURk9STV9OQU1FCiAJCSAgICAgICAiOiBDYW4ndCBhbGxvY2F0ZSBQQ0kgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yICVzXG4iLApAQCAtMTM2LDcgKzEzNiw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBvZl9ub2RlX2dldChwY2ljdHJsKTsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZVswXTsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlWzFdOwogCWhvc2UtPm9wcyA9ICZydGFzX3BjaV9vcHM7CkBAIC0xNDUsNyArMTQ0LDcgQEAKIH0KIAogI2Vsc2UKLXZvaWQgX19pbml0IGVmaWthX3BjaXNldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKIHt9CiAjZW5kaWYKIApAQCAtMjUyLDYgKzI1MSw4IEBACiAJLnByb2dyZXNzCQk9IHJ0YXNfcHJvZ3Jlc3MsCiAJLmdldF9ib290X3RpbWUJCT0gcnRhc19nZXRfYm9vdF90aW1lLAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorI2lmZGVmIENPTkZJR19QQ0kKIAkucGh5c19tZW1fYWNjZXNzX3Byb3QJPSBwY2lfcGh5c19tZW1fYWNjZXNzX3Byb3QsCisjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKaW5kZXggMWNmYzAwZC4uNWM0NmU4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiB9CiAKLXZvaWQgbGl0ZTUyMDBfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3N0YXRpYyB2b2lkIGxpdGU1MjAwX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJc3RydWN0IGRldmljZV9ub2RlKiBucCA9IG9mX2ZpbmRfYWxsX25vZGVzKE5VTEwpOwogCWNvbnN0IGNoYXIgKm1vZGVsID0gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKaW5kZXggMzRkMzRhMi4uNGM2YzgyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKQEAgLTExMiwxOCArMTEyLDE4IEBACiAJdTMyIHZhbHVlOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsCiAJCSgxIDw8IDMxKSB8Ci0JCSgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikgfAorCQkoYnVzLT5udW1iZXIgPDwgMTYpIHwKIAkJKGRldmZuIDw8IDgpIHwKIAkJKG9mZnNldCAmIDB4ZmMpKTsKIAltYigpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX01QQzUyMDBfQlVHRklYKQotCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5idXNfb2Zmc2V0KSB7CisJaWYgKGJ1cy0+bnVtYmVyKSB7CiAJCS8qIHdvcmthcm91bmQgZm9yIHRoZSBidWcgNDM1IG9mIHRoZSBNUEM1MjAwIChMMjVSKTsKIAkJICogRG9uJ3QgZG8gMzIgYml0cyBjb25maWcgYWNjZXNzIGR1cmluZyB0eXBlLTEgY3ljbGVzICovCiAJCXN3aXRjaCAobGVuKSB7CkBAIC0xNjksMTggKzE2OSwxOCBAQAogCXUzMiB2YWx1ZSwgbWFzazsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAogCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyLAogCQkoMSA8PCAzMSkgfAotCQkoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpIHwKKwkJKGJ1cy0+bnVtYmVyIDw8IDE2KSB8CiAJCShkZXZmbiA8PCA4KSB8CiAJCShvZmZzZXQgJiAweGZjKSk7CiAJbWIoKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NUEM1MjAwX0JVR0ZJWCkKLQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+YnVzX29mZnNldCkgeworCWlmIChidXMtPm51bWJlcikgewogCQkvKiB3b3JrYXJvdW5kIGZvciB0aGUgYnVnIDQzNSBvZiB0aGUgTVBDNTIwMCAoTDI1Uik7CiAJCSAqIERvbid0IGRvIDMyIGJpdHMgY29uZmlnIGFjY2VzcyBkdXJpbmcgdHlwZS0xIGN5Y2xlcyAqLwogCQlzd2l0Y2ggKGxlbikgewpAQCAtMzg1LDE3ICszODUsMTMgQEAKIAkgKiB0cmVlIGFyZSBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSA1Mnh4IFBDSSBjb250cm9sbGVyLiAgUmF0aGVyCiAJICogdGhhbiBwYXJzZSB0aGUgdHJlZSBoZXJlLCBsZXQgcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcygpCiAJICogZG8gaXQgZm9yIHVzIGFuZCBleHRyYWN0IHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIGZhY3QgKi8KLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihub2RlKTsKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaG9zZS0+YXJjaF9kYXRhID0gbm9kZTsKLQlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOwotCiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwogCi0JaG9zZS0+YnVzX29mZnNldCA9IDA7CiAJaG9zZS0+b3BzID0gJm1wYzUyeHhfcGNpX29wczsKIAogCXBjaV9yZWdzID0gaW9yZW1hcChyc3JjLnN0YXJ0LCByc3JjLmVuZCAtIHJzcmMuc3RhcnQgKyAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wbS5jCmluZGV4IGZkNDAwNDQuLmVlMmU3NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcG0uYwpAQCAtOSw4ICs5LDggQEAKIAogCiAvKiB0aGVzZSBhcmUgZGVmaW5lZCBpbiBtcGM1Mnh4X3NsZWVwLlMsIGFuZCBvbmx5IHVzZWQgaGVyZSAqLwotZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kZWVwX3NsZWVwKHZvaWQgKnNyYW0sIHZvaWQgKnNkcmFtX3JlZ3MsCi0JCXN0cnVjdCBtcGM1Mnh4X2NkbSAqLCBzdHJ1Y3QgbXBjNTJ4eF9pbnRyICopOworZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kZWVwX3NsZWVwKHZvaWQgX19pb21lbSAqc3JhbSwgdm9pZCBfX2lvbWVtICpzZHJhbV9yZWdzLAorCQlzdHJ1Y3QgbXBjNTJ4eF9jZG0gX19pb21lbSAqLCBzdHJ1Y3QgbXBjNTJ4eF9pbnRyIF9faW9tZW0qKTsKIGV4dGVybiB2b2lkIG1wYzUyeHhfZHNfc3JhbSh2b2lkKTsKIGV4dGVybiBjb25zdCBsb25nIG1wYzUyeHhfZHNfc3JhbV9zaXplOwogZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kc19jYWNoZWQodm9pZCk7CkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfY2RtIF9faW9tZW0gKmNkbTsKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9pbnRyIF9faW9tZW0gKmludHI7CiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfZ3Bpb193a3VwIF9faW9tZW0gKmdwaW93Owotc3RhdGljIHZvaWQgKnNyYW07CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzcmFtOwogc3RhdGljIGludCBzcmFtX3NpemU7CiAKIHN0cnVjdCBtcGM1Mnh4X3N1c3BlbmQgbXBjNTJ4eF9zdXNwZW5kOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJdTMyIGNsa19lbmFibGVzOwogCXUzMiBtc3IsIGhpZDA7CiAJdTMyIGludHJfbWFpbl9tYXNrOwotCXZvaWQgX19pb21lbSAqIGlycV8weDUwMCA9ICh2b2lkICopQ09ORklHX0tFUk5FTF9TVEFSVCArIDB4NTAwOworCXZvaWQgX19pb21lbSAqIGlycV8weDUwMCA9ICh2b2lkIF9faW9tZW0gKilDT05GSUdfS0VSTkVMX1NUQVJUICsgMHg1MDA7CiAJdW5zaWduZWQgbG9uZyBpcnFfMHg1MDBfc3RvcCA9ICh1bnNpZ25lZCBsb25nKWlycV8weDUwMCArIG1wYzUyeHhfZHNfY2FjaGVkX3NpemU7CiAJY2hhciBzYXZlZF8weDUwMFttcGM1Mnh4X2RzX2NhY2hlZF9zaXplXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwppbmRleCBkZTdmY2U5Li44OWZkZTQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIGNob2ljZQotCXByb21wdCAiTWFjaGluZSBUeXBlIgorCXByb21wdCAiODJ4eCBCb2FyZCBUeXBlIgogCWRlcGVuZHMgb24gUFBDXzgyeHgKIAlkZWZhdWx0IE1QQzgyeHhfQURTCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4X2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKaW5kZXggNDdjYjA5Zi4uZGEyMDgzMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CiAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgotI2luY2x1ZGUgPC4uL3N5c2Rldi9jcG0yX3BpYy5oPgorI2luY2x1ZGUgPHN5c2Rldi9jcG0yX3BpYy5oPgogCiAjaW5jbHVkZSAicHEyYWRzLmgiCiAKQEAgLTUwNyw3ICs1MDcsOCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBtODJ4eF9wY2lfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIGludCBtODJ4eF9wY2lfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtNTE1LDcgKzUxNiw3IEBACiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLXZvaWQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4Mnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTU0MiwxOSArNTQzLDEzIEBACiAKIAlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihucCk7CiAKIAlpZiAoIWhvc2UpCiAJCXJldHVybjsKIAotCWhvc2UtPmFyY2hfZGF0YSA9IG5wOwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7Ci0KIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0JaG9zZS0+YnVzX29mZnNldCA9IDA7Ci0KLQlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOwogCiAJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsCiAJCQkgICByLnN0YXJ0ICsgb2Zmc2V0b2YocGNpX2NwbTJfdCwgcGNpX2NmZ19hZGRyKSwKQEAgLTU4NCw3ICs1NzksNyBAQAogI2lmZGVmIENPTkZJR19QQ0kKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbTgyeHhfcGNpX2V4Y2x1ZGVfZGV2aWNlOwogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgyeHhfYWRkX2JyaWRnZShucCk7CiAKIAlvZl9ub2RlX3B1dChucCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKaW5kZXggMTljYWZkZi4uZWMzMDVmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlwcm9tcHQgIjgzeHggQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIFBQQ184M3h4CiAJZGVmYXVsdCBNUEM4MzR4X01EUwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKaW5kZXggMzFhOTFiNS4uNWE5OGY4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBQb3dlclBDIDgzeHggbGludXgga2VybmVsLgogIwotb2JqLXkJCQkJOj0gbWlzYy5vCitvYmoteQkJCQk6PSBtaXNjLm8gdXNiLm8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubwogb2JqLSQoQ09ORklHX01QQzgzMTNfUkRCKQkrPSBtcGM4MzEzX3JkYi5vCiBvYmotJChDT05GSUdfTVBDODMyeF9SREIpCSs9IG1wYzgzMnhfcmRiLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzEzX3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKaW5kZXggOTY5NzBhYy4uM2VkZmUxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKQEAgLTI4LDExICsyOCw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC00OSwxMCArNDQsMTEgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKKwltcGM4MzF4X3VzYl9jZmcoKTsKIH0KIAogdm9pZCBfX2luaXQgbXBjODMxM19yZGJfaW5pdF9JUlEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKaW5kZXggOTQ4NDNlZC4uYjM5Y2I1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKQEAgLTQ5LDExICs0OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiBzdGF0aWMgdTggKmJjc3JfcmVncyA9IE5VTEw7CiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODAsNyArNzUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwppbmRleCAzZGI2OGI3Li5iMmIyOGE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwpAQCAtMzIsMTEgKzMyLDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKQEAgLTUzLDcgKzQ4LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKaW5kZXggNDBhMDE5NC4uNDdiYTU0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKQEAgLTM4LDExICszOCw2IEBACiAKICNpbmNsdWRlICJtcGM4M3h4LmgiCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci0jZW5kaWYKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNTksMTAgKzU0LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCisKKwltcGM4MzR4X3VzYl9jZmcoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNHhfaXR4X2luaXRfSVJRKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCmluZGV4IDEwMzk0YjIuLjRjOWZmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCkBAIC0zOCw2MSArMzgsMTcgQEAKIAogI2luY2x1ZGUgIm1wYzgzeHguaCIKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAjZGVmaW5lIEJDU1I1X0lOVF9VU0IJCTB4MDIKLS8qIE5vdGU6IFRoaXMgaXMgb25seSBmb3IgUEIsIG5vdCBmb3IgUEIrUElCCi0gKiBPbiBQQiBvbmx5IHBvcnQwIGlzIGNvbm5lY3RlZCB1c2luZyBVTFBJICovCi1zdGF0aWMgaW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKQorc3RhdGljIGludCBtcGM4MzR4ZW1kc191c2JfY2ZnKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzY2NyLCBzaWNybDsKLQl2b2lkIF9faW9tZW0gKmltbWFwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJdm9pZCBfX2lvbWVtICpiY3NyX3JlZ3MgPSBOVUxMOwogCXU4IGJjc3I1OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwotCWludCBwb3J0MF9pc19kciA9IDA7CiAKLQlpZiAoKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpKSAhPSBOVUxMKQotCQlwb3J0MF9pc19kciA9IDE7Ci0JaWYgKChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJ1c2IiLCAiZnNsLXVzYjItbXBoIikpICE9IE5VTEwpewotCQlpZiAocG9ydDBfaXNfZHIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiVGhlcmUgaXMgb25seSBvbmUgVVNCIHBvcnQgb24gUEIgYm9hcmQhIFxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSBpZiAoIXBvcnQwX2lzX2RyKQotCQkJLyogTm8gdXNiIHBvcnQgZW5hYmxlZCAqLwotCQkJcmV0dXJuIC0xOwotCX0KLQotCWltbWFwID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSwgMHgxMDAwKTsKLQlpZiAoIWltbWFwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDb25maWd1cmUgY2xvY2sgKi8KLQlzY2NyID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTKTsKLQlpZiAocG9ydDBfaXNfZHIpCi0JCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzExOyAgLyogMTozICovCi0JZWxzZQotCQlzY2NyIHw9IE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMTE7IC8qIDE6MyAqLwotCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHNjY3IpOwotCi0JLyogQ29uZmlndXJlIFBpbiAqLwotCXNpY3JsID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUyk7Ci0JLyogc2V0IHBvcnQwIG9ubHkgKi8KLQlpZiAocG9ydDBfaXNfZHIpCi0JCXNpY3JsIHw9IE1QQzgzWFhfU0lDUkxfVVNCMDsKLQllbHNlCi0JCXNpY3JsICY9IH4oTVBDODNYWF9TSUNSTF9VU0IwKTsKLQlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUywgc2ljcmwpOwotCi0JaW91bm1hcChpbW1hcCk7Ci0KKwltcGM4MzR4X3VzYl9jZmcoKTsKIAkvKiBNYXAgQkNTUiBhcmVhICovCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOwotCWlmIChucCAhPSAwKSB7CisJaWYgKG5wKSB7CiAJCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CkBAIC0xMjksMTIgKzg1LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiAKLQltcGM4MzR4X3VzYl9jZmcoKTsKKwltcGM4MzR4ZW1kc191c2JfY2ZnKCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzR4X21kc19pbml0X0lSUSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwppbmRleCBiY2VlZmY4Li4wZTYxNWZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwpAQCAtNTUsMTEgKzU1LDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04Niw3ICs4MSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaAppbmRleCA5Y2QwM2I1Li41ODllZTU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKQEAgLTMsOSArMywxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAKIC8qIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9PRkZTICAgICAgICAgIDB4QTA4CisjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTUFTSyAgICAgIDB4MDBmMDAwMDAKICNkZWZpbmUgTVBDODNYWF9TQ0NSX1VTQl9NUEhDTV8xMSAgMHgwMGMwMDAwMAogI2RlZmluZSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzAxICAweDAwNDAwMDAwCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMTAgIDB4MDA4MDAwMDAKQEAgLTE1LDIxICsxNyw0MyBAQAogCiAvKiBzeXN0ZW0gaS9vIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgbG93ICovCiAjZGVmaW5lIE1QQzgzWFhfU0lDUkxfT0ZGUyAgICAgICAgIDB4MTE0Ci0jZGVmaW5lIE1QQzgzWFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgTVBDODNYWF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JMX1VTQl9NQVNLICAgICAweDYwMDAwMDAwCisjZGVmaW5lIE1QQzgzNFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTVBDODM0WF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzFYX1NJQ1JMX1VTQl9NQVNLICAgICAweDAwMDAwYzAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkxfVVNCX1VMUEkgICAgIDB4MDAwMDA4MDAKIAogLyogc3lzdGVtIGkvbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGhpZ2ggKi8KICNkZWZpbmUgTVBDODNYWF9TSUNSSF9PRkZTICAgICAgICAgMHgxMTgKLSNkZWZpbmUgTVBDODNYWF9TSUNSSF9VU0JfVVRNSSAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkhfVVNCX01BU0sgICAgIDB4MDAwMDAwZTAKKyNkZWZpbmUgTVBDODMxWF9TSUNSSF9VU0JfVUxQSSAgICAgMHgwMDAwMDBhMAorCisvKiBVU0IgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBGU0xfVVNCMl9DT05UUk9MX09GRlMgICAgICAweDUwMAorI2RlZmluZSBDT05UUk9MX1VUTUlfUEhZX0VOICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIENPTlRST0xfUkVGU0VMXzQ4TUhaICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJICAgMHgwMDAwMDQwMAorI2RlZmluZSBDT05UUk9MX09UR19QT1JUICAgICAgICAgICAweDAwMDAwMDIwCisKKy8qIFVTQiBQT1JUU0MgUmVnaXN0ZXJzICovCisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzFfT0ZGUyAgICAgIDB4MTg0CisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzJfT0ZGUyAgICAgIDB4MTg4CisjZGVmaW5lIFBPUlRTQ1hfUFRXXzE2QklUICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgUE9SVFNDWF9QVFNfVVRNSSAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQT1JUU0NYX1BUU19VTFBJICAgICAgICAgICAweDgwMDAwMDAwCiAKIC8qCiAgKiBEZWNsYXJhdGlvbiBmb3IgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZQogICogbXBjODN4eF8qIGZpbGVzLiBNb3N0bHkgZm9yIHVzZSBieSBtcGM4M3h4X3NldHVwCiAgKi8KIAotZXh0ZXJuIGludCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKLWV4dGVybiBpbnQgbXBjODN4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOworZXh0ZXJuIGludCBtcGM4M3h4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgIHVfY2hhciBidXMsIHVfY2hhciBkZXZmbik7CiBleHRlcm4gdm9pZCBtcGM4M3h4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiBsb25nIG1wYzgzeHhfdGltZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBtcGM4MzR4X3VzYl9jZmcodm9pZCk7CitleHRlcm4gaW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKTsKIAogI2VuZGlmCQkJCS8qIF9fTVBDODNYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwppbmRleCA3NzQ0NTdkLi5jMGUyYjg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCkBAIC0zMywxOSArMzMsMTQgQEAKICNkZWZpbmUgREJHKHguLi4pCiAjZW5kaWYKIAotaW50IG1wYzgzeHhfcGNpMl9idXNubzsKLQotaW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODN4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4M3h4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1pbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitpbnQgX19pbml0IG1wYzgzeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTY2LDExICs2MSwxMCBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CkBAIC04Niw4ICs4MCw2IEBACiAJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NjAwKSB7CiAJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzgwLCBpbW1yICsgMHg4Mzg0KTsKIAkJcHJpbWFyeSA9IDA7Ci0JCWhvc2UtPmJ1c19vZmZzZXQgPSBob3NlLT5maXJzdF9idXNubzsKLQkJbXBjODN4eF9wY2kyX2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODN4eCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZGYwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC91c2IuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIEZyZWVzY2FsZSA4M3h4IFVTQiBTT0Mgc2V0dXAgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBMaSBZYW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODN4eC5oIgorCisKKyNpZmRlZiBDT05GSUdfTVBDODM0eAoraW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2Njciwgc2ljcmwsIHNpY3JoOworCXZvaWQgX19pb21lbSAqaW1tYXA7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJaW50IHBvcnQwX2lzX2RyID0gMCwgcG9ydDFfaXNfZHIgPSAwOworCWNvbnN0IHZvaWQgKnByb3AsICpkcl9tb2RlOworCisJaW1tYXAgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpLCAweDEwMDApOworCWlmICghaW1tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVhZCByZWdpc3RlcnMgKi8KKwkvKiBOb3RlOiBEUiBhbmQgTVBIIG11c3QgdXNlIHRoZSBzYW1lIGNsb2NrIHNldHRpbmcgaW4gU0NDUiAqLworCXNjY3IgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpICYgfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwlzaWNybCA9IGluX2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMpICYgfk1QQzgzNFhfU0lDUkxfVVNCX01BU0s7CisJc2ljcmggPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKSAmIH5NUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAidXNiIiwgImZzbC11c2IyLWRyIik7CisJaWYgKG5wKSB7CisJCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzExOyAgLyogMTozICovCisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInBoeV90eXBlIiwgTlVMTCk7CisJCWlmIChwcm9wICYmICghc3RyY21wKHByb3AsICJ1dG1pIikgfHwKKwkJCQkJIXN0cmNtcChwcm9wLCAidXRtaV93aWRlIikpKSB7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjAgfCBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCQlzaWNyaCB8PSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCQkJcG9ydDFfaXNfZHIgPSAxOworCQl9IGVsc2UgaWYgKHByb3AgJiYgIXN0cmNtcChwcm9wLCAic2VyaWFsIikpIHsKKwkJCWRyX21vZGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkcl9tb2RlIiwgTlVMTCk7CisJCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMCB8IE1QQzgzNFhfU0lDUkxfVVNCMTsKKwkJCQlwb3J0MV9pc19kciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiODM0eCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCX0KKwkJcG9ydDBfaXNfZHIgPSAxOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1tcGgiKTsKKwlpZiAobnApIHsKKwkJc2NjciB8PSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzExOyAvKiAxOjMgKi8KKworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicG9ydDAiLCBOVUxMKTsKKwkJaWYgKHByb3ApIHsKKwkJCWlmIChwb3J0MF9pc19kcikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSI4MzR4IFVTQiBwb3J0MCBjYW4ndCBiZSB1c2VkIGJ5IGJvdGggRFIgYW5kIE1QSCFcbiIpOworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwb3J0MSIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJaWYgKHBvcnQxX2lzX2RyKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIjgzNHggVVNCIHBvcnQxIGNhbid0IGJlIHVzZWQgYnkgYm90aCBEUiBhbmQgTVBIIVxuIik7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCX0KKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKworCS8qIFdyaXRlIGJhY2sgKi8KKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTLCBzY2NyKTsKKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUywgc2ljcmwpOworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTLCBzaWNyaCk7CisKKwlpb3VubWFwKGltbWFwKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTVBDODM0eCAqLworCisjaWZkZWYgQ09ORklHX1BQQ19NUEM4MzF4CitpbnQgbXBjODMxeF91c2JfY2ZnKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdm9pZCBfX2lvbWVtICppbW1hcCwgKnVzYl9yZWdzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCWNvbnN0IHZvaWQgKnByb3A7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0ID0gMDsKKyNpZmRlZiBDT05GSUdfVVNCX09URworCWNvbnN0IHZvaWQgKmRyX21vZGU7CisjZW5kaWYKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHlfdHlwZSIsIE5VTEwpOworCisJLyogTWFwIElNTVIgc3BhY2UgZm9yIHBpbiBhbmQgY2xvY2sgc2V0dGluZ3MgKi8KKwlpbW1hcCA9IGlvcmVtYXAoZ2V0X2ltbXJiYXNlKCksIDB4MTAwMCk7CisJaWYgKCFpbW1hcCkgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIENvbmZpZ3VyZSBjbG9jayAqLworCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpOworCXRlbXAgJj0gfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwl0ZW1wIHw9IE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8xMTsgIC8qIDE6MyAqLworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHRlbXApOworCisJLyogQ29uZmlndXJlIHBpbiBtdXggZm9yIFVMUEkuICBUaGVyZSBpcyBubyBwaW4gbXV4IGZvciBVVE1JICovCisJaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQl0ZW1wID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUyk7CisJCXRlbXAgJj0gfk1QQzgzMVhfU0lDUkxfVVNCX01BU0s7CisJCXRlbXAgfD0gTVBDODMxWF9TSUNSTF9VU0JfVUxQSTsKKwkJb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMsIHRlbXApOworCisJCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKTsKKwkJdGVtcCAmPSB+TVBDODMxWF9TSUNSSF9VU0JfTUFTSzsKKwkJdGVtcCB8PSBNUEM4MzFYX1NJQ1JIX1VTQl9VTFBJOworCQlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkhfT0ZGUywgdGVtcCk7CisJfQorCisJaW91bm1hcChpbW1hcCk7CisKKwkvKiBNYXAgVVNCIFNPQyBzcGFjZSAqLworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCWlmIChyZXQpIHsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm4gcmV0OworCX0KKwl1c2JfcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7CisKKwkvKiBVc2luZyBvbi1jaGlwIFBIWSAqLworCWlmICghc3RyY21wKHByb3AsICJ1dG1pX3dpZGUiKSB8fAorCQkJIXN0cmNtcChwcm9wLCAidXRtaSIpKSB7CisJCS8qIFNldCBVVE1JX1BIWV9FTiwgUkVGU0VMIHRvIDQ4TUhaICovCisJCW91dF9iZTMyKHVzYl9yZWdzICsgRlNMX1VTQjJfQ09OVFJPTF9PRkZTLAorCQkJCUNPTlRST0xfVVRNSV9QSFlfRU4gfCBDT05UUk9MX1JFRlNFTF80OE1IWik7CisJLyogVXNpbmcgZXh0ZXJuYWwgVVBMSSBQSFkgKi8KKwl9IGVsc2UgaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkvKiBTZXQgUEhZX0NMS19TRUwgdG8gVUxQSSAqLworCQl0ZW1wID0gQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJOworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJCS8qIFNldCBPVEdfUE9SVCAqLworCQlkcl9tb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZHJfbW9kZSIsIE5VTEwpOworCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkKKwkJCXRlbXAgfD0gQ09OVFJPTF9PVEdfUE9SVDsKKyNlbmRpZiAvKiBDT05GSUdfVVNCX09URyAqLworCQlvdXRfYmUzMih1c2JfcmVncyArIEZTTF9VU0IyX0NPTlRST0xfT0ZGUywgdGVtcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiODMxeCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaW91bm1hcCh1c2JfcmVncyk7CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19NUEM4MzF4ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYwppbmRleCAzZTYyZmNiLi40ZmUzNzZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9taXNjLmMKQEAgLTEzLDExICsxMyw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKK3N0YXRpYyBfX2JlMzIgX19pb21lbSAqcnN0Y3I7CiAKIGV4dGVybiB2b2lkIGFib3J0KHZvaWQpOwogCitzdGF0aWMgaW50IF9faW5pdCBtcGM4NXh4X3JzdGNyKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJnbG9iYWwtdXRpbGl0aWVzIik7CisJaWYgKChucCAmJiBvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsaGFzLXJzdGNyIiwgTlVMTCkpKSB7CisJCWNvbnN0IHUzMiAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJLyogbWFwIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqIDB4RTAwQjAgaXMgb2Zmc2V0IG9mIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqLworCQkJcnN0Y3IgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpICsgKnByb3AgKyAweEIwLCAweGZmKTsKKwkJCWlmICghcnN0Y3IpCisJCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFcnJvcjogcmVzZXQgY29udHJvbCAiCisJCQkJCQkicmVnaXN0ZXIgbm90IG1hcHBlZCFcbiIpOworCQl9CisJfSBlbHNlCisJCXByaW50ayAoS0VSTl9JTkZPICJyc3RjciBjb21wYXRpYmxlIHJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0IVxuIik7CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwobXBjODV4eF9yc3Rjcik7CisKIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKmNtZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlmIChyc3RjcikKKwkJLyogc2V0IHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJb3V0X2JlMzIocnN0Y3IsIDB4Mik7CS8qIEhSRVNFVF9SRVEgKi8KIAlhYm9ydCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQ0X2RzLmMKaW5kZXggYmVjODRmZi4uNmZiOTBhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jCkBAIC02MSwyNCArNjEsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIEFsbG9jIG1waWMgc3RydWN0dXJlIGFuZCBwZXIgaXN1IGhhcyAxNiBJTlQgZW50cmllcy4gKi8KIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCSAgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKLQkJCSAgMTYsIDY0LCAiIE9QRU5QSUMgICAgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCi0JLyoKLQkgKiA0OCBJbnRlcm5hbCBJbnRlcnJ1cHRzCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0KLQkvKgotCSAqIDE2IEV4dGVybmFsIGludGVycnVwdHMKLQkgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMywgci5zdGFydCArIDB4MTAwMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKaW5kZXggODM0MTVkYi4uNzI4NmZmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCkBAIC0xNSw0ICsxNSw0IEBACiAgKi8KIAogZXh0ZXJuIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKik7Ci1leHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4NXh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwppbmRleCA1ZDI3NjIxLi43MjM1ZjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwpAQCAtMzgsMTMgKzM4LDkgQEAKICNpbmNsdWRlIDxhc20vZnNfcGQuaD4KICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtOTEsMzAgKzg3LDEwIEBACiAKIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCi0JCQk0LCAwLCAiIE9wZW5QSUMgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCW9mX25vZGVfcHV0KG5wKTsKIAotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCByLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHIuc3RhcnQgKyAweDEwMjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgci5zdGFydCArIDB4MTAzMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAzLCByLnN0YXJ0ICsgMHgxMDM4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDQsIHIuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNSwgci5zdGFydCArIDB4MTA0ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA2LCByLnN0YXJ0ICsgMHgxMDUwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDcsIHIuc3RhcnQgKyAweDEwNTgwKTsKLQotCS8qIFVudXNlZCBvbiB0aGlzIHBsYXRmb3JtIChsZWF2ZSByb29tIGZvciA4NTQ4KSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19DUE0yCkBAIC0yNDEsNyArMjE3LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4NXh4X2FkZF9icmlkZ2UobnApOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCmluZGV4IDE0OTBlYjMuLjUwYzhkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC00NywxMSArNDcsNiBAQAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSAibXBjODV4eC5oIgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgY2RzX3BjaV9zbG90ID0gMjsKIHN0YXRpYyB2b2xhdGlsZSB1OCAqY2FkbXVzOwogCkBAIC02MCwxNSArNTUsMTEgQEAKICNkZWZpbmUgQVJDQURJQV9IT1NUX0JSSURHRV9JRFNFTAkxNwogI2RlZmluZSBBUkNBRElBXzJORF9CUklER0VfSURTRUwJMwogCi1leHRlcm4gaW50IG1wYzg1eHhfcGNpMl9idXNubzsKLQotc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3N0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODV4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4NXh4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkvKiBXZSBleHBsaWNpdGx5IGRvIG5vdCBnbyBwYXN0IHRoZSBUdW5kcmEgMzIwIEJyaWRnZSAqLwogCWlmICgoYnVzID09IDEpICYmIChQQ0lfU0xPVChkZXZmbikgPT0gQVJDQURJQV8yTkRfQlJJREdFX0lEU0VMKSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTc4LDUyICs2OSw0NCBAQAogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXVfY2hhcgkJYzsKKwl1X2NoYXIgYzsKKwlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9WSUEpIHsKKwkJc3dpdGNoIChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xOgorCQkJLyoKKwkJCSAqIFUtQm9vdCBkb2VzIG5vdCBzZXQgdGhlIGVuYWJsZSBiaXRzCisJCQkgKiBmb3IgdGhlIElERSBkZXZpY2UuIEZvcmNlIHRoZW0gb24gaGVyZS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQwLCAmYyk7CisJCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgYyk7CiAKLQlpZiAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAotCQkJCQlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgTlVMTCkpKSB7CisJCQkvKgorCQkJICogU2luY2Ugb25seSBwcmltYXJ5IGludGVyZmFjZSB3b3JrcywgZm9yY2UgdGhlCisJCQkgKiBJREUgZnVuY3Rpb24gdG8gc3RhbmRhcmQgcHJpbWFyeSBJREUgaW50ZXJydXB0CisJCQkgKiB3LyA4MjU5IG9mZnNldAorCQkJICovCisJCQlkZXYtPmlycSA9IDE0OworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCQlicmVhazsKIAkJLyoKLQkJICogVS1Cb290IGRvZXMgbm90IHNldCB0aGUgZW5hYmxlIGJpdHMKLQkJICogZm9yIHRoZSBJREUgZGV2aWNlLiBGb3JjZSB0aGVtIG9uIGhlcmUuCisJCSAqIEZvcmNlIGxlZ2FjeSBVU0IgaW50ZXJydXB0IHJvdXRpbmcKIAkJICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJmMpOwotCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQwLCBjKTsKLQotCQkvKgotCQkgKiBTaW5jZSBvbmx5IHByaW1hcnkgaW50ZXJmYWNlIHdvcmtzLCBmb3JjZSB0aGUKLQkJICogSURFIGZ1bmN0aW9uIHRvIHN0YW5kYXJkIHByaW1hcnkgSURFIGludGVycnVwdAotCQkgKiB3LyA4MjU5IG9mZnNldAorCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yOgorCQkvKiBUaGVyZSBhcmUgdHdvIFVTQiBjb250cm9sbGVycy4KKwkJICogSWRlbnRpZnkgdGhlbSBieSBmdW5jdG9uIG51bWJlcgogCQkgKi8KLQkJZGV2LT5pcnEgPSAxNDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JCXBjaV9kZXZfcHV0KGRldik7CisJCQlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikpCisJCQkJZGV2LT5pcnEgPSAxMTsKKwkJCWVsc2UKKwkJCQlkZXYtPmlycSA9IDEwOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KLQotCS8qCi0JICogRm9yY2UgbGVnYWN5IFVTQiBpbnRlcnJ1cHQgcm91dGluZwotCSAqLwotCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCi0JCQkJCVBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBOVUxMKSkpIHsKLQkJZGV2LT5pcnEgPSAxMDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAxMCk7Ci0JCXBjaV9kZXZfcHV0KGRldik7Ci0JfQotCi0JaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKLQkJCQkJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzIsIGRldikpKSB7Ci0JCWRldi0+aXJxID0gMTE7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTEpOwotCQlwY2lfZGV2X3B1dChkZXYpOwotCX0KLQotCS8qIE5vdyBtYXAgYWxsIHRoZSBQQ0kgaXJxcyAqLwotCWRldiA9IE5VTEw7Ci0JZm9yX2VhY2hfcGNpX2RldihkZXYpCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX0k4MjU5CkBAIC0xNjUsMzMgKzE0OCwxMiBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAogCS8qIFJldHVybiB0aGUgbXBpYyBub2RlICovCiAJb2Zfbm9kZV9wdXQobnApOwogCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCi0JLyogVXNlZCBvbmx5IGZvciA4NTQ4IHNvIGZhciwgYnV0IG5vIGhhcm0gaW4KLQkgKiBhbGxvY2F0aW5nIHRoZW0gZm9yIGV2ZXJ5b25lICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDgsIHIuc3RhcnQgKyAweDEwNjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgOSwgci5zdGFydCArIDB4MTA2ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMCwgci5zdGFydCArIDB4MTA3MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMSwgci5zdGFydCArIDB4MTA3ODApOwotCi0JLyogRXh0ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMiwgci5zdGFydCArIDB4MTAwMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMywgci5zdGFydCArIDB4MTAwODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxNCwgci5zdGFydCArIDB4MTAxMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpAQCAtMjU3LDkgKzIxOSw5IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAotCXBwY19tZC5wY2liaW9zX2ZpeHVwID0gbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cDsKKwlwcGNfbWQucGNpX2lycV9maXh1cCA9IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXA7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggZTNkZGRiZi4uMDA0YjgwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTU5LDExICs1OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xMDAsNyArOTUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykgewotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAl9CiAJb2Zfbm9kZV9wdXQobnApOwogI2VuZGlmCkBAIC0xODEsMjkgKzE3NiwxMCBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAlvZl9ub2RlX3B1dChucCk7CiAKLQkvKiBJbnRlcm5hbCBJbnRlcnJ1cHRzICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYwppbmRleCA0OGYxN2UyLi44MTE4NDE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jCkBAIC0zMywxMCArMzMsOCBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCi1pbnQgbXBjODV4eF9wY2kyX2J1c25vID0gMDsKLQogI2lmZGVmIENPTkZJR19QQ0kKLWludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK2ludCBfX2luaXQgbXBjODV4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtNTcsMTEgKzU1LDEwIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKQEAgLTc0LDggKzcxLDYgQEAKIAlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDkwMDApIHsKIAkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIGltbXIgKyAweDkwMDAsIGltbXIgKyAweDkwMDQpOwogCQlwcmltYXJ5ID0gMDsKLQkJaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOwotCQltcGM4NXh4X3BjaTJfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNUEM4NXh4IFBDSSBob3N0IGJyaWRnZSBhdCAweCUwMTZsbHguICIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKaW5kZXggZDFiY2ZmNS4uMGZhZWJmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlwcm9tcHQgIjg2eHggQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIFBQQ184Nnh4CiAJZGVmYXVsdCBNUEM4NjQxX0hQQ04KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmgKaW5kZXggMjgzNDQ2Mi4uMjNmN2VkMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCkBAIC0xNSwxNSArMTUsMTAgQEAKICAqIG1wYzg2eHhfKiBmaWxlcy4gTW9zdGx5IGZvciB1c2UgYnkgbXBjODZ4eF9zZXR1cCgpLgogICovCiAKLWV4dGVybiBpbnQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CitleHRlcm4gaW50IG1wYzg2eHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiAKLWV4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwotCi1leHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkgICAgICAgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOwotZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpZV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJCSAgICAgdm9pZCBfX2lvbWVtICpjZmdfYWRkciwKLQkJCQkJICAgICB2b2lkIF9faW9tZW0gKmNmZ19kYXRhKTsKK2V4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwogCiBleHRlcm4gdm9pZCBfX2luaXQgbXBjODZ4eF9zbXBfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCmluZGV4IDEwNTE3MDIuLjViMDFlYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKQEAgLTQ0LDEzICs0NCw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIHBjaV9kcmFtX29mZnNldCA9IDA7Ci0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIHZvaWQgbXBjODZ4eF84MjU5X2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewpAQCAtODEsMjIgKzc0LDkgQEAKIAkvKiBBbGxvYyBtcGljIHN0cnVjdHVyZSBhbmQgcGVyIGlzdSBoYXMgMTYgSU5UIGVudHJpZXMuICovCiAJbXBpYzEgPSBtcGljX2FsbG9jKG5wLCByZXMuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJMTYsIE5SX0lSUVMgLSA0LAotCQkJIiBNUElDICAgICAiKTsKKwkJCTAsIDI1NiwgIiBNUElDICAgICAiKTsKIAlCVUdfT04obXBpYzEgPT0gTlVMTCk7CiAKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDAsIHJlcy5zdGFydCArIDB4MTAwMDApOwotCi0JLyogNDggSW50ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljMSwgMSwgcmVzLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMxLCAyLCByZXMuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDMsIHJlcy5zdGFydCArIDB4MTA2MDApOwotCi0JLyogMTYgRXh0ZXJuYWwgaW50ZXJydXB0cwotCSAqIE1vdmluZyB0aGVtIGZyb20gWzAgLSAxNV0gdG8gWzY0IC0gNzldCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMxLCA0LCByZXMuc3RhcnQgKyAweDEwMDAwKTsKLQogCW1waWNfaW5pdChtcGljMSk7CiAKICNpZmRlZiBDT05GSUdfUENJCkBAIC0zMTksNiArMjk5LDcgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4MDQsIDB4MDQwNSk7CisJZGV2LT5jbGFzcyAmPSB+MHg1OwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgJnRlbXApOwogCXRlbXAgfD0gMHgxMDAwOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NGEsIHRlbXApOwpAQCAtMzY0LDkgKzM0NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKLQotCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4Nnh4X2V4Y2x1ZGVfZGV2aWNlOworCQltcGM4Nnh4X2FkZF9icmlkZ2UobnApOwogI2VuZGlmCiAKIAlwcmludGsoIk1QQzg2eHggSFBDTiBib2FyZCBmcm9tIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwppbmRleCA4MjM1YzU2Li43M2NkNWIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jCkBAIC0xMjIsNyArMTIyLDYgQEAKIG1wYzg2eHhfc2V0dXBfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHUzMiBwY2llX29mZnNldCwgdTMyIHBjaWVfc2l6ZSkKIHsKIAl1MTYgY21kOwotCXVuc2lnbmVkIGludCB0ZW1wczsKIAogCURCRygiUENJRSBob3N0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0IDB4JTA4eCwgc2l6ZSAweCUwOHguXG4iLAogCQkJcGNpZV9vZmZzZXQsIHBjaWVfc2l6ZSk7CkBAIC0xMzMsMjIgKzEzMiw0OSBAQAogCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSV9DT01NQU5ELCBjbWQpOwogCiAJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgMCwgMCwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOwotCi0JLyogUENJRSBCdXMsIEZpeCB0aGUgTVBDODY0MUQgaG9zdCBicmlkZ2UncyBsb2NhdGlvbiB0byBidXMgMHhGRi4gKi8KLQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCAwLCAwLCBQQ0lfUFJJTUFSWV9CVVMsICZ0ZW1wcyk7Ci0JdGVtcHMgPSAodGVtcHMgJiAweGZmMDAwMDAwKSB8ICgweGZmKSB8ICgweDAgPDwgOCkgfCAoMHhmZSA8PCAxNik7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIDAsIDAsIFBDSV9QUklNQVJZX0JVUywgdGVtcHMpOwogfQogCi1pbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIHJlc19pZHggPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAKLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCS8qCisJICogTWFrZSB0aGUgYnJpZGdlIGJlIHRyYW5zcGFyZW50LgorCSAqLworCWRldi0+dHJhbnNwYXJlbnQgPSAxOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CisJaWYgKCFob3NlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBob3NlIGZvciBidXMgJWRcbiIsCisJCSAgICAgICBkZXYtPmJ1cy0+bnVtYmVyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChob3NlLT5pb19yZXNvdXJjZS5mbGFncykgeworCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNfaWR4KytdOworCQlyZXMtPnN0YXJ0ID0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQ7CisJCXJlcy0+ZW5kID0gaG9zZS0+aW9fcmVzb3VyY2UuZW5kOworCQlyZXMtPmZsYWdzID0gaG9zZS0+aW9fcmVzb3VyY2UuZmxhZ3M7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNfaWR4ICsgaV07CisJCXJlcy0+c3RhcnQgPSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0OworCQlyZXMtPmVuZCA9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZW5kOworCQlyZXMtPmZsYWdzID0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5mbGFnczsKKwl9CiB9CiAKLWludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKKworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCAweDcwMTAsIHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgMHg3MDExLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CisKKyNkZWZpbmUgUENJRV9MVFNTTQkweDQwNAkvKiBQQ0llIExpbmsgVHJhaW5pbmcgYW5kIFN0YXR1cyAqLworI2RlZmluZSBQQ0lFX0xUU1NNX0wwCTB4MTYJLyogTDAgc3RhdGUgKi8KKworaW50IF9faW5pdCBtcGM4Nnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC0xNTYsNiArMTgyLDcgQEAKIAljb25zdCBpbnQgKmJ1c19yYW5nZTsKIAlpbnQgaGFzX2FkZHJlc3MgPSAwOwogCWludCBwcmltYXJ5ID0gMDsKKwl1MTYgdmFsOwogCiAJREJHKCJBZGRpbmcgUENJRSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOwogCkBAIC0xNjgsMTcgKzE5NSwyMyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAotCS8qIGxhc3RfYnVzbm8gPSAweGZlIGNhdXNlIGJ5IE1QQzg2NDEgUENJRSBidWcgKi8KKwlob3NlLT5pbmRpcmVjdF90eXBlID0gUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRyB8CisJCQkJUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVM7CisKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDB4MDsKLQlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZTsKKwlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAotCXNldHVwX2luZGlyZWN0X3BjaWUoaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5zdGFydCArIDB4NCk7CisJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQpOworCisJLyogUHJvYmUgdGhlIGhvc2UgbGluayB0cmFpbmluZyBzdGF0dXMgKi8KKwllYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSUVfTFRTU00sICZ2YWwpOworCWlmICh2YWwgPCBQQ0lFX0xUU1NNX0wwKQorCQlyZXR1cm4gLUVOWElPOwogCiAJLyogU2V0dXAgdGhlIFBDSUUgaG9zdCBjb250cm9sbGVyLiAqLwogCW1wYzg2eHhfc2V0dXBfcGNpZShob3NlLCByc3JjLnN0YXJ0LCByc3JjLmVuZCAtIHJzcmMuc3RhcnQgKyAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYwppbmRleCAwOTAxZGJhLi5mMTY5MzU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcmVnLmg+CkBAIC00OSw2ICs1MCwxMCBAQAogCiAjaW5jbHVkZSAic3lzZGV2L21wYzh4eF9waWMuaCIKIAorI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorc3RydWN0IG1wYzh4eF9wY21jaWFfb3BzIG04eHhfcGNtY2lhX29wczsKKyNlbmRpZgorCiB2b2lkIG04eHhfY2FsaWJyYXRlX2RlY3Iodm9pZCk7CiBleHRlcm4gdm9pZCBtOHh4X3dkdF9oYW5kbGVyX2luc3RhbGwoYmRfdCAqYnApOwogZXh0ZXJuIGludCBjcG1fcGljX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCmluZGV4IGMzNmU0NzUuLjVhODA4ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfdWFydF9wZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KQEAgLTM5LDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBleHRlcm4gdm9pZCBjcG1fcmVzZXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtcGM4eHhfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSopOworZXh0ZXJuIHZvaWQgbXBjOHh4X3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKik7CiBleHRlcm4gdm9pZCBtcGM4eHhfcmVzdGFydChjaGFyICpjbWQpOwogZXh0ZXJuIHZvaWQgbXBjOHh4X2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogZXh0ZXJuIGludCBtcGM4eHhfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pOwpAQCAtNDcsOSArNDgsNzMgQEAKIGV4dGVybiB2b2lkIG04eHhfcGljX2luaXQodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgaW50IG1wYzh4eF9nZXRfaXJxKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSk7Ci1zdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSk7Ci1zdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyogcHRyKTsKK3N0YXRpYyB2b2lkIGluaXRfc21jMV91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKTsKK3N0YXRpYyB2b2lkIGluaXRfc21jMl91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKTsKK3N0YXRpYyB2b2lkIGluaXRfc2NjM19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpwdHIpOworCisjaWZkZWYgQ09ORklHX1BDTUNJQV9NOFhYCitzdGF0aWMgdm9pZCBwY21jaWFfaHdfc2V0dXAoaW50IHNsb3QsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgKmJjc3JfaW87CisKKwliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAoZW5hYmxlKQorCQljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUENDRU4pOworCWVsc2UKKwkJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1BDQ0VOKTsKKworCWlvdW5tYXAoYmNzcl9pbyk7Cit9CisKK3N0YXRpYyBpbnQgcGNtY2lhX3NldF92b2x0YWdlKGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXUzMiByZWcgPSAwOworCXVuc2lnbmVkICpiY3NyX2lvOworCisJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSAxMjA6CisJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAwOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCisJY2xyYml0czMyKGJjc3JfaW8sIDB4MDA2MTAwMDApOworCisJLyogZW5hYmxlIG5ldyBwb3dlcnNldHRpbmdzICovCisJc2V0Yml0czMyKGJjc3JfaW8sIHJlZyk7CisKKwlpb3VubWFwKGJjc3JfaW8pOworCXJldHVybiAwOworfQorI2VuZGlmCiAKIHZvaWQgX19pbml0IG1wYzg4NWFkc19ib2FyZF9zZXR1cCh2b2lkKQogewpAQCAtNjIsNyArMTI3LDcgQEAKICNlbmRpZgogCiAJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAKIAlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSXG4iKTsKQEAgLTc1LDEzICsxNDAsMTMgQEAKIAlvdXRfOCgmKGNwLT5jcF9zbWNbMF0uc21jX3NtY20pLCB0bXB2YWw4KTsKIAljbHJiaXRzMTYoJmNwLT5jcF9zbWNbMF0uc21jX3NtY21yLCBTTUNNUl9SRU4gfCBTTUNNUl9URU4pOwkvKiBicmcxICovCiAjZWxzZQotCXNldGJpdHMzMihiY3NyX2lvLEJDU1IxX1JTMjMyRU5fMSk7CisJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMSk7CiAJb3V0X2JlMTYoJmNwLT5jcF9zbWNbMF0uc21jX3NtY21yLCAwKTsKIAlvdXRfOCgmY3AtPmNwX3NtY1swXS5zbWNfc21jZSwgMCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfQ1BNX1NNQzIKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzIpOworCWNscmJpdHMzMihiY3NyX2lvLCBCQ1NSMV9SUzIzMkVOXzIpOwogCWNscmJpdHMzMigmY3AtPmNwX3NpbW9kZSwgMHhlMDAwMDAwMCA+PiAxKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9zaW1vZGUsIDB4MjAwMDAwMDAgPj4gMSk7CS8qIGJyZzIgKi8KIAl0bXB2YWw4ID0gaW5fOCgmKGNwLT5jcF9zbWNbMV0uc21jX3NtY20pKSB8IChTTUNNX1JYIHwgU01DTV9UWCk7CkBAIC05MCw3ICsxNTUsNyBAQAogCiAJaW5pdF9zbWMyX3VhcnRfaW9wb3J0cygwKTsKICNlbHNlCi0Jc2V0Yml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8yKTsKKwlzZXRiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKIAlvdXRfYmUxNigmY3AtPmNwX3NtY1sxXS5zbWNfc21jbXIsIDApOwogCW91dF84KCZjcC0+Y3Bfc21jWzFdLnNtY19zbWNlLCAwKTsKICNlbmRpZgpAQCAtOTksMjkgKzE2NCwzNCBAQAogCiAjaWZkZWYgQ09ORklHX0ZTX0VORVQKIAkvKiB1c2UgTURDIGZvciBNSUkgKGNvbW1vbikgKi8KLQlpb19wb3J0ID0gKGlvcDh4eF90KilpbW1yX21hcChpbV9pb3BvcnQpOworCWlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKIAlzZXRiaXRzMTYoJmlvX3BvcnQtPmlvcF9wZHBhciwgMHgwMDgwKTsKIAljbHJiaXRzMTYoJmlvX3BvcnQtPmlvcF9wZGRpciwgMHgwMDgwKTsKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1I1LCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTFfRU4pOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTFfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjVfTUlJMV9FTik7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTFfUlNUKTsKICNpZm5kZWYgQ09ORklHX0ZDX0VORVRfSEFTX1NDQwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTJfRU4pOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTJfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjVfTUlJMl9FTik7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTJfUlNUKTsKIAogI2VuZGlmCiAJaW91bm1hcChiY3NyX2lvKTsKIAlpbW1yX3VubWFwKGlvX3BvcnQpOwogCiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorCS8qU2V0IHVwIGJvYXJkIHNwZWNpZmljIGhvb2stdXBzICovCisJbTh4eF9wY21jaWFfb3BzLmh3X2N0cmwgPSBwY21jaWFfaHdfc2V0dXA7CisJbTh4eF9wY21jaWFfb3BzLnZvbHRhZ2Vfc2V0ID0gcGNtY2lhX3NldF92b2x0YWdlOworI2VuZGlmCiB9CiAKLQotc3RhdGljIHZvaWQgaW5pdF9mZWMxX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8qIHB0cikKK3N0YXRpYyB2b2lkIGluaXRfZmVjMV9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpwdHIpCiB7Ci0JY3BtOHh4X3QgKmNwID0gKGNwbTh4eF90ICopaW1tcl9tYXAoaW1fY3BtKTsKLQlpb3A4eHhfdCAqaW9fcG9ydCA9IChpb3A4eHhfdCAqKWltbXJfbWFwKGltX2lvcG9ydCk7CisJY3BtOHh4X3QgKmNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CisJaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKIAogCS8qIGNvbmZpZ3VyZSBGRUMxIHBpbnMgICovCiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGFwYXIsIDB4ZjgzMCk7CkBAIC0xNDMsMTEgKzIxMywxMCBAQAogCWltbXJfdW5tYXAoY3ApOwogfQogCi0KLXN0YXRpYyB2b2lkIGluaXRfZmVjMl9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBwdHIpCitzdGF0aWMgdm9pZCBpbml0X2ZlYzJfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqcHRyKQogewotCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7Ci0JaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKilpbW1yX21hcChpbV9pb3BvcnQpOworCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOworCWlvcDh4eF90ICppb19wb3J0ID0gKGlvcDh4eF90ICopIGltbXJfbWFwKGltX2lvcG9ydCk7CiAKIAkvKiBjb25maWd1cmUgRkVDMiBwaW5zICovCiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIDB4MDAwM2ZmZmMpOwpAQCAtMTc3LDE1ICsyNDYsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfc2NjM19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBmcGkpCitzdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqZnBpKQogewogCXVuc2lnbmVkICpiY3NyX2lvOwogCWlvcDh4eF90ICppb19wb3J0OwogCWNwbTh4eF90ICpjcDsKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1JfQUREUiwgQkNTUl9TSVpFKTsKLQlpb19wb3J0ID0gKGlvcDh4eF90ICopaW1tcl9tYXAoaW1faW9wb3J0KTsKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJaW9fcG9ydCA9IChpb3A4eHhfdCAqKSBpbW1yX21hcChpbV9pb3BvcnQpOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAKIAlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSXG4iKTsKQEAgLTE5NCw5ICsyNjMsOSBAQAogCiAJLyogRW5hYmxlIHRoZSBQSFkuCiAJICovCi0JY2xyYml0czMyKGJjc3JfaW8rNCwgQkNTUjRfRVRIMTBfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbyArIDQsIEJDU1I0X0VUSDEwX1JTVCk7CiAJdWRlbGF5KDEwMDApOwotCXNldGJpdHMzMihiY3NyX2lvKzQsIEJDU1I0X0VUSDEwX1JTVCk7CisJc2V0Yml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSNF9FVEgxMF9SU1QpOwogCS8qIENvbmZpZ3VyZSBwb3J0IEEgcGlucyBmb3IgVHhkIGFuZCBSeGQuCiAJICovCiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGFwYXIsIFBBX0VORVRfUlhEIHwgUEFfRU5FVF9UWEQpOwpAQCAtMjEyLDggKzI4MSw3IEBACiAJICovCiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVwYXIsIFBFX0VORVRfVEVOQSk7Ci0JY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsCi0JCSAgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLIHwgUEVfRU5FVF9URU5BKTsKKwljbHJiaXRzMzIoJmNwLT5jcF9wZWRpciwgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLIHwgUEVfRU5FVF9URU5BKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9wZXNvLCBQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIFBFX0VORVRfVEVOQSk7CiAKQEAgLTIzNyw3ICszMDUsNyBAQAogCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLCBQRV9FTkVUX1RFTkEpOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIFBFX0VORVRfVEVOQSk7CiAKLQlzZXRiaXRzMzIoYmNzcl9pbys0LCBCQ1NSMV9FVEhFTik7CisJc2V0Yml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSMV9FVEhFTik7CiAJaW91bm1hcChiY3NyX2lvKTsKIAlpbW1yX3VubWFwKGlvX3BvcnQpOwogCWltbXJfdW5tYXAoY3ApOwpAQCAtMjU3LDUwICszMjUsNDggQEAKIAl9CiB9CiAKLQotCi1zdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIHB0cikKK3N0YXRpYyB2b2lkIGluaXRfc21jMV91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqcHRyKQogewotICAgICAgICB1bnNpZ25lZCAqYmNzcl9pbzsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKIAljcG04eHhfdCAqY3A7CiAKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXBhciwgMHgwMDAwMDBjMCk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIDB4MDAwMDAwYzApOwogCWNscmJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDAwNDApOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDAwODApOwogCWltbXJfdW5tYXAoY3ApOwogCi0gICAgICAgIGJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0gICAgICAgIGlmIChiY3NyX2lvID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUjFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzEpOwotICAgICAgICBpb3VubWFwKGJjc3JfaW8pOworCWlmIChiY3NyX2lvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKKwkJcmV0dXJuOworCX0KKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8xKTsKKwlpb3VubWFwKGJjc3JfaW8pOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSkKK3N0YXRpYyB2b2lkIGluaXRfc21jMl91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKQogewotICAgICAgICB1bnNpZ25lZCAqYmNzcl9pbzsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKIAljcG04eHhfdCAqY3A7CiAKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXBhciwgMHgwMDAwMGMwMCk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIDB4MDAwMDBjMDApOwogCWNscmJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDA0MDApOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDA4MDApOwogCWltbXJfdW5tYXAoY3ApOwogCi0gICAgICAgIGJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0gICAgICAgIGlmIChiY3NyX2lvID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUjFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzIpOwotICAgICAgICBpb3VubWFwKGJjc3JfaW8pOworCWlmIChiY3NyX2lvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKKwkJcmV0dXJuOworCX0KKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKKwlpb3VubWFwKGJjc3JfaW8pOwogfQogCiB2b2lkIGluaXRfc21jX2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZGF0YSkKQEAgLTM3MywxNSArNDM5LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKLWRlZmluZV9tYWNoaW5lKG1wYzg4NV9hZHMpIHsKLQkubmFtZQkJCT0gIk1QQzg4NSBBRFMiLAotCS5wcm9iZQkJCT0gbXBjODg1YWRzX3Byb2JlLAotCS5zZXR1cF9hcmNoCQk9IG1wYzg4NWFkc19zZXR1cF9hcmNoLAotCS5pbml0X0lSUQkJPSBtOHh4X3BpY19pbml0LAotCS5zaG93X2NwdWluZm8JCT0gbXBjOHh4X3Nob3dfY3B1aW5mbywKLQkuZ2V0X2lycQkJPSBtcGM4eHhfZ2V0X2lycSwKLQkucmVzdGFydAkJPSBtcGM4eHhfcmVzdGFydCwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gbXBjOHh4X2NhbGlicmF0ZV9kZWNyLAotCS5zZXRfcnRjX3RpbWUJCT0gbXBjOHh4X3NldF9ydGNfdGltZSwKLQkuZ2V0X3J0Y190aW1lCQk9IG1wYzh4eF9nZXRfcnRjX3RpbWUsCi19OworZGVmaW5lX21hY2hpbmUobXBjODg1X2FkcykKK3sKKy5uYW1lID0gIk1QQzg4NSBBRFMiLC5wcm9iZSA9IG1wYzg4NWFkc19wcm9iZSwuc2V0dXBfYXJjaCA9CisJICAgIG1wYzg4NWFkc19zZXR1cF9hcmNoLC5pbml0X0lSUSA9CisJICAgIG04eHhfcGljX2luaXQsLnNob3dfY3B1aW5mbyA9IG1wYzh4eF9zaG93X2NwdWluZm8sLmdldF9pcnEgPQorCSAgICBtcGM4eHhfZ2V0X2lycSwucmVzdGFydCA9IG1wYzh4eF9yZXN0YXJ0LC5jYWxpYnJhdGVfZGVjciA9CisJICAgIG1wYzh4eF9jYWxpYnJhdGVfZGVjciwuc2V0X3J0Y190aW1lID0KKwkgICAgbXBjOHh4X3NldF9ydGNfdGltZSwuZ2V0X3J0Y190aW1lID0gbXBjOHh4X2dldF9ydGNfdGltZSx9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDM2MWFjZmEuLjMzNTQ1ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTIsNyArMiw3IEBACiAKIGNob2ljZQogCXByb21wdCAiTWFjaGluZSB0eXBlIgotCWRlcGVuZHMgb24gUFBDNjQgfHwgQ0xBU1NJQzMyCisJZGVwZW5kcyBvbiBQUEM2NCB8fCA2eHgKIAlkZWZhdWx0IFBQQ19NVUxUSVBMQVRGT1JNCiAKIGNvbmZpZyBQUENfTVVMVElQTEFURk9STQpAQCAtMTYsMTUgKzE2LDMwIEBACiAJYm9vbCAiRW1iZWRkZWQgNnh4Lzd4eC83eHh4LWJhc2VkIGJvYXJkIgogCWRlcGVuZHMgb24gUFBDMzIgJiYgKEJST0tFTnx8QlJPS0VOX09OX1NNUCkKIAotY29uZmlnIEFQVVMKLQlib29sICJBbWlnYS1BUFVTIgotCWRlcGVuZHMgb24gUFBDMzIgJiYgQlJPS0VOCitjb25maWcgUFBDXzgyeHgKKwlib29sICJGcmVlc2NhbGUgODJ4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCitjb25maWcgUFBDXzgzeHgKKwlib29sICJGcmVlc2NhbGUgODN4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDgzeHgKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgUFBDXzg2eHgKKwlib29sICJGcmVlc2NhbGUgODZ4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IEFMVElWRUMKIAloZWxwCi0JICBTZWxlY3QgQVBVUyBpZiBjb25maWd1cmluZyBmb3IgYSBQb3dlclVQIEFtaWdhLgotCSAgTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQ6Ci0JICA8aHR0cDovL2xpbnV4LWFwdXMuc291cmNlZm9yZ2UubmV0Lz4uCisJICBUaGUgRnJlZXNjYWxlIEU2MDAgU29DcyBoYXZlIDc0eHggY29yZXMuCiBlbmRjaG9pY2UKIAorY29uZmlnIENMQVNTSUMzMgorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIDZ4eCAmJiBQUENfTVVMVElQTEFURk9STQorCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjVmZGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCkBAIC0wLDAgKzEsMjIxIEBACitjb25maWcgUFBDNjQKKwlib29sICI2NC1iaXQga2VybmVsIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNlbGVjdHMgd2hldGhlciBhIDMyLWJpdCBvciBhIDY0LWJpdCBrZXJuZWwKKwkgIHdpbGwgYmUgYnVpbHQuCisKK21lbnUgIlByb2Nlc3NvciBzdXBwb3J0IgorY2hvaWNlCisJcHJvbXB0ICJQcm9jZXNzb3IgVHlwZSIKKwlkZXBlbmRzIG9uIFBQQzMyCisJZGVmYXVsdCA2eHgKKwloZWxwCisJICBUaGVyZSBhcmUgZml2ZSBmYW1pbGllcyBvZiAzMiBiaXQgUG93ZXJQQyBjaGlwcyBzdXBwb3J0ZWQuCisJICBUaGUgbW9zdCBjb21tb24gb25lcyBhcmUgdGhlIGRlc2t0b3AgYW5kIHNlcnZlciBDUFVzICg2MDEsIDYwMywKKwkgIDYwNCwgNzQwLCA3NTAsIDc0eHgpIENQVXMgZnJvbSBGcmVlc2NhbGUgYW5kIElCTSwgd2l0aCB0aGVpcgorCSAgZW1iZWRkZWQgNTJ4eC84Mnh4LzgzeHgvODZ4eCBjb3VudGVycGFydHMuCisJICBUaGUgb3RoZXIgZW1iZWVkZWQgcGFydHMsIG5hbWVseSA0eHgsIDh4eCwgZTIwMCAoNTV4eCkgYW5kIGU1MDAKKwkgICg4NXh4KSBlYWNoIGZvcm0gYSBmYW1pbHkgb2YgdGhlaXIgb3duIHRoYXQgaXMgbm90IGNvbXBhdGlibGUKKwkgIHdpdGggdGhlIG90aGVycy4KKworCSAgSWYgdW5zdXJlLCBzZWxlY3QgNTJ4eC82eHgvN3h4Lzc0eHgvODJ4eC84M3h4Lzg2eHguCisKK2NvbmZpZyA2eHgKKwlib29sICI1Mnh4LzZ4eC83eHgvNzR4eC84Mnh4LzgzeHgvODZ4eCIKKwlzZWxlY3QgUFBDX0ZQVQorCitjb25maWcgUFBDXzg1eHgKKwlib29sICJGcmVlc2NhbGUgODV4eCIKKwlzZWxlY3QgRTUwMAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDg1eHgKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgUFBDXzh4eAorCWJvb2wgIkZyZWVzY2FsZSA4eHgiCisJc2VsZWN0IEZTTF9TT0MKKwlzZWxlY3QgOHh4CisKK2NvbmZpZyA0MHgKKwlib29sICJBTUNDIDQweCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKKworY29uZmlnIDQ0eAorCWJvb2wgIkFNQ0MgNDR4IgorCXNlbGVjdCBQUENfRENSX05BVElWRQorCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCisKK2NvbmZpZyBFMjAwCisJYm9vbCAiRnJlZXNjYWxlIGUyMDAiCisKK2VuZGNob2ljZQorCitjb25maWcgUE9XRVI0X09OTFkKKwlib29sICJPcHRpbWl6ZSBmb3IgUE9XRVI0IgorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBDYXVzZSB0aGUgY29tcGlsZXIgdG8gb3B0aW1pemUgZm9yIFBPV0VSNC9QT1dFUjUvUFBDOTcwIHByb2Nlc3NvcnMuCisJICBUaGUgcmVzdWx0aW5nIGJpbmFyeSB3aWxsIG5vdCB3b3JrIG9uIFBPV0VSMyBvciBSUzY0IHByb2Nlc3NvcnMKKwkgIHdoZW4gY29tcGlsZWQgd2l0aCBiaW51dGlscyAyLjE1IG9yIGxhdGVyLgorCitjb25maWcgUE9XRVIzCisJYm9vbAorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IHkgaWYgIVBPV0VSNF9PTkxZCisKK2NvbmZpZyBQT1dFUjQKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmX2Jvb2wgeQorCitjb25maWcgNnh4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4eHgKKwlib29sCisKKyMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYworY29uZmlnIDgzeHgKKwlib29sCisKKyMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYworY29uZmlnIDg1eHgKKwlib29sCisKK2NvbmZpZyBFNTAwCisJYm9vbAorCitjb25maWcgUFBDX0ZQVQorCWJvb2wKKwlkZWZhdWx0IHkgaWYgUFBDNjQKKworY29uZmlnIDR4eAorCWJvb2wKKwlkZXBlbmRzIG9uIDQweCB8fCA0NHgKKwlkZWZhdWx0IHkKKworY29uZmlnIEJPT0tFCisJYm9vbAorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwIHx8IDQ0eAorCWRlZmF1bHQgeQorCitjb25maWcgRlNMX0JPT0tFCisJYm9vbAorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyBQVEVfNjRCSVQKKwlib29sCisJZGVwZW5kcyBvbiA0NHggfHwgRTUwMAorCWRlZmF1bHQgeSBpZiA0NHgKKwlkZWZhdWx0IHkgaWYgRTUwMCAmJiBQSFlTXzY0QklUCisKK2NvbmZpZyBQSFlTXzY0QklUCisJYm9vbCAnTGFyZ2UgcGh5c2ljYWwgYWRkcmVzcyBzdXBwb3J0JyBpZiBFNTAwCisJZGVwZW5kcyBvbiA0NHggfHwgRTUwMAorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQKKwlkZWZhdWx0IHkgaWYgNDR4CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgbGFyZ2VyIHRoYW4gMzItYml0IHBoeXNpY2FsCisJICBhZGRyZXNzZXMuICBUaGlzIGZlYXR1cmVzIGlzIG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIGU1MDAgY29yZXMuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTiBoZXJlLgorCitjb25maWcgQUxUSVZFQworCWJvb2wgIkFsdGlWZWMgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIENMQVNTSUMzMiB8fCBQT1dFUjQKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgQWx0aXZlYyBleHRlbnNpb25zIHRvIHRoZQorCSAgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5IHN1cHBvcnRzIHNhdmluZyBhbmQgcmVzdG9yaW5nCisJICBhbHRpdmVjIHJlZ2lzdGVycywgYW5kIHR1cm5pbmcgb24gdGhlICdhbHRpdmVjIGVuYWJsZScgYml0IHNvIHVzZXIKKwkgIHByb2Nlc3NlcyBjYW4gZXhlY3V0ZSBhbHRpdmVjIGluc3RydWN0aW9ucy4KKworCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWxseSBpZiB5b3UgaGF2ZSBhIHByb2Nlc3NvciB0aGF0IHN1cHBvcnRzCisJICBhbHRpdmVjIChHNCwgb3RoZXJ3aXNlIGtub3duIGFzIDc0eHggc2VyaWVzKSwgYnV0IGRvZXMgbm90IGhhdmUKKwkgIGFueSBhZmZlY3Qgb24gYSBub24tYWx0aXZlYyBjcHUgKGl0IGRvZXMsIGhvd2V2ZXIgYWRkIGNvZGUgdG8gdGhlCisJICBrZXJuZWwpLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFNQRQorCWJvb2wgIlNQRSBTdXBwb3J0IgorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIFNpZ25hbCBQcm9jZXNzaW5nCisJICBFeHRlbnNpb25zIChTUEUpIHRvIHRoZSBQb3dlclBDIHByb2Nlc3Nvci4gVGhlIGtlcm5lbCBjdXJyZW50bHkKKwkgIHN1cHBvcnRzIHNhdmluZyBhbmQgcmVzdG9yaW5nIFNQRSByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZQorCSAgJ3NwZSBlbmFibGUnIGJpdCBzbyB1c2VyIHByb2Nlc3NlcyBjYW4gZXhlY3V0ZSBTUEUgaW5zdHJ1Y3Rpb25zLgorCisJICBUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2Nlc3NvciB0aGF0IHN1cHBvcnRzCisJICBTUEUgKGU1MDAsIG90aGVyd2lzZSBrbm93biBhcyA4NXh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlIGFueQorCSAgZWZmZWN0IG9uIGEgbm9uLXNwZSBjcHUgKGl0IGRvZXMsIGhvd2V2ZXIgYWRkIGNvZGUgdG8gdGhlIGtlcm5lbCkuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgorCitjb25maWcgUFBDX1NURF9NTVUKKwlib29sCisJZGVwZW5kcyBvbiA2eHggfHwgUE9XRVIzIHx8IFBPV0VSNCB8fCBQUEM2NAorCWRlZmF1bHQgeQorCitjb25maWcgUFBDX1NURF9NTVVfMzIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBQUENfU1REX01NVSAmJiBQUEMzMgorCitjb25maWcgUFBDX01NX1NMSUNFUworCWJvb2wKKwlkZWZhdWx0IHkgaWYgSFVHRVRMQl9QQUdFCisJZGVmYXVsdCBuCisKK2NvbmZpZyBWSVJUX0NQVV9BQ0NPVU5USU5HCisJYm9vbCAiRGV0ZXJtaW5pc3RpYyB0YXNrIGFuZCBDUFUgdGltZSBhY2NvdW50aW5nIgorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIG1vcmUgYWNjdXJhdGUgdGFzayBhbmQgQ1BVIHRpbWUKKwkgIGFjY291bnRpbmcuICBUaGlzIGlzIGRvbmUgYnkgcmVhZGluZyBhIENQVSBjb3VudGVyIG9uIGVhY2gKKwkgIGtlcm5lbCBlbnRyeSBhbmQgZXhpdCBhbmQgb24gdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBrZXJuZWwKKwkgIGJldHdlZW4gc3lzdGVtLCBzb2Z0aXJxIGFuZCBoYXJkaXJxIHN0YXRlLCBzbyB0aGVyZSBpcyBhCisJICBzbWFsbCBwZXJmb3JtYW5jZSBpbXBhY3QuICBUaGlzIGFsc28gZW5hYmxlcyBhY2NvdW50aW5nIG9mCisJICBzdG9sZW4gdGltZSBvbiBsb2dpY2FsbHktcGFydGl0aW9uZWQgc3lzdGVtcyBydW5uaW5nIG9uCisJICBJQk0gUE9XRVI1LWJhc2VkIG1hY2hpbmVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFNNUAorCWRlcGVuZHMgb24gUFBDX1NURF9NTVUKKwlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUuIElmIHlvdSBoYXZlCisJICBhIHN5c3RlbSB3aXRoIG9ubHkgb25lIENQVSwgc2F5IE4uIElmIHlvdSBoYXZlIGEgc3lzdGVtIHdpdGggbW9yZQorCSAgdGhhbiBvbmUgQ1BVLCBzYXkgWS4gIE5vdGUgdGhhdCB0aGUga2VybmVsIGRvZXMgbm90IGN1cnJlbnRseQorCSAgc3VwcG9ydCBTTVAgbWFjaGluZXMgd2l0aCA2MDMvNjAzZS82MDNldiBvciBQUEM3NTAgKCJHMyIpIHByb2Nlc3NvcnMKKwkgIHNpbmNlIHRoZXkgaGF2ZSBpbmFkZXF1YXRlIGhhcmR3YXJlIHN1cHBvcnQgZm9yIG11bHRpcHJvY2Vzc29yCisJICBvcGVyYXRpb24uCisKKwkgIElmIHlvdSBzYXkgTiBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIHNpbmdsZSBhbmQgbXVsdGlwcm9jZXNzb3IKKwkgIG1hY2hpbmVzLCBidXQgd2lsbCB1c2Ugb25seSBvbmUgQ1BVIG9mIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZS4gSWYKKwkgIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIHNpbmdsZS1wcm9jZXNzb3IgbWFjaGluZXMuCisJICBPbiBhIHNpbmdsZS1wcm9jZXNzb3IgbWFjaGluZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBmYXN0ZXIgaWYgeW91IHNheQorCSAgTiBoZXJlLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCitjb25maWcgTlJfQ1BVUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0xMjgpIgorCXJhbmdlIDIgMTI4CisJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0ICIzMiIgaWYgUFBDNjQKKwlkZWZhdWx0ICI0IgorCitjb25maWcgTk9UX0NPSEVSRU5UX0NBQ0hFCisJYm9vbAorCWRlcGVuZHMgb24gNHh4IHx8IDh4eCB8fCBFMjAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyBDT05GSUdfQ0hFQ0tfQ0FDSEVfQ09IRVJFTkNZCisJYm9vbAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FwdXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYXB1cy9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmRlM2JmLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYXB1cy9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLQotY29uZmlnIEFNSUdBCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFtaWdhIHNlcmllcyBvZiBjb21wdXRlcnMuCi0KLWNvbmZpZyBaT1JSTwotCWJvb2wKLQlkZXBlbmRzIG9uIEFQVVMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFpvcnJvIGJ1cyBpbiB0aGUgQW1pZ2EuIElmIHlvdSBoYXZlCi0JICBleHBhbnNpb24gY2FyZHMgaW4geW91ciBBbWlnYSB0aGF0IGNvbmZvcm0gdG8gdGhlIEFtaWdhCi0JICBBdXRvQ29uZmlnKHRtKSBzcGVjaWZpY2F0aW9uLCBzYXkgWSwgb3RoZXJ3aXNlIE4uIE5vdGUgdGhhdCBldmVuCi0JICBleHBhbnNpb24gY2FyZHMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBab3JybyBzbG90cyBidXQgZml0IGluIGUuZy4KLQkgIHRoZSBDUFUgc2xvdCBtYXkgZmFsbCBpbiB0aGlzIGNhdGVnb3J5LCBzbyB5b3UgaGF2ZSB0byBzYXkgWSB0byBsZXQKLQkgIExpbnV4IHVzZSB0aGVzZS4KLQotY29uZmlnIEFCU1RSQUNUX0NPTlNPTEUKLQlib29sCi0JZGVwZW5kcyBvbiBBUFVTCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBBUFVTX0ZBU1RfRVhDRVBUCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCi1jb25maWcgQU1JR0FfUENNQ0lBCi0JYm9vbCAiQW1pZ2EgMTIwMC82MDAgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBpbiB0aGUga2VybmVsIGZvciBwY21jaWEgb24gQW1pZ2EgMTIwMCBhbmQgQW1pZ2EKLQkgIDYwMC4gSWYgeW91IGludGVuZCB0byB1c2UgcGNtY2lhIGNhcmRzIHNheSBZOyBvdGhlcndpc2Ugc2F5IE4uCi0KLWNvbmZpZyBBTUlHQV9CVUlMVElOX1NFUklBTAotCXRyaXN0YXRlICJBbWlnYSBidWlsdGluIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSB5b3VyIEFtaWdhJ3MgYnVpbHQtaW4gc2VyaWFsIHBvcnQgaW4gTGludXgsCi0JICBhbnN3ZXIgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KLQotY29uZmlnIEdWUElPRVhUCi0JdHJpc3RhdGUgIkdWUCBJTy1FeHRlbmRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSBhIEdWUCBJTy1FeHRlbmRlciBzZXJpYWwgY2FyZCBpbiBMaW51eCwgc2F5IFkuCi0JICBPdGhlcndpc2UsIHNheSBOLgotCi1jb25maWcgR1ZQSU9FWFRfTFAKLQl0cmlzdGF0ZSAiR1ZQIElPLUV4dGVuZGVyIHBhcmFsbGVsIHByaW50ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEdWUElPRVhUCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIGRyaXZpbmcgYSBwcmludGVyIGZyb20gdGhlIHBhcmFsbGVsIHBvcnQgb24geW91cgotCSAgR1ZQIElPLUV4dGVuZGVyIGNhcmQsIE4gb3RoZXJ3aXNlLgotCi1jb25maWcgR1ZQSU9FWFRfUExJUAotCXRyaXN0YXRlICJHVlAgSU8tRXh0ZW5kZXIgUExJUCBzdXBwb3J0IgotCWRlcGVuZHMgb24gR1ZQSU9FWFQKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgZG9pbmcgSVAgb3ZlciB0aGUgcGFyYWxsZWwgcG9ydCBvbiB5b3VyIEdWUAotCSAgSU8tRXh0ZW5kZXIgY2FyZCwgTiBvdGhlcndpc2UuCi0KLWNvbmZpZyBNVUxUSUZBQ0VfSUlJX1RUWQotCXRyaXN0YXRlICJNdWx0aWZhY2UgQ2FyZCBJSUkgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTCi0JaGVscAotCSAgSWYgeW91IHdhbnQgdG8gdXNlIGEgTXVsdGlmYWNlIElJSSBjYXJkJ3Mgc2VyaWFsIHBvcnQgaW4gTGludXgsCi0JICBhbnN3ZXIgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KLQotY29uZmlnIEEyMjMyCi0JdHJpc3RhdGUgIkNvbW1vZG9yZSBBMjIzMiBzZXJpYWwgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBBUFVTCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgdGhlIDIyMzIgNy1wb3J0IHNlcmlhbCBjYXJkIHNoaXBwZWQgd2l0aCB0aGUKLQkgIEFtaWdhIDIwMDAgYW5kIG90aGVyIFpvcnJvLWJ1cyBtYWNoaW5lcywgZGF0aW5nIGZyb20gMTk4OS4gIEF0Ci0JICBhIG1heCBvZiAxOSwyMDAgYnBzLCB0aGUgcG9ydHMgYXJlIHNlcnZlZCBieSBhIDY1NTEgQUNJQSBVQVJUIGNoaXAKLQkgIGVhY2gsIHBsdXMgYSA4NTIwIENJQSwgYW5kIGEgbWFzdGVyIDY1MDIgQ1BVIGFuZCBidWZmZXIgYXMgd2VsbC4gVGhlCi0JICBwb3J0cyB3ZXJlIGNvbm5lY3RlZCB3aXRoIDggcGluIERJTiBjb25uZWN0b3JzIG9uIHRoZSBjYXJkIGJyYWNrZXQsCi0JICBmb3Igd2hpY2ggOCBwaW4gdG8gREIyNSBhZGFwdGVycyB3ZXJlIHN1cHBsaWVkLiBUaGUgY2FyZCBhbHNvIGhhZAotCSAganVtcGVycyBpbnRlcm5hbGx5IHRvIHRvZ2dsZSB2YXJpb3VzIHBpbm5pbmcgY29uZmlndXJhdGlvbnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZTsgYnV0IHRoZW4gImdlbmVyaWNfc2VyaWFsIgotCSAgd2lsbCBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBUaGlzIGhhcyB0byBiZSBsb2FkZWQgYmVmb3JlCi0JICAic2VyX2EyMjMyIi4gSWYgeW91IHdhbnQgdG8gZG8gdGhpcywgYW5zd2VyIE0gaGVyZS4KLQotY29uZmlnIFdISVBQRVRfU0VSSUFMCi0JdHJpc3RhdGUgIkhpc29mdCBXaGlwcGV0IFBDTUNJQSBzZXJpYWwgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFNSUdBX1BDTUNJQQotCWhlbHAKLQkgIEhpU29mdCBoYXMgYSB3ZWIgcGFnZSBhdCA8aHR0cDovL3d3dy5oaXNvZnQuY28udWsvPiwgYnV0IHRoZXJlCi0JICBpcyBubyBsaXN0aW5nIGZvciB0aGUgV2hpcHBldCBpbiB0aGVpciBBbWlnYSBzZWN0aW9uLgotCi1jb25maWcgQVBORQotCXRyaXN0YXRlICJQQ01DSUEgTkUyMDAwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBTUlHQV9QQ01DSUEKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhIFBDTUNJQSBORTIwMDAgY29tcGF0aWJsZSBhZGFwdGVyLCBzYXkgWS4gIE90aGVyd2lzZSwKLQkgIHNheSBOLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcG5lLgotCi1jb25maWcgU0VSSUFMX0NPTlNPTEUKLQlib29sICJTdXBwb3J0IGZvciBzZXJpYWwgcG9ydCBjb25zb2xlIgotCWRlcGVuZHMgb24gQVBVUyAmJiAoQU1JR0FfQlVJTFRJTl9TRVJJQUw9eSB8fCBHVlBJT0VYVD15IHx8IE1VTFRJRkFDRV9JSUlfVFRZPXkpCi0KLWNvbmZpZyBIRUFSVEJFQVQKLQlib29sICJVc2UgcG93ZXIgTEVEIGFzIGEgaGVhcnRiZWF0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIFVzZSB0aGUgcG93ZXItb24gTEVEIG9uIHlvdXIgbWFjaGluZSBhcyBhIGxvYWQgbWV0ZXIuICBUaGUgZXhhY3QKLQkgIGJlaGF2aW9yIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IG5vcm1hbGx5IHRoZSBmbGFzaCBmcmVxdWVuY3kgaXMKLQkgIGEgaHlwZXJib2xpYyBmdW5jdGlvbiBvZiB0aGUgNS1taW51dGUgbG9hZCBhdmVyYWdlLgotCi1jb25maWcgUFJPQ19IQVJEV0FSRQotCWJvb2wgIi9wcm9jL2hhcmR3YXJlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTCi0KLXNvdXJjZSAiZHJpdmVycy96b3Jyby9LY29uZmlnIgotCi1jb25maWcgUENJX1BFUk1FRElBCi0JYm9vbCAiUENJIGZvciBQZXJtZWRpYTIiCi0JZGVwZW5kcyBvbiAhNHh4ICYmICE4eHggJiYgQVBVUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwppbmRleCA3ZmI5MmYyLi45ZDdjMmVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpUENJX0ZJWF9BRERSKGFkZHIpOwogCiAJCS8qIENoZWNrIGlmIGl0J3MgaW4gYWxsb3dlZCByYW5nZSBmb3IgIFBJTyAqLwotCQlpZiAodmFkZHIgPCBQSEJTX0lPX0JBU0UgfHwgdmFkZHIgPj0gSU1BTExPQ19CQVNFKQorCQlpZiAodmFkZHIgPCBQSEJfSU9fQkFTRSB8fCB2YWRkciA+IFBIQl9JT19FTkQpCiAJCQlyZXR1cm47CiAKIAkJLyogVHJ5IHRvIGZpbmQgYSBQVEUuIElmIG5vdCwgY2xlYXIgdGhlIHBhZGRyLCB3ZSdsbCBkbwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwppbmRleCBhN2Y1YTc2Li45NmE4ZjYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbnV4X2xvZ28uaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgogI2luY2x1ZGUgPGFzbS94bW9uLmg+CkBAIC0xODMsNyArMTg0LDcgQEAKIAkJc3B1LT5zbGJfcmVwbGFjZSA9IDA7CiAKIAlzcHVfcmVzdGFydF9kbWEoc3B1KTsKLQorCXNwdS0+c3RhdHMuc2xiX2ZsdCsrOwogCXJldHVybiAwOwogfQogCkBAIC0zMzIsNiArMzMzLDcgQEAKIAlpZiAoc3RhdCAmIDB4MTApIC8qIFNQVSBtYWlsYm94IHRocmVzaG9sZCAqLwogCQlzcHUtPndib3hfY2FsbGJhY2soc3B1KTsKIAorCXNwdS0+c3RhdHMuY2xhc3MyX2ludHIrKzsKIAlyZXR1cm4gc3RhdCA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CiB9CiAKQEAgLTQ2Miw4ICs0NjQsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdV9mcmVlKTsKIAorc3RhdGljIGludCBzcHVfc2h1dGRvd24oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOworCisJc3B1X2ZyZWVfaXJxcyhzcHUpOworCXNwdV9kZXN0cm95X3NwdShzcHUpOworCXJldHVybiAwOworfQorCiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNwdV9zeXNkZXZfY2xhc3MgPSB7Ci0Jc2V0X2tzZXRfbmFtZSgic3B1IikKKwlzZXRfa3NldF9uYW1lKCJzcHUiKSwKKwkuc2h1dGRvd24gPSBzcHVfc2h1dGRvd24sCiB9OwogCiBpbnQgc3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cikKQEAgLTU3NCw2ICs1ODYsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwdV9saXN0X2xvY2ssIGZsYWdzKTsKIAltdXRleF91bmxvY2soJnNwdV9tdXRleCk7CiAKKwlzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlID0gU1BVX1VUSUxfSURMRTsKKwlzcHUtPnN0YXRzLnRzdGFtcCA9IGppZmZpZXM7CisKIAlnb3RvIG91dDsKIAogb3V0X2ZyZWVfaXJxczoKQEAgLTU4Niw2ICs2MDEsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqc3B1X3N0YXRlX25hbWVzW10gPSB7CisJInVzZXIiLCAic3lzdGVtIiwgImlvd2FpdCIsICJpZGxlIgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVfYWNjdF90aW1lKHN0cnVjdCBzcHUgKnNwdSwKKwkJZW51bSBzcHVfdXRpbGl6YXRpb25fc3RhdGUgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWUgPSBzcHUtPnN0YXRzLnRpbWVzW3N0YXRlXTsKKworCWlmIChzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlID09IHN0YXRlKQorCQl0aW1lICs9IGppZmZpZXMgLSBzcHUtPnN0YXRzLnRzdGFtcDsKKworCXJldHVybiBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHNwdV9zdGF0X3Nob3coc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGNvbnRhaW5lcl9vZihzeXNkZXYsIHN0cnVjdCBzcHUsIHN5c2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlbGx1ICVsbHUgJWxsdSAlbGx1ICIKKwkJICAgICAgIiVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJc3B1X3N0YXRlX25hbWVzW3NwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGVdLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfVVNFUiksCisJCXNwdV9hY2N0X3RpbWUoc3B1LCBTUFVfVVRJTF9TWVNURU0pLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfSU9XQUlUKSwKKwkJc3B1X2FjY3RfdGltZShzcHUsIFNQVV9VVElMX0lETEUpLAorCQlzcHUtPnN0YXRzLnZvbF9jdHhfc3dpdGNoLAorCQlzcHUtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2gsCisJCXNwdS0+c3RhdHMuc2xiX2ZsdCwKKwkJc3B1LT5zdGF0cy5oYXNoX2ZsdCwKKwkJc3B1LT5zdGF0cy5taW5fZmx0LAorCQlzcHUtPnN0YXRzLm1hal9mbHQsCisJCXNwdS0+c3RhdHMuY2xhc3MyX2ludHIsCisJCXNwdS0+c3RhdHMubGliYXNzaXN0KTsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKHN0YXQsIDA2NDQsIHNwdV9zdGF0X3Nob3csIE5VTEwpOworCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwdV9iYXNlKHZvaWQpCiB7CiAJaW50IGksIHJldCA9IDA7CkBAIC02MDMsMTQgKzY1NywyOCBAQAogCiAJcmV0ID0gc3B1X2VudW1lcmF0ZV9zcHVzKGNyZWF0ZV9zcHUpOwogCi0JaWYgKHJldCkgeworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBpbml0aWFsaXppbmcgc3B1c1xuIiwKIAkJCV9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gb3V0X3VucmVnaXN0ZXJfc3lzZGV2X2NsYXNzOwogCX0KIAorCWlmIChyZXQgPiAwKSB7CisJCS8qCisJCSAqIFdlIGNhbm5vdCBwdXQgdGhlIGZvcndhcmQgZGVjbGFyYXRpb24gaW4KKwkJICogPGxpbnV4L2xpbnV4X2xvZ28uaD4gYmVjYXVzZSBvZiBjb25mbGljdGluZyBzZXNzaW9uIHR5cGUKKwkJICogY29uZmxpY3RzIGZvciBjb25zdCBhbmQgX19pbml0ZGF0YSB3aXRoIGRpZmZlcmVudCBjb21waWxlcgorCQkgKiB2ZXJzaW9ucworCQkgKi8KKwkJZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3BlX2NsdXQyMjQ7CisKKwkJZmJfYXBwZW5kX2V4dHJhX2xvZ28oJmxvZ29fc3BlX2NsdXQyMjQsIHJldCk7CisJfQorCiAJeG1vbl9yZWdpc3Rlcl9zcHVzKCZzcHVfZnVsbF9saXN0KTsKIAorCXNwdV9hZGRfc3lzZGV2X2F0dHIoJmF0dHJfc3RhdCk7CisKIAlyZXR1cm4gMDsKIAogIG91dF91bnJlZ2lzdGVyX3N5c2Rldl9jbGFzczoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCmluZGV4IDFkNDU2MmEuLjc1ZWQ1MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwpAQCAtMjc5LDYgKzI3OSw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgaW50IG4gPSAwOwogCiAJcmV0ID0gLUVOT0RFVjsKIAlmb3IgKG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic3BlIik7CkBAIC0yODksOCArMjkwLDkgQEAKIAkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOwogCQkJYnJlYWs7CiAJCX0KKwkJbisrOwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZXQgPyByZXQgOiBuOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9jcmVhdGVfc3B1KHN0cnVjdCBzcHUgKnNwdSwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKaW5kZXggZDMyZGI5Zi4uMDdhMGU4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKQEAgLTMyMCw2ICszMjAsMTIgQEAKIAkvKiBGSVhNRTogd2hhdCBhcmUgdGhlIHNpZGUtZWZmZWN0cyBvZiB0aGlzPyAqLwogCXByb2ItPmRtYV9xdWVyeW1hc2tfUlcgPSBtYXNrOwogCXByb2ItPmRtYV9xdWVyeXR5cGVfUlcgPSBtb2RlOworCS8qIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgU1BVIGNvbnRleHQgaXMgYWx3YXlzCisJICogYWNxdWlyZWQgaW4gcnVubmFibGUgc3RhdGUgd2hlbiBuZXcgYml0cyBhcmUgYWRkZWQgdG8gdGhlCisJICogbWFzayAodGFnd2FpdCksIHNvIGl0J3Mgc3VmZmljaWVudCBqdXN0IHRvIG1hc2sKKwkgKiBkbWFfdGFnc3RhdHVzX1Igd2l0aCB0aGUgJ21hc2snIHBhcmFtZXRlciBoZXJlLgorCSAqLworCWN0eC0+Y3NhLnByb2IuZG1hX3RhZ3N0YXR1c19SICY9IG1hc2s7CiBvdXQ6CiAJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwppbmRleCA3YzUxY2I1Li42ZDdiZDYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKQEAgLTIzLDEwICsyMywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgogI2luY2x1ZGUgInNwdWZzLmgiCiAKKworYXRvbWljX3QgbnJfc3B1X2NvbnRleHRzID0gQVRPTUlDX0lOSVQoMCk7CisKIHN0cnVjdCBzcHVfY29udGV4dCAqYWxsb2Nfc3B1X2NvbnRleHQoc3RydWN0IHNwdV9nYW5nICpnYW5nKQogewogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OwpAQCAtNTMsMTAgKzU3LDEyIEBACiAJSU5JVF9MSVNUX0hFQUQoJmN0eC0+cnEpOwogCWlmIChnYW5nKQogCQlzcHVfZ2FuZ19hZGRfY3R4KGdhbmcsIGN0eCk7Ci0JY3R4LT5ydF9wcmlvcml0eSA9IGN1cnJlbnQtPnJ0X3ByaW9yaXR5OwotCWN0eC0+cG9saWN5ID0gY3VycmVudC0+cG9saWN5OwotCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnByaW87Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmN0eC0+c2NoZWRfd29yaywgc3B1X3NjaGVkX3RpY2spOworCWN0eC0+Y3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNwdV9zZXRfdGltZXNsaWNlKGN0eCk7CisJY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgPSBTUFVDVFhfVVRJTF9VU0VSOworCWN0eC0+c3RhdHMudHN0YW1wID0gamlmZmllczsKKworCWF0b21pY19pbmMoJm5yX3NwdV9jb250ZXh0cyk7CiAJZ290byBvdXQ7CiBvdXRfZnJlZToKIAlrZnJlZShjdHgpOwpAQCAtNzYsNiArODIsNyBAQAogCWlmIChjdHgtPmdhbmcpCiAJCXNwdV9nYW5nX3JlbW92ZV9jdHgoY3R4LT5nYW5nLCBjdHgpOwogCUJVR19PTighbGlzdF9lbXB0eSgmY3R4LT5ycSkpOworCWF0b21pY19kZWMoJm5yX3NwdV9jb250ZXh0cyk7CiAJa2ZyZWUoY3R4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwppbmRleCAwZjc1YzA3Li5lMDY0ZDBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwpAQCAtMzMsNyArMzMsOCBAQAogICogZnVuY3Rpb24uIEN1cnJlbnRseSwgdGhlcmUgYXJlIGEgZmV3IGNvcm5lciBjYXNlcyB0aGF0IHdlIGhhdmVuJ3QgaGFkCiAgKiB0byBoYW5kbGUgZm9ydHVuYXRlbHkuCiAgKi8KLXN0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBkc2lzcikKK3N0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwKKwkJdW5zaWduZWQgbG9uZyBkc2lzciwgdW5zaWduZWQgKmZsdCkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAl1bnNpZ25lZCBsb25nIGlzX3dyaXRlOwpAQCAtNzMsNyArNzQsOCBAQAogCQkJZ290byBiYWRfYXJlYTsKIAl9CiAJcmV0ID0gMDsKLQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpKSB7CisJKmZsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpOworCXN3aXRjaCAoKmZsdCkgewogCWNhc2UgVk1fRkFVTFRfTUlOT1I6CiAJCWN1cnJlbnQtPm1pbl9mbHQrKzsKIAkJYnJlYWs7CkBAIC0xNTMsNiArMTU1LDcgQEAKIHsKIAl1NjQgZWEsIGRzaXNyLCBhY2Nlc3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmbHQgPSAwOwogCWludCByZXQ7CiAKIAkvKgpAQCAtMTc4LDkgKzE4MSwxNyBAQAogCWlmICghKGRzaXNyICYgKE1GQ19EU0lTUl9QVEVfTk9UX0ZPVU5EIHwgTUZDX0RTSVNSX0FDQ0VTU19ERU5JRUQpKSkKIAkJcmV0dXJuIDA7CiAKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfSU9XQUlUKTsKKwogCXByX2RlYnVnKCJjdHggJXA6IGVhICUwMTZseCwgZHNpc3IgJTAxNmx4IHN0YXRlICVkXG4iLCBjdHgsIGVhLAogCQlkc2lzciwgY3R4LT5zdGF0ZSk7CiAKKwljdHgtPnN0YXRzLmhhc2hfZmx0Kys7CisJaWYgKGN0eC0+c3RhdGUgPT0gU1BVX1NUQVRFX1JVTk5BQkxFKSB7CisJCWN0eC0+c3B1LT5zdGF0cy5oYXNoX2ZsdCsrOworCQlzcHVfc3dpdGNoX3N0YXRlKGN0eC0+c3B1LCBTUFVfVVRJTF9JT1dBSVQpOworCX0KKwogCS8qIHdlIG11c3Qgbm90IGhvbGQgdGhlIGxvY2sgd2hlbiBlbnRlcmluZyBzcHVfaGFuZGxlX21tX2ZhdWx0ICovCiAJc3B1X3JlbGVhc2UoY3R4KTsKIApAQCAtMTkyLDcgKzIwMyw3IEBACiAKIAkvKiBoYXNoaW5nIGZhaWxlZCwgc28gdHJ5IHRoZSBhY3R1YWwgZmF1bHQgaGFuZGxlciAqLwogCWlmIChyZXQpCi0JCXJldCA9IHNwdV9oYW5kbGVfbW1fZmF1bHQoY3VycmVudC0+bW0sIGVhLCBkc2lzcik7CisJCXJldCA9IHNwdV9oYW5kbGVfbW1fZmF1bHQoY3VycmVudC0+bW0sIGVhLCBkc2lzciwgJmZsdCk7CiAKIAlzcHVfYWNxdWlyZShjdHgpOwogCS8qCkBAIC0yMDEsMTEgKzIxMiwyMyBAQAogCSAqIEluIGNhc2Ugb2YgdW5oYW5kbGVkIGVycm9yIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB1c2VyIHNwYWNlLgogCSAqLwogCWlmICghcmV0KSB7CisJCWlmIChmbHQgPT0gVk1fRkFVTFRfTUlOT1IpCisJCQljdHgtPnN0YXRzLm1pbl9mbHQrKzsKKwkJZWxzZQorCQkJY3R4LT5zdGF0cy5tYWpfZmx0Kys7CisJCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQkJaWYgKGZsdCA9PSBWTV9GQVVMVF9NSU5PUikKKwkJCQljdHgtPnNwdS0+c3RhdHMubWluX2ZsdCsrOworCQkJZWxzZQorCQkJCWN0eC0+c3B1LT5zdGF0cy5tYWpfZmx0Kys7CisJCX0KKwogCQlpZiAoY3R4LT5zcHUpCiAJCQljdHgtPm9wcy0+cmVzdGFydF9kbWEoY3R4KTsKIAl9IGVsc2UKIAkJc3B1ZnNfaGFuZGxlX2RtYV9lcnJvcihjdHgsIGVhLCBTUEVfRVZFTlRfU1BFX0RBVEFfU1RPUkFHRSk7CiAKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfU1lTVEVNKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3B1ZnNfaGFuZGxlX2NsYXNzMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCBiMWU3ZTJmLi5jMjgxNGVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CkBAIC0zOSw2ICs0MCw3IEBACiAKICNkZWZpbmUgU1BVRlNfTU1BUF80SyAoUEFHRV9TSVpFID09IDB4MTAwMCkKIAorCiBzdGF0aWMgaW50CiBzcHVmc19tZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKQEAgLTIxNiwxMiArMjE4LDEyIEBACiAjZW5kaWYgLyogQ09ORklHX1NQVV9GU182NEtfTFMgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfbWVtX2ZvcHMgPSB7Ci0JLm9wZW4JIAkJPSBzcHVmc19tZW1fb3BlbiwKLQkucmVsZWFzZSAJCT0gc3B1ZnNfbWVtX3JlbGVhc2UsCi0JLnJlYWQgICAJCT0gc3B1ZnNfbWVtX3JlYWQsCi0JLndyaXRlICAgCQk9IHNwdWZzX21lbV93cml0ZSwKLQkubGxzZWVrICAJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkubW1hcCAgICAJCT0gc3B1ZnNfbWVtX21tYXAsCisJLm9wZW4JCQk9IHNwdWZzX21lbV9vcGVuLAorCS5yZWxlYXNlCQk9IHNwdWZzX21lbV9yZWxlYXNlLAorCS5yZWFkCQkJPSBzcHVmc19tZW1fcmVhZCwKKwkud3JpdGUJCQk9IHNwdWZzX21lbV93cml0ZSwKKwkubGxzZWVrCQkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5tbWFwCQkJPSBzcHVmc19tZW1fbW1hcCwKICNpZmRlZiBDT05GSUdfU1BVX0ZTXzY0S19MUwogCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHNwdWZzX2dldF91bm1hcHBlZF9hcmVhLAogI2VuZGlmCkBAIC0xNDk3LDE0ICsxNDk5LDE1IEBACiAJCWlmIChzdGF0dXMpCiAJCQlyZXQgPSBzdGF0dXM7CiAJfQotCXNwdV9yZWxlYXNlKGN0eCk7CiAKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJY3R4LT50YWd3YWl0IHw9IDEgPDwgY21kLnRhZzsKIAlyZXQgPSBzaXplOwogCitvdXRfdW5sb2NrOgorCXNwdV9yZWxlYXNlKGN0eCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MTUsMTQgKzE1MTgsMTQgQEAKIAl1MzIgZnJlZV9lbGVtZW50cywgdGFnc3RhdHVzOwogCXVuc2lnbmVkIGludCBtYXNrOwogCisJcG9sbF93YWl0KGZpbGUsICZjdHgtPm1mY193cSwgd2FpdCk7CisKIAlzcHVfYWNxdWlyZShjdHgpOwogCWN0eC0+b3BzLT5zZXRfbWZjX3F1ZXJ5KGN0eCwgY3R4LT50YWd3YWl0LCAyKTsKIAlmcmVlX2VsZW1lbnRzID0gY3R4LT5vcHMtPmdldF9tZmNfZnJlZV9lbGVtZW50cyhjdHgpOwogCXRhZ3N0YXR1cyA9IGN0eC0+b3BzLT5yZWFkX21mY190YWdzdGF0dXMoY3R4KTsKIAlzcHVfcmVsZWFzZShjdHgpOwogCi0JcG9sbF93YWl0KGZpbGUsICZjdHgtPm1mY193cSwgd2FpdCk7Ci0KIAltYXNrID0gMDsKIAlpZiAoZnJlZV9lbGVtZW50cyAmIDB4ZmZmZikKIAkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKQEAgLTE3OTcsNiArMTgwMCwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNwdWZzX2NhcHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkpCisJCXNlcV9wdXRzKHMsICJzY2hlZFxuIik7CisJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfSVNPTEFURSkpCisJCXNlcV9wdXRzKHMsICJzdGVwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc19jYXBzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX2NhcHNfc2hvdywgU1BVRlNfSShpbm9kZSktPmlfY3R4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfY2Fwc19mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX2NhcHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwogc3RhdGljIHNzaXplX3QgX19zcHVmc19tYm94X2luZm9fcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKIAkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQogewpAQCAtMjAxNCw3ICsyMDQwLDEwNSBAQAogCS5yZWFkID0gc3B1ZnNfcHJveHlkbWFfaW5mb19yZWFkLAogfTsKIAorc3RhdGljIGludCBzcHVmc19zaG93X3RpZChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzLCAiJWRcbiIsIGN0eC0+dGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc190aWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc3B1ZnNfc2hvd190aWQsIFNQVUZTX0koaW5vZGUpLT5pX2N0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX3RpZF9mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX3RpZF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3R4X3N0YXRlX25hbWVzW10gPSB7CisJInVzZXIiLCAic3lzdGVtIiwgImlvd2FpdCIsICJsb2FkZWQiCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX2FjY3RfdGltZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgdGltZSA9IGN0eC0+c3RhdHMudGltZXNbc3RhdGVdOworCisJaWYgKGN0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlID09IHN0YXRlKQorCQl0aW1lICs9IGppZmZpZXMgLSBjdHgtPnN0YXRzLnRzdGFtcDsKKworCXJldHVybiBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX3NsYl9mbHRzKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGJfZmx0cyA9IGN0eC0+c3RhdHMuc2xiX2ZsdDsKKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQlzbGJfZmx0cyArPSAoY3R4LT5zcHUtPnN0YXRzLnNsYl9mbHQgLQorCQkJICAgICBjdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSk7CisJfQorCisJcmV0dXJuIHNsYl9mbHRzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX2NsYXNzMl9pbnRycyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xhc3MyX2ludHJzID0gY3R4LT5zdGF0cy5jbGFzczJfaW50cjsKKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQljbGFzczJfaW50cnMgKz0gKGN0eC0+c3B1LT5zdGF0cy5jbGFzczJfaW50ciAtCisJCQkJIGN0eC0+c3RhdHMuY2xhc3MyX2ludHJfYmFzZSk7CisJfQorCisJcmV0dXJuIGNsYXNzMl9pbnRyczsKK30KKworCitzdGF0aWMgaW50IHNwdWZzX3Nob3dfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJc3B1X2FjcXVpcmUoY3R4KTsKKwlzZXFfcHJpbnRmKHMsICIlcyAlbGx1ICVsbHUgJWxsdSAlbGx1ICIKKwkJICAgICAgIiVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJY3R4X3N0YXRlX25hbWVzW2N0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlXSwKKwkJc3B1ZnNfYWNjdF90aW1lKGN0eCwgU1BVQ1RYX1VUSUxfVVNFUiksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX1NZU1RFTSksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX0lPV0FJVCksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX0xPQURFRCksCisJCWN0eC0+c3RhdHMudm9sX2N0eF9zd2l0Y2gsCisJCWN0eC0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCwKKwkJc3B1ZnNfc2xiX2ZsdHMoY3R4KSwKKwkJY3R4LT5zdGF0cy5oYXNoX2ZsdCwKKwkJY3R4LT5zdGF0cy5taW5fZmx0LAorCQljdHgtPnN0YXRzLm1hal9mbHQsCisJCXNwdWZzX2NsYXNzMl9pbnRycyhjdHgpLAorCQljdHgtPnN0YXRzLmxpYmFzc2lzdCk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc19zdGF0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX3Nob3dfc3RhdCwgU1BVRlNfSShpbm9kZSktPmlfY3R4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfc3RhdF9mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX3N0YXRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworCiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfY29udGVudHNbXSA9IHsKKwl7ICJjYXBhYmlsaXRpZXMiLCAmc3B1ZnNfY2Fwc19mb3BzLCAwNDQ0LCB9LAogCXsgIm1lbSIsICAmc3B1ZnNfbWVtX2ZvcHMsICAwNjY2LCB9LAogCXsgInJlZ3MiLCAmc3B1ZnNfcmVnc19mb3BzLCAgMDY2NiwgfSwKIAl7ICJtYm94IiwgJnNwdWZzX21ib3hfZm9wcywgMDQ0NCwgfSwKQEAgLTIwNDYsMTAgKzIxNzAsMTMgQEAKIAl7ICJ3Ym94X2luZm8iLCAmc3B1ZnNfd2JveF9pbmZvX2ZvcHMsIDA0NDQsIH0sCiAJeyAiZG1hX2luZm8iLCAmc3B1ZnNfZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKIAl7ICJwcm94eWRtYV9pbmZvIiwgJnNwdWZzX3Byb3h5ZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKKwl7ICJ0aWQiLCAmc3B1ZnNfdGlkX2ZvcHMsIDA0NDQsIH0sCisJeyAic3RhdCIsICZzcHVmc19zdGF0X2ZvcHMsIDA0NDQsIH0sCiAJe30sCiB9OwogCiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfbm9zY2hlZF9jb250ZW50c1tdID0geworCXsgImNhcGFiaWxpdGllcyIsICZzcHVmc19jYXBzX2ZvcHMsIDA0NDQsIH0sCiAJeyAibWVtIiwgICZzcHVmc19tZW1fZm9wcywgIDA2NjYsIH0sCiAJeyAibWJveCIsICZzcHVmc19tYm94X2ZvcHMsIDA0NDQsIH0sCiAJeyAiaWJveCIsICZzcHVmc19pYm94X2ZvcHMsIDA0NDQsIH0sCkBAIC0yMDY4LDYgKzIxOTUsOCBAQAogCXsgInBzbWFwIiwgJnNwdWZzX3BzbWFwX2ZvcHMsIDA2NjYsIH0sCiAJeyAicGh5cy1pZCIsICZzcHVmc19pZF9vcHMsIDA2NjYsIH0sCiAJeyAib2JqZWN0LWlkIiwgJnNwdWZzX29iamVjdF9pZF9vcHMsIDA2NjYsIH0sCisJeyAidGlkIiwgJnNwdWZzX3RpZF9mb3BzLCAwNDQ0LCB9LAorCXsgInN0YXQiLCAmc3B1ZnNfc3RhdF9mb3BzLCAwNDQ0LCB9LAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwppbmRleCA5ODA3MjA2Li5mMzc0NjBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwpAQCAtMjMyLDEwICsyMzIsNiBAQAogCXJldHVybiBkY2FjaGVfZGlyX2Nsb3NlKGlub2RlLCBmaWxlKTsKIH0KIAotY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLmxvb2t1cCA9IHNpbXBsZV9sb29rdXAsCi19OwotCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2NvbnRleHRfZm9wcyA9IHsKIAkub3BlbgkJPSBkY2FjaGVfZGlyX29wZW4sCiAJLnJlbGVhc2UJPSBzcHVmc19kaXJfY2xvc2UsCkBAIC0yNjksNyArMjY1LDcgQEAKIAkJZ290byBvdXRfaXB1dDsKIAogCWN0eC0+ZmxhZ3MgPSBmbGFnczsKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAlpZiAoZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpCiAJCXJldCA9IHNwdWZzX2ZpbGxfZGlyKGRlbnRyeSwgc3B1ZnNfZGlyX25vc2NoZWRfY29udGVudHMsCkBAIC0zODYsNyArMzgyLDcgQEAKIAlpZiAoIWdhbmcpCiAJCWdvdG8gb3V0X2lwdXQ7CiAKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CkBAIC01OTMsNyArNTg5LDcgQEAKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKIAotCWlub2RlLT5pX29wID0gJnNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwogCVNQVUZTX0koaW5vZGUpLT5pX2N0eCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwppbmRleCA1NzYyNjYwLi41OGFlMTNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCkBAIC0yOSw3ICsyOSw4IEBACiAJc3B1ID0gY3R4LT5zcHU7CiAJcHRlX2ZhdWx0ID0gc3B1LT5kc2lzciAmCiAJICAgIChNRkNfRFNJU1JfUFRFX05PVF9GT1VORCB8IE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKTsKLQlyZXR1cm4gKCEoKnN0YXQgJiAweDEpIHx8IHB0ZV9mYXVsdCB8fCBzcHUtPmNsYXNzXzBfcGVuZGluZykgPyAxIDogMDsKKwlyZXR1cm4gKCEoKnN0YXQgJiBTUFVfU1RBVFVTX1JVTk5JTkcpIHx8IHB0ZV9mYXVsdCB8fCBzcHUtPmNsYXNzXzBfcGVuZGluZykgPworCQkxIDogMDsKIH0KIAogc3RhdGljIGludCBzcHVfc2V0dXBfaXNvbGF0ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCkBAIC0xNDIsOCArMTQzLDExIEBACiAJCQlydW5jbnRsID0gU1BVX1JVTkNOVExfUlVOTkFCTEU7CiAJCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgcnVuY250bCk7CiAJfSBlbHNlIHsKLQkJc3B1X3N0YXJ0X3RpY2soY3R4KTsKKwkJdW5zaWduZWQgbG9uZyBtb2RlID0gU1BVX1BSSVZDTlRMX01PREVfTk9STUFMOwogCQljdHgtPm9wcy0+bnBjX3dyaXRlKGN0eCwgKm5wYyk7CisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJCW1vZGUgPSBTUFVfUFJJVkNOVExfTU9ERV9TSU5HTEVfU1RFUDsKKwkJb3V0X2JlNjQoJmN0eC0+c3B1LT5wcml2Mi0+c3B1X3ByaXZjbnRsX1JXLCBtb2RlKTsKIAkJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LCBTUFVfUlVOQ05UTF9SVU5OQUJMRSk7CiAJfQogCkBAIC0xNTUsNyArMTU5LDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXNwdV9zdG9wX3RpY2soY3R4KTsKIAkqc3RhdHVzID0gY3R4LT5vcHMtPnN0YXR1c19yZWFkKGN0eCk7CiAJKm5wYyA9IGN0eC0+b3BzLT5ucGNfcmVhZChjdHgpOwogCXNwdV9yZWxlYXNlKGN0eCk7CkBAIC0yOTgsOSArMzAxLDIyIEBACiAJY3R4LT5vcHMtPm1hc3Rlcl9zdGFydChjdHgpOwogCWN0eC0+ZXZlbnRfcmV0dXJuID0gMDsKIAotCXJldCA9IHNwdV9hY3F1aXJlX3J1bm5hYmxlKGN0eCwgMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlzcHVfYWNxdWlyZShjdHgpOworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCkgeworCQlfX3NwdV91cGRhdGVfc2NoZWRfaW5mbyhjdHgpOworCisJCXJldCA9IHNwdV9hY3RpdmF0ZShjdHgsIDApOworCQlpZiAocmV0KSB7CisJCQlzcHVfcmVsZWFzZShjdHgpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSB0aGUgc2NoZWR1bGluZyBwcmlvcml0eSB1bmRlciBhY3RpdmVfbXV0ZXgKKwkJICogdG8gcHJvdGVjdCBhZ2FpbnN0IGZpbmRfdmljdGltKCkuCisJCSAqLworCQlzcHVfdXBkYXRlX3NjaGVkX2luZm8oY3R4KTsKKwl9CiAKIAlyZXQgPSBzcHVfcnVuX2luaXQoY3R4LCBucGMpOwogCWlmIChyZXQpIHsKQEAgLTMyNSwxNiArMzQxLDIwIEBACiAKIAkJaWYgKHVubGlrZWx5KGN0eC0+c3RhdGUgIT0gU1BVX1NUQVRFX1JVTk5BQkxFKSkgewogCQkJcmV0ID0gc3B1X3JlYWNxdWlyZV9ydW5uYWJsZShjdHgsIG5wYywgJnN0YXR1cyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJc3B1X3N0b3BfdGljayhjdHgpOworCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDI7Ci0JCQl9CiAJCQljb250aW51ZTsKIAkJfQogCQlyZXQgPSBzcHVfcHJvY2Vzc19ldmVudHMoY3R4KTsKIAogCX0gd2hpbGUgKCFyZXQgJiYgIShzdGF0dXMgJiAoU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1AgfAotCQkJCSAgICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUKSkpOworCQkJCSAgICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUIHwKKwkJCQkgICAgICAgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCkpKTsKKworCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApICYmCisJICAgICgoKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpICYgMHgzZjAwKSA9PSAweDIxMDApICYmCisJICAgIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkpCisJCWN0eC0+c3RhdHMubGliYXNzaXN0Kys7CiAKIAljdHgtPm9wcy0+bWFzdGVyX3N0b3AoY3R4KTsKIAlyZXQgPSBzcHVfcnVuX2ZpbmkoY3R4LCBucGMsICZzdGF0dXMpOwpAQCAtMzQ0LDEwICszNjQsMTUgQEAKIAlpZiAoKHJldCA9PSAwKSB8fAogCSAgICAoKHJldCA9PSAtRVJFU1RBUlRTWVMpICYmCiAJICAgICAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUKSB8fAorCSAgICAgIChzdGF0dXMgJiBTUFVfU1RBVFVTX1NJTkdMRV9TVEVQKSB8fAogCSAgICAgICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApICYmCiAJICAgICAgIChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUICE9IDB4MjEwNCkpKSkpCiAJCXJldCA9IHN0YXR1czsKIAorCS8qIE5vdGU6IHdlIGRvbid0IG5lZWQgdG8gZm9yY2Vfc2lnIFNJR1RSQVAgb24gc2luZ2xlLXN0ZXAKKwkgKiBzaW5jZSB3ZSBoYXZlIFRJRl9TSU5HTEVTVEVQIHNldCwgdGh1cyB0aGUga2VybmVsIHdpbGwgZG8KKwkgKiBpdCB1cG9uIHJldHVybiBmcm9tIHRoZSBzeXNjYWxsIGFueWF3eQorCSAqLwogCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApCiAJICAgICYmIChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUKSA9PSAweDNmZmYpIHsKIAkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCAzYjgzMWUwLi5lNWI0ZGQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtMzUsNiArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9udW1hLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KQEAgLTQzLDU0ICs0NywxMjYgQEAKICNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+CiAjaW5jbHVkZSAic3B1ZnMuaCIKIAotI2RlZmluZSBTUFVfVElNRVNMSUNFCShIWikKLQogc3RydWN0IHNwdV9wcmlvX2FycmF5IHsKIAlERUNMQVJFX0JJVE1BUChiaXRtYXAsIE1BWF9QUklPKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJ1bnFbTUFYX1BSSU9dOwogCXNwaW5sb2NrX3QgcnVucV9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2xpc3RbTUFYX05VTU5PREVTXTsKIAlzdHJ1Y3QgbXV0ZXggYWN0aXZlX211dGV4W01BWF9OVU1OT0RFU107CisJaW50IG5yX2FjdGl2ZVtNQVhfTlVNTk9ERVNdOworCWludCBucl93YWl0aW5nOwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3B1X2F2ZW5ydW5bM107CiBzdGF0aWMgc3RydWN0IHNwdV9wcmlvX2FycmF5ICpzcHVfcHJpbzsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc3B1X3NjaGVkX3dxOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3B1c2NoZWRfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzcHVzY2hlZF90aW1lcjsKIAotc3RhdGljIGlubGluZSBpbnQgbm9kZV9hbGxvd2VkKGludCBub2RlKQorLyoKKyAqIFByaW9yaXR5IG9mIGEgbm9ybWFsLCBub24tcnQsIG5vbi1uaWNlZCdkIHByb2Nlc3MgKGFrYSBuaWNlIGxldmVsIDApLgorICovCisjZGVmaW5lIE5PUk1BTF9QUklPCQkxMjAKKworLyoKKyAqIEZyZXF1ZW5jeSBvZiB0aGUgc3B1IHNjaGVkdWxlciB0aWNrLiAgQnkgZGVmYXVsdCB3ZSBkbyBvbmUgU1BVIHNjaGVkdWxlcgorICogdGljayBmb3IgZXZlcnkgMTAgQ1BVIHNjaGVkdWxlciB0aWNrcy4KKyAqLworI2RlZmluZSBTUFVTQ0hFRF9USUNLCQkoMTApCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlICd0dW5pbmcga25vYnMnIG9mIHRoZSBzY2hlZHVsZXI6CisgKgorICogTWluaW11bSB0aW1lc2xpY2UgaXMgNSBtc2VjcyAob3IgMSBzcHUgc2NoZWR1bGVyIHRpY2ssIHdoaWNoZXZlciBpcworICogbGFyZ2VyKSwgZGVmYXVsdCB0aW1lc2xpY2UgaXMgMTAwIG1zZWNzLCBtYXhpbXVtIHRpbWVzbGljZSBpcyA4MDAgbXNlY3MuCisgKi8KKyNkZWZpbmUgTUlOX1NQVV9USU1FU0xJQ0UJbWF4KDUgKiBIWiAvICgxMDAwICogU1BVU0NIRURfVElDSyksIDEpCisjZGVmaW5lIERFRl9TUFVfVElNRVNMSUNFCSgxMDAgKiBIWiAvICgxMDAwICogU1BVU0NIRURfVElDSykpCisKKyNkZWZpbmUgTUFYX1VTRVJfUFJJTwkJKE1BWF9QUklPIC0gTUFYX1JUX1BSSU8pCisjZGVmaW5lIFNDQUxFX1BSSU8oeCwgcHJpbykgXAorCW1heCh4ICogKE1BWF9QUklPIC0gcHJpbykgLyAoTUFYX1VTRVJfUFJJTyAvIDIpLCBNSU5fU1BVX1RJTUVTTElDRSkKKworLyoKKyAqIHNjYWxlIHVzZXItbmljZSB2YWx1ZXMgWyAtMjAgLi4uIDAgLi4uIDE5IF0gdG8gdGltZSBzbGljZSB2YWx1ZXM6CisgKiBbODAwbXMgLi4uIDEwMG1zIC4uLiA1bXNdCisgKgorICogVGhlIGhpZ2hlciBhIHRocmVhZCdzIHByaW9yaXR5LCB0aGUgYmlnZ2VyIHRpbWVzbGljZXMKKyAqIGl0IGdldHMgZHVyaW5nIG9uZSByb3VuZCBvZiBleGVjdXRpb24uIEJ1dCBldmVuIHRoZSBsb3dlc3QKKyAqIHByaW9yaXR5IHRocmVhZCBnZXRzIE1JTl9USU1FU0xJQ0Ugd29ydGggb2YgZXhlY3V0aW9uIHRpbWUuCisgKi8KK3ZvaWQgc3B1X3NldF90aW1lc2xpY2Uoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0JY3B1bWFza190IG1hc2s7Ci0KLQlpZiAoIW5yX2NwdXNfbm9kZShub2RlKSkKLQkJcmV0dXJuIDA7Ci0JbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKLQlpZiAoIWNwdXNfaW50ZXJzZWN0cyhtYXNrLCBjdXJyZW50LT5jcHVzX2FsbG93ZWQpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKwlpZiAoY3R4LT5wcmlvIDwgTk9STUFMX1BSSU8pCisJCWN0eC0+dGltZV9zbGljZSA9IFNDQUxFX1BSSU8oREVGX1NQVV9USU1FU0xJQ0UgKiA0LCBjdHgtPnByaW8pOworCWVsc2UKKwkJY3R4LT50aW1lX3NsaWNlID0gU0NBTEVfUFJJTyhERUZfU1BVX1RJTUVTTElDRSwgY3R4LT5wcmlvKTsKIH0KIAotdm9pZCBzcHVfc3RhcnRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKKy8qCisgKiBVcGRhdGUgc2NoZWR1bGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLgorICovCit2b2lkIF9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWlmIChjdHgtPnBvbGljeSA9PSBTQ0hFRF9SUikgewotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhlIGV4aXRpbmcgYml0IGlzIGNsZWFyZWQuCi0JCSAqLwotCQljbGVhcl9iaXQoU1BVX1NDSEVEX0VYSVRJTkcsICZjdHgtPnNjaGVkX2ZsYWdzKTsKLQkJbWIoKTsKLQkJcXVldWVfZGVsYXllZF93b3JrKHNwdV9zY2hlZF93cSwgJmN0eC0+c2NoZWRfd29yaywgU1BVX1RJTUVTTElDRSk7Ci0JfQorCS8qCisJICogMzItQml0IGFzc2lnbm1lbnQgYXJlIGF0b21pYyBvbiBwb3dlcnBjLCBhbmQgd2UgZG9uJ3QgY2FyZSBhYm91dAorCSAqIG1lbW9yeSBvcmRlcmluZyBoZXJlIGJlY2F1c2UgcmV0cml2aW5nIHRoZSBjb250cm9sbGluZyB0aHJlYWQgaXMKKwkgKiBwZXIgZGVmaW50aW9uIHJhY3kuCisJICovCisJY3R4LT50aWQgPSBjdXJyZW50LT5waWQ7CisKKwkvKgorCSAqIFdlIGRvIG91ciBvd24gcHJpb3JpdHkgY2FsY3VsYXRpb25zLCBzbyB3ZSBub3JtYWxseSB3YW50CisJICogLT5zdGF0aWNfcHJpbyB0byBzdGFydCB3aXRoLiBVbmZvcnR1bmF0ZWx5IHRoaWVzIGZpZWxkCisJICogY29udGFpbnMganVuayBmb3IgdGhyZWFkcyB3aXRoIGEgcmVhbHRpbWUgc2NoZWR1bGluZworCSAqIHBvbGljeSBzbyB3ZSBoYXZlIHRvIGxvb2sgYXQgLT5wcmlvIGluIHRoaXMgY2FzZS4KKwkgKi8KKwlpZiAocnRfcHJpbyhjdXJyZW50LT5wcmlvKSkKKwkJY3R4LT5wcmlvID0gY3VycmVudC0+cHJpbzsKKwllbHNlCisJCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnN0YXRpY19wcmlvOworCWN0eC0+cG9saWN5ID0gY3VycmVudC0+cG9saWN5OworCisJLyoKKwkgKiBBIGxvdCBvZiBwbGFjZXMgdGhhdCBkb24ndCBob2xkIGFjdGl2ZV9tdXRleCBwb2tlIGludG8KKwkgKiBjcHVzX2FsbG93ZWQsIGluY2x1ZGluZyBncmFiX3J1bm5hYmxlX2NvbnRleHQgd2hpY2gKKwkgKiBhbHJlYWR5IGhvbGRzIHRoZSBydW5xX2xvY2suICBTbyBhYnVzZSBydW5xX2xvY2sKKwkgKiB0byBwcm90ZWN0IHRoaXMgZmllbGQgYXN3ZWxsLgorCSAqLworCXNwaW5fbG9jaygmc3B1X3ByaW8tPnJ1bnFfbG9jayk7CisJY3R4LT5jcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc3Bpbl91bmxvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogfQogCi12b2lkIHNwdV9zdG9wX3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit2b2lkIHNwdV91cGRhdGVfc2NoZWRfaW5mbyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlpZiAoY3R4LT5wb2xpY3kgPT0gU0NIRURfUlIpIHsKLQkJLyoKLQkJICogV2hpbGUgdGhlIHdvcmsgY2FuIGJlIHJlYXJtaW5nIG5vcm1hbGx5IHNldHRpbmcgdGhpcyBmbGFnCi0JCSAqIG1ha2VzIHN1cmUgaXQgZG9lcyBub3QgcmVhcm0gaXRzZWxmIGFueW1vcmUuCi0JCSAqLwotCQlzZXRfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncyk7Ci0JCW1iKCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmN0eC0+c2NoZWRfd29yayk7CisJaW50IG5vZGUgPSBjdHgtPnNwdS0+bm9kZTsKKworCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCV9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKGN0eCk7CisJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKK30KKworc3RhdGljIGludCBfX25vZGVfYWxsb3dlZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgaW50IG5vZGUpCit7CisJaWYgKG5yX2NwdXNfbm9kZShub2RlKSkgeworCQljcHVtYXNrX3QgbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKKworCQlpZiAoY3B1c19pbnRlcnNlY3RzKG1hc2ssIGN0eC0+Y3B1c19hbGxvd2VkKSkKKwkJCXJldHVybiAxOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vZGVfYWxsb3dlZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgaW50IG5vZGUpCit7CisJaW50IHJ2YWw7CisKKwlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOworCXJ2YWwgPSBfX25vZGVfYWxsb3dlZChjdHgsIG5vZGUpOworCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKworCXJldHVybiBydmFsOwogfQogCiAvKioKQEAgLTk5LDkgKzE3NSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBzcHVfYWRkX3RvX2FjdGl2ZV9saXN0KHN0cnVjdCBzcHUgKnNwdSkKIHsKLQltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W3NwdS0+bm9kZV0pOwotCWxpc3RfYWRkX3RhaWwoJnNwdS0+bGlzdCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtzcHUtPm5vZGVdKTsKLQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbc3B1LT5ub2RlXSk7CisJaW50IG5vZGUgPSBzcHUtPm5vZGU7CisKKwltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwlzcHVfcHJpby0+bnJfYWN0aXZlW25vZGVdKys7CisJbGlzdF9hZGRfdGFpbCgmc3B1LT5saXN0LCAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdKTsKKwltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworfQorCitzdGF0aWMgdm9pZCBfX3NwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJbGlzdF9kZWxfaW5pdCgmc3B1LT5saXN0KTsKKwlzcHVfcHJpby0+bnJfYWN0aXZlW3NwdS0+bm9kZV0tLTsKIH0KIAogLyoqCkBAIC0xMTMsNyArMTk4LDcgQEAKIAlpbnQgbm9kZSA9IHNwdS0+bm9kZTsKIAogCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwotCWxpc3RfZGVsX2luaXQoJnNwdS0+bGlzdCk7CisJX19zcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKIAltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogfQogCkBAIC0xNDQsNiArMjI5LDEwIEBACiB7CiAJcHJfZGVidWcoIiVzOiBwaWQ9JWQgU1BVPSVkIE5PREU9JWRcbiIsIF9fRlVOQ1RJT05fXywgY3VycmVudC0+cGlkLAogCQkgc3B1LT5udW1iZXIsIHNwdS0+bm9kZSk7CisKKwljdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSA9IHNwdS0+c3RhdHMuc2xiX2ZsdDsKKwljdHgtPnN0YXRzLmNsYXNzMl9pbnRyX2Jhc2UgPSBzcHUtPnN0YXRzLmNsYXNzMl9pbnRyOworCiAJc3B1LT5jdHggPSBjdHg7CiAJc3B1LT5mbGFncyA9IDA7CiAJY3R4LT5zcHUgPSBzcHU7CkBAIC0xNjEsOCArMjUwLDggQEAKIAlzcHUtPnRpbWVzdGFtcCA9IGppZmZpZXM7CiAJc3B1X2NwdV9hZmZpbml0eV9zZXQoc3B1LCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzcHVfc3dpdGNoX25vdGlmeShzcHUsIGN0eCk7Ci0Jc3B1X2FkZF90b19hY3RpdmVfbGlzdChzcHUpOwogCWN0eC0+c3RhdGUgPSBTUFVfU1RBVEVfUlVOTkFCTEU7CisJc3B1X3N3aXRjaF9zdGF0ZShzcHUsIFNQVV9VVElMX1NZU1RFTSk7CiB9CiAKIC8qKgpAQCAtMTc1LDcgKzI2NCw4IEBACiAJcHJfZGVidWcoIiVzOiB1bmJpbmQgcGlkPSVkIFNQVT0lZCBOT0RFPSVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCSBzcHUtPnBpZCwgc3B1LT5udW1iZXIsIHNwdS0+bm9kZSk7CiAKLQlzcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKKwlzcHVfc3dpdGNoX3N0YXRlKHNwdSwgU1BVX1VUSUxfSURMRSk7CisKIAlzcHVfc3dpdGNoX25vdGlmeShzcHUsIE5VTEwpOwogCXNwdV91bm1hcF9tYXBwaW5ncyhjdHgpOwogCXNwdV9zYXZlKCZjdHgtPmNzYSwgc3B1KTsKQEAgLTE5Miw2ICsyODIsMTEgQEAKIAljdHgtPnNwdSA9IE5VTEw7CiAJc3B1LT5mbGFncyA9IDA7CiAJc3B1LT5jdHggPSBOVUxMOworCisJY3R4LT5zdGF0cy5zbGJfZmx0ICs9CisJCShzcHUtPnN0YXRzLnNsYl9mbHQgLSBjdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSk7CisJY3R4LT5zdGF0cy5jbGFzczJfaW50ciArPQorCQkoc3B1LT5zdGF0cy5jbGFzczJfaW50ciAtIGN0eC0+c3RhdHMuY2xhc3MyX2ludHJfYmFzZSk7CiB9CiAKIC8qKgpAQCAtMjAwLDIwICsyOTUsMzkgQEAKICAqLwogc3RhdGljIHZvaWQgX19zcHVfYWRkX3RvX3JxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWludCBwcmlvID0gY3R4LT5wcmlvOwotCi0JbGlzdF9hZGRfdGFpbCgmY3R4LT5ycSwgJnNwdV9wcmlvLT5ydW5xW3ByaW9dKTsKLQlzZXRfYml0KHByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCS8qCisJICogVW5mb3J0dW5hdGVseSB0aGlzIGNvZGUgcGF0aCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcworCSAqIG9uIGJlaGFsZiBvZiBhIHNpbmdsZSBjb250ZXh0IGR1ZSB0byB0aGUgd2F5IHRoZSBwcm9ibGVtIHN0YXRlCisJICogbW1hcCBzdXBwb3J0IHdvcmtzLgorCSAqCisJICogRm9ydHVuYXRlbHkgd2UgbmVlZCB0byB3YWtlIHVwIGFsbCB0aGVzZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUKKwkgKiBhbmQgY2FuIHNpbXBseSBza2lwIHRoZSBydW5xdWV1ZSBhZGRpdGlvbiBmb3IgZXZlcnkgYnV0IHRoZSBmaXJzdAorCSAqIHRocmVhZCBnZXR0aW5nIGludG8gdGhpcyBjb2RlcGF0aC4KKwkgKgorCSAqIEl0J3Mgc3RpbGwgcXVpdGUgaGFja3ksIGFuZCBsb25nLXRlcm0gd2Ugc2hvdWxkIHByb3h5IGFsbCBvdGhlcgorCSAqIHRocmVhZHMgdGhyb3VnaCB0aGUgb3duZXIgdGhyZWFkIHNvIHRoYXQgc3B1X3J1biBpcyBpbiBjb250cm9sCisJICogb2YgYWxsIHRoZSBzY2hlZHVsaW5nIGFjdGl2aXR5IGZvciBhIGdpdmVuIGNvbnRleHQuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+cnEpKSB7CisJCWxpc3RfYWRkX3RhaWwoJmN0eC0+cnEsICZzcHVfcHJpby0+cnVucVtjdHgtPnByaW9dKTsKKwkJc2V0X2JpdChjdHgtPnByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCQlpZiAoIXNwdV9wcmlvLT5ucl93YWl0aW5nKyspCisJCQlfX21vZF90aW1lcigmc3B1c2NoZWRfdGltZXIsIGppZmZpZXMgKyBTUFVTQ0hFRF9USUNLKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fc3B1X2RlbF9mcm9tX3JxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewogCWludCBwcmlvID0gY3R4LT5wcmlvOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJxKSkKKwlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cnEpKSB7CisJCWlmICghLS1zcHVfcHJpby0+bnJfd2FpdGluZykKKwkJCWRlbF90aW1lcigmc3B1c2NoZWRfdGltZXIpOwogCQlsaXN0X2RlbF9pbml0KCZjdHgtPnJxKTsKLQlpZiAobGlzdF9lbXB0eSgmc3B1X3ByaW8tPnJ1bnFbcHJpb10pKQotCQljbGVhcl9iaXQocHJpbywgc3B1X3ByaW8tPmJpdG1hcCk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnNwdV9wcmlvLT5ydW5xW3ByaW9dKSkKKwkJCWNsZWFyX2JpdChwcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHNwdV9wcmlvX3dhaXQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCkBAIC0yNDQsNyArMzU4LDcgQEAKIAogCWZvciAobiA9IDA7IG4gPCBNQVhfTlVNTk9ERVM7IG4rKywgbm9kZSsrKSB7CiAJCW5vZGUgPSAobm9kZSA8IE1BWF9OVU1OT0RFUykgPyBub2RlIDogMDsKLQkJaWYgKCFub2RlX2FsbG93ZWQobm9kZSkpCisJCWlmICghbm9kZV9hbGxvd2VkKGN0eCwgbm9kZSkpCiAJCQljb250aW51ZTsKIAkJc3B1ID0gc3B1X2FsbG9jX25vZGUobm9kZSk7CiAJCWlmIChzcHUpCkBAIC0yNzYsMTUgKzM5MCwxNSBAQAogCW5vZGUgPSBjcHVfdG9fbm9kZShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlmb3IgKG4gPSAwOyBuIDwgTUFYX05VTU5PREVTOyBuKyssIG5vZGUrKykgewogCQlub2RlID0gKG5vZGUgPCBNQVhfTlVNTk9ERVMpID8gbm9kZSA6IDA7Ci0JCWlmICghbm9kZV9hbGxvd2VkKG5vZGUpKQorCQlpZiAoIW5vZGVfYWxsb3dlZChjdHgsIG5vZGUpKQogCQkJY29udGludWU7CiAKIAkJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3B1LCAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdLCBsaXN0KSB7CiAJCQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKnRtcCA9IHNwdS0+Y3R4OwogCi0JCQlpZiAodG1wLT5ydF9wcmlvcml0eSA8IGN0eC0+cnRfcHJpb3JpdHkgJiYKLQkJCSAgICAoIXZpY3RpbSB8fCB0bXAtPnJ0X3ByaW9yaXR5IDwgdmljdGltLT5ydF9wcmlvcml0eSkpCisJCQlpZiAodG1wLT5wcmlvID4gY3R4LT5wcmlvICYmCisJCQkgICAgKCF2aWN0aW0gfHwgdG1wLT5wcmlvID4gdmljdGltLT5wcmlvKSkKIAkJCQl2aWN0aW0gPSBzcHUtPmN0eDsKIAkJfQogCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwpAQCAtMzEyLDcgKzQyNiwxMCBAQAogCQkJCXZpY3RpbSA9IE5VTEw7CiAJCQkJZ290byByZXN0YXJ0OwogCQkJfQorCQkJc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJCQlzcHVfdW5iaW5kX2NvbnRleHQoc3B1LCB2aWN0aW0pOworCQkJdmljdGltLT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CisJCQlzcHUtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2grKzsKIAkJCW11dGV4X3VubG9jaygmdmljdGltLT5zdGF0ZV9tdXRleCk7CiAJCQkvKgogCQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbiBzcHVfcnVuCkBAIC0zMzgsMjIgKzQ1NSwzMCBAQAogICovCiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCi0JaWYgKGN0eC0+c3B1KQotCQlyZXR1cm4gMDsKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfU1lTVEVNKTsKIAogCWRvIHsKIAkJc3RydWN0IHNwdSAqc3B1OwogCisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgc2luZ2xlIGNvbnRleHQKKwkJICogb25seSBvbmUgYWN0dWFsbHkgYmluZHMgdGhlIGNvbnRleHQgd2hpbGUgdGhlIG90aGVycyB3aWxsCisJCSAqIG9ubHkgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBzdGF0ZV9tdXRleCBvbmNlIHRoZSBjb250ZXh0CisJCSAqIGFscmVhZHkgaXMgaW4gcnVubmFibGUgc3RhdGUuCisJCSAqLworCQlpZiAoY3R4LT5zcHUpCisJCQlyZXR1cm4gMDsKKwogCQlzcHUgPSBzcHVfZ2V0X2lkbGUoY3R4KTsKIAkJLyoKIAkJICogSWYgdGhpcyBpcyBhIHJlYWx0aW1lIHRocmVhZCB3ZSB0cnkgdG8gZ2V0IGl0IHJ1bm5pbmcgYnkKIAkJICogcHJlZW1wdGluZyBhIGxvd2VyIHByaW9yaXR5IHRocmVhZC4KIAkJICovCi0JCWlmICghc3B1ICYmIGN0eC0+cnRfcHJpb3JpdHkpCisJCWlmICghc3B1ICYmIHJ0X3ByaW8oY3R4LT5wcmlvKSkKIAkJCXNwdSA9IGZpbmRfdmljdGltKGN0eCk7CiAJCWlmIChzcHUpIHsKIAkJCXNwdV9iaW5kX2NvbnRleHQoc3B1LCBjdHgpOworCQkJc3B1X2FkZF90b19hY3RpdmVfbGlzdChzcHUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMzY5LDIzICs0OTQsMjggQEAKICAqIFJlbW92ZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBjb250ZXh0IG9uIHRoZSBydW5xdWV1ZSBhbmQgcmV0dXJuIGl0CiAgKiB0byB0aGUgY2FsbGVyLiAgUmV0dXJucyAlTlVMTCBpZiBubyBydW5uYWJsZSBjb250ZXh0IHdhcyBmb3VuZC4KICAqLwotc3RhdGljIHN0cnVjdCBzcHVfY29udGV4dCAqZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGludCBwcmlvKQorc3RhdGljIHN0cnVjdCBzcHVfY29udGV4dCAqZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGludCBwcmlvLCBpbnQgbm9kZSkKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IE5VTEw7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CiAJaW50IGJlc3Q7CiAKIAlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogCWJlc3QgPSBzY2hlZF9maW5kX2ZpcnN0X2JpdChzcHVfcHJpby0+Yml0bWFwKTsKLQlpZiAoYmVzdCA8IHByaW8pIHsKKwl3aGlsZSAoYmVzdCA8IHByaW8pIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcnEgPSAmc3B1X3ByaW8tPnJ1bnFbYmVzdF07CiAKLQkJQlVHX09OKGxpc3RfZW1wdHkocnEpKTsKLQotCQljdHggPSBsaXN0X2VudHJ5KHJxLT5uZXh0LCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHJxKTsKLQkJX19zcHVfZGVsX2Zyb21fcnEoY3R4KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsIHJxLCBycSkgeworCQkJLyogWFhYKGhjaCk6IGNoZWNrIGZvciBhZmZpbml0eSBoZXJlIGFzd2VsbCAqLworCQkJaWYgKF9fbm9kZV9hbGxvd2VkKGN0eCwgbm9kZSkpIHsKKwkJCQlfX3NwdV9kZWxfZnJvbV9ycShjdHgpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJYmVzdCsrOwogCX0KKwljdHggPSBOVUxMOworIGZvdW5kOgogCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKLQogCXJldHVybiBjdHg7CiB9CiAKQEAgLTM5NSw5ICs1MjUsMTIgQEAKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKm5ldyA9IE5VTEw7CiAKIAlpZiAoc3B1KSB7Ci0JCW5ldyA9IGdyYWJfcnVubmFibGVfY29udGV4dChtYXhfcHJpbyk7CisJCW5ldyA9IGdyYWJfcnVubmFibGVfY29udGV4dChtYXhfcHJpbywgc3B1LT5ub2RlKTsKIAkJaWYgKG5ldyB8fCBmb3JjZSkgeworCQkJc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJCQlzcHVfdW5iaW5kX2NvbnRleHQoc3B1LCBjdHgpOworCQkJY3R4LT5zdGF0cy52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy52b2xfY3R4X3N3aXRjaCsrOwogCQkJc3B1X2ZyZWUoc3B1KTsKIAkJCWlmIChuZXcpCiAJCQkJd2FrZV91cCgmbmV3LT5zdG9wX3dxKTsKQEAgLTQxNyw3ICs1NTAsMTcgQEAKICAqLwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKKwkvKgorCSAqIFdlIG11c3QgbmV2ZXIgcmVhY2ggdGhpcyBmb3IgYSBub3NjaGVkIGNvbnRleHQsCisJICogYnV0IGhhbmRsZSB0aGUgY2FzZSBncmFjZWZ1bGwgaW5zdGVhZCBvZiBwYW5pY2luZy4KKwkgKi8KKwlpZiAoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCiAJX19zcHVfZGVhY3RpdmF0ZShjdHgsIDEsIE1BWF9QUklPKTsKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfVVNFUik7CiB9CiAKIC8qKgpAQCAtNDMyLDU2ICs1NzUsMTc4IEBACiB7CiAJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkpIHsKIAkJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7Ci0JCV9fc3B1X2RlYWN0aXZhdGUoY3R4LCAwLCBNQVhfUFJJTyk7CisJCWlmIChfX3NwdV9kZWFjdGl2YXRlKGN0eCwgMCwgTUFYX1BSSU8pKQorCQkJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1VTRVIpOworCQllbHNlIHsKKwkJCXNwdWN0eF9zd2l0Y2hfc3RhdGUoY3R4LCBTUFVDVFhfVVRJTF9MT0FERUQpOworCQkJc3B1X3N3aXRjaF9zdGF0ZShjdHgtPnNwdSwgU1BVX1VUSUxfVVNFUik7CisJCX0KIAkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKIAl9CiB9CiAKLXZvaWQgc3B1X3NjaGVkX3RpY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgc3B1c2NoZWRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHNjaGVkX3dvcmsud29yayk7Ci0JaW50IHByZWVtcHRlZDsKLQotCS8qCi0JICogSWYgdGhpcyBjb250ZXh0IGlzIGJlaW5nIHN0b3BwZWQgYXZvaWQgcmVzY2hlZHVsaW5nIGZyb20gdGhlCi0JICogc2NoZWR1bGVyIHRpY2sgYmVjYXVzZSB3ZSB3b3VsZCBibG9jayBvbiB0aGUgc3RhdGVfbXV0ZXguCi0JICogVGhlIGNhbGxlciB3aWxsIHlpZWxkIHRoZSBzcHUgbGF0ZXIgb24gYW55d2F5LgotCSAqLwotCWlmICh0ZXN0X2JpdChTUFVfU0NIRURfRVhJVElORywgJmN0eC0+c2NoZWRfZmxhZ3MpKQorCWlmIChjdHgtPmZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQorCQlyZXR1cm47CisJaWYgKGN0eC0+cG9saWN5ID09IFNDSEVEX0ZJRk8pCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwotCXByZWVtcHRlZCA9IF9fc3B1X2RlYWN0aXZhdGUoY3R4LCAwLCBjdHgtPnByaW8gKyAxKTsKLQltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOworCWlmICgtLWN0eC0+dGltZV9zbGljZSkKKwkJcmV0dXJuOwogCi0JaWYgKHByZWVtcHRlZCkgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGJyZWFrIG91dCBvZiB0aGUgd2FpdCBsb29wIGluIHNwdV9ydW4gbWFudWFsbHkKLQkJICogdG8gZW5zdXJlIHRoaXMgY29udGV4dCBnZXRzIHB1dCBvbiB0aGUgcnVucXVldWUgYWdhaW4KLQkJICogQVNBUC4KLQkJICovCi0JCXdha2VfdXAoJmN0eC0+c3RvcF93cSk7CisJLyoKKwkgKiBVbmZvcnR1bmF0ZWx5IGFjdGl2ZV9tdXRleCByYW5rcyBvdXRzaWRlIG9mIHN0YXRlX211dGV4LCBzbworCSAqIHdlIGhhdmUgdG8gdHJ5bG9jayBoZXJlLiAgSWYgd2UgZmFpbCBnaXZlIHRoZSBjb250ZXh0IGFub3RoZXIKKwkgKiB0aWNrIGFuZCB0cnkgYWdhaW4uCisJICovCisJaWYgKG11dGV4X3RyeWxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpKSB7CisJCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKm5ldzsKKworCQluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQoY3R4LT5wcmlvICsgMSwgc3B1LT5ub2RlKTsKKwkJaWYgKG5ldykgeworCisJCQlfX3NwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzcHUpOworCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwkJCWN0eC0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CisJCQlzcHVfZnJlZShzcHUpOworCQkJd2FrZV91cCgmbmV3LT5zdG9wX3dxKTsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIGJyZWFrIG91dCBvZiB0aGUgd2FpdCBsb29wIGluCisJCQkgKiBzcHVfcnVuIG1hbnVhbGx5IHRvIGVuc3VyZSB0aGlzIGNvbnRleHQKKwkJCSAqIGdldHMgcHV0IG9uIHRoZSBydW5xdWV1ZSBhZ2FpbiBBU0FQLgorCQkJICovCisJCQl3YWtlX3VwKCZjdHgtPnN0b3Bfd3EpOworCQl9CisJCXNwdV9zZXRfdGltZXNsaWNlKGN0eCk7CisJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAJfSBlbHNlIHsKLQkJc3B1X3N0YXJ0X3RpY2soY3R4KTsKKwkJY3R4LT50aW1lX3NsaWNlKys7CiAJfQogfQogCisvKioKKyAqIGNvdW50X2FjdGl2ZV9jb250ZXh0cyAtIGNvdW50IG5yIG9mIGFjdGl2ZSB0YXNrcworICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhc2tzIGN1cnJlbnRseSBydW5uaW5nIG9yIHdhaXRpbmcgdG8gcnVuLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCB0YWtlIHJ1bnFfbG9jayAvIGFjdGl2ZV9tdXRleCBoZXJlLiAgUmVhZGluZworICogYSBzaW5nbGUgMzJiaXQgdmFsdWUgaXMgYXRvbWljIG9uIHBvd2VycGMsIGFuZCB3ZSBkb24ndCBjYXJlCisgKiBhYm91dCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzIGhlcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvdW50X2FjdGl2ZV9jb250ZXh0cyh2b2lkKQoreworCWludCBucl9hY3RpdmUgPSAwLCBub2RlOworCisJZm9yIChub2RlID0gMDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKQorCQlucl9hY3RpdmUgKz0gc3B1X3ByaW8tPm5yX2FjdGl2ZVtub2RlXTsKKwlucl9hY3RpdmUgKz0gc3B1X3ByaW8tPm5yX3dhaXRpbmc7CisKKwlyZXR1cm4gbnJfYWN0aXZlOworfQorCisvKioKKyAqIHNwdV9jYWxjX2xvYWQgLSBnaXZlbiB0aWNrIGNvdW50LCB1cGRhdGUgdGhlIGF2ZW5ydW4gbG9hZCBlc3RpbWF0ZXMuCisgKiBAdGljazoJdGljayBjb3VudAorICoKKyAqIE5vIGxvY2tpbmcgYWdhaW5zdCByZWFkaW5nIHRoZXNlIHZhbHVlcyBmcm9tIHVzZXJzcGFjZSwgYXMgZm9yCisgKiB0aGUgQ1BVIGxvYWRhdmcgY29kZS4KKyAqLworc3RhdGljIHZvaWQgc3B1X2NhbGNfbG9hZCh1bnNpZ25lZCBsb25nIHRpY2tzKQoreworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3Rhc2tzOyAvKiBmaXhlZC1wb2ludCAqLworCXN0YXRpYyBpbnQgY291bnQgPSBMT0FEX0ZSRVE7CisKKwljb3VudCAtPSB0aWNrczsKKworCWlmICh1bmxpa2VseShjb3VudCA8IDApKSB7CisJCWFjdGl2ZV90YXNrcyA9IGNvdW50X2FjdGl2ZV9jb250ZXh0cygpICogRklYRURfMTsKKwkJZG8geworCQkJQ0FMQ19MT0FEKHNwdV9hdmVucnVuWzBdLCBFWFBfMSwgYWN0aXZlX3Rhc2tzKTsKKwkJCUNBTENfTE9BRChzcHVfYXZlbnJ1blsxXSwgRVhQXzUsIGFjdGl2ZV90YXNrcyk7CisJCQlDQUxDX0xPQUQoc3B1X2F2ZW5ydW5bMl0sIEVYUF8xNSwgYWN0aXZlX3Rhc2tzKTsKKwkJCWNvdW50ICs9IExPQURfRlJFUTsKKwkJfSB3aGlsZSAoY291bnQgPCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwdXNjaGVkX3dha2UodW5zaWduZWQgbG9uZyBkYXRhKQoreworCW1vZF90aW1lcigmc3B1c2NoZWRfdGltZXIsIGppZmZpZXMgKyBTUFVTQ0hFRF9USUNLKTsKKwl3YWtlX3VwX3Byb2Nlc3Moc3B1c2NoZWRfdGFzayk7CisJc3B1X2NhbGNfbG9hZChTUFVTQ0hFRF9USUNLKTsKK30KKworc3RhdGljIGludCBzcHVzY2hlZF90aHJlYWQodm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBzcHUgKnNwdSwgKm5leHQ7CisJaW50IG5vZGU7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCQlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspIHsKKwkJCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwdSwgbmV4dCwKKwkJCQkJCSAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdLAorCQkJCQkJIGxpc3QpCisJCQkJc3B1c2NoZWRfdGljayhzcHUtPmN0eCk7CisJCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTE9BRF9JTlQoeCkgKCh4KSA+PiBGU0hJRlQpCisjZGVmaW5lIExPQURfRlJBQyh4KSBMT0FEX0lOVCgoKHgpICYgKEZJWEVEXzEtMSkpICogMTAwKQorCitzdGF0aWMgaW50IHNob3dfc3B1X2xvYWRhdmcoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCWludCBhLCBiLCBjOworCisJYSA9IHNwdV9hdmVucnVuWzBdICsgKEZJWEVEXzEvMjAwKTsKKwliID0gc3B1X2F2ZW5ydW5bMV0gKyAoRklYRURfMS8yMDApOworCWMgPSBzcHVfYXZlbnJ1blsyXSArIChGSVhFRF8xLzIwMCk7CisKKwkvKgorCSAqIE5vdGUgdGhhdCBsYXN0X3BpZCBkb2Vzbid0IHJlYWxseSBtYWtlIG11Y2ggc2Vuc2UgZm9yIHRoZQorCSAqIFNQVSBsb2FkYXZnIChpdCBldmVuIHNlZW1zIHZlcnkgb2RkIG9uIHRoZSBDUFUgc2lkZS4uKSwKKwkgKiBidXQgd2UgaW5jbHVkZSBpdCBoZXJlIHRvIGhhdmUgYSAxMDAlIGNvbXBhdGlibGUgaW50ZXJmYWNlLgorCSAqLworCXNlcV9wcmludGYocywgIiVkLiUwMmQgJWQuJTAyZCAlZC4lMDJkICVsZC8lZCAlZFxuIiwKKwkJTE9BRF9JTlQoYSksIExPQURfRlJBQyhhKSwKKwkJTE9BRF9JTlQoYiksIExPQURfRlJBQyhiKSwKKwkJTE9BRF9JTlQoYyksIExPQURfRlJBQyhjKSwKKwkJY291bnRfYWN0aXZlX2NvbnRleHRzKCksCisJCWF0b21pY19yZWFkKCZucl9zcHVfY29udGV4dHMpLAorCQljdXJyZW50LT5uc3Byb3h5LT5waWRfbnMtPmxhc3RfcGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVfbG9hZGF2Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzaG93X3NwdV9sb2FkYXZnLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1X2xvYWRhdmdfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVfbG9hZGF2Z19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCiBpbnQgX19pbml0IHNwdV9zY2hlZF9pbml0KHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQlzcHVfc2NoZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic3B1c2NoZWQiKTsKLQlpZiAoIXNwdV9zY2hlZF93cSkKLQkJcmV0dXJuIDE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwlpbnQgZXJyID0gLUVOT01FTSwgaTsKIAogCXNwdV9wcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwdV9wcmlvX2FycmF5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcHVfcHJpbykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIHByaW9yaXR5IHF1ZXVlLlxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCSAgICAgICBkZXN0cm95X3dvcmtxdWV1ZShzcHVfc2NoZWRfd3EpOwotCQlyZXR1cm4gMTsKLQl9CisJaWYgKCFzcHVfcHJpbykKKwkJZ290byBvdXQ7CisKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1BSSU87IGkrKykgewogCQlJTklUX0xJU1RfSEVBRCgmc3B1X3ByaW8tPnJ1bnFbaV0pOwogCQlfX2NsZWFyX2JpdChpLCBzcHVfcHJpby0+Yml0bWFwKTsKQEAgLTQ5Miw3ICs3NTcsMzAgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtpXSk7CiAJfQogCXNwaW5fbG9ja19pbml0KCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKworCXNldHVwX3RpbWVyKCZzcHVzY2hlZF90aW1lciwgc3B1c2NoZWRfd2FrZSwgMCk7CisKKwlzcHVzY2hlZF90YXNrID0ga3RocmVhZF9ydW4oc3B1c2NoZWRfdGhyZWFkLCBOVUxMLCAic3B1c2NoZWQiKTsKKwlpZiAoSVNfRVJSKHNwdXNjaGVkX3Rhc2spKSB7CisJCWVyciA9IFBUUl9FUlIoc3B1c2NoZWRfdGFzayk7CisJCWdvdG8gb3V0X2ZyZWVfc3B1X3ByaW87CisJfQorCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgic3B1X2xvYWRhdmciLCAwLCBOVUxMKTsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIG91dF9zdG9wX2t0aHJlYWQ7CisJZW50cnktPnByb2NfZm9wcyA9ICZzcHVfbG9hZGF2Z19mb3BzOworCisJcHJfZGVidWcoInNwdXNjaGVkOiB0aWNrOiAlZCwgbWluIHRpY2tzOiAlZCwgZGVmYXVsdCB0aWNrczogJWRcbiIsCisJCQlTUFVTQ0hFRF9USUNLLCBNSU5fU1BVX1RJTUVTTElDRSwgREVGX1NQVV9USU1FU0xJQ0UpOwogCXJldHVybiAwOworCisgb3V0X3N0b3Bfa3RocmVhZDoKKwlrdGhyZWFkX3N0b3Aoc3B1c2NoZWRfdGFzayk7Cisgb3V0X2ZyZWVfc3B1X3ByaW86CisJa2ZyZWUoc3B1X3ByaW8pOworIG91dDoKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKQpAQCAtNTAwLDYgKzc4OCwxMSBAQAogCXN0cnVjdCBzcHUgKnNwdSwgKnRtcDsKIAlpbnQgbm9kZTsKIAorCXJlbW92ZV9wcm9jX2VudHJ5KCJzcHVfbG9hZGF2ZyIsIE5VTEwpOworCisJZGVsX3RpbWVyX3N5bmMoJnNwdXNjaGVkX3RpbWVyKTsKKwlrdGhyZWFkX3N0b3Aoc3B1c2NoZWRfdGFzayk7CisKIAlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspIHsKIAkJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcHUsIHRtcCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSwKQEAgLTUxMCw1ICs4MDMsNCBAQAogCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogCX0KIAlrZnJlZShzcHVfcHJpbyk7Ci0JZGVzdHJveV93b3JrcXVldWUoc3B1X3NjaGVkX3dxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKaW5kZXggMGJmNzIzZC4uNGUxOWVkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogICogVGhpcyBjb2RlIGRldmlhdGVzIGZyb20gdGhlIGRvY3VtZW50ZWQgc2VxdWVuY2UgaW4gdGhlCiAgKiBmb2xsb3dpbmcgYXNwZWN0czoKICAqCi0gKiAJMS4gVGhlIEVBIGZvciBMU0NTQSBpcyBwYXNzZWQgZnJvbSBQUEUgaW4gdGhlCisgKgkxLiBUaGUgRUEgZm9yIExTQ1NBIGlzIHBhc3NlZCBmcm9tIFBQRSBpbiB0aGUKICAqCSAgIHNpZ25hbCBub3RpZmljYXRpb24gY2hhbm5lbHMuCiAgKgkyLiBUaGUgcmVnaXN0ZXIgc3BpbGwgYXJlYSBpcyBwdWxsZWQgYnkgU1BVCiAgKgkgICBpbnRvIExTLCByYXRoZXIgdGhhbiBwdXNoZWQgYnkgUFBFLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYwppbmRleCAxOTYwMzNiLi5hZTk1Y2MxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYwpAQCAtNDQsNyArNDQsNyBAQAogCSAqICAgIFJlYWQgdGhlIFNQVV9SZEV2ZW50TXNrIGNoYW5uZWwgYW5kIHNhdmUgdG8gdGhlIExTQ1NBLgogCSAqLwogCW9mZnNldCA9IExTQ1NBX1FXX09GRlNFVChldmVudF9tYXNrKTsKLQlyZWdzX3NwaWxsW29mZnNldF0uc2xvdFswXSA9IHNwdV9yZWFkY2goU1BVX1JkRXZlbnRTdGF0TWFzayk7CisJcmVnc19zcGlsbFtvZmZzZXRdLnNsb3RbMF0gPSBzcHVfcmVhZGNoKFNQVV9SZEV2ZW50TWFzayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3RhZ19tYXNrKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IDQ3NjE3ZTguLjA4YjM1MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CkBAIC0zOSw5ICs0MCwxNyBAQAogc3RydWN0IHNwdV9jb250ZXh0X29wczsKIHN0cnVjdCBzcHVfZ2FuZzsKIAotLyogY3R4LT5zY2hlZF9mbGFncyAqLwotZW51bSB7Ci0JU1BVX1NDSEVEX0VYSVRJTkcgPSAwLAorLyoKKyAqIFRoaXMgaXMgdGhlIHN0YXRlIGZvciBzcHUgdXRpbGl6YXRpb24gcmVwb3J0aW5nIHRvIHVzZXJzcGFjZS4KKyAqIEJlY2F1c2UgdGhpcyBzdGF0ZSBpcyB2aXNpYmxlIHRvIHVzZXJzcGFjZSBpdCBtdXN0IG5ldmVyIGNoYW5nZSBhbmQgbmVlZHMKKyAqIHRvIGJlIGtlcHQgc3RyaWN0bHkgc2VwYXJhdGUgZnJvbSBhbnkgaW50ZXJuYWwgc3RhdGUga2VwdCBieSB0aGUga2VybmVsLgorICovCitlbnVtIHNwdWN0eF9leGVjdXRpb25fc3RhdGUgeworCVNQVUNUWF9VVElMX1VTRVIgPSAwLAorCVNQVUNUWF9VVElMX1NZU1RFTSwKKwlTUFVDVFhfVVRJTF9JT1dBSVQsCisJU1BVQ1RYX1VUSUxfTE9BREVELAorCVNQVUNUWF9VVElMX01BWAogfTsKIAogc3RydWN0IHNwdV9jb250ZXh0IHsKQEAgLTgxLDEzICs5MCwzNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZ2FuZ19saXN0OwogCXN0cnVjdCBzcHVfZ2FuZyAqZ2FuZzsKIAorCS8qIG93bmVyIHRocmVhZCAqLworCXBpZF90IHRpZDsKKwogCS8qIHNjaGVkdWxlciBmaWVsZHMgKi8KLSAJc3RydWN0IGxpc3RfaGVhZCBycTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkX3dvcms7CisJc3RydWN0IGxpc3RfaGVhZCBycTsKKwl1bnNpZ25lZCBpbnQgdGltZV9zbGljZTsKIAl1bnNpZ25lZCBsb25nIHNjaGVkX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcnRfcHJpb3JpdHk7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKIAlpbnQgcG9saWN5OwogCWludCBwcmlvOworCisJLyogc3RhdGlzdGljcyAqLworCXN0cnVjdCB7CisJCS8qIHVwZGF0ZXMgcHJvdGVjdGVkIGJ5IGN0eC0+c3RhdGVfbXV0ZXggKi8KKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIGV4ZWN1dGlvbl9zdGF0ZTsKKwkJdW5zaWduZWQgbG9uZyB0c3RhbXA7CQkvKiB0aW1lIG9mIGxhc3QgY3R4IHN3aXRjaCAqLworCQl1bnNpZ25lZCBsb25nIHRpbWVzW1NQVUNUWF9VVElMX01BWF07CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB2b2xfY3R4X3N3aXRjaDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGludm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWFqX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGhhc2hfZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2xiX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHNsYl9mbHRfYmFzZTsgLyogIyBhdCBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgY2xhc3MyX2ludHJfYmFzZTsgLyogIyBhdCBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIGxpYmFzc2lzdDsKKwl9IHN0YXRzOwogfTsKIAogc3RydWN0IHNwdV9nYW5nIHsKQEAgLTE3Nyw2ICsyMDcsNyBAQAogaW50IHNwdWZzX2hhbmRsZV9jbGFzczEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogCiAvKiBjb250ZXh0IG1hbmFnZW1lbnQgKi8KK2V4dGVybiBhdG9taWNfdCBucl9zcHVfY29udGV4dHM7CiBzdGF0aWMgaW5saW5lIHZvaWQgc3B1X2FjcXVpcmUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CkBAIC0yMDAsOSArMjMxLDkgQEAKIGludCBzcHVfYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CiB2b2lkIHNwdV95aWVsZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zdGFydF90aWNrKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKLXZvaWQgc3B1X3N0b3BfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zY2hlZF90aWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHNwdV9zZXRfdGltZXNsaWNlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgX19zcHVfdXBkYXRlX3NjaGVkX2luZm8oc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogaW50IF9faW5pdCBzcHVfc2NoZWRfaW5pdCh2b2lkKTsKIHZvaWQgX19leGl0IHNwdV9zY2hlZF9leGl0KHZvaWQpOwogCkBAIC0yMTAsNyArMjQxLDcgQEAKIAogLyoKICAqIHNwdWZzX3dhaXQKLSAqIAlTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCisgKglTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCiAgKgl3ZSBuZWVkIHRvIGNhbGwgc3B1X3JlbGVhc2UoY3R4KSBiZWZvcmUgc2xlZXBpbmcsIGFuZAogICoJdGhlbiBzcHVfYWNxdWlyZShjdHgpIHdoZW4gYXdva2VuLgogICovCkBAIC0yNTYsNCArMjg3LDM3IEBACiBleHRlcm4gc3RydWN0IHNwdWZzX2NvcmVkdW1wX3JlYWRlciBzcHVmc19jb3JlZHVtcF9yZWFkW107CiBleHRlcm4gaW50IHNwdWZzX2NvcmVkdW1wX251bV9ub3RlczsKIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBsaXR0bGUgYml0IHRvbyBsYXJnZSBmb3IgYW4gaW5saW5lLCBidXQKKyAqIGFzIGZhdWx0LmMgaXMgYnVpbHQgaW50byB0aGUga2VybmVsIHdlIGNhbid0IG1vdmUgaXQgb3V0IG9mCisgKiBsaW5lLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1Y3R4X3N3aXRjaF9zdGF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIG5ld19zdGF0ZSkKK3sKKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmN0eC0+c3RhdGVfbXV0ZXgpKTsKKworCWlmIChjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZSAhPSBuZXdfc3RhdGUpIHsKKwkJdW5zaWduZWQgbG9uZyBjdXJ0aW1lID0gamlmZmllczsKKworCQljdHgtPnN0YXRzLnRpbWVzW2N0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlXSArPQorCQkJCSBjdXJ0aW1lIC0gY3R4LT5zdGF0cy50c3RhbXA7CisJCWN0eC0+c3RhdHMudHN0YW1wID0gY3VydGltZTsKKwkJY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1X3N3aXRjaF9zdGF0ZShzdHJ1Y3Qgc3B1ICpzcHUsCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJaWYgKHNwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGUgIT0gbmV3X3N0YXRlKSB7CisJCXVuc2lnbmVkIGxvbmcgY3VydGltZSA9IGppZmZpZXM7CisKKwkJc3B1LT5zdGF0cy50aW1lc1tzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlXSArPQorCQkJCSBjdXJ0aW1lIC0gc3B1LT5zdGF0cy50c3RhbXA7CisJCXNwdS0+c3RhdHMudHN0YW1wID0gY3VydGltZTsKKwkJc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwl9Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCmluZGV4IDcxYTBiNDEuLjljNTA2YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAgfQogI2VuZGlmCQkJCS8qIGRlYnVnICovCiAKLSNkZWZpbmUgUE9MTF9XSElMRV9GQUxTRShfYykgCVBPTExfV0hJTEVfVFJVRSghKF9jKSkKKyNkZWZpbmUgUE9MTF9XSElMRV9GQUxTRShfYykJUE9MTF9XSElMRV9UUlVFKCEoX2MpKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNxdWlyZV9zcHVfbG9jayhzdHJ1Y3Qgc3B1ICpzcHUpCiB7CkBAIC0zODcsNiArMzg3LDE5IEBACiAJY3NhLT5wcm9iLmRtYV9xdWVyeXR5cGVfUlcgPSBpbl9iZTMyKCZwcm9iLT5kbWFfcXVlcnl0eXBlX1JXKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHB1X3RhZ3N0YXR1cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUgdGhlIFByeHlfVGFnU3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBDU0EuCisJICoKKwkgKiBJdCBpcyB1bm5lY2Vzc2FyeSB0byByZXN0b3JlIGRtYV90YWdzdGF0dXNfUiwgaG93ZXZlciwKKwkgKiBkbWFfdGFnc3RhdHVzX1IgaW4gdGhlIENTQSBpcyBhY2Nlc3NlZCB2aWEgYmFja2luZ19vcHMsIHNvCisJICogd2UgbXVzdCBzYXZlIGl0LgorCSAqLworCWNzYS0+cHJvYi5kbWFfdGFnc3RhdHVzX1IgPSBpbl9iZTMyKCZwcm9iLT5kbWFfdGFnc3RhdHVzX1IpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9tZmNfY3NyX3RzcShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKIHsKIAlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKQEAgLTE4MTIsNiArMTgyNSw3IEBACiAJc2F2ZV9tZmNfcXVldWVzKHByZXYsIHNwdSk7CS8qIFN0ZXAgMTkuICovCiAJc2F2ZV9wcHVfcXVlcnltYXNrKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjAuICovCiAJc2F2ZV9wcHVfcXVlcnl0eXBlKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjEuICovCisJc2F2ZV9wcHVfdGFnc3RhdHVzKHByZXYsIHNwdSk7ICAvKiBORVcuICAgICAqLwogCXNhdmVfbWZjX2Nzcl90c3EocHJldiwgc3B1KTsJLyogU3RlcCAyMi4gKi8KIAlzYXZlX21mY19jc3JfY21kKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjMuICovCiAJc2F2ZV9tZmNfY3NyX2F0byhwcmV2LCBzcHUpOwkvKiBTdGVwIDI0LiAqLwpAQCAtMTkzMCw3ICsxOTQ0LDcgQEAKIAlyZXNldF9zcHVfcHJpdmNudGwocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE2LiAqLwogCXJlc2V0X3NwdV9sc2xyKHByZXYsIHNwdSk7ICAgICAgICAgICAgICAvKiBTdGVwIDE3LiAqLwogCXNldHVwX21mY19zcjEocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE4LiAqLwotCXNwdV9pbnZhbGlkYXRlX3NsYnMoc3B1KTsgICAgICAgIAkvKiBTdGVwIDE5LiAqLworCXNwdV9pbnZhbGlkYXRlX3NsYnMoc3B1KTsJCS8qIFN0ZXAgMTkuICovCiAJcmVzZXRfY2hfcGFydDEocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDIwLiAqLwogCXJlc2V0X2NoX3BhcnQyKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyMS4gKi8KIAllbmFibGVfaW50ZXJydXB0cyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjIuICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCmluZGV4IGQyYzY5MDUuLjIyYjRiNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCkBAIC04LDQgKzgsNSBAQAogCXNlbGVjdCBQUENfTVBDMTA2CiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFBQQ19OQVRJVkUKKwlzZWxlY3QgUENJCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUKaW5kZXggOTAyZmViMS4uNGIzYmZhZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLW9iai15CQkJCSs9IHNldHVwLm8gdGltZS5vIHBlZ2Fzb3NfZXRoLm8KLW9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubworb2JqLXkJCQkJKz0gc2V0dXAubyB0aW1lLm8gcGVnYXNvc19ldGgubyBwY2kubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfTlZSQU0pCQkrPSBudnJhbS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKaW5kZXggZDMyZmVkYy4uMzY5MDYyNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwpAQCAtOTksNyArOTksNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKIAkJfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQotCQl8IChob3NlLT5pbmRleCA8PCAyNCk7CisJCXwgKGhvc2UtPmdsb2JhbF9udW1iZXIgPDwgMjQpOwogICAgICAgICBpbnQgcmV0ID0gLTE7CiAJaW50IHJ2YWw7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKIAkJfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQotCQl8IChob3NlLT5pbmRleCA8PCAyNCk7CisJCXwgKGhvc2UtPmdsb2JhbF9udW1iZXIgPDwgMjQpOwogCWludCBydmFsOwogCiAJcnZhbCA9IHJ0YXNfY2FsbChydGFzX3Rva2VuKCJ3cml0ZS1wY2ktY29uZmlnIiksIDMsIDEsIE5VTEwsCkBAIC0yNTQsMTMgKzI1NCwxMiBAQAogCQkJcHJpbnRrKCIgYXQgJWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpci5zdGFydCk7CiAJCXByaW50aygiXG4iKTsKIAotCQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAkJaWYgKCFob3NlKSB7CiAJCQlwcmludGsoIkNhbid0IGFsbG9jYXRlIFBDSSBjb250cm9sbGVyIHN0cnVjdHVyZSBmb3IgJXNcbiIsCiAJCQkJZGV2LT5mdWxsX25hbWUpOwogCQkJY29udGludWU7CiAJCX0KLQkJaG9zZS0+YXJjaF9kYXRhID0gZGV2OwogCQlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZVswXTsKIAkJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZVsxXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCmluZGV4IGYyZDI2MjYuLmJlYzc3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKQEAgLTI4LDYgKzI4LDcgQEAKIAlib29sICJQUEM3NTBHWC9DTCB3aXRoIFRTSTEweCBicmlkZ2UgKEhpY2tvcnkvSG9sbHkpIgogCXNlbGVjdCBUU0kxMDhfQlJJREdFCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKIAloZWxwCiAJICBTZWxlY3QgUFBDX0hPTExZIGlmIGNvbmZpZ3VyaW5nIGZvciBhbiBJQk0gNzUwR1gvQ0wgRXZhbAogCSAgQm9hcmQgd2l0aCBUU0kxMDgvOSBicmlkZ2UgKEhpY2tvcnkvSG9sbHkpCkBAIC00NCw2ICs0NSw3IEBACiBjb25maWcgVFNJMTA4X0JSSURHRQogCWJvb2wKIAlkZXBlbmRzIG9uIE1QQzc0NDhIUEMyIHx8IFBQQ19IT0xMWQorCXNlbGVjdCBQQ0kKIAlzZWxlY3QgTVBJQwogCXNlbGVjdCBNUElDX1dFSVJECiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKaW5kZXggM2EwYjRhMC4uNjI5MmUzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwpAQCAtNDUsNyArNDUsNyBAQAogCiAjZGVmaW5lIEhPTExZX1BDSV9DRkdfUEhZUyAweDdjMDAwMDAwCiAKLWludCBob2xseV9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitpbnQgaG9sbHlfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCmluZGV4IGI0MTJmMDAuLmY0ZDBhN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKQEAgLTU0LDggKzU0LDkgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGxpbmtzdGF0aW9uX2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CisjaWZkZWYgQ09ORklHX1BDSQogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCWNvbnN0IGludCAqYnVzX3JhbmdlOwpAQCAtNjcsMTggKzY4LDE3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCQkJIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAlpZiAoaG9zZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwogCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwKTsKIAogCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KIAkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgMSk7Ci0KKyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC05Miw3ICs5Miw3IEBACiAKIAkvKiBMb29rdXAgUENJIGhvc3QgYnJpZGdlcyAqLwogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCWxpbmtzdGF0aW9uX2FkZF9icmlkZ2UobnApOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQlVGRkFMTyBOZXR3b3JrIEF0dGFjaGVkIFN0b3JhZ2UgU2VyaWVzXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICIoQykgMjAwMi0yMDA1IEJVRkZBTE8gSU5DLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwppbmRleCA0NTQyZTBjOC4uMWUzY2M2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCkBAIC01NCwxNSArNTQsMTAgQEAKIAogI2RlZmluZSBNUEM3NDQ4SFBDMl9QQ0lfQ0ZHX1BIWVMgMHhmYjAwMDAwMAogCi0jaWZuZGVmIENPTkZJR19QQ0kKLWlzYV9pb19iYXNlID0gTVBDNzQ0OF9IUEMyX0lTQV9JT19CQVNFOwotaXNhX21lbV9iYXNlID0gTVBDNzQ0OF9IUEMyX0lTQV9NRU1fQkFTRTsKLXBjaV9kcmFtX29mZnNldCA9IE1QQzc0NDhfSFBDMl9QQ0lfTUVNX09GRlNFVDsKLSNlbmRpZgotCiBleHRlcm4gdm9pZCBfbm1hc2tfYW5kX29yX21zcih1bnNpZ25lZCBsb25nIG5tYXNrLCB1bnNpZ25lZCBsb25nIG9yX3ZhbCk7CiAKLWludCBtcGM3NDQ4X2hwYzJfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IG1wYzc0NDhfaHBjMl9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewogCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5oCmluZGV4IGE1NDNhNTIuLmY3ZTBlMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuaApAQCAtMTgsOSArMTgsNCBAQAogCiAjaW5jbHVkZSA8YXNtL3BwY2Jvb3QuaD4KIAotLyogQmFzZSBBZGRyZXNzZXMgZm9yIHRoZSBQQ0kgYnVzCi0gKi8KLSNkZWZpbmUgTVBDNzQ0OF9IUEMyX1BDSV9NRU1fT0ZGU0VUCSgweDAwMDAwMDAwKQotI2RlZmluZSBNUEM3NDQ4X0hQQzJfSVNBX0lPX0JBU0UJKDB4MDAwMDAwMDApCi0jZGVmaW5lIE1QQzc0NDhfSFBDMl9JU0FfTUVNX0JBU0UJKDB4MDAwMDAwMDApCiAjZW5kaWYJCQkJLyogX19QUENfUExBVEZPUk1TX01QQzc0NDhfSFBDMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9jYWxsX2hwdC5oCmluZGV4IGE4NDNiMGYuLjhkOTVmZTRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaApAQCAtNzYsMjQgKzc2LDI1IEBACiAJcmV0dXJuIGNvbXByZXNzZWRTdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kVmFsaWQoaHB0ZV90ICpocHRlLCB1NjQgdnBuKQorc3RhdGljIGlubGluZSB1NjQgSHZDYWxsSHB0X2ZpbmRWYWxpZChzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHU2NCB2cG4pCiB7CiAJcmV0dXJuIEh2Q2FsbDNSZXQxNihIdkNhbGxIcHRGaW5kVmFsaWQsIGhwdGUsIHZwbiwgMCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKK3N0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKHN0cnVjdCBoYXNoX3B0ZSAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKIAkJdTggYml0c29uLCB1OCBiaXRzb2ZmKQogewogCXJldHVybiBIdkNhbGwzUmV0MTYoSHZDYWxsSHB0RmluZE5leHRWYWxpZCwgaHB0ZSwgaHB0ZUluZGV4LAogCQkJYml0c29uLCBiaXRzb2ZmKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoaHB0ZV90ICpocHRlLCB1MzIgaHB0ZUluZGV4KQorc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoc3RydWN0IGhhc2hfcHRlICpocHRlLCB1MzIgaHB0ZUluZGV4KQogewogCUh2Q2FsbDJSZXQxNihIdkNhbGxIcHRHZXQsIGhwdGUsIGhwdGVJbmRleCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfYWRkVmFsaWRhdGUodTMyIGhwdGVJbmRleCwgdTMyIGhCaXQsIGhwdGVfdCAqaHB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfYWRkVmFsaWRhdGUodTMyIGhwdGVJbmRleCwgdTMyIGhCaXQsCisJCQkJCSBzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUpCiB7CiAJSHZDYWxsNChIdkNhbGxIcHRBZGRWYWxpZGF0ZSwgaHB0ZUluZGV4LCBoQml0LCBocHRlLT52LCBocHRlLT5yKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jCmluZGV4IGVkNDRkZmMuLmI0ZTJjN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h0YWIuYwpAQCAtNDQsNyArNDQsNyBAQAogCQkJIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpCiB7CiAJbG9uZyBzbG90OwotCWhwdGVfdCBsaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgbGhwdGU7CiAJaW50IHNlY29uZGFyeSA9IDA7CiAKIAlCVUdfT04ocHNpemUgIT0gTU1VX1BBR0VfNEspOwpAQCAtOTksNyArOTksNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpU2VyaWVzX2hwdGVfZ2V0d29yZDAodW5zaWduZWQgbG9uZyBzbG90KQogewotCWhwdGVfdCBocHRlOworCXN0cnVjdCBoYXNoX3B0ZSBocHRlOwogCiAJSHZDYWxsSHB0X2dldCgmaHB0ZSwgc2xvdCk7CiAJcmV0dXJuIGhwdGUudjsKQEAgLTE0NCw3ICsxNDQsNyBAQAogc3RhdGljIGxvbmcgaVNlcmllc19ocHRlX3VwZGF0ZXBwKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyBuZXdwcCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSwgaW50IGxvY2FsKQogewotCWhwdGVfdCBocHRlOworCXN0cnVjdCBoYXNoX3B0ZSBocHRlOwogCXVuc2lnbmVkIGxvbmcgd2FudF92OwogCiAJaVNlcmllc19obG9jayhzbG90KTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogICovCiBzdGF0aWMgbG9uZyBpU2VyaWVzX2hwdGVfZmluZCh1bnNpZ25lZCBsb25nIHZwbikKIHsKLQlocHRlX3QgaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgaHB0ZTsKIAlsb25nIHNsb3Q7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCmluZGV4IDljOTc0MjIuLmRhODcxNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKQEAgLTc0Miw2ICs3NDIsMTEgQEAKIAkvKiBJbnN0YWxsIElPIGhvb2tzICovCiAJcHBjX3BjaV9pbyA9IGlzZXJpZXNfcGNpX2lvOwogCisJLyogaVNlcmllcyBoYXMgbm8gSU8gc3BhY2UgaW4gdGhlIGNvbW1vbiBzZW5zZSwgaXQgbmVlZHMgdG8gc2V0CisJICogdGhlIElPIGJhc2UgdG8gMAorCSAqLworCXBjaV9pb19iYXNlID0gMDsKKwogCWlmIChyb290ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiaVNlcmllc19wY2liaW9zX2luaXQ6IGNhbid0IGZpbmQgcm9vdCAiCiAJCQkJIm9mIGRldmljZSB0cmVlXG4iKTsKQEAgLTc2Myw3ICs3NjgsNyBAQAogCQlpZiAocGhiID09IE5VTEwpCiAJCQljb250aW51ZTsKIAotCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gcGhiLT5sb2NhbF9udW1iZXIgPSBidXM7CisJCXBoYi0+cGNpX21lbV9vZmZzZXQgPSBidXM7CiAJCXBoYi0+Zmlyc3RfYnVzbm8gPSBidXM7CiAJCXBoYi0+bGFzdF9idXNubyA9IGJ1czsKIAkJcGhiLT5vcHMgPSAmaVNlcmllc19wY2lfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCA3ZjVkY2VlLi4xM2E4YjE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNzksOCArNzksNiBAQAogc3RhdGljIHZvaWQgaVNlcmllc19wY2lfZmluYWxfZml4dXAodm9pZCkgeyB9CiAjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90YjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGl0YW47CiAKIHN0cnVjdCBNZW1vcnlCbG9jayB7CiAJdW5zaWduZWQgbG9uZyBhYnNTdGFydDsKQEAgLTI5Miw4ICsyOTAsOCBAQAogewogCURCRygiIC0+IGlTZXJpZXNfaW5pdF9lYXJseSgpXG4iKTsKIAotCWlTZXJpZXNfcmVjYWxfdGIgPSBnZXRfdGIoKTsKLQlpU2VyaWVzX3JlY2FsX3RpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOworCS8qIFNuYXBzaG90IHRoZSB0aW1lYmFzZSwgZm9yIHVzZSBpbiBsYXRlciByZWNhbGlicmF0aW9uICovCisJaVNlcmllc190aW1lX2luaXRfZWFybHkoKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgRE1BL1RDRSBtYW5hZ2VtZW50CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYwppbmRleCA3YWFhNWJiLi5mY2VhYWU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCXUzX2h0ID0gaG9zZTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IG1hcGxlX2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC01MTksMjMgKzUxOSw2IEBACiAJREJHKCIgPC0gbWFwbGVfcGNpX2lycV9maXh1cFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtYXBsZV9maXh1cF9waGJfcmVzb3VyY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewotCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCi0JCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICs9IG9mZnNldDsKLQkJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IG9mZnNldDsKLQotCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgSG9zdCAlZCwgaW8gc3RhcnQ6ICVsbHg7IGlvIGVuZDogJWxseFxuIiwKLQkJICAgICAgIGhvc2UtPmdsb2JhbF9udW1iZXIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLQogdm9pZCBfX2luaXQgbWFwbGVfcGNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcm9vdDsKQEAgLTU1OCw3ICs1NDEsNyBAQAogCQkJY29udGludWU7CiAJCWlmICgob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ1NC1wY2llIikgfHwKIAkJICAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInUzLWFncCIpKSAmJgotCQkgICAgYWRkX2JyaWRnZShucCkgPT0gMCkKKwkJICAgIG1hcGxlX2FkZF9icmlkZ2UobnApID09IDApCiAJCQlvZl9ub2RlX2dldChucCk7CiAKIAkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAidTMtaHQiKSkgewpAQCAtNTcwLDI3ICs1NTMsOSBAQAogCiAJLyogTm93IHNldHVwIHRoZSBIeXBlclRyYW5zcG9ydCBob3N0IGlmIHdlIGZvdW5kIGFueQogCSAqLwotCWlmIChodCAmJiBhZGRfYnJpZGdlKGh0KSAhPSAwKQorCWlmIChodCAmJiBtYXBsZV9hZGRfYnJpZGdlKGh0KSAhPSAwKQogCQlvZl9ub2RlX3B1dChodCk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbmVlZCB0byBjYWxsIHBjaV9zZXR1cF9waGJfaW8gZm9yIHRoZSBIVCBicmlkZ2UgZmlyc3QKLSAgICAgICAgICogc28gaXQgZ2V0cyB0aGUgSS9PIHBvcnQgbnVtYmVycyBzdGFydGluZyBhdCAwLCBhbmQgd2UKLSAgICAgICAgICogbmVlZCB0byBjYWxsIGl0IGZvciB0aGUgQUdQIGJyaWRnZSBhZnRlciB0aGF0IHNvIGl0IGdldHMKLSAgICAgICAgICogc21hbGwgcG9zaXRpdmUgSS9PIHBvcnQgbnVtYmVycy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh1M19odCkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHUzX2h0LCAxKTsKLSAgICAgICAgaWYgKHUzX2FncCkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHUzX2FncCwgMCk7Ci0gICAgICAgIGlmICh1NF9wY2llKQotICAgICAgICAgICAgICAgIHBjaV9zZXR1cF9waGJfaW8odTRfcGNpZSwgMCk7Ci0KLQkvKiBGaXh1cCB0aGUgSU8gcmVzb3VyY2VzIG9uIG91ciBob3N0IGJyaWRnZXMgYXMgdGhlIGNvbW1vbiBjb2RlCi0JICogZG9lcyBpdCBvbmx5IGZvciBjaGlsZHMgb2YgdGhlIGhvc3QgYnJpZGdlcwotCSAqLwotCW1hcGxlX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8gCiAJcGNpX2RldnNfcGhiX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcKaW5kZXggN2M1MDc2ZS4uOTVjZDkwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCkBAIC0yNSw0ICsyNSwxMyBAQAogCWhlbHAKIAkgIERyaXZlciBmb3IgTURJTyB2aWEgR1BJTyBvbiBQV1JmaWNpZW50IHBsYXRmb3JtcwogCitjb25maWcgRUxFQ1RSQV9JREUKKyAgICAgIHRyaXN0YXRlICJFbGVjdHJhIElERSBkcml2ZXIiCisgICAgICBkZWZhdWx0IHkKKyAgICAgIGRlcGVuZHMgb24gUFBDX1BBU0VNSSAmJiBBVEEKKyAgICAgIHNlbGVjdCBQQVRBX1BMQVRGT1JNCisgICAgICBoZWxwCisJVGhpcyBpbmNsdWRlcyBkcml2ZXIgc3VwcG9ydCBmb3IgdGhlIEVsZWN0cmEgb24tYm9hcmQgSURFCisJaW50ZXJmYWNlLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCmluZGV4IDJjZDJhNGYuLmY0N2ZjYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAogb2JqLXkJKz0gc2V0dXAubyBwY2kubyB0aW1lLm8gaWRsZS5vIHBvd2Vyc2F2ZS5vIGlvbW11Lm8KIG9iai0kKENPTkZJR19QUENfUEFTRU1JX01ESU8pCSs9IGdwaW9fbWRpby5vCitvYmotJChDT05GSUdfRUxFQ1RSQV9JREUpICs9IGVsZWN0cmFfaWRlLm8KIG9iai0kKENPTkZJR19QUENfUEFTRU1JX0NQVUZSRVEpICs9IGNwdWZyZXEubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZWxlY3RyYV9pZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmYjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBQQSBTZW1pLCBJbmMKKyAqCisgKiBNYWludGFpbmVkIGJ5OiBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIFRoZSBlbGVjdHJhIElERSBpbnRlcmZhY2UgaXMgaW5jcmVkaWJseSBzaW1wbGU6IEp1c3QgYSBkZXZpY2Ugb24gdGhlIGxvY2FsYnVzCisgKiB3aXRoIGludGVycnVwdHMgaG9va2VkIHVwIHRvIG9uZSBvZiB0aGUgR1BJT3MuIFRoZSBkZXZpY2UgdHJlZSBjb250YWlucyB0aGUKKyAqIGFkZHJlc3Mgd2luZG93IGFuZCBpbnRlcnJ1cHQgbWFwcGluZ3MgYWxyZWFkeSwgYW5kIHRoZSBwYXRhX3BsYXRmb3JtIGRyaXZlciBoYW5kbGVzCisgKiB0aGUgcmVzdC4gV2UganVzdCBuZWVkIHRvIGhvb2sgdGhlIHR3byB1cC4KKyAqLworCisjZGVmaW5lIE1BWF9JRlMJNAkvKiByZWFsbHksIHdlIGhhdmUgb25seSBvbmUgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZzW01BWF9JRlNdOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbGVjdHJhX2lkZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgclszXTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgImlkZSIsICJlbGVjdHJhLWlkZSIpOworCWkgPSAwOworCisJd2hpbGUgKG5wICYmIGkgPCBNQVhfSUZTKSB7CisJCW1lbXNldChyLCAwLCBzaXplb2YocikpOworCisJCS8qIHBhdGFfcGxhdGZvcm0gd2FudHMgdHdvIGFkZHJlc3MgcmFuZ2VzOiBvbmUgZm9yIHRoZSBiYXNlIHJlZ2lzdGVycywKKwkJICogYW5vdGhlciBmb3IgdGhlIGNvbnRyb2wgKGFsdHN0YXR1cykuIEl0J3MgbG9jYXRlZCBhdCBvZmZzZXQgMHgzZjYgaW4KKwkJICogdGhlIHdpbmRvdywgYnV0IHRoZSBkZXZpY2UgdHJlZSBvbmx5IGhhcyBvbmUgbGFyZ2UgcmVnaXN0ZXIgd2luZG93CisJCSAqIHRoYXQgY292ZXJzIGJvdGggcmFuZ2VzLiBTbyB3ZSBuZWVkIHRvIHNwbGl0IGl0IHVwIGJ5IGhhbmQgaGVyZToKKwkJICovCisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXJbMV0uc3RhcnQgKz0gMHgzZjY7CisJCXJbMF0uZW5kID0gclsxXS5zdGFydC0xOworCisJCXJbMl0uc3RhcnQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJCXJbMl0uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCQlyWzJdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisKKwkJcHJfZGVidWcoInJlZ2lzdGVyaW5nIHBsYXRmb3JtIGRldmljZSBhdCAweCVseC8weCVseCwgaXJxIGlzICVsZFxuIiwKKwkJCSByWzBdLnN0YXJ0LCByWzFdLnN0YXJ0LCByWzJdLnN0YXJ0KTsKKwkJcGRldnNbaV0gPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJwYXRhX3BsYXRmb3JtIiwgaSwgciwgMyk7CisJCWlmIChJU19FUlIocGRldnNbaV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBkZXZzW2ldKTsKKwkJCXBkZXZzW2ldID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJpZGUiLCAiZWxlY3RyYS1pZGUiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGVsZWN0cmFfaWRlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZWxlY3RyYV9pZGVfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9JRlM7IGkrKykKKwkJaWYgKHBkZXZzW2ldKQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldnNbaV0pOworfQorbW9kdWxlX2V4aXQoZWxlY3RyYV9pZGVfZXhpdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUiAoIk9sb2YgSm9oYW5zc29uIDxvbG9mQGxpeG9tLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUEEgU2VtaSBFbGVjdHJhIElERSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKaW5kZXggYmJjNmRmYy4uYWIxZjVmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcCgweGUwMDAwMDAwLCAweDEwMDAwMDAwKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IHBhc19hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIApAQCAtMTUwLDI5ICsxNTAsMTEgQEAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBQQS1QWFAgUENJIGhvc3QgYnJpZGdlLlxuIik7CiAKIAkvKiBJbnRlcnByZXQgdGhlICJyYW5nZXMiIHByb3BlcnR5ICovCi0JLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBkZXYsIDEpOwotCXBjaV9zZXR1cF9waGJfaW8oaG9zZSwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2luaXQgcGFzX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQkJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gb2Zmc2V0OwotCQlob3NlLT5pb19yZXNvdXJjZS5lbmQgKz0gb2Zmc2V0OwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgSG9zdCAlZCwgaW8gc3RhcnQ6ICVseDsgaW8gZW5kOiAlbHhcbiIsCi0JCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyLAotCQkgICAgICAgaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQsIGhvc2UtPmlvX3Jlc291cmNlLmVuZCk7Ci0JfQotfQotCi0KIHZvaWQgX19pbml0IHBhc19wY2lfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpyb290OwpAQCAtMTg1LDEzICsxNjcsMTEgQEAKIAl9CiAKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgbnApKSAhPSBOVUxMOykKLQkJaWYgKG5wLT5uYW1lICYmICFzdHJjbXAobnAtPm5hbWUsICJweHAiKSAmJiAhYWRkX2JyaWRnZShucCkpCisJCWlmIChucC0+bmFtZSAmJiAhc3RyY21wKG5wLT5uYW1lLCAicHhwIikgJiYgIXBhc19hZGRfYnJpZGdlKG5wKSkKIAkJCW9mX25vZGVfZ2V0KG5wKTsKIAogCW9mX25vZGVfcHV0KHJvb3QpOwogCi0JcGFzX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8KIAlwY2lfZGV2c19waGJfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwppbmRleCBjNWEzZjYxLi5mZmU2NTI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCXJldHVybiAxOwogfQogCi1kZWZpbmVfbWFjaGluZShwYXMpIHsKK2RlZmluZV9tYWNoaW5lKHBhc2VtaSkgewogCS5uYW1lCQkJPSAiUEEgU2VtaSBQQTZULTE2ODJNIiwKIAkucHJvYmUJCQk9IHBhc19wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBwYXNfc2V0dXBfYXJjaCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZwppbmRleCA1YjdhZmU1Li4wNTU5OTBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCWJvb2wgIkFwcGxlIFBvd2VyTWFjIGJhc2VkIG1hY2hpbmVzIgogCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0KIAlzZWxlY3QgTVBJQworCXNlbGVjdCBQQ0kKIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSSBpZiBQUEMzMgogCXNlbGVjdCBQUENfTVBDMTA2IGlmIFBQQzMyCiAJc2VsZWN0IFBQQ19OQVRJVkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKaW5kZXggM2Y1MDdhYi4uZWZkZjVlYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9rZXlsYXJnby5oPgogI2luY2x1ZGUgPGFzbS91bmlub3J0aC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtODQsNyArODUsNyBAQAogCXZvaWQJCQkqaG9zdGRhdGE7CiAJaW50CQkJY2hhbm5lbDsJLyogc29tZSBob3N0cyBoYXZlIG11bHRpcGxlICovCiAJaW50CQkJbW9kZTsJCS8qIGN1cnJlbnQgbW9kZSAqLwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJaW50CQkJb3BlbmVkOwogCWludAkJCXBvbGxlZDsJCS8qIG9wZW4gbW9kZSAqLwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBsYXRmb3JtX2RldjsKQEAgLTEwNCw3ICsxMDUsNyBAQAogCiBzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdwogewotCXN0cnVjdCBzZW1hcGhvcmUJbXV0ZXg7CQkvKiBBY2Nlc3MgbXV0ZXggZm9yIHVzZSBieQorCXN0cnVjdCBtdXRleAkJbXV0ZXg7CQkvKiBBY2Nlc3MgbXV0ZXggZm9yIHVzZSBieQogCQkJCQkJICogaTJjLWtleXdlc3QgKi8KIAl2b2lkIF9faW9tZW0JCSpiYXNlOwkJLyogcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCiAJaW50CQkJYnN0ZXBzOwkJLyogcmVnaXN0ZXIgc3RlcHBpbmcgKi8KQEAgLTM3NSwxNCArMzc2LDE0IEBACiBzdGF0aWMgaW50IGt3X2kyY19vcGVuKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7Ci0JZG93bigmaG9zdC0+bXV0ZXgpOworCW11dGV4X2xvY2soJmhvc3QtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQga3dfaTJjX2Nsb3NlKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7Ci0JdXAoJmhvc3QtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmhvc3QtPm11dGV4KTsKIH0KIAogc3RhdGljIGludCBrd19pMmNfeGZlcihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIHU4IGFkZHJkaXIsIGludCBzdWJzaXplLApAQCAtNDk4LDcgKzQ5OSw3IEBACiAJCWtmcmVlKGhvc3QpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaW5pdF9NVVRFWCgmaG9zdC0+bXV0ZXgpOworCW11dGV4X2luaXQoJmhvc3QtPm11dGV4KTsKIAlpbml0X2NvbXBsZXRpb24oJmhvc3QtPmNvbXBsZXRlKTsKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CiAJaW5pdF90aW1lcigmaG9zdC0+dGltZW91dF90aW1lcik7CkBAIC01NzEsNyArNTcyLDcgQEAKIAlidXMtPm9wZW4gPSBrd19pMmNfb3BlbjsKIAlidXMtPmNsb3NlID0ga3dfaTJjX2Nsb3NlOwogCWJ1cy0+eGZlciA9IGt3X2kyY194ZmVyOwotCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwltdXRleF9pbml0KCZidXMtPm11dGV4KTsKIAlpZiAoY29udHJvbGxlciA9PSBidXNub2RlKQogCQlidXMtPmZsYWdzID0gcG1hY19pMmNfbXVsdGlidXM7CiAJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CkBAIC03OTgsNyArNzk5LDcgQEAKIAkJYnVzLT5tb2RlID0gcG1hY19pMmNfbW9kZV9zdGQ7CiAJCWJ1cy0+aG9zdGRhdGEgPSBidXMgKyAxOwogCQlidXMtPnhmZXIgPSBwbXVfaTJjX3hmZXI7Ci0JCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwkJbXV0ZXhfaW5pdCgmYnVzLT5tdXRleCk7CiAJCWJ1cy0+ZmxhZ3MgPSBwbWFjX2kyY19tdWx0aWJ1czsKIAkJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CiAKQEAgLTkyMSw3ICs5MjIsNyBAQAogCQlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKIAkJYnVzLT5ob3N0ZGF0YSA9IGJ1cyArIDE7CiAJCWJ1cy0+eGZlciA9IHNtdV9pMmNfeGZlcjsKLQkJaW5pdF9NVVRFWCgmYnVzLT5zZW0pOworCQltdXRleF9pbml0KCZidXMtPm11dGV4KTsKIAkJYnVzLT5mbGFncyA9IDA7CiAJCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOwogCkBAIC0xMDkzLDEzICsxMDk0LDEzIEBACiB7CiAJaW50IHJjOwogCi0JZG93bigmYnVzLT5zZW0pOworCW11dGV4X2xvY2soJmJ1cy0+bXV0ZXgpOwogCWJ1cy0+cG9sbGVkID0gcG9sbGVkIHx8IHBtYWNfaTJjX2ZvcmNlX3BvbGw7CiAJYnVzLT5vcGVuZWQgPSAxOwogCWJ1cy0+bW9kZSA9IHBtYWNfaTJjX21vZGVfc3RkOwogCWlmIChidXMtPm9wZW4gJiYgKHJjID0gYnVzLT5vcGVuKGJ1cykpICE9IDApIHsKIAkJYnVzLT5vcGVuZWQgPSAwOwotCQl1cCgmYnVzLT5zZW0pOworCQltdXRleF91bmxvY2soJmJ1cy0+bXV0ZXgpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJldHVybiAwOwpAQCAtMTExMiw3ICsxMTEzLDcgQEAKIAlpZiAoYnVzLT5jbG9zZSkKIAkJYnVzLT5jbG9zZShidXMpOwogCWJ1cy0+b3BlbmVkID0gMDsKLQl1cCgmYnVzLT5zZW0pOworCW11dGV4X3VubG9jaygmYnVzLT5tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19jbG9zZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IGM0YWY5ZTIuLjkyNTg2ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtMzUsOCArMzUsNiBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCi1zdGF0aWMgaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwotCiAvKiBYWFggQ291bGQgYmUgcGVyLWNvbnRyb2xsZXIsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIHJpc2sgYW55dGhpbmcgYnkKICAqIGFzc3VtaW5nIHdlIHdvbid0IGhhdmUgYm90aCBVbmlOb3J0aCBhbmQgQmFuZGl0ICovCiBzdGF0aWMgaW50IGhhc191bmlub3J0aDsKQEAgLTg5Nyw3ICs4OTUsNyBAQAogICogInBjaSIgKGEgTVBDMTA2KSBhbmQgbm8gYmFuZGl0IG9yIGNoYW9zIGJyaWRnZXMsIGFuZCBjb250cmFyaXdpc2UsCiAgKiBpZiB3ZSBoYXZlIG9uZSBvciBtb3JlIGJhbmRpdCBvciBjaGFvcyBicmlkZ2VzLCB3ZSBkb24ndCBoYXZlIGEgTVBDMTA2LgogICovCi1zdGF0aWMgaW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgcG1hY19hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtOTE4LDE1ICs5MTYsOSBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCS8qIFhYWCBEaWZmZXJlbnQgcHJvdG90eXBlcywgdG8gYmUgbWVyZ2VkICovCi0jaWZkZWYgQ09ORklHX1BQQzY0CiAJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwotI2Vsc2UKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7Ci0jZW5kaWYKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwotCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKQEAgLTEwMDYsMTkgKzk5OCw2IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiB9CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLXN0YXRpYyB2b2lkIF9faW5pdCBwbWFjX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIEhvc3QgJWQsIGlvIHN0YXJ0OiAlbHg7IGlvIGVuZDogJWx4XG4iLAotCQkgICAgICAgaG9zZS0+Z2xvYmFsX251bWJlciwKLQkJICAgICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLSNlbmRpZgotCiB2b2lkIF9faW5pdCBwbWFjX3BjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnJvb3Q7CkBAIC0xMDM2LDcgKzEwMTUsNyBAQAogCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAiYmFuZGl0IikgPT0gMAogCQkgICAgfHwgc3RyY21wKG5wLT5uYW1lLCAiY2hhb3MiKSA9PSAwCiAJCSAgICB8fCBzdHJjbXAobnAtPm5hbWUsICJwY2kiKSA9PSAwKSB7Ci0JCQlpZiAoYWRkX2JyaWRnZShucCkgPT0gMCkKKwkJCWlmIChwbWFjX2FkZF9icmlkZ2UobnApID09IDApCiAJCQkJb2Zfbm9kZV9nZXQobnApOwogCQl9CiAJCWlmIChzdHJjbXAobnAtPm5hbWUsICJodCIpID09IDApIHsKQEAgLTEwNTAsMjggKzEwMjksOSBAQAogCS8qIFByb2JlIEhUIGxhc3QgYXMgaXQgcmVsaWVzIG9uIHRoZSBhZ3AgcmVzb3VyY2VzIHRvIGJlIGFscmVhZHkKIAkgKiBzZXR1cAogCSAqLwotCWlmIChodCAmJiBhZGRfYnJpZGdlKGh0KSAhPSAwKQorCWlmIChodCAmJiBwbWFjX2FkZF9icmlkZ2UoaHQpICE9IDApCiAJCW9mX25vZGVfcHV0KGh0KTsKIAotCS8qCi0JICogV2UgbmVlZCB0byBjYWxsIHBjaV9zZXR1cF9waGJfaW8gZm9yIHRoZSBIVCBicmlkZ2UgZmlyc3QKLQkgKiBzbyBpdCBnZXRzIHRoZSBJL08gcG9ydCBudW1iZXJzIHN0YXJ0aW5nIGF0IDAsIGFuZCB3ZQotCSAqIG5lZWQgdG8gY2FsbCBpdCBmb3IgdGhlIEFHUCBicmlkZ2UgYWZ0ZXIgdGhhdCBzbyBpdCBnZXRzCi0JICogc21hbGwgcG9zaXRpdmUgSS9PIHBvcnQgbnVtYmVycy4KLQkgKi8KLQlpZiAodTNfaHQpCi0JCXBjaV9zZXR1cF9waGJfaW8odTNfaHQsIDEpOwotCWlmICh1M19hZ3ApCi0JCXBjaV9zZXR1cF9waGJfaW8odTNfYWdwLCAwKTsKLQlpZiAodTRfcGNpZSkKLQkJcGNpX3NldHVwX3BoYl9pbyh1NF9wY2llLCAwKTsKLQotCS8qCi0JICogT24gcHBjNjQsIGZpeHVwIHRoZSBJTyByZXNvdXJjZXMgb24gb3VyIGhvc3QgYnJpZGdlcyBhcwotCSAqIHRoZSBjb21tb24gY29kZSBkb2VzIGl0IG9ubHkgZm9yIGNoaWxkcmVuIG9mIHRoZSBob3N0IGJyaWRnZXMKLQkgKi8KLQlwbWFjX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8KIAlwY2lfZGV2c19waGJfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwppbmRleCA0MGYwMDA4Li5hMDUwNzliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAJc2VsZWN0IFVTQl9PSENJX0JJR19FTkRJQU5fTU1JTwogCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KKwlzZWxlY3QgTUVNT1JZX0hPVFBMVUcKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTb255IFBTMyBnYW1lIGNvbnNvbGUKIAkgIGFuZCBvdGhlciBwbGF0Zm9ybXMgdXNpbmcgdGhlIFBTMyBoeXBlcnZpc29yLgpAQCAtNzMsMTggKzc0LDEyIEBACiAKIGNvbmZpZyBQUzNfVlVBUlQKIAlkZXBlbmRzIG9uIFBQQ19QUzMKLQlib29sICJQUzMgVmlydHVhbCBVQVJUIHN1cHBvcnQiIGlmIFBTM19BRFZBTkNFRAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBTMyBWaXJ0dWFsIFVBUlQuCi0KLQkgIFRoaXMgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3Igc2V2ZXJhbCBzeXN0ZW0gc2VydmljZXMKLQkgIGluY2x1ZGluZyB0aGUgU3lzdGVtIE1hbmFnZXIgYW5kIEFWIFNldHRpbmdzLiAgSW4KLQkgIGdlbmVyYWwsIGFsbCB1c2VycyB3aWxsIHNheSBZLgorCXRyaXN0YXRlCiAKIGNvbmZpZyBQUzNfUFMzQVYKKwlkZXBlbmRzIG9uIFBQQ19QUzMKIAl0cmlzdGF0ZSAiUFMzIEFWIHNldHRpbmdzIGRyaXZlciIgaWYgUFMzX0FEVkFOQ0VECi0JZGVwZW5kcyBvbiBQUzNfVlVBUlQKKwlzZWxlY3QgUFMzX1ZVQVJUCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUFMzIEFWIFNldHRpbmdzIGRyaXZlci4KQEAgLTkzLDEzICs4OCwxOCBAQAogCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkgb3IgTS4KIAogY29uZmlnIFBTM19TWVNfTUFOQUdFUgotCWJvb2wgIlBTMyBTeXN0ZW0gTWFuYWdlciBkcml2ZXIiIGlmIFBTM19BRFZBTkNFRAotCWRlcGVuZHMgb24gUFMzX1ZVQVJUCi0JZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUENfUFMzCisJdHJpc3RhdGUgIlBTMyBTeXN0ZW0gTWFuYWdlciBkcml2ZXIiIGlmIFBTM19BRFZBTkNFRAorCXNlbGVjdCBQUzNfVlVBUlQKKwlkZWZhdWx0IG0KIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBQUzMgU3lzdGVtIE1hbmFnZXIuCiAKIAkgIFRoaXMgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3Igc3lzdGVtIGNvbnRyb2wuICBJbgotCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkuCisJICBnZW5lcmFsLCBhbGwgdXNlcnMgd2lsbCBzYXkgWSBvciBNLgorCitjb25maWcgUFMzX1NUT1JBR0UKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwl0cmlzdGF0ZQogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCmluZGV4IGEwMDQ4ZmMuLmFjMWJkZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCkBAIC00LDMgKzQsNCBAQAogCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogb2JqLSQoQ09ORklHX1NQVV9CQVNFKSArPSBzcHUubworb2JqLXkgKz0gZGV2aWNlLWluaXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1ZWJiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKQEAgLTAsMCArMSw3ODUgQEAKKy8qCisgKiAgUFMzIGRldmljZSByZWdpc3RyYXRpb24gcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3BzM3N0b3IuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qKgorICogcHMzX3NldHVwX2dlbGljX2RldmljZSAtIFNldHVwIGFuZCByZWdpc3RlciBhIGdlbGljIGRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UsIGluaXRpYWxpc2VzIHRoZQorICogc3RydWN0dXJlIG1lbWJlcnMsIGFuZCByZWdpc3RlcnMgdGhlIGRldmljZSBpbnN0YW5jZSB3aXRoIHRoZSBzeXN0ZW0gYnVzLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF9nZWxpY19kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwkJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRfcmVnaW9uOworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJQlVHX09OKHJlcG8tPmJ1c190eXBlICE9IFBTM19CVVNfVFlQRV9TQik7CisJQlVHX09OKHJlcG8tPmRldl90eXBlICE9IFBTM19ERVZfVFlQRV9TQl9HRUxJQyk7CisKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxheW91dCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYWxsb2M7CisJfQorCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0dFTElDOworCXAtPmRldi5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9TQjsKKwlwLT5kZXYuYnVzX2lkID0gcmVwby0+YnVzX2lkOworCXAtPmRldi5kZXZfaWQgPSByZXBvLT5kZXZfaWQ7CisJcC0+ZGV2LmRfcmVnaW9uID0gJnAtPmRfcmVnaW9uOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQocmVwbywKKwkJUFMzX0lOVEVSUlVQVF9UWVBFX0VWRU5UX1BPUlQsICZwLT5kZXYuaW50ZXJydXB0X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9maW5kX2ludGVycnVwdDsKKwl9CisKKwlCVUdfT04ocC0+ZGV2LmludGVycnVwdF9pZCAhPSAwKTsKKworCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2luaXQoJnAtPmRldiwgcC0+ZGV2LmRfcmVnaW9uLCBQUzNfRE1BXzY0SywKKwkJUFMzX0RNQV9PVEhFUiwgTlVMTCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfZG1hX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kbWFfaW5pdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2RldmljZV9yZWdpc3RlcjsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorZmFpbF9kbWFfaW5pdDoKK2ZhaWxfZmluZF9pbnRlcnJ1cHQ6CisJa2ZyZWUocCk7CitmYWlsX21hbGxvYzoKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiBmYWlsLlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdF9yZWZvayBwczNfc2V0dXBfdWhjX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLCBlbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZCwKKwllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRlcnJ1cHRfdHlwZSwgZW51bSBwczNfcmVnX3R5cGUgcmVnX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbGF5b3V0IHsKKwkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBkZXY7CisJCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiBkX3JlZ2lvbjsKKwkJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiBtX3JlZ2lvbjsKKwl9ICpwOworCXU2NCBidXNfYWRkcjsKKwl1NjQgbGVuOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCUJVR19PTihyZXBvLT5idXNfdHlwZSAhPSBQUzNfQlVTX1RZUEVfU0IpOworCUJVR19PTihyZXBvLT5kZXZfdHlwZSAhPSBQUzNfREVWX1RZUEVfU0JfVVNCKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX21hbGxvYzsKKwl9CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBtYXRjaF9pZDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfU0I7CisJcC0+ZGV2LmJ1c19pZCA9IHJlcG8tPmJ1c19pZDsKKwlwLT5kZXYuZGV2X2lkID0gcmVwby0+ZGV2X2lkOworCXAtPmRldi5kX3JlZ2lvbiA9ICZwLT5kX3JlZ2lvbjsKKwlwLT5kZXYubV9yZWdpb24gPSAmcC0+bV9yZWdpb247CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChyZXBvLAorCQlpbnRlcnJ1cHRfdHlwZSwgJnAtPmRldi5pbnRlcnJ1cHRfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2ZpbmRfaW50ZXJydXB0OworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKHJlcG8sIHJlZ190eXBlLAorCQkmYnVzX2FkZHIsICZsZW4pOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2ZpbmRfcmVnOworCX0KKworCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2luaXQoJnAtPmRldiwgcC0+ZGV2LmRfcmVnaW9uLCBQUzNfRE1BXzY0SywKKwkJUFMzX0RNQV9JTlRFUk5BTCwgTlVMTCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfZG1hX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kbWFfaW5pdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfbW1pb19yZWdpb25faW5pdCgmcC0+ZGV2LCBwLT5kZXYubV9yZWdpb24sIGJ1c19hZGRyLCBsZW4sCisJCVBTM19NTUlPXzRLKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19tbWlvX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9tbWlvX2luaXQ7CisJfQorCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX2RldmljZV9yZWdpc3RlcjoKK2ZhaWxfbW1pb19pbml0OgorZmFpbF9kbWFfaW5pdDoKK2ZhaWxfZmluZF9yZWc6CitmYWlsX2ZpbmRfaW50ZXJydXB0OgorCWtmcmVlKHApOworZmFpbF9tYWxsb2M6CisJcHJfZGVidWcoIiA8LSAlczolZDogZmFpbC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3NldHVwX2VoY2lfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJcmV0dXJuIHBzM19zZXR1cF91aGNfZGV2aWNlKHJlcG8sIFBTM19NQVRDSF9JRF9FSENJLAorCQlQUzNfSU5URVJSVVBUX1RZUEVfU0JfRUhDSSwgUFMzX1JFR19UWVBFX1NCX0VIQ0kpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfc2V0dXBfb2hjaV9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlyZXR1cm4gcHMzX3NldHVwX3VoY19kZXZpY2UocmVwbywgUFMzX01BVENIX0lEX09IQ0ksCisJCVBTM19JTlRFUlJVUFRfVFlQRV9TQl9PSENJLCBQUzNfUkVHX1RZUEVfU0JfT0hDSSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF92dWFydF9kZXZpY2UoZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQsCisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBtYXRjaF9pZCAldSwgcG9ydCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQltYXRjaF9pZCwgcG9ydF9udW1iZXIpOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBtYXRjaF9pZDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfVlVBUlQ7CisJcC0+ZGV2LnBvcnRfbnVtYmVyID0gcG9ydF9udW1iZXI7CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzc3Rvcl93YWl0X2Zvcl9jb21wbGV0aW9uKHU2NCBkZXZfaWQsIHU2NCB0YWcsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQgPSAtMTsKKwl1bnNpZ25lZCBpbnQgcmV0cmllcyA9IDA7CisJdTY0IHN0YXR1czsKKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCB0aW1lb3V0OyByZXRyaWVzKyspIHsKKwkJcmVzdWx0ID0gbHYxX3N0b3JhZ2VfY2hlY2tfYXN5bmNfc3RhdHVzKGRldl9pZCwgdGFnLCAmc3RhdHVzKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlicmVhazsKKworCQltc2xlZXAoMSk7CisJfQorCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiV1OiBjaGVja19hc3luY19zdGF0dXM6ICVzLCBzdGF0dXMgJWx4XG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpLCBzdGF0dXMpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBwczNfc3RvcmFnZV93YWl0X2Zvcl9kZXZpY2UgLSBXYWl0IGZvciBhIHN0b3JhZ2UgZGV2aWNlIHRvIGJlY29tZSByZWFkeS4KKyAqIEByZXBvOiBUaGUgcmVwb3NpdG9yeSBkZXZpY2UgdG8gd2FpdCBmb3IuCisgKgorICogVXNlcyB0aGUgaHlwZXJ2aXNvcidzIHN0b3JhZ2UgZGV2aWNlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20gdG8gd2FpdCB1bnRpbAorICogYSBzdG9yYWdlIGRldmljZSBpcyByZWFkeS4gIFRoZSBkZXZpY2Ugbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB1c2VzIGEKKyAqIHBzdWVkbyBkZXZpY2UgKGlkID0gLTEpIHRvIGFzeW5jaHJvbm91c2x5IG5vdGlmeSB0aGUgZ3Vlc3Qgd2hlbiBzdG9yYWdlCisgKiBkZXZpY2VzIGJlY29tZSByZWFkeS4gIFRoZSBub3RpZmljYXRpb24gZGV2aWNlIGhhcyBhIGJsb2NrIHNpemUgb2YgNTEyCisgKiBieXRlcy4KKyAqLworCitzdGF0aWMgaW50IHBzM19zdG9yYWdlX3dhaXRfZm9yX2RldmljZShjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCWludCByZXN1bHQ7CisJY29uc3QgdTY0IG5vdGlmaWNhdGlvbl9kZXZfaWQgPSAodTY0KS0xTEw7CisJY29uc3QgdW5zaWduZWQgaW50IHRpbWVvdXQgPSBIWjsKKwl1NjQgbHBhcjsKKwl1NjQgdGFnOworCXN0cnVjdCB7CisJCXU2NCBvcGVyYXRpb25fY29kZTsJLyogbXVzdCBiZSB6ZXJvICovCisJCXU2NCBldmVudF9tYXNrOwkJLyogMSA9IGRldmljZSByZWFkeSAqLworCX0gKm5vdGlmeV9jbWQ7CisJc3RydWN0IHsKKwkJdTY0IGV2ZW50X3R5cGU7CQkvKiBub3RpZnlfZGV2aWNlX3JlYWR5ICovCisJCXU2NCBidXNfaWQ7CisJCXU2NCBkZXZfaWQ7CisJCXU2NCBkZXZfdHlwZTsKKwkJdTY0IGRldl9wb3J0OworCX0gKm5vdGlmeV9ldmVudDsKKwllbnVtIHsKKwkJbm90aWZ5X2RldmljZV9yZWFkeSA9IDEKKwl9OworCisJcHJfZGVidWcoIiAtPiAlczoldTogYnVzX2lkICV1LCBkZXZfaWQgJXUsIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywKKwkJIF9fTElORV9fLCByZXBvLT5idXNfaWQsIHJlcG8tPmRldl9pZCwgcmVwby0+ZGV2X3R5cGUpOworCisJbm90aWZ5X2NtZCA9IGt6YWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKKwlub3RpZnlfZXZlbnQgPSAodm9pZCAqKW5vdGlmeV9jbWQ7CisJaWYgKCFub3RpZnlfY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxwYXIgPSBwczNfbW1fcGh5c190b19scGFyKF9fcGEobm90aWZ5X2NtZCkpOworCisJcmVzdWx0ID0gbHYxX29wZW5fZGV2aWNlKHJlcG8tPmJ1c19pZCwgbm90aWZpY2F0aW9uX2Rldl9pZCwgMCk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiBsdjFfb3Blbl9kZXZpY2UgJXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlOworCX0KKworCS8qIFNldHVwIGFuZCB3cml0ZSB0aGUgcmVxdWVzdCBmb3IgZGV2aWNlIG5vdGlmaWNhdGlvbi4gKi8KKworCW5vdGlmeV9jbWQtPm9wZXJhdGlvbl9jb2RlID0gMDsJLyogbXVzdCBiZSB6ZXJvICovCisJbm90aWZ5X2NtZC0+ZXZlbnRfbWFzayA9IDB4MDE7CS8qIGRldmljZSByZWFkeSAqLworCisJcmVzdWx0ID0gbHYxX3N0b3JhZ2Vfd3JpdGUobm90aWZpY2F0aW9uX2Rldl9pZCwgMCwgMCwgMSwgMCwgbHBhciwKKwkJCQkgICAmdGFnKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHdyaXRlIGZhaWxlZCAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkgICAgICAgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKworCS8qIFdhaXQgZm9yIHRoZSB3cml0ZSBjb21wbGV0aW9uICovCisKKwlyZXN1bHQgPSBwczNzdG9yX3dhaXRfZm9yX2NvbXBsZXRpb24obm90aWZpY2F0aW9uX2Rldl9pZCwgdGFnLAorCQkJCQkgICAgIHRpbWVvdXQpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogd3JpdGUgbm90IGNvbXBsZXRlZCAlc1xuIiwgX19mdW5jX18sCisJCSAgICAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKworCS8qIExvb3AgaGVyZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0ZWQgbm90aWZpY2F0aW9uIGV2ZW50cy4gKi8KKworCXJlc3VsdCA9IC1FTk9ERVY7CisJd2hpbGUgKDEpIHsKKwkJbWVtc2V0KG5vdGlmeV9ldmVudCwgMCwgc2l6ZW9mKCpub3RpZnlfZXZlbnQpKTsKKworCQlyZXN1bHQgPSBsdjFfc3RvcmFnZV9yZWFkKG5vdGlmaWNhdGlvbl9kZXZfaWQsIDAsIDAsIDEsIDAsCisJCQkJCSAgbHBhciwgJnRhZyk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHdyaXRlIGZhaWxlZCAlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM3N0b3Jfd2FpdF9mb3JfY29tcGxldGlvbihub3RpZmljYXRpb25fZGV2X2lkLCB0YWcsCisJCQkJCQkgICAgIHRpbWVvdXQpOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiByZWFkIG5vdCBjb21wbGV0ZWQgJXNcbiIsCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobm90aWZ5X2V2ZW50LT5ldmVudF90eXBlICE9IG5vdGlmeV9kZXZpY2VfcmVhZHkgfHwKKwkJICAgIG5vdGlmeV9ldmVudC0+YnVzX2lkICE9IHJlcG8tPmJ1c19pZCkgeworCQkJcHJfZGVidWcoIiVzOiV1OiBiYWQgbm90aWZ5X2V2ZW50OiBldmVudCAlbHUsICIKKwkJCQkgImRldl9pZCAlbHUsIGRldl90eXBlICVsdVxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBub3RpZnlfZXZlbnQtPmV2ZW50X3R5cGUsCisJCQkJIG5vdGlmeV9ldmVudC0+ZGV2X2lkLCBub3RpZnlfZXZlbnQtPmRldl90eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5vdGlmeV9ldmVudC0+ZGV2X2lkID09IHJlcG8tPmRldl9pZCAmJgorCQkgICAgbm90aWZ5X2V2ZW50LT5kZXZfdHlwZSA9PSByZXBvLT5kZXZfdHlwZSkgeworCQkJcHJfZGVidWcoIiVzOiV1OiBkZXZpY2UgcmVhZHk6IGRldl9pZCAldVxuIiwgX19mdW5jX18sCisJCQkJIF9fTElORV9fLCByZXBvLT5kZXZfaWQpOworCQkJcmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5vdGlmeV9ldmVudC0+ZGV2X2lkID09IHJlcG8tPmRldl9pZCAmJgorCQkgICAgbm90aWZ5X2V2ZW50LT5kZXZfdHlwZSA9PSBQUzNfREVWX1RZUEVfTk9BQ0NFU1MpIHsKKwkJCXByX2RlYnVnKCIlczoldTogbm8gYWNjZXNzOiBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAorCQkJCSBfX0xJTkVfXywgcmVwby0+ZGV2X2lkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitmYWlsX2Nsb3NlOgorCWx2MV9jbG9zZV9kZXZpY2UocmVwby0+YnVzX2lkLCBub3RpZmljYXRpb25fZGV2X2lkKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShub3RpZnlfY21kKTsKKwlwcl9kZWJ1ZygiIDwtICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3NldHVwX3N0b3JhZ2VfZGV2KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCisJCQkJIGVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqcDsKKwl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7CisJdW5zaWduZWQgaW50IG51bV9yZWdpb25zLCBpOworCisJcHJfZGVidWcoIiAtPiAlczoldTogbWF0Y2hfaWQgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWF0Y2hfaWQpOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvKHJlcG8tPmJ1c19pbmRleCwKKwkJCQkJCSAgIHJlcG8tPmRldl9pbmRleCwgJnBvcnQsCisJCQkJCQkgICAmYmxrX3NpemUsICZudW1fYmxvY2tzLAorCQkJCQkJICAgJm51bV9yZWdpb25zKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IF9yZWFkX3N0b3JfZGV2X2luZm8gZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JXU6IGluZGV4ICV1OiV1OiBwb3J0ICVsdSBibGtfc2l6ZSAlbHUgbnVtX2Jsb2NrcyAlbHUgIgorCQkgIm51bV9yZWdpb25zICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwKKwkJIHJlcG8tPmRldl9pbmRleCwgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlKSArCisJCSAgICBudW1fcmVnaW9ucyAqIHNpemVvZihzdHJ1Y3QgcHMzX3N0b3JhZ2VfcmVnaW9uKSwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghcCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFsbG9jOworCX0KKworCXAtPnNiZC5tYXRjaF9pZCA9IG1hdGNoX2lkOworCXAtPnNiZC5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9TQjsKKwlwLT5zYmQuYnVzX2lkID0gcmVwby0+YnVzX2lkOworCXAtPnNiZC5kZXZfaWQgPSByZXBvLT5kZXZfaWQ7CisJcC0+c2JkLmRfcmVnaW9uID0gJnAtPmRtYV9yZWdpb247CisJcC0+YmxrX3NpemUgPSBibGtfc2l6ZTsKKwlwLT5udW1fcmVnaW9ucyA9IG51bV9yZWdpb25zOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQocmVwbywKKwkJCQkJICAgICAgIFBTM19JTlRFUlJVUFRfVFlQRV9FVkVOVF9QT1JULAorCQkJCQkgICAgICAgJnAtPnNiZC5pbnRlcnJ1cHRfaWQpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogZmluZF9pbnRlcnJ1cHQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIF9fTElORV9fLCByZXN1bHQpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZmluZF9pbnRlcnJ1cHQ7CisJfQorCisJLyogRklYTUU6IEFycmFuZ2UgdG8gb25seSBkbyB0aGlzIG9uIGEgJ2NvbGQnIGJvb3QgKi8KKworCXJlc3VsdCA9IHBzM19zdG9yYWdlX3dhaXRfZm9yX2RldmljZShyZXBvKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHN0b3JhZ2Vfbm90aWZpY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX3Byb2JlX25vdGlmaWNhdGlvbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ2lvbnM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaWQ7CisJCXU2NCBzdGFydCwgc2l6ZTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbihyZXBvLT5idXNfaW5kZXgsCisJCQkJCQkJICAgICByZXBvLT5kZXZfaW5kZXgsCisJCQkJCQkJICAgICBpLCAmaWQsICZzdGFydCwKKwkJCQkJCQkgICAgICZzaXplKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiV1OiByZWFkX3N0b3JfZGV2X3JlZ2lvbiBmYWlsZWQgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbF9yZWFkX3JlZ2lvbjsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6JXU6IHJlZ2lvbiAldTogaWQgJXUgc3RhcnQgJWx1IHNpemUgJWx1XG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgaSwgaWQsIHN0YXJ0LCBzaXplKTsKKworCQlwLT5yZWdpb25zW2ldLmlkID0gaWQ7CisJCXAtPnJlZ2lvbnNbaV0uc3RhcnQgPSBzdGFydDsKKwkJcC0+cmVnaW9uc1tpXS5zaXplID0gc2l6ZTsKKwl9CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPnNiZCk7CisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorZmFpbF9yZWFkX3JlZ2lvbjoKK2ZhaWxfcHJvYmVfbm90aWZpY2F0aW9uOgorZmFpbF9maW5kX2ludGVycnVwdDoKKwlrZnJlZShwKTsKK2ZhaWxfbWFsbG9jOgorCXByX2RlYnVnKCIgPC0gJXM6JXU6IGZhaWwuXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19yZWdpc3Rlcl92dWFydF9kZXZpY2VzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9hdl9wb3J0KCZwb3J0X251bWJlcik7CisJaWYgKHJlc3VsdCkKKwkJcG9ydF9udW1iZXIgPSAwOyAvKiBhdiBkZWZhdWx0ICovCisKKwlyZXN1bHQgPSBwczNfc2V0dXBfdnVhcnRfZGV2aWNlKFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUywgcG9ydF9udW1iZXIpOworCVdBUk5fT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfc3lzbWdyX3BvcnQoJnBvcnRfbnVtYmVyKTsKKwlpZiAocmVzdWx0KQorCQlwb3J0X251bWJlciA9IDI7IC8qIHN5c21nciBkZWZhdWx0ICovCisKKwlyZXN1bHQgPSBwczNfc2V0dXBfdnVhcnRfZGV2aWNlKFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiwKKwkJcG9ydF9udW1iZXIpOworCVdBUk5fT04ocmVzdWx0KTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX3NvdW5kX2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwkJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRfcmVnaW9uOworCQlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIG1fcmVnaW9uOworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAtPmRldi5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9TT1VORDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfSU9DMDsKKwlwLT5kZXYuZF9yZWdpb24gPSAmcC0+ZF9yZWdpb247CisJcC0+ZGV2Lm1fcmVnaW9uID0gJnAtPm1fcmVnaW9uOworCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfZ3JhcGhpY3NfZGV2aWNlcyh2b2lkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1M7CisJcC0+ZGV2LmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX0lPQzA7CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlIC0gUmVnaXN0ZXIgYSBkZXZpY2UgZnJvbSB0aGUgcmVwb3NpdGlvcnkgaW5mby4KKyAqCisgKi8KKworc3RhdGljIGludCBwczNfcmVnaXN0ZXJfcmVwb3NpdG9yeV9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChyZXBvLT5kZXZfdHlwZSkgeworCWNhc2UgUFMzX0RFVl9UWVBFX1NCX0dFTElDOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfZ2VsaWNfZGV2aWNlKHJlcG8pOworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3NldHVwX2dlbGljX2RldmljZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTM19ERVZfVFlQRV9TQl9VU0I6CisKKwkJLyogRWFjaCBVU0IgZGV2aWNlIGhhcyBib3RoIGFuIEVIQ0kgYW5kIGFuIE9IQ0kgSEMgKi8KKworCQlyZXN1bHQgPSBwczNfc2V0dXBfZWhjaV9kZXZpY2UocmVwbyk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19zZXR1cF9laGNpX2RldmljZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19zZXR1cF9vaGNpX2RldmljZShyZXBvKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3NldHVwX29oY2lfZGV2aWNlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQl9CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVl9UWVBFX1NUT1JfRElTSzoKKwkJcmVzdWx0ID0gcHMzX3NldHVwX3N0b3JhZ2VfZGV2KHJlcG8sIFBTM19NQVRDSF9JRF9TVE9SX0RJU0spOworCisJCS8qIFNvbWUgZGV2aWNlcyBhcmUgbm90IGFjY2Vzc2FibGUgZnJvbSB0aGUgT3RoZXIgT1MgbHBhci4gKi8KKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKSB7CisJCQlyZXN1bHQgPSAwOworCQkJcHJfZGVidWcoIiVzOiV1OiBub3QgYWNjZXNzYWJsZVxuIiwgX19mdW5jX18sCisJCQkJIF9fTElORV9fKTsKKwkJfQorCisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3NldHVwX3N0b3JhZ2VfZGV2IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisKKwljYXNlIFBTM19ERVZfVFlQRV9TVE9SX1JPTToKKwkJcmVzdWx0ID0gcHMzX3NldHVwX3N0b3JhZ2VfZGV2KHJlcG8sIFBTM19NQVRDSF9JRF9TVE9SX1JPTSk7CisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3NldHVwX3N0b3JhZ2VfZGV2IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisKKwljYXNlIFBTM19ERVZfVFlQRV9TVE9SX0ZMQVNIOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfc3RvcmFnZV9kZXYocmVwbywgUFMzX01BVENIX0lEX1NUT1JfRkxBU0gpOworCQlpZiAocmVzdWx0KQorCQkJcHJfZGVidWcoIiVzOiV1IHBzM19zZXR1cF9zdG9yYWdlX2RldiBmYWlsZWRcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gMDsKKwkJcHJfZGVidWcoIiVzOiV1OiB1bnN1cHBvcnRlZCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcmVwby0+ZGV2X3R5cGUpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3Byb2JlX3RocmVhZCAtIEJhY2tncm91bmQgcmVwb3NpdG9yeSBwcm9iaW5nIGF0IHN5c3RlbSBzdGFydHVwLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBiYWNrZ3JvdW5kIHByb2Jpbmcgb24gYSBzaW5nbGUgYnVzLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Byb2JlX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8gPSBkYXRhOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IG1zID0gMjUwOworCisJcHJfZGVidWcoIiAtPiAlczoldToga3RocmVhZCBzdGFydGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJZG8geworCQl0cnlfdG9fZnJlZXplKCk7CisKKwkJcHJfZGVidWcoIiVzOiV1OiBwcm9iaW5nLi4uXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJCWRvIHsKKwkJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKHJlcG8pOworCisJCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQkJcHJfZGVidWcoIiVzOiV1OiBub3RoaW5nIG5ld1xuIiwgX19mdW5jX18sCisJCQkJCV9fTElORV9fKTsKKwkJCWVsc2UgaWYgKHJlc3VsdCkKKwkJCQlwcl9kZWJ1ZygiJXM6JXU6IGZpbmQgZGV2aWNlIGVycm9yLlxuIiwKKwkJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCWVsc2UgeworCQkJCXByX2RlYnVnKCIlczoldTogZm91bmQgZGV2aWNlXG4iLCBfX2Z1bmNfXywKKwkJCQkJX19MSU5FX18pOworCQkJCXBzM19yZWdpc3Rlcl9yZXBvc2l0b3J5X2RldmljZShyZXBvKTsKKwkJCQlwczNfcmVwb3NpdG9yeV9idW1wX2RldmljZShyZXBvKTsKKwkJCQltcyA9IDI1MDsKKwkJCX0KKwkJfSB3aGlsZSAoIXJlc3VsdCk7CisKKwkJcHJfZGVidWcoIiVzOiV1OiBtcyAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtcyk7CisKKwkJaWYgKCBtcyA+IDYwMDAwKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGUobXMpOworCisJCS8qIEFuIGV4cG9uZW50aWFsIGJhY2tvZmYuICovCisJCW1zIDw8PSAxOworCisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiV1OiBrdGhyZWFkIGZpbmlzaGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3N0YXJ0X3Byb2JlX3RocmVhZCAtIFN0YXJ0cyB0aGUgYmFja2dyb3VuZCBwcm9iZSB0aHJlYWQuCisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zdGFydF9wcm9iZV90aHJlYWQoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RhdGljIHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgcmVwbzsgLyogbXVzdCBiZSBzdGF0aWMgKi8KKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltZW1zZXQoJnJlcG8sIDAsIHNpemVvZihyZXBvKSk7CisKKwlyZXBvLmJ1c190eXBlID0gYnVzX3R5cGU7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2J1cyhyZXBvLmJ1c190eXBlLCAwLCAmcmVwby5idXNfaW5kZXgpOworCisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgZmluZCBidXMgKCVkKVxuIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHJlcG8uYnVzX2luZGV4LCAmcmVwby5idXNfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkX2J1c19pZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkJcmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdGFzayA9IGt0aHJlYWRfcnVuKHBzM19wcm9iZV90aHJlYWQsICZyZXBvLCAicHMzLXByb2JlLSV1IiwgYnVzX3R5cGUpOworCisJaWYgKElTX0VSUih0YXNrKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHRhc2spOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBrdGhyZWFkX3J1biBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM19yZWdpc3Rlcl9kZXZpY2VzIC0gUHJvYmUgdGhlIHN5c3RlbSBhbmQgcmVnaXN0ZXIgZGV2aWNlcyBmb3VuZC4KKyAqCisgKiBBIGRldmljZV9pbml0Y2FsbCgpIHJvdXRpbmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkvKiBwczNfcmVwb3NpdG9yeV9kdW1wX2J1c19pbmZvKCk7ICovCisKKwlyZXN1bHQgPSBwczNfc3RhcnRfcHJvYmVfdGhyZWFkKFBTM19CVVNfVFlQRV9TVE9SQUdFKTsKKworCXBzM19yZWdpc3Rlcl92dWFydF9kZXZpY2VzKCk7CisKKwlwczNfcmVnaXN0ZXJfZ3JhcGhpY3NfZGV2aWNlcygpOworCisJcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2VzKFBTM19CVVNfVFlQRV9TQiwKKwkJcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlKTsKKworCXBzM19yZWdpc3Rlcl9zb3VuZF9kZXZpY2VzKCk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwocHMzX3JlZ2lzdGVyX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCmluZGV4IGExNDA5ZTQuLjVkMmUxNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKQEAgLTI5LDEyICsyOSwxMiBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAotc3RhdGljIGhwdGVfdCAqaHRhYjsKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9wdGUgKmh0YWI7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBodGFiX2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqYm9sdHRhYjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnVzZXRhYjsKQEAgLTQ0LDggKzQ0LDggQEAKICNkZWZpbmUgZGVidWdfZHVtcF9ocHRlKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nKSBcCiAJX2RlYnVnX2R1bXBfaHB0ZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX19mdW5jX18sIF9fTElORV9fKQogc3RhdGljIHZvaWQgX2RlYnVnX2R1bXBfaHB0ZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHZhLAotCXVuc2lnbmVkIGxvbmcgZ3JvdXAsIHVuc2lnbmVkIGxvbmcgYml0bWFwLCBocHRlX3QgbGhwdGUsIGludCBwc2l6ZSwKLQl1bnNpZ25lZCBsb25nIHNsb3QsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQorCXVuc2lnbmVkIGxvbmcgZ3JvdXAsIHVuc2lnbmVkIGxvbmcgYml0bWFwLCBzdHJ1Y3QgaGFzaF9wdGUgbGhwdGUsCisJaW50IHBzaXplLCB1bnNpZ25lZCBsb25nIHNsb3QsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCURCRygiJXM6JWQ6IHBhICAgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIHBhKTsKIAlEQkcoIiVzOiVkOiBscGFyICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLApAQCAtNjMsNyArNjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgcmZsYWdzLCB1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgc2xvdDsKLQlocHRlX3QgbGhwdGU7CisJc3RydWN0IGhhc2hfcHRlIGxocHRlOwogCWludCBzZWNvbmRhcnkgPSAwOwogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgYml0bWFwOwpAQCAtMjM0LDEwICsyMzQsMTcgQEAKIAogc3RhdGljIHZvaWQgcHMzX2hwdGVfY2xlYXIodm9pZCkKIHsKLQkvKiBNYWtlIHN1cmUgdG8gY2xlYW4gdXAgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZmlyc3QgKi8KLQlwczNmYl9jbGVhbnVwKCk7CisJaW50IHJlc3VsdDsKIAotCWx2MV91bm1hcF9odGFiKGh0YWJfYWRkcik7CisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXN1bHQgPSBsdjFfdW5tYXBfaHRhYihodGFiX2FkZHIpOworCUJVR19PTihyZXN1bHQpOworCisJcHMzX21tX3NodXRkb3duKCk7CisJcHMzX21tX3Zhc19kZXN0cm95KCk7CisKKwlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIAogdm9pZCBfX2luaXQgcHMzX2hwdGVfaW5pdCh1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZSkKQEAgLTI1NSw3ICsyNjIsNyBAQAogCiAJcHBjNjRfcGZ0X3NpemUgPSBfX2lsb2cyKGh0YWJfc2l6ZSk7CiAKLQliaXRtYXBfc2l6ZSA9IGh0YWJfc2l6ZSAvIHNpemVvZihocHRlX3QpIC8gODsKKwliaXRtYXBfc2l6ZSA9IGh0YWJfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgaGFzaF9wdGUpIC8gODsKIAogCWJvbHR0YWIgPSBfX3ZhKGxtYl9hbGxvYyhiaXRtYXBfc2l6ZSwgMSkpOwogCWludXNldGFiID0gX192YShsbWJfYWxsb2MoYml0bWFwX3NpemUsIDEpKTsKQEAgLTI3Myw4ICsyODAsOCBAQAogCiAJcmVzdWx0ID0gbHYxX21hcF9odGFiKDAsICZodGFiX2FkZHIpOwogCi0JaHRhYiA9IChocHRlX3QgKilfX2lvcmVtYXAoaHRhYl9hZGRyLCBodGFiX3NpemUsCi0JCQkJICAgcGdwcm90X3ZhbChQQUdFX1JFQURPTkxZX1gpKTsKKwlodGFiID0gKF9fZm9yY2Ugc3RydWN0IGhhc2hfcHRlICopaW9yZW1hcF9mbGFncyhodGFiX2FkZHIsIGh0YWJfc2l6ZSwKKwkJCQkJICAgIHBncHJvdF92YWwoUEFHRV9SRUFET05MWV9YKSk7CiAKIAlEQkcoIiVzOiVkOiBscGFyICUwMTZseGgsIHZpcnQgJTAxNmx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlodGFiX2FkZHIsICh1bnNpZ25lZCBsb25nKWh0YWIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCBlYzkwMzBkLi42N2UzMmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogLyoqCkBAIC03OCwxOSArNzgsODUgQEAKIC8qKgogICogc3RydWN0IHBzM19wcml2YXRlIC0gYSBwZXIgY3B1IGRhdGEgc3RydWN0dXJlCiAgKiBAYm1wOiBwczNfYm1wIHN0cnVjdHVyZQotICogQG5vZGU6IEhWIGxvZ2ljYWxfcHBlX2lkCi0gKiBAY3B1OiBIViB0aHJlYWRfaWQKKyAqIEBwcGVfaWQ6IEhWIGxvZ2ljYWxfcHBlX2lkCisgKiBAdGhyZWFkX2lkOiBIViB0aHJlYWRfaWQKICAqLwogCiBzdHJ1Y3QgcHMzX3ByaXZhdGUgewogCXN0cnVjdCBwczNfYm1wIGJtcCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoUFMzX0JNUF9NSU5BTElHTikpKTsKLQl1NjQgbm9kZTsKLQl1bnNpZ25lZCBpbnQgY3B1OworCXU2NCBwcGVfaWQ7CisJdTY0IHRocmVhZF9pZDsKIH07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcHMzX3ByaXZhdGUsIHBzM19wcml2YXRlKTsKIAogLyoqCisgKiBwczNfY2hpcF9tYXNrIC0gU2V0IGFuIGludGVycnVwdCBtYXNrIGJpdCBpbiBwczNfYm1wLgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIFNldHMgcHMzX2JtcC5tYXNrIGFuZCBjYWxscyBsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzaygpLgorICovCisKK3N0YXRpYyB2b2lkIHBzM19jaGlwX21hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbHUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcGQtPnRocmVhZF9pZCwgdmlycSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY2xlYXJfYml0KDYzIC0gdmlycSwgJnBkLT5ibXAubWFzayk7CisJbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIHBzM19jaGlwX3VubWFzayAtIENsZWFyIGFuIGludGVycnVwdCBtYXNrIGJpdCBpbiBwczNfYm1wLgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIENsZWFycyBwczNfYm1wLm1hc2sgYW5kIGNhbGxzIGx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKCkuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX2NoaXBfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzOiVkOiB0aHJlYWRfaWQgJWx1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXBkLT50aHJlYWRfaWQsIHZpcnEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNldF9iaXQoNjMgLSB2aXJxLCAmcGQtPmJtcC5tYXNrKTsKKwlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogcHMzX2NoaXBfZW9pIC0gSFYgZW5kLW9mLWludGVycnVwdC4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKiBDYWxscyBsdjFfZW5kX29mX2ludGVycnVwdF9leHQoKS4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfY2hpcF9lb2kodW5zaWduZWQgaW50IHZpcnEpCit7CisJY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOworCWx2MV9lbmRfb2ZfaW50ZXJydXB0X2V4dChwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKK30KKworLyoqCisgKiBwczNfaXJxX2NoaXAgLSBSZXByZXNlbnRzIHRoZSBwczNfYm1wIGFzIGEgTGludXggc3RydWN0IGlycV9jaGlwLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcHMzX2lycV9jaGlwID0geworCS50eXBlbmFtZSA9ICJwczMiLAorCS5tYXNrID0gcHMzX2NoaXBfbWFzaywKKwkudW5tYXNrID0gcHMzX2NoaXBfdW5tYXNrLAorCS5lb2kgPSBwczNfY2hpcF9lb2ksCit9OworCisvKioKICAqIHBzM192aXJxX3NldHVwIC0gdmlycSByZWxhdGVkIHNldHVwLgogICogQGNwdTogZW51bSBwczNfY3B1X2JpbmRpbmcgaW5kaWNhdGluZyB0aGUgY3B1IHRoZSBpbnRlcnJ1cHQgc2hvdWxkIGJlCiAgKiBzZXJ2aWNlZCBvbi4KQEAgLTEzNCw2ICsyMDAsOCBAQAogCQlnb3RvIGZhaWxfc2V0OwogCX0KIAorCXBzM19jaGlwX21hc2soKnZpcnEpOworCiAJcmV0dXJuIHJlc3VsdDsKIAogZmFpbF9zZXQ6CkBAIC0xNTMsOCArMjIxLDggQEAKIHsKIAljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IG5vZGUgJWx1LCBjcHUgJWQsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJcGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOworCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsdSwgdGhyZWFkX2lkICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCXNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOwogCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CkBAIC0xOTAsNyArMjU4LDggQEAKIAogCS8qIEJpbmRzIG91dGxldCB0byBjcHUgKyB2aXJxLiAqLwogCi0JcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaXJxX3BsdWdfZXh0KHBkLT5ub2RlLCBwZC0+Y3B1LCAqdmlycSwgb3V0bGV0LCAwKTsKKwlyZXN1bHQgPSBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQocGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgKnZpcnEsCisJCW91dGxldCwgMCk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByX2luZm8oIiVzOiVkOiBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQgZmFpbGVkOiAlc1xuIiwKQEAgLTIyMiwxMCArMjkxLDEyIEBACiAJaW50IHJlc3VsdDsKIAljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IG5vZGUgJWx1LCBjcHUgJWQsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJcGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOworCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsdSwgdGhyZWFkX2lkICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAotCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dChwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7CisJcHMzX2NoaXBfbWFzayh2aXJxKTsKKworCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dChwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCWlmIChyZXN1bHQpCiAJCXByX2luZm8oIiVzOiVkOiBsdjFfZGlzY29ubmVjdF9pcnFfcGx1Z19leHQgZmFpbGVkOiAlc1xuIiwKQEAgLTI4Miw3ICszNTMsOSBAQAogewogCWludCByZXN1bHQ7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkIHZpcnE6ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHZpcnEpOworCXByX2RlYnVnKCIgLT4gJXM6JWQgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCB2aXJxKTsKKworCXBzM19jaGlwX21hc2sodmlycSk7CiAKIAlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0KHZpcnFfdG9faHcodmlycSkpOwogCkBAIC0yOTAsMTcgKzM2MywxNCBAQAogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCS8qIGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQoKSBkZXN0cm95cyB0aGUgSVJRIHBsdWcsCi0JICogc28gZG9uJ3QgY2FsbCBwczNfaXJxX3BsdWdfZGVzdHJveSgpIGhlcmUuCisJLyoKKwkgKiBEb24ndCBjYWxsIHBzM192aXJxX2Rlc3Ryb3koKSBoZXJlIHNpbmNlIHBzM19zbXBfY2xlYW51cF9jcHUoKQorCSAqIGNhbGxzIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKHNtcF9jYWxsX2Z1bmN0aW9uKSB3aGVuIGtleGVjaW5nLgogCSAqLwogCi0JcmVzdWx0ID0gcHMzX3ZpcnFfZGVzdHJveSh2aXJxKTsKLQlCVUdfT04ocmVzdWx0KTsKLQogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSk7CiAKIGludCBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHVuc2lnbmVkIGludCB2aXJxKQogewpAQCAtMzExLDE3ICszODEsMTUgQEAKICAqIHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAgLSBTZXR1cCBhIHN5c3RlbSBidXMgZXZlbnQgcmVjZWl2ZSBwb3J0LgogICogQGNwdTogZW51bSBwczNfY3B1X2JpbmRpbmcgaW5kaWNhdGluZyB0aGUgY3B1IHRoZSBpbnRlcnJ1cHQgc2hvdWxkIGJlCiAgKiBzZXJ2aWNlZCBvbi4KLSAqIEBkaWQ6IFRoZSBIViBkZXZpY2UgaWRlbnRpZmllciByZWFkIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5LgotICogQGludGVycnVwdF9pZDogVGhlIGRldmljZSBpbnRlcnJ1cHQgaWQgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeS4KKyAqIEBkZXY6IFRoZSBzeXN0ZW0gYnVzIGRldmljZSBpbnN0YW5jZS4KICAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KICAqCiAgKiBBbiBldmVudCBpcnEgcmVwcmVzZW50cyBhIHZpcnR1YWwgZGV2aWNlIGludGVycnVwdC4gIFRoZSBpbnRlcnJ1cHRfaWQKICAqIGNvcmVzcG9uZHMgdG8gdGhlIHNvZnR3YXJlIGludGVycnVwdCBudW1iZXIuCiAgKi8KIAotaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoZW51bSBwczNfY3B1X2JpbmRpbmcgY3B1LAotCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsIHVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsCi0JdW5zaWduZWQgaW50ICp2aXJxKQoraW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCWVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwgdW5zaWduZWQgaW50ICp2aXJxKQogewogCS8qIHRoaXMgc2hvdWxkIGdvIGluIHN5c3RlbS1idXMuYyAqLwogCkBAIC0zMzIsOCArNDAwLDggQEAKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwogCi0JcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkaWQtPmJ1c19pZCwKLQkJZGlkLT5kZXZfaWQsIHZpcnFfdG9faHcoKnZpcnEpLCBpbnRlcnJ1cHRfaWQpOworCXJlc3VsdCA9IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGV2LT5idXNfaWQsCisJCWRldi0+ZGV2X2lkLCB2aXJxX3RvX2h3KCp2aXJxKSwgZGV2LT5pbnRlcnJ1cHRfaWQpOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQiCkBAIC0zNDUsMjQgKzQxMywyNCBAQAogCX0KIAogCXByX2RlYnVnKCIlczolZDogaW50ZXJydXB0X2lkICV1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWludGVycnVwdF9pZCwgKnZpcnEpOworCQlkZXYtPmludGVycnVwdF9pZCwgKnZpcnEpOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXApOwogCi1pbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCi0JdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50IHZpcnEpCitpbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAkvKiB0aGlzIHNob3VsZCBnbyBpbiBzeXN0ZW0tYnVzLmMgKi8KIAogCWludCByZXN1bHQ7CiAKIAlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBpbnRlcnJ1cHRfaWQgJXUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJaW50ZXJydXB0X2lkLCB2aXJxKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaWQsIHZpcnEpOwogCi0JcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkaWQtPmJ1c19pZCwKLQkJZGlkLT5kZXZfaWQsIHZpcnFfdG9faHcodmlycSksIGludGVycnVwdF9pZCk7CisJcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkZXYtPmJ1c19pZCwKKwkJZGV2LT5kZXZfaWQsIHZpcnFfdG9faHcodmlycSksIGRldi0+aW50ZXJydXB0X2lkKTsKIAogCWlmIChyZXN1bHQpCiAJCXByX2RlYnVnKCIlczolZDogbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCIKQEAgLTM3Miw2ICs0NDAsMTQgQEAKIAlyZXN1bHQgPSBwczNfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3kodmlycSk7CiAJQlVHX09OKHJlc3VsdCk7CiAKKwkvKgorCSAqIHBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSgpIGRlc3Ryb3lzIHRoZSBJUlEgcGx1ZywKKwkgKiBzbyBkb24ndCBjYWxsIHBzM19pcnFfcGx1Z19kZXN0cm95KCkgaGVyZS4KKwkgKi8KKworCXJlc3VsdCA9IHBzM192aXJxX2Rlc3Ryb3kodmlycSk7CisJQlVHX09OKHJlc3VsdCk7CisKIAlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC00MTIsMTYgKzQ4OCwyNCBAQAogaW50IHBzM19pb19pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgb3V0bGV0ID0gdmlycV90b19odyh2aXJxKTsKIAotCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KHZpcnFfdG9faHcodmlycSkpOworCXBzM19jaGlwX21hc2sodmlycSk7CisKKwkvKgorCSAqIGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KCkgd2lsbCBkZXN0cm95IHRoZSBJUlEgcGx1ZywKKwkgKiBzbyBjYWxsIHBzM19pcnFfcGx1Z19kZXN0cm95KCkgZmlyc3QuCisJICovCisKKwlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KG91dGxldCk7CiAKIAlpZiAocmVzdWx0KQogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKLQlCVUdfT04ocmVzdWx0KTsKLQogCXJldHVybiByZXN1bHQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwczNfaW9faXJxX2Rlc3Ryb3kpOwpAQCAtNDYxLDExICs1NDUsMTMgQEAKIAogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfaXJxX3NldHVwKTsKIAogaW50IHBzM192dWFydF9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAlpbnQgcmVzdWx0OwogCisJcHMzX2NoaXBfbWFzayh2aXJxKTsKIAlyZXN1bHQgPSBsdjFfZGVjb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSgpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtNDc5LDYgKzU2NSw3IEBACiAKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X2lycV9kZXN0cm95KTsKIAogLyoqCiAgKiBwczNfc3BlX2lycV9zZXR1cCAtIFNldHVwIGFuIHNwZSB2aXJxLgpAQCAtNTE0LDkgKzYwMSwxNCBAQAogCiBpbnQgcHMzX3NwZV9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKLQlpbnQgcmVzdWx0ID0gcHMzX2lycV9wbHVnX2Rlc3Ryb3kodmlycSk7CisJaW50IHJlc3VsdDsKKworCXBzM19jaGlwX21hc2sodmlycSk7CisKKwlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKIAlCVUdfT04ocmVzdWx0KTsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtNTMzLDcgKzYyNSw3IEBACiAJCSpwICYgMHhmZmZmKTsKIH0KIAotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wXzI1Nl9ibXAoY29uc3QgY2hhciAqaGVhZGVyLAorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2R1bXBfMjU2X2JtcChjb25zdCBjaGFyICpoZWFkZXIsCiAJY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBjcHUsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCXByX2RlYnVnKCIlczolZDogJXMgJXUgeyUwMTZseDolMDE2bHg6JTAxNmx4OiUwMTZseH1cbiIsCkBAIC01NDYsODYgKzYzOCwyNSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7Ci0JX2R1bXBfNjRfYm1wKCJzdGF0IiwgJnBkLT5ibXAuc3RhdHVzLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKLQlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKKwlfZHVtcF82NF9ibXAoInN0YXQiLCAmcGQtPmJtcC5zdGF0dXMsIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwogfQogCiAjZGVmaW5lIGR1bXBfbWFzayhfeCkgX2R1bXBfbWFzayhfeCwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX21hc2soc3RydWN0IHBzM19wcml2YXRlKiBwZCwKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX21hc2soc3RydWN0IHBzM19wcml2YXRlICpwZCwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwotCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIGR1bXBfYm1wKHN0cnVjdCBwczNfcHJpdmF0ZSogcGQpIHt9OwogI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCiAKLXN0YXRpYyB2b2lkIHBzM19jaGlwX21hc2sodW5zaWduZWQgaW50IHZpcnEpCi17Ci0Jc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwotCXU2NCBiaXQgPSAweDgwMDAwMDAwMDAwMDAwMDBVTCA+PiB2aXJxOwotCXU2NCAqcCA9ICZwZC0+Ym1wLm1hc2s7Ci0JdTY0IG9sZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcHJfZGVidWcoIiVzOiVkOiBjcHUgJXUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcGQtPmNwdSwgdmlycSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYXNtIHZvbGF0aWxlKAotCQkgICAgICIxOglsZGFyeCAlMCwwLCUzXG4iCi0JCSAgICAgImFuZGMJJTAsJTAsJTJcbiIKLQkJICAgICAic3RkY3guCSUwLDAsJTNcbiIKLQkJICAgICAiYm5lLQkxYiIKLQkJICAgICA6ICI9JnIiIChvbGQpLCAiK20iICgqcCkKLQkJICAgICA6ICJyIiAoYml0KSwgInIiIChwKQotCQkgICAgIDogImNjIiApOwotCi0JbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPm5vZGUsIHBkLT5jcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcHMzX2NoaXBfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQotewotCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKLQl1NjQgYml0ID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycTsKLQl1NjQgKnAgPSAmcGQtPmJtcC5tYXNrOwotCXU2NCBvbGQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5jcHUsIHZpcnEpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWFzbSB2b2xhdGlsZSgKLQkJICAgICAiMToJbGRhcnggJTAsMCwlM1xuIgotCQkgICAgICJvcgklMCwlMCwlMlxuIgotCQkgICAgICJzdGRjeC4JJTAsMCwlM1xuIgotCQkgICAgICJibmUtCTFiIgotCQkgICAgIDogIj0mciIgKG9sZCksICIrbSIgKCpwKQotCQkgICAgIDogInIiIChiaXQpLCAiciIgKHApCi0JCSAgICAgOiAiY2MiICk7Ci0KLQlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+bm9kZSwgcGQtPmNwdSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBwczNfY2hpcF9lb2kodW5zaWduZWQgaW50IHZpcnEpCi17Ci0JY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwotCWx2MV9lbmRfb2ZfaW50ZXJydXB0X2V4dChwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXJxX2NoaXAgPSB7Ci0JLnR5cGVuYW1lID0gInBzMyIsCi0JLm1hc2sgPSBwczNfY2hpcF9tYXNrLAotCS51bm1hc2sgPSBwczNfY2hpcF91bm1hc2ssCi0JLmVvaSA9IHBzM19jaGlwX2VvaSwKLX07Ci0KIHN0YXRpYyB2b2lkIHBzM19ob3N0X3VubWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEpCiB7CiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgTlVMTCk7CkBAIC02MzcsNyArNjY4LDcgQEAKIAlwcl9kZWJ1ZygiJXM6JWQ6IGh3aXJxICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBod2lycSwKIAkJdmlycSk7CiAKLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmlycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmcHMzX2lycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTcsNyArNjg4LDcgQEAKIAkJY3B1LCB2aXJxLCBwZC0+Ym1wLmlwaV9kZWJ1Z19icmtfbWFzayk7CiB9CiAKLXVuc2lnbmVkIGludCBwczNfZ2V0X2lycSh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBwczNfZ2V0X2lycSh2b2lkKQogewogCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSAmX19nZXRfY3B1X3ZhcihwczNfcHJpdmF0ZSk7CiAJdTY0IHggPSAocGQtPmJtcC5zdGF0dXMgJiBwZC0+Ym1wLm1hc2spOwpAQCAtNjcyLDggKzcwMyw4IEBACiAJcGx1ZyAmPSAweDNmOwogCiAJaWYgKHVubGlrZWx5KHBsdWcpID09IE5PX0lSUSkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIHBsdWcgZm91bmQ6IGNwdSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJcGQtPmNwdSk7CisJCXByX2RlYnVnKCIlczolZDogbm8gcGx1ZyBmb3VuZDogdGhyZWFkX2lkICVsdVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcGQtPnRocmVhZF9pZCk7CiAJCWR1bXBfYm1wKCZwZXJfY3B1KHBzM19wcml2YXRlLCAwKSk7CiAJCWR1bXBfYm1wKCZwZXJfY3B1KHBzM19wcml2YXRlLCAxKSk7CiAJCXJldHVybiBOT19JUlE7CkBAIC03MDMsMTYgKzczNCwxNiBAQAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJc3RydWN0IHBzM19wcml2YXRlICpwZCA9ICZwZXJfY3B1KHBzM19wcml2YXRlLCBjcHUpOwogCi0JCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBkLT5ub2RlKTsKLQkJcGQtPmNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKwkJbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcGQtPnBwZV9pZCk7CisJCXBkLT50aHJlYWRfaWQgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CiAJCXNwaW5fbG9ja19pbml0KCZwZC0+Ym1wLmxvY2spOwogCi0JCXByX2RlYnVnKCIlczolZDogbm9kZSAlbHUsIGNwdSAlZCwgYm1wICVseGhcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIHBkLT5ub2RlLCBwZC0+Y3B1LAorCQlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbHUsIHRocmVhZF9pZCAlbHUsIGJtcCAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLAogCQkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKCZwZC0+Ym1wKSkpOwogCi0JCXJlc3VsdCA9IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwZC0+bm9kZSwgcGQtPmNwdSwKLQkJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYSgmcGQtPmJtcCkpKTsKKwkJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBkLT5wcGVfaWQsCisJCQlwZC0+dGhyZWFkX2lkLCBwczNfbW1fcGh5c190b19scGFyKF9fcGEoJnBkLT5ibXApKSk7CiAKIAkJaWYgKHJlc3VsdCkKIAkJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwIGZhaWxlZDoiCkBAIC03MjIsMyArNzUzLDE2IEBACiAKIAlwcGNfbWQuZ2V0X2lycSA9IHBzM19nZXRfaXJxOwogfQorCit2b2lkIHBzM19zaHV0ZG93bl9JUlEoaW50IGNwdSkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCBwcGVfaWQ7CisJdTY0IHRocmVhZF9pZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBwZV9pZCk7CisJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBwZV9pZCwgdGhyZWFkX2lkLCAwKTsKKworCURCRygiJXM6JWQ6IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCAoJWx1OiVsdS8lZCkgJXNcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgcHBlX2lkLCB0aHJlYWRfaWQsIGNwdSwgcHMzX3Jlc3VsdChyZXN1bHQpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCmluZGV4IGY4YTNlMjAuLjdiYjNlMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwpAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogZW51bSB7CkBAIC0xMTUsNyArMTE1LDggQEAKIH07CiAKICNkZWZpbmUgZGVidWdfZHVtcF9tYXAoeCkgX2RlYnVnX2R1bXBfbWFwKHgsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kZWJ1Z19kdW1wX21hcChjb25zdCBzdHJ1Y3QgbWFwKiBtLCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kZWJ1Z19kdW1wX21hcChjb25zdCBzdHJ1Y3QgbWFwICptLAorCWNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQogewogCURCRygiJXM6JWQ6IG1hcC50b3RhbCAgICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT50b3RhbCk7CiAJREJHKCIlczolZDogbWFwLnJtLnNpemUgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnJtLnNpemUpOwpAQCAtMjEyLDkgKzIxMywxNSBAQAogCiB2b2lkIHBzM19tbV92YXNfZGVzdHJveSh2b2lkKQogeworCWludCByZXN1bHQ7CisKKwlEQkcoIiVzOiVkOiBtYXAudmFzX2lkICAgID0gJWx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1hcC52YXNfaWQpOworCiAJaWYgKG1hcC52YXNfaWQpIHsKLQkJbHYxX3NlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UoMCk7Ci0JCWx2MV9kZXN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UobWFwLnZhc19pZCk7CisJCXJlc3VsdCA9IGx2MV9zZWxlY3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlKDApOworCQlCVUdfT04ocmVzdWx0KTsKKwkJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZShtYXAudmFzX2lkKTsKKwkJQlVHX09OKHJlc3VsdCk7CiAJCW1hcC52YXNfaWQgPSAwOwogCX0KIH0KQEAgLTIzMiw3ICsyMzksNyBAQAogICogQHNpemUgaXMgcm91bmRlZCBkb3duIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHZhcyBsYXJnZSBwYWdlIHNpemUuCiAgKi8KIAotaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIG11aWQ7CkBAIC0yNzMsMTAgKzI4MCwxNCBAQAogICogQHI6IHBvaW50ZXIgdG8gc3RydWN0IG1lbV9yZWdpb24KICAqLwogCi12b2lkIHBzM19tbV9yZWdpb25fZGVzdHJveShzdHJ1Y3QgbWVtX3JlZ2lvbiAqcikKK3N0YXRpYyB2b2lkIHBzM19tbV9yZWdpb25fZGVzdHJveShzdHJ1Y3QgbWVtX3JlZ2lvbiAqcikKIHsKKwlpbnQgcmVzdWx0OworCisJREJHKCIlczolZDogci0+YmFzZSA9ICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgci0+YmFzZSk7CiAJaWYgKHItPmJhc2UpIHsKLQkJbHYxX3JlbGVhc2VfbWVtb3J5KHItPmJhc2UpOworCQlyZXN1bHQgPSBsdjFfcmVsZWFzZV9tZW1vcnkoci0+YmFzZSk7CisJCUJVR19PTihyZXN1bHQpOwogCQlyLT5zaXplID0gci0+YmFzZSA9IHItPm9mZnNldCA9IDA7CiAJCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplOwogCX0KQEAgLTMyOSwzMSArMzQwLDM0IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioKLSAqIGRtYV9scGFyX3RvX2J1cyAtIFRyYW5zbGF0ZSBhbiBscGFyIGFkZHJlc3MgdG8gaW9jIG1hcHBlZCBidXMgYWRkcmVzcy4KKyAqIGRtYV9zYl9scGFyX3RvX2J1cyAtIFRyYW5zbGF0ZSBhbiBscGFyIGFkZHJlc3MgdG8gaW9jIG1hcHBlZCBidXMgYWRkcmVzcy4KICAqIEByOiBwb2ludGVyIHRvIGRtYSByZWdpb24gc3RydWN0dXJlCiAgKiBAbHBhcl9hZGRyOiBIViBscGFyIGFkZHJlc3MKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfbHBhcl90b19idXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX3NiX2xwYXJfdG9fYnVzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKIAl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcikKIHsKLQlCVUdfT04obHBhcl9hZGRyID49IG1hcC5yMS5iYXNlICsgbWFwLnIxLnNpemUpOwotCXJldHVybiByLT5idXNfYWRkciArIChscGFyX2FkZHIgPD0gbWFwLnJtLnNpemUgPyBscGFyX2FkZHIKLQkJOiBscGFyX2FkZHIgLSBtYXAucjEub2Zmc2V0KTsKKwlpZiAobHBhcl9hZGRyID49IG1hcC5ybS5zaXplKQorCQlscGFyX2FkZHIgLT0gbWFwLnIxLm9mZnNldDsKKwlCVUdfT04obHBhcl9hZGRyIDwgci0+b2Zmc2V0KTsKKwlCVUdfT04obHBhcl9hZGRyID49IHItPm9mZnNldCArIHItPmxlbik7CisJcmV0dXJuIHItPmJ1c19hZGRyICsgbHBhcl9hZGRyIC0gci0+b2Zmc2V0OwogfQogCiAjZGVmaW5lIGRtYV9kdW1wX3JlZ2lvbihfYSkgX2RtYV9kdW1wX3JlZ2lvbihfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2RtYV9kdW1wX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIGNvbnN0IGNoYXIqIGZ1bmMsCi0JaW50IGxpbmUpCitzdGF0aWMgdm9pZCAgX19tYXliZV91bnVzZWQgX2RtYV9kdW1wX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCiB7Ci0JREJHKCIlczolZDogZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGlkLmJ1c19pZCwKLQkJci0+ZGlkLmRldl9pZCk7CisJREJHKCIlczolZDogZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGV2LT5idXNfaWQsCisJCXItPmRldi0+ZGV2X2lkKTsKIAlEQkcoIiVzOiVkOiBwYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCByLT5wYWdlX3NpemUpOwogCURCRygiJXM6JWQ6IGJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+YnVzX2FkZHIpOwogCURCRygiJXM6JWQ6IGxlbiAgICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKKwlEQkcoIiVzOiVkOiBvZmZzZXQgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPm9mZnNldCk7CiB9CiAKLS8qKgorICAvKioKICAqIGRtYV9jaHVuayAtIEEgY2h1bmsgb2YgZG1hIHBhZ2VzIG1hcHBlZCBieSB0aGUgaW8gY29udHJvbGxlci4KICAqIEByZWdpb24gLSBUaGUgZG1hIHJlZ2lvbiB0aGF0IG93bnMgdGhpcyBjaHVuay4KICAqIEBscGFyX2FkZHI6IFN0YXJ0aW5nIGxwYXIgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCkBAIC0zODEsMTAgKzM5NSwxMSBAQAogCWludCBsaW5lKQogewogCURCRygiJXM6JWQ6IHIuZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwKLQkJYy0+cmVnaW9uLT5kaWQuYnVzX2lkLCBjLT5yZWdpb24tPmRpZC5kZXZfaWQpOworCQljLT5yZWdpb24tPmRldi0+YnVzX2lkLCBjLT5yZWdpb24tPmRldi0+ZGV2X2lkKTsKIAlEQkcoIiVzOiVkOiByLmJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5idXNfYWRkcik7CiAJREJHKCIlczolZDogci5wYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPnBhZ2Vfc2l6ZSk7CiAJREJHKCIlczolZDogci5sZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+bGVuKTsKKwlEQkcoIiVzOiVkOiByLm9mZnNldCAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5vZmZzZXQpOwogCURCRygiJXM6JWQ6IGMubHBhcl9hZGRyICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5scGFyX2FkZHIpOwogCURCRygiJXM6JWQ6IGMuYnVzX2FkZHIgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5idXNfYWRkcik7CiAJREJHKCIlczolZDogYy5sZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPmxlbik7CkBAIC0zOTUsMzkgKzQxMCw2OCBAQAogewogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2J1cyA9IF9BTElHTl9ET1dOKGJ1c19hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7Ci0JdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4sIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbitidXNfYWRkci1hbGlnbmVkX2J1cywKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CiAJCS8qIGludGVyc2VjdGlvbiAqLwotCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIKLQkJCSYmIGFsaWduZWRfYnVzIDwgYy0+YnVzX2FkZHIgKyBjLT5sZW4KLQkJCSYmIGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pIHsKKwkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyICYmCisJCSAgICBhbGlnbmVkX2J1cyArIGFsaWduZWRfbGVuIDw9IGMtPmJ1c19hZGRyICsgYy0+bGVuKQogCQkJcmV0dXJuIGM7Ci0JCX0KKwogCQkvKiBiZWxvdyAqLwotCQlpZiAoYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkcikgeworCQlpZiAoYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkcikKIAkJCWNvbnRpbnVlOwotCQl9CisKIAkJLyogYWJvdmUgKi8KLQkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyICsgYy0+bGVuKSB7CisJCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkciArIGMtPmxlbikKIAkJCWNvbnRpbnVlOwotCQl9CiAKIAkJLyogd2UgZG9uJ3QgaGFuZGxlIHRoZSBtdWx0aS1jaHVuayBjYXNlIGZvciBub3cgKi8KLQogCQlkbWFfZHVtcF9jaHVuayhjKTsKIAkJQlVHKCk7CiAJfQogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGRtYV9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCitzdGF0aWMgc3RydWN0IGRtYV9jaHVuayAqZG1hX2ZpbmRfY2h1bmtfbHBhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xwYXIgPSBfQUxJR05fRE9XTihscGFyX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIGxwYXJfYWRkciAtIGFsaWduZWRfbHBhciwKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CisJCS8qIGludGVyc2VjdGlvbiAqLworCQlpZiAoYy0+bHBhcl9hZGRyIDw9IGFsaWduZWRfbHBhciAmJgorCQkgICAgYWxpZ25lZF9scGFyIDwgYy0+bHBhcl9hZGRyICsgYy0+bGVuKSB7CisJCQlpZiAoYWxpZ25lZF9scGFyICsgYWxpZ25lZF9sZW4gPD0gYy0+bHBhcl9hZGRyICsgYy0+bGVuKQorCQkJCXJldHVybiBjOworCQkJZWxzZSB7CisJCQkJZG1hX2R1bXBfY2h1bmsoYyk7CisJCQkJQlVHKCk7CisJCQl9CisJCX0KKwkJLyogYmVsb3cgKi8KKwkJaWYgKGFsaWduZWRfbHBhciArIGFsaWduZWRfbGVuIDw9IGMtPmxwYXJfYWRkcikgeworCQkJY29udGludWU7CisJCX0KKwkJLyogYWJvdmUgKi8KKwkJaWYgKGMtPmxwYXJfYWRkciArIGMtPmxlbiA8PSBhbGlnbmVkX2xwYXIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGRtYV9zYl9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlpZiAoYy0+YnVzX2FkZHIpIHsKLQkJcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwKLQkJCWMtPnJlZ2lvbi0+ZGlkLmRldl9pZCwgYy0+YnVzX2FkZHIsIGMtPmxlbik7CisJCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfZG1hX3JlZ2lvbihjLT5yZWdpb24tPmRldi0+YnVzX2lkLAorCQkJYy0+cmVnaW9uLT5kZXYtPmRldl9pZCwgYy0+YnVzX2FkZHIsIGMtPmxlbik7CiAJCUJVR19PTihyZXN1bHQpOwogCX0KIApAQCAtNDM1LDggKzQ3OSwzOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfZnJlZV9jaHVuayhzdHJ1Y3QgZG1hX2NodW5rICpjKQoreworCWludCByZXN1bHQgPSAwOworCWludCBpb3BhZ2U7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpyID0gYy0+cmVnaW9uOworCisJREJHKCIlczpzdGFydFxuIiwgX19mdW5jX18pOworCWZvciAoaW9wYWdlID0gMDsgaW9wYWdlIDwgKGMtPmxlbiA+PiByLT5wYWdlX3NpemUpOyBpb3BhZ2UrKykgeworCQlvZmZzZXQgPSAoMSA8PCByLT5wYWdlX3NpemUpICogaW9wYWdlOworCQkvKiBwdXQgSU5WQUxJRCBlbnRyeSAqLworCQlyZXN1bHQgPSBsdjFfcHV0X2lvcHRlKDAsCisJCQkJICAgICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICBjLT5scGFyX2FkZHIgKyBvZmZzZXQsCisJCQkJICAgICAgIHItPmlvaWQsCisJCQkJICAgICAgIDApOworCQlEQkcoIiVzOiBidXM9JSNseCwgbHBhcj0lI2x4LCBpb2lkPSVkXG4iLCBfX2Z1bmNfXywKKwkJICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkgICAgci0+aW9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJREJHKCIlczolZDogbHYxX3B1dF9pb3B0ZSBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJfQorCX0KKwlrZnJlZShjKTsKKwlEQkcoIiVzOmVuZFxuIiwgX19mdW5jX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgotICogZG1hX21hcF9wYWdlcyAtIE1hcHMgZG1hIHBhZ2VzIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYnVzIGFkZHJlc3Mgc3BhY2UuCisgKiBkbWFfc2JfbWFwX3BhZ2VzIC0gTWFwcyBkbWEgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBidXMgYWRkcmVzcyBzcGFjZS4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICogQHBoeXNfYWRkcjogU3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgpAQCAtNDQ2LDggKzUyMSw4IEBACiAgKiBtYWtlIHRoZSBIViBjYWxsIHRvIGFkZCB0aGUgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBhZGRyZXNzIHNwYWNlLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9wYWdlcyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgZG1hX2NodW5rICoqY19vdXQpCitzdGF0aWMgaW50IGRtYV9zYl9tYXBfcGFnZXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCwgdTY0IGlvcHRlX2ZsYWcpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwpAQCAtNDYxLDEzICs1MzYsMTMgQEAKIAogCWMtPnJlZ2lvbiA9IHI7CiAJYy0+bHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOwotCWMtPmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIGMtPmxwYXJfYWRkcik7CisJYy0+YnVzX2FkZHIgPSBkbWFfc2JfbHBhcl90b19idXMociwgYy0+bHBhcl9hZGRyKTsKIAljLT5sZW4gPSBsZW47CiAKLQlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwKLQkJYy0+cmVnaW9uLT5kaWQuZGV2X2lkLCBjLT5scGFyX2FkZHIsIGMtPmJ1c19hZGRyLCBjLT5sZW4sCi0JCTB4ZjgwMDAwMDAwMDAwMDAwMFVMKTsKLQorCUJVR19PTihpb3B0ZV9mbGFnICE9IDB4ZjgwMDAwMDAwMDAwMDAwMFVMKTsKKwlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGV2LT5idXNfaWQsCisJCQkJCSAgIGMtPnJlZ2lvbi0+ZGV2LT5kZXZfaWQsIGMtPmxwYXJfYWRkciwKKwkJCQkJICAgYy0+YnVzX2FkZHIsIGMtPmxlbiwgaW9wdGVfZmxhZyk7CiAJaWYgKHJlc3VsdCkgewogCQlEQkcoIiVzOiVkOiBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CkBAIC00ODcsMjYgKzU2MiwxMjAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IGRtYV9pb2MwX21hcF9wYWdlcyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCwKKwkJCSAgICAgIHU2NCBpb3B0ZV9mbGFnKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRtYV9jaHVuayAqYywgKmxhc3Q7CisJaW50IGlvcGFnZSwgcGFnZXM7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlEQkcoS0VSTl9FUlIgIiVzOiBwaHk9JSNseCwgbHBhciUjbHgsIGxlbj0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgcGh5c19hZGRyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkciksIGxlbik7CisJYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfY2h1bmspLCBHRlBfQVRPTUlDKTsKKworCWlmICghYykgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2M7CisJfQorCisJYy0+cmVnaW9uID0gcjsKKwljLT5sZW4gPSBsZW47CisJYy0+bHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOworCS8qIGFsbG9jYXRlIElPIGFkZHJlc3MgKi8KKwlpZiAobGlzdF9lbXB0eSgmci0+Y2h1bmtfbGlzdC5oZWFkKSkgeworCQkvKiBmaXJzdCBvbmUgKi8KKwkJYy0+YnVzX2FkZHIgPSByLT5idXNfYWRkcjsKKwl9IGVsc2UgeworCQkvKiBkZXJpdmUgZnJvbSBsYXN0IGJ1cyBhZGRyKi8KKwkJbGFzdCAgPSBsaXN0X2VudHJ5KHItPmNodW5rX2xpc3QuaGVhZC5uZXh0LAorCQkJCSAgIHN0cnVjdCBkbWFfY2h1bmssIGxpbmspOworCQljLT5idXNfYWRkciA9IGxhc3QtPmJ1c19hZGRyICsgbGFzdC0+bGVuOworCQlEQkcoIiVzOiBsYXN0IGJ1cz0lI2x4LCBsZW49JSNseFxuIiwgX19mdW5jX18sCisJCSAgICBsYXN0LT5idXNfYWRkciwgbGFzdC0+bGVuKTsKKwl9CisKKwkvKiBGSVhNRTogY2hlY2sgd2hldGhlciBsZW5ndGggZXhjZWVkcyByZWdpb24gc2l6ZSAqLworCisJLyogYnVpbGQgaW9wdGVzIGZvciB0aGUgYXJlYSAqLworCXBhZ2VzID0gbGVuID4+IHItPnBhZ2Vfc2l6ZTsKKwlEQkcoIiVzOiBwZ3NpemU9JSN4IGxlbj0lI2x4IHBhZ2VzPSUjeCBpb3B0ZWZsYWc9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHItPnBhZ2Vfc2l6ZSwgci0+bGVuLCBwYWdlcywgaW9wdGVfZmxhZyk7CisJZm9yIChpb3BhZ2UgPSAwOyBpb3BhZ2UgPCBwYWdlczsgaW9wYWdlKyspIHsKKwkJb2Zmc2V0ID0gKDEgPDwgci0+cGFnZV9zaXplKSAqIGlvcGFnZTsKKwkJcmVzdWx0ID0gbHYxX3B1dF9pb3B0ZSgwLAorCQkJCSAgICAgICBjLT5idXNfYWRkciArIG9mZnNldCwKKwkJCQkgICAgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICByLT5pb2lkLAorCQkJCSAgICAgICBpb3B0ZV9mbGFnKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24gIgorCQkJCSJmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCWdvdG8gZmFpbF9tYXA7CisJCX0KKwkJREJHKCIlczogcGc9JWQgYnVzPSUjbHgsIGxwYXI9JSNseCwgaW9pZD0lI3hcbiIsIF9fZnVuY19fLAorCQkgICAgaW9wYWdlLCBjLT5idXNfYWRkciArIG9mZnNldCwgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkgICAgci0+aW9pZCk7CisJfQorCisJLyogYmUgc3VyZSB0aGF0IGxhc3QgYWxsb2NhdGVkIG9uZSBpcyBpbnNlcnRlZCBhdCBoZWFkICovCisJbGlzdF9hZGQoJmMtPmxpbmssICZyLT5jaHVua19saXN0LmhlYWQpOworCisJKmNfb3V0ID0gYzsKKwlEQkcoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKKworZmFpbF9tYXA6CisJZm9yIChpb3BhZ2UtLTsgMCA8PSBpb3BhZ2U7IGlvcGFnZS0tKSB7CisJCWx2MV9wdXRfaW9wdGUoMCwKKwkJCSAgICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkJICAgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkJICAgICAgci0+aW9pZCwKKwkJCSAgICAgIDApOworCX0KKwlrZnJlZShjKTsKK2ZhaWxfYWxsb2M6CisJKmNfb3V0ID0gTlVMTDsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKioKLSAqIGRtYV9yZWdpb25fY3JlYXRlIC0gQ3JlYXRlIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBkbWFfc2JfcmVnaW9uX2NyZWF0ZSAtIENyZWF0ZSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKgogICogVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIGRtYSByZWdpb24gY3JlYXRlIHJvdXRpbmUsIGFuZCBpcyB0aGUgb25lIHRoYXQKICAqIHdpbGwgbWFrZSB0aGUgSFYgY2FsbCB0byBjcmVhdGUgdGhlIHJlZ2lvbi4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiogcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CiAKLQlyLT5sZW4gPSBfQUxJR05fVVAobWFwLnRvdGFsLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJcHJfaW5mbygiIC0+ICVzOiVkOlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCUJVR19PTighcik7CisKKwlpZiAoIXItPmRldi0+YnVzX2lkKSB7CisJCXByX2luZm8oIiVzOiVkOiAldToldSBubyBkbWFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCk7CisJCXJldHVybiAwOworCX0KKworCURCRygiJXM6JXU6IGxlbiA9IDB4JWx4LCBwYWdlX3NpemUgPSAldSwgb2Zmc2V0ID0gMHglbHhcbiIsIF9fZnVuY19fLAorCSAgICBfX0xJTkVfXywgci0+bGVuLCByLT5wYWdlX3NpemUsIHItPm9mZnNldCk7CisKKwlCVUdfT04oIXItPmxlbik7CisJQlVHX09OKCFyLT5wYWdlX3NpemUpOworCUJVR19PTighci0+cmVnaW9uX29wcyk7CisKIAlJTklUX0xJU1RfSEVBRCgmci0+Y2h1bmtfbGlzdC5oZWFkKTsKIAlzcGluX2xvY2tfaW5pdCgmci0+Y2h1bmtfbGlzdC5sb2NrKTsKIAotCXJlc3VsdCA9IGx2MV9hbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAotCQlyLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgci0+cmVnaW9uX3R5cGUsICZyLT5idXNfYWRkcik7Ci0KLQlkbWFfZHVtcF9yZWdpb24ocik7CisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uKHItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCwKKwkJcm91bmR1cF9wb3dfb2ZfdHdvKHItPmxlbiksIHItPnBhZ2Vfc2l6ZSwgci0+cmVnaW9uX3R5cGUsCisJCSZyLT5idXNfYWRkcik7CiAKIAlpZiAocmVzdWx0KSB7CiAJCURCRygiJXM6JWQ6IGx2MV9hbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLApAQCAtNTE3LDYgKzY4NiwyNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKworCUlOSVRfTElTVF9IRUFEKCZyLT5jaHVua19saXN0LmhlYWQpOworCXNwaW5fbG9ja19pbml0KCZyLT5jaHVua19saXN0LmxvY2spOworCisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2lvX3NlZ21lbnQoMCwKKwkJCQkJIHItPmxlbiwKKwkJCQkJIHItPnBhZ2Vfc2l6ZSwKKwkJCQkJICZyLT5idXNfYWRkcik7CisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBsdjFfYWxsb2NhdGVfaW9fc2VnbWVudCBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisJfQorCURCRygiJXM6IGxlbj0lI2x4LCBwZz0lZCwgYnVzPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgci0+YnVzX2FkZHIpOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICogZG1hX3JlZ2lvbl9mcmVlIC0gRnJlZSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCkBAIC01MjUsMzEgKzcxNSw2MiBAQAogICogd2lsbCBtYWtlIHRoZSBIViBjYWxsIHRvIGZyZWUgdGhlIHJlZ2lvbi4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24qIHIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwogCXN0cnVjdCBkbWFfY2h1bmsgKnRtcDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKLQkJbGlzdF9kZWwoJmMtPmxpbmspOwotCQlkbWFfZnJlZV9jaHVuayhjKTsKKwlCVUdfT04oIXIpOworCisJaWYgKCFyLT5kZXYtPmJ1c19pZCkgeworCQlwcl9pbmZvKCIlczolZDogJXU6JXUgbm8gZG1hXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQpOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXN1bHQgPSBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfc2JfZnJlZV9jaHVuayhjKTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQsCiAJCXItPmJ1c19hZGRyKTsKIAogCWlmIChyZXN1bHQpCiAJCURCRygiJXM6JWQ6IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQlyLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisJci0+YnVzX2FkZHIgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkbWFfaW9jMF9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjLCAqbjsKKworCURCRygiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIG4sICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfaW9jMF9mcmVlX2NodW5rKGMpOworCX0KKworCXJlc3VsdCA9IGx2MV9yZWxlYXNlX2lvX3NlZ21lbnQoMCwgci0+YnVzX2FkZHIpOworCisJaWYgKHJlc3VsdCkKKwkJREJHKCIlczolZDogbHYxX2ZyZWVfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKworCXItPmJ1c19hZGRyID0gMDsKKwlEQkcoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgotICogZG1hX21hcF9hcmVhIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl9tYXBfYXJlYSAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqIEB2aXJ0X2FkZHI6IFN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgpAQCAtNTU5LDE2ICs3ODAsMTkgQEAKICAqIFRoaXMgaXMgdGhlIGNvbW1vbiBkbWEgbWFwcGluZyByb3V0aW5lLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKQorc3RhdGljIGludCBkbWFfc2JfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkgICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJICAgdTY0IGlvcHRlX2ZsYWcpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBpc19rZXJuZWxfYWRkcih2aXJ0X2FkZHIpID8gX19wYSh2aXJ0X2FkZHIpCiAJCTogdmlydF9hZGRyOwotCi0JKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX3BoeXMgPSBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIHBoeXNfYWRkciAtIGFsaWduZWRfcGh5cywKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCSpidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcikpOwogCiAJaWYgKCFVU0VfRFlOQU1JQ19ETUEpIHsKIAkJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIgPSBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcik7CkBAIC01ODgsMTcgKzgxMiwxOCBAQAogCWMgPSBkbWFfZmluZF9jaHVuayhyLCAqYnVzX2FkZHIsIGxlbik7CiAKIAlpZiAoYykgeworCQlEQkcoIiVzOiVkOiByZXVzaW5nIG1hcHBlZCBjaHVuayIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWRtYV9kdW1wX2NodW5rKGMpOwogCQljLT51c2FnZV9jb3VudCsrOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmVzdWx0ID0gZG1hX21hcF9wYWdlcyhyLCBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKSwKLQkJX0FMSUdOX1VQKGxlbiwgMSA8PCByLT5wYWdlX3NpemUpLCAmYyk7CisJcmVzdWx0ID0gZG1hX3NiX21hcF9wYWdlcyhyLCBhbGlnbmVkX3BoeXMsIGFsaWduZWRfbGVuLCAmYywgaW9wdGVfZmxhZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCSpidXNfYWRkciA9IDA7Ci0JCURCRygiJXM6JWQ6IGRtYV9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCisJCURCRygiJXM6JWQ6IGRtYV9zYl9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtNjEwLDggKzgzNSw1NyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwkgICAgIHU2NCBpb3B0ZV9mbGFnKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gaXNfa2VybmVsX2FkZHIodmlydF9hZGRyKSA/IF9fcGEodmlydF9hZGRyKQorCQk6IHZpcnRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfcGh5cyA9IF9BTElHTl9ET1dOKHBoeXNfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzLAorCQkJCQkgICAgICAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisKKwlEQkcoS0VSTl9FUlIgIiVzOiB2YWRkcj0lI2x4LCBsZW49JSNseFxuIiwgX19mdW5jX18sCisJICAgIHZpcnRfYWRkciwgbGVuKTsKKwlEQkcoS0VSTl9FUlIgIiVzOiBwaD0lI2x4IGFfcGg9JSNseCBhX2w9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHBoeXNfYWRkciwgYWxpZ25lZF9waHlzLCBhbGlnbmVkX2xlbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJYyA9IGRtYV9maW5kX2NodW5rX2xwYXIociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpLCBsZW4pOworCisJaWYgKGMpIHsKKwkJLyogRklYTUUgKi8KKwkJQlVHKCk7CisJCSpidXNfYWRkciA9IGMtPmJ1c19hZGRyICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzOworCQljLT51c2FnZV9jb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzdWx0ID0gZG1hX2lvYzBfbWFwX3BhZ2VzKHIsIGFsaWduZWRfcGh5cywgYWxpZ25lZF9sZW4sICZjLAorCQkJCSAgICBpb3B0ZV9mbGFnKTsKKworCWlmIChyZXN1bHQpIHsKKwkJKmJ1c19hZGRyID0gMDsKKwkJREJHKCIlczolZDogZG1hX2lvYzBfbWFwX3BhZ2VzIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJKmJ1c19hZGRyID0gYy0+YnVzX2FkZHIgKyBwaHlzX2FkZHIgLSBhbGlnbmVkX3BoeXM7CisJREJHKCIlczogdmE9JSNseCBwYT0lI2x4IGFfcGE9JSNseCBidXM9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHZpcnRfYWRkciwgcGh5c19hZGRyLCBhbGlnbmVkX3BoeXMsICpidXNfYWRkcik7CisJYy0+dXNhZ2VfY291bnQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCi0gKiBkbWFfdW5tYXBfYXJlYSAtIFVubWFwIGFuIGFyZWEgb2YgbWVtb3J5IGZyb20gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl91bm1hcF9hcmVhIC0gVW5tYXAgYW4gYXJlYSBvZiBtZW1vcnkgZnJvbSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAYnVzX2FkZHI6IFRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCkBAIC02MTksNyArODkzLDcgQEAKICAqIFRoaXMgaXMgdGhlIGNvbW1vbiBkbWEgdW5tYXAgcm91dGluZS4KICAqLwogCi1pbnQgZG1hX3VubWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorc3RhdGljIGludCBkbWFfc2JfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTYzMSw3ICs5MDUsOCBAQAogCWlmICghYykgewogCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsCiAJCQkxIDw8IHItPnBhZ2Vfc2l6ZSk7Ci0JCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgYnVzX2FkZHIKKwkJCS0gYWxpZ25lZF9idXMsIDEgPDwgci0+cGFnZV9zaXplKTsKIAkJREJHKCIlczolZDogbm90IGZvdW5kOiBidXNfYWRkciAlbHhoXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfYWRkcik7CiAJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogbGVuICVseGhcbiIsCkBAIC02NDcsOTQgKzkyMiwxNjYgQEAKIAogCWlmICghYy0+dXNhZ2VfY291bnQpIHsKIAkJbGlzdF9kZWwoJmMtPmxpbmspOwotCQlkbWFfZnJlZV9jaHVuayhjKTsKKwkJZG1hX3NiX2ZyZWVfY2h1bmsoYyk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJCQl1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisKKwlEQkcoIiVzOiBzdGFydCBhPSUjbHggbD0lI2x4XG4iLCBfX2Z1bmNfXywgYnVzX2FkZHIsIGxlbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCWMgPSBkbWFfZmluZF9jaHVuayhyLCBidXNfYWRkciwgbGVuKTsKKworCWlmICghYykgeworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsCisJCQkJCQkJMSA8PCByLT5wYWdlX3NpemUpOworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIGJ1c19hZGRyCisJCQkJCQkgICAgICAtIGFsaWduZWRfYnVzLAorCQkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGJ1c19hZGRyICVseGhcbiIsCisJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19hZGRyKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBsZW4gJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgbGVuKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBhbGlnbmVkX2J1cyAlbHhoXG4iLAorCQkgICAgX19mdW5jX18sIF9fTElORV9fLCBhbGlnbmVkX2J1cyk7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYWxpZ25lZF9sZW4gJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgYWxpZ25lZF9sZW4pOworCQlCVUcoKTsKKwl9CisKKwljLT51c2FnZV9jb3VudC0tOworCisJaWYgKCFjLT51c2FnZV9jb3VudCkgeworCQlsaXN0X2RlbCgmYy0+bGluayk7CisJCWRtYV9pb2MwX2ZyZWVfY2h1bmsoYyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJREJHKCIlczogZW5kXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKIC8qKgotICogZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyIC0gU2V0dXAgYSBsaW5lYXIgZG1hIG1hcGluZyBmb3IgYSBkZXZpY2UuCisgKiBkbWFfc2JfcmVnaW9uX2NyZWF0ZV9saW5lYXIgLSBTZXR1cCBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqCiAgKiBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhbiBIViBkbWEgcmVnaW9uIGZvciB0aGUgZGV2aWNlIGFuZCBtYXBzIGFsbCBhdmFpbGFibGUKICAqIHJhbSBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGJ1cyBhZGRyZXNzIHNwYWNlLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCBsZW4sIHRtcDsKIAotCS8qIGZvcmNlIDE2TSBkbWEgcGFnZXMgZm9yIGxpbmVhciBtYXBwaW5nICovCi0KLQlpZiAoci0+cGFnZV9zaXplICE9IFBTM19ETUFfMTZNKSB7Ci0JCXByX2luZm8oIiVzOiVkOiBmb3JjaW5nIDE2TSBwYWdlcyBmb3IgbGluZWFyIG1hcFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXItPnBhZ2Vfc2l6ZSA9IFBTM19ETUFfMTZNOworCWlmIChyLT5sZW4gPiAxNioxMDI0KjEwMjQpIHsJLyogRklYTUU6IG5lZWQgcHJvcGVyIGZpeCAqLworCQkvKiBmb3JjZSAxNk0gZG1hIHBhZ2VzIGZvciBsaW5lYXIgbWFwcGluZyAqLworCQlpZiAoci0+cGFnZV9zaXplICE9IFBTM19ETUFfMTZNKSB7CisJCQlwcl9pbmZvKCIlczolZDogZm9yY2luZyAxNk0gcGFnZXMgZm9yIGxpbmVhciBtYXBcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXItPnBhZ2Vfc2l6ZSA9IFBTM19ETUFfMTZNOworCQkJci0+bGVuID0gX0FMSUdOX1VQKHItPmxlbiwgMSA8PCByLT5wYWdlX3NpemUpOworCQl9CiAJfQogCi0JcmVzdWx0ID0gZG1hX3JlZ2lvbl9jcmVhdGUocik7CisJcmVzdWx0ID0gZG1hX3NiX3JlZ2lvbl9jcmVhdGUocik7CiAJQlVHX09OKHJlc3VsdCk7CiAKLQlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnJtLmJhc2UsIG1hcC5ybS5zaXplLCAmdG1wKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0IDwgbWFwLnJtLnNpemUpIHsKKwkJLyogTWFwIChwYXJ0IG9mKSAxc3QgUkFNIGNodW5rICovCisJCXZpcnRfYWRkciA9IG1hcC5ybS5iYXNlICsgci0+b2Zmc2V0OworCQlsZW4gPSBtYXAucm0uc2l6ZSAtIHItPm9mZnNldDsKKwkJaWYgKGxlbiA+IHItPmxlbikKKwkJCWxlbiA9IHItPmxlbjsKKwkJcmVzdWx0ID0gZG1hX3NiX21hcF9hcmVhKHIsIHZpcnRfYWRkciwgbGVuLCAmdG1wLAorCQkJSU9QVEVfUFBfVyB8IElPUFRFX1BQX1IgfCBJT1BURV9TT19SVyB8IElPUFRFX00pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKLQlpZiAoVVNFX0xQQVJfQUREUikKLQkJcmVzdWx0ID0gZG1hX21hcF9hcmVhKHIsIG1hcC5yMS5iYXNlLCBtYXAucjEuc2l6ZSwKLQkJCSZ0bXApOwotCWVsc2UKLQkJcmVzdWx0ID0gZG1hX21hcF9hcmVhKHIsIG1hcC5ybS5zaXplLCBtYXAucjEuc2l6ZSwKLQkJCSZ0bXApOwotCi0JQlVHX09OKHJlc3VsdCk7CisJaWYgKHItPm9mZnNldCArIHItPmxlbiA+IG1hcC5ybS5zaXplKSB7CisJCS8qIE1hcCAocGFydCBvZikgMm5kIFJBTSBjaHVuayAqLworCQl2aXJ0X2FkZHIgPSBVU0VfTFBBUl9BRERSID8gbWFwLnIxLmJhc2UgOiBtYXAucm0uc2l6ZTsKKwkJbGVuID0gci0+bGVuOworCQlpZiAoci0+b2Zmc2V0ID49IG1hcC5ybS5zaXplKQorCQkJdmlydF9hZGRyICs9IHItPm9mZnNldCAtIG1hcC5ybS5zaXplOworCQllbHNlCisJCQlsZW4gLT0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCXJlc3VsdCA9IGRtYV9zYl9tYXBfYXJlYShyLCB2aXJ0X2FkZHIsIGxlbiwgJnRtcCwKKwkJCUlPUFRFX1BQX1cgfCBJT1BURV9QUF9SIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCi0gKiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyIC0gRnJlZSBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCisgKiBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyIC0gRnJlZSBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCB1bm1hcCBhbGwgbWFwcGVkIGFyZWFzIGFuZCBmcmVlIHRoZSBIViBkbWEgcmVnaW9uLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9mcmVlX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgbGVuLCBscGFyX2FkZHI7CiAKLQlyZXN1bHQgPSBkbWFfdW5tYXBfYXJlYShyLCBkbWFfbHBhcl90b19idXMociwgMCksIG1hcC5ybS5zaXplKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0IDwgbWFwLnJtLnNpemUpIHsKKwkJLyogVW5tYXAgKHBhcnQgb2YpIDFzdCBSQU0gY2h1bmsgKi8KKwkJbHBhcl9hZGRyID0gbWFwLnJtLmJhc2UgKyByLT5vZmZzZXQ7CisJCWxlbiA9IG1hcC5ybS5zaXplIC0gci0+b2Zmc2V0OworCQlpZiAobGVuID4gci0+bGVuKQorCQkJbGVuID0gci0+bGVuOworCQlidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBscGFyX2FkZHIpOworCQlyZXN1bHQgPSBkbWFfc2JfdW5tYXBfYXJlYShyLCBidXNfYWRkciwgbGVuKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCi0JcmVzdWx0ID0gZG1hX3VubWFwX2FyZWEociwgZG1hX2xwYXJfdG9fYnVzKHIsIG1hcC5yMS5iYXNlKSwKLQkJbWFwLnIxLnNpemUpOwotCUJVR19PTihyZXN1bHQpOworCWlmIChyLT5vZmZzZXQgKyByLT5sZW4gPiBtYXAucm0uc2l6ZSkgeworCQkvKiBVbm1hcCAocGFydCBvZikgMm5kIFJBTSBjaHVuayAqLworCQlscGFyX2FkZHIgPSBtYXAucjEuYmFzZTsKKwkJbGVuID0gci0+bGVuOworCQlpZiAoci0+b2Zmc2V0ID49IG1hcC5ybS5zaXplKQorCQkJbHBhcl9hZGRyICs9IHItPm9mZnNldCAtIG1hcC5ybS5zaXplOworCQllbHNlCisJCQlsZW4gLT0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCWJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIGxwYXJfYWRkcik7CisJCXJlc3VsdCA9IGRtYV9zYl91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKLQlyZXN1bHQgPSBkbWFfcmVnaW9uX2ZyZWUocik7CisJcmVzdWx0ID0gZG1hX3NiX3JlZ2lvbl9mcmVlKHIpOwogCUJVR19PTihyZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCi0gKiBkbWFfbWFwX2FyZWFfbGluZWFyIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl9tYXBfYXJlYV9saW5lYXIgLSBNYXAgYW4gYXJlYSBvZiBtZW1vcnkgaW50byBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAdmlydF9hZGRyOiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KICAqIEBidXNfYWRkcjogQSBwb2ludGVyIHRvIHJldHVybiB0aGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvCiAgKiBtYXAuCiAgKgotICogVGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucyB0aGUgY29yZXNwb25kaW5nIGJ1cyBhZGRyZXNzLiAgQWN0dWFsIG1hcHBpbmcKKyAqIFRoaXMgcm91dGluZSBqdXN0IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgYnVzIGFkZHJlc3MuICBBY3R1YWwgbWFwcGluZwogICogb2NjdXJzIGluIGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhcigpLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCi0JdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKK3N0YXRpYyBpbnQgZG1hX3NiX21hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwl1NjQgaW9wdGVfZmxhZykKIHsKIAl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKIAkJOiB2aXJ0X2FkZHI7Ci0JKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisJKmJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0NCw0MiArMTA5MSw5OCBAQAogICogQGJ1c19hZGRyOiBUaGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgogICoKLSAqIFRoaXMgcm91dGluZSBkb2VzIG5vdGhpbmcuICBVbm1hcHBpbmcgb2NjdXJzIGluIGRtYV9yZWdpb25fZnJlZV9saW5lYXIoKS4KKyAqIFRoaXMgcm91dGluZSBkb2VzIG5vdGhpbmcuICBVbm1hcHBpbmcgb2NjdXJzIGluIGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIoKS4KICAqLwogCi1zdGF0aWMgaW50IGRtYV91bm1hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCitzdGF0aWMgaW50IGRtYV9zYl91bm1hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCiAJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyBwczNfZG1hX3NiX3JlZ2lvbl9vcHMgPSAgeworCS5jcmVhdGUgPSBkbWFfc2JfcmVnaW9uX2NyZWF0ZSwKKwkuZnJlZSA9IGRtYV9zYl9yZWdpb25fZnJlZSwKKwkubWFwID0gZG1hX3NiX21hcF9hcmVhLAorCS51bm1hcCA9IGRtYV9zYl91bm1hcF9hcmVhCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyBwczNfZG1hX3NiX3JlZ2lvbl9saW5lYXJfb3BzID0geworCS5jcmVhdGUgPSBkbWFfc2JfcmVnaW9uX2NyZWF0ZV9saW5lYXIsCisJLmZyZWUgPSBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyLAorCS5tYXAgPSBkbWFfc2JfbWFwX2FyZWFfbGluZWFyLAorCS51bm1hcCA9IGRtYV9zYl91bm1hcF9hcmVhX2xpbmVhcgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgcHMzX2RtYV9pb2MwX3JlZ2lvbl9vcHMgPSB7CisJLmNyZWF0ZSA9IGRtYV9pb2MwX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBkbWFfaW9jMF9yZWdpb25fZnJlZSwKKwkubWFwID0gZG1hX2lvYzBfbWFwX2FyZWEsCisJLnVubWFwID0gZG1hX2lvYzBfdW5tYXBfYXJlYQorfTsKKworaW50IHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemUsCisJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcjsKKworCWxwYXJfYWRkciA9IGFkZHIgPyBwczNfbW1fcGh5c190b19scGFyKF9fcGEoYWRkcikpIDogMDsKKworCXItPmRldiA9IGRldjsKKwlyLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7CisJci0+cmVnaW9uX3R5cGUgPSByZWdpb25fdHlwZTsKKwlyLT5vZmZzZXQgPSBscGFyX2FkZHI7CisJaWYgKHItPm9mZnNldCA+PSBtYXAucm0uc2l6ZSkKKwkJci0+b2Zmc2V0IC09IG1hcC5yMS5vZmZzZXQ7CisJci0+bGVuID0gbGVuID8gbGVuIDogX0FMSUdOX1VQKG1hcC50b3RhbCwgMSA8PCByLT5wYWdlX3NpemUpOworCisJc3dpdGNoIChkZXYtPmRldl90eXBlKSB7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfU0I6CisJCXItPnJlZ2lvbl9vcHMgPSAgKFVTRV9EWU5BTUlDX0RNQSkKKwkJCT8gJnBzM19kbWFfc2JfcmVnaW9uX29wcworCQkJOiAmcHMzX2RtYV9zYl9yZWdpb25fbGluZWFyX29wczsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfSU9DMDoKKwkJci0+cmVnaW9uX29wcyA9ICZwczNfZG1hX2lvYzBfcmVnaW9uX29wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25faW5pdCk7CiAKIGludCBwczNfZG1hX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9yZWdpb25fY3JlYXRlKHIpCi0JCTogZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHIpOworCUJVR19PTighcik7CisJQlVHX09OKCFyLT5yZWdpb25fb3BzKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMtPmNyZWF0ZSk7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPmNyZWF0ZShyKTsKIH0KK0VYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25fY3JlYXRlKTsKIAogaW50IHBzM19kbWFfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9yZWdpb25fZnJlZShyKQotCQk6IGRtYV9yZWdpb25fZnJlZV9saW5lYXIocik7CisJQlVHX09OKCFyKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMpOworCUJVR19PTighci0+cmVnaW9uX29wcy0+ZnJlZSk7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPmZyZWUocik7CiB9CitFWFBPUlRfU1lNQk9MKHBzM19kbWFfcmVnaW9uX2ZyZWUpOwogCiBpbnQgcHMzX2RtYV9tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCXU2NCBpb3B0ZV9mbGFnKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9tYXBfYXJlYShyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIpCi0JCTogZG1hX21hcF9hcmVhX2xpbmVhcihyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIpOworCXJldHVybiByLT5yZWdpb25fb3BzLT5tYXAociwgdmlydF9hZGRyLCBsZW4sIGJ1c19hZGRyLCBpb3B0ZV9mbGFnKTsKIH0KIAogaW50IHBzM19kbWFfdW5tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKSA/IGRtYV91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pCi0JCTogZG1hX3VubWFwX2FyZWFfbGluZWFyKHIsIGJ1c19hZGRyLCBsZW4pOworCXJldHVybiByLT5yZWdpb25fb3BzLT51bm1hcChyLCBidXNfYWRkciwgbGVuKTsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTgxMCwxMiArMTIxMywxMyBAQAogCUJVR19PTihtYXAucm0uYmFzZSk7CiAJQlVHX09OKCFtYXAucm0uc2l6ZSk7CiAKLQlsbWJfYWRkKG1hcC5ybS5iYXNlLCBtYXAucm0uc2l6ZSk7Ci0JbG1iX2FuYWx5emUoKTsKIAogCS8qIGFycmFuZ2UgdG8gZG8gdGhpcyBpbiBwczNfbW1fYWRkX21lbW9yeSAqLwogCXBzM19tbV9yZWdpb25fY3JlYXRlKCZtYXAucjEsIG1hcC50b3RhbCAtIG1hcC5ybS5zaXplKTsKIAorCS8qIGNvcnJlY3QgbWFwLnRvdGFsIGZvciB0aGUgcmVhbCB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHdlIHVzZSAqLworCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplICsgbWFwLnIxLnNpemU7CisKIAlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCmluZGV4IDVjM2RhMDguLmI3MGU0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogfSBzdGF0aWMgc2F2ZWRfcGFyYW1zOwogCiAjZGVmaW5lIGR1bXBfaGVhZGVyKF9hKSBfZHVtcF9oZWFkZXIoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kdW1wX2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgX19pb21lbSAqaCwgY29uc3QgY2hhciogZnVuYywKK3N0YXRpYyB2b2lkIF9kdW1wX2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgKmgsIGNvbnN0IGNoYXIgKmZ1bmMsCiAJaW50IGxpbmUpCiB7CiAJcHJfZGVidWcoIiVzOiVkOiBoLm1hZ2ljX251bTogICAgICAgICAnJXMnXG4iLCBmdW5jLCBsaW5lLApAQCAtMTUxLDcgKzE1MSw3IEBACiB9CiAKICNkZWZpbmUgZHVtcF9wYXJhbXMoX2EpIF9kdW1wX3BhcmFtcyhfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2R1bXBfcGFyYW1zKGNvbnN0IHN0cnVjdCBvc19hcmVhX3BhcmFtcyBfX2lvbWVtICpwLCBjb25zdCBjaGFyKiBmdW5jLAorc3RhdGljIHZvaWQgX2R1bXBfcGFyYW1zKGNvbnN0IHN0cnVjdCBvc19hcmVhX3BhcmFtcyAqcCwgY29uc3QgY2hhciAqZnVuYywKIAlpbnQgbGluZSkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6IHAuYm9vdF9mbGFnOiAgICAgICAldVxuIiwgZnVuYywgbGluZSwgcC0+Ym9vdF9mbGFnKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9wbGF0Zm9ybS5oCmluZGV4IGNhMDRmMDMuLjg3ZDUyMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaApAQCAtNDEsNiArNDEsNyBAQAogLyogaXJxICovCiAKIHZvaWQgcHMzX2luaXRfSVJRKHZvaWQpOwordm9pZCBwczNfc2h1dGRvd25fSVJRKGludCBjcHUpOwogdm9pZCBfX2luaXQgcHMzX3JlZ2lzdGVyX2lwaV9kZWJ1Z19icmsodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZpcnEpOwogCiAvKiBzbXAgKi8KQEAgLTgyLDYgKzgzLDcgQEAKIAlQUzNfREVWX1RZUEVfU1RPUl9ST00gPSBUWVBFX1JPTSwJLyogNSAqLwogCVBTM19ERVZfVFlQRV9TQl9HUElPID0gNiwKIAlQUzNfREVWX1RZUEVfU1RPUl9GTEFTSCA9IFRZUEVfUkJDLAkvKiAxNCAqLworCVBTM19ERVZfVFlQRV9OT0FDQ0VTUyA9IDI1NSwKIH07CiAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19zdHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwgY29uc3QgY2hhciAqYnVzX3N0ciwKQEAgLTEyOSwyNCArMTMxLDI4IEBACiAvKiByZXBvc2l0b3J5IGJ1cyBlbnVtZXJhdG9ycyAqLwogCiBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHsKKwllbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZTsKIAl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OworCXVuc2lnbmVkIGludCBidXNfaWQ7CisJZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGU7CiAJdW5zaWduZWQgaW50IGRldl9pbmRleDsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7CisJdW5zaWduZWQgaW50IGRldl9pZDsKIH07CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKLQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbmxpbmUgaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZmlyc3RfZGV2aWNlKAotCWVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCBlbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnBzM19yZXBvc2l0b3J5X2J1bXBfZGV2aWNlKAorCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCiB7Ci0JcmV0dXJuIHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKGJ1c190eXBlLCBkZXZfdHlwZSwgTlVMTCwgZGV2KTsKKwlyZXBvLT5kZXZfaW5kZXgrKzsKKwlyZXR1cm4gcmVwbzsKIH0KLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2Uoc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbyk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2VzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAorCWludCAoKmNhbGxiYWNrKShjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9idXMoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsIHVuc2lnbmVkIGludCBmcm9tLAorCXVuc2lnbmVkIGludCAqYnVzX2luZGV4KTsKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZSwgdW5zaWduZWQgaW50ICppbnRlcnJ1cHRfaWQpOwotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlLCB1NjQgKmJ1c19hZGRyLCB1NjQgKmxlbik7CiAKIC8qIHJlcG9zaXRvcnkgYmxvY2sgZGV2aWNlIGluZm8gKi8KQEAgLTIxNiw0ICsyMjIsMTkgQEAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX3NwdV9yZXNvdXJjZV9pZCh1bnNpZ25lZCBpbnQgcmVzX2luZGV4LAogCWVudW0gcHMzX3NwdV9yZXNvdXJjZV90eXBlKiByZXNvdXJjZV90eXBlLCB1bnNpZ25lZCBpbnQgKnJlc291cmNlX2lkKTsKIAorLyogcmVwb3NpdG9yeSB2dWFydCBpbmZvICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X2F2X3BvcnQodW5zaWduZWQgaW50ICpwb3J0KTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCk7CisKKy8qIFBhZ2UgdGFibGUgZW50cmllcyAqLworI2RlZmluZSBJT1BURV9QUF9XCQkweDgwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiB3cml0ZSAqLworI2RlZmluZSBJT1BURV9QUF9SCQkweDQwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiByZWFkICovCisjZGVmaW5lIElPUFRFX00JCQkweDIwMDAwMDAwMDAwMDAwMDB1bCAvKiBjb2hlcmVuY3kgcmVxdWlyZWQgKi8KKyNkZWZpbmUgSU9QVEVfU09fUgkJMHgxMDAwMDAwMDAwMDAwMDAwdWwgLyogb3JkZXJpbmc6IHdyaXRlcyAqLworI2RlZmluZSBJT1BURV9TT19SVyAgICAgICAgICAgICAweDE4MDAwMDAwMDAwMDAwMDB1bCAvKiBvcmRlcmluZzogciAmIHcgKi8KKyNkZWZpbmUgSU9QVEVfUlBOX01hc2sJCTB4MDdmZmZmZmZmZmZmZjAwMHVsIC8qIFJQTiAqLworI2RlZmluZSBJT1BURV9ICQkJMHgwMDAwMDAwMDAwMDAwODAwdWwgLyogY2FjaGUgaGludCAqLworI2RlZmluZSBJT1BURV9JT0lEX01hc2sJCTB4MDAwMDAwMDAwMDAwMDdmZnVsIC8qIGlvaWQgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKaW5kZXggYWU1ODZhMC4uOGNjMzdjZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAJCWR1bXBfbm9kZV9uYW1lKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40KTsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJZHVtcF9ub2RlKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40LCB2MSwgdjIpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MjogJTAxNmx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCB2Mik7CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfc3RyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIGNvbnN0IGNoYXIgKmJ1c19zdHIsCkBAIC0zMTQsMzI0ICszMTQsMTQwIEBACiAJCXJlZ19pbmRleCwgYnVzX2FkZHIsIGxlbik7CiB9CiAKLSNpZiBkZWZpbmVkKERFQlVHKQotaW50IHBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAotCXVuc2lnbmVkIGludCBkZXZfaW5kZXgpCisKKworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCiB7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IHJlc19pbmRleDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgdG1wID0gKnJlcG87CisJdW5zaWduZWQgaW50IG51bV9kZXY7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKKwlCVUdfT04ocmVwby0+YnVzX2luZGV4ID4gMTApOworCUJVR19PTihyZXBvLT5kZXZfaW5kZXggPiAxMCk7CiAKLQlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgewotCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGU7Ci0JCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7CisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2Rldih0bXAuYnVzX2luZGV4LCAmbnVtX2Rldik7CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCXJlc19pbmRleCwgJmludHJfdHlwZSwgJmludGVycnVwdF9pZCk7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQotCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyIgotCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkICgldToldSkgaW50cl90eXBlICV1LCBpbnRlcnJ1cHRfaWQgJXVcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBpbnRyX3R5cGUsCi0JCQlpbnRlcnJ1cHRfaWQpOwotCX0KLQotCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7Ci0JCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlOwotCQl1NjQgYnVzX2FkZHI7Ci0JCXU2NCBsZW47Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJcmVzX2luZGV4LCAmcmVnX3R5cGUsICZidXNfYWRkciwgJmxlbik7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQotCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWciCi0JCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdfdHlwZSAldSwgYnVzX2FkZHIgJWx4aCwgbGVuICVseGhcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCByZWdfdHlwZSwKLQkJCWJ1c19hZGRyLCBsZW4pOwotCX0KLQotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBkdW1wX3N0b3JfZGV2X2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IGRldl9pbmRleCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHJlZ2lvbl9pbmRleDsKLQl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7Ci0KLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCwgJnBvcnQsCi0JCSZibGtfc2l6ZSwgJm51bV9ibG9ja3MsICZudW1fcmVnaW9ucyk7CiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvIgotCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQlnb3RvIG91dDsKKwkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXByX2RlYnVnKCIlczolZCAgKCV1OiV1KTogcG9ydCAlbHUsIGJsa19zaXplICVsdSwgbnVtX2Jsb2NrcyAiCi0JCSAiJWx1LCBudW1fcmVnaW9ucyAldVxuIiwKLQkJIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHBvcnQsCi0JCSBibGtfc2l6ZSwgbnVtX2Jsb2NrcywgbnVtX3JlZ2lvbnMpOworCXByX2RlYnVnKCIlczolZDogYnVzX3R5cGUgJXUsIGJ1c19pbmRleCAldSwgYnVzX2lkICV1LCBudW1fZGV2ICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIHRtcC5idXNfdHlwZSwgdG1wLmJ1c19pbmRleCwgdG1wLmJ1c19pZCwKKwkJbnVtX2Rldik7CiAKLQlmb3IgKHJlZ2lvbl9pbmRleCA9IDA7IHJlZ2lvbl9pbmRleCA8IG51bV9yZWdpb25zOyByZWdpb25faW5kZXgrKykgewotCQl1bnNpZ25lZCBpbnQgcmVnaW9uX2lkOwotCQl1NjQgcmVnaW9uX3N0YXJ0LCByZWdpb25fc2l6ZTsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbihidXNfaW5kZXgsCi0JCQlkZXZfaW5kZXgsIHJlZ2lvbl9pbmRleCwgJnJlZ2lvbl9pZCwgJnJlZ2lvbl9zdGFydCwKLQkJCSZyZWdpb25fc2l6ZSk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCSBwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24iCi0JCQkJICAiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJICBidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIHJlZ2lvbl9pZCAldSwgc3RhcnQgJWx4aCwgc2l6ZSAlbHhoXG4iLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHJlZ2lvbl9pZCwKLQkJCSByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplKTsKKwlpZiAodG1wLmRldl9pbmRleCA+PSBudW1fZGV2KSB7CisJCXByX2RlYnVnKCIlczolZDogbm8gZGV2aWNlIGZvdW5kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLW91dDoKLQlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByZXN1bHQ7CisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSh0bXAuYnVzX2luZGV4LCB0bXAuZGV2X2luZGV4LAorCQkmdG1wLmRldl90eXBlKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X3R5cGUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKHRtcC5idXNfaW5kZXgsIHRtcC5kZXZfaW5kZXgsCisJCSZ0bXAuZGV2X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkIGZhaWxlZFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kOiBkZXZfdHlwZSAldSwgZGV2X2luZGV4ICV1LCBkZXZfaWQgJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgdG1wLmRldl90eXBlLCB0bXAuZGV2X2luZGV4LCB0bXAuZGV2X2lkKTsKKworCSpyZXBvID0gdG1wOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR1bXBfZGV2aWNlX2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwgZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCi0JCQkgICAgdW5zaWduZWQgaW50IG51bV9kZXYpCitpbnQgX19kZXZpbml0IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlcyhlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKKwlpbnQgKCpjYWxsYmFjaykoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGRldl9pbmRleDsKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHJlcG87CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBidXNfJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBmaW5kIGJ1c190eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c190eXBlKTsKIAotCWZvciAoZGV2X2luZGV4ID0gMDsgZGV2X2luZGV4IDwgbnVtX2RldjsgZGV2X2luZGV4KyspIHsKLQkJZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGU7Ci0JCXVuc2lnbmVkIGludCBkZXZfaWQ7CisJZm9yIChyZXBvLmJ1c19pbmRleCA9IDA7IHJlcG8uYnVzX2luZGV4IDwgMTA7IHJlcG8uYnVzX2luZGV4KyspIHsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJJmRldl90eXBlKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSIKLQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZChidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCSZkZXZfaWQpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCIKLQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IGRldl90eXBlICV1LCBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBkZXZfdHlwZSwgZGV2X2lkKTsKLQotCQlwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8oYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCi0JCWlmIChidXNfdHlwZSA9PSBQUzNfQlVTX1RZUEVfU1RPUkFHRSkKLQkJCWR1bXBfc3Rvcl9kZXZfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JfQotCi0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbyh2b2lkKQotewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBidXNfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JZm9yIChidXNfaW5kZXggPSAwOyBidXNfaW5kZXggPCAxMDsgYnVzX2luZGV4KyspIHsKLQkJZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGU7Ci0JCXVuc2lnbmVkIGludCBidXNfaWQ7Ci0JCXVuc2lnbmVkIGludCBudW1fZGV2OwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmYnVzX3R5cGUpOworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX3R5cGUpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZidXNfaWQpOworCQlpZiAocmVwby5idXNfdHlwZSAhPSBidXNfdHlwZSkgeworCQkJcHJfZGVidWcoIiVzOiVkOiBza2lwLCBidXNfdHlwZSAldVxuIiwgX19mdW5jX18sCisJCQkJX19MSU5FX18sIHJlcG8uYnVzX3R5cGUpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChyZXBvLmJ1c19pbmRleCwKKwkJCSZyZXBvLmJ1c19pZCk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX2lkKCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoYnVzX2luZGV4ICE9IGJ1c19pZCkKLQkJCXByX2RlYnVnKCIlczolZCBidXNfaW5kZXggIT0gYnVzX2lkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWZvciAocmVwby5kZXZfaW5kZXggPSAwOyA7IHJlcG8uZGV2X2luZGV4KyspIHsKKwkJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKCZyZXBvKTsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOworCQkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKSB7CisJCQkJcmVzdWx0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocmVzdWx0KQorCQkJCWJyZWFrOwogCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOwotCQkJY29udGludWU7CisJCQlyZXN1bHQgPSBjYWxsYmFjaygmcmVwbyk7CisKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6JWQ6IGFib3J0IGF0IGNhbGxiYWNrXG4iLCBfX2Z1bmNfXywKKwkJCQkJX19MSU5FX18pOworCQkJCWJyZWFrOworCQkJfQogCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkIGJ1c18ldTogYnVzX3R5cGUgJXUsIGJ1c19pZCAldSwgbnVtX2RldiAldVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBidXNfdHlwZSwgYnVzX2lkLAotCQkJbnVtX2Rldik7Ci0KLQkJZHVtcF9kZXZpY2VfaW5mbyhidXNfaW5kZXgsIGJ1c190eXBlLCBudW1fZGV2KTsKKwkJYnJlYWs7CiAJfQogCiAJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQotI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCiAKLXN0YXRpYyBpbnQgZmluZF9kZXZpY2UodW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IG51bV9kZXYsCi0JdW5zaWduZWQgaW50IHN0YXJ0X2Rldl9pbmRleCwgZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfYnVzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCB1bnNpZ25lZCBpbnQgZnJvbSwKKwl1bnNpZ25lZCBpbnQgKmJ1c19pbmRleCkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZGV2X2luZGV4OworCXVuc2lnbmVkIGludCBpOworCWVudW0gcHMzX2J1c190eXBlIHR5cGU7CisJaW50IGVycm9yOwogCi0JcHJfZGVidWcoIiVzOiVkOiBmaW5kIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldl90eXBlKTsKLQotCWRldi0+ZGV2X2luZGV4ID0gVUlOVF9NQVg7Ci0KLQlmb3IgKGRldl9pbmRleCA9IHN0YXJ0X2Rldl9pbmRleDsgZGV2X2luZGV4IDwgbnVtX2RldjsgZGV2X2luZGV4KyspIHsKLQkJZW51bSBwczNfZGV2X3R5cGUgeDsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJJngpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl90eXBlIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWlmICh4ID09IGRldl90eXBlKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGRldl9pbmRleCA9PSBudW1fZGV2KQotCQlyZXR1cm4gLTE7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIGRldl90eXBlICV1IGF0IGRldl9pbmRleCAldVxuIiwKLQkJX19mdW5jX18sIF9fTElORV9fLCBkZXZfdHlwZSwgZGV2X2luZGV4KTsKLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkmZGV2LT5kaWQuZGV2X2lkKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X2lkIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JZGV2LT5kZXZfaW5kZXggPSBkZXZfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQgZm91bmQ6IGRldl9pZCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlkZXYtPmRpZC5kZXZfaWQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlIChlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKLQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQotewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBidXNfaW5kZXg7Ci0JdW5zaWduZWQgaW50IG51bV9kZXY7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgYnVzX3R5cGUgJXUsIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c190eXBlLCBkZXZfdHlwZSk7Ci0KLQlCVUdfT04oc3RhcnRfZGV2ICYmIHN0YXJ0X2Rldi0+YnVzX2luZGV4ID4gMTApOwotCi0JZm9yIChidXNfaW5kZXggPSBzdGFydF9kZXYgPyBzdGFydF9kZXYtPmJ1c19pbmRleCA6IDA7IGJ1c19pbmRleCA8IDEwOwotCQlidXNfaW5kZXgrKykgewotCQllbnVtIHBzM19idXNfdHlwZSB4OwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmeCk7Ci0KLQkJaWYgKHJlc3VsdCkgeworCWZvciAoaSA9IGZyb207IGkgPCAxMDsgaSsrKSB7CisJCWVycm9yID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZShpLCAmdHlwZSk7CisJCWlmIChlcnJvcikgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX3R5cGUgZmFpbGVkXG4iLAogCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlkZXYtPmJ1c19pbmRleCA9IFVJTlRfTUFYOwotCQkJcmV0dXJuIHJlc3VsdDsKKwkJCSpidXNfaW5kZXggPSBVSU5UX01BWDsKKwkJCXJldHVybiBlcnJvcjsKIAkJfQotCQlpZiAoeCA9PSBidXNfdHlwZSkKLQkJCWJyZWFrOworCQlpZiAodHlwZSA9PSBidXNfdHlwZSkgeworCQkJKmJ1c19pbmRleCA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KLQotCWlmIChidXNfaW5kZXggPj0gMTApCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJfZGVidWcoIiVzOiVkOiBmb3VuZCBidXNfdHlwZSAldSBhdCBidXNfaW5kZXggJXVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX3R5cGUsIGJ1c19pbmRleCk7Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfbnVtX2RldiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXJlc3VsdCA9IGZpbmRfZGV2aWNlKGJ1c19pbmRleCwgbnVtX2Rldiwgc3RhcnRfZGV2Ci0JCT8gc3RhcnRfZGV2LT5kZXZfaW5kZXggKyAxIDogMCwgZGV2X3R5cGUsIGRldik7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCBnZXRfZGlkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZkZXYtPmRpZC5idXNfaWQpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlkZXYtPmJ1c19pbmRleCA9IGJ1c19pbmRleDsKLQotCXByX2RlYnVnKCIlczolZCBmb3VuZDogYnVzX2lkICV1LCBkZXZfaWQgJXVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOwotCi0JcmV0dXJuIHJlc3VsdDsKKwkqYnVzX2luZGV4ID0gVUlOVF9NQVg7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGUsIHVuc2lnbmVkIGludCAqaW50ZXJydXB0X2lkKQogewogCWludCByZXN1bHQgPSAwOwpAQCAtNjQ1LDggKzQ2MSw4IEBACiAJCWVudW0gcHMzX2ludGVycnVwdF90eXBlIHQ7CiAJCXVuc2lnbmVkIGludCBpZDsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKGRldi0+YnVzX2luZGV4LAotCQkJZGV2LT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZpZCk7CisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmaWQpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9pbnRyIGZhaWxlZFxuIiwKQEAgLTY2OSw3ICs0ODUsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19yZWdfdHlwZSByZWdfdHlwZSwgdTY0ICpidXNfYWRkciwgdTY0ICpsZW4pCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC02ODQsOCArNTAwLDggQEAKIAkJdTY0IGE7CiAJCXU2NCBsOwogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhkZXYtPmJ1c19pbmRleCwKLQkJCWRldi0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9yZWcgZmFpbGVkXG4iLApAQCAtOTY1LDYgKzc4MSwzNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X2F2X3BvcnQodW5zaWduZWQgaW50ICpwb3J0KQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoInZpcl91YXJ0IiwgMCksCisJCW1ha2VfZmllbGQoInBvcnQiLCAwKSwKKwkJbWFrZV9maWVsZCgiYXZzZXQiLCAwKSwKKwkJJnYxLCAwKTsKKwkqcG9ydCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJ2aXJfdWFydCIsIDApLAorCQltYWtlX2ZpZWxkKCJwb3J0IiwgMCksCisJCW1ha2VfZmllbGQoInN5c21nciIsIDApLAorCQkmdjEsIDApOworCSpwb3J0ID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCiAgICogcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9pbmZvIC0gR2V0IGFkZHJlc3MgYW5kIHNpemUgb2YgY2VsbF9leHRfb3NfYXJlYS4KICAgKiBhZGRyZXNzOiBscGFyIGFkZHJlc3Mgb2YgY2VsbF9leHRfb3NfYXJlYQpAQCAtMTAyNiwzICs4NzIsMjA1IEBACiAJcmV0dXJuIHJlc3VsdCA/IHJlc3VsdAogCQk6IHBzM19yZXBvc2l0b3J5X3JlYWRfdGJfZnJlcShub2RlX2lkLCB0Yl9mcmVxKTsKIH0KKworI2lmIGRlZmluZWQoREVCVUcpCisKK2ludCBwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8oY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVzX2luZGV4OworCisJcHJfZGVidWcoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisKKwlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgeworCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGU7CisJCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJmludHJfdHlwZSwgJmludGVycnVwdF9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQorCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyIgorCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgaW50cl90eXBlICV1LCBpbnRlcnJ1cHRfaWQgJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJaW50cl90eXBlLCBpbnRlcnJ1cHRfaWQpOworCX0KKworCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7CisJCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlOworCQl1NjQgYnVzX2FkZHI7CisJCXU2NCBsZW47CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVzX2luZGV4LCAmcmVnX3R5cGUsICZidXNfYWRkciwgJmxlbik7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQorCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWciCisJCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdfdHlwZSAldSwgYnVzX2FkZHIgJWx4aCwgbGVuICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJcmVnX3R5cGUsIGJ1c19hZGRyLCBsZW4pOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdW1wX3N0b3JfZGV2X2luZm8oc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHJlZ2lvbl9pbmRleDsKKwl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyhyZXBvLT5idXNfaW5kZXgsCisJCXJlcG8tPmRldl9pbmRleCwgJnBvcnQsICZibGtfc2l6ZSwgJm51bV9ibG9ja3MsICZudW1fcmVnaW9ucyk7CisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvIgorCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IHBvcnQgJWx1LCBibGtfc2l6ZSAlbHUsIG51bV9ibG9ja3MgIgorCQkgIiVsdSwgbnVtX3JlZ2lvbnMgJXVcbiIsCisJCSBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LCBwb3J0LAorCQkgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKKworCWZvciAocmVnaW9uX2luZGV4ID0gMDsgcmVnaW9uX2luZGV4IDwgbnVtX3JlZ2lvbnM7IHJlZ2lvbl9pbmRleCsrKSB7CisJCXVuc2lnbmVkIGludCByZWdpb25faWQ7CisJCXU2NCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVnaW9uX2luZGV4LCAmcmVnaW9uX2lkLAorCQkJJnJlZ2lvbl9zdGFydCwgJnJlZ2lvbl9zaXplKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJIHByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbiIKKwkJCQkgICIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkgIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnaW9uX2lkICV1LCBzdGFydCAlbHhoLCBzaXplICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJcmVnaW9uX2lkLCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplKTsKKwl9CisKK291dDoKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAorCXVuc2lnbmVkIGludCBudW1fZGV2KQoreworCWludCByZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiAtPiAlczolZDogYnVzXyV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCk7CisKKwlmb3IgKHJlcG8tPmRldl9pbmRleCA9IDA7IHJlcG8tPmRldl9pbmRleCA8IG51bV9kZXY7CisJCXJlcG8tPmRldl9pbmRleCsrKSB7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZShyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsICZyZXBvLT5kZXZfdHlwZSk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUiCisJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCAmcmVwby0+ZGV2X2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQiCisJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBkZXZfdHlwZSAldSwgZGV2X2lkICV1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwKKwkJCXJlcG8tPmRldl90eXBlLCByZXBvLT5kZXZfaWQpOworCisJCXBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyhyZXBvKTsKKworCQlpZiAocmVwby0+YnVzX3R5cGUgPT0gUFMzX0JVU19UWVBFX1NUT1JBR0UpCisJCQlkdW1wX3N0b3JfZGV2X2luZm8ocmVwbyk7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbyh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgcmVwbzsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltZW1zZXQoJnJlcG8sIDAsIHNpemVvZihyZXBvKSk7CisKKwlmb3IgKHJlcG8uYnVzX2luZGV4ID0gMDsgcmVwby5idXNfaW5kZXggPCAxMDsgcmVwby5idXNfaW5kZXgrKykgeworCQl1bnNpZ25lZCBpbnQgbnVtX2RldjsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX3R5cGUpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlcG8uYnVzX2luZGV4ICE9IHJlcG8uYnVzX2lkKQorCQkJcHJfZGVidWcoIiVzOiVkIGJ1c19pbmRleCAhPSBidXNfaWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KHJlcG8uYnVzX2luZGV4LAorCQkJJm51bV9kZXYpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCBidXNfJXU6IGJ1c190eXBlICV1LCBidXNfaWQgJXUsIG51bV9kZXYgJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4LCByZXBvLmJ1c190eXBlLAorCQkJcmVwby5idXNfaWQsIG51bV9kZXYpOworCisJCWR1bXBfZGV2aWNlX2luZm8oJnJlcG8sIG51bV9kZXYpOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwppbmRleCA5MzUzOTY3Li5hYTA1Mjg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKQEAgLTM3LDI4ICszNywzNiBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKENPTkZJR19TTVApCiBzdGF0aWMgdm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpIHt9CiAjZW5kaWYKIAotaW50IHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdikKK3N0YXRpYyB1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiBwczNfZmlybXdhcmVfdmVyc2lvbjsKKwordm9pZCBwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24odW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gKnYpCiB7Ci0JaW50IHJlc3VsdCA9IGx2MV9nZXRfdmVyc2lvbl9pbmZvKCZ2LT5yYXcpOwotCi0JaWYgKHJlc3VsdCkgewotCQl2LT5yYXcgPSAwOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKKwkqdiA9IHBzM19maXJtd2FyZV92ZXJzaW9uOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKTsKIAoraW50IHBzM19jb21wYXJlX2Zpcm13YXJlX3ZlcnNpb24odTE2IG1ham9yLCB1MTYgbWlub3IsIHUxNiByZXYpCit7CisJdW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24geDsKKworCXgucGFkID0gMDsKKwl4Lm1ham9yID0gbWFqb3I7CisJeC5taW5vciA9IG1pbm9yOworCXgucmV2ID0gcmV2OworCisJcmV0dXJuIChwczNfZmlybXdhcmVfdmVyc2lvbi5yYXcgLSB4LnJhdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfY29tcGFyZV9maXJtd2FyZV92ZXJzaW9uKTsKKwogc3RhdGljIHZvaWQgcHMzX3Bvd2VyX3NhdmUodm9pZCkKIHsKIAkvKgpAQCAtOTksNyArMTA3LDggQEAKIAl3aGlsZSgxKTsKIH0KIAotI2lmZGVmIENPTkZJR19GQl9QUzMKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9QUzMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX1BTM19NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19QUzNfRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX1BTM19GTEFTSF9NT0RVTEUpCiBzdGF0aWMgdm9pZCBwcmVhbGxvYyhzdHJ1Y3QgcHMzX3ByZWFsbG9jICpwKQogewogCWlmICghcC0+c2l6ZSkKQEAgLTExNSwxMiArMTI0LDE1IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVsdSBieXRlcyBhdCAlcFxuIiwgcC0+bmFtZSwgcC0+c2l6ZSwKIAkgICAgICAgcC0+YWRkcmVzcyk7CiB9CisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0ZCX1BTMykgfHwgZGVmaW5lZChDT05GSUdfRkJfUFMzX01PRFVMRSkKIHN0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmJfdmlkZW9tZW1vcnkgPSB7Ci0gICAgLm5hbWUgPSAicHMzZmIgdmlkZW9tZW1vcnkiLAotICAgIC5zaXplID0gQ09ORklHX0ZCX1BTM19ERUZBVUxUX1NJWkVfTSoxMDI0KjEwMjQsCi0gICAgLmFsaWduID0gMTAyNCoxMDI0CQkJLyogdGhlIEdQVSByZXF1aXJlcyAxIE1pQiBhbGlnbm1lbnQgKi8KKwkubmFtZSA9ICJwczNmYiB2aWRlb21lbW9yeSIsCisJLnNpemUgPSBDT05GSUdfRkJfUFMzX0RFRkFVTFRfU0laRV9NKjEwMjQqMTAyNCwKKwkuYWxpZ24gPSAxMDI0KjEwMjQJCS8qIHRoZSBHUFUgcmVxdWlyZXMgMSBNaUIgYWxpZ25tZW50ICovCiB9OworRVhQT1JUX1NZTUJPTF9HUEwocHMzZmJfdmlkZW9tZW1vcnkpOwogI2RlZmluZSBwcmVhbGxvY19wczNmYl92aWRlb21lbW9yeSgpCXByZWFsbG9jKCZwczNmYl92aWRlb21lbW9yeSkKIAogc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfcHMzZmIoY2hhciAqcCkKQEAgLTEzNyw2ICsxNDksMzAgQEAKICNkZWZpbmUgcHJlYWxsb2NfcHMzZmJfdmlkZW9tZW1vcnkoKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1BTM19GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfUFMzX0ZMQVNIX01PRFVMRSkKK3N0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmxhc2hfYm91bmNlX2J1ZmZlciA9IHsKKwkubmFtZSA9ICJwczNmbGFzaCBib3VuY2UgYnVmZmVyIiwKKwkuc2l6ZSA9IDI1NioxMDI0LAorCS5hbGlnbiA9IDI1NioxMDI0Cit9OworRVhQT1JUX1NZTUJPTF9HUEwocHMzZmxhc2hfYm91bmNlX2J1ZmZlcik7CisjZGVmaW5lIHByZWFsbG9jX3BzM2ZsYXNoX2JvdW5jZV9idWZmZXIoKQlwcmVhbGxvYygmcHMzZmxhc2hfYm91bmNlX2J1ZmZlcikKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfcHMzZmxhc2goY2hhciAqcCkKK3sKKwlpZiAoIXApCisJCXJldHVybiAxOworCisJaWYgKCFzdHJjbXAocCwgIm9mZiIpKQorCQlwczNmbGFzaF9ib3VuY2VfYnVmZmVyLnNpemUgPSAwOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgicHMzZmxhc2giLCBlYXJseV9wYXJzZV9wczNmbGFzaCk7CisjZWxzZQorI2RlZmluZSBwcmVhbGxvY19wczNmbGFzaF9ib3VuY2VfYnVmZmVyKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBpbnQgcHMzX3NldF9kYWJyKHU2NCBkYWJyKQogewogCWVudW0ge0RBQlJfVVNFUiA9IDEsIERBQlJfS0VSTkVMID0gMix9OwpAQCAtMTQ2LDEzICsxODIsMTMgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHBzM19zZXR1cF9hcmNoKHZvaWQpCiB7Ci0JdW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gdjsKIAogCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JcHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKCZ2KTsKLQlwcmludGsoS0VSTl9JTkZPICJQUzMgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldVxuIiwgdi5tYWpvciwgdi5taW5vciwKLQkJdi5yZXYpOworCWx2MV9nZXRfdmVyc2lvbl9pbmZvKCZwczNfZmlybXdhcmVfdmVyc2lvbi5yYXcpOworCXByaW50ayhLRVJOX0lORk8gIlBTMyBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1XG4iLAorCSAgICAgICBwczNfZmlybXdhcmVfdmVyc2lvbi5tYWpvciwgcHMzX2Zpcm13YXJlX3ZlcnNpb24ubWlub3IsCisJICAgICAgIHBzM19maXJtd2FyZV92ZXJzaW9uLnJldik7CiAKIAlwczNfc3B1X3NldF9wbGF0Zm9ybSgpOwogCXBzM19tYXBfaHRhYigpOwpAQCAtMTY2LDYgKzIwMiw4IEBACiAjZW5kaWYKIAogCXByZWFsbG9jX3BzM2ZiX3ZpZGVvbWVtb3J5KCk7CisJcHJlYWxsb2NfcHMzZmxhc2hfYm91bmNlX2J1ZmZlcigpOworCiAJcHBjX21kLnBvd2VyX3NhdmUgPSBwczNfcG93ZXJfc2F2ZTsKIAogCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtMTg0LDcgKzIyMiw3IEBACiAJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlkdF9yb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKGR0X3Jvb3QsICJQUzMiKSkKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShkdF9yb290LCAic29ueSxwczMiKSkKIAkJcmV0dXJuIDA7CiAKIAlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfUFMzX1BPU1NJQkxFOwpAQCAtMjAxLDMxICsyMzksMTIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19LRVhFQykKIHN0YXRpYyB2b2lkIHBzM19rZXhlY19jcHVfZG93bihpbnQgY3Jhc2hfc2h1dGRvd24sIGludCBzZWNvbmRhcnkpCiB7Ci0JREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmIChzZWNvbmRhcnkpIHsKLQkJaW50IGNwdTsKLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCQlpZiAoY3B1KQotCQkJCXBzM19zbXBfY2xlYW51cF9jcHUoY3B1KTsKLQl9IGVsc2UKLQkJcHMzX3NtcF9jbGVhbnVwX2NwdSgwKTsKKwlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwogCi0JREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBzM19tYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQotewotCXVuc2lnbmVkIGxvbmcgcHBlX2lkOwotCi0JREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOwotCWx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwcGVfaWQsIDAsIDApOwotCXBzM19tbV9zaHV0ZG93bigpOwotCXBzM19tbV92YXNfZGVzdHJveSgpOwotCi0JZGVmYXVsdF9tYWNoaW5lX2tleGVjKGltYWdlKTsKKwlwczNfc21wX2NsZWFudXBfY3B1KGNwdSk7CisJcHMzX3NodXRkb3duX0lSUShjcHUpOwogCiAJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CkBAIC0yNDcsNyArMjY2LDcgQEAKIAkucG93ZXJfb2ZmCQkJPSBwczNfcG93ZXJfb2ZmLAogI2lmIGRlZmluZWQoQ09ORklHX0tFWEVDKQogCS5rZXhlY19jcHVfZG93bgkJCT0gcHMzX2tleGVjX2NwdV9kb3duLAotCS5tYWNoaW5lX2tleGVjCQkJPSBwczNfbWFjaGluZV9rZXhlYywKKwkubWFjaGluZV9rZXhlYwkJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjLAogCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUsCiAJLm1hY2hpbmVfY3Jhc2hfc2h1dGRvd24JCT0gZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCmluZGV4IDUzNDE2ZWMuLmYwYjEyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2RlZmluZSBEQkcgcHJfZGVidWcKICNlbmRpZgogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXBpX2Z1bmN0aW9uX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqbXNnKQpAQCAtMzksMTEgKzM5LDExIEBACiB9CiAKIC8qKgotICAqIHZpcnFzIC0gYSBwZXIgY3B1IGFycmF5IG9mIHZpcnFzIGZvciBpcGkgdXNlCisgICogcHMzX2lwaV92aXJxcyAtIGEgcGVyIGNwdSBhcnJheSBvZiB2aXJxcyBmb3IgaXBpIHVzZQogICAqLwogCiAjZGVmaW5lIE1TR19DT1VOVCA0Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCB2aXJxc1tNU0dfQ09VTlRdKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHBzM19pcGlfdmlycXNbTVNHX0NPVU5UXSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1tNU0dfQ09VTlRdID0gewogCSJpcGkgY2FsbCIsCkBAIC02Miw3ICs2Miw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl2aXJxID0gcGVyX2NwdSh2aXJxcywgdGFyZ2V0KVttc2ddOworCXZpcnEgPSBwZXJfY3B1KHBzM19pcGlfdmlycXMsIHRhcmdldClbbXNnXTsKIAlyZXN1bHQgPSBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHZpcnEpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTk0LDEzICs5NCwxMyBAQAogc3RhdGljIHZvaWQgX19pbml0IHBzM19zbXBfc2V0dXBfY3B1KGludCBjcHUpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdSh2aXJxcywgY3B1KTsKKwl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdShwczNfaXBpX3ZpcnFzLCBjcHUpOwogCWludCBpOwogCiAJREJHKCIgLT4gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKIAogCS8qCi0JICogQ2hlY2sgYXNzdW1wdGlvbnMgb24gdmlycXNbXSBpbmRleGluZy4gSWYgdGhpcworCSAqIENoZWNrIGFzc3VtcHRpb25zIG9uIHBzM19pcGlfdmlycXNbXSBpbmRleGluZy4gSWYgdGhpcwogCSAqIGNoZWNrIGZhaWxzLCB0aGVuIGEgZGlmZmVyZW50IG1hcHBpbmcgb2YgUFBDX01TR18KIAkgKiB0byBpbmRleCBuZWVkcyB0byBiZSBzZXR1cC4KIAkgKi8KQEAgLTEzMiwxMyArMTMyLDEzIEBACiAKIHZvaWQgcHMzX3NtcF9jbGVhbnVwX2NwdShpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHZpcnFzLCBjcHUpOworCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHBzM19pcGlfdmlycXMsIGNwdSk7CiAJaW50IGk7CiAKIAlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwogCiAJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7Ci0JCWZyZWVfaXJxKHZpcnFzW2ldLCAodm9pZCopKGxvbmcpaSk7CisJCS8qIENhbid0IGNhbGwgZnJlZV9pcnEgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gKi8KIAkJcHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHZpcnFzW2ldKTsKIAkJdmlycXNbaV0gPSBOT19JUlE7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwppbmRleCA2NTE0MzdjLi41MDJkODBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwpAQCAtMTgyLDE1ICsxODIsMTggQEAKIHsKIAlzdHJ1Y3QgdGFibGUge2NoYXIqIG5hbWU7IHVuc2lnbmVkIGxvbmcgYWRkcjsgdW5zaWduZWQgbG9uZyBzaXplO307CiAKLQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93ID0gX19pb3JlbWFwKAotCQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93X2FkZHIsIHNpemVvZihzdHJ1Y3Qgc3BlX3NoYWRvdyksCi0JCXBncHJvdF92YWwoUEFHRV9SRUFET05MWSkgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOworCXNwdV9wZGF0YShzcHUpLT5zaGFkb3cgPSBpb3JlbWFwX2ZsYWdzKHNwdV9wZGF0YShzcHUpLT5zaGFkb3dfYWRkciwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc3BlX3NoYWRvdyksCisJCQkJCSAgICAgICBwZ3Byb3RfdmFsKFBBR0VfUkVBRE9OTFkpIHwKKwkJCQkJICAgICAgIF9QQUdFX05PX0NBQ0hFKTsKIAlpZiAoIXNwdV9wZGF0YShzcHUpLT5zaGFkb3cpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHNoYWRvdyBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9pb3JlbWFwOwogCX0KIAotCXNwdS0+bG9jYWxfc3RvcmUgPSBpb3JlbWFwKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywgTFNfU0laRSk7CisJc3B1LT5sb2NhbF9zdG9yZSA9IChfX2ZvcmNlIHZvaWQgKilpb3JlbWFwX2ZsYWdzKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywKKwkJTFNfU0laRSwgX1BBR0VfTk9fQ0FDSEUpOworCiAJaWYgKCFzcHUtPmxvY2FsX3N0b3JlKSB7CiAJCXByX2RlYnVnKCIlczolZDogaW9yZW1hcCBsb2NhbF9zdG9yZSBmYWlsZWRcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtMTk5LDYgKzIwMiw3IEBACiAKIAlzcHUtPnByb2JsZW0gPSBpb3JlbWFwKHNwdS0+cHJvYmxlbV9waHlzLAogCQlzaXplb2Yoc3RydWN0IHNwdV9wcm9ibGVtKSk7CisKIAlpZiAoIXNwdS0+cHJvYmxlbSkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJvYmxlbSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9pb3JlbWFwOwpAQCAtMjA2LDYgKzIxMCw3IEBACiAKIAlzcHUtPnByaXYyID0gaW9yZW1hcChzcHVfcGRhdGEoc3B1KS0+cHJpdjJfYWRkciwKIAkJc2l6ZW9mKHN0cnVjdCBzcHVfcHJpdjIpKTsKKwogCWlmICghc3B1LT5wcml2MikgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJpdjIgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlnb3RvIGZhaWxfaW9yZW1hcDsKQEAgLTQwMCwxMSArNDA1LDEzIEBACiAJCX0KIAl9CiAKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IEVycm9yIGluaXRpYWxpemluZyBzcHVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBudW1fcmVzb3VyY2VfaWQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBzcHVfbWFuYWdlbWVudF9vcHMgc3B1X21hbmFnZW1lbnRfcHMzX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwppbmRleCA2YmRhNTEwLi40YmI2MzRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCkBAIC0zMCwyMiArMzAsMjI4IEBACiAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCitzdGF0aWMgc3RydWN0IGRldmljZSBwczNfc3lzdGVtX2J1cyA9IHsKKwkuYnVzX2lkID0gInBzM19zeXN0ZW0iLAorfTsKKworLyogRklYTUU6IG5lZWQgZGV2aWNlIHVzYWdlIGNvdW50ZXJzISAqLworc3RydWN0IHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IHNiXzExOyAvKiB1c2IgMCAqLworCWludCBzYl8xMjsgLyogdXNiIDAgKi8KKwlpbnQgZ3B1OworfSBzdGF0aWMgdXNhZ2VfaGFjazsKKworc3RhdGljIGludCBwczNfaXNfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwkJCSB1bnNpZ25lZCBpbnQgYnVzX2lkLCB1bnNpZ25lZCBpbnQgZGV2X2lkKQoreworCXJldHVybiBkZXYtPmJ1c19pZCA9PSBidXNfaWQgJiYgZGV2LT5kZXZfaWQgPT0gZGV2X2lkOworfQorCitzdGF0aWMgaW50IHBzM19vcGVuX2h2X2RldmljZV9zYihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCUJVR19PTighZGV2LT5idXNfaWQpOworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJaWYgKHBzM19pc19kZXZpY2UoZGV2LCAxLCAxKSkgeworCQl1c2FnZV9oYWNrLnNiXzExKys7CisJCWlmICh1c2FnZV9oYWNrLnNiXzExID4gMSkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMikpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMisrOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMiA+IDEpIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoZGV2LT5idXNfaWQsIGRldi0+ZGV2X2lkLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfb3Blbl9kZXZpY2UgZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19jbG9zZV9odl9kZXZpY2Vfc2Ioc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisKKwlCVUdfT04oIWRldi0+YnVzX2lkKTsKKwltdXRleF9sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMSkpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMS0tOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMSkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMikpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMi0tOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMikgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCXJlc3VsdCA9IGx2MV9jbG9zZV9kZXZpY2UoZGV2LT5idXNfaWQsIGRldi0+ZGV2X2lkKTsKKwlCVUdfT04ocmVzdWx0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX29wZW5faHZfZGV2aWNlX2dwdShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJdXNhZ2VfaGFjay5ncHUrKzsKKwlpZiAodXNhZ2VfaGFjay5ncHUgPiAxKSB7CisJCXJlc3VsdCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZ3B1X29wZW4oMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2dwdV9vcGVuIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJfQorCitkb25lOgorCW11dGV4X3VubG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfY2xvc2VfaHZfZGV2aWNlX2dwdShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJdXNhZ2VfaGFjay5ncHUtLTsKKwlpZiAodXNhZ2VfaGFjay5ncHUpIHsKKwkJcmVzdWx0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCXJlc3VsdCA9IGx2MV9ncHVfY2xvc2UoKTsKKwlCVUdfT04ocmVzdWx0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfb3Blbl9odl9kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCUJVR19PTighZGV2KTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKKworCXN3aXRjaCAoZGV2LT5tYXRjaF9pZCkgeworCWNhc2UgUFMzX01BVENIX0lEX0VIQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfT0hDSToKKwljYXNlIFBTM19NQVRDSF9JRF9HRUxJQzoKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX0RJU0s6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ST006CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9GTEFTSDoKKwkJcmV0dXJuIHBzM19vcGVuX2h2X2RldmljZV9zYihkZXYpOworCisJY2FzZSBQUzNfTUFUQ0hfSURfU09VTkQ6CisJY2FzZSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1M6CisJCXJldHVybiBwczNfb3Blbl9odl9kZXZpY2VfZ3B1KGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKKwljYXNlIFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUjoKKwkJcHJfZGVidWcoIiVzOiVkOiB1bnN1cHBvcnRlZCBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+YnVzX2lkKTsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiB1bmtub3duIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKKwlCVUcoKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19vcGVuX2h2X2RldmljZSk7CisKK2ludCBwczNfY2xvc2VfaHZfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlCVUdfT04oIWRldik7CisJcHJfZGVidWcoIiVzOiVkOiBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7CisKKwlzd2l0Y2ggKGRldi0+bWF0Y2hfaWQpIHsKKwljYXNlIFBTM19NQVRDSF9JRF9FSENJOgorCWNhc2UgUFMzX01BVENIX0lEX09IQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfR0VMSUM6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ESVNLOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfUk9NOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfRkxBU0g6CisJCXJldHVybiBwczNfY2xvc2VfaHZfZGV2aWNlX3NiKGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9TT1VORDoKKwljYXNlIFBTM19NQVRDSF9JRF9HUkFQSElDUzoKKwkJcmV0dXJuIHBzM19jbG9zZV9odl9kZXZpY2VfZ3B1KGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKKwljYXNlIFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUjoKKwkJcHJfZGVidWcoIiVzOiVkOiB1bnN1cHBvcnRlZCBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+YnVzX2lkKTsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiB1bmtub3duIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKKwlCVUcoKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19jbG9zZV9odl9kZXZpY2UpOworCiAjZGVmaW5lIGR1bXBfbW1pb19yZWdpb24oX2EpIF9kdW1wX21taW9fcmVnaW9uKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCiBzdGF0aWMgdm9pZCBfZHVtcF9tbWlvX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uKiByLAogCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewotCXByX2RlYnVnKCIlczolZDogZGV2ICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kaWQuYnVzX2lkLAotCQlyLT5kaWQuZGV2X2lkKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGRldiAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGV2LT5idXNfaWQsCisJCXItPmRldi0+ZGV2X2lkKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19hZGRyICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5idXNfYWRkcik7CiAJcHJfZGVidWcoIiVzOiVkOiBsZW4gICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGxwYXJfYWRkciAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5scGFyX2FkZHIpOwogfQogCi1pbnQgcHMzX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQorc3RhdGljIGludCBwczNfc2JfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAogCQlyLT5idXNfYWRkciwgci0+bGVuLCByLT5wYWdlX3NpemUsICZyLT5scGFyX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtNTcsMTMgKzI2MywyNiBAQAogCWR1bXBfbW1pb19yZWdpb24ocik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KKworc3RhdGljIGludCBwczNfaW9jMF9tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwkvKiBkZXZpY2Ugc3BlY2lmaWM7IGRvIG5vdGhpbmcgY3VycmVudGx5ICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBwczNfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJcmV0dXJuIHItPm1taW9fb3BzLT5jcmVhdGUocik7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChwczNfbW1pb19yZWdpb25fY3JlYXRlKTsKIAotaW50IHBzM19mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCitzdGF0aWMgaW50IHBzM19zYl9mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKKwlkdW1wX21taW9fcmVnaW9uKHIpOworOworCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAogCQlyLT5scGFyX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTczLDE0ICsyOTIsNjAgQEAKIAlyLT5scGFyX2FkZHIgPSAwOwogCXJldHVybiByZXN1bHQ7CiB9CisKK3N0YXRpYyBpbnQgcHMzX2lvYzBfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCS8qIGRldmljZSBzcGVjaWZpYzsgZG8gbm90aGluZyBjdXJyZW50bHkgKi8KKwlyZXR1cm4gMDsKK30KKworCitpbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwlyZXR1cm4gci0+bW1pb19vcHMtPmZyZWUocik7Cit9CisKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM19mcmVlX21taW9fcmVnaW9uKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHBzM19tbWlvX3NiX3JlZ2lvbl9vcHMgPSB7CisJLmNyZWF0ZSA9IHBzM19zYl9tbWlvX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBwczNfc2JfZnJlZV9tbWlvX3JlZ2lvbgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHBzM19tbWlvX2lvYzBfcmVnaW9uX29wcyA9IHsKKwkuY3JlYXRlID0gcHMzX2lvYzBfbW1pb19yZWdpb25fY3JlYXRlLAorCS5mcmVlID0gcHMzX2lvYzBfZnJlZV9tbWlvX3JlZ2lvbgorfTsKKworaW50IHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwllbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemUpCit7CisJci0+ZGV2ID0gZGV2OworCXItPmJ1c19hZGRyID0gYnVzX2FkZHI7CisJci0+bGVuID0gbGVuOworCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKwlzd2l0Y2ggKGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9TQjoKKwkJci0+bW1pb19vcHMgPSAmcHMzX21taW9fc2JfcmVnaW9uX29wczsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfSU9DMDoKKwkJci0+bW1pb19vcHMgPSAmcHMzX21taW9faW9jMF9yZWdpb25fb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX21taW9fcmVnaW9uX2luaXQpOworCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKl9kZXYsCiAJc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCiB7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPSB0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rydik7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9IHBzM19kcnZfdG9fc3lzdGVtX2J1c19kcnYoX2Rydik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAogCXJlc3VsdCA9IGRldi0+bWF0Y2hfaWQgPT0gZHJ2LT5tYXRjaF9pZDsKIApAQCAtOTIsMzIgKzM1NywxNCBAQAogCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnY7CiAKLQlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQsIDApOworCUJVR19PTighZGV2KTsKKwlwcl9pbmZvKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIF9kZXYtPmJ1c19pZCk7CiAKLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZDogbHYxX29wZW5fZGV2aWNlIGZhaWxlZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUFDQ0VTOwotCQlnb3RvIGNsZWFuX25vbmU7Ci0JfQotCi0JaWYgKGRldi0+ZF9yZWdpb24tPmRpZC5idXNfaWQpIHsKLQkJcmVzdWx0ID0gcHMzX2RtYV9yZWdpb25fY3JlYXRlKGRldi0+ZF9yZWdpb24pOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9yZWdpb25fY3JlYXRlIGZhaWxlZCAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKLQkJCUJVR19PTigiY2hlY2sgcmVnaW9uIHR5cGUiKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFuX2RldmljZTsKLQkJfQotCX0KLQorCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihkZXYpOwogCUJVR19PTighZHJ2KTsKIAogCWlmIChkcnYtPnByb2JlKQpAQCAtMTI2LDU2ICszNzMsMTI3IEBACiAJCXByX2luZm8oIiVzOiVkOiAlcyBubyBwcm9iZSBtZXRob2RcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCWRldi0+Y29yZS5idXNfaWQpOwogCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IGRydi0+cHJvYmUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIGNsZWFuX2RtYTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi1jbGVhbl9kbWE6Ci0JcHMzX2RtYV9yZWdpb25fZnJlZShkZXYtPmRfcmVnaW9uKTsKLWNsZWFuX2RldmljZToKLQlsdjFfY2xvc2VfZGV2aWNlKGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkKTsKLWNsZWFuX25vbmU6CisJcHJfaW5mbygiIDwtICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPQotCQl0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKwlwcl9pbmZvKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIF9kZXYtPmJ1c19pZCk7CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoZGV2KTsKKwlCVUdfT04oIWRydik7CiAKIAlpZiAoZHJ2LT5yZW1vdmUpCi0JCWRydi0+cmVtb3ZlKGRldik7CisJCXJlc3VsdCA9IGRydi0+cmVtb3ZlKGRldik7CiAJZWxzZQotCQlwcl9pbmZvKCIlczolZDogJXMgbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJZGV2LT5jb3JlLmJ1c19pZCk7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkICVzOiBubyByZW1vdmUgbWV0aG9kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiAKLQlwczNfZG1hX3JlZ2lvbl9mcmVlKGRldi0+ZF9yZWdpb24pOwotCXBzM19mcmVlX21taW9fcmVnaW9uKGRldi0+bV9yZWdpb24pOwotCWx2MV9jbG9zZV9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOworCXByX2luZm8oIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KIAorc3RhdGljIHZvaWQgcHMzX3N5c3RlbV9idXNfc2h1dGRvd24oc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZDogbWF0Y2hfaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CisKKwlpZiAoIWRldi0+Y29yZS5kcml2ZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIGRyaXZlciBib3VuZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoZGV2KTsKKworCUJVR19PTighZHJ2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlcyAtPiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPmNvcmUuYnVzX2lkLCBkcnYtPmNvcmUubmFtZSk7CisKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihkZXYpOworCWVsc2UgaWYgKGRydi0+cmVtb3ZlKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkICVzOiBubyBzaHV0ZG93biwgY2FsbGluZyByZW1vdmVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKKwkJZHJ2LT5yZW1vdmUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCAlczogbm8gc2h1dGRvd24gbWV0aG9kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CisJCUJVRygpOworCX0KKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKK30KKworc3RhdGljIGludCBwczNfc3lzdGVtX2J1c191ZXZlbnQoc3RydWN0IGRldmljZSAqX2RldiwgY2hhciAqKmVudnAsCisJCQkJIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgaSA9IDAsIGxlbmd0aCA9IDA7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLAorCQkJICAgJmxlbmd0aCwgIk1PREFMSUFTPXBzMzolZCIsCisJCQkgICBkZXYtPm1hdGNoX2lkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnZwW2ldID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYSwKKwljaGFyICpidWYpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJwczM6JWRcbiIsIGRldi0+bWF0Y2hfaWQpOworCisJcmV0dXJuIChsZW4gPj0gUEFHRV9TSVpFKSA/IChQQUdFX1NJWkUgLSAxKSA6IGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBzM19zeXN0ZW1fYnVzX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhtb2RhbGlhcyksCisJX19BVFRSX05VTEwsCit9OworCiBzdHJ1Y3QgYnVzX3R5cGUgcHMzX3N5c3RlbV9idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJwczNfc3lzdGVtX2J1cyIsCiAJLm1hdGNoID0gcHMzX3N5c3RlbV9idXNfbWF0Y2gsCisJLnVldmVudCA9IHBzM19zeXN0ZW1fYnVzX3VldmVudCwKIAkucHJvYmUgPSBwczNfc3lzdGVtX2J1c19wcm9iZSwKIAkucmVtb3ZlID0gcHMzX3N5c3RlbV9idXNfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHBzM19zeXN0ZW1fYnVzX3NodXRkb3duLAorCS5kZXZfYXR0cnMgPSBwczNfc3lzdGVtX2J1c19kZXZfYXR0cnMsCiB9OwogCi1pbnQgX19pbml0IHBzM19zeXN0ZW1fYnVzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zeXN0ZW1fYnVzX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwogCiAJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltdXRleF9pbml0KCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCXJlc3VsdCA9IGRldmljZV9yZWdpc3RlcigmcHMzX3N5c3RlbV9idXMpOworCUJVR19PTihyZXN1bHQpOworCiAJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZwczNfc3lzdGVtX2J1c190eXBlKTsKIAlCVUdfT04ocmVzdWx0KTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTg1LDE2ICs1MDMsMTMgQEAKICAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZCBzZXRzIGRtYV9oYW5kbGUKICAqIHRvIHRoZSBkbWEgYWRkcmVzcyAobWFwcGluZykgb2YgdGhlIGZpcnN0IHBhZ2UuCiAgKi8KLQogc3RhdGljIHZvaWQgKiBwczNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqX2Rldiwgc2l6ZV90IHNpemUsCi0JZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKKwkJCQkgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQogewogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHI7CiAKLQlCVUdfT04oIWRldi0+ZF9yZWdpb24tPmJ1c19hZGRyKTsKLQogCWZsYWcgJj0gfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKTsKIAlmbGFnIHw9IF9fR0ZQX1pFUk87CiAKQEAgLTIwNSw3ICs1MjAsOCBAQAogCQlnb3RvIGNsZWFuX25vbmU7CiAJfQogCi0JcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgdmlydF9hZGRyLCBzaXplLCBkbWFfaGFuZGxlKTsKKwlyZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLCB2aXJ0X2FkZHIsIHNpemUsIGRtYV9oYW5kbGUsCisJCQkgICAgIElPUFRFX1BQX1cgfCBJT1BURV9QUF9SIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKQEAgLTIyNiw3ICs1NDIsNyBAQAogc3RhdGljIHZvaWQgcHMzX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqX2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAogCXBzM19kbWFfdW5tYXAoZGV2LT5kX3JlZ2lvbiwgZG1hX2hhbmRsZSwgc2l6ZSk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKQEAgLTIzOSwxNSArNTU1LDE2IEBACiAgKiBieXRlIHdpdGhpbiB0aGUgcGFnZSBhcyB2YWRkci4KICAqLwogCi1zdGF0aWMgZG1hX2FkZHJfdCBwczNfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorc3RhdGljIGRtYV9hZGRyX3QgcHMzX3NiX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCiAJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLAotCQkmYnVzX2FkZHIpOworCQkJICAgICAmYnVzX2FkZHIsCisJCQkgICAgIElPUFRFX1BQX1IgfCBJT1BURV9QUF9XIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKQEAgLTI1NywxMCArNTc0LDQ0IEBACiAJcmV0dXJuIGJ1c19hZGRyOwogfQogCitzdGF0aWMgZG1hX2FkZHJfdCBwczNfaW9jMF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHZvaWQgKnB0ciwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CisJdTY0IGlvcHRlX2ZsYWc7CisKKwlpb3B0ZV9mbGFnID0gSU9QVEVfTTsKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCWlvcHRlX2ZsYWcgfD0gSU9QVEVfUFBfUiB8IElPUFRFX1BQX1cgfCBJT1BURV9TT19SVzsKKwkJYnJlYWs7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlpb3B0ZV9mbGFnIHw9IElPUFRFX1BQX1IgfCBJT1BURV9TT19SOworCQlicmVhazsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJaW9wdGVfZmxhZyB8PSBJT1BURV9QUF9XIHwgSU9QVEVfU09fUlc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vdCBoYXBwbmVkICovCisJCUJVRygpOworCX07CisJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLAorCQkJICAgICAmYnVzX2FkZHIsIGlvcHRlX2ZsYWcpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfbWFwIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCX0KKwlyZXR1cm4gYnVzX2FkZHI7Cit9CisKIHN0YXRpYyB2b2lkIHBzM191bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2RldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKIAlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCWludCByZXN1bHQ7CiAKIAlyZXN1bHQgPSBwczNfZG1hX3VubWFwKGRldi0+ZF9yZWdpb24sIGRtYV9hZGRyLCBzaXplKTsKQEAgLTI3MSwyMCArNjIyLDIwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHBzM19tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorc3RhdGljIGludCBwczNfc2JfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfUFMzX0RZTkFNSUNfRE1BKQogCUJVR19PTigiZG8iKTsKIAlyZXR1cm4gLUVQRVJNOwogI2Vsc2UKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CiAJCWludCByZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLAogCQkJcGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgsCi0JCQkmc2ctPmRtYV9hZGRyZXNzKTsKKwkJCQkJICZzZy0+ZG1hX2FkZHJlc3MsIDApOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCkBAIC0yOTksNyArNjUwLDE1IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgcHMzX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCitzdGF0aWMgaW50IHBzM19pb2MwX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgaW50IG5lbnRzLAorCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwczNfc2JfdW5tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKIAlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19QUzNfRFlOQU1JQ19ETUEpCkBAIC0zMDcsMTggKzY2NiwzNCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB2b2lkIHBzM19pb2MwX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHKCk7Cit9CisKIHN0YXRpYyBpbnQgcHMzX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqX2RldiwgdTY0IG1hc2spCiB7CiAJcmV0dXJuIG1hc2sgPj0gRE1BXzMyQklUX01BU0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBzM19kbWFfb3BzID0geworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX3NiX2RtYV9vcHMgPSB7CiAJLmFsbG9jX2NvaGVyZW50ID0gcHMzX2FsbG9jX2NvaGVyZW50LAogCS5mcmVlX2NvaGVyZW50ID0gcHMzX2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zaW5nbGUgPSBwczNfbWFwX3NpbmdsZSwKKwkubWFwX3NpbmdsZSA9IHBzM19zYl9tYXBfc2luZ2xlLAogCS51bm1hcF9zaW5nbGUgPSBwczNfdW5tYXBfc2luZ2xlLAotCS5tYXBfc2cgPSBwczNfbWFwX3NnLAotCS51bm1hcF9zZyA9IHBzM191bm1hcF9zZywKKwkubWFwX3NnID0gcHMzX3NiX21hcF9zZywKKwkudW5tYXBfc2cgPSBwczNfc2JfdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQgPSBwczNfZG1hX3N1cHBvcnRlZAorfTsKKworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX2lvYzBfZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQgPSBwczNfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgPSBwczNfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NpbmdsZSA9IHBzM19pb2MwX21hcF9zaW5nbGUsCisJLnVubWFwX3NpbmdsZSA9IHBzM191bm1hcF9zaW5nbGUsCisJLm1hcF9zZyA9IHBzM19pb2MwX21hcF9zZywKKwkudW5tYXBfc2cgPSBwczNfaW9jMF91bm1hcF9zZywKIAkuZG1hX3N1cHBvcnRlZCA9IHBzM19kbWFfc3VwcG9ydGVkCiB9OwogCkBAIC0zMjgsNyArNzAzLDcgQEAKIAogc3RhdGljIHZvaWQgcHMzX3N5c3RlbV9idXNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqX2RldikKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlrZnJlZShkZXYpOwogfQogCkBAIC0zNDMsMTggKzcxOCwzNyBAQAogaW50IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9jb3VudCA9IDE7CisJc3RhdGljIHVuc2lnbmVkIGludCBkZXZfaW9jMF9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9zYl9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl92dWFydF9jb3VudDsKIAotCWRldi0+Y29yZS5wYXJlbnQgPSBOVUxMOworCWlmICghZGV2LT5jb3JlLnBhcmVudCkKKwkJZGV2LT5jb3JlLnBhcmVudCA9ICZwczNfc3lzdGVtX2J1czsKIAlkZXYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CiAJZGV2LT5jb3JlLnJlbGVhc2UgPSBwczNfc3lzdGVtX2J1c19yZWxlYXNlX2RldmljZTsKIAotCWRldi0+Y29yZS5hcmNoZGF0YS5vZl9ub2RlID0gTlVMTDsKLQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfZG1hX29wczsKLQlkZXYtPmNvcmUuYXJjaGRhdGEubnVtYV9ub2RlID0gMDsKKwlzd2l0Y2ggKGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9JT0MwOgorCQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfaW9jMF9kbWFfb3BzOworCQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksCisJCQkiaW9jMF8lMDJ4IiwgKytkZXZfaW9jMF9jb3VudCk7CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVklDRV9UWVBFX1NCOgorCQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfc2JfZG1hX29wczsKKwkJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLAorCQkJInNiXyUwMngiLCArK2Rldl9zYl9jb3VudCk7CiAKLQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksICJzYl8lMDJ4IiwKLQkJZGV2X2NvdW50KyspOworCQlicmVhazsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9WVUFSVDoKKwkJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLAorCQkJInZ1YXJ0XyUwMngiLCArK2Rldl92dWFydF9jb3VudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX07CisKKwlkZXYtPmNvcmUuYXJjaGRhdGEub2Zfbm9kZSA9IE5VTEw7CisJZGV2LT5jb3JlLmFyY2hkYXRhLm51bWFfbm9kZSA9IDA7CiAKIAlwcl9kZWJ1ZygiJXM6JWQgYWRkICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOwogCkBAIC0zNjgsOSArNzYyLDE1IEBACiB7CiAJaW50IHJlc3VsdDsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKKworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlkcnYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CiAKIAlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM3OCw3ICs3NzgsOSBAQAogCiB2b2lkIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydikKIHsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMKaW5kZXggMWJhZThiMS4uODAyYTljYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3RpbWUuYwpAQCAtMzksNyArMzksNyBAQAogfQogCiAjZGVmaW5lIGR1bXBfdGltZShfYSkgX2R1bXBfdGltZShfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3RpbWUoaW50IHRpbWUsIGNvbnN0IGNoYXIqIGZ1bmMsCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF90aW1lKGludCB0aW1lLCBjb25zdCBjaGFyICpmdW5jLAogCWludCBsaW5lKQogewogCXN0cnVjdCBydGNfdGltZSB0bTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCBhZTFmYzkyLi45OTJiYTY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KIG9iai0kKENPTkZJR19YSUNTKQkrPSB4aWNzLm8KIG9iai0kKENPTkZJR19TQ0FOTE9HKQkrPSBzY2FubG9nLm8KLW9iai0kKENPTkZJR19FRUgpCSs9IGVlaC5vIGVlaF9jYWNoZS5vIGVlaF9kcml2ZXIubyBlZWhfZXZlbnQubworb2JqLSQoQ09ORklHX0VFSCkJKz0gZWVoLm8gZWVoX2NhY2hlLm8gZWVoX2RyaXZlci5vIGVlaF9ldmVudC5vIGVlaF9zeXNmcy5vCiBvYmotJChDT05GSUdfS0VYRUMpCSs9IGtleGVjLm8KIG9iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaV9kbHBhci5vCiBvYmotJChDT05GSUdfUENJX01TSSkJKz0gbXNpLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYwppbmRleCA1ZjNlNmQ4Li5iODc3MDM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCkBAIC0xLDYgKzEsOCBAQAogLyoKICAqIGVlaC5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2ZSBFbmdlYnJldHNlbiAmIFRvZGQgSW5nbGV0dCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMSwgMjAwNSwgMjAwNgorICogQ29weXJpZ2h0IERhdmUgRW5nZWJyZXRzZW4gJiBUb2RkIEluZ2xldHQgMjAwMQorICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgMjAwNSwgMjAwNgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTUsNiArMTcsOCBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBQbGVhc2UgYWRkcmVzcyBjb21tZW50cyBhbmQgZmVlZGJhY2sgdG8gTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMTcsNyArMTIxLDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfY2hlY2s7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9tbWlvX2ZmczsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZhbHNlX3Bvc2l0aXZlczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfZmFpbHVyZXM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbG90X3Jlc2V0czsKIAogI2RlZmluZSBJU19CUklER0UoY2xhc3NfY29kZSkgKCgoY2xhc3NfY29kZSk8PDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCkBAIC01MDUsNiArNTA4LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVIOiByZWFkX3Nsb3RfcmVzZXRfc3RhdGUoKSBmYWlsZWQ7IHJjPSVkIGRuPSVzXG4iLAogCQkgICAgICAgcmV0LCBkbi0+ZnVsbF9uYW1lKTsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC01MTMsNiArNTE3LDcgQEAKIAkgKiB0aGV5IGFyZSBlbXB0eSB3aGVuIHRoZXkgZG9uJ3QgaGF2ZSBjaGlsZHJlbi4gKi8KIAlpZiAoKHJldHNbMF0gPT0gNSkgJiYgKGRuLT5jaGlsZCA9PSBOVUxMKSkgewogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyMiw2ICs1MjcsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IGV2ZW50IG9uIHVuc3VwcG9ydGVkIGRldmljZSwgcmM9JWQgZG49JXNcbiIsCiAJCSAgICAgICByZXQsIGRuLT5mdWxsX25hbWUpOwogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyOSw2ICs1MzUsNyBAQAogCS8qIElmIG5vdCB0aGUga2luZCBvZiBlcnJvciB3ZSBrbm93IGFib3V0LCBwdW50LiAqLwogCWlmIChyZXRzWzBdICE9IDEgJiYgcmV0c1swXSAhPSAyICYmIHJldHNbMF0gIT0gNCAmJiByZXRzWzBdICE9IDUpIHsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC05MjEsNiArOTI4LDcgQEAKIAlwZG4tPmVlaF9tb2RlID0gMDsKIAlwZG4tPmVlaF9jaGVja19jb3VudCA9IDA7CiAJcGRuLT5lZWhfZnJlZXplX2NvdW50ID0gMDsKKwlwZG4tPmVlaF9mYWxzZV9wb3NpdGl2ZXMgPSAwOwogCiAJaWYgKHN0YXR1cyAmJiBzdHJjbXAoc3RhdHVzLCAib2siKSAhPSAwKQogCQlyZXR1cm4gTlVMTDsJLyogaWdub3JlIGRldmljZXMgd2l0aCBiYWQgc3RhdHVzICovCkBAIC0xMTM5LDcgKzExNDcsOCBAQAogCXBkbiA9IFBDSV9ETihkbik7CiAJcGRuLT5wY2lkZXYgPSBkZXY7CiAKLQlwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlIChkZXYpOworCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfYWRkX2RldmljZShkZXYpOwogfQogCiB2b2lkIGVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQpAQCAtMTE3OCw2ICsxMTg3LDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiByZW1vdmUgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKICNlbmRpZgogCXBjaV9hZGRyX2NhY2hlX3JlbW92ZV9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfcmVtb3ZlX2RldmljZShkZXYpOwogCiAJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKIAlpZiAoUENJX0ROKGRuKS0+cGNpZGV2KSB7CkBAIC0xMjE0LDExICsxMjI0LDEwIEBACiAJCQkJImNoZWNrIG5vdCB3YW50ZWQ9JWxkXG4iCiAJCQkJImVlaF90b3RhbF9tbWlvX2Zmcz0lbGRcbiIKIAkJCQkiZWVoX2ZhbHNlX3Bvc2l0aXZlcz0lbGRcbiIKLQkJCQkiZWVoX2lnbm9yZWRfZmFpbHVyZXM9JWxkXG4iCiAJCQkJImVlaF9zbG90X3Jlc2V0cz0lbGRcbiIsCiAJCQkJbm9fZGV2aWNlLCBub19kbiwgbm9fY2ZnX2FkZHIsIAogCQkJCWlnbm9yZWRfY2hlY2ssIHRvdGFsX21taW9fZmZzLCAKLQkJCQlmYWxzZV9wb3NpdGl2ZXMsIGlnbm9yZWRfZmFpbHVyZXMsIAorCQkJCWZhbHNlX3Bvc2l0aXZlcywKIAkJCQlzbG90X3Jlc2V0cyk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKaW5kZXggZjJiYWUwNC4uZTQ5YzgxNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwpAQCAtMiw3ICsyLDggQEAKICAqIGVlaF9jYWNoZS5jCiAgKiBQQ0kgYWRkcmVzcyBjYWNoZTsgYWxsb3dzIHRoZSBsb29rdXAgb2YgUENJIGRldmljZXMgYmFzZWQgb24gSS9PIGFkZHJlc3MKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA0CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IDIwMDQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI5NSw2ICsyOTYsOCBAQAogCQkJY29udGludWU7CiAJCXBjaV9kZXZfZ2V0IChkZXYpOyAgLyogbWF0Y2hpbmcgcHV0IGlzIGluIGVlaF9yZW1vdmVfZGV2aWNlKCkgKi8KIAkJUENJX0ROKGRuKS0+cGNpZGV2ID0gZGV2OworCisJCWVlaF9zeXNmc19hZGRfZGV2aWNlKGRldik7CiAJfQogCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCmluZGV4IDE2MWE1ODQuLjE1ZTAxNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBQQ0kgRXJyb3IgUmVjb3ZlcnkgRHJpdmVyIGZvciBSUEEtY29tcGxpYW50IFBQQzY0IHBsYXRmb3JtLgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4KKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNCAyMDA1CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPiAyMDA0LCAyMDA1CiAgKgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0xOSw4ICsyMCw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgotICogU2VuZCBmZWVkYmFjayB0byA8bGluYXNAdXMuaWJtLmNvbT4KLSAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogU3lzZnMgZW50cmllcyBmb3IgUENJIEVycm9yIFJlY292ZXJ5IGZvciBQQVBSLWNvbXBsaWFudCBwbGF0Zm9ybS4KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNworICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPiAyMDA3CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKy8qKgorICogRUVIX1NIT1dfQVRUUiAtLSBjcmVhdGUgc3lzZnMgZW50cnkgZm9yIGVlaCBzdGF0aXN0aWMKKyAqIEBfbmFtZTogbmFtZSBvZiBmaWxlIGluIHN5c2ZzIGRpcmVjdG9yeQorICogQF9tZW1iOiBuYW1lIG9mIG1lbWJlciBpbiBzdHJ1Y3QgcGNpX2RuIHRvIGFjY2VzcworICogQF9mb3JtYXQ6IHByaW50ZiBmb3JtYXQgZm9yIGRpc3BsYXkKKyAqCisgKiBBbGwgb2YgdGhlIGF0dHJpYnV0ZXMgbG9vayB2ZXJ5IHNpbWlsYXIsIHNvIGp1c3QKKyAqIGF1dG8tZ2VuIGEgY3V0LW4tcGFzdGUgcm91dGluZSB0byBkaXNwbGF5IHRoZW0uCisgKi8KKyNkZWZpbmUgRUVIX1NIT1dfQVRUUihfbmFtZSxfbWVtYixfZm9ybWF0KSAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGVlaF9zaG93XyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCAgICAgIFwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOyAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOyBcCisJc3RydWN0IHBjaV9kbiAqcGRuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIWRuIHx8IFBDSV9ETihkbikgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcGRuID0gUENJX0ROKGRuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgX2Zvcm1hdCAiXG4iLCBwZG4tPl9tZW1iKTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JUlVHTywgZWVoX3Nob3dfIyNfbmFtZSwgTlVMTCk7CisKKworRUVIX1NIT1dfQVRUUihlZWhfbW9kZSwgZWVoX21vZGUsICIweCV4Iik7CitFRUhfU0hPV19BVFRSKGVlaF9jb25maWdfYWRkciwgZWVoX2NvbmZpZ19hZGRyLCAiMHgleCIpOworRUVIX1NIT1dfQVRUUihlZWhfcGVfY29uZmlnX2FkZHIsIGVlaF9wZV9jb25maWdfYWRkciwgIjB4JXgiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2NoZWNrX2NvdW50LCBlZWhfY2hlY2tfY291bnQsICIlZCIpOworRUVIX1NIT1dfQVRUUihlZWhfZnJlZXplX2NvdW50LCBlZWhfZnJlZXplX2NvdW50LCAiJWQiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2ZhbHNlX3Bvc2l0aXZlcywgZWVoX2ZhbHNlX3Bvc2l0aXZlcywgIiVkIik7CisKK3ZvaWQgZWVoX3N5c2ZzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJjPTA7CisKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJcmMgKz0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7CisKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBlbnRyaWVzXG4iKTsKK30KKwordm9pZCBlZWhfc3lzZnNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IDM2MmRmYmMuLjhjYzZlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMzczLDEyICszNzMsMjMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHNpemVfYnl0ZXMgPSAxVUwgPDwgcHBjNjRfcGZ0X3NpemU7CiAJdW5zaWduZWQgbG9uZyBocHRlX2NvdW50ID0gc2l6ZV9ieXRlcyA+PiA0OwotCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTI7CisJdW5zaWduZWQgbG9uZyBkdW1teTEsIGR1bW15MiwgZHdvcmQwOworCWxvbmcgbHBhcl9yYzsKIAlpbnQgaTsKIAogCS8qIFRPRE86IFVzZSBidWxrIGNhbGwgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKQotCQlwbHBhcl9wdGVfcmVtb3ZlX3JhdygwLCBpLCAwLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKSB7CisJCS8qIGRvbnQgcmVtb3ZlIEhQVEVzIHdpdGggVlJNQSBtYXBwaW5ncyAqLworCQlscGFyX3JjID0gcGxwYXJfcHRlX3JlbW92ZV9yYXcoSF9BTkRDT05ELCBpLCBIUFRFX1ZfMVRCX1NFRywKKwkJCQkJCSZkdW1teTEsICZkdW1teTIpOworCQlpZiAobHBhcl9yYyA9PSBIX05PVF9GT1VORCkgeworCQkJbHBhcl9yYyA9IHBscGFyX3B0ZV9yZWFkX3JhdygwLCBpLCAmZHdvcmQwLCAmZHVtbXkxKTsKKwkJCWlmICghbHBhcl9yYyAmJiAoKGR3b3JkMCAmIEhQVEVfVl9WUk1BX01BU0spCisJCQkJIT0gSFBURV9WX1ZSTUFfTUFTSykpCisJCQkJLyogQ2FuIGJlIGhwdGUgZm9yIDFUQiBTZWcuIFNvIHJlbW92ZSBpdCAqLworCQkJCXBscGFyX3B0ZV9yZW1vdmVfcmF3KDAsIGksIDAsICZkdW1teTEsICZkdW1teTIpOworCQl9CisJfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCmluZGV4IGZmYWY2YzUuLjQ3ZjBlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKQEAgLTExMCw4ICsxMTAsNiBAQAogCQkJfQogCQl9CiAJfQotCi0JZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyk7CiAKQEAgLTEzOSw2ICsxMzcsOCBAQAogCiAJLyogTWFrZSB0aGUgZGlzY292ZXJlZCBkZXZpY2VzIGF2YWlsYWJsZSAqLwogCXBjaV9idXNfYWRkX2RldmljZXMoY2hpbGRfYnVzKTsKKworCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShjaGlsZF9idXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsNiArMTcxLDcgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZidXMtPmRldmljZXMpKSB7CiAJCQlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhidXMsIDApOwogCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCQkJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiAJCX0KIAl9IGVsc2UgaWYgKG1vZGUgPT0gUENJX1BST0JFX05PUk1BTCkgewogCQkvKiB1c2UgbGVnYWN5IHByb2JlICovCkBAIC0xNzksNiArMTgwLDcgQEAKIAkJaWYgKG51bSkgewogCQkJcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAxKTsKIAkJCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKKwkJCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShidXMpOwogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQpAQCAtMjAwLDggKzIwMiw2IEBACiAJcnRhc19zZXR1cF9waGIocGhiKTsKIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgZG4sIDApOwogCi0JcGNpX3NldHVwX3BoYl9pb19keW5hbWljKHBoYiwgcHJpbWFyeSk7Ci0KIAlwY2lfZGV2c19waGJfaW5pdF9keW5hbWljKHBoYik7CiAKIAlpZiAoZG4tPmNoaWxkKQpAQCAtMjEwLDYgKzIxMCw3IEBACiAJc2Nhbl9waGIocGhiKTsKIAlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhwaGItPmJ1cywgMCk7CiAJcGNpX2J1c19hZGRfZGV2aWNlcyhwaGItPmJ1cyk7CisJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKHBoYi0+YnVzKTsKIAogCXJldHVybiBwaGI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCmluZGV4IDJlNGQxMGMuLmQwMDNjODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCkBAIC0xMDgsNiArMTA4LDIxIEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBwbHBhcl9wdGVfcmVhZF9yYXcgY2FuIGJlIGNhbGxlZCBpbiByZWFsIG1vZGUuIEl0IGNhbGxzIHBscGFyX2hjYWxsX3JhdyAqLworc3RhdGljIGlubGluZSBsb25nIHBscGFyX3B0ZV9yZWFkX3Jhdyh1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHB0ZXgsCisJCXVuc2lnbmVkIGxvbmcgKm9sZF9wdGVoX3JldCwgdW5zaWduZWQgbG9uZyAqb2xkX3B0ZWxfcmV0KQoreworCWxvbmcgcmM7CisJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTExfQlVGU0laRV07CisKKwlyYyA9IHBscGFyX2hjYWxsX3JhdyhIX1JFQUQsIHJldGJ1ZiwgZmxhZ3MsIHB0ZXgpOworCisJKm9sZF9wdGVoX3JldCA9IHJldGJ1ZlswXTsKKwkqb2xkX3B0ZWxfcmV0ID0gcmV0YnVmWzFdOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW5saW5lIGxvbmcgcGxwYXJfcHRlX3Byb3RlY3QodW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwdGV4LAogCQl1bnNpZ25lZCBsb25nIGF2cG4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaAppbmRleCAyNzI5ZDU1Li42MWUxOWY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzLmgKQEAgLTMzLDYgKzMzLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9rZXhlY19jcHVfZG93bl9tcGljKHZvaWQpIHsgfQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7CisKIC8qIFBvd2Vyb24gZmxhZyB1c2VkIGZvciBlbmFibGluZyBhdXRvIHVwcyByZXN0YXJ0ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBydGFzX3Bvd2Vyb25fYXV0bzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCA1YWE5N2FmLi5jMDJmODc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJc3RyY3B5KG5wLT5mdWxsX25hbWUsIHBhdGgpOwogCiAJbnAtPnByb3BlcnRpZXMgPSBwcm9wbGlzdDsKLQlPRl9NQVJLX0RZTkFNSUMobnApOworCW9mX25vZGVfc2V0X2ZsYWcobnAsIE9GX0RZTkFNSUMpOwogCWtyZWZfaW5pdCgmbnAtPmtyZWYpOwogCiAJbnAtPnBhcmVudCA9IGRlcml2ZV9wYXJlbnQocGF0aCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCmluZGV4IGEwMzFkOTkuLjU5ZTY5ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0zOTksNiArMzk5LDcgQEAKIAkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCiAJICovCiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKKwlnZXRfbHBwYWNhKCktPmRvbmF0ZV9kZWRpY2F0ZWRfY3B1ID0gMTsKIAogCS8qCiAJICogV2UgY29tZSBpbiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGFuZCBuZWVkX3Jlc2NoZWQoKQpAQCAtNDMxLDYgKzQzMiw3IEBACiAKIG91dDoKIAlITVRfbWVkaXVtKCk7CisJZ2V0X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDA7CiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggZjFkZjk0Mi4uNWJkOTBhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC0xNTYsOSArMTU2LDkgQEAKIAogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSkKK3N0YXRpYyBpbnQgZ2V0X2lycV9zZXJ2ZXIodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBzdHJpY3RfY2hlY2spCiB7Ci0JdW5zaWduZWQgaW50IHNlcnZlcjsKKwlpbnQgc2VydmVyOwogCS8qIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUgKi8KIAljcHVtYXNrX3QgY3B1bWFzayA9IGlycV9kZXNjW3ZpcnFdLmFmZmluaXR5OwogCWNwdW1hc2tfdCB0bXAgPSBDUFVfTUFTS19OT05FOwpAQCAtMTY2LDIyICsxNjYsMjUgQEAKIAlpZiAoIWRpc3RyaWJ1dGVfaXJxcykKIAkJcmV0dXJuIGRlZmF1bHRfc2VydmVyOwogCi0JaWYgKGNwdXNfZXF1YWwoY3B1bWFzaywgQ1BVX01BU0tfQUxMKSkgewotCQlzZXJ2ZXIgPSBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyOwotCX0gZWxzZSB7CisJaWYgKCFjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKIAkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7CiAKLQkJaWYgKGNwdXNfZW1wdHkodG1wKSkKLQkJCXNlcnZlciA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JCWVsc2UKLQkJCXNlcnZlciA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoZmlyc3RfY3B1KHRtcCkpOworCQlzZXJ2ZXIgPSBmaXJzdF9jcHUodG1wKTsKKworCQlpZiAoc2VydmVyIDwgTlJfQ1BVUykKKwkJCXJldHVybiBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHNlcnZlcik7CisKKwkJaWYgKHN0cmljdF9jaGVjaykKKwkJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR1cm4gc2VydmVyOworCWlmIChjcHVzX2VxdWFsKGNwdV9vbmxpbmVfbWFwLCBjcHVfcHJlc2VudF9tYXApKQorCQlyZXR1cm4gZGVmYXVsdF9kaXN0cmliX3NlcnZlcjsKIAorCXJldHVybiBkZWZhdWx0X3NlcnZlcjsKIH0KICNlbHNlCi1zdGF0aWMgaW50IGdldF9pcnFfc2VydmVyKHVuc2lnbmVkIGludCB2aXJxKQorc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHN0cmljdF9jaGVjaykKIHsKIAlyZXR1cm4gZGVmYXVsdF9zZXJ2ZXI7CiB9CkBAIC0xOTIsNyArMTk1LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWludCBjYWxsX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgc2VydmVyOworCWludCBzZXJ2ZXI7CiAKIAlwcl9kZWJ1ZygieGljczogdW5tYXNrIHZpcnEgJWRcbiIsIHZpcnEpOwogCkBAIC0yMDEsNyArMjA0LDcgQEAKIAlpZiAoaXJxID09IFhJQ1NfSVBJIHx8IGlycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykKIAkJcmV0dXJuOwogCi0Jc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSk7CisJc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSwgMCk7CiAKIAljYWxsX3N0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsIGlycSwgc2VydmVyLAogCQkJCURFRkFVTFRfUFJJT1JJVFkpOwpAQCAtMzk4LDggKzQwMSw3IEBACiAJdW5zaWduZWQgaW50IGlycTsKIAlpbnQgc3RhdHVzOwogCWludCB4aWNzX3N0YXR1c1syXTsKLQl1bnNpZ25lZCBsb25nIG5ld21hc2s7Ci0JY3B1bWFza190IHRtcCA9IENQVV9NQVNLX05PTkU7CisJaW50IGlycV9zZXJ2ZXI7CiAKIAlpcnEgPSAodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnE7CiAJaWYgKGlycSA9PSBYSUNTX0lQSSB8fCBpcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCkBAIC00MTMsMTggKzQxNSwyMSBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogRm9yIHRoZSBtb21lbnQgb25seSBpbXBsZW1lbnQgZGVsaXZlcnkgdG8gYWxsIGNwdXMgb3Igb25lIGNwdSAqLwotCWlmIChjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKLQkJbmV3bWFzayA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JfSBlbHNlIHsKLQkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7Ci0JCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCQlyZXR1cm47Ci0JCW5ld21hc2sgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGZpcnN0X2NwdSh0bXApKTsKKwkvKgorCSAqIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUuCisJICogR2V0IGN1cnJlbnQgaXJxX3NlcnZlciBmb3IgdGhlIGdpdmVuIGlycQorCSAqLworCWlycV9zZXJ2ZXIgPSBnZXRfaXJxX3NlcnZlcihpcnEsIDEpOworCWlmIChpcnFfc2VydmVyID09IC0xKSB7CisJCWNoYXIgY3B1bGlzdFsxMjhdOworCQljcHVtYXNrX3NjbnByaW50ZihjcHVsaXN0LCBzaXplb2YoY3B1bGlzdCksIGNwdW1hc2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4aWNzX3NldF9hZmZpbml0eTogTm8gb25saW5lIGNwdXMgaW4gIgorCQkJCSJ0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLCBjcHVsaXN0LCB2aXJxKTsKKwkJcmV0dXJuOwogCX0KIAogCXN0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsCi0JCQkJaXJxLCBuZXdtYXNrLCB4aWNzX3N0YXR1c1sxXSk7CisJCQkJaXJxLCBpcnFfc2VydmVyLCB4aWNzX3N0YXR1c1sxXSk7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieGljc19zZXRfYWZmaW5pdHk6IGlycT0ldSBpYm0sc2V0LXhpdmUgIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggYzNjZTBiZC4uZjY1MDc4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC01LDcgKzUsNiBAQAogbXBpYy1tc2ktb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IG1waWNfbXNpLm8gbXBpY191M21zaS5vCiBvYmotJChDT05GSUdfTVBJQykJCSs9IG1waWMubyAkKG1waWMtbXNpLW9iai15KQogCi1vYmotJChDT05GSUdfUFBDX0lORElSRUNUX1BDSSkJKz0gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19QUENfTVBDMTA2KQkrPSBncmFja2xlLm8KIG9iai0kKENPTkZJR19QUENfRENSKQkJKz0gZGNyLm8KIG9iai0kKENPTkZJR19QUENfRENSX05BVElWRSkJKz0gZGNyLWxvdy5vCkBAIC0xMywxNiArMTIsMTkgQEAKIG9iai0kKENPTkZJR19VM19EQVJUKQkJKz0gZGFydF9pb21tdS5vCiBvYmotJChDT05GSUdfTU1JT19OVlJBTSkJKz0gbW1pb19udnJhbS5vCiBvYmotJChDT05GSUdfRlNMX1NPQykJCSs9IGZzbF9zb2Mubwotb2JqLSQoQ09ORklHX0ZTTF9QQ0lFKQkJKz0gZnNsX3BjaWUubwogb2JqLSQoQ09ORklHX1RTSTEwOF9CUklER0UpCSs9IHRzaTEwOF9wY2kubyB0c2kxMDhfZGV2Lm8KIG9iai0kKENPTkZJR19RVUlDQ19FTkdJTkUpCSs9IHFlX2xpYi8KIG12NjR4NjAtJChDT05GSUdfUENJKQkJKz0gbXY2NHg2MF9wY2kubwogb2JqLSQoQ09ORklHX01WNjRYNjApCQkrPSAkKG12NjR4NjAteSkgbXY2NHg2MF9waWMubyBtdjY0eDYwX2Rldi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9DTU9TKQkrPSBydGNfY21vc19zZXR1cC5vCiAKICMgY29udGFpbnMgb25seSB0aGUgc3VzcGVuZCBoYW5kbGVyIGZvciB0aW1lCitpZmVxICgkKENPTkZJR19SVENfQ0xBU1MpLCkKIG9iai0kKENPTkZJR19QTSkJCSs9IHRpbWVyLm8KK2VuZGlmCiAKIGlmZXEgKCQoQ09ORklHX1BQQ19NRVJHRSkseSkKK29iai0kKENPTkZJR19QUENfSU5ESVJFQ1RfUENJKQkrPSBpbmRpcmVjdF9wY2kubwogb2JqLSQoQ09ORklHX1BQQ19JODI1OSkJCSs9IGk4MjU5Lm8KIG9iai0kKENPTkZJR19QUENfODN4eCkJCSs9IGlwaWMubwogb2JqLSQoQ09ORklHXzR4eCkJCSs9IHVpYy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWMwN2UuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBpbmRpcmVjdCBQQ0kgYnJpZGdlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggR2FicmllbCBQYXViZXJ0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIlRlbXBvcmFyeSIgTVBDODU0OCBFcnJhdGEgZmlsZSAtCi0gKiBUaGUgc3RhbmRhcmQgaW5kaXJlY3RfcGNpIGNvZGUgc2hvdWxkIHdvcmsgd2l0aCBmdXR1cmUgc2lsaWNvbiB2ZXJzaW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0KLSNkZWZpbmUgUENJX0NGR19PVVQgb3V0X2JlMzIKLQotLyogRVJSQVRBIFBDSS1FeCAxNCBQQ0lFIENvbnRyb2xsZXIgdGltZW91dCAqLwotI2RlZmluZSBQQ0lFX0ZJWAkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIrMHg0LCAweDA0MDBmZmZmKQotCi0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX3BjaWUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAotCQkgICAgIGludCBsZW4sIHUzMiAqdmFsKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKLQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOwotCXUzMiB0ZW1wOwotCi0JaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCi0JCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JLyogUG9zc2libGUgYXJ0aWZhY3Qgb2YgQ0RDcHA1MDkzNyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gKi8KLQlpZiAoZGV2Zm4gIT0gMHgwICYmIGJ1cy0+bnVtYmVyID09IDB4ZmYpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlQQ0lFX0ZJWDsKLQlpZiAoYnVzLT5udW1iZXIgPT0gMHhmZikgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMCB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9IGVsc2UgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlQQ0lFX0ZJWDsKLQl0ZW1wID0gaW5fbGUzMihjZmdfZGF0YSk7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCSp2YWwgPSAodGVtcCA+PiAoKChvZmZzZXQgJiAzKSkqOCkpICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpKjgpKSAmIDB4ZmZmZjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IHRlbXA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgICAgIGludCBsZW4sIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwotCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7Ci0JdTMyIHRlbXA7Ci0KLQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKLQkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkvKiBQb3NzaWJsZSBhcnRpZmFjdCBvZiBDRENwcDUwOTM3IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiAqLwotCWlmIChkZXZmbiAhPSAweDAgJiYgYnVzLT5udW1iZXIgPT0gMHhmZikKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCVBDSUVfRklYOwotCWlmIChidXMtPm51bWJlciA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAwIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAxIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotICAgICAgICB9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlzd2l0Y2ggKGxlbikgewotCWNhc2UgMToKLQkJUENJRV9GSVg7Ci0JCXRlbXAgPSBpbl9sZTMyKGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpIHwKLQkJCSh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUENJRV9GSVg7Ci0JCW91dF9sZTMyKGNmZ19kYXRhLCB0ZW1wKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlQQ0lFX0ZJWDsKLQkJdGVtcCA9IGluX2xlMzIoY2ZnX2RhdGEpOwotCQl0ZW1wID0gKHRlbXAgJiB+KDB4ZmZmZiA8PCAoKG9mZnNldCAmIDMpICogOCkpKTsKLQkJdGVtcCB8PSAodmFsIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkgOwotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHRlbXApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQlQQ0lFX0ZJWDsKLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgaW5kaXJlY3RfcGNpZV9vcHMgPSB7Ci0JaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZSwKLQlpbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZQotfTsKLQotdm9pZCBfX2luaXQKLXNldHVwX2luZGlyZWN0X3BjaWVfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB2b2lkIF9faW9tZW0gKiBjZmdfYWRkciwKLQl2b2lkIF9faW9tZW0gKiBjZmdfZGF0YSkKLXsKLQlob3NlLT5jZmdfYWRkciA9IGNmZ19hZGRyOwotCWhvc2UtPmNmZ19kYXRhID0gY2ZnX2RhdGE7Ci0JaG9zZS0+b3BzID0gJmluZGlyZWN0X3BjaWVfb3BzOwotfQotCi12b2lkIF9faW5pdAotc2V0dXBfaW5kaXJlY3RfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQotewotCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOwotCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKLQotCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOwotCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOwotCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCi0JCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKLQlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKLQlzZXR1cF9pbmRpcmVjdF9wY2llX25vbWFwKGhvc2UsIGFkZHIsIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCBjYWQxNzU3Li5jMGRkYzgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMTAyOCw2ICsxMDI4LDE5IEBACiAKIGFyY2hfaW5pdGNhbGwoZnNfZW5ldF9vZl9pbml0KTsKIAorc3RhdGljIGludCBfX2luaXQgZnNsX3BjbWNpYV9vZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJLyoKKwkgKiBSZWdpc3RlciBhbGwgdGhlIGRldmljZXMgd2hpY2ggdHlwZSBpcyAicGNtY2lhIgorCSAqLworCXdoaWxlICgobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwKKwkJCSJwY21jaWEiLCAiZnNsLHBxLXBjbWNpYSIpKSAhPSBOVUxMKQorCQkJICAgIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJtOHh4LXBjbWNpYSIsIE5VTEwpOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGZzbF9wY21jaWFfb2ZfaW5pdCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcmVncyA9ICJyZWdzIjsKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcHJhbSA9ICJwcmFtIjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2luZGlyZWN0X3BjaS5jCmluZGV4IGU3MTQ4ODQuLmM3ZTZlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pbmRpcmVjdF9wY2kuYwpAQCAtMzMsMTggKzMzLDI3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CiAJdTggY2ZnX3R5cGUgPSAwOworCXUzMiBidXNfbm8sIHJlZzsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkKLQlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU0VUX0NGR19UWVBFKQogCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCiAJCQljZmdfdHlwZSA9IDE7CiAKLQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwgCQkJCQkgCi0JCSAoMHg4MDAwMDAwMCB8ICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgfCBjZmdfdHlwZSkpKTsKKwlidXNfbm8gPSAoYnVzLT5udW1iZXIgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pID8KKwkJCWhvc2UtPnNlbGZfYnVzbm8gOiBidXMtPm51bWJlcjsKKworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRykKKwkJcmVnID0gKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwgKG9mZnNldCAmIDB4ZmMpOworCWVsc2UKKwkJcmVnID0gb2Zmc2V0ICYgMHhmYzsKKworCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkgKDB4ODAwMDAwMDAgfCAoYnVzX25vIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgcmVnIHwgY2ZnX3R5cGUpKTsKIAogCS8qCiAJICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCkBAIC03MiwxOCArODEsMzMgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKIAl1OCBjZmdfdHlwZSA9IDA7CisJdTMyIGJ1c19ubywgcmVnOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JaWYgKGhvc2UtPnNldF9jZmdfdHlwZSkKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX1NFVF9DRkdfVFlQRSkKIAkJaWYgKGJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKQogCQkJY2ZnX3R5cGUgPSAxOwogCi0JUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsIAkJCQkJIAotCQkgKDB4ODAwMDAwMDAgfCAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCi0JCSAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUpKSk7CisJYnVzX25vID0gKGJ1cy0+bnVtYmVyID09IGhvc2UtPmZpcnN0X2J1c25vKSA/CisJCQlob3NlLT5zZWxmX2J1c25vIDogYnVzLT5udW1iZXI7CisKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcpCisJCXJlZyA9ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8IChvZmZzZXQgJiAweGZjKTsKKwllbHNlCisJCXJlZyA9IG9mZnNldCAmIDB4ZmM7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKGJ1c19ubyA8PCAxNikKKwkJICB8IChkZXZmbiA8PCA4KSB8IHJlZyB8IGNmZ190eXBlKSk7CisKKwkvKiBzdXJwcmVzcyBzZXR0aW5nIG9mIFBDSV9QUklNQVJZX0JVUyAqLworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVMpCisJCWlmICgob2Zmc2V0ID09IFBDSV9QUklNQVJZX0JVUykgJiYKKwkJCShidXMtPm51bWJlciA9PSBob3NlLT5maXJzdF9idXNubykpCisJCXZhbCAmPSAweGZmZmZmZjAwOwogCiAJLyoKIAkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKaW5kZXggYWZhMmVlNi4uOWZlMDBlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKQEAgLTQsOSArNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi1leHRlcm4gc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1wYzh4eF9waWM7Ci0KIGludCBtcGM4eHhfcGljX2luaXQodm9pZCk7CiB1bnNpZ25lZCBpbnQgbXBjOHh4X2dldF9pcnEodm9pZCk7CiAKKy8qCisgKiBTb21lIGludGVybmFsIGludGVycnVwdCByZWdpc3RlcnMgdXNlIGFuIDgtYml0IG1hc2sgZm9yIHRoZSBpbnRlcnJ1cHQKKyAqIGxldmVsIGluc3RlYWQgb2YgYSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludCBta19pbnRfaW50X21hc2sodWludCBtYXNrKQoreworCXJldHVybiAoMSA8PCAoNyAtIChtYXNrLzIpKSk7Cit9CisKICNlbmRpZiAvKiBfUFBDX0tFUk5FTF9QUEM4eHhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCmluZGV4IDRiMGE5YzguLmI2MThmYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtNDIwLDMgKzQyMSwzMCBAQAogCXJldHVybiBlcnI7CiB9CiBhcmNoX2luaXRjYWxsKG12NjR4NjBfZGV2aWNlX3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9hZGRfbXBzY19jb25zb2xlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJY29uc3QgY2hhciAqcHJvcDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwlpZiAocHJvcCA9PSBOVUxMKQorCQlnb3RvIG5vdF9tcHNjOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChwcm9wKTsKKwlpZiAoIW5wKQorCQlnb3RvIG5vdF9tcHNjOworCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgIm1hcnZlbGwsbXBzYyIpKQorCQlnb3RvIG5vdF9tcHNjOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJsb2NrLWluZGV4IiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIG5vdF9tcHNjOworCisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlNTSIsICooaW50ICopcHJvcCwgTlVMTCk7CisKK25vdF9tcHNjOgorCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChtdjY0eDYwX2FkZF9tcHNjX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCmluZGV4IGI1YWVmNGMuLjQ1ZGI4NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKQEAgLTEzNywxOCArMTM3LDE1IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKLQogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAogCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgNCk7Ci0JaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOworCWhvc2UtPnNlbGZfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAogCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1WNjR4NjAgUENJIGhvc3QgYnJpZGdlIGF0IDB4JTAxNmxseC4gIgogCSAgICAgICAiRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwppbmRleCBhYzEyYTQ0Li5mOTcwZTU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDAsNiArNDEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19zZXRfcWVfbXV4X21paV9tbmcpOwogCiBpbnQgdWNjX3NldF90eXBlKGludCB1Y2NfbnVtLCBzdHJ1Y3QgdWNjX2NvbW1vbiAqcmVncywKIAkJIGVudW0gdWNjX3NwZWVkX3R5cGUgc3BlZWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwppbmRleCA5MTQzMjM2Li4zZGYyMDJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgpAQCAtNzAsNiArNzEsNyBAQAogCXByaW50ayhLRVJOX0lORk8gImd1ZW1yIDogYWRkciAtIDB4JTA4eCwgdmFsIC0gMHglMDJ4IiwKIAkJICAodTMyKSAmIHVjY2YtPnVmX3JlZ3MtPmd1ZW1yLCB1Y2NmLT51Zl9yZWdzLT5ndWVtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2R1bXBfcmVncyk7CiAKIHUzMiB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2soaW50IHVjY2ZfbnVtKQogewpAQCAtODUsMTEgKzg3LDEzIEBACiAJZGVmYXVsdDogcmV0dXJuIFFFX0NSX1NVQkJMT0NLX0lOVkFMSUQ7CiAJfQogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2spOwogCiB2b2lkIHVjY19mYXN0X3RyYW5zbWl0X29uX2RlbWFuZChzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CiAJb3V0X2JlMTYoJnVjY2YtPnVmX3JlZ3MtPnV0b2RyLCBVQ0NfRkFTVF9UT0QpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF90cmFuc21pdF9vbl9kZW1hbmQpOwogCiB2b2lkIHVjY19mYXN0X2VuYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTExMCw2ICsxMTQsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2VuYWJsZSk7CiAKIHZvaWQgdWNjX2Zhc3RfZGlzYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTEzMCw2ICsxMzUsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2Rpc2FibGUpOwogCiBpbnQgdWNjX2Zhc3RfaW5pdChzdHJ1Y3QgdWNjX2Zhc3RfaW5mbyAqIHVmX2luZm8sIHN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICoqIHVjY2ZfcmV0KQogewpAQCAtMzQxLDYgKzM0Nyw3IEBACiAJKnVjY2ZfcmV0ID0gdWNjZjsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodWNjX2Zhc3RfaW5pdCk7CiAKIHZvaWQgdWNjX2Zhc3RfZnJlZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CkBAIC0zNTUsMyArMzYyLDQgQEAKIAogCWtmcmVlKHVjY2YpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9mcmVlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc2MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9ydGNfY21vc19zZXR1cC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBTZXR1cCBjb2RlIGZvciBQQy1zdHlsZSBSZWFsLVRpbWUgQ2xvY2suCisgKgorICogQXV0aG9yOiBXYWRlIEZhcm5zd29ydGggPHdmYXJuc3dvcnRoQG12aXN0YS5jb20+CisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCitzdGF0aWMgaW50ICBfX2luaXQgYWRkX3J0Yyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGQ7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0OworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicG5wUE5QLGIwMCIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFJUQ19QT1JUKHgpIGlzIGhhcmRjb2RlZCBpbiBhc20vbWMxNDY4MThydGMuaC4gIFZlcmlmeSB0aGF0IHRoZQorCSAqIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGRldmljZSBub2RlIG1hdGNoZXMuCisJICovCisJaWYgKHJlcy5zdGFydCAhPSBSVENfUE9SVCgwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Y19jbW9zIiwgLTEsCisJCQkJCSAgICAgJnJlcywgMSk7CisJaWYgKElTX0VSUihwZCkpCisJCXJldHVybiBQVFJfRVJSKHBkKTsKKworCXJldHVybiAwOworfQorZnNfaW5pdGNhbGwoYWRkX3J0Yyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMKaW5kZXggNGEwMTc0OC4uZTgxZTdlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90aW1lci5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdGltZXIuYwpAQCAtMjQsNyArMjQsMTIgQEAKIAogCS8qIGdldCBjdXJyZW50IFJUQyB0aW1lIGFuZCBjb252ZXJ0IHRvIHNlY29uZHMgKi8KIAlnZXRfcnRjX3RpbWUoJmN1cl9ydGNfdG0pOwotCXJ0Y190bV90b190aW1lKCZjdXJfcnRjX3RtLCAmY3VyX3J0Y190aW1lKTsKKwljdXJfcnRjX3RpbWUgPSBta3RpbWUoY3VyX3J0Y190bS50bV95ZWFyICsgMTkwMCwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbW9uICsgMSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWRheSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1faG91ciwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWluLAorCQkJICAgICAgY3VyX3J0Y190bS50bV9zZWMpOwogCiAJZGlmZiA9IGN1cl9ydGNfdGltZSAtIHN1c3BlbmRfcnRjX3RpbWU7CiAKQEAgLTQ0LDcgKzQ5LDEyIEBACiAJV0FSTl9PTighcHBjX21kLmdldF9ydGNfdGltZSk7CiAKIAlnZXRfcnRjX3RpbWUoJnN1c3BlbmRfcnRjX3RtKTsKLQlydGNfdG1fdG9fdGltZSgmc3VzcGVuZF9ydGNfdG0sICZzdXNwZW5kX3J0Y190aW1lKTsKKwlzdXNwZW5kX3J0Y190aW1lID0gbWt0aW1lKHN1c3BlbmRfcnRjX3RtLnRtX3llYXIgKyAxOTAwLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbW9uICsgMSwKKwkJCQkgIHN1c3BlbmRfcnRjX3RtLnRtX21kYXksCisJCQkJICBzdXNwZW5kX3J0Y190bS50bV9ob3VyLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbWluLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fc2VjKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCA3ZDNiMDliLi5hMTEzZDgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtNzIsMTIgKzcyLDExIEBACiAJaW50IHJldDsKIAogCWZvciAobnAgPSBOVUxMLCBpID0gMDsKLQkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2ktZXRoZXJuZXQiKSkgIT0gTlVMTDsKKwkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2kxMDgtZXRoZXJuZXQiKSkgIT0gTlVMTDsKIAkgICAgIGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgclsyXTsKLQkJc3RydWN0IGRldmljZV9ub2RlICpwaHk7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5LCAqbWRpbzsKIAkJaHdfaW5mbyB0c2lfZXRoX2RhdGE7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCAqaWQ7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqcGh5X2lkOwogCQljb25zdCB2b2lkICptYWNfYWRkcjsKIAkJY29uc3QgcGhhbmRsZSAqcGg7CkBAIC0xMTEsNiArMTEwLDEzIEBACiAJCWlmIChtYWNfYWRkcikKIAkJCW1lbWNweSh0c2lfZXRoX2RhdGEubWFjX2FkZHIsIG1hY19hZGRyLCA2KTsKIAorCQlwaCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1kaW8taGFuZGxlIiwgTlVMTCk7CisJCW1kaW8gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG1kaW8sIDAsICZyZXMpOworCQlvZl9ub2RlX3B1dChtZGlvKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5yZWc7CisKIAkJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CiAJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CiAKQEAgLTExOSwyMCArMTI1LDI1IEBACiAJCQlnb3RvIHVucmVnOwogCQl9CiAKLQkJaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7Ci0JCXBoeV9pZCA9IG9mX2dldF9wcm9wZXJ0eShwaHksICJwaHktaWQiLCBOVUxMKTsKLQkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShwaHksIDAsICZyZXMpOwotCQlpZiAocmV0KSB7Ci0JCQlvZl9ub2RlX3B1dChwaHkpOwotCQkJZ290byB1bnJlZzsKLQkJfQorCQlwaHlfaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisKIAkJdHNpX2V0aF9kYXRhLnJlZ3MgPSByWzBdLnN0YXJ0OwogCQl0c2lfZXRoX2RhdGEucGh5cmVncyA9IHJlcy5zdGFydDsKIAkJdHNpX2V0aF9kYXRhLnBoeSA9ICpwaHlfaWQ7CiAJCXRzaV9ldGhfZGF0YS5pcnFfbnVtID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGh5LCAiYmNtNTR4eCIpKQorCisJCS8qIFNvbWUgYm9hcmRzIHdpdGggdGhlIFRTSTEwOCBicmlkZ2UgKGUuZy4gSG9sbHkpCisJCSAqIGhhdmUgYSBtaXN3aXJpbmcgb2YgdGhlIGV0aGVybmV0IFBIWXMgd2hpY2gKKwkJICogcmVxdWlyZXMgYSB3b3JrYXJvdW5kLiAgVGhlIHNwZWNpYWwKKwkJICogInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIgcHJvcGVydHkgZW5hYmxlcyB0aGlzCisJCSAqIHdvcmthcm91bmQuICBGSVhNRTogTmVlZCB0byBwb3J0IHRoZSB0c2kxMDhfZXRoCisJCSAqIGRyaXZlciBpdHNlbGYgdG8gcGh5bGliIGFuZCB1c2UgYSBub24tbWlzbGVhZGluZworCQkgKiBuYW1lIGZvciB0aGUgd29ya2Fyb3VuZCBmbGFnIC0gaXQncyBub3QgYWN0dWFsbHkgdG8KKwkJICogZG8gd2l0aCB0aGUgbW9kZWwgb2YgUEhZIGluIHVzZSAqLworCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBoeSwgInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIsIE5VTEwpKQogCQkJdHNpX2V0aF9kYXRhLnBoeV90eXBlID0gVFNJMTA4X1BIWV9CQ001NFhYOwogCQlvZl9ub2RlX3B1dChwaHkpOworCiAJCXJldCA9CiAJCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEodHNpX2V0aF9kZXYsICZ0c2lfZXRoX2RhdGEsCiAJCQkJCSAgICAgc2l6ZW9mKGh3X2luZm8pKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKaW5kZXggMjE1MzE2My4uOTBkYjhhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKQEAgLTY0LDkgKzY0LDEwIEBACiAJCQkgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgdmFsKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNmZ19hZGRyOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2ZnVuYykpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmdW5jKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTE0OSwxMCArMTUwLDExIEBACiAJCQkgIGludCBsZW4sIHUzMiAqIHZhbCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfYWRkcjsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdTMyIHRlbXA7CiAKIAlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoaG9zZSwgYnVzLT5udW1iZXIsIGRldmZuKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTIxOSwxNCArMjIxLDEyIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAogCWlmICghaG9zZSkgewogCQlwcmludGsoIlBDSSBIb3N0IGJyaWRnZSBpbml0IGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwppbmRleCAyOGZkZjRmLi42NjllNjU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCkBAIC0yNjM0LDcgKzI2MzQsNyBAQAogX19pbml0Y2FsbChzZXR1cF94bW9uX3N5c3JxKTsKICNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KIAotaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CiAKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3htb24oY2hhciAqcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCmluZGV4IGQzMTlmOWIuLjBkYTU1MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKKysrIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwpAQCAtMzI4LDcgKzMyOCw3IEBACiAJbXRzcHIgICBTUFJOX0wxQ1NSMCxyMwogCWlzeW5jCiAJYmxyCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCiAJbWZzcHIJcjMsU1BSTl9MMUNTUjEKIAlvcmkJcjMscjMsTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSCiAJbXRzcHIJU1BSTl9MMUNTUjEscjMKQEAgLTM1NSw3ICszNTUsNyBAQAogX0dMT0JBTChfX2ZsdXNoX2ljYWNoZV9yYW5nZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKIAlhbmRjCXIzLHIzLHI1CiAJc3ViZglyNCxyMyxyNApAQCAtNDcyLDcgKzQ3Miw3IEBACiBfR0xPQkFMKF9fZmx1c2hfZGNhY2hlX2ljYWNoZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkKIAlybHdpbm0JcjMscjMsMCwwLDE5CQkJLyogR2V0IHBhZ2UgYmFzZSBhZGRyZXNzICovCiAJbGkJcjQsNDA5Ni9MMV9DQUNIRV9CWVRFUwkvKiBOdW1iZXIgb2YgbGluZXMgaW4gYSBwYWdlICovCiAJbXRjdHIJcjQKQEAgLTUwMCw3ICs1MDAsNyBAQAogX0dMT0JBTChfX2ZsdXNoX2RjYWNoZV9pY2FjaGVfcGh5cykKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkKIAltZm1zcglyMTAKIAlybHdpbm0JcjAscjEwLDAsMjgsMjYJCQkvKiBjbGVhciBEUiAqLwogCW10bXNyCXIwCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggYTQxNjUyMC4uNjNmMGE5OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNjQsNyArNjQsNiBAQAogCiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2VzKTsKIEVYUE9SVF9TWU1CT0woY2xlYXJfdXNlcl9wYWdlKTsKLUVYUE9SVF9TWU1CT0woZG9fc2lnbmFsKTsKIEVYUE9SVF9TWU1CT0wodHJhbnNmZXJfdG9faGFuZGxlcik7CiBFWFBPUlRfU1lNQk9MKGRvX0lSUSk7CiBFWFBPUlRfU1lNQk9MKG1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKaW5kZXggYzc5NzA0Zi4uOTY3YzFlZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKQEAgLTUyNiw3ICs1MjYsNyBAQAogCSAqIFN5c3RlbXMgd2l0aCBPRiBjYW4gbG9vayBpbiB0aGUgcHJvcGVydGllcyBvbiB0aGUgY3B1IG5vZGUocykKIAkgKiBmb3IgYSBwb3NzaWJseSBtb3JlIGFjY3VyYXRlIHZhbHVlLgogCSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkpIHsKKwlpZiAoISBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKSkgewogCQlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKIAkJaWNhY2hlX2JzaXplID0gY3VyX2NwdV9zcGVjLT5pY2FjaGVfYnNpemU7CiAJCXVjYWNoZV9ic2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCmluZGV4IGFlYTEwMGIuLjNmM2IyOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCkBAIC05Miw2ICs5Miw3IEBACiAJaWYgKG5sKQogCQlwcmludGsoIlxuIik7CiAJc2hvd19yZWdzKGZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAkvKiBkb19leGl0KCkgc2hvdWxkIHRha2UgY2FyZSBvZiBwYW5pYydpbmcgZnJvbSBhbiBpbnRlcnJ1cHQKIAkgKiBjb250ZXh0IHNvIHdlIGRvbid0IGhhbmRsZSBpdCBoZXJlCkBAIC02MTksNyArNjIwLDcgQEAKIAkJCXJldHVybjsKIAogCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfUFIpICYmICAvKiBub3QgdXNlci1tb2RlICovCi0JCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCkgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CisJCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCwgcmVncykgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5uaXAgKz0gNDsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbW0vdGxiLmMgYi9hcmNoL3BwYy9tbS90bGIuYwppbmRleCBmYTI5NzQwLi40ZmYyNjBiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS90bGIuYworKysgYi9hcmNoL3BwYy9tbS90bGIuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYwppbmRleCA2ZjIxMTEwLi4zYzU2NjU0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMKQEAgLTY5LDkgKzY5LDYgQEAKIAogVE9EQ19BTExPQygpOwogCi11bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXY7Ci11bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXZNYWosIHVjQm9hcmRSZXZNaW47Ci0KIGV4dGVybiB1bnNpZ25lZCBjaGFyIHByZXBfbnZyYW1fcmVhZF92YWwoaW50IGFkZHIpOwogZXh0ZXJuIHZvaWQgcHJlcF9udnJhbV93cml0ZV92YWwoaW50IGFkZHIsCiAJCQkJIHVuc2lnbmVkIGNoYXIgdmFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZSBiL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQppbmRleCA5NTY5NDE1Li41NDM3OTViIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogCiB3ZHQtbXBjOHh4LSQoQ09ORklHXzh4eF9XRFQpCSs9IG04eHhfd2R0Lm8KIAorb2JqLSQoQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kpCSs9IGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfUFBDQlVHX05WUkFNKQkrPSBwcmVwX252cmFtLm8KIG9iai0kKENPTkZJR19QUENfT0NQKQkJKz0gb2NwLm8KIG9iai0kKENPTkZJR19JQk1fT0NQKQkJKz0gaWJtX29jcC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiMzIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIGluZGlyZWN0IFBDSSBicmlkZ2VzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBHYWJyaWVsIFBhdWJlcnQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKworI2lmZGVmIENPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFCisjZGVmaW5lIFBDSV9DRkdfT1VUIG91dF9iZTMyCisjZWxzZQorI2RlZmluZSBQQ0lfQ0ZHX09VVCBvdXRfbGUzMgorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2luZGlyZWN0X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICBpbnQgbGVuLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbCA9IGluXzgoY2ZnX2RhdGEpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWwgPSBpbl9sZTE2KGNmZ19kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnZhbCA9IGluX2xlMzIoY2ZnX2RhdGEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludAoraW5kaXJlY3Rfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICAgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJb3V0XzgoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0X2xlMTYoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW91dF9sZTMyKGNmZ19kYXRhLCB2YWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGluZGlyZWN0X3BjaV9vcHMgPQoreworCWluZGlyZWN0X3JlYWRfY29uZmlnLAorCWluZGlyZWN0X3dyaXRlX2NvbmZpZworfTsKKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHZvaWQgX19pb21lbSAqIGNmZ19hZGRyLAorCXZvaWQgX19pb21lbSAqIGNmZ19kYXRhKQoreworCWhvc2UtPmNmZ19hZGRyID0gY2ZnX2FkZHI7CisJaG9zZS0+Y2ZnX2RhdGEgPSBjZmdfZGF0YTsKKwlob3NlLT5vcHMgPSAmaW5kaXJlY3RfcGNpX29wczsKK30KKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOworCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKKworCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOworCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOworCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCisJCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKKwlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKKwlzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoaG9zZSwgYWRkciwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuYyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCmluZGV4IDE2NTQ2NzguLmFjZTRlYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCkBAIC03MSw2ICs3MSwyMSBAQAogCX0sIFwKIH0KIAorLyoKKyAqIE1MMzAwL01MNDAzIFZpZGVvIERldmljZTogc2hvcnRjdXQgbWFjcm8gZm9yIHNpbmdsZSBpbnN0YW5jZQorICovCisjZGVmaW5lIFhQQVJfVEZUKG51bSkgeyBcCisJLm5hbWUgPSAieGlsaW54ZmIiLCBcCisJLmlkID0gbnVtLCBcCisJLm51bV9yZXNvdXJjZXMgPSAxLCBcCisJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7IFwKKwkJeyBcCisJCQkuc3RhcnQgPSBYUEFSX1RGVF8jI251bSMjX0JBU0VBRERSLCBcCisJCQkuZW5kID0gWFBBUl9URlRfIyNudW0jI19CQVNFQUREUis3LCBcCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lPLCBcCisJCX0sIFwKKwl9LCBcCit9CiAKIC8qIFVBUlQgODI1MCBkcml2ZXIgcGxhdGZvcm0gZGF0YSB0YWJsZSAqLwogc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHZpcnRleF9zZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewpAQCAtMTQ2LDIwICsxNjEsMTcgQEAKIAlYUEFSX1NZU0FDRSgxKSwKICNlbmRpZgogCi0JLyogTUwzMDAvNDAzIHJlZmVyZW5jZSBkZXNpZ24gZnJhbWVidWZmZXIgKi8KICNpZiBkZWZpbmVkKFhQQVJfVEZUXzBfQkFTRUFERFIpCi0JewotCQkubmFtZQkJPSAieGlsaW54ZmIiLAotCQkuaWQJCT0gMCwKLQkJLm51bV9yZXNvdXJjZXMJPSAxLAotCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKLQkJCXsKLQkJCQkuc3RhcnQJPSBYUEFSX1RGVF8wX0JBU0VBRERSLAotCQkJCS5lbmQJPSBYUEFSX1RGVF8wX0JBU0VBRERSKzcsCi0JCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKLQkJCX0sCi0JCX0sCi0JfSwKKwlYUEFSX1RGVCgwKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMV9CQVNFQUREUikKKwlYUEFSX1RGVCgxKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMl9CQVNFQUREUikKKwlYUEFSX1RGVCgyKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfM19CQVNFQUREUikKKwlYUEFSX1RGVCgzKSwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmggYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAppbmRleCAzZDRiZTE0Li45ZjM4ZDkyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAorKysgYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaApAQCAtMzEsNCArMzEsMTEgQEAKICAqLwogaW50IHZpcnRleF9kZXZpY2VfZml4dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKIAorLyogU1BJIENvbnRyb2xsZXIgSVAgKi8KK3N0cnVjdCB4c3BpX3BsYXRmb3JtX2RhdGEgeworCXMxNiBidXNfbnVtOworCXUxNiBudW1fY2hpcHNlbGVjdDsKKwl1MzIgc3BlZWRfaHo7Cit9OworCiAjZW5kaWYgIC8qIF9fQVNNX1ZJUlRFWF9ERVZJQ0VTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmE4ZjA4Ny4uZjQ1MDNjYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC0yOTQsNyArMjk0LDYgQEAKIHN0YXRpYyBpbnQKIGRvX3B0cmFjZV9ub3JtYWwoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlwdHJhY2VfYXJlYSBwYXJlYTsgCiAJaW50IGNvcGllZCwgcmV0OwogCkBAIC0zMDQsMTAgKzMwMyw3IEBACiAJCS8qIFJlbW92ZSBoaWdoIG9yZGVyIGJpdCBmcm9tIGFkZHJlc3MgKG9ubHkgZm9yIDMxIGJpdCkuICovCiAJCWFkZHIgJj0gUFNXX0FERFJfSU5TTjsKIAkJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSBfX3VzZXIgKikgZGF0YSk7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgogCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KQEAgLTMxOCwxMCArMzE0LDcgQEAKIAkJLyogUmVtb3ZlIGhpZ2ggb3JkZXIgYml0IGZyb20gYWRkcmVzcyAob25seSBmb3IgMzEgYml0KS4gKi8KIAkJYWRkciAmPSBQU1dfQUREUl9JTlNOOwogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwxKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YoZGF0YSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCBlZTkxODZmLi44ZWM5ZGVmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC0yNjIsNiArMjYyLDcgQEAKIAlwcmludF9tb2R1bGVzKCk7CiAJc2hvd19yZWdzKHJlZ3MpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMxOSw3ICszMjAsNyBAQAogCQllbHNlIHsKIAkJCWVudW0gYnVnX3RyYXBfdHlwZSBidHQ7CiAKLQkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKKwkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOLCByZWdzKTsKIAkJCWlmIChidHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKQogCQkJCXJldHVybjsKIAkJCWRpZShzdHIsIHJlZ3MsIGludGVycnVwdGlvbl9jb2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCAwMzgxNzllLi5kOGVkNjY3IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC01NSw4ICs1NSwyMSBAQAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlkZWZfYm9vbCBuCiAKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUE0KKwlib29sCisKIGNvbmZpZyBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgogCWJvb2wKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BNCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfU01QCisJYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX05VTUEKKwlib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUENJCisJYm9vbAogCiBjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAlib29sCkBAIC04MSwyNTcgKzk0LDggQEAKIAogbWVudSAiU3lzdGVtIHR5cGUiCiAKLWNvbmZpZyBTT0xVVElPTl9FTkdJTkUKLQlib29sCi0KLWNob2ljZQotCXByb21wdCAiU3VwZXJIIHN5c3RlbSB0eXBlIgotCWRlZmF1bHQgU0hfVU5LTk9XTgotCi1jb25maWcgU0hfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmUiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCWhlbHAKLQkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQotCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzIyX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzcyMiIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcyMgotCWhlbHAKLQkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MQotCWhlbHAKLQkgIFNlbGVjdCA3NzUxIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzUxCi0JICBldmFsdWF0aW9uIGJvYXJkLgotCSAgCi1jb25maWcgU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTc3ODAiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3ODAKLQloZWxwCi0JICBTZWxlY3QgNzc4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFNINzc4MAotCSAgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzczMDBfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3MzAwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzAwCi0JaGVscAotCSAgU2VsZWN0IDczMDAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQotCSAgU0g3MzAwKFNILU1vYmlsZSBWKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzM0M19TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTczNDMiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczNDMKLQloZWxwCi0JICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKLSAgICAgICBib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzE4MAotCWhlbHAKLQkgIFNlbGVjdCA3MzE4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczMTgwKFNILU1vYmlsZSAzKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzc1MV9TWVNURU1ICi0JYm9vbCAiU3lzdGVtSDc3NTFSIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFN5c3RlbUggaWYgeW91IGFyZSBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFN5c3RlbUgKLQkgIDc3NTFSIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF9IUDZYWAotCWJvb2wgIkhQNlhYIgotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgotCWhlbHAKLQkgIFNlbGVjdCBIUDZYWCBpZiBjb25maWd1cmluZyBmb3IgYSBIUCBqb3JuYWRhIEhQNnh4LgotCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKLQkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhLz4uCi0KLWNvbmZpZyBTSF9TQVRVUk4KLQlib29sICJTYXR1cm4iCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzYwNAotCWhlbHAKLQkgIFNlbGVjdCBTYXR1cm4gaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBTYXR1cm4uCi0KLWNvbmZpZyBTSF9EUkVBTUNBU1QKLQlib29sICJEcmVhbWNhc3QiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzA5MQotCWhlbHAKLQkgIFNlbGVjdCBEcmVhbWNhc3QgaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBEcmVhbWNhc3QuCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0Ci0JICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKLQkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KLQotY29uZmlnIFNIX01QQzEyMTEKLQlib29sICJJbnRlcmZhY2UgTVBDMTIxMSIKLQloZWxwCi0JICBDVFAvUENJLVNIMDIgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKLQkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KLQkgIE1vcmUgaW5mb3JtYXRpb24gYXQgPGh0dHA6Ly93d3cuaW50ZXJmYWNlLmNvLmpwPgotCi1jb25maWcgU0hfU0gwMwotCWJvb2wgIkludGVyZmFjZSBDVFAvUENJLVNIMDMiCi0JaGVscAotCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCi0JICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KLQotY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCi0JYm9vbCAiU2VjdXJlRWRnZTU0MTAiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCi0JICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCi0JICBTTUUgcHJvZHVjdCBsaW5lLgotCi1jb25maWcgU0hfSFM3NzUxUlZPSVAKLQlib29sICJIUzc3NTFSVk9JUCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIFNlbGVjdCBIUzc3NTFSVk9JUCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKLQkgIFNhbGVzIFZvSVAgYm9hcmQuCi0KLWNvbmZpZyBTSF83NzEwVk9JUEdXCi0JYm9vbCAiU0g3NzEwLVZPSVAtR1ciCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcxMAotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIFNINzcxMCBiYXNlZAotCSAgVk9JUCBHVy4KLQotY29uZmlnIFNIX1JUUzc3NTFSMkQKLQlib29sICJSVFM3NzUxUjJEIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFJUUzc3NTFSMkQgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5Ci0JICBTYWxlcyBTSC1HcmFwaGljcyBib2FyZC4KLQotY29uZmlnIFNIX0hJR0hMQU5ERVIKLQlib29sICJIaWdobGFuZGVyIgotCi1jb25maWcgU0hfRURPU0s3NzA1Ci0JYm9vbCAiRURPU0s3NzA1IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDUKLQotY29uZmlnIFNIX1NINDIwMl9NSUNST0RFVgotCWJvb2wgIlNINC0yMDIgTWljcm9EZXYiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINF8yMDIKLQloZWxwCi0JICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKLQkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCi0KLWNvbmZpZyBTSF9MQU5ESVNLCi0JYm9vbCAiTEFORElTSyIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCi0KLWNvbmZpZyBTSF9USVRBTgotCWJvb2wgIlRJVEFOIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcwotCSAgTmV0RW5naW5lIE5QNTFSLgotCi1jb25maWcgU0hfU0hNSU4KLQlib29sICJTSE1JTiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzA2Ci0JaGVscAotCSAgU2VsZWN0IFNITUlOIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQuCi0KLWNvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JaGVscAotCSAgU2VsZWN0IDcyMDYgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDcyMDYKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NjE5X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzYxOSIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NjE5Ci0JaGVscAotCSAgU2VsZWN0IDc2MTkgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc2MTkKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0JCi1jb25maWcgU0hfTEJPWF9SRTIKLQlib29sICJMLUJPWCBSRTIiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgotCi1jb25maWcgU0hfVU5LTk9XTgotCWJvb2wgIkJhcmVDUFUiCi0JaGVscAotCSAgIkJhcmUgQ1BVIiBha2EgInVua25vd24iIG1lYW5zIGFuIFNILWJhc2VkIHN5c3RlbSB3aGljaCBpcyBub3Qgb25lCi0JICBvZiB0aGUgc3BlY2lmaWMgb25lcyBtZW50aW9uZWQgYWJvdmUsIHdoaWNoIG1lYW5zIHlvdSBuZWVkIHRvIGVudGVyCi0JICBhbGwgc29ydHMgb2Ygc3R1ZmYgbGlrZSBDT05GSUdfTUVNT1JZX1NUQVJUIGJlY2F1c2UgdGhlIGNvbmZpZwotCSAgc3lzdGVtIGRvZXNuJ3QgYWxyZWFkeSBrbm93IHdoYXQgaXQgaXMuICBZb3UgZ2V0IGEgbWFjaGluZSB2ZWN0b3IKLQkgIHdpdGhvdXQgYW55IHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgaW4gaXQsIHNvIHRoaW5ncyBsaWtlIHRoZSBSVEMgbWF5Ci0JICBub3Qgd29yay4KLQotCSAgVGhpcyBvcHRpb24gaXMgZm9yIHRoZSBlYXJseSBzdGFnZXMgb2YgcG9ydGluZyB0byBhIG5ldyBtYWNoaW5lLgotCi1lbmRjaG9pY2UKLQotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWciCi1zb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnIgotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZyIKLQogc291cmNlICJhcmNoL3NoL21tL0tjb25maWciCiAKLWNvbmZpZyBDRl9FTkFCTEVSCi0JYm9vbCAiQ29tcGFjdCBGbGFzaCBFbmFibGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTSF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfVU5LTk9XTiB8fCBTSF9TSDAzCi0JLS0taGVscC0tLQotCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCi0JICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91Ci0JICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KLQkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0Ci0JICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCi0KLQkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKLQkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcwotCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KLQotCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCi0KLWNob2ljZQotCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCi0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCBDRl9BUkVBNgotCi1jb25maWcgQ0ZfQVJFQTUKLQlib29sICJBcmVhNSIKLQloZWxwCi0JICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKLQkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KLQotCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQotCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCi0KLQkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KLQotY29uZmlnIENGX0FSRUE2Ci0JYm9vbCAiQXJlYTYiCi0KLWVuZGNob2ljZQotCi1jb25maWcgQ0ZfQkFTRV9BRERSCi0JaGV4Ci0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKLQlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQotCiBtZW51ICJQcm9jZXNzb3IgZmVhdHVyZXMiCiAKIGNob2ljZQpAQCAtMzUxLDcgKzExNSw3IEBACiAKIGNvbmZpZyBTSF9GUFUKIAlib29sICJGUFUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFDUFVfU0gzCisJZGVwZW5kcyBvbiBDUFVfU0g0CiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIFNIIHByb2Nlc3NvcnMgdGhhdApAQCAtNDM3LDYgKzIwMSwyMDkgQEAKIAogZW5kbWVudQogCittZW51ICJCb2FyZCBzdXBwb3J0IgorCitjb25maWcgU09MVVRJT05fRU5HSU5FCisJYm9vbAorCitjb25maWcgU0hfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmUiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzA5IHx8IENQVV9TVUJUWVBFX1NINzc1MAorCWhlbHAKKwkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQorCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcyMDYKKwloZWxwCisJICBTZWxlY3QgNzIwNiBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzIwNgorCSAgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc2MTlfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NjE5IgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzYxOQorCWhlbHAKKwkgIFNlbGVjdCA3NjE5IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NjE5CisJICBldmFsdWF0aW9uIGJvYXJkLgorCQorY29uZmlnIFNIXzc3MjJfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzIyIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcyMgorCWhlbHAKKwkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEKKwloZWxwCisJICBTZWxlY3QgNzc1MSBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzc1MQorCSAgZXZhbHVhdGlvbiBib2FyZC4KKwkgIAorY29uZmlnIFNIXzc3ODBfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCisJaGVscAorCSAgU2VsZWN0IDc3ODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBTSDc3ODAKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzAwX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzMwMCIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczMDAKKwloZWxwCisJICBTZWxlY3QgNzMwMCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczMDAoU0gtTW9iaWxlIFYpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzQzX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzM0MyIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczNDMKKwloZWxwCisJICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzMxODAKKwloZWxwCisJICBTZWxlY3QgNzMxODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQorCSAgU0g3MzE4MChTSC1Nb2JpbGUgMykgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc3NTFfU1lTVEVNSAorCWJvb2wgIlN5c3RlbUg3NzUxUiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgU3lzdGVtSCBpZiB5b3UgYXJlIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgU3lzdGVtSAorCSAgNzc1MVIgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIX0hQNlhYCisJYm9vbCAiSFA2WFgiCisJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCisJc2VsZWN0IEhENjQ0NlhfU0VSSUVTCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKKwloZWxwCisJICBTZWxlY3QgSFA2WFggaWYgY29uZmlndXJpbmcgZm9yIGEgSFAgam9ybmFkYSBIUDZ4eC4KKwkgIE1vcmUgaW5mb3JtYXRpb24gKGhhcmR3YXJlIG9ubHkpIGF0CisJICA8aHR0cDovL3d3dy5ocC5jb20vam9ybmFkYS8+LgorCitjb25maWcgU0hfRFJFQU1DQVNUCisJYm9vbCAiRHJlYW1jYXN0IgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcwOTEKKwloZWxwCisJICBTZWxlY3QgRHJlYW1jYXN0IGlmIGNvbmZpZ3VyaW5nIGZvciBhIFNFR0EgRHJlYW1jYXN0LgorCSAgTW9yZSBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubTE3bi5vcmcvbGludXgtc2gvZHJlYW1jYXN0Lz4uICBUaGVyZSBpcyBhCisJICBEcmVhbWNhc3QgcHJvamVjdCBpcyBhdCA8aHR0cDovL2xpbnV4ZGMuc291cmNlZm9yZ2UubmV0Lz4uCisKK2NvbmZpZyBTSF9NUEMxMjExCisJYm9vbCAiSW50ZXJmYWNlIE1QQzEyMTEiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEgJiYgQlJPS0VOCisJaGVscAorCSAgQ1RQL1BDSS1TSDAyIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NIMDMKKwlib29sICJJbnRlcmZhY2UgQ1RQL1BDSS1TSDAzIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxICYmIEJST0tFTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCisJYm9vbCAiU2VjdXJlRWRnZTU0MTAiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCisJICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCisJICBTTUUgcHJvZHVjdCBsaW5lLgorCitjb25maWcgU0hfSFM3NzUxUlZPSVAKKwlib29sICJIUzc3NTFSVk9JUCIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgSFM3NzUxUlZPSVAgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5CisJICBTYWxlcyBWb0lQIGJvYXJkLgorCitjb25maWcgU0hfNzcxMFZPSVBHVworCWJvb2wgIlNINzcxMC1WT0lQLUdXIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzEwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGJ1aWxkIGEga2VybmVsIGZvciB0aGUgU0g3NzEwIGJhc2VkCisJICBWT0lQIEdXLgorCitjb25maWcgU0hfUlRTNzc1MVIyRAorCWJvb2wgIlJUUzc3NTFSMkQiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgUlRTNzc1MVIyRCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKKwkgIFNhbGVzIFNILUdyYXBoaWNzIGJvYXJkLgorCitjb25maWcgU0hfSElHSExBTkRFUgorCWJvb2wgIkhpZ2hsYW5kZXIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgQ1BVX1NVQlRZUEVfU0g3Nzg1CisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKworY29uZmlnIFNIX0VET1NLNzcwNQorCWJvb2wgIkVET1NLNzcwNSIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNQorCitjb25maWcgU0hfU0g0MjAyX01JQ1JPREVWCisJYm9vbCAiU0g0LTIwMiBNaWNyb0RldiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKKwloZWxwCisJICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKKwkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCisKK2NvbmZpZyBTSF9MQU5ESVNLCisJYm9vbCAiTEFORElTSyIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWhlbHAKKwkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCisKK2NvbmZpZyBTSF9USVRBTgorCWJvb2wgIlRJVEFOIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcworCSAgTmV0RW5naW5lIE5QNTFSLgorCitjb25maWcgU0hfU0hNSU4KKwlib29sICJTSE1JTiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNgorCWhlbHAKKwkgIFNlbGVjdCBTSE1JTiBpZiBjb25maWd1cmluZyBmb3IgdGhlIFNITUlOIGJvYXJkLgorCitjb25maWcgU0hfTEJPWF9SRTIKKwlib29sICJMLUJPWCBSRTIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgorCitlbmRtZW51CisKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9LY29uZmlnIgorc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWciCisKIG1lbnUgIlRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uIgogCiBjb25maWcgU0hfVE1VCkBAIC00NzMsMTMgKzQ0MCwxMyBAQAogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKIAlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MzE4MCB8fCBDUFVfU1VCVFlQRV9TSDczNDMKIAlkZWZhdWx0ICIzMTI1MDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAiMzIwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzcyMgogCWRlZmF1bHQgIjMzMzMzMzMzIiBpZiBDUFVfU1VCVFlQRV9TSDczMDAgfHwgQ1BVX1NVQlRZUEVfU0g3NzcwIHx8IFwKIAkJCSAgICAgIENQVV9TVUJUWVBFX1NINzc2MCB8fCBDUFVfU1VCVFlQRV9TSDc3MDUgfHwgXAogCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JZGVmYXVsdCAiNTAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MCB8fCBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgXAotCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3Nzg1Ci0JZGVmYXVsdCAiNjAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MQorCWRlZmF1bHQgIjYwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTEgfHwgQ1BVX1NVQlRZUEVfU0g3NzUxUgogCWRlZmF1bHQgIjY2MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDRfMjAyCisJZGVmYXVsdCAiNTAwMDAwMDAiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeS4KIAkgIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkZXRlcm1pbmluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIHZhbHVlIG9uCkBAIC00ODcsOCArNDU0LDEwIEBACiAKIGNvbmZpZyBTSF9DTEtfTUQKIAlpbnQgIkNQVSBNb2RlIFBpbiBTZXR0aW5nIgotCWRlZmF1bHQgMAogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NjE5IHx8IENQVV9TVUJUWVBFX1NINzIwNgorCWRlZmF1bHQgNiBpZiBDUFVfU1VCVFlQRV9TSDcyMDYKKwlkZWZhdWx0IDUgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAwCiAJaGVscAogCSAgTUQyIC0gTUQwIHBpbiBzZXR0aW5nLgogCkBAIC01NjAsNiArNTI5LDcgQEAKIAogY29uZmlnIFNNUAogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfU01QCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKIAkgIGEgc3lzdGVtIHdpdGggb25seSBvbmUgQ1BVLCBsaWtlIG1vc3QgcGVyc29uYWwgY29tcHV0ZXJzLCBzYXkgTi4gSWYKQEAgLTU4NCw2ICs1NTQsNyBAQAogCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0zMikiCiAJcmFuZ2UgMiAzMgogCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAiNCIgaWYgQ1BVX1NIWDMKIAlkZWZhdWx0ICIyIgogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHdoaWNoIHRoaXMKQEAgLTYyMyw2ICs1OTQsNyBAQAogCiBjb25maWcgVUJDX1dBS0VVUAogCWJvb2wgIldha2V1cCBVQkMgb24gc3RhcnR1cCIKKwlkZXBlbmRzIG9uIENQVV9TSDQKIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCB3YWtldXAgdGhlIFVzZXIgQnJlYWsgQ29udHJvbGxlciAoVUJDKSBvbgogCSAgc3RhcnR1cC4gQWx0aG91Z2ggdGhlIFVCQyBpcyBsZWZ0IGluIGFuIGF3YWtlIHN0YXRlIHdoZW4gdGhlIHByb2Nlc3NvcgpAQCAtNjUxLDggKzYyMyw4IEBACiAjIHdlJ3JlIG5vdCB1c2luZyBQQ01DSUEsIHNvIHdlIG1ha2UgaXQgZGVwZW5kZW50IG9uCiAjIFBDTUNJQSBvdXRyaWdodC4gLS0gUEZNLgogY29uZmlnIElTQQotCWJvb2wKLQlkZWZhdWx0IHkgaWYgUENNQ0lBCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gUENNQ0lBICYmIEhENjQ0NlhfU0VSSUVTCiAJaGVscAogCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBJU0Egc2xvdHMgb24geW91ciBtb3RoZXJib2FyZC4gIElTQSBpcyB0aGUKIAkgIG5hbWUgb2YgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYKQEAgLTY5MCw2ICs2NjIsNDkgQEAKIAl0cmlzdGF0ZSAiU3VwZXJIeXdheSBCdXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKIAorY29uZmlnIENGX0VOQUJMRVIKKwlib29sICJDb21wYWN0IEZsYXNoIEVuYWJsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPTFVUSU9OX0VOR0lORSB8fCBTSF9TSDAzCisJLS0taGVscC0tLQorCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCisJICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91CisJICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKwkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCisKKwkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKKwkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcworCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KKworCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCisKK2Nob2ljZQorCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCBDRl9BUkVBNgorCitjb25maWcgQ0ZfQVJFQTUKKwlib29sICJBcmVhNSIKKwloZWxwCisJICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKKwkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KKworCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQorCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCisKKwkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KKworY29uZmlnIENGX0FSRUE2CisJYm9vbCAiQXJlYTYiCisKK2VuZGNob2ljZQorCitjb25maWcgQ0ZfQkFTRV9BRERSCisJaGV4CisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKKwlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQorCiBzb3VyY2UgImFyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgpAQCAtNzA3LDcgKzcyMiw3IEBACiBlbmRtZW51CiAKIG1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKSIKLWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCitkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTWVNfU1VQUE9SVFNfUE0KIAogc291cmNlIGtlcm5lbC9wb3dlci9LY29uZmlnCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZwppbmRleCBiNTYzMDcyLi41MmY2YTk5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9zaC9LY29uZmlnLmRlYnVnCkBAIC01Miw2ICs1MiwxMCBAQAogCSAgc2VsZWN0IGJvdGggdGhlIEVBUkxZX1NDSUZfQ09OU09MRSBhbmQgU0hfU1RBTkRBUkRfQklPUywgdXNpbmcKIAkgIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0b2dnbGUgYmFjayBhbmQgZm9ydGguCiAKK2NvbmZpZyBERUJVR19CT09UTUVNCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlib29sICJEZWJ1ZyBCT09UTUVNIGluaXRpYWxpemF0aW9uIgorCiBjb25maWcgREVCVUdfU1RBQ0tPVkVSRkxPVwogCWJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTgyLDYgKzg2LDcgQEAKIAlib29sICJJbmNsdWRlIEtHREIga2VybmVsIGRlYnVnZ2VyIgogCXNlbGVjdCBGUkFNRV9QT0lOVEVSCiAJc2VsZWN0IERFQlVHX0lORk8KKwlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINAogCWhlbHAKIAkgIEluY2x1ZGUgaW4ta2VybmVsIGhvb2tzIGZvciBrZ2RiLCB0aGUgTGludXgga2VybmVsIHNvdXJjZSBsZXZlbAogCSAgZGVidWdnZXIuICBTZWUgPGh0dHA6Ly9rZ2RiLnNvdXJjZWZvcmdlLm5ldC8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggODgzYjAzYi4uNzdmZWNjNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0zNCwyMCArMzQsMjAgQEAKIGVuZGlmCiBlbmRpZgogCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NIMikJCTo9IC1tMgotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJOj0gLW0yYSAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAtbTMKLWNmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gLW00IFwKK2NmbGFncy0kKENPTkZJR19DUFVfU0gyKQkJOj0gJChjYWxsIGNjLW9wdGlvbiwtbTIsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTJhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tMywpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NINCkJCTo9ICQoY2FsbCBjYy1vcHRpb24sLW00LCkgXAogCSQoY2FsbCBjYy1vcHRpb24sLW1uby1pbXBsaWNpdC1mcCwtbTQtbm9mcHUpCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NINEEpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEsKSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDRBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTRhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX0JJR19FTkRJQU4pCQkrPSAtbWIKIGNmbGFncy0kKENPTkZJR19DUFVfTElUVExFX0VORElBTikJKz0gLW1sCiAKIGNmbGFncy15CSs9ICQoY2FsbCBhcy1vcHRpb24sLVdhJChjb21tYSktaXNhPSQoaXNhLXkpLCkgLWZmcmVlc3RhbmRpbmcKIAotY2ZsYWdzLSQoQ09ORklHX1NIX0RTUCkJCQkrPSAtV2EsLWRzcAotCiBjZmxhZ3MtJChDT05GSUdfTU9SRV9DT01QSUxFX09QVElPTlMpCSs9IFwKIAkkKHNoZWxsIGVjaG8gJChDT05GSUdfQ09NUElMRV9PUFRJT05TKSB8IHNlZCAtZSAncy8iLy9nJykKIApAQCAtODcsMzkgKzg3LDM3IEBACiBjb3JlLSQoQ09ORklHX1NIX0ZQVV9FTVUpCSs9IGFyY2gvc2gvbWF0aC1lbXUvCiAKICMgQm9hcmRzCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSkJCTo9IHNlLzc3MHgKLW1hY2hkaXItJChDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3MjIKLW1hY2hkaXItJChDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3NTEKLW1hY2hkaXItJChDT05GSUdfU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3ODAKLW1hY2hkaXItJChDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczMDAKLW1hY2hkaXItJChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczNDMKLW1hY2hkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzE4MAotbWFjaGRpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAotbWFjaGRpci0kKENPTkZJR19TSF9TQVRVUk4pCQkJOj0gc2F0dXJuCi1tYWNoZGlyLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJCQk6PSBkcmVhbWNhc3QKLW1hY2hkaXItJChDT05GSUdfU0hfTVBDMTIxMSkJCQk6PSBtcGMxMjExCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NIMDMpCQkJOj0gc2gwMwotbWFjaGRpci0kKENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCkJCTo9IHNuYXBnZWFyCi1tYWNoZGlyLSQoQ09ORklHX1NIX0hTNzc1MVJWT0lQKQkJOj0gcmVuZXNhcy9oczc3NTFydm9pcAotbWFjaGRpci0kKENPTkZJR19TSF9SVFM3NzUxUjJEKQkJCTo9IHJlbmVzYXMvcnRzNzc1MXIyZAotbWFjaGRpci0kKENPTkZJR19TSF83NzUxX1NZU1RFTUgpCQk6PSByZW5lc2FzL3N5c3RlbWgKLW1hY2hkaXItJChDT05GSUdfU0hfRURPU0s3NzA1KQkJCTo9IHJlbmVzYXMvZWRvc2s3NzA1Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0hJR0hMQU5ERVIpCQkJOj0gcmVuZXNhcy9yNzc4MHJwCi1tYWNoZGlyLSQoQ09ORklHX1NIXzc3MTBWT0lQR1cpCQkJOj0gcmVuZXNhcy9zaDc3MTB2b2lwZ3cKLW1hY2hkaXItJChDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWKQkJOj0gc3VwZXJoL21pY3JvZGV2Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0xBTkRJU0spCQkJOj0gbGFuZGlzawotbWFjaGRpci0kKENPTkZJR19TSF9USVRBTikJCQk6PSB0aXRhbgotbWFjaGRpci0kKENPTkZJR19TSF9TSE1JTikJCQk6PSBzaG1pbgotbWFjaGRpci0kKENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzIwNgotbWFjaGRpci0kKENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzYxOQotbWFjaGRpci0kKENPTkZJR19TSF9MQk9YX1JFMikJCQk6PSBsYm94cmUyCi1tYWNoZGlyLSQoQ09ORklHX1NIX1VOS05PV04pCQkJOj0gdW5rbm93bgorbWFjaGRpci0kKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCQkrPSBzZS83NzB4CittYWNoZGlyLSQoQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzIyCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzUxCittYWNoZGlyLSQoQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzgwCittYWNoZGlyLSQoQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzAwCittYWNoZGlyLSQoQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzQzCittYWNoZGlyLSQoQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSkJKz0gc2UvNzMxODAKK21hY2hkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJKz0gaHA2eHgKK21hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCSs9IGRyZWFtY2FzdAorbWFjaGRpci0kKENPTkZJR19TSF9NUEMxMjExKQkJCSs9IG1wYzEyMTEKK21hY2hkaXItJChDT05GSUdfU0hfU0gwMykJCQkrPSBzaDAzCittYWNoZGlyLSQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQkJKz0gc25hcGdlYXIKK21hY2hkaXItJChDT05GSUdfU0hfSFM3NzUxUlZPSVApCQkrPSByZW5lc2FzL2hzNzc1MXJ2b2lwCittYWNoZGlyLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkJKz0gcmVuZXNhcy9ydHM3NzUxcjJkCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU1lTVEVNSCkJCSs9IHJlbmVzYXMvc3lzdGVtaAorbWFjaGRpci0kKENPTkZJR19TSF9FRE9TSzc3MDUpCQkJKz0gcmVuZXNhcy9lZG9zazc3MDUKK21hY2hkaXItJChDT05GSUdfU0hfSElHSExBTkRFUikJCQkrPSByZW5lc2FzL3I3NzgwcnAKK21hY2hkaXItJChDT05GSUdfU0hfNzcxMFZPSVBHVykJCQkrPSByZW5lc2FzL3NoNzcxMHZvaXBndworbWFjaGRpci0kKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCQkrPSBzdXBlcmgvbWljcm9kZXYKK21hY2hkaXItJChDT05GSUdfU0hfTEFORElTSykJCQkrPSBsYW5kaXNrCittYWNoZGlyLSQoQ09ORklHX1NIX1RJVEFOKQkJCSs9IHRpdGFuCittYWNoZGlyLSQoQ09ORklHX1NIX1NITUlOKQkJCSs9IHNobWluCittYWNoZGlyLSQoQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MjA2CittYWNoZGlyLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NjE5CittYWNoZGlyLSQoQ09ORklHX1NIX0xCT1hfUkUyKQkJCSs9IGxib3hyZTIKIAotaW5jZGlyLXkJCQk6PSAkKG5vdGRpciAkKG1hY2hkaXIteSkpCi1pbmNkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJOj0gaHA2eHgKK2luY2Rpci15CTo9ICQobm90ZGlyICQobWFjaGRpci15KSkKIAogaWZuZXEgKCQobWFjaGRpci15KSwpCi1jb3JlLXkJCQkJKz0gYXJjaC9zaC9ib2FyZHMvJChtYWNoZGlyLXkpLworY29yZS15CSs9ICQoYWRkcHJlZml4IGFyY2gvc2gvYm9hcmRzLywgXAorCSAgICAgJChmaWx0ZXItb3V0IC4sICQocGF0c3Vic3QgJSwlLywkKG1hY2hkaXIteSkpKSkKIGVuZGlmCiAKICMgQ29tcGFuaW9uIGNoaXBzCkBAIC0xNTcsMTkgKzE1NSwzMSBAQAogIwlNb3N0IGJvYXJkcyBoYXZlIHRoZWlyIG93biBtYWNoIGRpcmVjdG9yaWVzLiAgRm9yIHRoZSBvbmVzIHRoYXQKICMJZG9uJ3QsIGp1c3QgcmVmZXJlbmNlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHNvIHRoZSBzZW1hbnRpY3MgYXJlCiAjCWtlcHQgcm91Z2hseSB0aGUgc2FtZS4KKyMKKyMJV2hlbiBtdWx0aXBsZSBib2FyZHMgYXJlIGNvbXBpbGVkIGluIGF0IHRoZSBzYW1lIHRpbWUsIHByZWZlcmVuY2UKKyMJZm9yIHRoZSBtYWNoIGxpbmsgaXMgZ2l2ZW4gdG8gd2hpY2hldmVyIGhhcyBhIGRpcmVjdG9yeSBmb3IgaXRzCisjCWhlYWRlcnMuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBhIHdvcmthcm91bmQgdW50aWwgcGxhdGZvcm1zIHRoYXQKKyMJY2FuIGxpdmUgaW4gdGhlIHNhbWUga2VybmVsIGltYWdlIGJhY2sgYXdheSBmcm9tIHJlbHlpbmcgb24gdGhlCisjCW1hY2ggbGluay4KIAogaW5jbHVkZS9hc20tc2gvLm1hY2g6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvc2gvKi5oKSBcCiAJCSAgICAgIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiBGT1JDRQotCUBlY2hvIC1uICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvbWFjaCAtPiAnCiAJJChRKWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaCBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUvYXNtLXNoOyBmaQotCSQoUSlpZiBbIC1kICQoaW5jZGlyLXByZWZpeCkkKGluY2Rpci15KSBdOyB0aGVuIFwKLQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gvJChpbmNkaXIteSknOyBcCi0JCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQoaW5jZGlyLXkpIFwKKwkkKFEpcm0gLWYgaW5jbHVkZS9hc20tc2gvbWFjaAorCSQoUSlmb3IgaSBpbiAkKGluY2Rpci15KTsgZG8gXAorCWlmIFsgLWQgJChpbmNkaXItcHJlZml4KSQkaSBdOyB0aGVuIFwKKwkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQllY2hvIC1lICJpbmNsdWRlL2FzbS1zaC8kJGkiOyBcCisJCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQkaSBcCiAJCQlpbmNsdWRlL2FzbS1zaC9tYWNoOyBcCiAJZWxzZSBcCi0JCWVjaG8gLWUgJ2luY2x1ZGUvYXNtLXNoJzsgXAotCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAotCWZpCisJCWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaC9tYWNoIF07IHRoZW4gXAorCQkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gnOyBcCisJCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAorCQlmaTsgXAorCWZpOyBcCisJZG9uZQogCUB0b3VjaCAkQAogCiBhcmNocHJlcGFyZTogaW5jbHVkZS9hc20tc2gvLmNwdSBpbmNsdWRlL2FzbS1zaC8ubWFjaCBtYWtldG9vbHMKQEAgLTE4OCw3ICsxOTgsOSBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmgKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oIFwKKwkgICAgICAgaW5jbHVkZS9hc20tc2gvY3B1IGluY2x1ZGUvYXNtLXNoLy5jcHUgXAorCSAgICAgICBpbmNsdWRlL2FzbS1zaC9tYWNoIGluY2x1ZGUvYXNtLXNoLy5tYWNoCiAKIGRlZmluZSBhcmNoaGVscAogCUBlY2hvICcqIHpJbWFnZSAJICAgICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwppbmRleCBmMTMwMTdlLi44Nzk5ZGY2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwpAQCAtNjAsNyArNjAsNyBAQAogI2VuZGlmCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9kcmVhbWNhc3QgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2RyZWFtY2FzdCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU2VnYSBEcmVhbWNhc3QiLAogCS5tdl9zZXR1cAkJPSBkcmVhbWNhc3Rfc2V0dXAsCiAJLm12X2lycV9kZW11eAkJPSBzeXN0ZW1hc2ljX2lycV9kZW11eCwKQEAgLTcwLDQgKzcwLDMgQEAKIAkubXZfY29uc2lzdGVudF9mcmVlCT0gZHJlYW1jYXN0X2NvbnNpc3RlbnRfZnJlZSwKICNlbmRpZgogfTsKLUFMSUFTX01WKGRyZWFtY2FzdCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkYmJhOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvaHA2eHgvbWFjaC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBNYWNoaW5lIHZlY3RvciBmb3IgdGhlIEhQNjgwCi0gKi8KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHA2eHggX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCi0KLQkubXZfaW5iID0gaGQ2NDQ2MV9pbmIsCi0JLm12X2ludyA9IGhkNjQ0NjFfaW53LAotCS5tdl9pbmwgPSBoZDY0NDYxX2lubCwKLQkubXZfb3V0YiA9IGhkNjQ0NjFfb3V0YiwKLQkubXZfb3V0dyA9IGhkNjQ0NjFfb3V0dywKLQkubXZfb3V0bCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbmJfcCA9IGhkNjQ0NjFfaW5iX3AsCi0JLm12X2lud19wID0gaGQ2NDQ2MV9pbncsCi0JLm12X2lubF9wID0gaGQ2NDQ2MV9pbmwsCi0JLm12X291dGJfcCA9IGhkNjQ0NjFfb3V0Yl9wLAotCS5tdl9vdXR3X3AgPSBoZDY0NDYxX291dHcsCi0JLm12X291dGxfcCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbnNiID0gaGQ2NDQ2MV9pbnNiLAotCS5tdl9pbnN3ID0gaGQ2NDQ2MV9pbnN3LAotCS5tdl9pbnNsID0gaGQ2NDQ2MV9pbnNsLAotCS5tdl9vdXRzYiA9IGhkNjQ0NjFfb3V0c2IsCi0JLm12X291dHN3ID0gaGQ2NDQ2MV9vdXRzdywKLQkubXZfb3V0c2wgPSBoZDY0NDYxX291dHNsLAotCi0JLm12X3JlYWR3ID0gaGQ2NDQ2MV9yZWFkdywKLQkubXZfd3JpdGV3ID0gaGQ2NDQ2MV93cml0ZXcsCi0KLQkubXZfaXJxX2RlbXV4ID0gaGQ2NDQ2MV9pcnFfZGVtdXgsCi19OwotCi1BTElBU19NVihocDZ4eCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCmluZGV4IDZhZWVlODUuLjdhZTcwODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYwpAQCAtOTgsMTAgKzk4LDkgQEAKIH0KIGRldmljZV9pbml0Y2FsbChocDZ4eF9kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hwNnh4IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDZ4eCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9ICJocDZ4eCIsCiAJLm12X3NldHVwID0gaHA2eHhfc2V0dXAsCiAJLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCiAJLm12X2lycV9kZW11eCA9IGhkNjQ0NjFfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKGhwNnh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jCmluZGV4IGY5NTNjNzQuLmVkYTcxNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMKQEAgLTk3LDEwICs5Nyw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIkxBTkRJU0siLAogCS5tdl9ucl9pcnFzID0gNzIsCiAJLm12X3NldHVwID0gbGFuZGlza19zZXR1cCwKIAkubXZfaW5pdF9pcnEgPSBpbml0X2xhbmRpc2tfSVJRLAogfTsKLUFMSUFTX01WKGxhbmRpc2spCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMKaW5kZXggNGUyMGY3Yy4uOWM4MzBmZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbGJveHJlMi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xib3hyZTIvc2V0dXAuYwpAQCAtNzcsOSArNzcsOCBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiTC1CT1ggUkUyIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9sYm94cmUyX0lSUSwKIH07Ci1BTElBU19NVihsYm94cmUyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCmluZGV4IDFhMDYwNGIuLjhjZTAzZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKQEAgLTMzOCwxMSArMzM4LDEwIEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJJbnRlcmZhY2UgTVBDLTEyMTEoQ1RQL1BDSS9NUEMtU0gwMikiLAogCS5tdl9zZXR1cAkJPSBtcGMxMjExX3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDQ4LAogCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCiB9OwotQUxJQVNfTVYobXBjMTIxMSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2Vkb3NrNzcwNS9zZXR1cC5jCmluZGV4IGVjNWJlMDEuLmYwNzZjNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYwpAQCAtMjEsNyArMjEsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZWRvc2s3NzA1IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9lZG9zazc3MDUgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkVET1NLNzcwNSIsCiAJLm12X25yX2lycXMJCT0gODAsCiAKQEAgLTQxLDQgKzQxLDMgQEAKIAkubXZfaXNhX3BvcnQyYWRkcgk9IHNoX2Vkb3NrNzcwNV9pc2FfcG9ydDJhZGRyLAogCS5tdl9pbml0X2lycQkJPSBzaF9lZG9zazc3MDVfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoZWRvc2s3NzA1KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCmluZGV4IGY3ZDBlMzAuLmZhNWZhMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgSFM3NzUxUlZvSVAtMiBzdXBwb3J0LlxuIik7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oczc3NTFydm9pcCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHM3NzUxcnZvaXAgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkhTNzc1MVJWb0lQIiwKIAkubXZfc2V0dXAJCT0gaHM3NzUxcnZvaXBfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xMTgsNCArMTE4LDMgQEAKIAkubXZfaW5pdF9pcnEJCT0gaHM3NzUxcnZvaXBfaW5pdF9pcnEsCiAJLm12X2lvcG9ydF9tYXAJCT0gaHM3NzUxcnZvaXBfaW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihoczc3NTFydm9pcCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKaW5kZXggOWZiMTE2NC4uZmM4ZjI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKQEAgLTYsMTggKzYsMTggQEAKIAogY29uZmlnIFNIX1I3NzgwUlAKIAlib29sICJSNzc4MFJQLTEgYm9hcmQgc3VwcG9ydCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzgwCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAKIAogY29uZmlnIFNIX1I3NzgwTVAKIAlib29sICJSNzc4ME1QIGJvYXJkIHN1cHBvcnQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4MAorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBtYXNzLXByb2R1Y3Rpb24KIAkgIHZlcnNpb24gb2YgdGhlIFI3NzgwUlAuIElmIGluIGRvdWJ0LCBzYXkgWS4KIAogY29uZmlnIFNIX1I3Nzg1UlAKIAlib29sICJSNzc4NVJQIGJvYXJkIHN1cHBvcnQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4NQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3Nzg1CiAKIGVuZGNob2ljZQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCmluZGV4IDA3MjdlZjkuLjVhZmI4NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCkBAIC0xNjYsMTAgKzE2Niw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oaWdobGFuZGVyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oaWdobGFuZGVyIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJIaWdobGFuZGVyIiwKIAkubXZfbnJfaXJxcwkJPSAxMDksCiAJLm12X3NldHVwCQk9IGhpZ2hsYW5kZXJfc2V0dXAsCiAJLm12X2luaXRfaXJxCQk9IGhpZ2hsYW5kZXJfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoaGlnaGxhbmRlcikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKaW5kZXggNTkzZjI2YS4uNjU2ZmRhMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcnRzNzc1MXIyZCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcnRzNzc1MXIyZCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiUlRTNzc1MVIyRCIsCiAJLm12X3NldHVwCQk9IHJ0czc3NTFyMmRfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xODksNCArMTg5LDMgQEAKIAkubXZfY29uc2lzdGVudF9mcmVlCT0gdm95YWdlcmd4X2NvbnNpc3RlbnRfZnJlZSwKICNlbmRpZgogfTsKLUFMSUFTX01WKHJ0czc3NTFyMmQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYwppbmRleCAxODA4MTBiLi4yZGNlOGJkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKQEAgLTg4LDkgKzg4LDggQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNzcxMHZvaXBndyBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g3NzEwdm9pcGd3IF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTSDc3MTAgVm9JUCBHYXRld2F5IiwKIAkubXZfbnJfaXJxcwkJPSAxMDQsCiAJLm12X2luaXRfaXJxCQk9IHNoNzcxMHZvaXBnd19pbml0X2lycSwKIH07Ci1BTElBU19NVihzaDc3MTB2b2lwZ3cpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCmluZGV4IDkzNjExNzYuLmVlNzhhZjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCkBAIC0yOCw3ICsyOCw3IEBACiAJbWFrZV9zeXN0ZW1oX2lycSgweGIpOwkvKiBFdGhlcm5ldCBpbnRlcnJ1cHQgKi8KIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzeXN0ZW1oIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc3lzdGVtaCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiNzc1MSBTeXN0ZW1IIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIApAQCAtNTUsNCArNTUsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IHNoNzc1MXN5c3RlbWhfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoNzc1MXN5c3RlbWgpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTMwNDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgU2VnYSBTYXR1cm4gc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAotIwotCi1vYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi0KLW9iai0kKENPTkZJR19TTVApICs9IHNtcC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pby5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTRmN2YuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKLSAqCi0gKiBJL08gcm91dGluZXMgZm9yIHRoZSBTZWdhIFNhdHVybi4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaW5jbHVkZSA8YXNtL3NhdHVybi9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0KLXVuc2lnbmVkIGxvbmcgc2F0dXJuX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIG9mZnNldDsKLX0KLQotdm9pZCAqc2F0dXJuX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gKHZvaWQgKilvZmZzZXQ7Ci19Ci0KLXZvaWQgc2F0dXJuX2lvdW5tYXAodm9pZCAqYWRkcikKLXsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQxZDNmLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qCi0gKiBJbnRlcnJ1cHRzIG1hcCBvdXQgYXMgZm9sbG93czoKLSAqCi0gKiAgVmVjdG9yCU5hbWUJCU1hc2sKLSAqCi0gKiAJNjQJVkJMQU5LSU4JMHgwMDAxCi0gKiAJNjUJVkJMQU5LT1VUCTB4MDAwMgotICoJNjYJSEJMQU5LSU4JMHgwMDA0Ci0gKgk2NwlUSU1FUjAJCTB4MDAwOAotICoJNjgJVElNRVIxCQkweDAwMTAKLSAqCTY5CURTUEVORAkJMHgwMDIwCi0gKgk3MAlTT1VORFJFUVVFU1QJMHgwMDQwCi0gKgk3MQlTWVNURU1NQU5BR0VSCTB4MDA4MAotICoJNzIJUEFECQkweDAxMDAKLSAqCTczCUxFVkVMMkRNQUVORAkweDAyMDAKLSAqCTc0CUxFVkVMMURNQUVORAkweDA0MDAKLSAqCTc1CUxFVkVMMERNQUVORAkweDA4MDAKLSAqCTc2CURNQUlMTEVHQUwJMHgxMDAwCi0gKgk3NwlTUklURURSQVdFTkQJMHgyMDAwCi0gKgk3OAlBQlVTCQkweDgwMDAKLSAqCi0gKi8KLSNkZWZpbmUgU0FUVVJOX0lSUV9NSU4JCTY0CS8qIFZCTEFOS0lOICovCi0jZGVmaW5lIFNBVFVSTl9JUlFfTUFYCQk3OAkvKiBBQlVTICovCi0KLSNkZWZpbmUgU0FUVVJOX0lSUV9NQVNLCQkweGJmZmYKLQotc3RhdGljIGlubGluZSB1MzIgc2F0dXJuX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JdTMyIG1hc2s7Ci0KLQltYXNrID0gKDEgPDwgKGlycV9uciAtIFNBVFVSTl9JUlFfTUlOKSk7Ci0JbWFzayA8PD0gKGlycV9uciA9PSBTQVRVUk5fSVJRX01BWCk7Ci0JbWFzayAmPSBTQVRVUk5fSVJRX01BU0s7Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hc2tfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXUzMiBtYXNrOwotCi0JbWFzayA9IGN0cmxfaW5sKFNBVFVSTl9JTVIpOwotCW1hc2sgfD0gc2F0dXJuX2lycV9tYXNrKGlycV9ucik7Ci0JY3RybF9vdXRsKG1hc2ssIFNBVFVSTl9JTVIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5tYXNrX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1MzIgbWFzazsKLQotCW1hc2sgPSBjdHJsX2lubChTQVRVUk5fSU1SKTsKLQltYXNrICY9IH5zYXR1cm5faXJxX21hc2soaXJxX25yKTsKLQljdHJsX291dGwobWFzaywgU0FUVVJOX0lNUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCW1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXVubWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JbWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxX25yXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJdW5tYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1bm1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQltYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBzYXR1cm5faW50ID0gewotCS50eXBlbmFtZQk9ICJTYXR1cm4iLAotCS5lbmFibGUJCT0gZW5hYmxlX3NhdHVybl9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX3NhdHVybl9pcnEsCi0JLmFjawkJPSBtYXNrX2FuZF9hY2tfc2F0dXJuX2lycSwKLQkuZW5kCQk9IGVuZF9zYXR1cm5faXJxLAotCS5zdGFydHVwCT0gc3RhcnR1cF9zYXR1cm5faXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX3NhdHVybl9pcnEsCi19OwotCi1pbnQgc2F0dXJuX2lycV9kZW11eChpbnQgaXJxX25yKQotewotCS8qIEZJWE1FICovCi0JcmV0dXJuIGlycV9ucjsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMzdjOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIAotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMKLSAqCi0gKiBIYXJkd2FyZSBzdXBwb3J0IGZvciB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lvLmg+Ci0KLWV4dGVybiBpbnQgc2F0dXJuX2lycV9kZW11eChpbnQgaXJxX25yKTsKLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2F0dXJuIF9faW5pdG12ID0gewotCS5tdl9uYW1lCQk9ICJTZWdhIFNhdHVybiIsCi0JLm12X25yX2lycXMJCT0gODAsCS8qIEZpeCB0aGlzIGxhdGVyICovCi0KLQkubXZfaXNhX3BvcnQyYWRkcgk9IHNhdHVybl9pc2FfcG9ydDJhZGRyLAotCS5tdl9pcnFfZGVtdXgJCT0gc2F0dXJuX2lycV9kZW11eCwKLQotCS5tdl9pb3JlbWFwCQk9IHNhdHVybl9pb3JlbWFwLAotCS5tdl9pb3VubWFwCQk9IHNhdHVybl9pb3VubWFwLAotfTsKLUFMSUFTX01WKHNhdHVybikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0NjA5MS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiAKLSAqIGFyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYwotICoKLSAqIFNNUCBzdXBwb3J0IGZvciB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotI2luY2x1ZGUgPGFzbS9zYXR1cm4vc21wYy5oPgotCi1leHRlcm4gdm9pZCBzdGFydF9zZWNvbmRhcnkodm9pZCk7Ci0KLXZvaWQgX19zbXBfc2VuZF9pcGkodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKLXsKLQkvKiBOb3RoaW5nIGhlcmUgeWV0IC4uICovCi19Ci0KLXVuc2lnbmVkIGludCBfX3NtcF9wcm9iZV9jcHVzKHZvaWQpCi17Ci0JLyoKLQkgKiBUaGlzIGlzIGp1c3QgYSBzdHJhaWdodGZvcndhcmQgbWFzdGVyL3NsYXZlIGNvbmZpZ3VyYXRpb24sCi0JICogYW5kIHByb2JpbmcgaXNuJ3QgcmVhbGx5IHN1cHBvcnRlZC4uCi0JICovCi0JcmV0dXJuIDI7Ci19Ci0KLS8qCi0gKiBXZSdyZSBvbmx5IGFsbG93ZWQgdG8gZG8gYnl0ZS1hY2Nlc3MgdG8gU01QQyByZWdpc3RlcnMuIEluCi0gKiBhZGRpdGlvbiB0byB3aGljaCwgd2UgdHJlYXQgdGhlbSBhcyB3cml0ZS1vbmx5LCBzaW5jZQotICogcmVhZGluZyBmcm9tIHRoZW0gd2lsbCByZXR1cm4gdW5kZWZpbmVkIGRhdGEuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXBjX3NsYXZlX3N0b3AodW5zaWduZWQgaW50IGNwdSkKLXsKLQlzbXBjX2JhcnJpZXIoKTsKLQljdHJsX291dGIoMSwgU01QQ19TVEFUVVMpOwotCi0JY3RybF9vdXRiKFNNUENfQ01EX1NTSE9GRiwgU01QQ19DT01NQU5EKTsKLQlzbXBjX2JhcnJpZXIoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNtcGNfc2xhdmVfc3RhcnQodW5zaWduZWQgaW50IGNwdSkKLXsKLQljdHJsX291dGIoMSwgU01QQ19TVEFUVVMpOwotCWN0cmxfb3V0YihTTVBDX0NNRF9TU0hPTiwgU01QQ19DT01NQU5EKTsKLQotCXNtcGNfYmFycmllcigpOwotfQotCi12b2lkIF9fc21wX3NsYXZlX2luaXQodW5zaWduZWQgaW50IGNwdSkKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHZicjsKLQl2b2lkICoqZW50cnk7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0YyB2YnIsICUwXG5cdCIgOiAiPXIiICh2YnIpKTsKLQllbnRyeSA9ICh2b2lkICoqKSh2YnIgKyAweDMxMCArIDB4OTQpOwotCi0Jc21wY19zbGF2ZV9zdG9wKGNwdSk7Ci0KLQkqKHZvaWQgKiopZW50cnkgPSAodm9pZCAqKXN0YXJ0X3NlY29uZGFyeTsKLQotCXNtcGNfc2xhdmVfc3RhcnQoY3B1KTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCmluZGV4IGNhNzE0ODcuLmEwNzRiNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlNvbHV0aW9uRW5naW5lIiwKIAkubXZfbnJfaXJxcwkJPSAyNTYsCiAJLm12X2luYgkJCT0gc2U3MjA2X2luYiwKQEAgLTk2LDQgKzk2LDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlNzIwNl9JUlEsCiB9OwotQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMKaW5kZXggZjE5NjA5NS4uZWI0NjlmNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwpAQCAtNDYsNyArNDYsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzMwMHNlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83MzAwc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiU29sdXRpb25FbmdpbmUgNzMwMCIsCiAJLm12X25yX2lycXMgPSAxMDksCiAJLm12X2luYiA9IHNoNzMwMHNlX2luYiwKQEAgLTcyLDQgKzcyLDMgQEAKIAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMwMHNlX0lSUSwKIH07Ci1BTElBU19NVig3MzAwc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYwppbmRleCBlMTQzMDE3Li4xZGVlZTg1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiU29sdXRpb25FbmdpbmUgNzMxODAiLAogCS5tdl9ucl9pcnFzID0gMTA4LAogCS5tdl9pbmIgPSBzaDczMTgwc2VfaW5iLApAQCAtNzMsNCArNzMsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMxODBzZV9JUlEsCiAJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKIH07Ci1BTElBU19NVig3MzE4MHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCmluZGV4IDNmZGIxNmYuLjhmZWMxNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMKQEAgLTY0LDcgKzY0LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczNDNzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzM0M3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIlNvbHV0aW9uRW5naW5lIDczNDMiLAogCS5tdl9zZXR1cCA9IHNoNzM0M3NlX3NldHVwLAogCS5tdl9ucl9pcnFzID0gMTA4LApAQCAtOTIsNCArOTIsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzM0M3NlX0lSUSwKIAkubXZfaXJxX2RlbXV4ID0gc2htc2VfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKDczNDNzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYwppbmRleCA1MmQyYzRkLi4xZDBlZjdmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzYxOS9zZXR1cC5jCkBAIC0xNSw4ICsxNSw3IEBACiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTb2x1dGlvbkVuZ2luZSIsCiAJLm12X25yX2lycXMJCT0gMTA4LAogfTsKLUFMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKaW5kZXggYzhlY2NmZi4uY2RiMDgwNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCkBAIC0xNSw0NiArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZS5oPgogCi0vKiAKLSAqIElmIHRoZSBwcm9ibGVtIG9mIG1ha2VfaXByX2lycSBpcyBzb2x2ZWQsIAotICogdGhpcyBjb2RlIHdpbGwgYmVjb21lIHVubmVjZXNzYXJ5LiA6LSkgCi0gKi8KLXN0YXRpYyB2b2lkIHNlNzcweF9kaXNhYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCi0JY3RybF9vdXR3KGN0cmxfaW53KHAtPmFkZHIpICYgKDB4ZmZmZiBeICgweGYgPDwgcC0+c2hpZnQpKSwgcC0+YWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlNzcweF9lbmFibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzZTc3MHhfaXJxX2NoaXAgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gIk1TNzcweFNFLUZQR0EiLAotCS5tYXNrICAgICAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi0JLnVubWFzayAgICAgICAgID0gc2U3NzB4X2VuYWJsZV9pcHJfaXJxLAotCS5tYXNrX2FjayAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi19OwotCi12b2lkIG1ha2Vfc2U3NzB4X2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGlycSA9IHRhYmxlW2ldLmlycTsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJnNlNzcweF9pcnFfY2hpcCwKLQkJCWhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwotCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsICZ0YWJsZVtpXSk7Ci0JCXNlNzcweF9lbmFibGVfaXByX2lycShpcnEpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTc3MHhfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyoKIAkqIFN1cGVyIEkvTyAoSnVzdCBtaW1pYyBQQyk6CiAJKiAgMToga2V5Ym9hcmQKQEAgLTY4LDQ2ICsyOSw2NyBAQAogCSovCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCXsgMTMsIDAsIDgsICAweDBmLTEzICxCQ1JfSUxDUkF9LAotCXsgNSAsIDAsIDQsICAweDBmLSA1ICxCQ1JfSUxDUkF9LAotCXsgMTAsIDAsIDAsICAweDBmLTEwLCBCQ1JfSUxDUkJ9LAotCXsgNyAsIDAsIDQsICAweDBmLSA3LCBCQ1JfSUxDUkN9LAotCXsgMyAsIDAsIDAsICAweDBmLSAzLCBCQ1JfSUxDUkN9LAotCXsgMSAsIDAsIDEyLCAweDBmLSAxLCBCQ1JfSUxDUkR9LAotCXsgMTIsIDAsIDQsICAweDBmLTEyLCBCQ1JfSUxDUkR9LCAvKiBMQU4gKi8KLQl7IDIgLCAwLCA4LCAgMHgwZi0gMiwgQkNSX0lMQ1JFfSwgLyogUENJUlEyICovCi0JeyA2ICwgMCwgNCwgIDB4MGYtIDYsIEJDUl9JTENSRX0sIC8qIFBDSVJRMSAqLwotCXsgMTQsIDAsIDAsICAweDBmLTE0LCBCQ1JfSUxDUkV9LCAvKiBQQ0lSUTAgKi8KLQl7IDAgLCAwLCAxMiwgMHgwZiAgICwgQkNSX0lMQ1JGfSwgCi0JeyA0ICwgMCwgNCwgIDB4MGYtIDQsIEJDUl9JTENSRn0sCi0JeyA4ICwgMCwgMTIsIDB4MGYtIDgsIEJDUl9JTENSR30sCi0JeyA5ICwgMCwgOCwgIDB4MGYtIDksIEJDUl9JTENSR30sCi0JeyAxMSwgMCwgNCwgIDB4MGYtMTEsIEJDUl9JTENSR30sCisJeyAxMywgMCwgOCwgIDB4MGYtMTMsIH0sCisJeyA1ICwgMCwgNCwgIDB4MGYtIDUsIH0sCisJeyAxMCwgMSwgMCwgIDB4MGYtMTAsIH0sCisJeyA3ICwgMiwgNCwgIDB4MGYtIDcsIH0sCisJeyAzICwgMiwgMCwgIDB4MGYtIDMsIH0sCisJeyAxICwgMywgMTIsIDB4MGYtIDEsIH0sCisJeyAxMiwgMywgNCwgIDB4MGYtMTIsIH0sIC8qIExBTiAqLworCXsgMiAsIDQsIDgsICAweDBmLSAyLCB9LCAvKiBQQ0lSUTIgKi8KKwl7IDYgLCA0LCA0LCAgMHgwZi0gNiwgfSwgLyogUENJUlExICovCisJeyAxNCwgNCwgMCwgIDB4MGYtMTQsIH0sIC8qIFBDSVJRMCAqLworCXsgMCAsIDUsIDEyLCAweDBmICAgLCB9LCAKKwl7IDQgLCA1LCA0LCAgMHgwZi0gNCwgfSwKKwl7IDggLCA2LCAxMiwgMHgwZi0gOCwgfSwKKwl7IDkgLCA2LCA4LCAgMHgwZi0gOSwgfSwKKwl7IDExLCA2LCA0LCAgMHgwZi0xMSwgfSwKICNlbHNlCi0JeyAxNCwgMCwgIDgsIDB4MGYtMTQgLEJDUl9JTENSQX0sCi0JeyAxMiwgMCwgIDQsIDB4MGYtMTIgLEJDUl9JTENSQX0sCi0JeyAgOCwgMCwgIDQsIDB4MGYtIDggLEJDUl9JTENSQn0sCi0JeyAgNiwgMCwgMTIsIDB4MGYtIDYgLEJDUl9JTENSQ30sCi0JeyAgNSwgMCwgIDgsIDB4MGYtIDUgLEJDUl9JTENSQ30sCi0JeyAgNCwgMCwgIDQsIDB4MGYtIDQgLEJDUl9JTENSQ30sCi0JeyAgMywgMCwgIDAsIDB4MGYtIDMgLEJDUl9JTENSQ30sCi0JeyAgMSwgMCwgMTIsIDB4MGYtIDEgLEJDUl9JTENSRH0sCisJeyAxNCwgMCwgIDgsIDB4MGYtMTQsIH0sCisJeyAxMiwgMCwgIDQsIDB4MGYtMTIsIH0sCisJeyAgOCwgMSwgIDQsIDB4MGYtIDgsIH0sCisJeyAgNiwgMiwgMTIsIDB4MGYtIDYsIH0sCisJeyAgNSwgMiwgIDgsIDB4MGYtIDUsIH0sCisJeyAgNCwgMiwgIDQsIDB4MGYtIDQsIH0sCisJeyAgMywgMiwgIDAsIDB4MGYtIDMsIH0sCisJeyAgMSwgMywgMTIsIDB4MGYtIDEsIH0sCiAjaWYgZGVmaW5lZChDT05GSUdfU1ROSUMpCiAJLyogU1QgTklDICovCi0JeyAxMCwgMCwgIDQsIDB4MGYtMTAgLEJDUl9JTENSRH0sIAkvKiBMQU4gKi8KKwl7IDEwLCAzLCAgNCwgMHgwZi0xMCwgfSwgCS8qIExBTiAqLwogI2VuZGlmCiAJLyogTVJTSFBDIElSUXMgc2V0dGluZyAqLwotCXsgIDAsIDAsIDEyLCAweDBmLSAwICxCQ1JfSUxDUkV9LAkvKiBQQ0lSUTMgKi8KLQl7IDExLCAwLCAgOCwgMHgwZi0xMSAsQkNSX0lMQ1JFfSwgCS8qIFBDSVJRMiAqLwotCXsgIDksIDAsICA0LCAweDBmLSA5ICxCQ1JfSUxDUkV9LCAJLyogUENJUlExICovCi0JeyAgNywgMCwgIDAsIDB4MGYtIDcgLEJDUl9JTENSRX0sIAkvKiBQQ0lSUTAgKi8KKwl7ICAwLCA0LCAxMiwgMHgwZi0gMCwgfSwJLyogUENJUlEzICovCisJeyAxMSwgNCwgIDgsIDB4MGYtMTEsIH0sIAkvKiBQQ0lSUTIgKi8KKwl7ICA5LCA0LCAgNCwgMHgwZi0gOSwgfSwgCS8qIFBDSVJRMSAqLworCXsgIDcsIDQsICAwLCAweDBmLSA3LCB9LCAJLyogUENJUlEwICovCiAJLyogIzIsICMxMyBhcmUgYWxsb2NhdGVkIGZvciBTTE9UIElSUSAjMSBhbmQgIzIgKGZvciBub3cpICovCiAJLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLQl7IDEzLCAwLCAgNCwgMHgwZi0xMyAsQkNSX0lMQ1JHfSwgCS8qIFNMT1RJUlEyICovCi0JeyAgMiwgMCwgIDAsIDB4MGYtIDIgLEJDUl9JTENSR30sIAkvKiBTTE9USVJRMSAqLworCXsgMTMsIDYsICA0LCAweDBmLTEzLCB9LCAJLyogU0xPVElSUTIgKi8KKwl7ICAyLCA2LCAgMCwgMHgwZi0gMiwgfSwgCS8qIFNMT1RJUlExICovCiAjZW5kaWYKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJQkNSX0lMQ1JBLAorCUJDUl9JTENSQiwKKwlCQ1JfSUxDUkMsCisJQkNSX0lMQ1JELAorCUJDUl9JTENSRSwKKwlCQ1JfSUxDUkYsCisJQkNSX0lMQ1JHLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2U3NzB4IiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtMTIyLDUgKzEwNCw1IEBACiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRik7CiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRyk7CiAKLQltYWtlX3NlNzcweF9pcnEoc2U3NzB4X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3NzB4X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYwppbmRleCAxN2EyNjMxLi4yOTYyZGExIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU29sdXRpb25FbmdpbmUiLAogCS5tdl9zZXR1cAkJPSBzbXNjX3NldHVwLAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCkBAIC0xNjAsNCArMTYwLDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlX0lSUSwKIH07Ci1BTElBU19NVihzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL2lycS5jCmluZGV4IDA5OWU1ZGUuLjI2Y2ZmMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9pcnEuYwpAQCAtMTksMTUgKzE5LDI0IEBACiAjZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0CiAjZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0CiAKK3N0cnVjdCBzZTc3MjJfZGF0YSB7CisJdW5zaWduZWQgY2hhciBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfaWR4OworCXVuc2lnbmVkIGNoYXIgc2hpZnQ7CisJdW5zaWduZWQgc2hvcnQgcHJpb3JpdHk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworfTsKKworCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3NlNzcyMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBzZTc3MjJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJY3RybF9vdXR3KCBjdHJsX2ludyggcC0+YWRkciApIHwgcC0+cHJpb3JpdHkgLCBwLT5hZGRyICk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9zZTc3MjJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgc2U3NzIyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCWN0cmxfb3V0dyggY3RybF9pbncoIHAtPmFkZHIgKSAmIH5wLT5wcmlvcml0eSAsIHAtPmFkZHIgKTsKIH0KIApAQCAtMzgsNyArNDcsNyBAQAogCS5tYXNrX2FjayAgICAgICA9IGRpc2FibGVfc2U3NzIyX2lycSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBzZTc3MjJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogaXJxICAgICAgICAsaWR4LHNmdCwgcHJpb3JpdHkgICAgICwgYWRkciAgICovCiAJeyBNUlNIUENfSVJRMCAsIDAgLCAwICwgTVJTSFBDX0JJVDAgLCBJUlEwMV9NQVNLIH0gLAogCXsgTVJTSFBDX0lSUTEgLCAwICwgMCAsIE1SU0hQQ19CSVQxICwgSVJRMDFfTUFTSyB9ICwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYwppbmRleCA2MzZjYTZjLi42Y2NhNmNiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9zZXR1cC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzcyMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzIyIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzIyIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3MjJfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDEwOSAsCkBAIC0xNDUsNCArMTQ1LDMgQEAKIAkubXZfaXJxX2RlbXV4ICAgICAgICAgICA9IHNlNzcyMl9pcnFfZGVtdXgsCiAKIH07Ci1BTElBU19NVihzZTc3MjIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYwppbmRleCBlNGM2M2E0Li5jM2QxMjU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKQEAgLTE0LDQ0ICsxNCwzMSBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2U3NzUxLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3NzUxX2lwcl9tYXBbXSA9IHsKLSAgLyogTGVhdmUgb2xkIFNvbHV0aW9uIEVuZ2luZSBjb2RlIGluIGZvciByZWZlcmVuY2UuICovCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FKQotCS8qCi0JICogU3VwZXIgSS9PIChKdXN0IG1pbWljIFBDKToKLQkgKiAgMToga2V5Ym9hcmQKLQkgKiAgMzogc2VyaWFsIDAKLQkgKiAgNDogc2VyaWFsIDEKLQkgKiAgNTogcHJpbnRlcgotCSAqICA2OiBmbG9wcHkKLQkgKiAgODogcnRjCi0JICogMTI6IG1vdXNlCi0JICogMTQ6IGlkZTAKLQkgKi8KLQl7IDE0LCBCQ1JfSUxDUkEsIDIsIDB4MGYtMTQgfSwKLQl7IDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIgfSwKLQl7ICA4LCBCQ1JfSUxDUkIsIDEsIDB4MGYtIDggfSwKLQl7ICA2LCBCQ1JfSUxDUkMsIDMsIDB4MGYtIDYgfSwKLQl7ICA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUgfSwKLQl7ICA0LCBCQ1JfSUxDUkMsIDEsIDB4MGYtIDQgfSwKLQl7ICAzLCBCQ1JfSUxDUkMsIDAsIDB4MGYtIDMgfSwKLQl7ICAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEgfSwKLQotCXsgMTAsIEJDUl9JTENSRCwgMSwgMHgwZi0xMCB9LCAvKiBMQU4gKi8KLQotCXsgIDAsIEJDUl9JTENSRSwgMywgMHgwZi0gMCB9LCAvKiBQQ0lSUTMgKi8KLQl7IDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEgfSwgLyogUENJUlEyICovCi0JeyAgOSwgQkNSX0lMQ1JFLCAxLCAweDBmLSA5IH0sIC8qIFBDSVJRMSAqLwotCXsgIDcsIEJDUl9JTENSRSwgMCwgMHgwZi0gNyB9LCAvKiBQQ0lSUTAgKi8KLQotCS8qICMyLCAjMTMgYXJlIGFsbG9jYXRlZCBmb3IgU0xPVCBJUlEgIzEgYW5kICMyIChmb3Igbm93KSAqLwotCS8qIE5PVEU6ICMyIGFuZCAjMTMgYXJlIG5vdCB1c2VkIG9uIFBDICovCi0JeyAxMywgQkNSX0lMQ1JHLCAxLCAweDBmLTEzIH0sIC8qIFNMT1RJUlEyICovCi0JeyAgMiwgQkNSX0lMQ1JHLCAwLCAweDBmLSAyIH0sIC8qIFNMT1RJUlExICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSkKLQl7IDEzLCBCQ1JfSUxDUkQsIDMsIDIgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgMTMsIDMsIDMsIDIgfSwKIAkvKiBBZGQgYWRkaXRpb25hbCBlbnRyaWVzIGhlcmUgYXMgZHJpdmVycyBhcmUgYWRkZWQgYW5kIHRlc3RlZC4gKi8KLSNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlCQ1JfSUxDUkEsCisJQkNSX0lMQ1JCLAorCUJDUl9JTENSQywKKwlCQ1JfSUxDUkQsCisJQkNSX0lMQ1JFLAorCUJDUl9JTENSRiwKKwlCQ1JfSUxDUkcsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNlNzc1MSIsCisJfSwKIH07CiAKIC8qCkBAIC01OSw1ICs0Niw1IEBACiAgKi8KIHZvaWQgX19pbml0IGluaXRfNzc1MXNlX0lSUSh2b2lkKQogewotCW1ha2VfaXByX2lycShzZTc3NTFfaXByX21hcCwgQVJSQVlfU0laRShzZTc3NTFfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCmluZGV4IDUyYzdiZmEuLjc4NzNkMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzc1MXNlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICI3NzUxIFNvbHV0aW9uRW5naW5lIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIApAQCAtNzEsNCArNzEsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfNzc1MXNlX0lSUSwKIH07Ci1BTElBU19NVig3NzUxc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9pcnEuYwppbmRleCAzZDA2MjVjLi44NzQ5MTQ3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvaXJxLmMKQEAgLTE2LDI4ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlNzc4MC5oPgogCi0jZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0Ci0jZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLQ0xSMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzc4MF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lICAgICAgICAgICA9ICJTRTc3ODAiLAotCS5tYXNrICAgICAgICAgICA9IGRpc2FibGVfc2U3NzgwX2lycSwKLQkudW5tYXNrICAgICAgICAgPSBlbmFibGVfc2U3NzgwX2lycSwKLQkubWFza19hY2sgICAgICAgPSBkaXNhYmxlX3NlNzc4MF9pcnEsCi19OwotCiBzdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfaXJxX3RhYmxlW10gPSB7CiAJeyAyLCAgMCwgMzEsIDAsIDMxLCAzIH0sIC8qIGRhdWdodGVyIGJvYXJkIEVYVElOVDEgKi8KIAl7IDQsICAwLCAzMCwgMCwgMzAsIDMgfSwgLyogZGF1Z2h0ZXIgYm9hcmQgRVhUSU5UMiAqLwpAQCAtNTEsMTMgKzI5LDI0IEBACiAJeyAwICwgMCwgMjQsIDAsIDI0LCAzIH0sIC8qIFNNNTAxICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMCwgLyogTi9BICovCisJLm1za19iYXNlCT0gMHhmZmQwMDA0NCwKKwkubXNrY2xyX2Jhc2UJPSAweGZmZDAwMDY0LAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2U3NzgwIiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwogdm9pZCBfX2luaXQgaW5pdF9zZTc3ODBfSVJRKHZvaWQpCiB7Ci0JaW50IGkgOwotCiAJLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHQgYXQgRlBHQSAqLwogCWN0cmxfb3V0dygwLCBGUEdBX0lOVE1TSzEpOwogCS8qIG1hc2sgU001MDEgaW50ZXJydXB0ICovCkBAIC03OSwxMSArNjgsNSBAQAogCS8qIEZQR0EgKyAweDBBICovCiAJY3RybF9vdXR3KChJUlFQSU5fUENDUFcgPDwgSVJRUE9TX1BDQ1BXKSwgRlBHQV9JTlRTRUwzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSk7IGkrKykgewotCQlkaXNhYmxlX2lycV9ub3N5bmMoaW50YzJfaXJxX3RhYmxlW2ldLmlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmc2U3NzgwX2lycV9jaGlwLAotCQkJaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7Ci0JCXNldF9pcnFfY2hpcF9kYXRhKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmaW50YzJfaXJxX3RhYmxlW2ldICk7Ci0JCWRpc2FibGVfc2U3NzgwX2lycShpbnRjMl9pcnFfdGFibGVbaV0uaXJxKTsKLQl9CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jCmluZGV4IGRmN2QwOGEuLjcyM2YyZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL3NldHVwLmMKQEAgLTExMywxMCArMTEzLDkgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzc4MCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzgwIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzgwIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3ODBfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDExMSAsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2U3NzgwX0lSUSwKIH07Ci1BTElBU19NVihzZTc3ODApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKaW5kZXggYzA2OWM0NC4uOWMwMzFhOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYwpAQCAtMTUsMTcgKzE1LDMzIEBACiAjaW5jbHVkZSA8YXNtL3NoMDMvc2gwMy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDAzX2lwcl9tYXBbXSA9IHsKLQl7IElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkgfSwKLQl7IElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkgfSwKLQl7IElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkgfSwKLQl7IElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgSVJMMF9JUlEsIDAsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSB9LAorCXsgSVJMMV9JUlEsIDAsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSB9LAorCXsgSVJMMl9JUlEsIDAsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSB9LAorCXsgSVJMM19JUlEsIDAsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlJTlRDX0lQUkQsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoMDMiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zaDAzX0lSUSh2b2lkKQogewogCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7Ci0JbWFrZV9pcHJfaXJxKHNoMDNfaXByX21hcCwgQVJSQVlfU0laRShzaDAzX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogZXh0ZXJuIHZvaWQgKmNmX2lvX2Jhc2U7CkBAIC03NCwxMSArOTAsMTAgQEAKIH0KIF9faW5pdGNhbGwoc2gwM19kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkludGVyZmFjZSAoQ1RQL1BDSS1TSDAzKSIsCiAJLm12X3NldHVwCQk9IHNoMDNfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNDgsCiAJLm12X2lvcG9ydF9tYXAJCT0gc2gwM19pb3BvcnRfbWFwLAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NoMDNfSVJRLAogfTsKLUFMSUFTX01WKHNoMDMpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwppbmRleCA0YTlkZjRhLi5kZmQxMjQ1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKQEAgLTYsMjggKzYsNDQgQEAKICAqIFNITUlOIFN1cHBvcnQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vc2htaW4uaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgUEZDX1BIQ1IJMHhhNDAwMDEwZVVMCiAjZGVmaW5lIElOVENfSUNSMQkweGE0MDAwMDEwVUwKICNkZWZpbmUgSU5UQ19JUFJDCTB4YTQwMDAwMTZVTAogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNobWluX2lwcl9tYXBbXSA9IHsKLQl7IC5pcnE9MzIsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PSAwLCAucHJpb3JpdHk9MCB9LAotCXsgLmlycT0zMywgLmFkZHI9SU5UQ19JUFJDLCAuc2hpZnQ9IDQsIC5wcmlvcml0eT0wIH0sCi0JeyAuaXJxPTM0LCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0gOCwgLnByaW9yaXR5PTggfSwKLQl7IC5pcnE9MzUsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PTEyLCAucHJpb3JpdHk9MCB9LAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyAzMiwgMCwgMCwgMCB9LAorCXsgMzMsIDAsIDQsIDAgfSwKKwl7IDM0LCAwLCA4LCA4IH0sCisJeyAzNSwgMCwgMTIsIDAgfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJSU5UQ19JUFJDLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaG1pbiIsCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NobWluX2lycSh2b2lkKQogewogCWN0cmxfb3V0dygweDJhMDAsIFBGQ19QSENSKTsJLy8gSVJRMC0zPUlSUQogCWN0cmxfb3V0dygweDBhYWEsIElOVENfSUNSMSk7CS8vIElSUTAtMz1JUlEtbW9kZSxMb3ctYWN0aXZlLgotCW1ha2VfaXByX2lycShzaG1pbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNobWluX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqc2htaW5faW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBzaXplKQpAQCAtNDMsOSArNTksOCBAQAogCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaG1pbiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2htaW4gX19pbml0bXYgPSB7CiAJLm12X25hbWUJPSAiU0hNSU4iLAogCS5tdl9pbml0X2lycQk9IGluaXRfc2htaW5faXJxLAogCS5tdl9pb3BvcnRfbWFwCT0gc2htaW5faW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihzaG1pbikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCmluZGV4IDY1MGZiMzYuLjg0MjcxZDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYwpAQCAtNjgsMTEgKzY4LDI3IEBACiAgKiBJUkwzID0gY3J5cHRvCiAgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzbmFwZ2Vhcl9pcHJfbWFwW10gPSB7Ci0JbWFrZV9pcHJfaXJxKElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwxX0lSUSwgSVJMMV9JUFJfQUREUiwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMMl9JUlEsIElSTDJfSVBSX0FERFIsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkpOworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyBJUkwwX0lSUSwgMCwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZIH0sCisJeyBJUkwxX0lSUSwgMCwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZIH0sCisJeyBJUkwyX0lSUSwgMCwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZIH0sCisJeyBJUkwzX0lSUSwgMCwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCUlOVENfSVBSRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc25hcGdlYXIiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zbmFwZ2Vhcl9JUlEodm9pZCkKQEAgLTgyLDcgKzk4LDcgQEAKIAogCXByaW50aygiU2V0dXAgU25hcEdlYXIgSVJRL0lQUiAuLi5cbiIpOwogCi0JbWFrZV9pcHJfaXJxKHNuYXBnZWFyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc25hcGdlYXJfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQogCiAvKgpAQCAtOTYsNyArMTEyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NuYXBnZWFyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zbmFwZ2VhciBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU25hcEdlYXIgU2VjdXJlRWRnZTU0MTAiLAogCS5tdl9zZXR1cAkJPSBzbmFwZ2Vhcl9zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA3MiwKQEAgLTExNyw0ICsxMzMsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc25hcGdlYXJfSVJRLAogfTsKLUFMSUFTX01WKHNuYXBnZWFyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwppbmRleCA2Mzk2Y2VhLi5mYzhjZDA2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDQyMDJfbWljcm9kZXYgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNDIwMl9taWNyb2RldiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU0g0LTIwMiBNaWNyb0RldiIsCiAJLm12X3NldHVwCQk9IG1pY3JvZGV2X3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDcyLAkJLyogUVFRIG5lZWQgdG8gY2hlY2sgdGhpcyAtIHVzZSB0aGUgTUFDUk8gKi8KQEAgLTQwMyw0ICs0MDMsMyBAQAogCS5tdl9oZWFydGJlYXQJCT0gbWljcm9kZXZfaGVhcnRiZWF0LAogI2VuZGlmCiB9OwotQUxJQVNfTVYoc2g0MjAyX21pY3JvZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMKaW5kZXggNmJjZDkzOS4uNjA2ZDI1YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8YXNtL3RpdGFuLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgdGl0YW5faXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFIgaWR4LCBzaGlmdCwgcHJpbyAqLwogCXsgVElUQU5fSVJRX1dBTiwgICAzLCAxMiwgOCB9LAkvKiBldGgwIChXQU4pICovCiAJeyBUSVRBTl9JUlFfTEFOLCAgIDMsICA4LCA4IH0sCS8qIGV0aDEgKExBTikgKi8KQEAgLTIwLDE1ICsyMCwzMyBAQAogCXsgVElUQU5fSVJRX1VTQiwgICAzLCAgMCwgOCB9LAkvKiBtUENJIEIgKGJvdHRvbSksIFVTQiAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsgLyogc3RvbGVuIGZyb20gc2V0dXAtc2g3NzUwLmMgKi8KKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItdGl0YW4iLAorCX0sCit9Owogc3RhdGljIHZvaWQgX19pbml0IGluaXRfdGl0YW5faXJxKHZvaWQpCiB7CiAJLyogZW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFscyAqLwogCWlwcl9pcnFfZW5hYmxlX2lybG0oKTsKIAkvKiByZWdpc3RlciBpcHIgaXJxcyAqLwotCW1ha2VfaXByX2lycSh0aXRhbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHRpdGFuX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3RpdGFuIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl90aXRhbiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9CSJUaXRhbiIsCiAKIAkubXZfaW5iID0JdGl0YW5faW5iLApAQCAtNTIsNCArNzAsMyBAQAogCiAJLm12X2luaXRfaXJxID0JaW5pdF90aXRhbl9pcnEsCiB9OwotQUxJQVNfTVYodGl0YW4pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxOGY0MC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB1bmtub3duIFNIIGJvYXJkcyAKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU0NjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy91bmtub3duL3NldHVwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBTZXR1cCBjb2RlIGZvciBhbiB1bmtub3duIG1hY2hpbmUgKGludGVybmFsIHBlcmlwaGVyYWxzIG9ubHkpCi0gKgotICogVGhpcyBpcyB0aGUgc2ltcGxlc3Qgb2YgYWxsIGJvYXJkcywgYW5kIHNlcnZlcyBvbmx5IGFzIGEgcXVpY2sgYW5kIGRpcnR5Ci0gKiBtZXRob2QgdG8gc3RhcnQgZGVidWdnaW5nIGEgbmV3IGJvYXJkIGR1cmluZyBicmluZy11cCB1bnRpbCBwcm9wZXIgYm9hcmQKLSAqIHNldHVwIGNvZGUgaXMgd3JpdHRlbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdW5rbm93biBfX2luaXRtdiA9IHsKLQkubXZfbmFtZQkJPSAiVW5rbm93biIsCi19OwotQUxJQVNfTVYodW5rbm93bikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcgYi9hcmNoL3NoL2NjaGlwcy9LY29uZmlnCmluZGV4IDA1ODJjYTguLjJlNTE2ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcKKysrIGIvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZwpAQCAtMTMsMTAgKzEzLDggQEAKIAkgIGFyZSBhZGRpdGlvbmFsIEdQSU8gYml0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyZmFjZSB0bwogCSAgZXh0ZXJuYWwgYXMgd2VsbC4KIAotIyBBIGJvYXJkIG11c3QgaGF2ZSBkZWZpbmVkIEhENjQ0NlhfU0VSSUVTIGluIG9yZGVyIHRvIHNlZSB0aGVzZQogY29uZmlnIEhENjQ0NlhfU0VSSUVTCi0JYm9vbCAiSEQ2NDQ2eCBzdXBwb3J0IgotCWRlZmF1bHQgbgorCWJvb2wKIAogY2hvaWNlCiAJcHJvbXB0ICJIRDY0NDZ4IG9wdGlvbnMiCkBAIC0yNSw3ICsyMyw2IEBACiAKIGNvbmZpZyBIRDY0NDYxCiAJYm9vbCAiSGl0YWNoaSBIRDY0NDYxIGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDYxIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3MDkgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCkBAIC00MCw3ICszNyw2IEBACiAKIGNvbmZpZyBIRDY0NDY1CiAJYm9vbCAiSGl0YWNoaSBIRDY0NDY1IGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTAKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDY1IHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3NTAgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCmluZGV4IDhiNmI1YTcuLjNmZGQyNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDIzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgVHVlIE9jdCAgMyAxMDo1MTo1NSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFNhdCBKdWwgIDcgMDM6NDc6NDUgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1lTX1NVUFBPUlRTX1BDST15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0yOCw2ICszNiw3IEBACiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiAjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKQEAgLTM1LDggKzQ0LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNTAsMTQgKzYxLDE5IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtOTMsNDQgKzEwOSw5IEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9EUkVBTUNBU1Q9eQotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHNlbGVjdGlvbgotIwogQ09ORklHX0NQVV9TSDQ9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xMzgsNzkgKzExOSw5MyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAotCi0jCi0jIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTA9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxPXkKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDEwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfRlBVPXkKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfU1RPUkVfUVVFVUVTPXkKIENPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIENPTkZJR19DUFVfSEFTX1NSX1JCPXkKK0NPTkZJR19DUFVfSEFTX1BURUE9eQogCiAjCi0jIFRpbWVyIHN1cHBvcnQKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NIX0RSRUFNQ0FTVD15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgogQ09ORklHX1NIX1BDTEtfRlJFUT00OTg3NjUwNAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMzIsNiArMjI3LDcgQEAKICMKICMgRE1BIHN1cHBvcnQKICMKK0NPTkZJR19TSF9ETUFfQVBJPXkKIENPTkZJR19TSF9ETUE9eQogQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFM9NAogQ09ORklHX05SX0RNQV9DSEFOTkVMU19CT09MPXkKQEAgLTI0MCwxNyArMjM2LDIzIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBmZWF0dXJlcwogIwogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKIENPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUPXkKQEAgLTI2OSwzMyArMjcxLDIzIEBACiAjIEJ1cyBvcHRpb25zCiAjCiBDT05GSUdfUENJPXkKLSMgQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19QQ0lfQVVUTz15Ci0jIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwogIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCiAjCiBDT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogQ09ORklHX05FVD15CkBAIC0zMDMsMTMgKzI5NSwxMyBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzI3LDMwICszMTksMjAgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNzYsNyArMzU4LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zOTQsMTAgKzM4NSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIAogIwpAQCAtNDA4LDYgKzM5NSw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtNDIxLDEzICs0MDksMTYgQEAKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDM2LDEwICs0MjcsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC00NTUsNiArNDQyLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC00NzAsMTUgKzQ1OCw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNTIxLDQ3ICs1MDEsMTYgQEAKICMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RMQU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MySU8gaXMgbm90IHNldAotIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAogCiAjCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIyBXaXJlbGVzcyBMQU4KICMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CkBAIC02MDQsMTcgKzU1MywxOSBAQAogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1BTMiBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjYwLDEwICs2MTEsNiBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC02ODAsMTQgKzYyNyw4IEBACiAjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTY5NSwxMSArNjM2LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC03MTEsNDQgKzY0OCw1MSBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKLUNPTkZJR19IV01PTj15Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogQ09ORklHX0ZCPXkKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIwogIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldApAQCAtNzYzLDEzICs3MDcsMTcgQEAKICMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAogIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtNzg5LDEwICs3MzcsNiBAQAogIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF8xMHgxOCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkBAIC04MDAsNyArNzQ0LDYgQEAKICMgQ09ORklHX0xPR09fU1VQRVJIX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19TVVBFUkhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQ9eQotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtODA4LDYgKzc1MSwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKQEAgLTgyMywxMCArNzcyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC04NzQsMTAgKzgxOSwxMiBAQAogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05NTcsNiArOTA0LDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogQ09ORklHX1BST0ZJTElORz15CkBAIC05NjUsMTcgKzkxNywxOCBAQAogIwogIyBLZXJuZWwgaGFja2luZwogIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfU0hfS0dEQiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtOTkxLDggKzk0NCwxMyBAQAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCitDT05GSUdfQklUUkVWRVJTRT15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Zjc0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBtcF9kZWZjb25maWcKQEAgLTAsMCArMSwxMjIzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIE1vbiBKdW4gMTEgMTA6MjQ6NTcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9OT09QPXkKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKK0NPTkZJR19DUFVfU0g0PXkKK0NPTkZJR19DUFVfU0g0QT15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MD15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUVVJQ0tMSVNUPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDgwMDAwMDAKKyMgQ09ORklHXzMyQklUIGlzIG5vdCBzZXQKK0NPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1NIX0ZQVT15CisjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfU1BFQ1VMQVRJVkVfRVhFQ1VUSU9OPXkKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlE9eQorQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorCisjCisjIEJvYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9ISUdITEFOREVSPXkKKyMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3NzgwTVA9eQorIyBDT05GSUdfU0hfUjc3ODVSUCBpcyBub3Qgc2V0CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0yOAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMjAwMDAwMAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisjIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0hFQVJUQkVBVCBpcyBub3Qgc2V0CitDT05GSUdfUFVTSF9TV0lUQ0g9eQorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfUFJFRU1QVF9CS0w9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgcm9vdD0vZGV2L3NkYTEiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CitDT05GSUdfUENJX0FVVE89eQorQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfTExDPW0KKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPW0KKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1NJTD15CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUExBVEZPUk09eQorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKK0NPTkZJR19QQ05FVDMyPW0KKyMgQ09ORklHX1BDTkVUMzJfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5Q1A9bQorQ09ORklHXzgxMzlUT089bQorIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT09fODEyOT15CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19WSUFfUkhJTkU9bQorQ09ORklHX1ZJQV9SSElORV9NTUlPPXkKKyMgQ09ORklHX1ZJQV9SSElORV9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwPXkKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwMD1tCisjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorQ09ORklHX1I4MTY5PXkKKyMgQ09ORklHX1I4MTY5X05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwMD15CisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZQT1JUPXkKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT1tCisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKworIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFX0ZTPW0KKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorQ09ORklHX05URlNfRlM9eQorIyBDT05GSUdfTlRGU19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTlRGU19SVz15CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJGUz15CitDT05GSUdfSFVHRVRMQl9QQUdFPXkKK0NPTkZJR19SQU1GUz15CitDT05GSUdfQ09ORklHRlNfRlM9bQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV85MzI9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPW0KKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9eQorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZwppbmRleCAwZjVlYzY0Li41YzI5MzM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjMwotIyBNb24gTWFyIDEyIDE0OjI2OjMzIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgVGh1IEp1bCAxMiAxMjozMzoxNSAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19QQ0k9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CkBAIC00Myw2ICs0NSw3IEBACiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldApAQCAtNjAsMTMgKzYzLDE4IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15Ci1DT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTEwMiw1NSArMTEwLDExIEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotQ09ORklHX1NIX0hJR0hMQU5ERVI9eQotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SNzc4ME1QIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9SNzc4NVJQPXkKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIND15CiBDT05GSUdfQ1BVX1NINEE9eQogQ09ORklHX0NQVV9TSFgyPXkKLQotIwotIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0Ci0jCi0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKLQotIwotIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKLQotIwotIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xNTgsMTAgKzEyMiw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CkBAIC0xNzAsMjMgKzEzMSwxMiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NT15Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CkBAIC0xOTQsNiArMTQ0LDcgQEAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwogIworQ09ORklHX1FVSUNLTElTVD15CiBDT05GSUdfTU1VPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MDgwMDAwMDAKQEAgLTIwMSw2ICsxNTIsMTIgQEAKIENPTkZJR18zMkJJVD15CiAjIENPTkZJR19YMlRMQiBpcyBub3Qgc2V0CiBDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE1LDE3ICsxNzIsMTcgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKQEAgLTI0MSwxMiArMTk4LDIyIEBACiBDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIworIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU0hfSElHSExBTkRFUj15CisjIENPTkZJR19TSF9SNzc4MFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1I3NzgwTVAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3Nzg1UlA9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MjgKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9NTAwMDAwMDAKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjYxLDcgKzIyOCw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yNzgsNyArMjQ0LDcgQEAKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogQ09ORklHX0tFWEVDPXkKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CkBAIC0zMDAsMzEgKzI2NiwyMiBAQAogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfUENJX0FVVE89eQogQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CiAjCiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKICMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0ZMQVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCiAjIE5ldHdvcmtpbmcKICMKIENPTkZJR19ORVQ9eQpAQCAtMzMyLDcgKzI4OSw2IEBACiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwotIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CkBAIC0zNzcsMjAgKzMzMyw4IEBACiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogQ09ORklHX0JSSURHRT1tCkBAIC00MTcsOCArMzYxLDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTQzOCwxMCArMzkwLDYgQEAKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCiAjIENPTkZJR19NVEQgaXMgbm90IHNldAogCiAjCkBAIC00NzUsMTIgKzQyMywxMCBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01MDksNiArNDU1LDcgQEAKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KIAogIwogIyBTQ1NJIFRyYW5zcG9ydHMKQEAgLTU1NCwxMCArNTAxLDYgQEAKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldApAQCAtNTgwLDYgKzUyMyw3IEBACiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CkBAIC02MjksNiArNTczLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC02NDQsMTUgKzU4OSw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNjczLDEwICs2MTAsNyBAQAogIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCitDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldApAQCAtNjg5LDU1ICs2MjMsMjYgQEAKICMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIworQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMgV2lyZWxlc3MgTEFOCiAjCi1DT05GSUdfTkVUX1JBRElPPXkKLSMgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgaXMgbm90IHNldAotCi0jCi0jIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCi0jCi0jIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAotIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAotCi0jCi0jIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldAotIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfV0lSRUxFU1M9eQotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZEREkgaXMgbm90IHNldAogIyBDT05GSUdfSElQUEkgaXMgbm90IHNldApAQCAtNzg5LDYgKzY5NCw3IEBACiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTgzMSwxNCArNzM3LDggQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKQEAgLTg0OCwxMCArNzQ4LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC04NjQsMTYgKzc2MSwxNSBAQAogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0Ci0jCiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwpAQCAtODg1LDIyICs3ODEsMzAgQEAKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC05MDgsNyArODEyLDcgQEAKICMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CiAKICMKLSMgRnJhbWJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCiAjIENPTkZJR19GQl9DSVJSVVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKQEAgLTkzMCwxMiArODM0LDExIEBACiAjIENPTkZJR19GQl9LWVJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WVDg2MjMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwogIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CiAKICMKQEAgLTk1MiwxMyArODU1LDEwIEBACiAjIE9wZW4gU291bmQgU3lzdGVtCiAjCiBDT05GSUdfU09VTkRfUFJJTUU9bQotIyBDT05GSUdfT0JTT0xFVEVfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0lDSCBpcyBub3Qgc2V0CisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CiAKICMKICMgSElEIERldmljZXMKQEAgLTk4MiwxMCArODgyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC0xMDI2LDE4ICs5MjIsMzAgQEAKIENPTkZJR19SVENfSU5URl9QUk9DPXkKIENPTkZJR19SVENfSU5URl9ERVY9eQogIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAKICMKLSMgUlRDIGRyaXZlcnMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKLUNPTkZJR19SVENfRFJWX1NIPXkKLSMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIwogIyBETUEgRW5naW5lIHN1cHBvcnQKICMKICMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldApAQCAtMTA1MSwxNCArOTU5LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTExNTcsNiArMTA1Nyw3IEBACiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC0xMjM5LDcgKzExNDAsNiBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKQEAgLTEyNjYsNiArMTE2Niw3IEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CkBAIC0xMzAwLDYgKzEyMDEsNyBAQAogQ09ORklHX0NSWVBUT19DQkM9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KICMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0RFUz15CiAjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CkBAIC0xMzI4LDcgKzEyMzAsOSBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwppbmRleCA4N2FiOTA4Li5mMmYyYTNjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTQ6NDA6MTUgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjM3OjQ2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTM0LDggKzM4LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNDgsMTIgKzU0LDE3IEBACiAjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKLUNPTkZJR19TTEFCPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTgzLDUzICs5NCwxMCBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfRUMzMTA0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9EUkVBTUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0gyPXkKIENPTkZJR19DUFVfU0gyQT15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDY9eQotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzNywxMCArMTA1LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0OSwzMiArMTE0LDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODQsMzUgKzE0NSw0MiBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAotIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKLSMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIAogIwotIyBUaW1lciBzdXBwb3J0CisjIEJvYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19TT0xVVElPTl9FTkdJTkU9eQorQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKKworIworIyBUaW1lciBhbmQgY2xvY2sgY29uZmlndXJhdGlvbgogIwogQ09ORklHX1NIX0NNVD15CiAjIENPTkZJR19TSF9NVFUyIGlzIG5vdCBzZXQKIENPTkZJR19TSF9USU1FUl9JUlE9MTQwCi0jIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKIENPTkZJR19TSF9DTEtfTUQ9NgorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKQEAgLTIyNywxMSArMTk1LDExIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCiAjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAogIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCkBAIC0yMzksMTAgKzIwNywxMSBAQAogIwogQ09ORklHX0haXzEwMD15CiAjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTEwMAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfTk9ORT15CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKQEAgLTI1MiwyMyArMjIxLDE4IEBACiAjCiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCi0jIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAogIwogCiAjCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLQotIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9GTEFUPXkKQEAgLTI3NywxMSArMjQxLDYgQEAKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTI4OSw3ICsyNDgsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VTklYIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldApAQCAtMzE0LDI1ICsyNzIsMTQgQEAKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNTgsNyArMzA1LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNzUsMTAgKzMzMSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQpAQCAtMzkzLDYgKzM0NSw3IEBACiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCiAjCiBDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKIENPTkZJR19NVERfQkxPQ0s9eQogIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GVEwgaXMgbm90IHNldApAQCAtNDI0LDcgKzM3Nyw2IEBACiAjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAogCiAjCiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKQEAgLTQ1MiwxNiArNDA0LDEzIEBACiAjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKICMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKIAogIwotIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcwogIwotIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CiAKICMKICMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CkBAIC00NzEsNiArNDIwLDcgQEAKICMKICMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CiAjCisjIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKIAogIwogIyBCbG9jayBkZXZpY2VzCkBAIC00NzksMTggKzQyOSwxMyBAQAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk5LDEwICs0NDQsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC01MTEsMTkgKzQ1Miw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTMxLDEwICs0NTksNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU0NCwyNyArNDY4LDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MDQsNiArNTE1LDcgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjM5LDI5ICs1NTEsMTUgQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3NCwyNyArNTcyLDMwIEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIwotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfREFCPXkKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzAzLDYgKzYwNCwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldApAQCAtNzE3LDEwICs2MjQsNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMiw3ICs3MDUsNiBAQAogQ09ORklHX1BST0NfU1lTQ1RMPXkKICMgQ09ORklHX1NZU0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKIApAQCAtODE2LDcgKzcxOCw2IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CkBAIC04NDksNiArNzUwLDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKQEAgLTg2MSwxNCArNzY3LDExIEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04ODMsOCArNzg2LDEzIEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwppbmRleCAyMGFjN2Y0Li4zYTNjM2MxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTY6MzU6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjQzOjA2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTMxLDggKzM1LDEwIEBACiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CkBAIC00NSwxMiArNTEsMTcgQEAKICMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotQ09ORklHX1NMQUI9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKICMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0xCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtODAsNTIgKzkxLDkgQEAKICMKICMgU3lzdGVtIHR5cGUKICMKLSMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIMj15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTk9eQotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzMywxMCArMTAxLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0NSwzMiArMTEwLDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODAsMzQgKzE0MSw0MSBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfV1JJVEVUSFJPVUdIPXkKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19TSF9GUFUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfRlBVX0VNVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiAKICMKLSMgVGltZXIgc3VwcG9ydAorIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU09MVVRJT05fRU5HSU5FPXkKK0NPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9DTVQ9eQogQ09ORklHX1NIX1RJTUVSX0lSUT04NgotIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfUENMS19GUkVRPTMxMjUwMDAwCiBDT05GSUdfU0hfQ0xLX01EPTUKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMjIsMTEgKzE5MCwxMSBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIwogIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycwogIworIyBDT05GSUdfSEVBUlRCRUFUIGlzIG5vdCBzZXQKICMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKIAogIwpAQCAtMjM0LDEwICsyMDIsMTEgQEAKICMKIENPTkZJR19IWl8xMDA9eQogIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0xMDAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX05PTkU9eQogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkBAIC0yNDcsMjMgKzIxNiwxOCBAQAogIwogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAotIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRkxBVD15CkBAIC0yNzIsMTEgKzIzNiw2IEBACiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKQEAgLTI5NSwxMCArMjU0LDYgQEAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKQEAgLTMxMyw2ICsyNjgsNyBAQAogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwogIwogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0JMT0NLPXkKICMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKQEAgLTM0NCw3ICszMDAsNiBAQAogIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKIAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCkBAIC0zNzIsMTYgKzMyNywxMyBAQAogIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKLSMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKLSMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogCiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydApAQCAtMzkxLDYgKzM0Myw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtMzk4LDE3ICszNTEsMTIgQEAKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTQxNywxMCArMzY1LDYgQEAKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKIAogIwpAQCAtNDI5LDE5ICszNzMsNiBAQAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogCiAjCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCiAjIElTRE4gc3Vic3lzdGVtCiAjCiAKQEAgLTQ3MSw2ICs0MDIsNyBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCkBAIC01MDYsMjkgKzQzOCwxNSBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwpAQCAtNTQxLDI2ICs0NTksMjkgQEAKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCi0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIworQ09ORklHX0RBQj15CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU2OSw2ICs0OTAsMTIgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCiAjIFVTQiBzdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKQEAgLTU4MywxMCArNTEwLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC02NjgsNyArNTkxLDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiAjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAKQEAgLTY4Miw3ICs2MDQsNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldApAQCAtNzE1LDE0ICs2MzYsMTEgQEAKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTczNyw4ICs2NTUsMTMgQEAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCmluZGV4IGNhNGM2NjMuLjc2NGI4MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjNwotIyBGcmkgQXByIDI3IDE2OjMwOjMwIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgV2VkIEp1biAyMCAxODowODowNCAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19OVU1BPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApAQCAtNDMsNiArNDUsNyBAQAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CkBAIC02MCwxNCArNjMsMjAgQEAKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC0xMDMsNTcgKzExMiwxMiBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotQ09ORklHX1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hJR0hMQU5ERVIgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xCT1hfUkUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0g0PXkKIENPTkZJR19DUFVfU0g0QT15CiBDT05GSUdfQ1BVX1NINEFMX0RTUD15CiBDT05GSUdfQ1BVX1NIWDI9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTE2MiwxMCArMTI2LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldApAQCAtMTc0LDIzICsxMzQsMTEgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAotCi0jCi0jIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAotCi0jCi0jIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyPXkKQEAgLTE5OCwxNSArMTQ2LDIxIEBACiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKICMKK0NPTkZJR19RVUlDS0xJU1Q9eQogQ09ORklHX01NVT15CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAotIyBDT05GSUdfMzJCSVQgaXMgbm90IHNldAogIyBDT05GSUdfWDJUTEIgaXMgbm90IHNldAogQ09ORklHX1ZTWVNDQUxMPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19OVU1BPXkKK0NPTkZJR19OT0RFU19TSElGVD0xCitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MgogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE2LDI2ICsxNzAsMjUgQEAKICMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9eQorQ09ORklHX1NQQVJTRU1FTT15CitDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUz15CitDT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CisjIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX01JR1JBVElPTj15CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCiAjCiAjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfRU5BQkxFUj15Ci0jIENPTkZJR19DRl9BUkVBNSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfQVJFQTY9eQotQ09ORklHX0NGX0JBU0VfQUREUj0weGI4MDAwMDAwCiAKICMKICMgUHJvY2Vzc29yIGZlYXR1cmVzCkBAIC0yNTIsMTIgKzIwNSwyMCBAQAogQ09ORklHX0NQVV9IQVNfUFRFQT15CiAKICMKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NPTFVUSU9OX0VOR0lORT15CitDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkU9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MTYKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjcyLDcgKzIzMyw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yOTAsNyArMjUwLDYgQEAKIENPTkZJR19IWj0yNTAKIENPTkZJR19LRVhFQz15CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQpAQCAtMzA3LDcgKzI2NiwxMSBAQAogIwogIyBCdXMgb3B0aW9ucwogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19DRl9FTkFCTEVSPXkKKyMgQ09ORklHX0NGX0FSRUE1IGlzIG5vdCBzZXQKK0NPTkZJR19DRl9BUkVBNj15CitDT05GSUdfQ0ZfQkFTRV9BRERSPTB4YjgwMDAwMDAKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0zMTUsMjIgKzI3OCwxMiBAQAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTMzOCw3ICsyOTEsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKIENPTkZJR19VTklYPXkKQEAgLTM3NSwyMCArMzI3LDggQEAKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDE0LDcgKzM1NCwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtNDMyLDEwICszODEsNiBAQAogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCiAjCiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKICMgQ09ORklHX01URCBpcyBub3Qgc2V0CiAKICMKQEAgLTQ2NCwxMCArNDA5LDcgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk2LDYgKzQzOCw3IEBACiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCiAKICMKICMgU0NTSSBUcmFuc3BvcnRzCkBAIC01MTEsMTAgKzQ1NCw2IEBACiAjCiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiBDT05GSUdfUEFUQV9QTEFURk9STT15CkBAIC01MjUsMTkgKzQ2NCw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTQ1LDEwICs0NzEsNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU1OCwyNyArNDgwLDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MjcsNiArNTM2LDcgQEAKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjY3LDE0ICs1NzcsOCBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIApAQCAtNjgyLDEwICs1ODYsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY5OCwxNiArNTk4LDE1IEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCkBAIC03MTksMTYgKzYxOCwxOSBAQAogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzU3LDEwICs2NTksNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMCwxOCArNjk4LDMwIEBACiBDT05GSUdfUlRDX0lOVEZfUFJPQz15CiBDT05GSUdfUlRDX0lOVEZfREVWPXkKICMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIFJUQyBkcml2ZXJzCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0RSVl9TSD15Ci0jIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisKKyMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CiAjCiAjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKQEAgLTgyNSwxNCArNzM1LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTkzNywyMyArODM5LDI0IEBACiAjCiAjIFByb2ZpbGluZyBzdXBwb3J0CiAjCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEtfVElNRT15CiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAorQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKIAogIwpAQCAtOTczLDggKzg3NiwxMCBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19QTElTVD15CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTliYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzU2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFdlZCBKdW4gMjAgMTQ6MDk6MjcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgorCisjCisjIFN5c3RlbSB0eXBlCisjCitDT05GSUdfQ1BVX1NIND15CitDT05GSUdfQ1BVX1NINEE9eQorQ09ORklHX0NQVV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1FVSUNLTElTVD15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0Sz15CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yNTZLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQiBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9EU1A9eQorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRPXkKK0NPTkZJR19DUFVfSEFTX1NSX1JCPXkKKworIworIyBCb2FyZCBzdXBwb3J0CisjCisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgorQ09ORklHX1NIX1BDTEtfRlJFUT01MDAwMDAwMAorQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19IRUFSVEJFQVQ9eQorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19QUkVFTVBUX0JLTD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCisjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCBpcD0xOTIuMTY4LjEuMjo6OjI1NS4yNTUuMjU1LjAgcm9vdD0vZGV2L25mcyBuZnNyb290PTE5Mi4xNjguMS4xOi9leHBvcnRzL2RldmVsL3Jmcy9tb2JpbGVyIG5vYWxpZW5jYWNoZSBlYXJseXByaW50az1iaW9zIGlnbm9yZV9sb2dsZXZlbCIKKworIworIyBCdXMgb3B0aW9ucworIworIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfUEFUQV9QTEFURk9STT15CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIEhJRCBEZXZpY2VzCisjCisjIENPTkZJR19ISUQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQkZTPXkKK0NPTkZJR19IVUdFVExCX1BBR0U9eQorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19QUklOVEtfVElNRT15CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CitDT05GSUdfREVCVUdfU0xBQl9MRUFLPXkKK0NPTkZJR19ERUJVR19QUkVFTVBUPXkKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CitDT05GSUdfREVCVUdfTVVURVhFUz15CitDT05GSUdfREVCVUdfTE9DS19BTExPQz15CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLREVQPXkKK0NPTkZJR19ERUJVR19MT0NLREVQPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZNPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKK0NPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CisjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCA5OTkzNWY5Li4zMzM4OTgwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0zNiwyMyArMzYsNiBAQAogCSAgc3VwcG9ydC4gU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIHZhbHVlIGFsbG93cyBmb3IgY2FzY2FkaW5nIERNQUNzCiAJICB3aXRoIGFkZGl0aW9uYWwgY2hhbm5lbHMuCiAKLWNvbmZpZyBETUFfUEFHRV9PUFMKLQlib29sICJVc2UgRE1BQyBmb3IgcGFnZSBjb3B5L2NsZWFyIgotCWRlcGVuZHMgb24gU0hfRE1BICYmIEJST0tFTgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHVzZSBhIGR1YWwtYWRkcmVzcyBtb2RlIGNvbmZpZ3VyZWQgY2hhbm5lbAotCSAgaW4gdGhlIFNIIERNQUMgZm9yIGNvcHlfcGFnZSgpL2NsZWFyX3BhZ2UoKS4gUHJpbWFyaWx5IGEgcGVyZm9ybWFuY2UKLQkgIGhhY2suCi0KLWNvbmZpZyBETUFfUEFHRV9PUFNfQ0hBTk5FTAotCWRlcGVuZHMgb24gRE1BX1BBR0VfT1BTCi0JaW50ICJETUEgY2hhbm5lbCBmb3Igc2ggbWVtb3J5LW1hbmFnZXIgcGFnZSBjb3B5L2NsZWFyIgotCWRlZmF1bHQgIjMiCi0JaGVscAotCSAgVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGR1YWwgYWRkcmVzcyBkbWEgY2hhbm5lbCwKLQkgIGluIGNhc2UgY2hhbm5lbCAzIGlzIHVuYXZhaWxhYmxlLiBPbiB0aGUgU0g0LCBjaGFubmVscyAxLDIsIGFuZCAzCi0JICBhcmUgZHVhbC1hZGRyZXNzIGNhcGFibGUuCi0KIGNvbmZpZyBTSF9ETUFCUkcKIAlib29sICJTSDc3NjAgRE1BQlJHIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCA2ZDFjYmJlLi5mYmM2ZjJjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFBDSQogCWJvb2wgIlBDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX1BDSQogCWhlbHAKIAkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCiAJICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCmluZGV4IDkxMDRiNjIuLjFmMTQxYTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCkBAIC00LDEwICs0LDkgQEAKIAogZXh0cmEteQk6PSBoZWFkLm8gaW5pdF90YXNrLm8gdm1saW51eC5sZHMKIAotb2JqLXkJOj0gcHJvY2Vzcy5vIHNpZ25hbC5vIHRyYXBzLm8gaXJxLm8gXAotCXB0cmFjZS5vIHNldHVwLm8gdGltZS5vIHN5c19zaC5vIHNlbWFwaG9yZS5vIFwKLQlpby5vIGlvX2dlbmVyaWMubyBzaF9rc3ltcy5vIHN5c2NhbGxzLm8gXAotCWRlYnVndHJhcHMubworb2JqLXkJOj0gZGVidWd0cmFwcy5vIGlvLm8gaW9fZ2VuZXJpYy5vIGlycS5vIG1hY2h2ZWMubyBwcm9jZXNzLm8gcHRyYWNlLm8gXAorCSAgIHNlbWFwaG9yZS5vIHNldHVwLm8gc2lnbmFsLm8gc3lzX3NoLm8gc3lzY2FsbHMubyBcCisJICAgdGltZS5vIHRvcG9sb2d5Lm8gdHJhcHMubwogCiBvYmoteQkJCQkrPSBjcHUvIHRpbWVycy8KIG9iai0kKENPTkZJR19WU1lTQ0FMTCkJCSs9IHZzeXNjYWxsLwpAQCAtMTcsNyArMTYsNyBAQAogb2JqLSQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpCSs9IHNoX2Jpb3Mubwogb2JqLSQoQ09ORklHX1NIX0tHREIpCQkrPSBrZ2RiX3N0dWIubyBrZ2RiX2ptcC5vCiBvYmotJChDT05GSUdfU0hfQ1BVX0ZSRVEpCSs9IGNwdWZyZXEubwotb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubworb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBzaF9rc3ltcy5vIG1vZHVsZS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vCiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMgYi9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMKaW5kZXggZWJjNzNiOC4uMWMzYjk5NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY2YtZW5hYmxlci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NmLWVuYWJsZXIuYwpAQCAtNzUsMTEgKzc1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQogCWFsbG9jYXRlX2NmX2FyZWEoKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi0JLyogVGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlYWNoIGJvYXJkJ3MgaW5pdF94eHhfaXJxLiAqLwotCW1ha2VfaW1hc2tfaXJxKDE0KTsKLQlkaXNhYmxlX2lycSgxNCk7Ci0jZW5kaWYKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwppbmRleCA2NDUxYWQ2Li45MTcyZTk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKQEAgLTIxLDggKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotCi1leHRlcm4gdm9pZCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCk7CisjaW5jbHVkZSA8YXNtL3ViYy5oPgogCiAvKgogICogR2VuZXJpYyB3cmFwcGVyIGZvciBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGRpc2FibGUgb24tY2hpcApAQCAtMTUyLDE1ICsxNTEsNiBAQAogCWZsYWdzIHw9IENDUl9DQUNIRV9DQjsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NIX09DUkFNCi0JLyogVHVybiBvbiBPQ1JBTSAtLSBoYWx2ZSB0aGUgT0MgKi8KLQlmbGFncyB8PSBDQ1JfQ0FDSEVfT1JBOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgPj49IDE7Ci0KLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfc2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgKgotCQkJCSAgICBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3o7Ci0jZW5kaWYKLQogCWN0cmxfb3V0bChmbGFncywgQ0NSKTsKIAliYWNrX3RvX1AxKCk7CiB9CkBAIC0yNjksNyArMjU5LDYgQEAKIAl9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19VQkNfV0FLRVVQCiAJLyoKIAkgKiBTb21lIGJyYWluLWRhbWFnZWQgbG9hZGVycyBkZWNpZGVkIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIHB1dAogCSAqIHRoZSBVQkMgdG8gc2xlZXAuIFRoaXMgY2F1c2VzIHNvbWUgaXNzdWVzIHdoZW4gaXQgY29tZXMgdG8gdGhpbmdzCkBAIC0yNzcsNyArMjY2LDUgQEAKIAkgKiB3ZSB3YWtlIGl0IHVwIGFuZCBob3BlIHRoYXQgYWxsIGlzIHdlbGwuCiAJICovCiAJdWJjX3dha2V1cCgpOwotI2VuZGlmCi0KIAlzcGVjdWxhdGl2ZV9leGVjdXRpb25faW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCmluZGV4IGQ4ZTIyZjQuLmNjNTIyMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKQEAgLTEzLDM2ICsxMywzMSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmUwODAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHg0MCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHg2MCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmZkNDAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHgzOCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHgzYykKLSNlbmRpZgorc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50YzJfZGVzYyAqZ2V0X2ludGMyX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGludGMyX2Rlc2MsIGNoaXApKTsKK30KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0sgKyBwLT5tc2tfb2Zmc2V0KTsKKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CisKKwljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIGQtPm1za19iYXNlICsgcC0+bXNrX29mZnNldCArCisJCQkJICAgICAoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgKiA0KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0tDTFIgKyBwLT5tc2tfb2Zmc2V0KTsKLX0KKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW50YzJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklOVEMyIiwKLQkubWFzawkJPSBkaXNhYmxlX2ludGMyX2lycSwKLQkudW5tYXNrCQk9IGVuYWJsZV9pbnRjMl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pbnRjMl9pcnEsCi19OworCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwgZC0+bXNrY2xyX2Jhc2UgKyBwLT5tc2tfb2Zmc2V0ICsKKwkJCQkgICAgIChoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSAqIDQpKTsKK30KIAogLyoKICAqIFNldHVwIGFuIElOVEMyIHN0eWxlIGludGVycnVwdC4KQEAgLTU2LDMwICs1MSwzNiBAQAogICoKICAqIGluIHRoZSBpbnRjMl9kYXRhIHRhYmxlLgogICovCi12b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCit2b2lkIHJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoc3RydWN0IGludGMyX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJZGVzYy0+Y2hpcC5tYXNrID0gZGlzYWJsZV9pbnRjMl9pcnE7CisJZGVzYy0+Y2hpcC51bm1hc2sgPSBlbmFibGVfaW50YzJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2ludGMyX2lycTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBpcHIsIGZsYWdzOwotCQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IHRhYmxlICsgaTsKKwkJc3RydWN0IGludGMyX2RhdGEgKnAgPSBkZXNjLT5pbnRjMl9kYXRhICsgaTsKIAogCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKIAotCQkvKiBTZXQgdGhlIHByaW9yaXR5IGxldmVsICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYgKGRlc2MtPnByaW9fYmFzZSkgeworCQkJLyogU2V0IHRoZSBwcmlvcml0eSBsZXZlbCAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JCWlwciA9IGN0cmxfaW5sKElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKLQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7Ci0JCWlwciB8PSBwLT5wcmlvcml0eSA8PCBwLT5pcHJfc2hpZnQ7Ci0JCWN0cmxfb3V0bChpcHIsIElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKKwkJCWlwciA9IGN0cmxfaW5sKGRlc2MtPnByaW9fYmFzZSArIHAtPmlwcl9vZmZzZXQpOworCQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7CisJCQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OworCQkJY3RybF9vdXRsKGlwciwgZGVzYy0+cHJpb19iYXNlICsgcC0+aXByX29mZnNldCk7CiAKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CiAKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmaW50YzJfaXJxX2NoaXAsCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHAtPmlycSwgJmRlc2MtPmNoaXAsCiAJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwogCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOwogCi0JCWVuYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKKwkJZGlzYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwppbmRleCAyMTAyODBiLi45OGU4NGY0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKQEAgLTIyLDU4ICsyMiw1NyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwcl9kZXNjICpnZXRfaXByX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGlwcl9kZXNjLCBjaGlwKSk7Cit9CisKIHN0YXRpYyB2b2lkIGRpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X2lwcl9kZXNjKGlycSktPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdOwogCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF9pcHJfZGVzYyhpcnEpLT5pcHJfb2Zmc2V0c1twLT5pcHJfaWR4XTsKIAkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBhZGRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcHJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklQUiIsCi0JLm1hc2sJCT0gZGlzYWJsZV9pcHJfaXJxLAotCS51bm1hc2sJCT0gZW5hYmxlX2lwcl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pcHJfaXJxLAotfTsKKy8qCisgKiBUaGUgc2hpZnQgdmFsdWUgaXMgbm93IHRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCwgbm90IHRoZSBudW1iZXIgb2YKKyAqIGJpdHMvNC4gVGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZQorICogZGF0YXNoZWV0cy4gVGhlIElQUiBhZGRyZXNzIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGlwcl9vZmZzZXQgdGFibGUuCisgKi8KIAotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCXJldHVybiAwOwotfQotCi12b2lkIG1ha2VfaXByX2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKK3ZvaWQgcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoc3RydWN0IGlwcl9kZXNjICpkZXNjKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOworCWRlc2MtPmNoaXAubWFzayA9IGRpc2FibGVfaXByX2lycTsKKwlkZXNjLT5jaGlwLnVubWFzayA9IGVuYWJsZV9pcHJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2lwcl9pcnE7CiAKLQkJaWYgKCFpcnEpCi0JCQlpcnEgPSB0YWJsZVtpXS5pcnEgPSBpOworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKKwkJc3RydWN0IGlwcl9kYXRhICpwID0gZGVzYy0+aXByX2RhdGEgKyBpOwogCi0JCS8qIGNvdWxkIHRoZSBJUFIgaW5kZXggYmUgbWFwcGVkLCBpZiBub3Qgd2UgaWdub3JlIHRoaXMgKi8KLQkJaWYgKCF0YWJsZVtpXS5hZGRyKSB7Ci0JCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOwotCQkJaWYgKCF0YWJsZVtpXS5hZGRyKQotCQkJCWNvbnRpbnVlOwotCQl9CisJCUJVR19PTihwLT5pcHJfaWR4ID49IGRlc2MtPm5yX29mZnNldHMpOworCQlCVUdfT04oIWRlc2MtPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdKTsKIAotCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaXByX2lycV9jaGlwLAorCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmZGVzYy0+Y2hpcCwKIAkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKLQkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCAmdGFibGVbaV0pOwotCQllbmFibGVfaXByX2lycShpcnEpOworCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOworCQlkaXNhYmxlX2lwcl9pcnEocC0+aXJxKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKG1ha2VfaXByX2lycSk7CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIpOwogCiAjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9IQVNfUElOVF9JUlEpCiBpbnQgaXByX2lycV9kZW11eChpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TCmluZGV4IGMxNmRjOGYuLmVlOGYxZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2VudHJ5LlMKQEAgLTMxMSw2ICszMTEsNyBAQAogCXJ0ZQogCSBub3AKIAorCS5hbGlnbiAyCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiAxOiAgICAgLmxvbmcgICB0cmFjZV9oYXJkaXJxc19vZmYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCmluZGV4IDEwOGU4MWIuLmFiYmYxNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKQEAgLTksMjMgKzksMTQgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogaW50IF9faW5pdCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0JY3VycmVudF9jcHVfZGF0YS50eXBlCQkJPSBDUFVfU0g3NjA0OwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMJCT0gNDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9ICgxPDwxMCk7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSA2NDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmZsYWdzCQk9IDA7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQogCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYxOTsKIAljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CiAJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKaW5kZXggZjgzZmY4YS4uMWExMDdmZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCkBAIC01Miw3ICs1Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzYxOV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc2MTlfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJeyA4NiwgMCwgIDQsIDIgfSwJLyogQ01JMCAqLwogCXsgODgsIDEsIDEyLCAzIH0sCS8qIFNDSUYwX0VSSSAqLwogCXsgODksIDEsIDEyLCAzIH0sCS8qIFNDSUYwX1JYSSAqLwpAQCAtNjgsNyArNjgsNyBAQAogCXsgOTksIDEsICA0LCAzIH0sCS8qIFNDSUYyX1RYSSAqLwogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0c1tdID0geworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKIAkweGY4MDgwMDAwLAkvKiBJUFJDICovCiAJMHhmODA4MDAwMiwJLyogSVBSRCAqLwogCTB4ZjgwODAwMDQsCS8qIElQUkUgKi8KQEAgLTc2LDE1ICs3NiwxOSBAQAogCTB4ZjgwODAwMDgsCS8qIElQUkcgKi8KIH07CiAKLS8qIGdpdmVuIHRoZSBJUFIgaW5kZXggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBJUFIgcmVnaXN0ZXIgKi8KLXVuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKLXsKLQlpZiAodW5saWtlbHkoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzYxOSIsCisJfSwKK307CiAKIHZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc2MTlfaXByX21hcCwgQVJSQVlfU0laRShzaDc2MTlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwppbmRleCA0ZWQ5MTEwLi5iNmUzYTYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogX19pbml0Y2FsbChzaDcyMDZfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3MjA2X2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCXsgMTQwLCAgNywgMTIsIDIgfSwJLyogQ01JMCAqLwogCXsgMTY0LCAgOCwgIDQsIDIgfSwJLyogTVRVMl9UR0kxQSAqLwogCXsgMjQwLCAxMywgMTIsIDMgfSwJLyogU0NJRjBfQlJJICovCkBAIC03OCw3ICs3OCw3IEBACiAJeyAyNTUsIDEzLCAgMCwgMyB9LAkvKiBTQ0lGM19UWEkgKi8KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CiAJMHhmZmZlMDgxOCwJLyogSVBSMDEgKi8KIAkweGZmZmUwODFhLAkvKiBJUFIwMiAqLwogCTAsCQkvKiB1bnVzZWQgKi8KQEAgLTk1LDE1ICs5NSwxOSBAQAogCTB4ZmZmZTBjMTAsCS8qIElQUjE0ICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDcyMDYiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3MjA2X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3MjA2X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUwppbmRleCBiMGI1OWQ0Li5kOGUxMjI5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCkBAIC0zNDAsOCArMzQwLDI3IEBACiBnZW5lcmFsX2V4Y2VwdGlvbjoKIAltb3YubAkxZiwgazIKIAltb3YubAkyZiwgazMKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMworCW1vdi5sCUBrMiwgazIKKworCSEgSXMgRVhQRVZUIGxhcmdlciB0aGFuIDB4ODAwPworCW1vdgkjMHg4LCBrMAorCXNobGw4CWswCisJY21wL2hzCWswLCBrMgorCWJmCTBmCisKKwkhIHRoZW4gYWRkIDB4NTgwIChrMiBpcyAweGQ4MCBvciAweGRhMCkKKwltb3YJIzB4NTgsIGswCisJc2hsbDIJazAKKwlzaGxsMglrMAorCWFkZAlrMCwgazIKKzA6CisJYnJhCWhhbmRsZV9leGNlcHRpb24KKwkgbm9wCisjZWxzZQogCWJyYQloYW5kbGVfZXhjZXB0aW9uCiAJIG1vdi5sCUBrMiwgazIKKyNlbmRpZgogCS5hbGlnbgkyCiAxOgkubG9uZwlFWFBFVlQKIDI6CS5sb25nCXJldF9mcm9tX2V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKaW5kZXggMTk4M2ZiNy4uYTU1YjhjZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCkBAIC00OCw3ICs0OCw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwNV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDVfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzAsMjUgKzcwLDI5IEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4RkZGRkZFRTIJLyogMDogSVBSQSAqLwotLAkweEZGRkZGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDAwMDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQwMDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MDAwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KKwkweEZGRkZGRUUyLAkvKiAwOiBJUFJBICovCisJMHhGRkZGRkVFNCwJLyogMTogSVBSQiAqLworCTB4QTQwMDAwMTYsCS8qIDI6IElQUkMgKi8KKwkweEE0MDAwMDE4LAkvKiAzOiBJUFJEICovCisJMHhBNDAwMDAxQSwJLyogNDogSVBSRSAqLworCTB4QTQwODAwMDAsCS8qIDU6IElQUkYgKi8KKwkweEE0MDgwMDAyLAkvKiA2OiBJUFJHICovCisJMHhBNDA4MDAwNCwJLyogNzogSVBSSCAqLwogfTsKIAotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKIAotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzA1IiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzcwNV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzcwNV9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYwppbmRleCBjN2Q3YzM1Li5kNzllYzBjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMKQEAgLTEyLDYgKzEyLDI2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPQl7CisJCS5zdGFydAk9IDB4ZmZmZmZlYzAsCisJCS5lbmQJPSAweGZmZmZmZWMwICsgMHgxZSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwlbMV0gPQl7CisJCS5zdGFydCAgPSAyMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPQl7CisJCS5zdGFydAk9IDIxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9CXsKKwkJLnN0YXJ0CT0gMjIsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZmZmZlODAsCkBAIC00MSw4ICs2MSwxNiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MDlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaV9kZXZpY2UsCisJJnJ0Y19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3MDlfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtNTIsMzIgKzgwLDY2IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwOV9kZXZpY2VzX3NldHVwKTsKIAotI2RlZmluZSBJUFJ4KEEsTikJLmFkZHI9QSwgLnNoaWZ0PU4KLSNkZWZpbmUgSVBSQShOKQlJUFJ4KDB4ZmZmZmZlZTJVTCxOKQotI2RlZmluZSBJUFJCKE4pCUlQUngoMHhmZmZmZmVlNFVMLE4pCi0jZGVmaW5lIElQUkMoTikJSVBSeCgweGE0MDAwMDE2VUwsTikKLSNkZWZpbmUgSVBSRChOKQlJUFJ4KDB4YTQwMDAwMThVTCxOKQotI2RlZmluZSBJUFJFKE4pCUlQUngoMHhhNDAwMDAxYVVMLE4pCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKKwl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KKwl7IDE3LCAwLCA4LCAgNCB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE4LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE5LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDIwLCAwLCAwLCAgMiB9LCAvKiBSVEMgQ1VJICovCisJeyAyMSwgMCwgMCwgIDIgfSwgLyogUlRDIENVSSAqLworCXsgMjIsIDAsIDAsICAyIH0sIC8qIFJUQyBDVUkgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDlfaXByX21hcFtdID0gewotCVsxNl0JCT0geyBJUFJBKDEyKSwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KLQlbMTddCQk9IHsgSVBSQSg4KSwgIDQgfSwgLyogVE1VIFRVTkkxICovCi0JWzE4IC4uLiAxOV0JPSB7IElQUkEoNCksICAxIH0sIC8qIFRNVSBUVU5JMSAqLwotCVsyMCAuLi4gMjJdCT0geyBJUFJBKDApLCAgMiB9LCAvKiBSVEMgQ1VJICovCi0JWzIzIC4uLiAyNl0JPSB7IElQUkIoNCksICAzIH0sIC8qIFNDSSAqLwotCVsyN10JCT0geyBJUFJCKDEyKSwgMiB9LCAvKiBXRFQgSVRJICovCi0JWzMyXQkJPSB7IElQUkMoMCksICAxIH0sIC8qIElSUSAwICovCi0JWzMzXQkJPSB7IElQUkMoNCksICAxIH0sIC8qIElSUSAxICovCi0JWzM0XQkJPSB7IElQUkMoOCksICAxIH0sIC8qIElSUSAyIEFQTSAqLwotCVszNV0JCT0geyBJUFJDKDEyKSwgMSB9LCAvKiBJUlEgMyBUT1VDSFNDUkVFTiAqLwotCVszNl0JCT0geyBJUFJEKDApLCAgMSB9LCAvKiBJUlEgNCAqLwotCVszN10JCT0geyBJUFJEKDQpLCAgMSB9LCAvKiBJUlEgNSAqLwotCVs0OCAuLi4gNTFdCT0geyBJUFJFKDEyKSwgNyB9LCAvKiBETUEgKi8KLQlbNTIgLi4uIDU1XQk9IHsgSVBSRSg4KSwgIDMgfSwgLyogSVJEQSAqLwotCVs1NiAuLi4gNTldCT0geyBJUFJFKDQpLCAgMyB9LCAvKiBTQ0lGICovCisJeyAyMywgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNCwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNSwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNiwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNywgMSwgMTIsIDMgfSwgLyogV0RUIElUSSAqLworCisJeyAzMiwgMiwgMCwgIDEgfSwgLyogSVJRIDAgKi8KKwl7IDMzLCAyLCA0LCAgMSB9LCAvKiBJUlEgMSAqLworCXsgMzQsIDIsIDgsICAxIH0sIC8qIElSUSAyIEFQTSAqLworCXsgMzUsIDIsIDEyLCAxIH0sIC8qIElSUSAzIFRPVUNIU0NSRUVOICovCisKKwl7IDM2LCAzLCAwLCAgMSB9LCAvKiBJUlEgNCAqLworCXsgMzcsIDMsIDQsICAxIH0sIC8qIElSUSA1ICovCisKKwl7IDQ4LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDQ5LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUwLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUxLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKworCXsgNTIsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKwl7IDUzLCA0LCA4LCAgMyB9LCAvKiBJUkRBICovCisJeyA1NCwgNCwgOCwgIDMgfSwgLyogSVJEQSAqLworCXsgNTUsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKworCXsgNTYsIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KKwl7IDU3LCA0LCA0LCAgMyB9LCAvKiBTQ0lGICovCisJeyA1OCwgNCwgNCwgIDMgfSwgLyogU0NJRiAqLworCXsgNTksIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KIH07CiAKLXZvaWQgX19pbml0IGluaXRfSVJRX2lwcigpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCTB4ZmZmZmZlZTIsCS8qIDA6IElQUkEgKi8KKwkweGZmZmZmZWU0LAkvKiAxOiBJUFJCICovCisJMHhhNDAwMDAxNiwJLyogMjogSVBSQyAqLworCTB4YTQwMDAwMTgsCS8qIDM6IElQUkQgKi8KKwkweGE0MDAwMDFhLAkvKiA0OiBJUFJFICovCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzcwOSIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc3MDlfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MDlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMKaW5kZXggNTE3NjBhNy4uZjQwZTZkYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcxMF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzgsMjYgKzc4LDMwIEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4QTQxNEZFRTIJLyogMDogSVBSQSAqLwotLAkweEE0MTRGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDE0MDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQxNDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MTQwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KLSwJMHhBNDA4MDAwNgkvKiA4OiBJUFJJICovCisJMHhBNDE0RkVFMiwJLyogMDogSVBSQSAqLworCTB4QTQxNEZFRTQsCS8qIDE6IElQUkIgKi8KKwkweEE0MTQwMDE2LAkvKiAyOiBJUFJDICovCisJMHhBNDE0MDAxOCwJLyogMzogSVBSRCAqLworCTB4QTQxNDAwMUEsCS8qIDQ6IElQUkUgKi8KKwkweEE0MDgwMDAwLAkvKiA1OiBJUFJGICovCisJMHhBNDA4MDAwMiwJLyogNjogSVBSRyAqLworCTB4QTQwODAwMDQsCS8qIDc6IElQUkggKi8KKwkweEE0MDgwMDA2LAkvKiA4OiBJUFJJICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pcHIoKQorCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MTAiLAorCX0sCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzEwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzEwX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCmluZGV4IDhhZGQxMGIuLmRhZGQ2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsMTEgQEAKIAogIyBDUFUgc3VidHlwZSBzZXR1cAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKQkrPSBzZXR1cC1zaDc3NTAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpCSs9IHNldHVwLXNoNzc1MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkJKz0gc2V0dXAtc2g3NzYwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQkrPSBzZXR1cC1zaDQtMjAyLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCmluZGV4IGZhYjJlYjAuLjY2YzNmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKQEAgLTE0MSw2ICsxNDEsMTQgQEAKIAkJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQl9CiAJCWJyZWFrOworCWNhc2UgMHg0MDAwOgkvKiAxc3QgY3V0ICovCisJY2FzZSAweDQwMDE6CS8qIDJuZCBjdXQgKi8KKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NIWDM7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKKwkJCQkJICBDUFVfSEFTX0xMU0M7CisJCWJyZWFrOwogCWNhc2UgMHg4MDAwOgogCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU1Q0MFJBOwogCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKaW5kZXggMDNiMTRjZi4uZGExNTNiYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzc1MF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsIDEyLCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtMTA2LDggKzEwNiwyNyBAQAogCXsgMzgsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1BRSAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzUwIiwKKwl9LAorfTsKKwogI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzUxX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZV9zaDc3NTFbXSA9IHsKIAl7IDQ0LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU0ICovCiAJeyA0NSwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNSAqLwogCXsgNDYsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTYgKi8KQEAgLTExOCwyMSArMTM3LDI2IEBACiAJLyp7IDcyLCBJTlRQUkkwMCwgIDgsID8gfSwqLyAvKiBUTVUzIFRVTkkgKi8KIAkvKnsgNzYsIElOVFBSSTAwLCAxMiwgPyB9LCovIC8qIFRNVTQgVFVOSSAqLwogfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2Nfc2g3NzUxID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlX3NoNzc1MSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZV9zaDc3NTEpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3NTEiLAorCX0sCit9OwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7Ci0JMHhmZmQwMDAwNFVMLAkvKiAwOiBJUFJBICovCi0JMHhmZmQwMDAwOFVMLAkvKiAxOiBJUFJCICovCi0JMHhmZmQwMDAwY1VMLAkvKiAyOiBJUFJDICovCi0JMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCi19OwotCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQlpZiAoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzY19zaDc3NTEpOworI2VuZGlmCiB9CiAKICNkZWZpbmUgSU5UQ19JQ1IJMHhmZmQwMDAwMFVMCkBAIC0xNDMsMTEgKzE2NywzIEBACiB7CiAJY3RybF9vdXR3KGN0cmxfaW53KElOVENfSUNSKSB8IElOVENfSUNSX0lSTE0sIElOVENfSUNSKTsKIH0KLQotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKLXsKLQltYWtlX2lwcl9pcnEoc2g3NzUwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzUwX2lwcl9tYXApKTsKLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCi0JbWFrZV9pcHJfaXJxKHNoNzc1MV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc1MV9pcHJfbWFwKSk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCmluZGV4IGI3YzcwMjguLjNkZjE2OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwpAQCAtOTYsNyArOTYsMjUgQEAKIAl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NjBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmUwODAwMDAsCisJLm1za19iYXNlCT0gMHhmZTA4MDA0MCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlMDgwMDYwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKK3sKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KIAl7IDE3LCAwLCAgOCwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KQEAgLTEzMywyMCArMTUxLDE5IEBACiAJMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQotewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKLX0KKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKIAotdm9pZCBfX2luaXQgIGluaXRfSVJRX2lwcih2b2lkKQorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzc2MF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc2MF9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCmluZGV4IGFiNzQyMmYuLjQwMDYyMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCSs9IHNldHVwLXNoNzMxODAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykJKz0gc2V0dXAtc2g3MzQzLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCSs9IHNldHVwLXNoNzcyMi5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJCSs9IHNldHVwLXNoeDMubwogCiAjIFByaW1hcnkgb24tY2hpcCBjbG9ja3MgKGNvbW1vbikKIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCTo9IGNsb2NrLXNoNzMxODAubwpAQCAtMTcsNSArMTgsNiBAQAogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQk6PSBjbG9jay1zaDc3ODUubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQk6PSBjbG9jay1zaDczNDMubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQk6PSBjbG9jay1zaDc3MjIubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJOj0gY2xvY2stc2h4My5vCiAKIG9iai15CSs9ICQoY2xvY2steSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMwYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2h4My5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaHgzLmMKKyAqCisgKiBTSC1YMyBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBSZW5lc2FzIFRlY2hub2xvZ3kgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9mcmVxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgaWZjX2Rpdmlzb3JzW10gPSB7IDEsIDIsIDQgLDYgfTsKK3N0YXRpYyBpbnQgYmZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDEsIDEsIDEsIDEyLCAxNiwgMTgsIDI0LCAzMiwgMzYsIDQ4IH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxOCwgMjQsIDMyLCAzNiwgNDggfTsKK3N0YXRpYyBpbnQgY2ZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDQsIDYgfTsKKworI2RlZmluZSBJRkNfUE9TCQkyOAorI2RlZmluZSBJRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX01TSwkJMHgwMDBmCisjZGVmaW5lIFBGQ19NU0sJCTB4MDAwZgorI2RlZmluZSBDRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX1BPUwkJMTYKKyNkZWZpbmUgUEZDX1BPUwkJMAorI2RlZmluZSBDRkNfUE9TCQkyMAorCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSAqPSBwZmNfZGl2aXNvcnNbKGN0cmxfaW5sKEZSUUNSKSA+PiBQRkNfUE9TKSAmIFBGQ19NU0tdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19tYXN0ZXJfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCit9OworCitzdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IFBGQ19QT1MpICYgUEZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gQkZDX1BPUykgJiBCRkNfTVNLKTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBJRkNfUE9TKSAmIElGQ19NU0spOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX2NwdV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoeDNfY2xrX29wc1tdID0geworCSZzaHgzX21hc3Rlcl9jbGtfb3BzLAorCSZzaHgzX21vZHVsZV9jbGtfb3BzLAorCSZzaHgzX2J1c19jbGtfb3BzLAorCSZzaHgzX2NwdV9jbGtfb3BzLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCit7CisJaWYgKGlkeCA8IEFSUkFZX1NJWkUoc2h4M19jbGtfb3BzKSkKKwkJKm9wcyA9IHNoeDNfY2xrX29wc1tpZHhdOworfQorCitzdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IENGQ19QT1MpICYgQ0ZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBjZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfc2h5d2F5X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBzaHl3YXlfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNoeDNfc2h5d2F5X2NsayA9IHsKKwkubmFtZQkJPSAic2h5d2F5X2NsayIsCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkub3BzCQk9ICZzaHgzX3NoeXdheV9jbGtfb3BzLAorfTsKKworLyoKKyAqIEFkZGl0aW9uYWwgU0h4My1zcGVjaWZpYyBvbi1jaGlwIGNsb2NrcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHBhcnQgb2YgdGhlCisgKiBjbG9jayBmcmFtZXdvcmsKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgKnNoeDNfb25jaGlwX2Nsb2Nrc1tdID0geworCSZzaHgzX3NoeXdheV9jbGssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaHgzX2Nsa19pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAibWFzdGVyX2NsayIpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2h4M19vbmNoaXBfY2xvY2tzKTsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsa3AgPSBzaHgzX29uY2hpcF9jbG9ja3NbaV07CisKKwkJY2xrcC0+cGFyZW50ID0gY2xrOworCQljbGtfcmVnaXN0ZXIoY2xrcCk7CisJCWNsa19lbmFibGUoY2xrcCk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bworCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKKwkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KKwkgKi8KKwljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7CisKKwljbGtfcHV0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoc2h4M19jbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCmluZGV4IDExNDNmYmYuLmEzZTE1OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFNINzcyMiBTZXR1cAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKQEAgLTQyLDcgKzQ0LDcgQEAKIH0KIF9faW5pdGNhbGwoc2g3NzIyX2RldmljZXNfc2V0dXApOwogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzcyMl9pcHJfbWFwW10gPSB7CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKIAkvKiBJUlEsIElQUi1pZHgsIHNoaWZ0LCBwcmlvICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCAqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgKi8KQEAgLTY3LDE0ICs2OSwyNSBAQAogCTB4YTQwODAwMmMsIC8qIDExOiBJUFJMICovCiB9OwogCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MjIiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzIyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzIyX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKK30KKwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKK3sKKwkvKiBSZWdpc3RlciB0aGUgVVJBTSBzcGFjZSBhcyBOb2RlIDEgKi8KKwlzZXR1cF9ib290bWVtX25vZGUoMSwgMHgwNTVmMDAwMCwgMHgwNTYxMDAwMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCmluZGV4IDlhZWFhMmQuLmI1N2M3NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCkBAIC0xMDIsNyArMTAyLDIwIEBACiAJeyA2OCwgMHgxNCwgIDgsIDAsIDE4LCAyIH0sCS8qIFBDSUM0ICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMHhmZmQ0MDAwMCwKKwkubXNrX2Jhc2UJPSAweGZmZDQwMDM4LAorCS5tc2tjbHJfYmFzZQk9IDB4ZmZkNDAwM2MsCisKKwkuaW50YzJfZGF0YQk9IGludGMyX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJTlRDMi1zaDc3ODAiLAorCX0sCit9OworCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQogewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCmluZGV4IDA3YjBkZTguLmNlMTBlYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCkBAIC05Nyw3ICs5NywyMSBAQAogCXsgNjAsIDEyLCAxNiwgMCwgNywgMyB9LAkvKiBTQ0lGNSBFUkksIFJYSSwgQlJJLCBUWEkgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGVzYyBpbnRjMl9pcnFfZGVzYyBfX3JlYWRfbW9zdGx5ID0geworCS5wcmlvX2Jhc2UJPSAweGZmZDQwMDAwLAorCS5tc2tfYmFzZQk9IDB4ZmZkNDAwMzgsCisJLm1za2Nscl9iYXNlCT0gMHhmZmQ0MDAzYywKKworCS5pbnRjMl9kYXRhCT0gaW50YzJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklOVEMyLXNoNzc4NSIsCisJfSwKK307CisKIHZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCiB7Ci0JbWFrZV9pbnRjMl9pcnEoaW50YzJfaXJxX3RhYmxlLCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSkpOworCXJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoJmludGMyX2lycV9kZXNjKTsKIH0KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjgzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaHgzLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIFNILVgzIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NjaS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gMHhmZmMzMDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM0MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDQsIDQ1LCA0NywgNDYgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM1MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDgsIDQ5LCA1MSwgNTAgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM2MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNTIsIDUzLCA1NSwgNTQgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaHgzX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2h4M19kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoeDNfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaHgzX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2h4M19kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kYXRhIGludGMyX2lycV90YWJsZVtdID0geworCXsgMTYsIDAsIDAsIDAsIDEsIDIgfSwJCS8qIFRNVTAgKi8KKwl7IDQwLCA0LCAwLCAweDIwLCAwLCAzIH0sCS8qIFNDSUYwIEVSSSAqLworCXsgNDEsIDQsIDAsIDB4MjAsIDEsIDMgfSwJLyogU0NJRjAgUlhJICovCisJeyA0MiwgNCwgMCwgMHgyMCwgMiwgMyB9LAkvKiBTQ0lGMCBCUkkgKi8KKwl7IDQzLCA0LCAwLCAweDIwLCAzLCAzIH0sCS8qIFNDSUYwIFRYSSAqLworfTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmU0MTAwMDAsCisJLm1za19iYXNlCT0gMHhmZTQxMDgyMCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlNDEwODUwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItU0hYMyIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCit7CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCAyN2I5MjNjLi4yNzg5Nzc5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMTU4LDE1ICsxNTgsMTEgQEAKIH0KIAogI2lmZGVmIENPTkZJR180S1NUQUNLUwotLyoKLSAqIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikgYXMgd2VsbCwgYnV0Ci0gKiBnY2MncyAzLjAgYW5kIGVhcmxpZXIgZG9uJ3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgotICovCiBzdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KLQkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisJCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuYnNzLnBhZ2VfYWxpZ25lZCIpKSk7CiAKIHN0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQotCQlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKTsKKwkJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikpKTsKIAogLyoKICAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2h2ZWMuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL21hY2h2ZWMuYworICoKKyAqIFRoZSBTdXBlckggbWFjaGluZSB2ZWN0b3Igc2V0dXAgaGFuZGxlcnMsIHlhbmtlZCBmcm9tIHNldHVwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBNVl9OQU1FX1NJWkUgMzIKKworI2RlZmluZSBmb3JfZWFjaF9tdihtdikgXAorCWZvciAoKG12KSA9IChzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OyBcCisJICAgICAobXYpICYmICh1bnNpZ25lZCBsb25nKShtdikgPCAodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZDsgXAorCSAgICAgKG12KSsrKQorCitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12OworCisJZm9yX2VhY2hfbXYobXYpCisJCWlmIChzdHJjYXNlY21wKG5hbWUsIG12LT5tdl9uYW1lKSA9PSAwKQorCQkJcmV0dXJuIG12OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYWNodmVjX3NlbGVjdGVkOworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tdihjaGFyICpmcm9tKQoreworCWNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdID0gIiI7CisJY2hhciAqbXZfZW5kOworCWNoYXIgKm12X2NvbW1hOworCWludCBtdl9sZW47CisJc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdnA7CisKKwltdl9lbmQgPSBzdHJjaHIoZnJvbSwgJyAnKTsKKwlpZiAobXZfZW5kID09IE5VTEwpCisJCW12X2VuZCA9IGZyb20gKyBzdHJsZW4oZnJvbSk7CisKKwltdl9jb21tYSA9IHN0cmNocihmcm9tLCAnLCcpOworCW12X2xlbiA9IG12X2VuZCAtIGZyb207CisJaWYgKG12X2xlbiA+IChNVl9OQU1FX1NJWkUtMSkpCisJCW12X2xlbiA9IE1WX05BTUVfU0laRS0xOworCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOworCW12X25hbWVbbXZfbGVuXSA9ICdcMCc7CisJZnJvbSA9IG12X2VuZDsKKworCW1hY2h2ZWNfc2VsZWN0ZWQgPSAxOworCisJLyogQm9vdCB3aXRoIHRoZSBnZW5lcmljIHZlY3RvciAqLworCWlmIChzdHJjbXAobXZfbmFtZSwgImdlbmVyaWMiKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW12cCA9IGdldF9tdl9ieW5hbWUobXZfbmFtZSk7CisJaWYgKHVubGlrZWx5KCFtdnApKSB7CisJCXByaW50aygiQXZhaWxhYmxlIHZlY3RvcnM6XG5cblx0JyVzJywgIiwgc2hfbXYubXZfbmFtZSk7CisJCWZvcl9lYWNoX212KG12cCkKKwkJCXByaW50aygiJyVzJywgIiwgbXZwLT5tdl9uYW1lKTsKKwkJcHJpbnRrKCJcblxuIik7CisJCXBhbmljKCJGYWlsZWQgdG8gc2VsZWN0IG1hY2h2ZWMgJyVzJyAtLSBoYWx0aW5nLlxuIiwKKwkJICAgICAgbXZfbmFtZSk7CisJfSBlbHNlCisJCXNoX212ID0gKm12cDsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oInNoX212IiwgZWFybHlfcGFyc2VfbXYpOworCit2b2lkIF9faW5pdCBzaF9tdl9zZXR1cCh2b2lkKQoreworCS8qCisJICogT25seSBvdmVybG9hZCB0aGUgbWFjaHZlYyBpZiBvbmUgaGFzbid0IGJlZW4gc2VsZWN0ZWQgb24KKwkgKiB0aGUgY29tbWFuZCBsaW5lIHdpdGggc2hfbXY9CisJICovCisJaWYgKCFtYWNodmVjX3NlbGVjdGVkKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFjaHZlY19zaXplOworCisJCW1hY2h2ZWNfc2l6ZSA9ICgodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZCAtCisJCQkJKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCk7CisKKwkJLyoKKwkJICogSWYgdGhlIG1hY2h2ZWMgaGFzbid0IGJlZW4gcHJlc2VsZWN0ZWQsIHVzZSB0aGUgZmlyc3QKKwkJICogdmVjdG9yICh1c3VhbGx5IHRoZSBvbmx5IG9uZSkgZnJvbSAubWFjaHZlYy5pbml0LgorCQkgKi8KKwkJaWYgKG1hY2h2ZWNfc2l6ZSA+PSBzaXplb2Yoc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKSkKKwkJCXNoX212ID0gKihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OworCX0KKworCXByaW50ayhLRVJOX05PVElDRSAiQm9vdGluZyBtYWNodmVjOiAlc1xuIiwgZ2V0X3N5c3RlbV90eXBlKCkpOworCisJLyoKKwkgKiBNYW51YWxseSB3YWxrIHRoZSB2ZWMsIGZpbGwgaW4gYW55dGhpbmcgdGhhdCB0aGUgYm9hcmQgaGFzbid0IHlldAorCSAqIGJ5IGhhbmQsIHdyYXBwaW5nIHRvIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgorCSAqLworI2RlZmluZSBtdl9zZXQoZWxlbSkgZG8geyBcCisJaWYgKCFzaF9tdi5tdl8jI2VsZW0pIFwKKwkJc2hfbXYubXZfIyNlbGVtID0gZ2VuZXJpY18jI2VsZW07IFwKK30gd2hpbGUgKDApCisKKwltdl9zZXQoaW5iKTsJbXZfc2V0KGludyk7CW12X3NldChpbmwpOworCW12X3NldChvdXRiKTsJbXZfc2V0KG91dHcpOwltdl9zZXQob3V0bCk7CisKKwltdl9zZXQoaW5iX3ApOwltdl9zZXQoaW53X3ApOwltdl9zZXQoaW5sX3ApOworCW12X3NldChvdXRiX3ApOwltdl9zZXQob3V0d19wKTsJbXZfc2V0KG91dGxfcCk7CisKKwltdl9zZXQoaW5zYik7CW12X3NldChpbnN3KTsJbXZfc2V0KGluc2wpOworCW12X3NldChvdXRzYik7CW12X3NldChvdXRzdyk7CW12X3NldChvdXRzbCk7CisKKwltdl9zZXQocmVhZGIpOwltdl9zZXQocmVhZHcpOwltdl9zZXQocmVhZGwpOworCW12X3NldCh3cml0ZWIpOwltdl9zZXQod3JpdGV3KTsJbXZfc2V0KHdyaXRlbCk7CisKKwltdl9zZXQoaW9wb3J0X21hcCk7CisJbXZfc2V0KGlvcG9ydF91bm1hcCk7CisJbXZfc2V0KGlycV9kZW11eCk7CisKKwlpZiAoIXNoX212Lm12X25yX2lycXMpCisJCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGExMWUyYWEuLjYzMzRhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0zMTksOSArMzIwLDcgQEAKIAljdHJsX291dGwocGMsIFVCQ19CQVJBKTsKIAogI2lmZGVmIENPTkZJR19NTVUKLQkvKiBXZSBkb24ndCBoYXZlIGFueSBBU0lEIHNldHRpbmdzIGZvciB0aGUgU0gtMiEgKi8KLQlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlICE9IENQVV9TSDc2MDQpCi0JCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOworCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOwogI2VuZGlmCiAKIAljdHJsX291dGwoMCwgVUJDX0JBTVJBKTsKQEAgLTQwNSw4ICs0MDQsOCBAQAogCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCXN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAjaWZkZWYgQ09ORklHX01NVQorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5yZWdzWzE1XSwgcmVncywgMCwgTlVMTCwgTlVMTCk7CiAjZWxzZQogCS8qIGZvcmsgYWxtb3N0IHdvcmtzLCBlbm91Z2ggdG8gdHJpY2sgeW91IGludG8gbG9va2luZyBlbHNld2hlcmUgOi0oICovCkBAIC00NDksMjMgKzQ0OCwyMCBAQAogLyoKICAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgogICovCi1hc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgKnVmaWxlbmFtZSwgY2hhciAqKnVhcmd2LAotCQkJICBjaGFyICoqdWVudnAsIHVuc2lnbmVkIGxvbmcgcjcsCithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICp1ZmlsZW5hbWUsIGNoYXIgX191c2VyICogX191c2VyICp1YXJndiwKKwkJCSAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKnVlbnZwLCB1bnNpZ25lZCBsb25nIHI3LAogCQkJICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCWludCBlcnJvcjsKIAljaGFyICpmaWxlbmFtZTsKIAotCWZpbGVuYW1lID0gZ2V0bmFtZSgoY2hhciBfX3VzZXIgKil1ZmlsZW5hbWUpOworCWZpbGVuYW1lID0gZ2V0bmFtZSh1ZmlsZW5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CiAJaWYgKElTX0VSUihmaWxlbmFtZSkpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsCi0JCQkgIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKXVhcmd2LAotCQkJICAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKil1ZW52cCwKLQkJCSAgcmVncyk7CisJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIHVhcmd2LCB1ZW52cCwgcmVncyk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJdGFza19sb2NrKGN1cnJlbnQpOwogCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2ZiNWZjMC4uODkxZDFkNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKQEAgLTkxLDE3ICs5MSw4IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLQkJYnJlYWs7Ci0JfQorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xMjgsMTcgKzExOSwxNCBAQAogCQkJdG1wID0gISF0c2tfdXNlZF9tYXRoKGNoaWxkKTsKIAkJZWxzZQogCQkJdG1wID0gMDsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEpOwogCQlicmVhazsKIAl9CiAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMTk2LDcgKzE4NCw3IEBACiAKIAljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOiB7ICAvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KIAkJbG9uZyBwYzsKLQkJc3RydWN0IHB0X3JlZ3MgKmR1bW15ID0gTlVMTDsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBOVUxMOwogCiAJCXJldCA9IC1FSU87CiAJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQpAQCAtMjA3LDcgKzE5NSw3IEBACiAJCQljaGlsZC0+cHRyYWNlIHw9IFBUX0RUUkFDRTsKIAkJfQogCi0JCXBjID0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsIChsb25nKSZkdW1teS0+cGMpOworCQlwYyA9IGdldF9zdGFja19sb25nKGNoaWxkLCAobG9uZykmcmVncy0+cGMpOwogCiAJCS8qIE5leHQgc2NoZWR1bGluZyB3aWxsIHNldCB1cCBVQkMgKi8KIAkJaWYgKGNoaWxkLT50aHJlYWQudWJjX3BjID09IDApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCBjMjc3MjkxLi5kZThlNmUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00MSwyMCArNDIsMTkgQEAKICAqIFRoZSBiaWdnZXIgdmFsdWUgbWVhbnMgbm8gcHJvYmxlbS4KICAqLwogc3RydWN0IHNoX2NwdWluZm8gYm9vdF9jcHVfZGF0YSA9IHsgQ1BVX1NIX05PTkUsIDEwMDAwMDAwLCB9OworCisvKgorICogVGhlIG1hY2hpbmUgdmVjdG9yLiBGaXJzdCBlbnRyeSBpbiAubWFjaHZlYy5pbml0LCBvciBjbG9iYmVyZWQgYnkKKyAqIHNoX212PSBvbiB0aGUgY29tbWFuZCBsaW5lLCBwcmlvciB0byAubWFjaHZlYy5pbml0IHRlYXJkb3duLgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXYgPSB7IC5tdl9uYW1lID0gImdlbmVyaWMiLCB9OworCiAjaWZkZWYgQ09ORklHX1ZUCiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXY7Ci0jZW5kaWYKLQogZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7CiAKLSNkZWZpbmUgTVZfTkFNRV9TSVpFIDMyCi0KLXN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqIF9faW5pdCBnZXRfbXZfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotCiAvKgogICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCiAgKi8KQEAgLTgwLDEzMSArODAsMTcgQEAKIAogdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJzZV9jbWRsaW5lIChjaGFyICoqIGNtZGxpbmVfcCwgY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0sCi0JCQkJICBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqKiBtdnAsCi0JCQkJICB1bnNpZ25lZCBsb25nICptdl9pb19iYXNlKQorc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfbWVtKGNoYXIgKnApCiB7Ci0JY2hhciBjID0gJyAnLCAqdG8gPSBjb21tYW5kX2xpbmUsICpmcm9tID0gQ09NTUFORF9MSU5FOwotCWludCBsZW4gPSAwOwotCi0JLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLwotCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JYm9vdF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAnXDAnOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAogCW1lbW9yeV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKVBBR0VfT0ZGU0VUK19fTUVNT1JZX1NUQVJUOwotCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBfX01FTU9SWV9TSVpFOwotCi0JZm9yICg7OykgewotCQkvKgotCQkgKiAibWVtPVhYWFtrS21NXSIgZGVmaW5lcyBhIHNpemUgb2YgbWVtb3J5LgotCQkgKi8KLQkJaWYgKGMgPT0gJyAnICYmICFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkgewotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJewotCQkJCXVuc2lnbmVkIGxvbmcgbWVtX3NpemU7Ci0KLQkJCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGZyb20rNCwgJmZyb20pOwotCQkJCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBtZW1fc2l6ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJzaF9tdj0iLCA2KSkgewotCQkJY2hhciogbXZfZW5kOwotCQkJY2hhciogbXZfY29tbWE7Ci0JCQlpbnQgbXZfbGVuOwotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJZnJvbSArPSA2OwotCQkJbXZfZW5kID0gc3RyY2hyKGZyb20sICcgJyk7Ci0JCQlpZiAobXZfZW5kID09IE5VTEwpCi0JCQkJbXZfZW5kID0gZnJvbSArIHN0cmxlbihmcm9tKTsKLQotCQkJbXZfY29tbWEgPSBzdHJjaHIoZnJvbSwgJywnKTsKLQkJCWlmICgobXZfY29tbWEgIT0gTlVMTCkgJiYgKG12X2NvbW1hIDwgbXZfZW5kKSkgewotCQkJCWludCBpbnRzWzNdOwotCQkJCWdldF9vcHRpb25zKG12X2NvbW1hKzEsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQkJCSptdl9pb19iYXNlID0gaW50c1sxXTsKLQkJCQltdl9sZW4gPSBtdl9jb21tYSAtIGZyb207Ci0JCQl9IGVsc2UgewotCQkJCW12X2xlbiA9IG12X2VuZCAtIGZyb207Ci0JCQl9Ci0JCQlpZiAobXZfbGVuID4gKE1WX05BTUVfU0laRS0xKSkKLQkJCQltdl9sZW4gPSBNVl9OQU1FX1NJWkUtMTsKLQkJCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOwotCQkJbXZfbmFtZVttdl9sZW5dID0gJ1wwJzsKLQkJCWZyb20gPSBtdl9lbmQ7Ci0KLQkJCSptdnAgPSBnZXRfbXZfYnluYW1lKG12X25hbWUpOwotCQl9Ci0KLQkJYyA9ICooZnJvbSsrKTsKLQkJaWYgKCFjKQotCQkJYnJlYWs7Ci0JCWlmIChDT01NQU5EX0xJTkVfU0laRSA8PSArK2xlbikKLQkJCWJyZWFrOwotCQkqKHRvKyspID0gYzsKLQl9Ci0JKnRvID0gJ1wwJzsKLQkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9tdl9zZXR1cChjaGFyICoqY21kbGluZV9wKQotewotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JZXh0ZXJuIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl91bmtub3duOwotI2VuZGlmCi0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdiA9IE5VTEw7Ci0JY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0gPSAiIjsKLQl1bnNpZ25lZCBsb25nIG12X2lvX2Jhc2UgPSAwOwotCi0JcGFyc2VfY21kbGluZShjbWRsaW5lX3AsIG12X25hbWUsICZtdiwgJm12X2lvX2Jhc2UpOwotCi0jaWZkZWYgQ09ORklHX1NIX1VOS05PV04KLQlpZiAobXYgPT0gTlVMTCkgewotCQltdiA9ICZtdl91bmtub3duOwotCQlpZiAoKm12X25hbWUgIT0gJ1wwJykgewotCQkJcHJpbnRrKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBtYWNoaW5lICVzLCB1c2luZyB1bmtub3duXG4iLAotCQkJICAgICAgIG12X25hbWUpOwotCQl9Ci0JfQotCXNoX212ID0gKm12OwotI2VuZGlmCi0KLQkvKgotCSAqIE1hbnVhbGx5IHdhbGsgdGhlIHZlYywgZmlsbCBpbiBhbnl0aGluZyB0aGF0IHRoZSBib2FyZCBoYXNuJ3QgeWV0Ci0JICogYnkgaGFuZCwgd3JhcHBpbmcgdG8gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCi0JICovCi0jZGVmaW5lIG12X3NldChlbGVtKSBkbyB7IFwKLQlpZiAoIXNoX212Lm12XyMjZWxlbSkgXAotCQlzaF9tdi5tdl8jI2VsZW0gPSBnZW5lcmljXyMjZWxlbTsgXAotfSB3aGlsZSAoMCkKLQotCW12X3NldChpbmIpOwltdl9zZXQoaW53KTsJbXZfc2V0KGlubCk7Ci0JbXZfc2V0KG91dGIpOwltdl9zZXQob3V0dyk7CW12X3NldChvdXRsKTsKLQotCW12X3NldChpbmJfcCk7CW12X3NldChpbndfcCk7CW12X3NldChpbmxfcCk7Ci0JbXZfc2V0KG91dGJfcCk7CW12X3NldChvdXR3X3ApOwltdl9zZXQob3V0bF9wKTsKLQotCW12X3NldChpbnNiKTsJbXZfc2V0KGluc3cpOwltdl9zZXQoaW5zbCk7Ci0JbXZfc2V0KG91dHNiKTsJbXZfc2V0KG91dHN3KTsJbXZfc2V0KG91dHNsKTsKLQotCW12X3NldChyZWFkYik7CW12X3NldChyZWFkdyk7CW12X3NldChyZWFkbCk7Ci0JbXZfc2V0KHdyaXRlYik7CW12X3NldCh3cml0ZXcpOwltdl9zZXQod3JpdGVsKTsKLQotCW12X3NldChpb3BvcnRfbWFwKTsKLQltdl9zZXQoaW9wb3J0X3VubWFwKTsKLQltdl9zZXQoaXJxX2RlbXV4KTsKLQotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JX19zZXRfaW9fcG9ydF9iYXNlKG12X2lvX2Jhc2UpOwotI2VuZGlmCi0KLQlpZiAoIXNoX212Lm12X25yX2lycXMpCi0JCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworCXNpemUgPSBtZW1wYXJzZShwLCAmcCk7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIHNpemU7CiAKIAlyZXR1cm4gMDsKIH0KK2Vhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZV9tZW0pOwogCiAvKgogICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIGxvdyBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCkBAIC0yMzAsNyArMTE2LDcgQEAKIAlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoY3Vycl9wZm4pLCBQRk5fUEhZUyhwYWdlcykpOwogfQogCi12b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbikKK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHVuc2lnbmVkIGxvbmcgZnJlZV9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBib290bWFwX3NpemU7CiAKQEAgLTIzOSw5ICsxMjUsMTAgQEAKIAkgKiBib290c3RyYXAgc3RlcCBhbGwgYWxsb2NhdGlvbnMgKHVudGlsIHRoZSBwYWdlIGFsbG9jYXRvcgogCSAqIGlzIGludGFjdCkgbXVzdCBiZSBkb25lIHZpYSBib290bWVtX2FsbG9jKCkuCiAJICovCi0JYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBzdGFydF9wZm4sCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBmcmVlX3BmbiwKIAkJCQkJIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAKKwlhZGRfYWN0aXZlX3JhbmdlKDAsIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAJcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXMoKTsKIAogCW5vZGVfc2V0X29ubGluZSgwKTsKQEAgLTI1NCw3ICsxNDEsNyBAQAogCSAqIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCiAJcmVzZXJ2ZV9ib290bWVtKF9fTUVNT1JZX1NUQVJUK1BBR0VfU0laRSwKLQkJKFBGTl9QSFlTKHN0YXJ0X3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CisJCShQRk5fUEhZUyhmcmVlX3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CiAKIAkvKgogCSAqIHJlc2VydmUgcGh5c2ljYWwgcGFnZSAwIC0gaXQncyBhIHNwZWNpYWwgQklPUyBwYWdlIG9uIG1hbnkgYm94ZXMsCkBAIC0yNjIsNiArMTQ5LDggQEAKIAkgKi8KIAlyZXNlcnZlX2Jvb3RtZW0oX19NRU1PUllfU1RBUlQsIFBBR0VfU0laRSk7CiAKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKKwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCVJPT1RfREVWID0gTUtERVYoUkFNRElTS19NQUpPUiwgMCk7CiAJaWYgKCZfX3JkX3N0YXJ0ICE9ICZfX3JkX2VuZCkgewpAQCAtMzE1LDEwICsyMDQsNiBAQAogewogCWVuYWJsZV9tbXUoKTsKIAotI2lmZGVmIENPTkZJR19DTURMSU5FX0JPT0wKLQlzdHJjcHkoQ09NTUFORF9MSU5FLCBDT05GSUdfQ01ETElORSk7Ci0jZW5kaWYKLQogCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYoT1JJR19ST09UX0RFVik7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KQEAgLTMzOSw5ICsyMjQsMjIgQEAKIAlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKF9ldGV4dCk7CiAJZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2VkYXRhKS0xOwogCisJbWVtb3J5X3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpUEFHRV9PRkZTRVQrX19NRU1PUllfU1RBUlQ7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIF9fTUVNT1JZX1NJWkU7CisKKyNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCisJc3RybGNweShjb21tYW5kX2xpbmUsIENPTkZJR19DTURMSU5FLCBzaXplb2YoY29tbWFuZF9saW5lKSk7CisjZWxzZQorCXN0cmxjcHkoY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkUsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKKyNlbmRpZgorCisJLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLworCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKKwogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKLQlzaF9tdl9zZXR1cChjbWRsaW5lX3ApOworCXNoX212X3NldHVwKCk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKQEAgLTM1NSw4ICsyNTMsOSBAQAogCW1pbl9sb3dfcGZuID0gX19NRU1PUllfU1RBUlQgPj4gUEFHRV9TSElGVDsKIAogCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CisKKwkvKiBTZXR1cCBib290bWVtIHdpdGggYXZhaWxhYmxlIFJBTSAqLwogCXNldHVwX21lbW9yeSgpOwotCXBhZ2luZ19pbml0KCk7CiAJc3BhcnNlX2luaXQoKTsKIAogI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCkBAIC0zNjYsNDYgKzI2NSwxMyBAQAogCS8qIFBlcmZvcm0gdGhlIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gKi8KIAlpZiAobGlrZWx5KHNoX212Lm12X3NldHVwKSkKIAkJc2hfbXYubXZfc2V0dXAoY21kbGluZV9wKTsKKworCXBhZ2luZ19pbml0KCk7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciogbmFtZSkKLXsKLQlleHRlcm4gbG9uZyBfX21hY2h2ZWNfc3RhcnQsIF9fbWFjaHZlY19lbmQ7Ci0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICphbGxfdmVjcyA9Ci0JCShzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OwotCi0JaW50IGksIG4gPSAoKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19lbmQKLQkJICAgIC0gKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCkvCi0JCXNpemVvZihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IpOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12ID0gJmFsbF92ZWNzW2ldOwotCQlpZiAobXYgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RyY2FzZWNtcChuYW1lLCBnZXRfc3lzdGVtX3R5cGUoKSkgPT0gMCkgewotCQkJcmV0dXJuIG12OwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGNwdSBjcHVbTlJfQ1BVU107Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKLXsKLQlpbnQgY3B1X2lkOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdV9pZCkKLQkJcmVnaXN0ZXJfY3B1KCZjcHVbY3B1X2lkXSwgY3B1X2lkKTsKLQotCXJldHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpjcHVfbmFtZVtdID0gewogCVtDUFVfU0g3MjA2XQk9ICJTSDcyMDYiLAlbQ1BVX1NINzYxOV0JPSAiU0g3NjE5IiwKLQlbQ1BVX1NINzYwNF0JPSAiU0g3NjA0IiwJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCisJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCiAJW0NQVV9TSDc3MDVdCT0gIlNINzcwNSIsCVtDUFVfU0g3NzA2XQk9ICJTSDc3MDYiLAogCVtDUFVfU0g3NzA3XQk9ICJTSDc3MDciLAlbQ1BVX1NINzcwOF0JPSAiU0g3NzA4IiwKIAlbQ1BVX1NINzcwOV0JPSAiU0g3NzA5IiwJW0NQVV9TSDc3MTBdCT0gIlNINzcxMCIsCkBAIC00MTksNyArMjg1LDcgQEAKIAlbQ1BVX1NINzc3MF0JPSAiU0g3NzcwIiwJW0NQVV9TSDc3ODBdCT0gIlNINzc4MCIsCiAJW0NQVV9TSDc3ODFdCT0gIlNINzc4MSIsCVtDUFVfU0g3MzQzXQk9ICJTSDczNDMiLAogCVtDUFVfU0g3Nzg1XQk9ICJTSDc3ODUiLAlbQ1BVX1NINzcyMl0JPSAiU0g3NzIyIiwKLQlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCisJW0NQVV9TSFgzXQk9ICJTSC1YMyIsCVtDUFVfU0hfTk9ORV0JPSAiVW5rbm93biIKIH07CiAKIGNvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYykKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCmluZGV4IGMxY2ZjYjkuLmM5NjhkY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwpAQCAtNzgsNiArNzgsMTYgQEAKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtX2k0X2V2ZW4pOwogREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1faTRfb2RkKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0kxMl9pNCk7CisKKyNpZiAoX19HTlVDX01JTk9SX18gPT0gMiB8fCBkZWZpbmVkKF9fR05VQ19TVE1fUkVMRUFTRV9fKSkKKy8qCisgKiBHQ0MgNC4yIGVtaXRzIHRoZXNlIGZvciBkaXZpc2lvbiwgYXMgZG8gR0NDIDQuMS54IHZlcnNpb25zIG9mIHRoZSBTVAorICogY29tcGlsZXIgd2hpY2ggaW5jbHVkZSBiYWNrcG9ydGVkIHBhdGNoZXMuCisgKi8KK0RFQ0xBUkVfRVhQT1JUKF9fc2RpdnNpM19pNGkpOworREVDTEFSRV9FWFBPUlQoX191ZGl2X3Fybm5kXzE2KTsKK0RFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpM19pNGkpOworI2VuZGlmCiAjZWxzZSAvKiBHQ0MgMy54ICovCiBERUNMQVJFX0VYUE9SVChfX21vdnN0cl9pNF9ldmVuKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92c3RyX2k0X29kZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCmluZGV4IGUzMjNlMjkuLjcwNmQ4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yNjEsNyArMjYyLDcgQEAKIAkJZ290byBiYWRmcmFtZTsKIAkvKiBJdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBhdm9pZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhhbiB0bwogCSAgIGNhbGwgaXQgYW5kIGlnbm9yZSBlcnJvcnMuICAqLwotCWRvX3NpZ2FsdHN0YWNrKCZzdCwgTlVMTCwgcmVncy0+cmVnc1sxNV0pOworCWRvX3NpZ2FsdHN0YWNrKChjb25zdCBzdGFja190IF9fdXNlciAqKSZzdCwgTlVMTCwgKHVuc2lnbmVkIGxvbmcpZnJhbWUpOwogCiAJcmV0dXJuIHIwOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCA3ZGIxYzJkLi5mZjU2NTZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKQEAgLTMwOCw5ICszMDgsOSBAQAogCS5sb25nIHN5c191dGltZXMKICAJLmxvbmcgc3lzX2ZhZHZpc2U2NF82NF93cmFwcGVyCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBSZXNlcnZlZCBmb3IgbWJpbmQgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAyNzUgLSBnZXRfbWVtcG9saWN5ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc2V0X21lbXBvbGljeSAqLworCS5sb25nIHN5c19tYmluZAorCS5sb25nIHN5c19nZXRfbWVtcG9saWN5CQkvKiAyNzUgKi8KKwkubG9uZyBzeXNfc2V0X21lbXBvbGljeQogCS5sb25nIHN5c19tcV9vcGVuCiAJLmxvbmcgc3lzX21xX3VubGluawogCS5sb25nIHN5c19tcV90aW1lZHNlbmQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYwppbmRleCAyZDk5N2UyLi4wOTdlYmQ0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0YXJ0KHZvaWQpCiB7Ci0JY3RybF9vdXRiKGN0cmxfaW5iKFRNVV9UU1RSKSB8IDB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpIHwgMHgzLCBUTVVfMDEyX1RTVFIpOwogCXJldHVybiAwOwogfQogCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0b3Aodm9pZCkKIHsKLQljdHJsX291dGIoY3RybF9pbmIoVE1VX1RTVFIpICYgfjB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpICYgfjB4MywgVE1VXzAxMl9UU1RSKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0LDcgKzE3NCw4IEBACiAKICNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSAmJiBcCiAgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkgJiYgXAotICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCisgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQogCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ODQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJcmVnaXN0ZXJfb25lX25vZGUoaSk7CisjZW5kaWYKKworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKKwkJcmV0ID0gcmVnaXN0ZXJfY3B1KCZwZXJfY3B1KGNwdV9kZXZpY2VzLCBpKSwgaSk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlZ2lzdGVyX2NwdSAlZCBmYWlsZWQgKCVkKVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGksIHJldCk7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKKwkvKgorCSAqIEluIHRoZSBVUCBjYXNlLCBtYWtlIHN1cmUgdGhlIENQVSBhc3NvY2lhdGlvbiBpcyBzdGlsbAorCSAqIHJlZ2lzdGVyZWQgdW5kZXIgZWFjaCBub2RlLiBXaXRob3V0IHRoaXMsIHN5c2ZzIGZhaWxzCisJICogdG8gbWFrZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIG5vZGVzIG90aGVyIHRoYW4gbm9kZTAKKwkgKiBhbmQgY3B1MC4KKwkgKi8KKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKQorCQlpZiAoaSAhPSBudW1hX25vZGVfaWQoKSkKKwkJCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGkpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCmluZGV4IDhmMTg5MzAuLjUwMmQ0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwpAQCAtMTAzLDYgKzEwMyw3IEBACiAJCQkgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGN1cnJlbnQpKTsKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKQEAgLTU4NCw3ICs1ODUsNyBAQAogCQlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOwogCQlpbmZvLnNpX2Vycm5vID0gMDsKIAkJaW5mby5zaV9jb2RlID0gc2lfY29kZTsKLQkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgYWRkcmVzczsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKIAkJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgY3VycmVudCk7CiAJfSBlbHNlIHsKIAkJaWYgKHJlZ3MtPnBjICYgMSkKQEAgLTYxNyw3ICs2MTgsNyBAQAogICovCiBpbnQgaXNfZHNwX2luc3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgc2hvcnQgaW5zdDsKKwl1bnNpZ25lZCBzaG9ydCBpbnN0ID0gMDsKIAogCS8qCiAJICogU2FmZSBndWFyZCBpZiBEU1AgbW9kZSBpcyBhbHJlYWR5IGVuYWJsZWQgb3Igd2UncmUgbGFja2luZwpAQCAtNjQ1LDcgKzY0Niw2IEBACiAJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCXNpZ2luZm9fdCBpbmZvOwogCiAJc3dpdGNoIChyNCkgewpAQCAtODc0LDcgKzg3NCw3IEBACiB2b2lkIGhhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZW51bSBidWdfdHJhcF90eXBlIHR0OwotCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wYyk7CisJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPnBjLCByZWdzKTsKIAlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCXJlZ3MtPnBjICs9IDI7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDRjNWI1N2UuLjA2OTY0MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtOTcsMTggKzk3LDIwIEBACiAgIF9faW5pdHJhbWZzX2VuZCA9IC47CiAjZW5kaWYKIAorIC4gPSBBTElHTig0KTsKICAgX19tYWNodmVjX3N0YXJ0ID0gLjsKLSAgLmluaXQubWFjaHZlYyA6IHsgKiguaW5pdC5tYWNodmVjKSB9CisgIC5tYWNodmVjLmluaXQgOiB7ICooLm1hY2h2ZWMuaW5pdCkgfQogICBfX21hY2h2ZWNfZW5kID0gLjsKKwogICAuID0gQUxJR04oUEFHRV9TSVpFKTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLSAgLmJzcyA6IHsgKiguYnNzKSB9Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfZW5kID0gLiA7CisgIC5ic3MgOiB7CisJX19pbml0X2VuZCA9IC47CisJX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCisgIAkqKC5ic3MucGFnZV9hbGlnbmVkKQorICAJKiguYnNzKQorCS4gPSBBTElHTig0KTsKKwlfZW5kID0gLiA7CisgIH0KIAogICAvKiBXaGVuIHNvbWV0aGluZyBpbiB0aGUga2VybmVsIGlzIE5PVCBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhlCiAgICAqIG1vZHVsZSBjbGVhbnVwIGNvZGUgYW5kIGRhdGEgYXJlIHB1dCBpbnRvIHRoZXNlIHNlZ21lbnRzLiAgQm90aApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jIGIvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jCmluZGV4IGMwMjQ3M2EuLjRiZWYzYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LWdlbmVyaWMuYworKysgYi9hcmNoL3NoL2xpYi9kaXY2NC1nZW5lcmljLmMKQEAgLTQsMTYgKzQsMTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLWV4dGVybiB1NjQgX194ZGl2NjRfMzIodTY0IG4sIHUzMiBkKTsKK2V4dGVybiB1aW50NjRfdCBfX3hkaXY2NF8zMih1NjQgbiwgdTMyIGQpOwogCi11NjQgX19kaXY2NF8zMih1NjQgKnhwLCB1MzIgeSkKK3VpbnQzMl90IF9fZGl2NjRfMzIodTY0ICp4cCwgdTMyIHkpCiB7Ci0JdTY0IHJlbTsKLQl1NjQgcSA9IF9feGRpdjY0XzMyKCp4cCwgeSk7CisJdWludDMyX3QgcmVtOworCXVpbnQ2NF90IHEgPSBfX3hkaXY2NF8zMigqeHAsIHkpOwogCiAJcmVtID0gKnhwIC0gcSAqIHk7CiAJKnhwID0gcTsKIAogCXJldHVybiByZW07CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbGliL2RpdjY0LlMgYi9hcmNoL3NoL2xpYi9kaXY2NC5TCmluZGV4IGVlZmMyNzUuLjVlZTczMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LlMKKysrIGIvYXJjaC9zaC9saWIvZGl2NjQuUwpAQCAtMSwxMiArMSwxMiBAQAogLyoJCi0gKiB1bnNpZ25lZCBsb25nIGxvbmcgX194ZGl2NjRfMzIodW5zaWduZWQgbG9uZyBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCk7IAorICogdW5zaWduZWQgbG9uZyBfX3hkaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgbiwgdW5zaWduZWQgbG9uZyBkKTsgCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogLnRleHQKIEVOVFJZKF9feGRpdjY0XzMyKQotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyNCwgcjAKIAltb3YJcjUsIHIxCiAjZWxzZQpAQCAtMzQsNyArMzQsNyBAQAogCXJvdGNsCXIwCiAJZGl2MQlyNiwgcjEKIAkuZW5kcgotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyMiwgcjEKIAlydHMKIAkgcm90Y2wJcjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbWF0aC1lbXUvbWF0aC5jIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKaW5kZXggYTM4ZTFlZS4uYWMyZDdhYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKKysrIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKQEAgLTUwNyw2ICs1MDcsNyBAQAogCXVuc2lnbmVkIHNob3J0IGluc24gPSAqKHVuc2lnbmVkIHNob3J0ICopcmVncy0+cGM7CiAJdW5zaWduZWQgc2hvcnQgZmluc247CiAJdW5zaWduZWQgbG9uZyBuZXh0cGM7CisJc2lnaW5mb190IGluZm87CiAJaW50IG5pYls0XSA9IHsKIAkJKGluc24gPj4gMTIpICYgMHhmLAogCQkoaW5zbiA+PiA4KSAmIDB4ZiwKQEAgLTU1OSw5ICs1NjAsMTEgQEAKIAkJCQl+KEZQU0NSX0NBVVNFX01BU0sgfCBGUFNDUl9GTEFHX01BU0spOwogCQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKIAkJfSBlbHNlIHsKLQkJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQkJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOwotCQkJZm9yY2Vfc2lnKFNJR0ZQRSwgdHNrKTsKKwkJCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLT5wYzsKKwkJCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiAJCX0KIAogCQlyZWdzLT5wYyA9IG5leHRwYzsKQEAgLTU3NiwxNCArNTc5LDE3IEBACiAJCQkgICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXNpZ2luZm9fdCBpbmZvOwogCiAJaWYgKGllZWVfZnBlX2hhbmRsZXIgKCZyZWdzKSkKIAkJcmV0dXJuOwogCiAJcmVncy5wYyArPSAyOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKLQlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gRlBFX0ZMVElOVjsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLnBjOworCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9LY29uZmlnIGIvYXJjaC9zaC9tbS9LY29uZmlnCmluZGV4IDI1MzM0NmQuLjI4ZDc5YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vS2NvbmZpZworKysgYi9hcmNoL3NoL21tL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi1tZW51ICJQcm9jZXNzb3Igc2VsZWN0aW9uIgotCiAjCiAjIFByb2Nlc3NvciBmYW1pbGllcwogIwpAQCAtMzgsMjcgKzM2LDMxIEBACiBjb25maWcgQ1BVX1NIWDIKIAlib29sCiAKK2NvbmZpZyBDUFVfU0hYMworCWJvb2wKKworY2hvaWNlCisJcHJvbXB0ICJQcm9jZXNzb3Igc3ViLXR5cGUgc2VsZWN0aW9uIgorCiAjCiAjIFByb2Nlc3NvciBzdWJ0eXBlcwogIwogCi1jb21tZW50ICJTSC0yIFByb2Nlc3NvciBTdXBwb3J0IgotCi1jb25maWcgQ1BVX1NVQlRZUEVfU0g3NjA0Ci0JYm9vbCAiU3VwcG9ydCBTSDc2MDQgcHJvY2Vzc29yIgotCXNlbGVjdCBDUFVfU0gyCisjIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzYxOQogCWJvb2wgIlN1cHBvcnQgU0g3NjE5IHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMgorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAotY29tbWVudCAiU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyMDYKIAlib29sICJTdXBwb3J0IFNINzIwNiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCi1jb21tZW50ICJTSC0zIFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMDAKIAlib29sICJTdXBwb3J0IFNINzMwMCBwcm9jZXNzb3IiCkBAIC0xMTMsNyArMTE1LDcgQEAKIAloZWxwCiAJICBTZWxlY3QgU0g3NzEyIGlmIHlvdSBoYXZlIGEgU0gzLURTUCBTSDc3MTIgQ1BVLgogCi1jb21tZW50ICJTSC00IFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTAKIAlib29sICJTdXBwb3J0IFNINzc1MCBwcm9jZXNzb3IiCkBAIC0xMjUsNyArMTI3LDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcwOTEKIAlib29sICJTdXBwb3J0IFNINzA5MSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCWhlbHAKIAkgIFNlbGVjdCBTSDcwOTEgaWYgeW91IGhhdmUgYW4gU0gtNCBiYXNlZCBTZWdhIGRldmljZSAoc3VjaCBhcwogCSAgdGhlIERyZWFtY2FzdCwgTmFvbWksIGFuZCBOYW9taSAyKS4KQEAgLTEzMywxMyArMTM1LDExIEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUgogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUwogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUxCkBAIC0xNTMsNyArMTUzLDYgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTFSCiAJYm9vbCAiU3VwcG9ydCBTSDc3NTFSIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINAotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTEKIAlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NjAKQEAgLTE2Niw3ICsxNjUsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g0LTIwMiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKIAotY29tbWVudCAiU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydCIKKyMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU1Q0MFNUQjEKIAlib29sICJTdXBwb3J0IFNUNDBTVEIxL1NUNDBSQSBwcm9jZXNzb3JzIgpAQCAtMTgxLDcgKzE4MCw3IEBACiAJaGVscAogCSAgU2VsZWN0IFNUNDBHWDEgaWYgeW91IGhhdmUgYSBTVDQwR1gxIENQVS4KIAotY29tbWVudCAiU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NzAKIAlib29sICJTdXBwb3J0IFNINzc3MCBwcm9jZXNzb3IiCkBAIC0xOTgsNyArMTk3LDEzIEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCiAKLWNvbW1lbnQgIlNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydCIKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSFgzCisJYm9vbCAiU3VwcG9ydCBTSC1YMyBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDRBCisJc2VsZWN0IENQVV9TSFgzCisJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisKKyMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMTgwCiAJYm9vbCAiU3VwcG9ydCBTSDczMTgwIHByb2Nlc3NvciIKQEAgLTIxMyw4ICsyMTgsMTAgQEAKIAlzZWxlY3QgQ1BVX1NINEFMX0RTUAogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKKwlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCisJc2VsZWN0IFNZU19TVVBQT1JUU19OVU1BCiAKLWVuZG1lbnUKK2VuZGNob2ljZQogCiBtZW51ICJNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zIgogCkBAIC0yNjYsNyArMjczLDcgQEAKIAogY29uZmlnIDMyQklUCiAJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKLQlkZXBlbmRzIG9uIENQVV9TSDRBICYmIE1NVSAmJiAoIVgyVExCIHx8IEJST0tFTikKKwlkZXBlbmRzIG9uIE1NVSAmJiAoQ1BVX1NVQlRZUEVfU0g3NzgwIHx8IENQVV9TVUJUWVBFX1NINzc4NSkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgcGh5c2ljYWwgYWRkcmVzc2luZyB3aWxsIGJlIGV4dGVuZGVkIHRvCkBAIC0yOTUsNiArMzAyLDE3IEBACiAJICBGb3Igc3lzdGVtcyB3aXRoIGFuIE1NVSB0aGF0IGNhbiBhZmZvcmQgdG8gZ2l2ZSB1cCBhIHBhZ2UsCiAJICAodGhlIGRlZmF1bHQgdmFsdWUpIHNheSBZLgogCitjb25maWcgTlVNQQorCWJvb2wgIk5vbiBVbmlmb3JtIE1lbW9yeSBBY2Nlc3MgKE5VTUEpIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBNTVUgJiYgU1lTX1NVUFBPUlRTX05VTUEgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCSAgU29tZSBTSCBzeXN0ZW1zIGhhdmUgbWFueSB2YXJpb3VzIG1lbW9yaWVzIHNjYXR0ZXJlZCBhcm91bmQKKwkgIHRoZSBhZGRyZXNzIHNwYWNlLCBlYWNoIHdpdGggdmFyeWluZyBsYXRlbmNpZXMuIFRoaXMgZW5hYmxlcworCSAgc3VwcG9ydCBmb3IgdGhlc2UgYmxvY2tzIGJ5IGJpbmRpbmcgdGhlbSB0byBub2RlcyBhbmQgYWxsb3dpbmcKKwkgIG1lbW9yeSBwb2xpY2llcyB0byBiZSB1c2VkIGZvciBwcmlvcml0aXppbmcgYW5kIGNvbnRyb2xsaW5nCisJICBhbGxvY2F0aW9uIGJlaGF2aW91ci4KKwogY29uZmlnIE5PREVTX1NISUZUCiAJaW50CiAJZGVmYXVsdCAiMSIKQEAgLTMwMiwxNCArMzIwLDM0IEBACiAKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gIU5VTUEKKworY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCWRlZl9ib29sIHkKKwlzZWxlY3QgU1BBUlNFTUVNX1NUQVRJQworCitjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAorCWRlZl9ib29sIHkKIAogY29uZmlnIE1BWF9BQ1RJVkVfUkVHSU9OUwogCWludAorCWRlZmF1bHQgIjIiIGlmIChDUFVfU1VCVFlQRV9TSDc3MjIgJiYgU1BBUlNFTUVNKQogCWRlZmF1bHQgIjEiCiAKIGNvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAogCWRlZl9ib29sIHkKIAorY29uZmlnIEFSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTAorCWRlZl9ib29sIHkKKworY29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gU1BBUlNFTUVNCisKK2NvbmZpZyBBUkNIX01FTU9SWV9QUk9CRQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE1FTU9SWV9IT1RQTFVHCisKIGNob2ljZQogCXByb21wdCAiS2VybmVsIHBhZ2Ugc2l6ZSIKIAlkZWZhdWx0IFBBR0VfU0laRV80S0IKQEAgLTM5NCwxNSArNDMyLDQgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFNIX09DUkFNCi0JYm9vbCAiT3BlcmFuZCBDYWNoZSBSQU0gKE9DUkFNKSBzdXBwb3J0IgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgdGVhciBkb3duIHRoZSBudW1iZXIgb2YKLQkgIHNldHMgaW4gdGhlIGRjYWNoZSBieSBoYWxmLCB3aGljaCBpbiB0dXJuIGV4cG9zZXMgYSBtZW1vcnkgcmFuZ2UuCi0KLQkgIFRoZSBhZGRyZXNzZXMgZm9yIHRoZSBPQyBSQU0gYmFzZSB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIHRoZQotCSAgcHJvY2Vzc29yIHZlcnNpb24uIENvbnN1bHQgdmVuZG9yIGRvY3VtZW50YXRpb24gZm9yIHNwZWNpZmljcy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9NYWtlZmlsZSBiL2FyY2gvc2gvbW0vTWFrZWZpbGUKaW5kZXggM2ZmZDdmNi4uZDY3N2Q3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL21tL01ha2VmaWxlCkBAIC04LDkgKzgsNiBAQAogb2JqLSQoQ09ORklHX0NQVV9TSDMpCSs9IGNhY2hlLXNoMy5vCiBvYmotJChDT05GSUdfQ1BVX1NINCkJKz0gY2FjaGUtc2g0Lm8KIAotb2JqLSQoQ09ORklHX0RNQV9QQUdFX09QUykJKz0gcGctZG1hLm8KLW9iai0kKENPTkZJR19IVUdFVExCX1BBR0UpCSs9IGh1Z2V0bGJwYWdlLm8KLQogbW11LXkJCQk6PSBmYXVsdC1ub21tdS5vIHRsYi1ub21tdS5vIHBnLW5vbW11Lm8KIG1tdS0kKENPTkZJR19NTVUpCTo9IGZhdWx0Lm8gY2xlYXJfcGFnZS5vIGNvcHlfcGFnZS5vIHRsYi1mbHVzaC5vCVwKIAkJCSAgIGlvcmVtYXAubwpAQCAtMjcsNSArMjQsNyBAQAogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKSArPSBwZy1zaDc3MDUubwogZW5kaWYKIAorb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFHRSkJKz0gaHVnZXRsYnBhZ2Uubwogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQkrPSBjYWNoZS1zaDc3MDUubwogb2JqLSQoQ09ORklHXzMyQklUKQkJKz0gcG1iLm8KK29iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2ZhdWx0LmMgYi9hcmNoL3NoL21tL2ZhdWx0LmMKaW5kZXggYzg3OGZhYS4uMGIzZWFmNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc2gvbW0vZmF1bHQuYwpAQCAtMzIsNyArMzIsNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7CiAJaW50IHNpX2NvZGU7CiAJc2lnaW5mb190IGluZm87CiAKQEAgLTE3MCwyNCArMTY5LDM4IEBACiAgKiB0ZXJtaW5hdGUgdGhpbmdzIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCiAgKgogICovCi0JaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIpOwotCXByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIiwgYWRkcmVzcyk7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKLQlwYWdlID0gKHVuc2lnbmVkIGxvbmcpZ2V0X1RUQigpOwotCWlmIChwYWdlKSB7Ci0JCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgcGFnZSlbYWRkcmVzcyA+PiBQR0RJUl9TSElGVF07Ci0JCXByaW50ayhLRVJOX0FMRVJUICIqcGRlID0gJTA4bHhcbiIsIHBhZ2UpOwotCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKLQkJCXBhZ2UgJj0gUEFHRV9NQVNLOwotCQkJYWRkcmVzcyAmPSAweDAwM2ZmMDAwOwotCQkJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOwotCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwdGUgPSAlMDhseFxuIiwgcGFnZSk7CisKKwlidXN0X3NwaW5sb2NrcygxKTsKKworCWlmIChvb3BzX21heV9wcmludCgpKSB7CisJCV9fdHlwZW9mX18ocHRlX3ZhbChfX3B0ZSgwKSkpIHBhZ2U7CisKKwkJaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCisJCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCAiCisJCQkJCSAgInBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyAiCisJCQkJCSAgInJlcXVlc3QiKTsKKwkJcHJpbnRrKCIgYXQgdmlydHVhbCBhZGRyZXNzICUwOGx4XG4iLCBhZGRyZXNzKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKKwkJcGFnZSA9ICh1bnNpZ25lZCBsb25nKWdldF9UVEIoKTsKKwkJaWYgKHBhZ2UpIHsKKwkJCXBhZ2UgPSAoKF9fdHlwZW9mX18ocGFnZSkgKikgX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCQkgUEdESVJfU0hJRlRdOworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwZGUgPSAlMDhseFxuIiwgcGFnZSk7CisJCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKKwkJCQlwYWdlICY9IFBBR0VfTUFTSzsKKwkJCQlhZGRyZXNzICY9IDB4MDAzZmYwMDA7CisJCQkJcGFnZSA9ICgoX190eXBlb2ZfXyhwYWdlKSAqKQorCQkJCQkJX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCSAgICBQQUdFX1NISUZUXTsKKwkJCQlwcmludGsoS0VSTl9BTEVSVCAiKnB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwkJCX0KIAkJfQogCX0KKwogCWRpZSgiT29wcyIsIHJlZ3MsIHdyaXRlYWNjZXNzKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKIAlkb19leGl0KFNJR0tJTEwpOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCBlMGU2NDRmLi44MmI2OGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwpAQCAtMzYsMTQgKzM3LDExIEBACiAJc2hvd19mcmVlX2FyZWFzKCk7CiAKIAlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGk7CiAKIAkJcGdkYXRfcmVzaXplX2xvY2socGdkYXQsICZmbGFncyk7Ci0JCXBhZ2UgPSBwZ2RhdC0+bm9kZV9tZW1fbWFwOwotCQllbmQgPSBwYWdlICsgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsKLQotCQlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcGdkYXRfcGFnZV9ucihwZ2RhdCwgaSk7CiAJCQl0b3RhbCsrOwogCQkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKIAkJCQlyZXNlcnZlZCsrOwpAQCAtNTUsOSArNTMsNyBAQAogCQkJCWZyZWUrKzsKIAkJCWVsc2UKIAkJCQlzaGFyZWQgKz0gcGFnZV9jb3VudChwYWdlKSAtIDE7Ci0JCQlwYWdlKys7Ci0JCX0gd2hpbGUgKHBhZ2UgPCBlbmQpOwotCisJCX0KIAkJcGdkYXRfcmVzaXplX3VubG9jayhwZ2RhdCwgJmZsYWdzKTsKIAl9CiAKQEAgLTEzNywxNiArMTMzLDEyIEBACiB9CiAjZW5kaWYJLyogQ09ORklHX01NVSAqLwogCi0vKiBSZWZlcmVuY2VzIHRvIHNlY3Rpb24gYm91bmRhcmllcyAqLwotCi1leHRlcm4gY2hhciBfdGV4dCwgX2V0ZXh0LCBfZWRhdGEsIF9fYnNzX3N0YXJ0LCBfZW5kOwotZXh0ZXJuIGNoYXIgX19pbml0X2JlZ2luLCBfX2luaXRfZW5kOwotCiAvKgogICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcwogICovCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCWludCBuaWQ7CiAKIAkvKiBXZSBkb24ndCBuZWVkIHRvIG1hcCB0aGUga2VybmVsIHRocm91Z2ggdGhlIFRMQiwgYXMKQEAgLTE1OCw0MyArMTUwLDM5IEBACiAJICogY2hlY2sgZm9yIGEgbnVsbCB2YWx1ZS4gKi8KIAlzZXRfVFRCKHN3YXBwZXJfcGdfZGlyKTsKIAorCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKLQkJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAJCXVuc2lnbmVkIGxvbmcgbG93LCBzdGFydF9wZm47CiAKLQkJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7Ci0KIAkJc3RhcnRfcGZuID0gcGdkYXQtPmJkYXRhLT5ub2RlX2Jvb3Rfc3RhcnQgPj4gUEFHRV9TSElGVDsKIAkJbG93ID0gcGdkYXQtPmJkYXRhLT5ub2RlX2xvd19wZm47CiAKLQkJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBsb3c7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydF9wZm4sIGxvdyk7CisJCWlmIChtYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA8IGxvdykKKwkJCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbG93OwogCiAJCXByaW50aygiTm9kZSAldTogc3RhcnRfcGZuID0gMHglbHgsIGxvdyA9IDB4JWx4XG4iLAogCQkgICAgICAgbmlkLCBzdGFydF9wZm4sIGxvdyk7Ci0KLQkJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7Ci0KLQkJcHJpbnRrKCJOb2RlICV1OiBtZW1fbWFwIHN0YXJ0cyBhdCAlcFxuIiwKLQkJICAgICAgIHBnZGF0LT5ub2RlX2lkLCBwZ2RhdC0+bm9kZV9tZW1fbWFwKTsKIAl9CisKKwlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrY29yZV9saXN0IGtjb3JlX21lbSwga2NvcmVfdm1hbGxvYzsKIAogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKLQlpbnQgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKKwlpbnQgY29kZXNpemUsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAlpbnQgbmlkOwogCi0JcmVzZXJ2ZWRwYWdlcyA9IDA7CisJbnVtX3BoeXNwYWdlcyA9IDA7CisJaGlnaF9tZW1vcnkgPSBOVUxMOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKIAkJdW5zaWduZWQgbG9uZyBub2RlX3BhZ2VzID0gMDsKIAkJdm9pZCAqbm9kZV9oaWdoX21lbW9yeTsKLQkJaW50IGk7CiAKIAkJbnVtX3BoeXNwYWdlcyArPSBwZ2RhdC0+bm9kZV9wcmVzZW50X3BhZ2VzOwogCkBAIC0yMDMsMTMgKzE5MSw5IEBACiAKIAkJdG90YWxyYW1fcGFnZXMgKz0gbm9kZV9wYWdlczsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZV9wYWdlczsgaSsrKQotCQkJaWYgKFBhZ2VSZXNlcnZlZChwZ2RhdC0+bm9kZV9tZW1fbWFwICsgaSkpCi0JCQkJcmVzZXJ2ZWRwYWdlcysrOwotCi0JCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKSgocGdkYXQtPm5vZGVfc3RhcnRfcGZuICsKLQkJCQkJICAgICBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzKSA8PAotCQkJCQkJUEFHRV9TSElGVCk7CisJCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9fdmEoKHBnZGF0LT5ub2RlX3N0YXJ0X3BmbiArCisJCQkJCQkgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlcykgPDwKKwkJCQkJCSBQQUdFX1NISUZUKTsKIAkJaWYgKG5vZGVfaGlnaF9tZW1vcnkgPiBoaWdoX21lbW9yeSkKIAkJCWhpZ2hfbWVtb3J5ID0gbm9kZV9oaWdoX21lbW9yeTsKIAl9CkBAIC0yMzksMTEgKzIyMywxMCBAQAogCQkgICBWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlICglZGsga2VybmVsIGNvZGUsICIKLQkgICAgICAgIiVkayByZXNlcnZlZCwgJWRrIGRhdGEsICVkayBpbml0KVxuIiwKKwkgICAgICAgIiVkayBkYXRhLCAlZGsgaW5pdClcbiIsCiAJCSh1bnNpZ25lZCBsb25nKSBucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQtMTApLAotCQl0b3RhbHJhbV9wYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCisJCW51bV9waHlzcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLAogCQljb2Rlc2l6ZSA+PiAxMCwKLQkJcmVzZXJ2ZWRwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCiAJCWRhdGFzaXplID4+IDEwLAogCQlpbml0c2l6ZSA+PiAxMCk7CiAKQEAgLTI2NCw3ICsyNDcsOSBAQAogCQlmcmVlX3BhZ2UoYWRkcik7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6ICVkayBmcmVlZFxuIiwgKCZfX2luaXRfZW5kIC0gJl9faW5pdF9iZWdpbikgPj4gMTApOworCXByaW50aygiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWxkayBmcmVlZFxuIiwKKwkgICAgICAgKCh1bnNpZ25lZCBsb25nKSZfX2luaXRfZW5kIC0KKwkgICAgICAgICh1bnNpZ25lZCBsb25nKSZfX2luaXRfYmVnaW4pID4+IDEwKTsKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRApAQCAtMjc3LDYgKzI2Miw1MCBAQAogCQlmcmVlX3BhZ2UocCk7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7CisJcHJpbnRrKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOwogfQogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKK3ZvaWQgb25saW5lX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOworCV9fZnJlZV9wYWdlKHBhZ2UpOworCXRvdGFscmFtX3BhZ2VzKys7CisJbnVtX3BoeXNwYWdlcysrOworfQorCitpbnQgYXJjaF9hZGRfbWVtb3J5KGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJcGdfZGF0YV90ICpwZ2RhdDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgcmV0OworCisJcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKKworCS8qIFdlIG9ubHkgaGF2ZSBaT05FX05PUk1BTCwgc28gdGhpcyBpcyBlYXN5Li4gKi8KKwlyZXQgPSBfX2FkZF9wYWdlcyhwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJpbnRrKCIlczogRmFpbGVkLCBfX2FkZF9wYWdlcygpID09ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXJjaF9hZGRfbWVtb3J5KTsKKworaW50IHJlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlbW92ZV9tZW1vcnkpOworCisjaWZkZWYgQ09ORklHX05VTUEKK2ludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgYWRkcikKK3sKKwkvKiBOb2RlIDAgZm9yIG5vdy4uICovCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9udW1hLmMgYi9hcmNoL3NoL21tL251bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZmMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9tbS9udW1hLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIGFyY2gvc2gvbW0vbnVtYS5jIC0gTXVsdGlwbGUgbm9kZSBzdXBwb3J0IGZvciBTSCBtYWNoaW5lcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKworc3RhdGljIGJvb3RtZW1fZGF0YV90IHBsYXRfbm9kZV9iZGF0YVtNQVhfTlVNTk9ERVNdOworc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobm9kZV9kYXRhKTsKKworLyoKKyAqIE9uIFNIIG1hY2hpbmVzIHRoZSBjb252ZW50aW9uYWwgYXBwcm9hY2ggaXMgdG8gc3Rhc2ggc3lzdGVtIFJBTQorICogaW4gbm9kZSAwLCBhbmQgb3RoZXIgbWVtb3J5IGJsb2NrcyBpbiB0byBub2RlIDEgYW5kIHVwLCBvcmRlcmVkIGJ5CisgKiBsYXRlbmN5LiBFYWNoIG5vZGUncyBwZ2RhdCBpcyBub2RlLWxvY2FsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5vZGUsCisgKiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgbm9kZSBtZW0gbWFwLgorICovCit2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVfcGZuID0gUEZOX1VQKF9fcGEoX2VuZCkpOworCisJLyoKKwkgKiBOb2RlIDAgc2V0cyB1cCBpdHMgcGdkYXQgYXQgdGhlIGZpcnN0IGF2YWlsYWJsZSBwZm4sCisJICogYW5kIGJ1bXBzIGl0IHVwIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSBib290bWVtIGFsbG9jYXRvci4KKwkgKi8KKwlOT0RFX0RBVEEoMCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCW1lbXNldChOT0RFX0RBVEEoMCksIDAsIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlmcmVlX3BmbiArPSBQRk5fVVAoc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOworCU5PREVfREFUQSgwKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhWzBdOworCisJLyogU2V0IHVwIG5vZGUgMCAqLworCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKGZyZWVfcGZuKTsKKworCS8qIEdpdmUgdGhlIHBsYXRmb3JtcyBhIGNoYW5jZSB0byBob29rIHVwIHRoZWlyIG5vZGVzICovCisJcGxhdF9tZW1fc2V0dXAoKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9wYWdlcywgYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBmcmVlX3BmbiwgZW5kX3BmbjsKKworCS8qIERvbid0IGFsbG93IGJvZ3VzIG5vZGUgYXNzaWdubWVudCAqLworCUJVR19PTihuaWQgPiBNQVhfTlVNTk9ERVMgfHwgbmlkID09IDApOworCisJLyoKKwkgKiBUaGUgZnJlZSBwZm4gc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlLCBhbmQgaXMKKwkgKiBhZHZhbmNlZCBhcyBuZWNlc3NhcnkgZm9yIHBnZGF0IGFuZCBub2RlIG1hcCBhbGxvY2F0aW9ucy4KKwkgKi8KKwlmcmVlX3BmbiA9IHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJZW5kX3BmbiA9IGVuZCA+PiBQQUdFX1NISUZUOworCisJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisKKwkvKiBOb2RlLWxvY2FsIHBnZGF0ICovCisJTk9ERV9EQVRBKG5pZCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCWZyZWVfcGZuICs9IFBGTl9VUChzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisKKwlOT0RFX0RBVEEobmlkKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhW25pZF07CisJTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuID0gc3RhcnRfcGZuOworCU5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCisJLyogTm9kZS1sb2NhbCBib290bWFwICovCisJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhlbmRfcGZuIC0gc3RhcnRfcGZuKTsKKwlib290bWFwX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRyKGZyZWVfcGZuKTsKKwlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4sIHN0YXJ0X3BmbiwKKwkJCQkgICAgZW5kX3Bmbik7CisKKwlmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyhuaWQsIGVuZF9wZm4pOworCisJLyogUmVzZXJ2ZSB0aGUgcGdkYXQgYW5kIGJvb3RtYXAgc3BhY2Ugd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgKi8KKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4gPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKworCS8qIEl0J3MgdXAgKi8KKwlub2RlX3NldF9vbmxpbmUobmlkKTsKKworCS8qIEtpY2sgc3BhcnNlbWVtICovCisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctZG1hLmMgYi9hcmNoL3NoL21tL3BnLWRtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzNjc5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvbW0vcGctZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogYXJjaC9zaC9tbS9wZy1kbWEuYwotICoKLSAqIEZhc3QgY2xlYXJfcGFnZSgpL2NvcHlfcGFnZSgpIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBTSCBETUFDCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qIENoYW5uZWwgdG8gdXNlIGZvciBwYWdlIG9wcywgbXVzdCBiZSBkdWFsLWFkZHJlc3MgbW9kZSBjYXBhYmxlLiAqLwotc3RhdGljIGludCBkbWFfY2hhbm5lbCA9IENPTkZJR19ETUFfUEFHRV9PUFNfQ0hBTk5FTDsKLQotc3RhdGljIHZvaWQgY29weV9wYWdlX2RtYSh2b2lkICp0bywgdm9pZCAqZnJvbSkKLXsKLQkvKiAKLQkgKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBnZXQgdHJpZ2dlcmVkIHVudGlsIGZ1cnRoZXIgYWxvbmcgaW4gdGhlCi0JICogYm9vdCBwcm9jZXNzLCBhdCB3aGljaCBwb2ludCB0aGUgRE1BQyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLgotCSAqIEZpeCB0aGlzIGluIHRoZSBzYW1lIGZhc2hpb24gYXMgY2xlYXJfcGFnZV9kbWEoKSBpbiB0aGUgZXZlbnQKLQkgKiB0aGF0IHRoaXMgY3Jhc2hlcyBkdWUgdG8gdGhlIERNQUMgbm90IGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCi0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWZyb20sIFBBR0VfU0laRSk7Ci0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWZyb20sICh1bnNpZ25lZCBsb25nKXRvKTsKLQlkbWFfd2FpdF9mb3JfY29tcGxldGlvbihkbWFfY2hhbm5lbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFyX3BhZ2VfZG1hKHZvaWQgKnRvKQotewotCS8qCi0JICogV2UgZ2V0IGludm9rZWQgcXVpdGUgZWFybHkgb24sIGlmIHRoZSBETUFDIGhhc24ndCBiZWVuIGluaXRpYWxpemVkCi0JICogeWV0LCBmYWxsIGJhY2sgb24gdGhlIHNsb3cgbWFudWFsIGltcGxlbWVudGF0aW9uLgotCSAqLwotCWlmIChkbWFfaW5mb1tkbWFfY2hhbm5lbF0uY2hhbiAhPSBkbWFfY2hhbm5lbCkgewotCQljbGVhcl9wYWdlX3Nsb3codG8pOwotCQlyZXR1cm47Ci0JfQotCi0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWVtcHR5X3plcm9fcGFnZSwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpdG8pOwotCi0JLyoKLQkgKiBGSVhNRTogU29tZXRoaW5nIGlzIGEgYml0IHJhY3kgaGVyZSwgaWYgd2UgcG9sbCB0aGUgY291bnRlciByaWdodAotCSAqIGF3YXksIHdlIHNlZW0gdG8gbG9jay4gZmx1c2hpbmcgdGhlIHBhZ2UgZnJvbSB0aGUgZGNhY2hlIGRvZXNuJ3QKLQkgKiBzZWVtIHRvIG1ha2UgYSBkaWZmZXJlbmNlIG9uZSB3YXkgb3IgdGhlIG90aGVyLCB0aG91Z2ggZWl0aGVyIGEgZnVsbAotCSAqIGljYWNoZSBvciBkY2FjaGUgZmx1c2ggZG9lcy4KLQkgKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGlzIGlzIGltcG9ydGFudCBhcyB3ZWxsLCBhbmQgbXVzdCBoYXBwZW4gcHJpb3IgdG8KLQkgKiB0aGUgY29tcGxldGlvbiBsb29wIGJ1dCBhZnRlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC4KLQkgKgotCSAqIE9kZGx5IGVub3VnaCwgdGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBpc3N1ZSBmb3IgY29weV9wYWdlKCkuLgotCSAqLwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl0bywgUEFHRV9TSVpFKTsKLQotCWRtYV93YWl0X2Zvcl9jb21wbGV0aW9uKGRtYV9jaGFubmVsKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcGdfZG1hX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCQotCXJldCA9IHJlcXVlc3RfZG1hKGRtYV9jaGFubmVsLCAicGFnZSBvcHMiKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQljb3B5X3BhZ2UgPSBjb3B5X3BhZ2VfZG1hOwotCWNsZWFyX3BhZ2UgPSBjbGVhcl9wYWdlX2RtYTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwZ19kbWFfZXhpdCh2b2lkKQotewotCWZyZWVfZG1hKGRtYV9jaGFubmVsKTsKLX0KLQotbW9kdWxlX2luaXQocGdfZG1hX2luaXQpOwotbW9kdWxlX2V4aXQocGdfZG1hX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPcHRpbWl6ZWQgcGFnZSBjb3B5L2NsZWFyIHJvdXRpbmVzIHVzaW5nIGEgZHVhbC1hZGRyZXNzIG1vZGUgY2FwYWJsZSBETUFDIGNoYW5uZWwiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9NYWtlZmlsZSBiL2FyY2gvc2gvdG9vbHMvTWFrZWZpbGUKaW5kZXggM2MzNzBhMS4uNTY3NTE2YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC90b29scy9NYWtlZmlsZQorKysgYi9hcmNoL3NoL3Rvb2xzL01ha2VmaWxlCkBAIC0xMiw0ICsxMiw1IEBACiAKIGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oOiAkKHNyYykvZ2VuLW1hY2gtdHlwZXMgJChzcmMpL21hY2gtdHlwZXMKIAlAZWNobyAnICBHZW5lcmF0aW5nICRAJworCSQoUSlpZiBbICEgLWQgaW5jbHVkZS9hc20tc2ggXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlL2FzbS1zaDsgZmkKIAkkKFEpJChBV0spIC1mICReID4gJEAgfHwgeyBybSAtZiAkQDsgL2Jpbi9mYWxzZTsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCmluZGV4IGZiNDBmMTguLjRiNWU5MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTE4LDcgKzE4LDYgQEAKIEhQNlhYCQkJU0hfSFA2WFgKIEhENjQ0NjEJCQlIRDY0NDYxCiBIRDY0NDY1CQkJSEQ2NDQ2NQotU0FUVVJOCQkJU0hfU0FUVVJOCiBEUkVBTUNBU1QJCVNIX0RSRUFNQ0FTVAogTVBDMTIxMQkJCVNIX01QQzEyMTEKIFNOQVBHRUFSCQlTSF9TRUNVUkVFREdFNTQxMApAQCAtMzQsMyArMzMsNCBAQAogVElUQU4JCQlTSF9USVRBTgogU0hNSU4JCQlTSF9TSE1JTgogNzcxMFZPSVBHVwkJU0hfNzcxMFZPSVBHVworTEJPWFJFMgkJCVNIX0xCT1hfUkUyCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaDY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCA0ZTk1ZTE4Li5kZjA2YzY0IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTEyOSwxNyArMTI5LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE2NiwxMCArMTU4LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCmluZGV4IDRiMjY3NjMuLmJkNTUwMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCisrKyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCkBAIC0yMTMsMyArMjEzLDQgQEAKIAogCXJldHVybiAoX193c3VtKXJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0woY3N1bV90Y3B1ZHBfbm9mb2xkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCA4NTY3Y2M5Li43M2RmNzExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDkgQEAKIAogZW5kaWYKIAorY29uZmlnIE5PX0RNQQorCWRlZl9ib29sICFQQ0kKKwogY29uZmlnIFNVTl9PUEVOUFJPTUZTCiAJdHJpc3RhdGUgIk9wZW5wcm9tIHRyZWUgYXBwZWFycyBpbiAvcHJvYy9vcGVucHJvbSIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYwppbmRleCBkYzlmZmVhLi4zYmMzYmZmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogCiAJcHJpbnRrKCIlcyglZCk6ICVzIFsjJWRdXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHN0ciwgKytkaWVfY291bnRlcik7CiAJc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCiAJX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsgX19TQVZFOwogCV9fU0FWRTsgX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vc3JtbXUuYyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwppbmRleCBlNWVhYTgwLi5jYTI2MjMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3NybW11LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCkBAIC0xNjAsOSArMTYwLDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNybW11X3B0ZV9wcmVzZW50KHB0ZV90IHB0ZSkKIHsgcmV0dXJuICgocHRlX3ZhbChwdGUpICYgU1JNTVVfRVRfTUFTSykgPT0gU1JNTVVfRVRfUFRFKTsgfQogCi1zdGF0aWMgaW5saW5lIGludCBzcm1tdV9wdGVfcmVhZChwdGVfdCBwdGUpCi17IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIFNSTU1VX05PUkVBRCk7IH0KLQogc3RhdGljIGlubGluZSB2b2lkIHNybW11X3B0ZV9jbGVhcihwdGVfdCAqcHRlcCkKIHsgc3JtbXVfc2V0X3B0ZShwdGVwLCBfX3B0ZSgwKSk7IH0KIApAQCAtMjE4MSw3ICsyMTc4LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3JtbXVfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHNybW11X3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1dBUE8wRzApOwotCUJURklYVVBTRVRfQ0FMTChwdGVfcmVhZCwgc3JtbXVfcHRlX3JlYWQsIEJURklYVVBDQUxMX05PUk0pOwogCiAJQlRGSVhVUFNFVF9DQUxMKHBtZF9iYWQsIHNybW11X3BtZF9iYWQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwbWRfcHJlc2VudCwgc3JtbXVfcG1kX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCmluZGV4IDQzNjAyMWMuLmJkZDgzNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYworKysgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKQEAgLTE3NDgsMTEgKzE3NDgsNiBAQAogfQogc3RhdGljIHZvaWQgc3VuNGNfcHRlX2NsZWFyKHB0ZV90ICpwdGVwKQl7ICpwdGVwID0gX19wdGUoMCk7IH0KIAotc3RhdGljIGludCBzdW40Y19wdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfU1VONENfUEFHRV9SRUFEKTsKLX0KLQogc3RhdGljIGludCBzdW40Y19wbWRfYmFkKHBtZF90IHBtZCkKIHsKIAlyZXR1cm4gKCgocG1kX3ZhbChwbWQpICYgflBBR0VfTUFTSykgIT0gUEdEX1RBQkxFKSB8fApAQCAtMjIxMiw3ICsyMjA3LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3VuNGNfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHN1bjRjX3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1RHME8wKTsKLQlCVEZJWFVQU0VUX0NBTEwocHRlX3JlYWQsIHN1bjRjX3B0ZV9yZWFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAogCUJURklYVVBTRVRfQ0FMTChwbWRfYmFkLCBzdW40Y19wbWRfYmFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwocG1kX3ByZXNlbnQsIHN1bjRjX3BtZF9wcmVzZW50LCBCVEZJWFVQQ0FMTF9OT1JNKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggNjU2NmQxMy4uYjg0YjZhZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTEwOCw2ICsxMDgsMTUgQEAKIAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKK2NvbmZpZyBIT1RQTFVHX0NQVQorCWJvb2wgIlN1cHBvcnQgZm9yIGhvdC1wbHVnZ2FibGUgQ1BVcyIKKwlkZXBlbmRzIG9uIFNNUAorCXNlbGVjdCBIT1RQTFVHCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBleHBlcmltZW50IHdpdGggdHVybmluZyBDUFVzIG9mZiBhbmQgb24uICBDUFVzCisJICBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMuCisJICBTYXkgTiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIENQVSBob3RwbHVnLgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogY29uZmlnIFNZU1ZJUENfQ09NUEFUCkBAIC0zMDUsNiArMzE0LDEyIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgU1VOX0xET01TCisJYm9vbCAiU3VuIExvZ2ljYWwgRG9tYWlucyBzdXBwb3J0IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaXMgeW91IHdhbnQgdG8gc3VwcG9ydCB2aXJ0dWFsIGRldmljZXMgdmlhCisJICBMb2dpY2FsIERvbWFpbnMuCisKIGNvbmZpZyBQQ0kKIAlib29sICJQQ0kgc3VwcG9ydCIKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0kKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGY5NjRiZjIuLmI2Njg3NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNyBAQAogb2JqLSQoQ09ORklHX1BDSSkJICs9IGVidXMubyBpc2EubyBwY2lfY29tbW9uLm8gcGNpX2lvbW11Lm8gXAogCQkJICAgIHBjaV9wc3ljaG8ubyBwY2lfc2FicmUubyBwY2lfc2NoaXpvLm8gXAogCQkJICAgIHBjaV9zdW40di5vIHBjaV9zdW40dl9hc20ubyBwY2lfZmlyZS5vCi1vYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vIGh2dHJhbXAubwogb2JqLSQoQ09ORklHX1NQQVJDMzJfQ09NUEFUKSArPSBzeXMzMi5vIHN5c19zcGFyYzMyLm8gc2lnbmFsMzIubwogb2JqLSQoQ09ORklHX0JJTkZNVF9FTEYzMikgKz0gYmluZm10X2VsZjMyLm8KIG9iai0kKENPTkZJR19CSU5GTVRfQU9VVDMyKSArPSBiaW5mbXRfYW91dDMyLm8KQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19VUzNfRlJFUSkgKz0gdXMzX2NwdWZyZXEubwogb2JqLSQoQ09ORklHX1VTMkVfRlJFUSkgKz0gdXMyZV9jcHVmcmVxLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKSArPSBrcHJvYmVzLm8KK29iai0kKENPTkZJR19TVU5fTERPTVMpICs9IGxkYy5vIHZpby5vIHZpb2hzLm8gZHMubwogb2JqLSQoQ09ORklHX0FVRElUKSArPSBhdWRpdC5vCiBvYmotJChDT05GSUdfQVVESVQpJChDT05GSUdfU1BBUkMzMl9DT01QQVQpICs9IGNvbXBhdF9hdWRpdC5vCiBvYmoteSArPSAkKG9iai15eSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAxNTMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9kcy5jCkBAIC0wLDAgKzEsMTE2OCBAQAorLyogZHMuYzogRG9tYWluIFNlcnZpY2VzIGRyaXZlciBmb3IgTG9naWNhbCBEb21haW5zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL2xkYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vcG93ZXIuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vaGVhZC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJkcyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bCAxMSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gTERPTSBkb21haW4gc2VydmljZXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCitzdHJ1Y3QgZHNfbXNnX3RhZyB7CisJX191MzIJCQl0eXBlOworI2RlZmluZSBEU19JTklUX1JFUQkJMHgwMAorI2RlZmluZSBEU19JTklUX0FDSwkJMHgwMQorI2RlZmluZSBEU19JTklUX05BQ0sJCTB4MDIKKyNkZWZpbmUgRFNfUkVHX1JFUQkJMHgwMworI2RlZmluZSBEU19SRUdfQUNLCQkweDA0CisjZGVmaW5lIERTX1JFR19OQUNLCQkweDA1CisjZGVmaW5lIERTX1VOUkVHX1JFUQkJMHgwNgorI2RlZmluZSBEU19VTlJFR19BQ0sJCTB4MDcKKyNkZWZpbmUgRFNfVU5SRUdfTkFDSwkJMHgwOAorI2RlZmluZSBEU19EQVRBCQkJMHgwOQorI2RlZmluZSBEU19OQUNLCQkJMHgwYQorCisJX191MzIJCQlsZW47Cit9OworCisvKiBSZXN1bHQgY29kZXMgKi8KKyNkZWZpbmUgRFNfT0sJCQkweDAwCisjZGVmaW5lIERTX1JFR19WRVJfTkFDSwkJMHgwMQorI2RlZmluZSBEU19SRUdfRFVQCQkweDAyCisjZGVmaW5lIERTX0lOVl9IREwJCTB4MDMKKyNkZWZpbmUgRFNfVFlQRV9VTktOT1dOCQkweDA0CisKK3N0cnVjdCBkc192ZXJzaW9uIHsKKwlfX3UxNgkJCW1ham9yOworCV9fdTE2CQkJbWlub3I7Cit9OworCitzdHJ1Y3QgZHNfdmVyX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCXN0cnVjdCBkc192ZXJzaW9uCXZlcjsKK307CisKK3N0cnVjdCBkc192ZXJfYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191MTYJCQltaW5vcjsKK307CisKK3N0cnVjdCBkc192ZXJfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTE2CQkJbWFqb3I7Cit9OworCitzdHJ1Y3QgZHNfcmVnX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTE2CQkJbWFqb3I7CisJX191MTYJCQltaW5vcjsKKwljaGFyCQkJc3ZjX2lkWzBdOworfTsKKworc3RydWN0IGRzX3JlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKKwlfX3UxNgkJCW1pbm9yOworfTsKKworc3RydWN0IGRzX3JlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7CisJX191MTYJCQltYWpvcjsKK307CisKK3N0cnVjdCBkc191bnJlZ19yZXEgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7Cit9OworCitzdHJ1Y3QgZHNfZGF0YSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworfTsKKworc3RydWN0IGRzX2RhdGFfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTY0CQkJcmVzdWx0OworfTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSB7CisJX191NjQJCQloYW5kbGU7CisKKwl2b2lkCQkJKCpkYXRhKShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworCWNvbnN0IGNoYXIJCSpzZXJ2aWNlX2lkOworCisJdTgJCQlzdGF0ZTsKKyNkZWZpbmUgQ0FQX1NUQVRFX1VOS05PV04JMHgwMAorI2RlZmluZSBDQVBfU1RBVEVfUkVHX1NFTlQJMHgwMQorI2RlZmluZSBDQVBfU1RBVEVfUkVHSVNURVJFRAkweDAyCit9OworCitzdGF0aWMgdm9pZCBtZF91cGRhdGVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkb21haW5fc2h1dGRvd25fZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCSBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRvbWFpbl9wYW5pY19kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICAgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworI2VuZGlmCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworc3RhdGljIHZvaWQgZHNfdmFyX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSBkc19zdGF0ZXNbXSA9IHsKKwl7CisJCS5zZXJ2aWNlX2lkCT0gIm1kLXVwZGF0ZSIsCisJCS5kYXRhCQk9IG1kX3VwZGF0ZV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJkb21haW4tc2h1dGRvd24iLAorCQkuZGF0YQkJPSBkb21haW5fc2h1dGRvd25fZGF0YSwKKwl9LAorCXsKKwkJLnNlcnZpY2VfaWQJPSAiZG9tYWluLXBhbmljIiwKKwkJLmRhdGEJCT0gZG9tYWluX3BhbmljX2RhdGEsCisJfSwKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwl7CisJCS5zZXJ2aWNlX2lkCT0gImRyLWNwdSIsCisJCS5kYXRhCQk9IGRyX2NwdV9kYXRhLAorCX0sCisjZW5kaWYKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInByaSIsCisJCS5kYXRhCQk9IGRzX3ByaV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJ2YXItY29uZmlnIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInZhci1jb25maWctYmFja3VwIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHNfbG9jayk7CisKK3N0cnVjdCBkc19pbmZvIHsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwJKmxwOworCXU4CQkJaHNfc3RhdGU7CisjZGVmaW5lIERTX0hTX1NUQVJUCQkweDAxCisjZGVmaW5lIERTX0hTX0RPTkUJCTB4MDIKKworCXZvaWQJCQkqcmN2X2J1ZjsKKwlpbnQJCQlyY3ZfYnVmX2xlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHNfaW5mbyAqZHNfaW5mbzsKKworc3RhdGljIHN0cnVjdCBkc19jYXBfc3RhdGUgKmZpbmRfY2FwKHU2NCBoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGluZGV4ID0gaGFuZGxlID4+IDMyOworCisJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUoZHNfc3RhdGVzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZkc19zdGF0ZXNbaW5kZXhdOworfQorCitzdGF0aWMgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZmluZF9jYXBfYnlfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc19zdGF0ZXMpOyBpKyspIHsKKwkJaWYgKHN0cmNtcChkc19zdGF0ZXNbaV0uc2VydmljZV9pZCwgbmFtZSkpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gJmRzX3N0YXRlc1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kc19zZW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKGxwLCBkYXRhLCBsZW4pOworCQlpZiAoIWVyciB8fCAoZXJyICE9IC1FQUdBSU4pKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRzX3NlbmQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCWVyciA9IF9fZHNfc2VuZChscCwgZGF0YSwgbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSB7CisJX191NjQJCQkJcmVxX251bTsKK307CisKK3N0cnVjdCBkc19tZF91cGRhdGVfcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKK307CisKK3N0YXRpYyB2b2lkIG1kX3VwZGF0ZV9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpkcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqZHBrdCA9IGJ1ZjsKKwlzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19tZF91cGRhdGVfcmVzCXJlczsKKwl9IHBrdDsKKworCXJwID0gKHN0cnVjdCBkc19tZF91cGRhdGVfcmVxICopIChkcGt0ICsgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTWFjaGluZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4iKTsKKworCW1kZXNjX3VwZGF0ZSgpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJcGt0LmRhdGEudGFnLmxlbiA9IHNpemVvZihwa3QpIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBkcC0+aGFuZGxlOworCXBrdC5yZXMucmVxX251bSA9IHJwLT5yZXFfbnVtOworCXBrdC5yZXMucmVzdWx0ID0gRFNfT0s7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7Cit9CisKK3N0cnVjdCBkc19zaHV0ZG93bl9yZXEgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJbXNfZGVsYXk7Cit9OworCitzdHJ1Y3QgZHNfc2h1dGRvd25fcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKKwljaGFyCQkJCXJlYXNvblsxXTsKK307CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9zaHV0ZG93bl9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJIHN0cnVjdCBkc19jYXBfc3RhdGUgKmRwLAorCQkJCSB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3NodXRkb3duX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19zaHV0ZG93bl9yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3NodXRkb3duX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJTaHV0ZG93biByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwl3YWtlX3VwX3Bvd2VyZCgpOworfQorCitzdHJ1Y3QgZHNfcGFuaWNfcmVxIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworfTsKKworc3RydWN0IGRzX3BhbmljX3JlcyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisJY2hhcgkJCQlyZWFzb25bMV07Cit9OworCitzdGF0aWMgdm9pZCBkb21haW5fcGFuaWNfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQkgICAgICB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3BhbmljX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19wYW5pY19yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3BhbmljX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJQYW5pYyByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwlwYW5pYygiUEFOSUMgcmVxdWVzdGVkIGJ5IExET00gbWFuYWdlci4iKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RydWN0IGRyX2NwdV90YWcgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJdHlwZTsKKyNkZWZpbmUgRFJfQ1BVX0NPTkZJR1VSRQkJMHg0MworI2RlZmluZSBEUl9DUFVfVU5DT05GSUdVUkUJCTB4NTUKKyNkZWZpbmUgRFJfQ1BVX0ZPUkNFX1VOQ09ORklHVVJFCTB4NDYKKyNkZWZpbmUgRFJfQ1BVX1NUQVRVUwkJCTB4NTMKKworLyogUmVzcG9uc2VzICovCisjZGVmaW5lIERSX0NQVV9PSwkJCTB4NmYKKyNkZWZpbmUgRFJfQ1BVX0VSUk9SCQkJMHg2NQorCisJX191MzIJCQkJbnVtX3JlY29yZHM7Cit9OworCitzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgeworCV9fdTMyCQkJCWNwdTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERSX0NQVV9SRVNfT0sJCQkweDAwCisjZGVmaW5lIERSX0NQVV9SRVNfRkFJTFVSRQkJMHgwMQorI2RlZmluZSBEUl9DUFVfUkVTX0JMT0NLRUQJCTB4MDIKKyNkZWZpbmUgRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkcJMHgwMworI2RlZmluZSBEUl9DUFVfUkVTX05PVF9JTl9NRAkJMHgwNAorCisJX191MzIJCQkJc3RhdDsKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfTk9UX1BSRVNFTlQJCTB4MDAKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfVU5DT05GSUdVUkVECTB4MDEKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRAkJMHgwMgorCisJX191MzIJCQkJc3RyX29mZjsKK307CisKK3N0YXRpYyB2b2lkIF9fZHJfY3B1X3NlbmRfZXJyb3Ioc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsIHN0cnVjdCBkc19kYXRhICpkYXRhKQoreworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKGRhdGEgKyAxKTsKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBkc19pbmZvOworCXN0cnVjdCB7CisJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQlzdHJ1Y3QgZHJfY3B1X3RhZwl0YWc7CisJfSBwa3Q7CisJaW50IG1zZ19sZW47CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCXBrdC50YWcucmVxX251bSA9IHRhZy0+cmVxX251bTsKKwlwa3QudGFnLnR5cGUgPSBEUl9DUFVfRVJST1I7CisJcGt0LnRhZy5udW1fcmVjb3JkcyA9IDA7CisKKwltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQkgICBzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpKTsKKworCXBrdC5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfc2VuZF9lcnJvcihzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwgc3RydWN0IGRzX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJX19kcl9jcHVfc2VuZF9lcnJvcihjcCwgZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIENQVV9TRU5USU5FTAkweGZmZmZmZmZmCisKK3N0YXRpYyB2b2lkIHB1cmdlX2R1cHModTMyICpsaXN0LCB1MzIgbnVtX2VudHMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHM7IGkrKykgeworCQl1MzIgY3B1ID0gbGlzdFtpXTsKKwkJdW5zaWduZWQgaW50IGo7CisKKwkJaWYgKGNwdSA9PSBDUFVfU0VOVElORUwpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSBpICsgMTsgaiA8IG51bV9lbnRzOyBqKyspIHsKKwkJCWlmIChsaXN0W2pdID09IGNwdSkKKwkJCQlsaXN0W2pdID0gQ1BVX1NFTlRJTkVMOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGRyX2NwdV9zaXplX3Jlc3BvbnNlKGludCBuY3B1cykKK3sKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQlzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpICsKKwkJKHNpemVvZihzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkpICogbmNwdXMpKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X2luaXRfcmVzcG9uc2Uoc3RydWN0IGRzX2RhdGEgKnJlc3AsIHU2NCByZXFfbnVtLAorCQkJCSB1NjQgaGFuZGxlLCBpbnQgcmVzcF9sZW4sIGludCBuY3B1cywKKwkJCQkgY3B1bWFza190ICptYXNrLCB1MzIgZGVmYXVsdF9zdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGksIGNwdTsKKworCXRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAocmVzcCArIDEpOworCWVudCA9IChzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgKikgKHRhZyArIDEpOworCisJcmVzcC0+dGFnLnR5cGUgPSBEU19EQVRBOworCXJlc3AtPnRhZy5sZW4gPSByZXNwX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZyk7CisJcmVzcC0+aGFuZGxlID0gaGFuZGxlOworCXRhZy0+cmVxX251bSA9IHJlcV9udW07CisJdGFnLT50eXBlID0gRFJfQ1BVX09LOworCXRhZy0+bnVtX3JlY29yZHMgPSBuY3B1czsKKworCWkgPSAwOworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJZW50W2ldLmNwdSA9IGNwdTsKKwkJZW50W2ldLnJlc3VsdCA9IERSX0NQVV9SRVNfT0s7CisJCWVudFtpXS5zdGF0ID0gZGVmYXVsdF9zdGF0OworCQlpKys7CisJfQorCUJVR19PTihpICE9IG5jcHVzKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X21hcmsoc3RydWN0IGRzX2RhdGEgKnJlc3AsIGludCBjcHUsIGludCBuY3B1cywKKwkJCXUzMiByZXMsIHUzMiBzdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGk7CisKKwl0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKHJlc3AgKyAxKTsKKwllbnQgPSAoc3RydWN0IGRyX2NwdV9yZXNwX2VudHJ5ICopICh0YWcgKyAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBuY3B1czsgaSsrKSB7CisJCWlmIChlbnRbaV0uY3B1ICE9IGNwdSkKKwkJCWNvbnRpbnVlOworCQllbnRbaV0ucmVzdWx0ID0gcmVzOworCQllbnRbaV0uc3RhdCA9IHN0YXQ7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBkcl9jcHVfY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICBjcHVtYXNrX3QgKm1hc2spCit7CisJc3RydWN0IGRzX2RhdGEgKnJlc3A7CisJaW50IHJlc3BfbGVuLCBuY3B1cywgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluY3B1cyA9IGNwdXNfd2VpZ2h0KCptYXNrKTsKKwlyZXNwX2xlbiA9IGRyX2NwdV9zaXplX3Jlc3BvbnNlKG5jcHVzKTsKKwlyZXNwID0ga3phbGxvYyhyZXNwX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRyX2NwdV9pbml0X3Jlc3BvbnNlKHJlc3AsIHJlcV9udW0sIGNwLT5oYW5kbGUsCisJCQkgICAgIHJlc3BfbGVuLCBuY3B1cywgbWFzaywKKwkJCSAgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisKKwltZGVzY19maWxsX2luX2NwdV9kYXRhKCptYXNrKTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJaW50IGVycjsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RhcnRpbmcgY3B1ICVkLi4uXG4iLCBjcHUpOworCQllcnIgPSBjcHVfdXAoY3B1KTsKKwkJaWYgKGVycikgeworCQkJX191MzIgcmVzID0gRFJfQ1BVX1JFU19GQUlMVVJFOworCQkJX191MzIgc3RhdCA9IERSX0NQVV9TVEFUX1VOQ09ORklHVVJFRDsKKworCQkJaWYgKCFjcHVfcHJlc2VudChjcHUpKSB7CisJCQkJLyogQ1BVIG5vdCBwcmVzZW50IGluIE1EICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19OT1RfSU5fTUQ7CisJCQkJc3RhdCA9IERSX0NQVV9TVEFUX05PVF9QUkVTRU5UOworCQkJfSBlbHNlIGlmIChlcnIgPT0gLUVOT0RFVikgeworCQkJCS8qIENQVSBkaWQgbm90IGNhbGwgaW4gc3VjY2Vzc2Z1bGx5ICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkc7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFUgc3RhcnR1cCBmYWlsZWQgZXJyPSVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlkcl9jcHVfbWFyayhyZXNwLCBjcHUsIG5jcHVzLCByZXMsIHN0YXQpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCS8qIFJlZGlzdHJpYnV0ZSBJUlFzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBuZXcgY3B1cy4gICovCisJZml4dXBfaXJxcygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJfY3B1X3VuY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICAgIGNwdW1hc2tfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqcmVzcDsKKwlpbnQgcmVzcF9sZW4sIG5jcHVzLCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5jcHVzID0gY3B1c193ZWlnaHQoKm1hc2spOworCXJlc3BfbGVuID0gZHJfY3B1X3NpemVfcmVzcG9uc2UobmNwdXMpOworCXJlc3AgPSBremFsbG9jKHJlc3BfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3ApCisJCXJldHVybiAtRU5PTUVNOworCisJZHJfY3B1X2luaXRfcmVzcG9uc2UocmVzcCwgcmVxX251bSwgY3AtPmhhbmRsZSwKKwkJCSAgICAgcmVzcF9sZW4sIG5jcHVzLCBtYXNrLAorCQkJICAgICBEUl9DUFVfU1RBVF9VTkNPTkZJR1VSRUQpOworCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCAqbWFzaykgeworCQlpbnQgZXJyOworCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFVbJWRdOiBTaHV0dGluZyBkb3duIGNwdSAlZC4uLlxuIiwKKwkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1KTsKKwkJZXJyID0gY3B1X2Rvd24oY3B1KTsKKwkJaWYgKGVycikKKwkJCWRyX2NwdV9tYXJrKHJlc3AsIGNwdSwgbmNwdXMsCisJCQkJICAgIERSX0NQVV9SRVNfRkFJTFVSRSwKKwkJCQkgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRhdGEgPSBidWY7CisJc3RydWN0IGRyX2NwdV90YWcgKnRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAoZGF0YSArIDEpOworCXUzMiAqY3B1X2xpc3QgPSAodTMyICopICh0YWcgKyAxKTsKKwl1NjQgcmVxX251bSA9IHRhZy0+cmVxX251bTsKKwljcHVtYXNrX3QgbWFzazsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJc3dpdGNoICh0YWctPnR5cGUpIHsKKwljYXNlIERSX0NQVV9DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfVU5DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfRk9SQ0VfVU5DT05GSUdVUkU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworCQlyZXR1cm47CisJfQorCisJcHVyZ2VfZHVwcyhjcHVfbGlzdCwgdGFnLT5udW1fcmVjb3Jkcyk7CisKKwljcHVzX2NsZWFyKG1hc2spOworCWZvciAoaSA9IDA7IGkgPCB0YWctPm51bV9yZWNvcmRzOyBpKyspIHsKKwkJaWYgKGNwdV9saXN0W2ldID09IENQVV9TRU5USU5FTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjcHVfbGlzdFtpXSA8IE5SX0NQVVMpCisJCQljcHVfc2V0KGNwdV9saXN0W2ldLCBtYXNrKTsKKwl9CisKKwlpZiAodGFnLT50eXBlID09IERSX0NQVV9DT05GSUdVUkUpCisJCWVyciA9IGRyX2NwdV9jb25maWd1cmUoY3AsIHJlcV9udW0sICZtYXNrKTsKKwllbHNlCisJCWVyciA9IGRyX2NwdV91bmNvbmZpZ3VyZShjcCwgcmVxX251bSwgJm1hc2spOworCisJaWYgKGVycikKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdHJ1Y3QgZHNfcHJpX21zZyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3U2NAkJCQl0eXBlOworI2RlZmluZSBEU19QUklfUkVRVUVTVAkJCTB4MDAKKyNkZWZpbmUgRFNfUFJJX0RBVEEJCQkweDAxCisjZGVmaW5lIERTX1BSSV9VUERBVEUJCQkweDAyCit9OworCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3ByaV9tc2cgKnJwOworCisJcnAgPSAoc3RydWN0IGRzX3ByaV9tc2cgKikgKGRwa3QgKyAxKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJQUkkgUkVRIFslbHg6JWx4XSwgbGVuPSVkXG4iLAorCSAgICAgICBycC0+cmVxX251bSwgcnAtPnR5cGUsIGxlbik7Cit9CisKK3N0cnVjdCBkc192YXJfaGRyIHsKKwlfX3UzMgkJCQl0eXBlOworI2RlZmluZSBEU19WQVJfU0VUX1JFUQkJCTB4MDAKKyNkZWZpbmUgRFNfVkFSX0RFTEVURV9SRVEJCTB4MDEKKyNkZWZpbmUgRFNfVkFSX1NFVF9SRVNQCQkJMHgwMgorI2RlZmluZSBEU19WQVJfREVMRVRFX1JFU1AJCTB4MDMKK307CisKK3N0cnVjdCBkc192YXJfc2V0X21zZyB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwljaGFyCQkJCW5hbWVfYW5kX3ZhbHVlWzBdOworfTsKKworc3RydWN0IGRzX3Zhcl9kZWxldGVfbXNnIHsKKwlzdHJ1Y3QgZHNfdmFyX2hkcgkJaGRyOworCWNoYXIJCQkJbmFtZVswXTsKK307CisKK3N0cnVjdCBkc192YXJfcmVzcCB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERTX1ZBUl9TVUNDRVNTCQkJMHgwMAorI2RlZmluZSBEU19WQVJfTk9fU1BBQ0UJCQkweDAxCisjZGVmaW5lIERTX1ZBUl9JTlZBTElEX1ZBUgkJMHgwMgorI2RlZmluZSBEU19WQVJfSU5WQUxJRF9WQUwJCTB4MDMKKyNkZWZpbmUgRFNfVkFSX05PVF9QUkVTRU5UCQkweDA0Cit9OworCitzdGF0aWMgREVGSU5FX01VVEVYKGRzX3Zhcl9tdXRleCk7CitzdGF0aWMgaW50IGRzX3Zhcl9kb29yYmVsbDsKK3N0YXRpYyBpbnQgZHNfdmFyX3Jlc3BvbnNlOworCitzdGF0aWMgdm9pZCBkc192YXJfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3Zhcl9yZXNwICpycDsKKworCXJwID0gKHN0cnVjdCBkc192YXJfcmVzcCAqKSAoZHBrdCArIDEpOworCisJaWYgKHJwLT5oZHIudHlwZSAhPSBEU19WQVJfU0VUX1JFU1AgJiYKKwkgICAgcnAtPmhkci50eXBlICE9IERTX1ZBUl9ERUxFVEVfUkVTUCkKKwkJcmV0dXJuOworCisJZHNfdmFyX3Jlc3BvbnNlID0gcnAtPnJlc3VsdDsKKwl3bWIoKTsKKwlkc192YXJfZG9vcmJlbGwgPSAxOworfQorCit2b2lkIGxkb21fc2V0X3Zhcihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBkc19pbmZvICpkcCA9IGRzX2luZm87CisJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3A7CisKKwljcCA9IGZpbmRfY2FwX2J5X3N0cmluZygidmFyLWNvbmZpZyIpOworCWlmIChjcC0+c3RhdGUgIT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCWNwID0gZmluZF9jYXBfYnlfc3RyaW5nKCJ2YXItY29uZmlnLWJhY2t1cCIpOworCisJaWYgKGNwLT5zdGF0ZSA9PSBDQVBfU1RBVEVfUkVHSVNURVJFRCkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQkJCXN0cnVjdCBkc192YXJfc2V0X21zZwltc2c7CisJCQl9IGhlYWRlcjsKKwkJCWNoYXIJCQlhbGxbNTEyXTsKKwkJfSBwa3Q7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWNoYXIgICpiYXNlLCAqcDsKKwkJaW50IG1zZ19sZW4sIGxvb3BzOworCisJCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJCXBrdC5oZWFkZXIuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJCXBrdC5oZWFkZXIuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwa3QuaGVhZGVyLm1zZy5oZHIudHlwZSA9IERTX1ZBUl9TRVRfUkVROworCQliYXNlID0gcCA9ICZwa3QuaGVhZGVyLm1zZy5uYW1lX2FuZF92YWx1ZVswXTsKKwkJc3RyY3B5KHAsIHZhcik7CisJCXAgKz0gc3RybGVuKHZhcikgKyAxOworCQlzdHJjcHkocCwgdmFsdWUpOworCQlwICs9IHN0cmxlbih2YWx1ZSkgKyAxOworCisJCW1zZ19sZW4gPSAoc2l6ZW9mKHN0cnVjdCBkc19kYXRhKSArCisJCQkgICBzaXplb2Yoc3RydWN0IGRzX3Zhcl9zZXRfbXNnKSArCisJCQkgICAocCAtIGJhc2UpKTsKKwkJbXNnX2xlbiA9IChtc2dfbGVuICsgMykgJiB+MzsKKwkJcGt0LmhlYWRlci5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCQltdXRleF9sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJCWRzX3Zhcl9kb29yYmVsbCA9IDA7CisJCWRzX3Zhcl9yZXNwb25zZSA9IC0xOworCisJCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwkJbG9vcHMgPSAxMDAwOworCQl3aGlsZSAoZHNfdmFyX2Rvb3JiZWxsID09IDApIHsKKwkJCWlmIChsb29wcy0tIDwgMCkKKwkJCQlicmVhazsKKwkJCWJhcnJpZXIoKTsKKwkJCXVkZWxheSgxMDApOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCWlmIChkc192YXJfZG9vcmJlbGwgPT0gMCB8fAorCQkgICAgZHNfdmFyX3Jlc3BvbnNlICE9IERTX1ZBUl9TVUNDRVNTKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmFyLWNvbmZpZyBbJXM6JXNdICIKKwkJCSAgICAgICAiZmFpbGVkLCByZXNwb25zZSglZCkuXG4iLAorCQkJICAgICAgIHZhciwgdmFsdWUsCisJCQkgICAgICAgZHNfdmFyX3Jlc3BvbnNlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2YXItY29uZmlnIG5vdCByZWdpc3RlcmVkIHNvICIKKwkJICAgICAgICJjb3VsZCBub3Qgc2V0ICglcykgdmFyaWFibGUgdG8gKCVzKS5cbiIsCisJCSAgICAgICB2YXIsIHZhbHVlKTsKKwl9Cit9CisKK3ZvaWQgbGRvbV9yZWJvb3QoY29uc3QgY2hhciAqYm9vdF9jb21tYW5kKQoreworCS8qIERvbid0IGJvdGhlciB3aXRoIGFueSBvZiB0aGlzIGlmIHRoZSBib290X2NvbW1hbmQKKwkgKiBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoYm9vdF9jb21tYW5kICYmIHN0cmxlbihib290X2NvbW1hbmQpKSB7CisJCWNoYXIgZnVsbF9ib290X3N0clsyNTZdOworCisJCXN0cmNweShmdWxsX2Jvb3Rfc3RyLCAiYm9vdCAiKTsKKwkJc3RyY3B5KGZ1bGxfYm9vdF9zdHIgKyBzdHJsZW4oImJvb3QgIiksIGJvb3RfY29tbWFuZCk7CisKKwkJbGRvbV9zZXRfdmFyKCJyZWJvb3QtY29tbWFuZCIsIGZ1bGxfYm9vdF9zdHIpOworCX0KKwlzdW40dl9tYWNoX3NpcigpOworfQorCit2b2lkIGxkb21fcG93ZXJfb2ZmKHZvaWQpCit7CisJc3VuNHZfbWFjaF9leGl0KDApOworfQorCitzdGF0aWMgdm9pZCBkc19jb25uX3Jlc2V0KHN0cnVjdCBkc19pbmZvICpkcCkKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICJkc19jb25uX3Jlc2V0KCkgZnJvbSAlcFxuIiwKKwkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl9zZXJ2aWNlcyhzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRzX3N0YXRlcyk7IGkrKykgeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGRzX3JlZ19yZXEgcmVxOworCQkJdTggaWRfYnVmWzI1Nl07CisJCX0gcGJ1ZjsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSAmZHNfc3RhdGVzW2ldOworCQlpbnQgZXJyLCBtc2dfbGVuOworCQl1NjQgbmV3X2NvdW50OworCisJCWlmIChjcC0+c3RhdGUgPT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCQljb250aW51ZTsKKworCQluZXdfY291bnQgPSBzY2hlZF9jbG9jaygpICYgMHhmZmZmZmZmZjsKKwkJY3AtPmhhbmRsZSA9ICgodTY0KSBpIDw8IDMyKSB8IG5ld19jb3VudDsKKworCQltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfcmVnX3JlcSkgKworCQkJICAgc3RybGVuKGNwLT5zZXJ2aWNlX2lkKSk7CisKKwkJbWVtc2V0KCZwYnVmLCAwLCBzaXplb2YocGJ1ZikpOworCQlwYnVmLnJlcS50YWcudHlwZSA9IERTX1JFR19SRVE7CisJCXBidWYucmVxLnRhZy5sZW4gPSAobXNnX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpOworCQlwYnVmLnJlcS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwYnVmLnJlcS5tYWpvciA9IDE7CisJCXBidWYucmVxLm1pbm9yID0gMDsKKwkJc3RyY3B5KHBidWYucmVxLnN2Y19pZCwgY3AtPnNlcnZpY2VfaWQpOworCisJCWVyciA9IF9fZHNfc2VuZChscCwgJnBidWYsIG1zZ19sZW4pOworCQlpZiAoZXJyID4gMCkKKwkJCWNwLT5zdGF0ZSA9IENBUF9TVEFURV9SRUdfU0VOVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfaGFuZHNoYWtlKHN0cnVjdCBkc19pbmZvICpkcCwgc3RydWN0IGRzX21zZ190YWcgKnBrdCkKK3sKKworCWlmIChkcC0+aHNfc3RhdGUgPT0gRFNfSFNfU1RBUlQpIHsKKwkJaWYgKHBrdC0+dHlwZSAhPSBEU19JTklUX0FDSykKKwkJCWdvdG8gY29ubl9yZXNldDsKKworCQlkcC0+aHNfc3RhdGUgPSBEU19IU19ET05FOworCisJCXJldHVybiByZWdpc3Rlcl9zZXJ2aWNlcyhkcCk7CisJfQorCisJaWYgKGRwLT5oc19zdGF0ZSAhPSBEU19IU19ET05FKQorCQlnb3RvIGNvbm5fcmVzZXQ7CisKKwlpZiAocGt0LT50eXBlID09IERTX1JFR19BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19hY2sgKmFwID0gKHN0cnVjdCBkc19yZWdfYWNrICopIHBrdDsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSBmaW5kX2NhcChhcC0+aGFuZGxlKTsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSRUcgQUNLIGZvciB1bmtub3duIGhhbmRsZSAlbHhcbiIsCisJCQkgICAgICAgYXAtPmhhbmRsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUmVnaXN0ZXJlZCAlcyBzZXJ2aWNlLlxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQ7CisJfSBlbHNlIGlmIChwa3QtPnR5cGUgPT0gRFNfUkVHX05BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19uYWNrICpucCA9IChzdHJ1Y3QgZHNfcmVnX25hY2sgKikgcGt0OworCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCA9IGZpbmRfY2FwKG5wLT5oYW5kbGUpOworCisJCWlmICghY3ApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIlJFRyBOQUNLIGZvciAiCisJCQkgICAgICAgInVua25vd24gaGFuZGxlICVseFxuIiwKKwkJCSAgICAgICBucC0+aGFuZGxlKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgJXMgc2VydmljZVxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1VOS05PV047CisJfQorCisJcmV0dXJuIDA7CisKK2Nvbm5fcmVzZXQ6CisJZHNfY29ubl9yZXNldChkcCk7CisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgdm9pZCBfX3NlbmRfZHNfbmFjayhzdHJ1Y3QgZHNfaW5mbyAqZHAsIHU2NCBoYW5kbGUpCit7CisJc3RydWN0IGRzX2RhdGFfbmFjayBuYWNrID0geworCQkudGFnID0geworCQkJLnR5cGUgPSBEU19OQUNLLAorCQkJLmxlbiA9IChzaXplb2Yoc3RydWN0IGRzX2RhdGFfbmFjaykgLQorCQkJCXNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpLAorCQl9LAorCQkuaGFuZGxlID0gaGFuZGxlLAorCQkucmVzdWx0ID0gRFNfSU5WX0hETCwKKwl9OworCisJX19kc19zZW5kKGRwLT5scCwgJm5hY2ssIHNpemVvZihuYWNrKSk7Cit9CisKK3N0YXRpYyBMSVNUX0hFQUQoZHNfd29ya19saXN0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChkc193YWl0KTsKKworc3RydWN0IGRzX3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCWludAkJCQlyZXFfbGVuOworCWludAkJCQlfX3BhZDsKKwl1NjQJCQkJcmVxWzBdOworfTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19kc193b3JrKHZvaWQpCit7CisJc3RydWN0IGRzX3F1ZXVlX2VudHJ5ICpxcCwgKnRtcDsKKwlzdGF0aWMgc3RydWN0IGRzX2luZm8gKmRwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKHRvZG8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZSgmZHNfd29ya19saXN0LCAmdG9kbyk7CisJSU5JVF9MSVNUX0hFQUQoJmRzX3dvcmtfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJZHAgPSBkc19pbmZvOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFwLCB0bXAsICZ0b2RvLCBsaXN0KSB7CisJCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gKHN0cnVjdCBkc19kYXRhICopIHFwLT5yZXE7CisJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gZmluZF9jYXAoZHBrdC0+aGFuZGxlKTsKKwkJaW50IHJlcV9sZW4gPSBxcC0+cmVxX2xlbjsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJEYXRhIGZvciB1bmtub3duIGhhbmRsZSAlbHVcbiIsCisJCQkgICAgICAgZHBrdC0+aGFuZGxlKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJCV9fc2VuZF9kc19uYWNrKGRwLCBkcGt0LT5oYW5kbGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJY3AtPmRhdGEoZHAtPmxwLCBjcCwgZHBrdCwgcmVxX2xlbik7CisJCX0KKworCQlsaXN0X2RlbCgmcXAtPmxpc3QpOworCQlrZnJlZShxcCk7CisJfQorfQorCitzdGF0aWMgaW50IGRzX3RocmVhZCh2b2lkICpfX3VudXNlZCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXdoaWxlICgxKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmZHNfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChsaXN0X2VtcHR5KCZkc193b3JrX2xpc3QpKQorCQkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmRzX3dhaXQsICZ3YWl0KTsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJcHJvY2Vzc19kc193b3JrKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfZGF0YShzdHJ1Y3QgZHNfaW5mbyAqZHAsIHN0cnVjdCBkc19tc2dfdGFnICpwa3QsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSAoc3RydWN0IGRzX2RhdGEgKikgcGt0OworCXN0cnVjdCBkc19xdWV1ZV9lbnRyeSAqcXA7CisKKwlxcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkc19xdWV1ZV9lbnRyeSkgKyBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghcXApIHsKKwkJX19zZW5kX2RzX25hY2soZHAsIGRwa3QtPmhhbmRsZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZxcC0+cmVxLCBwa3QsIGxlbik7CisJCWxpc3RfYWRkX3RhaWwoJnFwLT5saXN0LCAmZHNfd29ya19saXN0KTsKKwkJd2FrZV91cCgmZHNfd2FpdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc191cChzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlzdHJ1Y3QgZHNfdmVyX3JlcSByZXE7CisJaW50IGVycjsKKworCXJlcS50YWcudHlwZSA9IERTX0lOSVRfUkVROworCXJlcS50YWcubGVuID0gc2l6ZW9mKHJlcSkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXJlcS52ZXIubWFqb3IgPSAxOworCXJlcS52ZXIubWlub3IgPSAwOworCisJZXJyID0gX19kc19zZW5kKGxwLCAmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKGVyciA+IDApCisJCWRwLT5oc19zdGF0ZSA9IERTX0hTX1NUQVJUOworfQorCitzdGF0aWMgdm9pZCBkc19ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBhcmc7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQlkc191cChkcCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZHNfbXNnX3RhZyAqdGFnOworCisJCWVyciA9IGxkY19yZWFkKGxwLCBkcC0+cmN2X2J1Ziwgc2l6ZW9mKCp0YWcpKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyID09IDApCisJCQlicmVhazsKKworCQl0YWcgPSBkcC0+cmN2X2J1ZjsKKwkJZXJyID0gbGRjX3JlYWQobHAsIHRhZyArIDEsIHRhZy0+bGVuKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyIDwgdGFnLT5sZW4pCisJCQlicmVhazsKKworCQlpZiAodGFnLT50eXBlIDwgRFNfREFUQSkKKwkJCWVyciA9IGRzX2hhbmRzaGFrZShkcCwgZHAtPnJjdl9idWYpOworCQllbHNlCisJCQllcnIgPSBkc19kYXRhKGRwLCBkcC0+cmN2X2J1ZiwKKwkJCQkgICAgICBzaXplb2YoKnRhZykgKyBlcnIpOworCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkc19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgaW50IGRzX3ZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGRzX2NmZyA9IHsKKwkJLmV2ZW50CQk9IGRzX2V2ZW50LAorCQkubXR1CQk9IDQwOTYsCisJCS5tb2RlCQk9IExEQ19NT0RFX1NUUkVBTSwKKwl9OworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGRzX2luZm8gKmRwOworCWludCBlcnI7CisKKwlpZiAoZHNfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRwID0ga3phbGxvYyhzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWRwKQorCQlnb3RvIG91dF9lcnI7CisKKwlkcC0+cmN2X2J1ZiA9IGt6YWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcC0+cmN2X2J1ZikKKwkJZ290byBvdXRfZnJlZV9kcDsKKworCWRwLT5yY3ZfYnVmX2xlbiA9IDQwOTY7CisKKwlkc19jZmcudHhfaXJxID0gdmRldi0+dHhfaXJxOworCWRzX2NmZy5yeF9pcnEgPSB2ZGV2LT5yeF9pcnE7CisKKwlscCA9IGxkY19hbGxvYyh2ZGV2LT5jaGFubmVsX2lkLCAmZHNfY2ZnLCBkcCk7CisJaWYgKElTX0VSUihscCkpIHsKKwkJZXJyID0gUFRSX0VSUihscCk7CisJCWdvdG8gb3V0X2ZyZWVfcmN2X2J1ZjsKKwl9CisJZHAtPmxwID0gbHA7CisKKwllcnIgPSBsZGNfYmluZChscCwgIkRTIik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlkc19pbmZvID0gZHA7CisKKwlzdGFydF9wb3dlcmQoKTsKKworCXJldHVybiBlcnI7CisKK291dF9mcmVlX2xkYzoKKwlsZGNfZnJlZShkcC0+bHApOworCitvdXRfZnJlZV9yY3ZfYnVmOgorCWtmcmVlKGRwLT5yY3ZfYnVmKTsKKworb3V0X2ZyZWVfZHA6CisJa2ZyZWUoZHApOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgZHNfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gImRvbWFpbi1zZXJ2aWNlcy1wb3J0IiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIGRzX2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSBkc19tYXRjaCwKKwkucHJvYmUJCT0gZHNfcHJvYmUsCisJLnJlbW92ZQkJPSBkc19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImRzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHNfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNfc3RhdGVzKTsgaSsrKQorCQlkc19zdGF0ZXNbaV0uaGFuZGxlID0gKCh1NjQpaSA8PCAzMik7CisKKwlrdGhyZWFkX3J1bihkc190aHJlYWQsIE5VTEwsICJrbGRvbWQiKTsKKworCXJldHVybiB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZkc19kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwoZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZ0cmFtcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTA5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUwpAQCAtMCwwICsxLDEzOSBAQAorLyogaHZ0cmFtcC5TOiBIeXBlcnZpc29yIHN0YXJ0LWNwdSB0cmFtcG9saW5lIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vc2NyYXRjaHBhZC5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9odnRyYW1wLmg+CisjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYXNpLmg+CisKKwkudGV4dAorCS5hbGlnbgkJOAorCS5nbG9ibAkJaHZfY3B1X3N0YXJ0dXAsIGh2X2NwdV9zdGFydHVwX2VuZAorCisJLyogVGhpcyBjb2RlIGV4ZWN1dGVzIGRpcmVjdGx5IG91dCBvZiB0aGUgaHlwZXJ2aXNvcgorCSAqIHdpdGggcGh5c2ljYWwgYWRkcmVzc2luZyAodmE9PXBhKS4gICVvMCBjb250YWlucworCSAqIG91ciBjbGllbnQgYXJndW1lbnQgd2hpY2ggZm9yIExpbnV4IHBvaW50cyB0bworCSAqIGEgZGVzY3JpcHRvciBkYXRhIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZQorCSAqIE1NVSBlbnRyaWVzIHdlIG5lZWQgdG8gbG9hZCB1cC4KKwkgKgorCSAqIEFmdGVyIHdlIHNldCB0aGluZ3MgdXAgd2UgZW5hYmxlIHRoZSBNTVUgYW5kIGNhbGwKKwkgKiBpbnRvIHRoZSBrZXJuZWwuCisJICoKKwkgKiBGaXJzdCBzZXR1cCBiYXNpYyBwcml2aWxlZ2VkIGNwdSBzdGF0ZS4KKwkgKi8KK2h2X2NwdV9zdGFydHVwOgorCXdycHIJCSVnMCwgMCwgJWdsCisJd3JwcgkJJWcwLCAxNSwgJXBpbAorCXdycHIJCSVnMCwgMCwgJWNhbnJlc3RvcmUKKwl3cnByCQklZzAsIDAsICVvdGhlcndpbgorCXdycHIJCSVnMCwgNiwgJWNhbnNhdmUKKwl3cnByCQklZzAsIDYsICVjbGVhbndpbgorCXdycHIJCSVnMCwgMCwgJWN3cAorCXdycHIJCSVnMCwgMCwgJXdzdGF0ZQorCXdycHIJCSVnMCwgMCwgJXRsCisKKwlzZXRoaQkJJWhpKHNwYXJjNjRfdHRhYmxlX3RsMCksICVnMQorCXdycHIJCSVnMSwgJXRiYQorCisJbW92CQklbzAsICVsMAorCisJbGR1dwkJWyVsMCArIEhWVFJBTVBfREVTQ1JfQ1BVXSwgJWcxCisJbW92CQlTQ1JBVENIUEFEX0NQVUlELCAlZzIKKwlzdHhhCQklZzEsIFslZzJdIEFTSV9TQ1JBVENIUEFECisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fVkFdLCAlZzIKKwlzdHhhCQklZzIsIFslZzBdIEFTSV9TQ1JBVENIUEFECisKKwltb3YJCTAsICVsMQorCWxkdXcJCVslbDAgKyBIVlRSQU1QX0RFU0NSX05VTV9NQVBQSU5HU10sICVsMgorCWFkZAkJJWwwLCBIVlRSQU1QX0RFU0NSX01BUFMsICVsMworCisxOglsZHgJCVslbDMgKyBIVlRSQU1QX01BUFBJTkdfVkFERFJdLCAlbzAKKwljbHIJCSVvMQorCWxkeAkJWyVsMyArIEhWVFJBTVBfTUFQUElOR19UVEVdLCAlbzIKKwltb3YJCUhWX01NVV9JTU1VIHwgSFZfTU1VX0RNTVUsICVvMworCW1vdgkJSFZfRkFTVF9NTVVfTUFQX1BFUk1fQUREUiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwlhZGQJCSVsMSwgMSwgJWwxCisJY21wCQklbDEsICVsMgorCWJsdCxhLHB0CSV4Y2MsIDFiCisJIGFkZAkJJWwzLCBIVlRSQU1QX01BUFBJTkdfU0laRSwgJWwzCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fUEFdLCAlbzAKKwltb3YJCUhWX0ZBU1RfTU1VX0ZBVUxUX0FSRUFfQ09ORiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwl3cnByCQklZzAsIChQU1RBVEVfUFJJViB8IFBTVEFURV9QRUYpLCAlcHN0YXRlCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX1RIUkVBRF9SRUddLCAlbDYKKworCW1vdgkJMSwgJW8wCisJc2V0CQkxZiwgJW8xCisJbW92CQlIVl9GQVNUX01NVV9FTkFCTEUsICVvNQorCXRhCQlIVl9GQVNUX1RSQVAKKworCWJhLHB0CQkleGNjLCA4MGYKKwkgbm9wCisKKzE6CisJd3IJCSVnMCwgMCwgJWZwcnMKKwl3cgkJJWcwLCBBU0lfUCwgJWFzaQorCisJbW92CQlQUklNQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJU0VDT05EQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJJWw2LCAlZzYKKwlsZHgJCVslZzYgKyBUSV9UQVNLXSwgJWc0CisKKwltb3YJCTEsICVnNQorCXNsbHgJCSVnNSwgVEhSRUFEX1NISUZULCAlZzUKKwlzdWIJCSVnNSwgKFNUQUNLRlJBTUVfU1ogKyBTVEFDS19CSUFTKSwgJWc1CisJYWRkCQklZzYsICVnNSwgJXNwCisJbW92CQkwLCAlZnAKKworCWNhbGwJCWluaXRfaXJxd29ya19jdXJjcHUKKwkgbm9wCisJY2FsbAkJaGFyZF9zbXBfcHJvY2Vzc29yX2lkCisJIG5vcAorCisJbW92CQklbzAsICVvMQorCW1vdgkJMCwgJW8wCisJbW92CQkwLCAlbzIKKwljYWxsCQlzdW40dl9pbml0X21vbmRvX3F1ZXVlcworCSBtb3YJCTEsICVvMworCisJY2FsbAkJaW5pdF9jdXJfY3B1X3RyYXAKKwkgbW92CQklZzYsICVvMAorCisJd3JwcgkJJWcwLCAoUFNUQVRFX1BSSVYgfCBQU1RBVEVfUEVGIHwgUFNUQVRFX0lFKSwgJXBzdGF0ZQorCisJY2FsbAkJc21wX2NhbGxpbgorCSBub3AKKwljYWxsCQljcHVfaWRsZQorCSBtb3YJCTAsICVvMAorCWNhbGwJCWNwdV9wYW5pYworCSBub3AKKworODA6CWJhLHB0CQkleGNjLCA4MGIKKwkgbm9wCisKKwkuYWxpZ24JCTgKK2h2X2NwdV9zdGFydHVwX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCmluZGV4IDZiNjE2NWQzLi44Y2IzMzU4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKQEAgLTI5Myw2ICsyOTMsMTEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR1X3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlydF9pcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXN1bjR1X2lycV9lbmFibGUodmlydF9pcnEpOworfQorCiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlycV9oYW5kbGVyX2RhdGEgKmRhdGEgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJ0X2lycSk7CkBAIC0zMDksNiArMzE0LDEwIEBACiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZW5kKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaXJxX2hhbmRsZXJfZGF0YSAqZGF0YSA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnRfaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIHZpcnRfaXJxOworCisJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKKwkJcmV0dXJuOwogCiAJaWYgKGxpa2VseShkYXRhKSkKIAkJdXBhX3dyaXRlcShJQ0xSX0lETEUsIGRhdGEtPmljbHIpOwpAQCAtMzQwLDYgKzM0OSwyNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQ7CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZXJyID0gc3VuNHZfaW50cl9zZXR0YXJnZXQoaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl9pbnRyX3NldHRhcmdldCgleCwlbHUpOiBlcnIoJWQpXG4iLAorCQkJICAgICAgIGlubywgY3B1aWQsIGVycik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzdW40dl9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CkBAIC0zNzMsNiArNDAwLDEwIEBACiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CiAJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgdmlydF9pcnE7CisKKwlpZiAodW5saWtlbHkoZGVzYy0+c3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQlyZXR1cm47CiAKIAlpZiAobGlrZWx5KGJ1Y2tldCkpIHsKIAkJaW50IGVycjsKQEAgLTQxOCw2ICs0NDksMjggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR2X3ZpcnRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQsIGRldl9oYW5kbGUsIGRldl9pbm87CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZGV2X2hhbmRsZSA9IGlubyAmIElNQVBfSUdOOworCQlkZXZfaW5vID0gaW5vICYgSU1BUF9JTk87CisKKwkJZXJyID0gc3VuNHZfdmludHJfc2V0X3RhcmdldChkZXZfaGFuZGxlLCBkZXZfaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl92aW50cl9zZXRfdGFyZ2V0KCVseCwlbHgsJWx1KTogIgorCQkJICAgICAgICJlcnIoJWQpXG4iLAorCQkJICAgICAgIGRldl9oYW5kbGUsIGRldl9pbm8sIGNwdWlkLCBlcnIpOworCX0KK30KKwogc3RhdGljIHZvaWQgc3VuNHZfdmlycV9kaXNhYmxlKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKQEAgLTQ0Myw2ICs0OTYsMTAgQEAKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKIAl1bnNpZ25lZCBpbnQgaW5vID0gYnVja2V0IC0gJml2ZWN0b3JfdGFibGVbMF07CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyB2aXJ0X2lycTsKKworCWlmICh1bmxpa2VseShkZXNjLT5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCXJldHVybjsKIAogCWlmIChsaWtlbHkoYnVja2V0KSkgewogCQl1bnNpZ25lZCBsb25nIGRldl9oYW5kbGUsIGRldl9pbm87CkBAIC00NzcsNiArNTM0LDcgQEAKIAkuZW5hYmxlCQk9IHN1bjR1X2lycV9lbmFibGUsCiAJLmRpc2FibGUJPSBzdW40dV9pcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR1X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR1X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHVfaXJxX2FjayA9IHsKQEAgLTQ4NSw2ICs1NDMsNyBAQAogCS5kaXNhYmxlCT0gc3VuNHVfaXJxX2Rpc2FibGUsCiAJLmFjawkJPSBydW5fcHJlX2hhbmRsZXIsCiAJLmVuZAkJPSBzdW40dV9pcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dV9zZXRfYWZmaW5pdHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjR2X2lycSA9IHsKQEAgLTQ5Miw2ICs1NTEsNyBAQAogCS5lbmFibGUJCT0gc3VuNHZfaXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X2lycV9kaXNhYmxlLAogCS5lbmQJCT0gc3VuNHZfaXJxX2VuZCwKKwkuc2V0X2FmZmluaXR5CT0gc3VuNHZfc2V0X2FmZmluaXR5LAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW40dl9pcnFfYWNrID0gewpAQCAtNTAwLDYgKzU2MCw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9pcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAKICNpZmRlZiBDT05GSUdfUENJX01TSQpAQCAtNTExLDYgKzU3Miw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9tc2lfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAjZW5kaWYKIApAQCAtNTE5LDYgKzU4MSw3IEBACiAJLmVuYWJsZQkJPSBzdW40dl92aXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHZfdmlycV9hY2sgPSB7CkBAIC01MjcsNiArNTkwLDcgQEAKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHZvaWQgaXJxX2luc3RhbGxfcHJlX2hhbmRsZXIoaW50IHZpcnRfaXJxLApAQCAtNzM5LDYgKzgwMywyNiBAQAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgZml4dXBfaXJxcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCQlpZiAoaXJxX2Rlc2NbaXJxXS5hY3Rpb24gJiYKKwkJICAgICEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfUEVSX0NQVSkpIHsKKwkJCWlmIChpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eSkKKwkJCQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsCisJCQkJCWlycV9kZXNjW2lycV0uYWZmaW5pdHkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCX0KK30KKyNlbmRpZgorCiBzdHJ1Y3Qgc3VuNV90aW1lciB7CiAJdTY0CWNvdW50MDsKIAl1NjQJbGltaXQwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMmJlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKQEAgLTAsMCArMSwyMzczIEBACisvKiBsZGMuYzogTG9naWNhbCBEb21haW4gQ2hhbm5lbCBsaW5rLWxheWVyIHByb3RvY29sIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJsZGMiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDI1LCAyMDA3IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CisjZGVmaW5lIExEQ19QQUNLRVRfU0laRQkJNjQKKworLyogUGFja2V0IGhlYWRlciBsYXlvdXQgZm9yIHVucmVsaWFibGUgYW5kIHJlbGlhYmxlIG1vZGUgZnJhbWVzLgorICogV2hlbiBpbiBSQVcgbW9kZSwgcGFja2V0cyBhcmUgc2ltcGx5IHN0cmFpZ2h0IDY0LWJ5dGUgcGF5bG9hZHMKKyAqIHdpdGggbm8gaGVhZGVycy4KKyAqLworc3RydWN0IGxkY19wYWNrZXQgeworCXU4CQkJdHlwZTsKKyNkZWZpbmUgTERDX0NUUkwJCTB4MDEKKyNkZWZpbmUgTERDX0RBVEEJCTB4MDIKKyNkZWZpbmUgTERDX0VSUgkJCTB4MTAKKworCXU4CQkJc3R5cGU7CisjZGVmaW5lIExEQ19JTkZPCQkweDAxCisjZGVmaW5lIExEQ19BQ0sJCQkweDAyCisjZGVmaW5lIExEQ19OQUNLCQkweDA0CisKKwl1OAkJCWN0cmw7CisjZGVmaW5lIExEQ19WRVJTCQkweDAxIC8qIExpbmsgVmVyc2lvbgkJKi8KKyNkZWZpbmUgTERDX1JUUwkJCTB4MDIgLyogUmVxdWVzdCBUbyBTZW5kCQkqLworI2RlZmluZSBMRENfUlRSCQkJMHgwMyAvKiBSZWFkeSBUbyBSZWNlaXZlCSovCisjZGVmaW5lIExEQ19SRFgJCQkweDA0IC8qIFJlYWR5IGZvciBEYXRhIGVYY2hhbmdlCSovCisjZGVmaW5lIExEQ19DVFJMX01TSwkJMHgwZgorCisJdTgJCQllbnY7CisjZGVmaW5lIExEQ19MRU4JCQkweDNmCisjZGVmaW5lIExEQ19GUkFHX01BU0sJCTB4YzAKKyNkZWZpbmUgTERDX1NUQVJUCQkweDQwCisjZGVmaW5lIExEQ19TVE9QCQkweDgwCisKKwl1MzIJCQlzZXFpZDsKKworCXVuaW9uIHsKKwkJdTgJCXVfZGF0YVtMRENfUEFDS0VUX1NJWkUgLSA4XTsKKwkJc3RydWN0IHsKKwkJCXUzMglwYWQ7CisJCQl1MzIJYWNraWQ7CisJCQl1OAlyX2RhdGFbTERDX1BBQ0tFVF9TSVpFIC0gOCAtIDhdOworCQl9IHI7CisJfSB1OworfTsKKworc3RydWN0IGxkY192ZXJzaW9uIHsKKwl1MTYgbWFqb3I7CisJdTE2IG1pbm9yOworfTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyX2FycltdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworI2RlZmluZSBMRENfREVGQVVMVF9NVFUJCQkoNCAqIExEQ19QQUNLRVRfU0laRSkKKyNkZWZpbmUgTERDX0RFRkFVTFRfTlVNX0VOVFJJRVMJCShQQUdFX1NJWkUgLyBMRENfUEFDS0VUX1NJWkUpCisKK3N0cnVjdCBsZGNfY2hhbm5lbDsKKworc3RydWN0IGxkY19tb2RlX29wcyB7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBsZGNfY2hhbm5lbCAqLCBjb25zdCB2b2lkICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqcmVhZCkoc3RydWN0IGxkY19jaGFubmVsICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIHJhd19vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyBub25yYXdfb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wczsKKworaW50IGxkb21fZG9tYWluaW5nX2VuYWJsZWQ7CisKK3N0cnVjdCBsZGNfaW9tbXUgeworCS8qIFByb3RlY3RzIGFyZW5hIGFsbG9jL2ZyZWUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCBpb21tdV9hcmVuYQkJYXJlbmE7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworfTsKKworc3RydWN0IGxkY19jaGFubmVsIHsKKwkvKiBQcm90ZWN0cyBhbGwgb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCB1cG9uIGNoYW5uZWwgc3RhdGUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCisJdW5zaWduZWQgbG9uZwkJCWlkOworCisJdTgJCQkJKm1zc2J1ZjsKKwl1MzIJCQkJbXNzYnVmX2xlbjsKKwl1MzIJCQkJbXNzYnVmX29mZjsKKworCXN0cnVjdCBsZGNfcGFja2V0CQkqdHhfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQkJdHhfaGVhZDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfdGFpbDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfbnVtX2VudHJpZXM7CisJdW5zaWduZWQgbG9uZwkJCXR4X3JhOworCisJdW5zaWduZWQgbG9uZwkJCXR4X2Fja2VkOworCisJc3RydWN0IGxkY19wYWNrZXQJCSpyeF9iYXNlOworCXVuc2lnbmVkIGxvbmcJCQlyeF9oZWFkOworCXVuc2lnbmVkIGxvbmcJCQlyeF90YWlsOworCXVuc2lnbmVkIGxvbmcJCQlyeF9udW1fZW50cmllczsKKwl1bnNpZ25lZCBsb25nCQkJcnhfcmE7CisKKwl1MzIJCQkJcmN2X254dDsKKwl1MzIJCQkJc25kX254dDsKKworCXVuc2lnbmVkIGxvbmcJCQljaGFuX3N0YXRlOworCisJc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZwljZmc7CisJdm9pZAkJCQkqZXZlbnRfYXJnOworCisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcwkqbW9wczsKKworCXN0cnVjdCBsZGNfaW9tbXUJCWlvbW11OworCisJc3RydWN0IGxkY192ZXJzaW9uCQl2ZXI7CisKKwl1OAkJCQloc19zdGF0ZTsKKyNkZWZpbmUgTERDX0hTX0NMT1NFRAkJCTB4MDAKKyNkZWZpbmUgTERDX0hTX09QRU4JCQkweDAxCisjZGVmaW5lIExEQ19IU19HT1RWRVJTCQkJMHgwMgorI2RlZmluZSBMRENfSFNfU0VOVFJUUgkJCTB4MDMKKyNkZWZpbmUgTERDX0hTX0dPVFJUUgkJCTB4MDQKKyNkZWZpbmUgTERDX0hTX0NPTVBMRVRFCQkJMHgxMAorCisJdTgJCQkJZmxhZ3M7CisjZGVmaW5lIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTCQkweDAxCisjZGVmaW5lIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTCTB4MDIKKyNkZWZpbmUgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTCTB4MDQKKyNkZWZpbmUgTERDX0ZMQUdfUkVTRVQJCQkweDEwCisKKwl1OAkJCQltc3M7CisJdTgJCQkJc3RhdGU7CisKKyNkZWZpbmUgTERDX0lSUV9OQU1FX01BWAkJMzIKKwljaGFyCQkJCXJ4X2lycV9uYW1lW0xEQ19JUlFfTkFNRV9NQVhdOworCWNoYXIJCQkJdHhfaXJxX25hbWVbTERDX0lSUV9OQU1FX01BWF07CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkJbWhfbGlzdDsKKworCXN0cnVjdCBobGlzdF9ub2RlCQlsaXN0OworfTsKKworI2RlZmluZSBsZGNkYmcoVFlQRSwgZiwgYS4uLikgXAorZG8gewlpZiAobHAtPmNmZy5kZWJ1ZyAmIExEQ19ERUJVR18jI1RZUEUpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklEWyVsdV0gIiBmLCBscC0+aWQsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfdG9fc3RyKHU4IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIExEQ19TVEFURV9JTlZBTElEOgorCQlyZXR1cm4gIklOVkFMSUQiOworCWNhc2UgTERDX1NUQVRFX0lOSVQ6CisJCXJldHVybiAiSU5JVCI7CisJY2FzZSBMRENfU1RBVEVfQk9VTkQ6CisJCXJldHVybiAiQk9VTkQiOworCWNhc2UgTERDX1NUQVRFX1JFQURZOgorCQlyZXR1cm4gIlJFQURZIjsKKwljYXNlIExEQ19TVEFURV9DT05ORUNURUQ6CisJCXJldHVybiAiQ09OTkVDVEVEIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIjxVTktOT1dOPiI7CisJfQorfQorCitzdGF0aWMgdm9pZCBsZGNfc2V0X3N0YXRlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHU4IHN0YXRlKQoreworCWxkY2RiZyhTVEFURSwgIlNUQVRFICglcykgLS0+ICglcylcbiIsCisJICAgICAgIHN0YXRlX3RvX3N0cihscC0+c3RhdGUpLAorCSAgICAgICBzdGF0ZV90b19zdHIoc3RhdGUpKTsKKworCWxwLT5zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2FkdmFuY2UodW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMpCit7CisJb2ZmICs9IExEQ19QQUNLRVRfU0laRTsKKwlpZiAob2ZmID09IChudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRSkpCisJCW9mZiA9IDA7CisKKwlyZXR1cm4gb2ZmOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByeF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+cnhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+dHhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgc3RydWN0IGxkY19wYWNrZXQgKmhhbmRzaGFrZV9nZXRfdHhfcGFja2V0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcgKm5ld190YWlsKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgdDsKKworCXQgPSB0eF9hZHZhbmNlKGxwLCBscC0+dHhfdGFpbCk7CisJaWYgKHQgPT0gbHAtPnR4X2hlYWQpCisJCXJldHVybiBOVUxMOworCisJKm5ld190YWlsID0gdDsKKworCXAgPSBscC0+dHhfYmFzZTsKKwlyZXR1cm4gcCArIChscC0+dHhfdGFpbCAvIExEQ19QQUNLRVRfU0laRSk7Cit9CisKKy8qIFdoZW4gd2UgYXJlIGluIHJlbGlhYmxlIG9yIHN0cmVhbSBtb2RlLCBoYXZlIHRvIHRyYWNrIHRoZSBuZXh0IHBhY2tldAorICogd2UgaGF2ZW4ndCBnb3R0ZW4gYW4gQUNLIGZvciBpbiB0aGUgVFggcXVldWUgdXNpbmcgdHhfYWNrZWQuICBXZSBoYXZlCisgKiB0byBiZSBjYXJlZnVsIG5vdCB0byBzdG9tcCBvdmVyIHRoZSBxdWV1ZSBwYXN0IHRoYXQgcG9pbnQuICBEdXJpbmcKKyAqIHRoZSBoYW5kc2hha2UsIHdlIGRvbid0IGhhdmUgVFggZGF0YSBwYWNrZXRzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlCisgKiBhbmQgdGhhdCdzIHdoeSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldCgpIG5lZWQgbm90IGJlIG1pbmRmdWwgb2YKKyAqIGxwLT50eF9hY2tlZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVhZF9mb3JfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKQorCQlyZXR1cm4gbHAtPnR4X2Fja2VkOworCXJldHVybiBscC0+dHhfaGVhZDsKK30KKworc3RhdGljIGludCB0eF9oYXNfc3BhY2VfZm9yKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbGltaXQsIHRhaWwsIG5ld190YWlsLCBkaWZmOworCXVuc2lnbmVkIGludCBtc3M7CisKKwlsaW1pdCA9IGhlYWRfZm9yX2RhdGEobHApOworCXRhaWwgPSBscC0+dHhfdGFpbDsKKwluZXdfdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCWlmIChuZXdfdGFpbCA9PSBsaW1pdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGltaXQgPiBuZXdfdGFpbCkKKwkJZGlmZiA9IGxpbWl0IC0gbmV3X3RhaWw7CisJZWxzZQorCQlkaWZmID0gKGxpbWl0ICsKKwkJCSgobHAtPnR4X251bV9lbnRyaWVzICogTERDX1BBQ0tFVF9TSVpFKSAtIG5ld190YWlsKSk7CisJZGlmZiAvPSBMRENfUEFDS0VUX1NJWkU7CisJbXNzID0gbHAtPm1zczsKKworCWlmIChkaWZmICogbXNzIDwgc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpkYXRhX2dldF90eF9wYWNrZXQoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nICpuZXdfdGFpbCkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIGgsIHQ7CisKKwloID0gaGVhZF9mb3JfZGF0YShscCk7CisJdCA9IHR4X2FkdmFuY2UobHAsIGxwLT50eF90YWlsKTsKKwlpZiAodCA9PSBoKQorCQlyZXR1cm4gTlVMTDsKKworCSpuZXdfdGFpbCA9IHQ7CisKKwlwID0gbHAtPnR4X2Jhc2U7CisJcmV0dXJuIHAgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpOworfQorCitzdGF0aWMgaW50IHNldF90eF90YWlsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgdGFpbCkKK3sKKwl1bnNpZ25lZCBsb25nIG9yaWdfdGFpbCA9IGxwLT50eF90YWlsOworCWludCBsaW1pdCA9IDEwMDA7CisKKwlscC0+dHhfdGFpbCA9IHRhaWw7CisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgZXJyOworCisJCWVyciA9IHN1bjR2X2xkY190eF9zZXRfcXRhaWwobHAtPmlkLCB0YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZXJyICE9IEhWX0VXT1VMREJMT0NLKSB7CisJCQlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKiBUaGlzIGp1c3QgdXBkYXRlcyB0aGUgaGVhZCB2YWx1ZSBpbiB0aGUgaHlwZXJ2aXNvciB1c2luZworICogYSBwb2xsaW5nIGxvb3Agd2l0aCBhIHRpbWVvdXQuICBUaGUgY2FsbGVyIHRha2VzIGNhcmUgb2YKKyAqIHVwYXRpbmcgc29mdHdhcmUgc3RhdGUgcmVwcmVzZW50aW5nIHRoZSBoZWFkIGNoYW5nZSwgaWYgYW55LgorICovCitzdGF0aWMgaW50IF9fc2V0X3J4X2hlYWQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWludCBsaW1pdCA9IDEwMDA7CisKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBlcnI7CisKKwkJZXJyID0gc3VuNHZfbGRjX3J4X3NldF9xaGVhZChscC0+aWQsIGhlYWQpOworCQlpZiAoIWVycikKKwkJCXJldHVybiAwOworCisJCWlmIChlcnIgIT0gSFZfRVdPVUxEQkxPQ0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3R4X3BhY2tldChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCwKKwkJCSAgdW5zaWduZWQgbG9uZyBuZXdfdGFpbCkKK3sKKwlCVUdfT04ocCAhPSAobHAtPnR4X2Jhc2UgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpKSk7CisKKwlyZXR1cm4gc2V0X3R4X3RhaWwobHAsIG5ld190YWlsKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpoYW5kc2hha2VfY29tcG9zZV9jdHJsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgdTggc3R5cGUsIHU4IGN0cmwsCisJCQkJCQkgdm9pZCAqZGF0YSwgaW50IGRsZW4sCisJCQkJCQkgdW5zaWduZWQgbG9uZyAqbmV3X3RhaWwpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldChscCwgbmV3X3RhaWwpOworCisJaWYgKHApIHsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCQlwLT50eXBlID0gTERDX0NUUkw7CisJCXAtPnN0eXBlID0gc3R5cGU7CisJCXAtPmN0cmwgPSBjdHJsOworCQlpZiAoZGF0YSkKKwkJCW1lbWNweShwLT51LnVfZGF0YSwgZGF0YSwgZGxlbik7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IHN0YXJ0X2hhbmRzaGFrZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIgPSAmdmVyX2FyclswXTsKKworCWxkY2RiZyhIUywgIlNFTkQgVkVSIElORk8gbWFqWyV1XSBtaW5bJXVdXG4iLAorCSAgICAgICB2ZXItPm1ham9yLCB2ZXItPm1pbm9yKTsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1ZFUlMsCisJCQkJICAgdmVyLCBzaXplb2YoKnZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJaW50IGVyciA9IHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJCWlmICghZXJyKQorCQkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRVNFVDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3ZlcnNpb25fbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICB1MTYgbWFqb3IsIHUxNiBtaW5vcikKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIubWFqb3IgPSBtYWpvcjsKKwl2ZXIubWlub3IgPSBtaW5vcjsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfTkFDSywgTERDX1ZFUlMsCisJCQkJICAgJnZlciwgc2l6ZW9mKHZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgTkFDSyBtYWpbJXVdIG1pblsldV1cbiIsCisJCSAgICAgICB2ZXIubWFqb3IsIHZlci5taW5vcik7CisKKwkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uX2FjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgIHN0cnVjdCBsZGNfdmVyc2lvbiAqdnApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfQUNLLCBMRENfVkVSUywKKwkJCQkgICB2cCwgc2l6ZW9mKCp2cCksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgQUNLIG1halsldV0gbWluWyV1XVxuIiwKKwkJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3J0cyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19SVFMsIE5VTEwsIDAsCisJCQkJICAgJm5ld190YWlsKTsKKwlpZiAocCkgeworCQlwLT5lbnYgPSBscC0+Y2ZnLm1vZGU7CisJCXAtPnNlcWlkID0gMDsKKwkJbHAtPnJjdl9ueHQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRTIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcnRyKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JUUiwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IGxwLT5jZmcubW9kZTsKKwkJcC0+c2VxaWQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRSIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JEWCwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IDA7CisJCXAtPnNlcWlkID0gKytscC0+c25kX254dDsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJbGRjZGJnKEhTLCAiU0VORCBSRFggZW52WzB4JXhdIHNlcWlkWzB4JXhdIGFja2lkWzB4JXhdXG4iLAorCQkgICAgICAgcC0+ZW52LCBwLT5zZXFpZCwgcC0+dS5yLmFja2lkKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX2RhdGFfbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3BhY2tldCAqZGF0YV9wa3QpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlpbnQgZXJyOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUJVU1k7CisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXAtPnR5cGUgPSBkYXRhX3BrdC0+dHlwZTsKKwlwLT5zdHlwZSA9IExEQ19OQUNLOworCXAtPmN0cmwgPSBkYXRhX3BrdC0+Y3RybCAmIExEQ19DVFJMX01TSzsKKwlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwlwLT51LnIuYWNraWQgPSBscC0+cmN2X254dDsKKworCWxkY2RiZyhIUywgIlNFTkQgREFUQSBOQUNLIHR5cGVbMHgleF0gY3RsWzB4JXhdIHNlcVsweCV4XSBhY2tbMHgleF1cbiIsCisJICAgICAgIHAtPnR5cGUsIHAtPmN0cmwsIHAtPnNlcWlkLCBwLT51LnIuYWNraWQpOworCisJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwlpZiAoIWVycikKKwkJbHAtPnNuZF9ueHQrKzsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbGRjX2Fib3J0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwlsZGNkYmcoU1RBVEUsICJBQk9SVFxuIik7CisKKwkvKiBXZSByZXBvcnQgYnV0IGRvIG5vdCBhY3QgdXBvbiB0aGUgaHlwZXJ2aXNvciBlcnJvcnMgYmVjYXVzZQorCSAqIHRoZXJlIHJlYWxseSBpc24ndCBtdWNoIHdlIGNhbiBkbyBpZiB0aGV5IGZhaWwgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3R4X3Fjb25mKCVseCwlbHgsJWx4KSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGxwLT50eF9yYSwgbHAtPnR4X251bV9lbnRyaWVzLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+dHhfaGVhZCwKKwkJCQkJJmxwLT50eF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY190eF9nZXRfc3RhdGUoJWx4LC4uLikgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY19yeF9xY29uZiglbHgsJWx4LCVseCkgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcywgaHZfZXJyKTsKKworCS8qIFJlZmV0Y2ggdGhlIFJYIHF1ZXVlIHN0YXRlIGFzIHdlbGwsIGJlY2F1c2Ugd2UgY291bGQgYmUgaW52b2tlZAorCSAqIGhlcmUgaW4gdGhlIHF1ZXVlIHByb2Nlc3NpbmcgY29udGV4dC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3J4X2dldF9zdGF0ZSglbHgsLi4uKSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gKmZpbmRfYnlfbWFqb3IodTE2IG1ham9yKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZlcl9hcnIpOyBpKyspIHsKKwkJc3RydWN0IGxkY192ZXJzaW9uICp2ID0gJnZlcl9hcnJbaV07CisJCWlmICh2LT5tYWpvciA8PSBtYWpvcikgeworCQkJcmV0ID0gdjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc192ZXJfaW5mbyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZwKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmFwOworCWludCBlcnI7CisKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBJTkZPIG1ham9yWyV4XSBtaW5vclsleF1cbiIsCisJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCWlmIChscC0+aHNfc3RhdGUgPT0gTERDX0hTX0dPVFZFUlMpIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJCW1lbXNldCgmbHAtPnZlciwgMCwgc2l6ZW9mKGxwLT52ZXIpKTsKKwl9CisKKwl2YXAgPSBmaW5kX2J5X21ham9yKHZwLT5tYWpvcik7CisJaWYgKCF2YXApIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIDAsIDApOworCX0gZWxzZSBpZiAodmFwLT5tYWpvciAhPSB2cC0+bWFqb3IpIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIHZhcC0+bWFqb3IsIHZhcC0+bWlub3IpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsZGNfdmVyc2lvbiB2ZXIgPSAqdnA7CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX2FjayhscCwgJnZlcik7CisJCWlmICghZXJyKSB7CisJCQlscC0+dmVyID0gdmVyOworCQkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJCX0KKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBBQ0sgbWFqb3JbJXhdIG1pbm9yWyV4XVxuIiwKKwkgICAgICAgdnAtPm1ham9yLCB2cC0+bWlub3IpOworCisJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfR09UVkVSUykgeworCQlpZiAobHAtPnZlci5tYWpvciAhPSB2cC0+bWFqb3IgfHwKKwkJICAgIGxwLT52ZXIubWlub3IgIT0gdnAtPm1pbm9yKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfSBlbHNlIHsKKwkJbHAtPnZlciA9ICp2cDsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJfQorCWlmIChzZW5kX3J0cyhscCkpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZhcDsKKworCWlmICgodnAtPm1ham9yID09IDAgJiYgdnAtPm1pbm9yID09IDApIHx8CisJICAgICEodmFwID0gZmluZF9ieV9tYWpvcih2cC0+bWFqb3IpKSkgeworCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCQlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19WRVJTLAorCQkJCQkgICB2YXAsIHNpemVvZigqdmFwKSwKKwkJCQkJICAgJm5ld190YWlsKTsKKwkJaWYgKHApCisJCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJZWxzZQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyc2lvbihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3RydWN0IGxkY192ZXJzaW9uICp2cDsKKworCXZwID0gKHN0cnVjdCBsZGNfdmVyc2lvbiAqKSBwLT51LnVfZGF0YTsKKworCXN3aXRjaCAocC0+c3R5cGUpIHsKKwljYXNlIExEQ19JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyhscCwgdnApOworCisJY2FzZSBMRENfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfYWNrKGxwLCB2cCk7CisKKwljYXNlIExEQ19OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfbmFjayhscCwgdnApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgICAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgUlRTIHN0eXBlWyV4XSBzZXFpZFsleF0gZW52WyV4XVxuIiwKKwkgICAgICAgcC0+c3R5cGUsIHAtPnNlcWlkLCBwLT5lbnYpOworCisJaWYgKHAtPnN0eXBlICAgICAhPSBMRENfSU5GTwkgICB8fAorCSAgICBscC0+aHNfc3RhdGUgIT0gTERDX0hTX0dPVFZFUlMgfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5yY3Zfbnh0ID0gcC0+c2VxaWQ7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX1NFTlRSVFI7CisJaWYgKHNlbmRfcnRyKGxwKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3J0cihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJUUiBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF1cbiIsCisJICAgICAgIHAtPnN0eXBlLCBwLT5zZXFpZCwgcC0+ZW52KTsKKworCWlmIChwLT5zdHlwZSAgICAgIT0gTERDX0lORk8gfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKwlzZW5kX3JkeChscCk7CisKKwlyZXR1cm4gTERDX0VWRU5UX1VQOworfQorCitzdGF0aWMgaW50IHJ4X3NlcV9vayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1MzIgc2VxaWQpCit7CisJcmV0dXJuIGxwLT5yY3Zfbnh0ICsgMSA9PSBzZXFpZDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJEWCBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF0gYWNraWRbJXhdXG4iLAorCSAgICAgICBwLT5zdHlwZSwgcC0+c2VxaWQsIHAtPmVudiwgcC0+dS5yLmFja2lkKTsKKworCWlmIChwLT5zdHlwZSAhPSBMRENfSU5GTyB8fAorCSAgICAhKHJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+cmN2X254dCA9IHAtPnNlcWlkOworCisJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9DT05ORUNURUQpOworCisJcmV0dXJuIExEQ19FVkVOVF9VUDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NvbnRyb2xfZnJhbWUoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3dpdGNoIChwLT5jdHJsKSB7CisJY2FzZSBMRENfVkVSUzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyc2lvbihscCwgcCk7CisKKwljYXNlIExEQ19SVFM6CisJCXJldHVybiBwcm9jZXNzX3J0cyhscCwgcCk7CisKKwljYXNlIExEQ19SVFI6CisJCXJldHVybiBwcm9jZXNzX3J0cihscCwgcCk7CisKKwljYXNlIExEQ19SRFg6CisJCXJldHVybiBwcm9jZXNzX3JkeChscCwgcCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19lcnJvcl9mcmFtZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCXJldHVybiBsZGNfYWJvcnQobHApOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZGF0YV9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqYWNrKQoreworCXVuc2lnbmVkIGxvbmcgaGVhZCA9IGxwLT50eF9hY2tlZDsKKwl1MzIgYWNraWQgPSBhY2stPnUuci5hY2tpZDsKKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBsZGNfcGFja2V0ICpwID0gbHAtPnR4X2Jhc2UgKyAoaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJaGVhZCA9IHR4X2FkdmFuY2UobHAsIGhlYWQpOworCisJCWlmIChwLT5zZXFpZCA9PSBhY2tpZCkgeworCQkJbHAtPnR4X2Fja2VkID0gaGVhZDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChoZWFkID09IGxwLT50eF90YWlsKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZXZlbnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBldmVudF9tYXNrKQoreworCWlmIChldmVudF9tYXNrICYgTERDX0VWRU5UX1JFU0VUKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9SRVNFVCk7CisJaWYgKGV2ZW50X21hc2sgJiBMRENfRVZFTlRfVVApCisJCWxwLT5jZmcuZXZlbnQobHAtPmV2ZW50X2FyZywgTERDX0VWRU5UX1VQKTsKKwlpZiAoZXZlbnRfbWFzayAmIExEQ19FVkVOVF9EQVRBX1JFQURZKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9EQVRBX1JFQURZKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxkY19yeChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIG9yaWdfc3RhdGUsIGh2X2VyciwgZmxhZ3M7CisJdW5zaWduZWQgaW50IGV2ZW50X21hc2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoUlgsICJSWCBzdGF0ZVsweCUwMmx4OjB4JTAybHhdIGhlYWRbMHglMDRseF0gdGFpbFsweCUwNGx4XVxuIiwKKwkgICAgICAgb3JpZ19zdGF0ZSwgbHAtPmNoYW5fc3RhdGUsIGxwLT5yeF9oZWFkLCBscC0+cnhfdGFpbCk7CisKKwlldmVudF9tYXNrID0gMDsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfUkFXICYmCisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1VQKSB7CisJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwkJbGRjX3NldF9zdGF0ZShscCwgTERDX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfVVA7CisKKwkJb3JpZ19zdGF0ZSA9IGxwLT5jaGFuX3N0YXRlOworCX0KKworCS8qIElmIHdlIGFyZSBpbiByZXNldCBzdGF0ZSwgZmx1c2ggdGhlIFJYIHF1ZXVlIGFuZCBpZ25vcmUKKwkgKiBldmVyeXRoaW5nLgorCSAqLworCWlmIChscC0+ZmxhZ3MgJiBMRENfRkxBR19SRVNFVCkgeworCQkodm9pZCkgX19zZXRfcnhfaGVhZChscCwgbHAtPnJ4X3RhaWwpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBPbmNlIHdlIGZpbmlzaCB0aGUgaGFuZHNoYWtlLCB3ZSBsZXQgdGhlIGxkY19yZWFkKCkKKwkgKiBwYXRocyBkbyBhbGwgb2YgdGhlIGNvbnRyb2wgZnJhbWUgYW5kIHN0YXRlIG1hbmFnZW1lbnQuCisJICogSnVzdCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4KKwkgKi8KKwlpZiAobHAtPmhzX3N0YXRlID09IExEQ19IU19DT01QTEVURSkgeworaGFuZHNoYWtlX2NvbXBsZXRlOgorCQlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkgeworCQkJdW5zaWduZWQgaW50IGV2ZW50ID0gTERDX0VWRU5UX1JFU0VUOworCisJCQlpZiAobHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApCisJCQkJZXZlbnQgPSBMRENfRVZFTlRfVVA7CisKKwkJCWV2ZW50X21hc2sgfD0gZXZlbnQ7CisJCX0KKwkJaWYgKGxwLT5yeF9oZWFkICE9IGxwLT5yeF90YWlsKQorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAobHAtPnJ4X2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJCXVuc2lnbmVkIGxvbmcgbmV3OworCQlpbnQgZXJyOworCisJCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJc3dpdGNoIChwLT50eXBlKSB7CisJCWNhc2UgTERDX0NUUkw6CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA+IDApCisJCQkJZXZlbnRfbWFzayB8PSBlcnI7CisJCQlicmVhazsKKworCQljYXNlIExEQ19EQVRBOgorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKworCQljYXNlIExEQ19FUlI6CisJCQllcnIgPSBwcm9jZXNzX2Vycm9yX2ZyYW1lKGxwLCBwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnIgPSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCW5ldyA9IGxwLT5yeF9oZWFkOworCQluZXcgKz0gTERDX1BBQ0tFVF9TSVpFOworCQlpZiAobmV3ID09IChscC0+cnhfbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkUpKQorCQkJbmV3ID0gMDsKKwkJbHAtPnJ4X2hlYWQgPSBuZXc7CisKKwkJZXJyID0gX19zZXRfcnhfaGVhZChscCwgbmV3KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCSh2b2lkKSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfQ09NUExFVEUpCisJCQlnb3RvIGhhbmRzaGFrZV9jb21wbGV0ZTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGRjX3R4KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGh2X2Vyciwgb3JpZ19zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfbWFzayA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoVFgsICIgVFggc3RhdGVbMHglMDJseDoweCUwMmx4XSBoZWFkWzB4JTA0bHhdIHRhaWxbMHglMDRseF1cbiIsCisJICAgICAgIG9yaWdfc3RhdGUsIGxwLT5jaGFuX3N0YXRlLCBscC0+dHhfaGVhZCwgbHAtPnR4X3RhaWwpOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcgJiYKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCQlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKworCQlldmVudF9tYXNrIHw9IExEQ19FVkVOVF9VUDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBYWFggbGRjX2FsbG9jKCkgYW5kIGxkY19mcmVlKCkgbmVlZHMgdG8gcnVuIHVuZGVyIGEgbXV0ZXggc28KKyAqIFhYWCB0aGF0IGFkZGl0aW9uIGFuZCByZW1vdmFsIGZyb20gdGhlIGxkY19jaGFubmVsX2xpc3QgaGFzCisgKiBYWFggYXRvbWljaXR5LCBvdGhlcndpc2UgdGhlIF9fbGRjX2NoYW5uZWxfZXhpc3RzKCkgY2hlY2sgaXMKKyAqIFhYWCB0b3RhbGx5IHBvaW50bGVzcyBhcyBhbm90aGVyIHRocmVhZCBjYW4gc2xpcCBpbnRvIGxkY19hbGxvYygpCisgKiBYWFggYW5kIGFkZCBhIGNoYW5uZWwgd2l0aCB0aGUgc2FtZSBJRC4gIFRoZXJlIGFsc28gbmVlZHMgdG8gYmUKKyAqIFhYWCBhIHNwaW5sb2NrIGZvciBsZGNfY2hhbm5lbF9saXN0LgorICovCitzdGF0aWMgSExJU1RfSEVBRChsZGNfY2hhbm5lbF9saXN0KTsKKworc3RhdGljIGludCBfX2xkY19jaGFubmVsX2V4aXN0cyh1bnNpZ25lZCBsb25nIGlkKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShscCwgbiwgJmxkY19jaGFubmVsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGxwLT5pZCA9PSBpZCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19xdWV1ZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKipiYXNlLCB1bnNpZ25lZCBsb25nICpyYSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIG9yZGVyOworCXZvaWQgKnE7CisKKwlzaXplID0gbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkU7CisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlxID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJaWYgKCFxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFsbG9jIG9mICVzIHF1ZXVlIGZhaWxlZCB3aXRoICIKKwkJICAgICAgICJzaXplPSVsdSBvcmRlcj0lbHVcbiIsIG5hbWUsIHNpemUsIG9yZGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHEsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwkqYmFzZSA9IHE7CisJKnJhID0gX19wYShxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMsIHN0cnVjdCBsZGNfcGFja2V0ICpxKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb3JkZXI7CisKKwlpZiAoIXEpCisJCXJldHVybjsKKworCXNpemUgPSBudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcSwgb3JkZXIpOworfQorCisvKiBYWFggTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS4uLiBYWFggKi8KKyNkZWZpbmUgTERDX0lPVEFCTEVfU0laRQkoOCAqIDEwMjQpCisKK3N0YXRpYyBpbnQgbGRjX2lvbW11X2luaXQoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwl1bnNpZ25lZCBsb25nIHN6LCBudW1fdHNiX2VudHJpZXMsIHRzYnNpemUsIG9yZGVyOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqdGFibGU7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisJaW50IGVycjsKKworCW51bV90c2JfZW50cmllcyA9IExEQ19JT1RBQkxFX1NJWkU7CisJdHNic2l6ZSA9IG51bV90c2JfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOworCisJc3ogPSBudW1fdHNiX2VudHJpZXMgLyA4OworCXN6ID0gKHN6ICsgN1VMKSAmIH43VUw7CisJaW9tbXUtPmFyZW5hLm1hcCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghaW9tbXUtPmFyZW5hLm1hcCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBbGxvYyBvZiBhcmVuYSBtYXAgZmFpbGVkLCBzej0lbHVcbiIsIHN6KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW9tbXUtPmFyZW5hLmxpbWl0ID0gbnVtX3RzYl9lbnRyaWVzOworCisJb3JkZXIgPSBnZXRfb3JkZXIodHNic2l6ZSk7CisKKwl0YWJsZSA9IChzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqKQorCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghdGFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQWxsb2Mgb2YgTVRFIHRhYmxlIGZhaWxlZCwgIgorCQkgICAgICAgInNpemU9JWx1IG9yZGVyPSVsdVxuIiwgdHNic2l6ZSwgb3JkZXIpOworCQlnb3RvIG91dF9mcmVlX21hcDsKKwl9CisKKwltZW1zZXQodGFibGUsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwlpb21tdS0+cGFnZV90YWJsZSA9IHRhYmxlOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCBfX3BhKHRhYmxlKSwKKwkJCQkJIG51bV90c2JfZW50cmllcyk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9mcmVlX3RhYmxlOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3RhYmxlOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHRhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCitvdXRfZnJlZV9tYXA6CisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBsZGNfaW9tbXVfcmVsZWFzZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwl1bnNpZ25lZCBsb25nIG51bV90c2JfZW50cmllcywgdHNic2l6ZSwgb3JkZXI7CisKKwkodm9pZCkgc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCAwLCAwKTsKKworCW51bV90c2JfZW50cmllcyA9IGlvbW11LT5hcmVuYS5saW1pdDsKKwl0c2JzaXplID0gbnVtX3RzYl9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5KTsKKwlvcmRlciA9IGdldF9vcmRlcih0c2JzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGlvbW11LT5wYWdlX3RhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7Cit9CisKK3N0cnVjdCBsZGNfY2hhbm5lbCAqbGRjX2FsbG9jKHVuc2lnbmVkIGxvbmcgaWQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnICpjZmdwLAorCQkJICAgICAgdm9pZCAqZXZlbnRfYXJnKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyAqbW9wczsKKwl1bnNpZ25lZCBsb25nIGR1bW15MSwgZHVtbXkyLCBodl9lcnI7CisJdTggbXNzLCAqbXNzYnVmOworCWludCBlcnI7CisKKwllcnIgPSAtRU5PREVWOworCWlmICghbGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWNmZ3ApCisJCWdvdG8gb3V0X2VycjsKKworCXN3aXRjaCAoY2ZncC0+bW9kZSkgeworCWNhc2UgTERDX01PREVfUkFXOgorCQltb3BzID0gJnJhd19vcHM7CisJCW1zcyA9IExEQ19QQUNLRVRfU0laRTsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1VOUkVMSUFCTEU6CisJCW1vcHMgPSAmbm9ucmF3X29wczsKKwkJbXNzID0gTERDX1BBQ0tFVF9TSVpFIC0gODsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1NUUkVBTToKKwkJbW9wcyA9ICZzdHJlYW1fb3BzOworCQltc3MgPSBMRENfUEFDS0VUX1NJWkUgLSA4IC0gODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKCFjZmdwLT5ldmVudCB8fCAhZXZlbnRfYXJnIHx8ICFjZmdwLT5yeF9pcnEgfHwgIWNmZ3AtPnR4X2lycSkKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3FpbmZvKGlkLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwllcnIgPSAtRU5PREVWOworCWlmIChodl9lcnIgPT0gSFZfRUNIQU5ORUwpCisJCWdvdG8gb3V0X2VycjsKKworCWVyciA9IC1FRVhJU1Q7CisJaWYgKF9fbGRjX2NoYW5uZWxfZXhpc3RzKGlkKSkKKwkJZ290byBvdXRfZXJyOworCisJbXNzYnVmID0gTlVMTDsKKworCWxwID0ga3phbGxvYyhzaXplb2YoKmxwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWxwKQorCQlnb3RvIG91dF9lcnI7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJbHAtPmlkID0gaWQ7CisKKwllcnIgPSBsZGNfaW9tbXVfaW5pdChscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlscC0+bW9wcyA9IG1vcHM7CisJbHAtPm1zcyA9IG1zczsKKworCWxwLT5jZmcgPSAqY2ZncDsKKwlpZiAoIWxwLT5jZmcubXR1KQorCQlscC0+Y2ZnLm10dSA9IExEQ19ERUZBVUxUX01UVTsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKSB7CisJCW1zc2J1ZiA9IGt6YWxsb2MobHAtPmNmZy5tdHUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1zc2J1ZikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfaW9tbXU7CisJCX0KKwkJbHAtPm1zc2J1ZiA9IG1zc2J1ZjsKKwl9CisKKwlscC0+ZXZlbnRfYXJnID0gZXZlbnRfYXJnOworCisJLyogWFhYIGFsbG93IHNldHRpbmcgdmlhIGxkY19jaGFubmVsX2NvbmZpZyB0byBvdmVycmlkZSBkZWZhdWx0cworCSAqIFhYWCBvciB1c2Ugc29tZSBmb3JtdWxhIGJhc2VkIHVwb24gbXR1CisJICovCisJbHAtPnR4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisJbHAtPnJ4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiVFgiLCBscC0+dHhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+dHhfYmFzZSwgJmxwLT50eF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9tc3NidWY7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiUlgiLCBscC0+cnhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+cnhfYmFzZSwgJmxwLT5yeF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV90eHE7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfQ0xPU0VEOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCUlOSVRfSExJU1RfTk9ERSgmbHAtPmxpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZscC0+bGlzdCwgJmxkY19jaGFubmVsX2xpc3QpOworCisJSU5JVF9ITElTVF9IRUFEKCZscC0+bWhfbGlzdCk7CisKKwlyZXR1cm4gbHA7CisKK291dF9mcmVlX3R4cToKKwlmcmVlX3F1ZXVlKGxwLT50eF9udW1fZW50cmllcywgbHAtPnR4X2Jhc2UpOworCitvdXRfZnJlZV9tc3NidWY6CisJaWYgKG1zc2J1ZikKKwkJa2ZyZWUobXNzYnVmKTsKKworb3V0X2ZyZWVfaW9tbXU6CisJbGRjX2lvbW11X3JlbGVhc2UobHApOworCitvdXRfZnJlZV9sZGM6CisJa2ZyZWUobHApOworCitvdXRfZXJyOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvYyk7CisKK3ZvaWQgbGRjX2ZyZWUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlpZiAobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTKSB7CisJCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisJCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJfQorCisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTKSB7CisJCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCQlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwl9CisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTKSB7CisJCWZyZWVfcXVldWUobHAtPnR4X251bV9lbnRyaWVzLCBscC0+dHhfYmFzZSk7CisJCWZyZWVfcXVldWUobHAtPnJ4X251bV9lbnRyaWVzLCBscC0+cnhfYmFzZSk7CisJCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisJfQorCisJaGxpc3RfZGVsKCZscC0+bGlzdCk7CisKKwlpZiAobHAtPm1zc2J1ZikKKwkJa2ZyZWUobHAtPm1zc2J1Zik7CisKKwlsZGNfaW9tbXVfcmVsZWFzZShscCk7CisKKwlrZnJlZShscCk7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlKTsKKworLyogQmluZCB0aGUgY2hhbm5lbC4gIFRoaXMgcmVnaXN0ZXJzIHRoZSBMREMgcXVldWVzIHdpdGgKKyAqIHRoZSBoeXBlcnZpc29yIGFuZCBwdXRzIHRoZSBjaGFubmVsIGludG8gYSBwc2V1ZG8tbGlzdGVuaW5nCisgKiBzdGF0ZS4gIFRoaXMgZG9lcyBub3QgaW5pdGlhdGUgYSBoYW5kc2hha2UsIGxkY19jb25uZWN0KCkgZG9lcworICogdGhhdC4KKyAqLworaW50IGxkY19iaW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIGZsYWdzOworCWludCBlcnIgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIW5hbWUpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChscC0+c3RhdGUgIT0gTERDX1NUQVRFX0lOSVQpCisJCWdvdG8gb3V0X2VycjsKKworCXNucHJpbnRmKGxwLT5yeF9pcnFfbmFtZSwgTERDX0lSUV9OQU1FX01BWCwgIiVzIFJYIiwgbmFtZSk7CisJc25wcmludGYobHAtPnR4X2lycV9uYW1lLCBMRENfSVJRX05BTUVfTUFYLCAiJXMgVFgiLCBuYW1lKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGxwLT5jZmcucnhfaXJxLCBsZGNfcngsCisJCQkgIElSUUZfU0FNUExFX1JBTkRPTSB8IElSUUZfU0hBUkVELAorCQkJICBscC0+cnhfaXJxX25hbWUsIGxwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShscC0+Y2ZnLnR4X2lycSwgbGRjX3R4LAorCQkJICBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRCwKKwkJCSAgbHAtPnR4X2lycV9uYW1lLCBscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9yeF9pcnE7CisKKworCWxwLT5mbGFncyB8PSBMRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisKKwllcnIgPSAtRU5PREVWOworCWh2X2VyciA9IHN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3Fjb25mKGxwLT5pZCwgbHAtPnR4X3JhLCBscC0+dHhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVM7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJZXJyID0gLUVCVVNZOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X3VubWFwX3J4OworCisJbHAtPnR4X2Fja2VkID0gbHAtPnR4X2hlYWQ7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfT1BFTjsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQk9VTkQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXBfcng6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKworb3V0X3VubWFwX3R4OgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCitvdXRfZnJlZV90eF9pcnE6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisJZnJlZV9pcnEobHAtPmNmZy50eF9pcnEsIGxwKTsKKworb3V0X2ZyZWVfcnhfaXJxOgorCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisKK291dF9lcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19iaW5kKTsKKworaW50IGxkY19jb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIShscC0+ZmxhZ3MgJiBMRENfRkxBR19BTExPQ0VEX1FVRVVFUykgfHwKKwkgICAgIShscC0+ZmxhZ3MgJiBMRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUykgfHwKKwkgICAgbHAtPmhzX3N0YXRlICE9IExEQ19IU19PUEVOKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gc3RhcnRfaGFuZHNoYWtlKGxwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfY29ubmVjdCk7CisKK2ludCBsZGNfZGlzY29ubmVjdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobHAtPmZsYWdzICYgTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVMpIHx8CisJICAgICEobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZXJyID0gLUVOT0RFVjsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9CT1VORCk7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJbHAtPmZsYWdzIHw9IExEQ19GTEFHX1JFU0VUOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCXN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIDAsIDApOworCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJZnJlZV9pcnEobHAtPmNmZy5yeF9pcnEsIGxwKTsKKwlscC0+ZmxhZ3MgJj0gfihMRENfRkxBR19SRUdJU1RFUkVEX0lSUVMgfAorCQkgICAgICAgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfZGlzY29ubmVjdCk7CisKK2ludCBsZGNfc3RhdGUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlyZXR1cm4gbHAtPnN0YXRlOworfQorRVhQT1JUX1NZTUJPTChsZGNfc3RhdGUpOworCitzdGF0aWMgaW50IHdyaXRlX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisJaW50IGVycjsKKworCWlmIChzaXplID4gTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUFHQUlOOworCisJbWVtY3B5KHAsIGJ1Ziwgc2l6ZSk7CisKKwllcnIgPSBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCWlmICghZXJyKQorCQllcnIgPSBzaXplOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZWFkX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVycjsKKworCWlmIChzaXplIDwgTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9nZXRfc3RhdGUobHAtPmlkLAorCQkJCQkmbHAtPnJ4X2hlYWQsCisJCQkJCSZscC0+cnhfdGFpbCwKKwkJCQkJJmxwLT5jaGFuX3N0YXRlKTsKKwlpZiAoaHZfZXJyKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmIChscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9ET1dOIHx8CisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCisJaWYgKGxwLT5yeF9oZWFkID09IGxwLT5yeF90YWlsKQorCQlyZXR1cm4gMDsKKworCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisJbWVtY3B5KGJ1ZiwgcCwgTERDX1BBQ0tFVF9TSVpFKTsKKworCW5ldyA9IHJ4X2FkdmFuY2UobHAsIGxwLT5yeF9oZWFkKTsKKwlscC0+cnhfaGVhZCA9IG5ldzsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIG5ldyk7CisJaWYgKGVyciA8IDApCisJCWVyciA9IC1FQ09OTlJFU0VUOworCWVsc2UKKwkJZXJyID0gTERDX1BBQ0tFVF9TSVpFOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgcmF3X29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfcmF3LAorCS5yZWFkCQk9CXJlYWRfcmF3LAorfTsKKworc3RhdGljIGludCB3cml0ZV9ub25yYXcoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIHRhaWw7CisJdW5zaWduZWQgaW50IGNvcGllZDsKKwl1MzIgc2VxOworCWludCBlcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwgJmxwLT50eF9oZWFkLCAmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKHVubGlrZWx5KGh2X2VycikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodW5saWtlbHkobHAtPmNoYW5fc3RhdGUgIT0gTERDX0NIQU5ORUxfVVApKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmICghdHhfaGFzX3NwYWNlX2ZvcihscCwgc2l6ZSkpCisJCXJldHVybiAtRUFHQUlOOworCisJc2VxID0gbHAtPnNuZF9ueHQ7CisJY29waWVkID0gMDsKKwl0YWlsID0gbHAtPnR4X3RhaWw7CisJd2hpbGUgKGNvcGllZCA8IHNpemUpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBscC0+dHhfYmFzZSArICh0YWlsIC8gTERDX1BBQ0tFVF9TSVpFKTsKKwkJdTggKmRhdGEgPSAoKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFKSA/CisJCQkgICAgcC0+dS51X2RhdGEgOgorCQkJICAgIHAtPnUuci5yX2RhdGEpOworCQlpbnQgZGF0YV9sZW47CisKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19JTkZPOworCQlwLT5jdHJsID0gMDsKKworCQlkYXRhX2xlbiA9IHNpemUgLSBjb3BpZWQ7CisJCWlmIChkYXRhX2xlbiA+IGxwLT5tc3MpCisJCQlkYXRhX2xlbiA9IGxwLT5tc3M7CisKKwkJQlVHX09OKGRhdGFfbGVuID4gTERDX0xFTik7CisKKwkJcC0+ZW52ID0gKGRhdGFfbGVuIHwKKwkJCSAgKGNvcGllZCA9PSAwID8gTERDX1NUQVJUIDogMCkgfAorCQkJICAoZGF0YV9sZW4gPT0gc2l6ZSAtIGNvcGllZCA/IExEQ19TVE9QIDogMCkpOworCisJCXAtPnNlcWlkID0gKytzZXE7CisKKwkJbGRjZGJnKERBVEEsICJTRU5UIERBVEEgWyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eF1cbiIsCisJCSAgICAgICBwLT50eXBlLAorCQkgICAgICAgcC0+c3R5cGUsCisJCSAgICAgICBwLT5jdHJsLAorCQkgICAgICAgcC0+ZW52LAorCQkgICAgICAgcC0+c2VxaWQpOworCisJCW1lbWNweShkYXRhLCBidWYsIGRhdGFfbGVuKTsKKwkJYnVmICs9IGRhdGFfbGVuOworCQljb3BpZWQgKz0gZGF0YV9sZW47CisKKwkJdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCX0KKworCWVyciA9IHNldF90eF90YWlsKGxwLCB0YWlsKTsKKwlpZiAoIWVycikgeworCQlscC0+c25kX254dCA9IHNlcTsKKwkJZXJyID0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJ4X2JhZF9zZXEoc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY19wYWNrZXQgKnAsCisJCSAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnKQoreworCWludCBlcnI7CisKKwlpZiAoZmlyc3RfZnJhZykKKwkJbHAtPnJjdl9ueHQgPSBmaXJzdF9mcmFnLT5zZXFpZCAtIDE7CisKKwllcnIgPSBzZW5kX2RhdGFfbmFjayhscCwgcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGxwLT5yeF90YWlsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXRhX2Fja19uYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCWlmIChwLT5zdHlwZSAmIExEQ19BQ0spIHsKKwkJaW50IGVyciA9IHByb2Nlc3NfZGF0YV9hY2sobHAsIHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHAtPnN0eXBlICYgTERDX05BQ0spCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZGF0YV93YWl0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgY3VyX2hlYWQpCit7CisJdW5zaWduZWQgbG9uZyBkdW1teTsKKwlpbnQgbGltaXQgPSAxMDAwOworCisJbGRjZGJnKERBVEEsICJEQVRBIFdBSVQgY3VyX2hlYWRbJWx4XSByeF9oZWFkWyVseF0gcnhfdGFpbFslbHhdXG4iLAorCSAgICAgICBjdXJfaGVhZCwgbHAtPnJ4X2hlYWQsIGxwLT5yeF90YWlsKTsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCQkmZHVtbXksCisJCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCQlpZiAoaHZfZXJyKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwkJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCQlpZiAoY3VyX2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWxkY2RiZyhEQVRBLCAiREFUQSBXQUlUIERPTkUgIgorCQkJICAgICAgICJoZWFkWyVseF0gdGFpbFslbHhdIGNoYW5fc3RhdGVbJWx4XVxuIiwKKwkJCSAgICAgICBkdW1teSwgbHAtPnJ4X3RhaWwsIGxwLT5jaGFuX3N0YXRlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdWRlbGF5KDEpOworCX0KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludCByeF9zZXRfaGVhZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJaW50IGVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGhlYWQpOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJbHAtPnJ4X2hlYWQgPSBoZWFkOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2RhdGFfYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKworCXAgPSBkYXRhX2dldF90eF9wYWNrZXQobHAsICZuZXdfdGFpbCk7CisJaWYgKGxpa2VseShwKSkgeworCQlpbnQgZXJyOworCisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19BQ0s7CisJCXAtPmN0cmwgPSAwOworCQlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlscC0+c25kX254dCsrOworCX0KK30KKworc3RhdGljIGludCByZWFkX25vbnJhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVyciwgY29waWVkOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+cnhfaGVhZCwKKwkJCQkJJmxwLT5yeF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfUkVTRVRUSU5HKQorCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisKKwlpZiAobHAtPnJ4X2hlYWQgPT0gbHAtPnJ4X3RhaWwpCisJCXJldHVybiAwOworCisJZmlyc3RfZnJhZyA9IE5VTEw7CisJY29waWVkID0gZXJyID0gMDsKKwluZXcgPSBscC0+cnhfaGVhZDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJaW50IHBrdF9sZW47CisKKwkJQlVHX09OKG5ldyA9PSBscC0+cnhfdGFpbCk7CisJCXAgPSBscC0+cnhfYmFzZSArIChuZXcgLyBMRENfUEFDS0VUX1NJWkUpOworCisJCWxkY2RiZyhSWCwgIlJYIHJlYWQgcGt0WyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eDolMDh4XSAiCisJCSAgICAgICAicmN2X254dFslMDh4XVxuIiwKKwkJICAgICAgIHAtPnR5cGUsCisJCSAgICAgICBwLT5zdHlwZSwKKwkJICAgICAgIHAtPmN0cmwsCisJCSAgICAgICBwLT5lbnYsCisJCSAgICAgICBwLT5zZXFpZCwKKwkJICAgICAgIHAtPnUuci5hY2tpZCwKKwkJICAgICAgIGxwLT5yY3Zfbnh0KTsKKworCQlpZiAodW5saWtlbHkoIXJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkgeworCQkJZXJyID0gcnhfYmFkX3NlcShscCwgcCwgZmlyc3RfZnJhZyk7CisJCQljb3BpZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocC0+dHlwZSAmIExEQ19DVFJMKSB7CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQllcnIgPSAwOworCQl9CisKKwkJbHAtPnJjdl9ueHQgPSBwLT5zZXFpZDsKKworCQlpZiAoIShwLT50eXBlICYgTERDX0RBVEEpKSB7CisJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCQkJZ290byBub19kYXRhOworCQl9CisJCWlmIChwLT5zdHlwZSAmIChMRENfQUNLIHwgTERDX05BQ0spKSB7CisJCQllcnIgPSBkYXRhX2Fja19uYWNrKGxwLCBwKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocC0+c3R5cGUgJiBMRENfSU5GTykpIHsKKwkJCW5ldyA9IHJ4X2FkdmFuY2UobHAsIG5ldyk7CisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCQlnb3RvIG5vX2RhdGE7CisJCX0KKworCQlwa3RfbGVuID0gcC0+ZW52ICYgTERDX0xFTjsKKworCQkvKiBFdmVyeSBpbml0aWFsIHBhY2tldCBzdGFydHMgd2l0aCB0aGUgU1RBUlQgYml0IHNldC4KKwkJICoKKwkJICogU2luZ2xldG9uIHBhY2tldHMgd2lsbCBoYXZlIGJvdGggU1RBUlQrU1RPUCBzZXQuCisJCSAqCisJCSAqIEZyYWdtZW50cyB3aWxsIGhhdmUgU1RBUlQgc2V0IGluIHRoZSBmaXJzdCBmcmFtZSwgU1RPUAorCQkgKiBzZXQgaW4gdGhlIGxhc3QgZnJhbWUsIGFuZCBuZWl0aGVyIGJpdCBzZXQgaW4gbWlkZGxlCisJCSAqIGZyYW1lcyBvZiB0aGUgcGFja2V0LgorCQkgKgorCQkgKiBUaGVyZWZvcmUgaWYgd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBwYWNrZXQgYW5kCisJCSAqIHdlIGRvbid0IHNlZSBTVEFSVCwgb3Igd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBmcmFnbWVudGVkCisJCSAqIHBhY2tldCBhbmQgZG8gc2VlIFNUQVJULCB3ZSBhcmUgdW5zeW5jaHJvbml6ZWQgYW5kIHNob3VsZAorCQkgKiBmbHVzaCB0aGUgUlggcXVldWUuCisJCSAqLworCQlpZiAoKGZpcnN0X2ZyYWcgPT0gTlVMTCAmJiAhKHAtPmVudiAmIExEQ19TVEFSVCkpIHx8CisJCSAgICAoZmlyc3RfZnJhZyAhPSBOVUxMICYmICAocC0+ZW52ICYgTERDX1NUQVJUKSkpIHsKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQlnb3RvIG5vX2RhdGE7CisJCX0KKwkJaWYgKCFmaXJzdF9mcmFnKQorCQkJZmlyc3RfZnJhZyA9IHA7CisKKwkJaWYgKHBrdF9sZW4gPiBzaXplIC0gY29waWVkKSB7CisJCQkvKiBVc2VyIGRpZG4ndCBnaXZlIHVzIGEgYmlnIGVub3VnaCBidWZmZXIsCisJCQkgKiB3aGF0IHRvIGRvPyAgVGhpcyBpcyBhIHByZXR0eSBzZXJpb3VzIGVycm9yLgorCQkJICoKKwkJCSAqIFNpbmNlIHdlIGhhdmVuJ3QgdXBkYXRlZCB0aGUgUlggcmluZyBoZWFkIHRvCisJCQkgKiBjb25zdW1lIGFueSBvZiB0aGUgcGFja2V0cywgc2lnbmFsIHRoZSBlcnJvcgorCQkJICogdG8gdGhlIHVzZXIgYW5kIGp1c3QgbGVhdmUgdGhlIFJYIHJpbmcgYWxvbmUuCisJCQkgKgorCQkJICogVGhpcyBzZWVtcyB0aGUgYmVzdCBiZWhhdmlvciBiZWNhdXNlIHRoaXMgYWxsb3dzCisJCQkgKiBhIHVzZXIgb2YgdGhlIExEQyBsYXllciB0byBzdGFydCB3aXRoIGEgc21hbGwKKwkJCSAqIFJYIGJ1ZmZlciBmb3IgbGRjX3JlYWQoKSBjYWxscyBhbmQgdXNlIC1FTVNHU0laRQorCQkJICogYXMgYSBjdWUgdG8gZW5sYXJnZSBpdCdzIHJlYWQgYnVmZmVyLgorCQkJICovCisJCQllcnIgPSAtRU1TR1NJWkU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9rLCB3ZSBhcmUgZ29ubmEgZWF0IHRoaXMgb25lLiAgKi8KKwkJbmV3ID0gcnhfYWR2YW5jZShscCwgbmV3KTsKKworCQltZW1jcHkoYnVmLAorCQkgICAgICAgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFID8KKwkJCXAtPnUudV9kYXRhIDogcC0+dS5yLnJfZGF0YSksIHBrdF9sZW4pOworCQlidWYgKz0gcGt0X2xlbjsKKwkJY29waWVkICs9IHBrdF9sZW47CisKKwkJaWYgKHAtPmVudiAmIExEQ19TVE9QKQorCQkJYnJlYWs7CisKK25vX2RhdGE6CisJCWlmIChuZXcgPT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWVyciA9IHJ4X2RhdGFfd2FpdChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWVycikKKwkJZXJyID0gcnhfc2V0X2hlYWQobHAsIG5ldyk7CisKKwlpZiAoZXJyICYmIGZpcnN0X2ZyYWcpCisJCWxwLT5yY3Zfbnh0ID0gZmlyc3RfZnJhZy0+c2VxaWQgLSAxOworCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gY29waWVkOworCQlpZiAoZXJyID4gMCAmJiBscC0+Y2ZnLm1vZGUgIT0gTERDX01PREVfVU5SRUxJQUJMRSkKKwkJCXNlbmRfZGF0YV9hY2sobHApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIG5vbnJhd19vcHMgPSB7CisJLndyaXRlCQk9CXdyaXRlX25vbnJhdywKKwkucmVhZAkJPQlyZWFkX25vbnJhdywKK307CisKK3N0YXRpYyBpbnQgd3JpdGVfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCBzaXplKQoreworCWlmIChzaXplID4gbHAtPmNmZy5tdHUpCisJCXNpemUgPSBscC0+Y2ZnLm10dTsKKwlyZXR1cm4gd3JpdGVfbm9ucmF3KGxwLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IHJlYWRfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKCFscC0+bXNzYnVmX2xlbikgeworCQlpbnQgZXJyID0gcmVhZF9ub25yYXcobHAsIGxwLT5tc3NidWYsIGxwLT5jZmcubXR1KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWxwLT5tc3NidWZfbGVuID0gZXJyOworCQlscC0+bXNzYnVmX29mZiA9IDA7CisJfQorCisJaWYgKHNpemUgPiBscC0+bXNzYnVmX2xlbikKKwkJc2l6ZSA9IGxwLT5tc3NidWZfbGVuOworCW1lbWNweShidWYsIGxwLT5tc3NidWYgKyBscC0+bXNzYnVmX29mZiwgc2l6ZSk7CisKKwlscC0+bXNzYnVmX29mZiArPSBzaXplOworCWxwLT5tc3NidWZfbGVuIC09IHNpemU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfc3RyZWFtLAorCS5yZWFkCQk9CXJlYWRfc3RyZWFtLAorfTsKKworaW50IGxkY193cml0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+aHNfc3RhdGUgIT0gTERDX0hTX0NPTVBMRVRFKQorCQllcnIgPSAtRU5PVENPTk47CisJZWxzZQorCQllcnIgPSBscC0+bW9wcy0+d3JpdGUobHAsIGJ1Ziwgc2l6ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3dyaXRlKTsKKworaW50IGxkY19yZWFkKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUpCisJCWVyciA9IC1FTk9UQ09OTjsKKwllbHNlCisJCWVyciA9IGxwLT5tb3BzLT5yZWFkKGxwLCBidWYsIHNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19yZWFkKTsKKworc3RhdGljIGxvbmcgYXJlbmFfYWxsb2Moc3RydWN0IGxkY19pb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQoreworCXN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEgPSAmaW9tbXUtPmFyZW5hOworCXVuc2lnbmVkIGxvbmcgbiwgaSwgc3RhcnQsIGVuZCwgbGltaXQ7CisJaW50IHBhc3M7CisKKwlsaW1pdCA9IGFyZW5hLT5saW1pdDsKKwlzdGFydCA9IGFyZW5hLT5oaW50OworCXBhc3MgPSAwOworCithZ2FpbjoKKwluID0gZmluZF9uZXh0X3plcm9fYml0KGFyZW5hLT5tYXAsIGxpbWl0LCBzdGFydCk7CisJZW5kID0gbiArIG5wYWdlczsKKwlpZiAodW5saWtlbHkoZW5kID49IGxpbWl0KSkgeworCQlpZiAobGlrZWx5KHBhc3MgPCAxKSkgeworCQkJbGltaXQgPSBzdGFydDsKKwkJCXN0YXJ0ID0gMDsKKwkJCXBhc3MrKzsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSB7CisJCQkvKiBTY2FubmVkIHRoZSB3aG9sZSB0aGluZywgZ2l2ZSB1cC4gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWZvciAoaSA9IG47IGkgPCBlbmQ7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgYXJlbmEtPm1hcCkpIHsKKwkJCXN0YXJ0ID0gaSArIDE7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJZm9yIChpID0gbjsgaSA8IGVuZDsgaSsrKQorCQlfX3NldF9iaXQoaSwgYXJlbmEtPm1hcCk7CisKKwlhcmVuYS0+aGludCA9IGVuZDsKKworCXJldHVybiBuOworfQorCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREUJMHhmMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREVfU0hJRlQJNjBVTEwKKworc3RhdGljIHU2NCBwYWdlc2l6ZV9jb2RlKHZvaWQpCit7CisJc3dpdGNoIChQQUdFX1NJWkUpIHsKKwlkZWZhdWx0OgorCWNhc2UgKDhVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDA7CisJY2FzZSAoNjRVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDE7CisJY2FzZSAoNTEyVUxMICogMTAyNFVMTCk6CisJCXJldHVybiAyOworCWNhc2UgKDRVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiAzOworCWNhc2UgKDMyVUxMICogMTAyNFVMTCAqIDEwMjRVTEwpOgorCQlyZXR1cm4gNDsKKwljYXNlICgyNTZVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiA1OworCX0KK30KKworc3RhdGljIHU2NCBtYWtlX2Nvb2tpZSh1NjQgaW5kZXgsIHU2NCBwZ3N6X2NvZGUsIHU2NCBwYWdlX29mZnNldCkKK3sKKwlyZXR1cm4gKChwZ3N6X2NvZGUgPDwgQ09PS0lFX1BHU1pfQ09ERV9TSElGVCkgfAorCQkoaW5kZXggPDwgUEFHRV9TSElGVCkgfAorCQlwYWdlX29mZnNldCk7Cit9CisKK3N0YXRpYyB1NjQgY29va2llX3RvX2luZGV4KHU2NCBjb29raWUsIHVuc2lnbmVkIGxvbmcgKnNoaWZ0KQoreworCXU2NCBzemNvZGUgPSBjb29raWUgPj4gQ09PS0lFX1BHU1pfQ09ERV9TSElGVDsKKworCWNvb2tpZSAmPSB+Q09PS0lFX1BHU1pfQ09ERTsKKworCSpzaGlmdCA9IHN6Y29kZSAqIDM7CisKKwlyZXR1cm4gKGNvb2tpZSA+PiAoMTNVTEwgKyAoc3pjb2RlICogM1VMTCkpKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5ICphbGxvY19ucGFnZXMoc3RydWN0IGxkY19pb21tdSAqaW9tbXUsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBucGFnZXMpCit7CisJbG9uZyBlbnRyeTsKKworCWVudHJ5ID0gYXJlbmFfYWxsb2MoaW9tbXUsIG5wYWdlcyk7CisJaWYgKHVubGlrZWx5KGVudHJ5IDwgMCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlvbW11LT5wYWdlX3RhYmxlICsgZW50cnk7Cit9CisKK3N0YXRpYyB1NjQgcGVybV90b19tdGUodW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXU2NCBtdGVfYmFzZTsKKworCW10ZV9iYXNlID0gcGFnZXNpemVfY29kZSgpOworCisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9TSEFET1cpIHsKKwkJaWYgKG1hcF9wZXJtICYgTERDX01BUF9SKQorCQkJbXRlX2Jhc2UgfD0gTERDX01URV9DT1BZX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfQ09QWV9XOworCX0KKwlpZiAobWFwX3Blcm0gJiBMRENfTUFQX0RJUkVDVCkgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX1JFQUQ7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfV1JJVEU7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfWCkKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfRVhFQzsKKwl9CisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9JTykgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX0lPTU1VX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfSU9NTVVfVzsKKwl9CisKKwlyZXR1cm4gbXRlX2Jhc2U7Cit9CisKK3N0YXRpYyBpbnQgcGFnZXNfaW5fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgbG9uZyBsZW4pCit7CisJaW50IGNvdW50ID0gMDsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBuZXcgPSAoYmFzZSArIFBBR0VfU0laRSkgJiBQQUdFX01BU0s7CisKKwkJbGVuIC09IChuZXcgLSBiYXNlKTsKKwkJYmFzZSA9IG5ldzsKKwkJY291bnQrKzsKKwl9IHdoaWxlIChsZW4gPiAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RydWN0IGNvb2tpZV9zdGF0ZSB7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCQkqY29va2llczsKKwl1NjQJCQkJbXRlX2Jhc2U7CisJdTY0CQkJCXByZXZfY29va2llOworCXUzMgkJCQlwdGVfaWR4OworCXUzMgkJCQluYzsKK307CisKK3N0YXRpYyB2b2lkIGZpbGxfY29va2llcyhzdHJ1Y3QgY29va2llX3N0YXRlICpzcCwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSB1bnNpZ25lZCBsb25nIG9mZiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJZG8geworCQl1bnNpZ25lZCBsb25nIHRsZW4sIG5ldyA9IHBhICsgUEFHRV9TSVpFOworCQl1NjQgdGhpc19jb29raWU7CisKKwkJc3AtPnBhZ2VfdGFibGVbc3AtPnB0ZV9pZHhdLm10ZSA9IHNwLT5tdGVfYmFzZSB8IHBhOworCisJCXRsZW4gPSBQQUdFX1NJWkU7CisJCWlmIChvZmYpCisJCQl0bGVuID0gUEFHRV9TSVpFIC0gb2ZmOworCQlpZiAodGxlbiA+IGxlbikKKwkJCXRsZW4gPSBsZW47CisKKwkJdGhpc19jb29raWUgPSBtYWtlX2Nvb2tpZShzcC0+cHRlX2lkeCwKKwkJCQkJICBwYWdlc2l6ZV9jb2RlKCksIG9mZik7CisKKwkJb2ZmID0gMDsKKworCQlpZiAodGhpc19jb29raWUgPT0gc3AtPnByZXZfY29va2llKSB7CisJCQlzcC0+Y29va2llc1tzcC0+bmMgLSAxXS5jb29raWVfc2l6ZSArPSB0bGVuOworCQl9IGVsc2UgeworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfYWRkciA9IHRoaXNfY29va2llOworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfc2l6ZSA9IHRsZW47CisJCQlzcC0+bmMrKzsKKwkJfQorCQlzcC0+cHJldl9jb29raWUgPSB0aGlzX2Nvb2tpZSArIHRsZW47CisKKwkJc3AtPnB0ZV9pZHgrKzsKKworCQlsZW4gLT0gdGxlbjsKKwkJcGEgPSBuZXc7CisJfSB3aGlsZSAobGVuID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgc2dfY291bnRfb25lKHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gcGFnZV90b19wZm4oc2ctPnBhZ2UpIDw8IFBBR0VfU0hJRlQ7CisJbG9uZyBsZW4gPSBzZy0+bGVuZ3RoOworCisJaWYgKChzZy0+b2Zmc2V0IHwgbGVuKSAmICg4VUwgLSAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcGFnZXNfaW5fcmVnaW9uKGJhc2UgKyBzZy0+b2Zmc2V0LCBsZW4pOworfQorCitzdGF0aWMgaW50IHNnX2NvdW50X3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fc2cpCit7CisJaW50IGNvdW50OworCWludCBpOworCisJY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykgeworCQlpbnQgZXJyID0gc2dfY291bnRfb25lKHNnICsgaSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJY291bnQgKz0gZXJyOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworaW50IGxkY19tYXBfc2coc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG51bV9zZywKKwkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzLCBmbGFnczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKwlzdHJ1Y3QgY29va2llX3N0YXRlIHN0YXRlOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11OworCWludCBlcnI7CisKKwlpZiAobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gc2dfY291bnRfcGFnZXMoc2csIG51bV9zZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlucGFnZXMgPSBlcnI7CisJaWYgKGVyciA+IG5jb29raWVzKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaW9tbXUgPSAmbHAtPmlvbW11OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJYmFzZSA9IGFsbG9jX25wYWdlcyhpb21tdSwgbnBhZ2VzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFiYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlLnBhZ2VfdGFibGUgPSBpb21tdS0+cGFnZV90YWJsZTsKKwlzdGF0ZS5jb29raWVzID0gY29va2llczsKKwlzdGF0ZS5tdGVfYmFzZSA9IHBlcm1fdG9fbXRlKG1hcF9wZXJtKTsKKwlzdGF0ZS5wcmV2X2Nvb2tpZSA9IH4odTY0KTA7CisJc3RhdGUucHRlX2lkeCA9IChiYXNlIC0gaW9tbXUtPnBhZ2VfdGFibGUpOworCXN0YXRlLm5jID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykKKwkJZmlsbF9jb29raWVzKCZzdGF0ZSwgcGFnZV90b19wZm4oc2dbaV0ucGFnZSkgPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgc2dbaV0ub2Zmc2V0LCBzZ1tpXS5sZW5ndGgpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NnKTsKKworaW50IGxkY19tYXBfc2luZ2xlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkJICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzLCBwYSwgZmxhZ3M7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkgKmJhc2U7CisJc3RydWN0IGNvb2tpZV9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgbGRjX2lvbW11ICppb21tdTsKKworCWlmICgobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpIHx8IChuY29va2llcyA8IDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhID0gX19wYShidWYpOworCWlmICgocGEgfCBsZW4pICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW5wYWdlcyA9IHBhZ2VzX2luX3JlZ2lvbihwYSwgbGVuKTsKKworCWlvbW11ID0gJmxwLT5pb21tdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWJhc2UgPSBhbGxvY19ucGFnZXMoaW9tbXUsIG5wYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCWlmICghYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0ZS5wYWdlX3RhYmxlID0gaW9tbXUtPnBhZ2VfdGFibGU7CisJc3RhdGUuY29va2llcyA9IGNvb2tpZXM7CisJc3RhdGUubXRlX2Jhc2UgPSBwZXJtX3RvX210ZShtYXBfcGVybSk7CisJc3RhdGUucHJldl9jb29raWUgPSB+KHU2NCkwOworCXN0YXRlLnB0ZV9pZHggPSAoYmFzZSAtIGlvbW11LT5wYWdlX3RhYmxlKTsKKwlzdGF0ZS5uYyA9IDA7CisJZmlsbF9jb29raWVzKCZzdGF0ZSwgKHBhICYgUEFHRV9NQVNLKSwgKHBhICYgflBBR0VfTUFTSyksIGxlbik7CisJQlVHX09OKHN0YXRlLm5jICE9IDEpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NpbmdsZSk7CisKK3N0YXRpYyB2b2lkIGZyZWVfbnBhZ2VzKHVuc2lnbmVkIGxvbmcgaWQsIHN0cnVjdCBsZGNfaW9tbXUgKmlvbW11LAorCQkJdTY0IGNvb2tpZSwgdTY0IHNpemUpCit7CisJc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSA9ICZpb21tdS0+YXJlbmE7CisJdW5zaWduZWQgbG9uZyBpLCBzaGlmdCwgaW5kZXgsIG5wYWdlczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKworCW5wYWdlcyA9IFBBR0VfQUxJR04oKChjb29raWUgJiB+UEFHRV9NQVNLKSArIHNpemUpKSA+PiBQQUdFX1NISUZUOworCWluZGV4ID0gY29va2llX3RvX2luZGV4KGNvb2tpZSwgJnNoaWZ0KTsKKwliYXNlID0gaW9tbXUtPnBhZ2VfdGFibGUgKyBpbmRleDsKKworCUJVR19PTihpbmRleCA+IGFyZW5hLT5saW1pdCB8fAorCSAgICAgICAoaW5kZXggKyBucGFnZXMpID4gYXJlbmEtPmxpbWl0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQlpZiAoYmFzZS0+Y29va2llKQorCQkJc3VuNHZfbGRjX3Jldm9rZShpZCwgY29va2llICsgKGkgPDwgc2hpZnQpLAorCQkJCQkgYmFzZS0+Y29va2llKTsKKwkJYmFzZS0+bXRlID0gMDsKKwkJX19jbGVhcl9iaXQoaW5kZXggKyBpLCBhcmVuYS0+bWFwKTsKKwl9Cit9CisKK3ZvaWQgbGRjX3VubWFwKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCSAgICAgICBpbnQgbmNvb2tpZXMpCit7CisJc3RydWN0IGxkY19pb21tdSAqaW9tbXUgPSAmbHAtPmlvbW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmNvb2tpZXM7IGkrKykgeworCQl1NjQgYWRkciA9IGNvb2tpZXNbaV0uY29va2llX2FkZHI7CisJCXU2NCBzaXplID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKworCQlmcmVlX25wYWdlcyhscC0+aWQsIGlvbW11LCBhZGRyLCBzaXplKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3VubWFwKTsKKworaW50IGxkY19jb3B5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGludCBjb3B5X2RpciwKKwkgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCXVuc2lnbmVkIGludCBvcmlnX2xlbjsKKwl1bnNpZ25lZCBsb25nIHJhOworCWludCBpOworCisJaWYgKGNvcHlfZGlyICE9IExEQ19DT1BZX0lOICYmIGNvcHlfZGlyICE9IExEQ19DT1BZX09VVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBCYWQgY29weV9kaXJbJWRdXG4iLAorCQkgICAgICAgbHAtPmlkLCBjb3B5X2Rpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJhID0gX19wYShidWYpOworCWlmICgocmEgfCBsZW4gfCBvZmZzZXQpICYgKDhVTCAtIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19jb3B5OiBJRFslbHVdIFVuYWxpZ25lZCBidWZmZXIgIgorCQkgICAgICAgInJhWyVseF0gbGVuWyV4XSBvZmZzZXRbJWx4XVxuIiwKKwkJICAgICAgIGxwLT5pZCwgcmEsIGxlbiwgb2Zmc2V0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBMaW5rIGRvd24gaHNfc3RhdGVbJXhdICIKKwkJICAgICAgICJmbGFnc1sleF1cbiIsIGxwLT5pZCwgbHAtPmhzX3N0YXRlLCBscC0+ZmxhZ3MpOworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfQorCisJb3JpZ19sZW4gPSBsZW47CisJZm9yIChpID0gMDsgaSA8IG5jb29raWVzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBjb29raWVfcmFkZHIgPSBjb29raWVzW2ldLmNvb2tpZV9hZGRyOworCQl1bnNpZ25lZCBsb25nIHRoaXNfbGVuID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBhY3R1YWxfbGVuOworCisJCWlmICh1bmxpa2VseShvZmZzZXQpKSB7CisJCQl1bnNpZ25lZCBsb25nIHRoaXNfb2ZmID0gb2Zmc2V0OworCisJCQlpZiAodGhpc19vZmYgPiB0aGlzX2xlbikKKwkJCQl0aGlzX29mZiA9IHRoaXNfbGVuOworCisJCQlvZmZzZXQgLT0gdGhpc19vZmY7CisJCQl0aGlzX2xlbiAtPSB0aGlzX29mZjsKKwkJCWlmICghdGhpc19sZW4pCisJCQkJY29udGludWU7CisJCQljb29raWVfcmFkZHIgKz0gdGhpc19vZmY7CisJCX0KKworCQlpZiAodGhpc19sZW4gPiBsZW4pCisJCQl0aGlzX2xlbiA9IGxlbjsKKworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJCWh2X2VyciA9IHN1bjR2X2xkY19jb3B5KGxwLT5pZCwgY29weV9kaXIsCisJCQkJCQljb29raWVfcmFkZHIsIHJhLAorCQkJCQkJdGhpc19sZW4sICZhY3R1YWxfbGVuKTsKKwkJCWlmICh1bmxpa2VseShodl9lcnIpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2NvcHk6IElEWyVsdV0gIgorCQkJCSAgICAgICAiSFYgZXJyb3IgJWx1XG4iLAorCQkJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisJCQkJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkJCQkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkKKwkJCQkJcmV0dXJuIC1FQ09OTlJFU0VUOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWNvb2tpZV9yYWRkciArPSBhY3R1YWxfbGVuOworCQkJcmEgKz0gYWN0dWFsX2xlbjsKKwkJCWxlbiAtPSBhY3R1YWxfbGVuOworCQkJaWYgKGFjdHVhbF9sZW4gPT0gdGhpc19sZW4pCisJCQkJYnJlYWs7CisKKwkJCXRoaXNfbGVuIC09IGFjdHVhbF9sZW47CisJCX0KKworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCX0KKworCS8qIEl0IGlzIGNhbGxlciBwb2xpY3kgd2hhdCB0byBkbyBhYm91dCBzaG9ydCBjb3BpZXMuCisJICogRm9yIGV4YW1wbGUsIGEgbmV0d29ya2luZyBkcml2ZXIgY2FuIGRlY2xhcmUgdGhlCisJICogcGFja2V0IGEgcnVudCBhbmQgZHJvcCBpdC4KKwkgKi8KKworCXJldHVybiBvcmlnX2xlbiAtIGxlbjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX2NvcHkpOworCit2b2lkICpsZGNfYWxsb2NfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBsZW4sCisJCQkgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgKm5jb29raWVzLAorCQkJICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pCit7CisJdm9pZCAqYnVmOworCWludCBlcnI7CisKKwlpZiAobGVuICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSBsZGNfbWFwX3NpbmdsZShscCwgYnVmLCBsZW4sIGNvb2tpZXMsICpuY29va2llcywgbWFwX3Blcm0pOworCWlmIChlcnIgPCAwKSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCSpuY29va2llcyA9IGVycjsKKworCXJldHVybiBidWY7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvY19leHBfZHJpbmcpOworCit2b2lkIGxkY19mcmVlX2V4cF9kcmluZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisJCQlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCWxkY191bm1hcChscCwgY29va2llcywgbmNvb2tpZXMpOworCWtmcmVlKGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlX2V4cF9kcmluZyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGxkY19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtYWpvciwgbWlub3I7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJY29uc3QgdTY0ICp2OworCXU2NCBtcDsKKworCWhwID0gbWRlc2NfZ3JhYigpOworCWlmICghaHApCisJCXJldHVybiAtRU5PREVWOworCisJbXAgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgInBsYXRmb3JtIik7CisJaWYgKG1wID09IE1ERVNDX05PREVfTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRvbWFpbmluZy1lbmFibGVkIiwgTlVMTCk7CisJaWYgKCF2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1ham9yID0gMTsKKwltaW5vciA9IDA7CisJaWYgKHN1bjR2X2h2YXBpX3JlZ2lzdGVyKEhWX0dSUF9MRE9NLCBtYWpvciwgJm1pbm9yKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGQgbm90IHJlZ2lzdGVyIExET00gaHZhcGkuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWlmICghKnYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRvbWFpbmluZyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbGRvbV9kb21haW5pbmdfZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChsZGNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKaW5kZXggZjBlMTYwNDUuLmRlNTMxMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvbWRlc2MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKQEAgLTYsNiArNiw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL21kZXNjLmg+CkBAIC0yOSw3ICszMiw3IEBACiAJdTMyCW5vZGVfc3o7IC8qIG5vZGUgYmxvY2sgc2l6ZSAqLwogCXUzMgluYW1lX3N6OyAvKiBuYW1lIGJsb2NrIHNpemUgKi8KIAl1MzIJZGF0YV9zejsgLyogZGF0YSBibG9jayBzaXplICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwogCiBzdHJ1Y3QgbWRlc2NfZWxlbSB7CiAJdTgJdGFnOwpAQCAtNTMsMzA2ICs1NiwzOTYgQEAKIAl9IGQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX2hkciAqbWFpbl9tZGVzYzsKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqYWxsbm9kZXM7CitzdHJ1Y3QgbWRlc2NfbWVtX29wcyB7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqKCphbGxvYykodW5zaWduZWQgaW50IG1kZXNjX3NpemUpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUpOworfTsKIAotc3RhdGljIHN0cnVjdCBtZGVzY19ub2RlICphbGxub2Rlc190YWlsOwotc3RhdGljIHVuc2lnbmVkIGludCB1bmlxdWVfaWQ7CitzdHJ1Y3QgbWRlc2NfaGFuZGxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IG1kZXNjX21lbV9vcHMJKm1vcHM7CisJdm9pZAkJCSpzZWxmX2Jhc2U7CisJYXRvbWljX3QJCXJlZmNudDsKKwl1bnNpZ25lZCBpbnQJCWhhbmRsZV9zaXplOworCXN0cnVjdCBtZGVzY19oZHIJbWRlc2M7Cit9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX25vZGUgKiptZGVzY19oYXNoOwotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19oYXNoX3NpemU7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vZGVfaGFzaGZuKHU2NCBub2RlKQorc3RhdGljIHZvaWQgbWRlc2NfaGFuZGxlX2luaXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsCisJCQkgICAgICB2b2lkICpiYXNlKQogewotCXJldHVybiAoKHVuc2lnbmVkIGludCkgKG5vZGUgXiAobm9kZSA+PiA4KSBeIChub2RlID4+IDE2KSkpCi0JCSYgKG1kZXNjX2hhc2hfc2l6ZSAtIDEpOworCUJVR19PTigoKHVuc2lnbmVkIGxvbmcpJmhwLT5tZGVzYykgJiAoMTZVTCAtIDEpKTsKKworCW1lbXNldChocCwgMCwgaGFuZGxlX3NpemUpOworCUlOSVRfTElTVF9IRUFEKCZocC0+bGlzdCk7CisJaHAtPnNlbGZfYmFzZSA9IGJhc2U7CisJYXRvbWljX3NldCgmaHAtPnJlZmNudCwgMSk7CisJaHAtPmhhbmRsZV9zaXplID0gaGFuZGxlX3NpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX25vZGUoc3RydWN0IG1kZXNjX25vZGUgKm1wKQorc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2Jvb3RtZW1fYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKipoZWFkID0gJm1kZXNjX2hhc2hbbm9kZV9oYXNoZm4obXAtPm5vZGUpXTsKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsIGFsbG9jX3NpemU7CiAKLQltcC0+aGFzaF9uZXh0ID0gKmhlYWQ7Ci0JKmhlYWQgPSBtcDsKKwloYW5kbGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IG1kZXNjX2hhbmRsZSkgLQorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZGVzY19oZHIpICsKKwkJICAgICAgIG1kZXNjX3NpemUpOworCWFsbG9jX3NpemUgPSBQQUdFX0FMSUdOKGhhbmRsZV9zaXplKTsKIAotCWlmIChhbGxub2Rlc190YWlsKSB7Ci0JCWFsbG5vZGVzX3RhaWwtPmFsbG5vZGVzX25leHQgPSBtcDsKLQkJYWxsbm9kZXNfdGFpbCA9IG1wOwotCX0gZWxzZSB7Ci0JCWFsbG5vZGVzID0gYWxsbm9kZXNfdGFpbCA9IG1wOworCWhwID0gX19hbGxvY19ib290bWVtKGFsbG9jX3NpemUsIFBBR0VfU0laRSwgMFVMKTsKKwlpZiAoaHApCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgaHApOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19ib290bWVtX2ZyZWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCit7CisJdW5zaWduZWQgaW50IGFsbG9jX3NpemUsIGhhbmRsZV9zaXplID0gaHAtPmhhbmRsZV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOworCisJYWxsb2Nfc2l6ZSA9IFBBR0VfQUxJR04oaGFuZGxlX3NpemUpOworCisJc3RhcnQgPSAodW5zaWduZWQgbG9uZykgaHA7CisJZW5kID0gc3RhcnQgKyBhbGxvY19zaXplOworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCXN0cnVjdCBwYWdlICpwOworCisJCXAgPSB2aXJ0X3RvX3BhZ2Uoc3RhcnQpOworCQlDbGVhclBhZ2VSZXNlcnZlZChwKTsKKwkJX19mcmVlX3BhZ2UocCk7CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqZmluZF9ub2RlKHU2NCBub2RlKQorc3RhdGljIHN0cnVjdCBtZGVzY19tZW1fb3BzIGJvb3RtZW1fbWRlc2NfbWVtb3BzID0geworCS5hbGxvYyA9IG1kZXNjX2Jvb3RtZW1fYWxsb2MsCisJLmZyZWUgID0gbWRlc2NfYm9vdG1lbV9mcmVlLAorfTsKKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2ttYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wID0gbWRlc2NfaGFzaFtub2RlX2hhc2hmbihub2RlKV07CisJdW5zaWduZWQgaW50IGhhbmRsZV9zaXplOworCXZvaWQgKmJhc2U7CiAKLQl3aGlsZSAobXApIHsKLQkJaWYgKG1wLT5ub2RlID09IG5vZGUpCi0JCQlyZXR1cm4gbXA7CisJaGFuZGxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBtZGVzY19oYW5kbGUpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWRlc2NfaGRyKSArCisJCSAgICAgICBtZGVzY19zaXplKTsKIAotCQltcCA9IG1wLT5oYXNoX25leHQ7CisJYmFzZSA9IGttYWxsb2MoaGFuZGxlX3NpemUgKyAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJhc2UpIHsKKwkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwkJYWRkciA9IChhZGRyICsgMTVVTCkgJiB+MTVVTDsKKwkJaHAgPSAoc3RydWN0IG1kZXNjX2hhbmRsZSAqKSBhZGRyOworCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgYmFzZSk7CisJCXJldHVybiBocDsKIAl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IHByb3BlcnR5ICptZF9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBtZGVzY19ub2RlICptcCwKLQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICBpbnQgKmxlbnApCitzdGF0aWMgdm9pZCBtZGVzY19rZnJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCkKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnBwOworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOwogCi0JZm9yIChwcCA9IG1wLT5wcm9wZXJ0aWVzOyBwcCAhPSAwOyBwcCA9IHBwLT5uZXh0KSB7Ci0JCWlmIChzdHJjYXNlY21wKHBwLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobGVucCkKLQkJCQkqbGVucCA9IHBwLT5sZW5ndGg7Ci0JCQlicmVhazsKLQkJfQorCWtmcmVlKGhwLT5zZWxmX2Jhc2UpOworfQorCitzdGF0aWMgc3RydWN0IG1kZXNjX21lbV9vcHMga21hbGxvY19tZGVzY19tZW1vcHMgPSB7CisJLmFsbG9jID0gbWRlc2Nfa21hbGxvYywKKwkuZnJlZSAgPSBtZGVzY19rZnJlZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19hbGxvYyh1bnNpZ25lZCBpbnQgbWRlc2Nfc2l6ZSwKKwkJCQkJc3RydWN0IG1kZXNjX21lbV9vcHMgKm1vcHMpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtb3BzLT5hbGxvYyhtZGVzY19zaXplKTsKKworCWlmIChocCkKKwkJaHAtPm1vcHMgPSBtb3BzOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19mcmVlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCWhwLT5tb3BzLT5mcmVlKGhwKTsKK30KKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKmN1cl9tZGVzYzsKK3N0YXRpYyBMSVNUX0hFQUQobWRlc2Nfem9tYmllX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtZGVzY19sb2NrKTsKKworc3RydWN0IG1kZXNjX2hhbmRsZSAqbWRlc2NfZ3JhYih2b2lkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWhwID0gY3VyX21kZXNjOworCWlmIChocCkKKwkJYXRvbWljX2luYygmaHAtPnJlZmNudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGhwOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19ncmFiKTsKKwordm9pZCBtZGVzY19yZWxlYXNlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZocC0+cmVmY250KSkgeworCQlsaXN0X2RlbF9pbml0KCZocC0+bGlzdCk7CisJCWhwLT5tb3BzLT5mcmVlKGhwKTsKIAl9Ci0JcmV0dXJuIHBwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0wobWRfZmluZF9wcm9wZXJ0eSk7CitFWFBPUlRfU1lNQk9MKG1kZXNjX3JlbGVhc2UpOwogCi0vKgotICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKLSAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgotICovCi1jb25zdCB2b2lkICptZF9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IG1kZXNjX25vZGUgKm1wLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgIGludCAqbGVucCkKK3ZvaWQgbWRlc2NfdXBkYXRlKHZvaWQpCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcCA9IG1kX2ZpbmRfcHJvcGVydHkobXAsIG5hbWUsIGxlbnApOwotCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2dldF9wcm9wZXJ0eSk7CisJdW5zaWduZWQgbG9uZyBsZW4sIHJlYWxfbGVuLCBzdGF0dXM7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsICpvcmlnX2hwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLXN0cnVjdCBtZGVzY19ub2RlICptZF9maW5kX25vZGVfYnlfbmFtZShzdHJ1Y3QgbWRlc2Nfbm9kZSAqZnJvbSwKLQkJCQkJY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7CisJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKLQltcCA9IGZyb20gPyBmcm9tLT5hbGxub2Rlc19uZXh0IDogYWxsbm9kZXM7Ci0JZm9yICg7IG1wICE9IE5VTEw7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJaWYgKHN0cmNtcChtcC0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gbXA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2ZpbmRfbm9kZV9ieV9uYW1lKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19lYXJseV9hbGxvY2F0ZWQ7Ci0KLXN0YXRpYyB2b2lkICogX19pbml0IG1kZXNjX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICpyZXQ7Ci0KLQlyZXQgPSBfX2FsbG9jX2Jvb3RtZW0oc2l6ZSwgU01QX0NBQ0hFX0JZVEVTLCAwVUwpOwotCWlmIChyZXQgPT0gTlVMTCkgewotCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBzaXplKTsKLQkJcHJvbV9oYWx0KCk7CisJaHAgPSBtZGVzY19hbGxvYyhsZW4sICZrbWFsbG9jX21kZXNjX21lbW9wcyk7CisJaWYgKCFocCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyBhbGxvYyBmYWlsc1xuIik7CisJCXJldHVybjsKIAl9CiAKLQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQotCW1kZXNjX2Vhcmx5X2FsbG9jYXRlZCArPSBzaXplOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgY291bnRfYXJjcyhzdHJ1Y3QgbWRlc2NfZWxlbSAqZXApCi17Ci0JdW5zaWduZWQgaW50IHJldCA9IDA7Ci0KLQllcCsrOwotCXdoaWxlIChlcC0+dGFnICE9IE1EX05PREVfRU5EKSB7Ci0JCWlmIChlcC0+dGFnID09IE1EX1BST1BfQVJDKQotCQkJcmV0Kys7Ci0JCWVwKys7CisJc3RhdHVzID0gc3VuNHZfbWFjaF9kZXNjKF9fcGEoJmhwLT5tZGVzYyksIGxlbiwgJnJlYWxfbGVuKTsKKwlpZiAoc3RhdHVzICE9IEhWX0VPSyB8fCByZWFsX2xlbiA+IGxlbikgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyByZXJlYWQgZmFpbHMgd2l0aCAlbHVcbiIsCisJCSAgICAgICBzdGF0dXMpOworCQlhdG9taWNfZGVjKCZocC0+cmVmY250KTsKKwkJbWRlc2NfZnJlZShocCk7CisJCXJldHVybjsKIAl9Ci0JcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGVzY19sb2NrLCBmbGFncyk7CisJb3JpZ19ocCA9IGN1cl9tZGVzYzsKKwljdXJfbWRlc2MgPSBocDsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvcmlnX2hwLT5yZWZjbnQpKQorCQltZGVzY19mcmVlKG9yaWdfaHApOworCWVsc2UKKwkJbGlzdF9hZGQoJm9yaWdfaHAtPmxpc3QsICZtZGVzY196b21iaWVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWRlc2Nfbm9kZV9hbGxvYyh1NjQgbm9kZSwgc3RydWN0IG1kZXNjX2VsZW0gKmVwLCBjb25zdCBjaGFyICpuYW1lcykKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2FyY3MgPSBjb3VudF9hcmNzKGVwKTsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0KLQltcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqbXApICsKLQkJCSAgICAgICAobnVtX2FyY3MgKiBzaXplb2Yoc3RydWN0IG1kZXNjX2FyYykpKTsKLQltcC0+bmFtZSA9IG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCW1wLT5ub2RlID0gbm9kZTsKLQltcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JbXAtPm51bV9hcmNzID0gbnVtX2FyY3M7Ci0KLQloYXNoX25vZGUobXApOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQorc3RhdGljIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoc3RydWN0IG1kZXNjX2VsZW0gKikgKG1kZXNjICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqbmFtZV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpuYW1lX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbm9kZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5vZGVfc3o7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZGF0YV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpkYXRhX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbmFtZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5hbWVfc3o7CiB9CiAKLS8qIEluIG9yZGVyIHRvIGF2b2lkIHJlY3Vyc2lvbiAodGhlIGdyYXBoIGNhbiBiZSB2ZXJ5IGRlZXApIHdlIHVzZSBhCi0gKiB0d28gcGFzcyBhbGdvcml0aG0uICBGaXJzdCB3ZSBhbGxvY2F0ZSBhbGwgdGhlIG5vZGVzIGFuZCBoYXNoIHRoZW0uCi0gKiBUaGVuIHdlIGl0ZXJhdGUgb3ZlciBlYWNoIG5vZGUsIGZpbGxpbmcgaW4gdGhlIGFyY3MgYW5kIHByb3BlcnRpZXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBidWlsZF9hbGxfbm9kZXMoc3RydWN0IG1kZXNjX2hkciAqbWRlc2MpCit1NjQgbWRlc2Nfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkgICAgICAgdTY0IGZyb21fbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgbWRlc2NfZWxlbSAqc3RhcnQsICplcDsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0JY29uc3QgY2hhciAqbmFtZXM7Ci0Jdm9pZCAqZGF0YTsKLQl1NjQgbGFzdF9ub2RlOworCXN0cnVjdCBtZGVzY19lbGVtICplcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisJY29uc3QgY2hhciAqbmFtZXMgPSBuYW1lX2Jsb2NrKCZocC0+bWRlc2MpOworCXU2NCBsYXN0X25vZGUgPSBocC0+bWRlc2Mubm9kZV9zeiAvIDE2OworCXU2NCByZXQ7CiAKLQlzdGFydCA9IGVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0JbGFzdF9ub2RlID0gbWRlc2MtPm5vZGVfc3ogLyAxNjsKKwlpZiAoZnJvbV9ub2RlID09IE1ERVNDX05PREVfTlVMTCkgeworCQlyZXQgPSBmcm9tX25vZGUgPSAwOworCX0gZWxzZSBpZiAoZnJvbV9ub2RlID49IGxhc3Rfbm9kZSkgeworCQlyZXR1cm4gTURFU0NfTk9ERV9OVUxMOworCX0gZWxzZSB7CisJCXJldCA9IGVwW2Zyb21fbm9kZV0uZC52YWw7CisJfQogCi0JbmFtZXMgPSBuYW1lX2Jsb2NrKG1kZXNjKTsKKwl3aGlsZSAocmV0IDwgbGFzdF9ub2RlKSB7CisJCWlmIChlcFtyZXRdLnRhZyAhPSBNRF9OT0RFKQorCQkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKwkJaWYgKCFzdHJjbXAobmFtZXMgKyBlcFtyZXRdLm5hbWVfb2Zmc2V0LCBuYW1lKSkKKwkJCWJyZWFrOworCQlyZXQgPSBlcFtyZXRdLmQudmFsOworCX0KKwlpZiAocmV0ID49IGxhc3Rfbm9kZSkKKwkJcmV0ID0gTURFU0NfTk9ERV9OVUxMOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25vZGVfYnlfbmFtZSk7CiAKLQl3aGlsZSAoMSkgewotCQl1NjQgbm9kZSA9IGVwIC0gc3RhcnQ7Citjb25zdCB2b2lkICptZGVzY19nZXRfcHJvcGVydHkoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKK3sKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisJdm9pZCAqZGF0YSA9IGRhdGFfYmxvY2soJmhwLT5tZGVzYyk7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwOwogCi0JCWlmIChlcC0+dGFnID09IE1EX0xJU1RfRU5EKQorCWlmIChub2RlID09IE1ERVNDX05PREVfTlVMTCB8fCBub2RlID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwllcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYykgKyBub2RlOworCWVwKys7CisJZm9yICg7IGVwLT50YWcgIT0gTURfTk9ERV9FTkQ7IGVwKyspIHsKKwkJdm9pZCAqdmFsID0gTlVMTDsKKwkJaW50IGxlbiA9IDA7CisKKwkJc3dpdGNoIChlcC0+dGFnKSB7CisJCWNhc2UgTURfUFJPUF9WQUw6CisJCQl2YWwgPSAmZXAtPmQudmFsOworCQkJbGVuID0gODsKIAkJCWJyZWFrOwogCi0JCWlmIChlcC0+dGFnICE9IE1EX05PREUpIHsKLQkJCXByb21fcHJpbnRmKCJNREVTQzogSW5jb25zaXN0ZW50IGVsZW1lbnQgbGlzdC5cbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KKwkJY2FzZSBNRF9QUk9QX1NUUjoKKwkJY2FzZSBNRF9QUk9QX0RBVEE6CisJCQl2YWwgPSBkYXRhICsgZXAtPmQuZGF0YS5kYXRhX29mZnNldDsKKwkJCWxlbiA9IGVwLT5kLmRhdGEuZGF0YV9sZW47CisJCQlicmVhazsKIAotCQltZGVzY19ub2RlX2FsbG9jKG5vZGUsIGVwLCBuYW1lcyk7Ci0KLQkJaWYgKGVwLT5kLnZhbCA+PSBsYXN0X25vZGUpIHsKLQkJCXByaW50aygiTURFU0M6IFdhcm5pbmcsIGVhcmx5IGJyZWFrIG91dCBvZiBub2RlIHNjYW4uXG4iKTsKLQkJCXByaW50aygiTURFU0M6IE5leHQgbm9kZSBbJWx1XSBsYXN0X25vZGUgWyVsdV0uXG4iLAotCQkJICAgICAgIG5vZGUsIGxhc3Rfbm9kZSk7CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQorCQlpZiAoIXZhbCkKKwkJCWNvbnRpbnVlOwogCi0JCWVwID0gc3RhcnQgKyBlcC0+ZC52YWw7Ci0JfQotCi0JZGF0YSA9IGRhdGFfYmxvY2sobWRlc2MpOwotCWZvciAobXAgPSBhbGxub2RlczsgbXA7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gc3RhcnQgKyBtcC0+bm9kZTsKLQkJc3RydWN0IHByb3BlcnR5ICoqbGluayA9ICZtcC0+cHJvcGVydGllczsKLQkJdW5zaWduZWQgaW50IHRoaXNfYXJjID0gMDsKLQotCQllcCsrOwotCQl3aGlsZSAoZXAtPnRhZyAhPSBNRF9OT0RFX0VORCkgewotCQkJc3dpdGNoIChlcC0+dGFnKSB7Ci0JCQljYXNlIE1EX1BST1BfQVJDOiB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKnRhcmdldDsKLQotCQkJCWlmICh0aGlzX2FyYyA+PSBtcC0+bnVtX2FyY3MpIHsKLQkJCQkJcHJvbV9wcmludGYoIk1ERVNDOiBBUkMgb3ZlcnJ1biBbJXU6JXVdXG4iLAotCQkJCQkJICAgIHRoaXNfYXJjLCBtcC0+bnVtX2FyY3MpOwotCQkJCQlwcm9tX2hhbHQoKTsKLQkJCQl9Ci0JCQkJdGFyZ2V0ID0gZmluZF9ub2RlKGVwLT5kLnZhbCk7Ci0JCQkJaWYgKCF0YXJnZXQpIHsKLQkJCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgYXJjIHBvaW50cyB0byAiCi0JCQkJCSAgICAgICAibWlzc2luZyBub2RlLCBpZ25vcmluZy5cbiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbXAtPmFyY3NbdGhpc19hcmNdLm5hbWUgPQotCQkJCQkobmFtZXMgKyBlcC0+bmFtZV9vZmZzZXQpOwotCQkJCW1wLT5hcmNzW3RoaXNfYXJjXS5hcmMgPSB0YXJnZXQ7Ci0JCQkJdGhpc19hcmMrKzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZSBNRF9QUk9QX1ZBTDoKLQkJCWNhc2UgTURfUFJPUF9TVFI6Ci0JCQljYXNlIE1EX1BST1BfREFUQTogewotCQkJCXN0cnVjdCBwcm9wZXJ0eSAqcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqcCkpOwotCi0JCQkJcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JCQkJcC0+bmFtZSA9IChjaGFyICopIG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCQkJCWlmIChlcC0+dGFnID09IE1EX1BST1BfVkFMKSB7Ci0JCQkJCXAtPnZhbHVlID0gJmVwLT5kLnZhbDsKLQkJCQkJcC0+bGVuZ3RoID0gODsKLQkJCQl9IGVsc2UgewotCQkJCQlwLT52YWx1ZSA9IGRhdGEgKyBlcC0+ZC5kYXRhLmRhdGFfb2Zmc2V0OwotCQkJCQlwLT5sZW5ndGggPSBlcC0+ZC5kYXRhLmRhdGFfbGVuOwotCQkJCX0KLQkJCQkqbGluayA9IHA7Ci0JCQkJbGluayA9ICZwLT5uZXh0OwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlIE1EX05PT1A6Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgaWdub3JpbmcgdW5rbm93biB0YWcgdHlwZSAlMDJ4XG4iLAotCQkJCSAgICAgICBlcC0+dGFnKTsKLQkJCX0KLQkJCWVwKys7CisJCWlmICghc3RyY21wKG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0LCBuYW1lKSkgeworCQkJaWYgKGxlbnApCisJCQkJKmxlbnAgPSBsZW47CisJCQlyZXR1cm4gdmFsOwogCQl9CiAJfQotfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBjb3VudF9ub2RlcyhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2NfZ2V0X3Byb3BlcnR5KTsKKwordTY0IG1kZXNjX25leHRfYXJjKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgZnJvbSwgY29uc3QgY2hhciAqYXJjX3R5cGUpCiB7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVuZDsKLQl1bnNpZ25lZCBpbnQgY250ID0gMDsKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CiAKLQllbmQgPSAoKHZvaWQgKillcCkgKyBtZGVzYy0+bm9kZV9zejsKLQl3aGlsZSAoZXAgPCBlbmQpIHsKLQkJaWYgKGVwLT50YWcgPT0gTURfTk9ERSkKLQkJCWNudCsrOwotCQllcCsrOworCWlmIChmcm9tID09IE1ERVNDX05PREVfTlVMTCB8fCBmcm9tID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKworCWVwID0gYmFzZSArIGZyb207CisKKwllcCsrOworCWZvciAoOyBlcC0+dGFnICE9IE1EX05PREVfRU5EOyBlcCsrKSB7CisJCWlmIChlcC0+dGFnICE9IE1EX1BST1BfQVJDKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChuYW1lcyArIGVwLT5uYW1lX29mZnNldCwgYXJjX3R5cGUpKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIGVwIC0gYmFzZTsKIAl9Ci0JcmV0dXJuIGNudDsKKworCXJldHVybiBNREVTQ19OT0RFX05VTEw7CiB9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25leHRfYXJjKTsKKwordTY0IG1kZXNjX2FyY190YXJnZXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBhcmMpCit7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwLCAqYmFzZSA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisKKwllcCA9IGJhc2UgKyBhcmM7CisKKwlyZXR1cm4gZXAtPmQudmFsOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19hcmNfdGFyZ2V0KTsKKworY29uc3QgY2hhciAqbWRlc2Nfbm9kZV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbm9kZSkKK3sKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisKKwlpZiAobm9kZSA9PSBNREVTQ19OT0RFX05VTEwgfHwgbm9kZSA+PSBsYXN0X25vZGUpCisJCXJldHVybiBOVUxMOworCisJZXAgPSBiYXNlICsgbm9kZTsKKwlpZiAoZXAtPnRhZyAhPSBNRF9OT0RFKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBuYW1lcyArIGVwLT5uYW1lX29mZnNldDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2Nfbm9kZV9uYW1lKTsKIAogc3RhdGljIHZvaWQgX19pbml0IHJlcG9ydF9wbGF0Zm9ybV9wcm9wZXJ0aWVzKHZvaWQpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKnBuID0gbWRfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBsYXRmb3JtIik7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtZGVzY19ncmFiKCk7CisJdTY0IHBuID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJwbGF0Zm9ybSIpOwogCWNvbnN0IGNoYXIgKnM7CiAJY29uc3QgdTY0ICp2OwogCi0JaWYgKCFwbikgeworCWlmIChwbiA9PSBNREVTQ19OT0RFX05VTEwpIHsKIAkJcHJvbV9wcmludGYoIk5vIHBsYXRmb3JtIG5vZGUgaW4gbWFjaGluZS1kZXNjcmlwdGlvbi5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlzID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAiYmFubmVyLW5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgImJhbm5lci1uYW1lIiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogYmFubmVyLW5hbWUgWyVzXVxuIiwgcyk7Ci0JcyA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIm5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm5hbWUiLCBOVUxMKTsKIAlwcmludGsoIlBMQVRGT1JNOiBuYW1lIFslc11cbiIsIHMpOwogCi0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgImhvc3RpZCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAiaG9zdGlkIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IGhvc3RpZCBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInNlcmlhbCMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgInNlcmlhbCMiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogc2VyaWFsIyBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInN0aWNrLWZyZXF1ZW5jeSIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAic3RpY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogc3RpY2stZnJlcXVlbmN5IFslMDhseF1cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1hYy1hZGRyZXNzIFslbHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctcmVzb2x1dGlvbiBbJWx1IG1zXVxuIiwgKnYpOwotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJ3YXRjaGRvZy1tYXgtdGltZW91dCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAid2F0Y2hkb2ctbWF4LXRpbWVvdXQiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctbWF4LXRpbWVvdXQgWyVsdSBtc11cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWF4LWNwdXMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1heC1jcHVzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1heC1jcHVzIFslbHVdXG4iLCAqdik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJeworCQlpbnQgbWF4X2NwdSwgaTsKKworCQlpZiAodikgeworCQkJbWF4X2NwdSA9ICp2OworCQkJaWYgKG1heF9jcHUgPiBOUl9DUFVTKQorCQkJCW1heF9jcHUgPSBOUl9DUFVTOworCQl9IGVsc2UgeworCQkJbWF4X2NwdSA9IE5SX0NQVVM7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG1heF9jcHU7IGkrKykKKwkJCWNwdV9zZXQoaSwgY3B1X3Bvc3NpYmxlX21hcCk7CisJfQorI2VuZGlmCisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogc3RhdGljIGludCBpbmxpbmUgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwgaW50IGxlbikKQEAgLTM2OSwxNSArNDYyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBmaWxsX2luX29uZV9jYWNoZShjcHVpbmZvX3NwYXJjICpjLCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXApCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmlsbF9pbl9vbmVfY2FjaGUoY3B1aW5mb19zcGFyYyAqYywKKwkJCQkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkJCXU2NCBtcCkKIHsKLQljb25zdCB1NjQgKmxldmVsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAibGV2ZWwiLCBOVUxMKTsKLQljb25zdCB1NjQgKnNpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJzaXplIiwgTlVMTCk7Ci0JY29uc3QgdTY0ICpsaW5lX3NpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJsaW5lLXNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CisJY29uc3QgdTY0ICpzaXplID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxpbmVfc2l6ZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJsaW5lLXNpemUiLCBOVUxMKTsKIAljb25zdCBjaGFyICp0eXBlOwogCWludCB0eXBlX2xlbjsKIAotCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJnR5cGVfbGVuKTsKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmdHlwZV9sZW4pOwogCiAJc3dpdGNoICgqbGV2ZWwpIHsKIAljYXNlIDE6CkBAIC00MDAsNDggKzQ5NSw0NSBAQAogCX0KIAogCWlmICgqbGV2ZWwgPT0gMSkgewotCQl1bnNpZ25lZCBpbnQgaTsKKwkJdTY0IGE7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKKwkJbWRlc2NfZm9yX2VhY2hfYXJjKGEsIGhwLCBtcCwgTURFU0NfQVJDX1RZUEVfRldEKSB7CisJCQl1NjQgdGFyZ2V0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICpuYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0YXJnZXQpOwogCi0JCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJmd2QiKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFzdHJjbXAodC0+bmFtZSwgImNhY2hlIikpCi0JCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgdCk7CisJCQlpZiAoIXN0cmNtcChuYW1lLCAiY2FjaGUiKSkKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdGFyZ2V0KTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfY29yZV9pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgY29yZV9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX2NvcmVfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBjb3JlX2lkKQogewotCXVuc2lnbmVkIGludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY3B1IikpIHsKLQkJCWlkID0gbWRfZ2V0X3Byb3BlcnR5KHQsICJpZCIsIE5VTEwpOworCQluYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgImNwdSIpKSB7CisJCQlpZCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdCwgImlkIiwgTlVMTCk7CiAJCQlpZiAoKmlkIDwgTlJfQ1BVUykKIAkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQl9IGVsc2UgewotCQkJdW5zaWduZWQgaW50IGo7CisJCQl1NjQgajsKIAotCQkJZm9yIChqID0gMDsgaiA8IHQtPm51bV9hcmNzOyBqKyspIHsKLQkJCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbiA9IHQtPmFyY3Nbal0uYXJjOworCQkJbWRlc2NfZm9yX2VhY2hfYXJjKGosIGhwLCB0LCBNREVTQ19BUkNfVFlQRV9CQUNLKSB7CisJCQkJdTY0IG4gPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBqKTsKKwkJCQljb25zdCBjaGFyICpuX25hbWU7CiAKLQkJCQlpZiAoc3RyY21wKHQtPmFyY3Nbal0ubmFtZSwgImJhY2siKSkKKwkJCQluX25hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIG4pOworCQkJCWlmIChzdHJjbXAobl9uYW1lLCAiY3B1IikpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJaWYgKHN0cmNtcChuLT5uYW1lLCAiY3B1IikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWQgPSBtZF9nZXRfcHJvcGVydHkobiwgImlkIiwgTlVMTCk7CisJCQkJaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG4sICJpZCIsIE5VTEwpOwogCQkJCWlmICgqaWQgPCBOUl9DUFVTKQogCQkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQkJfQpAQCAtNDQ5LDc4ICs1NDEsODEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfY29yZV9pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfY29yZV9pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMTsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsICJjYWNoZSIpIHsKLQkJY29uc3QgdTY0ICpsZXZlbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImxldmVsIiwgTlVMTCk7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgImNhY2hlIikgeworCQljb25zdCB1NjQgKmxldmVsOwogCQljb25zdCBjaGFyICp0eXBlOwogCQlpbnQgbGVuOwogCisJCWxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CiAJCWlmICgqbGV2ZWwgIT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJmxlbik7CisJCXR5cGUgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAidHlwZSIsICZsZW4pOwogCQlpZiAoIWZpbmRfaW5fcHJvcGxpc3QodHlwZSwgImluc3RuIiwgbGVuKSkKIAkJCWNvbnRpbnVlOwogCi0JCW1hcmtfY29yZV9pZHMobXAsIGlkeCk7CisJCW1hcmtfY29yZV9pZHMoaHAsIG1wLCBpZHgpOwogCiAJCWlkeCsrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfcHJvY19pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgcHJvY19pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBwcm9jX2lkKQogewotCWludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCisJCW5hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIHQpOworCQlpZiAoc3RyY21wKG5hbWUsICJjcHUiKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgImNwdSIpKQotCQkJY29udGludWU7Ci0KLQkJaWQgPSBtZF9nZXRfcHJvcGVydHkodCwgImlkIiwgTlVMTCk7CisJCWlkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0LCAiaWQiLCBOVUxMKTsKIAkJaWYgKCppZCA8IE5SX0NQVVMpCiAJCQljcHVfZGF0YSgqaWQpLnByb2NfaWQgPSBwcm9jX2lkOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IF9fc2V0X3Byb2NfaWRzKGNvbnN0IGNoYXIgKmV4ZWNfdW5pdF9uYW1lKQorc3RhdGljIHZvaWQgX19kZXZpbml0IF9fc2V0X3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkJCSAgICAgY29uc3QgY2hhciAqZXhlY191bml0X25hbWUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMDsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsIGV4ZWNfdW5pdF9uYW1lKSB7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgZXhlY191bml0X25hbWUpIHsKIAkJY29uc3QgY2hhciAqdHlwZTsKIAkJaW50IGxlbjsKIAotCQl0eXBlID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAidHlwZSIsICZsZW4pOworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmbGVuKTsKIAkJaWYgKCFmaW5kX2luX3Byb3BsaXN0KHR5cGUsICJpbnQiLCBsZW4pICYmCiAJCSAgICAhZmluZF9pbl9wcm9wbGlzdCh0eXBlLCAiaW50ZWdlciIsIGxlbikpCiAJCQljb250aW51ZTsKIAotCQltYXJrX3Byb2NfaWRzKG1wLCBpZHgpOworCQltYXJrX3Byb2NfaWRzKGhwLCBtcCwgaWR4KTsKIAogCQlpZHgrKzsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfcHJvY19pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfcHJvY19pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0JX19zZXRfcHJvY19pZHMoImV4ZWNfdW5pdCIpOwotCV9fc2V0X3Byb2NfaWRzKCJleGVjLXVuaXQiKTsKKwlfX3NldF9wcm9jX2lkcyhocCwgImV4ZWNfdW5pdCIpOworCV9fc2V0X3Byb2NfaWRzKGhwLCAiZXhlYy11bml0Iik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfb25lX21vbmRvX2JpdHMoY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBpbnQgKm1hc2ssIHVuc2lnbmVkIGNoYXIgZGVmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9vbmVfbW9uZG9fYml0cyhjb25zdCB1NjQgKnAsIHVuc2lnbmVkIGludCAqbWFzaywKKwkJCQkJIHVuc2lnbmVkIGNoYXIgZGVmKQogewogCXU2NCB2YWw7CiAKQEAgLTUzOCwzNSArNjMzLDM3IEBACiAJKm1hc2sgPSAoKDFVIDw8IGRlZikgKiA2NFUpIC0gMVU7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfbW9uZG9fZGF0YShzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsIHN0cnVjdCB0cmFwX3Blcl9jcHUgKnRiKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9tb25kb19kYXRhKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgICBzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YikKIHsKIAljb25zdCB1NjQgKnZhbDsKIAotCXZhbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CisJdmFsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CiAJZ2V0X29uZV9tb25kb19iaXRzKHZhbCwgJnRiLT5jcHVfbW9uZG9fcW1hc2ssIDcpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPmRldl9tb25kb19xbWFzaywgNyk7CiAKLQl2YWwgPSBtZF9nZXRfcHJvcGVydHkobXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOworCXZhbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOwogCWdldF9vbmVfbW9uZG9fYml0cyh2YWwsICZ0Yi0+cmVzdW1fcW1hc2ssIDYpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPm5vbnJlc3VtX3FtYXNrLCAyKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEodm9pZCkKK3ZvaWQgX19kZXZpbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoY3B1bWFza190IG1hc2spCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwID0gbWRlc2NfZ3JhYigpOworCXU2NCBtcDsKIAogCW5jcHVzX3Byb2JlZCA9IDA7Ci0JbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG1wLCAiY3B1IikgewotCQljb25zdCB1NjQgKmlkID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAiaWQiLCBOVUxMKTsKLQkJY29uc3QgdTY0ICpjZnJlcSA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCW1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShocCwgbXAsICJjcHUiKSB7CisJCWNvbnN0IHU2NCAqaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiaWQiLCBOVUxMKTsKKwkJY29uc3QgdTY0ICpjZnJlcSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CiAJCWNwdWluZm9fc3BhcmMgKmM7Ci0JCXVuc2lnbmVkIGludCBpOwogCQlpbnQgY3B1aWQ7CisJCXU2NCBhOwogCiAJCW5jcHVzX3Byb2JlZCsrOwogCkBAIC01NzUsNiArNjcyLDggQEAKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmIChjcHVpZCA+PSBOUl9DUFVTKQogCQkJY29udGludWU7CisJCWlmICghY3B1X2lzc2V0KGNwdWlkLCBtYXNrKSkKKwkJCWNvbnRpbnVlOwogI2Vsc2UKIAkJLyogT24gdW5pcHJvY2Vzc29yIHdlIG9ubHkgd2FudCB0aGUgdmFsdWVzIGZvciB0aGUKIAkJICogcmVhbCBwaHlzaWNhbCBjcHUgdGhlIGtlcm5lbCBib290ZWQgb250bywgaG93ZXZlcgpAQCAtNTg5LDM1ICs2ODgsMzAgQEAKIAkJYy0+Y2xvY2tfdGljayA9ICpjZnJlcTsKIAogCQl0YiA9ICZ0cmFwX2Jsb2NrW2NwdWlkXTsKLQkJZ2V0X21vbmRvX2RhdGEobXAsIHRiKTsKKwkJZ2V0X21vbmRvX2RhdGEoaHAsIG1wLCB0Yik7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKLQkJCXVuc2lnbmVkIGludCBqOworCQltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG1wLCBNREVTQ19BUkNfVFlQRV9GV0QpIHsKKwkJCXU2NCBqLCB0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICp0X25hbWU7CiAKLQkJCWlmIChzdHJjbXAobXAtPmFyY3NbaV0ubmFtZSwgImZ3ZCIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY2FjaGUiKSkgewotCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIHQpOworCQkJdF9uYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJCWlmICghc3RyY21wKHRfbmFtZSwgImNhY2hlIikpIHsKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWZvciAoaiA9IDA7IGogPCB0LT5udW1fYXJjczsgaisrKSB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKm47CisJCQltZGVzY19mb3JfZWFjaF9hcmMoaiwgaHAsIHQsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQkJCXU2NCBuID0gbWRlc2NfYXJjX3RhcmdldChocCwgaik7CisJCQkJY29uc3QgY2hhciAqbl9uYW1lOwogCi0JCQkJbiA9IHQtPmFyY3Nbal0uYXJjOwotCQkJCWlmIChzdHJjbXAodC0+YXJjc1tqXS5uYW1lLCAiZndkIikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKCFzdHJjbXAobi0+bmFtZSwgImNhY2hlIikpCi0JCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIG4pOworCQkJCW5fbmFtZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbik7CisJCQkJaWYgKCFzdHJjbXAobl9uYW1lLCAiY2FjaGUiKSkKKwkJCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgaHAsIG4pOwogCQkJfQogCQl9CiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKICNlbmRpZgogCiAJCWMtPmNvcmVfaWQgPSAwOwpAQCAtNjI4LDQ1ICs3MjIsNDMgQEAKIAlzcGFyYzY0X211bHRpX2NvcmUgPSAxOwogI2VuZGlmCiAKLQlzZXRfY29yZV9pZHMoKTsKLQlzZXRfcHJvY19pZHMoKTsKKwlzZXRfY29yZV9pZHMoaHApOworCXNldF9wcm9jX2lkcyhocCk7CiAKIAlzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogdm9pZCBfX2luaXQgc3VuNHZfbWRlc2NfaW5pdCh2b2lkKQogeworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOwogCXVuc2lnbmVkIGxvbmcgbGVuLCByZWFsX2xlbiwgc3RhdHVzOworCWNwdW1hc2tfdCBtYXNrOwogCiAJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKIAlwcmludGsoIk1ERVNDOiBTaXplIGlzICVsdSBieXRlcy5cbiIsIGxlbik7CiAKLQltYWluX21kZXNjID0gbWRlc2NfZWFybHlfYWxsb2MobGVuKTsKKwlocCA9IG1kZXNjX2FsbG9jKGxlbiwgJmJvb3RtZW1fbWRlc2NfbWVtb3BzKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBsZW4pOworCQlwcm9tX2hhbHQoKTsKKwl9CiAKLQlzdGF0dXMgPSBzdW40dl9tYWNoX2Rlc2MoX19wYShtYWluX21kZXNjKSwgbGVuLCAmcmVhbF9sZW4pOworCXN0YXR1cyA9IHN1bjR2X21hY2hfZGVzYyhfX3BhKCZocC0+bWRlc2MpLCBsZW4sICZyZWFsX2xlbik7CiAJaWYgKHN0YXR1cyAhPSBIVl9FT0sgfHwgcmVhbF9sZW4gPiBsZW4pIHsKIAkJcHJvbV9wcmludGYoInN1bjR2X21hY2hfZGVzYyBmYWlscywgZXJyKCVsdSksICIKIAkJCSAgICAibGVuKCVsdSksIHJlYWxfbGVuKCVsdSlcbiIsCiAJCQkgICAgc3RhdHVzLCBsZW4sIHJlYWxfbGVuKTsKKwkJbWRlc2NfZnJlZShocCk7CiAJCXByb21faGFsdCgpOwogCX0KIAotCWxlbiA9IGNvdW50X25vZGVzKG1haW5fbWRlc2MpOwotCXByaW50aygiTURFU0M6ICVsdSBub2Rlcy5cbiIsIGxlbik7Ci0KLQlsZW4gPSByb3VuZHVwX3Bvd19vZl90d28obGVuKTsKLQotCW1kZXNjX2hhc2ggPSBtZGVzY19lYXJseV9hbGxvYyhsZW4gKiBzaXplb2Yoc3RydWN0IG1kZXNjX25vZGUgKikpOwotCW1kZXNjX2hhc2hfc2l6ZSA9IGxlbjsKLQotCXByaW50aygiTURFU0M6IEhhc2ggc2l6ZSAlbHUgZW50cmllcy5cbiIsIGxlbik7Ci0KLQlidWlsZF9hbGxfbm9kZXMobWFpbl9tZGVzYyk7Ci0KLQlwcmludGsoIk1ERVNDOiBCdWlsdCBncmFwaCB3aXRoICV1IGJ5dGVzIG9mIG1lbW9yeS5cbiIsCi0JICAgICAgIG1kZXNjX2Vhcmx5X2FsbG9jYXRlZCk7CisJY3VyX21kZXNjID0gaHA7CiAKIAlyZXBvcnRfcGxhdGZvcm1fcHJvcGVydGllcygpOwotCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoKTsKKworCWNwdXNfc2V0YWxsKG1hc2spOworCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEobWFzayk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKaW5kZXggNWQ2YWRlYS4uOGRkNDI5NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwpAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogcG93ZXIuYyx2IDEuMTAgMjAwMS8xMi8xMSAwMTo1NzoxNiBkYXZlbSBFeHAgJAotICogcG93ZXIuYzogUG93ZXIgbWFuYWdlbWVudCBkcml2ZXIuCisvKiBwb3dlci5jOiBQb3dlciBtYW5hZ2VtZW50IGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xOSw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Bvd2VyLmg+CiAjaW5jbHVkZSA8YXNtL3NzdGF0ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CkBAIC0yOSwyNCArMjksMjYgQEAKICAqLwogaW50IHNjb25zX3B3cm9mZiA9IDE7IAogCi0jaWZkZWYgQ09ORklHX1BDSQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogc3RhdGljIHZvaWQgX19pb21lbSAqcG93ZXJfcmVnOwogCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocG93ZXJkX3dhaXQpOwogc3RhdGljIGludCBidXR0b25fcHJlc3NlZDsKIAotc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQordm9pZCB3YWtlX3VwX3Bvd2VyZCh2b2lkKQogewogCWlmIChidXR0b25fcHJlc3NlZCA9PSAwKSB7CiAJCWJ1dHRvbl9wcmVzc2VkID0gMTsKIAkJd2FrZV91cCgmcG93ZXJkX3dhaXQpOwogCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXdha2VfdXBfcG93ZXJkKCk7CiAKIAkvKiBGSVhNRTogQ2hlY2sgcmVnaXN0ZXJzIGZvciBzdGF0dXMuLi4gKi8KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiBleHRlcm4gdm9pZCBtYWNoaW5lX2hhbHQodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX2FsdF9wb3dlcl9vZmYodm9pZCk7CkBAIC01NiwxOSArNTgsMTggQEAKIHsKIAlzc3RhdGVfcG93ZXJvZmYoKTsKIAlpZiAoIXNlcmlhbF9jb25zb2xlIHx8IHNjb25zX3B3cm9mZikgewotI2lmZGVmIENPTkZJR19QQ0kKIAkJaWYgKHBvd2VyX3JlZykgewogCQkJLyogQm90aCByZWdpc3RlciBiaXRzIHNlZW0gdG8gaGF2ZSB0aGUKIAkJCSAqIHNhbWUgZWZmZWN0LCBzbyB1bnRpbCBJIGZpZ3VyZSBvdXQKIAkJCSAqIHdoYXQgdGhlIGRpZmZlcmVuY2UgaXMuLi4KIAkJCSAqLwogCQkJd3JpdGVsKEFVWElPX1BDSU9fQ1BXUl9PRkYgfCBBVVhJT19QQ0lPX1NQV1JfT0ZGLCBwb3dlcl9yZWcpOwotCQl9IGVsc2UKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisJCX0gZWxzZSB7CiAJCQlpZiAocG93ZXJvZmZfbWV0aG9kICE9IE5VTEwpIHsKIAkJCQlwb3dlcm9mZl9tZXRob2QoKTsKIAkJCQkvKiBub3QgcmVhY2hlZCAqLwogCQkJfQorCQl9CiAJfQogCW1hY2hpbmVfaGFsdCgpOwogfQpAQCAtNzYsNyArNzcsNiBAQAogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgcG93ZXJkKHZvaWQgKl9fdW51c2VkKQogewogCXN0YXRpYyBjaGFyICplbnZwW10gPSB7ICJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3IvYmluIiwgTlVMTCB9OwpAQCAtODYsNyArODYsNyBAQAogCWRhZW1vbml6ZSgicG93ZXJkIik7CiAKIAlhZGRfd2FpdF9xdWV1ZSgmcG93ZXJkX3dhaXQsICZ3YWl0KTsKLWFnYWluOgorCiAJZm9yICg7OykgewogCQlzZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoYnV0dG9uX3ByZXNzZWQpCkBAIC0xMDAsMTYgKzEwMCwyOCBAQAogCS8qIE9rLCBkb3duIHdlIGdvLi4uICovCiAJYnV0dG9uX3ByZXNzZWQgPSAwOwogCWlmIChrZXJuZWxfZXhlY3ZlKCIvc2Jpbi9zaHV0ZG93biIsIGFyZ3YsIGVudnApIDwgMCkgewotCQlwcmludGsoInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7Ci0JCWFkZF93YWl0X3F1ZXVlKCZwb3dlcmRfd2FpdCwgJndhaXQpOwotCQlnb3RvIGFnYWluOworCQlwcmludGsoS0VSTl9FUlIgInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7CisJCW1hY2hpbmVfcG93ZXJfb2ZmKCk7CiAJfQogCXJldHVybiAwOwogfQogCitpbnQgc3RhcnRfcG93ZXJkKHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGtlcm5lbF90aHJlYWQocG93ZXJkLCBOVUxMLCBDTE9ORV9GUyk7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX0VSUiAicG93ZXI6IEZhaWxlZCB0byBzdGFydCBwb3dlciBkYWVtb24uXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBwb3dlcmQgcnVubmluZy5cbiIpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBfX2luaXQgaGFzX2J1dHRvbl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKLQlpZiAoaXJxID09IFBDSV9JUlFfTk9ORSkKKwlpZiAoaXJxID09IDB4ZmZmZmZmZmYpCiAJCXJldHVybiAwOwogCWlmICghb2ZfZmluZF9wcm9wZXJ0eShkcCwgImJ1dHRvbiIsIE5VTEwpKQogCQlyZXR1cm4gMDsKQEAgLTEzMCwxNyArMTQyLDE0IEBACiAJcG93ZXJvZmZfbWV0aG9kID0gbWFjaGluZV9oYWx0OyAgLyogYWJsZSB0byB1c2UgdGhlIHN0YW5kYXJkIGhhbHQgKi8KIAogCWlmIChoYXNfYnV0dG9uX2ludGVycnVwdChpcnEsIG9wLT5ub2RlKSkgewotCQlpZiAoa2VybmVsX3RocmVhZChwb3dlcmQsIE5VTEwsIENMT05FX0ZTKSA8IDApIHsKLQkJCXByaW50aygiRmFpbGVkIHRvIHN0YXJ0IHBvd2VyIGRhZW1vbi5cbiIpOworCQlpZiAoc3RhcnRfcG93ZXJkKCkgPCAwKQogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHJpbnRrKCJwb3dlcmQgcnVubmluZy5cbiIpOwogCiAJCWlmIChyZXF1ZXN0X2lycShpcnEsCiAJCQkJcG93ZXJfaGFuZGxlciwgMCwgInBvd2VyIiwgTlVMTCkgPCAwKQotCQkJcHJpbnRrKCJwb3dlcjogRXJyb3IsIGNhbm5vdCByZWdpc3RlciBJUlEgaGFuZGxlci5cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJwb3dlcjogQ2Fubm90IHNldHVwIElSUSBoYW5kbGVyLlxuIik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKCJub3QgdXNpbmcgcG93ZXJkLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBOb3QgdXNpbmcgcG93ZXJkLlxuIik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjQsNCArMTczLDMgQEAKIAlvZl9yZWdpc3Rlcl9kcml2ZXIoJnBvd2VyX2RyaXZlciwgJm9mX2J1c190eXBlKTsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBmNWY5N2UyLi45MzU1NzUwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDksNyArNTAsNyBAQAogCiAvKiAjZGVmaW5lIFZFUkJPU0VfU0hPV1JFR1MgKi8KIAotc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZCh2b2lkKQorc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZChpbnQgY3B1KQogewogCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKQogCQlyZXR1cm47CkBAIC01Nyw3ICs1OCw3IEBACiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCi0Jd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgeworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKIAkJdW5zaWduZWQgbG9uZyBwc3RhdGU7CiAKIAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLiAqLwpAQCAtNjgsNyArNjksNyBAQAogCQkJOiAiPSZyIiAocHN0YXRlKQogCQkJOiAiaSIgKFBTVEFURV9JRSkpOwogCi0JCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCWlmICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCQlzdW40dl9jcHVfeWllbGQoKTsKIAogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cy4gKi8KQEAgLTg2LDE1ICs4NywyNSBAQAogLyogVGhlIGlkbGUgbG9vcCBvbiBzcGFyYzY0LiAqLwogdm9pZCBjcHVfaWRsZSh2b2lkKQogeworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKIAlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAogCXdoaWxlKDEpIHsKIAkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygpOwotCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJc3BhcmM2NF95aWVsZCgpOworCisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCisJCQlzcGFyYzY0X3lpZWxkKGNwdSk7CisKIAkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOwogCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKKwkJCWNwdV9wbGF5X2RlYWQoKTsKKyNlbmRpZgorCiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggNjEwMzZiMy4uNWQyMjAzMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTE4MDgsNyArMTgwOCw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwkJY3B1X3NldChjcHVpZCwgY3B1X3Bvc3NpYmxlX21hcCk7CiAjZW5kaWYKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCA3NDkwY2M2Li5hYWZkZTNkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC00NDIsNyArNDQyLDYgQEAKIAkJICAgIkQkIHBhcml0eSB0bDFcdDogJXVcbiIKIAkJICAgIkkkIHBhcml0eSB0bDFcdDogJXVcbiIKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAiQ3B1MEJvZ29cdDogJWx1LiUwMmx1XG4iCiAJCSAgICJDcHUwQ2xrVGNrXHQ6ICUwMTZseFxuIgogI2VuZGlmCiAJCSAgICwKQEAgLTQ1Nyw5ICs0NTYsNyBAQAogCQkgICBkY2FjaGVfcGFyaXR5X3RsMV9vY2N1cnJlZCwKIAkJICAgaWNhY2hlX3Bhcml0eV90bDFfb2NjdXJyZWQKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAsIGNwdV9kYXRhKDApLnVkZWxheV92YWwvKDUwMDAwMC9IWiksCi0JCSAgIChjcHVfZGF0YSgwKS51ZGVsYXlfdmFsLyg1MDAwL0haKSkgJSAxMDAsCi0JCSAgIGNwdV9kYXRhKDApLmNsb2NrX3RpY2sKKwkJICAgLCBjcHVfZGF0YSgwKS5jbG9ja190aWNrCiAjZW5kaWYKIAkJKTsKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwppbmRleCA0MGU0MGY5Li5iNDQ4ZDMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKQEAgLTEsNiArMSw2IEBACiAvKiBzbXAuYzogU3BhcmM2NCBTTVAgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KKyNpbmNsdWRlIDxhc20vaHZ0cmFtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgpAQCAtNDEsMjIgKzQzLDI2IEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KIAogZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwogCiBpbnQgc3BhcmM2NF9tdWx0aV9jb3JlIF9fcmVhZF9tb3N0bHk7CiAKLS8qIFBsZWFzZSBkb24ndCBtYWtlIHRoaXMgc3R1ZmYgaW5pdGRhdGEhISEgIC0tRGF2ZU0gKi8KLXVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7Ci0KK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwotY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OwogY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OworCitFWFBPUlRfU1lNQk9MKGNwdV9wb3NzaWJsZV9tYXApOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9jb3JlX21hcCk7CisKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwotc3RhdGljIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CiAKIHZvaWQgc21wX2luZm8oc3RydWN0IHNlcV9maWxlICptKQogewpAQCAtNzMsMTggKzc5LDE3IEBACiAJCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQogCQlzZXFfcHJpbnRmKG0sCi0JCQkgICAiQ3B1JWRCb2dvXHQ6ICVsdS4lMDJsdVxuIgogCQkJICAgIkNwdSVkQ2xrVGNrXHQ6ICUwMTZseFxuIiwKLQkJCSAgIGksIGNwdV9kYXRhKGkpLnVkZWxheV92YWwgLyAoNTAwMDAwL0haKSwKLQkJCSAgIChjcHVfZGF0YShpKS51ZGVsYXlfdmFsIC8gKDUwMDAvSFopKSAlIDEwMCwKIAkJCSAgIGksIGNwdV9kYXRhKGkpLmNsb2NrX3RpY2spOwogfQogCitzdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CisKIGV4dGVybiB2b2lkIHNldHVwX3NwYXJjNjRfdGltZXIodm9pZCk7CiAKIHN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNhbGxpbl9mbGFnID0gMDsKIAotdm9pZCBfX2luaXQgc21wX2NhbGxpbih2b2lkKQordm9pZCBfX2RldmluaXQgc21wX2NhbGxpbih2b2lkKQogewogCWludCBjcHVpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCkBAIC0xMDIsOCArMTA3LDYgQEAKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWNhbGlicmF0ZV9kZWxheSgpOwotCWNwdV9kYXRhKGNwdWlkKS51ZGVsYXlfdmFsID0gbG9vcHNfcGVyX2ppZmZ5OwogCWNhbGxpbl9mbGFnID0gMTsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWVtYmFyICNTeW5jXG5cdCIKIAkJCSAgICAgImZsdXNoICAlJWc2IiA6IDogOiAibWVtb3J5Iik7CkBAIC0xMjAsNyArMTIzLDkgQEAKIAl3aGlsZSAoIWNwdV9pc3NldChjcHVpZCwgc21wX2NvbW1lbmNlZF9tYXNrKSkKIAkJcm1iKCk7CiAKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CiAJY3B1X3NldChjcHVpZCwgY3B1X29ubGluZV9tYXApOworCXNwaW5fdW5sb2NrKCZjYWxsX2xvY2spOwogCiAJLyogaWRsZSB0aHJlYWQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBwcmVlbXB0IGRpc2FibGVkICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CkBAIC0yNjgsNiArMjczLDY3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXRjX3N5bmNfbG9jaywgZmxhZ3MpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfU1VOX0xET01TKSAmJiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkKKy8qIFhYWCBQdXQgdGhpcyBpbiBzb21lIGNvbW1vbiBwbGFjZS4gWFhYICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBraW1hZ2VfYWRkcl90b19yYSh2b2lkICpwKQoreworCXVuc2lnbmVkIGxvbmcgdmFsID0gKHVuc2lnbmVkIGxvbmcpIHA7CisKKwlyZXR1cm4ga2Vybl9iYXNlICsgKHZhbCAtIEtFUk5CQVNFKTsKK30KKworc3RhdGljIHZvaWQgbGRvbV9zdGFydGNwdV9jcHVpZCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIHRocmVhZF9yZWcpCit7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF90dGFibGVfdGwwOworCWV4dGVybiB1bnNpZ25lZCBsb25nIGtlcm5fbG9ja2VkX3R0ZV9kYXRhOworCWV4dGVybiBpbnQgYmlna2VybmVsOworCXN0cnVjdCBodnRyYW1wX2Rlc2NyICpoZGVzYzsKKwl1bnNpZ25lZCBsb25nIHRyYW1wb2xpbmVfcmE7CisJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CisJdTY0IHR0ZV92YWRkciwgdHRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwloZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpoZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghaGRlc2MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsZG9tX3N0YXJ0Y3B1X2NwdWlkOiBDYW5ub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImh2dHJhbXBfZGVzY3IuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWhkZXNjLT5jcHUgPSBjcHU7CisJaGRlc2MtPm51bV9tYXBwaW5ncyA9IChiaWdrZXJuZWwgPyAyIDogMSk7CisKKwl0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisJdGItPmhkZXNjID0gaGRlc2M7CisKKwloZGVzYy0+ZmF1bHRfaW5mb192YSA9ICh1bnNpZ25lZCBsb25nKSAmdGItPmZhdWx0X2luZm87CisJaGRlc2MtPmZhdWx0X2luZm9fcGEgPSBraW1hZ2VfYWRkcl90b19yYSgmdGItPmZhdWx0X2luZm8pOworCisJaGRlc2MtPnRocmVhZF9yZWcgPSB0aHJlYWRfcmVnOworCisJdHRlX3ZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIEtFUk5CQVNFOworCXR0ZV9kYXRhID0ga2Vybl9sb2NrZWRfdHRlX2RhdGE7CisKKwloZGVzYy0+bWFwc1swXS52YWRkciA9IHR0ZV92YWRkcjsKKwloZGVzYy0+bWFwc1swXS50dGUgICA9IHR0ZV9kYXRhOworCWlmIChiaWdrZXJuZWwpIHsKKwkJdHRlX3ZhZGRyICs9IDB4NDAwMDAwOworCQl0dGVfZGF0YSAgKz0gMHg0MDAwMDA7CisJCWhkZXNjLT5tYXBzWzFdLnZhZGRyID0gdHRlX3ZhZGRyOworCQloZGVzYy0+bWFwc1sxXS50dGUgICA9IHR0ZV9kYXRhOworCX0KKworCXRyYW1wb2xpbmVfcmEgPSBraW1hZ2VfYWRkcl90b19yYShodl9jcHVfc3RhcnR1cCk7CisKKwlodl9lcnIgPSBzdW40dl9jcHVfc3RhcnQoY3B1LCB0cmFtcG9saW5lX3JhLAorCQkJCSBraW1hZ2VfYWRkcl90b19yYSgmc3BhcmM2NF90dGFibGVfdGwwKSwKKwkJCQkgX19wYShoZGVzYykpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiAibGRvbV9zdGFydGNwdV9jcHVpZDogc3VuNHZfY3B1X3N0YXJ0KCkgIgorCQkgICAgICAgImdpdmVzIGVycm9yICVsdVxuIiwgaHZfZXJyKTsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZCBzdW40dl9pbml0X21vbmRvX3F1ZXVlcyhpbnQgdXNlX2Jvb3RtZW0sIGludCBjcHUsIGludCBhbGxvYywgaW50IGxvYWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyYzY0X2NwdV9zdGFydHVwOwpAQCAtMjgwLDYgKzM0Niw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNtcF9ib290X29uZV9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKKwlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CiAJdW5zaWduZWQgbG9uZyBlbnRyeSA9CiAJCSh1bnNpZ25lZCBsb25nKSgmc3BhcmM2NF9jcHVfc3RhcnR1cCk7CiAJdW5zaWduZWQgbG9uZyBjb29raWUgPQpAQCAtMjkwLDIwICszNTcsMjUgQEAKIAlwID0gZm9ya19pZGxlKGNwdSk7CiAJY2FsbGluX2ZsYWcgPSAwOwogCWNwdV9uZXdfdGhyZWFkID0gdGFza190aHJlYWRfaW5mbyhwKTsKLQljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKIAogCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CiAJCS8qIEFsbG9jIHRoZSBtb25kbyBxdWV1ZXMsIGNwdSB3aWxsIGxvYWQgdGhlbS4gICovCiAJCXN1bjR2X2luaXRfbW9uZG9fcXVldWVzKDAsIGNwdSwgMSwgMCk7CiAKLQkJcHJvbV9zdGFydGNwdV9jcHVpZChjcHUsIGVudHJ5LCBjb29raWUpOworI2lmIGRlZmluZWQoQ09ORklHX1NVTl9MRE9NUykgJiYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCisJCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQkJbGRvbV9zdGFydGNwdV9jcHVpZChjcHUsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZykgY3B1X25ld190aHJlYWQpOworCQllbHNlCisjZW5kaWYKKwkJCXByb21fc3RhcnRjcHVfY3B1aWQoY3B1LCBlbnRyeSwgY29va2llKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb2ZfZmluZF9ub2RlX2J5X2NwdWlkKGNwdSk7CiAKIAkJcHJvbV9zdGFydGNwdShkcC0+bm9kZSwgZW50cnksIGNvb2tpZSk7CiAJfQogCi0JZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDUwMDAwMDA7IHRpbWVvdXQrKykgeworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCA1MDAwMDsgdGltZW91dCsrKSB7CiAJCWlmIChjYWxsaW5fZmxhZykKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMTAwKTsKQEAgLTMxMywxMSArMzg1LDE1IEBACiAJCXJldCA9IDA7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKCJQcm9jZXNzb3IgJWQgaXMgc3R1Y2suXG4iLCBjcHUpOwotCQljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbG91dF9tYXApOwogCQlyZXQgPSAtRU5PREVWOwogCX0KIAljcHVfbmV3X3RocmVhZCA9IE5VTEw7CiAKKwlpZiAodGItPmhkZXNjKSB7CisJCWtmcmVlKHRiLT5oZGVzYyk7CisJCXRiLT5oZGVzYyA9IE5VTEw7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzIwLDcgKzc5Niw2IEBACiAJaW50IHdhaXQ7CiB9OwogCi1zdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CiBzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKmNhbGxfZGF0YTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeGNhbGxfY2FsbF9mdW5jdGlvbjsKQEAgLTExNTIsMzQgKzEyMjcsMTQgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi12b2lkIF9faW5pdCBzbXBfdGlja19pbml0KHZvaWQpCi17Ci0JYm9vdF9jcHVfaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLX0KLQogLyogL3Byb2MvcHJvZmlsZSB3cml0ZXMgY2FuIGNhbGwgdGhpcywgZG9uJ3QgX19pbml0IGl0IHBsZWFzZS4gKi8KIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLS8qIENvbnN0cmFpbiB0aGUgbnVtYmVyIG9mIGNwdXMgdG8gbWF4X2NwdXMuICAqLwogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IGk7Ci0KLQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IG1heF9jcHVzKSB7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCQlpZiAoaSAhPSBib290X2NwdV9pZCkgewotCQkJCWNwdV9jbGVhcihpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0JCQkJY3B1X2NsZWFyKGksIGNwdV9wcmVzZW50X21hcCk7Ci0JCQkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPD0gbWF4X2NwdXMpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JY3B1X2RhdGEoYm9vdF9jcHVfaWQpLnVkZWxheV92YWwgPSBsb29wc19wZXJfamlmZnk7CiB9CiAKIHZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCkBAIC0xMTkwLDMwICsxMjQ1LDMyIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkuY29yZV9pZCA9PSAwKSB7CiAJCQljcHVfc2V0KGksIGNwdV9jb3JlX21hcFtpXSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGopIHsKIAkJCWlmIChjcHVfZGF0YShpKS5jb3JlX2lkID09CiAJCQkgICAgY3B1X2RhdGEoaikuY29yZV9pZCkKIAkJCQljcHVfc2V0KGosIGNwdV9jb3JlX21hcFtpXSk7CiAJCX0KIAl9CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfc2libGluZ19tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PSAtMSkgewogCQkJY3B1X3NldChpLCBjcHVfc2libGluZ19tYXBbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaikgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShqKSB7CiAJCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PQogCQkJICAgIGNwdV9kYXRhKGopLnByb2NfaWQpCiAJCQkJY3B1X3NldChqLCBjcHVfc2libGluZ19tYXBbaV0pOwpAQCAtMTI0MiwxOCArMTI5OSwxMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgY3B1X3BsYXlfZGVhZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgYm9nb3N1bSA9IDA7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBsb25nIHBzdGF0ZTsKKworCWlkbGVfdGFza19leGl0KCk7CisKKwlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikgeworCQlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisKKwkJc3VuNHZfY3B1X3Fjb25mKEhWX0NQVV9RVUVVRV9DUFVfTU9ORE8sCisJCQkJdGItPmNwdV9tb25kb19wYSwgMCk7CisJCXN1bjR2X2NwdV9xY29uZihIVl9DUFVfUVVFVUVfREVWSUNFX01PTkRPLAorCQkJCXRiLT5kZXZfbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX1JFU19FUlJPUiwKKwkJCQl0Yi0+cmVzdW1fbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX05PTlJFU19FUlJPUiwKKwkJCQl0Yi0+bm9ucmVzdW1fbW9uZG9fcGEsIDApOworCX0KKworCWNwdV9jbGVhcihjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CisJbWVtYmFyX3NhZmUoIiNTeW5jIik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJyZHByCSUlcHN0YXRlLCAlMFxuXHQiCisJCSJ3cnByCSUwLCAlMSwgJSVwc3RhdGUiCisJCTogIj1yIiAocHN0YXRlKQorCQk6ICJpIiAoUFNUQVRFX0lFKSk7CisKKwl3aGlsZSAoMSkKKwkJYmFycmllcigpOworfQorCitpbnQgX19jcHVfZGlzYWJsZSh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1aW5mb19zcGFyYyAqYzsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKLQkJYm9nb3N1bSArPSBjcHVfZGF0YShpKS51ZGVsYXlfdmFsOwotCXByaW50aygiVG90YWwgb2YgJWxkIHByb2Nlc3NvcnMgYWN0aXZhdGVkICIKLQkgICAgICAgIiglbHUuJTAybHUgQm9nb01JUFMpLlxuIiwKLQkgICAgICAgKGxvbmcpIG51bV9vbmxpbmVfY3B1cygpLAotCSAgICAgICBib2dvc3VtLyg1MDAwMDAvSFopLAotCSAgICAgICAoYm9nb3N1bS8oNTAwMC9IWikpJTEwMCk7CisJZm9yX2VhY2hfY3B1X21hc2soaSwgY3B1X2NvcmVfbWFwW2NwdV0pCisJCWNwdV9jbGVhcihjcHUsIGNwdV9jb3JlX21hcFtpXSk7CisJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbY3B1XSk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBjcHVfc2libGluZ19tYXBbY3B1XSkKKwkJY3B1X2NsZWFyKGNwdSwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKKwljcHVzX2NsZWFyKGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKKworCWMgPSAmY3B1X2RhdGEoY3B1KTsKKworCWMtPmNvcmVfaWQgPSAwOworCWMtPnByb2NfaWQgPSAtMTsKKworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CisKKwlzbXBfd21iKCk7CisKKwkvKiBNYWtlIHN1cmUgbm8gaW50ZXJydXB0cyBwb2ludCB0byB0aGlzIGNwdS4gICovCisJZml4dXBfaXJxcygpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCW1kZWxheSgxKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJc21wX3JtYigpOworCQlpZiAoIWNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfQorCWlmIChjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ1BVICV1IGRpZG4ndCBkaWUuLi5cbiIsIGNwdSk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5fTERPTVMpCisJCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCQlpbnQgbGltaXQgPSAxMDA7CisKKwkJZG8geworCQkJaHZfZXJyID0gc3VuNHZfY3B1X3N0b3AoY3B1KTsKKwkJCWlmIChodl9lcnIgPT0gSFZfRU9LKSB7CisJCQkJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoLS1saW1pdCA+IDApOworCQlpZiAobGltaXQgPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzdW40dl9jcHVfc3RvcCgpIGZhaWxzIGVycj0lbHVcbiIsCisJCQkgICAgICAgaHZfZXJyKTsKKwkJfQorI2VuZGlmCisJfQorfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQorewogfQogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKaW5kZXggNmZhNzYxNi4uNzE5ZDY3NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKQEAgLTEsNyArMSw2IEBACi0vKiAkSWQ6IHNwYXJjNjRfa3N5bXMuYyx2IDEuMTIxIDIwMDIvMDIvMDkgMTk6NDk6MzEgZGF2ZW0gRXhwICQKLSAqIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jOiBTcGFyYzY0IHNwZWNpZmljIGtzeW1zIHN1cHBvcnQuCisvKiBhcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYzogU3BhcmM2NCBzcGVjaWZpYyBrc3ltcyBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk2IEVkZGllIEMuIERvc3QgKGVjZEBza3luZXQuYmUpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opCiAgKi8KQEAgLTI4LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxuZXQvY29tcGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTEyNCwxMCArMTIyLDYgQEAKIEVYUE9SVF9TWU1CT0woX193cml0ZV91bmxvY2spOwogRVhQT1JUX1NZTUJPTChfX3dyaXRlX3RyeWxvY2spOwogCi0vKiBDUFUgb25saW5lIG1hcCBhbmQgYWN0aXZlIGNvdW50LiAgKi8KLUVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwotRVhQT1JUX1NZTUJPTChwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0KIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzMwLDEyICszMjQsNiBAQAogRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKIEVYUE9SVF9TWU1CT0woc3RybmNtcCk7CiAKLS8qIERlbGF5IHJvdXRpbmVzLiAqLwotRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7Ci1FWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKLUVYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwotRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKLQogdm9pZCBWSVNlbnRlcih2b2lkKTsKIC8qIFJBSUQgY29kZSBuZWVkcyB0aGlzICovCiBFWFBPUlRfU1lNQk9MKFZJU2VudGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYwppbmRleCBjZGIxNDc3Li41MjgxNmM3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2ZzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNmcy5jCkBAIC0xOTMsNyArMTkzLDYgQEAKIH0KIAogU0hPV19DUFVEQVRBX1VMT05HX05BTUUoY2xvY2tfdGljaywgY2xvY2tfdGljayk7Ci1TSE9XX0NQVURBVEFfVUxPTkdfTkFNRSh1ZGVsYXlfdmFsLCB1ZGVsYXlfdmFsKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX3NpemUsIGRjYWNoZV9zaXplKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX2xpbmVfc2l6ZSwgZGNhY2hlX2xpbmVfc2l6ZSk7CiBTSE9XX0NQVURBVEFfVUlOVF9OQU1FKGwxX2ljYWNoZV9zaXplLCBpY2FjaGVfc2l6ZSk7CkBAIC0yMDMsNyArMjAyLDYgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGNwdV9jb3JlX2F0dHJzW10gPSB7CiAJX1NZU0RFVl9BVFRSKGNsb2NrX3RpY2ssICAgICAgICAgIDA0NDQsIHNob3dfY2xvY2tfdGljaywgTlVMTCksCi0JX1NZU0RFVl9BVFRSKHVkZWxheV92YWwsICAgICAgICAgIDA0NDQsIHNob3dfdWRlbGF5X3ZhbCwgTlVMTCksCiAJX1NZU0RFVl9BVFRSKGwxX2RjYWNoZV9zaXplLCAgICAgIDA0NDQsIHNob3dfbDFfZGNhY2hlX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9kY2FjaGVfbGluZV9zaXplLCAwNDQ0LCBzaG93X2wxX2RjYWNoZV9saW5lX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9pY2FjaGVfc2l6ZSwgICAgICAwNDQ0LCBzaG93X2wxX2ljYWNoZV9zaXplLCBOVUxMKSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggYTMxYTA0My4uNjJlMzE2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKQEAgLTg0OSw5ICs4NDksNiBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJdW5zaWduZWQgbG9uZyBjbG9jazsKLSNpZmRlZiBDT05GSUdfU01QCi0JZXh0ZXJuIHZvaWQgc21wX3RpY2tfaW5pdCh2b2lkKTsKLSNlbmRpZgogCiAJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewpAQCAtODc0LDEwICs4NzEsNiBAQAogCQljbG9jayA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInN0aWNrLWZyZXF1ZW5jeSIsIDApOwogCX0KIAotI2lmZGVmIENPTkZJR19TTVAKLQlzbXBfdGlja19pbml0KCk7Ci0jZW5kaWYKLQogCXJldHVybiBjbG9jazsKIH0KIApAQCAtMTAzOCwxMCArMTAzMSwzMSBAQAogCXNwYXJjNjRfY2xvY2tldmVudC5tdWx0ID0gbXVsdDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgdGJfdGlja3NfcGVyX3VzZWMgX19yZWFkX21vc3RseTsKKwordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKKworCWJjbG9jayA9IHRpY2tfb3BzLT5nZXRfdGljaygpOworCWRvIHsKKwkJbm93ID0gdGlja19vcHMtPmdldF90aWNrKCk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwlfX2RlbGF5KHRiX3RpY2tzX3Blcl91c2VjICogdXNlY3MpOworfQorRVhQT1JUX1NZTUJPTCh1ZGVsYXkpOworCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNsb2NrID0gc3BhcmM2NF9pbml0X3RpbWVycygpOwogCisJdGJfdGlja3NfcGVyX3VzZWMgPSBjbG9jayAvIFVTRUNfUEVSX1NFQzsKKwogCXRpbWVyX3RpY2tzX3Blcl9uc2VjX3F1b3RpZW50ID0KIAkJY2xvY2tzb3VyY2VfaHoybXVsdChjbG9jaywgU1BBUkM2NF9OU0VDX1BFUl9DWUNfU0hJRlQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggMDBhOWUzMi4uNmVmMmQyOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMjIyNSw2ICsyMjI1LDcgQEAKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIDAsIDI1NSwgU0lHU0VHVik7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImZsdXNodyIpOwogCV9fc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWlmIChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikgewogCQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikKIAkJCShyZWdzLT51X3JlZ3NbVVJFR19GUF0gKyBTVEFDS19CSUFTKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTY5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiB2aW8uYzogVmlydHVhbCBJL08gY2hhbm5lbCBkZXZpY2VzIHByb2JpbmcgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgSUJNIENvcnAuCisgKiAgICAgRGF2ZSBFbmdlYnJldHNlbiBlbmdlYnJldEB1cy5pYm0uY29tCisgKiAgICAgU2FudGlhZ28gTGVvbiBzYW50aWxAdXMuaWJtLmNvbQorICogICAgIEhvbGxpcyBCbGFuY2hhcmQgPGhvbGxpc2JAdXMuaWJtLmNvbT4KKyAqICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKgorICogQWRhcHRlZCB0byBzcGFyYzY0IGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwKKwkJCQkgICBpbnQgbGVuKQoreworCXdoaWxlIChsZW4gPiAwKSB7CisJCWludCBsOworCisJCWlmICghc3RyY21wKGxpc3QsIG1hdGNoKSkKKwkJCXJldHVybiAxOworCQlsID0gc3RybGVuKGxpc3QpICsgMTsKKwkJbGlzdCArPSBsOworCQlsZW4gLT0gbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqdmlvX21hdGNoX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqbWF0Y2hlcywKKwljb25zdCBzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCWNvbnN0IGNoYXIgKnR5cGUsICpjb21wYXQ7CisJaW50IGxlbjsKKworCXR5cGUgPSBkZXYtPnR5cGU7CisJY29tcGF0ID0gZGV2LT5jb21wYXQ7CisJbGVuID0gZGV2LT5jb21wYXRfbGVuOworCisJd2hpbGUgKG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCWludCBtYXRjaCA9IDE7CisJCWlmIChtYXRjaGVzLT50eXBlWzBdKQorCQkJbWF0Y2ggJj0gIXN0cmNtcChtYXRjaGVzLT50eXBlLCB0eXBlKTsKKworCQlpZiAobWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCQltYXRjaCAmPSBsZW4gJiYKKwkJCQlmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgbWF0Y2hlcy0+Y29tcGF0LCBsZW4pOworCQl9CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBtYXRjaGVzOworCQltYXRjaGVzKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHZpb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9fZGV2ID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCB2aW9fZHJpdmVyICp2aW9fZHJ2ID0gdG9fdmlvX2RyaXZlcihkcnYpOworCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICptYXRjaGVzID0gdmlvX2Rydi0+aWRfdGFibGU7CisKKwlpZiAoIW1hdGNoZXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZpb19tYXRjaF9kZXZpY2UobWF0Y2hlcywgdmlvX2RldikgIT0gTlVMTDsKK30KKworc3RhdGljIGludCB2aW9fZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwlpZiAoZHJ2LT5wcm9iZSkgeworCQlpZCA9IHZpb19tYXRjaF9kZXZpY2UoZHJ2LT5pZF90YWJsZSwgdmRldik7CisJCWlmIChpZCkKKwkJCWVycm9yID0gZHJ2LT5wcm9iZSh2ZGV2LCBpZCk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHZpb19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpCisJCXJldHVybiBkcnYtPnJlbW92ZSh2ZGV2KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBkZXZzcGVjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2RldihkZXYpOworCWNvbnN0IGNoYXIgKnN0ciA9ICJub25lIjsKKworCWlmICghc3RyY21wKHZkZXYtPnR5cGUsICJuZXR3b3JrIikpCisJCXN0ciA9ICJ2bmV0IjsKKwllbHNlIGlmICghc3RyY21wKHZkZXYtPnR5cGUsICJibG9jayIpKQorCQlzdHIgPSAidmRpc2siOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHR5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHZkZXYtPnR5cGUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdmlvX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhkZXZzcGVjKSwKKwlfX0FUVFJfUk8odHlwZSksCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgdmlvX2J1c190eXBlID0geworCS5uYW1lCQk9ICJ2aW8iLAorCS5kZXZfYXR0cnMJPSB2aW9fZGV2X2F0dHJzLAorCS5tYXRjaAkJPSB2aW9fYnVzX21hdGNoLAorCS5wcm9iZQkJPSB2aW9fZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gdmlvX2RldmljZV9yZW1vdmUsCit9OworCitpbnQgdmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCXZpb2Rydi0+ZHJpdmVyLmJ1cyA9ICZ2aW9fYnVzX3R5cGU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIHZpb191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb191bnJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2aW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKHRvX3Zpb19kZXYoZGV2KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3BjaW9icHBhdGhfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlkcCA9IHZkZXYtPmRwOworCisJcmV0dXJuIHNucHJpbnRmIChidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkcC0+ZnVsbF9uYW1lKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG9icHBhdGgsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKKwkJICAgc2hvd19wY2lvYnBwYXRoX2F0dHIsIE5VTEwpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKmNkZXZfbm9kZTsKKworc3RhdGljIHN0cnVjdCB2aW9fZGV2ICpyb290X3ZkZXY7CitzdGF0aWMgdTY0IGNkZXZfY2ZnX2hhbmRsZTsKKworc3RhdGljIHZvaWQgdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICBzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwl1NjQgYTsKKworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQljb25zdCB1NjQgKmNoYW5faWQ7CisJCWNvbnN0IHU2NCAqaXJxOworCQl1NjQgdGFyZ2V0OworCisJCXRhcmdldCA9IG1kZXNjX2FyY190YXJnZXQoaHAsIGEpOworCisJCWlycSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdGFyZ2V0LCAidHgtaW5vIiwgTlVMTCk7CisJCWlmIChpcnEpCisJCQl2ZGV2LT50eF9pcnEgPSBzdW40dl9idWlsZF92aXJxKGNkZXZfY2ZnX2hhbmRsZSwgKmlycSk7CisKKwkJaXJxID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJyeC1pbm8iLCBOVUxMKTsKKwkJaWYgKGlycSkKKwkJCXZkZXYtPnJ4X2lycSA9IHN1bjR2X2J1aWxkX3ZpcnEoY2Rldl9jZmdfaGFuZGxlLCAqaXJxKTsKKworCQljaGFuX2lkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJpZCIsIE5VTEwpOworCQlpZiAoY2hhbl9pZCkKKwkJCXZkZXYtPmNoYW5uZWxfaWQgPSAqY2hhbl9pZDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldiAqdmlvX2NyZWF0ZV9vbmUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBtcCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJY29uc3QgY2hhciAqdHlwZSwgKmNvbXBhdDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworCWludCBlcnIsIHRsZW4sIGNsZW47CisKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRldmljZS10eXBlIiwgJnRsZW4pOworCWlmICghdHlwZSkgeworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgIm5hbWUiLCAmdGxlbik7CisJCWlmICghdHlwZSkgeworCQkJdHlwZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbXApOworCQkJdGxlbiA9IHN0cmxlbih0eXBlKSArIDE7CisJCX0KKwl9CisJaWYgKHRsZW4gPiBWSU9fTUFYX1RZUEVfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBUeXBlIHN0cmluZyBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljb21wYXQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiZGV2aWNlLXR5cGUiLCAmY2xlbik7CisJaWYgKCFjb21wYXQpIHsKKwkJY2xlbiA9IDA7CisJfSBlbHNlIGlmIChjbGVuID4gVklPX01BWF9DT01QQVRfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb21wYXQgbGVuICVkIGZvciBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIGNsZW4sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl2ZGV2ID0ga3phbGxvYyhzaXplb2YoKnZkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCBhbGxvY2F0ZSB2aW9fZGV2XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdmRldi0+bXAgPSBtcDsKKwltZW1jcHkodmRldi0+dHlwZSwgdHlwZSwgdGxlbik7CisJaWYgKGNvbXBhdCkKKwkJbWVtY3B5KHZkZXYtPmNvbXBhdCwgY29tcGF0LCBjbGVuKTsKKwllbHNlCisJCW1lbXNldCh2ZGV2LT5jb21wYXQsIDAsIHNpemVvZih2ZGV2LT5jb21wYXQpKTsKKwl2ZGV2LT5jb21wYXRfbGVuID0gY2xlbjsKKworCXZkZXYtPmNoYW5uZWxfaWQgPSB+MFVMOworCXZkZXYtPnR4X2lycSA9IH4wOworCXZkZXYtPnJ4X2lycSA9IH4wOworCisJdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKGhwLCBtcCwgdmRldik7CisKKwlzbnByaW50Zih2ZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVseCIsIG1wKTsKKwl2ZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OworCXZkZXYtPmRldi5idXMgPSAmdmlvX2J1c190eXBlOworCXZkZXYtPmRldi5yZWxlYXNlID0gdmlvX2Rldl9yZWxlYXNlOworCisJaWYgKHBhcmVudCA9PSBOVUxMKSB7CisJCWRwID0gY2Rldl9ub2RlOworCX0gZWxzZSBpZiAodG9fdmlvX2RldihwYXJlbnQpID09IHJvb3RfdmRldikgeworCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgTlVMTCk7CisJCXdoaWxlIChkcCkgeworCQkJaWYgKCFzdHJjbXAoZHAtPnR5cGUsIHR5cGUpKQorCQkJCWJyZWFrOworCisJCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgZHApOworCQl9CisJfSBlbHNlIHsKKwkJZHAgPSB0b192aW9fZGV2KHBhcmVudCktPmRwOworCX0KKwl2ZGV2LT5kcCA9IGRwOworCisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UgJXMsIGVycj0lZFxuIiwKKwkJICAgICAgIHZkZXYtPmRldi5idXNfaWQsIGVycik7CisJCWtmcmVlKHZkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHZkZXYtPmRwKQorCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LmtvYmosCisJCQkJCSZkZXZfYXR0cl9vYnBwYXRoLmF0dHIpOworCisJcmV0dXJuIHZkZXY7Cit9CisKK3N0YXRpYyB2b2lkIHdhbGtfdHJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG4sIHN0cnVjdCB2aW9fZGV2ICpwYXJlbnQpCit7CisJdTY0IGE7CisKKwltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG4sIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwkJdTY0IHRhcmdldDsKKworCQl0YXJnZXQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCB0YXJnZXQsICZwYXJlbnQtPmRldik7CisJCWlmICh2ZGV2KQorCQkJd2Fsa190cmVlKGhwLCB0YXJnZXQsIHZkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2RldmljZXMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCByb290KQoreworCXU2NCBtcDsKKworCXJvb3RfdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCByb290LCBOVUxMKTsKKwlpZiAoIXJvb3RfdmRldikgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ291bHQgbm90IGNyZWF0ZSByb290IGRldmljZS5cbiIpOworCQlyZXR1cm47CisJfQorCisJd2Fsa190cmVlKGhwLCByb290LCByb290X3ZkZXYpOworCisJLyogRG9tYWluIHNlcnZpY2VzIGlzIG9kZCBhcyBpdCBkb2Vzbid0IHNpdCB1bmRlcm5lYXRoIHRoZQorCSAqIGNoYW5uZWwtZGV2aWNlcyBub2RlLCBzbyB3ZSBwbHVnIGl0IGluIG1hbnVhbGx5LgorCSAqLworCW1wID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJkb21haW4tc2VydmljZXMiKTsKKwlpZiAobXAgIT0gTURFU0NfTk9ERV9OVUxMKSB7CisJCXN0cnVjdCB2aW9fZGV2ICpwYXJlbnQgPSB2aW9fY3JlYXRlX29uZShocCwgbXAsCisJCQkJCQkJJnJvb3RfdmRldi0+ZGV2KTsKKworCQlpZiAocGFyZW50KQorCQkJd2Fsa190cmVlKGhwLCBtcCwgcGFyZW50KTsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKmNoYW5uZWxfZGV2aWNlc19ub2RlID0gImNoYW5uZWwtZGV2aWNlcyI7Citjb25zdCBjaGFyICpjaGFubmVsX2RldmljZXNfY29tcGF0ID0gIlNVTlcsc3VuNHYtY2hhbm5lbC1kZXZpY2VzIjsKK2NvbnN0IGNoYXIgKmNmZ19oYW5kbGVfcHJvcCA9ICJjZmctaGFuZGxlIjsKKworc3RhdGljIGludCBfX2luaXQgdmlvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwljb25zdCBjaGFyICpjb21wYXQ7CisJY29uc3QgdTY0ICpjZmdfaGFuZGxlOworCWludCBlcnIsIGxlbjsKKwl1NjQgcm9vdDsKKworCWVyciA9IGJ1c19yZWdpc3RlcigmdmlvX2J1c190eXBlKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb3VsZCBub3QgcmVnaXN0ZXIgYnVzIHR5cGUgZXJyPSVkXG4iLAorCQkgICAgICAgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gMDsKKworCXJvb3QgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgY2hhbm5lbF9kZXZpY2VzX25vZGUpOworCWlmIChyb290ID09IE1ERVNDX05PREVfTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBNREVTQyBub2RlLlxuIik7CisJCW1kZXNjX3JlbGVhc2UoaHApOworCQlyZXR1cm4gMDsKKwl9CisKKwljZGV2X25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY2hhbm5lbC1kZXZpY2VzIik7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWNkZXZfbm9kZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBPQlAgbm9kZS5cbiIpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWNvbXBhdCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgImNvbXBhdGlibGUiLCAmbGVuKTsKKwlpZiAoIWNvbXBhdCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIGxhY2tzIGNvbXBhdGlibGUgIgorCQkgICAgICAgInByb3BlcnR5XG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJaWYgKCFmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCwgbGVuKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIG5vZGUgbGFja3MgKCVzKSAiCisJCSAgICAgICAiY29tcGF0IGVudHJ5LlxuIiwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2ZnX2hhbmRsZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgY2ZnX2hhbmRsZV9wcm9wLCBOVUxMKTsKKwlpZiAoIWNmZ19oYW5kbGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENoYW5uZWwgZGV2aWNlcyBsYWNrcyAlcyBwcm9wZXJ0eVxuIiwKKwkJICAgICAgIGNmZ19oYW5kbGVfcHJvcCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2Rldl9jZmdfaGFuZGxlID0gKmNmZ19oYW5kbGU7CisKKwljcmVhdGVfZGV2aWNlcyhocCwgcm9vdCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitvdXRfcmVsZWFzZToKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitwb3N0Y29yZV9pbml0Y2FsbCh2aW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2MTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvaHMuYwpAQCAtMCwwICsxLDc5MiBAQAorLyogdmlvaHMuYzogTERPTSBWaXJ0dWFsIEkvTyBoYW5kc2hha2UgaGVscGVyIGxheWVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorCitpbnQgdmlvX2xkY19zZW5kKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKHZpby0+bHAsIGRhdGEsIGxlbik7CisJCWlmICghZXJyIHx8IChlcnIgIT0gLUVBR0FJTikpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfc2VuZCk7CisKK3N0YXRpYyBpbnQgc2VuZF9jdHJsKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCSAgICAgc3RydWN0IHZpb19tc2dfdGFnICp0YWcsIGludCBsZW4pCit7CisJdGFnLT5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKwlyZXR1cm4gdmlvX2xkY19zZW5kKHZpbywgdGFnLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBpbml0X3RhZyhzdHJ1Y3QgdmlvX21zZ190YWcgKnRhZywgdTggdHlwZSwgdTggc3R5cGUsIHUxNiBzdHlwZV9lbnYpCit7CisJdGFnLT50eXBlID0gdHlwZTsKKwl0YWctPnN0eXBlID0gc3R5cGU7CisJdGFnLT5zdHlwZV9lbnYgPSBzdHlwZV9lbnY7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHUxNiBtYWpvciwgdTE2IG1pbm9yKQoreworCXN0cnVjdCB2aW9fdmVyX2luZm8gcGt0OworCisJdmlvLT5fbG9jYWxfc2lkID0gKHUzMikgc2NoZWRfY2xvY2soKTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJaW5pdF90YWcoJnBrdC50YWcsIFZJT19UWVBFX0NUUkwsIFZJT19TVUJUWVBFX0lORk8sIFZJT19WRVJfSU5GTyk7CisJcGt0Lm1ham9yID0gbWFqb3I7CisJcGt0Lm1pbm9yID0gbWlub3I7CisJcGt0LmRldl9jbGFzcyA9IHZpby0+ZGV2X2NsYXNzOworCisJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgbWFqb3IsIG1pbm9yLCB2aW8tPmRldl9jbGFzcyk7CisKKwlyZXR1cm4gc2VuZF9jdHJsKHZpbywgJnBrdC50YWcsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCBzdGFydF9oYW5kc2hha2Uoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlpbnQgZXJyOworCisJdmlvZGJnKEhTLCAiU1RBUlQgSEFORFNIQUtFXG4iKTsKKworCXZpby0+aHNfc3RhdGUgPSBWSU9fSFNfSU5WQUxJRDsKKworCWVyciA9IHNlbmRfdmVyc2lvbih2aW8sCisJCQkgICB2aW8tPnZlcl90YWJsZVswXS5tYWpvciwKKwkJCSAgIHZpby0+dmVyX3RhYmxlWzBdLm1pbm9yKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCit2b2lkIHZpb19saW5rX3N0YXRlX2NoYW5nZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBpbnQgZXZlbnQpCit7CisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisKKwkJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCQljYXNlIFZERVZfTkVUV09SSzoKKwkJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCQkJdmlvLT5kcl9zdGF0ZSA9IChWSU9fRFJfU1RBVEVfVFhSRVEgfAorCQkJCQkgVklPX0RSX1NUQVRFX1JYUkVRKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkRFVl9ESVNLOgorCQkJdmlvLT5kcl9zdGF0ZSA9IFZJT19EUl9TVEFURV9UWFJFUTsKKwkJCWJyZWFrOworCQljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCQl2aW8tPmRyX3N0YXRlID0gVklPX0RSX1NUQVRFX1JYUkVROworCQkJYnJlYWs7CisJCX0KKwkJc3RhcnRfaGFuZHNoYWtlKHZpbyk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2aW9fbGlua19zdGF0ZV9jaGFuZ2UpOworCitzdGF0aWMgaW50IGhhbmRzaGFrZV9mYWlsdXJlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwkvKiBYWFggUHV0IHBvbGljeSBoZXJlLi4uICBQZXJoYXBzIHN0YXJ0IGEgdGltZXIgdG8gZmlyZQorCSAqIFhYWCBpbiAxMDAgbXMsIHdoaWNoIHdpbGwgYnJpbmcgdGhlIGxpbmsgdXAgYW5kIHJldHJ5CisJICogWFhYIHRoZSBoYW5kc2hha2UuCisJICovCisKKwl2aW9kYmcoSFMsICJIQU5EU0hBS0UgRkFJTFVSRVxuIik7CisKKwl2aW8tPmRyX3N0YXRlICY9IH4oVklPX0RSX1NUQVRFX1RYUkVHIHwKKwkJCSAgIFZJT19EUl9TVEFURV9SWFJFRyk7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19JTlZBTElEOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdW5rbm93bihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICpwa3QgPSBhcmc7CisKKwl2aW9kYmcoSFMsICJVTktOT1dOIENPTlRST0wgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCSAgICAgICBwa3QtPnR5cGUsIHBrdC0+c3R5cGUsIHBrdC0+c3R5cGVfZW52LCBwa3QtPnNpZCk7CisKKwlwcmludGsoS0VSTl9FUlIgInZpbzogSURbJWx1XSBSZXNldHRpbmcgY29ubmVjdGlvbi5cbiIsCisJICAgICAgIHZpby0+dmRldi0+Y2hhbm5lbF9pZCk7CisKKwlsZGNfZGlzY29ubmVjdCh2aW8tPmxwKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCBzZW5kX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXVuaW9uIHsKKwkJc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciBwa3Q7CisJCWNoYXIgYWxsW3NpemVvZihzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyKSArCisJCQkgKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKgorCQkJICBkci0+bmNvb2tpZXMpXTsKKwl9IHU7CisJaW50IGk7CisKKwltZW1zZXQoJnUsIDAsIHNpemVvZih1KSk7CisJaW5pdF90YWcoJnUucGt0LnRhZywgVklPX1RZUEVfQ1RSTCwgVklPX1NVQlRZUEVfSU5GTywgVklPX0RSSU5HX1JFRyk7CisJdS5wa3QuZHJpbmdfaWRlbnQgPSAwOworCXUucGt0Lm51bV9kZXNjciA9IGRyLT5udW1fZW50cmllczsKKwl1LnBrdC5kZXNjcl9zaXplID0gZHItPmVudHJ5X3NpemU7CisJdS5wa3Qub3B0aW9ucyA9IFZJT19UWF9EUklORzsKKwl1LnBrdC5udW1fY29va2llcyA9IGRyLT5uY29va2llczsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIElORk8gbmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdICIKKwkgICAgICAgIm5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgdS5wa3QubnVtX2Rlc2NyLCB1LnBrdC5kZXNjcl9zaXplLCB1LnBrdC5vcHRpb25zLAorCSAgICAgICB1LnBrdC5udW1fY29va2llcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHItPm5jb29raWVzOyBpKyspIHsKKwkJdS5wa3QuY29va2llc1tpXSA9IGRyLT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdS5wa3QuY29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHUucGt0LmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXJldHVybiBzZW5kX2N0cmwodmlvLCAmdS5wa3QudGFnLCBzaXplb2YodSkpOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19yZHggcGt0OworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKworCWluaXRfdGFnKCZwa3QudGFnLCBWSU9fVFlQRV9DVFJMLCBWSU9fU1VCVFlQRV9JTkZPLCBWSU9fUkRYKTsKKworCXZpb2RiZyhIUywgIlNFTkQgUkRYIElORk9cbiIpOworCisJcmV0dXJuIHNlbmRfY3RybCh2aW8sICZwa3QudGFnLCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJcmV0dXJuIHZpby0+b3BzLT5zZW5kX2F0dHIodmlvKTsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fdmVyc2lvbiAqZmluZF9ieV9tYWpvcihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJCQkgdTE2IG1ham9yKQoreworCXN0cnVjdCB2aW9fdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2aW8tPnZlcl90YWJsZV9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IHZpb192ZXJzaW9uICp2ID0gJnZpby0+dmVyX3RhYmxlW2ldOworCQlpZiAodi0+bWFqb3IgPD0gbWFqb3IpIHsKKwkJCXJldCA9IHY7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICp2YXA7CisJaW50IGVycjsKKworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vciwgcGt0LT5kZXZfY2xhc3MpOworCisJaWYgKHZpby0+aHNfc3RhdGUgIT0gVklPX0hTX0lOVkFMSUQpIHsKKwkJLyogWFhYIFBlcmhhcHMgaW52b2tlIHN0YXJ0X2hhbmRzaGFrZT8gWFhYICovCisJCW1lbXNldCgmdmlvLT52ZXIsIDAsIHNpemVvZih2aW8tPnZlcikpOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisJfQorCisJdmFwID0gZmluZF9ieV9tYWpvcih2aW8sIHBrdC0+bWFqb3IpOworCisJdmlvLT5fcGVlcl9zaWQgPSBwa3QtPnRhZy5zaWQ7CisKKwlpZiAoIXZhcCkgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSAwOworCQlwa3QtPm1pbm9yID0gMDsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWzBdIG1pblswXVxuIik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgaWYgKHZhcC0+bWFqb3IgIT0gcGt0LT5tYWpvcikgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSB2YXAtPm1ham9yOworCQlwa3QtPm1pbm9yID0gdmFwLT5taW5vcjsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgdmlvX3ZlcnNpb24gdmVyID0geworCQkJLm1ham9yID0gcGt0LT5tYWpvciwKKwkJCS5taW5vciA9IHBrdC0+bWlub3IsCisJCX07CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJcGt0LT5taW5vciA9IHZlci5taW5vcjsKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9BQ0s7CisJCXZpb2RiZyhIUywgIlNFTkQgVkVSU0lPTiBBQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCXZpby0+dmVyID0gdmVyOworCQkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCQl9CisJfQorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2FjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgc3RydWN0IHZpb192ZXJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIEFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSB7CisJCWlmICh2aW8tPnZlci5tYWpvciAhPSBwa3QtPm1ham9yIHx8CisJCSAgICB2aW8tPnZlci5taW5vciAhPSBwa3QtPm1pbm9yKSB7CisJCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCQkodm9pZCkgc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBzaXplb2YoKnBrdCkpOworCQkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJCX0KKwl9IGVsc2UgeworCQl2aW8tPnZlci5tYWpvciA9IHBrdC0+bWFqb3I7CisJCXZpby0+dmVyLm1pbm9yID0gcGt0LT5taW5vcjsKKwkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCX0KKworCXN3aXRjaCAodmlvLT5kZXZfY2xhc3MpIHsKKwljYXNlIFZERVZfTkVUV09SSzoKKwljYXNlIFZERVZfRElTSzoKKwkJaWYgKHNlbmRfYXR0cih2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICpudmVyOworCisJdmlvZGJnKEhTLCAiR09UIFZFUlNJT04gTkFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAoKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApIHx8CisJICAgICEobnZlciA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKSkpCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJaWYgKHNlbmRfdmVyc2lvbih2aW8sIG52ZXItPm1ham9yLCBudmVyLT5taW5vcikgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fdmVyX2luZm8gKnBrdCkKK3sKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX2Fjayh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX05BQ0s6CisJCXJldHVybiBwcm9jZXNzX3Zlcl9uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX07Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwllcnIgPSB2aW8tPm9wcy0+aGFuZGxlX2F0dHIodmlvLCBwa3QpOworCWlmIChlcnIgPCAwKSB7CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX0gZWxzZSB7CisJCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX0dPVF9BVFRSOworCisJCWlmICgodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSkgJiYKKwkJICAgICEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19TRU5UX0RSRUcpKSB7CisJCQlpZiAoc2VuZF9kcmVnKHZpbykgPCAwKQorCQkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJCQl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19TRU5UX0RSRUc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsX2RyaW5nc19yZWdpc3RlcmVkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJaW50IG5lZWRfcngsIG5lZWRfdHg7CisKKwluZWVkX3J4ID0gKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpOworCW5lZWRfdHggPSAodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSk7CisKKwlpZiAobmVlZF9yeCAmJgorCSAgICAhKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRUcpKQorCQlyZXR1cm4gMDsKKworCWlmIChuZWVkX3R4ICYmCisJICAgICEodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFRykpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kcmVnX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCWludCBpLCBsZW47CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfUkVHIElORk8gaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWlmICghKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpKQorCQlnb3RvIHNlbmRfbmFjazsKKworCWlmICh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1JYUkVHKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWYgPSBremFsbG9jKHBrdC0+ZGVzY3Jfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCF2aW8tPmRlc2NfYnVmKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWZfbGVuID0gcGt0LT5kZXNjcl9zaXplOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKworCWRyLT5udW1fZW50cmllcyA9IHBrdC0+bnVtX2Rlc2NyOworCWRyLT5lbnRyeV9zaXplID0gcGt0LT5kZXNjcl9zaXplOworCWRyLT5uY29va2llcyA9IHBrdC0+bnVtX2Nvb2tpZXM7CisJZm9yIChpID0gMDsgaSA8IGRyLT5uY29va2llczsgaSsrKSB7CisJCWRyLT5jb29raWVzW2ldID0gcGt0LT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIHBrdC0+Y29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBwa3QtPmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfQUNLOworCXBrdC0+ZHJpbmdfaWRlbnQgPSArK2RyLT5pZGVudDsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIEFDSyBpZGVudFslbGx4XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCk7CisKKwlsZW4gPSAoc2l6ZW9mKCpwa3QpICsKKwkgICAgICAgKGRyLT5uY29va2llcyAqIHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkpKTsKKwlpZiAoc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBsZW4pIDwgMCkKKwkJZ290byBzZW5kX25hY2s7CisKKwl2aW8tPmRyX3N0YXRlIHw9IFZJT19EUl9TVEFURV9SWFJFRzsKKworCXJldHVybiAwOworCitzZW5kX25hY2s6CisJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIE5BQ0tcbiIpOworCSh2b2lkKSBzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBBQ0sgaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwlpZiAoISh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1RYUkVRKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlkci0+aWRlbnQgPSBwa3QtPmRyaW5nX2lkZW50OworCXZpby0+ZHJfc3RhdGUgfD0gVklPX0RSX1NUQVRFX1RYUkVHOworCisJaWYgKGFsbF9kcmluZ3NfcmVnaXN0ZXJlZCh2aW8pKSB7CisJCWlmIChzZW5kX3JkeCh2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX1NFTlRfUkRYOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfbmFjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgICBzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBOQUNLIGlkZW50WyVsbHhdICIKKwkgICAgICAgIm5kZXNjWyV1XSBkc3pbJXVdIG9wdFsweCV4XSBuY29va2llc1sldV1cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+ZHJpbmdfaWRlbnQsCisJICAgICAgIHBrdC0+bnVtX2Rlc2NyLCBwa3QtPmRlc2NyX3NpemUsIHBrdC0+b3B0aW9ucywKKwkgICAgICAgcGt0LT5udW1fY29va2llcyk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCXN0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgKnBrdCkKK3sKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0dPVFZFUlMpKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX2RyZWdfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfZHJlZ19hY2sodmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19kcmVnX25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZHVucmVnKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgIHN0cnVjdCB2aW9fZHJpbmdfdW5yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfVU5SRUdcbiIpOworCisJaWYgKHBrdC0+ZHJpbmdfaWRlbnQgIT0gZHItPmlkZW50KQorCQlyZXR1cm4gMDsKKworCXZpby0+ZHJfc3RhdGUgJj0gflZJT19EUl9TVEFURV9SWFJFRzsKKworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZHhfaW5mbyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX3JkeCAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBSRFggSU5GT1xuIik7CisKKwlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0FDSzsKKwl2aW9kYmcoSFMsICJTRU5EIFJEWCBBQ0tcbiIpOworCWlmIChzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSkgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX1NFTlRfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19yZHggKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgUkRYIEFDS1xuIik7CisKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX1NFTlRfUkRYKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19HT1RfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9uYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIFJEWCBOQUNLXG4iKTsKKworCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJaWYgKCFhbGxfZHJpbmdzX3JlZ2lzdGVyZWQodmlvKSkKKwkJaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX3JkeF9pbmZvKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19yZHhfYWNrKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfTkFDSzoKKwkJcmV0dXJuIHByb2Nlc3NfcmR4X25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitpbnQgdmlvX2NvbnRyb2xfcGt0X2VuZ2luZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpwa3QpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICp0YWcgPSBwa3Q7CisJdTggcHJldl9zdGF0ZSA9IHZpby0+aHNfc3RhdGU7CisJaW50IGVycjsKKworCXN3aXRjaCAodGFnLT5zdHlwZV9lbnYpIHsKKwljYXNlIFZJT19WRVJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc192ZXIodmlvLCBwa3QpOworCQlicmVhazsKKworCWNhc2UgVklPX0FUVFJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc19hdHRyKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19EUklOR19SRUc6CisJCWVyciA9IHByb2Nlc3NfZHJlZyh2aW8sIHBrdCk7CisJCWJyZWFrOworCisJY2FzZSBWSU9fRFJJTkdfVU5SRUc6CisJCWVyciA9IHByb2Nlc3NfZHVucmVnKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19SRFg6CisJCWVyciA9IHByb2Nlc3NfcmR4KHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSBwcm9jZXNzX3Vua25vd24odmlvLCBwa3QpOworCQlicmVhazsKKwl9CisJaWYgKCFlcnIgJiYKKwkgICAgdmlvLT5oc19zdGF0ZSAhPSBwcmV2X3N0YXRlICYmCisJICAgICh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0NPTVBMRVRFKSkKKwkJdmlvLT5vcHMtPmhhbmRzaGFrZV9jb21wbGV0ZSh2aW8pOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodmlvX2NvbnRyb2xfcGt0X2VuZ2luZSk7CisKK3ZvaWQgdmlvX2Nvbm5fcmVzZXQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKK30KK0VYUE9SVF9TWU1CT0wodmlvX2Nvbm5fcmVzZXQpOworCisvKiBUaGUgaXNzdWUgaXMgdGhhdCB0aGUgU29sYXJpcyB2aXJ0dWFsIGRpc2sgc2VydmVyIGp1c3QgbWlycm9ycyB0aGUKKyAqIFNJRCB2YWx1ZXMgaXQgZ2V0cyBmcm9tIHRoZSBjbGllbnQgcGVlci4gIFNvIHdlIHdvcmsgYXJvdW5kIHRoYXQKKyAqIGhlcmUgaW4gdmlvX3t2YWxpZGF0ZSxzZW5kfV9zaWQoKSBzbyB0aGF0IHRoZSBkcml2ZXJzIGRvbid0IG5lZWQKKyAqIHRvIGJlIGF3YXJlIG9mIHRoaXMgY3JhcC4KKyAqLworaW50IHZpb192YWxpZGF0ZV9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19tc2dfdGFnICp0cCkKK3sKKwl1MzIgc2lkOworCisJLyogQWx3YXlzIGxldCBWRVJTSU9OK0lORk8gcGFja2V0cyB0aHJvdWdoIHVuY2hlY2tlZCwgdGhleQorCSAqIGRlZmluZSB0aGUgbmV3IFNJRC4KKwkgKi8KKwlpZiAodHAtPnR5cGUgPT0gVklPX1RZUEVfQ1RSTCAmJgorCSAgICB0cC0+c3R5cGUgPT0gVklPX1NVQlRZUEVfSU5GTyAmJgorCSAgICB0cC0+c3R5cGVfZW52ID09IFZJT19WRVJfSU5GTykKKwkJcmV0dXJuIDA7CisKKwkvKiBPaywgbm93IGZpZ3VyZSBvdXQgd2hpY2ggU0lEIHRvIHVzZS4gICovCisJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJZGVmYXVsdDoKKwkJc2lkID0gdmlvLT5fcGVlcl9zaWQ7CisJCWJyZWFrOworCisJY2FzZSBWREVWX0RJU0s6CisJCXNpZCA9IHZpby0+X2xvY2FsX3NpZDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNpZCA9PSB0cC0+c2lkKQorCQlyZXR1cm4gMDsKKwl2aW9kYmcoREFUQSwgIkJBRCBTSUQgdGFnLT5zaWRbJTA4eF0gcGVlcl9zaWRbJTA4eF0gbG9jYWxfc2lkWyUwOHhdXG4iLAorCSAgICAgICB0cC0+c2lkLCB2aW8tPl9wZWVyX3NpZCwgdmlvLT5fbG9jYWxfc2lkKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3ZhbGlkYXRlX3NpZCk7CisKK3UzMiB2aW9fc2VuZF9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzd2l0Y2ggKHZpby0+ZGV2X2NsYXNzKSB7CisJY2FzZSBWREVWX05FVFdPUks6CisJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCWNhc2UgVkRFVl9ESVNLOgorCWRlZmF1bHQ6CisJCXJldHVybiB2aW8tPl9sb2NhbF9zaWQ7CisKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCXJldHVybiB2aW8tPl9wZWVyX3NpZDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHZpb19zZW5kX3NpZCk7CisKK2V4dGVybiBpbnQgdmlvX2xkY19hbGxvYyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJIHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgKmJhc2VfY2ZnLAorCQkJIHZvaWQgKmV2ZW50X2FyZykKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGNmZyA9ICpiYXNlX2NmZzsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwOworCisJY2ZnLnR4X2lycSA9IHZpby0+dmRldi0+dHhfaXJxOworCWNmZy5yeF9pcnEgPSB2aW8tPnZkZXYtPnJ4X2lycTsKKworCWxwID0gbGRjX2FsbG9jKHZpby0+dmRldi0+Y2hhbm5lbF9pZCwgJmNmZywgZXZlbnRfYXJnKTsKKwlpZiAoSVNfRVJSKGxwKSkKKwkJcmV0dXJuIFBUUl9FUlIobHApOworCisJdmlvLT5scCA9IGxwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfYWxsb2MpOworCit2b2lkIHZpb19sZGNfZnJlZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCWxkY19mcmVlKHZpby0+bHApOworCXZpby0+bHAgPSBOVUxMOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworfQorRVhQT1JUX1NZTUJPTCh2aW9fbGRjX2ZyZWUpOworCit2b2lkIHZpb19wb3J0X3VwKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyLCBzdGF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCXN0YXRlID0gbGRjX3N0YXRlKHZpby0+bHApOworCisJZXJyID0gMDsKKwlpZiAoc3RhdGUgPT0gTERDX1NUQVRFX0lOSVQpIHsKKwkJZXJyID0gbGRjX2JpbmQodmlvLT5scCwgdmlvLT5uYW1lKTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQb3J0ICVsdSBiaW5kIGZhaWxlZCwgIgorCQkJICAgICAgICJlcnI9JWRcbiIsCisJCQkgICAgICAgdmlvLT5uYW1lLCB2aW8tPnZkZXYtPmNoYW5uZWxfaWQsIGVycik7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbGRjX2Nvbm5lY3QodmlvLT5scCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUG9ydCAlbHUgY29ubmVjdCBmYWlsZWQsICIKKwkJCSAgICAgICAiZXJyPSVkXG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwgdmlvLT52ZGV2LT5jaGFubmVsX2lkLCBlcnIpOworCX0KKwlpZiAoZXJyKSB7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKworCQlleHBpcmVzID0gcm91bmRfamlmZmllcyhleHBpcmVzKTsKKwkJbW9kX3RpbWVyKCZ2aW8tPnRpbWVyLCBleHBpcmVzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3BvcnRfdXApOworCitzdGF0aWMgdm9pZCB2aW9fcG9ydF90aW1lcih1bnNpZ25lZCBsb25nIF9hcmcpCit7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9IChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqKSBfYXJnOworCisJdmlvX3BvcnRfdXAodmlvKTsKK30KKworaW50IHZpb19kcml2ZXJfaW5pdChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJICAgIHU4IGRldl9jbGFzcywgc3RydWN0IHZpb192ZXJzaW9uICp2ZXJfdGFibGUsCisJCSAgICBpbnQgdmVyX3RhYmxlX3NpemUsIHN0cnVjdCB2aW9fZHJpdmVyX29wcyAqb3BzLAorCQkgICAgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKGRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTSzoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFvcHMtPnNlbmRfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kbGVfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kc2hha2VfY29tcGxldGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF2ZXJfdGFibGUgfHwgdmVyX3RhYmxlX3NpemUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaW5pdCgmdmlvLT5sb2NrKTsKKworCXZpby0+bmFtZSA9IG5hbWU7CisKKwl2aW8tPmRldl9jbGFzcyA9IGRldl9jbGFzczsKKwl2aW8tPnZkZXYgPSB2ZGV2OworCisJdmlvLT52ZXJfdGFibGUgPSB2ZXJfdGFibGU7CisJdmlvLT52ZXJfdGFibGVfZW50cmllcyA9IHZlcl90YWJsZV9zaXplOworCisJdmlvLT5vcHMgPSBvcHM7CisKKwlzZXR1cF90aW1lcigmdmlvLT50aW1lciwgdmlvX3BvcnRfdGltZXIsICh1bnNpZ25lZCBsb25nKSB2aW8pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19kcml2ZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQppbmRleCA0YTcyNWQ4Li5jNGE2ZDZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDYgQEAKIAkgTkdtZW1jcHkubyBOR2NvcHlfZnJvbV91c2VyLm8gTkdjb3B5X3RvX3VzZXIubyBOR3BhdGNoLm8gXAogCSBOR3BhZ2UubyBOR2J6ZXJvLm8gXAogCSBjb3B5X2luX3VzZXIubyB1c2VyX2ZpeHVwLm8gbWVtbW92ZS5vIFwKLQkgbWNvdW50Lm8gaXBjc3VtLm8gcndzZW0ubyB4b3IubyBkZWxheS5vCisJIG1jb3VudC5vIGlwY3N1bS5vIHJ3c2VtLm8geG9yLm8KIAogb2JqLXkgKz0gaW9tYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jIGIvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI3ZTU0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9saWIvZGVsYXkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIGRlbGF5LmM6IERlbGF5IGxvb3BzIGZvciBzcGFyYzY0Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KLSAqCi0gKiBCYXNlZCBoZWF2aWx5IHVwb24geDg2IHZhcmlhbnQgd2hpY2ggaXM6Ci0gKglDb3B5cmlnaHQgKEMpIDE5OTMgTGludXMgVG9ydmFsZHMKLSAqCUNvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLQotdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCi17Ci0JdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKLQkKLQliY2xvY2sgPSB0aWNrX29wcy0+Z2V0X3RpY2soKTsKLQlkbyB7Ci0JCW5vdyA9IHRpY2tfb3BzLT5nZXRfdGljaygpOwotCX0gd2hpbGUgKChub3ctYmNsb2NrKSA8IGxvb3BzKTsKLX0KLQotLyogV2UgdXNlZCB0byBtdWx0aXBseSBieSBIWiBhZnRlciBzaGlmdGluZyBkb3duIGJ5IDMyIGJpdHMKLSAqIGJ1dCB0aGF0IHJ1bnMgaW50byBwcm9ibGVtcyBmb3IgaGlnaGVyIHZhbHVlcyBvZiBIWiBhbmQKLSAqIHNsb3cgY3B1cy4KLSAqLwotdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JbiAqPSA0OwotCi0JbiAqPSAoY3B1X2RhdGEocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkudWRlbGF5X3ZhbCAqIChIWi80KSk7Ci0JbiA+Pj0gMzI7Ci0KLQlfX2RlbGF5KG4gKyAxKTsKLX0KLQotdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JX19jb25zdF91ZGVsYXkobiAqIDB4MTBjN1VMKTsKLX0KLQotCi12b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbikKLXsKLQlfX2NvbnN0X3VkZWxheShuICogMHg1VUwpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jIGIvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jCmluZGV4IGYzZTBjMTQuLjMzYzViN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL21pc2MuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS9taXNjLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgogCiBpbnQgcHJvbV9zZXJ2aWNlX2V4aXN0cyhjb25zdCBjaGFyICpzZXJ2aWNlX25hbWUpCiB7CkBAIC0zNyw2ICszOCwxMCBAQAogLyogUmVzZXQgYW5kIHJlYm9vdCB0aGUgbWFjaGluZSB3aXRoIHRoZSBjb21tYW5kICdiY29tbWFuZCcuICovCiB2b2lkIHByb21fcmVib290KGNvbnN0IGNoYXIgKmJjb21tYW5kKQogeworI2lmZGVmIENPTkZJR19TVU5fTERPTVMKKwlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJbGRvbV9yZWJvb3QoYmNvbW1hbmQpOworI2VuZGlmCiAJcDEyNzVfY21kKCJib290IiwgUDEyNzVfQVJHKDAsIFAxMjc1X0FSR19JTl9TVFJJTkcpIHwKIAkJICBQMTI3NV9JTk9VVCgxLCAwKSwgYmNvbW1hbmQpOwogfQpAQCAtOTEsNiArOTYsMTAgQEAKICAqLwogdm9pZCBwcm9tX2hhbHQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfU1VOX0xET01TCisJaWYgKGxkb21fZG9tYWluaW5nX2VuYWJsZWQpCisJCWxkb21fcG93ZXJfb2ZmKCk7CisjZW5kaWYKIGFnYWluOgogCXAxMjc1X2NtZCgiZXhpdCIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAlnb3RvIGFnYWluOyAvKiBQUk9NIGlzIG91dCB0byBnZXQgbWUgLURhdmVNICovCkBAIC05OCw2ICsxMDcsMTAgQEAKIAogdm9pZCBwcm9tX2hhbHRfcG93ZXJfb2ZmKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQlsZG9tX3Bvd2VyX29mZigpOworI2VuZGlmCiAJcDEyNzVfY21kKCJTVU5XLHBvd2VyLW9mZiIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAogCS8qIGlmIG5vdGhpbmcgZWxzZSBoZWxwcywgd2UganVzdCBoYWx0ICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vcDEyNzUuYwppbmRleCAyYjMyYzQ4Li43ZmNjY2MwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jCisrKyBiL2FyY2gvc3BhcmM2NC9wcm9tL3AxMjc1LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogc3RydWN0IHsKIAlsb25nIHByb21fY2FsbGJhY2s7CQkJLyogMHgwMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jCmluZGV4IDUwMGYwNWUuLjE3YjdlY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL3RyZWUuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS90cmVlLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogLyogUmV0dXJuIHRoZSBjaGlsZCBvZiBub2RlICdub2RlJyBvciB6ZXJvIGlmIG5vIHRoaXMgbm9kZSBoYXMgbm8KICAqIGRpcmVjdCBkZXNjZW5kZW50LgpAQCAtMjYxLDkgKzI2MiwxNyBAQAogaW50CiBwcm9tX3NldHByb3AoaW50IG5vZGUsIGNvbnN0IGNoYXIgKnBuYW1lLCBjaGFyICp2YWx1ZSwgaW50IHNpemUpCiB7Ci0JaWYoc2l6ZSA9PSAwKSByZXR1cm4gMDsKLQlpZigocG5hbWUgPT0gMCkgfHwgKHZhbHVlID09IDApKSByZXR1cm4gMDsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoKHBuYW1lID09IDApIHx8ICh2YWx1ZSA9PSAwKSkKKwkJcmV0dXJuIDA7CiAJCisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKSB7CisJCWxkb21fc2V0X3ZhcihwbmFtZSwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKIAlyZXR1cm4gcDEyNzVfY21kICgic2V0cHJvcCIsIFAxMjc1X0FSRygxLFAxMjc1X0FSR19JTl9TVFJJTkcpfAogCQkJCQkgIFAxMjc1X0FSRygyLFAxMjc1X0FSR19JTl9CVUYpfAogCQkJCQkgIFAxMjc1X0lOT1VUKDQsIDEpLCAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZwppbmRleCAwOWMxYWNhLi5jODZmNWViIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC91bS9LY29uZmlnLmRlYnVnCkBAIC00Nyw0ICs0NywxMyBAQAogICAgICAgICBJZiB5b3UncmUgaW52b2x2ZWQgaW4gVU1MIGtlcm5lbCBkZXZlbG9wbWVudCBhbmQgd2FudCB0byB1c2UgZ2NvdiwKICAgICAgICAgc2F5IFkuICBJZiB5b3UncmUgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIERFQlVHX1NUQUNLX1VTQUdFCisJYm9vbCAiU3RhY2sgdXRpbGl6YXRpb24gaW5zdHJ1bWVudGF0aW9uIgorCWRlZmF1bHQgTgorCWhlbHAKKwkgIFRyYWNrIHRoZSBtYXhpbXVtIGtlcm5lbCBzdGFjayB1c2FnZSAtIHRoaXMgd2lsbCBsb29rIGF0IGVhY2gKKwkgIGtlcm5lbCBzdGFjayBhdCBwcm9jZXNzIGV4aXQgYW5kIGxvZyBpdCBpZiBpdCdzIHRoZSBkZWVwZXN0CisJICBzdGFjayBzZWVuIHNvIGZhci4KKworCSAgVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gcHJvY2VzcyBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gc29tZXdoYXQuCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3VtL2NvbmZpZy5yZWxlYXNlIGIvYXJjaC91bS9jb25maWcucmVsZWFzZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2OGJjYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2NvbmZpZy5yZWxlYXNlCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19VU0VSTU9ERT15Ci0jIENPTkZJR19JU0EgaXMgbm90IHNldAotIyBDT05GSUdfU0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLQotIwotIyBHZW5lcmFsIFNldHVwCi0jCi1DT05GSUdfU1RESU9fQ09OU09MRT15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0JJTkZNVF9BT1VUPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfTUlTQz15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX1VOSVg5OF9QVFlfQ09VTlQ9MjU2Ci1DT05GSUdfU1NMPXkKLUNPTkZJR19IT1NURlM9eQotQ09ORklHX01DT05TT0xFPXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci0jIENPTkZJR19IT1NUXzJHXzJHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VNTF9TTVAgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLUNPTkZJR19DT05fWkVST19DSEFOPSJmZDowLGZkOjEiCi1DT05GSUdfQ09OX0NIQU49Inh0ZXJtIgotQ09ORklHX1NTTF9DSEFOPSJwdHkiCi1DT05GSUdfTkVTVF9MRVZFTD0wCi1DT05GSUdfS0VSTkVMX0hBTEZfR0lHUz0xCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19LTU9EPXkKLQotIwotIyBEZXZpY2VzCi0jCi1DT05GSUdfQkxLX0RFVl9VQkQ9eQotIyBDT05GSUdfQkxLX0RFVl9VQkRfU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX05CRD15Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX01NQVBQRVIgaXMgbm90IHNldAotQ09ORklHX1VNTF9TT1VORD15Ci1DT05GSUdfU09VTkQ9eQotQ09ORklHX0hPU1RBVURJTz15Ci0jIENPTkZJR19VTUxfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfVFRZX0xPRyBpcyBub3Qgc2V0Ci1DT05GSUdfRkRfQ0hBTj15Ci0jIENPTkZJR19OVUxMX0NIQU4gaXMgbm90IHNldAotQ09ORklHX1BPUlRfQ0hBTj15Ci1DT05GSUdfUFRZX0NIQU49eQotQ09ORklHX1RUWV9DSEFOPXkKLUNPTkZJR19YVEVSTV9DSEFOPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1BBQ0tFVF9NTUFQPXkKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GSUxURVIgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FQ04gaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LSFRUUEQgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotCi0jCi0jICAKLSMKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19VTUxfTkVUPXkKLUNPTkZJR19VTUxfTkVUX0VUSEVSVEFQPXkKLUNPTkZJR19VTUxfTkVUX1RVTlRBUD15Ci1DT05GSUdfVU1MX05FVF9TTElQPXkKLUNPTkZJR19VTUxfTkVUX0RBRU1PTj15Ci1DT05GSUdfVU1MX05FVF9NQ0FTVD15Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVk9eQotQ09ORklHX0JPTkRJTkc9bQotQ09ORklHX0VRVUFMSVpFUj1tCi1DT05GSUdfVFVOPXkKLSMgQ09ORklHX0VUSEVSVEFQIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLSMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUklfU0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci1DT05GSUdfUExJUD1tCi1DT05GSUdfUFBQPW0KLUNPTkZJR19QUFBfTVVMVElMSU5LPXkKLSMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfU1lOQ19UVFk9bQotQ09ORklHX1BQUF9ERUZMQVRFPW0KLUNPTkZJR19QUFBfQlNEQ09NUD1tCi1DT05GSUdfUFBQT0U9bQotQ09ORklHX1NMSVA9bQotQ09ORklHX1NMSVBfQ09NUFJFU1NFRD15Ci1DT05GSUdfU0xJUF9TTUFSVD15Ci0jIENPTkZJR19TTElQX01PREVfU0xJUDYgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU0hBUEVSPW0KLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19RVU9UQT15Ci1DT05GSUdfQVVUT0ZTX0ZTPW0KLUNPTkZJR19BVVRPRlM0X0ZTPW0KLUNPTkZJR19SRUlTRVJGU19GUz1tCi0jIENPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19QUk9DX0lORk8gaXMgbm90IHNldAotQ09ORklHX0FERlNfRlM9bQotIyBDT05GSUdfQURGU19GU19SVyBpcyBub3Qgc2V0Ci1DT05GSUdfQUZGU19GUz1tCi1DT05GSUdfSEZTX0ZTPW0KLUNPTkZJR19CRlNfRlM9bQotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZBVF9GUz15Ci1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1VNU0RPU19GUz15Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfRUZTX0ZTPW0KLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAotQ09ORklHX0NSQU1GUz1tCi1DT05GSUdfVE1QRlM9eQotQ09ORklHX1JBTUZTPW0KLUNPTkZJR19JU085NjYwX0ZTPXkKLSMgQ09ORklHX0pPTElFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotQ09ORklHX01JTklYX0ZTPW0KLUNPTkZJR19WWEZTX0ZTPW0KLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19SVyBpcyBub3Qgc2V0Ci1DT05GSUdfSFBGU19GUz1tCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfREVWRlNfRlM9eQotQ09ORklHX0RFVkZTX01PVU5UPXkKLSMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZQVFNfRlM9eQotQ09ORklHX1FOWDRGU19GUz1tCi0jIENPTkZJR19RTlg0RlNfUlcgaXMgbm90IHNldAotQ09ORklHX1JPTUZTX0ZTPW0KLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19TWVNWX0ZTPW0KLUNPTkZJR19VREZfRlM9bQotQ09ORklHX1VGU19GUz1tCi0jIENPTkZJR19VRlNfRlNfV1JJVEUgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLSMgQ09ORklHX1JPT1RfTkZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEPXkKLUNPTkZJR19ORlNEX1YzPXkKLUNPTkZJR19TVU5SUEM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0lPQ1RMX0xPQ0tJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU1RST05HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX05GU19OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19PUzJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU01BTExET1MgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfTkxTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0VYVFJBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlNfRlMgaXMgbm90IHNldAotQ09ORklHX1pMSUJfRlNfSU5GTEFURT1tCi0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0jIENPTkZJR19TTUJfTkxTIGlzIG5vdCBzZXQKLUNPTkZJR19OTFM9eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX01EIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EX0xJTkVBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlEMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlEMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlENSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9NVUxUSVBBVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9MVk0gaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QVF9QUk9YWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUFJPRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQ09WIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZGVmY29uZmlnIGIvYXJjaC91bS9kZWZjb25maWcKaW5kZXggYTU0ZDBlZi4uYTI1Y2QyNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kZWZjb25maWcKKysrIGIvYXJjaC91bS9kZWZjb25maWcKQEAgLTE4OSw3ICsxODksNyBAQAogIyBDT05GSUdfTk9DT05GSUdfQ0hBTiBpcyBub3Qgc2V0CiBDT05GSUdfQ09OX1pFUk9fQ0hBTj0iZmQ6MCxmZDoxIgogQ09ORklHX0NPTl9DSEFOPSJ4dGVybSIKLUNPTkZJR19TU0xfQ0hBTj0icHR5IgorQ09ORklHX1NTTF9DSEFOPSJwdHMiCiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtNTI3LDMgKzUyNyw0IEBACiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0dQUk9GIGlzIG5vdCBzZXQKICMgQ09ORklHX0dDT1YgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCmluZGV4IDNhYTM1MTYuLjM2OGQzZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKQEAgLTIwMywyMiArMjAzLDM3IEBACiAJfQogfQogCi12b2lkIGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKQoraW50IGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVsZTsKIAlzdHJ1Y3QgY2hhbiAqY2hhbjsKKwlpbnQgZXJyOwogCiAJbGlzdF9mb3JfZWFjaChlbGUsICZsaW5lLT5jaGFuX2xpc3QpewogCQljaGFuID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCBjaGFuLCBsaXN0KTsKLQkJaWYob3Blbl9vbmVfY2hhbihjaGFuKSkKKwkJZXJyID0gb3Blbl9vbmVfY2hhbihjaGFuKTsKKwkJaWYgKGVycikgeworCQkJaWYgKGNoYW4tPnByaW1hcnkpCisJCQkJZ290byBvdXRfY2xvc2U7CisKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJaWYoY2hhbi0+ZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwotCQlsaW5lX3NldHVwX2lycShjaGFuLT5mZCwgY2hhbi0+aW5wdXQsIGNoYW4tPm91dHB1dCwgbGluZSwKLQkJCSAgICAgICBjaGFuKTsKKwkJZXJyID0gbGluZV9zZXR1cF9pcnEoY2hhbi0+ZmQsIGNoYW4tPmlucHV0LCBjaGFuLT5vdXRwdXQsIGxpbmUsCisJCQkJICAgICBjaGFuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2Nsb3NlOworCiAJCWNoYW4tPmVuYWJsZWQgPSAxOwogCX0KKworCXJldHVybiAwOworCisgb3V0X2Nsb3NlOgorCWNsb3NlX2NoYW4oJmxpbmUtPmNoYW5fbGlzdCwgMCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyogSXRlbXMgYXJlIGFkZGVkIGluIElSUSBjb250ZXh0LCB3aGVuIGZyZWVfaXJxIGNhbid0IGJlIGNhbGxlZCwgYW5kCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKaW5kZXggMTNmMGJmOC4uNGQ0MzhmMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYwpAQCAtNTEsMTkgKzUxLDIxIEBACiAvKgogICogVU1MIFNJR1dJTkNIIGhhbmRsaW5nCiAgKgotICogVGhlIHBvaW50IG9mIHRoaXMgaXMgdG8gaGFuZGxlIFNJR1dJTkNIIG9uIGNvbnNvbGVzIHdoaWNoIGhhdmUgaG9zdCB0dHlzIGFuZAotICogcmVsYXkgdGhlbSBpbnNpZGUgVU1MIHRvIHdoYXRldmVyIG1pZ2h0IGJlIHJ1bm5pbmcgb24gdGhlIGNvbnNvbGUgYW5kIGNhcmVzCi0gKiBhYm91dCB0aGUgd2luZG93IHNpemUgKHNpbmNlIFNJR1dJTkNIIG5vdGlmaWVzIGFib3V0IHRlcm1pbmFsIHNpemUgY2hhbmdlcykuCisgKiBUaGUgcG9pbnQgb2YgdGhpcyBpcyB0byBoYW5kbGUgU0lHV0lOQ0ggb24gY29uc29sZXMgd2hpY2ggaGF2ZSBob3N0CisgKiB0dHlzIGFuZCByZWxheSB0aGVtIGluc2lkZSBVTUwgdG8gd2hhdGV2ZXIgbWlnaHQgYmUgcnVubmluZyBvbiB0aGUKKyAqIGNvbnNvbGUgYW5kIGNhcmVzIGFib3V0IHRoZSB3aW5kb3cgc2l6ZSAoc2luY2UgU0lHV0lOQ0ggbm90aWZpZXMKKyAqIGFib3V0IHRlcm1pbmFsIHNpemUgY2hhbmdlcykuCiAgKgotICogU28sIHdlIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgZm9yIGVhY2ggaG9zdCB0dHkgYXR0YWNoZWQgdG8gYSBVTUwgZGV2aWNlCi0gKiAoc2lkZS1pc3N1ZSAtIEknbSBhbm5veWVkIHRoYXQgb25lIHRocmVhZCBjYW4ndCBoYXZlIG11bHRpcGxlIGNvbnRyb2xsaW5nCi0gKiB0dHlzIGZvciBwdXJwb3NlZCBvZiBoYW5kbGluZyBTSUdXSU5DSCwgYnV0IEkgaW1hZ2luZSB0aGVyZSBhcmUgb3RoZXIgcmVhc29ucwotICogdGhhdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlKS4KKyAqIFNvLCB3ZSBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIGZvciBlYWNoIGhvc3QgdHR5IGF0dGFjaGVkIHRvIGEgVU1MCisgKiBkZXZpY2UgKHNpZGUtaXNzdWUgLSBJJ20gYW5ub3llZCB0aGF0IG9uZSB0aHJlYWQgY2FuJ3QgaGF2ZQorICogbXVsdGlwbGUgY29udHJvbGxpbmcgdHR5cyBmb3IgdGhlIHB1cnBvc2Ugb2YgaGFuZGxpbmcgU0lHV0lOQ0gsIGJ1dAorICogSSBpbWFnaW5lIHRoZXJlIGFyZSBvdGhlciByZWFzb25zIHRoYXQgZG9lc24ndCBtYWtlIGFueSBzZW5zZSkuCiAgKgotICogU0lHV0lOQ0ggY2FuJ3QgYmUgcmVjZWl2ZWQgc3luY2hyb25vdXNseSwgc28geW91IGhhdmUgdG8gc2V0IHVwIHRvIHJlY2VpdmUgaXQKLSAqIGFzIGEgc2lnbmFsLiAgVGhhdCBiZWluZyB0aGUgY2FzZSwgaWYgeW91IGFyZSBnb2luZyB0byB3YWl0IGZvciBpdCwgaXQgaXMKLSAqIGNvbnZlbmllbnQgdG8gc2l0IGluIHNpZ3N1c3BlbmQoKSBhbmQgd2FpdCBmb3IgdGhlIHNpZ25hbCB0byBib3VuY2UgeW91IG91dCBvZgotICogaXQgKHNlZSBiZWxvdyBmb3IgaG93IHdlIG1ha2Ugc3VyZSB0byBleGl0IG9ubHkgb24gU0lHV0lOQ0gpLgorICogU0lHV0lOQ0ggY2FuJ3QgYmUgcmVjZWl2ZWQgc3luY2hyb25vdXNseSwgc28geW91IGhhdmUgdG8gc2V0IHVwIHRvCisgKiByZWNlaXZlIGl0IGFzIGEgc2lnbmFsLiAgVGhhdCBiZWluZyB0aGUgY2FzZSwgaWYgeW91IGFyZSBnb2luZyB0bworICogd2FpdCBmb3IgaXQsIGl0IGlzIGNvbnZlbmllbnQgdG8gc2l0IGluIHNpZ3N1c3BlbmQoKSBhbmQgd2FpdCBmb3IKKyAqIHRoZSBzaWduYWwgdG8gYm91bmNlIHlvdSBvdXQgb2YgaXQgKHNlZSBiZWxvdyBmb3IgaG93IHdlIG1ha2Ugc3VyZQorICogdG8gZXhpdCBvbmx5IG9uIFNJR1dJTkNIKS4KICAqLwogCiBzdGF0aWMgdm9pZCB3aW5jaF9oYW5kbGVyKGludCBzaWcpCkBAIC0xMTIsNyArMTE0LDggQEAKIAogCWVyciA9IG9zX25ld190dHlfcGdycChwdHlfZmQsIG9zX2dldHBpZCgpKTsKIAlpZihlcnIgPCAwKXsKLQkJcHJpbnRrKCJ3aW5jaF90aHJlYWQgOiBuZXdfdHR5X3BncnAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLWVycik7CisJCXByaW50aygid2luY2hfdGhyZWFkIDogbmV3X3R0eV9wZ3JwIGZhaWxlZCBvbiBmZCAlZCwgIgorCQkgICAgICAgImVyciA9ICVkXG4iLCBwdHlfZmQsIC1lcnIpOwogCQlleGl0KDEpOwogCX0KIApAQCAtMTI2LDggKzEyOSw5IEBACiAJCSAgICAgICAiZXJyID0gJWRcbiIsIC1jb3VudCk7CiAKIAl3aGlsZSgxKXsKLQkJLyogVGhpcyB3aWxsIGJlIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIG9ubHksIHNpbmNlIG90aGVyIHNpZ25hbHMKLQkJICogYXJlIGJsb2NrZWQuKi8KKwkJLyogVGhpcyB3aWxsIGJlIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIG9ubHksIHNpbmNlCisJCSAqIG90aGVyIHNpZ25hbHMgYXJlIGJsb2NrZWQuCisJCSAqLwogCQlzaWdzdXNwZW5kKCZzaWdzKTsKIAogCQljb3VudCA9IG9zX3dyaXRlX2ZpbGUocGlwZV9mZCwgJmMsIHNpemVvZihjKSk7CkBAIC0xMzcsMTAgKzE0MSwxMCBAQAogCX0KIH0KIAotc3RhdGljIGludCB3aW5jaF90cmFtcChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCAqZmRfb3V0KQorc3RhdGljIGludCB3aW5jaF90cmFtcChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCAqZmRfb3V0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQogewogCXN0cnVjdCB3aW5jaF9kYXRhIGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKIAlpbnQgZmRzWzJdLCBuLCBlcnI7CiAJY2hhciBjOwogCkBAIC0xNTMsOSArMTU3LDExIEBACiAJZGF0YSA9ICgoc3RydWN0IHdpbmNoX2RhdGEpIHsgLnB0eV9mZCAJCT0gZmQsCiAJCQkJICAgICAgLnBpcGVfZmQgCQk9IGZkc1sxXSB9ICk7CiAJLyogQ0xPTkVfRklMRVMgc28gdGhpcyB0aHJlYWQgZG9lc24ndCBob2xkIG9wZW4gZmlsZXMgd2hpY2ggYXJlIG9wZW4KLQkgKiBub3csIGJ1dCBsYXRlciBjbG9zZWQuICBUaGlzIGlzIGEgcHJvYmxlbSB3aXRoIC9kZXYvbmV0L3R1bi4KKwkgKiBub3csIGJ1dCBsYXRlciBjbG9zZWQgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiAgVGhpcyBpcyBhCisJICogcHJvYmxlbSB3aXRoIC9kZXYvbmV0L3R1biwgd2hpY2ggaWYgaGVsZCBvcGVuIGJ5IHRoaXMKKwkgKiB0aHJlYWQsIHByZXZlbnRzIHRoZSBUVU4vVEFQIGRldmljZSBmcm9tIGJlaW5nIHJldXNlZC4KIAkgKi8KLQllcnIgPSBydW5faGVscGVyX3RocmVhZCh3aW5jaF90aHJlYWQsICZkYXRhLCBDTE9ORV9GSUxFUywgJnN0YWNrLCAwKTsKKwllcnIgPSBydW5faGVscGVyX3RocmVhZCh3aW5jaF90aHJlYWQsICZkYXRhLCBDTE9ORV9GSUxFUywgc3RhY2tfb3V0KTsKIAlpZihlcnIgPCAwKXsKIAkJcHJpbnRrKCJmb3JrIG9mIHdpbmNoX3RocmVhZCBmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCAtZXJyKTsKIAkJZ290byBvdXRfY2xvc2U7CkBAIC0xNzAsNyArMTc2LDEzIEBACiAgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXRfY2xvc2U7CiAJfQotCXJldHVybiBlcnIgOworCisJaWYgKG9zX3NldF9mZF9ibG9jaygqZmRfb3V0LCAwKSkgeworCQlwcmludGsoIndpbmNoX3RyYW1wOiBmYWlsZWQgdG8gc2V0IHRocmVhZF9mZCBub24tYmxvY2tpbmcuXG4iKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJcmV0dXJuIGVycjsKIAogIG91dF9jbG9zZToKIAlvc19jbG9zZV9maWxlKGZkc1sxXSk7CkBAIC0xODEsMjUgKzE5MywyNSBAQAogCiB2b2lkIHJlZ2lzdGVyX3dpbmNoKGludCBmZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlpbnQgcGlkLCB0aHJlYWQsIHRocmVhZF9mZCA9IC0xOwotCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCWludCBwaWQsIHRocmVhZCwgY291bnQsIHRocmVhZF9mZCA9IC0xOwogCWNoYXIgYyA9IDE7CiAKIAlpZighaXNhdHR5KGZkKSkKIAkJcmV0dXJuOwogCiAJcGlkID0gdGNnZXRwZ3JwKGZkKTsKLQlpZighQ0hPT1NFX01PREVfUFJPQyhpc190cmFjZXJfd2luY2gsIGlzX3NrYXNfd2luY2gsIHBpZCwgZmQsCi0JCQkgICAgIHR0eSkgJiYgKHBpZCA9PSAtMSkpewotCQl0aHJlYWQgPSB3aW5jaF90cmFtcChmZCwgdHR5LCAmdGhyZWFkX2ZkKTsKLQkJaWYodGhyZWFkID4gMCl7Ci0JCQlyZWdpc3Rlcl93aW5jaF9pcnEodGhyZWFkX2ZkLCBmZCwgdGhyZWFkLCB0dHkpOworCWlmICghQ0hPT1NFX01PREVfUFJPQyhpc190cmFjZXJfd2luY2gsIGlzX3NrYXNfd2luY2gsIHBpZCwgZmQsIHR0eSkgJiYKKwkgICAgKHBpZCA9PSAtMSkpIHsKKwkJdGhyZWFkID0gd2luY2hfdHJhbXAoZmQsIHR0eSwgJnRocmVhZF9mZCwgJnN0YWNrKTsKKwkJaWYgKHRocmVhZCA8IDApCisJCQlyZXR1cm47CiAKLQkJCWNvdW50ID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZjLCBzaXplb2YoYykpOwotCQkJaWYoY291bnQgIT0gc2l6ZW9mKGMpKQotCQkJCXByaW50aygicmVnaXN0ZXJfd2luY2ggOiBmYWlsZWQgdG8gd3JpdGUgIgotCQkJCSAgICAgICAic3luY2hyb25pemF0aW9uIGJ5dGUsIGVyciA9ICVkXG4iLAotCQkJCQktY291bnQpOwotCQl9CisJCXJlZ2lzdGVyX3dpbmNoX2lycSh0aHJlYWRfZmQsIGZkLCB0aHJlYWQsIHR0eSwgc3RhY2spOworCisJCWNvdW50ID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZjLCBzaXplb2YoYykpOworCQlpZihjb3VudCAhPSBzaXplb2YoYykpCisJCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoIDogZmFpbGVkIHRvIHdyaXRlICIKKwkJCSAgICAgICAic3luY2hyb25pemF0aW9uIGJ5dGUsIGVyciA9ICVkXG4iLCAtY291bnQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmggYi9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCmluZGV4IDE1NDUzODQuLmNhOGM5ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKKysrIGIvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaApAQCAtOCw3ICs4LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkICpjb3dfbWFsbG9jKGludCBzaXplKQogewotCXJldHVybiB1bV9rbWFsbG9jKHNpemUpOworCXJldHVybiBrbWFsbG9jKHNpemUsIFVNX0dGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY293X2ZyZWUodm9pZCAqcHRyKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwppbmRleCBiODY5ZTM4Li44ZDIwMDhmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwpAQCAtMzUsNyArMzUsNyBAQAogewogCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOwogCi0Jc3VuID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7CisJc3VuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoc3VuID09IE5VTEwpewogCQlwcmludGsoIm5ld19hZGRyOiBhbGxvY2F0aW9uIG9mIHNvY2thZGRyX3VuIGZhaWxlZFxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtODMsNyArODMsNyBAQAogCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKLQlzdW4gPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKKwlzdW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihzdW4gPT0gTlVMTCl7CiAJCXByaW50aygibmV3X2FkZHI6IGFsbG9jYXRpb24gb2Ygc29ja2FkZHJfdW4gZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9mZC5jIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKaW5kZXggN2YwODNlYy4uMzljMDFmZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2ZkLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkJcHJpbnRrKCJmZF9pbml0IDogY291bGRuJ3QgcGFyc2UgZmlsZSBkZXNjcmlwdG9yICclcydcbiIsIHN0cik7CiAJCXJldHVybihOVUxMKTsKIAl9Ci0JZGF0YSA9IHVtX2ttYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoZGF0YSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CiAJKmRhdGEgPSAoKHN0cnVjdCBmZF9jaGFuKSB7IC5mZCAgCT0gbiwKIAkJCQkgICAgLnJhdyAgCT0gb3B0cy0+cmF3IH0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCmluZGV4IDVlZWVjZjg5Li4xMTcxNzkwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ191c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCkBAIC02OCw3ICs2OCw3IEBACiAJCWFyZ3MgPSBwaWRfYXJnczsKIAl9CiAKLQlwaWQgPSBydW5faGVscGVyKHByZV9leGVjLCAmZGF0YSwgYXJncywgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcihwcmVfZXhlYywgJmRhdGEsIGFyZ3MpOwogCiAJb3NfY2xvc2VfZmlsZShvdXRfZmRzWzBdKTsKIAlvc19jbG9zZV9maWxlKGluX2Zkc1sxXSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCA0YmQ0MGJiLi4zZTBiNjhlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTQ1NCw3ICs0NTQsMTAgQEAKIAl0dHktPmRyaXZlcl9kYXRhID0gbGluZTsKIAlsaW5lLT50dHkgPSB0dHk7CiAKLQllbmFibGVfY2hhbihsaW5lKTsKKwllcnIgPSBlbmFibGVfY2hhbihsaW5lKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJSU5JVF9ERUxBWUVEX1dPUksoJmxpbmUtPnRhc2ssIGxpbmVfdGltZXJfY2IpOwogCiAJaWYoIWxpbmUtPnNpZ2lvKXsKQEAgLTc0Niw4ICs3NDksMjQgQEAKIAlpbnQgdHR5X2ZkOwogCWludCBwaWQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOwogfTsKIAorc3RhdGljIHZvaWQgZnJlZV93aW5jaChzdHJ1Y3Qgd2luY2ggKndpbmNoLCBpbnQgZnJlZV9pcnFfb2spCit7CisJbGlzdF9kZWwoJndpbmNoLT5saXN0KTsKKworCWlmICh3aW5jaC0+cGlkICE9IC0xKQorCQlvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7CisJaWYgKHdpbmNoLT5mZCAhPSAtMSkKKwkJb3NfY2xvc2VfZmlsZSh3aW5jaC0+ZmQpOworCWlmICh3aW5jaC0+c3RhY2sgIT0gMCkKKwkJZnJlZV9zdGFjayh3aW5jaC0+c3RhY2ssIDApOworCWlmIChmcmVlX2lycV9vaykKKwkJZnJlZV9pcnEoV0lOQ0hfSVJRLCB3aW5jaCk7CisJa2ZyZWUod2luY2gpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3Qgd2luY2hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaCA9IGRhdGE7CkBAIC03NjQsMTIgKzc4MywxMyBAQAogCQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgLWVycik7CiAJCQkJcHJpbnRrKCJmZCAlZCBpcyBsb3NpbmcgU0lHV0lOQ0ggc3VwcG9ydFxuIiwKIAkJCQkgICAgICAgd2luY2gtPnR0eV9mZCk7CisJCQkJZnJlZV93aW5jaCh3aW5jaCwgMCk7CiAJCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQkJfQogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JdHR5ICA9IHdpbmNoLT50dHk7CisJdHR5ID0gd2luY2gtPnR0eTsKIAlpZiAodHR5ICE9IE5VTEwpIHsKIAkJbGluZSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJCWNoYW5fd2luZG93X3NpemUoJmxpbmUtPmNoYW5fbGlzdCwgJnR0eS0+d2luc2l6ZS53c19yb3csCkBAIC03ODIsNDMgKzgwMiw0NCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQordm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJdW5zaWduZWQgbG9uZyBzdGFjaykKIHsKIAlzdHJ1Y3Qgd2luY2ggKndpbmNoOwogCiAJd2luY2ggPSBrbWFsbG9jKHNpemVvZigqd2luY2gpLCBHRlBfS0VSTkVMKTsKIAlpZiAod2luY2ggPT0gTlVMTCkgewogCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGttYWxsb2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJKndpbmNoID0gKChzdHJ1Y3Qgd2luY2gpIHsgLmxpc3QgIAk9IExJU1RfSEVBRF9JTklUKHdpbmNoLT5saXN0KSwKIAkJCQkgICAuZmQgIAk9IGZkLAogCQkJCSAgIC50dHlfZmQgCT0gdHR5X2ZkLAogCQkJCSAgIC5waWQgIAk9IHBpZCwKLQkJCQkgICAudHR5IAk9IHR0eSB9KTsKKwkJCQkgICAudHR5IAk9IHR0eSwKKwkJCQkgICAuc3RhY2sJPSBzdGFjayB9KTsKKworCWlmICh1bV9yZXF1ZXN0X2lycShXSU5DSF9JUlEsIGZkLCBJUlFfUkVBRCwgd2luY2hfaW50ZXJydXB0LAorCQkJICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAorCQkJICAgIndpbmNoIiwgd2luY2gpIDwgMCkgeworCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KIAogCXNwaW5fbG9jaygmd2luY2hfaGFuZGxlcl9sb2NrKTsKIAlsaXN0X2FkZCgmd2luY2gtPmxpc3QsICZ3aW5jaF9oYW5kbGVycyk7CiAJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAKLQlpZih1bV9yZXF1ZXN0X2lycShXSU5DSF9JUlEsIGZkLCBJUlFfUkVBRCwgd2luY2hfaW50ZXJydXB0LAotCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00sCi0JCQkgICJ3aW5jaCIsIHdpbmNoKSA8IDApCi0JCXByaW50aygicmVnaXN0ZXJfd2luY2hfaXJxIC0gZmFpbGVkIHRvIHJlZ2lzdGVyIElSUVxuIik7Ci19CisJcmV0dXJuOwogCi1zdGF0aWMgdm9pZCBmcmVlX3dpbmNoKHN0cnVjdCB3aW5jaCAqd2luY2gpCi17Ci0JbGlzdF9kZWwoJndpbmNoLT5saXN0KTsKLQotCWlmKHdpbmNoLT5waWQgIT0gLTEpCi0JCW9zX2tpbGxfcHJvY2Vzcyh3aW5jaC0+cGlkLCAxKTsKLQlpZih3aW5jaC0+ZmQgIT0gLTEpCi0JCW9zX2Nsb3NlX2ZpbGUod2luY2gtPmZkKTsKLQotCWZyZWVfaXJxKFdJTkNIX0lSUSwgd2luY2gpOworIG91dF9mcmVlOgogCWtmcmVlKHdpbmNoKTsKKyBjbGVhbnVwOgorCW9zX2tpbGxfcHJvY2VzcyhwaWQsIDEpOworCW9zX2Nsb3NlX2ZpbGUoZmQpOworCWlmIChzdGFjayAhPSAwKQorCQlmcmVlX3N0YWNrKHN0YWNrLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93aW5jaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtODMxLDcgKzg1Miw3IEBACiAJbGlzdF9mb3JfZWFjaChlbGUsICZ3aW5jaF9oYW5kbGVycyl7CiAJCXdpbmNoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCB3aW5jaCwgbGlzdCk7CiAgICAgICAgICAgICAgICAgaWYod2luY2gtPnR0eSA9PSB0dHkpewotCQkJZnJlZV93aW5jaCh3aW5jaCk7CisJCQlmcmVlX3dpbmNoKHdpbmNoLCAxKTsKIAkJCWJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODQ3LDcgKzg2OCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUoZWxlLCBuZXh0LCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwotCQlmcmVlX3dpbmNoKHdpbmNoKTsKKwkJZnJlZV93aW5jaCh3aW5jaCwgMSk7CiAJfQogCiAJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYwppbmRleCBkMzE5ZGIxLi4yMzZhM2RmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKIAotCXNpbiA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCXNpbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksIFVNX0dGUF9LRVJORUwpOwogCWlmKHNpbiA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZXdfYWRkcjogYWxsb2NhdGlvbiBvZiBzb2NrYWRkcl9pbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCmluZGV4IDYyZTVhZDYuLmYzMWU3MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwpAQCAtODYsOCArODYsOSBAQAogCWludCBsZW47CiAKIAlyZXEtPm9yaWdpbmxlbiA9IHNpemVvZihyZXEtPm9yaWdpbik7Ci0JcmVxLT5sZW4gPSByZWN2ZnJvbShmZCwgJnJlcS0+cmVxdWVzdCwgc2l6ZW9mKHJlcS0+cmVxdWVzdCksIDAsCi0JCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSByZXEtPm9yaWdpbiwgJnJlcS0+b3JpZ2lubGVuKTsKKwlyZXEtPmxlbiA9IHJlY3Zmcm9tKGZkLCAmcmVxLT5yZXF1ZXN0LCBzaXplb2YocmVxLT5yZXF1ZXN0KSwKKwkJCSAgICBNU0dfRE9OVFdBSVQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgcmVxLT5vcmlnaW4sCisJCQkgICAgJnJlcS0+b3JpZ2lubGVuKTsKIAlpZiAocmVxLT5sZW4gPCAwKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYwppbmRleCAzNTAzY2ZmLi5kYTk0NmUzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJfQogCXBlX2RhdGEuY2xvc2VfbWUgPSBmZHNbMF07CiAJcGVfZGF0YS5zdGRvdXQgPSBmZHNbMV07Ci0JcGlkID0gcnVuX2hlbHBlcihjaGFuZ2VfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2LCBOVUxMKTsKKwlwaWQgPSBydW5faGVscGVyKGNoYW5nZV9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3YpOwogCiAJaWYgKHBpZCA+IDApCS8qIEF2b2lkIGhhbmcgYXMgd2Ugd29uJ3QgZ2V0IGRhdGEgaW4gZmFpbHVyZSBjYXNlLiAqLwogCQlyZWFkX291dHB1dChmZHNbMF0sIG91dHB1dCwgb3V0cHV0X2xlbik7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAkJbmV0bWFza1syXSwgbmV0bWFza1szXSk7CiAKIAlvdXRwdXRfbGVuID0gVU1fS0VSTl9QQUdFX1NJWkU7Ci0Jb3V0cHV0ID0gdW1fa21hbGxvYyhvdXRwdXRfbGVuKTsKKwlvdXRwdXQgPSBrbWFsbG9jKG91dHB1dF9sZW4sIFVNX0dGUF9LRVJORUwpOwogCWlmKG91dHB1dCA9PSBOVUxMKQogCQlwcmludGsoImNoYW5nZSA6IGZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCmluZGV4IDQ4M2FhMTUuLjEzMTY0NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKLQkJcHJpLT5jb21waWxlZCA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ3JhbSkpOworCQlwcmktPmNvbXBpbGVkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJwZl9wcm9ncmFtKSwgVU1fR0ZQX0tFUk5FTCk7CiAJCWlmKHByaS0+Y29tcGlsZWQgPT0gTlVMTCl7CiAJCQlwcmludGsoVU1fS0VSTl9FUlIgInBjYXBfb3BlbiA6IGttYWxsb2MgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCmluZGV4IDNmNjM1N2QuLmM3OTliMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlpZihrZXJuX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gdW1fa21hbGxvYyhzaXplb2YoKmRhdGEpKTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihkYXRhID09IE5VTEwpCiAJCWdvdG8gZXJyOwogCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJeyAuc29ja19mZCAgCQk9IG5ldywKIAkJICAucGlwZV9mZCAJCT0gc29ja2V0WzFdIH0pOwogCi0JZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfc2h1dGRvd247CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wdHkuYyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwppbmRleCBkZjQ5NzZjLi4xZTNmZDYxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3B0eS5jCkBAIC0xLDUgKzEsNSBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIApAQCAtNywxMiArNywxNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IHB0eV9jaGFuIHsKQEAgLTI3LDEyICsyOSwxNCBAQAogewogCXN0cnVjdCBwdHlfY2hhbiAqZGF0YTsKIAotCWRhdGEgPSB1bV9rbWFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmKGRhdGEgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIFVNX0dGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCiAJKmRhdGEgPSAoKHN0cnVjdCBwdHlfY2hhbikgeyAuYW5ub3VuY2UgIAk9IG9wdHMtPmFubm91bmNlLCAKIAkJCQkgICAgIC5kZXYgIAkJPSBkZXZpY2UsCiAJCQkJICAgICAucmF3ICAJCT0gb3B0cy0+cmF3IH0pOwotCXJldHVybihkYXRhKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogc3RhdGljIGludCBwdHNfb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLApAQCAtNDMsMzEgKzQ3LDM1IEBACiAJaW50IGZkLCBlcnI7CiAKIAlmZCA9IGdldF9wdHkoKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoIm9wZW5fcHRzIDogRmFpbGVkIHRvIG9wZW4gcHRzXG4iKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJvcGVuX3B0cyA6IEZhaWxlZCB0byBvcGVuIHB0c1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmKGRhdGEtPnJhdyl7CisKKwlpZiAoZGF0YS0+cmF3KSB7CiAJCUNBVENIX0VJTlRSKGVyciA9IHRjZ2V0YXR0cihmZCwgJmRhdGEtPnR0KSk7Ci0JCWlmKGVycikKLQkJCXJldHVybihlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQllcnIgPSByYXcoZmQpOwotCQlpZihlcnIpCi0JCQlyZXR1cm4oZXJyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJZGV2ID0gcHRzbmFtZShmZCk7CiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOworCiAJaWYgKGRhdGEtPmFubm91bmNlKQogCQkoKmRhdGEtPmFubm91bmNlKShkZXYsIGRhdGEtPmRldik7Ci0JcmV0dXJuKGZkKTsKKworCXJldHVybiBmZDsKIH0KIAogc3RhdGljIGludCBnZXRtYXN0ZXIoY2hhciAqbGluZSkKIHsKKwlzdHJ1Y3Qgc3RhdCBidWY7CiAJY2hhciAqcHR5LCAqYmFuaywgKmNwOwogCWludCBtYXN0ZXIsIGVycjsKIApAQCAtNzUsMjQgKzgzLDI5IEBACiAJZm9yIChiYW5rID0gInBxcnMiOyAqYmFuazsgYmFuaysrKSB7CiAJCWxpbmVbc3RybGVuKCIvZGV2L3B0eSIpXSA9ICpiYW5rOwogCQkqcHR5ID0gJzAnOwotCQlpZiAob3Nfc3RhdF9maWxlKGxpbmUsIE5VTEwpIDwgMCkKKwkJLyogRGlkIHdlIGhpdCB0aGUgZW5kID8gKi8KKwkJaWYgKChzdGF0KGxpbmUsICZidWYpIDwgMCkgJiYgKGVycm5vID09IEVOT0VOVCkpCiAJCQlicmVhazsKKwogCQlmb3IgKGNwID0gIjAxMjM0NTY3ODlhYmNkZWYiOyAqY3A7IGNwKyspIHsKIAkJCSpwdHkgPSAqY3A7Ci0JCQltYXN0ZXIgPSBvc19vcGVuX2ZpbGUobGluZSwgb2ZfcmR3cihPUEVORkxBR1MoKSksIDApOworCQkJbWFzdGVyID0gb3BlbihsaW5lLCBPX1JEV1IpOwogCQkJaWYgKG1hc3RlciA+PSAwKSB7CiAJCQkJY2hhciAqdHAgPSAmbGluZVtzdHJsZW4oIi9kZXYvIildOwogCiAJCQkJLyogdmVyaWZ5IHNsYXZlIHNpZGUgaXMgdXNhYmxlICovCiAJCQkJKnRwID0gJ3QnOwotCQkJCWVyciA9IG9zX2FjY2VzcyhsaW5lLCBPU19BQ0NfUldfT0spOworCQkJCWVyciA9IGFjY2VzcyhsaW5lLCBSX09LIHwgV19PSyk7CiAJCQkJKnRwID0gJ3AnOwotCQkJCWlmKGVyciA9PSAwKSByZXR1cm4obWFzdGVyKTsKLQkJCQkodm9pZCkgb3NfY2xvc2VfZmlsZShtYXN0ZXIpOworCQkJCWlmKCFlcnIpCisJCQkJCXJldHVybiBtYXN0ZXI7CisJCQkJY2xvc2UobWFzdGVyKTsKIAkJCX0KIAkJfQogCX0KLQlyZXR1cm4oLTEpOworCisJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRtYXN0ZXIgLSBubyB1c2FibGUgaG9zdCBwdHkgZGV2aWNlc1xuIik7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIHN0YXRpYyBpbnQgcHR5X29wZW4oaW50IGlucHV0LCBpbnQgb3V0cHV0LCBpbnQgcHJpbWFyeSwgdm9pZCAqZCwKQEAgLTEwMywyMCArMTE2LDIyIEBACiAJY2hhciBkZXZbc2l6ZW9mKCIvZGV2L3B0eXh4XDAiKV0gPSAiL2Rldi9wdHl4eCI7CiAKIAlmZCA9IGdldG1hc3RlcihkZXYpOwotCWlmKGZkIDwgMCkKLQkJcmV0dXJuKC1lcnJubyk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOwogCiAJaWYoZGF0YS0+cmF3KXsKIAkJZXJyID0gcmF3KGZkKTsKLQkJaWYoZXJyKQotCQkJcmV0dXJuKGVycik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAkKLQlpZihkYXRhLT5hbm5vdW5jZSkgKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOworCWlmIChkYXRhLT5hbm5vdW5jZSkKKwkJKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOwogCiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOwotCXJldHVybihmZCk7CisKKwlyZXR1cm4gZmQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBjaGFuX29wcyBwdHlfb3BzID0gewpAQCAtMTQ0LDE0ICsxNTksMyBAQAogCS5mcmVlCQk9IGdlbmVyaWNfZnJlZSwKIAkud2luY2gJCT0gMCwKIH07Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKaW5kZXggNzhmMGU1MS4uYzBiNzNjMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwpAQCAtODUsMTMgKzg1LDEzIEBACiAJcGVfZGF0YS5zdGRpbiA9IGZkOwogCXBlX2RhdGEuc3Rkb3V0ID0gZmRzWzFdOwogCXBlX2RhdGEuY2xvc2VfbWUgPSBmZHNbMF07Ci0JZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2U7CiAJcGlkID0gZXJyOwogCiAJb3V0cHV0X2xlbiA9IFVNX0tFUk5fUEFHRV9TSVpFOwotCW91dHB1dCA9IHVtX2ttYWxsb2Mob3V0cHV0X2xlbik7CisJb3V0cHV0ID0ga21hbGxvYyhvdXRwdXRfbGVuLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCl7CiAJCXByaW50aygic2xpcF90cmFtcCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAkJb3Nfa2lsbF9wcm9jZXNzKHBpZCwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwppbmRleCAzOWY4ODlmLi4wZTQ2MmY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCXBlX2RhdGEuc3RkaW4gPSBmZDsKIAlwZV9kYXRhLnN0ZG91dCA9IGZkOwotCXBpZCA9IHJ1bl9oZWxwZXIoc2xpcnBfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2LCBOVUxMKTsKKwlwaWQgPSBydW5faGVscGVyKHNsaXJwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndik7CiAKIAlyZXR1cm4ocGlkKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYyBiL2FyY2gvdW0vZHJpdmVycy9zc2wuYwppbmRleCBmZDA5YWQ5Li44NzVkNjBkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCkBAIC00Miw4ICs0Miw2IEBACiAJLmFubm91bmNlIAk9IHNzbF9hbm5vdW5jZSwKIAkueHRlcm1fdGl0bGUJPSAiU2VyaWFsIExpbmUgIyVkIiwKIAkucmF3CQk9IDEsCi0JLnRyYW1wX3N0YWNrIAk9IDAsCi0JLmluX2tlcm5lbCAJPSAxLAogfTsKIAogc3RhdGljIGludCBzc2xfY29uZmlnKGNoYXIgKnN0ciwgY2hhciAqKmVycm9yX291dCk7CkBAIC05OSw3ICs5NywxMyBAQAogCiBzdGF0aWMgaW50IHNzbF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXJldHVybiBsaW5lX29wZW4oc2VyaWFsX2xpbmVzLCB0dHkpOworCWludCBlcnIgPSBsaW5lX29wZW4oc2VyaWFsX2xpbmVzLCB0dHkpOworCisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gb3BlbiBzZXJpYWwgbGluZSAlZCwgZXJyID0gJWRcbiIsCisJCSAgICAgICB0dHktPmluZGV4LCBlcnIpOworCisJcmV0dXJuIGVycjsKIH0KIAogI2lmIDAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMgYi9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCmluZGV4IDJiYjQxOTMuLjY1NjAzNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYwpAQCAtNDYsOCArNDYsNiBAQAogCS5hbm5vdW5jZSAJPSBzdGRpb19hbm5vdW5jZSwKIAkueHRlcm1fdGl0bGUJPSAiVmlydHVhbCBDb25zb2xlICMlZCIsCiAJLnJhdwkJPSAxLAotCS50cmFtcF9zdGFjayAJPSAwLAotCS5pbl9rZXJuZWwgCT0gMSwKIH07CiAKIHN0YXRpYyBpbnQgY29uX2NvbmZpZyhjaGFyICpzdHIsIGNoYXIgKiplcnJvcl9vdXQpOwpAQCAtMTAxLDcgKzk5LDEyIEBACiAKIHN0YXRpYyBpbnQgY29uX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JcmV0dXJuIGxpbmVfb3Blbih2dHMsIHR0eSk7CisJaW50IGVyciA9IGxpbmVfb3Blbih2dHMsIHR0eSk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gb3BlbiBjb25zb2xlICVkLCBlcnIgPSAlZFxuIiwKKwkJICAgICAgIHR0eS0+aW5kZXgsIGVycik7CisKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBTZXQgaW4gYW4gaW5pdGNhbGwsIGNoZWNrZWQgaW4gYW4gZXhpdGNhbGwgKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy90dHkuYyBiL2FyY2gvdW0vZHJpdmVycy90dHkuYwppbmRleCBjMDdkMGQ1Li5hOWY4N2UxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3R0eS5jCkBAIC0yOSw3ICsyOSw3IEBACiAJfQogCXN0cisrOwogCi0JZGF0YSA9IHVtX2ttYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAkqZGF0YSA9ICgoc3RydWN0IHR0eV9jaGFuKSB7IC5kZXYgCT0gc3RyLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwppbmRleCAyZTA5ZjE2Li5mYzI3ZjZjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwpAQCAtNzEyLDYgKzcxMiw4IEBACiAJdWJkX2Rldi0+cXVldWUtPnF1ZXVlZGF0YSA9IHViZF9kZXY7CiAKIAlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHViZF9kZXYtPnF1ZXVlLCBNQVhfU0cpOworCWlmKHViZF9kZXYtPmNvdy5maWxlICE9IE5VTEwpCisJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyh1YmRfZGV2LT5xdWV1ZSwgOCAqIHNpemVvZihsb25nKSk7CiAJZXJyID0gdWJkX2Rpc2tfcmVnaXN0ZXIoTUFKT1JfTlIsIHViZF9kZXYtPnNpemUsIG4sICZ1YmRfZ2VuZGlza1tuXSk7CiAJaWYoZXJyKXsKIAkJKmVycm9yX291dCA9ICJGYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIjsKQEAgLTEwODMsNyArMTA4NSw3IEBACiB7CiAJc3RydWN0IGlvX3RocmVhZF9yZXEgKmlvX3JlcTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwotCWludCBuOworCWludCBuLCBsYXN0X3NlY3RvcnM7CiAKIAl3aGlsZSgxKXsKIAkJc3RydWN0IHViZCAqZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMTA5OSw5ICsxMTAxLDExIEBACiAJCX0KIAogCQlyZXEgPSBkZXYtPnJlcXVlc3Q7CisJCWxhc3Rfc2VjdG9ycyA9IDA7CiAJCXdoaWxlKGRldi0+c3RhcnRfc2cgPCBkZXYtPmVuZF9zZyl7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJmRldi0+c2dbZGV2LT5zdGFydF9zZ107CiAKKwkJCXJlcS0+c2VjdG9yICs9IGxhc3Rfc2VjdG9yczsKIAkJCWlvX3JlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxKSwKIAkJCQkJIEdGUF9BVE9NSUMpOwogCQkJaWYoaW9fcmVxID09IE5VTEwpewpAQCAtMTExMyw2ICsxMTE3LDcgQEAKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVxLT5zZWN0b3IgPDwgOSwKIAkJCQkJc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwgc2ctPnBhZ2UpOwogCisJCQlsYXN0X3NlY3RvcnMgPSBzZy0+bGVuZ3RoID4+IDk7CiAJCQluID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZpb19yZXEsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxICopKTsKIAkJCWlmKG4gIT0gc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxICopKXsKQEAgLTExMjQsNyArMTEyOSw2IEBACiAJCQkJcmV0dXJuOwogCQkJfQogCi0JCQlyZXEtPnNlY3RvciArPSBzZy0+bGVuZ3RoID4+IDk7CiAJCQlkZXYtPnN0YXJ0X3NnKys7CiAJCX0KIAkJZGV2LT5lbmRfc2cgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYwppbmRleCA0NzA3YjNmLi40MWQyNTRiIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYwpAQCAtNDMsNiArNDMsMTIgQEAKIAlrZXJuZWxfZmQgPSBmZHNbMF07CiAJKmZkX291dCA9IGZkc1sxXTsKIAorCWVyciA9IG9zX3NldF9mZF9ibG9jaygqZmRfb3V0LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50aygic3RhcnRfaW9fdGhyZWFkIC0gZmFpbGVkIHRvIHNldCBub25ibG9ja2luZyBJL08uXG4iKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCiAJcGlkID0gY2xvbmUoaW9fdGhyZWFkLCAodm9pZCAqKSBzcCwgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsCiAJCSAgICBOVUxMKTsKIAlpZihwaWQgPCAwKXsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKaW5kZXggNTcxYzJiMy4uZmQ4MTdlNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKQEAgLTEsMjIgKzEsMjAgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ4dGVybS5oIgorI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAKIHN0cnVjdCB4dGVybV9jaGFuIHsKIAlpbnQgcGlkOwpAQCAtMjUsMjUgKzIzLDIxIEBACiAJaW50IGRldmljZTsKIAlpbnQgcmF3OwogCXN0cnVjdCB0ZXJtaW9zIHR0OwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7Ci0JaW50IGRpcmVjdF9yY3Y7CiB9OwogCi0vKiBOb3Qgc3RhdGljIGJlY2F1c2UgaXQncyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIHR0IG1vZGUgZ2RiIGNvZGUgKi8KLXZvaWQgKnh0ZXJtX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQorc3RhdGljIHZvaWQgKnh0ZXJtX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQogewogCXN0cnVjdCB4dGVybV9jaGFuICpkYXRhOwogCiAJZGF0YSA9IG1hbGxvYyhzaXplb2YoKmRhdGEpKTsKLQlpZihkYXRhID09IE5VTEwpIHJldHVybihOVUxMKTsKLQkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX2NoYW4pIHsgLnBpZCAJCT0gLTEsIAorCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fY2hhbikgeyAucGlkIAkJPSAtMSwKIAkJCQkgICAgICAgLmhlbHBlcl9waWQgCT0gLTEsCi0JCQkJICAgICAgIC5kZXZpY2UgCQk9IGRldmljZSwgCisJCQkJICAgICAgIC5kZXZpY2UgCQk9IGRldmljZSwKIAkJCQkgICAgICAgLnRpdGxlIAkJPSBvcHRzLT54dGVybV90aXRsZSwKLQkJCQkgICAgICAgLnJhdyAgCQk9IG9wdHMtPnJhdywKLQkJCQkgICAgICAgLnN0YWNrIAkJPSBvcHRzLT50cmFtcF9zdGFjaywKLQkJCQkgICAgICAgLmRpcmVjdF9yY3YgCT0gIW9wdHMtPmluX2tlcm5lbCB9ICk7Ci0JcmV0dXJuKGRhdGEpOworCQkJCSAgICAgICAucmF3ICAJCT0gb3B0cy0+cmF3IH0gKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogLyogT25seSBjaGFuZ2VkIGJ5IHh0ZXJtX3NldHVwLCB3aGljaCBpcyBhIHNldHVwICovCkBAIC01NywxNiArNTEsMjIgQEAKIAl0ZXJtaW5hbF9lbXVsYXRvciA9IGxpbmU7CiAKIAlsaW5lID0gc3RyY2hyKGxpbmUsICcsJyk7Ci0JaWYobGluZSA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKIAkqbGluZSsrID0gJ1wwJzsKLQlpZigqbGluZSkgdGl0bGVfc3dpdGNoID0gbGluZTsKKwlpZiAoKmxpbmUpCisJCXRpdGxlX3N3aXRjaCA9IGxpbmU7CiAKIAlsaW5lID0gc3RyY2hyKGxpbmUsICcsJyk7Ci0JaWYobGluZSA9PSBOVUxMKSByZXR1cm4oMCk7Ci0JKmxpbmUrKyA9ICdcMCc7Ci0JaWYoKmxpbmUpIGV4ZWNfc3dpdGNoID0gbGluZTsKKwlpZiAobGluZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAotCXJldHVybigwKTsKKwkqbGluZSsrID0gJ1wwJzsKKwlpZiAoKmxpbmUpCisJCWV4ZWNfc3dpdGNoID0gbGluZTsKKworCXJldHVybiAwOwogfQogCiBfX3VtbF9zZXR1cCgieHRlcm09IiwgeHRlcm1fc2V0dXAsCkBAIC04MiwxMDcgKzgyLDEyOCBAQAogIiAgICBhcmUgJ3h0ZXJtPWdub21lLXRlcm1pbmFsLC10LC14Jy5cblxuIgogKTsKIAotLyogWFhYIFRoaXMgYmFkbHkgbmVlZHMgc29tZSBjbGVhbmluZyB1cCBpbiB0aGUgZXJyb3IgcGF0aHMKLSAqIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZQotICovCi1pbnQgeHRlcm1fb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLAorc3RhdGljIGludCB4dGVybV9vcGVuKGludCBpbnB1dCwgaW50IG91dHB1dCwgaW50IHByaW1hcnksIHZvaWQgKmQsCiAJCSAgICAgIGNoYXIgKipkZXZfb3V0KQogewogCXN0cnVjdCB4dGVybV9jaGFuICpkYXRhID0gZDsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwogCWludCBwaWQsIGZkLCBuZXcsIGVycjsKIAljaGFyIHRpdGxlWzI1Nl0sIGZpbGVbXSA9ICIvdG1wL3h0ZXJtLXBpcGVYWFhYWFgiOwotCWNoYXIgKmFyZ3ZbXSA9IHsgdGVybWluYWxfZW11bGF0b3IsIHRpdGxlX3N3aXRjaCwgdGl0bGUsIGV4ZWNfc3dpdGNoLCAKKwljaGFyICphcmd2W10gPSB7IHRlcm1pbmFsX2VtdWxhdG9yLCB0aXRsZV9zd2l0Y2gsIHRpdGxlLCBleGVjX3N3aXRjaCwKIAkJCSAiL3Vzci9saWIvdW1sL3BvcnQtaGVscGVyIiwgIi11bWwtc29ja2V0IiwKIAkJCSBmaWxlLCBOVUxMIH07CiAKLQlpZihvc19hY2Nlc3MoYXJndls0XSwgT1NfQUNDX1hfT0spIDwgMCkKKwlpZiAoYWNjZXNzKGFyZ3ZbNF0sIFhfT0spIDwgMCkKIAkJYXJndls0XSA9ICJwb3J0LWhlbHBlciI7CiAKIAkvKiBDaGVjayB0aGF0IERJU1BMQVkgaXMgc2V0LCB0aGlzIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSB4dGVybQogCSAqIHdpbGwgd29yayBidXQgdy9vIGl0IHdlIGNhbiBiZSBwcmV0dHkgc3VyZSBpdCB3b24ndC4gKi8KLQlpZiAoIWdldGVudigiRElTUExBWSIpKSB7Ci0JCXByaW50aygieHRlcm1fb3BlbjogJERJU1BMQVkgbm90IHNldC5cbiIpOworCWlmIChnZXRlbnYoIkRJU1BMQVkiKSA9PSBOVUxMKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbjogJERJU1BMQVkgbm90IHNldC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwkvKgorCSAqIFRoaXMgYnVzaW5lc3Mgb2YgZ2V0dGluZyBhIGRlc2NyaXB0b3IgdG8gYSB0ZW1wIGZpbGUsCisJICogZGVsZXRpbmcgdGhlIGZpbGUgYW5kIGNsb3NpbmcgdGhlIGRlc2NyaXB0b3IgaXMganVzdCB0byBnZXQKKwkgKiBhIGtub3duLXVudXNlZCBuYW1lIGZvciB0aGUgVW5peCBzb2NrZXQgdGhhdCB3ZSByZWFsbHkKKwkgKiB3YW50LgorCSAqLwogCWZkID0gbWtzdGVtcChmaWxlKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoInh0ZXJtX29wZW4gOiBta3N0ZW1wIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBta3N0ZW1wIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKwkJICAgICAgIGVycm5vKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZih1bmxpbmsoZmlsZSkpeworCWlmICh1bmxpbmsoZmlsZSkpIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoInh0ZXJtX29wZW4gOiB1bmxpbmsgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IHVubGluayBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCSAgICAgICBlcnJubyk7CiAJCXJldHVybiBlcnI7CiAJfQotCW9zX2Nsb3NlX2ZpbGUoZmQpOworCWNsb3NlKGZkKTsKIAogCWZkID0gb3NfY3JlYXRlX3VuaXhfc29ja2V0KGZpbGUsIHNpemVvZihmaWxlKSwgMSk7Ci0JaWYoZmQgPCAwKXsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogY3JlYXRlX3VuaXhfc29ja2V0IGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgCi0JCSAgICAgICAtZmQpOwotCQlyZXR1cm4oZmQpOworCWlmIChmZCA8IDApIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogY3JlYXRlX3VuaXhfc29ja2V0IGZhaWxlZCwgIgorCQkgICAgICAgImVycm5vID0gJWRcbiIsIC1mZCk7CisJCXJldHVybiBmZDsKIAl9CiAKIAlzcHJpbnRmKHRpdGxlLCBkYXRhLT50aXRsZSwgZGF0YS0+ZGV2aWNlKTsKLQlzdGFjayA9IGRhdGEtPnN0YWNrOwotCXBpZCA9IHJ1bl9oZWxwZXIoTlVMTCwgTlVMTCwgYXJndiwgJnN0YWNrKTsKLQlpZihwaWQgPCAwKXsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogcnVuX2hlbHBlciBmYWlsZWQsIGVycm5vID0gJWRcbiIsIC1waWQpOwotCQlyZXR1cm4ocGlkKTsKKwlwaWQgPSBydW5faGVscGVyKE5VTEwsIE5VTEwsIGFyZ3YpOworCWlmIChwaWQgPCAwKSB7CisJCWVyciA9IHBpZDsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogcnVuX2hlbHBlciBmYWlsZWQsICIKKwkJICAgICAgICJlcnJubyA9ICVkXG4iLCAtZXJyKTsKKwkJZ290byBvdXRfY2xvc2UxOwogCX0KIAotCWlmIChkYXRhLT5kaXJlY3RfcmN2KSB7Ci0JCW5ldyA9IG9zX3Jjdl9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOwotCX0gZWxzZSB7Ci0JCWVyciA9IG9zX3NldF9mZF9ibG9jayhmZCwgMCk7Ci0JCWlmKGVyciA8IDApewotCQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogZmFpbGVkIHRvIHNldCBkZXNjcmlwdG9yICIKLQkJCSAgICAgICAibm9uLWJsb2NraW5nLCBlcnIgPSAlZFxuIiwgLWVycik7Ci0JCQlyZXR1cm4oZXJyKTsKLQkJfQotCQluZXcgPSB4dGVybV9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOworCWVyciA9IG9zX3NldF9mZF9ibG9jayhmZCwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogZmFpbGVkIHRvIHNldCBkZXNjcmlwdG9yICIKKwkJICAgICAgICJub24tYmxvY2tpbmcsIGVyciA9ICVkXG4iLCAtZXJyKTsKKwkJZ290byBvdXRfa2lsbDsKIAl9Ci0JaWYobmV3IDwgMCl7Ci0JCXByaW50aygieHRlcm1fb3BlbiA6IG9zX3Jjdl9mZCBmYWlsZWQsIGVyciA9ICVkXG4iLCAtbmV3KTsKLQkJZ290byBvdXQ7CisKKwluZXcgPSB4dGVybV9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOworCWlmIChuZXcgPCAwKSB7CisJCWVyciA9IG5ldzsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogb3NfcmN2X2ZkIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCSAgICAgICAtZXJyKTsKKwkJZ290byBvdXRfa2lsbDsKKwl9CisKKwllcnIgPSBvc19zZXRfZmRfYmxvY2sobmV3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IGZhaWxlZCB0byBzZXQgeHRlcm0gIgorCQkgICAgICAgImRlc2NyaXB0b3Igbm9uLWJsb2NraW5nLCBlcnIgPSAlZFxuIiwgLWVycik7CisJCWdvdG8gb3V0X2Nsb3NlMjsKIAl9CiAKIAlDQVRDSF9FSU5UUihlcnIgPSB0Y2dldGF0dHIobmV3LCAmZGF0YS0+dHQpKTsKLQlpZihlcnIpeworCWlmIChlcnIpIHsKIAkJbmV3ID0gZXJyOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfY2xvc2UyOwogCX0KIAotCWlmKGRhdGEtPnJhdyl7CisJaWYgKGRhdGEtPnJhdykgewogCQllcnIgPSByYXcobmV3KTsKLQkJaWYoZXJyKXsKKwkJaWYgKGVycikgewogCQkJbmV3ID0gZXJyOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9jbG9zZTI7CiAJCX0KIAl9CiAKKwl1bmxpbmsoZmlsZSk7CiAJZGF0YS0+cGlkID0gcGlkOwogCSpkZXZfb3V0ID0gTlVMTDsKLSBvdXQ6Ci0JdW5saW5rKGZpbGUpOwotCXJldHVybihuZXcpOworCisJcmV0dXJuIG5ldzsKKworIG91dF9jbG9zZTI6CisJY2xvc2UobmV3KTsKKyBvdXRfa2lsbDoKKwlvc19raWxsX3Byb2Nlc3MocGlkLCAxKTsKKyBvdXRfY2xvc2UxOgorCWNsb3NlKGZkKTsKKworCXJldHVybiBlcnI7CiB9CiAKLS8qIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZSAqLwotdm9pZCB4dGVybV9jbG9zZShpbnQgZmQsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCB4dGVybV9jbG9zZShpbnQgZmQsIHZvaWQgKmQpCiB7CiAJc3RydWN0IHh0ZXJtX2NoYW4gKmRhdGEgPSBkOwogCQotCWlmKGRhdGEtPnBpZCAhPSAtMSkgCisJaWYgKGRhdGEtPnBpZCAhPSAtMSkKIAkJb3Nfa2lsbF9wcm9jZXNzKGRhdGEtPnBpZCwgMSk7CiAJZGF0YS0+cGlkID0gLTE7Ci0JaWYoZGF0YS0+aGVscGVyX3BpZCAhPSAtMSkgCisKKwlpZiAoZGF0YS0+aGVscGVyX3BpZCAhPSAtMSkKIAkJb3Nfa2lsbF9wcm9jZXNzKGRhdGEtPmhlbHBlcl9waWQsIDApOwogCWRhdGEtPmhlbHBlcl9waWQgPSAtMTsKKwogCW9zX2Nsb3NlX2ZpbGUoZmQpOwogfQogCkBAIC0yMDMsMTQgKzIyNCwzIEBACiAJLmZyZWUJCT0geHRlcm1fZnJlZSwKIAkud2luY2gJCT0gMSwKIH07Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtX2tlcm4uYwppbmRleCBhNGNlNzA1Li5iNjQ2YmNjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy94dGVybV9rZXJuLmMKQEAgLTEsMTggKzEsMTQgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlICJsaW51eC9lcnJuby5oIgotI2luY2x1ZGUgImxpbnV4L3NsYWIuaCIKLSNpbmNsdWRlICJsaW51eC9zaWduYWwuaCIKLSNpbmNsdWRlICJsaW51eC9pbnRlcnJ1cHQuaCIKLSNpbmNsdWRlICJhc20vaXJxLmgiCi0jaW5jbHVkZSAiaXJxX3VzZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlICJpcnFfa2Vybi5oIgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCi0jaW5jbHVkZSAieHRlcm0uaCIKIAogc3RydWN0IHh0ZXJtX3dhaXQgewogCXN0cnVjdCBjb21wbGV0aW9uIHJlYWR5OwpAQCAtMjcsMTIgKzIzLDEzIEBACiAJaW50IGZkOwogCiAJZmQgPSBvc19yY3ZfZmQoeHRlcm0tPmZkLCAmeHRlcm0tPnBpZCk7Ci0JaWYoZmQgPT0gLUVBR0FJTikKLQkJcmV0dXJuKElSUV9OT05FKTsKKwlpZiAoZmQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIElSUV9OT05FOwogCiAJeHRlcm0tPm5ld19mZCA9IGZkOwogCWNvbXBsZXRlKCZ4dGVybS0+cmVhZHkpOwotCXJldHVybihJUlFfSEFORExFRCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIGludCB4dGVybV9mZChpbnQgc29ja2V0LCBpbnQgKnBpZF9vdXQpCkBAIC00MSwyMiArMzgsMjEgQEAKIAlpbnQgZXJyLCByZXQ7CiAKIAlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZihkYXRhID09IE5VTEwpeworCWlmIChkYXRhID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ4dGVybV9mZCA6IGZhaWxlZCB0byBhbGxvY2F0ZSB4dGVybV93YWl0XG4iKTsKLQkJcmV0dXJuKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAkvKiBUaGlzIGlzIGEgbG9ja2VkIHNlbWFwaG9yZS4uLiAqLwotCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fd2FpdCkgCi0JCXsgLmZkIAkJPSBzb2NrZXQsCi0JCSAgLnBpZCAJCT0gLTEsCi0JCSAgLm5ld19mZCAJPSAtMSB9KTsKKwkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX3dhaXQpIHsgLmZkIAkJPSBzb2NrZXQsCisJCQkJICAgICAgIC5waWQgCQk9IC0xLAorCQkJCSAgICAgICAubmV3X2ZkCSAJPSAtMSB9KTsKIAlpbml0X2NvbXBsZXRpb24oJmRhdGEtPnJlYWR5KTsKIAotCWVyciA9IHVtX3JlcXVlc3RfaXJxKFhURVJNX0lSUSwgc29ja2V0LCBJUlFfUkVBRCwgeHRlcm1faW50ZXJydXB0LCAKKwllcnIgPSB1bV9yZXF1ZXN0X2lycShYVEVSTV9JUlEsIHNvY2tldCwgSVJRX1JFQUQsIHh0ZXJtX2ludGVycnVwdCwKIAkJCSAgICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAogCQkJICAgICAieHRlcm0iLCBkYXRhKTsKLQlpZiAoZXJyKXsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieHRlcm1fZmQgOiBmYWlsZWQgdG8gZ2V0IElSUSBmb3IgeHRlcm0sICIKIAkJICAgICAgICJlcnIgPSAlZFxuIiwgIGVycik7CiAJCXJldCA9IGVycjsKQEAgLTc2LDE2ICs3Miw1IEBACiAgb3V0OgogCWtmcmVlKGRhdGEpOwogCi0JcmV0dXJuKHJldCk7CisJcmV0dXJuIHJldDsKIH0KLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaAppbmRleCBjNGI0MWJiLi42MjRiNTEwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oCkBAIC00MCw3ICs0MCw3IEBACiBleHRlcm4gdm9pZCBkZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgcmVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIGNoYW5fZW5hYmxlX3dpbmNoKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLWV4dGVybiB2b2lkIGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKTsKK2V4dGVybiBpbnQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOwogZXh0ZXJuIHZvaWQgY2xvc2VfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGRlbGF5X2ZyZWVfaXJxKTsKIGV4dGVybiBpbnQgY2hhbl93aW5kb3dfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgCiAJCQkgICAgIHVuc2lnbmVkIHNob3J0ICpyb3dzX291dCwgCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmgKaW5kZXggMzhmMTZkOC4uNWEyMjYzZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX3VzZXIuaApAQCAtMTIsOCArMTIsNiBAQAogCXZvaWQgKCpjb25zdCBhbm5vdW5jZSkoY2hhciAqZGV2X25hbWUsIGludCBkZXYpOwogCWNoYXIgKnh0ZXJtX3RpdGxlOwogCWNvbnN0IGludCByYXc7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyB0cmFtcF9zdGFjazsKLQljb25zdCBpbnQgaW5fa2VybmVsOwogfTsKIAogZW51bSBjaGFuX2luaXRfcHJpIHsgSU5JVF9TVEFUSUMsIElOSVRfQUxMLCBJTklUX09ORSB9OwpAQCAtNDQsNyArNDIsOCBAQAogCiBzdHJ1Y3QgdHR5X3N0cnVjdDsKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX3dpbmNoKGludCBmZCwgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLAorCQkJICAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGxvbmcgc3RhY2spOwogCiAjZGVmaW5lIF9fY2hhbm5lbF9oZWxwKGZuLCBwcmVmaXgpIFwKIF9fdW1sX2hlbHAoZm4sIHByZWZpeCAiWzAtOV0qPTxjaGFubmVsIGRlc2NyaXB0aW9uPlxuIiBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCmluZGV4IDczNzZlZTQuLjZlZWUzNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCkBAIC0yNyw2ICsyNyw5IEBACiAKIERFRklORShVTV9OUl9DUFVTLCBOUl9DUFVTKTsKIAorREVGSU5FKFVNX0dGUF9LRVJORUwsIEdGUF9LRVJORUwpOworREVGSU5FKFVNX0dGUF9BVE9NSUMsIEdGUF9BVE9NSUMpOworCiAvKiBGb3IgY3J5cHRvIGFzc2VtYmxlciBjb2RlLiAqLwogREVGSU5FKGNyeXB0b190Zm1fY3R4X29mZnNldCwgb2Zmc2V0b2Yoc3RydWN0IGNyeXB0b190Zm0sIF9fY3J0X2N0eCkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCmluZGV4IDRkOWZiMjYuLjkzMGIyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCkBAIC0yMzksMTEgKzIzOSw5IEBACiAvKiBleGVjdnAuYyAqLwogZXh0ZXJuIGludCBleGVjdnBfbm9hbGxvYyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSk7CiAvKiBoZWxwZXIuYyAqLwotZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2LAotCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOworZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2KTsKIGV4dGVybiBpbnQgcnVuX2hlbHBlcl90aHJlYWQoaW50ICgqcHJvYykodm9pZCAqKSwgdm9pZCAqYXJnLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCwKLQkJCSAgICAgaW50IHN0YWNrX29yZGVyKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOwogZXh0ZXJuIGludCBoZWxwZXJfd2FpdChpbnQgcGlkKTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmggYi9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmgKaW5kZXggZTZkN2M1YS4uMGFkMTdjYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91bV9tYWxsb2MuaApAQCAtNiwxMSArNiwxNyBAQAogI2lmbmRlZiBfX1VNX01BTExPQ19IX18KICNkZWZpbmUgX19VTV9NQUxMT0NfSF9fCiAKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKTsKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jX2F0b21pYyhpbnQgc2l6ZSk7CisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKKworZXh0ZXJuIHZvaWQgKl9fa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCiBleHRlcm4gdm9pZCBrZnJlZShjb25zdCB2b2lkICpwdHIpOwogCi1leHRlcm4gdm9pZCAqdW1fdm1hbGxvYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAqdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgdmZyZWUodm9pZCAqcHRyKTsKIAogI2VuZGlmIC8qIF9fVU1fTUFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxLmMgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwppbmRleCBkYmEwNGQ4Li45ODcwZmViIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgImlycV9rZXJuLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzaWdpby5oIgotI2luY2x1ZGUgInVtX21hbGxvYy5oIgogI2luY2x1ZGUgIm1pc2NfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwppbmRleCA4ZDJjNTQ5Li5iZmE1MmYyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAibW9kZS5oIgogI2luY2x1ZGUgIm1vZGVfa2Vybi5oIgogI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCi0jaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIC8qIFRoaXMgaXMgYSBwZXItY3B1IGFycmF5LiAgQSBwcm9jZXNzb3Igb25seSBtb2RpZmllcyBpdHMgZW50cnkgYW5kIGl0IG9ubHkKICAqIGNhcmVzIGFib3V0IGl0cyBlbnRyeSwgc28gaXQncyBPSyBpZiBhbm90aGVyIHByb2Nlc3NvciBpcyBtb2RpZnlpbmcgaXRzCkBAIC0yNjIsMjEgKzI2MSw2IEBACiB7CiB9CiAKLXZvaWQgKnVtX2ttYWxsb2MoaW50IHNpemUpCi17Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci19Ci0KLXZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKQotewotCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotfQotCi12b2lkICp1bV92bWFsbG9jKGludCBzaXplKQotewotCXJldHVybiB2bWFsbG9jKHNpemUpOwotfQotCiBpbnQgX19jYW50X3NsZWVwKHZvaWQpIHsKIAlyZXR1cm4gaW5fYXRvbWljKCkgfHwgaXJxc19kaXNhYmxlZCgpIHx8IGluX2ludGVycnVwdCgpOwogCS8qIElzIGluX2ludGVycnVwdCgpIHJlYWxseSBuZWVkZWQ/ICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCmluZGV4IDYyNzc0MmQuLjY5MTZjODggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCkBAIC01MiwxNyArNTIsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQlyZXQgPSAtRUlPOwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgcCk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAgICAgICAgIGNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC03MiwxMSArNjQsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAtRUlPOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIAotCQkJCSAgICAgIDEpICE9IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAwOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwppbmRleCA5YmY5NDRmLi5iMTI2ZGY0IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKQEAgLTE3Nyw2ICsxNzcsNyBAQAogc3RhdGljIGludCBhaW9fcmVxX2ZkX3IgPSAtMTsKIHN0YXRpYyBpbnQgYWlvX3JlcV9mZF93ID0gLTE7CiBzdGF0aWMgaW50IGFpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFpb19zdGFjazsKIAogc3RhdGljIGludCBub3RfYWlvX3RocmVhZCh2b2lkICphcmcpCiB7CkBAIC0yMTIsNyArMjEzLDYgQEAKIAogc3RhdGljIGludCBpbml0X2Fpb18yNCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IGZkc1syXSwgZXJyOwogCiAJZXJyID0gb3NfcGlwZShmZHMsIDEsIDEpOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCWdvdG8gb3V0X2Nsb3NlX3BpcGU7CiAKIAllcnIgPSBydW5faGVscGVyX3RocmVhZChub3RfYWlvX3RocmVhZCwgTlVMTCwKLQkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJnN0YWNrLCAwKTsKKwkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJmFpb19zdGFjayk7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2VfcGlwZTsKIApAQCAtMjUyLDcgKzI1Miw2IEBACiAjZGVmaW5lIERFRkFVTFRfMjRfQUlPIDAKIHN0YXRpYyBpbnQgaW5pdF9haW9fMjYodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwogCWludCBlcnI7CiAKIAlpZihpb19zZXR1cCgyNTYsICZjdHgpKXsKQEAgLTI2Myw3ICsyNjIsNyBAQAogCX0KIAogCWVyciA9IHJ1bl9oZWxwZXJfdGhyZWFkKGFpb190aHJlYWQsIE5VTEwsCi0JCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZzdGFjaywgMCk7CisJCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZhaW9fc3RhY2spOwogCWlmKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTM2NSw4ICszNjQsMTAgQEAKIAogc3RhdGljIHZvaWQgZXhpdF9haW8odm9pZCkKIHsKLQlpZihhaW9fcGlkICE9IC0xKQorCWlmIChhaW9fcGlkICE9IC0xKSB7CiAJCW9zX2tpbGxfcHJvY2VzcyhhaW9fcGlkLCAxKTsKKwkJZnJlZV9zdGFjayhhaW9fc3RhY2ssIDApOworCX0KIH0KIAogX191bWxfZXhpdGNhbGwoZXhpdF9haW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKaW5kZXggYWNiYTMwMS4uNjFkMzk1MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCkBAIC01NCw3ICs1NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFKTsKKwlvdXRwdXQgPSBrbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCkKIAkJcHJpbnRrKCJldGFwX2NoYW5nZSA6IEZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAlyZWFkX291dHB1dChmZCwgb3V0cHV0LCBVTV9LRVJOX1BBR0VfU0laRSk7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlwZV9kYXRhLmNvbnRyb2xfcmVtb3RlID0gY29udHJvbF9yZW1vdGU7CiAJcGVfZGF0YS5jb250cm9sX21lID0gY29udHJvbF9tZTsKIAlwZV9kYXRhLmRhdGFfbWUgPSBkYXRhX21lOwotCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MpOwogCiAJaWYocGlkIDwgMCkKIAkJZXJyID0gcGlkOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJZXJyID0gZXRhcF90cmFtcChwcmktPmRldl9uYW1lLCBwcmktPmdhdGVfYWRkciwgY29udHJvbF9mZHNbMF0sIAogCQkJIGNvbnRyb2xfZmRzWzFdLCBkYXRhX2Zkc1swXSwgZGF0YV9mZHNbMV0pOwogCW91dHB1dF9sZW4gPSBVTV9LRVJOX1BBR0VfU0laRTsKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKG91dHB1dF9sZW4pOworCW91dHB1dCA9IGttYWxsb2Mob3V0cHV0X2xlbiwgVU1fR0ZQX0tFUk5FTCk7CiAJcmVhZF9vdXRwdXQoY29udHJvbF9mZHNbMF0sIG91dHB1dCwgb3V0cHV0X2xlbik7CiAKIAlpZihvdXRwdXQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKaW5kZXggMTFhOTc3OS4uZjg0OGI0ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlkYXRhLnN0ZG91dCA9IHJlbW90ZTsKIAlkYXRhLmNsb3NlX21lID0gbWU7CiAKLQlwaWQgPSBydW5faGVscGVyKHR1bnRhcF9wcmVfZXhlYywgJmRhdGEsIGFyZ3YsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIodHVudGFwX3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAKIAlpZihwaWQgPCAwKQogCQlyZXR1cm4gLXBpZDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCmluZGV4IDk3YmVkMTYuLmQ4MWFmN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYwpAQCAtNDQsMTcgKzQ0LDEzIEBACiAvKiBSZXR1cm5zIGVpdGhlciB0aGUgcGlkIG9mIHRoZSBjaGlsZCBwcm9jZXNzIHdlIHJ1biBvciAtRSogb24gZmFpbHVyZS4KICAqIFhYWCBUaGUgYWxsb2Nfc3RhY2sgaGVyZSBicmVha3MgaWYgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIHRyYWNpbmcgdGhyZWFkLCBzbwogICogd2UgbmVlZCB0byByZWNlaXZlIGEgcHJlYWxsb2NhdGVkIHN0YWNrIChhIGxvY2FsIGJ1ZmZlciBpcyBvaykuICovCi1pbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndiwKLQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQoraW50IHJ1bl9oZWxwZXIodm9pZCAoKnByZV9leGVjKSh2b2lkICopLCB2b2lkICpwcmVfZGF0YSwgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IGhlbHBlcl9kYXRhIGRhdGE7CiAJdW5zaWduZWQgbG9uZyBzdGFjaywgc3A7CiAJaW50IHBpZCwgZmRzWzJdLCByZXQsIG47CiAKLQlpZiAoKHN0YWNrX291dCAhPSBOVUxMKSAmJiAoKnN0YWNrX291dCAhPSAwKSkKLQkJc3RhY2sgPSAqc3RhY2tfb3V0OwotCWVsc2UKLQkJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CisJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CiAJaWYgKHN0YWNrID09IDApCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC03Niw4ICs3Miw4IEBACiAJZGF0YS5wcmVfZGF0YSA9IHByZV9kYXRhOwogCWRhdGEuYXJndiA9IGFyZ3Y7CiAJZGF0YS5mZCA9IGZkc1sxXTsKLQlkYXRhLmJ1ZiA9IF9fY2FudF9zbGVlcCgpID8gdW1fa21hbGxvY19hdG9taWMoUEFUSF9NQVgpIDoKLQkJCQkJdW1fa21hbGxvYyhQQVRIX01BWCk7CisJZGF0YS5idWYgPSBfX2NhbnRfc2xlZXAoKSA/IGttYWxsb2MoUEFUSF9NQVgsIFVNX0dGUF9BVE9NSUMpIDoKKwkJCQkJa21hbGxvYyhQQVRIX01BWCwgVU1fR0ZQX0tFUk5FTCk7CiAJcGlkID0gY2xvbmUoaGVscGVyX2NoaWxkLCAodm9pZCAqKSBzcCwgQ0xPTkVfVk0gfCBTSUdDSExELCAmZGF0YSk7CiAJaWYgKHBpZCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwpAQCAtMTEzLDIyICsxMDksMjEgQEAKIAkJY2xvc2UoZmRzWzFdKTsKIAljbG9zZShmZHNbMF0pOwogb3V0X2ZyZWU6Ci0JaWYgKChzdGFja19vdXQgPT0gTlVMTCkgfHwgKCpzdGFja19vdXQgPT0gMCkpCi0JCWZyZWVfc3RhY2soc3RhY2ssIDApOworCWZyZWVfc3RhY2soc3RhY2ssIDApOwogCXJldHVybiByZXQ7CiB9CiAKIGludCBydW5faGVscGVyX3RocmVhZChpbnQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGludCBmbGFncywKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0LCBpbnQgc3RhY2tfb3JkZXIpCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCkKIHsKIAl1bnNpZ25lZCBsb25nIHN0YWNrLCBzcDsKIAlpbnQgcGlkLCBzdGF0dXMsIGVycjsKIAotCXN0YWNrID0gYWxsb2Nfc3RhY2soc3RhY2tfb3JkZXIsIF9fY2FudF9zbGVlcCgpKTsKKwlzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKIAlpZiAoc3RhY2sgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcCA9IHN0YWNrICsgKFVNX0tFUk5fUEFHRV9TSVpFIDw8IHN0YWNrX29yZGVyKSAtIHNpemVvZih2b2lkICopOworCXNwID0gc3RhY2sgKyBVTV9LRVJOX1BBR0VfU0laRSAtIHNpemVvZih2b2lkICopOwogCXBpZCA9IGNsb25lKHByb2MsICh2b2lkICopIHNwLCBmbGFncyB8IFNJR0NITEQsIGFyZyk7CiAJaWYgKHBpZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwpAQCAtMTQ3LDcgKzE0Miw3IEBACiAJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkpCiAJCQlwcmludGsoInJ1bl9oZWxwZXJfdGhyZWFkIC0gdGhyZWFkIHJldHVybmVkIHN0YXR1cyAiCiAJCQkgICAgICAgIjB4JXhcbiIsIHN0YXR1cyk7Ci0JCWZyZWVfc3RhY2soc3RhY2ssIHN0YWNrX29yZGVyKTsKKwkJZnJlZV9zdGFjayhzdGFjaywgMCk7CiAJfSBlbHNlCiAJCSpzdGFja19vdXQgPSBzdGFjazsKIAlyZXR1cm4gcGlkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9tYWluLmMgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwppbmRleCBmYjUxMGQ0Li5lODVmNDk5IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwpAQCAtMjM1LDggKzIzNSw4IEBACiAJCXJldHVybiBfX3JlYWxfbWFsbG9jKHNpemUpOwogCWVsc2UgaWYoc2l6ZSA8PSBVTV9LRVJOX1BBR0VfU0laRSkKIAkJLyogZmluZGluZyBjb250aWd1b3VzIHBhZ2VzIGNhbiBiZSBoYXJkKi8KLQkJcmV0ID0gdW1fa21hbGxvYyhzaXplKTsKLQllbHNlIHJldCA9IHVtX3ZtYWxsb2Moc2l6ZSk7CisJCXJldCA9IGttYWxsb2Moc2l6ZSwgVU1fR0ZQX0tFUk5FTCk7CisJZWxzZSByZXQgPSB2bWFsbG9jKHNpemUpOwogCiAJLyogZ2xpYmMgcGVvcGxlIGluc2lzdCB0aGF0IGlmIG1hbGxvYyBmYWlscywgZXJybm8gc2hvdWxkIGJlCiAJICogc2V0IGJ5IG1hbGxvYyBhcyB3ZWxsLiBTbyB3ZSBkby4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYyBiL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYwppbmRleCA4ZDRlMGM2Li5kYzAzZTljIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBleGl0Y2FsbC4KICAqLwogc3RhdGljIGludCB3cml0ZV9zaWdpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX3NpZ2lvX3N0YWNrOwogCiAvKiBUaGVzZSBhcnJheXMgYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgc2lnaW8gdGhyZWFkIGlzIHN0YXJ0ZWQsIGFuZAogICogdGhlIGRlc2NyaXB0b3JzIGNsb3NlZCBhZnRlciBpdCBpcyBraWxsZWQuICBTbywgaXQgY2FuJ3Qgc2VlIHRoZW0gY2hhbmdlLgpAQCAtMTA0LDcgKzEwNSw3IEBACiAJaWYobiA8PSBwb2xscy0+c2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQluZXcgPSB1bV9rbWFsbG9jX2F0b21pYyhuICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwluZXcgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCksIFVNX0dGUF9BVE9NSUMpOwogCWlmKG5ldyA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZWVkX3BvbGwgOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBvbGxmZHNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE0NCw4ICsxNDUsMTAgQEAKIAlyZXR1cm47CiAgZmFpbDoKIAkvKiBDcml0aWNhbCBzZWN0aW9uIHN0YXJ0ICovCi0JaWYod3JpdGVfc2lnaW9fcGlkICE9IC0xKQorCWlmICh3cml0ZV9zaWdpb19waWQgIT0gLTEpIHsKIAkJb3Nfa2lsbF9wcm9jZXNzKHdyaXRlX3NpZ2lvX3BpZCwgMSk7CisJCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCX0KIAl3cml0ZV9zaWdpb19waWQgPSAtMTsKIAljbG9zZShzaWdpb19wcml2YXRlWzBdKTsKIAljbG9zZShzaWdpb19wcml2YXRlWzFdKTsKQEAgLTIzMCw3ICsyMzMsNyBAQAogewogCXN0cnVjdCBwb2xsZmQgKnA7CiAKLQlwID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYgKHAgPT0gTlVMTCkgewogCQlwcmludGsoInNldHVwX2luaXRpYWxfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBwb2xsXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNDMsNyArMjQ2LDYgQEAKIAogc3RhdGljIHZvaWQgd3JpdGVfc2lnaW9fd29ya2Fyb3VuZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJc3RydWN0IHBvbGxmZCAqcDsKIAlpbnQgZXJyOwogCWludCBsX3dyaXRlX3NpZ2lvX2Zkc1syXTsKQEAgLTI5Myw3ICsyOTUsOCBAQAogCW1lbWNweShzaWdpb19wcml2YXRlLCBsX3NpZ2lvX3ByaXZhdGUsIHNpemVvZihsX3NpZ2lvX3ByaXZhdGUpKTsKIAogCXdyaXRlX3NpZ2lvX3BpZCA9IHJ1bl9oZWxwZXJfdGhyZWFkKHdyaXRlX3NpZ2lvX3RocmVhZCwgTlVMTCwKLQkJCQkJICAgIENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0sICZzdGFjaywgMCk7CisJCQkJCSAgICBDTE9ORV9GSUxFUyB8IENMT05FX1ZNLAorCQkJCQkgICAgJndyaXRlX3NpZ2lvX3N0YWNrKTsKIAogCWlmICh3cml0ZV9zaWdpb19waWQgPCAwKQogCQlnb3RvIG91dF9jbGVhcjsKQEAgLTM1NiwxMCArMzU5LDEyIEBACiAKIHN0YXRpYyB2b2lkIHNpZ2lvX2NsZWFudXAodm9pZCkKIHsKLQlpZih3cml0ZV9zaWdpb19waWQgIT0gLTEpewotCQlvc19raWxsX3Byb2Nlc3Mod3JpdGVfc2lnaW9fcGlkLCAxKTsKLQkJd3JpdGVfc2lnaW9fcGlkID0gLTE7Ci0JfQorCWlmICh3cml0ZV9zaWdpb19waWQgPT0gLTEpCisJCXJldHVybjsKKworCW9zX2tpbGxfcHJvY2Vzcyh3cml0ZV9zaWdpb19waWQsIDEpOworCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCXdyaXRlX3NpZ2lvX3BpZCA9IC0xOwogfQogCiBfX3VtbF9leGl0Y2FsbChzaWdpb19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IDQ2YzAwY2MuLmJhOWFmOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYwpAQCAtNDEsNyArNDEsNyBAQAogCWlmKHBpZCAhPSBvc19nZXRwZ3JwKCkpCiAJCXJldHVybigwKTsKIAotCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCBkYXRhKTsKKwlyZWdpc3Rlcl93aW5jaF9pcnEoLTEsIGZkLCAtMSwgZGF0YSwgMCk7CiAJcmV0dXJuKDEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jIGIvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYwppbmRleCAzZjMzMTY1Li40MTliMmQ1IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKQEAgLTUsNyArNSw4IEBACiAgKiBzbyBJICptdXN0KiBkZWNsYXJlIGdvb2QgcHJvdG90eXBlcyBmb3IgdGhlbSBhbmQgdGhlbiBFWFBPUlQgdGhlbS4KICAqIFRoZSBrZXJuZWwgY29kZSB1c2VzIHRoZSBtYWNybyBkZWZpbmVkIGJ5IGluY2x1ZGUvbGludXgvc3RyaW5nLmgsCiAgKiBzbyBJIHVuZGVmIG1hY3JvczsgdGhlIHVzZXJzcGFjZSBjb2RlIGRvZXMgbm90IGluY2x1ZGUgdGhhdCBhbmQgSQotICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4qLworICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4KKyAqLwogCiAjdW5kZWYgc3RybGVuCiAjdW5kZWYgc3Ryc3RyCkBAIC02MSwxMiArNjIsMTggQEAKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX194c3RhdCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9fbHhzdGF0KTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX19seHN0YXQ2NCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKF9fZnhzdGF0NjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhsc2Vlayk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKGxzZWVrNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG93bik7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG93bik7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHRydW5jYXRlKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oZnRydW5jYXRlNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyh1dGltZSk7CitFWFBPUlRfU1lNQk9MX1BST1RPKHV0aW1lcyk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZ1dGltZXMpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG1vZCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG1vZCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHJlbmFtZSk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9feG1rbm9kKTsKIApAQCAtMTAyLDE0ICsxMDksMyBAQAogCiBleHRlcm4gbG9uZyBfX2d1YXJkIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIEVYUE9SVF9TWU1CT0woX19ndWFyZCk7Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhOWIwOTM0Li5hNDU4YWM5IDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTExNywyNCArMTE3LDE2IEBACiAJaW50IHJ2YWw7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKLQkJdW5zaWduZWQgbG9uZyB2YWwsIGNvcGllZDsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdmFsLCBzaXplb2YodmFsKSwgMCk7Ci0JCXJ2YWwgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih2YWwpKQotCQkJYnJlYWs7Ci0JCXJ2YWwgPSBwdXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopZGF0YSk7CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJ2YWwgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcnZhbCA9IC1FSU87CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJLyogUmVhZC93cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBBRERSIGluIHRoZSByZWdpc3RlcnMuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggOGJkZDI1YS4uMTRiZjhjZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC03NzQsOCArNzc0LDggQEAKIHNvdXJjZSAiYXJjaC94ODZfNjQvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggNDc1NjVjMy4uNzgyZGVhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCkBAIC01MjYsNyArNTI2LDcgQEAKIAkucXVhZCBzeXNfaW5pdF9tb2R1bGUKIAkucXVhZCBzeXNfZGVsZXRlX21vZHVsZQogCS5xdWFkIHF1aWV0X25pX3N5c2NhbGwJCS8qIDEzMCAgZ2V0X2tlcm5lbF9zeW1zICovCi0JLnF1YWQgc3lzX3F1b3RhY3RsCisJLnF1YWQgc3lzMzJfcXVvdGFjdGwKIAkucXVhZCBzeXNfZ2V0cGdpZAogCS5xdWFkIHN5c19mY2hkaXIKIAkucXVhZCBxdWlldF9uaV9zeXNjYWxsCS8qIGJkZmx1c2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCmluZGV4IDFmYWI0ODcuLjk0MWM4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUwpAQCAtNzMsNyArNzMsMTEgQEAKIAlhZGRxCSVyYnAsIGluaXRfbGV2ZWw0X3BndCArICg1MTEqOCkoJXJpcCkKIAogCWFkZHEJJXJicCwgbGV2ZWwzX2lkZW50X3BndCArIDAoJXJpcCkKKwogCWFkZHEJJXJicCwgbGV2ZWwzX2tlcm5lbF9wZ3QgKyAoNTEwKjgpKCVyaXApCisJYWRkcQklcmJwLCBsZXZlbDNfa2VybmVsX3BndCArICg1MTEqOCkoJXJpcCkKKworCWFkZHEJJXJicCwgbGV2ZWwyX2ZpeG1hcF9wZ3QgKyAoNTA2KjgpKCVyaXApCiAKIAkvKiBBZGQgYW4gSWRlbnRpdHkgbWFwcGluZyBpZiBJIGFtIGFib3ZlIDFHICovCiAJbGVhcQlfdGV4dCglcmlwKSwgJXJkaQpAQCAtMzE0LDcgKzMxOCwxNiBAQAogCS5maWxsCTUxMCw4LDAKIAkvKiAoMl40OC0oMioxMDI0KjEwMjQqMTAyNCktKCgyXjM5KSo1MTEpKS8oMl4zMCkgPSA1MTAgKi8KIAkucXVhZAlsZXZlbDJfa2VybmVsX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9LRVJOUEdfVEFCTEUKLQkuZmlsbAkxLDgsMAorCS5xdWFkCWxldmVsMl9maXhtYXBfcGd0IC0gX19TVEFSVF9LRVJORUxfbWFwICsgX1BBR0VfVEFCTEUKKworTkVYVF9QQUdFKGxldmVsMl9maXhtYXBfcGd0KQorCS5maWxsCTUwNiw4LDAKKwkucXVhZAlsZXZlbDFfZml4bWFwX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9QQUdFX1RBQkxFCisJLyogOE1CIHJlc2VydmVkIGZvciB2c3lzY2FsbHMgKyBhIDJNQiBob2xlID0gNCArIDEgZW50cmllcyAqLworCS5maWxsCTUsOCwwCisKK05FWFRfUEFHRShsZXZlbDFfZml4bWFwX3BndCkKKwkuZmlsbAk1MTIsOCwwCiAKIE5FWFRfUEFHRShsZXZlbDJfaWRlbnRfcGd0KQogCS8qIFNpbmNlIEkgZWFzaWx5IGNhbiwgbWFwIHRoZSBmaXJzdCAxRy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwppbmRleCA5MzFjNjRiLi5lZGJiYzU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShsb2NhbF90LCBhbGVydF9jb3VudGVyKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIG5taV90b3VjaCk7CiAKLXZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQordm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2codm9pZCkKIHsKIAlpZiAobm1pX3dhdGNoZG9nID4gMCkgewogCQl1bnNpZ25lZCBjcHU7CkBAIC0zMDYsOCArMzA2LDEwIEBACiAJCSAqIGRvIGl0IG91cnNlbHZlcyBiZWNhdXNlIHRoZSBhbGVydCBjb3VudCBpbmNyZWFzZSBpcyBub3QKIAkJICogYXRvbWljLgogCQkgKi8KLQkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKLQkJCXBlcl9jcHUobm1pX3RvdWNoLCBjcHUpID0gMTsKKwkJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCQlpZiAocGVyX2NwdShubWlfdG91Y2gsIGNwdSkgIT0gMSkKKwkJCQlwZXJfY3B1KG5taV90b3VjaCwgY3B1KSA9IDE7CisJCX0KIAl9CiAKICAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDk0MDkxMTcuLmZhNjc3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTMxMywxNyArMzEzLDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzY3LDEwICszNTksNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGFhYzFjMGIuLjc0Y2JlYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCkBAIC0zMzAsNiArMzMwLDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJcHJpbnRrX2FkZHJlc3MoYWRkcik7CiB9CiAKQEAgLTUxOCw2ICs1MTksNyBAQAogCXByaW50aygiXG4iKTsKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIGVyciwgY3VycmVudC0+dGhyZWFkLnRyYXBfbm8sIFNJR1NFR1YpOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCS8qIEV4ZWN1dGl2ZSBzdW1tYXJ5IGluIGNhc2UgdGhlIG9vcHMgc2Nyb2xsZWQgYXdheSAqLwogCXByaW50ayhLRVJOX0FMRVJUICJSSVAgIik7CiAJcHJpbnRrX2FkZHJlc3MocmVncy0+cmlwKTsgCkBAIC01MzEsNyArNTMzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gb29wc19iZWdpbigpOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykpCi0JCXJlcG9ydF9idWcocmVncy0+cmlwKTsKKwkJcmVwb3J0X2J1ZyhyZWdzLT5yaXAsIHJlZ3MpOwogCiAJX19kaWUoc3RyLCByZWdzLCBlcnIpOwogCW9vcHNfZW5kKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwppbmRleCAxNDEwNGZmLi4wNmExM2Q5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCkBAIC01MCwxOCArNTAsOCBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICAqLwogCkBAIC0xMzgsMTAgKzEyOCw3IEBACiAKIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKQotCQkgICAgPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwppbmRleCA2OTNhYjI2Li5jNWU2MmY5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwpAQCAtNDgyLDYgKzQ4Miw3IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCXNob3dfc3RhY2soTlVMTCwgKHVuc2lnbmVkIGxvbmcqKXJlZ3MtPmFyZWdbMV0pOwogCisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7CiAKIAlpZiAoaW5faW50ZXJydXB0KCkpCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCAyODU5MzUxLi42NTk3YjYwIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTUxLDQgKzUxLDEyIEBACiAKIGVuZGlmICMgQkxPQ0sKIAorY29uZmlnIEJMS19ERVZfQlNHCisJYm9vbCAiQmxvY2sgbGF5ZXIgU0cgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChTQ1NJPXkpICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTYXlpbmcgWSBoZXJlIHdpbGwgZW5hYmxlIGdlbmVyaWMgU0cgKFNDU0kgZ2VuZXJpYykgdjQKKwlzdXBwb3J0IGZvciBhbnkgYmxvY2sgZGV2aWNlLgorCiBzb3VyY2UgYmxvY2svS2NvbmZpZy5pb3NjaGVkCmRpZmYgLS1naXQgYS9ibG9jay9NYWtlZmlsZSBiL2Jsb2NrL01ha2VmaWxlCmluZGV4IDRiODRkMGQuLjk1OWZlZWIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL01ha2VmaWxlCisrKyBiL2Jsb2NrL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfQkxPQ0spIDo9IGVsZXZhdG9yLm8gbGxfcndfYmxrLm8gaW9jdGwubyBnZW5oZC5vIHNjc2lfaW9jdGwubwogCitvYmotJChDT05GSUdfQkxLX0RFVl9CU0cpCSs9IGJzZy5vCiBvYmotJChDT05GSUdfSU9TQ0hFRF9OT09QKQkrPSBub29wLWlvc2NoZWQubwogb2JqLSQoQ09ORklHX0lPU0NIRURfQVMpCSs9IGFzLWlvc2NoZWQubwogb2JqLSQoQ09ORklHX0lPU0NIRURfREVBRExJTkUpCSs9IGRlYWRsaW5lLWlvc2NoZWQubwpkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IDEwOWU5MWIuLjNlMzE2ZGQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2FzLWlvc2NoZWQuYworKysgYi9ibG9jay9hcy1pb3NjaGVkLmMKQEAgLTEzMjIsMTAgKzEzMjIsOSBAQAogewogCXN0cnVjdCBhc19kYXRhICphZDsKIAotCWFkID0ga21hbGxvY19ub2RlKHNpemVvZigqYWQpLCBHRlBfS0VSTkVMLCBxLT5ub2RlKTsKKwlhZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmFkKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICghYWQpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChhZCwgMCwgc2l6ZW9mKCphZCkpOwogCiAJYWQtPnEgPSBxOyAvKiBJZGVudGlmeSB3aGF0IHF1ZXVlIHRoZSBkYXRhIGJlbG9uZ3MgdG8gKi8KIApkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY5MzNmCi0tLSAvZGV2L251bGwKKysrIGIvYmxvY2svYnNnLmMKQEAgLTAsMCArMSwxMTE0IEBACisvKgorICogYnNnLmMgLSBibG9jayBsYXllciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2cgdjMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplbnMgQXhib2UgPGF4Ym9lQHN1c2UuZGU+IFNVU0UgTGFicworICogQ29weXJpZ2h0IChDKSAyMDA0IFBldGVyIE0uIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIHZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqICBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisvKgorICogVE9ETworICoJLSBTaG91bGQgdGhpcyBnZXQgbWVyZ2VkLCBibG9jay9zY3NpX2lvY3RsLmMgd2lsbCBiZSBtaWdyYXRlZCBpbnRvCisgKgkgIHRoaXMgZmlsZS4gVG8ga2VlcCBtYWludGVuYW5jZSBkb3duLCBpdCdzIGVhc2llciB0byBoYXZlIHRoZW0KKyAqCSAgc2VwZXJhdGVkIHJpZ2h0IG5vdy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvYnNnLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZHJpdmVyLmg+CisjaW5jbHVkZSA8c2NzaS9zZy5oPgorCitzdGF0aWMgY2hhciBic2dfdmVyc2lvbltdID0gImJsb2NrIGxheWVyIHNnIChic2cpIDAuNCI7CisKK3N0cnVjdCBic2dfZGV2aWNlIHsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c3lfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRvbmVfbGlzdDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZXZfbGlzdDsKKwlhdG9taWNfdCByZWZfY291bnQ7CisJaW50IG1pbm9yOworCWludCBxdWV1ZWRfY21kczsKKwlpbnQgZG9uZV9jbWRzOworCXdhaXRfcXVldWVfaGVhZF90IHdxX2RvbmU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfZnJlZTsKKwljaGFyIG5hbWVbQlVTX0lEX1NJWkVdOworCWludCBtYXhfcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK307CisKK2VudW0geworCUJTR19GX0JMT0NLCQk9IDEsCisJQlNHX0ZfV1JJVEVfUEVSTQk9IDIsCit9OworCisjZGVmaW5lIEJTR19ERUZBVUxUX0NNRFMJNjQKKyNkZWZpbmUgQlNHX01BWF9ERVZTCQkzMjc2OAorCisjdW5kZWYgQlNHX0RFQlVHCisKKyNpZmRlZiBCU0dfREVCVUcKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgbGlzdF9lbnRyeV9iYyhlbnRyeSkJbGlzdF9lbnRyeSgoZW50cnkpLCBzdHJ1Y3QgYnNnX2NvbW1hbmQsIGxpc3QpCisKKy8qCisgKiBqdXN0IGZvciB0ZXN0aW5nCisgKi8KKyNkZWZpbmUgQlNHX01BSk9SCSgyNDApCisKK3N0YXRpYyBERUZJTkVfTVVURVgoYnNnX211dGV4KTsKK3N0YXRpYyBpbnQgYnNnX2RldmljZV9uciwgYnNnX21pbm9yX2lkeDsKKworI2RlZmluZSBCU0dfTElTVF9TSVpFCSg4KQorI2RlZmluZSBic2dfbGlzdF9pZHgobWlub3IpCSgobWlub3IpICYgKEJTR19MSVNUX1NJWkUgLSAxKSkKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBic2dfZGV2aWNlX2xpc3RbQlNHX0xJU1RfU0laRV07CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmJzZ19jbGFzczsKK3N0YXRpYyBMSVNUX0hFQUQoYnNnX2NsYXNzX2xpc3QpOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJzZ19jbWRfY2FjaGVwOworCisvKgorICogb3VyIGludGVybmFsIGNvbW1hbmQgdHlwZQorICovCitzdHJ1Y3QgYnNnX2NvbW1hbmQgeworCXN0cnVjdCBic2dfZGV2aWNlICpiZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCXN0cnVjdCBiaW8gKmJpbzsKKwlzdHJ1Y3QgYmlvICpiaWRpX2JpbzsKKwlpbnQgZXJyOworCXN0cnVjdCBzZ19pb192NCBoZHI7CisJc3RydWN0IHNnX2lvX3Y0IF9fdXNlciAqdWhkcjsKKwljaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07Cit9OworCitzdGF0aWMgdm9pZCBic2dfZnJlZV9jb21tYW5kKHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gYmMtPmJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYnNnX2NtZF9jYWNoZXAsIGJjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+bG9jaywgZmxhZ3MpOworCWJkLT5xdWV1ZWRfY21kcy0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZiZC0+d3FfZnJlZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJzZ19hbGxvY19jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjID0gRVJSX1BUUigtRUlOVkFMKTsKKworCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKworCWlmIChiZC0+cXVldWVkX2NtZHMgPj0gYmQtPm1heF9xdWV1ZSkKKwkJZ290byBvdXQ7CisKKwliZC0+cXVldWVkX2NtZHMrKzsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKworCWJjID0ga21lbV9jYWNoZV9hbGxvYyhic2dfY21kX2NhY2hlcCwgR0ZQX1VTRVIpOworCWlmICh1bmxpa2VseSghYmMpKSB7CisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJYmQtPnF1ZXVlZF9jbWRzLS07CisJCWJjID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KGJjLCAwLCBzaXplb2YoKmJjKSk7CisJYmMtPmJkID0gYmQ7CisJSU5JVF9MSVNUX0hFQUQoJmJjLT5saXN0KTsKKwlkcHJpbnRrKCIlczogcmV0dXJuaW5nIGZyZWUgY21kICVwXG4iLCBiZC0+bmFtZSwgYmMpOworCXJldHVybiBiYzsKK291dDoKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwlyZXR1cm4gYmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYnNnX2RlbF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJYmQtPmRvbmVfY21kcy0tOworCWxpc3RfZGVsKCZiYy0+bGlzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYnNnX2FkZF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJYmQtPmRvbmVfY21kcysrOworCWxpc3RfYWRkX3RhaWwoJmJjLT5saXN0LCAmYmQtPmRvbmVfbGlzdCk7CisJd2FrZV91cCgmYmQtPndxX2RvbmUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBic2dfaW9fc2NoZWR1bGUoc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBpbnQgc3RhdGUpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlCVUdfT04oYmQtPmRvbmVfY21kcyA+IGJkLT5xdWV1ZWRfY21kcyk7CisKKwkvKgorCSAqIC1FTk9TUEMgb3IgLUVOT0RBVEE/ICBJJ20gZ29pbmcgZm9yIC1FTk9EQVRBLCBtZWFuaW5nICJJIGhhdmUgbm8KKwkgKiB3b3JrIHRvIGRvIiwgZXZlbiB0aG91Z2ggd2UgcmV0dXJuIC1FTk9TUEMgYWZ0ZXIgdGhpcyBzYW1lIHRlc3QKKwkgKiBkdXJpbmcgYnNnX3dyaXRlKCkgLS0gdGhlcmUsIGl0IG1lYW5zIG91ciBidWZmZXIgY2FuJ3QgaGF2ZSBtb3JlCisJICogYnNnX2NvbW1hbmRzIGFkZGVkIHRvIGl0LCB0aHVzIGhhcyBubyBzcGFjZSBsZWZ0LgorCSAqLworCWlmIChiZC0+ZG9uZV9jbWRzID09IGJkLT5xdWV1ZWRfY21kcykgeworCQlyZXQgPSAtRU5PREFUQTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKCF0ZXN0X2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncykpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcHJlcGFyZV90b193YWl0KCZiZC0+d3FfZG9uZSwgJndhaXQsIHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwlpb19zY2hlZHVsZSgpOworCWZpbmlzaF93YWl0KCZiZC0+d3FfZG9uZSwgJndhaXQpOworCisJaWYgKChzdGF0ZSA9PSBUQVNLX0lOVEVSUlVQVElCTEUpICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisKKwlyZXR1cm4gcmV0OwordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmxrX2ZpbGxfc2d2NF9oZHJfcnEocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkJc3RydWN0IHNnX2lvX3Y0ICpoZHIsIGludCBoYXNfd3JpdGVfcGVybSkKK3sKKwltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKHJxLT5jbWQsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaGRyLT5yZXF1ZXN0LAorCQkJICAgaGRyLT5yZXF1ZXN0X2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGhkci0+c3VicHJvdG9jb2wgPT0gQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX0NNRCkgeworCQlpZiAoYmxrX3ZlcmlmeV9jb21tYW5kKHJxLT5jbWQsIGhhc193cml0ZV9wZXJtKSkKKwkJCXJldHVybiAtRVBFUk07CisJfSBlbHNlIGlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQorCSAqLworCXJxLT5jbWRfbGVuID0gaGRyLT5yZXF1ZXN0X2xlbjsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKworCXJxLT50aW1lb3V0ID0gKGhkci0+dGltZW91dCAqIEhaKSAvIDEwMDA7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgaWYgc2dfaW9fdjQgZnJvbSB1c2VyIGlzIGFsbG93ZWQgYW5kIHZhbGlkCisgKi8KK3N0YXRpYyBpbnQKK2JzZ192YWxpZGF0ZV9zZ3Y0X2hkcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBzZ19pb192NCAqaGRyLCBpbnQgKnJ3KQoreworCWludCByZXQgPSAwOworCisJaWYgKGhkci0+Z3VhcmQgIT0gJ1EnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaGRyLT5yZXF1ZXN0X2xlbiA+IEJMS19NQVhfQ0RCKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaGRyLT5kb3V0X3hmZXJfbGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpIHx8CisJICAgIGhkci0+ZGluX3hmZXJfbGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpKQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAoaGRyLT5wcm90b2NvbCkgeworCWNhc2UgQlNHX1BST1RPQ09MX1NDU0k6CisJCXN3aXRjaCAoaGRyLT5zdWJwcm90b2NvbCkgeworCQljYXNlIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9DTUQ6CisJCWNhc2UgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX1RSQU5TUE9SVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCSpydyA9IGhkci0+ZG91dF94ZmVyX2xlbiA/IFdSSVRFIDogUkVBRDsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbWFwIHNnX2lvX3Y0IHRvIGEgcmVxdWVzdC4KKyAqLworc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKK2JzZ19tYXBfaGRyKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgc3RydWN0IHNnX2lvX3Y0ICpoZHIpCit7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gYmQtPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0ICpycSwgKm5leHRfcnEgPSBOVUxMOworCWludCByZXQsIHJ3ID0gMDsgLyogc2h1dCB1cCBnY2MgKi8KKwl1bnNpZ25lZCBpbnQgZHhmZXJfbGVuOworCXZvaWQgKmR4ZmVycCA9IE5VTEw7CisKKwlkcHJpbnRrKCJtYXAgaGRyICVsbHgvJXUgJWxseC8ldVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaGRyLT5kb3V0X3hmZXJwLAorCQloZHItPmRvdXRfeGZlcl9sZW4sICh1bnNpZ25lZCBsb25nIGxvbmcpIGhkci0+ZGluX3hmZXJwLAorCQloZHItPmRpbl94ZmVyX2xlbik7CisKKwlyZXQgPSBic2dfdmFsaWRhdGVfc2d2NF9oZHIocSwgaGRyLCAmcncpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwkvKgorCSAqIG1hcCBzY2F0dGVyLWdhdGhlciBlbGVtZW50cyBzZXBlcmF0ZWx5IGFuZCBzdHJpbmcgdGhlbSB0byByZXF1ZXN0CisJICovCisJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgcncsIEdGUF9LRVJORUwpOworCWlmICghcnEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJldCA9IGJsa19maWxsX3NndjRfaGRyX3JxKHEsIHJxLCBoZHIsIHRlc3RfYml0KEJTR19GX1dSSVRFX1BFUk0sCisJCQkJCQkgICAgICAgJmJkLT5mbGFncykpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKHJ3ID09IFdSSVRFICYmIGhkci0+ZGluX3hmZXJfbGVuKSB7CisJCWlmICghdGVzdF9iaXQoUVVFVUVfRkxBR19CSURJLCAmcS0+cXVldWVfZmxhZ3MpKSB7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbmV4dF9ycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXh0X3JxKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnEtPm5leHRfcnEgPSBuZXh0X3JxOworCisJCWR4ZmVycCA9ICh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKKwkJcmV0ID0gIGJsa19ycV9tYXBfdXNlcihxLCBuZXh0X3JxLCBkeGZlcnAsIGhkci0+ZGluX3hmZXJfbGVuKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChoZHItPmRvdXRfeGZlcl9sZW4pIHsKKwkJZHhmZXJfbGVuID0gaGRyLT5kb3V0X3hmZXJfbGVuOworCQlkeGZlcnAgPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5kb3V0X3hmZXJwOworCX0gZWxzZSBpZiAoaGRyLT5kaW5feGZlcl9sZW4pIHsKKwkJZHhmZXJfbGVuID0gaGRyLT5kaW5feGZlcl9sZW47CisJCWR4ZmVycCA9ICh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKKwl9IGVsc2UKKwkJZHhmZXJfbGVuID0gMDsKKworCWlmIChkeGZlcl9sZW4pIHsKKwkJcmV0ID0gYmxrX3JxX21hcF91c2VyKHEsIHJxLCBkeGZlcnAsIGR4ZmVyX2xlbik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisJcmV0dXJuIHJxOworb3V0OgorCWJsa19wdXRfcmVxdWVzdChycSk7CisJaWYgKG5leHRfcnEpIHsKKwkJYmxrX3JxX3VubWFwX3VzZXIobmV4dF9ycS0+YmlvKTsKKwkJYmxrX3B1dF9yZXF1ZXN0KG5leHRfcnEpOworCX0KKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCisvKgorICogYXN5bmMgY29tcGxldGlvbiBjYWxsLWJhY2sgZnJvbSB0aGUgYmxvY2sgbGF5ZXIsIHdoZW4gc2NzaS9pZGUvd2hhdGV2ZXIKKyAqIGNhbGxzIGVuZF90aGF0X3JlcXVlc3RfbGFzdCgpIG9uIGEgcmVxdWVzdAorICovCitzdGF0aWMgdm9pZCBic2dfcnFfZW5kX2lvKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKQoreworCXN0cnVjdCBic2dfY29tbWFuZCAqYmMgPSBycS0+ZW5kX2lvX2RhdGE7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gYmMtPmJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCIlczogZmluaXNoZWQgcnEgJXAgYmMgJXAsIGJpbyAlcCBzdGF0ICVkXG4iLAorCQliZC0+bmFtZSwgcnEsIGJjLCBiYy0+YmlvLCB1cHRvZGF0ZSk7CisKKwliYy0+aGRyLmR1cmF0aW9uID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gYmMtPmhkci5kdXJhdGlvbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmYmMtPmxpc3QpOworCWJzZ19hZGRfZG9uZV9jbWQoYmQsIGJjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogZG8gZmluYWwgc2V0dXAgb2YgYSAnYmMnIGFuZCBzdWJtaXQgdGhlIG1hdGNoaW5nICdycScgdG8gdGhlIGJsb2NrCisgKiBsYXllciBmb3IgaW8KKyAqLworc3RhdGljIHZvaWQgYnNnX2FkZF9jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgcmVxdWVzdF9xdWV1ZV90ICpxLAorCQkJICAgIHN0cnVjdCBic2dfY29tbWFuZCAqYmMsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlycS0+c2Vuc2UgPSBiYy0+c2Vuc2U7CisJcnEtPnNlbnNlX2xlbiA9IDA7CisKKwkvKgorCSAqIGFkZCBiYyBjb21tYW5kIHRvIGJ1c3kgcXVldWUgYW5kIHN1Ym1pdCBycSBmb3IgaW8KKwkgKi8KKwliYy0+cnEgPSBycTsKKwliYy0+YmlvID0gcnEtPmJpbzsKKwlpZiAocnEtPm5leHRfcnEpCisJCWJjLT5iaWRpX2JpbyA9IHJxLT5uZXh0X3JxLT5iaW87CisJYmMtPmhkci5kdXJhdGlvbiA9IGppZmZpZXM7CisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCWxpc3RfYWRkX3RhaWwoJmJjLT5saXN0LCAmYmQtPmJ1c3lfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlkcHJpbnRrKCIlczogcXVldWVpbmcgcnEgJXAsIGJjICVwXG4iLCBiZC0+bmFtZSwgcnEsIGJjKTsKKworCXJxLT5lbmRfaW9fZGF0YSA9IGJjOworCWJsa19leGVjdXRlX3JxX25vd2FpdChxLCBOVUxMLCBycSwgMSwgYnNnX3JxX2VuZF9pbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzZ19jb21tYW5kICpic2dfbmV4dF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYyA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisJaWYgKGJkLT5kb25lX2NtZHMpIHsKKwkJYmMgPSBsaXN0X2VudHJ5X2JjKGJkLT5kb25lX2xpc3QubmV4dCk7CisJCWJzZ19kZWxfZG9uZV9jbWQoYmQsIGJjKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlyZXR1cm4gYmM7Cit9CisKKy8qCisgKiBHZXQgYSBmaW5pc2hlZCBjb21tYW5kIGZyb20gdGhlIGRvbmUgbGlzdAorICovCitzdGF0aWMgc3RydWN0IGJzZ19jb21tYW5kICpic2dfZ2V0X2RvbmVfY21kKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjOworCWludCByZXQ7CisKKwlkbyB7CisJCWJjID0gYnNnX25leHRfZG9uZV9jbWQoYmQpOworCQlpZiAoYmMpCisJCQlicmVhazsKKworCQlpZiAoIXRlc3RfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKSkgeworCQkJYmMgPSBFUlJfUFRSKC1FQUdBSU4pOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmQtPndxX2RvbmUsIGJkLT5kb25lX2NtZHMpOworCQlpZiAocmV0KSB7CisJCQliYyA9IEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlkcHJpbnRrKCIlczogcmV0dXJuaW5nIGRvbmUgJXBcbiIsIGJkLT5uYW1lLCBiYyk7CisKKwlyZXR1cm4gYmM7Cit9CisKK3N0YXRpYyBpbnQgYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IHNnX2lvX3Y0ICpoZHIsCisJCQkJICAgIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlkaV9iaW8pCit7CisJaW50IHJldCA9IDA7CisKKwlkcHJpbnRrKCJycSAlcCBiaW8gJXAgJXVcbiIsIHJxLCBiaW8sIHJxLT5lcnJvcnMpOworCS8qCisJICogZmlsbCBpbiBhbGwgdGhlIG91dHB1dCBtZW1iZXJzCisJICovCisJaGRyLT5kZXZpY2Vfc3RhdHVzID0gc3RhdHVzX2J5dGUocnEtPmVycm9ycyk7CisJaGRyLT50cmFuc3BvcnRfc3RhdHVzID0gaG9zdF9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+ZHJpdmVyX3N0YXR1cyA9IGRyaXZlcl9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+aW5mbyA9IDA7CisJaWYgKGhkci0+ZGV2aWNlX3N0YXR1cyB8fCBoZHItPnRyYW5zcG9ydF9zdGF0dXMgfHwgaGRyLT5kcml2ZXJfc3RhdHVzKQorCQloZHItPmluZm8gfD0gU0dfSU5GT19DSEVDSzsKKwloZHItPmRpbl9yZXNpZCA9IHJxLT5kYXRhX2xlbjsKKwloZHItPnJlc3BvbnNlX2xlbiA9IDA7CisKKwlpZiAocnEtPnNlbnNlX2xlbiAmJiBoZHItPnJlc3BvbnNlKSB7CisJCWludCBsZW4gPSBtaW4oKHVuc2lnbmVkIGludCkgaGRyLT5tYXhfcmVzcG9uc2VfbGVuLAorCQkJICAgICAgcnEtPnNlbnNlX2xlbik7CisKKwkJcmV0ID0gY29weV90b191c2VyKCh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPnJlc3BvbnNlLAorCQkJCSAgIHJxLT5zZW5zZSwgbGVuKTsKKwkJaWYgKCFyZXQpCisJCQloZHItPnJlc3BvbnNlX2xlbiA9IGxlbjsKKwkJZWxzZQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlpZiAocnEtPm5leHRfcnEpIHsKKwkJYmxrX3JxX3VubWFwX3VzZXIoYmlkaV9iaW8pOworCQlibGtfcHV0X3JlcXVlc3QocnEtPm5leHRfcnEpOworCX0KKworCWJsa19ycV91bm1hcF91c2VyKGJpbyk7CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnNnX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlpbnQgcmV0LCB0cmV0OworCisJZHByaW50aygiJXM6IGVudGVyZWRcbiIsIGJkLT5uYW1lKTsKKworCXNldF9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpOworCisJLyoKKwkgKiB3YWl0IGZvciBhbGwgY29tbWFuZHMgdG8gY29tcGxldGUKKwkgKi8KKwlyZXQgPSAwOworCWRvIHsKKwkJcmV0ID0gYnNnX2lvX3NjaGVkdWxlKGJkLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCS8qCisJCSAqIGxvb2sgZm9yIC1FTk9EQVRBIHNwZWNpZmljYWxseSAtLSB3ZSdsbCBzb21ldGltZXMgZ2V0CisJCSAqIC1FUkVTVEFSVFNZUyB3aGVuIHdlJ3ZlIHRha2VuIGEgc2lnbmFsLCBidXQgd2UgY2FuJ3QKKwkJICogcmV0dXJuIHVudGlsIHdlJ3JlIGRvbmUgZnJlZWluZyB0aGUgcXVldWUsIHNvIGlnbm9yZQorCQkgKiBpdC4gIFRoZSBzaWduYWwgd2lsbCBnZXQgaGFuZGxlZCB3aGVuIHdlJ3JlIGRvbmUgZnJlZWluZworCQkgKiB0aGUgYnNnX2RldmljZS4KKwkJICovCisJfSB3aGlsZSAocmV0ICE9IC1FTk9EQVRBKTsKKworCS8qCisJICogZGlzY2FyZCBkb25lIGNvbW1hbmRzCisJICovCisJcmV0ID0gMDsKKwlkbyB7CisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJaWYgKCFiZC0+cXVldWVkX2NtZHMpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwkJYmMgPSBic2dfZ2V0X2RvbmVfY21kKGJkKTsKKwkJaWYgKElTX0VSUihiYykpCisJCQlicmVhazsKKworCQl0cmV0ID0gYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKGJjLT5ycSwgJmJjLT5oZHIsIGJjLT5iaW8sCisJCQkJCQliYy0+YmlkaV9iaW8pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHRyZXQ7CisKKwkJYnNnX2ZyZWVfY29tbWFuZChiYyk7CisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAorX19ic2dfcmVhZChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIHN0cnVjdCBic2dfZGV2aWNlICpiZCwKKwkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgc3NpemVfdCAqYnl0ZXNfcmVhZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjOworCWludCBucl9jb21tYW5kcywgcmV0OworCisJaWYgKGNvdW50ICUgc2l6ZW9mKHN0cnVjdCBzZ19pb192NCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gMDsKKwlucl9jb21tYW5kcyA9IGNvdW50IC8gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJd2hpbGUgKG5yX2NvbW1hbmRzKSB7CisJCWJjID0gYnNnX2dldF9kb25lX2NtZChiZCk7CisJCWlmIChJU19FUlIoYmMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogdGhpcyBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gY29weSBkYXRhIGJhY2sKKwkJICogYWZ0ZXIgY29tcGxldGluZyB0aGUgcmVxdWVzdC4gc28gZG8gdGhhdCBoZXJlLAorCQkgKiBic2dfY29tcGxldGVfd29yaygpIGNhbm5vdCBkbyB0aGF0IGZvciB1cworCQkgKi8KKwkJcmV0ID0gYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKGJjLT5ycSwgJmJjLT5oZHIsIGJjLT5iaW8sCisJCQkJCSAgICAgICBiYy0+YmlkaV9iaW8pOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAoY2hhciAqKSAmYmMtPmhkciwgc2l6ZW9mKGJjLT5oZHIpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisKKwkJYnNnX2ZyZWVfY29tbWFuZChiYyk7CisKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KTsKKwkJKmJ5dGVzX3JlYWQgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJCW5yX2NvbW1hbmRzLS07CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzZ19zZXRfYmxvY2soc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWNsZWFyX2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncyk7CisJZWxzZQorCQlzZXRfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzZ19zZXRfd3JpdGVfcGVybShzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJc2V0X2JpdChCU0dfRl9XUklURV9QRVJNLCAmYmQtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChCU0dfRl9XUklURV9QRVJNLCAmYmQtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXJyX2Jsb2NrX2VycihpbnQgcmV0KQoreworCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9TUEMgJiYgcmV0ICE9IC1FTk9EQVRBICYmIHJldCAhPSAtRUFHQUlOKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorYnNnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCXNzaXplX3QgYnl0ZXNfcmVhZDsKKworCWRwcmludGsoIiVzOiByZWFkICVaZCBieXRlc1xuIiwgYmQtPm5hbWUsIGNvdW50KTsKKworCWJzZ19zZXRfYmxvY2soYmQsIGZpbGUpOworCWJ5dGVzX3JlYWQgPSAwOworCXJldCA9IF9fYnNnX3JlYWQoYnVmLCBjb3VudCwgYmQsIE5VTEwsICZieXRlc19yZWFkKTsKKwkqcHBvcyA9IGJ5dGVzX3JlYWQ7CisKKwlpZiAoIWJ5dGVzX3JlYWQgfHwgKGJ5dGVzX3JlYWQgJiYgZXJyX2Jsb2NrX2VycihyZXQpKSkKKwkJYnl0ZXNfcmVhZCA9IHJldDsKKworCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgc3NpemVfdCBfX2JzZ193cml0ZShzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIHNzaXplX3QgKmJ5dGVzX3JlYWQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IHJldCwgbnJfY29tbWFuZHM7CisKKwlpZiAoY291bnQgJSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucl9jb21tYW5kcyA9IGNvdW50IC8gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJcnEgPSBOVUxMOworCWJjID0gTlVMTDsKKwlyZXQgPSAwOworCXdoaWxlIChucl9jb21tYW5kcykgeworCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZC0+cXVldWU7CisKKwkJYmMgPSBic2dfYWxsb2NfY29tbWFuZChiZCk7CisJCWlmIChJU19FUlIoYmMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGJjKTsKKwkJCWJjID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJYmMtPnVoZHIgPSAoc3RydWN0IHNnX2lvX3Y0IF9fdXNlciAqKSBidWY7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYmMtPmhkciwgYnVmLCBzaXplb2YoYmMtPmhkcikpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBnZXQgYSByZXF1ZXN0LCBmaWxsIGluIHRoZSBibGFua3MsIGFuZCBhZGQgdG8gcmVxdWVzdCBxdWV1ZQorCQkgKi8KKwkJcnEgPSBic2dfbWFwX2hkcihiZCwgJmJjLT5oZHIpOworCQlpZiAoSVNfRVJSKHJxKSkgeworCQkJcmV0ID0gUFRSX0VSUihycSk7CisJCQlycSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCWJzZ19hZGRfY29tbWFuZChiZCwgcSwgYmMsIHJxKTsKKwkJYmMgPSBOVUxMOworCQlycSA9IE5VTEw7CisJCW5yX2NvbW1hbmRzLS07CisJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KTsKKwkJKmJ5dGVzX3JlYWQgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJfQorCisJaWYgKGJjKQorCQlic2dfZnJlZV9jb21tYW5kKGJjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citic2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQ7CisJaW50IHJldDsKKworCWRwcmludGsoIiVzOiB3cml0ZSAlWmQgYnl0ZXNcbiIsIGJkLT5uYW1lLCBjb3VudCk7CisKKwlic2dfc2V0X2Jsb2NrKGJkLCBmaWxlKTsKKwlic2dfc2V0X3dyaXRlX3Blcm0oYmQsIGZpbGUpOworCisJYnl0ZXNfcmVhZCA9IDA7CisJcmV0ID0gX19ic2dfd3JpdGUoYmQsIGJ1ZiwgY291bnQsICZieXRlc19yZWFkKTsKKwkqcHBvcyA9IGJ5dGVzX3JlYWQ7CisKKwkvKgorCSAqIHJldHVybiBieXRlcyB3cml0dGVuIG9uIG5vbi1mYXRhbCBlcnJvcnMKKwkgKi8KKwlpZiAoIWJ5dGVzX3JlYWQgfHwgKGJ5dGVzX3JlYWQgJiYgZXJyX2Jsb2NrX2VycihyZXQpKSkKKwkJYnl0ZXNfcmVhZCA9IHJldDsKKworCWRwcmludGsoIiVzOiByZXR1cm5pbmcgJVpkXG4iLCBiZC0+bmFtZSwgYnl0ZXNfcmVhZCk7CisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2RldmljZSAqYnNnX2FsbG9jX2RldmljZSh2b2lkKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZDsKKworCWJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJzZ19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWJkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaW5pdCgmYmQtPmxvY2spOworCisJYmQtPm1heF9xdWV1ZSA9IEJTR19ERUZBVUxUX0NNRFM7CisKKwlJTklUX0xJU1RfSEVBRCgmYmQtPmJ1c3lfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJkLT5kb25lX2xpc3QpOworCUlOSVRfSExJU1RfTk9ERSgmYmQtPmRldl9saXN0KTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJkLT53cV9mcmVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiZC0+d3FfZG9uZSk7CisJcmV0dXJuIGJkOworfQorCitzdGF0aWMgaW50IGJzZ19wdXRfZGV2aWNlKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmJkLT5yZWZfY291bnQpKQorCQlnb3RvIG91dDsKKworCWRwcmludGsoIiVzOiB0ZWFyaW5nIGRvd25cbiIsIGJkLT5uYW1lKTsKKworCS8qCisJICogY2xvc2UgY2FuIGFsd2F5cyBibG9jaworCSAqLworCXNldF9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpOworCisJLyoKKwkgKiBjb3JyZWN0IGVycm9yIGRldGVjdGlvbiBiYWRkaWVzIGhlcmUgYWdhaW4uIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5CisJICogb2YgdGhlIGFwcCB0byBwcm9wZXJseSByZWFwIGNvbW1hbmRzIGJlZm9yZSBjbG9zZSgpIGlmIGl0IHdhbnRzCisJICogZm9vbC1wcm9vZiBlcnJvciBkZXRlY3Rpb24KKwkgKi8KKwlyZXQgPSBic2dfY29tcGxldGVfYWxsX2NvbW1hbmRzKGJkKTsKKworCWJsa19wdXRfcXVldWUoYmQtPnF1ZXVlKTsKKwlobGlzdF9kZWwoJmJkLT5kZXZfbGlzdCk7CisJa2ZyZWUoYmQpOworb3V0OgorCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGJzZ19kZXZpY2UgKmJzZ19hZGRfZGV2aWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnEsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBOVUxMOworI2lmZGVmIEJTR19ERUJVRworCXVuc2lnbmVkIGNoYXIgYnVmWzMyXTsKKyNlbmRpZgorCisJYmQgPSBic2dfYWxsb2NfZGV2aWNlKCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwliZC0+cXVldWUgPSBycTsKKwlrb2JqZWN0X2dldCgmcnEtPmtvYmopOworCWJzZ19zZXRfYmxvY2soYmQsIGZpbGUpOworCisJYXRvbWljX3NldCgmYmQtPnJlZl9jb3VudCwgMSk7CisJYmQtPm1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwltdXRleF9sb2NrKCZic2dfbXV0ZXgpOworCWhsaXN0X2FkZF9oZWFkKCZiZC0+ZGV2X2xpc3QsICZic2dfZGV2aWNlX2xpc3RbYnNnX2xpc3RfaWR4KGJkLT5taW5vcildKTsKKworCXN0cm5jcHkoYmQtPm5hbWUsIHJxLT5ic2dfZGV2LmNsYXNzX2Rldi0+Y2xhc3NfaWQsIHNpemVvZihiZC0+bmFtZSkgLSAxKTsKKwlkcHJpbnRrKCJib3VuZCB0byA8JXM+LCBtYXggcXVldWUgJWRcbiIsCisJCWZvcm1hdF9kZXZfdChidWYsIGlub2RlLT5pX3JkZXYpLCBiZC0+bWF4X3F1ZXVlKTsKKworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gYmQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2RldmljZSAqX19ic2dfZ2V0X2RldmljZShpbnQgbWlub3IpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QgPSAmYnNnX2RldmljZV9saXN0W2JzZ19saXN0X2lkeChtaW5vcildOworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCisJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKworCWhsaXN0X2Zvcl9lYWNoKGVudHJ5LCBsaXN0KSB7CisJCWJkID0gaGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBic2dfZGV2aWNlLCBkZXZfbGlzdCk7CisJCWlmIChiZC0+bWlub3IgPT0gbWlub3IpIHsKKwkJCWF0b21pY19pbmMoJmJkLT5yZWZfY291bnQpOworCQkJYnJlYWs7CisJCX0KKworCQliZCA9IE5VTEw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZic2dfbXV0ZXgpOworCXJldHVybiBiZDsKK30KKworc3RhdGljIHN0cnVjdCBic2dfZGV2aWNlICpic2dfZ2V0X2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBfX2JzZ19nZXRfZGV2aWNlKGltaW5vcihpbm9kZSkpOworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QsICpfX2JjZDsKKworCWlmIChiZCkKKwkJcmV0dXJuIGJkOworCisJLyoKKwkgKiBmaW5kIHRoZSBjbGFzcyBkZXZpY2UKKwkgKi8KKwliY2QgPSBOVUxMOworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2JjZCwgJmJzZ19jbGFzc19saXN0LCBsaXN0KSB7CisJCWlmIChfX2JjZC0+bWlub3IgPT0gaW1pbm9yKGlub2RlKSkgeworCQkJYmNkID0gX19iY2Q7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CisKKwlpZiAoIWJjZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlyZXR1cm4gYnNnX2FkZF9kZXZpY2UoaW5vZGUsIGJjZC0+cXVldWUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGJzZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGJzZ19nZXRfZGV2aWNlKGlub2RlLCBmaWxlKTsKKworCWlmIChJU19FUlIoYmQpKQorCQlyZXR1cm4gUFRSX0VSUihiZCk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBiZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBic2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiBic2dfcHV0X2RldmljZShiZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnNnX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmYmQtPndxX2RvbmUsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmYmQtPndxX2ZyZWUsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCWlmICghbGlzdF9lbXB0eSgmYmQtPmRvbmVfbGlzdCkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoYmQtPnF1ZXVlZF9jbWRzID49IGJkLT5tYXhfcXVldWUpCisJCW1hc2sgfD0gUE9MTE9VVDsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50Citic2dfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IF9fdXNlciAqdWFyZyA9IChpbnQgX191c2VyICopIGFyZzsKKworCWlmICghYmQpCisJCXJldHVybiAtRU5YSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCQkvKgorCQkgKiBvdXIgb3duIGlvY3RscworCQkgKi8KKwljYXNlIFNHX0dFVF9DT01NQU5EX1E6CisJCXJldHVybiBwdXRfdXNlcihiZC0+bWF4X3F1ZXVlLCB1YXJnKTsKKwljYXNlIFNHX1NFVF9DT01NQU5EX1E6IHsKKwkJaW50IHF1ZXVlOworCisJCWlmIChnZXRfdXNlcihxdWV1ZSwgdWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHF1ZXVlIDwgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJYmQtPm1heF9xdWV1ZSA9IHF1ZXVlOworCQlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTQ1NJL3NnIGlvY3RscworCSAqLworCWNhc2UgU0dfR0VUX1ZFUlNJT05fTlVNOgorCWNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSOgorCWNhc2UgU0dfU0VUX1RJTUVPVVQ6CisJY2FzZSBTR19HRVRfVElNRU9VVDoKKwljYXNlIFNHX0dFVF9SRVNFUlZFRF9TSVpFOgorCWNhc2UgU0dfU0VUX1JFU0VSVkVEX1NJWkU6CisJY2FzZSBTR19FTVVMQVRFRF9IT1NUOgorCWNhc2UgU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQ6IHsKKwkJdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZSwgYmQtPnF1ZXVlLCBOVUxMLCBjbWQsIHVhcmcpOworCX0KKwljYXNlIFNHX0lPOiB7CisJCXN0cnVjdCByZXF1ZXN0ICpycTsKKwkJc3RydWN0IGJpbyAqYmlvLCAqYmlkaV9iaW8gPSBOVUxMOworCQlzdHJ1Y3Qgc2dfaW9fdjQgaGRyOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCB1YXJnLCBzaXplb2YoaGRyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlycSA9IGJzZ19tYXBfaGRyKGJkLCAmaGRyKTsKKwkJaWYgKElTX0VSUihycSkpCisJCQlyZXR1cm4gUFRSX0VSUihycSk7CisKKwkJYmlvID0gcnEtPmJpbzsKKwkJaWYgKHJxLT5uZXh0X3JxKQorCQkJYmlkaV9iaW8gPSBycS0+bmV4dF9ycS0+YmlvOworCQlibGtfZXhlY3V0ZV9ycShiZC0+cXVldWUsIE5VTEwsIHJxLCAwKTsKKwkJYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKHJxLCAmaGRyLCBiaW8sIGJpZGlfYmlvKTsKKworCQlpZiAoY29weV90b191c2VyKHVhcmcsICZoZHIsIHNpemVvZihoZHIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIGJsb2NrIGRldmljZSBpb2N0bHMKKwkgKi8KKwlkZWZhdWx0OgorI2lmIDAKKwkJcmV0dXJuIGlvY3RsX2J5X2JkZXYoYmQtPmJkZXYsIGNtZCwgYXJnKTsKKyNlbHNlCisJCXJldHVybiAtRU5PVFRZOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBic2dfZm9wcyA9IHsKKwkucmVhZAkJPQlic2dfcmVhZCwKKwkud3JpdGUJCT0JYnNnX3dyaXRlLAorCS5wb2xsCQk9CWJzZ19wb2xsLAorCS5vcGVuCQk9CWJzZ19vcGVuLAorCS5yZWxlYXNlCT0JYnNnX3JlbGVhc2UsCisJLmlvY3RsCQk9CWJzZ19pb2N0bCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCit2b2lkIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QgPSAmcS0+YnNnX2RldjsKKworCWlmICghYmNkLT5jbGFzc19kZXYpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnEtPmtvYmosICJic2ciKTsKKwljbGFzc19kZXZpY2VfZGVzdHJveShic2dfY2xhc3MsIE1LREVWKEJTR19NQUpPUiwgYmNkLT5taW5vcikpOworCWJjZC0+Y2xhc3NfZGV2ID0gTlVMTDsKKwlsaXN0X2RlbF9pbml0KCZiY2QtPmxpc3QpOworCWJzZ19kZXZpY2VfbnItLTsKKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChic2dfdW5yZWdpc3Rlcl9xdWV1ZSk7CisKK2ludCBic2dfcmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgKmJjZCwgKl9fYmNkOworCWRldl90IGRldjsKKwlpbnQgcmV0ID0gLUVNRklMRTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSBOVUxMOworCisJLyoKKwkgKiB3ZSBuZWVkIGEgcHJvcGVyIHRyYW5zcG9ydCB0byBzZW5kIGNvbW1hbmRzLCBub3QgYSBzdGFja2VkIGRldmljZQorCSAqLworCWlmICghcS0+cmVxdWVzdF9mbikKKwkJcmV0dXJuIDA7CisKKwliY2QgPSAmcS0+YnNnX2RldjsKKwltZW1zZXQoYmNkLCAwLCBzaXplb2YoKmJjZCkpOworCUlOSVRfTElTVF9IRUFEKCZiY2QtPmxpc3QpOworCisJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKwlpZiAoYnNnX2RldmljZV9uciA9PSBCU0dfTUFYX0RFVlMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJic2c6IHRvbyBtYW55IGJzZyBkZXZpY2VzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCityZXRyeToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9fYmNkLCAmYnNnX2NsYXNzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKF9fYmNkLT5taW5vciA9PSBic2dfbWlub3JfaWR4KSB7CisJCQlic2dfbWlub3JfaWR4Kys7CisJCQlpZiAoYnNnX21pbm9yX2lkeCA9PSBCU0dfTUFYX0RFVlMpCisJCQkJYnNnX21pbm9yX2lkeCA9IDA7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCisJYmNkLT5taW5vciA9IGJzZ19taW5vcl9pZHgrKzsKKwlpZiAoYnNnX21pbm9yX2lkeCA9PSBCU0dfTUFYX0RFVlMpCisJCWJzZ19taW5vcl9pZHggPSAwOworCisJYmNkLT5xdWV1ZSA9IHE7CisJZGV2ID0gTUtERVYoQlNHX01BSk9SLCBiY2QtPm1pbm9yKTsKKwljbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGJzZ19jbGFzcywgTlVMTCwgZGV2LCBiY2QtPmRldiwgIiVzIiwgbmFtZSk7CisJaWYgKElTX0VSUihjbGFzc19kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIoY2xhc3NfZGV2KTsKKwkJZ290byBlcnI7CisJfQorCWJjZC0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2OworCisJaWYgKHEtPmtvYmouc2QpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJnEtPmtvYmosICZiY2QtPmNsYXNzX2Rldi0+a29iaiwgImJzZyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmYmNkLT5saXN0LCAmYnNnX2NsYXNzX2xpc3QpOworCWJzZ19kZXZpY2VfbnIrKzsKKworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAoY2xhc3NfZGV2KQorCQljbGFzc19kZXZpY2VfZGVzdHJveShic2dfY2xhc3MsIE1LREVWKEJTR19NQUpPUiwgYmNkLT5taW5vcikpOworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnNnX3JlZ2lzdGVyX3F1ZXVlKTsKKworc3RhdGljIGludCBic2dfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsX2Rldiwgc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xfaW50ZikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gdG9fc2NzaV9kZXZpY2UoY2xfZGV2LT5kZXYpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSA9IHNkcC0+cmVxdWVzdF9xdWV1ZTsKKworCWlmIChycS0+a29iai5wYXJlbnQpCisJCXJldCA9IGJzZ19yZWdpc3Rlcl9xdWV1ZShycSwga29iamVjdF9uYW1lKHJxLT5rb2JqLnBhcmVudCkpOworCWVsc2UKKwkJcmV0ID0gYnNnX3JlZ2lzdGVyX3F1ZXVlKHJxLCBrb2JqZWN0X25hbWUoJnNkcC0+c2Rldl9nZW5kZXYua29iaikpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJzZ19yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xfZGV2LCBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbF9pbnRmKQoreworCWJzZ191bnJlZ2lzdGVyX3F1ZXVlKHRvX3Njc2lfZGV2aWNlKGNsX2Rldi0+ZGV2KS0+cmVxdWVzdF9xdWV1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlIGJzZ19pbnRmID0geworCS5hZGQJPSBic2dfYWRkLAorCS5yZW1vdmUJPSBic2dfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBjZGV2IGJzZ19jZGV2ID0geworCS5rb2JqICAgPSB7Lm5hbWUgPSAiYnNnIiwgfSwKKwkub3duZXIgID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBic2dfaW5pdCh2b2lkKQoreworCWludCByZXQsIGk7CisKKwlic2dfY21kX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJic2dfY21kIiwKKwkJCQlzaXplb2Yoc3RydWN0IGJzZ19jb21tYW5kKSwgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKCFic2dfY21kX2NhY2hlcCkgeworCQlwcmludGsoS0VSTl9FUlIgImJzZzogZmFpbGVkIGNyZWF0aW5nIHNsYWIgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQlNHX0xJU1RfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJmJzZ19kZXZpY2VfbGlzdFtpXSk7CisKKwlic2dfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJic2ciKTsKKwlpZiAoSVNfRVJSKGJzZ19jbGFzcykpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJcmV0dXJuIFBUUl9FUlIoYnNnX2NsYXNzKTsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKEJTR19NQUpPUiwgMCksIEJTR19NQVhfREVWUywgImJzZyIpOworCWlmIChyZXQpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNkZXZfaW5pdCgmYnNnX2NkZXYsICZic2dfZm9wcyk7CisJcmV0ID0gY2Rldl9hZGQoJmJzZ19jZGV2LCBNS0RFVihCU0dfTUFKT1IsIDApLCBCU0dfTUFYX0RFVlMpOworCWlmIChyZXQpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoQlNHX01BSk9SLCAwKSwgQlNHX01BWF9ERVZTKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzY3NpX3JlZ2lzdGVyX2ludGVyZmFjZSgmYnNnX2ludGYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJic2c6IGZhaWxlZCByZWdpc3RlciBzY3NpIGludGVyZmFjZSAlZFxuIiwgcmV0KTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQl1bnJlZ2lzdGVyX2NocmRldihCU0dfTUFKT1IsICJic2ciKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyBsb2FkZWRcbiIsIGJzZ192ZXJzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiSmVucyBBeGJvZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbG9jayBsYXllciBTR1NJIGdlbmVyaWMgKHNnKSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworZGV2aWNlX2luaXRjYWxsKGJzZ19pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IGUwYWE0ZGEuLjk3NTVhM2MgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMTI1MSw5ICsxMjUxLDkgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAotCWNpYyA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfaW9jX3Bvb2wsIGdmcF9tYXNrLCBjZnFkLT5xdWV1ZS0+bm9kZSk7CisJY2ljID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNmcV9pb2NfcG9vbCwgZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQkJCWNmcWQtPnF1ZXVlLT5ub2RlKTsKIAlpZiAoY2ljKSB7Ci0JCW1lbXNldChjaWMsIDAsIHNpemVvZigqY2ljKSk7CiAJCWNpYy0+bGFzdF9lbmRfcmVxdWVzdCA9IGppZmZpZXM7CiAJCUlOSVRfTElTVF9IRUFEKCZjaWMtPnF1ZXVlX2xpc3QpOwogCQljaWMtPmR0b3IgPSBjZnFfZnJlZV9pb19jb250ZXh0OwpAQCAtMTM3NiwxNyArMTM3NiwxOSBAQAogCQkJICogZnJlZSBtZW1vcnkuCiAJCQkgKi8KIAkJCXNwaW5fdW5sb2NrX2lycShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7Ci0JCQluZXdfY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwgZ2ZwX21hc2t8X19HRlBfTk9GQUlMLCBjZnFkLT5xdWV1ZS0+bm9kZSk7CisJCQluZXdfY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwKKwkJCQkJZ2ZwX21hc2sgfCBfX0dGUF9OT0ZBSUwgfCBfX0dGUF9aRVJPLAorCQkJCQljZnFkLT5xdWV1ZS0+bm9kZSk7CiAJCQlzcGluX2xvY2tfaXJxKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0gZWxzZSB7Ci0JCQljZnFxID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNmcV9wb29sLCBnZnBfbWFzaywgY2ZxZC0+cXVldWUtPm5vZGUpOworCQkJY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwKKwkJCQkJZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQljZnFkLT5xdWV1ZS0+bm9kZSk7CiAJCQlpZiAoIWNmcXEpCiAJCQkJZ290byBvdXQ7CiAJCX0KIAotCQltZW1zZXQoY2ZxcSwgMCwgc2l6ZW9mKCpjZnFxKSk7Ci0KIAkJUkJfQ0xFQVJfTk9ERSgmY2ZxcS0+cmJfbm9kZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5maWZvKTsKIApAQCAtMjA3OSwxMiArMjA4MSwxMCBAQAogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZDsKIAotCWNmcWQgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpjZnFkKSwgR0ZQX0tFUk5FTCwgcS0+bm9kZSk7CisJY2ZxZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmNmcWQpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+bm9kZSk7CiAJaWYgKCFjZnFkKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChjZnFkLCAwLCBzaXplb2YoKmNmcWQpKTsKLQogCWNmcWQtPnNlcnZpY2VfdHJlZSA9IENGUV9SQl9ST09UOwogCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5jaWNfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwppbmRleCA2ZDY3M2U5Li44N2NhMDJhIDEwMDY0NAotLS0gYS9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKKysrIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCkBAIC0zNjAsMTAgKzM2MCw5IEBACiB7CiAJc3RydWN0IGRlYWRsaW5lX2RhdGEgKmRkOwogCi0JZGQgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpkZCksIEdGUF9LRVJORUwsIHEtPm5vZGUpOworCWRkID0ga21hbGxvY19ub2RlKHNpemVvZigqZGQpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+bm9kZSk7CiAJaWYgKCFkZCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KGRkLCAwLCBzaXplb2YoKmRkKSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGQtPmZpZm9fbGlzdFtSRUFEXSk7CiAJSU5JVF9MSVNUX0hFQUQoJmRkLT5maWZvX2xpc3RbV1JJVEVdKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2VsZXZhdG9yLmMgYi9ibG9jay9lbGV2YXRvci5jCmluZGV4IDQ3NjlhMjUuLmQyNjU5NjMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2VsZXZhdG9yLmMKKysrIGIvYmxvY2svZWxldmF0b3IuYwpAQCAtMTc3LDExICsxNzcsMTAgQEAKIAllbGV2YXRvcl90ICplcTsKIAlpbnQgaTsKIAotCWVxID0ga21hbGxvY19ub2RlKHNpemVvZihlbGV2YXRvcl90KSwgR0ZQX0tFUk5FTCwgcS0+bm9kZSk7CisJZXEgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKGVsZXZhdG9yX3QpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+bm9kZSk7CiAJaWYgKHVubGlrZWx5KCFlcSkpCiAJCWdvdG8gZXJyOwogCi0JbWVtc2V0KGVxLCAwLCBzaXplb2YoKmVxKSk7CiAJZXEtPm9wcyA9ICZlLT5vcHM7CiAJZXEtPmVsZXZhdG9yX3R5cGUgPSBlOwogCWtvYmplY3RfaW5pdCgmZXEtPmtvYmopOwpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggODYzYThjMC4uM2FmMWU3YSAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC0xMDgsMjggKzEwOCwyNCBAQAogCiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2Jsa2Rldik7CiAKLS8qIHRvZG86IG1ha2Ugdm9pZCAtIGVycm9yIHByaW50ayBoZXJlICovCi1pbnQgdW5yZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lKQordm9pZCB1bnJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQgbWFqb3IsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGJsa19tYWpvcl9uYW1lICoqbjsKIAlzdHJ1Y3QgYmxrX21ham9yX25hbWUgKnAgPSBOVUxMOwogCWludCBpbmRleCA9IG1ham9yX3RvX2luZGV4KG1ham9yKTsKLQlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJmJsb2NrX3N1YnN5c19sb2NrKTsKIAlmb3IgKG4gPSAmbWFqb3JfbmFtZXNbaW5kZXhdOyAqbjsgbiA9ICYoKm4pLT5uZXh0KQogCQlpZiAoKCpuKS0+bWFqb3IgPT0gbWFqb3IpCiAJCQlicmVhazsKLQlpZiAoISpuIHx8IHN0cmNtcCgoKm4pLT5uYW1lLCBuYW1lKSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlIHsKKwlpZiAoISpuIHx8IHN0cmNtcCgoKm4pLT5uYW1lLCBuYW1lKSkgeworCQlXQVJOX09OKDEpOworCX0gZWxzZSB7CiAJCXAgPSAqbjsKIAkJKm4gPSBwLT5uZXh0OwogCX0KIAltdXRleF91bmxvY2soJmJsb2NrX3N1YnN5c19sb2NrKTsKIAlrZnJlZShwKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9ibGtkZXYpOwpAQCAtNzI2LDIxICs3MjIsMjEgQEAKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKIAotCWRpc2sgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBnZW5kaXNrKSwgR0ZQX0tFUk5FTCwgbm9kZV9pZCk7CisJZGlzayA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGdlbmRpc2spLAorCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBub2RlX2lkKTsKIAlpZiAoZGlzaykgewotCQltZW1zZXQoZGlzaywgMCwgc2l6ZW9mKHN0cnVjdCBnZW5kaXNrKSk7CiAJCWlmICghaW5pdF9kaXNrX3N0YXRzKGRpc2spKSB7CiAJCQlrZnJlZShkaXNrKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWlmIChtaW5vcnMgPiAxKSB7CiAJCQlpbnQgc2l6ZSA9IChtaW5vcnMgLSAxKSAqIHNpemVvZihzdHJ1Y3QgaGRfc3RydWN0ICopOwotCQkJZGlzay0+cGFydCA9IGttYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMLCBub2RlX2lkKTsKKwkJCWRpc2stPnBhcnQgPSBrbWFsbG9jX25vZGUoc2l6ZSwKKwkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgbm9kZV9pZCk7CiAJCQlpZiAoIWRpc2stPnBhcnQpIHsKIAkJCQlrZnJlZShkaXNrKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KLQkJCW1lbXNldChkaXNrLT5wYXJ0LCAwLCBzaXplKTsKIAkJfQogCQlkaXNrLT5taW5vcnMgPSBtaW5vcnM7CiAJCWtvYmpfc2V0X2tzZXRfcyhkaXNrLGJsb2NrX3N1YnN5cyk7CmRpZmYgLS1naXQgYS9ibG9jay9sbF9yd19ibGsuYyBiL2Jsb2NrL2xsX3J3X2Jsay5jCmluZGV4IGVmNDJiYjIuLmQ3Y2FkZjMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2xsX3J3X2Jsay5jCisrKyBiL2Jsb2NrL2xsX3J3X2Jsay5jCkBAIC0yNTYsNiArMjU2LDcgQEAKIAlycS0+ZW5kX2lvID0gTlVMTDsKIAlycS0+ZW5kX2lvX2RhdGEgPSBOVUxMOwogCXJxLT5jb21wbGV0aW9uX2RhdGEgPSBOVUxMOworCXJxLT5uZXh0X3JxID0gTlVMTDsKIH0KIAogLyoqCkBAIC0xODI4LDExICsxODI5LDExIEBACiB7CiAJcmVxdWVzdF9xdWV1ZV90ICpxOwogCi0JcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShyZXF1ZXN0cV9jYWNoZXAsIGdmcF9tYXNrLCBub2RlX2lkKTsKKwlxID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKHJlcXVlc3RxX2NhY2hlcCwKKwkJCQlnZnBfbWFzayB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwogCWlmICghcSkKIAkJcmV0dXJuIE5VTEw7CiAKLQltZW1zZXQocSwgMCwgc2l6ZW9mKCpxKSk7CiAJaW5pdF90aW1lcigmcS0+dW5wbHVnX3RpbWVyKTsKIAogCXNucHJpbnRmKHEtPmtvYmoubmFtZSwgS09CSl9OQU1FX0xFTiwgIiVzIiwgInF1ZXVlIik7CmRpZmYgLS1naXQgYS9ibG9jay9zY3NpX2lvY3RsLmMgYi9ibG9jay9zY3NpX2lvY3RsLmMKaW5kZXggZTgzZjFkYi4uYTI2YmEwNyAxMDA2NDQKLS0tIGEvYmxvY2svc2NzaV9pb2N0bC5jCisrKyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwpAQCAtNDEsOCArNDEsNiBAQAogCiBFWFBPUlRfU1lNQk9MKHNjc2lfY29tbWFuZF9zaXplKTsKIAotI2RlZmluZSBCTEtfREVGQVVMVF9USU1FT1VUCSg2MCAqIEhaKQotCiAjaW5jbHVkZSA8c2NzaS9zZy5oPgogCiBzdGF0aWMgaW50IHNnX2dldF92ZXJzaW9uKGludCBfX3VzZXIgKnApCkBAIC0xMTQsNyArMTEyLDcgQEAKICNkZWZpbmUgc2FmZV9mb3JfcmVhZChjbWQpCVtjbWRdID0gQ01EX1JFQURfU0FGRQogI2RlZmluZSBzYWZlX2Zvcl93cml0ZShjbWQpCVtjbWRdID0gQ01EX1dSSVRFX1NBRkUKIAotc3RhdGljIGludCB2ZXJpZnlfY29tbWFuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY2hhciAqY21kKQoraW50IGJsa192ZXJpZnlfY29tbWFuZCh1bnNpZ25lZCBjaGFyICpjbWQsIGludCBoYXNfd3JpdGVfcGVybSkKIHsKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBjbWRfdHlwZVsyNTZdID0gewogCkBAIC0xOTMsMTggKzE5MSwxMSBAQAogCQlzYWZlX2Zvcl93cml0ZShHUENNRF9TRVRfU1RSRUFNSU5HKSwKIAl9OwogCXVuc2lnbmVkIGNoYXIgdHlwZSA9IGNtZF90eXBlW2NtZFswXV07Ci0JaW50IGhhc193cml0ZV9wZXJtID0gMDsKIAogCS8qIEFueWJvZHkgd2hvIGNhbiBvcGVuIHRoZSBkZXZpY2UgY2FuIGRvIGEgcmVhZC1zYWZlIGNvbW1hbmQgKi8KIAlpZiAodHlwZSAmIENNRF9SRUFEX1NBRkUpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBmaWxlIGNhbiBiZSBOVUxMIGZyb20gaW9jdGxfYnlfYmRldigpLi4uCi0JICovCi0JaWYgKGZpbGUpCi0JCWhhc193cml0ZV9wZXJtID0gZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEU7Ci0KIAkvKiBXcml0ZS1zYWZlIGNvbW1hbmRzIGp1c3QgcmVxdWlyZSBhIHdyaXRhYmxlIG9wZW4uLiAqLwogCWlmICgodHlwZSAmIENNRF9XUklURV9TQUZFKSAmJiBoYXNfd3JpdGVfcGVybSkKIAkJcmV0dXJuIDA7CkBAIC0yMjEsMjUgKzIxMiw5NiBAQAogCS8qIE90aGVyd2lzZSBmYWlsIGl0IHdpdGggYW4gIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIiAqLwogCXJldHVybiAtRVBFUk07CiB9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfdmVyaWZ5X2NvbW1hbmQpOworCitpbnQgYmxrX2ZpbGxfc2doZHJfcnEocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCSAgICAgIHN0cnVjdCBzZ19pb19oZHIgKmhkciwgaW50IGhhc193cml0ZV9wZXJtKQoreworCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCisKKwlpZiAoY29weV9mcm9tX3VzZXIocnEtPmNtZCwgaGRyLT5jbWRwLCBoZHItPmNtZF9sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoYmxrX3ZlcmlmeV9jb21tYW5kKHJxLT5jbWQsIGhhc193cml0ZV9wZXJtKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQorCSAqLworCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOworCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOworCisJcnEtPnRpbWVvdXQgPSAoaGRyLT50aW1lb3V0ICogSFopIC8gMTAwMDsKKwlpZiAoIXJxLT50aW1lb3V0KQorCQlycS0+dGltZW91dCA9IHEtPnNnX3RpbWVvdXQ7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9TR19USU1FT1VUOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfZmlsbF9zZ2hkcl9ycSk7CisKKy8qCisgKiB1bm1hcCBhIHJlcXVlc3QgdGhhdCB3YXMgcHJldmlvdXNseSBtYXBwZWQgdG8gdGhpcyBzZ19pb19oZHIuIGhhbmRsZXMKKyAqIGJvdGggc2cgYW5kIG5vbi1zZyBzZ19pb19oZHIuCisgKi8KK2ludCBibGtfdW5tYXBfc2doZHJfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIpCit7CisJYmxrX3JxX3VubWFwX3VzZXIocnEtPmJpbyk7CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa191bm1hcF9zZ2hkcl9ycSk7CisKK2ludCBibGtfY29tcGxldGVfc2doZHJfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIsCisJCQkgIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgciwgcmV0ID0gMDsKKworCS8qCisJICogZmlsbCBpbiBhbGwgdGhlIG91dHB1dCBtZW1iZXJzCisJICovCisJaGRyLT5zdGF0dXMgPSBycS0+ZXJyb3JzICYgMHhmZjsKKwloZHItPm1hc2tlZF9zdGF0dXMgPSBzdGF0dXNfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPm1zZ19zdGF0dXMgPSBtc2dfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmhvc3Rfc3RhdHVzID0gaG9zdF9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+ZHJpdmVyX3N0YXR1cyA9IGRyaXZlcl9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+aW5mbyA9IDA7CisJaWYgKGhkci0+bWFza2VkX3N0YXR1cyB8fCBoZHItPmhvc3Rfc3RhdHVzIHx8IGhkci0+ZHJpdmVyX3N0YXR1cykKKwkJaGRyLT5pbmZvIHw9IFNHX0lORk9fQ0hFQ0s7CisJaGRyLT5yZXNpZCA9IHJxLT5kYXRhX2xlbjsKKwloZHItPnNiX2xlbl93ciA9IDA7CisKKwlpZiAocnEtPnNlbnNlX2xlbiAmJiBoZHItPnNicCkgeworCQlpbnQgbGVuID0gbWluKCh1bnNpZ25lZCBpbnQpIGhkci0+bXhfc2JfbGVuLCBycS0+c2Vuc2VfbGVuKTsKKworCQlpZiAoIWNvcHlfdG9fdXNlcihoZHItPnNicCwgcnEtPnNlbnNlLCBsZW4pKQorCQkJaGRyLT5zYl9sZW5fd3IgPSBsZW47CisJCWVsc2UKKwkJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcnEtPmJpbyA9IGJpbzsKKwlyID0gYmxrX3VubWFwX3NnaGRyX3JxKHJxLCBoZHIpOworCWlmIChyZXQpCisJCXIgPSByZXQ7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa19jb21wbGV0ZV9zZ2hkcl9ycSk7CiAKIHN0YXRpYyBpbnQgc2dfaW8oc3RydWN0IGZpbGUgKmZpbGUsIHJlcXVlc3RfcXVldWVfdCAqcSwKIAkJc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIHN0cnVjdCBzZ19pb19oZHIgKmhkcikKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUsIHRpbWVvdXQ7Ci0JaW50IHdyaXRpbmcgPSAwLCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwlpbnQgd3JpdGluZyA9IDAsIHJldCA9IDAsIGhhc193cml0ZV9wZXJtID0gMDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJY2hhciBzZW5zZVtTQ1NJX1NFTlNFX0JVRkZFUlNJWkVdOwotCXVuc2lnbmVkIGNoYXIgY21kW0JMS19NQVhfQ0RCXTsKIAlzdHJ1Y3QgYmlvICpiaW87CiAKIAlpZiAoaGRyLT5pbnRlcmZhY2VfaWQgIT0gJ1MnKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoaGRyLT5jbWRfbGVuID4gQkxLX01BWF9DREIpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGhkci0+Y21kcCwgaGRyLT5jbWRfbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHZlcmlmeV9jb21tYW5kKGZpbGUsIGNtZCkpCi0JCXJldHVybiAtRVBFUk07CiAKIAlpZiAoaGRyLT5keGZlcl9sZW4gPiAocS0+bWF4X2h3X3NlY3RvcnMgPDwgOSkpCiAJCXJldHVybiAtRUlPOwpAQCAtMjYwLDI1ICszMjIsMTMgQEAKIAlpZiAoIXJxKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qCi0JICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQotCSAqLwotCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOwotCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCi0JbWVtY3B5KHJxLT5jbWQsIGNtZCwgaGRyLT5jbWRfbGVuKTsKKwlpZiAoZmlsZSkKKwkJaGFzX3dyaXRlX3Blcm0gPSBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURTsKIAotCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7Ci0JcnEtPnNlbnNlID0gc2Vuc2U7Ci0JcnEtPnNlbnNlX2xlbiA9IDA7Ci0KLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKLQotCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGhkci0+dGltZW91dCk7Ci0JcnEtPnRpbWVvdXQgPSAodGltZW91dCA8IElOVF9NQVgpID8gdGltZW91dCA6IElOVF9NQVg7Ci0JaWYgKCFycS0+dGltZW91dCkKLQkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OwotCWlmICghcnEtPnRpbWVvdXQpCi0JCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfVElNRU9VVDsKKwlpZiAoYmxrX2ZpbGxfc2doZHJfcnEocSwgcnEsIGhkciwgaGFzX3dyaXRlX3Blcm0pKSB7CisJCWJsa19wdXRfcmVxdWVzdChycSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAogCWlmIChoZHItPmlvdmVjX2NvdW50KSB7CiAJCWNvbnN0IGludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBzZ19pb3ZlYykgKiBoZHItPmlvdmVjX2NvdW50OwpAQCAtMzA2LDYgKzM1Niw5IEBACiAJCWdvdG8gb3V0OwogCiAJYmlvID0gcnEtPmJpbzsKKwltZW1zZXQoc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOworCXJxLT5zZW5zZSA9IHNlbnNlOworCXJxLT5zZW5zZV9sZW4gPSAwOwogCXJxLT5yZXRyaWVzID0gMDsKIAogCXN0YXJ0X3RpbWUgPSBqaWZmaWVzOwpAQCAtMzE2LDMxICszNjksOSBAQAogCSAqLwogCWJsa19leGVjdXRlX3JxKHEsIGJkX2Rpc2ssIHJxLCAwKTsKIAotCS8qIHdyaXRlIHRvIGFsbCBvdXRwdXQgbWVtYmVycyAqLwotCWhkci0+c3RhdHVzID0gMHhmZiAmIHJxLT5lcnJvcnM7Ci0JaGRyLT5tYXNrZWRfc3RhdHVzID0gc3RhdHVzX2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5tc2dfc3RhdHVzID0gbXNnX2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5ob3N0X3N0YXR1cyA9IGhvc3RfYnl0ZShycS0+ZXJyb3JzKTsKLQloZHItPmRyaXZlcl9zdGF0dXMgPSBkcml2ZXJfYnl0ZShycS0+ZXJyb3JzKTsKLQloZHItPmluZm8gPSAwOwotCWlmIChoZHItPm1hc2tlZF9zdGF0dXMgfHwgaGRyLT5ob3N0X3N0YXR1cyB8fCBoZHItPmRyaXZlcl9zdGF0dXMpCi0JCWhkci0+aW5mbyB8PSBTR19JTkZPX0NIRUNLOwotCWhkci0+cmVzaWQgPSBycS0+ZGF0YV9sZW47CiAJaGRyLT5kdXJhdGlvbiA9ICgoamlmZmllcyAtIHN0YXJ0X3RpbWUpICogMTAwMCkgLyBIWjsKLQloZHItPnNiX2xlbl93ciA9IDA7CiAKLQlpZiAocnEtPnNlbnNlX2xlbiAmJiBoZHItPnNicCkgewotCQlpbnQgbGVuID0gbWluKCh1bnNpZ25lZCBpbnQpIGhkci0+bXhfc2JfbGVuLCBycS0+c2Vuc2VfbGVuKTsKLQotCQlpZiAoIWNvcHlfdG9fdXNlcihoZHItPnNicCwgcnEtPnNlbnNlLCBsZW4pKQotCQkJaGRyLT5zYl9sZW5fd3IgPSBsZW47Ci0JfQotCi0JaWYgKGJsa19ycV91bm1hcF91c2VyKGJpbykpCi0JCXJldCA9IC1FRkFVTFQ7Ci0KLQkvKiBtYXkgbm90IGhhdmUgc3VjY2VlZGVkLCBidXQgb3V0cHV0IHZhbHVlcyB3cml0dGVuIHRvIGNvbnRyb2wKLQkgKiBzdHJ1Y3R1cmUgKHN0cnVjdCBzZ19pb19oZHIpLiAgKi8KKwlyZXR1cm4gYmxrX2NvbXBsZXRlX3NnaGRyX3JxKHJxLCBoZHIsIGJpbyk7CiBvdXQ6CiAJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDI3LDcgKzQ1OCw3IEBACiAJaWYgKGluX2xlbiAmJiBjb3B5X2Zyb21fdXNlcihidWZmZXIsIHNpYy0+ZGF0YSArIGNtZGxlbiwgaW5fbGVuKSkKIAkJZ290byBlcnJvcjsKIAotCWVyciA9IHZlcmlmeV9jb21tYW5kKGZpbGUsIHJxLT5jbWQpOworCWVyciA9IGJsa192ZXJpZnlfY29tbWFuZChycS0+Y21kLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJvcjsKIApAQCAtNDU0LDcgKzQ4NSw3IEBACiAJCXJxLT5yZXRyaWVzID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9USU1FT1VUOworCQlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1NHX1RJTUVPVVQ7CiAJCWJyZWFrOwogCX0KIApAQCAtNTAxLDcgKzUzMiw3IEBACiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7CiAJcnEtPmRhdGEgPSBOVUxMOwogCXJxLT5kYXRhX2xlbiA9IDA7Ci0JcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9USU1FT1VUOworCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKIAltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKIAlycS0+Y21kWzBdID0gY21kOwogCXJxLT5jbWRbNF0gPSBkYXRhOwpAQCAtNTE3LDE2ICs1NDgsMTIgQEAKIAlyZXR1cm4gX19ibGtfc2VuZF9nZW5lcmljKHEsIGJkX2Rpc2ssIEdQQ01EX1NUQVJUX1NUT1BfVU5JVCwgZGF0YSk7CiB9CiAKLWludCBzY3NpX2NtZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCitpbnQgc2NzaV9jbWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkgICBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CiAJaW50IGVycjsKIAotCXEgPSBiZF9kaXNrLT5xdWV1ZTsKLQlpZiAoIXEpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAoYmxrX2dldF9xdWV1ZShxKSkKKwlpZiAoIXEgfHwgYmxrX2dldF9xdWV1ZShxKSkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCXN3aXRjaCAoY21kKSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vcHJvYy5jIGIvY3J5cHRvL3Byb2MuYwppbmRleCAxMDJjNzUxLi4zZDczMzIzIDEwMDY0NAotLS0gYS9jcnlwdG8vcHJvYy5jCisrKyBiL2NyeXB0by9wcm9jLmMKQEAgLTIzLDI0ICsyMywxMyBAQAogCiBzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnY7Ci0JbG9mZl90IG4gPSAqcG9zOwotCiAJZG93bl9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7Ci0JbGlzdF9mb3JfZWFjaCh2LCAmY3J5cHRvX2FsZ19saXN0KQotCQlpZiAoIW4tLSkKLQkJCXJldHVybiBsaXN0X2VudHJ5KHYsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZjcnlwdG9fYWxnX2xpc3QsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdiA9IHA7Ci0JCi0JKCpwb3MpKys7Ci0JdiA9IHYtPm5leHQ7Ci0JcmV0dXJuICh2ID09ICZjcnlwdG9fYWxnX2xpc3QpID8KLQkJTlVMTCA6IGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dChwLCAmY3J5cHRvX2FsZ19saXN0LCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQpAQCAtNTAsNyArMzksNyBAQAogCiBzdGF0aWMgaW50IGNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IChzdHJ1Y3QgY3J5cHRvX2FsZyAqKXA7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKIAkKIAlzZXFfcHJpbnRmKG0sICJuYW1lICAgICAgICAgOiAlc1xuIiwgYWxnLT5jcmFfbmFtZSk7CiAJc2VxX3ByaW50ZihtLCAiZHJpdmVyICAgICAgIDogJXNcbiIsIGFsZy0+Y3JhX2RyaXZlcl9uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL0tjb25maWcgYi9kcml2ZXJzL2F0bS9LY29uZmlnCmluZGV4IDViNGZhYjIuLmJiNGFlNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL0tjb25maWcKKysrIGIvZHJpdmVycy9hdG0vS2NvbmZpZwpAQCAtMTQyLDcgKzE0Miw3IEBACiAKIGNvbmZpZyBBVE1fRklSRVNUUkVBTQogCXRyaXN0YXRlICJGdWppdHN1IEZpcmVTdHJlYW0gKEZTNTAvRlMxNTUpICIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgRHJpdmVyIGZvciB0aGUgRnVqaXRzdSBGaXJlU3RyZWFtIDE1NSAoTUI4NjY5NykgYW5kCiAJICBGaXJlU3RyZWFtIDUwIChNQjg2Njk1KSBBVE0gUENJIGNoaXBzLgpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIGNvbmZpZyBBVE1fWkFUTQogCXRyaXN0YXRlICJaZWl0TmV0IFpOMTIyMS9aTjEyMjUiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIERyaXZlciBmb3IgdGhlIFplaXROZXQgWk4xMjIxIChNTUYpIGFuZCBaTjEyMjUgKFVUUC01KSAxNTUgTWJwcyBBVE0KIAkgIGFkYXB0ZXJzLgpAQCAtMjQwLDcgKzI0MCw3IEBACiAKIGNvbmZpZyBBVE1fQU1CQVNTQURPUgogCXRyaXN0YXRlICJNYWRnZSBBbWJhc3NhZG9yIChDb2xsYWdlIFBDSSAxNTUgU2VydmVyKSIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJc2VsZWN0IEJJVFJFVkVSU0UKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBBVE1pemVyIGJhc2VkIEFUTSBjYXJkIHByb2R1Y2VkIGJ5IE1hZGdlCkBAIC0yNjUsNyArMjY1LDcgQEAKIAogY29uZmlnIEFUTV9IT1JJWk9OCiAJdHJpc3RhdGUgIk1hZGdlIEhvcml6b24gW1VsdHJhXSAoQ29sbGFnZSBQQ0kgMjUgYW5kIENvbGxhZ2UgUENJIDE1NSBDbGllbnQpIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgSG9yaXpvbiBjaGlwc2V0IEFUTSBhZGFwdGVyIGNhcmRzIG9uY2UKIAkgIHByb2R1Y2VkIGJ5IE1hZGdlIE5ldHdvcmtzIEx0ZC4gU2F5IFkgKG9yIE0gdG8gY29tcGlsZSBhcyBhIG1vZHVsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdXhkaXNwbGF5L0tjb25maWcgYi9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZwppbmRleCBlYTRmZTNlLi5kZTJmY2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZworKysgYi9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZwpAQCAtNSw4ICs1LDExIEBACiAjIEF1eGlsaWFyeSBkaXNwbGF5IGRyaXZlcnMgY29uZmlndXJhdGlvbi4KICMKIAotbWVudSAiQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydCIKK21lbnVjb25maWcgQVVYRElTUExBWQogCWRlcGVuZHMgb24gUEFSUE9SVAorCWJvb2wgIkF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQiCisKK2lmIEFVWERJU1BMQVkgJiYgUEFSUE9SVAogCiBjb25maWcgS1MwMTA4CiAJdHJpc3RhdGUgIktTMDEwOCBMQ0QgQ29udHJvbGxlciIKQEAgLTExMSw0ICsxMTQsNSBAQAogCiAJICBJZiB5b3UgY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCB5b3UgY2FuIHN0aWxsIG92ZXJyaWRlIHRoaXMKIAkgIHZhbHVlIHVzaW5nIHRoZSBtb2R1bGUgcGFyYW1ldGVycy4KLWVuZG1lbnUKKworZW5kaWYgIyBBVVhESVNQTEFZCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jIGIvZHJpdmVycy9iYXNlL2RtYXBvb2wuYwppbmRleCA5MTk3MGU5Li43NjQ3YWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCX0gZWxzZSBpZiAoYWxsb2NhdGlvbiA8IHNpemUpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKCEocmV0dmFsID0ga21hbGxvYyAoc2l6ZW9mICpyZXR2YWwsIEdGUF9LRVJORUwpKSkKKwlpZiAoIShyZXR2YWwgPSBrbWFsbG9jX25vZGUgKHNpemVvZiAqcmV0dmFsLCBHRlBfS0VSTkVMLCBkZXZfdG9fbm9kZShkZXYpKSkpCiAJCXJldHVybiByZXR2YWw7CiAKIAlzdHJsY3B5IChyZXR2YWwtPm5hbWUsIG5hbWUsIHNpemVvZiByZXR2YWwtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9LY29uZmlnIGIvZHJpdmVycy9ibG9jay9LY29uZmlnCmluZGV4IDZlMjNhZjEuLjhmNjViODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svS2NvbmZpZworKysgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKQEAgLTU5LDE3ICs1OSw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB6MnJhbS4KIAotY29uZmlnIEFUQVJJX1NMTQotCXRyaXN0YXRlICJBdGFyaSBTTE0gbGFzZXIgcHJpbnRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVRBUkkKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBBdGFyaSBTTE0gbGFzZXIgcHJpbnRlciwgc2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvcgotCSAgaXQgaW4gdGhlIGtlcm5lbC4gT3RoZXJ3aXNlLCBzYXkgTi4gVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMKLQkgIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZSBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZQotCSAgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLiBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCi0JICBhY3NpX3NsbS4gQmUgd2FybmVkOiB0aGUgZHJpdmVyIG5lZWRzIG11Y2ggU1QtUkFNIGFuZCBjYW4gY2F1c2UKLQkgIHByb2JsZW1zIGR1ZSB0byB0aGF0IGZhY3QhCi0KIGNvbmZpZyBCTEtfREVWX1hECiAJdHJpc3RhdGUgIlhUIGhhcmQgZGlzayBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNBICYmIElTQV9ETUFfQVBJCkBAIC0xMTMsNyArMTAyLDcgQEAKIAogY29uZmlnIEJMS19DUFFfREEKIAl0cmlzdGF0ZSAiQ29tcGFxIFNNQVJUMiBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIENvbXBhcSBTbWFydCBBcnJheSBjb250cm9sbGVycy4gIEV2ZXJ5b25lCiAJICB1c2luZyB0aGVzZSBib2FyZHMgc2hvdWxkIHNheSBZIGhlcmUuICBTZWUgdGhlIGZpbGUKQEAgLTQyMyw2ICs0MTIsMTkgQEAKIAlUaGlzIGRyaXZlciBwcm92aWRlcyBTdXBwb3J0IGZvciBBVEEgb3ZlciBFdGhlcm5ldCBibG9jawogCWRldmljZXMgbGlrZSB0aGUgQ29yYWlkIEV0aGVyRHJpdmUgKFIpIFN0b3JhZ2UgQmxhZGUuCiAKK2NvbmZpZyBTVU5WREMKKwl0cmlzdGF0ZSAiU3VuIFZpcnR1YWwgRGlzayBDbGllbnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNVTl9MRE9NUworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHZpcnR1YWwgZGlzayBkZXZpY2VzIGFzIGEgY2xpZW50IHVuZGVyIFN1bgorCSAgTG9naWNhbCBEb21haW5zLgorCiBzb3VyY2UgImRyaXZlcnMvczM5MC9ibG9jay9LY29uZmlnIgogCitjb25maWcgWElMSU5YX1NZU0FDRQorCXRyaXN0YXRlICJYaWxpbnggU3lzdGVtQUNFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiA0eHgKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBYaWxpbnggU3lzdGVtQUNFIENvbXBhY3RGbGFzaCBpbnRlcmZhY2UKKwogZW5kaWYgIyBCTEtfREVWCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlIGIvZHJpdmVycy9ibG9jay9NYWtlZmlsZQppbmRleCBlNWY5OGFjLi45ZWUwOGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKQEAgLTksNyArOSw2IEBACiBvYmotJChDT05GSUdfQkxLX0RFVl9GRCkJKz0gZmxvcHB5Lm8KIG9iai0kKENPTkZJR19BTUlHQV9GTE9QUFkpCSs9IGFtaWZsb3Aubwogb2JqLSQoQ09ORklHX0FUQVJJX0ZMT1BQWSkJKz0gYXRhZmxvcC5vCi1vYmotJChDT05GSUdfQVRBUklfU0xNKQkJKz0gYWNzaV9zbG0ubwogb2JqLSQoQ09ORklHX0FNSUdBX1oyUkFNKQkrPSB6MnJhbS5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9SQU0pCSs9IHJkLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0xPT1ApCSs9IGxvb3AubwpAQCAtMTgsNyArMTcsOSBAQAogb2JqLSQoQ09ORklHX0JMS19DUFFfREEpCSs9IGNwcWFycmF5Lm8KIG9iai0kKENPTkZJR19CTEtfQ1BRX0NJU1NfREEpICArPSBjY2lzcy5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9EQUM5NjApCSs9IERBQzk2MC5vCitvYmotJChDT05GSUdfWElMSU5YX1NZU0FDRSkJKz0geHN5c2FjZS5vCiBvYmotJChDT05GSUdfQ0RST01fUEtUQ0RWRCkJKz0gcGt0Y2R2ZC5vCitvYmotJChDT05GSUdfU1VOVkRDKQkJKz0gc3VudmRjLm8KIAogb2JqLSQoQ09ORklHX0JMS19ERVZfVU1FTSkJKz0gdW1lbS5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9OQkQpCSs9IG5iZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMgYi9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWQ5YjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMiArMCwwIEBACi0vKgotICogYWNzaV9zbG0uYyAtLSBEZXZpY2UgZHJpdmVyIGZvciB0aGUgQXRhcmkgU0xNIGxhc2VyIHByaW50ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMTk5NSBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICogCi0gKi8KLQotLyoKLQotTm90ZXM6Ci0KLVRoZSBtYWpvciBudW1iZXIgZm9yIFNMTSBwcmludGVycyBpcyAyOCAobGlrZSBBQ1NJKSwgYnV0IGFzIGEgY2hhcmFjdGVyCi1kZXZpY2UsIG5vdCBibG9jayBkZXZpY2UuIFRoZSBtaW5vciBudW1iZXIgaXMgdGhlIG51bWJlciBvZiB0aGUgcHJpbnRlciAoaWYKLXlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgU0xNOyBjdXJyZW50bHkgbWF4LiAyICgjZGVmaW5lLWNvbnN0YW50KSBTTE1zIGFyZQotc3VwcG9ydGVkKS4gVGhlIGRldmljZSBjYW4gYmUgb3BlbmVkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiBJZiByZWFkaW5nIGl0LAoteW91IGdldCBzb21lIHN0YXR1cyBpbmZvcyAoTU9ERSBTRU5TRSBkYXRhKS4gV3JpdGluZyBtb2RlIGlzIHVzZWQgZm9yIHRoZSBkYXRhCi10byBiZSBwcmludGVkLiBTb21lIGlvY3RscyBhbGxvdyB0byBnZXQgdGhlIHByaW50ZXIgc3RhdHVzIGFuZCB0byB0dW5lIHByaW50ZXIKLW1vZGVzIGFuZCBzb21lIGludGVybmFsIHZhcmlhYmxlcy4KLQotQSBzcGVjaWFsIHByb2JsZW0gb2YgdGhlIFNMTSBkcml2ZXIgaXMgdGhlIHRpbWluZyBhbmQgdGh1cyB0aGUgYnVmZmVyaW5nIG9mCi10aGUgcHJpbnQgZGF0YS4gVGhlIHByb2JsZW0gaXMgdGhhdCBhbGwgdGhlIGRhdGEgZm9yIG9uZSBwYWdlIG11c3QgYmUgcHJlc2VudAotaW4gbWVtb3J5IHdoZW4gcHJpbnRpbmcgc3RhcnRzLCBlbHNlIC0td2hlbiBzd2FwcGluZyBvY2N1cnMtLSB0aGUgdGltaW5nIGNvdWxkCi1ub3QgYmUgZ3VhcmFudGVlZC4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBhc3N1cmUgdGhpczoKLQotIDEpIFJlc2VydmUgYSBidWZmZXIgb2YgMTE5NmsgKG1heGltdW0gcGFnZSBzaXplKSBzdGF0aWNhbGx5IGJ5Ci0gICAgYXRhcmlfc3RyYW1fYWxsb2MoKS4gVGhlIGRhdGEgYXJlIGNvbGxlY3RlZCB0aGVyZSB1bnRpbCB0aGV5J3JlIGNvbXBsZXRlLAotCWFuZCB0aGVuIHByaW50aW5nIHN0YXJ0cy4gU2luY2UgdGhlIGJ1ZmZlciBpcyByZXNlcnZlZCwgbm8gZnVydGhlcgotCWNvbnNpZGVyYXRpb25zIGFib3V0IG1lbW9yeSBhbmQgc3dhcHBpbmcgYXJlIG5lZWRlZC4gU28gdGhpcyBpcyB0aGUKLQlzaW1wbGVzdCBtZXRob2QsIGJ1dCBpdCBuZWVkcyBhIGxvdCBvZiBtZW1vcnkgZm9yIGp1c3QgdGhlIFNMTS4KLQotICAgIEFuIHN0cmlraW5nIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyAoc3VwcG9zZWQgdGhlIFNMTV9DT05UX0NOVF9SRVBST0cKLQltZXRob2Qgd29ya3MsIHNlZSB0aGVyZSksIHRoYXQgdGhlcmUgYXJlIG5vIHRpbWluZyBwcm9ibGVtcyB3aXRoIHRoZSBETUEKLQlhbnltb3JlLgotCQotIDIpIFRoZSBvdGhlciBtZXRob2Qgd291bGQgYmUgdG8gcmVzZXJ2ZSB0aGUgYnVmZmVyIGR5bmFtaWNhbGx5IGVhY2ggdGltZQotICAgIHByaW50aW5nIGlzIHJlcXVpcmVkLiBJIGNvdWxkIHRoaW5rIG9mIGxvb2tpbmcgYXQgbWVtX21hcCB3aGVyZSB0aGUKLQlsYXJnZXN0IHVuYWxsb2N0ZWQgU1QtUkFNIGFyZWEgaXMsIHRha2luZyB0aGUgYXJlYSwgYW5kIHRoZW4gZXh0ZW5kaW5nIGl0Ci0JYnkgc3dhcHBpbmcgb3V0IHRoZSBuZWlnaGJvcmVkIHBhZ2VzLCB1bnRpbCB0aGUgbmVlZGVkIHNpemUgaXMgcmVhY2hlZC4KLQlUaGlzIHJlcXVpcmVzIHNvbWUgbW0gaGFja2luZywgYnV0IHNlZW1zIHBvc3NpYmxlLiBUaGUgb25seSBvYnN0YWNsZSBjb3VsZAotCWJlIHBhZ2VzIHRoYXQgY2Fubm90IGJlIHN3YXBwZWQgb3V0IChyZXNlcnZlZCBwYWdlcykuLi4KLQotIDMpIEFub3RoZXIgcG9zc2liaWxpdHkgd291bGQgYmUgdG8gbGVhdmUgdGhlIHJlYWwgZGF0YSBpbiB1c2VyIHNwYWNlIGFuZCB0bwotICAgIHdvcmsgd2l0aCB0d28gZHJpYmJsZSBidWZmZXJzIG9mIGFib3V0IDMyayBpbiB0aGUgZHJpdmVyOiBXaGlsZSB0aGUgb25lCi0JYnVmZmVyIGlzIERNQWVkIHRvIHRoZSBTTE0sIHRoZSBvdGhlciBjYW4gYmUgZmlsbGVkIHdpdGggbmV3IGRhdGEuIEJ1dAotCXRvIGtlZXAgdGhlIHRpbWluZywgdGhhdCByZXF1aXJlcyB0aGF0IHRoZSB1c2VyIGRhdGEgcmVtYWluIGluIG1lbW9yeSBhbmQKLQlhcmUgbm90IHN3YXBwZWQgb3V0LiBSZXF1aXJlcyBtbSBoYWNraW5nLCB0b28sIGJ1dCBtYXliZSBub3Qgc28gYmFkIGFzCi0JbWV0aG9kIDIpLgotCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX1NMTS5oPgotCi0KLSN1bmRlZglERUJVRwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgcGFnZSBkYXRhIGFyZSBjb250aW51b3VzIGluIHBoeXNpY2FsIG1lbW9yeS4gVGhhdAotICogcmVxdWlyZXMgbGVzcyByZXByb2dyYW1taW5nIG9mIHRoZSBTVC1ETUEgKi8KLSNkZWZpbmUJU0xNX0NPTlRJTlVPVVNfRE1BCi0KLS8qIFVzZSBjb250aW51b3VzIHJlcHJvZ3JhbW1pbmcgb2YgdGhlIFNULURNQSBjb3VudGVyIHJlZ2lzdGVyLiBUaGlzIGlzCi0gKiAtLXN0cmljdGx5IHNwZWFraW5nLS0gbm90IGFsbG93ZWQsIEF0YXJpIHJlY29tbWVuZHMgbm90IHRvIGxvb2sgYXQgdGhlCi0gKiBjb3VudGVyIHJlZ2lzdGVyIHdoaWxlIGEgRE1BIGlzIGdvaW5nIG9uLiBCdXQgSSBkb24ndCBrbm93IGlmIHRoYXQgYXBwbGllcwotICogb25seSBmb3IgcmVhZGluZyB0aGUgcmVnaXN0ZXIsIG9yIGFsc28gd3JpdGluZyB0byBpdC4gV3JpdGluZyBvbmx5IHdvcmtzCi0gKiBmaW5lIGZvciBtZS4uLiBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhlIHRpbWluZyBiZWNvbWVzIGFic29sdXRlbHkKLSAqIHVuY3JpdGljYWw6IEp1c3QgdXBkYXRlIGVhY2gsIHNheSAyMDBtcywgdGhlIGNvdW50ZXIgcmVnIHRvIGl0cyBtYXhpbXVtLAotICogYW5kIHRoZSBETUEgd2lsbCB3b3JrIHVudGlsIHRoZSBzdGF0dXMgYnl0ZSBpbnRlcnJ1cHQgb2NjdXJzLgotICovCi0jZGVmaW5lCVNMTV9DT05UX0NOVF9SRVBST0cKLQotI2RlZmluZSBDTURTRVRfVEFSR19MVU4oY21kLHRhcmcsbHVuKQkJCVwKLSAgICBkbyB7CQkJCQkJCQkJCVwKLQkJY21kWzBdID0gKGNtZFswXSAmIH4weGUwKSB8ICh0YXJnKTw8NTsJXAotCQljbWRbMV0gPSAoY21kWzFdICYgfjB4ZTApIHwgKGx1bik8PDU7CVwKLQl9IHdoaWxlKDApCi0KLSNkZWZpbmUJU1RBUlRfVElNRVIodG8pCW1vZF90aW1lcigmc2xtX3RpbWVyLCBqaWZmaWVzICsgKHRvKSkKLSNkZWZpbmUJU1RPUF9USU1FUigpCWRlbF90aW1lcigmc2xtX3RpbWVyKQotCi0KLXN0YXRpYyBjaGFyIHNsbXJlcXNlbnNlX2NtZFs2XSA9IHsgMHgwMywgMCwgMCwgMCwgMCwgMCB9Owotc3RhdGljIGNoYXIgc2xtcHJpbnRfY21kWzZdICAgID0geyAweDBhLCAwLCAwLCAwLCAwLCAwIH07Ci1zdGF0aWMgY2hhciBzbG1pbnF1aXJ5X2NtZFs2XSAgPSB7IDB4MTIsIDAsIDAsIDAsIDAsIDB4ODAgfTsKLXN0YXRpYyBjaGFyIHNsbW1zZW5zZV9jbWRbNl0gICA9IHsgMHgxYSwgMCwgMCwgMCwgMjU1LCAwIH07Ci0jaWYgMAotc3RhdGljIGNoYXIgc2xtbXNlbGVjdF9jbWRbNl0gID0geyAweDE1LCAwLCAwLCAwLCAwLCAwIH07Ci0jZW5kaWYKLQotCi0jZGVmaW5lCU1BWF9TTE0JCTIKLQotc3RhdGljIHN0cnVjdCBzbG0gewotCXVuc2lnbmVkCXRhcmdldDsJCQkvKiB0YXJnZXQgbnVtYmVyICovCi0JdW5zaWduZWQJbHVuOwkJCS8qIExVTiBpbiB0YXJnZXQgY29udHJvbGxlciAqLwotCWF0b21pY190CXdyX29rOyAJCQkvKiBzZXQgdG8gMCBpZiBvdXRwdXQgcGFydCBidXN5ICovCi0JYXRvbWljX3QJcmRfb2s7CQkJLyogc2V0IHRvIDAgaWYgc3RhdHVzIHBhcnQgYnVzeSAqLwotfSBzbG1faW5mb1tNQVhfU0xNXTsKLQotaW50IE5fU0xNX1ByaW50ZXJzID0gMDsKLQotLyogcHJpbnRlciBidWZmZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCSpTTE1CdWZmZXI7CS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIJKkJ1ZmZlclA7CS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCi1zdGF0aWMgaW50CQkJCUJ1ZmZlclNpemU7CS8qIGxlbmd0aCBvZiBidWZmZXIgZm9yIHBhZ2Ugc2l6ZSAqLwotCi10eXBlZGVmIGVudW0geyBJRExFLCBGSUxMSU5HLCBQUklOVElORyB9IFNMTVNUQVRFOwotc3RhdGljIFNMTVNUQVRFCQkJU0xNU3RhdGU7Ci1zdGF0aWMgaW50CQkJCVNMTUJ1Zk93bmVyOwkvKiBTTE0jIGN1cnJlbnRseSB1c2luZyB0aGUgYnVmZmVyICovCi0KLS8qIERNQSB2YXJpYWJsZXMgKi8KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotc3RhdGljIHVuc2lnbmVkIGxvbmcJU0xNQ3VyQWRkcjsJCS8qIGN1cnJlbnQgYmFzZSBhZGRyIG9mIERNQSBjaHVuayAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcJU0xNRW5kQWRkcjsJCS8qIGV4cGVjdGVkIGVuZCBhZGRyICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwlTTE1TbGljZVNpemU7CS8qIHNpemUgb2Ygb25lIERNQSBjaHVuayAqLwotI2VuZGlmCi1zdGF0aWMgaW50CQkJCVNMTUVycm9yOwotCi0vKiB3YWl0IHF1ZXVlcyAqLwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNsbV93YWl0KTsJLyogd2FpdGluZyBmb3IgYnVmZmVyICovCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJpbnRfd2FpdCk7CS8qIHdhaXRpbmcgZm9yIHByaW50aW5nIGZpbmlzaGVkICovCi0KLS8qIHN0YXR1cyBjb2RlcyAqLwotI2RlZmluZQlTTE1TVEFUX09LCQkweDAwCi0jZGVmaW5lCVNMTVNUQVRfT1JORVJZCTB4MDIKLSNkZWZpbmUJU0xNU1RBVF9UT05FUgkweDAzCi0jZGVmaW5lCVNMTVNUQVRfV0FSTVVQCTB4MDQKLSNkZWZpbmUJU0xNU1RBVF9QQVBFUgkweDA1Ci0jZGVmaW5lCVNMTVNUQVRfRFJVTQkweDA2Ci0jZGVmaW5lCVNMTVNUQVRfSU5KQU0JMHgwNwotI2RlZmluZQlTTE1TVEFUX1RIUkpBTQkweDA4Ci0jZGVmaW5lCVNMTVNUQVRfT1VUSkFNCTB4MDkKLSNkZWZpbmUJU0xNU1RBVF9DT1ZFUgkweDBhCi0jZGVmaW5lCVNMTVNUQVRfRlVTRVIJMHgwYgotI2RlZmluZQlTTE1TVEFUX0lNQUdFUgkweDBjCi0jZGVmaW5lCVNMTVNUQVRfTU9UT1IJMHgwZAotI2RlZmluZQlTTE1TVEFUX1ZJREVPCTB4MGUKLSNkZWZpbmUJU0xNU1RBVF9TWVNUTwkweDEwCi0jZGVmaW5lCVNMTVNUQVRfT1BDT0RFCTB4MTIKLSNkZWZpbmUJU0xNU1RBVF9ERVZOVU0JMHgxNQotI2RlZmluZQlTTE1TVEFUX1BBUkFNCTB4MWEKLSNkZWZpbmUJU0xNU1RBVF9BQ1NJVE8JMHgxYgkvKiBkcml2ZXIgZGVmaW5lZCAqLwotI2RlZmluZQlTTE1TVEFUX05PVEFMTAkweDFjCS8qIGRyaXZlciBkZWZpbmVkICovCi0KLXN0YXRpYyBjaGFyICpTTE1FcnJvcnNbXSA9IHsKLQkvKiAweDAwICovCSJPSyBhbmQgcmVhZHkiLAotCS8qIDB4MDEgKi8JTlVMTCwKLQkvKiAweDAyICovCSJvcm5lcnkgcHJpbnRlciIsCi0JLyogMHgwMyAqLwkidG9uZXIgZW1wdHkiLAotCS8qIDB4MDQgKi8JIndhcm1pbmcgdXAiLAotCS8qIDB4MDUgKi8JInBhcGVyIGVtcHR5IiwKLQkvKiAweDA2ICovCSJkcnVtIGVtcHR5IiwKLQkvKiAweDA3ICovCSJpbnB1dCBqYW0iLAotCS8qIDB4MDggKi8JInRocm91Z2ggamFtIiwKLQkvKiAweDA5ICovCSJvdXRwdXQgamFtIiwKLQkvKiAweDBhICovCSJjb3ZlciBvcGVuIiwKLQkvKiAweDBiICovCSJmdXNlciBtYWxmdW5jdGlvbiIsCi0JLyogMHgwYyAqLwkiaW1hZ2VyIG1hbGZ1bmN0aW9uIiwKLQkvKiAweDBkICovCSJtb3RvciBtYWxmdW5jdGlvbiIsCi0JLyogMHgwZSAqLwkidmlkZW8gbWFsZnVuY3Rpb24iLAotCS8qIDB4MGYgKi8JTlVMTCwKLQkvKiAweDEwICovCSJwcmludGVyIHN5c3RlbSB0aW1lb3V0IiwKLQkvKiAweDExICovCU5VTEwsCi0JLyogMHgxMiAqLwkiaW52YWxpZCBvcGVyYXRpb24gY29kZSIsCi0JLyogMHgxMyAqLwlOVUxMLAotCS8qIDB4MTQgKi8JTlVMTCwKLQkvKiAweDE1ICovCSJpbnZhbGlkIGRldmljZSBudW1iZXIiLAotCS8qIDB4MTYgKi8JTlVMTCwKLQkvKiAweDE3ICovCU5VTEwsCi0JLyogMHgxOCAqLwlOVUxMLAotCS8qIDB4MTkgKi8JTlVMTCwKLQkvKiAweDFhICovCSJpbnZhbGlkIHBhcmFtZXRlciBsaXN0IiwKLQkvKiAweDFiICovCSJBQ1NJIHRpbWVvdXQiLAotCS8qIDB4MWMgKi8JIm5vdCBhbGwgcHJpbnRlZCIKLX07Ci0KLSNkZWZpbmUJTl9FUlJPUlMJKHNpemVvZihTTE1FcnJvcnMpL3NpemVvZigqU0xNRXJyb3JzKSkKLQotLyogcmVhbCAoZHJpdmVyIGNhdXNlZCkgZXJyb3I/ICovCi0jZGVmaW5lCUlTX1JFQUxfRVJST1IoeCkJKHggPiAweDEwKQotCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIJKm5hbWU7Ci0JaW50IAl3LCBoOwotfSBTdGRQYWdlU2l6ZVtdID0gewotCXsgIkxldHRlciIsIDI0MDAsIDMxODAgfSwKLQl7ICJMZWdhbCIsICAyNDAwLCA0MDgwIH0sCi0JeyAiQTQiLCAgICAgMjMzNiwgMzM4NiB9LAotCXsgIkI1IiwgICAgIDIwMTYsIDI5MTQgfQotfTsKLQotI2RlZmluZQlOX1NURF9TSVpFUwkJKHNpemVvZihTdGRQYWdlU2l6ZSkvc2l6ZW9mKCpTdGRQYWdlU2l6ZSkpCi0KLSNkZWZpbmUJU0xNX0JVRkZFUl9TSVpFCSgyMzM2KjMzODYvOCkJLyogQTQgZm9yIG5vdyAqLwotI2RlZmluZQlTTE1fRE1BX0FNT1VOVAkyNTUJCQkJLyogI3NlY3RvcnMgdG8gcHJvZ3JhbSB0aGUgRE1BIGZvciAqLwotCi0jaWZkZWYJU0xNX0NPTlRJTlVPVVNfRE1BCi0jIGRlZmluZQlTTE1fRE1BX0lOVF9PRkZTRVQJMAkJLyogRE1BIGdvZXMgdW50aWwgc2VjY250IDAsIG5vIG9mZnMgKi8KLSMgZGVmaW5lCVNMTV9ETUFfRU5EX09GRlNFVAkzMgkJLyogMzIgQnl0ZSBTVC1ETUEgRklGTyAqLwotIyBkZWZpbmUJU0xNX1NMSUNFX1NJWkUodykgCSgyNTUqNTEyKQotI2Vsc2UKLSMgZGVmaW5lCVNMTV9ETUFfSU5UX09GRlNFVAkzMgkJLyogMzIgQnl0ZSBTVC1ETUEgRklGTyAqLwotIyBkZWZpbmUJU0xNX0RNQV9FTkRfT0ZGU0VUCTMyCQkvKiAzMiBCeXRlIFNULURNQSBGSUZPICovCi0jIGRlZmluZQlTTE1fU0xJQ0VfU0laRSh3KQkoKDI1NCo1MTIpLyh3LzgpKih3LzgpKQotI2VuZGlmCi0KLS8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGppZmZpZXMgdG8gd2FpdCBmb3IgJ24nIGJ5dGVzICovCi0jaWZkZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotI2RlZmluZQlETUFfVElNRV9GT1IobikJCTUwCi0jZGVmaW5lCURNQV9TVEFSVFVQX1RJTUUJMAotI2Vsc2UKLSNkZWZpbmUJRE1BX1RJTUVfRk9SKG4pCQkobi8xNDAwLTEpCi0jZGVmaW5lCURNQV9TVEFSVFVQX1RJTUUJNjUwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyICpzbG1fZXJyc3RyKCBpbnQgc3RhdCApOwotc3RhdGljIGludCBzbG1fZ2V0c3RhdHMoIGNoYXIgKmJ1ZmZlciwgaW50IGRldmljZSApOwotc3RhdGljIHNzaXplX3Qgc2xtX3JlYWQoIHN0cnVjdCBmaWxlKiBmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKnBwb3MgKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X3ByaW50KCBpbnQgZGV2aWNlICk7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgc2xtX2ludGVycnVwdChpbnQgaXJjLCB2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIHNsbV90ZXN0X3JlYWR5KCB1bnNpZ25lZCBsb25nIGR1bW15ICk7Ci1zdGF0aWMgdm9pZCBzZXRfZG1hX2FkZHIoIHVuc2lnbmVkIGxvbmcgcGFkZHIgKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9kbWFfYWRkciggdm9pZCApOwotc3RhdGljIHNzaXplX3Qgc2xtX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcyApOwotc3RhdGljIGludCBzbG1faW9jdGwoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQKLSAgICAgICAgICAgICAgICAgICAgICBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7Ci1zdGF0aWMgaW50IHNsbV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOwotc3RhdGljIGludCBzbG1fcmVsZWFzZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKLXN0YXRpYyBpbnQgc2xtX3JlcV9zZW5zZSggaW50IGRldmljZSApOwotc3RhdGljIGludCBzbG1fbW9kZV9zZW5zZSggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgYWJzX2ZsYWcgKTsKLSNpZiAwCi1zdGF0aWMgaW50IHNsbV9tb2RlX3NlbGVjdCggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2ZsYWcgKTsKLSNlbmRpZgotc3RhdGljIGludCBzbG1fZ2V0X3BhZ2VzaXplKCBpbnQgZGV2aWNlLCBpbnQgKncsIGludCAqaCApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgREVGSU5FX1RJTUVSKHNsbV90aW1lciwgc2xtX3Rlc3RfcmVhZHksIDAsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbG1fZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkucmVhZCA9CQlzbG1fcmVhZCwKLQkud3JpdGUgPQlzbG1fd3JpdGUsCi0JLmlvY3RsID0Jc2xtX2lvY3RsLAotCS5vcGVuID0JCXNsbV9vcGVuLAotCS5yZWxlYXNlID0Jc2xtX3JlbGVhc2UsCi19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSAgIFN0YXR1cyBGdW5jdGlvbnMJCQkJCQkJICAqLwotCi0KLXN0YXRpYyBjaGFyICpzbG1fZXJyc3RyKCBpbnQgc3RhdCApCi0KLXsJY2hhciAqcDsKLQlzdGF0aWMgY2hhcglzdHJbMjJdOwotCi0Jc3RhdCAmPSAweDFmOwotCWlmIChzdGF0ID49IDAgJiYgc3RhdCA8IE5fRVJST1JTICYmIChwID0gU0xNRXJyb3JzW3N0YXRdKSkKLQkJcmV0dXJuKCBwICk7Ci0Jc3ByaW50Ziggc3RyLCAidW5rbm93biBzdGF0dXMgMHglMDJ4Iiwgc3RhdCApOwotCXJldHVybiggc3RyICk7Ci19Ci0KLQotc3RhdGljIGludCBzbG1fZ2V0c3RhdHMoIGNoYXIgKmJ1ZmZlciwgaW50IGRldmljZSApCi0KLXsJaW50IAkJCWxlbiA9IDAsIHN0YXQsIGksIHcsIGg7Ci0JdW5zaWduZWQgY2hhcglidWZbMjU2XTsKLQkKLQlzdGF0ID0gc2xtX21vZGVfc2Vuc2UoIGRldmljZSwgYnVmLCAwICk7Ci0JaWYgKElTX1JFQUxfRVJST1Ioc3RhdCkpCi0JCXJldHVybiggLUVJTyApOwotCQotI2RlZmluZSBTSE9SVERBVEEoaSkJCSgoYnVmW2ldIDw8IDgpIHwgYnVmW2krMV0pCi0jZGVmaW5lCUJPT0xEQVRBKGksbWFzaykJKChidWZbaV0gJiBtYXNrKSA/ICJvbiIgOiAib2ZmIikKLQotCXcgPSBTSE9SVERBVEEoIDMgKTsKLQloID0gU0hPUlREQVRBKCAxICk7Ci0JCQotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU3RhdHVzXHRcdCVzXG4iLAotCQkJCQlzbG1fZXJyc3RyKCBzdGF0ICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlBhZ2UgU2l6ZVx0JWR4JWQiLAotCQkJCQl3LCBoICk7Ci0KLQlmb3IoIGkgPSAwOyBpIDwgTl9TVERfU0laRVM7ICsraSApIHsKLQkJaWYgKHcgPT0gU3RkUGFnZVNpemVbaV0udyAmJiBoID09IFN0ZFBhZ2VTaXplW2ldLmgpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPCBOX1NURF9TSVpFUykKLQkJbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICIgKCVzKSIsIFN0ZFBhZ2VTaXplW2ldLm5hbWUgKTsKLQlidWZmZXJbbGVuKytdID0gJ1xuJzsKLQotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiVG9wL0xlZnQgTWFyZ2luXHQlZC8lZFxuIiwKLQkJCQkJU0hPUlREQVRBKCA1ICksIFNIT1JUREFUQSggNyApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJNYW51YWwgRmVlZFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDAxICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIklucHV0IFNlbGVjdFx0JWRcbiIsCi0JCQkJCShidWZbOV0gPj4gMSkgJiA3ICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJBdXRvIFNlbGVjdFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDEwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlByZWZlZWQgUGFwZXJcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHgyMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJUaGljayBQaXhlbHNcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHg0MCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJIL1YgUmVzb2wuXHQlZC8lZCBkcGlcbiIsCi0JCQkJCVNIT1JUREFUQSggMTIgKSwgU0hPUlREQVRBKCAxMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJTeXN0ZW0gVGltZW91dFx0JWRcbiIsCi0JCQkJCWJ1ZlsxNF0gKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlNjYW4gVGltZVx0JWRcbiIsCi0JCQkJCVNIT1JUREFUQSggMTUgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiUGFnZSBDb3VudFx0JWRcbiIsCi0JCQkJCVNIT1JUREFUQSggMTcgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiSW4vT3V0IENhcC5cdCVkLyVkXG4iLAotCQkJCQlTSE9SVERBVEEoIDE5ICksIFNIT1JUREFUQSggMjEgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU3RhZ2dlciBPdXRwdXRcdCVzXG4iLAotCQkJCQlCT09MREFUQSggMjMsIDB4MDEgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiT3V0cHV0IFNlbGVjdFx0JWRcbiIsCi0JCQkJCShidWZbMjNdID4+IDEpICYgNyApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiRHVwbGV4IFByaW50XHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDIzLCAweDEwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIkNvbG9yIFNlcC5cdCVzXG4iLAotCQkJCQlCT09MREFUQSggMjMsIDB4MjAgKSApOwotCi0JcmV0dXJuKCBsZW4gKTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBzbG1fcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkJIGxvZmZfdCAqcHBvcyApCi0KLXsKLQlzdHJ1Y3QgaW5vZGUgKm5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQlpbnQgbGVuZ3RoOwotCWludCBlbmQ7Ci0KLQlpZiAoIShwYWdlID0gX19nZXRfZnJlZV9wYWdlKCBHRlBfS0VSTkVMICkpKQotCQlyZXR1cm4oIC1FTk9NRU0gKTsKLQkKLQlsZW5ndGggPSBzbG1fZ2V0c3RhdHMoIChjaGFyICopcGFnZSwgaW1pbm9yKG5vZGUpICk7Ci0JaWYgKGxlbmd0aCA8IDApIHsKLQkJY291bnQgPSBsZW5ndGg7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoZmlsZS0+Zl9wb3MgPj0gbGVuZ3RoKSB7Ci0JCWNvdW50ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChjb3VudCArIGZpbGUtPmZfcG9zID4gbGVuZ3RoKQotCQljb3VudCA9IGxlbmd0aCAtIGZpbGUtPmZfcG9zOwotCWVuZCA9IGNvdW50ICsgZmlsZS0+Zl9wb3M7Ci0JaWYgKGNvcHlfdG9fdXNlcihidWYsIChjaGFyICopcGFnZSArIGZpbGUtPmZfcG9zLCBjb3VudCkpIHsKLQkJY291bnQgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9Ci0JZmlsZS0+Zl9wb3MgPSBlbmQ7Ci1vdXQ6CWZyZWVfcGFnZSggcGFnZSApOwotCXJldHVybiggY291bnQgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkJICAgUHJpbnRpbmcJCQkJCQkJCSAgKi8KLQotCi1zdGF0aWMgdm9pZCBzdGFydF9wcmludCggaW50IGRldmljZSApCi0KLXsJc3RydWN0IHNsbSAqc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0JdW5zaWduZWQgY2hhcgkqY21kOwotCXVuc2lnbmVkIGxvbmcJcGFkZHI7Ci0JaW50CQkJCWk7Ci0JCi0Jc3RkbWFfbG9jayggc2xtX2ludGVycnVwdCwgTlVMTCApOwotCi0JQ01EU0VUX1RBUkdfTFVOKCBzbG1wcmludF9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCWNtZCA9IHNsbXByaW50X2NtZDsKLQlwYWRkciA9IHZpcnRfdG9fcGh5cyggU0xNQnVmZmVyICk7Ci0JZG1hX2NhY2hlX21haW50ZW5hbmNlKCBwYWRkciwgdmlydF90b19waHlzKEJ1ZmZlclApLXBhZGRyLCAxICk7Ci0JRElTQUJMRV9JUlEoKTsKLQotCS8qIExvdyBvbiBBMSAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDg4OwotCU1GUERFTEFZKCk7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIGJ5dGVzIGV4Y2VwdCB0aGUgbGFzdCAqLwotCWZvciggaSA9IDA7IGkgPCA1OyArK2kgKSB7Ci0JCURNQV9MT05HX1dSSVRFKCAqY21kKyssIDB4OGEgKTsKLQkJdWRlbGF5KDIwKTsKLQkJaWYgKCFhY3NpX3dhaXRfZm9yX0lSUSggSFovMiApKSB7Ci0JCQlTTE1FcnJvciA9IDE7Ci0JCQlyZXR1cm47IC8qIHRpbWVvdXQgKi8KLQkJfQotCX0KLQkvKiBsYXN0IGNvbW1hbmQgYnl0ZSAqLwotCURNQV9MT05HX1dSSVRFKCAqY21kKyssIDB4ODIgKTsKLQlNRlBERUxBWSgpOwotCS8qIHNldCBETUEgYWRkcmVzcyAqLwotCXNldF9kbWFfYWRkciggcGFkZHIgKTsKLQkvKiBwcm9ncmFtIERNQSBmb3Igd3JpdGUgYW5kIHNlbGVjdCBzZWN0b3IgY291bnRlciByZWcgKi8KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHgxOTI7Ci0JTUZQREVMQVkoKTsKLQkvKiBwcm9ncmFtIGZvciAyNTUqNTEyIGJ5dGVzIGFuZCBzdGFydCBETUEgKi8KLQlETUFfTE9OR19XUklURSggU0xNX0RNQV9BTU9VTlQsIDB4MTEyICk7Ci0KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCVNMTUN1ckFkZHIgPSBwYWRkcjsKLQlTTE1FbmRBZGRyID0gcGFkZHIgKyBTTE1TbGljZVNpemUgKyBTTE1fRE1BX0lOVF9PRkZTRVQ7Ci0jZW5kaWYKLQlTVEFSVF9USU1FUiggRE1BX1NUQVJUVVBfVElNRSArIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkpOwotI2lmICFkZWZpbmVkKFNMTV9DT05UX0NOVF9SRVBST0cpICYmIGRlZmluZWQoREVCVUcpCi0JcHJpbnRrKCAiU0xNOiBDdXJBZGRyPSUjbHggRW5kQWRkcj0lI2x4IHRpbWVyPSVsZFxuIiwKLQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIsIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkgKTsKLSNlbmRpZgotCQotCUVOQUJMRV9JUlEoKTsKLX0KLQotCi0vKiBPbmx5IGNhbGxlZCB3aGVuIGFuIGVycm9yIGhhcHBlbmVkIG9yIGF0IHRoZSBlbmQgb2YgYSBwYWdlICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzbG1faW50ZXJydXB0KGludCBpcmMsIHZvaWQgKmRhdGEpCi0KLXsJdW5zaWduZWQgbG9uZwlhZGRyOwotCWludAkJCQlzdGF0OwotCQotCVNUT1BfVElNRVIoKTsKLQlhZGRyID0gZ2V0X2RtYV9hZGRyKCk7Ci0Jc3RhdCA9IGFjc2lfZ2V0c3RhdHVzKCk7Ci0JU0xNRXJyb3IgPSAoc3RhdCA8IDApICAgICAgICAgICAgID8gU0xNU1RBVF9BQ1NJVE8gOgotCQkgICAgICAgKGFkZHIgPCB2aXJ0X3RvX3BoeXMoQnVmZmVyUCkpID8gU0xNU1RBVF9OT1RBTEwgOgotCQkJCQkJCQkJICAgIHN0YXQ7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg4MDsKLQlNRlBERUxBWSgpOwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCAiU0xNOiBpbnRlcnJ1cHQsIGFkZHI9JSNseCwgZXJyb3I9JWRcbiIsIGFkZHIsIFNMTUVycm9yICk7Ci0jZW5kaWYKLQotCXdha2VfdXAoICZwcmludF93YWl0ICk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCUVOQUJMRV9JUlEoKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgc2xtX3Rlc3RfcmVhZHkoIHVuc2lnbmVkIGxvbmcgZHVtbXkgKQotCi17Ci0jaWZkZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCS8qIHByb2dyYW0gZm9yIDI1NSo1MTIgYnl0ZXMgYWdhaW4gKi8KLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50ID0gU0xNX0RNQV9BTU9VTlQ7Ci0JU1RBUlRfVElNRVIoIERNQV9USU1FX0ZPUigwKSApOwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCAiU0xNOiByZXByb2dyYW1taW5nIHRpbWVyIGZvciAlZCBqaWZmaWVzLCBhZGRyPSUjbHhcbiIsCi0JCQlETUFfVElNRV9GT1IoMCksIGdldF9kbWFfYWRkcigpICk7Ci0jZW5kaWYKLQkKLSNlbHNlIC8qICFTTE1fQ09OVF9DTlRfUkVQUk9HICovCi0KLQl1bnNpZ25lZCBsb25nCWZsYWdzLCBhZGRyOwotCWludAkJCQlkLCB0aTsKLSNpZmRlZiBERUJVRwotCXN0cnVjdCB0aW1ldmFsIHN0YXJ0X3RtLCBlbmRfdG07Ci0JaW50CQkJICAgZGlkX3dhaXQgPSAwOwotI2VuZGlmCi0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlhZGRyID0gZ2V0X2RtYV9hZGRyKCk7Ci0JaWYgKChkID0gU0xNRW5kQWRkciAtIGFkZHIpID4gMCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQotCQkvKiBzbGljZSBub3QgeWV0IGZpbmlzaGVkLCBkZWNpZGUgd2hldGhlciB0byBzdGFydCBhbm90aGVyIHRpbWVyIG9yIHRvCi0JCSAqIGJ1c3ktd2FpdCAqLwotCQl0aSA9IERNQV9USU1FX0ZPUiggZCApOwotCQlpZiAodGkgPiAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJCXByaW50ayggIlNMTTogcmVwcm9ncmFtbWluZyB0aW1lciBmb3IgJWQgamlmZmllcywgcmVzdCAlZCBieXRlc1xuIiwKLQkJCQkJdGksIGQgKTsKLSNlbmRpZgotCQkJU1RBUlRfVElNRVIoIHRpICk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogd2FpdCBmb3IgZGVzaXJlZCBlbmQgYWRkcmVzcyB0byBiZSByZWFjaGVkICovCi0jaWZkZWYgREVCVUcKLQkJZG9fZ2V0dGltZW9mZGF5KCAmc3RhcnRfdG0gKTsKLQkJZGlkX3dhaXQgPSAxOwotI2VuZGlmCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCXdoaWxlKCBnZXRfZG1hX2FkZHIoKSA8IFNMTUVuZEFkZHIgKQotCQkJYmFycmllcigpOwotCX0KLQotCS8qIHNsaWNlIGZpbmlzaGVkLCBzdGFydCBuZXh0IG9uZSAqLwotCVNMTUN1ckFkZHIgKz0gU0xNU2xpY2VTaXplOwotCi0jaWZkZWYgU0xNX0NPTlRJTlVPVVNfRE1BCi0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhZ2FpbiAqLwotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSBTTE1fRE1BX0FNT1VOVDsKLSNlbHNlCi0JLyogc2V0IERNQSBhZGRyZXNzOwotCSAqIGFkZCAyIGJ5dGVzIGZvciB0aGUgb25lcyBpbiB0aGUgU0xNIGNvbnRyb2xsZXIgRklGTyEgKi8KLQlzZXRfZG1hX2FkZHIoIFNMTUN1ckFkZHIgKyAyICk7Ci0JLyogdG9nZ2xlIERNQSB0byB3cml0ZSBhbmQgc2VsZWN0IHNlY3RvciBjb3VudGVyIHJlZyAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDkyOwotCU1GUERFTEFZKCk7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4MTkyOwotCU1GUERFTEFZKCk7Ci0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhbmQgc3RhcnQgRE1BICovCi0JRE1BX0xPTkdfV1JJVEUoIFNMTV9ETUFfQU1PVU5ULCAweDExMiApOwotI2VuZGlmCi0JCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0jaWZkZWYgREVCVUcKLQlpZiAoZGlkX3dhaXQpIHsKLQkJaW50IG1zOwotCQlkb19nZXR0aW1lb2ZkYXkoICZlbmRfdG0gKTsKLQkJbXMgPSAoZW5kX3RtLnR2X3NlYyoxMDAwMDAwK2VuZF90bS50dl91c2VjKSAtCi0JCQkgKHN0YXJ0X3RtLnR2X3NlYyoxMDAwMDAwK3N0YXJ0X3RtLnR2X3VzZWMpOyAKLQkJcHJpbnRrKCAiU0xNOiBkaWQgJWxkLiVsZCBtcyBidXN5IHdhaXRpbmcgZm9yICVkIGJ5dGVzXG4iLAotCQkJCW1zLzEwMDAsIG1zJTEwMDAsIGQgKTsKLQl9Ci0JZWxzZQotCQlwcmludGsoICJTTE06IGRpZG4ndCB3YWl0ICghKVxuIiApOwotI2VuZGlmCi0KLQlpZiAoKHVuc2lnbmVkIGNoYXIgKilQVE9WKCBTTE1DdXJBZGRyICsgU0xNU2xpY2VTaXplICkgPj0gQnVmZmVyUCkgewotCQkvKiB3aWxsIGJlIGxhc3Qgc2xpY2UsIG5vIHRpbWVyIG5lY2Vzc2FyeSAqLwotI2lmZGVmIERFQlVHCi0JCXByaW50ayggIlNMTTogQ3VyQWRkcj0lI2x4IEVuZEFkZHI9JSNseCBsYXN0IHNsaWNlIC0+IG5vIHRpbWVyXG4iLAotCQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIgKTsKLSNlbmRpZgotCX0KLQllbHNlIHsKLQkJLyogbm90IGxhc3Qgc2xpY2UgKi8KLQkJU0xNRW5kQWRkciA9IFNMTUN1ckFkZHIgKyBTTE1TbGljZVNpemUgKyBTTE1fRE1BX0lOVF9PRkZTRVQ7Ci0JCVNUQVJUX1RJTUVSKCBETUFfVElNRV9GT1IoIFNMTVNsaWNlU2l6ZSApKTsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoICJTTE06IEN1ckFkZHI9JSNseCBFbmRBZGRyPSUjbHggdGltZXI9JWxkXG4iLAotCQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIsIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkgKTsKLSNlbmRpZgotCX0KLSNlbmRpZiAvKiBTTE1fQ09OVF9DTlRfUkVQUk9HICovCi19Ci0KLQotc3RhdGljIHZvaWQgc2V0X2RtYV9hZGRyKCB1bnNpZ25lZCBsb25nIHBhZGRyICkKLQotewl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWRtYV93ZC5kbWFfbG8gPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlNRlBERUxBWSgpOwotCWRtYV93ZC5kbWFfbWQgPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlNRlBERUxBWSgpOwotCWlmIChBVEFSSUhXX1BSRVNFTlQoIEVYVERfRE1BICkpCi0JCXN0X2RtYV9leHRfZG1haGkgPSAodW5zaWduZWQgc2hvcnQpcGFkZHI7Ci0JZWxzZQotCQlkbWFfd2QuZG1hX2hpID0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JTUZQREVMQVkoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9hZGRyKCB2b2lkICkKLQotewl1bnNpZ25lZCBsb25nCWFkZHI7Ci0JCi0JYWRkciA9IGRtYV93ZC5kbWFfbG8gJiAweGZmOwotCU1GUERFTEFZKCk7Ci0JYWRkciB8PSAoZG1hX3dkLmRtYV9tZCAmIDB4ZmYpIDw8IDg7Ci0JTUZQREVMQVkoKTsKLQlhZGRyIHw9IChkbWFfd2QuZG1hX2hpICYgMHhmZikgPDwgMTY7Ci0JTUZQREVMQVkoKTsKLQotCXJldHVybiggYWRkciApOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IHNsbV93cml0ZSggc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkJICBsb2ZmX3QgKnBwb3MgKQotCi17Ci0Jc3RydWN0IGlub2RlICpub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpbnQJCWRldmljZSA9IGltaW5vcihub2RlKTsKLQlpbnQJCW4sIGZpbGxlZCwgdywgaDsKLQotCXdoaWxlKCBTTE1TdGF0ZSA9PSBQUklOVElORyB8fAotCQkgICAoU0xNU3RhdGUgPT0gRklMTElORyAmJiBTTE1CdWZPd25lciAhPSBkZXZpY2UpICkgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCAmc2xtX3dhaXQgKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuKCAtRVJFU1RBUlRTWVMgKTsKLQl9Ci0JaWYgKFNMTVN0YXRlID09IElETEUpIHsKLQkJLyogZmlyc3QgZGF0YSBvZiBwYWdlOiBnZXQgY3VycmVudCBwYWdlIHNpemUgICovCi0JCWlmIChzbG1fZ2V0X3BhZ2VzaXplKCBkZXZpY2UsICZ3LCAmaCApKQotCQkJcmV0dXJuKCAtRUlPICk7Ci0JCUJ1ZmZlclNpemUgPSB3KmgvODsKLQkJaWYgKEJ1ZmZlclNpemUgPiBTTE1fQlVGRkVSX1NJWkUpCi0JCQlyZXR1cm4oIC1FTk9NRU0gKTsKLQotCQlTTE1TdGF0ZSA9IEZJTExJTkc7Ci0JCVNMTUJ1Zk93bmVyID0gZGV2aWNlOwotCX0KLQotCW4gPSBjb3VudDsKLQlmaWxsZWQgPSBCdWZmZXJQIC0gU0xNQnVmZmVyOwotCWlmIChmaWxsZWQgKyBuID4gQnVmZmVyU2l6ZSkKLQkJbiA9IEJ1ZmZlclNpemUgLSBmaWxsZWQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoQnVmZmVyUCwgYnVmLCBuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JQnVmZmVyUCArPSBuOwotCWZpbGxlZCArPSBuOwotCi0JaWYgKGZpbGxlZCA9PSBCdWZmZXJTaXplKSB7Ci0JCS8qIENoZWNrIHRoZSBwYXBlciBzaXplIGFnYWluISBUaGUgdXNlciBtYXkgaGF2ZSBzd2l0Y2hlZCBpdCBpbiB0aGUKLQkJICogdGltZSBiZXR3ZWVuIHN0YXJ0aW5nIHRoZSBkYXRhIGFuZCBmaW5pc2hpbmcgdGhlbS4gV291bGQgZW5kIHVwIGluCi0JCSAqIGEgdHJhc2h5IHBhZ2UuLi4gKi8KLQkJaWYgKHNsbV9nZXRfcGFnZXNpemUoIGRldmljZSwgJncsICZoICkpCi0JCQlyZXR1cm4oIC1FSU8gKTsKLQkJaWYgKEJ1ZmZlclNpemUgIT0gdypoLzgpIHsKLQkJCXByaW50ayggS0VSTl9OT1RJQ0UgInNsbSVkOiBwYWdlIHNpemUgY2hhbmdlZCB3aGlsZSBwcmludGluZ1xuIiwKLQkJCQkJZGV2aWNlICk7Ci0JCQlyZXR1cm4oIC1FQUdBSU4gKTsKLQkJfQotCi0JCVNMTVN0YXRlID0gUFJJTlRJTkc7Ci0JCS8qIGNob29zZSBhIHNsaWNlIHNpemUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIHRoZSBsaW5lIHNpemUgKi8KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCQlTTE1TbGljZVNpemUgPSBTTE1fU0xJQ0VfU0laRSh3KTsKLSNlbmRpZgotCQkKLQkJc3RhcnRfcHJpbnQoIGRldmljZSApOwotCQlzbGVlcF9vbiggJnByaW50X3dhaXQgKTsKLQkJaWYgKFNMTUVycm9yICYmIElTX1JFQUxfRVJST1IoU0xNRXJyb3IpKSB7Ci0JCQlwcmludGsoIEtFUk5fRVJSICJzbG0lZDogJXNcbiIsIGRldmljZSwgc2xtX2VycnN0cihTTE1FcnJvcikgKTsKLQkJCW4gPSAtRUlPOwotCQl9Ci0KLQkJU0xNU3RhdGUgPSBJRExFOwotCQlCdWZmZXJQID0gU0xNQnVmZmVyOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoICZzbG1fd2FpdCApOwotCX0KLQkKLQlyZXR1cm4oIG4gKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkgICBpb2N0bCBGdW5jdGlvbnMJCQkJCQkJICAqLwotCi0KLXN0YXRpYyBpbnQgc2xtX2lvY3RsKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCi0KLXsJaW50CQlkZXZpY2UgPSBpbWlub3IoaW5vZGUpLCBlcnI7Ci0JCi0JLyogSSBjYW4gdGhpbmsgb2Ygc2V0dGluZzoKLQkgKiAgLSBtYW51YWwgZmVlZAotCSAqICAtIHBhcGVyIGZvcm1hdAotCSAqICAtIGNvcHkgY291bnQKLQkgKiAgLSAuLi4KLQkgKiBidXQgaGF2ZW4ndCBpbXBsZW1lbnRlZCB0aGF0IHlldCA6LSkKLQkgKiBCVFcsIGhhcyBhbnlib2R5IGJldHRlciBkb2NzIGFib3V0IHRoZSBNT0RFIFNFTlNFL01PREUgU0VMRUNUIGRhdGE/Ci0JICovCi0Jc3dpdGNoKCBjbWQgKSB7Ci0KLQkgIGNhc2UgU0xNSU9SRVNFVDoJCS8qIHJlc2V0IGJ1ZmZlciwgaS5lLiBlbXB0eSB0aGUgYnVmZmVyICovCi0JCWlmICghKGZpbGUtPmZfbW9kZSAmIDIpKQotCQkJcmV0dXJuKCAtRUlOVkFMICk7Ci0JCWlmIChTTE1TdGF0ZSA9PSBQUklOVElORykKLQkJCXJldHVybiggLUVCVVNZICk7Ci0JCVNMTVN0YXRlID0gSURMRTsKLQkJQnVmZmVyUCA9IFNMTUJ1ZmZlcjsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmc2xtX3dhaXQgKTsKLQkJcmV0dXJuKCAwICk7Ci0JCQotCSAgY2FzZSBTTE1JT0dTVEFUOiB7CS8qIGdldCBzdGF0dXMgKi8KLQkJaW50IHN0YXQ7Ci0JCWNoYXIgKnN0cjsKLQotCQlzdGF0ID0gc2xtX3JlcV9zZW5zZSggZGV2aWNlICk7Ci0JCWlmIChhcmcpIHsKLQkJCXN0ciA9IHNsbV9lcnJzdHIoIHN0YXQgKTsKLQkJCWlmIChwdXRfdXNlcihzdGF0LAotICAgIAkgICAgCSAgICAJICAgIAkgICAgIChsb25nICopJigoc3RydWN0IFNMTV9zdGF0dXMgKilhcmcpLT5zdGF0KSkKLSAgICAJICAgIAkgICAgCSAgICAJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAoY29weV90b191c2VyKCAoKHN0cnVjdCBTTE1fc3RhdHVzICopYXJnKS0+c3RyLCBzdHIsCi0JCQkJCQkgc3RybGVuKHN0cikgKyAxKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlyZXR1cm4oIHN0YXQgKTsKLQkgIH0KLQkJCi0JICBjYXNlIFNMTUlPR1BTSVpFOiB7CS8qIGdldCBwYXBlciBzaXplICovCi0JCWludCB3LCBoOwotCQkKLQkJaWYgKChlcnIgPSBzbG1fZ2V0X3BhZ2VzaXplKCBkZXZpY2UsICZ3LCAmaCApKSkgcmV0dXJuKCBlcnIgKTsKLQkJCi0gICAgCSAgICAJaWYgKHB1dF91c2VyKHcsIChsb25nICopJigoc3RydWN0IFNMTV9wYXBlcl9zaXplICopYXJnKS0+d2lkdGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChwdXRfdXNlcihoLCAobG9uZyAqKSYoKHN0cnVjdCBTTE1fcGFwZXJfc2l6ZSAqKWFyZyktPmhlaWdodCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuKCAwICk7Ci0JICB9Ci0JCQotCSAgY2FzZSBTTE1JT0dNRkVFRDoJLyogZ2V0IG1hbnVhbCBmZWVkICovCi0JCXJldHVybiggLUVJTlZBTCApOwotCi0JICBjYXNlIFNMTUlPU1BTSVpFOgkvKiBzZXQgcGFwZXIgc2l6ZSAqLwotCQlyZXR1cm4oIC1FSU5WQUwgKTsKLQotCSAgY2FzZSBTTE1JT1NNRkVFRDoJLyogc2V0IG1hbnVhbCBmZWVkICovCi0JCXJldHVybiggLUVJTlZBTCApOwotCi0JfQotCXJldHVybiggLUVJTlZBTCApOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSBPcGVuaW5nIGFuZCBDbG9zaW5nCQkJCQkJICAqLwotCi0KLXN0YXRpYyBpbnQgc2xtX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkKLQotewlpbnQgZGV2aWNlOwotCXN0cnVjdCBzbG0gKnNpcDsKLQkKLQlkZXZpY2UgPSBpbWlub3IoaW5vZGUpOwotCWlmIChkZXZpY2UgPj0gTl9TTE1fUHJpbnRlcnMpCi0JCXJldHVybiggLUVOWElPICk7Ci0Jc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgMikgewotCQkvKiBvcGVuIGZvciB3cml0aW5nIGlzIGV4Y2x1c2l2ZSAqLwotCQlpZiAoICFhdG9taWNfZGVjX2FuZF90ZXN0KCZzaXAtPndyX29rKSApIHsKLQkJCWF0b21pY19pbmMoJnNpcC0+d3Jfb2spOwkKLQkJCXJldHVybiggLUVCVVNZICk7Ci0JCX0KLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIDEpIHsKLQkJLyogb3BlbiBmb3IgcmVhZGluZyBpcyBleGNsdXNpdmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoICFhdG9taWNfZGVjX2FuZF90ZXN0KCZzaXAtPnJkX29rKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnNpcC0+cmRfb2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCAtRUJVU1kgKTsKLSAgICAgICAgICAgICAgICB9Ci0JfQotCi0JcmV0dXJuKCAwICk7Ci19Ci0KLQotc3RhdGljIGludCBzbG1fcmVsZWFzZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKQotCi17CWludCBkZXZpY2U7Ci0Jc3RydWN0IHNsbSAqc2lwOwotCQotCWRldmljZSA9IGltaW5vcihpbm9kZSk7Ci0Jc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgMikKLQkJYXRvbWljX2luYyggJnNpcC0+d3Jfb2sgKTsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgMSkKLQkJYXRvbWljX2luYyggJnNpcC0+cmRfb2sgKTsKLQkKLQlyZXR1cm4oIDAgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCSBBQ1NJIFByaW1pdGl2ZXMgZm9yIHRoZSBTTE0JCQkJCSAgKi8KLQotCi1zdGF0aWMgaW50IHNsbV9yZXFfc2Vuc2UoIGludCBkZXZpY2UgKQotCi17CWludAkJCXN0YXQsIHJ2OwotCXN0cnVjdCBzbG0gKnNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCQotCXN0ZG1hX2xvY2soIE5VTEwsIE5VTEwgKTsKLQotCUNNRFNFVF9UQVJHX0xVTiggc2xtcmVxc2Vuc2VfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQlpZiAoIWFjc2ljbWRfbm9kbWEoIHNsbXJlcXNlbnNlX2NtZCwgMCApIHx8Ci0JCShzdGF0ID0gYWNzaV9nZXRzdGF0dXMoKSkgPCAwKQotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCWVsc2UKLQkJcnYgPSBzdGF0ICYgMHgxZjsKLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuKCBydiApOwotfQotCi0KLXN0YXRpYyBpbnQgc2xtX21vZGVfc2Vuc2UoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGFic19mbGFnICkKLQotewl1bnNpZ25lZCBjaGFyCXN0YXQsIGxlbjsKLQlpbnQJCQkJcnYgPSAwOwotCXN0cnVjdCBzbG0JCSpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQkKLQlzdGRtYV9sb2NrKCBOVUxMLCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbW1zZW5zZV9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCXNsbW1zZW5zZV9jbWRbNV0gPSBhYnNfZmxhZyA/IDB4ODAgOiAwOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtbXNlbnNlX2NtZCwgMCApKSB7Ci0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCWdvdG8gdGhlX2VuZDsKLQl9Ci0KLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCAmc3RhdCwgMSApKSB7Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCQotCWlmICghYWNzaV9leHRzdGF0dXMoICZsZW4sIDEgKSkgewotCQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJZ290byB0aGVfZW5kOwotCX0KLQlidWZmZXJbMF0gPSBsZW47Ci0JaWYgKCFhY3NpX2V4dHN0YXR1cyggYnVmZmVyKzEsIGxlbiApKSB7Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCQotCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCXJ2ID0gc3RhdCAmIDB4MWY7Ci0KLSAgdGhlX2VuZDoKLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybiggcnYgKTsKLX0KLQotCi0jaWYgMAotLyogY3VycmVudGx5IHVudXNlZCAqLwotc3RhdGljIGludCBzbG1fbW9kZV9zZWxlY3QoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwKLQkJCQkJCQlpbnQgZGVmYXVsdF9mbGFnICkKLQotewlpbnQJCQlzdGF0LCBydjsKLQlzdHJ1Y3Qgc2xtCSpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQkKLQlzdGRtYV9sb2NrKCBOVUxMLCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbW1zZWxlY3RfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQlzbG1tc2VsZWN0X2NtZFs1XSA9IGRlZmF1bHRfZmxhZyA/IDB4ODAgOiAwOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtbXNlbGVjdF9jbWQsIDAgKSkgewotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCi0JaWYgKCFkZWZhdWx0X2ZsYWcpIHsKLQkJdW5zaWduZWQgY2hhciBjID0gbGVuOwotCQlpZiAoIWFjc2lfZXh0Y21kKCAmYywgMSApKSB7Ci0JCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQkJZ290byB0aGVfZW5kOwotCQl9Ci0JCWlmICghYWNzaV9leHRjbWQoIGJ1ZmZlciwgbGVuICkpIHsKLQkJCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCQlnb3RvIHRoZV9lbmQ7Ci0JCX0KLQl9Ci0JCi0Jc3RhdCA9IGFjc2lfZ2V0c3RhdHVzKCk7Ci0JcnYgPSAoc3RhdCA8IDAgPyBTTE1TVEFUX0FDU0lUTyA6IHN0YXQpOwotCi0gIHRoZV9lbmQ6Ci0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4oIHJ2ICk7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IHNsbV9nZXRfcGFnZXNpemUoIGludCBkZXZpY2UsIGludCAqdywgaW50ICpoICkKLQotewljaGFyCWJ1ZlsyNTZdOwotCWludAkJc3RhdDsKLQkKLQlzdGF0ID0gc2xtX21vZGVfc2Vuc2UoIGRldmljZSwgYnVmLCAwICk7Ci0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQotCWlmIChzdGF0ICE9IFNMTVNUQVRfT0spCi0JCXJldHVybiggLUVJTyApOwotCi0JKncgPSAoYnVmWzNdIDw8IDgpIHwgYnVmWzRdOwotCSpoID0gKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKLQlyZXR1cm4oIDAgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkJSW5pdGlhbGl6YXRpb24JCQkJCQkJICAqLwotCi0KLWludCBhdHRhY2hfc2xtKCBpbnQgdGFyZ2V0LCBpbnQgbHVuICkKLQotewlzdGF0aWMgaW50CWRpZF9yZWdpc3RlcjsKLQlpbnQJCQlsZW47Ci0KLQlpZiAoTl9TTE1fUHJpbnRlcnMgPj0gTUFYX1NMTSkgewotCQlwcmludGsoIEtFUk5fV0FSTklORyAiVG9vIG11Y2ggU0xNc1xuIiApOwotCQlyZXR1cm4oIDAgKTsKLQl9Ci0JCi0JLyogZG8gYW4gSU5RVUlSWSAqLwotCXVkZWxheSgxMDApOwotCUNNRFNFVF9UQVJHX0xVTiggc2xtaW5xdWlyeV9jbWQsIHRhcmdldCwgbHVuICk7Ci0JaWYgKCFhY3NpY21kX25vZG1hKCBzbG1pbnF1aXJ5X2NtZCwgMCApKSB7Ci0JICBpbnFfdGltZW91dDoKLQkJcHJpbnRrKCBLRVJOX0VSUiAiU0xNIGlucXVpcnkgY29tbWFuZCB0aW1lZCBvdXQuXG4iICk7Ci0JICBpbnFfZmFpbDoKLQkJYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JCXJldHVybiggMCApOwotCX0KLQkvKiByZWFkIHN0YXR1cyBhbmQgaGVhZGVyIG9mIHJldHVybiBkYXRhICovCi0JaWYgKCFhY3NpX2V4dHN0YXR1cyggU0xNQnVmZmVyLCA2ICkpCi0JCWdvdG8gaW5xX3RpbWVvdXQ7Ci0KLQlpZiAoU0xNQnVmZmVyWzFdICE9IDIpIHsgLyogZGV2aWNlIHR5cGUgPT0gcHJpbnRlcj8gKi8KLQkJcHJpbnRrKCBLRVJOX0VSUiAiU0xNIGlucXVpcnkgcmV0dXJuZWQgZGV2aWNlIHR5cGUgIT0gcHJpbnRlclxuIiApOwotCQlnb3RvIGlucV9mYWlsOwotCX0KLQlsZW4gPSBTTE1CdWZmZXJbNV07Ci0JCi0JLyogcmVhZCBpZCBzdHJpbmcgKi8KLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCBTTE1CdWZmZXIsIGxlbiApKQotCQlnb3RvIGlucV90aW1lb3V0OwotCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCVNMTUJ1ZmZlcltsZW5dID0gMDsKLQotCWlmICghZGlkX3JlZ2lzdGVyKSB7Ci0JCWRpZF9yZWdpc3RlciA9IDE7Ci0JfQotCi0Jc2xtX2luZm9bTl9TTE1fUHJpbnRlcnNdLnRhcmdldCA9IHRhcmdldDsKLQlzbG1faW5mb1tOX1NMTV9QcmludGVyc10ubHVuICAgID0gbHVuOwotCWF0b21pY19zZXQoJnNsbV9pbmZvW05fU0xNX1ByaW50ZXJzXS53cl9vaywgMSApOyAKLQlhdG9taWNfc2V0KCZzbG1faW5mb1tOX1NMTV9QcmludGVyc10ucmRfb2ssIDEgKTsKLQkKLQlwcmludGsoIEtFUk5fSU5GTyAiICBQcmludGVyOiAlc1xuIiwgU0xNQnVmZmVyICk7Ci0JcHJpbnRrKCBLRVJOX0lORk8gIkRldGVjdGVkIHNsbSVkIGF0IGlkICVkIGx1biAlZFxuIiwKLQkJCU5fU0xNX1ByaW50ZXJzLCB0YXJnZXQsIGx1biApOwotCU5fU0xNX1ByaW50ZXJzKys7Ci0JcmV0dXJuKCAxICk7Ci19Ci0KLWludCBzbG1faW5pdCggdm9pZCApCi0KLXsKLQlpbnQgaTsKLQlpZiAocmVnaXN0ZXJfY2hyZGV2KCBBQ1NJX01BSk9SLCAic2xtIiwgJnNsbV9mb3BzICkpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiVW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgQUNTSSBTTE1cbiIsIEFDU0lfTUFKT1IgKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JCi0JaWYgKCEoU0xNQnVmZmVyID0gYXRhcmlfc3RyYW1fYWxsb2MoIFNMTV9CVUZGRVJfU0laRSwgIlNMTSIgKSkpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiVW5hYmxlIHRvIGdldCBTTE0gU1QtUmFtIGJ1ZmZlci5cbiIgKTsKLQkJdW5yZWdpc3Rlcl9jaHJkZXYoIEFDU0lfTUFKT1IsICJzbG0iICk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlCdWZmZXJQID0gU0xNQnVmZmVyOwotCVNMTVN0YXRlID0gSURMRTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIE1PRFVMRQotCi0vKiBmcm9tIGFjc2kuYyAqLwotdm9pZCBhY3NpX2F0dGFjaF9TTE1zKCBpbnQgKCphdHRhY2hfZnVuYykoIGludCwgaW50ICkgKTsKLQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gc2xtX2luaXQoKSkpCi0JCXJldHVybiggZXJyICk7Ci0JLyogVGhpcyBjYWxscyBhdHRhY2hfc2xtKCkgZm9yIGV2ZXJ5IHRhcmdldC9sdW4gd2hlcmUgYWNzaS5jIGRldGVjdGVkIGEKLQkgKiBwcmludGVyICovCi0JYWNzaV9hdHRhY2hfU0xNcyggYXR0YWNoX3NsbSApOwotCXJldHVybiggMCApOwotfQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JaWYgKHVucmVnaXN0ZXJfY2hyZGV2KCBBQ1NJX01BSk9SLCAic2xtIiApICE9IDApCi0JCXByaW50ayggS0VSTl9FUlIgImFjc2lfc2xtOiBjbGVhbnVwX21vZHVsZSBmYWlsZWRcbiIpOwotCWF0YXJpX3N0cmFtX2ZyZWUoIFNMTUJ1ZmZlciApOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggMGZjYWQ0My4uYTJkNjYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKIAljYXNlIFNHX0VNVUxBVEVEX0hPU1Q6CiAJY2FzZSBTR19JTzoKIAljYXNlIFNDU0lfSU9DVExfU0VORF9DT01NQU5EOgotCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZXAsIGRpc2ssIGNtZCwgYXJncCk7CisJCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxlcCwgZGlzay0+cXVldWUsIGRpc2ssIGNtZCwgYXJncCk7CiAKIAkvKiBzY3NpX2NtZF9pb2N0bCB3b3VsZCBub3JtYWxseSBoYW5kbGUgdGhlc2UsIGJlbG93LCBidXQgKi8KIAkvKiB0aGV5IGFyZW4ndCBhIGdvb2QgZml0IGZvciBjY2lzcywgYXMgQ0QtUk9NcyBhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggNDUwMzI5MC4uZTQyNWRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTY4LDYgKzY4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb29wLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIGludmFsaWRhdGVfYmRldigpICovCiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpAQCAtNjAwLDEzICs2MDEsNiBAQAogCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBkYXRhOwogCXN0cnVjdCBiaW8gKmJpbzsKIAotCS8qCi0JICogbG9vcCBjYW4gYmUgdXNlZCBpbiBhbiBlbmNyeXB0ZWQgZGV2aWNlLAotCSAqIGhlbmNlLCBpdCBtdXN0bid0IGJlIHN0b3BwZWQgYXQgYWxsCi0JICogYmVjYXVzZSBpdCBjb3VsZCBiZSBpbmRpcmVjdGx5IHVzZWQgZHVyaW5nIHN1c3BlbnNpb24KLQkgKi8KLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IGxvLT5sb19iaW8pIHsKQEAgLTE1NzQsOCArMTU2OCw3IEBACiAJCWxvb3BfZGVsX29uZShsbyk7CiAKIAlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoTE9PUF9NQUpPUiwgMCksIHJhbmdlKTsKLQlpZiAodW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9vcDogY2Fubm90IHVucmVnaXN0ZXIgYmxrZGV2XG4iKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihMT09QX01BSk9SLCAibG9vcCIpOwogfQogCiBtb2R1bGVfaW5pdChsb29wX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggYzU3NWZiMS4uYzEyOTUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0xMjIsMTcgKzEyMiwxMiBAQAogCWludCByZXN1bHQ7CiAJc3RydWN0IG1zZ2hkciBtc2c7CiAJc3RydWN0IGt2ZWMgaW92OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2lnc2V0X3Qgb2xkc2V0OworCXNpZ3NldF90IGJsb2NrZWQsIG9sZHNldDsKIAogCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKIAkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQlvbGRzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCXNpZ2RlbHNldG1hc2soJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHS0lMTCkpOwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXNpZ2luaXRzZXRpbnYoJmJsb2NrZWQsIHNpZ21hc2soU0lHS0lMTCkpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYmxvY2tlZCwgJm9sZHNldCk7CiAKIAlkbyB7CiAJCXNvY2stPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PSU87CkBAIC0xNTEsMTEgKzE0Niw5IEBACiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlzaWdpbmZvX3QgaW5mbzsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuYmQgKHBpZCAlZDogJXMpIGdvdCBzaWduYWwgJWRcbiIsCi0JCQkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCAKLQkJCQlkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCAmY3VycmVudC0+YmxvY2tlZCwgJmluZm8pKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwkJCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sCisJCQkJZGVxdWV1ZV9zaWduYWxfbG9jayhjdXJyZW50LCAmY3VycmVudC0+YmxvY2tlZCwgJmluZm8pKTsKIAkJCXJlc3VsdCA9IC1FSU5UUjsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNjksMTAgKzE2Miw3IEBACiAJCWJ1ZiArPSByZXN1bHQ7CiAJfSB3aGlsZSAoc2l6ZSA+IDApOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQljdXJyZW50LT5ibG9ja2VkID0gb2xkc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkc2V0LCBOVUxMKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IGNlNjRlODYuLjMxYmUzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC0xNTkzLDYgKzE1OTMsNyBAQAogCWxvbmcgbWluX3NsZWVwX3RpbWUsIHJlc2lkdWU7CiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJZm9yICg7OykgewogCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKQEAgLTE2NTIsOSArMTY1Myw2IEBACiAJCQkJfQogCQkJfQogCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwotCQkJfQogCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKIAkJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZTNjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKQEAgLTAsMCArMSw5NzIgQEAKKy8qIHN1bnZkYy5jOiBTdW4gTERPTSBWaXJ0dWFsIERpc2sgQ2xpZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInN1bnZkYyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bmUgMjUsIDIwMDciCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKwlEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VuIExET00gdmlydHVhbCBkaXNrIGNsaWVudCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CisKKyNkZWZpbmUgVkRDX1RYX1JJTkdfU0laRQkyNTYKKworI2RlZmluZSBXQUlUSU5HX0ZPUl9MSU5LX1VQCTB4MDEKKyNkZWZpbmUgV0FJVElOR19GT1JfVFhfU1BBQ0UJMHgwMgorI2RlZmluZSBXQUlUSU5HX0ZPUl9HRU5fQ01ECTB4MDQKKyNkZWZpbmUgV0FJVElOR19GT1JfQU5ZCQktMQorCitzdHJ1Y3QgdmRjX3JlcV9lbnRyeSB7CisJc3RydWN0IHJlcXVlc3QJCSpyZXE7Cit9OworCitzdHJ1Y3QgdmRjX3BvcnQgeworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlCXZpbzsKKworCXN0cnVjdCB2ZGMJCSp2cDsKKworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKworCXN0cnVjdCB2ZGNfY29tcGxldGlvbgkqY21wOworCisJdTY0CQkJcmVxX2lkOworCXU2NAkJCXNlcTsKKwlzdHJ1Y3QgdmRjX3JlcV9lbnRyeQlycV9hcnJbVkRDX1RYX1JJTkdfU0laRV07CisKKwl1bnNpZ25lZCBsb25nCQlyaW5nX2Nvb2tpZXM7CisKKwl1NjQJCQltYXhfeGZlcl9zaXplOworCXUzMgkJCXZkaXNrX2Jsb2NrX3NpemU7CisKKwkvKiBUaGUgc2VydmVyIGZpbGxzIHRoZXNlIGluIGZvciB1cyBpbiB0aGUgZGlzayBhdHRyaWJ1dGUKKwkgKiBBQ0sgcGFja2V0LgorCSAqLworCXU2NAkJCW9wZXJhdGlvbnM7CisJdTMyCQkJdmRpc2tfc2l6ZTsKKwl1OAkJCXZkaXNrX3R5cGU7CisJdTgJCQlkZXZfbm87CisKKwljaGFyCQkJZGlza19uYW1lWzMyXTsKKworCXN0cnVjdCB2aW9fZGlza19nZW9tCWdlb207CisJc3RydWN0IHZpb19kaXNrX3Z0b2MJbGFiZWw7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2ZGNfcG9ydCAqdG9fdmRjX3BvcnQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHZpbywgc3RydWN0IHZkY19wb3J0LCB2aW8pOworfQorCitzdHJ1Y3QgdmRjIHsKKwkvKiBQcm90ZWN0cyBwcm90X2xpc3QuICAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgdmlvX2RldgkJKmRldjsKKworCXN0cnVjdCBsaXN0X2hlYWQJcG9ydF9saXN0OworfTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0ICovCitzdGF0aWMgc3RydWN0IHZpb192ZXJzaW9uIHZkY192ZXJzaW9uc1tdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworI2RlZmluZSBWRENCTEtfTkFNRQkidmRpc2siCitzdGF0aWMgaW50IHZkY19tYWpvcjsKKyNkZWZpbmUgUEFSVElUSU9OX1NISUZUCTMKKworc3RhdGljIGlubGluZSB1MzIgdmRjX3R4X2RyaW5nX2F2YWlsKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCXJldHVybiB2aW9fZHJpbmdfYXZhaWwoZHIsIFZEQ19UWF9SSU5HX1NJWkUpOworfQorCitzdGF0aWMgaW50IHZkY19nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IGRpc2stPnByaXZhdGVfZGF0YTsKKworCWdlby0+aGVhZHMgPSAodTgpIHBvcnQtPmdlb20ubnVtX2hkOworCWdlby0+c2VjdG9ycyA9ICh1OCkgcG9ydC0+Z2VvbS5udW1fc2VjOworCWdlby0+Y3lsaW5kZXJzID0gcG9ydC0+Z2VvbS5udW1fY3lsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgdmRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5nZXRnZW8JCT0gdmRjX2dldGdlbywKK307CisKK3N0YXRpYyB2b2lkIHZkY19maW5pc2goc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgaW50IGVyciwgaW50IHdhaXRpbmdfZm9yKQoreworCWlmICh2aW8tPmNtcCAmJgorCSAgICAod2FpdGluZ19mb3IgPT0gLTEgfHwKKwkgICAgIHZpby0+Y21wLT53YWl0aW5nX2ZvciA9PSB3YWl0aW5nX2ZvcikpIHsKKwkJdmlvLT5jbXAtPmVyciA9IGVycjsKKwkJY29tcGxldGUoJnZpby0+Y21wLT5jb20pOworCQl2aW8tPmNtcCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZGNfaGFuZHNoYWtlX2NvbXBsZXRlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJdmRjX2ZpbmlzaCh2aW8sIDAsIFdBSVRJTkdfRk9SX0xJTktfVVApOworfQorCitzdGF0aWMgaW50IHZkY19oYW5kbGVfdW5rbm93bihzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlvX21zZ190YWcgKnBrdCA9IGFyZzsKKworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlY2VpdmVkIHVua25vd24gbXNnIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkgICAgICAgcGt0LT50eXBlLCBwa3QtPnN0eXBlLCBwa3QtPnN0eXBlX2VudiwgcGt0LT5zaWQpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlc2V0dGluZyBjb25uZWN0aW9uLlxuIik7CisKKwlsZGNfZGlzY29ubmVjdChwb3J0LT52aW8ubHApOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHZkY19zZW5kX2F0dHIoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSB0b192ZGNfcG9ydCh2aW8pOworCXN0cnVjdCB2aW9fZGlza19hdHRyX2luZm8gcGt0OworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKworCXBrdC50YWcudHlwZSA9IFZJT19UWVBFX0NUUkw7CisJcGt0LnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0lORk87CisJcGt0LnRhZy5zdHlwZV9lbnYgPSBWSU9fQVRUUl9JTkZPOworCXBrdC50YWcuc2lkID0gdmlvX3NlbmRfc2lkKHZpbyk7CisKKwlwa3QueGZlcl9tb2RlID0gVklPX0RSSU5HX01PREU7CisJcGt0LnZkaXNrX2Jsb2NrX3NpemUgPSBwb3J0LT52ZGlza19ibG9ja19zaXplOworCXBrdC5tYXhfeGZlcl9zaXplID0gcG9ydC0+bWF4X3hmZXJfc2l6ZTsKKworCXZpb2RiZyhIUywgIlNFTkQgQVRUUiB4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsdV1cbiIsCisJICAgICAgIHBrdC54ZmVyX21vZGUsIHBrdC52ZGlza19ibG9ja19zaXplLCBwa3QubWF4X3hmZXJfc2l6ZSk7CisKKwlyZXR1cm4gdmlvX2xkY19zZW5kKCZwb3J0LT52aW8sICZwa3QsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCB2ZGNfaGFuZGxlX2F0dHIoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IHRvX3ZkY19wb3J0KHZpbyk7CisJc3RydWN0IHZpb19kaXNrX2F0dHJfaW5mbyAqcGt0ID0gYXJnOworCisJdmlvZGJnKEhTLCAiR09UIEFUVFIgc3R5cGVbMHgleF0gb3BzWyVseF0gZGlza19zaXplWyVsdV0gZGlza190eXBlWyV4XSAiCisJICAgICAgICJ4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsdV1cbiIsCisJICAgICAgIHBrdC0+dGFnLnN0eXBlLCBwa3QtPm9wZXJhdGlvbnMsCisJICAgICAgIHBrdC0+dmRpc2tfc2l6ZSwgcGt0LT52ZGlza190eXBlLAorCSAgICAgICBwa3QtPnhmZXJfbW9kZSwgcGt0LT52ZGlza19ibG9ja19zaXplLAorCSAgICAgICBwa3QtPm1heF94ZmVyX3NpemUpOworCisJaWYgKHBrdC0+dGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0FDSykgeworCQlzd2l0Y2ggKHBrdC0+dmRpc2tfdHlwZSkgeworCQljYXNlIFZEX0RJU0tfVFlQRV9ESVNLOgorCQljYXNlIFZEX0RJU0tfVFlQRV9TTElDRToKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQm9ndXMgdmRpc2tfdHlwZSAweCV4XG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwgcGt0LT52ZGlza190eXBlKTsKKwkJCXJldHVybiAtRUNPTk5SRVNFVDsKKwkJfQorCisJCWlmIChwa3QtPnZkaXNrX2Jsb2NrX3NpemUgPiBwb3J0LT52ZGlza19ibG9ja19zaXplKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQkxPQ0sgc2l6ZSBpbmNyZWFzZWQgIgorCQkJICAgICAgICIldSAtLT4gJXVcbiIsCisJCQkgICAgICAgdmlvLT5uYW1lLAorCQkJICAgICAgIHBvcnQtPnZkaXNrX2Jsb2NrX3NpemUsIHBrdC0+dmRpc2tfYmxvY2tfc2l6ZSk7CisJCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJCX0KKworCQlwb3J0LT5vcGVyYXRpb25zID0gcGt0LT5vcGVyYXRpb25zOworCQlwb3J0LT52ZGlza19zaXplID0gcGt0LT52ZGlza19zaXplOworCQlwb3J0LT52ZGlza190eXBlID0gcGt0LT52ZGlza190eXBlOworCQlpZiAocGt0LT5tYXhfeGZlcl9zaXplIDwgcG9ydC0+bWF4X3hmZXJfc2l6ZSkKKwkJCXBvcnQtPm1heF94ZmVyX3NpemUgPSBwa3QtPm1heF94ZmVyX3NpemU7CisJCXBvcnQtPnZkaXNrX2Jsb2NrX3NpemUgPSBwa3QtPnZkaXNrX2Jsb2NrX3NpemU7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBBdHRyaWJ1dGUgTkFDS1xuIiwgdmlvLT5uYW1lKTsKKworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZGNfZW5kX3NwZWNpYWwoc3RydWN0IHZkY19wb3J0ICpwb3J0LCBzdHJ1Y3QgdmlvX2Rpc2tfZGVzYyAqZGVzYykKK3sKKwlpbnQgZXJyID0gZGVzYy0+c3RhdHVzOworCisJdmRjX2ZpbmlzaCgmcG9ydC0+dmlvLCAtZXJyLCBXQUlUSU5HX0ZPUl9HRU5fQ01EKTsKK30KKworc3RhdGljIHZvaWQgdmRjX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCB1cHRvZGF0ZSwgaW50IG51bV9zZWN0b3JzKQoreworCWlmIChlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHJlcSwgdXB0b2RhdGUsIG51bV9zZWN0b3JzKSkKKwkJcmV0dXJuOworCWFkZF9kaXNrX3JhbmRvbW5lc3MocmVxLT5ycV9kaXNrKTsKKwllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxLCB1cHRvZGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHZkY19lbmRfb25lKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQl1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHZpb19kaXNrX2Rlc2MgKmRlc2MgPSB2aW9fZHJpbmdfZW50cnkoZHIsIGluZGV4KTsKKwlzdHJ1Y3QgdmRjX3JlcV9lbnRyeSAqcnFlID0gJnBvcnQtPnJxX2FycltpbmRleF07CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKworCWlmICh1bmxpa2VseShkZXNjLT5oZHIuc3RhdGUgIT0gVklPX0RFU0NfRE9ORSkpCisJCXJldHVybjsKKworCWxkY191bm1hcChwb3J0LT52aW8ubHAsIGRlc2MtPmNvb2tpZXMsIGRlc2MtPm5jb29raWVzKTsKKwlkZXNjLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19GUkVFOworCWRyLT5jb25zID0gKGluZGV4ICsgMSkgJiAoVkRDX1RYX1JJTkdfU0laRSAtIDEpOworCisJcmVxID0gcnFlLT5yZXE7CisJaWYgKHJlcSA9PSBOVUxMKSB7CisJCXZkY19lbmRfc3BlY2lhbChwb3J0LCBkZXNjKTsKKwkJcmV0dXJuOworCX0KKworCXJxZS0+cmVxID0gTlVMTDsKKworCXZkY19lbmRfcmVxdWVzdChyZXEsICFkZXNjLT5zdGF0dXMsIGRlc2MtPnNpemUgPj4gOSk7CisKKwlpZiAoYmxrX3F1ZXVlX3N0b3BwZWQocG9ydC0+ZGlzay0+cXVldWUpKQorCQlibGtfc3RhcnRfcXVldWUocG9ydC0+ZGlzay0+cXVldWUpOworfQorCitzdGF0aWMgaW50IHZkY19hY2soc3RydWN0IHZkY19wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSAqcGt0ID0gbXNnYnVmOworCisJaWYgKHVubGlrZWx5KHBrdC0+ZHJpbmdfaWRlbnQgIT0gZHItPmlkZW50IHx8CisJCSAgICAgcGt0LT5zdGFydF9pZHggIT0gcGt0LT5lbmRfaWR4IHx8CisJCSAgICAgcGt0LT5zdGFydF9pZHggPj0gVkRDX1RYX1JJTkdfU0laRSkpCisJCXJldHVybiAwOworCisJdmRjX2VuZF9vbmUocG9ydCwgZHIsIHBrdC0+c3RhcnRfaWR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkY19uYWNrKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCS8qIFhYWCBJbXBsZW1lbnQgbWUgWFhYICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkY19ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSBhcmc7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpby0+bG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KGV2ZW50ID09IExEQ19FVkVOVF9SRVNFVCB8fAorCQkgICAgIGV2ZW50ID09IExEQ19FVkVOVF9VUCkpIHsKKwkJdmlvX2xpbmtfc3RhdGVfY2hhbmdlKHZpbywgZXZlbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVuZXhwZWN0ZWQgTERDIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgdmlvX21zZ190YWcgdGFnOworCQkJdTY0IHJhd1s4XTsKKwkJfSBtc2didWY7CisKKwkJZXJyID0gbGRjX3JlYWQodmlvLT5scCwgJm1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZikpOworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJdmlvX2Nvbm5fcmVzZXQodmlvKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlcnIgPT0gMCkKKwkJCWJyZWFrOworCQl2aW9kYmcoREFUQSwgIlRBRyBbJTAyeDolMDJ4OiUwNHg6JTA4eF1cbiIsCisJCSAgICAgICBtc2didWYudGFnLnR5cGUsCisJCSAgICAgICBtc2didWYudGFnLnN0eXBlLAorCQkgICAgICAgbXNnYnVmLnRhZy5zdHlwZV9lbnYsCisJCSAgICAgICBtc2didWYudGFnLnNpZCk7CisJCWVyciA9IHZpb192YWxpZGF0ZV9zaWQodmlvLCAmbXNnYnVmLnRhZyk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGxpa2VseShtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfREFUQSkpIHsKKwkJCWlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0FDSykKKwkJCQllcnIgPSB2ZGNfYWNrKHBvcnQsICZtc2didWYpOworCQkJZWxzZSBpZiAobXNnYnVmLnRhZy5zdHlwZSA9PSBWSU9fU1VCVFlQRV9OQUNLKQorCQkJCWVyciA9IHZkY19uYWNrKHBvcnQsICZtc2didWYpOworCQkJZWxzZQorCQkJCWVyciA9IHZkY19oYW5kbGVfdW5rbm93bihwb3J0LCAmbXNnYnVmKTsKKwkJfSBlbHNlIGlmIChtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfQ1RSTCkgeworCQkJZXJyID0gdmlvX2NvbnRyb2xfcGt0X2VuZ2luZSh2aW8sICZtc2didWYpOworCQl9IGVsc2UgeworCQkJZXJyID0gdmRjX2hhbmRsZV91bmtub3duKHBvcnQsICZtc2didWYpOworCQl9CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisJfQorCWlmIChlcnIgPCAwKQorCQl2ZGNfZmluaXNoKCZwb3J0LT52aW8sIGVyciwgV0FJVElOR19GT1JfQU5ZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX3ZkY190eF90cmlnZ2VyKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJc3RydWN0IHZpb19kcmluZ19kYXRhIGhkciA9IHsKKwkJLnRhZyA9IHsKKwkJCS50eXBlCQk9IFZJT19UWVBFX0RBVEEsCisJCQkuc3R5cGUJCT0gVklPX1NVQlRZUEVfSU5GTywKKwkJCS5zdHlwZV9lbnYJPSBWSU9fRFJJTkdfREFUQSwKKwkJCS5zaWQJCT0gdmlvX3NlbmRfc2lkKCZwb3J0LT52aW8pLAorCQl9LAorCQkuZHJpbmdfaWRlbnQJCT0gZHItPmlkZW50LAorCQkuc3RhcnRfaWR4CQk9IGRyLT5wcm9kLAorCQkuZW5kX2lkeAkJPSBkci0+cHJvZCwKKwl9OworCWludCBlcnIsIGRlbGF5OworCisJaGRyLnNlcSA9IGRyLT5zbmRfbnh0OworCWRlbGF5ID0gMTsKKwlkbyB7CisJCWVyciA9IHZpb19sZGNfc2VuZCgmcG9ydC0+dmlvLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJCWlmIChlcnIgPiAwKSB7CisJCQlkci0+c25kX254dCsrOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KGRlbGF5KTsKKwkJaWYgKChkZWxheSA8PD0gMSkgPiAxMjgpCisJCQlkZWxheSA9IDEyODsKKwl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fc2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1twb3J0LT5yaW5nX2Nvb2tpZXNdOworCXN0cnVjdCB2ZGNfcmVxX2VudHJ5ICpycWU7CisJc3RydWN0IHZpb19kaXNrX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IG1hcF9wZXJtOworCWludCBuc2csIGVyciwgaTsKKwl1NjQgbGVuOworCXU4IG9wOworCisJbWFwX3Blcm0gPSBMRENfTUFQX1NIQURPVyB8IExEQ19NQVBfRElSRUNUIHwgTERDX01BUF9JTzsKKworCWlmIChycV9kYXRhX2RpcihyZXEpID09IFJFQUQpIHsKKwkJbWFwX3Blcm0gfD0gTERDX01BUF9XOworCQlvcCA9IFZEX09QX0JSRUFEOworCX0gZWxzZSB7CisJCW1hcF9wZXJtIHw9IExEQ19NQVBfUjsKKwkJb3AgPSBWRF9PUF9CV1JJVEU7CisJfQorCisJbnNnID0gYmxrX3JxX21hcF9zZyhyZXEtPnEsIHJlcSwgc2cpOworCisJbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspCisJCWxlbiArPSBzZ1tpXS5sZW5ndGg7CisKKwlpZiAodW5saWtlbHkodmRjX3R4X2RyaW5nX2F2YWlsKGRyKSA8IDEpKSB7CisJCWJsa19zdG9wX3F1ZXVlKHBvcnQtPmRpc2stPnF1ZXVlKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZGVzYyA9IHZpb19kcmluZ19jdXIoZHIpOworCisJZXJyID0gbGRjX21hcF9zZyhwb3J0LT52aW8ubHAsIHNnLCBuc2csCisJCQkgZGVzYy0+Y29va2llcywgcG9ydC0+cmluZ19jb29raWVzLAorCQkJIG1hcF9wZXJtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfbWFwX3NnKCkgZmFpbHVyZSwgZXJyPSVkLlxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlycWUgPSAmcG9ydC0+cnFfYXJyW2RyLT5wcm9kXTsKKwlycWUtPnJlcSA9IHJlcTsKKworCWRlc2MtPmhkci5hY2sgPSBWSU9fQUNLX0VOQUJMRTsKKwlkZXNjLT5yZXFfaWQgPSBwb3J0LT5yZXFfaWQ7CisJZGVzYy0+b3BlcmF0aW9uID0gb3A7CisJaWYgKHBvcnQtPnZkaXNrX3R5cGUgPT0gVkRfRElTS19UWVBFX0RJU0spIHsKKwkJZGVzYy0+c2xpY2UgPSAyOworCX0gZWxzZSB7CisJCWRlc2MtPnNsaWNlID0gMDsKKwl9CisJZGVzYy0+c3RhdHVzID0gfjA7CisJZGVzYy0+b2Zmc2V0ID0gKHJlcS0+c2VjdG9yIDw8IDkpIC8gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZTsKKwlkZXNjLT5zaXplID0gbGVuOworCWRlc2MtPm5jb29raWVzID0gZXJyOworCisJLyogVGhpcyBoYXMgdG8gYmUgYSBub24tU01QIHdyaXRlIGJhcnJpZXIgYmVjYXVzZSB3ZSBhcmUgd3JpdGluZworCSAqIHRvIG1lbW9yeSB3aGljaCBpcyBzaGFyZWQgd2l0aCB0aGUgcGVlciBMRE9NLgorCSAqLworCXdtYigpOworCWRlc2MtPmhkci5zdGF0ZSA9IFZJT19ERVNDX1JFQURZOworCisJZXJyID0gX192ZGNfdHhfdHJpZ2dlcihwb3J0KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2ZGNfdHhfdHJpZ2dlcigpIGZhaWx1cmUsIGVycj0lZFxuIiwgZXJyKTsKKwl9IGVsc2UgeworCQlwb3J0LT5yZXFfaWQrKzsKKwkJZHItPnByb2QgPSAoZHItPnByb2QgKyAxKSAmIChWRENfVFhfUklOR19TSVpFIC0gMSk7CisJfQorb3V0OgorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZG9fdmRjX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQoreworCXdoaWxlICgxKSB7CisJCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCisJCWlmICghcmVxKQorCQkJYnJlYWs7CisKKwkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCQlpZiAoX19zZW5kX3JlcXVlc3QocmVxKSA8IDApCisJCQl2ZGNfZW5kX3JlcXVlc3QocmVxLCAwLCByZXEtPmhhcmRfbnJfc2VjdG9ycyk7CisJfQorfQorCitzdGF0aWMgaW50IGdlbmVyaWNfcmVxdWVzdChzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHU4IG9wLCB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisJc3RydWN0IHZpb19jb21wbGV0aW9uIGNvbXA7CisJc3RydWN0IHZpb19kaXNrX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IG1hcF9wZXJtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9wX2xlbiwgZXJyOworCXZvaWQgKnJlcV9idWY7CisKKwlpZiAoISgoKHU2NCkxIDw8ICgodTY0KW9wIC0gMSkpICYgcG9ydC0+b3BlcmF0aW9ucykpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIFZEX09QX0JSRUFEOgorCWNhc2UgVkRfT1BfQldSSVRFOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBWRF9PUF9GTFVTSDoKKwkJb3BfbGVuID0gMDsKKwkJbWFwX3Blcm0gPSAwOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX1dDRToKKwkJb3BfbGVuID0gc2l6ZW9mKHUzMik7CisJCW1hcF9wZXJtID0gTERDX01BUF9XOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfU0VUX1dDRToKKwkJb3BfbGVuID0gc2l6ZW9mKHUzMik7CisJCW1hcF9wZXJtID0gTERDX01BUF9SOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX1ZUT0M6CisJCW9wX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfdnRvYyk7CisJCW1hcF9wZXJtID0gTERDX01BUF9XOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfU0VUX1ZUT0M6CisJCW9wX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfdnRvYyk7CisJCW1hcF9wZXJtID0gTERDX01BUF9SOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX0RJU0tHRU9NOgorCQlvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX2dlb20pOworCQltYXBfcGVybSA9IExEQ19NQVBfVzsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX1NFVF9ESVNLR0VPTToKKwkJb3BfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aW9fZGlza19nZW9tKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1I7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9TQ1NJQ01EOgorCQlvcF9sZW4gPSAxNjsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1JXOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX0RFVklEOgorCQlvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX2RldmlkKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1c7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9HRVRfRUZJOgorCWNhc2UgVkRfT1BfU0VUX0VGSToKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9OworCisJbWFwX3Blcm0gfD0gTERDX01BUF9TSEFET1cgfCBMRENfTUFQX0RJUkVDVCB8IExEQ19NQVBfSU87CisKKwlvcF9sZW4gPSAob3BfbGVuICsgNykgJiB+NzsKKwlyZXFfYnVmID0ga3phbGxvYyhvcF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghcmVxX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobGVuID4gb3BfbGVuKQorCQlsZW4gPSBvcF9sZW47CisKKwlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCW1lbWNweShyZXFfYnVmLCBidWYsIGxlbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKworCS8qIFhYWCBJZiB3ZSB3YW50IHRvIHVzZSB0aGlzIGNvZGUgZ2VuZXJpY2FsbHkgd2UgaGF2ZSB0bworCSAqIFhYWCBoYW5kbGUgVFggcmluZyBleGhhdXN0aW9uIGV0Yy4KKwkgKi8KKwlkZXNjID0gdmlvX2RyaW5nX2N1cihkcik7CisKKwllcnIgPSBsZGNfbWFwX3NpbmdsZShwb3J0LT52aW8ubHAsIHJlcV9idWYsIG9wX2xlbiwKKwkJCSAgICAgZGVzYy0+Y29va2llcywgcG9ydC0+cmluZ19jb29raWVzLAorCQkJICAgICBtYXBfcGVybSk7CisJaWYgKGVyciA8IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKwkJa2ZyZWUocmVxX2J1Zik7CisJCXJldHVybiBlcnI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZjb21wLmNvbSk7CisJY29tcC53YWl0aW5nX2ZvciA9IFdBSVRJTkdfRk9SX0dFTl9DTUQ7CisJcG9ydC0+dmlvLmNtcCA9ICZjb21wOworCisJZGVzYy0+aGRyLmFjayA9IFZJT19BQ0tfRU5BQkxFOworCWRlc2MtPnJlcV9pZCA9IHBvcnQtPnJlcV9pZDsKKwlkZXNjLT5vcGVyYXRpb24gPSBvcDsKKwlkZXNjLT5zbGljZSA9IDA7CisJZGVzYy0+c3RhdHVzID0gfjA7CisJZGVzYy0+b2Zmc2V0ID0gMDsKKwlkZXNjLT5zaXplID0gb3BfbGVuOworCWRlc2MtPm5jb29raWVzID0gZXJyOworCisJLyogVGhpcyBoYXMgdG8gYmUgYSBub24tU01QIHdyaXRlIGJhcnJpZXIgYmVjYXVzZSB3ZSBhcmUgd3JpdGluZworCSAqIHRvIG1lbW9yeSB3aGljaCBpcyBzaGFyZWQgd2l0aCB0aGUgcGVlciBMRE9NLgorCSAqLworCXdtYigpOworCWRlc2MtPmhkci5zdGF0ZSA9IFZJT19ERVNDX1JFQURZOworCisJZXJyID0gX192ZGNfdHhfdHJpZ2dlcihwb3J0KTsKKwlpZiAoZXJyID49IDApIHsKKwkJcG9ydC0+cmVxX2lkKys7CisJCWRyLT5wcm9kID0gKGRyLT5wcm9kICsgMSkgJiAoVkRDX1RYX1JJTkdfU0laRSAtIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXAuY29tKTsKKwkJZXJyID0gY29tcC5lcnI7CisJfSBlbHNlIHsKKwkJcG9ydC0+dmlvLmNtcCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9XKQorCQltZW1jcHkoYnVmLCByZXFfYnVmLCBsZW4pOworCisJa2ZyZWUocmVxX2J1Zik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2ZGNfYWxsb2NfdHhfcmluZyhzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXVuc2lnbmVkIGxvbmcgbGVuLCBlbnRyeV9zaXplOworCWludCBuY29va2llczsKKwl2b2lkICpkcmluZzsKKworCWVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX2Rlc2MpICsKKwkJKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKiBwb3J0LT5yaW5nX2Nvb2tpZXMpOworCWxlbiA9IChWRENfVFhfUklOR19TSVpFICogZW50cnlfc2l6ZSk7CisKKwluY29va2llcyA9IFZJT19NQVhfUklOR19DT09LSUVTOworCWRyaW5nID0gbGRjX2FsbG9jX2V4cF9kcmluZyhwb3J0LT52aW8ubHAsIGxlbiwKKwkJCQkgICAgZHItPmNvb2tpZXMsICZuY29va2llcywKKwkJCQkgICAgKExEQ19NQVBfU0hBRE9XIHwKKwkJCQkgICAgIExEQ19NQVBfRElSRUNUIHwKKwkJCQkgICAgIExEQ19NQVBfUlcpKTsKKwlpZiAoSVNfRVJSKGRyaW5nKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHJpbmcpOworCisJZHItPmJhc2UgPSBkcmluZzsKKwlkci0+ZW50cnlfc2l6ZSA9IGVudHJ5X3NpemU7CisJZHItPm51bV9lbnRyaWVzID0gVkRDX1RYX1JJTkdfU0laRTsKKwlkci0+cHJvZCA9IGRyLT5jb25zID0gMDsKKwlkci0+cGVuZGluZyA9IFZEQ19UWF9SSU5HX1NJWkU7CisJZHItPm5jb29raWVzID0gbmNvb2tpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmRjX2ZyZWVfdHhfcmluZyhzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCisJaWYgKGRyLT5iYXNlKSB7CisJCWxkY19mcmVlX2V4cF9kcmluZyhwb3J0LT52aW8ubHAsIGRyLT5iYXNlLAorCQkJCSAgIChkci0+ZW50cnlfc2l6ZSAqIGRyLT5udW1fZW50cmllcyksCisJCQkJICAgZHItPmNvb2tpZXMsIGRyLT5uY29va2llcyk7CisJCWRyLT5iYXNlID0gTlVMTDsKKwkJZHItPmVudHJ5X3NpemUgPSAwOworCQlkci0+bnVtX2VudHJpZXMgPSAwOworCQlkci0+cGVuZGluZyA9IDA7CisJCWRyLT5uY29va2llcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHByb2JlX2Rpc2soc3RydWN0IHZkY19wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fY29tcGxldGlvbiBjb21wOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOworCXN0cnVjdCBnZW5kaXNrICpnOworCWludCBlcnI7CisKKwlpbml0X2NvbXBsZXRpb24oJmNvbXAuY29tKTsKKwljb21wLmVyciA9IDA7CisJY29tcC53YWl0aW5nX2ZvciA9IFdBSVRJTkdfRk9SX0xJTktfVVA7CisJcG9ydC0+dmlvLmNtcCA9ICZjb21wOworCisJdmlvX3BvcnRfdXAoJnBvcnQtPnZpbyk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wLmNvbSk7CisJaWYgKGNvbXAuZXJyKQorCQlyZXR1cm4gY29tcC5lcnI7CisKKwllcnIgPSBnZW5lcmljX3JlcXVlc3QocG9ydCwgVkRfT1BfR0VUX1ZUT0MsCisJCQkgICAgICAmcG9ydC0+bGFiZWwsIHNpemVvZihwb3J0LT5sYWJlbCkpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlZEX09QX0dFVF9WVE9DIHJldHVybnMgZXJyb3IgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gZ2VuZXJpY19yZXF1ZXN0KHBvcnQsIFZEX09QX0dFVF9ESVNLR0VPTSwKKwkJCSAgICAgICZwb3J0LT5nZW9tLCBzaXplb2YocG9ydC0+Z2VvbSkpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlZEX09QX0dFVF9ESVNLR0VPTSByZXR1cm5zICIKKwkJICAgICAgICJlcnJvciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwb3J0LT52ZGlza19zaXplID0gKCh1NjQpcG9ydC0+Z2VvbS5udW1fY3lsICoKKwkJCSAgICAodTY0KXBvcnQtPmdlb20ubnVtX2hkICoKKwkJCSAgICAodTY0KXBvcnQtPmdlb20ubnVtX3NlYyk7CisKKwlxID0gYmxrX2luaXRfcXVldWUoZG9fdmRjX3JlcXVlc3QsICZwb3J0LT52aW8ubG9jayk7CisJaWYgKCFxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcXVldWUuXG4iLAorCQkgICAgICAgcG9ydC0+dmlvLm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZyA9IGFsbG9jX2Rpc2soMSA8PCBQQVJUSVRJT05fU0hJRlQpOworCWlmICghZykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQ291bGQgbm90IGFsbG9jYXRlIGdlbmRpc2suXG4iLAorCQkgICAgICAgcG9ydC0+dmlvLm5hbWUpOworCQlibGtfY2xlYW51cF9xdWV1ZShxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG9ydC0+ZGlzayA9IGc7CisKKwlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEsIHBvcnQtPnJpbmdfY29va2llcyk7CisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIHBvcnQtPnJpbmdfY29va2llcyk7CisJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHEsIHBvcnQtPm1heF94ZmVyX3NpemUpOworCWctPm1ham9yID0gdmRjX21ham9yOworCWctPmZpcnN0X21pbm9yID0gcG9ydC0+ZGV2X25vIDw8IFBBUlRJVElPTl9TSElGVDsKKwlzdHJjcHkoZy0+ZGlza19uYW1lLCBwb3J0LT5kaXNrX25hbWUpOworCisJZy0+Zm9wcyA9ICZ2ZGNfZm9wczsKKwlnLT5xdWV1ZSA9IHE7CisJZy0+cHJpdmF0ZV9kYXRhID0gcG9ydDsKKwlnLT5kcml2ZXJmc19kZXYgPSAmcG9ydC0+dmlvLnZkZXYtPmRldjsKKworCXNldF9jYXBhY2l0eShnLCBwb3J0LT52ZGlza19zaXplKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogJXUgc2VjdG9ycyAoJXUgTUIpXG4iLAorCSAgICAgICBnLT5kaXNrX25hbWUsCisJICAgICAgIHBvcnQtPnZkaXNrX3NpemUsIChwb3J0LT52ZGlza19zaXplID4+ICgyMCAtIDkpKSk7CisKKwlhZGRfZGlzayhnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyB2ZGNfbGRjX2NmZyA9IHsKKwkuZXZlbnQJCT0gdmRjX2V2ZW50LAorCS5tdHUJCT0gNjQsCisJLm1vZGUJCT0gTERDX01PREVfVU5SRUxJQUJMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMgdmRjX3Zpb19vcHMgPSB7CisJLnNlbmRfYXR0cgkJPSB2ZGNfc2VuZF9hdHRyLAorCS5oYW5kbGVfYXR0cgkJPSB2ZGNfaGFuZGxlX2F0dHIsCisJLmhhbmRzaGFrZV9jb21wbGV0ZQk9IHZkY19oYW5kc2hha2VfY29tcGxldGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2ZGNfcG9ydF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGMgKnZwOworCWNvbnN0IHU2NCAqcG9ydF9pZDsKKwlpbnQgZXJyOworCisJdnAgPSBkZXZfZ2V0X2RydmRhdGEodmRldi0+ZGV2LnBhcmVudCk7CisJaWYgKCF2cCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCBwb3J0IHBhcmVudCB2ZGMuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaHAgPSBtZGVzY19ncmFiKCk7CisKKwlwb3J0X2lkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgImlkIiwgTlVMTCk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXBvcnRfaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUG9ydCBsYWNrcyBpZCBwcm9wZXJ0eS5cbiIpOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9tZGVzYzsKKwl9CisJaWYgKCgqcG9ydF9pZCA8PCBQQVJUSVRJT05fU0hJRlQpICYgfih1NjQpTUlOT1JNQVNLKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlBvcnQgaWQgWyVsdV0gdG9vIGxhcmdlLlxuIiwgKnBvcnRfaWQpOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9tZGVzYzsKKwl9CisKKwlwb3J0ID0ga3phbGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfS0VSTkVMKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghcG9ydCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgdmRjX3BvcnQuXG4iKTsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2VfbWRlc2M7CisJfQorCisJcG9ydC0+dnAgPSB2cDsKKwlwb3J0LT5kZXZfbm8gPSAqcG9ydF9pZDsKKworCWlmIChwb3J0LT5kZXZfbm8gPj0gMjYpCisJCXNucHJpbnRmKHBvcnQtPmRpc2tfbmFtZSwgc2l6ZW9mKHBvcnQtPmRpc2tfbmFtZSksCisJCQkgVkRDQkxLX05BTUUgIiVjJWMiLAorCQkJICdhJyArIChwb3J0LT5kZXZfbm8gLyAyNikgLSAxLAorCQkJICdhJyArIChwb3J0LT5kZXZfbm8gJSAyNikpOworCWVsc2UKKwkJc25wcmludGYocG9ydC0+ZGlza19uYW1lLCBzaXplb2YocG9ydC0+ZGlza19uYW1lKSwKKwkJCSBWRENCTEtfTkFNRSAiJWMiLCAnYScgKyAocG9ydC0+ZGV2X25vICUgMjYpKTsKKworCWVyciA9IHZpb19kcml2ZXJfaW5pdCgmcG9ydC0+dmlvLCB2ZGV2LCBWREVWX0RJU0ssCisJCQkgICAgICB2ZGNfdmVyc2lvbnMsIEFSUkFZX1NJWkUodmRjX3ZlcnNpb25zKSwKKwkJCSAgICAgICZ2ZGNfdmlvX29wcywgcG9ydC0+ZGlza19uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSA9IDUxMjsKKwlwb3J0LT5tYXhfeGZlcl9zaXplID0gKCgxMjggKiAxMDI0KSAvIHBvcnQtPnZkaXNrX2Jsb2NrX3NpemUpOworCXBvcnQtPnJpbmdfY29va2llcyA9ICgocG9ydC0+bWF4X3hmZXJfc2l6ZSAqCisJCQkgICAgICAgcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSkgLyBQQUdFX1NJWkUpICsgMjsKKworCWVyciA9IHZpb19sZGNfYWxsb2MoJnBvcnQtPnZpbywgJnZkY19sZGNfY2ZnLCBwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJZXJyID0gdmRjX2FsbG9jX3R4X3JpbmcocG9ydCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfbGRjOworCisJZXJyID0gcHJvYmVfZGlzayhwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV90eF9yaW5nOworCisJSU5JVF9MSVNUX0hFQUQoJnBvcnQtPmxpc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJnBvcnQtPmxpc3QsICZ2cC0+cG9ydF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIHBvcnQpOworCisJbWRlc2NfcmVsZWFzZShocCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX3R4X3Jpbmc6CisJdmRjX2ZyZWVfdHhfcmluZyhwb3J0KTsKKworZXJyX291dF9mcmVlX2xkYzoKKwl2aW9fbGRjX2ZyZWUoJnBvcnQtPnZpbyk7CisKK2Vycl9vdXRfZnJlZV9wb3J0OgorCWtmcmVlKHBvcnQpOworCitlcnJfb3V0X3JlbGVhc2VfbWRlc2M6CisJbWRlc2NfcmVsZWFzZShocCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZGNfcG9ydF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCisJaWYgKHBvcnQpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnZpby50aW1lcik7CisKKwkJdmRjX2ZyZWVfdHhfcmluZyhwb3J0KTsKKwkJdmlvX2xkY19mcmVlKCZwb3J0LT52aW8pOworCisJCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBOVUxMKTsKKworCQlrZnJlZShwb3J0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2ZGNfcG9ydF9tYXRjaFtdID0geworCXsKKwkJLnR5cGUgPSAidmRjLXBvcnQiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZkY19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2ZGNfcG9ydF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdmRjX3BvcnRfbWF0Y2gsCisJLnByb2JlCQk9IHZkY19wb3J0X3Byb2JlLAorCS5yZW1vdmUJCT0gdmRjX3BvcnRfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2ZGNfcG9ydCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZkY19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RhdGljIGludCB2ZGNfdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCB2ZGMgKnZwOworCisJaWYgKHZkY192ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJdnAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2cCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmdnAtPmxvY2spOworCXZwLT5kZXYgPSB2ZGV2OworCUlOSVRfTElTVF9IRUFEKCZ2cC0+cG9ydF9saXN0KTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCB2cCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZGNfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCisJc3RydWN0IHZkYyAqdnAgPSBkZXZfZ2V0X2RydmRhdGEoJnZkZXYtPmRldik7CisKKwlpZiAodnApIHsKKwkJa2ZyZWUodnApOworCQlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgTlVMTCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmRjX21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJibG9jayIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgdmRjX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZkY19kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdmRjX21hdGNoLAorCS5wcm9iZQkJPSB2ZGNfcHJvYmUsCisJLnJlbW92ZQkJPSB2ZGNfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2ZGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCB2ZGNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdpc3Rlcl9ibGtkZXYoMCwgVkRDQkxLX05BTUUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwl2ZGNfbWFqb3IgPSBlcnI7CisJZXJyID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmdmRjX2RyaXZlcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9ibGtkZXY7CisKKwllcnIgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2ZGNfcG9ydF9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfdmRjOworCisJcmV0dXJuIDA7CisKK291dF91bnJlZ2lzdGVyX3ZkYzoKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZkY19kcml2ZXIpOworCitvdXRfdW5yZWdpc3Rlcl9ibGtkZXY6CisJdW5yZWdpc3Rlcl9ibGtkZXYodmRjX21ham9yLCBWRENCTEtfTkFNRSk7CisJdmRjX21ham9yID0gMDsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmRjX2V4aXQodm9pZCkKK3sKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZkY19wb3J0X2RyaXZlcik7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2ZGNfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX2Jsa2Rldih2ZGNfbWFqb3IsIFZEQ0JMS19OQU1FKTsKK30KKworbW9kdWxlX2luaXQodmRjX2luaXQpOworbW9kdWxlX2V4aXQodmRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91Yi5jIGIvZHJpdmVycy9ibG9jay91Yi5jCmluZGV4IDE4YzhiNmMuLjhiMTNkN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdWIuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ViLmMKQEAgLTE3MDksNyArMTcwOSw3IEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOwogCXZvaWQgX191c2VyICp1c2VybWVtID0gKHZvaWQgX191c2VyICopIGFyZzsKIAotCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxwLCBkaXNrLCBjbWQsIHVzZXJtZW0pOworCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxwLCBkaXNrLT5xdWV1ZSwgZGlzaywgY21kLCB1c2VybWVtKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdW1lbS5jIGIvZHJpdmVycy9ibG9jay91bWVtLmMKaW5kZXggNmY1ZDYyMC4uZGVjNzRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay91bWVtLmMKKysrIGIvZHJpdmVycy9ibG9jay91bWVtLmMKQEAgLTEwNSwxMiArMTA1LDYgQEAKIAl1bnNpZ25lZCBsb25nCWNzcl9iYXNlOwogCXVuc2lnbmVkIGNoYXIJX19pb21lbSAqY3NyX3JlbWFwOwogCXVuc2lnbmVkIGxvbmcJY3NyX2xlbjsKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCXVuc2lnbmVkIGxvbmcJbWVtX2Jhc2U7Ci0JdW5zaWduZWQgY2hhcglfX2lvbWVtICptZW1fcmVtYXA7Ci0JdW5zaWduZWQgbG9uZwltZW1fbGVuOwotI2VuZGlmCi0KIAl1bnNpZ25lZCBpbnQJd2luX3NpemU7IC8qIFBDSSB3aW5kb3cgc2l6ZSAqLwogCXVuc2lnbmVkIGludAltbV9zaXplOyAgLyogc2l6ZSBpbiBrYnl0ZXMgKi8KIApAQCAtODcyLDEwICs4NjYsNiBAQAogCiAJY2FyZC0+Y3NyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKIAljYXJkLT5jc3JfbGVuICA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKTsKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCWNhcmQtPm1lbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7Ci0JY2FyZC0+bWVtX2xlbiAgPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSk7Ci0jZW5kaWYKIAogCXByaW50ayhLRVJOX0lORk8gIk1pY3JvIE1lbW9yeSh0bSkgY29udHJvbGxlciAjJWQgZm91bmQgYXQgJTAyeDolMDJ4IChQQ0kgTWVtIE1vZHVsZSAoQmF0dGVyeSBCYWNrdXApKVxuIiwKIAkgICAgICAgY2FyZC0+Y2FyZF9udW1iZXIsIGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4pOwpAQCAtOTAzLDI3ICs4OTMsNiBAQAogCXByaW50ayhLRVJOX0lORk8gIk1NJWQ6IENTUiAweCUwOGx4IC0+IDB4JXAgKDB4JWx4KVxuIiwgY2FyZC0+Y2FyZF9udW1iZXIsCiAJICAgICAgIGNhcmQtPmNzcl9iYXNlLCBjYXJkLT5jc3JfcmVtYXAsIGNhcmQtPmNzcl9sZW4pOwogCi0jaWZkZWYgQ09ORklHX01NX01BUF9NRU1PUlkKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5tZW1fYmFzZSwgY2FyZC0+bWVtX2xlbiwgIk1pY3JvIE1lbW9yeSIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTU0lZDogVW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvblxuIiwgY2FyZC0+Y2FyZF9udW1iZXIpOwotCQlyZXQgPSAtRU5PTUVNOwotCi0JCWdvdG8gZmFpbGVkX3JlcV9tZW07Ci0JfQotCi0JaWYgKCEoY2FyZC0+bWVtX3JlbWFwID0gaW9yZW1hcChjYXJkLT5tZW1fYmFzZSwgY2FyZHMtPm1lbV9sZW4pKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1NJWQ6IFVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uXG4iLCBjYXJkLT5jYXJkX251bWJlcik7Ci0JCXJldCA9IC1FTk9NRU07Ci0KLQkJZ290byBmYWlsZWRfcmVtYXBfbWVtOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gIk1NJWQ6IE1FTSAweCU4bHggLT4gMHglOGx4ICgweCVseClcbiIsIGNhcmQtPmNhcmRfbnVtYmVyLAotCSAgICAgICBjYXJkLT5tZW1fYmFzZSwgY2FyZC0+bWVtX3JlbWFwLCBjYXJkLT5tZW1fbGVuKTsKLSNlbHNlCi0JcHJpbnRrKEtFUk5fSU5GTyAiTU0lZDogTUVNIGFyZWEgbm90IHJlbWFwcGVkIChDT05GSUdfTU1fTUFQX01FTU9SWSBub3Qgc2V0KVxuIiwKLQkgICAgICAgY2FyZC0+Y2FyZF9udW1iZXIpOwotI2VuZGlmCiAJc3dpdGNoKGNhcmQtPmRldi0+ZGV2aWNlKSB7CiAJY2FzZSAweDU0MTU6CiAJCWNhcmQtPmZsYWdzIHw9IFVNX0ZMQUdfTk9fQllURV9TVEFUVVMgfCBVTV9GTEFHX05PX0JBVFRSRUc7CkBAIC0xMDkxLDEyICsxMDYwLDYgQEAKIAkJCQkgICAgY2FyZC0+bW1fcGFnZXNbMV0uZGVzYywKIAkJCQkgICAgY2FyZC0+bW1fcGFnZXNbMV0ucGFnZV9kbWEpOwogIGZhaWxlZF9tYWdpYzoKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCWlvdW5tYXAoY2FyZC0+bWVtX3JlbWFwKTsKLSBmYWlsZWRfcmVtYXBfbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5tZW1fYmFzZSwgY2FyZC0+bWVtX2xlbik7Ci0gZmFpbGVkX3JlcV9tZW06Ci0jZW5kaWYKIAlpb3VubWFwKGNhcmQtPmNzcl9yZW1hcCk7CiAgZmFpbGVkX3JlbWFwX2NzcjoKIAlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+Y3NyX2Jhc2UsIGNhcmQtPmNzcl9sZW4pOwpAQCAtMTExNiwxMCArMTA3OSw2IEBACiAJdGFza2xldF9raWxsKCZjYXJkLT50YXNrbGV0KTsKIAlpb3VubWFwKGNhcmQtPmNzcl9yZW1hcCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmNzcl9iYXNlLCBjYXJkLT5jc3JfbGVuKTsKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCWlvdW5tYXAoY2FyZC0+bWVtX3JlbWFwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+bWVtX2Jhc2UsIGNhcmQtPm1lbV9sZW4pOwotI2VuZGlmCiAJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKIAogCWlmIChjYXJkLT5tbV9wYWdlc1swXS5kZXNjKQpAQCAtMTEzMywyMyArMTA5MiwxOCBAQAogCWJsa19jbGVhbnVwX3F1ZXVlKGNhcmQtPnF1ZXVlKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1tX3BjaV9pZHNbXSA9IHsgewotCS52ZW5kb3IgPQlQQ0lfVkVORE9SX0lEX01JQ1JPX01FTU9SWSwKLQkuZGV2aWNlID0JUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNTQxNUNOLAotCX0sIHsKLQkudmVuZG9yID0JUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksCi0JLmRldmljZSA9CVBDSV9ERVZJQ0VfSURfTUlDUk9fTUVNT1JZXzU0MjVDTiwKLQl9LCB7Ci0JLnZlbmRvciA9CVBDSV9WRU5ET1JfSURfTUlDUk9fTUVNT1JZLAotCS5kZXZpY2UgPQlQQ0lfREVWSUNFX0lEX01JQ1JPX01FTU9SWV82MTU1LAotCX0sIHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtbV9wY2lfaWRzW10gPSB7CisgICAge1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNTQxNUNOKX0sCisgICAge1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNTQyNUNOKX0sCisgICAge1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNjE1NSl9LAorICAgIHsKIAkudmVuZG9yCT0JMHg4MDg2LAogCS5kZXZpY2UJPQkweEI1NTUsCiAJLnN1YnZlbmRvcj0JMHgxMzMyLAogCS5zdWJkZXZpY2U9CTB4NTQ2MCwKIAkuY2xhc3MJPQkweDA1MDAwMCwKIAkuY2xhc3NfbWFzaz0JMCwKLQl9LCB7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9CisgICAgfSwgeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1tX3BjaV9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwppbmRleCA2ODU5MmMzLi5kYWUzOTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYworKysgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwpAQCAtMjUyLDEwICsyNTIsMTAgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CiAJc3RydWN0IHZpb2Rhc2RfZGV2aWNlICpkID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCi0JZ2VvLT5zZWN0b3JzID0gZC0+c2VjdG9ycyA/IGQtPnNlY3RvcnMgOiAwOworCWdlby0+c2VjdG9ycyA9IGQtPnNlY3RvcnMgPyBkLT5zZWN0b3JzIDogMzI7CiAJZ2VvLT5oZWFkcyA9IGQtPnRyYWNrcyA/IGQtPnRyYWNrcyAgOiA2NDsKIAlnZW8tPmN5bGluZGVycyA9IGQtPmN5bGluZGVycyA/IGQtPmN5bGluZGVycyA6Ci0JCWdldF9jYXBhY2l0eShkaXNrKSAvIChnZW8tPmN5bGluZGVycyAqIGdlby0+aGVhZHMpOworCQlnZXRfY2FwYWNpdHkoZGlzaykgLyAoZ2VvLT5zZWN0b3JzICogZ2VvLT5oZWFkcyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jIGIvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyZWM2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCkBAIC0wLDAgKzEsMTE2NCBAQAorLyoKKyAqIFhpbGlueCBTeXN0ZW1BQ0UgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA3IFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGUgU3lzdGVtQUNFIGNoaXAgaXMgZGVzaWduZWQgdG8gY29uZmlndXJlIEZQR0FzIGJ5IGxvYWRpbmcgYW4gRlBHQQorICogYml0c3RyZWFtIGZyb20gYSBmaWxlIG9uIGEgQ0YgY2FyZCBhbmQgc3F1aXJ0aW5nIGl0IGludG8gRlBHQXMgY29ubmVjdGVkCisgKiB0byB0aGUgU3lzdGVtQUNFIEpUQUcgY2hhaW4uICBJdCBhbHNvIGhhcyB0aGUgYWR2YW50YWdlIG9mIHByb3ZpZGluZyBhbgorICogTVBVIGludGVyZmFjZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworICogYW5kIHRvIHVzZSB0aGUgYXR0YWNoZWQgQ0YgY2FyZCBmb3IgZ2VuZXJhbCBwdXJwb3NlIHN0b3JhZ2UuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYSBibG9jayBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU3lzdGVtQUNFLgorICoKKyAqIEluaXRpYWxpemF0aW9uOgorICogICAgVGhlIGRyaXZlciByZWdpc3RlcnMgaXRzZWxmIGFzIGEgcGxhdGZvcm1fZGV2aWNlIGRyaXZlciBhdCBtb2R1bGUKKyAqICAgIGxvYWQgdGltZS4gIFRoZSBwbGF0Zm9ybSBidXMgd2lsbCB0YWtlIGNhcmUgb2YgY2FsbGluZyB0aGUKKyAqICAgIGFjZV9wcm9iZSgpIG1ldGhvZCBmb3IgYWxsIFN5c3RlbUFDRSBpbnN0YW5jZXMgaW4gdGhlIHN5c3RlbS4gIEFueQorICogICAgbnVtYmVyIG9mIFN5c3RlbUFDRSBpbnN0YW5jZXMgYXJlIHN1cHBvcnRlZC4gIGFjZV9wcm9iZSgpIGNhbGxzCisgKiAgICBhY2Vfc2V0dXAoKSB3aGljaCBpbml0aWFsaXplZCBhbGwgZGF0YSBzdHJ1Y3R1cmVzLCByZWFkcyB0aGUgQ0YKKyAqICAgIGlkIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXJzIHRoZSBkZXZpY2UuCisgKgorICogUHJvY2Vzc2luZzoKKyAqICAgIEp1c3QgYWJvdXQgYWxsIG9mIHRoZSBoZWF2eSBsaWZ0aW5nIGluIHRoaXMgZHJpdmVyIGlzIHBlcmZvcm1lZCBieQorICogICAgYSBGaW5pdGUgU3RhdGUgTWFjaGluZSAoRlNNKS4gIFRoZSBkcml2ZXIgbmVlZHMgdG8gd2FpdCBvbiBhIG51bWJlcgorICogICAgb2YgZXZlbnRzOyBzb21lIHJhaXNlZCBieSBpbnRlcnJ1cHRzLCBzb21lIHdoaWNoIG5lZWQgdG8gYmUgcG9sbGVkCisgKiAgICBmb3IuICBEZXNjcmliaW5nIGFsbCBvZiB0aGUgYmVoYXZpb3VyIGluIGEgRlNNIHNlZW1zIHRvIGJlIHRoZQorICogICAgZWFzaWVzdCB3YXkgdG8ga2VlcCB0aGUgY29tcGxleGl0eSBsb3cgYW5kIG1ha2UgaXQgZWFzeSB0bworICogICAgdW5kZXJzdGFuZCB3aGF0IHRoZSBkcml2ZXIgaXMgZG9pbmcuICBJZiB0aGUgYmxvY2sgb3BzIG9yIHRoZQorICogICAgcmVxdWVzdCBmdW5jdGlvbiBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIGhhcmR3YXJlLCB0aGVuIHRoZXkKKyAqICAgIHNpbXBseSBuZWVkIHRvIGZsYWcgdGhlIHJlcXVlc3QgYW5kIGtpY2sgb2YgRlNNIHByb2Nlc3NpbmcuCisgKgorICogICAgVGhlIEZTTSBpdHNlbGYgaXMgYXRvbWljLXNhZmUgY29kZSB3aGljaCBjYW4gYmUgcnVuIGZyb20gYW55CisgKiAgICBjb250ZXh0LiAgVGhlIGdlbmVyYWwgcHJvY2VzcyBmbG93IGlzOgorICogICAgMS4gb2J0YWluIHRoZSBhY2UtPmxvY2sgc3BpbmxvY2suCisgKiAgICAyLiBsb29wIG9uIGFjZV9mc21fZG9zdGF0ZSgpIHVudGlsIHRoZSBhY2UtPmZzbV9jb250aW51ZSBmbGFnIGlzCisgKiAgICAgICBjbGVhcmVkLgorICogICAgMy4gcmVsZWFzZSB0aGUgbG9jay4KKyAqCisgKiAgICBJbmRpdmlkdWFsIHN0YXRlcyBkbyBub3Qgc2xlZXAgaW4gYW55IHdheS4gIElmIGEgY29uZGl0aW9uIG5lZWRzIHRvCisgKiAgICBiZSB3YWl0ZWQgZm9yIHRoZW4gdGhlIHN0YXRlIG11Y2ggY2xlYXIgdGhlIGZzbV9jb250aW51ZSBmbGFnIGFuZAorICogICAgZWl0aGVyIHNjaGVkdWxlIHRoZSBGU00gdG8gYmUgcnVuIGFnYWluIGF0IGEgbGF0ZXIgdGltZSwgb3IgZXhwZWN0CisgKiAgICBhbiBpbnRlcnJ1cHQgdG8gY2FsbCB0aGUgRlNNIHdoZW4gdGhlIGRlc2lyZWQgY29uZGl0aW9uIGlzIG1ldC4KKyAqCisgKiAgICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGUgRlNNIGlzIHByb2Nlc3NlZCBhdCBpbnRlcnJ1cHQgY29udGV4dAorICogICAgZWl0aGVyIHdoZW4gdGhlIGRyaXZlcidzIHRhc2tsZXQgaXMgc2NoZWR1bGVkLCBvciB3aGVuIGFuIGlycSBpcworICogICAgcmFpc2VkIGJ5IHRoZSBoYXJkd2FyZS4gIFRoZSB0YXNrbGV0IGNhbiBiZSBzY2hlZHVsZWQgYXQgYW55IHRpbWUuCisgKiAgICBUaGUgcmVxdWVzdCBtZXRob2QgaW4gcGFydGljdWxhciBzY2hlZHVsZXMgdGhlIHRhc2tsZXQgd2hlbiBhIG5ldworICogICAgcmVxdWVzdCBoYXMgYmVlbiBpbmRpY2F0ZWQgYnkgdGhlIGJsb2NrIGxheWVyLiAgT25jZSBzdGFydGVkLCB0aGUKKyAqICAgIEZTTSBwcm9jZWVkcyBhcyBmYXIgYXMgaXQgY2FuIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgdW50aWwgaXQKKyAqICAgIG5lZWRzIG9uIGEgaGFyZHdhcmUgZXZlbnQuICBBdCB0aGlzIHBvaW50LCBpdCBtdXN0IHlpZWxkIGV4ZWN1dGlvbi4KKyAqCisgKiAgICBBIHN0YXRlIGhhcyB0d28gb3B0aW9ucyB3aGVuIHlpZWxkaW5nIGV4ZWN1dGlvbjoKKyAqICAgIDEuIGFjZV9mc21feWllbGQoKQorICogICAgICAgLSBDYWxsIGlmIG5lZWQgdG8gcG9sbCBmb3IgZXZlbnQuCisgKiAgICAgICAtIGNsZWFycyB0aGUgZnNtX2NvbnRpbnVlIGZsYWcgdG8gZXhpdCB0aGUgcHJvY2Vzc2luZyBsb29wCisgKiAgICAgICAtIHJlc2NoZWR1bGVzIHRoZSB0YXNrbGV0IHRvIHJ1biBhZ2FpbiBhcyBzb29uIGFzIHBvc3NpYmxlCisgKiAgICAyLiBhY2VfZnNtX3lpZWxkaXJxKCkKKyAqICAgICAgIC0gQ2FsbCBpZiBhbiBpcnEgaXMgZXhwZWN0ZWQgZnJvbSB0aGUgSFcKKyAqICAgICAgIC0gY2xlYXJzIHRoZSBmc21fY29udGludWUgZmxhZyB0byBleGl0IHRoZSBwcm9jZXNzaW5nIGxvb3AKKyAqICAgICAgIC0gZG9lcyBub3QgcmVzY2hlZHVsZSB0aGUgdGFza2xldCBzbyB0aGUgRlNNIHdpbGwgbm90IGJlIHByb2Nlc3NlZAorICogICAgICAgICBhZ2FpbiB1bnRpbCBhbiBpcnEgaXMgcmVjZWl2ZWQuCisgKiAgICBBZnRlciBjYWxsaW5nIGEgeWllbGQgZnVuY3Rpb24sIHRoZSBzdGF0ZSBtdXN0IHJldHVybiBjb250cm9sIGJhY2sKKyAqICAgIHRvIHRoZSBGU00gbWFpbiBsb29wLgorICoKKyAqICAgIEFkZGl0aW9uYWxseSwgdGhlIGRyaXZlciBtYWludGFpbnMgYSBrZXJuZWwgdGltZXIgd2hpY2ggY2FuIHByb2Nlc3MKKyAqICAgIHRoZSBGU00uICBJZiB0aGUgRlNNIGdldHMgc3RhbGxlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIG1pc3NlZAorICogICAgaW50ZXJydXB0LCB0aGVuIHRoZSBrZXJuZWwgdGltZXIgd2lsbCBleHBpcmUgYW5kIHRoZSBkcml2ZXIgY2FuCisgKiAgICBjb250aW51ZSB3aGVyZSBpdCBsZWZ0IG9mZi4KKyAqCisgKiBUbyBEbzoKKyAqICAgIC0gQWRkIEZQR0EgY29uZmlndXJhdGlvbiBjb250cm9sIGludGVyZmFjZS4KKyAqICAgIC0gUmVxdWVzdCBtYWpvciBudW1iZXIgZnJvbSBsYW5hbmEKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworTU9EVUxFX0FVVEhPUigiR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggU3lzdGVtQUNFIGRldmljZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogU3lzdGVtQUNFIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFDRV9CVVNNT0RFICgweDAwKQorCisjZGVmaW5lIEFDRV9TVEFUVVMgKDB4MDQpCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHTE9DSyAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBBQ0VfU1RBVFVTX01QVUxPQ0sgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkdFUlJPUiAgICAgKDB4MDAwMDAwMDQpCS8qIGNvbmZpZyBjb250cm9sbGVyIGVycm9yICovCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZDRVJST1IgICAgICgweDAwMDAwMDA4KQkvKiBDRiBjb250cm9sbGVyIGVycm9yICovCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZERVRFQ1QgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0RBVEFCVUZSRFkgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19EQVRBQlVGTU9ERSAgKDB4MDAwMDAwNDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHRE9ORSAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBBQ0VfU1RBVFVTX1JEWUZPUkNGQ01EICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkdNT0RFUElOICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHQUREUl9NQVNLICgweDAwMDBlMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGQlNZICAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRlJEWSAgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZEV0YgICAgICAgICgweDAwMDgwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGRFNDICAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkRSUSAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZDT1JSICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGRVJSICAgICAgICAoMHgwMDgwMDAwMCkKKworI2RlZmluZSBBQ0VfRVJST1IgKDB4MDgpCisjZGVmaW5lIEFDRV9DRkdMQkEgKDB4MGMpCisjZGVmaW5lIEFDRV9NUFVMQkEgKDB4MTApCisKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRCAoMHgxNCkKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRF9SRVNFVCAgICAgICgweDAxMDApCisjZGVmaW5lIEFDRV9TRUNDTlRDTURfSURFTlRJRlkgICAoMHgwMjAwKQorI2RlZmluZSBBQ0VfU0VDQ05UQ01EX1JFQURfREFUQSAgKDB4MDMwMCkKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRF9XUklURV9EQVRBICgweDA0MDApCisjZGVmaW5lIEFDRV9TRUNDTlRDTURfQUJPUlQgICAgICAoMHgwNjAwKQorCisjZGVmaW5lIEFDRV9WRVJTSU9OICgweDE2KQorI2RlZmluZSBBQ0VfVkVSU0lPTl9SRVZJU0lPTl9NQVNLICgweDAwRkYpCisjZGVmaW5lIEFDRV9WRVJTSU9OX01JTk9SX01BU0sgICAgKDB4MEYwMCkKKyNkZWZpbmUgQUNFX1ZFUlNJT05fTUFKT1JfTUFTSyAgICAoMHhGMDAwKQorCisjZGVmaW5lIEFDRV9DVFJMICgweDE4KQorI2RlZmluZSBBQ0VfQ1RSTF9GT1JDRUxPQ0tSRVEgICAoMHgwMDAxKQorI2RlZmluZSBBQ0VfQ1RSTF9MT0NLUkVRICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBBQ0VfQ1RSTF9GT1JDRUNGR0FERFIgICAoMHgwMDA0KQorI2RlZmluZSBBQ0VfQ1RSTF9GT1JDRUNGR01PREUgICAoMHgwMDA4KQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdNT0RFICAgICAgICAoMHgwMDEwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdTVEFSVCAgICAgICAoMHgwMDIwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdTRUwgICAgICAgICAoMHgwMDQwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdSRVNFVCAgICAgICAoMHgwMDgwKQorI2RlZmluZSBBQ0VfQ1RSTF9EQVRBQlVGUkRZSVJRICAoMHgwMTAwKQorI2RlZmluZSBBQ0VfQ1RSTF9FUlJPUklSUSAgICAgICAoMHgwMjAwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdET05FSVJRICAgICAoMHgwNDAwKQorI2RlZmluZSBBQ0VfQ1RSTF9SRVNFVElSUSAgICAgICAoMHgwODAwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdQUk9HICAgICAgICAoMHgxMDAwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdBRERSX01BU0sgICAoMHhlMDAwKQorCisjZGVmaW5lIEFDRV9GQVRTVEFUICgweDFjKQorCisjZGVmaW5lIEFDRV9OVU1fTUlOT1JTIDE2CisjZGVmaW5lIEFDRV9TRUNUT1JfU0laRSAoNTEyKQorI2RlZmluZSBBQ0VfRklGT19TSVpFICgzMikKKyNkZWZpbmUgQUNFX0JVRl9QRVJfU0VDVE9SIChBQ0VfU0VDVE9SX1NJWkUgLyBBQ0VfRklGT19TSVpFKQorCitzdHJ1Y3QgYWNlX3JlZ19vcHM7CisKK3N0cnVjdCBhY2VfZGV2aWNlIHsKKwkvKiBkcml2ZXIgc3RhdGUgZGF0YSAqLworCWludCBpZDsKKwlpbnQgbWVkaWFfY2hhbmdlOworCWludCB1c2VyczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBmaW5pdGUgc3RhdGUgbWFjaGluZSBkYXRhICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGZzbV90YXNrbGV0OworCXVpbnQgZnNtX3Rhc2s7CQkvKiBDdXJyZW50IGFjdGl2aXR5IChBQ0VfVEFTS18qKSAqLworCXVpbnQgZnNtX3N0YXRlOwkJLyogQ3VycmVudCBzdGF0ZSAoQUNFX0ZTTV9TVEFURV8qKSAqLworCXVpbnQgZnNtX2NvbnRpbnVlX2ZsYWc7CS8qIGNsZWFyZWQgdG8gZXhpdCBGU00gbWFpbmxvb3AgKi8KKwl1aW50IGZzbV9pdGVyX251bTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFsbF90aW1lcjsKKworCS8qIFRyYW5zZmVyIHN0YXRlL3Jlc3VsdCwgdXNlIGZvciBib3RoIGlkIGFuZCBibG9jayByZXF1ZXN0ICovCisJc3RydWN0IHJlcXVlc3QgKnJlcTsJLyogcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQgKi8KKwl2b2lkICpkYXRhX3B0cjsJCS8qIHBvaW50ZXIgdG8gSS9PIGJ1ZmZlciAqLworCWludCBkYXRhX2NvdW50OwkJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgcmVtYWluaW5nICovCisJaW50IGRhdGFfcmVzdWx0OwkvKiBSZXN1bHQgb2YgdHJhbnNmZXI7IDAgOj0gc3VjY2VzcyAqLworCisJaW50IGlkX3JlcV9jb3VudDsJLyogY291bnQgb2YgaWQgcmVxdWVzdHMgKi8KKwlpbnQgaWRfcmVzdWx0OworCXN0cnVjdCBjb21wbGV0aW9uIGlkX2NvbXBsZXRpb247CS8qIHVzZWQgd2hlbiBpZCByZXEgZmluaXNoZXMgKi8KKwlpbnQgaW5faXJxOworCisJLyogRGV0YWlscyBvZiBoYXJkd2FyZSBkZXZpY2UgKi8KKwl1bnNpZ25lZCBsb25nIHBoeXNhZGRyOworCXZvaWQgKmJhc2VhZGRyOworCWludCBpcnE7CisJaW50IGJ1c193aWR0aDsJCS8qIDAgOj0gOCBiaXQ7IDEgOj0gMTYgYml0ICovCisJc3RydWN0IGFjZV9yZWdfb3BzICpyZWdfb3BzOworCWludCBsb2NrX2NvdW50OworCisJLyogQmxvY2sgZGV2aWNlIGRhdGEgc3RydWN0dXJlcyAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBnZW5kaXNrICpnZDsKKworCS8qIEluc2VydGVkIENGIGNhcmQgcGFyYW1ldGVycyAqLworCXN0cnVjdCBoZF9kcml2ZWlkIGNmX2lkOworfTsKKworc3RhdGljIGludCBhY2VfbWFqb3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG93IGxldmVsIHJlZ2lzdGVyIGFjY2VzcworICovCisKK3N0cnVjdCBhY2VfcmVnX29wcyB7CisJdTE2KCppbikgKHN0cnVjdCBhY2VfZGV2aWNlICogYWNlLCBpbnQgcmVnKTsKKwl2b2lkICgqb3V0KSAoc3RydWN0IGFjZV9kZXZpY2UgKiBhY2UsIGludCByZWcsIHUxNiB2YWwpOworCXZvaWQgKCpkYXRhaW4pIChzdHJ1Y3QgYWNlX2RldmljZSAqIGFjZSk7CisJdm9pZCAoKmRhdGFvdXQpIChzdHJ1Y3QgYWNlX2RldmljZSAqIGFjZSk7Cit9OworCisvKiA4IEJpdCBidXMgd2lkdGggKi8KK3N0YXRpYyB1MTYgYWNlX2luXzgoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwl2b2lkICpyID0gYWNlLT5iYXNlYWRkciArIHJlZzsKKwlyZXR1cm4gaW5fOChyKSB8IChpbl84KHIgKyAxKSA8PCA4KTsKK30KKworc3RhdGljIHZvaWQgYWNlX291dF84KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUxNiB2YWwpCit7CisJdm9pZCAqciA9IGFjZS0+YmFzZWFkZHIgKyByZWc7CisJb3V0XzgociwgdmFsKTsKKwlvdXRfOChyICsgMSwgdmFsID4+IDgpOworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YWluXzgoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwl2b2lkICpyID0gYWNlLT5iYXNlYWRkciArIDB4NDA7CisJdTggKmRzdCA9IGFjZS0+ZGF0YV9wdHI7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFOworCXdoaWxlIChpLS0pCisJCSpkc3QrKyA9IGluXzgocisrKTsKKwlhY2UtPmRhdGFfcHRyID0gZHN0OworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YW91dF84KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJdm9pZCAqciA9IGFjZS0+YmFzZWFkZHIgKyAweDQwOworCXU4ICpzcmMgPSBhY2UtPmRhdGFfcHRyOworCWludCBpID0gQUNFX0ZJRk9fU0laRTsKKwl3aGlsZSAoaS0tKQorCQlvdXRfOChyKyssICpzcmMrKyk7CisJYWNlLT5kYXRhX3B0ciA9IHNyYzsKK30KKworc3RhdGljIHN0cnVjdCBhY2VfcmVnX29wcyBhY2VfcmVnXzhfb3BzID0geworCS5pbiA9IGFjZV9pbl84LAorCS5vdXQgPSBhY2Vfb3V0XzgsCisJLmRhdGFpbiA9IGFjZV9kYXRhaW5fOCwKKwkuZGF0YW91dCA9IGFjZV9kYXRhb3V0XzgsCit9OworCisvKiAxNiBiaXQgYmlnIGVuZGlhbiBidXMgYXR0YWNobWVudCAqLworc3RhdGljIHUxNiBhY2VfaW5fYmUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnKQoreworCXJldHVybiBpbl9iZTE2KGFjZS0+YmFzZWFkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBhY2Vfb3V0X2JlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlvdXRfYmUxNihhY2UtPmJhc2VhZGRyICsgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YWluX2JlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlpbnQgaSA9IEFDRV9GSUZPX1NJWkUgLyAyOworCXUxNiAqZHN0ID0gYWNlLT5kYXRhX3B0cjsKKwl3aGlsZSAoaS0tKQorCQkqZHN0KysgPSBpbl9sZTE2KGFjZS0+YmFzZWFkZHIgKyAweDQwKTsKKwlhY2UtPmRhdGFfcHRyID0gZHN0OworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YW91dF9iZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFIC8gMjsKKwl1MTYgKnNyYyA9IGFjZS0+ZGF0YV9wdHI7CisJd2hpbGUgKGktLSkKKwkJb3V0X2xlMTYoYWNlLT5iYXNlYWRkciArIDB4NDAsICpzcmMrKyk7CisJYWNlLT5kYXRhX3B0ciA9IHNyYzsKK30KKworLyogMTYgYml0IGxpdHRsZSBlbmRpYW4gYnVzIGF0dGFjaG1lbnQgKi8KK3N0YXRpYyB1MTYgYWNlX2luX2xlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gaW5fbGUxNihhY2UtPmJhc2VhZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgYWNlX291dF9sZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUxNiB2YWwpCit7CisJb3V0X2xlMTYoYWNlLT5iYXNlYWRkciArIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFpbl9sZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFIC8gMjsKKwl1MTYgKmRzdCA9IGFjZS0+ZGF0YV9wdHI7CisJd2hpbGUgKGktLSkKKwkJKmRzdCsrID0gaW5fYmUxNihhY2UtPmJhc2VhZGRyICsgMHg0MCk7CisJYWNlLT5kYXRhX3B0ciA9IGRzdDsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFvdXRfbGUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWludCBpID0gQUNFX0ZJRk9fU0laRSAvIDI7CisJdTE2ICpzcmMgPSBhY2UtPmRhdGFfcHRyOworCXdoaWxlIChpLS0pCisJCW91dF9iZTE2KGFjZS0+YmFzZWFkZHIgKyAweDQwLCAqc3JjKyspOworCWFjZS0+ZGF0YV9wdHIgPSBzcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNlX3JlZ19vcHMgYWNlX3JlZ19iZTE2X29wcyA9IHsKKwkuaW4gPSBhY2VfaW5fYmUxNiwKKwkub3V0ID0gYWNlX291dF9iZTE2LAorCS5kYXRhaW4gPSBhY2VfZGF0YWluX2JlMTYsCisJLmRhdGFvdXQgPSBhY2VfZGF0YW91dF9iZTE2LAorfTsKKworc3RhdGljIHN0cnVjdCBhY2VfcmVnX29wcyBhY2VfcmVnX2xlMTZfb3BzID0geworCS5pbiA9IGFjZV9pbl9sZTE2LAorCS5vdXQgPSBhY2Vfb3V0X2xlMTYsCisJLmRhdGFpbiA9IGFjZV9kYXRhaW5fbGUxNiwKKwkuZGF0YW91dCA9IGFjZV9kYXRhb3V0X2xlMTYsCit9OworCitzdGF0aWMgaW5saW5lIHUxNiBhY2VfaW4oc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gYWNlLT5yZWdfb3BzLT5pbihhY2UsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFjZV9pbjMyKHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcpCit7CisJcmV0dXJuIGFjZV9pbihhY2UsIHJlZykgfCAoYWNlX2luKGFjZSwgcmVnICsgMikgPDwgMTYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX291dChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCWFjZS0+cmVnX29wcy0+b3V0KGFjZSwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX291dDMyKHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUzMiB2YWwpCit7CisJYWNlX291dChhY2UsIHJlZywgdmFsKTsKKwlhY2Vfb3V0KGFjZSwgcmVnICsgMiwgdmFsID4+IDE2KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWJ1ZyBzdXBwb3J0IGZ1bmN0aW9ucworICovCisKKyNpZiBkZWZpbmVkKERFQlVHKQorc3RhdGljIHZvaWQgYWNlX2R1bXBfbWVtKHZvaWQgKmJhc2UsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqcHRyID0gYmFzZTsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJS44eDoiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWlmICghKGogJSA0KSkKKwkJCQlwcmludGsoIiAiKTsKKwkJCXByaW50aygiJS4yeCIsIHB0cltpICsgal0pOworCQl9CisJCXByaW50aygiICIpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKwkJCXByaW50aygiJWMiLCBpc3ByaW50KHB0cltpICsgal0pID8gcHRyW2kgKyBqXSA6ICcuJyk7CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGFjZV9kdW1wX21lbSh2b2lkICpiYXNlLCBpbnQgbGVuKQoreworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFjZV9kdW1wX3JlZ3Moc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlkZXZfaW5mbyhhY2UtPmRldiwgIiAgICBjdHJsOiAgJS44eCAgc2VjY250L2NtZDogJS40eCAgICAgIHZlcjolLjR4XG4iCisJCSAiICAgIHN0YXR1czolLjh4ICBtcHVfbGJhOiUuOHggIGJ1c21vZGU6JTR4XG4iCisJCSAiICAgIGVycm9yOiAlLjh4ICBjZmdfbGJhOiUuOHggIGZhdHN0YXQ6JS40eFxuIiwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX0NUUkwpLAorCQkgYWNlX2luKGFjZSwgQUNFX1NFQ0NOVENNRCksCisJCSBhY2VfaW4oYWNlLCBBQ0VfVkVSU0lPTiksCisJCSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpLAorCQkgYWNlX2luMzIoYWNlLCBBQ0VfTVBVTEJBKSwKKwkJIGFjZV9pbihhY2UsIEFDRV9CVVNNT0RFKSwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX0VSUk9SKSwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX0NGR0xCQSksIGFjZV9pbihhY2UsIEFDRV9GQVRTVEFUKSk7Cit9CisKK3ZvaWQgYWNlX2ZpeF9kcml2ZWlkKHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3sKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgKmJ1ZiA9ICh2b2lkICopaWQ7CisJaW50IGk7CisKKwkvKiBBbGwgaGFsZiB3b3JkcyBoYXZlIHdyb25nIGJ5dGUgb3JkZXI7IHN3YXAgdGhlIGJ5dGVzICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgaGRfZHJpdmVpZCk7IGkgKz0gMiwgYnVmKyspCisJCSpidWYgPSBsZTE2X3RvX2NwdSgqYnVmKTsKKworCS8qIFNvbWUgb2YgdGhlIGRhdGEgdmFsdWVzIGFyZSAzMmJpdDsgc3dhcCB0aGUgaGFsZiB3b3JkcyAgKi8KKwlpZC0+bGJhX2NhcGFjaXR5ID0gKChpZC0+bGJhX2NhcGFjaXR5ID4+IDE2KSAmIDB4MDAwMEZGRkYpIHwKKwkgICAgKChpZC0+bGJhX2NhcGFjaXR5IDw8IDE2KSAmIDB4RkZGRjAwMDApOworCWlkLT5zcGcgPSAoKGlkLT5zcGcgPj4gMTYpICYgMHgwMDAwRkZGRikgfAorCSAgICAoKGlkLT5zcGcgPDwgMTYpICYgMHhGRkZGMDAwMCk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGaW5pdGUgU3RhdGUgTWFjaGluZSAoRlNNKSBpbXBsZW1lbnRhdGlvbgorICovCisKKy8qIEZTTSB0YXNrczsgdXNlZCB0byBkaXJlY3Qgc3RhdGUgdHJhbnNpdGlvbnMgKi8KKyNkZWZpbmUgQUNFX1RBU0tfSURMRSAgICAgIDAKKyNkZWZpbmUgQUNFX1RBU0tfSURFTlRJRlkgIDEKKyNkZWZpbmUgQUNFX1RBU0tfUkVBRCAgICAgIDIKKyNkZWZpbmUgQUNFX1RBU0tfV1JJVEUgICAgIDMKKyNkZWZpbmUgQUNFX0ZTTV9OVU1fVEFTS1MgIDQKKworLyogRlNNIHN0YXRlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFDRV9GU01fU1RBVEVfSURMRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9SRVFfTE9DSyAgICAgICAgICAgMQorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1dBSVRfTE9DSyAgICAgICAgICAyCisjZGVmaW5lIEFDRV9GU01fU1RBVEVfV0FJVF9DRlJFQURZICAgICAgIDMKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9QUkVQQVJFICAgNAorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1RSQU5TRkVSICA1CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfSURFTlRJRllfQ09NUExFVEUgIDYKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9SRVFfUFJFUEFSRSAgICAgICAgNworI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1JFUV9UUkFOU0ZFUiAgICAgICA4CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfUkVRX0NPTVBMRVRFICAgICAgIDkKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9FUlJPUiAgICAgICAgICAgICAxMAorI2RlZmluZSBBQ0VfRlNNX05VTV9TVEFURVMgICAgICAgICAgICAgIDExCisKKy8qIFNldCBmbGFnIHRvIGV4aXQgRlNNIGxvb3AgYW5kIHJlc2NoZWR1bGUgdGFza2xldCAqLworc3RhdGljIGlubGluZSB2b2lkIGFjZV9mc21feWllbGQoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX2ZzbV95aWVsZCgpXG4iKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZhY2UtPmZzbV90YXNrbGV0KTsKKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMDsKK30KKworLyogU2V0IGZsYWcgdG8gZXhpdCBGU00gbG9vcCBhbmQgd2FpdCBmb3IgSVJRIHRvIHJlc2NoZWR1bGUgdGFza2xldCAqLworc3RhdGljIGlubGluZSB2b2lkIGFjZV9mc21feWllbGRpcnEoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX2ZzbV95aWVsZGlycSgpXG4iKTsKKworCWlmIChhY2UtPmlycSA9PSBOT19JUlEpCisJCS8qIE5vIElSUSBhc3NpZ25lZCwgc28gbmVlZCB0byBwb2xsICovCisJCXRhc2tsZXRfc2NoZWR1bGUoJmFjZS0+ZnNtX3Rhc2tsZXQpOworCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAwOworfQorCisvKiBHZXQgdGhlIG5leHQgcmVhZC93cml0ZSByZXF1ZXN0OyBlbmRpbmcgcmVxdWVzdHMgdGhhdCB3ZSBkb24ndCBoYW5kbGUgKi8KK3N0cnVjdCByZXF1ZXN0ICphY2VfZ2V0X25leHRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisKKwl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKKwkJaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkpCisJCQlicmVhazsKKwkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwl9CisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIHZvaWQgYWNlX2ZzbV9kb3N0YXRlKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwl1MzIgc3RhdHVzOworCXUxNiB2YWw7CisJaW50IGNvdW50OworCWludCBpOworCisjaWYgZGVmaW5lZChERUJVRykKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiZnNtX3N0YXRlPSVpLCBpZF9yZXFfY291bnQ9JWlcbiIsCisJCWFjZS0+ZnNtX3N0YXRlLCBhY2UtPmlkX3JlcV9jb3VudCk7CisjZW5kaWYKKworCXN3aXRjaCAoYWNlLT5mc21fc3RhdGUpIHsKKwljYXNlIEFDRV9GU01fU1RBVEVfSURMRToKKwkJLyogU2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGRvICovCisJCWlmIChhY2UtPmlkX3JlcV9jb3VudCB8fCBhY2VfZ2V0X25leHRfcmVxdWVzdChhY2UtPnF1ZXVlKSkgeworCQkJYWNlLT5mc21faXRlcl9udW0rKzsKKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9SRVFfTE9DSzsKKwkJCW1vZF90aW1lcigmYWNlLT5zdGFsbF90aW1lciwgamlmZmllcyArIEhaKTsKKwkJCWlmICghdGltZXJfcGVuZGluZygmYWNlLT5zdGFsbF90aW1lcikpCisJCQkJYWRkX3RpbWVyKCZhY2UtPnN0YWxsX3RpbWVyKTsKKwkJCWJyZWFrOworCQl9CisJCWRlbF90aW1lcigmYWNlLT5zdGFsbF90aW1lcik7CisJCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAwOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9SRVFfTE9DSzoKKwkJaWYgKGFjZV9pbihhY2UsIEFDRV9TVEFUVVMpICYgQUNFX1NUQVRVU19NUFVMT0NLKSB7CisJCQkvKiBBbHJlYWR5IGhhdmUgdGhlIGxvY2ssIGp1bXAgdG8gbmV4dCBzdGF0ZSAqLworCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1dBSVRfQ0ZSRUFEWTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVxdWVzdCB0aGUgbG9jayAqLworCQl2YWwgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisJCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgdmFsIHwgQUNFX0NUUkxfTE9DS1JFUSk7CisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9XQUlUX0xPQ0s7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1dBSVRfTE9DSzoKKwkJaWYgKGFjZV9pbihhY2UsIEFDRV9TVEFUVVMpICYgQUNFX1NUQVRVU19NUFVMT0NLKSB7CisJCQkvKiBnb3QgdGhlIGxvY2s7IG1vdmUgdG8gbmV4dCBzdGF0ZSAqLworCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1dBSVRfQ0ZSRUFEWTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogd2FpdCBhIGJpdCBmb3IgdGhlIGxvY2sgKi8KKwkJYWNlX2ZzbV95aWVsZChhY2UpOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9XQUlUX0NGUkVBRFk6CisJCXN0YXR1cyA9IGFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyk7CisJCWlmICghKHN0YXR1cyAmIEFDRV9TVEFUVVNfUkRZRk9SQ0ZDTUQpIHx8CisJCSAgICAoc3RhdHVzICYgQUNFX1NUQVRVU19DRkJTWSkpIHsKKwkJCS8qIENGIGNhcmQgaXNuJ3QgcmVhZHk7IGl0IG5lZWRzIHRvIGJlIHBvbGxlZCAqLworCQkJYWNlX2ZzbV95aWVsZChhY2UpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBEZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW1hbmQ7IGRldGVybWluZSB3aGF0IHRvIGRvIG5leHQgKi8KKwkJaWYgKGFjZS0+aWRfcmVxX2NvdW50KQorCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1BSRVBBUkU7CisJCWVsc2UKKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9SRVFfUFJFUEFSRTsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfSURFTlRJRllfUFJFUEFSRToKKwkJLyogU2VuZCBpZGVudGlmeSBjb21tYW5kICovCisJCWFjZS0+ZnNtX3Rhc2sgPSBBQ0VfVEFTS19JREVOVElGWTsKKwkJYWNlLT5kYXRhX3B0ciA9ICZhY2UtPmNmX2lkOworCQlhY2UtPmRhdGFfY291bnQgPSBBQ0VfQlVGX1BFUl9TRUNUT1I7CisJCWFjZV9vdXQoYWNlLCBBQ0VfU0VDQ05UQ01ELCBBQ0VfU0VDQ05UQ01EX0lERU5USUZZKTsKKworCQkvKiBBcyBwZXIgZGF0YXNoZWV0LCBwdXQgY29uZmlnIGNvbnRyb2xsZXIgaW4gcmVzZXQgKi8KKwkJdmFsID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCQlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIHZhbCB8IEFDRV9DVFJMX0NGR1JFU0VUKTsKKworCQkvKiBpcnEgaGFuZGxlciB0YWtlcyBvdmVyIGZyb20gdGhpcyBwb2ludDsgd2FpdCBmb3IgdGhlCisJCSAqIHRyYW5zZmVyIHRvIGNvbXBsZXRlICovCisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JREVOVElGWV9UUkFOU0ZFUjsKKwkJYWNlX2ZzbV95aWVsZGlycShhY2UpOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9UUkFOU0ZFUjoKKwkJLyogQ2hlY2sgdGhhdCB0aGUgc3lzYWNlIGlzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSAqLworCQlzdGF0dXMgPSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpOworCQlpZiAoc3RhdHVzICYgQUNFX1NUQVRVU19DRkJTWSkgeworCQkJZGV2X2RiZyhhY2UtPmRldiwgIkNGQlNZIHNldDsgdD0laSBpdGVyPSVpIGRjPSVpXG4iLAorCQkJCWFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX2l0ZXJfbnVtLAorCQkJCWFjZS0+ZGF0YV9jb3VudCk7CisJCQlhY2VfZnNtX3lpZWxkKGFjZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShzdGF0dXMgJiBBQ0VfU1RBVFVTX0RBVEFCVUZSRFkpKSB7CisJCQlhY2VfZnNtX3lpZWxkKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRyYW5zZmVyIHRoZSBuZXh0IGJ1ZmZlciAqLworCQlhY2UtPnJlZ19vcHMtPmRhdGFpbihhY2UpOworCQlhY2UtPmRhdGFfY291bnQtLTsKKworCQkvKiBJZiB0aGVyZSBhcmUgc3RpbGwgYnVmZmVycyB0byBiZSB0cmFuc2ZlcnM7IGp1bXAgb3V0IGhlcmUgKi8KKwkJaWYgKGFjZS0+ZGF0YV9jb3VudCAhPSAwKSB7CisJCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHRyYW5zZmVyIGZpbmlzaGVkOyBraWNrIHN0YXRlIG1hY2hpbmUgKi8KKwkJZGV2X2RiZyhhY2UtPmRldiwgImlkZW50aWZ5IGZpbmlzaGVkXG4iKTsKKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX0NPTVBMRVRFOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9DT01QTEVURToKKwkJYWNlX2ZpeF9kcml2ZWlkKCZhY2UtPmNmX2lkKTsKKwkJYWNlX2R1bXBfbWVtKCZhY2UtPmNmX2lkLCA1MTIpOwkvKiBEZWJ1ZzogRHVtcCBvdXQgZGlzayBJRCAqLworCisJCWlmIChhY2UtPmRhdGFfcmVzdWx0KSB7CisJCQkvKiBFcnJvciBvY2N1cmVkLCBkaXNhYmxlIHRoZSBkaXNrICovCisJCQlhY2UtPm1lZGlhX2NoYW5nZSA9IDE7CisJCQlzZXRfY2FwYWNpdHkoYWNlLT5nZCwgMCk7CisJCQlkZXZfZXJyKGFjZS0+ZGV2LCAiZXJyb3IgZmV0Y2hpbmcgQ0YgaWQgKCVpKVxuIiwKKwkJCQlhY2UtPmRhdGFfcmVzdWx0KTsKKwkJfSBlbHNlIHsKKwkJCWFjZS0+bWVkaWFfY2hhbmdlID0gMDsKKworCQkJLyogUmVjb3JkIGRpc2sgcGFyYW1ldGVycyAqLworCQkJc2V0X2NhcGFjaXR5KGFjZS0+Z2QsIGFjZS0+Y2ZfaWQubGJhX2NhcGFjaXR5KTsKKwkJCWRldl9pbmZvKGFjZS0+ZGV2LCAiY2FwYWNpdHk6ICVpIHNlY3RvcnNcbiIsCisJCQkJIGFjZS0+Y2ZfaWQubGJhX2NhcGFjaXR5KTsKKwkJfQorCisJCS8qIFdlJ3JlIGRvbmUsIGRyb3AgdG8gSURMRSBzdGF0ZSBhbmQgbm90aWZ5IHdhaXRlcnMgKi8KKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCWFjZS0+aWRfcmVzdWx0ID0gYWNlLT5kYXRhX3Jlc3VsdDsKKwkJd2hpbGUgKGFjZS0+aWRfcmVxX2NvdW50KSB7CisJCQljb21wbGV0ZSgmYWNlLT5pZF9jb21wbGV0aW9uKTsKKwkJCWFjZS0+aWRfcmVxX2NvdW50LS07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfUkVRX1BSRVBBUkU6CisJCXJlcSA9IGFjZV9nZXRfbmV4dF9yZXF1ZXN0KGFjZS0+cXVldWUpOworCQlpZiAoIXJlcSkgeworCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9rYXksIGl0J3MgYSBkYXRhIHJlcXVlc3QsIHNldCBpdCB1cCBmb3IgdHJhbnNmZXIgKi8KKwkJZGV2X2RiZyhhY2UtPmRldiwKKwkJCSJyZXF1ZXN0OiBzZWM9JWx4IGhjbnQ9JWx4LCBjY250PSV4LCBkaXI9JWlcbiIsCisJCQlyZXEtPnNlY3RvciwgcmVxLT5oYXJkX25yX3NlY3RvcnMsCisJCQlyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycywgcnFfZGF0YV9kaXIocmVxKSk7CisKKwkJYWNlLT5yZXEgPSByZXE7CisJCWFjZS0+ZGF0YV9wdHIgPSByZXEtPmJ1ZmZlcjsKKwkJYWNlLT5kYXRhX2NvdW50ID0gcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiBBQ0VfQlVGX1BFUl9TRUNUT1I7CisJCWFjZV9vdXQzMihhY2UsIEFDRV9NUFVMQkEsIHJlcS0+c2VjdG9yICYgMHgwRkZGRkZGRik7CisKKwkJY291bnQgPSByZXEtPmhhcmRfbnJfc2VjdG9yczsKKwkJaWYgKHJxX2RhdGFfZGlyKHJlcSkpIHsKKwkJCS8qIEtpY2sgb2ZmIHdyaXRlIHJlcXVlc3QgKi8KKwkJCWRldl9kYmcoYWNlLT5kZXYsICJ3cml0ZSBkYXRhXG4iKTsKKwkJCWFjZS0+ZnNtX3Rhc2sgPSBBQ0VfVEFTS19XUklURTsKKwkJCWFjZV9vdXQoYWNlLCBBQ0VfU0VDQ05UQ01ELAorCQkJCWNvdW50IHwgQUNFX1NFQ0NOVENNRF9XUklURV9EQVRBKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEtpY2sgb2ZmIHJlYWQgcmVxdWVzdCAqLworCQkJZGV2X2RiZyhhY2UtPmRldiwgInJlYWQgZGF0YVxuIik7CisJCQlhY2UtPmZzbV90YXNrID0gQUNFX1RBU0tfUkVBRDsKKwkJCWFjZV9vdXQoYWNlLCBBQ0VfU0VDQ05UQ01ELAorCQkJCWNvdW50IHwgQUNFX1NFQ0NOVENNRF9SRUFEX0RBVEEpOworCQl9CisKKwkJLyogQXMgcGVyIGRhdGFzaGVldCwgcHV0IGNvbmZpZyBjb250cm9sbGVyIGluIHJlc2V0ICovCisJCXZhbCA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwkJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwgfCBBQ0VfQ1RSTF9DRkdSRVNFVCk7CisKKwkJLyogTW92ZSB0byB0aGUgdHJhbnNmZXIgc3RhdGUuICBUaGUgc3lzdGVtYWNlIHdpbGwgcmFpc2UKKwkJICogYW4gaW50ZXJydXB0IG9uY2UgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvCisJCSAqLworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfUkVRX1RSQU5TRkVSOworCQlpZiAoYWNlLT5mc21fdGFzayA9PSBBQ0VfVEFTS19SRUFEKQorCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOwkvKiB3YWl0IGZvciBkYXRhIHJlYWR5ICovCisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1JFUV9UUkFOU0ZFUjoKKwkJLyogQ2hlY2sgdGhhdCB0aGUgc3lzYWNlIGlzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSAqLworCQlzdGF0dXMgPSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpOworCQlpZiAoc3RhdHVzICYgQUNFX1NUQVRVU19DRkJTWSkgeworCQkJZGV2X2RiZyhhY2UtPmRldiwKKwkJCQkiQ0ZCU1kgc2V0OyB0PSVpIGl0ZXI9JWkgYz0laSBkYz0laSBpcnE9JWlcbiIsCisJCQkJYWNlLT5mc21fdGFzaywgYWNlLT5mc21faXRlcl9udW0sCisJCQkJYWNlLT5yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyAqIDE2LAorCQkJCWFjZS0+ZGF0YV9jb3VudCwgYWNlLT5pbl9pcnEpOworCQkJYWNlX2ZzbV95aWVsZChhY2UpOwkvKiBuZWVkIHRvIHBvbGwgQ0ZCU1kgYml0ICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoIShzdGF0dXMgJiBBQ0VfU1RBVFVTX0RBVEFCVUZSRFkpKSB7CisJCQlkZXZfZGJnKGFjZS0+ZGV2LAorCQkJCSJEQVRBQlVGIG5vdCBzZXQ7IHQ9JWkgaXRlcj0laSBjPSVpIGRjPSVpIGlycT0laVxuIiwKKwkJCQlhY2UtPmZzbV90YXNrLCBhY2UtPmZzbV9pdGVyX251bSwKKwkJCQlhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzICogMTYsCisJCQkJYWNlLT5kYXRhX2NvdW50LCBhY2UtPmluX2lycSk7CisJCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRyYW5zZmVyIHRoZSBuZXh0IGJ1ZmZlciAqLworCQlpID0gMTY7CisJCWlmIChhY2UtPmZzbV90YXNrID09IEFDRV9UQVNLX1dSSVRFKQorCQkJYWNlLT5yZWdfb3BzLT5kYXRhb3V0KGFjZSk7CisJCWVsc2UKKwkJCWFjZS0+cmVnX29wcy0+ZGF0YWluKGFjZSk7CisJCWFjZS0+ZGF0YV9jb3VudC0tOworCisJCS8qIElmIHRoZXJlIGFyZSBzdGlsbCBidWZmZXJzIHRvIGJlIHRyYW5zZmVyczsganVtcCBvdXQgaGVyZSAqLworCQlpZiAoYWNlLT5kYXRhX2NvdW50ICE9IDApIHsKKwkJCWFjZV9mc21feWllbGRpcnEoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogYmlvIGZpbmlzaGVkOyBpcyB0aGVyZSBhbm90aGVyIG9uZT8gKi8KKwkJaSA9IGFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnM7CisJCWlmIChlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KGFjZS0+cmVxLCAxLCBpKSkgeworCQkJLyogZGV2X2RiZyhhY2UtPmRldiwgIm5leHQgYmxvY2s7IGg9JWxpIGM9JWlcbiIsCisJCQkgKiAgICAgIGFjZS0+cmVxLT5oYXJkX25yX3NlY3RvcnMsCisJCQkgKiAgICAgIGFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnMpOworCQkJICovCisJCQlhY2UtPmRhdGFfcHRyID0gYWNlLT5yZXEtPmJ1ZmZlcjsKKwkJCWFjZS0+ZGF0YV9jb3VudCA9IGFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiAxNjsKKwkJCWFjZV9mc21feWllbGRpcnEoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1JFUV9DT01QTEVURTsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfUkVRX0NPTVBMRVRFOgorCQkvKiBDb21wbGV0ZSB0aGUgYmxvY2sgcmVxdWVzdCAqLworCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KGFjZS0+cmVxKTsKKwkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGFjZS0+cmVxLCAxKTsKKwkJYWNlLT5yZXEgPSBOVUxMOworCisJCS8qIEZpbmlzaGVkIHJlcXVlc3Q7IGdvIHRvIGlkbGUgc3RhdGUgKi8KKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYWNlX2ZzbV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gKHZvaWQgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisKKwkvKiBMb29wIG92ZXIgc3RhdGUgbWFjaGluZSB1bnRpbCB0b2xkIHRvIHN0b3AgKi8KKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMTsKKwl3aGlsZSAoYWNlLT5mc21fY29udGludWVfZmxhZykKKwkJYWNlX2ZzbV9kb3N0YXRlKGFjZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2UtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWNlX3N0YWxsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gKHZvaWQgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfd2FybihhY2UtPmRldiwKKwkJICJraWNraW5nIHN0YWxsZWQgZnNtOyBzdGF0ZT0laSB0YXNrPSVpIGl0ZXI9JWkgZGM9JWlcbiIsCisJCSBhY2UtPmZzbV9zdGF0ZSwgYWNlLT5mc21fdGFzaywgYWNlLT5mc21faXRlcl9udW0sCisJCSBhY2UtPmRhdGFfY291bnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKworCS8qIFJlYXJtIHRoZSBzdGFsbCB0aW1lciAqYmVmb3JlKiBlbnRlcmluZyBGU00gKHdoaWNoIG1heSB0aGVuCisJICogZGVsZXRlIHRoZSB0aW1lcikgKi8KKwltb2RfdGltZXIoJmFjZS0+c3RhbGxfdGltZXIsIGppZmZpZXMgKyBIWik7CisKKwkvKiBMb29wIG92ZXIgc3RhdGUgbWFjaGluZSB1bnRpbCB0b2xkIHRvIHN0b3AgKi8KKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMTsKKwl3aGlsZSAoYWNlLT5mc21fY29udGludWVfZmxhZykKKwkJYWNlX2ZzbV9kb3N0YXRlKGFjZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2UtPmxvY2ssIGZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZXMKKyAqLworc3RhdGljIGludCBhY2VfaW50ZXJydXB0X2NoZWNrc3RhdGUoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwl1MzIgc3JlZyA9IGFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyk7CisJdTE2IGNyZWcgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisKKwkvKiBDaGVjayBmb3IgZXJyb3Igb2NjdXJhbmNlICovCisJaWYgKChzcmVnICYgKEFDRV9TVEFUVVNfQ0ZHRVJST1IgfCBBQ0VfU1RBVFVTX0NGQ0VSUk9SKSkgJiYKKwkgICAgKGNyZWcgJiBBQ0VfQ1RSTF9FUlJPUklSUSkpIHsKKwkJZGV2X2VycihhY2UtPmRldiwgInRyYW5zZmVyIGZhaWx1cmVcbiIpOworCQlhY2VfZHVtcF9yZWdzKGFjZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTE2IGNyZWc7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGRldl9pZDsKKworCS8qIGJlIHNhZmUgYW5kIGdldCB0aGUgbG9jayAqLworCXNwaW5fbG9jaygmYWNlLT5sb2NrKTsKKwlhY2UtPmluX2lycSA9IDE7CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJY3JlZyA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIGNyZWcgfCBBQ0VfQ1RSTF9SRVNFVElSUSk7CisJYWNlX291dChhY2UsIEFDRV9DVFJMLCBjcmVnKTsKKworCS8qIGNoZWNrIGZvciBJTyBmYWlsdXJlcyAqLworCWlmIChhY2VfaW50ZXJydXB0X2NoZWNrc3RhdGUoYWNlKSkKKwkJYWNlLT5kYXRhX3Jlc3VsdCA9IC1FSU87CisKKwlpZiAoYWNlLT5mc21fdGFzayA9PSAwKSB7CisJCWRldl9lcnIoYWNlLT5kZXYsCisJCQkic3B1cmlvdXMgaXJxOyBzdGF0PSUuOHggY3RybD0lLjh4IGNtZD0lLjR4XG4iLAorCQkJYWNlX2luMzIoYWNlLCBBQ0VfU1RBVFVTKSwgYWNlX2luMzIoYWNlLCBBQ0VfQ1RSTCksCisJCQlhY2VfaW4oYWNlLCBBQ0VfU0VDQ05UQ01EKSk7CisJCWRldl9lcnIoYWNlLT5kZXYsICJmc21fdGFzaz0laSBmc21fc3RhdGU9JWkgZGF0YV9jb3VudD0laVxuIiwKKwkJCWFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX3N0YXRlLCBhY2UtPmRhdGFfY291bnQpOworCX0KKworCS8qIExvb3Agb3ZlciBzdGF0ZSBtYWNoaW5lIHVudGlsIHRvbGQgdG8gc3RvcCAqLworCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAxOworCXdoaWxlIChhY2UtPmZzbV9jb250aW51ZV9mbGFnKQorCQlhY2VfZnNtX2Rvc3RhdGUoYWNlKTsKKworCS8qIGRvbmUgd2l0aCBpbnRlcnJ1cHQ7IGRyb3AgdGhlIGxvY2sgKi8KKwlhY2UtPmluX2lycSA9IDA7CisJc3Bpbl91bmxvY2soJmFjZS0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmxvY2sgb3BzCisgKi8KK3N0YXRpYyB2b2lkIGFjZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlOworCisJcmVxID0gYWNlX2dldF9uZXh0X3JlcXVlc3QocSk7CisKKwlpZiAocmVxKSB7CisJCWFjZSA9IHJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQl0YXNrbGV0X3NjaGVkdWxlKCZhY2UtPmZzbV90YXNrbGV0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWNlX21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmdkKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBnZC0+cHJpdmF0ZV9kYXRhOworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfbWVkaWFfY2hhbmdlZCgpOiAlaVxuIiwgYWNlLT5tZWRpYV9jaGFuZ2UpOworCisJcmV0dXJuIGFjZS0+bWVkaWFfY2hhbmdlOworfQorCitzdGF0aWMgaW50IGFjZV9yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmdkKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBnZC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX3JldmFsaWRhdGVfZGlzaygpXG4iKTsKKworCWlmIChhY2UtPm1lZGlhX2NoYW5nZSkgeworCQlkZXZfZGJnKGFjZS0+ZGV2LCAicmVxdWVzdGluZyBjZiBpZCBhbmQgc2NoZWR1bGluZyB0YXNrbGV0XG4iKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisJCWFjZS0+aWRfcmVxX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCisJCXRhc2tsZXRfc2NoZWR1bGUoJmFjZS0+ZnNtX3Rhc2tsZXQpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhY2UtPmlkX2NvbXBsZXRpb24pOworCX0KKworCWRldl9kYmcoYWNlLT5kZXYsICJyZXZhbGlkYXRlIGNvbXBsZXRlXG4iKTsKKwlyZXR1cm4gYWNlLT5pZF9yZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgYWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9vcGVuKCkgdXNlcnM9JWlcbiIsIGFjZS0+dXNlcnMgKyAxKTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGFjZTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisJYWNlLT51c2VycysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCisJY2hlY2tfZGlza19jaGFuZ2UoaW5vZGUtPmlfYmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2YWw7CisKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX3JlbGVhc2UoKSB1c2Vycz0laVxuIiwgYWNlLT51c2VycyAtIDEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCWFjZS0+dXNlcnMtLTsKKwlpZiAoYWNlLT51c2VycyA9PSAwKSB7CisJCXZhbCA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwkJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwgJiB+QUNFX0NUUkxfTE9DS1JFUSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICopYXJnOworCXN0cnVjdCBoZF9nZW9tZXRyeSBnOworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfaW9jdGwoKVxuIik7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSERJT19HRVRHRU86CisJCWcuaGVhZHMgPSBhY2UtPmNmX2lkLmhlYWRzOworCQlnLnNlY3RvcnMgPSBhY2UtPmNmX2lkLnNlY3RvcnM7CisJCWcuY3lsaW5kZXJzID0gYWNlLT5jZl9pZC5jeWxzOworCQlnLnN0YXJ0ID0gMDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihnZW8sICZnLCBzaXplb2YoZykpID8gLUVGQVVMVCA6IDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgYWNlX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhY2Vfb3BlbiwKKwkucmVsZWFzZSA9IGFjZV9yZWxlYXNlLAorCS5tZWRpYV9jaGFuZ2VkID0gYWNlX21lZGlhX2NoYW5nZWQsCisJLnJldmFsaWRhdGVfZGlzayA9IGFjZV9yZXZhbGlkYXRlX2Rpc2ssCisJLmlvY3RsID0gYWNlX2lvY3RsLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN5c3RlbUFDRSBkZXZpY2Ugc2V0dXAvdGVhcmRvd24gY29kZQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhY2Vfc2V0dXAoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwl1MTYgdmVyc2lvbjsKKwl1MTYgdmFsOworCisJaW50IHJjOworCisJc3Bpbl9sb2NrX2luaXQoJmFjZS0+bG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZhY2UtPmlkX2NvbXBsZXRpb24pOworCisJLyoKKwkgKiBNYXAgdGhlIGRldmljZQorCSAqLworCWFjZS0+YmFzZWFkZHIgPSBpb3JlbWFwKGFjZS0+cGh5c2FkZHIsIDB4ODApOworCWlmICghYWNlLT5iYXNlYWRkcikKKwkJZ290byBlcnJfaW9yZW1hcDsKKworCWlmIChhY2UtPmlycSAhPSBOT19JUlEpIHsKKwkJcmMgPSByZXF1ZXN0X2lycShhY2UtPmlycSwgYWNlX2ludGVycnVwdCwgMCwgInN5c3RlbWFjZSIsIGFjZSk7CisJCWlmIChyYykgeworCQkJLyogRmFpbHVyZSAtIGZhbGwgYmFjayB0byBwb2xsZWQgbW9kZSAqLworCQkJZGV2X2VycihhY2UtPmRldiwgInJlcXVlc3RfaXJxIGZhaWxlZFxuIik7CisJCQlhY2UtPmlycSA9IE5PX0lSUTsKKwkJfQorCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgbWFjaGluZSB0YXNrbGV0IGFuZCBzdGFsbCB0aW1lcgorCSAqLworCXRhc2tsZXRfaW5pdCgmYWNlLT5mc21fdGFza2xldCwgYWNlX2ZzbV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylhY2UpOworCXNldHVwX3RpbWVyKCZhY2UtPnN0YWxsX3RpbWVyLCBhY2Vfc3RhbGxfdGltZXIsICh1bnNpZ25lZCBsb25nKWFjZSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHJlcXVlc3QgcXVldWUKKwkgKi8KKwlhY2UtPnF1ZXVlID0gYmxrX2luaXRfcXVldWUoYWNlX3JlcXVlc3QsICZhY2UtPmxvY2spOworCWlmIChhY2UtPnF1ZXVlID09IE5VTEwpCisJCWdvdG8gZXJyX2Jsa19pbml0cTsKKwlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShhY2UtPnF1ZXVlLCA1MTIpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBHRCBzdHJ1Y3R1cmUKKwkgKi8KKwlhY2UtPmdkID0gYWxsb2NfZGlzayhBQ0VfTlVNX01JTk9SUyk7CisJaWYgKCFhY2UtPmdkKQorCQlnb3RvIGVycl9hbGxvY19kaXNrOworCisJYWNlLT5nZC0+bWFqb3IgPSBhY2VfbWFqb3I7CisJYWNlLT5nZC0+Zmlyc3RfbWlub3IgPSBhY2UtPmlkICogQUNFX05VTV9NSU5PUlM7CisJYWNlLT5nZC0+Zm9wcyA9ICZhY2VfZm9wczsKKwlhY2UtPmdkLT5xdWV1ZSA9IGFjZS0+cXVldWU7CisJYWNlLT5nZC0+cHJpdmF0ZV9kYXRhID0gYWNlOworCXNucHJpbnRmKGFjZS0+Z2QtPmRpc2tfbmFtZSwgMzIsICJ4cyVjIiwgYWNlLT5pZCArICdhJyk7CisKKwkvKiBzZXQgYnVzIHdpZHRoICovCisJaWYgKGFjZS0+YnVzX3dpZHRoID09IDEpIHsKKwkJLyogMHgwMTAxIHNob3VsZCB3b3JrIHJlZ2FyZGxlc3Mgb2YgZW5kaWFuZXNzICovCisJCWFjZV9vdXRfbGUxNihhY2UsIEFDRV9CVVNNT0RFLCAweDAxMDEpOworCisJCS8qIHJlYWQgaXQgYmFjayB0byBkZXRlcm1pbmUgZW5kaWFuZXNzICovCisJCWlmIChhY2VfaW5fbGUxNihhY2UsIEFDRV9CVVNNT0RFKSA9PSAweDAwMDEpCisJCQlhY2UtPnJlZ19vcHMgPSAmYWNlX3JlZ19sZTE2X29wczsKKwkJZWxzZQorCQkJYWNlLT5yZWdfb3BzID0gJmFjZV9yZWdfYmUxNl9vcHM7CisJfSBlbHNlIHsKKwkJYWNlX291dF84KGFjZSwgQUNFX0JVU01PREUsIDB4MDApOworCQlhY2UtPnJlZ19vcHMgPSAmYWNlX3JlZ184X29wczsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdmVyc2lvbiByZWdpc3RlciBpcyBzYW5lICovCisJdmVyc2lvbiA9IGFjZV9pbihhY2UsIEFDRV9WRVJTSU9OKTsKKwlpZiAoKHZlcnNpb24gPT0gMCkgfHwgKHZlcnNpb24gPT0gMHhGRkZGKSkKKwkJZ290byBlcnJfcmVhZDsKKworCS8qIFB1dCBzeXNhY2UgaW4gYSBzYW5lIHN0YXRlIGJ5IGNsZWFyaW5nIG1vc3QgY29udHJvbCByZWcgYml0cyAqLworCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgQUNFX0NUUkxfRk9SQ0VDRkdNT0RFIHwKKwkJQUNFX0NUUkxfREFUQUJVRlJEWUlSUSB8IEFDRV9DVFJMX0VSUk9SSVJRKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJdmFsID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCXZhbCB8PSBBQ0VfQ1RSTF9EQVRBQlVGUkRZSVJRIHwgQUNFX0NUUkxfRVJST1JJUlE7CisJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwpOworCisJLyogUHJpbnQgdGhlIGlkZW50aWZpY2F0aW9uICovCisJZGV2X2luZm8oYWNlLT5kZXYsICJYaWxpbnggU3lzdGVtQUNFIHJldmlzaW9uICVpLiVpLiVpXG4iLAorCQkgKHZlcnNpb24gPj4gMTIpICYgMHhmLCAodmVyc2lvbiA+PiA4KSAmIDB4MGYsIHZlcnNpb24gJiAweGZmKTsKKwlkZXZfZGJnKGFjZS0+ZGV2LCAicGh5c2FkZHIgMHglbHgsIG1hcHBlZCB0byAweCVwLCBpcnE9JWlcbiIsCisJCWFjZS0+cGh5c2FkZHIsIGFjZS0+YmFzZWFkZHIsIGFjZS0+aXJxKTsKKworCWFjZS0+bWVkaWFfY2hhbmdlID0gMTsKKwlhY2VfcmV2YWxpZGF0ZV9kaXNrKGFjZS0+Z2QpOworCisJLyogTWFrZSB0aGUgc3lzYWNlIGRldmljZSAnbGl2ZScgKi8KKwlhZGRfZGlzayhhY2UtPmdkKTsKKworCXJldHVybiAwOworCisgICAgICBlcnJfcmVhZDoKKwlwdXRfZGlzayhhY2UtPmdkKTsKKyAgICAgIGVycl9hbGxvY19kaXNrOgorCWJsa19jbGVhbnVwX3F1ZXVlKGFjZS0+cXVldWUpOworICAgICAgZXJyX2Jsa19pbml0cToKKwlpb3VubWFwKGFjZS0+YmFzZWFkZHIpOworCWlmIChhY2UtPmlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKGFjZS0+aXJxLCBhY2UpOworICAgICAgZXJyX2lvcmVtYXA6CisJcHJpbnRrKEtFUk5fSU5GTyAieHN5c2FjZTogZXJyb3IgaW5pdGlhbGl6aW5nIGRldmljZSBhdCAweCVseFxuIiwKKwkgICAgICAgYWNlLT5waHlzYWRkcik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhY2VfdGVhcmRvd24oc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlpZiAoYWNlLT5nZCkgeworCQlkZWxfZ2VuZGlzayhhY2UtPmdkKTsKKwkJcHV0X2Rpc2soYWNlLT5nZCk7CisJfQorCisJaWYgKGFjZS0+cXVldWUpCisJCWJsa19jbGVhbnVwX3F1ZXVlKGFjZS0+cXVldWUpOworCisJdGFza2xldF9raWxsKCZhY2UtPmZzbV90YXNrbGV0KTsKKworCWlmIChhY2UtPmlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKGFjZS0+aXJxLCBhY2UpOworCisJaW91bm1hcChhY2UtPmJhc2VhZGRyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQbGF0Zm9ybSBCdXMgU3VwcG9ydAorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFjZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldmljZSk7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZTsKKwlpbnQgaTsKKworCWRldl9kYmcoZGV2aWNlLCAiYWNlX3Byb2JlKCVwKVxuIiwgZGV2aWNlKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGFjZSBkZXZpY2Ugc3RydWN0dXJlCisJICovCisJYWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjZV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjZSkKKwkJZ290byBlcnJfYWxsb2M7CisKKwlhY2UtPmRldiA9IGRldmljZTsKKwlhY2UtPmlkID0gZGV2LT5pZDsKKwlhY2UtPmlycSA9IE5PX0lSUTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yZXNvdXJjZXM7IGkrKykgeworCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQkJYWNlLT5waHlzYWRkciA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CisJCWlmIChkZXYtPnJlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9JUlEpCisJCQlhY2UtPmlycSA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CisJfQorCisJLyogRklYTUU6IFNob3VsZCBnZXQgYnVzX3dpZHRoIGZyb20gdGhlIHBsYXRmb3JtX2RldmljZSBzdHJ1Y3QgKi8KKwlhY2UtPmJ1c193aWR0aCA9IDE7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBhY2UpOworCisJLyogQ2FsbCB0aGUgYnVzLWluZGVwZW5kYW50IHNldHVwIGNvZGUgKi8KKwlpZiAoYWNlX3NldHVwKGFjZSkgIT0gMCkKKwkJZ290byBlcnJfc2V0dXA7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX3NldHVwOgorCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCWtmcmVlKGFjZSk7CisgICAgICBlcnJfYWxsb2M6CisJcHJpbnRrKEtFUk5fRVJSICJ4c3lzYWNlOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBkZXZpY2VcbiIpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogUGxhdGZvcm0gYnVzIHJlbW92ZSgpIG1ldGhvZAorICovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlkZXZfZGJnKGRldmljZSwgImFjZV9yZW1vdmUoJXApXG4iLCBkZXZpY2UpOworCisJaWYgKGFjZSkgeworCQlhY2VfdGVhcmRvd24oYWNlKTsKKwkJa2ZyZWUoYWNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGFjZV9kcml2ZXIgPSB7CisJLm5hbWUgPSAieHN5c2FjZSIsCisJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBhY2VfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFjZV9yZW1vdmUpLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNb2R1bGUgaW5pdC9leGl0IHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFjZV9pbml0KHZvaWQpCit7CisJYWNlX21ham9yID0gcmVnaXN0ZXJfYmxrZGV2KGFjZV9tYWpvciwgInhzeXNhY2UiKTsKKwlpZiAoYWNlX21ham9yIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAieHN5c2FjZTogcmVnaXN0ZXJfYmxrZGV2KCkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGFjZV9tYWpvcjsKKwl9CisKKwlwcl9kZWJ1ZygiUmVnaXN0ZXJpbmcgWGlsaW54IFN5c3RlbUFDRSBkcml2ZXIsIG1ham9yPSVpXG4iLCBhY2VfbWFqb3IpOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmFjZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNlX2V4aXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiVW5yZWdpc3RlcmluZyBYaWxpbnggU3lzdGVtQUNFIGRyaXZlclxuIik7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmFjZV9kcml2ZXIpOworCXVucmVnaXN0ZXJfYmxrZGV2KGFjZV9tYWpvciwgInhzeXNhY2UiKTsKK30KKworbW9kdWxlX2luaXQoYWNlX2luaXQpOworbW9kdWxlX2V4aXQoYWNlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay96MnJhbS5jIGIvZHJpdmVycy9ibG9jay96MnJhbS5jCmluZGV4IDdjYzI2ODUuLmU0MGZhOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svejJyYW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKQEAgLTQ0LDkgKzQ0LDYgQEAKIGV4dGVybiBpbnQgbTY4a19yZWFsbnVtX21lbW9yeTsKIGV4dGVybiBzdHJ1Y3QgbWVtX2luZm8gbTY4a19tZW1vcnlbTlVNX01FTUlORk9dOwogCi0jZGVmaW5lIFRSVUUgICAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgRkFMU0UgICAgICAgICAgICAgICAgICgwKQotCiAjZGVmaW5lIFoyTUlOT1JfQ09NQklORUQgICAgICAoMCkKICNkZWZpbmUgWjJNSU5PUl9aMk9OTFkgICAgICAgICgxKQogI2RlZmluZSBaMk1JTk9SX0NISVBPTkxZICAgICAgKDIpCkBAIC0zNzQsOSArMzcxLDcgQEAKIHsKICAgICBpbnQgaSwgajsKICAgICBibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoWjJSQU1fTUFKT1IsIDApLCAyNTYpOwotICAgIGlmICggdW5yZWdpc3Rlcl9ibGtkZXYoIFoyUkFNX01BSk9SLCBERVZJQ0VfTkFNRSApICE9IDAgKQotCXByaW50ayggS0VSTl9FUlIgREVWSUNFX05BTUUgIjogdW5yZWdpc3RlciBvZiBkZXZpY2UgZmFpbGVkXG4iKTsKLQorICAgIHVucmVnaXN0ZXJfYmxrZGV2KFoyUkFNX01BSk9SLCBERVZJQ0VfTkFNRSk7CiAgICAgZGVsX2dlbmRpc2soejJyYW1fZ2VuZGlzayk7CiAgICAgcHV0X2Rpc2soejJyYW1fZ2VuZGlzayk7CiAgICAgYmxrX2NsZWFudXBfcXVldWUoejJfcXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCmluZGV4IGFhNTQ2OGYuLjQ5OTAxOWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKKysrIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCkBAIC0yNjk1LDExICsyNjk1LDEyIEBACiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHJldDsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlwLT5pX2JkZXYtPmJkX2Rpc2s7CiAKIAkvKgogCSAqIFRyeSB0aGUgZ2VuZXJpYyBTQ1NJIGNvbW1hbmQgaW9jdGwncyBmaXJzdC4KIAkgKi8KLQlyZXQgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBpcC0+aV9iZGV2LT5iZF9kaXNrLCBjbWQsIGFyZ3ApOworCXJldCA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIGRpc2stPnF1ZXVlLCBkaXNrLCBjbWQsIGFyZ3ApOwogCWlmIChyZXQgIT0gLUVOT1RUWSkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCBmNjY0ODY4Li5kOGQ3MTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtMTE0LDcgKzExNCw3IEBACiAKIGNvbmZpZyBST0NLRVRQT1JUCiAJdHJpc3RhdGUgIkNvbXRyb2wgUm9ja2V0UG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgKElTQSB8fCBFSVNBIHx8IFBDSSkKIAloZWxwCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBDb210cm9sIFJvY2tldFBvcnQgYW5kIFJvY2tldE1vZGVtIFBDSSBib2FyZHMuICAgCiAgICAgICAgICAgVGhlc2UgYm9hcmRzIHByb3ZpZGUgMiwgNCwgOCwgMTYsIG9yIDMyIGhpZ2gtc3BlZWQgc2VyaWFsIHBvcnRzIG9yCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogY29uZmlnIERJR0lFUENBCiAJdHJpc3RhdGUgIkRpZ2lib2FyZCBJbnRlbGxpZ2VudCBBc3luYyBTdXBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgKElTQSB8fCBFSVNBIHx8IFBDSSkKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBEaWdpIEludGVybmF0aW9uYWwncyBYeCwgWGV2ZSwgYW5kIFhlbSBzZXJpZXMKIAkgIG9mIGNhcmRzIHdoaWNoIHByb3ZpZGUgbXVsdGlwbGUgc2VyaWFsIHBvcnRzLiBZb3Ugd291bGQgbmVlZApAQCAtMjEzLDggKzIxMyw2IEBACiAJICBUaGlzIGlzIHVwZ3JhZGVkICgxLjkuMSkgZHJpdmVyIGZyb20gb3JpZ2luYWwgTW94YSBkcml2ZXJzIHdpdGgKIAkgIGNoYW5nZXMgZmluYWxseSByZXN1bHRpbmcgaW4gUENJIHByb2JpbmcuCiAKLQkgIFVzZSBhdCB5b3VyIG93biByaXNrLgotCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAogCSAgbXhzZXJfbmV3LiBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTSBoZXJlLgogCkBAIC0zNTQsNyArMzUyLDcgQEAKIAogY29uZmlnIFNUQUxMSU9OCiAJdHJpc3RhdGUgIlN0YWxsaW9uIEVhc3lJTyBvciBFQzgvMzIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUAorCWRlcGVuZHMgb24gU1RBTERSViAmJiBCUk9LRU5fT05fU01QICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCiAJaGVscAogCSAgSWYgeW91IGhhdmUgYW4gRWFzeUlPIG9yIEVhc3lDb25uZWN0aW9uIDgvMzIgbXVsdGlwb3J0IFN0YWxsaW9uCiAJICBjYXJkLCB0aGVuIHRoaXMgaXMgZm9yIHlvdTsgc2F5IFkuICBNYWtlIHN1cmUgdG8gcmVhZApAQCAtMzY1LDcgKzM2Myw3IEBACiAKIGNvbmZpZyBJU1RBTExJT04KIAl0cmlzdGF0ZSAiU3RhbGxpb24gRUM4LzY0LCBPTmJvYXJkLCBCcnVtYnkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUAorCWRlcGVuZHMgb24gU1RBTERSViAmJiBCUk9LRU5fT05fU01QICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCiAJaGVscAogCSAgSWYgeW91IGhhdmUgYW4gRWFzeUNvbm5lY3Rpb24gOC82NCwgT05ib2FyZCwgQnJ1bWJ5IG9yIFN0YWxsaW9uCiAJICBzZXJpYWwgbXVsdGlwb3J0IGNhcmQsIHNheSBZIGhlcmUuIE1ha2Ugc3VyZSB0byByZWFkCkBAIC05NzksMTUgKzk3NywxNCBAQAogCWRlcGVuZHMgb24gQ1BVX1ZSNDFYWAogCiBjb25maWcgUkFXX0RSSVZFUgotCXRyaXN0YXRlICJSQVcgZHJpdmVyICgvZGV2L3Jhdy9yYXdOKSAoT0JTT0xFVEUpIgorCXRyaXN0YXRlICJSQVcgZHJpdmVyICgvZGV2L3Jhdy9yYXdOKSIKIAlkZXBlbmRzIG9uIEJMT0NLCiAJaGVscAotCSAgVGhlIHJhdyBkcml2ZXIgcGVybWl0cyBibG9jayBkZXZpY2VzIHRvIGJlIGJvdW5kIHRvIC9kZXYvcmF3L3Jhd04uIAotCSAgT25jZSBib3VuZCwgSS9PIGFnYWluc3QgL2Rldi9yYXcvcmF3TiB1c2VzIGVmZmljaWVudCB6ZXJvLWNvcHkgSS9PLiAKKwkgIFRoZSByYXcgZHJpdmVyIHBlcm1pdHMgYmxvY2sgZGV2aWNlcyB0byBiZSBib3VuZCB0byAvZGV2L3Jhdy9yYXdOLgorCSAgT25jZSBib3VuZCwgSS9PIGFnYWluc3QgL2Rldi9yYXcvcmF3TiB1c2VzIGVmZmljaWVudCB6ZXJvLWNvcHkgSS9PLgogCSAgU2VlIHRoZSByYXcoOCkgbWFucGFnZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICAgICAgICAgVGhlIHJhdyBkcml2ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uCi0gICAgICAgICAgQXBwbGljYXRpb25zIHNob3VsZCBzaW1wbHkgb3BlbiB0aGUgZGV2aWNlIChlZyAvZGV2L2hkYTEpCisgICAgICAgICAgQXBwbGljYXRpb25zIHNob3VsZCBwcmVmZXJhYmx5IG9wZW4gdGhlIGRldmljZSAoZWcgL2Rldi9oZGExKQogICAgICAgICAgIHdpdGggdGhlIE9fRElSRUNUIGZsYWcuCiAKIGNvbmZpZyBNQVhfUkFXX0RFVlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCAyZjU2ZWNjLi5mMjk5NmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBACiBvYmotJChDT05GSUdfVlQpCQkrPSB2dF9pb2N0bC5vIHZjX3NjcmVlbi5vIGNvbnNvbGVtYXAubyBcCiAJCQkJICAgY29uc29sZW1hcF9kZWZ0YmwubyBzZWxlY3Rpb24ubyBrZXlib2FyZC5vCiBvYmotJChDT05GSUdfSFdfQ09OU09MRSkJKz0gdnQubyBkZWZrZXltYXAubworb2JqLSQoQ09ORklHX0FVRElUKQkJKz0gdHR5X2F1ZGl0Lm8KIG9iai0kKENPTkZJR19NQUdJQ19TWVNSUSkJKz0gc3lzcnEubwogb2JqLSQoQ09ORklHX0VTUFNFUklBTCkJCSs9IGVzcC5vCiBvYmotJChDT05GSUdfTVZNRTE0N19TQ0MpCSs9IGdlbmVyaWNfc2VyaWFsLm8gdm1lX3NjYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKaW5kZXggNGVhY2VhYi4uN2IwMmJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwpAQCAtNzM4LDYgKzczOCw3IEBACiAJfQogCS8qIElmIHRoZSBxdW90aWVudCBpcyB6ZXJvIHJlZnVzZSB0aGUgY2hhbmdlICovCiAJaWYgKCFxdW90ICYmIG9sZF90ZXJtaW9zKSB7CisJCS8qIEZJWE1FOiBXaWxsIG5lZWQgdXBkYXRpbmcgZm9yIG5ldyB0dHkgaW4gdGhlIGVuZCAqLwogCQlpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVEOwogCQlpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOwogCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKQEAgLTc4Myw3ICs3ODQsNiBAQAogCS8qCiAJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCiAJICovCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKIAogCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX0RSOwogCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCkBAIC0xMzY3LDExICsxMzY3LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBjZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAotCWlmICggICAoY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JICAgICYmICggICBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCSAgcmV0dXJuOwotCiAJY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKIAogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FwbS1lbXVsYXRpb24uYyBiL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMKaW5kZXggMTc5YzdhMy4uZWMxMTZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FwbS1lbXVsYXRpb24uYworKysgYi9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2FwbS1lbXVsYXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpAQCAtMzI5LDEzICszMzAsOCBAQAogCQkJLyoKIAkJCSAqIFdhaXQgZm9yIHRoZSBzdXNwZW5kL3Jlc3VtZSB0byBjb21wbGV0ZS4gIElmIHRoZXJlCiAJCQkgKiBhcmUgcGVuZGluZyBhY2tub3dsZWRnZXMsIHdlIHdhaXQgaGVyZSBmb3IgdGhlbS4KLQkJCSAqCi0JCQkgKiBOb3RlOiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBQTSBzdWJzeXN0ZW0gZG9lcwotCQkJICogbm90IGtpY2sgdXMgb3V0IG9mIHRoZSB3YWl0IHdoZW4gaXQgc3VzcGVuZHMgdGhlCi0JCQkgKiB0aHJlYWRzLgogCQkJICovCiAJCQlmbGFncyA9IGN1cnJlbnQtPmZsYWdzOwotCQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkJCXdhaXRfZXZlbnQoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAogCQkJCSAgIGFzLT5zdXNwZW5kX3N0YXRlID09IFNVU1BFTkRfRE9ORSk7CkBAIC0zNjUsMTMgKzM2MSw4IEBACiAJCQkvKgogCQkJICogV2FpdCBmb3IgdGhlIHN1c3BlbmQvcmVzdW1lIHRvIGNvbXBsZXRlLiAgSWYgdGhlcmUKIAkJCSAqIGFyZSBwZW5kaW5nIGFja25vd2xlZGdlcywgd2Ugd2FpdCBoZXJlIGZvciB0aGVtLgotCQkJICoKLQkJCSAqIE5vdGU6IHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIFBNIHN1YnN5c3RlbSBkb2VzCi0JCQkgKiBub3Qga2ljayB1cyBvdXQgb2YgdGhlIHdhaXQgd2hlbiBpdCBzdXNwZW5kcyB0aGUKLQkJCSAqIHRocmVhZHMuCiAJCQkgKi8KIAkJCWZsYWdzID0gY3VycmVudC0+ZmxhZ3M7Ci0JCQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFwbV9zdXNwZW5kX3dhaXRxdWV1ZSwKIAkJCQkJIGFzLT5zdXNwZW5kX3N0YXRlID09IFNVU1BFTkRfRE9ORSk7CkBAIC01OTgsNyArNTg5LDYgQEAKIAkJa2FwbWRfdHNrID0gTlVMTDsKIAkJcmV0dXJuIHJldDsKIAl9Ci0Ja2FwbWRfdHNrLT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAl3YWtlX3VwX3Byb2Nlc3Moa2FwbWRfdHNrKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYnJpcV9wYW5lbC5jIGIvZHJpdmVycy9jaGFyL2JyaXFfcGFuZWwuYwppbmRleCBlZDUzZjU0Li5iNmYyNjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYnJpcV9wYW5lbC5jCisrKyBiL2RyaXZlcnMvY2hhci9icmlxX3BhbmVsLmMKQEAgLTkxLDExICs5MSw2IEBACiAJdW5zaWduZWQgc2hvcnQgYzsKIAl1bnNpZ25lZCBjaGFyIGNwOwogCi0jaWYgMAkvKiAgQ2FuJ3Qgc2VlayAocHJlYWQpIG9uIHRoaXMgZGV2aWNlICAqLwotCWlmIChwcG9zICE9ICZmaWxlLT5mX3BvcykKLQkJcmV0dXJuIC1FU1BJUEU7Ci0jZW5kaWYKLQogCWlmICghdmZkX2lzX29wZW4pCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xMzksMTEgKzEzNCw2IEBACiAJc2l6ZV90IGluZHggPSBsZW47CiAJaW50IGksIGVzYyA9IDA7CiAKLSNpZiAwCS8qICBDYW4ndCBzZWVrIChwd3JpdGUpIG9uIHRoaXMgZGV2aWNlICAqLwotCWlmIChwcG9zICE9ICZmaWxlLT5mX3BvcykKLQkJcmV0dXJuIC1FU1BJUEU7Ci0jZW5kaWYKLQogCWlmICghdmZkX2lzX29wZW4pCiAJCXJldHVybiAtRUJVU1k7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMgYi9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCmluZGV4IGZkNDBiOTUuLjRiMzkxNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKKysrIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiAJdW5zaWduZWQgbG9uZwlyZWZjb3VudDsKIAl1bnNpZ25lZCBsb25nCXN1bTsKIAl1bnNpZ25lZCBjaGFyCSppbnZlcnNlX3RyYW5zbGF0aW9uc1s0XTsKKwl1MTYJCSppbnZlcnNlX3RyYW5zX3VuaWNvZGU7CiAJaW50CQlyZWFkb25seTsKIH07CiAKQEAgLTIwNyw2ICsyMDgsNDEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9pbnZlcnNlX3RyYW5zX3VuaWNvZGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsCisJCQkJICAgICAgc3RydWN0IHVuaV9wYWdlZGlyICpwKQoreworCWludCBpLCBqLCBrLCBnbHlwaDsKKwl1MTYgKipwMSwgKnAyOworCXUxNiAqcTsKKworCWlmICghcCkgcmV0dXJuOworCXEgPSBwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGU7CisJaWYgKCFxKSB7CisJCXEgPSBwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGUgPQorCQkJa21hbGxvYyhNQVhfR0xZUEggKiBzaXplb2YodTE2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcSkKKwkJCXJldHVybjsKKwl9CisJbWVtc2V0KHEsIDAsIE1BWF9HTFlQSCAqIHNpemVvZih1MTYpKTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCXAxID0gcC0+dW5pX3BnZGlyW2ldOworCQlpZiAoIXAxKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCQlwMiA9IHAxW2pdOworCQkJaWYgKCFwMikKKwkJCQljb250aW51ZTsKKwkJCWZvciAoayA9IDA7IGsgPCA2NDsgaysrKSB7CisJCQkJZ2x5cGggPSBwMltrXTsKKwkJCQlpZiAoZ2x5cGggPj0gMCAmJiBnbHlwaCA8IE1BWF9HTFlQSAorCQkJCQkgICAgICAgJiYgcVtnbHlwaF0gPCAzMikKKwkJICAJCQlxW2dseXBoXSA9IChpIDw8IDExKSArIChqIDw8IDYpICsgazsKKwkJCX0KKwkJfQorCX0KK30KKwogdW5zaWduZWQgc2hvcnQgKnNldF90cmFuc2xhdGUoaW50IG0sIHN0cnVjdCB2Y19kYXRhICp2YykKIHsKIAlpbnZfdHJhbnNsYXRlW3ZjLT52Y19udW1dID0gbTsKQEAgLTIxNywxOSArMjUzLDI5IEBACiAgKiBJbnZlcnNlIHRyYW5zbGF0aW9uIGlzIGltcG9zc2libGUgZm9yIHNldmVyYWwgcmVhc29uczoKICAqIDEuIFRoZSBmb250PC0+Y2hhcmFjdGVyIG1hcHMgYXJlIG5vdCAxLTEuCiAgKiAyLiBUaGUgdGV4dCBtYXkgaGF2ZSBiZWVuIHdyaXR0ZW4gd2hpbGUgYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gbWFwCi0gKiAgICB3YXMgYWN0aXZlLCBvciB1c2luZyBVbmljb2RlLgorICogICAgd2FzIGFjdGl2ZS4KICAqIFN0aWxsLCBpdCBpcyBub3cgcG9zc2libGUgdG8gYSBjZXJ0YWluIGV4dGVudCB0byBjdXQgYW5kIHBhc3RlIG5vbi1BU0NJSS4KICAqLwotdW5zaWduZWQgY2hhciBpbnZlcnNlX3RyYW5zbGF0ZShzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgaW50IGdseXBoKQordTE2IGludmVyc2VfdHJhbnNsYXRlKHN0cnVjdCB2Y19kYXRhICpjb25wLCBpbnQgZ2x5cGgsIGludCB1c2VfdW5pY29kZSkKIHsKIAlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnA7CisJaW50IG07CiAJaWYgKGdseXBoIDwgMCB8fCBnbHlwaCA+PSBNQVhfR0xZUEgpCiAJCXJldHVybiAwOwotCWVsc2UgaWYgKCEocCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqY29ucC0+dmNfdW5pX3BhZ2VkaXJfbG9jKSB8fAotCQkgIXAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ludl90cmFuc2xhdGVbY29ucC0+dmNfbnVtXV0pCisJZWxzZSBpZiAoIShwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSpjb25wLT52Y191bmlfcGFnZWRpcl9sb2MpKQogCQlyZXR1cm4gZ2x5cGg7Ci0JZWxzZQotCQlyZXR1cm4gcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaW52X3RyYW5zbGF0ZVtjb25wLT52Y19udW1dXVtnbHlwaF07CisJZWxzZSBpZiAodXNlX3VuaWNvZGUpIHsKKwkJaWYgKCFwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGUpCisJCQlyZXR1cm4gZ2x5cGg7CisJCWVsc2UKKwkJCXJldHVybiBwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGVbZ2x5cGhdOworCX0gZWxzZSB7CisJCW0gPSBpbnZfdHJhbnNsYXRlW2NvbnAtPnZjX251bV07CisJCWlmICghcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbbV0pCisJCQlyZXR1cm4gZ2x5cGg7CisJCWVsc2UKKwkJCXJldHVybiBwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1ttXVtnbHlwaF07CisJfQogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfdXNlcl9tYXBzKHZvaWQpCkBAIC0yNDMsNiArMjg5LDcgQEAKIAkJcCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmNfY29uc1tpXS5kLT52Y191bmlfcGFnZWRpcl9sb2M7CiAJCWlmIChwICYmIHAgIT0gcSkgewogCQkJc2V0X2ludmVyc2VfdHJhbnNsKHZjX2NvbnNbaV0uZCwgcCwgVVNFUl9NQVApOworCQkJc2V0X2ludmVyc2VfdHJhbnNfdW5pY29kZSh2Y19jb25zW2ldLmQsIHApOwogCQkJcSA9IHA7CiAJCX0KIAl9CkBAIC0zNTMsNiArNDAwLDEwIEBACiAJCWtmcmVlKHAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ldKTsKIAkJcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaV0gPSBOVUxMOwogCX0KKwlpZiAocC0+aW52ZXJzZV90cmFuc191bmljb2RlKSB7CisJCWtmcmVlKHAtPmludmVyc2VfdHJhbnNfdW5pY29kZSk7CisJCXAtPmludmVyc2VfdHJhbnNfdW5pY29kZSA9IE5VTEw7CisJfQogfQogCiB2b2lkIGNvbl9mcmVlX3VuaW1hcChzdHJ1Y3QgdmNfZGF0YSAqdmMpCkBAIC01MTEsNiArNTYyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPD0gMzsgaSsrKQogCQlzZXRfaW52ZXJzZV90cmFuc2wodmMsIHAsIGkpOyAvKiBVcGRhdGUgYWxsIGludmVyc2UgdHJhbnNsYXRpb25zICovCisJc2V0X2ludmVyc2VfdHJhbnNfdW5pY29kZSh2YywgcCk7CiAgIAogCXJldHVybiBlcnI7CiB9CkBAIC01NjEsNiArNjEzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPD0gMzsgaSsrKQogCQlzZXRfaW52ZXJzZV90cmFuc2wodmMsIHAsIGkpOwkvKiBVcGRhdGUgYWxsIGludmVyc2UgdHJhbnNsYXRpb25zICovCisJc2V0X2ludmVyc2VfdHJhbnNfdW5pY29kZSh2YywgcCk7CiAJZGZsdCA9IHA7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTYxNyw2ICs2NzAsMTkgQEAKIAkJcC0+cmVhZG9ubHkgPSByZG9ubHk7CiB9CiAKKy8qIG1heSBiZSBjYWxsZWQgZHVyaW5nIGFuIGludGVycnVwdCAqLwordTMyIGNvbnZfOGJpdF90b191bmkodW5zaWduZWQgY2hhciBjKQoreworCS8qCisJICogQWx3YXlzIHVzZSBVU0VSX01BUC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBrZXlib2FyZCwKKwkgKiB3aGljaCBzaG91bGRuJ3QgYmUgYWZmZWN0ZWQgYnkgRzAvRzEgc3dpdGNoaW5nLCBldGMuCisJICogSWYgdGhlIHVzZXIgbWFwIHN0aWxsIGNvbnRhaW5zIGRlZmF1bHQgdmFsdWVzLCBpLmUuIHRoZQorCSAqIGRpcmVjdC10by1mb250IG1hcHBpbmcsIHRoZW4gYXNzdW1lIHVzZXIgaXMgdXNpbmcgTGF0aW4xLgorCSAqLworCXVuc2lnbmVkIHNob3J0IHVuaSA9IHRyYW5zbGF0aW9uc1tVU0VSX01BUF1bY107CisJcmV0dXJuIHVuaSA9PSAoMHhmMDAwIHwgYykgPyBjIDogdW5pOworfQorCiBpbnQKIGNvbnZfdW5pX3RvX3BjKHN0cnVjdCB2Y19kYXRhICpjb25wLCBsb25nIHVjcykgCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCmluZGV4IGNhMzc2YjkuLjdiMDgzOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCisrKyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCkBAIC02NDYsNiArNjQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTY4MCw2ICs2ODEsNDQgQEAKIAogI2RlZmluZSBTVERfQ09NX0ZMQUdTICgwKQogCisvKiBmaXJtd2FyZSBzdHVmZiAqLworI2RlZmluZSBaTF9NQVhfQkxPQ0tTCTE2CisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCTB4MDIwMTAyMDMKKyNkZWZpbmUgUkFNX1NJWkUgMHg4MDAwMAorCisjZGVmaW5lIFpfRlBHQV9MT0FERUQoWCkJKChyZWFkbCgmKFgpLT5pbml0X2N0cmwpICYgKDE8PDE3KSkgIT0gMCkKKworZW51bSB6YmxvY2tfdHlwZSB7CisJWkJMT0NLX1BSRyA9IDAsCisJWkJMT0NLX0ZQR0EgPSAxCit9OworCitzdHJ1Y3QgemZpbGVfaGVhZGVyIHsKKwljaGFyIG5hbWVbNjRdOworCWNoYXIgZGF0ZVszMl07CisJY2hhciBhdXhbMzJdOworCXUzMiBuX2NvbmZpZzsKKwl1MzIgY29uZmlnX29mZnNldDsKKwl1MzIgbl9ibG9ja3M7CisJdTMyIGJsb2NrX29mZnNldDsKKwl1MzIgcmVzZXJ2ZWRbOV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHpmaWxlX2NvbmZpZyB7CisJY2hhciBuYW1lWzY0XTsKKwl1MzIgbWFpbGJveDsKKwl1MzIgZnVuY3Rpb247CisJdTMyIG5fYmxvY2tzOworCXUzMiBibG9ja19saXN0W1pMX01BWF9CTE9DS1NdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB6ZmlsZV9ibG9jayB7CisJdTMyIHR5cGU7CisJdTMyIGZpbGVfb2Zmc2V0OworCXUzMiByYW1fb2Zmc2V0OworCXUzMiBzaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqY3lfc2VyaWFsX2RyaXZlcjsKIAogI2lmZGVmIENPTkZJR19JU0EKQEAgLTE4NTEsMTEgKzE4OTAsMTEgQEAKIAlzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87CiAJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlzdGF0aWMgc3RydWN0IEZJUk1fSUQgKmZpcm1faWQ7Ci0Jc3RhdGljIHN0cnVjdCBaRldfQ1RSTCAqemZ3X2N0cmw7Ci0Jc3RhdGljIHN0cnVjdCBCT0FSRF9DVFJMICpib2FyZF9jdHJsOwotCXN0YXRpYyBzdHJ1Y3QgQ0hfQ1RSTCAqY2hfY3RybDsKLQlzdGF0aWMgc3RydWN0IEJVRl9DVFJMICpidWZfY3RybDsKKwlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKKwlzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworCXN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7CisJc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsOwogCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKIAlpbnQgY2FyZCwgcG9ydDsKIApAQCAtMTk5OSw3ICsyMDM4LDYgQEAKIAkJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOwogCQlzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOwogCQlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOwotCQlpbnQgcmV0dmFsOwogCiAJCWJhc2VfYWRkciA9IGNhcmQtPmJhc2VfYWRkcjsKIApAQCAtMjM3MSw3ICsyNDA5LDYgQEAKIAkJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOwogCQlzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOwogCQlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOwotCQlpbnQgcmV0dmFsOwogCiAJCWJhc2VfYWRkciA9IGNpbmZvLT5iYXNlX2FkZHI7CiAJCWZpcm1faWQgPSBiYXNlX2FkZHIgKyBJRF9BRERSRVNTOwpAQCAtNDEyNywxMCArNDE2NCw2IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgImN5YzpjeV9zZXRfdGVybWlvcyB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOwogI2VuZGlmCiAKLQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnICYmCi0JCQkodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgKElYT04gfCBJWEFOWSkpID09Ci0JCQkob2xkX3Rlcm1pb3MtPmNfaWZsYWcgJiAoSVhPTiB8IElYQU5ZKSkpCi0JCXJldHVybjsKIAlzZXRfbGluZV9jaGFyKGluZm8pOwogCiAJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCkBAIC00NzM5LDE3ICs0NzcyLDI5NSBAQAogfQkJCQkvKiBjeV9kZXRlY3RfaXNhICovCiAKICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcGx4X2luaXQodm9pZCBfX2lvbWVtICogYWRkciwgX191MzIgaW5pdGN0bCkKK3N0YXRpYyBpbmxpbmUgaW50IF9fZGV2aW5pdCBjeWNfaXNmd3N0cihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCBhOworCisJZm9yIChhID0gMDsgYSA8IHNpemUgJiYgKnN0cjsgYSsrLCBzdHIrKykKKwkJaWYgKCpzdHIgJiAweDgwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKDsgYSA8IHNpemU7IGErKywgc3RyKyspCisJCWlmICgqc3RyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZGV2aW5pdCBjeXpfZnBnYV9jb3B5KHZvaWQgX19pb21lbSAqZnBnYSwgdTggKmRhdGEsCisJCXVuc2lnbmVkIGludCBzaXplKQoreworCWZvciAoOyBzaXplID4gMDsgc2l6ZS0tKSB7CisJCWN5X3dyaXRlbChmcGdhLCAqZGF0YSsrKTsKKwkJdWRlbGF5KDEwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHhfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlycSwKKwkJc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICphZGRyKQogewogCS8qIFJlc2V0IFBMWCAqLwotCWN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgcmVhZGwoYWRkciArIGluaXRjdGwpIHwgMHg0MDAwMDAwMCk7CisJY3lfd3JpdGVsKCZhZGRyLT5pbml0X2N0cmwsIHJlYWRsKCZhZGRyLT5pbml0X2N0cmwpIHwgMHg0MDAwMDAwMCk7CiAJdWRlbGF5KDEwMEwpOwotCWN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgcmVhZGwoYWRkciArIGluaXRjdGwpICYgfjB4NDAwMDAwMDApOworCWN5X3dyaXRlbCgmYWRkci0+aW5pdF9jdHJsLCByZWFkbCgmYWRkci0+aW5pdF9jdHJsKSAmIH4weDQwMDAwMDAwKTsKIAogCS8qIFJlbG9hZCBDb25maWcuIFJlZ2lzdGVycyBmcm9tIEVFUFJPTSAqLwotCWN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgcmVhZGwoYWRkciArIGluaXRjdGwpIHwgMHgyMDAwMDAwMCk7CisJY3lfd3JpdGVsKCZhZGRyLT5pbml0X2N0cmwsIHJlYWRsKCZhZGRyLT5pbml0X2N0cmwpIHwgMHgyMDAwMDAwMCk7CiAJdWRlbGF5KDEwMEwpOwotCWN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgcmVhZGwoYWRkciArIGluaXRjdGwpICYgfjB4MjAwMDAwMDApOworCWN5X3dyaXRlbCgmYWRkci0+aW5pdF9jdHJsLCByZWFkbCgmYWRkci0+aW5pdF9jdHJsKSAmIH4weDIwMDAwMDAwKTsKKworCS8qIEZvciBzb21lIHlldCB1bmtub3duIHJlYXNvbiwgb25jZSB0aGUgUExYOTA2MCByZWxvYWRzIHRoZSBFRVBST00sCisJICogdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0byByZS13cml0ZSBpdCB0byB0aGUgUENJIGNvbmZpZy4KKwkgKiByZWdpc3RlcnMuIFRoaXMgd2lsbCByZW1haW4gaGVyZSB1bnRpbCB3ZSBmaW5kIGEgcGVybWFuZW50IGZpeC4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBfX2N5el9sb2FkX2Z3KGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHUzMiBtYWlsYm94LCB2b2lkIF9faW9tZW0gKmJhc2UsCisJCXZvaWQgX19pb21lbSAqZnBnYSkKK3sKKwl2b2lkICpwdHIgPSBmdy0+ZGF0YTsKKwlzdHJ1Y3QgemZpbGVfaGVhZGVyICpoID0gcHRyOworCXN0cnVjdCB6ZmlsZV9jb25maWcgKmMsICpjczsKKwlzdHJ1Y3QgemZpbGVfYmxvY2sgKmIsICpiczsKKwl1bnNpZ25lZCBpbnQgYSwgdG1wLCBsZW4gPSBmdy0+c2l6ZTsKKyNkZWZpbmUgQkFEX0ZXIEtFUk5fRVJSICJCYWQgZmlybXdhcmU6ICIKKwlpZiAobGVuIDwgc2l6ZW9mKCpoKSkgeworCQlwcmludGsoQkFEX0ZXICJ0b28gc2hvcnQ6ICV1PCV6dVxuIiwgbGVuLCBzaXplb2YoKmgpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3MgPSBwdHIgKyBoLT5jb25maWdfb2Zmc2V0OworCWJzID0gcHRyICsgaC0+YmxvY2tfb2Zmc2V0OworCisJaWYgKCh2b2lkICopKGNzICsgaC0+bl9jb25maWcpID4gcHRyICsgbGVuIHx8CisJCQkodm9pZCAqKShicyArIGgtPm5fYmxvY2tzKSA+IHB0ciArIGxlbikgeworCQlwcmludGsoQkFEX0ZXICJ0b28gc2hvcnQiKTsKKwkJcmV0dXJuICAtRUlOVkFMOworCX0KKworCWlmIChjeWNfaXNmd3N0cihoLT5uYW1lLCBzaXplb2YoaC0+bmFtZSkpIHx8CisJCQljeWNfaXNmd3N0cihoLT5kYXRlLCBzaXplb2YoaC0+ZGF0ZSkpKSB7CisJCXByaW50ayhCQURfRlcgImJhZCBmb3JtYXR0ZWQgaGVhZGVyIHN0cmluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdHJuY21wKG5hbWUsIGgtPm5hbWUsIHNpemVvZihoLT5uYW1lKSkpIHsKKwkJcHJpbnRrKEJBRF9GVyAiYmFkIG5hbWUgJyVzJyAoZXhwZWN0ZWQgJyVzJylcbiIsIGgtPm5hbWUsIG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0bXAgPSAwOworCWZvciAoYyA9IGNzOyBjIDwgY3MgKyBoLT5uX2NvbmZpZzsgYysrKSB7CisJCWZvciAoYSA9IDA7IGEgPCBjLT5uX2Jsb2NrczsgYSsrKQorCQkJaWYgKGMtPmJsb2NrX2xpc3RbYV0gPiBoLT5uX2Jsb2NrcykgeworCQkJCXByaW50ayhCQURfRlcgImJhZCBibG9jayByZWYgbnVtYmVyIGluIGNmZ3NcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQlpZiAoYy0+bWFpbGJveCA9PSBtYWlsYm94ICYmIGMtPmZ1bmN0aW9uID09IDApIC8qIDAgaXMgbm9ybWFsICovCisJCQl0bXArKzsKKwl9CisJaWYgKCF0bXApIHsKKwkJcHJpbnRrKEJBRF9GVyAibm90aGluZyBhcHByb3ByaWF0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoYiA9IGJzOyBiIDwgYnMgKyBoLT5uX2Jsb2NrczsgYisrKQorCQlpZiAoYi0+ZmlsZV9vZmZzZXQgKyBiLT5zaXplID4gbGVuKSB7CisJCQlwcmludGsoQkFEX0ZXICJiYWQgYmxvY2sgZGF0YSBvZmZzZXRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCS8qIGV2ZXJ5dGhpbmcgaXMgT0ssIGxldCdzIHNlZWsnbidsb2FkIGl0ICovCisJZm9yIChjID0gY3M7IGMgPCBjcyArIGgtPm5fY29uZmlnOyBjKyspCisJCWlmIChjLT5tYWlsYm94ID09IG1haWxib3ggJiYgYy0+ZnVuY3Rpb24gPT0gMCkKKwkJCWJyZWFrOworCisJZm9yIChhID0gMDsgYSA8IGMtPm5fYmxvY2tzOyBhKyspIHsKKwkJYiA9ICZic1tjLT5ibG9ja19saXN0W2FdXTsKKwkJaWYgKGItPnR5cGUgPT0gWkJMT0NLX0ZQR0EpIHsKKwkJCWlmIChmcGdhICE9IE5VTEwpCisJCQkJY3l6X2ZwZ2FfY29weShmcGdhLCBwdHIgKyBiLT5maWxlX29mZnNldCwKKwkJCQkJCWItPnNpemUpOworCQl9IGVsc2UgeworCQkJaWYgKGJhc2UgIT0gTlVMTCkKKwkJCQltZW1jcHlfdG9pbyhiYXNlICsgYi0+cmFtX29mZnNldCwKKwkJCQkJICAgICAgIHB0ciArIGItPmZpbGVfb2Zmc2V0LCBiLT5zaXplKTsKKwkJfQorCX0KKyN1bmRlZiBCQURfRlcKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgY3l6X2xvYWRfZncoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyLAorCQlzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKmN0bF9hZGRyLCBpbnQgaXJxKQoreworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKKwlzdHJ1Y3QgQ1VTVE9NX1JFRyBfX2lvbWVtICpjdXN0ID0gYmFzZV9hZGRyOworCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICpwdF96ZndjdHJsOworCXZvaWQgX19pb21lbSAqdG1wOworCXUzMiBtYWlsYm94LCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCAiY3l6ZmlybS5iaW4iLCAmcGRldi0+ZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBmaXJtd2FyZVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGZpcm13YXJlIGlzIGFscmVhZHkgbG9hZGVkIGFuZCBydW5uaW5nLiBJZgorCSAgIHBvc2l0aXZlLCBza2lwIHRoaXMgYm9hcmQgKi8KKwlpZiAoWl9GUEdBX0xPQURFRChjdGxfYWRkcikgJiYgcmVhZGwoJmZpZC0+c2lnbmF0dXJlKSA9PSBaRklSTV9JRCkgeworCQl1MzIgY250dmFsID0gcmVhZGwoYmFzZV9hZGRyICsgMHgxOTApOworCisJCXVkZWxheSgxMDApOworCQlpZiAoY250dmFsICE9IHJlYWRsKGJhc2VfYWRkciArIDB4MTkwKSkgeworCQkJLyogRlcgY291bnRlciBpcyB3b3JraW5nLCBGVyBpcyBydW5uaW5nICovCisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJDeWNsYWRlcy1aIEZXIGFscmVhZHkgbG9hZGVkLiAiCisJCQkJCSJTa2lwcGluZyBib2FyZC5cbiIpOworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gZXJyX3JlbDsKKwkJfQorCX0KKworCS8qIHN0YXJ0IGJvb3QgKi8KKwljeV93cml0ZWwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCwgcmVhZGwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCkgJgorCQkJfjB4MDAwMzA4MDBVTCk7CisKKwltYWlsYm94ID0gcmVhZGwoJmN0bF9hZGRyLT5tYWlsX2JveF8wKTsKKworCWlmIChtYWlsYm94ID09IDAgfHwgWl9GUEdBX0xPQURFRChjdGxfYWRkcikpIHsKKwkJLyogc3RvcHMgQ1BVIGFuZCBzZXQgd2luZG93IHRvIGJlZ2lubmluZyBvZiBSQU0gKi8KKwkJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOworCQljeV93cml0ZWwoJmN1c3QtPmNwdV9zdG9wLCAwKTsKKwkJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX1JBTSk7CisJCXVkZWxheSgxMDApOworCX0KKworCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOworCisJaWYgKG1haWxib3ggIT0gMCkgeworCQkvKiBsb2FkIEZQR0EgKi8KKwkJcmV0dmFsID0gX19jeXpfbG9hZF9mdyhmdywgIkN5Y2xvbS1aIiwgbWFpbGJveCwgTlVMTCwKKwkJCQliYXNlX2FkZHIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJfcmVsOworCQlpZiAoIVpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmdyB1cGxvYWQgc3VjY2Vzc2Z1bCwgYnV0IGZ3IGlzICIKKwkJCQkJIm5vdCBsb2FkZWRcbiIpOworCQkJZ290byBlcnJfcmVsOworCQl9CisJfQorCisJLyogc3RvcHMgQ1BVIGFuZCBzZXQgd2luZG93IHRvIGJlZ2lubmluZyBvZiBSQU0gKi8KKwljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fQ1JFRyk7CisJY3lfd3JpdGVsKCZjdXN0LT5jcHVfc3RvcCwgMCk7CisJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX1JBTSk7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBjbGVhciBtZW1vcnkgKi8KKwlmb3IgKHRtcCA9IGJhc2VfYWRkcjsgdG1wIDwgYmFzZV9hZGRyICsgUkFNX1NJWkU7IHRtcCsrKQorCQljeV93cml0ZWIodG1wLCAyNTUpOworCWlmIChtYWlsYm94ICE9IDApIHsKKwkJLyogc2V0IHdpbmRvdyB0byBsYXN0IDUxMksgb2YgUkFNICovCisJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0gKyBSQU1fU0laRSk7CisJCS8vc2xlZXAoMSk7CisJCWZvciAodG1wID0gYmFzZV9hZGRyOyB0bXAgPCBiYXNlX2FkZHIgKyBSQU1fU0laRTsgdG1wKyspCisJCQljeV93cml0ZWIodG1wLCAyNTUpOworCQkvKiBzZXQgd2luZG93IHRvIGJlZ2lubmluZyBvZiBSQU0gKi8KKwkJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX1JBTSk7CisJCS8vc2xlZXAoMSk7CisJfQorCisJcmV0dmFsID0gX19jeXpfbG9hZF9mdyhmdywgIkN5Y2xvbS1aIiwgbWFpbGJveCwgYmFzZV9hZGRyLCBOVUxMKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCS8qIGZpbmlzaCBib290IGFuZCBzdGFydCBib2FyZHMgKi8KKwljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fQ1JFRyk7CisJY3lfd3JpdGVsKCZjdXN0LT5jcHVfc3RhcnQsIDApOworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOworCWkgPSAwOworCXdoaWxlICgoc3RhdHVzID0gcmVhZGwoJmZpZC0+c2lnbmF0dXJlKSkgIT0gWkZJUk1fSUQgJiYgaSsrIDwgNDApCisJCW1zbGVlcCgxMDApOworCWlmIChzdGF0dXMgIT0gWkZJUk1fSUQpIHsKKwkJaWYgKHN0YXR1cyA9PSBaRklSTV9ITFQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInlvdSBuZWVkIGFuIGV4dGVybmFsIHBvd2VyIHN1cHBseSAiCisJCQkJImZvciB0aGlzIG51bWJlciBvZiBwb3J0cy4gRmlybXdhcmUgaGFsdGVkIGFuZCAiCisJCQkJImJvYXJkIHJlc2V0LlxuIik7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJZ290byBlcnI7CisJCX0KKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZpZC0+c2lnbmF0dXJlID0gMHgleC4uLiBXYWl0aW5nICIKKwkJCQkic29tZSBtb3JlIHRpbWVcbiIsIHN0YXR1cyk7CisJCXdoaWxlICgoc3RhdHVzID0gcmVhZGwoJmZpZC0+c2lnbmF0dXJlKSkgIT0gWkZJUk1fSUQgJiYKKwkJCQlpKysgPCAyMDApCisJCQltc2xlZXAoMTAwKTsKKwkJaWYgKHN0YXR1cyAhPSBaRklSTV9JRCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQm9hcmQgbm90IHN0YXJ0ZWQgaW4gMjAgc2Vjb25kcyEgIgorCQkJCQkiR2l2aW5nIHVwLiAoZmlkLT5zaWduYXR1cmUgPSAweCV4KVxuIiwKKwkJCQkJc3RhdHVzKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICIqKiogV2FybmluZyAqKio6IGlmIHlvdSBhcmUgIgorCQkJCSJ1cGdyYWRpbmcgdGhlIEZXLCBwbGVhc2UgcG93ZXIgY3ljbGUgdGhlICIKKwkJCQkic3lzdGVtIGJlZm9yZSBsb2FkaW5nIHRoZSBuZXcgRlcgdG8gdGhlICIKKwkJCQkiQ3ljbGFkZXMtWi5cbiIpOworCisJCQlpZiAoWl9GUEdBX0xPQURFRChjdGxfYWRkcikpCisJCQkJcGx4X2luaXQocGRldiwgaXJxLCBjdGxfYWRkcik7CisKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGVycjsKKwkJfQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGaXJtd2FyZSBzdGFydGVkIGFmdGVyICVkIHNlY29uZHMuXG4iLAorCQkJCWkgLyAxMCk7CisJfQorCXB0X3pmd2N0cmwgPSBiYXNlX2FkZHIgKyByZWFkbCgmZmlkLT56ZndjdHJsX2FkZHIpOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmlkPT4gJXAsIHpmd2N0cmxfYWRkcj0+ICV4LCBucHRfemZ3Y3RybD0+ICVwXG4iLAorCQkJYmFzZV9hZGRyICsgSURfQUREUkVTUywgcmVhZGwoJmZpZC0+emZ3Y3RybF9hZGRyKSwKKwkJCWJhc2VfYWRkciArIHJlYWRsKCZmaWQtPnpmd2N0cmxfYWRkcikpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkN5Y2xhZGVzLVogRlcgbG9hZGVkOiB2ZXJzaW9uID0gJXgsIHBvcnRzID0gJXVcbiIsCisJCXJlYWRsKCZwdF96ZndjdHJsLT5ib2FyZF9jdHJsLmZ3X3ZlcnNpb24pLAorCQlyZWFkbCgmcHRfemZ3Y3RybC0+Ym9hcmRfY3RybC5uX2NoYW5uZWwpKTsKKworCWlmIChyZWFkbCgmcHRfemZ3Y3RybC0+Ym9hcmRfY3RybC5uX2NoYW5uZWwpID09IDApIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIm5vIEN5Y2xhZGVzLVogcG9ydHMgd2VyZSBmb3VuZC4gUGxlYXNlICIKKwkJCSJjaGVjayB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBaIGhvc3QgY2FyZCBhbmQgdGhlICIKKwkJCSJzZXJpYWwgZXhwYW5kZXJzLlxuIik7CisKKwkJaWYgKFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKQorCQkJcGx4X2luaXQocGRldiwgaXJxLCBjdGxfYWRkcik7CisKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIk51bGwgbnVtYmVyIG9mIHBvcnRzIGRldGVjdGVkLiBCb2FyZCAiCisJCQkJInJlc2V0LlxuIik7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gZXJyOworCX0KKworCWN5X3dyaXRlbCgmcHRfemZ3Y3RybC0+Ym9hcmRfY3RybC5vcF9zeXN0ZW0sIENfT1NfTElOVVgpOworCWN5X3dyaXRlbCgmcHRfemZ3Y3RybC0+Ym9hcmRfY3RybC5kcl92ZXJzaW9uLCBEUklWRVJfVkVSU0lPTik7CisKKwkvKgorCSAgIEVhcmx5IGZpcm13YXJlIGZhaWxlZCB0byBzdGFydCBsb29raW5nIGZvciBjb21tYW5kcy4KKwkgICBUaGlzIGVuYWJsZXMgZmlybXdhcmUgaW50ZXJydXB0cyBmb3IgdGhvc2UgY29tbWFuZHMuCisJICovCisJY3lfd3JpdGVsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQsIHJlYWRsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQpIHwKKwkJCSgxIDw8IDE3KSk7CisJY3lfd3JpdGVsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQsIHJlYWRsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQpIHwKKwkJCTB4MDAwMzA4MDBVTCk7CisKKwlwbHhfaW5pdChwZGV2LCBpcnEsIGN0bF9hZGRyKTsKKworCXJldHVybiAwOworZXJyX3JlbDoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKK2VycjoKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjeV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCkBAIC00ODMxLDE2ICs1MTQyLDkgQEAKIAkJfQogCiAJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgUExYIGJlZm9yZSByZXNldHRpbmcgaXQgKi8KLQkJY3lfd3JpdGV3KGFkZHIwICsgMHg2OCwKLQkJCXJlYWR3KGFkZHIwICsgMHg2OCkgJiB+MHgwOTAwKTsKKwkJY3lfd3JpdGV3KGFkZHIwICsgMHg2OCwgcmVhZHcoYWRkcjAgKyAweDY4KSAmIH4weDA5MDApOwogCi0JCXBseF9pbml0KGFkZHIwLCAweDZjKTsKLQkJLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKLQkJICAgdGhlIEVFUFJPTSwgdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0bwotCQkgICByZS13cml0ZSBpdCB0byB0aGUgUENJIGNvbmZpZy4gcmVnaXN0ZXJzLgotCQkgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudAotCQkgICBmaXguICovCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7CisJCXBseF9pbml0KHBkZXYsIGlycSwgYWRkcjApOwogCiAJCW1haWxib3ggPSAodTMyKXJlYWRsKCZjdGxfYWRkci0+bWFpbF9ib3hfMCk7CiAKQEAgLTQ4ODEsNiArNTE4NSw5IEBACiAJCQlpZiAoKG1haWxib3ggPT0gWk9fVjEpIHx8IChtYWlsYm94ID09IFpPX1YyKSkKIAkJCQljeV93cml0ZWwoYWRkcjIgKyBJRF9BRERSRVNTLCAwTCk7CiAKKwkJCXJldHZhbCA9IGN5el9sb2FkX2Z3KHBkZXYsIGFkZHIyLCBhZGRyMCwgaXJxKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnJfdW5tYXA7CiAJCQkvKiBUaGlzIG11c3QgYmUgYSBDeWNsYWRlcy04Wm8vUENJLiAgVGhlIGV4dGVuZGFibGUKIAkJCSAgIHZlcnNpb24gd2lsbCBoYXZlIGEgZGlmZmVyZW50IGRldmljZV9pZCBhbmQgd2lsbAogCQkJICAgYmUgYWxsb2NhdGVkIGl0cyBtYXhpbXVtIG51bWJlciBvZiBwb3J0cy4gKi8KQEAgLTQ5NTcsMTUgKzUyNjQsNyBAQAogCQljYXNlIFBMWF85MDYwOgogCQljYXNlIFBMWF85MDgwOgogCQlkZWZhdWx0OgkvKiBPbGQgYm9hcmRzLCB1c2UgUExYXzkwNjAgKi8KLQotCQkJcGx4X2luaXQoYWRkcjAsIDB4NmMpOwotCQkvKiBGb3Igc29tZSB5ZXQgdW5rbm93biByZWFzb24sIG9uY2UgdGhlIFBMWDkwNjAgcmVsb2FkcwotCQkgICB0aGUgRUVQUk9NLCB0aGUgSVJRIGlzIGxvc3QgYW5kLCB0aHVzLCB3ZSBoYXZlIHRvCi0JCSAgIHJlLXdyaXRlIGl0IHRvIHRoZSBQQ0kgY29uZmlnLiByZWdpc3RlcnMuCi0JCSAgIFRoaXMgd2lsbCByZW1haW4gaGVyZSB1bnRpbCB3ZSBmaW5kIGEgcGVybWFuZW50Ci0JCSAgIGZpeC4gKi8KLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7Ci0KKwkJCXBseF9pbml0KHBkZXYsIGlycSwgYWRkcjApOwogCQkJY3lfd3JpdGV3KGFkZHIwICsgMHg2OCwgcmVhZHcoYWRkcjAgKyAweDY4KSB8IDB4MDkwMCk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCmluZGV4IDViOTFiYzAuLjMzNDU2NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKQEAgLTczLDkgKzczLDkgQEAKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MsIG9yZGVyKTsKIH0KIAotaW50IGRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqZ2FydF9pbmZvKQoraW50IGRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqZ2FydF9pbmZvKQogewotCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeSA9IGRldi0+c2c7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAlpbnQgaTsKIAlpbnQgb3JkZXI7CkBAIC0xMjIsOSArMTIyLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXApOwogCi1pbnQgZHJtX2F0aV9wY2lnYXJ0X2luaXQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hdGlfcGNpZ2FydF9pbmZvICpnYXJ0X2luZm8pCitpbnQgZHJtX2F0aV9wY2lnYXJ0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvICpnYXJ0X2luZm8pCiB7Ci0JZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5ID0gZGV2LT5zZzsKIAl2b2lkICphZGRyZXNzID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXUzMiAqcGNpX2dhcnQsIHBhZ2VfYmFzZSwgYnVzX2FkZHJlc3MgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKaW5kZXggMDg5MTk4NC4uMmQ2ZjJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCkBAIC0xMDksMzEgKzEwOSwzMSBAQAogICogXG5vdGUgS1c6IEFjdHVhbGx5IGl0J3MgaWxsZWdhbCB0byBjaGFuZ2UgZWl0aGVyIGZvcgogICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgcmVhc29ucy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCB7CitzdHJ1Y3QgZHJtX2NsaXBfcmVjdCB7CiAJdW5zaWduZWQgc2hvcnQgeDE7CiAJdW5zaWduZWQgc2hvcnQgeTE7CiAJdW5zaWduZWQgc2hvcnQgeDI7CiAJdW5zaWduZWQgc2hvcnQgeTI7Ci19IGRybV9jbGlwX3JlY3RfdDsKK307CiAKIC8qKgogICogRHJhd2FibGUgaW5mb3JtYXRpb24uCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvIHsKK3N0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyB7CiAJdW5zaWduZWQgaW50IG51bV9yZWN0czsKLQlkcm1fY2xpcF9yZWN0X3QgKnJlY3RzOwotfSBkcm1fZHJhd2FibGVfaW5mb190OworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyZWN0czsKK307CiAKIC8qKgogICogVGV4dHVyZSByZWdpb24sCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV90ZXhfcmVnaW9uIHsKK3N0cnVjdCBkcm1fdGV4X3JlZ2lvbiB7CiAJdW5zaWduZWQgY2hhciBuZXh0OwogCXVuc2lnbmVkIGNoYXIgcHJldjsKIAl1bnNpZ25lZCBjaGFyIGluX3VzZTsKIAl1bnNpZ25lZCBjaGFyIHBhZGRpbmc7CiAJdW5zaWduZWQgaW50IGFnZTsKLX0gZHJtX3RleF9yZWdpb25fdDsKK307CiAKIC8qKgogICogSGFyZHdhcmUgbG9jay4KQEAgLTE0MiwxNyArMTQyLDE3IEBACiAgKiBwcm9jZXNzb3IgYnVzIGNvbnRlbnRpb24gb24gYSBtdWx0aXByb2Nlc3NvciBzeXN0ZW0sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55CiAgKiBvdGhlciBkYXRhIHN0b3JlZCBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1faHdfbG9jayB7CitzdHJ1Y3QgZHJtX2h3X2xvY2sgewogCV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgbG9jazsJCS8qKjwgbG9jayB2YXJpYWJsZSAqLwogCWNoYXIgcGFkZGluZ1s2MF07CQkJLyoqPCBQYWQgdG8gY2FjaGUgbGluZSAqLwotfSBkcm1faHdfbG9ja190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfVkVSU0lPTiBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1HZXRWZXJzaW9uKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV92ZXJzaW9uIHsKK3N0cnVjdCBkcm1fdmVyc2lvbiB7CiAJaW50IHZlcnNpb25fbWFqb3I7CSAgLyoqPCBNYWpvciB2ZXJzaW9uICovCiAJaW50IHZlcnNpb25fbWlub3I7CSAgLyoqPCBNaW5vciB2ZXJzaW9uICovCiAJaW50IHZlcnNpb25fcGF0Y2hsZXZlbDsJICAvKio8IFBhdGNoIGxldmVsICovCkBAIC0xNjIsMzMgKzE2MiwzMyBAQAogCWNoYXIgX191c2VyICpkYXRlOwkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkYXRlICovCiAJc2l6ZV90IGRlc2NfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRlc2MgYnVmZmVyICovCiAJY2hhciBfX3VzZXIgKmRlc2M7CSAgLyoqPCBVc2VyLXNwYWNlIGJ1ZmZlciB0byBob2xkIGRlc2MgKi8KLX0gZHJtX3ZlcnNpb25fdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0dFVF9VTklRVUUgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtR2V0QnVzaWQoKSBhbmQgZHJtU2V0QnVzSWQoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3VuaXF1ZSB7CitzdHJ1Y3QgZHJtX3VuaXF1ZSB7CiAJc2l6ZV90IHVuaXF1ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgdW5pcXVlICovCiAJY2hhciBfX3VzZXIgKnVuaXF1ZTsJICAvKio8IFVuaXF1ZSBuYW1lIGZvciBkcml2ZXIgaW5zdGFudGlhdGlvbiAqLwotfSBkcm1fdW5pcXVlX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fbGlzdCB7CitzdHJ1Y3QgZHJtX2xpc3QgewogCWludCBjb3VudDsJCSAgLyoqPCBMZW5ndGggb2YgdXNlci1zcGFjZSBzdHJ1Y3R1cmVzICovCi0JZHJtX3ZlcnNpb25fdCBfX3VzZXIgKnZlcnNpb247Ci19IGRybV9saXN0X3Q7CisJc3RydWN0IGRybV92ZXJzaW9uIF9fdXNlciAqdmVyc2lvbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9ibG9jayB7CitzdHJ1Y3QgZHJtX2Jsb2NrIHsKIAlpbnQgdW51c2VkOwotfSBkcm1fYmxvY2tfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0NPTlRST0wgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtQ3RsSW5zdEhhbmRsZXIoKSBhbmQgZHJtQ3RsVW5pbnN0SGFuZGxlcigpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY29udHJvbCB7CitzdHJ1Y3QgZHJtX2NvbnRyb2wgewogCWVudW0gewogCQlEUk1fQUREX0NPTU1BTkQsCiAJCURSTV9STV9DT01NQU5ELApAQCAtMTk2LDI0ICsxOTYsMjQgQEAKIAkJRFJNX1VOSU5TVF9IQU5ETEVSCiAJfSBmdW5jOwogCWludCBpcnE7Ci19IGRybV9jb250cm9sX3Q7Cit9OwogCiAvKioKICAqIFR5cGUgb2YgbWVtb3J5IHRvIG1hcC4KICAqLwotdHlwZWRlZiBlbnVtIGRybV9tYXBfdHlwZSB7CitlbnVtIGRybV9tYXBfdHlwZSB7CiAJX0RSTV9GUkFNRV9CVUZGRVIgPSAwLAkgIC8qKjwgV0MgKG5vIGNhY2hpbmcpLCBubyBjb3JlIGR1bXAgKi8KIAlfRFJNX1JFR0lTVEVSUyA9IDEsCSAgLyoqPCBubyBjYWNoaW5nLCBubyBjb3JlIGR1bXAgKi8KIAlfRFJNX1NITSA9IDIsCQkgIC8qKjwgc2hhcmVkLCBjYWNoZWQgKi8KIAlfRFJNX0FHUCA9IDMsCQkgIC8qKjwgQUdQL0dBUlQgKi8KIAlfRFJNX1NDQVRURVJfR0FUSEVSID0gNCwgIC8qKjwgU2NhdHRlci9nYXRoZXIgbWVtb3J5IGZvciBQQ0kgRE1BICovCiAJX0RSTV9DT05TSVNURU5UID0gNSwJICAvKio8IENvbnNpc3RlbnQgbWVtb3J5IGZvciBQQ0kgRE1BICovCi19IGRybV9tYXBfdHlwZV90OworfTsKIAogLyoqCiAgKiBNZW1vcnkgbWFwcGluZyBmbGFncy4KICAqLwotdHlwZWRlZiBlbnVtIGRybV9tYXBfZmxhZ3MgeworZW51bSBkcm1fbWFwX2ZsYWdzIHsKIAlfRFJNX1JFU1RSSUNURUQgPSAweDAxLAkgICAgIC8qKjwgQ2Fubm90IGJlIG1hcHBlZCB0byB1c2VyLXZpcnR1YWwgKi8KIAlfRFJNX1JFQURfT05MWSA9IDB4MDIsCiAJX0RSTV9MT0NLRUQgPSAweDA0LAkgICAgIC8qKjwgc2hhcmVkLCBjYWNoZWQsIGxvY2tlZCAqLwpAQCAtMjIxLDEyICsyMjEsMTIgQEAKIAlfRFJNX1dSSVRFX0NPTUJJTklORyA9IDB4MTAsIC8qKjwgdXNlIHdyaXRlLWNvbWJpbmluZyBpZiBhdmFpbGFibGUgKi8KIAlfRFJNX0NPTlRBSU5TX0xPQ0sgPSAweDIwLCAgIC8qKjwgU0hNIHBhZ2UgdGhhdCBjb250YWlucyBsb2NrICovCiAJX0RSTV9SRU1PVkFCTEUgPSAweDQwCSAgICAgLyoqPCBSZW1vdmFibGUgbWFwcGluZyAqLwotfSBkcm1fbWFwX2ZsYWdzX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHsKK3N0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHsKIAl1bnNpZ25lZCBpbnQgY3R4X2lkOwkgLyoqPCBDb250ZXh0IHJlcXVlc3RpbmcgcHJpdmF0ZSBtYXBwaW5nICovCiAJdm9pZCAqaGFuZGxlOwkJIC8qKjwgSGFuZGxlIG9mIG1hcCAqLwotfSBkcm1fY3R4X3ByaXZfbWFwX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9HRVRfTUFQLCBEUk1fSU9DVExfQUREX01BUCBhbmQgRFJNX0lPQ1RMX1JNX01BUCBpb2N0bHMKQEAgLTIzNCwzMCArMjM0LDMwIEBACiAgKgogICogXHNhIGRybUFkZE1hcCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fbWFwIHsKK3N0cnVjdCBkcm1fbWFwIHsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsJIC8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIGFkZHJlc3MgKDAgZm9yIFNBUkVBKSovCiAJdW5zaWduZWQgbG9uZyBzaXplOwkgLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgc2l6ZSAoYnl0ZXMpICovCi0JZHJtX21hcF90eXBlX3QgdHlwZTsJIC8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gbWFwICovCi0JZHJtX21hcF9mbGFnc190IGZsYWdzOwkgLyoqPCBGbGFncyAqLworCWVudW0gZHJtX21hcF90eXBlIHR5cGU7CSAvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLworCWVudW0gZHJtX21hcF9mbGFncyBmbGFnczsJIC8qKjwgRmxhZ3MgKi8KIAl2b2lkICpoYW5kbGU7CQkgLyoqPCBVc2VyLXNwYWNlOiAiSGFuZGxlIiB0byBwYXNzIHRvIG1tYXAoKSAqLwogCQkJCSAvKio8IEtlcm5lbC1zcGFjZToga2VybmVsLXZpcnR1YWwgYWRkcmVzcyAqLwogCWludCBtdHJyOwkJIC8qKjwgTVRSUiBzbG90IHVzZWQgKi8KIAkvKiAgIFByaXZhdGUgZGF0YSAqLwotfSBkcm1fbWFwX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9HRVRfQ0xJRU5UIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jbGllbnQgeworc3RydWN0IGRybV9jbGllbnQgewogCWludCBpZHg7CQkvKio8IFdoaWNoIGNsaWVudCBkZXNpcmVkPyAqLwogCWludCBhdXRoOwkJLyoqPCBJcyBjbGllbnQgYXV0aGVudGljYXRlZD8gKi8KIAl1bnNpZ25lZCBsb25nIHBpZDsJLyoqPCBQcm9jZXNzIElEICovCiAJdW5zaWduZWQgbG9uZyB1aWQ7CS8qKjwgVXNlciBJRCAqLwogCXVuc2lnbmVkIGxvbmcgbWFnaWM7CS8qKjwgTWFnaWMgKi8KIAl1bnNpZ25lZCBsb25nIGlvY3M7CS8qKjwgSW9jdGwgY291bnQgKi8KLX0gZHJtX2NsaWVudF90OworfTsKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gZHJtX3N0YXRfdHlwZSB7CiAJX0RSTV9TVEFUX0xPQ0ssCiAJX0RSTV9TVEFUX09QRU5TLAogCV9EUk1fU1RBVF9DTE9TRVMsCkBAIC0yNzUsMjMgKzI3NSwyMyBAQAogCV9EUk1fU1RBVF9TUEVDSUFMLAkvKio8IFNwZWNpYWwgRE1BIChlLmcuLCBwcmlvcml0eSBvciBwb2xsZWQpICovCiAJX0RSTV9TVEFUX01JU1NFRAkvKio8IE1pc3NlZCBETUEgb3Bwb3J0dW5pdHkgKi8KIAkgICAgLyogQWRkIHRvIHRoZSAqRU5EKiBvZiB0aGUgbGlzdCAqLwotfSBkcm1fc3RhdF90eXBlX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9HRVRfU1RBVFMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3N0YXRzIHsKK3N0cnVjdCBkcm1fc3RhdHMgewogCXVuc2lnbmVkIGxvbmcgY291bnQ7CiAJc3RydWN0IHsKIAkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQkJZHJtX3N0YXRfdHlwZV90IHR5cGU7CisJCWVudW0gZHJtX3N0YXRfdHlwZSB0eXBlOwogCX0gZGF0YVsxNV07Ci19IGRybV9zdGF0c190OworfTsKIAogLyoqCiAgKiBIYXJkd2FyZSBsb2NraW5nIGZsYWdzLgogICovCi10eXBlZGVmIGVudW0gZHJtX2xvY2tfZmxhZ3MgeworZW51bSBkcm1fbG9ja19mbGFncyB7CiAJX0RSTV9MT0NLX1JFQURZID0gMHgwMSwJICAgICAvKio8IFdhaXQgdW50aWwgaGFyZHdhcmUgaXMgcmVhZHkgZm9yIERNQSAqLwogCV9EUk1fTE9DS19RVUlFU0NFTlQgPSAweDAyLCAgLyoqPCBXYWl0IHVudGlsIGhhcmR3YXJlIHF1aWVzY2VudCAqLwogCV9EUk1fTE9DS19GTFVTSCA9IDB4MDQsCSAgICAgLyoqPCBGbHVzaCB0aGlzIGNvbnRleHQncyBETUEgcXVldWUgZmlyc3QgKi8KQEAgLTMwMSwxNyArMzAxLDE3IEBACiAJICAgZnVsbC1zY3JlZW4gREdBLWxpa2UgbW9kZS4gKi8KIAlfRFJNX0hBTFRfQUxMX1FVRVVFUyA9IDB4MTAsIC8qKjwgSGFsdCBhbGwgY3VycmVudCBhbmQgZnV0dXJlIHF1ZXVlcyAqLwogCV9EUk1fSEFMVF9DVVJfUVVFVUVTID0gMHgyMCAgLyoqPCBIYWx0IGFsbCBjdXJyZW50IHF1ZXVlcyAqLwotfSBkcm1fbG9ja19mbGFnc190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfTE9DSywgRFJNX0lPQ1RMX1VOTE9DSyBhbmQgRFJNX0lPQ1RMX0ZJTklTSCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1HZXRMb2NrKCkgYW5kIGRybVVubG9jaygpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fbG9jayB7CitzdHJ1Y3QgZHJtX2xvY2sgewogCWludCBjb250ZXh0OwotCWRybV9sb2NrX2ZsYWdzX3QgZmxhZ3M7Ci19IGRybV9sb2NrX3Q7CisJZW51bSBkcm1fbG9ja19mbGFncyBmbGFnczsKK307CiAKIC8qKgogICogRE1BIGZsYWdzCkBAIC0zMjEsNyArMzIxLDcgQEAKICAqCiAgKiBcc2EgZHJtX2RtYS4KICAqLwotdHlwZWRlZiBlbnVtIGRybV9kbWFfZmxhZ3MgeworZW51bSBkcm1fZG1hX2ZsYWdzIHsKIAkvKiBGbGFncyBmb3IgRE1BIGJ1ZmZlciBkaXNwYXRjaCAqLwogCV9EUk1fRE1BX0JMT0NLID0gMHgwMSwJICAgICAgLyoqPAogCQkJCSAgICAgICAqIEJsb2NrIHVudGlsIGJ1ZmZlciBkaXNwYXRjaGVkLgpAQCAtMzQwLDE0ICszNDAsMTQgQEAKIAlfRFJNX0RNQV9XQUlUID0gMHgxMCwJICAgICAgLyoqPCBXYWl0IGZvciBmcmVlIGJ1ZmZlcnMgKi8KIAlfRFJNX0RNQV9TTUFMTEVSX09LID0gMHgyMCwgICAvKio8IFNtYWxsZXItdGhhbi1yZXF1ZXN0ZWQgYnVmZmVycyBPSyAqLwogCV9EUk1fRE1BX0xBUkdFUl9PSyA9IDB4NDAgICAgIC8qKjwgTGFyZ2VyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KLX0gZHJtX2RtYV9mbGFnc190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUREX0JVRlMgYW5kIERSTV9JT0NUTF9NQVJLX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtQWRkQnVmcygpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2Rlc2Mgeworc3RydWN0IGRybV9idWZfZGVzYyB7CiAJaW50IGNvdW50OwkJIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgb2YgdGhpcyBzaXplICovCiAJaW50IHNpemU7CQkgLyoqPCBTaXplIGluIGJ5dGVzICovCiAJaW50IGxvd19tYXJrOwkJIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KQEAgLTM2Myw0NCArMzYzLDQ0IEBACiAJCQkJICAqIFN0YXJ0IGFkZHJlc3Mgb2Ygd2hlcmUgdGhlIEFHUCBidWZmZXJzIGFyZQogCQkJCSAgKiBpbiB0aGUgQUdQIGFwZXJ0dXJlCiAJCQkJICAqLwotfSBkcm1fYnVmX2Rlc2NfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0lORk9fQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2luZm8geworc3RydWN0IGRybV9idWZfaW5mbyB7CiAJaW50IGNvdW50OwkJLyoqPCBFbnRyaWVzIGluIGxpc3QgKi8KLQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmxpc3Q7Ci19IGRybV9idWZfaW5mb190OworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICpsaXN0OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfRlJFRV9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfZnJlZSB7CitzdHJ1Y3QgZHJtX2J1Zl9mcmVlIHsKIAlpbnQgY291bnQ7CiAJaW50IF9fdXNlciAqbGlzdDsKLX0gZHJtX2J1Zl9mcmVlX3Q7Cit9OwogCiAvKioKICAqIEJ1ZmZlciBpbmZvcm1hdGlvbgogICoKICAqIFxzYSBkcm1fYnVmX21hcC4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9wdWIgeworc3RydWN0IGRybV9idWZfcHViIHsKIAlpbnQgaWR4OwkJICAgICAgIC8qKjwgSW5kZXggaW50byB0aGUgbWFzdGVyIGJ1ZmZlciBsaXN0ICovCiAJaW50IHRvdGFsOwkJICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KIAlpbnQgdXNlZDsJCSAgICAgICAvKio8IEFtb3VudCBvZiBidWZmZXIgaW4gdXNlIChmb3IgRE1BKSAqLwogCXZvaWQgX191c2VyICphZGRyZXNzOwkgICAgICAgLyoqPCBBZGRyZXNzIG9mIGJ1ZmZlciAqLwotfSBkcm1fYnVmX3B1Yl90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfTUFQX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9tYXAgeworc3RydWN0IGRybV9idWZfbWFwIHsKIAlpbnQgY291bnQ7CQkvKio8IExlbmd0aCBvZiB0aGUgYnVmZmVyIGxpc3QgKi8KIAl2b2lkIF9fdXNlciAqdmlydHVhbDsJCS8qKjwgTW1hcCdkIGFyZWEgaW4gdXNlci12aXJ0dWFsICovCi0JZHJtX2J1Zl9wdWJfdCBfX3VzZXIgKmxpc3Q7CS8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCi19IGRybV9idWZfbWFwX3Q7CisJc3RydWN0IGRybV9idWZfcHViIF9fdXNlciAqbGlzdDsJLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0RNQSBpb2N0bCBhcmd1bWVudCB0eXBlLgpAQCAtNDA5LDQ4ICs0MDksNDggQEAKICAqCiAgKiBcc2EgZHJtRE1BKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9kbWEgeworc3RydWN0IGRybV9kbWEgewogCWludCBjb250ZXh0OwkJCSAgLyoqPCBDb250ZXh0IGhhbmRsZSAqLwogCWludCBzZW5kX2NvdW50OwkJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyB0byBzZW5kICovCiAJaW50IF9fdXNlciAqc2VuZF9pbmRpY2VzOwkgIC8qKjwgTGlzdCBvZiBoYW5kbGVzIHRvIGJ1ZmZlcnMgKi8KIAlpbnQgX191c2VyICpzZW5kX3NpemVzOwkJICAvKio8IExlbmd0aHMgb2YgZGF0YSB0byBzZW5kICovCi0JZHJtX2RtYV9mbGFnc190IGZsYWdzOwkJICAvKio8IEZsYWdzICovCisJZW51bSBkcm1fZG1hX2ZsYWdzIGZsYWdzOwkgIC8qKjwgRmxhZ3MgKi8KIAlpbnQgcmVxdWVzdF9jb3VudDsJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgKi8KIAlpbnQgcmVxdWVzdF9zaXplOwkJICAvKio8IERlc2lyZWQgc2l6ZSBmb3IgYnVmZmVycyAqLwogCWludCBfX3VzZXIgKnJlcXVlc3RfaW5kaWNlczsJICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLwogCWludCBfX3VzZXIgKnJlcXVlc3Rfc2l6ZXM7CiAJaW50IGdyYW50ZWRfY291bnQ7CQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgZ3JhbnRlZCAqLwotfSBkcm1fZG1hX3Q7Cit9OwogCi10eXBlZGVmIGVudW0geworZW51bSBkcm1fY3R4X2ZsYWdzIHsKIAlfRFJNX0NPTlRFWFRfUFJFU0VSVkVEID0gMHgwMSwKIAlfRFJNX0NPTlRFWFRfMkRPTkxZID0gMHgwMgotfSBkcm1fY3R4X2ZsYWdzX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9BRERfQ1RYIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUNyZWF0ZUNvbnRleHQoKSBhbmQgZHJtRGVzdHJveUNvbnRleHQoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eCB7CitzdHJ1Y3QgZHJtX2N0eCB7CiAJZHJtX2NvbnRleHRfdCBoYW5kbGU7Ci0JZHJtX2N0eF9mbGFnc190IGZsYWdzOwotfSBkcm1fY3R4X3Q7CisJZW51bSBkcm1fY3R4X2ZsYWdzIGZsYWdzOworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfUkVTX0NUWCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3JlcyB7CitzdHJ1Y3QgZHJtX2N0eF9yZXMgewogCWludCBjb3VudDsKLQlkcm1fY3R4X3QgX191c2VyICpjb250ZXh0czsKLX0gZHJtX2N0eF9yZXNfdDsKKwlzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKmNvbnRleHRzOworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUREX0RSQVcgYW5kIERSTV9JT0NUTF9STV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9kcmF3IHsKK3N0cnVjdCBkcm1fZHJhdyB7CiAJZHJtX2RyYXdhYmxlX3QgaGFuZGxlOwotfSBkcm1fZHJhd190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfVVBEQVRFX0RSQVcgaW9jdGwgYXJndW1lbnQgdHlwZS4KQEAgLTQ1OSw1MiArNDU5LDUyIEBACiAJRFJNX0RSQVdBQkxFX0NMSVBSRUNUUywKIH0gZHJtX2RyYXdhYmxlX2luZm9fdHlwZV90OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcgeworc3RydWN0IGRybV91cGRhdGVfZHJhdyB7CiAJZHJtX2RyYXdhYmxlX3QgaGFuZGxlOwogCXVuc2lnbmVkIGludCB0eXBlOwogCXVuc2lnbmVkIGludCBudW07CiAJdW5zaWduZWQgbG9uZyBsb25nIGRhdGE7Ci19IGRybV91cGRhdGVfZHJhd190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX01BR0lDIGFuZCBEUk1fSU9DVExfQVVUSF9NQUdJQyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYXV0aCB7CitzdHJ1Y3QgZHJtX2F1dGggewogCWRybV9tYWdpY190IG1hZ2ljOwotfSBkcm1fYXV0aF90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfSVJRX0JVU0lEIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUdldEludGVycnVwdEZyb21CdXNJRCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1faXJxX2J1c2lkIHsKK3N0cnVjdCBkcm1faXJxX2J1c2lkIHsKIAlpbnQgaXJxOwkvKio8IElSUSBudW1iZXIgKi8KIAlpbnQgYnVzbnVtOwkvKio8IGJ1cyBudW1iZXIgKi8KIAlpbnQgZGV2bnVtOwkvKio8IGRldmljZSBudW1iZXIgKi8KIAlpbnQgZnVuY251bTsJLyoqPCBmdW5jdGlvbiBudW1iZXIgKi8KLX0gZHJtX2lycV9idXNpZF90OworfTsKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gZHJtX3ZibGFua19zZXFfdHlwZSB7CiAJX0RSTV9WQkxBTktfQUJTT0xVVEUgPSAweDAsCS8qKjwgV2FpdCBmb3Igc3BlY2lmaWMgdmJsYW5rIHNlcXVlbmNlIG51bWJlciAqLwogCV9EUk1fVkJMQU5LX1JFTEFUSVZFID0gMHgxLAkvKio8IFdhaXQgZm9yIGdpdmVuIG51bWJlciBvZiB2YmxhbmtzICovCiAJX0RSTV9WQkxBTktfTkVYVE9OTUlTUyA9IDB4MTAwMDAwMDAsCS8qKjwgSWYgbWlzc2VkLCB3YWl0IGZvciBuZXh0IHZibGFuayAqLwogCV9EUk1fVkJMQU5LX1NFQ09OREFSWSA9IDB4MjAwMDAwMDAsCS8qKjwgU2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlciAqLwogCV9EUk1fVkJMQU5LX1NJR05BTCA9IDB4NDAwMDAwMDAJLyoqPCBTZW5kIHNpZ25hbCBpbnN0ZWFkIG9mIGJsb2NraW5nICovCi19IGRybV92Ymxhbmtfc2VxX3R5cGVfdDsKK307CiAKICNkZWZpbmUgX0RSTV9WQkxBTktfVFlQRVNfTUFTSyAoX0RSTV9WQkxBTktfQUJTT0xVVEUgfCBfRFJNX1ZCTEFOS19SRUxBVElWRSkKICNkZWZpbmUgX0RSTV9WQkxBTktfRkxBR1NfTUFTSyAoX0RSTV9WQkxBTktfU0lHTkFMIHwgX0RSTV9WQkxBTktfU0VDT05EQVJZIHwgXAogCQkJCV9EUk1fVkJMQU5LX05FWFRPTk1JU1MpCiAKIHN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdCB7Ci0JZHJtX3ZibGFua19zZXFfdHlwZV90IHR5cGU7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogCXVuc2lnbmVkIGxvbmcgc2lnbmFsOwogfTsKIAogc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSB7Ci0JZHJtX3ZibGFua19zZXFfdHlwZV90IHR5cGU7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogCWxvbmcgdHZhbF9zZWM7CiAJbG9uZyB0dmFsX3VzZWM7CkBAIC01MTUsNDEgKzUxNSw0MSBAQAogICoKICAqIFxzYSBkcm1XYWl0VkJsYW5rKCkuCiAgKi8KLXR5cGVkZWYgdW5pb24gZHJtX3dhaXRfdmJsYW5rIHsKK3VuaW9uIGRybV93YWl0X3ZibGFuayB7CiAJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHJlcXVlc3Q7CiAJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSByZXBseTsKLX0gZHJtX3dhaXRfdmJsYW5rX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9BR1BfRU5BQkxFIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUFncEVuYWJsZSgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21vZGUgeworc3RydWN0IGRybV9hZ3BfbW9kZSB7CiAJdW5zaWduZWQgbG9uZyBtb2RlOwkvKio8IEFHUCBtb2RlICovCi19IGRybV9hZ3BfbW9kZV90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUdQX0FMTE9DIGFuZCBEUk1fSU9DVExfQUdQX0ZSRUUgaW9jdGxzIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUFncEFsbG9jKCkgYW5kIGRybUFncEZyZWUoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgeworc3RydWN0IGRybV9hZ3BfYnVmZmVyIHsKIAl1bnNpZ25lZCBsb25nIHNpemU7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCiAJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgVXNlZCBmb3IgYmluZGluZyAvIHVuYmluZGluZyAqLwogCXVuc2lnbmVkIGxvbmcgdHlwZTsJLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAqLwogCXVuc2lnbmVkIGxvbmcgcGh5c2ljYWw7CS8qKjwgUGh5c2ljYWwgdXNlZCBieSBpODEwICovCi19IGRybV9hZ3BfYnVmZmVyX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9BR1BfQklORCBhbmQgRFJNX0lPQ1RMX0FHUF9VTkJJTkQgaW9jdGxzIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUFncEJpbmQoKSBhbmQgZHJtQWdwVW5iaW5kKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfYmluZGluZyB7CitzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIHsKIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBGcm9tIGRybV9hZ3BfYnVmZmVyICovCiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCi19IGRybV9hZ3BfYmluZGluZ190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwgYXJndW1lbnQgdHlwZS4KQEAgLTU1OCw3ICs1NTgsNyBAQAogICogZHJtQWdwQmFzZSgpLCBkcm1BZ3BTaXplKCksIGRybUFncE1lbW9yeVVzZWQoKSwgZHJtQWdwTWVtb3J5QXZhaWwoKSwKICAqIGRybUFncFZlbmRvcklkKCkgYW5kIGRybUFncERldmljZUlkKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfaW5mbyB7CitzdHJ1Y3QgZHJtX2FncF9pbmZvIHsKIAlpbnQgYWdwX3ZlcnNpb25fbWFqb3I7CiAJaW50IGFncF92ZXJzaW9uX21pbm9yOwogCXVuc2lnbmVkIGxvbmcgbW9kZTsKQEAgLTU3MCwyNSArNTcwLDI1IEBACiAJLyogUENJIGluZm9ybWF0aW9uICovCiAJdW5zaWduZWQgc2hvcnQgaWRfdmVuZG9yOwogCXVuc2lnbmVkIHNob3J0IGlkX2RldmljZTsKLX0gZHJtX2FncF9pbmZvX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9TR19BTExPQyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgeworc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciB7CiAJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLwogCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIG1hcHBpbmcgLyB1bm1hcHBpbmcgKi8KLX0gZHJtX3NjYXR0ZXJfZ2F0aGVyX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9TRVRfVkVSU0lPTiBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc2V0X3ZlcnNpb24geworc3RydWN0IGRybV9zZXRfdmVyc2lvbiB7CiAJaW50IGRybV9kaV9tYWpvcjsKIAlpbnQgZHJtX2RpX21pbm9yOwogCWludCBkcm1fZGRfbWFqb3I7CiAJaW50IGRybV9kZF9taW5vcjsKLX0gZHJtX3NldF92ZXJzaW9uX3Q7Cit9OwogCiAjZGVmaW5lIERSTV9JT0NUTF9CQVNFCQkJJ2QnCiAjZGVmaW5lIERSTV9JTyhucikJCQlfSU8oRFJNX0lPQ1RMX0JBU0UsbnIpCkBAIC01OTYsNjEgKzU5Niw2MSBAQAogI2RlZmluZSBEUk1fSU9XKG5yLHR5cGUpCQlfSU9XKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCiAjZGVmaW5lIERSTV9JT1dSKG5yLHR5cGUpCQlfSU9XUihEUk1fSU9DVExfQkFTRSxucix0eXBlKQogCi0jZGVmaW5lIERSTV9JT0NUTF9WRVJTSU9OCQlEUk1fSU9XUigweDAwLCBkcm1fdmVyc2lvbl90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX1VOSVFVRQkJRFJNX0lPV1IoMHgwMSwgZHJtX3VuaXF1ZV90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX01BR0lDCQlEUk1fSU9SKCAweDAyLCBkcm1fYXV0aF90KQotI2RlZmluZSBEUk1fSU9DVExfSVJRX0JVU0lECQlEUk1fSU9XUigweDAzLCBkcm1faXJxX2J1c2lkX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFQICAgICAgICAgICAgICAgRFJNX0lPV1IoMHgwNCwgZHJtX21hcF90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX0NMSUVOVCAgICAgICAgICAgIERSTV9JT1dSKDB4MDUsIGRybV9jbGllbnRfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TVEFUUyAgICAgICAgICAgICBEUk1fSU9SKCAweDA2LCBkcm1fc3RhdHNfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9WRVJTSU9OCQlEUk1fSU9XUigweDA3LCBkcm1fc2V0X3ZlcnNpb25fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZFUlNJT04JCURSTV9JT1dSKDB4MDAsIHN0cnVjdCBkcm1fdmVyc2lvbikKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9VTklRVUUJCURSTV9JT1dSKDB4MDEsIHN0cnVjdCBkcm1fdW5pcXVlKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX01BR0lDCQlEUk1fSU9SKCAweDAyLCBzdHJ1Y3QgZHJtX2F1dGgpCisjZGVmaW5lIERSTV9JT0NUTF9JUlFfQlVTSUQJCURSTV9JT1dSKDB4MDMsIHN0cnVjdCBkcm1faXJxX2J1c2lkKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX01BUCAgICAgICAgICAgICAgIERSTV9JT1dSKDB4MDQsIHN0cnVjdCBkcm1fbWFwKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX0NMSUVOVCAgICAgICAgICAgIERSTV9JT1dSKDB4MDUsIHN0cnVjdCBkcm1fY2xpZW50KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NUQVRTICAgICAgICAgICAgIERSTV9JT1IoIDB4MDYsIHN0cnVjdCBkcm1fc3RhdHMpCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVkVSU0lPTgkJRFJNX0lPV1IoMHgwNywgc3RydWN0IGRybV9zZXRfdmVyc2lvbikKIAotI2RlZmluZSBEUk1fSU9DVExfU0VUX1VOSVFVRQkJRFJNX0lPVyggMHgxMCwgZHJtX3VuaXF1ZV90KQotI2RlZmluZSBEUk1fSU9DVExfQVVUSF9NQUdJQwkJRFJNX0lPVyggMHgxMSwgZHJtX2F1dGhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0JMT0NLCQkJRFJNX0lPV1IoMHgxMiwgZHJtX2Jsb2NrX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9VTkJMT0NLCQlEUk1fSU9XUigweDEzLCBkcm1fYmxvY2tfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0NPTlRST0wJCURSTV9JT1coIDB4MTQsIGRybV9jb250cm9sX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BRERfTUFQCQlEUk1fSU9XUigweDE1LCBkcm1fbWFwX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BRERfQlVGUwkJRFJNX0lPV1IoMHgxNiwgZHJtX2J1Zl9kZXNjX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9NQVJLX0JVRlMJCURSTV9JT1coIDB4MTcsIGRybV9idWZfZGVzY190KQotI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTCQlEUk1fSU9XUigweDE4LCBkcm1fYnVmX2luZm9fdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX01BUF9CVUZTCQlEUk1fSU9XUigweDE5LCBkcm1fYnVmX21hcF90KQotI2RlZmluZSBEUk1fSU9DVExfRlJFRV9CVUZTCQlEUk1fSU9XKCAweDFhLCBkcm1fYnVmX2ZyZWVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9VTklRVUUJCURSTV9JT1coIDB4MTAsIHN0cnVjdCBkcm1fdW5pcXVlKQorI2RlZmluZSBEUk1fSU9DVExfQVVUSF9NQUdJQwkJRFJNX0lPVyggMHgxMSwgc3RydWN0IGRybV9hdXRoKQorI2RlZmluZSBEUk1fSU9DVExfQkxPQ0sJCQlEUk1fSU9XUigweDEyLCBzdHJ1Y3QgZHJtX2Jsb2NrKQorI2RlZmluZSBEUk1fSU9DVExfVU5CTE9DSwkJRFJNX0lPV1IoMHgxMywgc3RydWN0IGRybV9ibG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX0NPTlRST0wJCURSTV9JT1coIDB4MTQsIHN0cnVjdCBkcm1fY29udHJvbCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9NQVAJCURSTV9JT1dSKDB4MTUsIHN0cnVjdCBkcm1fbWFwKQorI2RlZmluZSBEUk1fSU9DVExfQUREX0JVRlMJCURSTV9JT1dSKDB4MTYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MpCisjZGVmaW5lIERSTV9JT0NUTF9NQVJLX0JVRlMJCURSTV9JT1coIDB4MTcsIHN0cnVjdCBkcm1fYnVmX2Rlc2MpCisjZGVmaW5lIERSTV9JT0NUTF9JTkZPX0JVRlMJCURSTV9JT1dSKDB4MTgsIHN0cnVjdCBkcm1fYnVmX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9NQVBfQlVGUwkJRFJNX0lPV1IoMHgxOSwgc3RydWN0IGRybV9idWZfbWFwKQorI2RlZmluZSBEUk1fSU9DVExfRlJFRV9CVUZTCQlEUk1fSU9XKCAweDFhLCBzdHJ1Y3QgZHJtX2J1Zl9mcmVlKQogCi0jZGVmaW5lIERSTV9JT0NUTF9STV9NQVAJCURSTV9JT1coIDB4MWIsIGRybV9tYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX01BUAkJRFJNX0lPVyggMHgxYiwgc3RydWN0IGRybV9tYXApCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9TQVJFQV9DVFgJCURSTV9JT1coIDB4MWMsIGRybV9jdHhfcHJpdl9tYXBfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFggCURSTV9JT1dSKDB4MWQsIGRybV9jdHhfcHJpdl9tYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9TQVJFQV9DVFgJCURSTV9JT1coIDB4MWMsIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCAJRFJNX0lPV1IoMHgxZCwgc3RydWN0IGRybV9jdHhfcHJpdl9tYXApCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX0FERF9DVFgJCURSTV9JT1dSKDB4MjAsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1JNX0NUWAkJRFJNX0lPV1IoMHgyMSwgZHJtX2N0eF90KQotI2RlZmluZSBEUk1fSU9DVExfTU9EX0NUWAkJRFJNX0lPVyggMHgyMiwgZHJtX2N0eF90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX0NUWAkJRFJNX0lPV1IoMHgyMywgZHJtX2N0eF90KQotI2RlZmluZSBEUk1fSU9DVExfU1dJVENIX0NUWAkJRFJNX0lPVyggMHgyNCwgZHJtX2N0eF90KQotI2RlZmluZSBEUk1fSU9DVExfTkVXX0NUWAkJRFJNX0lPVyggMHgyNSwgZHJtX2N0eF90KQotI2RlZmluZSBEUk1fSU9DVExfUkVTX0NUWAkJRFJNX0lPV1IoMHgyNiwgZHJtX2N0eF9yZXNfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FERF9EUkFXCQlEUk1fSU9XUigweDI3LCBkcm1fZHJhd190KQotI2RlZmluZSBEUk1fSU9DVExfUk1fRFJBVwkJRFJNX0lPV1IoMHgyOCwgZHJtX2RyYXdfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0RNQQkJCURSTV9JT1dSKDB4MjksIGRybV9kbWFfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0xPQ0sJCQlEUk1fSU9XKCAweDJhLCBkcm1fbG9ja190KQotI2RlZmluZSBEUk1fSU9DVExfVU5MT0NLCQlEUk1fSU9XKCAweDJiLCBkcm1fbG9ja190KQotI2RlZmluZSBEUk1fSU9DVExfRklOSVNICQlEUk1fSU9XKCAweDJjLCBkcm1fbG9ja190KQorI2RlZmluZSBEUk1fSU9DVExfQUREX0NUWAkJRFJNX0lPV1IoMHgyMCwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9STV9DVFgJCURSTV9JT1dSKDB4MjEsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfTU9EX0NUWAkJRFJNX0lPVyggMHgyMiwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ1RYCQlEUk1fSU9XUigweDIzLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NXSVRDSF9DVFgJCURSTV9JT1coIDB4MjQsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfTkVXX0NUWAkJRFJNX0lPVyggMHgyNSwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9SRVNfQ1RYCQlEUk1fSU9XUigweDI2LCBzdHJ1Y3QgZHJtX2N0eF9yZXMpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfRFJBVwkJRFJNX0lPV1IoMHgyNywgc3RydWN0IGRybV9kcmF3KQorI2RlZmluZSBEUk1fSU9DVExfUk1fRFJBVwkJRFJNX0lPV1IoMHgyOCwgc3RydWN0IGRybV9kcmF3KQorI2RlZmluZSBEUk1fSU9DVExfRE1BCQkJRFJNX0lPV1IoMHgyOSwgc3RydWN0IGRybV9kbWEpCisjZGVmaW5lIERSTV9JT0NUTF9MT0NLCQkJRFJNX0lPVyggMHgyYSwgc3RydWN0IGRybV9sb2NrKQorI2RlZmluZSBEUk1fSU9DVExfVU5MT0NLCQlEUk1fSU9XKCAweDJiLCBzdHJ1Y3QgZHJtX2xvY2spCisjZGVmaW5lIERSTV9JT0NUTF9GSU5JU0gJCURSTV9JT1coIDB4MmMsIHN0cnVjdCBkcm1fbG9jaykKIAogI2RlZmluZSBEUk1fSU9DVExfQUdQX0FDUVVJUkUJCURSTV9JTyggIDB4MzApCiAjZGVmaW5lIERSTV9JT0NUTF9BR1BfUkVMRUFTRQkJRFJNX0lPKCAgMHgzMSkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9FTkFCTEUJCURSTV9JT1coIDB4MzIsIGRybV9hZ3BfbW9kZV90KQotI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8JCURSTV9JT1IoIDB4MzMsIGRybV9hZ3BfaW5mb190KQotI2RlZmluZSBEUk1fSU9DVExfQUdQX0FMTE9DCQlEUk1fSU9XUigweDM0LCBkcm1fYWdwX2J1ZmZlcl90KQotI2RlZmluZSBEUk1fSU9DVExfQUdQX0ZSRUUJCURSTV9JT1coIDB4MzUsIGRybV9hZ3BfYnVmZmVyX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORAkJRFJNX0lPVyggMHgzNiwgZHJtX2FncF9iaW5kaW5nX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BR1BfVU5CSU5ECQlEUk1fSU9XKCAweDM3LCBkcm1fYWdwX2JpbmRpbmdfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9FTkFCTEUJCURSTV9JT1coIDB4MzIsIHN0cnVjdCBkcm1fYWdwX21vZGUpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfSU5GTwkJRFJNX0lPUiggMHgzMywgc3RydWN0IGRybV9hZ3BfaW5mbykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BTExPQwkJRFJNX0lPV1IoMHgzNCwgc3RydWN0IGRybV9hZ3BfYnVmZmVyKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0ZSRUUJCURSTV9JT1coIDB4MzUsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9CSU5ECQlEUk1fSU9XKCAweDM2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX1VOQklORAkJRFJNX0lPVyggMHgzNywgc3RydWN0IGRybV9hZ3BfYmluZGluZykKIAotI2RlZmluZSBEUk1fSU9DVExfU0dfQUxMT0MJCURSTV9JT1coIDB4MzgsIGRybV9zY2F0dGVyX2dhdGhlcl90KQotI2RlZmluZSBEUk1fSU9DVExfU0dfRlJFRQkJRFJNX0lPVyggMHgzOSwgZHJtX3NjYXR0ZXJfZ2F0aGVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TR19BTExPQwkJRFJNX0lPVyggMHgzOCwgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX1NHX0ZSRUUJCURSTV9JT1coIDB4MzksIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIpCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LCQlEUk1fSU9XUigweDNhLCBkcm1fd2FpdF92YmxhbmtfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LCQlEUk1fSU9XUigweDNhLCB1bmlvbiBkcm1fd2FpdF92YmxhbmspCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1VQREFURV9EUkFXCQlEUk1fSU9XKDB4M2YsIGRybV91cGRhdGVfZHJhd190KQorI2RlZmluZSBEUk1fSU9DVExfVVBEQVRFX0RSQVcJCURSTV9JT1coMHgzZiwgc3RydWN0IGRybV91cGRhdGVfZHJhdykKIAogLyoqCiAgKiBEZXZpY2Ugc3BlY2lmaWMgaW9jdGxzIHNob3VsZCBvbmx5IGJlIGluIHRoZWlyIHJlc3BlY3RpdmUgaGVhZGVycwpAQCAtNjYzLDQgKzY2Myw0OSBAQAogI2RlZmluZSBEUk1fQ09NTUFORF9CQVNFICAgICAgICAgICAgICAgIDB4NDAKICNkZWZpbmUgRFJNX0NPTU1BTkRfRU5ECQkJMHhBMAogCisvKiB0eXBlZGVmIGFyZWEgKi8KKyNpZm5kZWYgX19LRVJORUxfXwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBkcm1fY2xpcF9yZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyBkcm1fZHJhd2FibGVfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3RleF9yZWdpb24gZHJtX3RleF9yZWdpb25fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9od19sb2NrIGRybV9od19sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdmVyc2lvbiBkcm1fdmVyc2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VuaXF1ZSBkcm1fdW5pcXVlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbGlzdCBkcm1fbGlzdF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2Jsb2NrIGRybV9ibG9ja190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NvbnRyb2wgZHJtX2NvbnRyb2xfdDsKK3R5cGVkZWYgZW51bSBkcm1fbWFwX3R5cGUgZHJtX21hcF90eXBlX3Q7Cit0eXBlZGVmIGVudW0gZHJtX21hcF9mbGFncyBkcm1fbWFwX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIGRybV9jdHhfcHJpdl9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9tYXAgZHJtX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaWVudCBkcm1fY2xpZW50X3Q7Cit0eXBlZGVmIGVudW0gZHJtX3N0YXRfdHlwZSBkcm1fc3RhdF90eXBlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc3RhdHMgZHJtX3N0YXRzX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2xvY2tfZmxhZ3MgZHJtX2xvY2tfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9sb2NrIGRybV9sb2NrX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2RtYV9mbGFncyBkcm1fZG1hX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2Rlc2MgZHJtX2J1Zl9kZXNjX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2luZm8gZHJtX2J1Zl9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2ZyZWUgZHJtX2J1Zl9mcmVlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX3B1YiBkcm1fYnVmX3B1Yl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9tYXAgZHJtX2J1Zl9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kbWEgZHJtX2RtYV90OwordHlwZWRlZiB1bmlvbiBkcm1fd2FpdF92YmxhbmsgZHJtX3dhaXRfdmJsYW5rX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21vZGUgZHJtX2FncF9tb2RlX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2N0eF9mbGFncyBkcm1fY3R4X2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4IGRybV9jdHhfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcmVzIGRybV9jdHhfcmVzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZHJhdyBkcm1fZHJhd190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IGRybV91cGRhdGVfZHJhd190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2F1dGggZHJtX2F1dGhfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9pcnFfYnVzaWQgZHJtX2lycV9idXNpZF90OwordHlwZWRlZiBlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgZHJtX3ZibGFua19zZXFfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciBkcm1fYWdwX2J1ZmZlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIGRybV9hZ3BfYmluZGluZ190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9pbmZvIGRybV9hZ3BfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIGRybV9zY2F0dGVyX2dhdGhlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIGRybV9zZXRfdmVyc2lvbl90OworI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAppbmRleCBkNDk0MzE1Li4wZGY4N2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaApAQCAtNzUsNiArNzUsOCBAQAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSAiZHJtLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKwogI2RlZmluZSBfX09TX0hBU19BR1AgKGRlZmluZWQoQ09ORklHX0FHUCkgfHwgKGRlZmluZWQoQ09ORklHX0FHUF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkpCiAjZGVmaW5lIF9fT1NfSEFTX01UUlIgKGRlZmluZWQoQ09ORklHX01UUlIpKQogCkBAIC0yNzQsMzIgKzI3NiwyMyBAQAogCWludCBmbGFnczsKIH0gZHJtX2lvY3RsX2Rlc2NfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2RldnN0YXRlIHsKLQlwaWRfdCBvd25lcjsJCQkvKio8IFggc2VydmVyIHBpZCBob2xkaW5nIHhfbG9jayAqLwotfSBkcm1fZGV2c3RhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5IHsKLQlkcm1faGFzaF9pdGVtX3QgaGFzaF9pdGVtOworc3RydWN0IGRybV9tYWdpY19lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCBkcm1faGFzaF9pdGVtIGhhc2hfaXRlbTsKIAlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXY7CiAJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqbmV4dDsKLX0gZHJtX21hZ2ljX2VudHJ5X3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fbWFnaWNfaGVhZCB7Ci0Jc3RydWN0IGRybV9tYWdpY19lbnRyeSAqaGVhZDsKLQlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICp0YWlsOwotfSBkcm1fbWFnaWNfaGVhZF90OwotCi10eXBlZGVmIHN0cnVjdCBkcm1fdm1hX2VudHJ5IHsKK3N0cnVjdCBkcm1fdm1hX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Ci0Jc3RydWN0IGRybV92bWFfZW50cnkgKm5leHQ7CiAJcGlkX3QgcGlkOwotfSBkcm1fdm1hX2VudHJ5X3Q7Cit9OwogCiAvKioKICAqIERNQSBidWZmZXIuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWYgeworc3RydWN0IGRybV9idWYgewogCWludCBpZHg7CQkgICAgICAgLyoqPCBJbmRleCBpbnRvIG1hc3RlciBidWZsaXN0ICovCiAJaW50IHRvdGFsOwkJICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KIAlpbnQgb3JkZXI7CQkgICAgICAgLyoqPCBsb2ctYmFzZS0yKHRvdGFsKSAqLwpAQCAtMzI1LDMwICszMTgsMzAgQEAKIAogCWludCBkZXZfcHJpdl9zaXplOwkJIC8qKjwgU2l6ZSBvZiBidWZmZXIgcHJpdmF0ZSBzdG9yYWdlICovCiAJdm9pZCAqZGV2X3ByaXZhdGU7CQkgLyoqPCBQZXItYnVmZmVyIHByaXZhdGUgc3RvcmFnZSAqLwotfSBkcm1fYnVmX3Q7Cit9OwogCiAvKiogYnVmcyBpcyBvbmUgbG9uZ2VyIHRoYW4gaXQgaGFzIHRvIGJlICovCi10eXBlZGVmIHN0cnVjdCBkcm1fd2FpdGxpc3Qgeworc3RydWN0IGRybV93YWl0bGlzdCB7CiAJaW50IGNvdW50OwkJCS8qKjwgTnVtYmVyIG9mIHBvc3NpYmxlIGJ1ZmZlcnMgKi8KLQlkcm1fYnVmX3QgKipidWZzOwkJLyoqPCBMaXN0IG9mIHBvaW50ZXJzIHRvIGJ1ZmZlcnMgKi8KLQlkcm1fYnVmX3QgKipycDsJCQkvKio8IFJlYWQgcG9pbnRlciAqLwotCWRybV9idWZfdCAqKndwOwkJCS8qKjwgV3JpdGUgcG9pbnRlciAqLwotCWRybV9idWZfdCAqKmVuZDsJCS8qKjwgRW5kIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKmJ1ZnM7CQkvKio8IExpc3Qgb2YgcG9pbnRlcnMgdG8gYnVmZmVycyAqLworCXN0cnVjdCBkcm1fYnVmICoqcnA7CQkJLyoqPCBSZWFkIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKndwOwkJCS8qKjwgV3JpdGUgcG9pbnRlciAqLworCXN0cnVjdCBkcm1fYnVmICoqZW5kOwkJLyoqPCBFbmQgcG9pbnRlciAqLwogCXNwaW5sb2NrX3QgcmVhZF9sb2NrOwogCXNwaW5sb2NrX3Qgd3JpdGVfbG9jazsKLX0gZHJtX3dhaXRsaXN0X3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fZnJlZWxpc3Qgeworc3RydWN0IGRybV9mcmVlbGlzdCB7CiAJaW50IGluaXRpYWxpemVkOwkgICAgICAgLyoqPCBGcmVlbGlzdCBpbiB1c2UgKi8KIAlhdG9taWNfdCBjb3VudDsJCSAgICAgICAvKio8IE51bWJlciBvZiBmcmVlIGJ1ZmZlcnMgKi8KLQlkcm1fYnVmX3QgKm5leHQ7CSAgICAgICAvKio8IEVuZCBwb2ludGVyICovCisJc3RydWN0IGRybV9idWYgKm5leHQ7CSAgICAgICAvKio8IEVuZCBwb2ludGVyICovCiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0aW5nOyAgICAgLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBmcmVlIGJ1ZnMgKi8KIAlpbnQgbG93X21hcms7CQkgICAgICAgLyoqPCBMb3cgd2F0ZXIgbWFyayAqLwogCWludCBoaWdoX21hcms7CQkgICAgICAgLyoqPCBIaWdoIHdhdGVyIG1hcmsgKi8KIAlhdG9taWNfdCB3Zmg7CQkgICAgICAgLyoqPCBJZiB3YWl0aW5nIGZvciBoaWdoIG1hcmsgKi8KIAlzcGlubG9ja190IGxvY2s7Ci19IGRybV9mcmVlbGlzdF90OworfTsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2RtYV9oYW5kbGUgewogCWRtYV9hZGRyX3QgYnVzYWRkcjsKQEAgLTM1OSwxOSArMzUyLDE5IEBACiAvKioKICAqIEJ1ZmZlciBlbnRyeS4gIFRoZXJlIGlzIG9uZSBvZiB0aGlzIGZvciBlYWNoIGJ1ZmZlciBzaXplIG9yZGVyLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2VudHJ5IHsKK3N0cnVjdCBkcm1fYnVmX2VudHJ5IHsKIAlpbnQgYnVmX3NpemU7CQkJLyoqPCBzaXplICovCiAJaW50IGJ1Zl9jb3VudDsJCQkvKio8IG51bWJlciBvZiBidWZmZXJzICovCi0JZHJtX2J1Zl90ICpidWZsaXN0OwkJLyoqPCBidWZmZXIgbGlzdCAqLworCXN0cnVjdCBkcm1fYnVmICpidWZsaXN0OwkJLyoqPCBidWZmZXIgbGlzdCAqLwogCWludCBzZWdfY291bnQ7CiAJaW50IHBhZ2Vfb3JkZXI7Ci0JZHJtX2RtYV9oYW5kbGVfdCAqKnNlZ2xpc3Q7CisJc3RydWN0IGRybV9kbWFfaGFuZGxlICoqc2VnbGlzdDsKIAotCWRybV9mcmVlbGlzdF90IGZyZWVsaXN0OwotfSBkcm1fYnVmX2VudHJ5X3Q7CisJc3RydWN0IGRybV9mcmVlbGlzdCBmcmVlbGlzdDsKK307CiAKIC8qKiBGaWxlIHByaXZhdGUgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2ZpbGUgeworc3RydWN0IGRybV9maWxlIHsKIAlpbnQgYXV0aGVudGljYXRlZDsKIAlpbnQgbWFzdGVyOwogCWludCBtaW5vcjsKQEAgLTM3OSwxNiArMzcyLDE1IEBACiAJdWlkX3QgdWlkOwogCWRybV9tYWdpY190IG1hZ2ljOwogCXVuc2lnbmVkIGxvbmcgaW9jdGxfY291bnQ7Ci0Jc3RydWN0IGRybV9maWxlICpuZXh0OwotCXN0cnVjdCBkcm1fZmlsZSAqcHJldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxoZWFkOwogCXN0cnVjdCBkcm1faGVhZCAqaGVhZDsKIAlpbnQgcmVtb3ZlX2F1dGhfb25fY2xvc2U7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2NvdW50OwogCXZvaWQgKmRyaXZlcl9wcml2OwotfSBkcm1fZmlsZV90OworfTsKIAogLyoqIFdhaXQgcXVldWUgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9xdWV1ZSB7CitzdHJ1Y3QgZHJtX3F1ZXVlIHsKIAlhdG9taWNfdCB1c2VfY291bnQ7CQkvKio8IE91dHN0YW5kaW5nIHVzZXMgKCsxKSAqLwogCWF0b21pY190IGZpbmFsaXphdGlvbjsJCS8qKjwgRmluYWxpemF0aW9uIGluIHByb2dyZXNzICovCiAJYXRvbWljX3QgYmxvY2tfY291bnQ7CQkvKio8IENvdW50IG9mIHByb2Nlc3NlcyB3YWl0aW5nICovCkBAIC00MDEsMTYgKzM5MywxNiBAQAogCWF0b21pY190IHRvdGFsX2ZsdXNoZWQ7CQkvKio8IFRvdGFsIGZsdXNoZXMgc3RhdGlzdGljICovCiAJYXRvbWljX3QgdG90YWxfbG9ja3M7CQkvKio8IFRvdGFsIGxvY2tzIHN0YXRpc3RpY3MgKi8KICNlbmRpZgotCWRybV9jdHhfZmxhZ3NfdCBmbGFnczsJCS8qKjwgQ29udGV4dCBwcmVzZXJ2aW5nIGFuZCAyRC1vbmx5ICovCi0JZHJtX3dhaXRsaXN0X3Qgd2FpdGxpc3Q7CS8qKjwgUGVuZGluZyBidWZmZXJzICovCisJZW51bSBkcm1fY3R4X2ZsYWdzIGZsYWdzOwkvKio8IENvbnRleHQgcHJlc2VydmluZyBhbmQgMkQtb25seSAqLworCXN0cnVjdCBkcm1fd2FpdGxpc3Qgd2FpdGxpc3Q7CS8qKjwgUGVuZGluZyBidWZmZXJzICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgZmx1c2hfcXVldWU7CS8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgdW50aWwgZmx1c2ggKi8KLX0gZHJtX3F1ZXVlX3Q7Cit9OwogCiAvKioKICAqIExvY2sgZGF0YS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2tfZGF0YSB7Ci0JZHJtX2h3X2xvY2tfdCAqaHdfbG9jazsJCS8qKjwgSGFyZHdhcmUgbG9jayAqLworc3RydWN0IGRybV9sb2NrX2RhdGEgeworCXN0cnVjdCBkcm1faHdfbG9jayAqaHdfbG9jazsJLyoqPCBIYXJkd2FyZSBsb2NrICovCiAJc3RydWN0IGZpbGUgKmZpbHA7CQkvKio8IEZpbGUgZGVzY3Igb2YgbG9jayBob2xkZXIgKDA9a2VybmVsKSAqLwogCXdhaXRfcXVldWVfaGVhZF90IGxvY2tfcXVldWU7CS8qKjwgUXVldWUgb2YgYmxvY2tlZCBwcm9jZXNzZXMgKi8KIAl1bnNpZ25lZCBsb25nIGxvY2tfdGltZTsJLyoqPCBUaW1lIG9mIGxhc3QgbG9jayBpbiBqaWZmaWVzICovCkBAIC00MTgsMTYgKzQxMCwxNiBAQAogCXVpbnQzMl90IGtlcm5lbF93YWl0ZXJzOwogCXVpbnQzMl90IHVzZXJfd2FpdGVyczsKIAlpbnQgaWRsZV9oYXNfbG9jazsKLX0gZHJtX2xvY2tfZGF0YV90OworfTsKIAogLyoqCiAgKiBETUEgZGF0YS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2RldmljZV9kbWEgeworc3RydWN0IGRybV9kZXZpY2VfZG1hIHsKIAotCWRybV9idWZfZW50cnlfdCBidWZzW0RSTV9NQVhfT1JERVIgKyAxXTsJLyoqPCBidWZmZXJzLCBncm91cGVkIGJ5IHRoZWlyIHNpemUgb3JkZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSBidWZzW0RSTV9NQVhfT1JERVIgKyAxXTsJLyoqPCBidWZmZXJzLCBncm91cGVkIGJ5IHRoZWlyIHNpemUgb3JkZXIgKi8KIAlpbnQgYnVmX2NvdW50OwkJCS8qKjwgdG90YWwgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KLQlkcm1fYnVmX3QgKipidWZsaXN0OwkJLyoqPCBWZWN0b3Igb2YgcG9pbnRlcnMgaW50byBkcm1fZGV2aWNlX2RtYTo6YnVmcyAqLworCXN0cnVjdCBkcm1fYnVmICoqYnVmbGlzdDsJCS8qKjwgVmVjdG9yIG9mIHBvaW50ZXJzIGludG8gZHJtX2RldmljZV9kbWE6OmJ1ZnMgKi8KIAlpbnQgc2VnX2NvdW50OwogCWludCBwYWdlX2NvdW50OwkJCS8qKjwgbnVtYmVyIG9mIHBhZ2VzICovCiAJdW5zaWduZWQgbG9uZyAqcGFnZWxpc3Q7CS8qKjwgcGFnZSBsaXN0ICovCkBAIC00MzksMjggKzQzMSwyNyBAQAogCQlfRFJNX0RNQV9VU0VfUENJX1JPID0gMHgwOAogCX0gZmxhZ3M7CiAKLX0gZHJtX2RldmljZV9kbWFfdDsKK307CiAKIC8qKgogICogQUdQIG1lbW9yeSBlbnRyeS4gIFN0b3JlZCBhcyBhIGRvdWJseSBsaW5rZWQgbGlzdC4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9tZW0geworc3RydWN0IGRybV9hZ3BfbWVtIHsKIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsJCS8qKjwgaGFuZGxlICovCiAJRFJNX0FHUF9NRU0gKm1lbW9yeTsKIAl1bnNpZ25lZCBsb25nIGJvdW5kOwkJLyoqPCBhZGRyZXNzICovCiAJaW50IHBhZ2VzOwotCXN0cnVjdCBkcm1fYWdwX21lbSAqcHJldjsJLyoqPCBwcmV2aW91cyBlbnRyeSAqLwotCXN0cnVjdCBkcm1fYWdwX21lbSAqbmV4dDsJLyoqPCBuZXh0IGVudHJ5ICovCi19IGRybV9hZ3BfbWVtX3Q7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworfTsKIAogLyoqCiAgKiBBR1AgZGF0YS4KICAqCiAgKiBcc2EgZHJtX2FncF9pbml0KCkgYW5kIGRybV9kZXZpY2U6OmFncC4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9oZWFkIHsKK3N0cnVjdCBkcm1fYWdwX2hlYWQgewogCURSTV9BR1BfS0VSTiBhZ3BfaW5mbzsJCS8qKjwgQUdQIGRldmljZSBpbmZvcm1hdGlvbiAqLwotCWRybV9hZ3BfbWVtX3QgKm1lbW9yeTsJCS8qKjwgbWVtb3J5IGVudHJpZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1lbW9yeTsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CQkvKio8IEFHUCBtb2RlICovCiAJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOwogCWludCBlbmFibGVkOwkJCS8qKjwgd2hldGhlciB0aGUgQUdQIGJ1cyBhcyBiZWVuIGVuYWJsZWQgKi8KQEAgLTQ2OSw1MSArNDYwLDUxIEBACiAJaW50IGFncF9tdHJyOwogCWludCBjYW50X3VzZV9hcGVydHVyZTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VfbWFzazsKLX0gZHJtX2FncF9oZWFkX3Q7Cit9OwogCiAvKioKICAqIFNjYXR0ZXItZ2F0aGVyIG1lbW9yeS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NnX21lbSB7CitzdHJ1Y3QgZHJtX3NnX21lbSB7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGU7CiAJdm9pZCAqdmlydHVhbDsKIAlpbnQgcGFnZXM7CiAJc3RydWN0IHBhZ2UgKipwYWdlbGlzdDsKIAlkbWFfYWRkcl90ICpidXNhZGRyOwotfSBkcm1fc2dfbWVtX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fc2lnZGF0YSB7CitzdHJ1Y3QgZHJtX3NpZ2RhdGEgewogCWludCBjb250ZXh0OwotCWRybV9od19sb2NrX3QgKmxvY2s7Ci19IGRybV9zaWdkYXRhX3Q7CisJc3RydWN0IGRybV9od19sb2NrICpsb2NrOworfTsKIAogLyoqCiAgKiBNYXBwaW5ncyBsaXN0CiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9tYXBfbGlzdCB7CitzdHJ1Y3QgZHJtX21hcF9saXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CQkvKio8IGxpc3QgaGVhZCAqLwotCWRybV9oYXNoX2l0ZW1fdCBoYXNoOwotCWRybV9tYXBfdCAqbWFwOwkJCS8qKjwgbWFwcGluZyAqLworCXN0cnVjdCBkcm1faGFzaF9pdGVtIGhhc2g7CisJc3RydWN0IGRybV9tYXAgKm1hcDsJCQkvKio8IG1hcHBpbmcgKi8KIAl1bnNpZ25lZCBpbnQgdXNlcl90b2tlbjsKLX0gZHJtX21hcF9saXN0X3Q7Cit9OwogCi10eXBlZGVmIGRybV9tYXBfdCBkcm1fbG9jYWxfbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbWFwIGRybV9sb2NhbF9tYXBfdDsKIAogLyoqCiAgKiBDb250ZXh0IGhhbmRsZSBsaXN0CiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jdHhfbGlzdCB7CitzdHJ1Y3QgZHJtX2N0eF9saXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CQkvKio8IGxpc3QgaGVhZCAqLwogCWRybV9jb250ZXh0X3QgaGFuZGxlOwkJLyoqPCBjb250ZXh0IGhhbmRsZSAqLwotCWRybV9maWxlX3QgKnRhZzsJCS8qKjwgYXNzb2NpYXRlZCBmZCBwcml2YXRlIGRhdGEgKi8KLX0gZHJtX2N0eF9saXN0X3Q7CisJc3RydWN0IGRybV9maWxlICp0YWc7CQkvKio8IGFzc29jaWF0ZWQgZmQgcHJpdmF0ZSBkYXRhICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fdmJsX3NpZyB7CitzdHJ1Y3QgZHJtX3ZibF9zaWcgewogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJc3RydWN0IHNpZ2luZm8gaW5mbzsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci19IGRybV92Ymxfc2lnX3Q7Cit9OwogCiAvKiBsb2NhdGlvbiBvZiBHQVJUIHRhYmxlICovCiAjZGVmaW5lIERSTV9BVElfR0FSVF9NQUlOIDEKQEAgLTUyMywxOSArNTE0LDE5IEBACiAjZGVmaW5lIERSTV9BVElfR0FSVF9QQ0lFIDIKICNkZWZpbmUgRFJNX0FUSV9HQVJUX0lHUCAzCiAKLXR5cGVkZWYgc3RydWN0IGF0aV9wY2lnYXJ0X2luZm8geworc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvIHsKIAlpbnQgZ2FydF90YWJsZV9sb2NhdGlvbjsKIAlpbnQgZ2FydF9yZWdfaWY7CiAJdm9pZCAqYWRkcjsKIAlkbWFfYWRkcl90IGJ1c19hZGRyOwogCWRybV9sb2NhbF9tYXBfdCBtYXBwaW5nOwogCWludCB0YWJsZV9zaXplOwotfSBkcm1fYXRpX3BjaWdhcnRfaW5mbzsKK307CiAKIC8qCiAgKiBHZW5lcmljIG1lbW9yeSBtYW5hZ2VyIHN0cnVjdHMKICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX21tX25vZGUgeworc3RydWN0IGRybV9tbV9ub2RlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZsX2VudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQgbWxfZW50cnk7CiAJaW50IGZyZWU7CkBAIC01NDMsMTIgKzUzNCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAlzdHJ1Y3QgZHJtX21tICptbTsKIAl2b2lkICpwcml2YXRlOwotfSBkcm1fbW1fbm9kZV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX21tIHsKK3N0cnVjdCBkcm1fbW0gewogCXN0cnVjdCBsaXN0X2hlYWQgZmxfZW50cnk7CiAJc3RydWN0IGxpc3RfaGVhZCBtbF9lbnRyeTsKLX0gZHJtX21tX3Q7Cit9OwogCiAvKioKICAqIERSTSBkcml2ZXIgc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnQgdGhlIGNvbW1vbiBjb2RlIGZvcgpAQCAtNTYwLDIxICs1NTEsMjEgQEAKIHN0cnVjdCBkcm1fZHJpdmVyIHsKIAlpbnQgKCpsb2FkKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAJaW50ICgqZmlyc3RvcGVuKSAoc3RydWN0IGRybV9kZXZpY2UgKik7Ci0JaW50ICgqb3BlbikgKHN0cnVjdCBkcm1fZGV2aWNlICosIGRybV9maWxlX3QgKik7CisJaW50ICgqb3BlbikgKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkcm1fZmlsZSAqKTsKIAl2b2lkICgqcHJlY2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwotCXZvaWQgKCpwb3N0Y2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBkcm1fZmlsZV90ICopOworCXZvaWQgKCpwb3N0Y2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKik7CiAJdm9pZCAoKmxhc3RjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKnVubG9hZCkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKmRtYV9pb2N0bCkgKERSTV9JT0NUTF9BUkdTKTsKIAl2b2lkICgqZG1hX3JlYWR5KSAoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJaW50ICgqZG1hX3F1aWVzY2VudCkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwotCWludCAoKmNvbnRleHRfY3RvcikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgY29udGV4dCk7Ci0JaW50ICgqY29udGV4dF9kdG9yKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBjb250ZXh0KTsKLQlpbnQgKCprZXJuZWxfY29udGV4dF9zd2l0Y2gpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG9sZCwKKwlpbnQgKCpjb250ZXh0X2N0b3IpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCk7CisJaW50ICgqY29udGV4dF9kdG9yKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpOworCWludCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvbGQsCiAJCQkJICAgICAgaW50IG5ldyk7Ci0Jdm9pZCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci0JaW50ICgqdmJsYW5rX3dhaXQpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7Ci0JaW50ICgqdmJsYW5rX3dhaXQyKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworCXZvaWQgKCprZXJuZWxfY29udGV4dF9zd2l0Y2hfdW5sb2NrKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJaW50ICgqdmJsYW5rX3dhaXQpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKwlpbnQgKCp2Ymxhbmtfd2FpdDIpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIAlpbnQgKCpkcmlfbGlicmFyeV9uYW1lKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY2hhciAqYnVmKTsKIAogCS8qKgpAQCAtNTg4LDIyICs1NzksMjMgQEAKIAkgKiBjYXJkIGlzIGFic29sdXRlbHkgXGIgbm90IEFHUCAocmV0dXJuIG9mIDApLCBhYnNvbHV0ZWx5IFxiIGlzIEFHUAogCSAqIChyZXR1cm4gb2YgMSksIG9yIG1heSBvciBtYXkgbm90IGJlIEFHUCAocmV0dXJuIG9mIDIpLgogCSAqLwotCWludCAoKmRldmljZV9pc19hZ3ApIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CisJaW50ICgqZGV2aWNlX2lzX2FncCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAJLyogdGhlc2UgaGF2ZSB0byBiZSBmaWxsZWQgaW4gKi8KIAogCWlycXJldHVybl90KCppcnFfaGFuZGxlcikgKERSTV9JUlFfQVJHUyk7Ci0Jdm9pZCAoKmlycV9wcmVpbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCppcnFfcG9zdGluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci0Jdm9pZCAoKmlycV91bmluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci0Jdm9pZCAoKnJlY2xhaW1fYnVmZmVycykgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOworCXZvaWQgKCppcnFfcHJlaW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCppcnFfcG9zdGluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaXJxX3VuaW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnMpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnNfbG9ja2VkKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJc3RydWN0IGZpbGUgKmZpbHApOwogCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnNfaWRsZWxvY2tlZCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBmaWxlICogZmlscCk7Ci0JdW5zaWduZWQgbG9uZyAoKmdldF9tYXBfb2ZzKSAoZHJtX21hcF90ICogbWFwKTsKLQl1bnNpZ25lZCBsb25nICgqZ2V0X3JlZ19vZnMpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci0Jdm9pZCAoKnNldF92ZXJzaW9uKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9zZXRfdmVyc2lvbl90ICogc3YpOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfbWFwX29mcykgKHN0cnVjdCBkcm1fbWFwICogbWFwKTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X3JlZ19vZnMpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkICgqc2V0X3ZlcnNpb24pIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uICpzdik7CiAKIAlpbnQgbWFqb3I7CiAJaW50IG1pbm9yOwpAQCAtNjI1LDE5ICs2MTcsMTkgQEAKICAqIHRoYXQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgaGVhZHMuIEVtYmVkIG9uZSBwZXIgaGVhZCBvZiB0aGVzZSBpbiB0aGUKICAqIHByaXZhdGUgZHJtX2RldmljZSBzdHJ1Y3R1cmUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9oZWFkIHsKK3N0cnVjdCBkcm1faGVhZCB7CiAJaW50IG1pbm9yOwkJCS8qKjwgTWlub3IgZGV2aWNlIG51bWJlciAqLwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZXZfcm9vdDsgIC8qKjwgcHJvYyBkaXJlY3RvcnkgZW50cnkgKi8KIAlkZXZfdCBkZXZpY2U7CQkJLyoqPCBEZXZpY2UgbnVtYmVyIGZvciBta25vZCAqLwogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmRldl9jbGFzczsKLX0gZHJtX2hlYWRfdDsKK307CiAKIC8qKgogICogRFJNIGRldmljZSBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudCBhIGNvbXBsZXRlIGNhcmQgdGhhdAogICogbWF5IGNvbnRhaW4gbXVsdGlwbGUgaGVhZHMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9kZXZpY2Ugeworc3RydWN0IGRybV9kZXZpY2UgewogCWNoYXIgKnVuaXF1ZTsJCQkvKio8IFVuaXF1ZSBpZGVudGlmaWVyOiBlLmcuLCBidXNpZCAqLwogCWludCB1bmlxdWVfbGVuOwkJCS8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSBmaWVsZCAqLwogCWNoYXIgKmRldm5hbWU7CQkJLyoqPCBGb3IgL3Byb2MvaW50ZXJydXB0cyAqLwpAQCAtNjYzLDM1ICs2NTUsMzMgQEAKIAkvKiogXG5hbWUgUGVyZm9ybWFuY2UgY291bnRlcnMgKi8KIAkvKkB7ICovCiAJdW5zaWduZWQgbG9uZyBjb3VudGVyczsKLQlkcm1fc3RhdF90eXBlX3QgdHlwZXNbMTVdOworCWVudW0gZHJtX3N0YXRfdHlwZSB0eXBlc1sxNV07CiAJYXRvbWljX3QgY291bnRzWzE1XTsKIAkvKkB9ICovCiAKIAkvKiogXG5hbWUgQXV0aGVudGljYXRpb24gKi8KIAkvKkB7ICovCi0JZHJtX2ZpbGVfdCAqZmlsZV9maXJzdDsJCS8qKjwgZmlsZSBsaXN0IGhlYWQgKi8KLQlkcm1fZmlsZV90ICpmaWxlX2xhc3Q7CQkvKio8IGZpbGUgbGlzdCB0YWlsICovCi0JZHJtX29wZW5faGFzaF90IG1hZ2ljbGlzdDsJLyoqPCBtYWdpYyBoYXNoIHRhYmxlICovCisJc3RydWN0IGxpc3RfaGVhZCBmaWxlbGlzdDsKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCBtYWdpY2xpc3Q7CS8qKjwgbWFnaWMgaGFzaCB0YWJsZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbWFnaWNmcmVlOwogCS8qQH0gKi8KIAogCS8qKiBcbmFtZSBNZW1vcnkgbWFuYWdlbWVudCAqLwogCS8qQHsgKi8KLQlkcm1fbWFwX2xpc3RfdCAqbWFwbGlzdDsJLyoqPCBMaW5rZWQgbGlzdCBvZiByZWdpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBtYXBsaXN0OwkvKio8IExpbmtlZCBsaXN0IG9mIHJlZ2lvbnMgKi8KIAlpbnQgbWFwX2NvdW50OwkJCS8qKjwgTnVtYmVyIG9mIG1hcHBhYmxlIHJlZ2lvbnMgKi8KLQlkcm1fb3Blbl9oYXNoX3QgbWFwX2hhc2g7CS8qKjwgVXNlciB0b2tlbiBoYXNoIHRhYmxlIGZvciBtYXBzICovCisJc3RydWN0IGRybV9vcGVuX2hhc2ggbWFwX2hhc2g7CS8qKjwgVXNlciB0b2tlbiBoYXNoIHRhYmxlIGZvciBtYXBzICovCiAKIAkvKiogXG5hbWUgQ29udGV4dCBoYW5kbGUgbWFuYWdlbWVudCAqLwogCS8qQHsgKi8KLQlkcm1fY3R4X2xpc3RfdCAqY3R4bGlzdDsJLyoqPCBMaW5rZWQgbGlzdCBvZiBjb250ZXh0IGhhbmRsZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGN0eGxpc3Q7CS8qKjwgTGlua2VkIGxpc3Qgb2YgY29udGV4dCBoYW5kbGVzICovCiAJaW50IGN0eF9jb3VudDsJCQkvKio8IE51bWJlciBvZiBjb250ZXh0IGhhbmRsZXMgKi8KIAlzdHJ1Y3QgbXV0ZXggY3R4bGlzdF9tdXRleDsJLyoqPCBGb3IgY3R4bGlzdCAqLwogCi0JZHJtX21hcF90ICoqY29udGV4dF9zYXJlYXM7CSAgICAvKio8IHBlci1jb250ZXh0IFNBUkVBJ3MgKi8KLQlpbnQgbWF4X2NvbnRleHQ7CisJc3RydWN0IGlkciBjdHhfaWRyOwogCi0JZHJtX3ZtYV9lbnRyeV90ICp2bWFsaXN0OwkvKio8IExpc3Qgb2Ygdm1hcyAoZm9yIGRlYnVnZ2luZykgKi8KLQlkcm1fbG9ja19kYXRhX3QgbG9jazsJCS8qKjwgSW5mb3JtYXRpb24gb24gaGFyZHdhcmUgbG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQgdm1hbGlzdDsJLyoqPCBMaXN0IG9mIHZtYXMgKGZvciBkZWJ1Z2dpbmcpICovCisJc3RydWN0IGRybV9sb2NrX2RhdGEgbG9jazsJLyoqPCBJbmZvcm1hdGlvbiBvbiBoYXJkd2FyZSBsb2NrICovCiAJLypAfSAqLwogCiAJLyoqIFxuYW1lIERNQSBxdWV1ZXMgKGNvbnRleHRzKSAqLwpAQCAtNjk5LDggKzY4OSw4IEBACiAJaW50IHF1ZXVlX2NvdW50OwkJLyoqPCBOdW1iZXIgb2YgYWN0aXZlIERNQSBxdWV1ZXMgKi8KIAlpbnQgcXVldWVfcmVzZXJ2ZWQ7CQkgIC8qKjwgTnVtYmVyIG9mIHJlc2VydmVkIERNQSBxdWV1ZXMgKi8KIAlpbnQgcXVldWVfc2xvdHM7CQkvKio8IEFjdHVhbCBsZW5ndGggb2YgcXVldWVsaXN0ICovCi0JZHJtX3F1ZXVlX3QgKipxdWV1ZWxpc3Q7CS8qKjwgVmVjdG9yIG9mIHBvaW50ZXJzIHRvIERNQSBxdWV1ZXMgKi8KLQlkcm1fZGV2aWNlX2RtYV90ICpkbWE7CQkvKio8IE9wdGlvbmFsIHBvaW50ZXIgZm9yIERNQSBzdXBwb3J0ICovCisJc3RydWN0IGRybV9xdWV1ZSAqKnF1ZXVlbGlzdDsJLyoqPCBWZWN0b3Igb2YgcG9pbnRlcnMgdG8gRE1BIHF1ZXVlcyAqLworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hOwkJLyoqPCBPcHRpb25hbCBwb2ludGVyIGZvciBETUEgc3VwcG9ydCAqLwogCS8qQH0gKi8KIAogCS8qKiBcbmFtZSBDb250ZXh0IHN1cHBvcnQgKi8KQEAgLTcyNSw4ICs3MTUsOCBAQAogCWF0b21pY190IHZibF9yZWNlaXZlZDsKIAlhdG9taWNfdCB2YmxfcmVjZWl2ZWQyOwkJLyoqPCBudW1iZXIgb2Ygc2Vjb25kYXJ5IFZCTEFOSyBpbnRlcnJ1cHRzICovCiAJc3BpbmxvY2tfdCB2YmxfbG9jazsKLQlkcm1fdmJsX3NpZ190IHZibF9zaWdzOwkJLyoqPCBzaWduYWwgbGlzdCB0byBzZW5kIG9uIFZCTEFOSyAqLwotCWRybV92Ymxfc2lnX3QgdmJsX3NpZ3MyOwkvKio8IHNpZ25hbHMgdG8gc2VuZCBvbiBzZWNvbmRhcnkgVkJMQU5LICovCisJc3RydWN0IGxpc3RfaGVhZCB2Ymxfc2lnczsJCS8qKjwgc2lnbmFsIGxpc3QgdG8gc2VuZCBvbiBWQkxBTksgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZibF9zaWdzMjsJLyoqPCBzaWduYWxzIHRvIHNlbmQgb24gc2Vjb25kYXJ5IFZCTEFOSyAqLwogCXVuc2lnbmVkIGludCB2YmxfcGVuZGluZzsKIAlzcGlubG9ja190IHRhc2tsZXRfbG9jazsJLyoqPCBGb3IgZHJtX2xvY2tlZF90YXNrbGV0ICovCiAJdm9pZCAoKmxvY2tlZF90YXNrbGV0X2Z1bmMpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtNzM5LDcgKzcyOSw3IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QgYnVmX3JlYWRlcnM7CS8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgdG8gcmVhZCAqLwogCXdhaXRfcXVldWVfaGVhZF90IGJ1Zl93cml0ZXJzOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHRvIGN0eCBzd2l0Y2ggKi8KIAotCWRybV9hZ3BfaGVhZF90ICphZ3A7CS8qKjwgQUdQIGRhdGEgKi8KKwlzdHJ1Y3QgZHJtX2FncF9oZWFkICphZ3A7CS8qKjwgQUdQIGRhdGEgKi8KIAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkJLyoqPCBQQ0kgZGV2aWNlIHN0cnVjdHVyZSAqLwogCWludCBwY2lfdmVuZG9yOwkJCS8qKjwgUENJIHZlbmRvciBpZCAqLwpAQCAtNzQ3LDI2ICs3MzcsMjMgQEAKICNpZmRlZiBfX2FscGhhX18KIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAjZW5kaWYKLQlkcm1fc2dfbWVtX3QgKnNnOwkvKio8IFNjYXR0ZXIgZ2F0aGVyIG1lbW9yeSAqLworCXN0cnVjdCBkcm1fc2dfbWVtICpzZzsJLyoqPCBTY2F0dGVyIGdhdGhlciBtZW1vcnkgKi8KIAl1bnNpZ25lZCBsb25nICpjdHhfYml0bWFwOwkvKio8IGNvbnRleHQgYml0bWFwICovCiAJdm9pZCAqZGV2X3ByaXZhdGU7CQkvKio8IGRldmljZSBwcml2YXRlIGRhdGEgKi8KLQlkcm1fc2lnZGF0YV90IHNpZ2RhdGE7CSAgIC8qKjwgRm9yIGJsb2NrX2FsbF9zaWduYWxzICovCisJc3RydWN0IGRybV9zaWdkYXRhIHNpZ2RhdGE7CSAgIC8qKjwgRm9yIGJsb2NrX2FsbF9zaWduYWxzICovCiAJc2lnc2V0X3Qgc2lnbWFzazsKIAogCXN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXI7CiAJZHJtX2xvY2FsX21hcF90ICphZ3BfYnVmZmVyX21hcDsKIAl1bnNpZ25lZCBpbnQgYWdwX2J1ZmZlcl90b2tlbjsKLQlkcm1faGVhZF90IHByaW1hcnk7CQkvKio8IHByaW1hcnkgc2NyZWVuIGhlYWQgKi8KKwlzdHJ1Y3QgZHJtX2hlYWQgcHJpbWFyeTsJCS8qKjwgcHJpbWFyeSBzY3JlZW4gaGVhZCAqLwogCiAJLyoqIFxuYW1lIERyYXdhYmxlIGluZm9ybWF0aW9uICovCiAJLypAeyAqLwogCXNwaW5sb2NrX3QgZHJ3X2xvY2s7Ci0JdW5zaWduZWQgaW50IGRyd19iaXRmaWVsZF9sZW5ndGg7Ci0JdTMyICpkcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgaW50IGRyd19pbmZvX2xlbmd0aDsKLQlkcm1fZHJhd2FibGVfaW5mb190ICoqZHJ3X2luZm87CisJc3RydWN0IGlkciBkcndfaWRyOwogCS8qQH0gKi8KLX0gZHJtX2RldmljZV90OworfTsKIAogc3RhdGljIF9faW5saW5lX18gaW50IGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICAgICBpbnQgZmVhdHVyZSkKQEAgLTgzOCw3ICs4MjUsNyBAQAogCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBsb25nIGRybV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IGRybV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIAkJCQkvKiBEZXZpY2Ugc3VwcG9ydCAoZHJtX2ZvcHMuaCkgKi8KIGV4dGVybiBpbnQgZHJtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwpAQCAtODU3LDcgKzg0NCw3IEBACiAJCQlpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogZXh0ZXJuIHZvaWQgKmRybV9yZWFsbG9jKHZvaWQgKm9sZHB0LCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUsIGludCBhcmVhKTsKIAotZXh0ZXJuIERSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IHBhZ2VzLCB1MzIgdHlwZSk7CitleHRlcm4gRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBhZ2VzLCB1MzIgdHlwZSk7CiBleHRlcm4gaW50IGRybV9mcmVlX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSwgaW50IHBhZ2VzKTsKIGV4dGVybiBpbnQgZHJtX2JpbmRfYWdwKERSTV9BR1BfTUVNICogaGFuZGxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpOwogZXh0ZXJuIGludCBkcm1fdW5iaW5kX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSk7CkBAIC04OTYsOSArODgzLDkgQEAKIGV4dGVybiBpbnQgZHJtX3JtY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotZXh0ZXJuIGludCBkcm1fY3R4Yml0bWFwX2luaXQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9jdHhiaXRtYXBfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2N0eGJpdG1hcF9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGN0eF9oYW5kbGUpOworZXh0ZXJuIGludCBkcm1fY3R4Yml0bWFwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fY3R4Yml0bWFwX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fY3R4Yml0bWFwX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGN0eF9oYW5kbGUpOwogCiBleHRlcm4gaW50IGRybV9zZXRzYXJlYWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKQEAgLTkxMiw4ICs4OTksOSBAQAogCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV91cGRhdGVfZHJhd2FibGVfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBkcm1fZHJhd2FibGVfaW5mb190ICpkcm1fZ2V0X2RyYXdhYmxlX2luZm8oZHJtX2RldmljZV90ICpkZXYsCitleHRlcm4gc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICpkcm1fZ2V0X2RyYXdhYmxlX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJCSAgZHJtX2RyYXdhYmxlX3QgaWQpOworZXh0ZXJuIHZvaWQgZHJtX2RyYXdhYmxlX2ZyZWVfYWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAJCQkJLyogQXV0aGVudGljYXRpb24gSU9DVEwgc3VwcG9ydCAoZHJtX2F1dGguaCkgKi8KIGV4dGVybiBpbnQgZHJtX2dldG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtOTI2LDEwICs5MTQsMTAgQEAKIAkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgZHJtX3VubG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fbG9ja190YWtlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCk7Ci1leHRlcm4gaW50IGRybV9sb2NrX2ZyZWUoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEsIHVuc2lnbmVkIGludCBjb250ZXh0KTsKLWV4dGVybiB2b2lkIGRybV9pZGxlbG9ja190YWtlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhKTsKLWV4dGVybiB2b2lkIGRybV9pZGxlbG9ja19yZWxlYXNlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhKTsKK2V4dGVybiBpbnQgZHJtX2xvY2tfdGFrZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50IGRybV9sb2NrX2ZyZWUoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpOworZXh0ZXJuIHZvaWQgZHJtX2lkbGVsb2NrX3Rha2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSk7CitleHRlcm4gdm9pZCBkcm1faWRsZWxvY2tfcmVsZWFzZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhKTsKIAogLyoKICAqIFRoZXNlIGFyZSBleHBvcnRlZCB0byBkcml2ZXJzIHNvIHRoYXQgdGhleSBjYW4gaW1wbGVtZW50IGZlbmNpbmcgdXNpbmcKQEAgLTk0MCwxNSArOTI4LDE1IEBACiBleHRlcm4gaW50IGRybV9rZXJuZWxfdGFrZV9od19sb2NrKHN0cnVjdCBmaWxlICpmaWxwKTsKIAogCQkJCS8qIEJ1ZmZlciBtYW5hZ2VtZW50IHN1cHBvcnQgKGRybV9idWZzLmgpICovCi1leHRlcm4gaW50IGRybV9hZGRidWZzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCk7Ci1leHRlcm4gaW50IGRybV9hZGRidWZzX3BjaShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCk7Ci1leHRlcm4gaW50IGRybV9hZGRtYXAoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZHJtX21hcF90eXBlX3QgdHlwZSwKLQkJICAgICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbG9jYWxfbWFwX3QgKiogbWFwX3B0cik7CitleHRlcm4gaW50IGRybV9hZGRidWZzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjICogcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZGRidWZzX3BjaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjICogcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZGRtYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICAgdW5zaWduZWQgaW50IHNpemUsIGVudW0gZHJtX21hcF90eXBlIHR5cGUsCisJCSAgICAgIGVudW0gZHJtX21hcF9mbGFncyBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqIG1hcF9wdHIpOwogZXh0ZXJuIGludCBkcm1fYWRkbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX3JtbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2xvY2FsX21hcF90ICogbWFwKTsKLWV4dGVybiBpbnQgZHJtX3JtbWFwX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9sb2NhbF9tYXBfdCAqIG1hcCk7CitleHRlcm4gaW50IGRybV9ybW1hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApOworZXh0ZXJuIGludCBkcm1fcm1tYXBfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqIG1hcCk7CiBleHRlcm4gaW50IGRybV9ybW1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIApAQCAtOTYzLDU2ICs5NTEsNTYgQEAKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgZHJtX21hcGJ1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICAgIHVuc2lnbmVkIGludCByZXNvdXJjZSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgIHVuc2lnbmVkIGludCByZXNvdXJjZSk7CiAKIAkJCQkvKiBETUEgc3VwcG9ydCAoZHJtX2RtYS5oKSAqLwotZXh0ZXJuIGludCBkcm1fZG1hX3NldHVwKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fZG1hX3Rha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fZnJlZV9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpOwotZXh0ZXJuIHZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIGludCBkcm1fZG1hX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2RtYV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9mcmVlX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1Zik7CitleHRlcm4gdm9pZCBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwogCiAJCQkJLyogSVJRIHN1cHBvcnQgKGRybV9pcnEuaCkgKi8KIGV4dGVybiBpbnQgZHJtX2NvbnRyb2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaXJxcmV0dXJuX3QgZHJtX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gaW50IGRybV9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IGRybV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gaW50IGRybV93YWl0X3ZibGFuayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICp2Ymxfc2VxKTsKLWV4dGVybiB2b2lkIGRybV92Ymxfc2VuZF9zaWduYWxzKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fbG9ja2VkX3Rhc2tsZXQoZHJtX2RldmljZV90ICpkZXYsIHZvaWQoKmZ1bmMpKGRybV9kZXZpY2VfdCopKTsKK2V4dGVybiBpbnQgZHJtX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqdmJsX3NlcSk7CitleHRlcm4gdm9pZCBkcm1fdmJsX3NlbmRfc2lnbmFscyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9sb2NrZWRfdGFza2xldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkKCpmdW5jKShzdHJ1Y3QgZHJtX2RldmljZSopKTsKIAogCQkJCS8qIEFHUC9HQVJUIHN1cHBvcnQgKGRybV9hZ3BzdXBwb3J0LmgpICovCi1leHRlcm4gZHJtX2FncF9oZWFkX3QgKmRybV9hZ3BfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCBkcm1fYWdwX2FjcXVpcmUoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBzdHJ1Y3QgZHJtX2FncF9oZWFkICpkcm1fYWdwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGRybV9hZ3BfYWNxdWlyZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgZHJtX2FncF9hY3F1aXJlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBkcm1fYWdwX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGRybV9hZ3BfcmVsZWFzZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2VuYWJsZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9hZ3BfbW9kZV90IG1vZGUpOworZXh0ZXJuIGludCBkcm1fYWdwX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9tb2RlIG1vZGUpOwogZXh0ZXJuIGludCBkcm1fYWdwX2VuYWJsZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfaW5mbyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9hZ3BfaW5mb190ICogaW5mbyk7CitleHRlcm4gaW50IGRybV9hZ3BfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9pbmZvICogaW5mbyk7CiBleHRlcm4gaW50IGRybV9hZ3BfaW5mb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9hbGxvYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9idWZmZXJfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYnVmZmVyICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF9hbGxvY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfZnJlZShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9idWZmZXJfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgKnJlcXVlc3QpOwogZXh0ZXJuIGludCBkcm1fYWdwX2ZyZWVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfdW5iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgKnJlcXVlc3QpOwogZXh0ZXJuIGludCBkcm1fYWdwX3VuYmluZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2JpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgKnJlcXVlc3QpOwogZXh0ZXJuIGludCBkcm1fYWdwX2JpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gRFJNX0FHUF9NRU0gKmRybV9hZ3BfYWxsb2NhdGVfbWVtb3J5KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKQEAgLTEwMjQsMTYgKzEwMTIsMTggQEAKIAkJCQkvKiBTdHViIHN1cHBvcnQgKGRybV9zdHViLmgpICovCiBleHRlcm4gaW50IGRybV9nZXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAogCQkgICAgICAgc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7Ci1leHRlcm4gaW50IGRybV9wdXRfZGV2KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IGRybV9wdXRfaGVhZChkcm1faGVhZF90ICogaGVhZCk7CitleHRlcm4gaW50IGRybV9wdXRfZGV2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBkcm1fcHV0X2hlYWQoc3RydWN0IGRybV9oZWFkICpoZWFkKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZHJtX2RlYnVnOwogZXh0ZXJuIHVuc2lnbmVkIGludCBkcm1fY2FyZHNfbGltaXQ7Ci1leHRlcm4gZHJtX2hlYWRfdCAqKmRybV9oZWFkczsKK2V4dGVybiBzdHJ1Y3QgZHJtX2hlYWQgKipkcm1faGVhZHM7CiBleHRlcm4gc3RydWN0IGNsYXNzICpkcm1fY2xhc3M7CiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcm1fcHJvY19yb290OwogCitleHRlcm4gZHJtX2xvY2FsX21hcF90ICpkcm1fZ2V0c2FyZWEoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKIAkJCQkvKiBQcm9jIHN1cHBvcnQgKGRybV9wcm9jLmgpICovCi1leHRlcm4gaW50IGRybV9wcm9jX2luaXQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIGludCBkcm1fcHJvY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgaW50IG1pbm9yLAogCQkJIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcm9vdCwKIAkJCSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKipkZXZfcm9vdCk7CkBAIC0xMDQyLDQ1ICsxMDMyLDQ1IEBACiAJCQkgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZXZfcm9vdCk7CiAKIAkJCQkvKiBTY2F0dGVyIEdhdGhlciBTdXBwb3J0IChkcm1fc2NhdHRlci5oKSAqLwotZXh0ZXJuIHZvaWQgZHJtX3NnX2NsZWFudXAoZHJtX3NnX21lbV90ICogZW50cnkpOworZXh0ZXJuIHZvaWQgZHJtX3NnX2NsZWFudXAoc3RydWN0IGRybV9zZ19tZW0gKiBlbnRyeSk7CiBleHRlcm4gaW50IGRybV9zZ19hbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgZHJtX3NnX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIAkJCSAgICAgICAvKiBBVEkgUENJR0FSVCBzdXBwb3J0IChhdGlfcGNpZ2FydC5oKSAqLwotZXh0ZXJuIGludCBkcm1fYXRpX3BjaWdhcnRfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJZHJtX2F0aV9wY2lnYXJ0X2luZm8gKiBnYXJ0X2luZm8pOwotZXh0ZXJuIGludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKiBnYXJ0X2luZm8pOworZXh0ZXJuIGludCBkcm1fYXRpX3BjaWdhcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqIGdhcnRfaW5mbyk7CitleHRlcm4gaW50IGRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvICogZ2FydF9pbmZvKTsKIAotZXh0ZXJuIGRybV9kbWFfaGFuZGxlX3QgKmRybV9wY2lfYWxsb2MoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwKK2V4dGVybiBkcm1fZG1hX2hhbmRsZV90ICpkcm1fcGNpX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAogCQkJCSAgICAgICBzaXplX3QgYWxpZ24sIGRtYV9hZGRyX3QgbWF4YWRkcik7Ci1leHRlcm4gdm9pZCBfX2RybV9wY2lfZnJlZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKTsKLWV4dGVybiB2b2lkIGRybV9wY2lfZnJlZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKTsKK2V4dGVybiB2b2lkIF9fZHJtX3BjaV9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKTsKK2V4dGVybiB2b2lkIGRybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7CiAKIAkJCSAgICAgICAvKiBzeXNmcyBzdXBwb3J0IChkcm1fc3lzZnMuYykgKi8KIGV4dGVybiBzdHJ1Y3QgY2xhc3MgKmRybV9zeXNmc19jcmVhdGUoc3RydWN0IG1vZHVsZSAqb3duZXIsIGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgZHJtX3N5c2ZzX2Rlc3Ryb3koc3RydWN0IGNsYXNzICpjcyk7CiBleHRlcm4gc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzICpjcywKLQkJCQkJCSBkcm1faGVhZF90ICpoZWFkKTsKKwkJCQkJCSBzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQpOwogZXh0ZXJuIHZvaWQgZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KTsKIAogLyoKICAqIEJhc2ljIG1lbW9yeSBtYW5hZ2VyIHN1cHBvcnQgKGRybV9tbS5jKQogICovCi1leHRlcm4gZHJtX21tX25vZGVfdCAqZHJtX21tX2dldF9ibG9jayhkcm1fbW1fbm9kZV90ICogcGFyZW50LAorZXh0ZXJuIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX2dldF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBwYXJlbnQsCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICAgICAgdW5zaWduZWQgYWxpZ25tZW50KTsKLXZvaWQgZHJtX21tX3B1dF9ibG9jayhkcm1fbW1fbm9kZV90ICogY3VyKTsKLWV4dGVybiBkcm1fbW1fbm9kZV90ICpkcm1fbW1fc2VhcmNoX2ZyZWUoY29uc3QgZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHNpemUsCit2b2lkIGRybV9tbV9wdXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICogY3VyKTsKK2V4dGVybiBzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9zZWFyY2hfZnJlZShjb25zdCBzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkgdW5zaWduZWQgYWxpZ25tZW50LCBpbnQgYmVzdF9tYXRjaCk7Ci1leHRlcm4gaW50IGRybV9tbV9pbml0KGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiB2b2lkIGRybV9tbV90YWtlZG93bihkcm1fbW1fdCAqbW0pOwotZXh0ZXJuIGludCBkcm1fbW1fY2xlYW4oZHJtX21tX3QgKm1tKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRybV9tbV90YWlsX3NwYWNlKGRybV9tbV90ICptbSk7Ci1leHRlcm4gaW50IGRybV9tbV9yZW1vdmVfc3BhY2VfZnJvbV90YWlsKGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiBpbnQgZHJtX21tX2FkZF9zcGFjZV90b190YWlsKGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgZHJtX21tX2luaXQoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gdm9pZCBkcm1fbW1fdGFrZWRvd24oc3RydWN0IGRybV9tbSAqbW0pOworZXh0ZXJuIGludCBkcm1fbW1fY2xlYW4oc3RydWN0IGRybV9tbSAqbW0pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX21tX3RhaWxfc3BhY2Uoc3RydWN0IGRybV9tbSAqbW0pOworZXh0ZXJuIGludCBkcm1fbW1fcmVtb3ZlX3NwYWNlX2Zyb21fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgZHJtX21tX2FkZF9zcGFjZV90b190YWlsKHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCiBleHRlcm4gdm9pZCBkcm1fY29yZV9pb3JlbWFwKHN0cnVjdCBkcm1fbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgZHJtX2NvcmVfaW9yZW1hcGZyZWUoc3RydWN0IGRybV9tYXAgKm1hcCwgc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0xMDg4LDE0ICsxMDc4LDE0IEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgZHJtX21hcCAqZHJtX2NvcmVfZmluZG1hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkJICAgdW5zaWduZWQgaW50IHRva2VuKQogewotCWRybV9tYXBfbGlzdF90ICpfZW50cnk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQpCisJc3RydWN0IGRybV9tYXBfbGlzdCAqX2VudHJ5OworCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKQogCSAgICBpZiAoX2VudHJ5LT51c2VyX3Rva2VuID09IHRva2VuKQogCQlyZXR1cm4gX2VudHJ5LT5tYXA7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBkcm1fZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpZiAoZGV2LT5kcml2ZXItPmRldmljZV9pc19hZ3AgIT0gTlVMTCkgewogCQlpbnQgZXJyID0gKCpkZXYtPmRyaXZlci0+ZGV2aWNlX2lzX2FncCkgKGRldik7CkBAIC0xMTA4LDcgKzEwOTgsNyBAQAogCXJldHVybiBwY2lfZmluZF9jYXBhYmlsaXR5KGRldi0+cGRldiwgUENJX0NBUF9JRF9BR1ApOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2RldmljZV9pc19wY2llKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBfX2lubGluZV9fIGludCBkcm1fZGV2aWNlX2lzX3BjaWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYtPnBkZXYsIFBDSV9DQVBfSURfRVhQKTsKIH0KQEAgLTExNDMsNyArMTEzMyw3IEBACiAKIC8qQH0qLwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfbWFwX29mcyhkcm1fbWFwX3QgKiBtYXApOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoc3RydWN0IGRybV9tYXAgKiBtYXApOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X3JlZ19vZnMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKICNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKaW5kZXggNDBiZmQ5Yi4uMzU0ZjBlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYwpAQCAtNDgsNyArNDgsNyBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIGFjcXVpcmVkIGFuZCBmaWxscyBpbiB0aGUKICAqIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGUgaW5mb3JtYXRpb24gaW4gZHJtX2FncF9oZWFkOjphZ3BfaW5mby4KICAqLwotaW50IGRybV9hZ3BfaW5mbyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9hZ3BfaW5mb190ICogaW5mbykKK2ludCBkcm1fYWdwX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfaW5mbyAqaW5mbykKIHsKIAlEUk1fQUdQX0tFUk4gKmtlcm47CiAKQEAgLTc0LDE2ICs3NCwxNiBAQAogaW50IGRybV9hZ3BfaW5mb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9pbmZvX3QgaW5mbzsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9pbmZvIGluZm87CiAJaW50IGVycjsKIAogCWVyciA9IGRybV9hZ3BfaW5mbyhkZXYsICZpbmZvKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2FncF9pbmZvX3QgX191c2VyICopIGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGRybV9hZ3BfaW5mbyBfX3VzZXIgKikgYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CkBAIC05Nyw3ICs5Nyw3IEBACiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXNuJ3QgYmVlbiBhY3F1aXJlZCBiZWZvcmUgYW5kIGNhbGxzCiAgKiBcYyBhZ3BfYmFja2VuZF9hY3F1aXJlLgogICovCi1pbnQgZHJtX2FncF9hY3F1aXJlKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fYWdwX2FjcXVpcmUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaWYgKCFkZXYtPmFncCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMjYsOSArMTI2LDkgQEAKIGludCBkcm1fYWdwX2FjcXVpcmVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCi0JcmV0dXJuIGRybV9hZ3BfYWNxdWlyZSgoZHJtX2RldmljZV90ICopIHByaXYtPmhlYWQtPmRldik7CisJcmV0dXJuIGRybV9hZ3BfYWNxdWlyZSgoc3RydWN0IGRybV9kZXZpY2UgKikgcHJpdi0+aGVhZC0+ZGV2KTsKIH0KIAogLyoqCkBAIC0xMzksNyArMTM5LDcgQEAKICAqCiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBhbmQgY2FsbHMgXGMgYWdwX2JhY2tlbmRfcmVsZWFzZS4KICAqLwotaW50IGRybV9hZ3BfcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTIsOCArMTUyLDggQEAKIGludCBkcm1fYWdwX3JlbGVhc2VfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAlyZXR1cm4gZHJtX2FncF9yZWxlYXNlKGRldik7CiB9CkBAIC0xNjgsNyArMTY4LDcgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhcyBiZWVuIGFjcXVpcmVkIGJ1dCBub3QgZW5hYmxlZCwgYW5kIGNhbGxzCiAgKiBcYyBhZ3BfZW5hYmxlLgogICovCi1pbnQgZHJtX2FncF9lbmFibGUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYWdwX21vZGVfdCBtb2RlKQoraW50IGRybV9hZ3BfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2FncF9tb2RlIG1vZGUpCiB7CiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4NSwxMSArMTg1LDExIEBACiBpbnQgZHJtX2FncF9lbmFibGVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX21vZGVfdCBtb2RlOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYWdwX21vZGUgbW9kZTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgKGRybV9hZ3BfbW9kZV90IF9fdXNlciAqKSBhcmcsIHNpemVvZihtb2RlKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCAoc3RydWN0IGRybV9hZ3BfbW9kZSBfX3VzZXIgKikgYXJnLCBzaXplb2YobW9kZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiBkcm1fYWdwX2VuYWJsZShkZXYsIG1vZGUpOwpAQCAtMjA3LDkgKzIwNyw5IEBACiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBpcyBwcmVzZW50IGFuZCBoYXMgYmVlbiBhY3F1aXJlZCwgYWxsb2NhdGVzIHRoZQogICogbWVtb3J5IHZpYSBhbGxvY19hZ3AoKSBhbmQgY3JlYXRlcyBhIGRybV9hZ3BfbWVtIGVudHJ5IGZvciBpdC4KICAqLwotaW50IGRybV9hZ3BfYWxsb2MoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpCitpbnQgZHJtX2FncF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgKnJlcXVlc3QpCiB7Ci0JZHJtX2FncF9tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKIAlEUk1fQUdQX01FTSAqbWVtb3J5OwogCXVuc2lnbmVkIGxvbmcgcGFnZXM7CiAJdTMyIHR5cGU7CkBAIC0yMzIsMTEgKzIzMiw3IEBACiAJZW50cnktPm1lbW9yeSA9IG1lbW9yeTsKIAllbnRyeS0+Ym91bmQgPSAwOwogCWVudHJ5LT5wYWdlcyA9IHBhZ2VzOwotCWVudHJ5LT5wcmV2ID0gTlVMTDsKLQllbnRyeS0+bmV4dCA9IGRldi0+YWdwLT5tZW1vcnk7Ci0JaWYgKGRldi0+YWdwLT5tZW1vcnkpCi0JCWRldi0+YWdwLT5tZW1vcnktPnByZXYgPSBlbnRyeTsKLQlkZXYtPmFncC0+bWVtb3J5ID0gZW50cnk7CisJbGlzdF9hZGQoJmVudHJ5LT5oZWFkLCAmZGV2LT5hZ3AtPm1lbW9yeSk7CiAKIAlyZXF1ZXN0LT5oYW5kbGUgPSBlbnRyeS0+aGFuZGxlOwogCXJlcXVlc3QtPnBoeXNpY2FsID0gbWVtb3J5LT5waHlzaWNhbDsKQEAgLTI0OCwxMCArMjQ0LDEwIEBACiBpbnQgZHJtX2FncF9hbGxvY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9idWZmZXJfdCByZXF1ZXN0OwotCWRybV9hZ3BfYnVmZmVyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciByZXF1ZXN0OworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKQEAgLTI2MiwxMCArMjU4LDEyIEBACiAJCXJldHVybiBlcnI7CiAKIAlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpKSB7Ci0JCWRybV9hZ3BfbWVtX3QgKmVudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsKLQotCQlkZXYtPmFncC0+bWVtb3J5ID0gZW50cnktPm5leHQ7Ci0JCWRldi0+YWdwLT5tZW1vcnktPnByZXYgPSBOVUxMOworCQlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgeworCQkJaWYgKGVudHJ5LT5oYW5kbGUgPT0gcmVxdWVzdC5oYW5kbGUpCisJCQkJYnJlYWs7CisJCX0KKwkJbGlzdF9kZWwoJmVudHJ5LT5oZWFkKTsKIAkJZHJtX2ZyZWVfYWdwKGVudHJ5LT5tZW1vcnksIGVudHJ5LT5wYWdlcyk7CiAJCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMjgzLDEyICsyODEsMTIgQEAKICAqCiAgKiBXYWxrcyB0aHJvdWdoIGRybV9hZ3BfaGVhZDo6bWVtb3J5IHVudGlsIGZpbmRpbmcgYSBtYXRjaGluZyBoYW5kbGUuCiAgKi8KLXN0YXRpYyBkcm1fYWdwX21lbV90ICpkcm1fYWdwX2xvb2t1cF9lbnRyeShkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgc3RydWN0IGRybV9hZ3BfbWVtICpkcm1fYWdwX2xvb2t1cF9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICAgdW5zaWduZWQgbG9uZyBoYW5kbGUpCiB7Ci0JZHJtX2FncF9tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKIAotCWZvciAoZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKSB7CiAJCWlmIChlbnRyeS0+aGFuZGxlID09IGhhbmRsZSkKIAkJCXJldHVybiBlbnRyeTsKIAl9CkBAIC0zMDcsOSArMzA1LDkgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGlzIHByZXNlbnQgYW5kIGFjcXVpcmVkLCBsb29rcy11cCB0aGUgQUdQIG1lbW9yeQogICogZW50cnkgYW5kIHBhc3NlcyBpdCB0byB0aGUgdW5iaW5kX2FncCgpIGZ1bmN0aW9uLgogICovCi1pbnQgZHJtX2FncF91bmJpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KQoraW50IGRybV9hZ3BfdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgKnJlcXVlc3QpCiB7Ci0JZHJtX2FncF9tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKIAlpbnQgcmV0OwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQpAQCAtMzI4LDEyICszMjYsMTIgQEAKIGludCBkcm1fYWdwX3VuYmluZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfYmluZGluZ190IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfYmluZGluZyByZXF1ZXN0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCi0JICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJICAgICgmcmVxdWVzdCwgKHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZHJtX2FncF91bmJpbmQoZGV2LCAmcmVxdWVzdCk7CkBAIC0zNTIsOSArMzUwLDkgQEAKICAqIGlzIGN1cnJlbnRseSBib3VuZCBpbnRvIHRoZSBHQVRULiBMb29rcy11cCB0aGUgQUdQIG1lbW9yeSBlbnRyeSBhbmQgcGFzc2VzCiAgKiBpdCB0byBiaW5kX2FncCgpIGZ1bmN0aW9uLgogICovCi1pbnQgZHJtX2FncF9iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCkKK2ludCBkcm1fYWdwX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYmluZGluZyAqcmVxdWVzdCkKIHsKLQlkcm1fYWdwX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCWludCByZXRjb2RlOwogCWludCBwYWdlOwogCkBAIC0zNzcsMTIgKzM3NSwxMiBAQAogaW50IGRybV9hZ3BfYmluZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIHJlcXVlc3Q7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIKLQkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkgICAgKCZyZXF1ZXN0LCAoc3RydWN0IGRybV9hZ3BfYmluZGluZyBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiBkcm1fYWdwX2JpbmQoZGV2LCAmcmVxdWVzdCk7CkBAIC00MDIsOSArNDAwLDkgQEAKICAqIHVuYmluZF9hZ3AoKS4gRnJlZXMgaXQgdmlhIGZyZWVfYWdwKCkgYXMgd2VsbCBhcyB0aGUgZW50cnkgaXRzZWxmCiAgKiBhbmQgdW5saW5rcyBmcm9tIHRoZSBkb3VibHkgbGlua2VkIGxpc3QgaXQncyBpbnNlcnRlZCBpbi4KICAqLwotaW50IGRybV9hZ3BfZnJlZShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9idWZmZXJfdCAqcmVxdWVzdCkKK2ludCBkcm1fYWdwX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYnVmZmVyICpyZXF1ZXN0KQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAKIAlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YWNxdWlyZWQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDEzLDEzICs0MTEsNyBAQAogCWlmIChlbnRyeS0+Ym91bmQpCiAJCWRybV91bmJpbmRfYWdwKGVudHJ5LT5tZW1vcnkpOwogCi0JaWYgKGVudHJ5LT5wcmV2KQotCQllbnRyeS0+cHJldi0+bmV4dCA9IGVudHJ5LT5uZXh0OwotCWVsc2UKLQkJZGV2LT5hZ3AtPm1lbW9yeSA9IGVudHJ5LT5uZXh0OwotCi0JaWYgKGVudHJ5LT5uZXh0KQotCQllbnRyeS0+bmV4dC0+cHJldiA9IGVudHJ5LT5wcmV2OworCWxpc3RfZGVsKCZlbnRyeS0+aGVhZCk7CiAKIAlkcm1fZnJlZV9hZ3AoZW50cnktPm1lbW9yeSwgZW50cnktPnBhZ2VzKTsKIAlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOwpAQCAtNDMwLDEyICs0MjIsMTIgQEAKIGludCBkcm1fYWdwX2ZyZWVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgcmVxdWVzdDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcgotCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJICAgICgmcmVxdWVzdCwgKHN0cnVjdCBkcm1fYWdwX2J1ZmZlciBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiBkcm1fYWdwX2ZyZWUoZGV2LCAmcmVxdWVzdCk7CkBAIC00NTAsOSArNDQyLDkgQEAKICAqIHZpYSB0aGUgaW50ZXJfbW9kdWxlXyogZnVuY3Rpb25zLiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGRybV9hZ3BfaGVhZAogICogc3RydWN0dXJlLgogICovCi1kcm1fYWdwX2hlYWRfdCAqZHJtX2FncF9pbml0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0cnVjdCBkcm1fYWdwX2hlYWQgKmRybV9hZ3BfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWRybV9hZ3BfaGVhZF90ICpoZWFkID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2FncF9oZWFkICpoZWFkID0gTlVMTDsKIAogCWlmICghKGhlYWQgPSBkcm1fYWxsb2Moc2l6ZW9mKCpoZWFkKSwgRFJNX01FTV9BR1BMSVNUUykpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTQ3Miw3ICs0NjQsNyBAQAogCQlkcm1fZnJlZShoZWFkLCBzaXplb2YoKmhlYWQpLCBEUk1fTUVNX0FHUExJU1RTKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWhlYWQtPm1lbW9yeSA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJmhlYWQtPm1lbW9yeSk7CiAJaGVhZC0+Y2FudF91c2VfYXBlcnR1cmUgPSBoZWFkLT5hZ3BfaW5mby5jYW50X3VzZV9hcGVydHVyZTsKIAloZWFkLT5wYWdlX21hc2sgPSBoZWFkLT5hZ3BfaW5mby5wYWdlX21hc2s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYwppbmRleCBjN2IxOWQzLi43Zjc3N2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCkBAIC00NSwxNSArNDUsMTUgQEAKICAqIHRoZSBvbmUgd2l0aCBtYXRjaGluZyBtYWdpYyBudW1iZXIsIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleAogICogbG9jay4KICAqLwotc3RhdGljIGRybV9maWxlX3QgKmRybV9maW5kX2ZpbGUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKK3N0YXRpYyBzdHJ1Y3QgZHJtX2ZpbGUgKmRybV9maW5kX2ZpbGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tYWdpY190IG1hZ2ljKQogewotCWRybV9maWxlX3QgKnJldHZhbCA9IE5VTEw7Ci0JZHJtX21hZ2ljX2VudHJ5X3QgKnB0OwotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnJldHZhbCA9IE5VTEw7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqcHQ7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKCFkcm1faHRfZmluZF9pdGVtKCZkZXYtPm1hZ2ljbGlzdCwgKHVuc2lnbmVkIGxvbmcpbWFnaWMsICZoYXNoKSkgewotCQlwdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIGRybV9tYWdpY19lbnRyeV90LCBoYXNoX2l0ZW0pOworCQlwdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFnaWNfZW50cnksIGhhc2hfaXRlbSk7CiAJCXJldHZhbCA9IHB0LT5wcml2OwogCX0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTcxLDEwICs3MSwxMCBAQAogICogYXNzb2NpYXRlZCB0aGUgbWFnaWMgbnVtYmVyIGhhc2gga2V5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCwgd2hpbGUgaG9sZGluZwogICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgogICovCi1zdGF0aWMgaW50IGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogcHJpdiwKK3N0YXRpYyBpbnQgZHJtX2FkZF9tYWdpYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICogcHJpdiwKIAkJCSBkcm1fbWFnaWNfdCBtYWdpYykKIHsKLQlkcm1fbWFnaWNfZW50cnlfdCAqZW50cnk7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqZW50cnk7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCBtYWdpYyk7CiAKQEAgLTEwMiwxMCArMTAyLDEwIEBACiAgKiBTZWFyY2hlcyBhbmQgdW5saW5rcyB0aGUgZW50cnkgaW4gZHJtX2RldmljZTo6bWFnaWNsaXN0IHdpdGggdGhlIG1hZ2ljCiAgKiBudW1iZXIgaGFzaCBrZXksIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgogICovCi1zdGF0aWMgaW50IGRybV9yZW1vdmVfbWFnaWMoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKK3N0YXRpYyBpbnQgZHJtX3JlbW92ZV9tYWdpYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCiB7Ci0JZHJtX21hZ2ljX2VudHJ5X3QgKnB0OwotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaDsKKwlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICpwdDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKIAogCURSTV9ERUJVRygiJWRcbiIsIG1hZ2ljKTsKIApAQCAtMTE0LDcgKzExNCw3IEBACiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcHQgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBkcm1fbWFnaWNfZW50cnlfdCwgaGFzaF9pdGVtKTsKKwlwdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFnaWNfZW50cnksIGhhc2hfaXRlbSk7CiAJZHJtX2h0X3JlbW92ZV9pdGVtKCZkZXYtPm1hZ2ljbGlzdCwgaGFzaCk7CiAJbGlzdF9kZWwoJnB0LT5oZWFkKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTE0Miw5ICsxNDIsOSBAQAogewogCXN0YXRpYyBkcm1fbWFnaWNfdCBzZXF1ZW5jZSA9IDA7CiAJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hdXRoX3QgYXV0aDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2F1dGggYXV0aDsKIAogCS8qIEZpbmQgdW5pcXVlIG1hZ2ljICovCiAJaWYgKHByaXYtPm1hZ2ljKSB7CkBAIC0xNjIsNyArMTYyLDcgQEAKIAl9CiAKIAlEUk1fREVCVUcoIiV1XG4iLCBhdXRoLm1hZ2ljKTsKLQlpZiAoY29weV90b191c2VyKChkcm1fYXV0aF90IF9fdXNlciAqKSBhcmcsICZhdXRoLCBzaXplb2YoYXV0aCkpKQorCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBkcm1fYXV0aCBfX3VzZXIgKikgYXJnLCAmYXV0aCwgc2l6ZW9mKGF1dGgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0xODEsMTIgKzE4MSwxMiBAQAogaW50IGRybV9hdXRobWFnaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYXV0aF90IGF1dGg7Ci0JZHJtX2ZpbGVfdCAqZmlsZTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2F1dGggYXV0aDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGU7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmF1dGgsIChkcm1fYXV0aF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihhdXRoKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZhdXRoLCAoc3RydWN0IGRybV9hdXRoIF9fdXNlciAqKSBhcmcsIHNpemVvZihhdXRoKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCURSTV9ERUJVRygiJXVcbiIsIGF1dGgubWFnaWMpOwogCWlmICgoZmlsZSA9IGRybV9maW5kX2ZpbGUoZGV2LCBhdXRoLm1hZ2ljKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwppbmRleCBjMTEzNDU4Li45MjMxNzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCkBAIC0zNiwyNiArMzYsMjQgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCi11bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKK3Vuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9zdGFydChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCiB7CiAJcmV0dXJuIHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIHJlc291cmNlKTsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2dldF9yZXNvdXJjZV9zdGFydCk7CiAKLXVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9sZW4oZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKK3Vuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9sZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQogewogCXJldHVybiBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgcmVzb3VyY2UpOwogfQogCiBFWFBPUlRfU1lNQk9MKGRybV9nZXRfcmVzb3VyY2VfbGVuKTsKIAotc3RhdGljIGRybV9tYXBfbGlzdF90ICpkcm1fZmluZF9tYXRjaGluZ19tYXAoZHJtX2RldmljZV90ICpkZXYsCitzdGF0aWMgc3RydWN0IGRybV9tYXBfbGlzdCAqZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgZHJtX2xvY2FsX21hcF90ICptYXApCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlkcm1fbWFwX2xpc3RfdCAqZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICplbnRyeTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChlbnRyeS0+bWFwICYmIG1hcC0+dHlwZSA9PSBlbnRyeS0+bWFwLT50eXBlICYmCiAJCSAgICAoKGVudHJ5LT5tYXAtPm9mZnNldCA9PSBtYXAtPm9mZnNldCkgfHwKIAkJICAgICAobWFwLT50eXBlID09IF9EUk1fU0hNICYmIG1hcC0+ZmxhZ3M9PV9EUk1fQ09OVEFJTlNfTE9DSykpKSB7CkBAIC02Niw3ICs2NCw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgZHJtX21hcF9oYW5kbGUoZHJtX2RldmljZV90ICpkZXYsIGRybV9oYXNoX2l0ZW1fdCAqaGFzaCwKK3N0YXRpYyBpbnQgZHJtX21hcF9oYW5kbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2gsCiAJCQkgIHVuc2lnbmVkIGxvbmcgdXNlcl90b2tlbiwgaW50IGhhc2hlZF9oYW5kbGUpCiB7CiAJaW50IHVzZV9oYXNoZWRfaGFuZGxlOwpAQCAtMTAzLDEyICsxMDEsMTMgQEAKICAqIHR5cGUuICBBZGRzIHRoZSBtYXAgdG8gdGhlIG1hcCBsaXN0IGRybV9kZXZpY2U6Om1hcGxpc3QuIEFkZHMgTVRSUidzIHdoZXJlCiAgKiBhcHBsaWNhYmxlIGFuZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4KICAqLwotc3RhdGljIGludCBkcm1fYWRkbWFwX2NvcmUoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCQkJICAgdW5zaWduZWQgaW50IHNpemUsIGRybV9tYXBfdHlwZV90IHR5cGUsCi0JCQkgICBkcm1fbWFwX2ZsYWdzX3QgZmxhZ3MsIGRybV9tYXBfbGlzdF90ICoqIG1hcGxpc3QpCitzdGF0aWMgaW50IGRybV9hZGRtYXBfY29yZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgIHVuc2lnbmVkIGludCBzaXplLCBlbnVtIGRybV9tYXBfdHlwZSB0eXBlLAorCQkJICAgZW51bSBkcm1fbWFwX2ZsYWdzIGZsYWdzLAorCQkJICAgc3RydWN0IGRybV9tYXBfbGlzdCAqKiBtYXBsaXN0KQogewotCWRybV9tYXBfdCAqbWFwOwotCWRybV9tYXBfbGlzdF90ICpsaXN0OworCXN0cnVjdCBkcm1fbWFwICptYXA7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdDsKIAlkcm1fZG1hX2hhbmRsZV90ICpkbWFoOwogCXVuc2lnbmVkIGxvbmcgdXNlcl90b2tlbjsKIAlpbnQgcmV0OwpAQCAtMjE0LDcgKzIxMyw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBfRFJNX0FHUDogewotCQlkcm1fYWdwX21lbV90ICplbnRyeTsKKwkJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKIAkJaW50IHZhbGlkID0gMDsKIAogCQlpZiAoIWRybV9jb3JlX2hhc19BR1AoZGV2KSkgewpAQCAtMjM3LDE0ICsyMzYsMTQgQEAKIAkJICogc2tpcHBlZCBhbmQgd2UgZG91YmxlIGNoZWNrIHRoYXQgZGV2LT5hZ3AtPm1lbW9yeSBpcwogCQkgKiBhY3R1YWxseSBzZXQgYXMgd2VsbCBhcyBiZWluZyBpbnZhbGlkIGJlZm9yZSBFUEVSTSdpbmcKIAkJICovCi0JCWZvciAoZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQkJaWYgKChtYXAtPm9mZnNldCA+PSBlbnRyeS0+Ym91bmQpICYmCiAJCQkgICAgKG1hcC0+b2Zmc2V0ICsgbWFwLT5zaXplIDw9IGVudHJ5LT5ib3VuZCArIGVudHJ5LT5wYWdlcyAqIFBBR0VfU0laRSkpIHsKIAkJCQl2YWxpZCA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJaWYgKGRldi0+YWdwLT5tZW1vcnkgJiYgIXZhbGlkKSB7CisJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5hZ3AtPm1lbW9yeSkgJiYgIXZhbGlkKSB7CiAJCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKIAkJCXJldHVybiAtRVBFUk07CiAJCX0KQEAgLTI4OSw3ICsyODgsNyBAQAogCWxpc3QtPm1hcCA9IG1hcDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlsaXN0X2FkZCgmbGlzdC0+aGVhZCwgJmRldi0+bWFwbGlzdC0+aGVhZCk7CisJbGlzdF9hZGQoJmxpc3QtPmhlYWQsICZkZXYtPm1hcGxpc3QpOwogCiAJLyogQXNzaWduIGEgMzItYml0IGhhbmRsZSAqLwogCS8qIFdlIGRvIGl0IGhlcmUgc28gdGhhdCBkZXYtPnN0cnVjdF9tdXRleCBwcm90ZWN0cyB0aGUgaW5jcmVtZW50ICovCkBAIC0zMTIsMTEgKzMxMSwxMSBAQAogCXJldHVybiAwOwogCX0KIAotaW50IGRybV9hZGRtYXAoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZHJtX21hcF90eXBlX3QgdHlwZSwKLQkgICAgICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbG9jYWxfbWFwX3QgKiogbWFwX3B0cikKK2ludCBkcm1fYWRkbWFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZW51bSBkcm1fbWFwX3R5cGUgdHlwZSwKKwkgICAgICAgZW51bSBkcm1fbWFwX2ZsYWdzIGZsYWdzLCBkcm1fbG9jYWxfbWFwX3QgKiogbWFwX3B0cikKIHsKLQlkcm1fbWFwX2xpc3RfdCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpsaXN0OwogCWludCByYzsKIAogCXJjID0gZHJtX2FkZG1hcF9jb3JlKGRldiwgb2Zmc2V0LCBzaXplLCB0eXBlLCBmbGFncywgJmxpc3QpOwpAQCAtMzMwLDExICszMjksMTEgQEAKIGludCBkcm1fYWRkbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX21hcF90IG1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqbWFwbGlzdDsKLQlkcm1fbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fbWFwIG1hcDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICptYXBsaXN0OworCXN0cnVjdCBkcm1fbWFwIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgZXJyOwogCiAJaWYgKCEoZmlscC0+Zl9tb2RlICYgMykpCkBAIC0zNTMsNyArMzUyLDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBtYXBsaXN0LT5tYXAsIHNpemVvZihkcm1fbWFwX3QpKSkKKwlpZiAoY29weV90b191c2VyKGFyZ3AsIG1hcGxpc3QtPm1hcCwgc2l6ZW9mKHN0cnVjdCBkcm1fbWFwKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJLyogYXZvaWQgYSB3YXJuaW5nIG9uIDY0LWJpdCwgdGhpcyBjYXN0aW5nIGlzbid0IHZlcnkgbmljZSwgYnV0IHRoZSBBUEkgaXMgc2V0IHNvIHRvbyBsYXRlICovCkBAIC0zNjksNyArMzY4LDcgQEAKICAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCiAgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCiAgKiBccGFyYW0gY21kIGNvbW1hbmQuCi0gKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fbWFwX3Qgc3RydWN0dXJlLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgc3RydWN0IGRybV9tYXAgc3RydWN0dXJlLgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KICAqCiAgKiBTZWFyY2hlcyB0aGUgbWFwIG9uIGRybV9kZXZpY2U6Om1hcGxpc3QsIHJlbW92ZXMgaXQgZnJvbSB0aGUgbGlzdCwgc2VlIGlmCkBAIC0zNzgsMzEgKzM3NywyNiBAQAogICoKICAqIFxzYSBkcm1fYWRkbWFwCiAgKi8KLWludCBkcm1fcm1tYXBfbG9ja2VkKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKK2ludCBkcm1fcm1tYXBfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IE5VTEw7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0ID0gTlVMTCwgKmxpc3RfdDsKIAlkcm1fZG1hX2hhbmRsZV90IGRtYWg7CisJaW50IGZvdW5kID0gMDsKIAogCS8qIEZpbmQgdGhlIGxpc3QgZW50cnkgZm9yIHRoZSBtYXAgYW5kIHJlbW92ZSBpdCAqLwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyX2xpc3QsIGxpc3RfdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAocl9saXN0LT5tYXAgPT0gbWFwKSB7Ci0JCQlsaXN0X2RlbChsaXN0KTsKKwkJCWxpc3RfZGVsKCZyX2xpc3QtPmhlYWQpOwogCQkJZHJtX2h0X3JlbW92ZV9rZXkoJmRldi0+bWFwX2hhc2gsCiAJCQkJCSAgcl9saXN0LT51c2VyX3Rva2VuID4+IFBBR0VfU0hJRlQpOwotCQkJZHJtX2ZyZWUobGlzdCwgc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKKwkJCWRybV9mcmVlKHJfbGlzdCwgc2l6ZW9mKCpyX2xpc3QpLCBEUk1fTUVNX01BUFMpOworCQkJZm91bmQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQkvKiBMaXN0IGhhcyB3cmFwcGVkIGFyb3VuZCB0byB0aGUgaGVhZCBwb2ludGVyLCBvciBpdCdzIGVtcHR5IGFuZCB3ZQotCSAqIGRpZG4ndCBmaW5kIGFueXRoaW5nLgotCSAqLwotCWlmIChsaXN0ID09ICgmZGV2LT5tYXBsaXN0LT5oZWFkKSkgeworCWlmICghZm91bmQpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAogCXN3aXRjaCAobWFwLT50eXBlKSB7CiAJY2FzZSBfRFJNX1JFR0lTVEVSUzoKQEAgLTQzMyw3ICs0MjcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHJtX3JtbWFwKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKK2ludCBkcm1fcm1tYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCiB7CiAJaW50IHJldDsKIApAQCAtNDU2LDIxICs0NTAsMTkgQEAKIGludCBkcm1fcm1tYXBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9tYXBfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fbWFwIHJlcXVlc3Q7CiAJZHJtX2xvY2FsX21hcF90ICptYXAgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCWludCByZXQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIChkcm1fbWFwX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgKHN0cnVjdCBkcm1fbWFwIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpIHsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAocl9saXN0LT5tYXAgJiYKIAkJICAgIHJfbGlzdC0+dXNlcl90b2tlbiA9PSAodW5zaWduZWQgbG9uZylyZXF1ZXN0LmhhbmRsZSAmJgogCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9SRU1PVkFCTEUpIHsKQEAgLTQ4Miw3ICs0NzQsNyBAQAogCS8qIExpc3QgaGFzIHdyYXBwZWQgYXJvdW5kIHRvIHRoZSBoZWFkIHBvaW50ZXIsIG9yIGl0cyBlbXB0eSB3ZSBkaWRuJ3QKIAkgKiBmaW5kIGFueXRoaW5nLgogCSAqLwotCWlmIChsaXN0ID09ICgmZGV2LT5tYXBsaXN0LT5oZWFkKSkgeworCWlmIChsaXN0X2VtcHR5KCZkZXYtPm1hcGxpc3QpIHx8ICFtYXApIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUxMyw3ICs1MDUsOCBAQAogICoKICAqIEZyZWVzIGFueSBwYWdlcyBhbmQgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGVudHJ5LgogICovCi1zdGF0aWMgdm9pZCBkcm1fY2xlYW51cF9idWZfZXJyb3IoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2VudHJ5X3QgKiBlbnRyeSkKK3N0YXRpYyB2b2lkIGRybV9jbGVhbnVwX2J1Zl9lcnJvcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgIHN0cnVjdCBkcm1fYnVmX2VudHJ5ICogZW50cnkpCiB7CiAJaW50IGk7CiAKQEAgLTU1MCwyMCArNTQzLDIwIEBACiAvKioKICAqIEFkZCBBR1AgYnVmZmVycyBmb3IgRE1BIHRyYW5zZmVycy4KICAqCi0gKiBccGFyYW0gZGV2IGRybV9kZXZpY2VfdCB0byB3aGljaCB0aGUgYnVmZmVycyBhcmUgdG8gYmUgYWRkZWQuCi0gKiBccGFyYW0gcmVxdWVzdCBwb2ludGVyIHRvIGEgZHJtX2J1Zl9kZXNjX3QgZGVzY3JpYmluZyB0aGUgcmVxdWVzdC4KKyAqIFxwYXJhbSBkZXYgc3RydWN0IGRybV9kZXZpY2UgdG8gd2hpY2ggdGhlIGJ1ZmZlcnMgYXJlIHRvIGJlIGFkZGVkLgorICogXHBhcmFtIHJlcXVlc3QgcG9pbnRlciB0byBhIHN0cnVjdCBkcm1fYnVmX2Rlc2MgZGVzY3JpYmluZyB0aGUgcmVxdWVzdC4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKgogICogQWZ0ZXIgc29tZSBzYW5pdHkgY2hlY2tzIGNyZWF0ZXMgYSBkcm1fYnVmIHN0cnVjdHVyZSBmb3IgZWFjaCBidWZmZXIgYW5kCiAgKiByZWFsbG9jYXRlcyB0aGUgYnVmZmVyIGxpc3Qgb2YgdGhlIHNhbWUgc2l6ZSBvcmRlciB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3CiAgKiBidWZmZXJzLgogICovCi1pbnQgZHJtX2FkZGJ1ZnNfYWdwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KQoraW50IGRybV9hZGRidWZzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKLQlkcm1fYWdwX21lbV90ICphZ3BfZW50cnk7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisJc3RydWN0IGRybV9hZ3BfbWVtICphZ3BfZW50cnk7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIGFncF9vZmZzZXQ7CiAJaW50IGNvdW50OwpAQCAtNTc0LDcgKzU2Nyw3IEBACiAJaW50IHRvdGFsOwogCWludCBieXRlX2NvdW50OwogCWludCBpLCB2YWxpZDsKLQlkcm1fYnVmX3QgKip0ZW1wX2J1Zmxpc3Q7CisJc3RydWN0IGRybV9idWYgKip0ZW1wX2J1Zmxpc3Q7CiAKIAlpZiAoIWRtYSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MDYsMTQgKzU5OSwxNCBAQAogCiAJLyogTWFrZSBzdXJlIGJ1ZmZlcnMgYXJlIGxvY2F0ZWQgaW4gQUdQIG1lbW9yeSB0aGF0IHdlIG93biAqLwogCXZhbGlkID0gMDsKLQlmb3IgKGFncF9lbnRyeSA9IGRldi0+YWdwLT5tZW1vcnk7IGFncF9lbnRyeTsgYWdwX2VudHJ5ID0gYWdwX2VudHJ5LT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZ3BfZW50cnksICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKSB7CiAJCWlmICgoYWdwX29mZnNldCA+PSBhZ3BfZW50cnktPmJvdW5kKSAmJgogCQkgICAgKGFncF9vZmZzZXQgKyB0b3RhbCAqIGNvdW50IDw9IGFncF9lbnRyeS0+Ym91bmQgKyBhZ3BfZW50cnktPnBhZ2VzICogUEFHRV9TSVpFKSkgewogCQkJdmFsaWQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKGRldi0+YWdwLT5tZW1vcnkgJiYgIXZhbGlkKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmFncC0+bWVtb3J5KSAmJiAhdmFsaWQpIHsKIAkJRFJNX0RFQlVHKCJ6b25lIGludmFsaWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC03MjgsMjQgKzcyMSwyNCBAQAogRVhQT1JUX1NZTUJPTChkcm1fYWRkYnVmc19hZ3ApOwogI2VuZGlmCQkJCS8qIF9fT1NfSEFTX0FHUCAqLwogCi1pbnQgZHJtX2FkZGJ1ZnNfcGNpKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KQoraW50IGRybV9hZGRidWZzX3BjaShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgY291bnQ7CiAJaW50IG9yZGVyOwogCWludCBzaXplOwogCWludCB0b3RhbDsKIAlpbnQgcGFnZV9vcmRlcjsKLQlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICplbnRyeTsKIAlkcm1fZG1hX2hhbmRsZV90ICpkbWFoOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJaW50IGFsaWdubWVudDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlpbnQgaTsKIAlpbnQgYnl0ZV9jb3VudDsKIAlpbnQgcGFnZV9jb3VudDsKIAl1bnNpZ25lZCBsb25nICp0ZW1wX3BhZ2VsaXN0OwotCWRybV9idWZfdCAqKnRlbXBfYnVmbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1ZiAqKnRlbXBfYnVmbGlzdDsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9QQ0lfRE1BKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05NTQsMTEgKzk0NywxMSBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fYWRkYnVmc19wY2kpOwogCi1zdGF0aWMgaW50IGRybV9hZGRidWZzX3NnKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KQorc3RhdGljIGludCBkcm1fYWRkYnVmc19zZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgYWdwX29mZnNldDsKIAlpbnQgY291bnQ7CkBAIC05NjksNyArOTYyLDcgQEAKIAlpbnQgdG90YWw7CiAJaW50IGJ5dGVfY291bnQ7CiAJaW50IGk7Ci0JZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCXN0cnVjdCBkcm1fYnVmICoqdGVtcF9idWZsaXN0OwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTE2LDExICsxMTA5LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfZmIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpCitzdGF0aWMgaW50IGRybV9hZGRidWZzX2ZiKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjICogcmVxdWVzdCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfZW50cnkgKmVudHJ5OworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OwogCWludCBjb3VudDsKQEAgLTExMzEsNyArMTEyNCw3IEBACiAJaW50IHRvdGFsOwogCWludCBieXRlX2NvdW50OwogCWludCBpOwotCWRybV9idWZfdCAqKnRlbXBfYnVmbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1ZiAqKnRlbXBfYnVmbGlzdDsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9GQl9ETUEpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyODMsNyArMTI3Niw3IEBACiAgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgogICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgogICogXHBhcmFtIGNtZCBjb21tYW5kLgotICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2J1Zl9kZXNjX3QgcmVxdWVzdC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIHN0cnVjdCBkcm1fYnVmX2Rlc2MgcmVxdWVzdC4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKgogICogQWNjb3JkaW5nIHdpdGggdGhlIG1lbW9yeSB0eXBlIHNwZWNpZmllZCBpbiBkcm1fYnVmX2Rlc2M6OmZsYWdzIGFuZCB0aGUKQEAgLTEyOTQsMTUgKzEyODcsMTUgQEAKIGludCBkcm1fYWRkYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2J1Zl9kZXNjX3QgcmVxdWVzdDsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlpbnQgcmV0OwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIChkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKikgYXJnLAorCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgKHN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICopIGFyZywKIAkJCSAgIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC0xMzQ2LDExICsxMzM5LDExIEBACiBpbnQgZHJtX2luZm9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2luZm9fdCByZXF1ZXN0OwotCWRybV9idWZfaW5mb190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2luZm8gcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9pbmZvIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgaTsKIAlpbnQgY291bnQ7CiAKQEAgLTEzODEsMTAgKzEzNzQsMTAgQEAKIAlpZiAocmVxdWVzdC5jb3VudCA+PSBjb3VudCkgewogCQlmb3IgKGkgPSAwLCBjb3VudCA9IDA7IGkgPCBEUk1fTUFYX09SREVSICsgMTsgaSsrKSB7CiAJCQlpZiAoZG1hLT5idWZzW2ldLmJ1Zl9jb3VudCkgewotCQkJCWRybV9idWZfZGVzY190IF9fdXNlciAqdG8gPQorCQkJCXN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICp0byA9CiAJCQkJICAgICZyZXF1ZXN0Lmxpc3RbY291bnRdOwotCQkJCWRybV9idWZfZW50cnlfdCAqZnJvbSA9ICZkbWEtPmJ1ZnNbaV07Ci0JCQkJZHJtX2ZyZWVsaXN0X3QgKmxpc3QgPSAmZG1hLT5idWZzW2ldLmZyZWVsaXN0OworCQkJCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICpmcm9tID0gJmRtYS0+YnVmc1tpXTsKKwkJCQlzdHJ1Y3QgZHJtX2ZyZWVsaXN0ICpsaXN0ID0gJmRtYS0+YnVmc1tpXS5mcmVlbGlzdDsKIAkJCQlpZiAoY29weV90b191c2VyKCZ0by0+Y291bnQsCiAJCQkJCQkgJmZyb20tPmJ1Zl9jb3VudCwKIAkJCQkJCSBzaXplb2YoZnJvbS0+YnVmX2NvdW50KSkgfHwKQEAgLTE0MzQsMTIgKzE0MjcsMTIgQEAKIGludCBkcm1fbWFya2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfZGVzY190IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcXVlc3Q7CiAJaW50IG9yZGVyOwotCWRybV9idWZfZW50cnlfdCAqZW50cnk7CisJc3RydWN0IGRybV9idWZfZW50cnkgKmVudHJ5OwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDQ4LDcgKzE0NDEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwKLQkJCSAgIChkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQkJICAgKHN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlEUk1fREVCVUcoIiVkLCAlZCwgJWRcbiIsCkBAIC0xNDg0LDEzICsxNDc3LDEzIEBACiBpbnQgZHJtX2ZyZWVidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2ZyZWVfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfZnJlZSByZXF1ZXN0OwogCWludCBpOwogCWludCBpZHg7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ5OSw3ICsxNDkyLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsCi0JCQkgICAoZHJtX2J1Zl9mcmVlX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJCSAgIChzdHJ1Y3QgZHJtX2J1Zl9mcmVlIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgcmVxdWVzdC5jb3VudCk7CkBAIC0xNTQwLDE1ICsxNTMzLDE1IEBACiBpbnQgZHJtX21hcGJ1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9tYXBfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9tYXAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCByZXRjb2RlID0gMDsKIAljb25zdCBpbnQgemVybyA9IDA7CiAJdW5zaWduZWQgbG9uZyB2aXJ0dWFsOwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQlkcm1fYnVmX21hcF90IHJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfbWFwIHJlcXVlc3Q7CiAJaW50IGk7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQpAQCAtMTU3NCw3ICsxNTY3LDcgQEAKIAkJCSYmIChkbWEtPmZsYWdzICYgX0RSTV9ETUFfVVNFX1NHKSkKIAkJICAgIHx8IChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0ZCX0RNQSkKIAkJCSYmIChkbWEtPmZsYWdzICYgX0RSTV9ETUFfVVNFX0ZCKSkpIHsKLQkJCWRybV9tYXBfdCAqbWFwID0gZGV2LT5hZ3BfYnVmZmVyX21hcDsKKwkJCXN0cnVjdCBkcm1fbWFwICptYXAgPSBkZXYtPmFncF9idWZmZXJfbWFwOwogCQkJdW5zaWduZWQgbG9uZyB0b2tlbiA9IGRldi0+YWdwX2J1ZmZlcl90b2tlbjsKIAogCQkJaWYgKCFtYXApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwppbmRleCA4MzA5NGM3Li42MWFkOTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCkBAIC01MywyNiArNTMsMTQgQEAKICAqIFxwYXJhbSBjdHhfaGFuZGxlIGNvbnRleHQgaGFuZGxlLgogICoKICAqIENsZWFycyB0aGUgYml0IHNwZWNpZmllZCBieSBccCBjdHhfaGFuZGxlIGluIGRybV9kZXZpY2U6OmN0eF9iaXRtYXAgYW5kIHRoZSBlbnRyeQotICogaW4gZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMsIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleAorICogaW4gZHJtX2RldmljZTo6Y3R4X2lkciwgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4CiAgKiBsb2NrLgogICovCi12b2lkIGRybV9jdHhiaXRtYXBfZnJlZShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjdHhfaGFuZGxlKQordm9pZCBkcm1fY3R4Yml0bWFwX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBjdHhfaGFuZGxlKQogewotCWlmIChjdHhfaGFuZGxlIDwgMCkKLQkJZ290byBmYWlsZWQ7Ci0JaWYgKCFkZXYtPmN0eF9iaXRtYXApCi0JCWdvdG8gZmFpbGVkOwotCi0JaWYgKGN0eF9oYW5kbGUgPCBEUk1fTUFYX0NUWEJJVE1BUCkgewotCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCWNsZWFyX2JpdChjdHhfaGFuZGxlLCBkZXYtPmN0eF9iaXRtYXApOwotCQlkZXYtPmNvbnRleHRfc2FyZWFzW2N0eF9oYW5kbGVdID0gTlVMTDsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCXJldHVybjsKLQl9Ci0gICAgICBmYWlsZWQ6Ci0JRFJNX0VSUk9SKCJBdHRlbXB0IHRvIGZyZWUgaW52YWxpZCBjb250ZXh0IGhhbmRsZTogJWRcbiIsIGN0eF9oYW5kbGUpOwotCXJldHVybjsKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWRyX3JlbW92ZSgmZGV2LT5jdHhfaWRyLCBjdHhfaGFuZGxlKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIH0KIAogLyoqCkBAIC04MSw2MiArNjksMjggQEAKICAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KICAqIFxyZXR1cm4gKG5vbi1uZWdhdGl2ZSkgY29udGV4dCBoYW5kbGUgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKLSAqIEZpbmQgdGhlIGZpcnN0IHplcm8gYml0IGluIGRybV9kZXZpY2U6OmN0eF9iaXRtYXAgYW5kIChyZSlhbGxvY2F0ZXMKLSAqIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgZW50cnkgd2hpbGUgaG9sZGluZyB0aGUKKyAqIEFsbG9jYXRlIGEgbmV3IGlkciBmcm9tIGRybV9kZXZpY2U6OmN0eF9pZHIgd2hpbGUgaG9sZGluZyB0aGUKICAqIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgogICovCi1zdGF0aWMgaW50IGRybV9jdHhiaXRtYXBfbmV4dChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGRybV9jdHhiaXRtYXBfbmV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlpbnQgYml0OworCWludCBuZXdfaWQ7CisJaW50IHJldDsKIAotCWlmICghZGV2LT5jdHhfYml0bWFwKQotCQlyZXR1cm4gLTE7Ci0KK2FnYWluOgorCWlmIChpZHJfcHJlX2dldCgmZGV2LT5jdHhfaWRyLCBHRlBfS0VSTkVMKSA9PSAwKSB7CisJCURSTV9FUlJPUigiT3V0IG9mIG1lbW9yeSBleHBhbmRpbmcgZHJhd2FibGUgaWRyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQliaXQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGRldi0+Y3R4X2JpdG1hcCwgRFJNX01BWF9DVFhCSVRNQVApOwotCWlmIChiaXQgPCBEUk1fTUFYX0NUWEJJVE1BUCkgewotCQlzZXRfYml0KGJpdCwgZGV2LT5jdHhfYml0bWFwKTsKLQkJRFJNX0RFQlVHKCJkcm1fY3R4Yml0bWFwX25leHQgYml0IDogJWRcbiIsIGJpdCk7Ci0JCWlmICgoYml0ICsgMSkgPiBkZXYtPm1heF9jb250ZXh0KSB7Ci0JCQlkZXYtPm1heF9jb250ZXh0ID0gKGJpdCArIDEpOwotCQkJaWYgKGRldi0+Y29udGV4dF9zYXJlYXMpIHsKLQkJCQlkcm1fbWFwX3QgKipjdHhfc2FyZWFzOwotCi0JCQkJY3R4X3NhcmVhcyA9IGRybV9yZWFsbG9jKGRldi0+Y29udGV4dF9zYXJlYXMsCi0JCQkJCQkJIChkZXYtPm1heF9jb250ZXh0IC0KLQkJCQkJCQkgIDEpICoKLQkJCQkJCQkgc2l6ZW9mKCpkZXYtPgotCQkJCQkJCQljb250ZXh0X3NhcmVhcyksCi0JCQkJCQkJIGRldi0+bWF4X2NvbnRleHQgKgotCQkJCQkJCSBzaXplb2YoKmRldi0+Ci0JCQkJCQkJCWNvbnRleHRfc2FyZWFzKSwKLQkJCQkJCQkgRFJNX01FTV9NQVBTKTsKLQkJCQlpZiAoIWN0eF9zYXJlYXMpIHsKLQkJCQkJY2xlYXJfYml0KGJpdCwgZGV2LT5jdHhfYml0bWFwKTsKLQkJCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJZGV2LT5jb250ZXh0X3NhcmVhcyA9IGN0eF9zYXJlYXM7Ci0JCQkJZGV2LT5jb250ZXh0X3NhcmVhc1tiaXRdID0gTlVMTDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogbWF4X2NvbnRleHQgPT0gMSBhdCB0aGlzIHBvaW50ICovCi0JCQkJZGV2LT5jb250ZXh0X3NhcmVhcyA9Ci0JCQkJICAgIGRybV9hbGxvYyhkZXYtPm1heF9jb250ZXh0ICoKLQkJCQkJICAgICAgc2l6ZW9mKCpkZXYtPmNvbnRleHRfc2FyZWFzKSwKLQkJCQkJICAgICAgRFJNX01FTV9NQVBTKTsKLQkJCQlpZiAoIWRldi0+Y29udGV4dF9zYXJlYXMpIHsKLQkJCQkJY2xlYXJfYml0KGJpdCwgZGV2LT5jdHhfYml0bWFwKTsKLQkJCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJZGV2LT5jb250ZXh0X3NhcmVhc1tiaXRdID0gTlVMTDsKLQkJCX0KLQkJfQorCXJldCA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZkZXYtPmN0eF9pZHIsIE5VTEwsCisJCQkJRFJNX1JFU0VSVkVEX0NPTlRFWFRTLCAmbmV3X2lkKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCXJldHVybiBiaXQ7CisJCWdvdG8gYWdhaW47CiAJfQogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCXJldHVybiAtMTsKKwlyZXR1cm4gbmV3X2lkOwogfQogCiAvKioKQEAgLTE0NCwzMSArOTgsMTEgQEAKICAqCiAgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCiAgKgotICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplIGRybV9kZXZpY2U6OmN0eF9iaXRtYXAgYW5kIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzLCB3aGlsZSBob2xkaW5nCi0gKiB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCisgKiBJbml0aWFsaXNlIHRoZSBkcm1fZGV2aWNlOjpjdHhfaWRyCiAgKi8KLWludCBkcm1fY3R4Yml0bWFwX2luaXQoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9jdHhiaXRtYXBfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlpbnQgaTsKLQlpbnQgdGVtcDsKLQotCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlkZXYtPmN0eF9iaXRtYXAgPSAodW5zaWduZWQgbG9uZyAqKWRybV9hbGxvYyhQQUdFX1NJWkUsCi0JCQkJCQkgICAgIERSTV9NRU1fQ1RYQklUTUFQKTsKLQlpZiAoZGV2LT5jdHhfYml0bWFwID09IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltZW1zZXQoKHZvaWQgKilkZXYtPmN0eF9iaXRtYXAsIDAsIFBBR0VfU0laRSk7Ci0JZGV2LT5jb250ZXh0X3NhcmVhcyA9IE5VTEw7Ci0JZGV2LT5tYXhfY29udGV4dCA9IC0xOwotCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JZm9yIChpID0gMDsgaSA8IERSTV9SRVNFUlZFRF9DT05URVhUUzsgaSsrKSB7Ci0JCXRlbXAgPSBkcm1fY3R4Yml0bWFwX25leHQoZGV2KTsKLQkJRFJNX0RFQlVHKCJkcm1fY3R4Yml0bWFwX2luaXQgOiAlZFxuIiwgdGVtcCk7Ci0JfQotCisJaWRyX2luaXQoJmRldi0+Y3R4X2lkcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NywxNyArMTExLDEzIEBACiAgKgogICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgogICoKLSAqIEZyZWVzIGRybV9kZXZpY2U6OmN0eF9iaXRtYXAgYW5kIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzLCB3aGlsZSBob2xkaW5nCi0gKiB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCisgKiBGcmVlIGFsbCBpZHIgbWVtYmVycyB1c2luZyBkcm1fY3R4X3NhcmVhX2ZyZWUgaGVscGVyIGZ1bmN0aW9uCisgKiB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KICAqLwotdm9pZCBkcm1fY3R4Yml0bWFwX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBkcm1fY3R4Yml0bWFwX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmIChkZXYtPmNvbnRleHRfc2FyZWFzKQotCQlkcm1fZnJlZShkZXYtPmNvbnRleHRfc2FyZWFzLAotCQkJIHNpemVvZigqZGV2LT5jb250ZXh0X3NhcmVhcykgKgotCQkJIGRldi0+bWF4X2NvbnRleHQsIERSTV9NRU1fTUFQUyk7Ci0JZHJtX2ZyZWUoKHZvaWQgKilkZXYtPmN0eF9iaXRtYXAsIFBBR0VfU0laRSwgRFJNX01FTV9DVFhCSVRNQVApOworCWlkcl9yZW1vdmVfYWxsKCZkZXYtPmN0eF9pZHIpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogfQogCkBAIC0yMDYsMzQgKzEzNiwzNCBAQAogICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50IHBvaW50aW5nIHRvIGEgZHJtX2N0eF9wcml2X21hcCBzdHJ1Y3R1cmUuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKLSAqIEdldHMgdGhlIG1hcCBmcm9tIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHdpdGggdGhlIGhhbmRsZSBzcGVjaWZpZWQgYW5kCisgKiBHZXRzIHRoZSBtYXAgZnJvbSBkcm1fZGV2aWNlOjpjdHhfaWRyIHdpdGggdGhlIGhhbmRsZSBzcGVjaWZpZWQgYW5kCiAgKiByZXR1cm5zIGl0cyBoYW5kbGUuCiAgKi8KIGludCBkcm1fZ2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2N0eF9wcml2X21hcF90IHJlcXVlc3Q7Ci0JZHJtX21hcF90ICptYXA7Ci0JZHJtX21hcF9saXN0X3QgKl9lbnRyeTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKl9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKGRldi0+bWF4X2NvbnRleHQgPCAwCi0JICAgIHx8IHJlcXVlc3QuY3R4X2lkID49ICh1bnNpZ25lZClkZXYtPm1heF9jb250ZXh0KSB7CisKKwltYXAgPSBpZHJfZmluZCgmZGV2LT5jdHhfaWRyLCByZXF1ZXN0LmN0eF9pZCk7CisJaWYgKCFtYXApIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1hcCA9IGRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJcmVxdWVzdC5oYW5kbGUgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKF9lbnRyeS0+bWFwID09IG1hcCkgewogCQkJcmVxdWVzdC5oYW5kbGUgPQogCQkJICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpX2VudHJ5LT51c2VyX3Rva2VuOwpAQCAtMjU4LDI1ICsxODgsMjQgQEAKICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKgogICogU2VhcmNoZXMgdGhlIG1hcHBpbmcgc3BlY2lmaWVkIGluIFxwIGFyZyBhbmQgdXBkYXRlIHRoZSBlbnRyeSBpbgotICogZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMgd2l0aCBpdC4KKyAqIGRybV9kZXZpY2U6OmN0eF9pZHIgd2l0aCBpdC4KICAqLwogaW50IGRybV9zZXRzYXJlYWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF9wcml2X21hcF90IHJlcXVlc3Q7Ci0JZHJtX21hcF90ICptYXAgPSBOVUxMOwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3QgPSBOVUxMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAotCQkJICAgKGRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQkJICAgKHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIF9fdXNlciAqKSBhcmcsCisJCQkgICBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwCiAJCSAgICAmJiByX2xpc3QtPnVzZXJfdG9rZW4gPT0gKHVuc2lnbmVkIGxvbmcpcmVxdWVzdC5oYW5kbGUpCiAJCQlnb3RvIGZvdW5kOwpAQCAtMjg5LDExICsyMTgsMTAgQEAKIAltYXAgPSByX2xpc3QtPm1hcDsKIAlpZiAoIW1hcCkKIAkJZ290byBiYWQ7Ci0JaWYgKGRldi0+bWF4X2NvbnRleHQgPCAwKQorCisJaWYgKElTX0VSUihpZHJfcmVwbGFjZSgmZGV2LT5jdHhfaWRyLCBtYXAsIHJlcXVlc3QuY3R4X2lkKSkpCiAJCWdvdG8gYmFkOwotCWlmIChyZXF1ZXN0LmN0eF9pZCA+PSAodW5zaWduZWQpZGV2LT5tYXhfY29udGV4dCkKLQkJZ290byBiYWQ7Ci0JZGV2LT5jb250ZXh0X3NhcmVhc1tyZXF1ZXN0LmN0eF9pZF0gPSBtYXA7CisKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMxNCw3ICsyNDIsNyBAQAogICoKICAqIEF0dGVtcHQgdG8gc2V0IGRybV9kZXZpY2U6OmNvbnRleHRfZmxhZy4KICAqLwotc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2goZHJtX2RldmljZV90ICogZGV2LCBpbnQgb2xkLCBpbnQgbmV3KQorc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBvbGQsIGludCBuZXcpCiB7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKSkgewogCQlEUk1fRVJST1IoIlJlZW50ZXJpbmcgLS0gRklYTUVcbiIpOwpAQCAtMzQyLDcgKzI3MCw3IEBACiAgKiBoYXJkd2FyZSBsb2NrIGlzIGhlbGQsIGNsZWFycyB0aGUgZHJtX2RldmljZTo6Y29udGV4dF9mbGFnIGFuZCB3YWtlcyB1cAogICogZHJtX2RldmljZTo6Y29udGV4dF93YWl0LgogICovCi1zdGF0aWMgaW50IGRybV9jb250ZXh0X3N3aXRjaF9jb21wbGV0ZShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuZXcpCitzdGF0aWMgaW50IGRybV9jb250ZXh0X3N3aXRjaF9jb21wbGV0ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG5ldykKIHsKIAlkZXYtPmxhc3RfY29udGV4dCA9IG5ldzsJLyogUFJFL1BPU1Q6IFRoaXMgaXMgdGhlIF9vbmx5XyB3cml0ZXIuICovCiAJZGV2LT5sYXN0X3N3aXRjaCA9IGppZmZpZXM7CkBAIC0zNzIsOSArMzAwLDkgQEAKIGludCBkcm1fcmVzY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fY3R4X3Jlc190IHJlczsKLQlkcm1fY3R4X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9jdHhfcmVzIHJlczsKKwlzdHJ1Y3QgZHJtX2N0eF9yZXMgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fY3R4IGN0eDsKIAlpbnQgaTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVzLCBhcmdwLCBzaXplb2YocmVzKSkpCkBAIC00MDksMTEgKzMzNywxMSBAQAogaW50IGRybV9hZGRjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF9saXN0X3QgKmN0eF9lbnRyeTsKLQlkcm1fY3R4X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHhfbGlzdCAqY3R4X2VudHJ5OworCXN0cnVjdCBkcm1fY3R4IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQ0OSw3ICszNzcsNyBAQAogCWN0eF9lbnRyeS0+dGFnID0gcHJpdjsKIAogCW11dGV4X2xvY2soJmRldi0+Y3R4bGlzdF9tdXRleCk7Ci0JbGlzdF9hZGQoJmN0eF9lbnRyeS0+aGVhZCwgJmRldi0+Y3R4bGlzdC0+aGVhZCk7CisJbGlzdF9hZGQoJmN0eF9lbnRyeS0+aGVhZCwgJmRldi0+Y3R4bGlzdCk7CiAJKytkZXYtPmN0eF9jb3VudDsKIAltdXRleF91bmxvY2soJmRldi0+Y3R4bGlzdF9tdXRleCk7CiAKQEAgLTQ3Nyw4ICs0MDUsOCBAQAogaW50IGRybV9nZXRjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9jdHhfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9jdHggY3R4OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIGFyZ3AsIHNpemVvZihjdHgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC01MDUsMTEgKzQzMywxMSBAQAogaW50IGRybV9zd2l0Y2hjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4IGN0eDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihjdHgpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKHN0cnVjdCBkcm1fY3R4IF9fdXNlciAqKSBhcmcsIHNpemVvZihjdHgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKQEAgLTUzMCwxMSArNDU4LDExIEBACiBpbnQgZHJtX25ld2N0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4IGN0eDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihjdHgpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKHN0cnVjdCBkcm1fY3R4IF9fdXNlciAqKSBhcmcsIHNpemVvZihjdHgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKQEAgLTU1NywxMSArNDg1LDExIEBACiBpbnQgZHJtX3JtY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CkBAIC01NzUsMTAgKzUwMywxMCBAQAogCX0KIAogCW11dGV4X2xvY2soJmRldi0+Y3R4bGlzdF9tdXRleCk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmN0eGxpc3QtPmhlYWQpKSB7Ci0JCWRybV9jdHhfbGlzdF90ICpwb3MsICpuOworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5jdHhsaXN0KSkgeworCQlzdHJ1Y3QgZHJtX2N0eF9saXN0ICpwb3MsICpuOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZkZXYtPmN0eGxpc3QtPmhlYWQsIGhlYWQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgJmRldi0+Y3R4bGlzdCwgaGVhZCkgewogCQkJaWYgKHBvcy0+aGFuZGxlID09IGN0eC5oYW5kbGUpIHsKIAkJCQlsaXN0X2RlbCgmcG9zLT5oZWFkKTsKIAkJCQlkcm1fZnJlZShwb3MsIHNpemVvZigqcG9zKSwgRFJNX01FTV9DVFhMSVNUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMKaW5kZXggMzJlZDE5Yy4uODAyZmJkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMKQEAgLTQzLDcgKzQzLDcgQEAKICAqCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRybV9kZXZpY2VfZG1hIHN0cnVjdHVyZS4KICAqLwotaW50IGRybV9kbWFfc2V0dXAoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9kbWFfc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKIApAQCAtNjcsOSArNjcsOSBAQAogICogRnJlZSBhbGwgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIERNQSBidWZmZXJzLCB0aGUgYnVmZmVycyBhbmQgcGFnZXMgbGlzdHMsIGFuZAogICogZmluYWxseSB0aGUgZHJtX2RldmljZTo6ZG1hIHN0cnVjdHVyZSBpdHNlbGYuCiAgKi8KLXZvaWQgZHJtX2RtYV90YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGRybV9kbWFfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpLCBqOwogCiAJaWYgKCFkbWEpCkBAIC0xMjksNyArMTI5LDcgQEAKICAqCiAgKiBSZXNldHMgdGhlIGZpZWxkcyBvZiBccCBidWYuCiAgKi8KLXZvaWQgZHJtX2ZyZWVfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQordm9pZCBkcm1fZnJlZV9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJaWYgKCFidWYpCiAJCXJldHVybjsKQEAgLTE1Miw5ICsxNTIsOSBAQAogICoKICAqIEZyZWVzIGVhY2ggYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBccCBmaWxwIG5vdCBhbHJlYWR5IG9uIHRoZSBoYXJkd2FyZS4KICAqLwotdm9pZCBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAKIAlpZiAoIWRtYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jCmluZGV4IGIzMzMxM2IuLmQ2Y2RiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYwpAQCAtNDQsODMgKzQ0LDMwIEBACiB7CiAJRFJNX0RFVklDRTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCWludCBpLCBqOwotCXUzMiAqYml0ZmllbGQgPSBkZXYtPmRyd19iaXRmaWVsZDsKLQl1bnNpZ25lZCBpbnQgYml0ZmllbGRfbGVuZ3RoID0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoOwotCWRybV9kcmF3YWJsZV9pbmZvX3QgKippbmZvID0gZGV2LT5kcndfaW5mbzsKLQl1bnNpZ25lZCBpbnQgaW5mb19sZW5ndGggPSBkZXYtPmRyd19pbmZvX2xlbmd0aDsKLQlkcm1fZHJhd190IGRyYXc7CisJc3RydWN0IGRybV9kcmF3IGRyYXc7CisJaW50IG5ld19pZCA9IDA7CisJaW50IHJldDsKIAotCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgYml0ZmllbGRfbGVuZ3RoOyBpKyspIHsKLQkJaWYgKGJpdGZpZWxkW2ldID09IH4wKQotCQkJY29udGludWU7Ci0KLQkJZm9yICg7IGogPCA4ICogc2l6ZW9mKCpiaXRmaWVsZCk7IGorKykKLQkJCWlmICghKGJpdGZpZWxkW2ldICYgKDEgPDwgaikpKQotCQkJCWdvdG8gZG9uZTsKK2FnYWluOgorCWlmIChpZHJfcHJlX2dldCgmZGV2LT5kcndfaWRyLCBHRlBfS0VSTkVMKSA9PSAwKSB7CisJCURSTV9FUlJPUigiT3V0IG9mIG1lbW9yeSBleHBhbmRpbmcgZHJhd2FibGUgaWRyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQotZG9uZToKLQotCWlmIChpID09IGJpdGZpZWxkX2xlbmd0aCkgewotCQliaXRmaWVsZF9sZW5ndGgrKzsKLQotCQliaXRmaWVsZCA9IGRybV9hbGxvYyhiaXRmaWVsZF9sZW5ndGggKiBzaXplb2YoKmJpdGZpZWxkKSwKLQkJCQkgICAgIERSTV9NRU1fQlVGUyk7Ci0KLQkJaWYgKCFiaXRmaWVsZCkgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IGRyYXdhYmxlIGJpdGZpZWxkXG4iKTsKLQkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7Ci0JCX0KLQotCQlpZiAoOCAqIHNpemVvZigqYml0ZmllbGQpICogYml0ZmllbGRfbGVuZ3RoID4gaW5mb19sZW5ndGgpIHsKLQkJCWluZm9fbGVuZ3RoICs9IDggKiBzaXplb2YoKmJpdGZpZWxkKTsKLQotCQkJaW5mbyA9IGRybV9hbGxvYyhpbmZvX2xlbmd0aCAqIHNpemVvZigqaW5mbyksCi0JCQkJCSBEUk1fTUVNX0JVRlMpOwotCi0JCQlpZiAoIWluZm8pIHsKLQkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgZHJhd2FibGUgaW5mbyIKLQkJCQkJICAiIGFycmF5XG4iKTsKLQotCQkJCWRybV9mcmVlKGJpdGZpZWxkLAotCQkJCQkgYml0ZmllbGRfbGVuZ3RoICogc2l6ZW9mKCpiaXRmaWVsZCksCi0JCQkJCSBEUk1fTUVNX0JVRlMpOwotCQkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7Ci0JCQl9Ci0JCX0KLQotCQliaXRmaWVsZFtpXSA9IDA7Ci0JfQotCi0JZHJhdy5oYW5kbGUgPSBpICogOCAqIHNpemVvZigqYml0ZmllbGQpICsgaiArIDE7Ci0JRFJNX0RFQlVHKCIlZFxuIiwgZHJhdy5oYW5kbGUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKLQotCWJpdGZpZWxkW2ldIHw9IDEgPDwgajsKLQlpbmZvW2RyYXcuaGFuZGxlIC0gMV0gPSBOVUxMOwotCi0JaWYgKGJpdGZpZWxkICE9IGRldi0+ZHJ3X2JpdGZpZWxkKSB7Ci0JCW1lbWNweShiaXRmaWVsZCwgZGV2LT5kcndfYml0ZmllbGQsIGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCAqCi0JCSAgICAgICBzaXplb2YoKmJpdGZpZWxkKSk7Ci0JCWRybV9mcmVlKGRldi0+ZHJ3X2JpdGZpZWxkLCBzaXplb2YoKmJpdGZpZWxkKSAqCi0JCQkgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoLCBEUk1fTUVNX0JVRlMpOwotCQlkZXYtPmRyd19iaXRmaWVsZCA9IGJpdGZpZWxkOwotCQlkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggPSBiaXRmaWVsZF9sZW5ndGg7Ci0JfQotCi0JaWYgKGluZm8gIT0gZGV2LT5kcndfaW5mbykgewotCQltZW1jcHkoaW5mbywgZGV2LT5kcndfaW5mbywgZGV2LT5kcndfaW5mb19sZW5ndGggKgotCQkgICAgICAgc2l6ZW9mKCppbmZvKSk7Ci0JCWRybV9mcmVlKGRldi0+ZHJ3X2luZm8sIHNpemVvZigqaW5mbykgKiBkZXYtPmRyd19pbmZvX2xlbmd0aCwKLQkJCSBEUk1fTUVNX0JVRlMpOwotCQlkZXYtPmRyd19pbmZvID0gaW5mbzsKLQkJZGV2LT5kcndfaW5mb19sZW5ndGggPSBpbmZvX2xlbmd0aDsKKwlyZXQgPSBpZHJfZ2V0X25ld19hYm92ZSgmZGV2LT5kcndfaWRyLCBOVUxMLCAxLCAmbmV3X2lkKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOworCQlnb3RvIGFnYWluOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKIAotCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV9kcmF3X3QgX191c2VyICopZGF0YSwgZHJhdywgc2l6ZW9mKGRyYXcpKTsKKwlkcmF3LmhhbmRsZSA9IG5ld19pZDsKKworCURSTV9ERUJVRygiJWRcbiIsIGRyYXcuaGFuZGxlKTsKKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKHN0cnVjdCBkcm1fZHJhdyBfX3VzZXIgKilkYXRhLCBkcmF3LCBzaXplb2YoZHJhdykpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzEsMTQxICs3OCw1MiBAQAogaW50IGRybV9ybWRyYXcoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZHJhd190IGRyYXc7Ci0gCWludCBpZCwgaWR4OwotIAl1bnNpZ25lZCBpbnQgc2hpZnQ7CisJc3RydWN0IGRybV9kcmF3IGRyYXc7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgaW50IGJpdGZpZWxkX2xlbmd0aCA9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aDsKLQlkcm1fZHJhd2FibGVfaW5mb190ICoqaW5mbyA9IGRldi0+ZHJ3X2luZm87Ci0JdW5zaWduZWQgaW50IGluZm9fbGVuZ3RoID0gZGV2LT5kcndfaW5mb19sZW5ndGg7CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZHJhdywgKGRybV9kcmF3X3QgX191c2VyICopIGRhdGEsCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGRyYXcsIChzdHJ1Y3QgZHJtX2RyYXcgX191c2VyICopIGRhdGEsCiAJCQkJIHNpemVvZihkcmF3KSk7CiAKLQlpZCA9IGRyYXcuaGFuZGxlIC0gMTsKLQlpZHggPSBpZCAvICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCXNoaWZ0ID0gaWQgJSAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQotCWlmIChpZHggPCAwIHx8IGlkeCA+PSBiaXRmaWVsZF9sZW5ndGggfHwKLQkgICAgIShiaXRmaWVsZFtpZHhdICYgKDEgPDwgc2hpZnQpKSkgewotCQlEUk1fREVCVUcoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIGRyYXcuaGFuZGxlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKIAotCWJpdGZpZWxkW2lkeF0gJj0gfigxIDw8IHNoaWZ0KTsKKwlkcm1fZnJlZShkcm1fZ2V0X2RyYXdhYmxlX2luZm8oZGV2LCBkcmF3LmhhbmRsZSksCisJCSBzaXplb2Yoc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvKSwgRFJNX01FTV9CVUZTKTsKKworCWlkcl9yZW1vdmUoJmRldi0+ZHJ3X2lkciwgZHJhdy5oYW5kbGUpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOwotCi0JaWYgKGluZm9baWRdKSB7Ci0JCWRybV9mcmVlKGluZm9baWRdLT5yZWN0cywgaW5mb1tpZF0tPm51bV9yZWN0cyAqCi0JCQkgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksIERSTV9NRU1fQlVGUyk7Ci0JCWRybV9mcmVlKGluZm9baWRdLCBzaXplb2YoKippbmZvKSwgRFJNX01FTV9CVUZTKTsKLQl9Ci0KLQkvKiBDYW4gd2Ugc2hyaW5rIHRoZSBhcnJheXM/ICovCi0JaWYgKGlkeCA9PSBiaXRmaWVsZF9sZW5ndGggLSAxKSB7Ci0JCXdoaWxlIChpZHggPj0gMCAmJiAhYml0ZmllbGRbaWR4XSkKLQkJCS0taWR4OwotCi0JCWJpdGZpZWxkX2xlbmd0aCA9IGlkeCArIDE7Ci0KLQkJYml0ZmllbGQgPSBOVUxMOwotCi0JCWlmIChiaXRmaWVsZF9sZW5ndGgpIHsKLQkJCWlmIChiaXRmaWVsZF9sZW5ndGggIT0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoKQotCQkJCWJpdGZpZWxkID0gZHJtX2FsbG9jKGJpdGZpZWxkX2xlbmd0aCAqCi0JCQkJCQkgICAgIHNpemVvZigqYml0ZmllbGQpLAotCQkJCQkJICAgICBEUk1fTUVNX0JVRlMpOwotCi0JCQlpZiAoIWJpdGZpZWxkKSB7Ci0JCQkJYml0ZmllbGQgPSBkZXYtPmRyd19iaXRmaWVsZDsKLQkJCQliaXRmaWVsZF9sZW5ndGggPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoYml0ZmllbGQgIT0gZGV2LT5kcndfYml0ZmllbGQpIHsKLQkJaW5mb19sZW5ndGggPSA4ICogc2l6ZW9mKCpiaXRmaWVsZCkgKiBiaXRmaWVsZF9sZW5ndGg7Ci0KLQkJaWYgKGluZm9fbGVuZ3RoKSB7Ci0JCQlpbmZvID0gZHJtX2FsbG9jKGluZm9fbGVuZ3RoICogc2l6ZW9mKCppbmZvKSwKLQkJCQkJIERSTV9NRU1fQlVGUyk7Ci0KLQkJCWlmICghaW5mbykgewotCQkJCWluZm8gPSBkZXYtPmRyd19pbmZvOwotCQkJCWluZm9fbGVuZ3RoID0gZGV2LT5kcndfaW5mb19sZW5ndGg7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJaW5mbyA9IE5VTEw7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKLQotCQlpZiAoYml0ZmllbGQpCi0JCQltZW1jcHkoYml0ZmllbGQsIGRldi0+ZHJ3X2JpdGZpZWxkLCBiaXRmaWVsZF9sZW5ndGggKgotCQkJICAgICAgIHNpemVvZigqYml0ZmllbGQpKTsKLQkJZHJtX2ZyZWUoZGV2LT5kcndfYml0ZmllbGQsIHNpemVvZigqYml0ZmllbGQpICoKLQkJCSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGgsIERSTV9NRU1fQlVGUyk7Ci0JCWRldi0+ZHJ3X2JpdGZpZWxkID0gYml0ZmllbGQ7Ci0JCWRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCA9IGJpdGZpZWxkX2xlbmd0aDsKLQotCQlpZiAoaW5mbyAhPSBkZXYtPmRyd19pbmZvKSB7Ci0JCQlpZiAoaW5mbykKLQkJCQltZW1jcHkoaW5mbywgZGV2LT5kcndfaW5mbywgaW5mb19sZW5ndGggKgotCQkJCSAgICAgICBzaXplb2YoKmluZm8pKTsKLQkJCWRybV9mcmVlKGRldi0+ZHJ3X2luZm8sIHNpemVvZigqaW5mbykgKgotCQkJCSBkZXYtPmRyd19pbmZvX2xlbmd0aCwgRFJNX01FTV9CVUZTKTsKLQkJCWRldi0+ZHJ3X2luZm8gPSBpbmZvOwotCQkJZGV2LT5kcndfaW5mb19sZW5ndGggPSBpbmZvX2xlbmd0aDsKLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKLQl9Ci0KIAlEUk1fREVCVUcoIiVkXG4iLCBkcmF3LmhhbmRsZSk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBkcm1fdXBkYXRlX2RyYXdhYmxlX2luZm8oRFJNX0lPQ1RMX0FSR1MpIHsKK2ludCBkcm1fdXBkYXRlX2RyYXdhYmxlX2luZm8oRFJNX0lPQ1RMX0FSR1MpCit7CiAJRFJNX0RFVklDRTsKLQlkcm1fdXBkYXRlX2RyYXdfdCB1cGRhdGU7Ci0JdW5zaWduZWQgaW50IGlkLCBpZHgsIHNoaWZ0OwotCXUzMiAqYml0ZmllbGQgPSBkZXYtPmRyd19iaXRmaWVsZDsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzLCBiaXRmaWVsZF9sZW5ndGggPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGg7Ci0JZHJtX2RyYXdhYmxlX2luZm9fdCAqaW5mbzsKLQlkcm1fY2xpcF9yZWN0X3QgKnJlY3RzOworCXN0cnVjdCBkcm1fdXBkYXRlX2RyYXcgdXBkYXRlOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzOworCXN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyAqaW5mbzsKIAlpbnQgZXJyOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHVwZGF0ZSwgKGRybV91cGRhdGVfZHJhd190IF9fdXNlciAqKSBkYXRhLAorCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh1cGRhdGUsIChzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IF9fdXNlciAqKSBkYXRhLAogCQkJCSBzaXplb2YodXBkYXRlKSk7CiAKLQlpZCA9IHVwZGF0ZS5oYW5kbGUgLSAxOwotCWlkeCA9IGlkIC8gKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0Jc2hpZnQgPSBpZCAlICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCi0JaWYgKGlkeCA8IDAgfHwgaWR4ID49IGJpdGZpZWxkX2xlbmd0aCB8fAotCSAgICAhKGJpdGZpZWxkW2lkeF0gJiAoMSA8PCBzaGlmdCkpKSB7Ci0JCURSTV9FUlJPUigiTm8gc3VjaCBkcmF3YWJsZSAlZFxuIiwgdXBkYXRlLmhhbmRsZSk7Ci0JCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Ci0JfQotCi0JaW5mbyA9IGRldi0+ZHJ3X2luZm9baWRdOwotCisJaW5mbyA9IGlkcl9maW5kKCZkZXYtPmRyd19pZHIsIHVwZGF0ZS5oYW5kbGUpOwogCWlmICghaW5mbykgewotCQlpbmZvID0gZHJtX2NhbGxvYygxLCBzaXplb2YoZHJtX2RyYXdhYmxlX2luZm9fdCksIERSTV9NRU1fQlVGUyk7Ci0KLQkJaWYgKCFpbmZvKSB7Ci0JCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBkcmF3YWJsZSBpbmZvIG1lbW9yeVxuIik7Ci0JCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQlpbmZvID0gZHJtX2NhbGxvYygxLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOworCQlpZiAoIWluZm8pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKElTX0VSUihpZHJfcmVwbGFjZSgmZGV2LT5kcndfaWRyLCBpbmZvLCB1cGRhdGUuaGFuZGxlKSkpIHsKKwkJCURSTV9FUlJPUigiTm8gc3VjaCBkcmF3YWJsZSAlZFxuIiwgdXBkYXRlLmhhbmRsZSk7CisJCQlkcm1fZnJlZShpbmZvLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKIAlzd2l0Y2ggKHVwZGF0ZS50eXBlKSB7CiAJY2FzZSBEUk1fRFJBV0FCTEVfQ0xJUFJFQ1RTOgogCQlpZiAodXBkYXRlLm51bSAhPSBpbmZvLT5udW1fcmVjdHMpIHsKLQkJCXJlY3RzID0gZHJtX2FsbG9jKHVwZGF0ZS5udW0gKiBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwKKwkJCXJlY3RzID0gZHJtX2FsbG9jKHVwZGF0ZS5udW0gKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLAogCQkJCQkgRFJNX01FTV9CVUZTKTsKIAkJfSBlbHNlCiAJCQlyZWN0cyA9IGluZm8tPnJlY3RzOwpAQCAtMjc3LDcgKzEzNSw3IEBACiAJCX0KIAogCQlpZiAodXBkYXRlLm51bSAmJiBEUk1fQ09QWV9GUk9NX1VTRVIocmVjdHMsCi0JCQkJCQkgICAgIChkcm1fY2xpcF9yZWN0X3QgX191c2VyICopCisJCQkJCQkgICAgIChzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKikKIAkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpdXBkYXRlLmRhdGEsCiAJCQkJCQkgICAgIHVwZGF0ZS5udW0gKgogCQkJCQkJICAgICBzaXplb2YoKnJlY3RzKSkpIHsKQEAgLTI5MCwxNyArMTQ4LDE2IEBACiAKIAkJaWYgKHJlY3RzICE9IGluZm8tPnJlY3RzKSB7CiAJCQlkcm1fZnJlZShpbmZvLT5yZWN0cywgaW5mby0+bnVtX3JlY3RzICoKLQkJCQkgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksIERSTV9NRU1fQlVGUyk7CisJCQkJIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksIERSTV9NRU1fQlVGUyk7CiAJCX0KIAogCQlpbmZvLT5yZWN0cyA9IHJlY3RzOwogCQlpbmZvLT5udW1fcmVjdHMgPSB1cGRhdGUubnVtOwotCQlkZXYtPmRyd19pbmZvW2lkXSA9IGluZm87CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOwogCiAJCURSTV9ERUJVRygiVXBkYXRlZCAlZCBjbGlwcmVjdHMgZm9yIGRyYXdhYmxlICVkXG4iLAotCQkJICBpbmZvLT5udW1fcmVjdHMsIGlkKTsKKwkJCSAgaW5mby0+bnVtX3JlY3RzLCB1cGRhdGUuaGFuZGxlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJJbnZhbGlkIHVwZGF0ZSB0eXBlICVkXG4iLCB1cGRhdGUudHlwZSk7CkBAIC0zMTAsMTEgKzE2Nyw5IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yOgotCWlmICghZGV2LT5kcndfaW5mb1tpZF0pCi0JCWRybV9mcmVlKGluZm8sIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7Ci0JZWxzZSBpZiAocmVjdHMgIT0gZGV2LT5kcndfaW5mb1tpZF0tPnJlY3RzKQotCQlkcm1fZnJlZShyZWN0cywgdXBkYXRlLm51bSAqCi0JCQkgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksIERSTV9NRU1fQlVGUyk7CisJaWYgKHJlY3RzICE9IGluZm8tPnJlY3RzKQorCQlkcm1fZnJlZShyZWN0cywgdXBkYXRlLm51bSAqIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksCisJCQkgRFJNX01FTV9CVUZTKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0zMjIsMjAgKzE3NywyNyBAQAogLyoqCiAgKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkcmF3YWJsZSBzcGlubG9jayEKICAqLwotZHJtX2RyYXdhYmxlX2luZm9fdCAqZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZHJhd2FibGVfdCBpZCkgewotCXUzMiAqYml0ZmllbGQgPSBkZXYtPmRyd19iaXRmaWVsZDsKLQl1bnNpZ25lZCBpbnQgaWR4LCBzaGlmdDsKLQotCWlkLS07Ci0JaWR4ID0gaWQgLyAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQlzaGlmdCA9IGlkICUgKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0KLQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoIHx8Ci0JICAgICEoYml0ZmllbGRbaWR4XSAmICgxIDw8IHNoaWZ0KSkpIHsKLQkJRFJNX0RFQlVHKCJObyBzdWNoIGRyYXdhYmxlICVkXG4iLCBpZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBkZXYtPmRyd19pbmZvW2lkXTsKK3N0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyAqZHJtX2dldF9kcmF3YWJsZV9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9kcmF3YWJsZV90IGlkKQoreworCXJldHVybiBpZHJfZmluZCgmZGV2LT5kcndfaWRyLCBpZCk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9nZXRfZHJhd2FibGVfaW5mbyk7CisKK3N0YXRpYyBpbnQgZHJtX2RyYXdhYmxlX2ZyZWUoaW50IGlkciwgdm9pZCAqcCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmluZm8gPSBwOworCisJaWYgKGluZm8pIHsKKwkJZHJtX2ZyZWUoaW5mby0+cmVjdHMsIGluZm8tPm51bV9yZWN0cyAqCisJCQkgc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSwgRFJNX01FTV9CVUZTKTsKKwkJZHJtX2ZyZWUoaW5mbywgc2l6ZW9mKCppbmZvKSwgRFJNX01FTV9CVUZTKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkcm1fZHJhd2FibGVfZnJlZV9hbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpZHJfZm9yX2VhY2goJmRldi0+ZHJ3X2lkciwgZHJtX2RyYXdhYmxlX2ZyZWUsIE5VTEwpOworCWlkcl9yZW1vdmVfYWxsKCZkZXYtPmRyd19pZHIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwppbmRleCA4ZTc3YjdlLi4xOTk5NGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwpAQCAtMTI5LDExICsxMjksMTEgQEAKICAqCiAgKiBcc2EgZHJtX2RldmljZQogICovCi1pbnQgZHJtX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fbWFnaWNfZW50cnlfdCAqcHQsICpuZXh0OwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0JZHJtX3ZtYV9lbnRyeV90ICp2bWEsICp2bWFfbmV4dDsKKwlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICpwdCwgKm5leHQ7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0LCAqbGlzdF90OworCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICp2bWEsICp2bWFfdGVtcDsKIAlpbnQgaTsKIAogCURSTV9ERUJVRygiXG4iKTsKQEAgLTE1MSwxOSArMTUxLDEwIEBACiAJaWYgKGRldi0+aXJxX2VuYWJsZWQpCiAJCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CiAKLQkvKiBGcmVlIGRyYXdhYmxlIGluZm9ybWF0aW9uIG1lbW9yeSAqLwotCWZvciAoaSA9IDA7IGkgPCBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggLyBzaXplb2YoKmRldi0+ZHJ3X2JpdGZpZWxkKTsKLQkgICAgIGkrKykgewotCQlkcm1fZHJhd2FibGVfaW5mb190ICppbmZvID0gZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRldiwgaSk7Ci0KLQkJaWYgKGluZm8pIHsKLQkJCWRybV9mcmVlKGluZm8tPnJlY3RzLCBpbmZvLT5udW1fcmVjdHMgKgotCQkJCSBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwgRFJNX01FTV9CVUZTKTsKLQkJCWRybV9mcmVlKGluZm8sIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7Ci0JCX0KLQl9Ci0KIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwkvKiBGcmVlIGRyYXdhYmxlIGluZm9ybWF0aW9uIG1lbW9yeSAqLworCWRybV9kcmF3YWJsZV9mcmVlX2FsbChkZXYpOwogCWRlbF90aW1lcigmZGV2LT50aW1lcik7CiAKIAkvKiBDbGVhciBwaWQgbGlzdCAqLwpAQCAtMTc4LDE5ICsxNjksMTcgQEAKIAogCS8qIENsZWFyIEFHUCBpbmZvcm1hdGlvbiAqLwogCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3ApIHsKLQkJZHJtX2FncF9tZW1fdCAqZW50cnk7Ci0JCWRybV9hZ3BfbWVtX3QgKm5leHRlOworCQlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5LCAqdGVtcGU7CiAKIAkJLyogUmVtb3ZlIEFHUCByZXNvdXJjZXMsIGJ1dCBsZWF2ZSBkZXYtPmFncAogCQkgICBpbnRhY3QgdW50aWwgZHJ2X2NsZWFudXAgaXMgY2FsbGVkLiAqLwotCQlmb3IgKGVudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsgZW50cnk7IGVudHJ5ID0gbmV4dGUpIHsKLQkJCW5leHRlID0gZW50cnktPm5leHQ7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgdGVtcGUsICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKSB7CiAJCQlpZiAoZW50cnktPmJvdW5kKQogCQkJCWRybV91bmJpbmRfYWdwKGVudHJ5LT5tZW1vcnkpOwogCQkJZHJtX2ZyZWVfYWdwKGVudHJ5LT5tZW1vcnksIGVudHJ5LT5wYWdlcyk7CiAJCQlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOwogCQl9Ci0JCWRldi0+YWdwLT5tZW1vcnkgPSBOVUxMOworCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5hZ3AtPm1lbW9yeSk7CiAKIAkJaWYgKGRldi0+YWdwLT5hY3F1aXJlZCkKIAkJCWRybV9hZ3BfcmVsZWFzZShkZXYpOwpAQCAtMjA0LDIwICsxOTMsMTQgQEAKIAl9CiAKIAkvKiBDbGVhciB2bWEgbGlzdCAob25seSBidWlsdCBmb3IgZGVidWdnaW5nKSAqLwotCWlmIChkZXYtPnZtYWxpc3QpIHsKLQkJZm9yICh2bWEgPSBkZXYtPnZtYWxpc3Q7IHZtYTsgdm1hID0gdm1hX25leHQpIHsKLQkJCXZtYV9uZXh0ID0gdm1hLT5uZXh0OwotCQkJZHJtX2ZyZWUodm1hLCBzaXplb2YoKnZtYSksIERSTV9NRU1fVk1BUyk7Ci0JCX0KLQkJZGV2LT52bWFsaXN0ID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodm1hLCB2bWFfdGVtcCwgJmRldi0+dm1hbGlzdCwgaGVhZCkgeworCQlsaXN0X2RlbCgmdm1hLT5oZWFkKTsKKwkJZHJtX2ZyZWUodm1hLCBzaXplb2YoKnZtYSksIERSTV9NRU1fVk1BUyk7CiAJfQogCi0JaWYgKGRldi0+bWFwbGlzdCkgewotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+bWFwbGlzdC0+aGVhZCkpIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSBkZXYtPm1hcGxpc3QtPmhlYWQubmV4dDsKLQkJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwotCQkJZHJtX3JtbWFwX2xvY2tlZChkZXYsIHJfbGlzdC0+bWFwKTsKLQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyX2xpc3QsIGxpc3RfdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgeworCQlkcm1fcm1tYXBfbG9ja2VkKGRldiwgcl9saXN0LT5tYXApOworCQlyX2xpc3QgPSBOVUxMOwogCX0KIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0RNQV9RVUVVRSkgJiYgZGV2LT5xdWV1ZWxpc3QpIHsKQEAgLTI5OCw3ICsyODEsNyBAQAogICoKICAqIFxzYSBkcm1faW5pdAogICovCi1zdGF0aWMgdm9pZCBkcm1fY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBkcm1fY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlEUk1fREVCVUcoIlxuIik7CiAKQEAgLTMwOSwxMSArMjkyLDcgQEAKIAogCWRybV9sYXN0Y2xvc2UoZGV2KTsKIAotCWlmIChkZXYtPm1hcGxpc3QpIHsKLQkJZHJtX2ZyZWUoZGV2LT5tYXBsaXN0LCBzaXplb2YoKmRldi0+bWFwbGlzdCksIERSTV9NRU1fTUFQUyk7Ci0JCWRldi0+bWFwbGlzdCA9IE5VTEw7Ci0JCWRybV9odF9yZW1vdmUoJmRldi0+bWFwX2hhc2gpOwotCX0KKwlkcm1faHRfcmVtb3ZlKCZkZXYtPm1hcF9oYXNoKTsKIAogCWRybV9jdHhiaXRtYXBfY2xlYW51cChkZXYpOwogCkBAIC0zNDIsOCArMzIxLDggQEAKIHZvaWQgZHJtX2V4aXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKIHsKIAlpbnQgaTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7Ci0JZHJtX2hlYWRfdCAqaGVhZDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQ7CiAKIAlEUk1fREVCVUcoIlxuIik7CiAKQEAgLTQ0MiwxMCArNDIxLDEwIEBACiBzdGF0aWMgaW50IGRybV92ZXJzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fdmVyc2lvbl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fdmVyc2lvbl90IHZlcnNpb247CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV92ZXJzaW9uIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX3ZlcnNpb24gdmVyc2lvbjsKIAlpbnQgbGVuOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZXJzaW9uLCBhcmdwLCBzaXplb2YodmVyc2lvbikpKQpAQCAtNDc4LDggKzQ1Nyw4IEBACiBpbnQgZHJtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2lvY3RsX2Rlc2NfdCAqaW9jdGw7CiAJZHJtX2lvY3RsX3QgKmZ1bmM7CiAJdW5zaWduZWQgaW50IG5yID0gRFJNX0lPQ1RMX05SKGNtZCk7CkBAIC01MjksMyArNTA4LDE3IEBACiB9CiAKIEVYUE9SVF9TWU1CT0woZHJtX2lvY3RsKTsKKworZHJtX2xvY2FsX21hcF90ICpkcm1fZ2V0c2FyZWEoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKKwkJaWYgKGVudHJ5LT5tYXAgJiYgZW50cnktPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgorCQkgICAgKGVudHJ5LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSkgeworCQkJcmV0dXJuIGVudHJ5LT5tYXA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRzYXJlYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKaW5kZXggM2IxNTljYS4uN2JjNTFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwpAQCAtMzksOSArMzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICBkcm1fZGV2aWNlX3QgKiBkZXYpOworCQkJICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCi1zdGF0aWMgaW50IGRybV9zZXR1cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGRybV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbG9jYWxfbWFwX3QgKm1hcDsKIAlpbnQgaTsKQEAgLTc5LDEzICs3OSw2IEBACiAJZHJtX2h0X2NyZWF0ZSgmZGV2LT5tYWdpY2xpc3QsIERSTV9NQUdJQ19IQVNIX09SREVSKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5tYWdpY2ZyZWUpOwogCi0JZGV2LT5jdHhsaXN0ID0gZHJtX2FsbG9jKHNpemVvZigqZGV2LT5jdHhsaXN0KSwgRFJNX01FTV9DVFhMSVNUKTsKLQlpZiAoZGV2LT5jdHhsaXN0ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChkZXYtPmN0eGxpc3QsIDAsIHNpemVvZigqZGV2LT5jdHhsaXN0KSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+Y3R4bGlzdC0+aGVhZCk7Ci0KLQlkZXYtPnZtYWxpc3QgPSBOVUxMOwogCWRldi0+c2lnZGF0YS5sb2NrID0gTlVMTDsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPmxvY2subG9ja19xdWV1ZSk7CiAJZGV2LT5xdWV1ZV9jb3VudCA9IDA7CkBAIC0xMzUsNyArMTI4LDcgQEAKICAqLwogaW50IGRybV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gTlVMTDsKIAlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwogCWludCByZXRjb2RlID0gMDsKIApAQCAtMTc0LDcgKzE2Nyw3IEBACiAgKi8KIGludCBkcm1fc3R1Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gTlVMTDsKIAlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwogCWludCBlcnIgPSAtRU5PREVWOwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOwpAQCAtMjMwLDEwICsyMjMsMTAgQEAKICAqIGZpbHAgYW5kIGFkZCBpdCBpbnRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgaW4gXHAgZGV2LgogICovCiBzdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgIGRybV9kZXZpY2VfdCAqIGRldikKKwkJCSAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0JZHJtX2ZpbGVfdCAqcHJpdjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXY7CiAJaW50IHJldDsKIAogCWlmIChmaWxwLT5mX2ZsYWdzICYgT19FWENMKQpAQCAtMjU4LDYgKzI1MSw4IEBACiAJcHJpdi0+YXV0aGVudGljYXRlZCA9IGNhcGFibGUoQ0FQX1NZU19BRE1JTik7CiAJcHJpdi0+bG9ja19jb3VudCA9IDA7CiAKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+bGhlYWQpOworCiAJaWYgKGRldi0+ZHJpdmVyLT5vcGVuKSB7CiAJCXJldCA9IGRldi0+ZHJpdmVyLT5vcGVuKGRldiwgcHJpdik7CiAJCWlmIChyZXQgPCAwKQpAQCAtMjY1LDE5ICsyNjAsMTAgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKCFkZXYtPmZpbGVfbGFzdCkgewotCQlwcml2LT5uZXh0ID0gTlVMTDsKLQkJcHJpdi0+cHJldiA9IE5VTEw7Ci0JCWRldi0+ZmlsZV9maXJzdCA9IHByaXY7Ci0JCWRldi0+ZmlsZV9sYXN0ID0gcHJpdjsKLQkJLyogZmlyc3Qgb3BlbmVyIGF1dG9tYXRpY2FsbHkgYmVjb21lcyBtYXN0ZXIgKi8KKwlpZiAobGlzdF9lbXB0eSgmZGV2LT5maWxlbGlzdCkpCiAJCXByaXYtPm1hc3RlciA9IDE7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+bmV4dCA9IE5VTEw7Ci0JCXByaXYtPnByZXYgPSBkZXYtPmZpbGVfbGFzdDsKLQkJZGV2LT5maWxlX2xhc3QtPm5leHQgPSBwcml2OwotCQlkZXYtPmZpbGVfbGFzdCA9IHByaXY7Ci0JfQorCisJbGlzdF9hZGQoJnByaXYtPmxoZWFkLCAmZGV2LT5maWxlbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKICNpZmRlZiBfX2FscGhhX18KQEAgLTMwOSw4ICsyOTUsOCBAQAogLyoqIE5vLW9wLiAqLwogaW50IGRybV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldGNvZGU7CiAKIAlEUk1fREVCVUcoImZkID0gJWQsIGRldmljZSA9IDB4JWx4XG4iLCBmZCwKQEAgLTMzNiw4ICszMjIsOCBAQAogICovCiBpbnQgZHJtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlpbnQgcmV0Y29kZSA9IDA7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtNDE0LDEwICs0MDAsMTAgQEAKIAlkcm1fZmFzeW5jKC0xLCBmaWxwLCAwKTsKIAogCW11dGV4X2xvY2soJmRldi0+Y3R4bGlzdF9tdXRleCk7Ci0JaWYgKGRldi0+Y3R4bGlzdCAmJiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdC0+aGVhZCkpKSB7Ci0JCWRybV9jdHhfbGlzdF90ICpwb3MsICpuOworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5jdHhsaXN0KSkgeworCQlzdHJ1Y3QgZHJtX2N0eF9saXN0ICpwb3MsICpuOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZkZXYtPmN0eGxpc3QtPmhlYWQsIGhlYWQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgJmRldi0+Y3R4bGlzdCwgaGVhZCkgewogCQkJaWYgKHBvcy0+dGFnID09IHByaXYgJiYKIAkJCSAgICBwb3MtPmhhbmRsZSAhPSBEUk1fS0VSTkVMX0NPTlRFWFQpIHsKIAkJCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfZHRvcikKQEAgLTQzNiwyMiArNDIyLDEyIEBACiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHByaXYtPnJlbW92ZV9hdXRoX29uX2Nsb3NlID09IDEpIHsKLQkJZHJtX2ZpbGVfdCAqdGVtcCA9IGRldi0+ZmlsZV9maXJzdDsKLQkJd2hpbGUgKHRlbXApIHsKKwkJc3RydWN0IGRybV9maWxlICp0ZW1wOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcCwgJmRldi0+ZmlsZWxpc3QsIGxoZWFkKQogCQkJdGVtcC0+YXV0aGVudGljYXRlZCA9IDA7Ci0JCQl0ZW1wID0gdGVtcC0+bmV4dDsKLQkJfQogCX0KLQlpZiAocHJpdi0+cHJldikgewotCQlwcml2LT5wcmV2LT5uZXh0ID0gcHJpdi0+bmV4dDsKLQl9IGVsc2UgewotCQlkZXYtPmZpbGVfZmlyc3QgPSBwcml2LT5uZXh0OwotCX0KLQlpZiAocHJpdi0+bmV4dCkgewotCQlwcml2LT5uZXh0LT5wcmV2ID0gcHJpdi0+cHJldjsKLQl9IGVsc2UgewotCQlkZXYtPmZpbGVfbGFzdCA9IHByaXYtPnByZXY7Ci0JfQorCWxpc3RfZGVsKCZwcml2LT5saGVhZCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlpZiAoZGV2LT5kcml2ZXItPnBvc3RjbG9zZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuYwppbmRleCAzMWFjYjYyLi4zYWQzMTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSAiZHJtX2hhc2h0YWIuaCIKICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAKLWludCBkcm1faHRfY3JlYXRlKGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGludCBvcmRlcikKK2ludCBkcm1faHRfY3JlYXRlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgaW50IG9yZGVyKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC02Myw5ICs2Myw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZHJtX2h0X3ZlcmJvc2VfbGlzdChkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSkKK3ZvaWQgZHJtX2h0X3ZlcmJvc2VfbGlzdChzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KQogewotCWRybV9oYXNoX2l0ZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmVudHJ5OwogCXN0cnVjdCBobGlzdF9oZWFkICpoX2xpc3Q7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3Q7CiAJdW5zaWduZWQgaW50IGhhc2hlZF9rZXk7CkBAIC03NSwxNSArNzUsMTUgQEAKIAlEUk1fREVCVUcoIktleSBpcyAweCUwOGx4LCBIYXNoZWQga2V5IGlzIDB4JTA4eFxuIiwga2V5LCBoYXNoZWRfa2V5KTsKIAloX2xpc3QgPSAmaHQtPnRhYmxlW2hhc2hlZF9rZXldOwogCWhsaXN0X2Zvcl9lYWNoKGxpc3QsIGhfbGlzdCkgewotCQllbnRyeSA9IGhsaXN0X2VudHJ5KGxpc3QsIGRybV9oYXNoX2l0ZW1fdCwgaGVhZCk7CisJCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRybV9oYXNoX2l0ZW0sIGhlYWQpOwogCQlEUk1fREVCVUcoImNvdW50ICVkLCBrZXk6IDB4JTA4bHhcbiIsIGNvdW50KyssIGVudHJ5LT5rZXkpOwogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpkcm1faHRfZmluZF9rZXkoZHJtX29wZW5faGFzaF90ICpodCwgCitzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmRybV9odF9maW5kX2tleShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIAogCQkJCQkgIHVuc2lnbmVkIGxvbmcga2V5KQogewotCWRybV9oYXNoX2l0ZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmVudHJ5OwogCXN0cnVjdCBobGlzdF9oZWFkICpoX2xpc3Q7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3Q7CiAJdW5zaWduZWQgaW50IGhhc2hlZF9rZXk7CkBAIC05MSw3ICs5MSw3IEBACiAJaGFzaGVkX2tleSA9IGhhc2hfbG9uZyhrZXksIGh0LT5vcmRlcik7CiAJaF9saXN0ID0gJmh0LT50YWJsZVtoYXNoZWRfa2V5XTsKIAlobGlzdF9mb3JfZWFjaChsaXN0LCBoX2xpc3QpIHsKLQkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBkcm1faGFzaF9pdGVtX3QsIGhlYWQpOworCQllbnRyeSA9IGhsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1faGFzaF9pdGVtLCBoZWFkKTsKIAkJaWYgKGVudHJ5LT5rZXkgPT0ga2V5KQogCQkJcmV0dXJuIGxpc3Q7CiAJCWlmIChlbnRyeS0+a2V5ID4ga2V5KQpAQCAtMTAxLDkgKzEwMSw5IEBACiB9CiAKIAotaW50IGRybV9odF9pbnNlcnRfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0pCitpbnQgZHJtX2h0X2luc2VydF9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0pCiB7Ci0JZHJtX2hhc2hfaXRlbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqZW50cnk7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhfbGlzdDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbGlzdCwgKnBhcmVudDsKIAl1bnNpZ25lZCBpbnQgaGFzaGVkX2tleTsKQEAgLTExMyw3ICsxMTMsNyBAQAogCWhfbGlzdCA9ICZodC0+dGFibGVbaGFzaGVkX2tleV07CiAJcGFyZW50ID0gTlVMTDsKIAlobGlzdF9mb3JfZWFjaChsaXN0LCBoX2xpc3QpIHsKLQkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBkcm1faGFzaF9pdGVtX3QsIGhlYWQpOworCQllbnRyeSA9IGhsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1faGFzaF9pdGVtLCBoZWFkKTsKIAkJaWYgKGVudHJ5LT5rZXkgPT0ga2V5KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChlbnRyeS0+a2V5ID4ga2V5KQpAQCAtMTMyLDcgKzEzMiw3IEBACiAgKiBKdXN0IGluc2VydCBhbiBpdGVtIGFuZCByZXR1cm4gYW55ICJiaXRzIiBiaXQga2V5IHRoYXQgaGFzbid0IGJlZW4gCiAgKiB1c2VkIGJlZm9yZS4KICAqLwotaW50IGRybV9odF9qdXN0X2luc2VydF9wbGVhc2UoZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtLAoraW50IGRybV9odF9qdXN0X2luc2VydF9wbGVhc2Uoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaXRlbSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2VlZCwgaW50IGJpdHMsIGludCBzaGlmdCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkKQogewpAQCAtMTU2LDggKzE1Niw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkcm1faHRfZmluZF9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5LAotCQkgICAgIGRybV9oYXNoX2l0ZW1fdCAqKml0ZW0pCitpbnQgZHJtX2h0X2ZpbmRfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5LAorCQkgICAgIHN0cnVjdCBkcm1faGFzaF9pdGVtICoqaXRlbSkKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbGlzdDsKIApAQCAtMTY1LDExICsxNjUsMTEgQEAKIAlpZiAoIWxpc3QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JKml0ZW0gPSBobGlzdF9lbnRyeShsaXN0LCBkcm1faGFzaF9pdGVtX3QsIGhlYWQpOworCSppdGVtID0gaGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRybV9oYXNoX2l0ZW0sIGhlYWQpOwogCXJldHVybiAwOwogfQogCi1pbnQgZHJtX2h0X3JlbW92ZV9rZXkoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXkpCitpbnQgZHJtX2h0X3JlbW92ZV9rZXkoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSkKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbGlzdDsKIApAQCAtMTgyLDE0ICsxODIsMTQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotaW50IGRybV9odF9yZW1vdmVfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0pCitpbnQgZHJtX2h0X3JlbW92ZV9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0pCiB7CiAJaGxpc3RfZGVsX2luaXQoJml0ZW0tPmhlYWQpOwogCWh0LT5maWxsLS07CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZHJtX2h0X3JlbW92ZShkcm1fb3Blbl9oYXNoX3QgKmh0KQordm9pZCBkcm1faHRfcmVtb3ZlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCkKIHsKIAlpZiAoaHQtPnRhYmxlKSB7CiAJCWlmIChodC0+dXNlX3ZtYWxsb2MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmgKaW5kZXggNjEzMDkxYy4uMGYxMzc2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuaApAQCAtMzcsMzEgKzM3LDMxIEBACiAKICNkZWZpbmUgZHJtX2hhc2hfZW50cnkoX3B0ciwgX3R5cGUsIF9tZW1iZXIpIGNvbnRhaW5lcl9vZihfcHRyLCBfdHlwZSwgX21lbWJlcikKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2hhc2hfaXRlbXsKK3N0cnVjdCBkcm1faGFzaF9pdGVtIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBoZWFkOwogCXVuc2lnbmVkIGxvbmcga2V5OwotfSBkcm1faGFzaF9pdGVtX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fb3Blbl9oYXNoeworc3RydWN0IGRybV9vcGVuX2hhc2ggewogCXVuc2lnbmVkIGludCBzaXplOwogCXVuc2lnbmVkIGludCBvcmRlcjsKIAl1bnNpZ25lZCBpbnQgZmlsbDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqdGFibGU7CiAJaW50IHVzZV92bWFsbG9jOwotfSBkcm1fb3Blbl9oYXNoX3Q7Cit9OwogCiAKLWV4dGVybiBpbnQgZHJtX2h0X2NyZWF0ZShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBpbnQgb3JkZXIpOwotZXh0ZXJuIGludCBkcm1faHRfaW5zZXJ0X2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtKTsKLWV4dGVybiBpbnQgZHJtX2h0X2p1c3RfaW5zZXJ0X3BsZWFzZShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0sCitleHRlcm4gaW50IGRybV9odF9jcmVhdGUoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBpbnQgb3JkZXIpOworZXh0ZXJuIGludCBkcm1faHRfaW5zZXJ0X2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaXRlbSk7CitleHRlcm4gaW50IGRybV9odF9qdXN0X2luc2VydF9wbGVhc2Uoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaXRlbSwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2VlZCwgaW50IGJpdHMsIGludCBzaGlmdCwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkKTsKLWV4dGVybiBpbnQgZHJtX2h0X2ZpbmRfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSwgZHJtX2hhc2hfaXRlbV90ICoqaXRlbSk7CitleHRlcm4gaW50IGRybV9odF9maW5kX2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKippdGVtKTsKIAotZXh0ZXJuIHZvaWQgZHJtX2h0X3ZlcmJvc2VfbGlzdChkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSk7Ci1leHRlcm4gaW50IGRybV9odF9yZW1vdmVfa2V5KGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KTsKLWV4dGVybiBpbnQgZHJtX2h0X3JlbW92ZV9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSk7Ci1leHRlcm4gdm9pZCBkcm1faHRfcmVtb3ZlKGRybV9vcGVuX2hhc2hfdCAqaHQpOworZXh0ZXJuIHZvaWQgZHJtX2h0X3ZlcmJvc2VfbGlzdChzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KTsKK2V4dGVybiBpbnQgZHJtX2h0X3JlbW92ZV9rZXkoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSk7CitleHRlcm4gaW50IGRybV9odF9yZW1vdmVfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtKTsKK2V4dGVybiB2b2lkIGRybV9odF9yZW1vdmUoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0KTsKIAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCmluZGV4IGZhZmViMzQuLjQ2MmY0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYwpAQCAtODIsNyArODIsNyBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX3ZlcnNpb24zMl90IHYzMjsKLQlkcm1fdmVyc2lvbl90IF9fdXNlciAqdmVyc2lvbjsKKwlzdHJ1Y3QgZHJtX3ZlcnNpb24gX191c2VyICp2ZXJzaW9uOwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnYzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodjMyKSkpCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fdW5pcXVlMzJfdCB1cTMyOwotCWRybV91bmlxdWVfdCBfX3VzZXIgKnU7CisJc3RydWN0IGRybV91bmlxdWUgX191c2VyICp1OwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnVxMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVxMzIpKSkKQEAgLTE1OSw3ICsxNTksNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV91bmlxdWUzMl90IHVxMzI7Ci0JZHJtX3VuaXF1ZV90IF9fdXNlciAqdTsKKwlzdHJ1Y3QgZHJtX3VuaXF1ZSBfX3VzZXIgKnU7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnVxMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVxMzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xNzksOCArMTc5LDggQEAKIHR5cGVkZWYgc3RydWN0IGRybV9tYXAzMiB7CiAJdTMyIG9mZnNldDsJCS8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIGFkZHJlc3MgKDAgZm9yIFNBUkVBKSovCiAJdTMyIHNpemU7CQkvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBzaXplIChieXRlcykgKi8KLQlkcm1fbWFwX3R5cGVfdCB0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLwotCWRybV9tYXBfZmxhZ3NfdCBmbGFnczsJLyoqPCBGbGFncyAqLworCWVudW0gZHJtX21hcF90eXBlIHR5cGU7CS8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gbWFwICovCisJZW51bSBkcm1fbWFwX2ZsYWdzIGZsYWdzOwkvKio8IEZsYWdzICovCiAJdTMyIGhhbmRsZTsJCS8qKjwgVXNlci1zcGFjZTogIkhhbmRsZSIgdG8gcGFzcyB0byBtbWFwKCkgKi8KIAlpbnQgbXRycjsJCS8qKjwgTVRSUiBzbG90IHVzZWQgKi8KIH0gZHJtX21hcDMyX3Q7CkBAIC0xOTAsNyArMTkwLDcgQEAKIHsKIAlkcm1fbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX21hcDMyX3QgbTMyOwotCWRybV9tYXBfdCBfX3VzZXIgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKm1hcDsKIAlpbnQgaWR4LCBlcnI7CiAJdm9pZCAqaGFuZGxlOwogCkBAIC0yMjgsNyArMjI4LDcgQEAKIHsKIAlkcm1fbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX21hcDMyX3QgbTMyOwotCWRybV9tYXBfdCBfX3VzZXIgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKm1hcDsKIAlpbnQgZXJyOwogCXZvaWQgKmhhbmRsZTsKIApAQCAtMjcwLDcgKzI3MCw3IEBACiAJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9tYXBfdCBfX3VzZXIgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKm1hcDsKIAl1MzIgaGFuZGxlOwogCiAJaWYgKGdldF91c2VyKGhhbmRsZSwgJmFyZ3AtPmhhbmRsZSkpCkBAIC0zMDAsNyArMzAwLDcgQEAKIHsKIAlkcm1fY2xpZW50MzJfdCBjMzI7CiAJZHJtX2NsaWVudDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jbGllbnRfdCBfX3VzZXIgKmNsaWVudDsKKwlzdHJ1Y3QgZHJtX2NsaWVudCBfX3VzZXIgKmNsaWVudDsKIAlpbnQgaWR4LCBlcnI7CiAKIAlpZiAoZ2V0X3VzZXIoaWR4LCAmYXJncC0+aWR4KSkKQEAgLTMzMyw3ICszMzMsNyBAQAogCXUzMiBjb3VudDsKIAlzdHJ1Y3QgewogCQl1MzIgdmFsdWU7Ci0JCWRybV9zdGF0X3R5cGVfdCB0eXBlOworCQllbnVtIGRybV9zdGF0X3R5cGUgdHlwZTsKIAl9IGRhdGFbMTVdOwogfSBkcm1fc3RhdHMzMl90OwogCkBAIC0zNDIsNyArMzQyLDcgQEAKIHsKIAlkcm1fc3RhdHMzMl90IHMzMjsKIAlkcm1fc3RhdHMzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fc3RhdHNfdCBfX3VzZXIgKnN0YXRzOworCXN0cnVjdCBkcm1fc3RhdHMgX191c2VyICpzdGF0czsKIAlpbnQgaSwgZXJyOwogCiAJc3RhdHMgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnN0YXRzKSk7CkBAIC0zNzksNyArMzc5LDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9idWZfZGVzYzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9idWZfZGVzY190IF9fdXNlciAqYnVmOworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICpidWY7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIGFncF9zdGFydDsKIApAQCAtNDExLDcgKzQxMSw3IEBACiB7CiAJZHJtX2J1Zl9kZXNjMzJfdCBiMzI7CiAJZHJtX2J1Zl9kZXNjMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2J1Zl9kZXNjX3QgX191c2VyICpidWY7CisJc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKmJ1ZjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYjMyLCBhcmdwLCBzaXplb2YoYjMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNDQwLDggKzQ0MCw4IEBACiAJZHJtX2J1Zl9pbmZvMzJfdCByZXEzMjsKIAlkcm1fYnVmX2luZm8zMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYnVmX2Rlc2MzMl90IF9fdXNlciAqdG87Ci0JZHJtX2J1Zl9pbmZvX3QgX191c2VyICpyZXF1ZXN0OwotCWRybV9idWZfZGVzY190IF9fdXNlciAqbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9pbmZvIF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqbGlzdDsKIAlzaXplX3QgbmJ5dGVzOwogCWludCBpLCBlcnI7CiAJaW50IGNvdW50LCBhY3R1YWw7CkBAIC00NTcsMTEgKzQ1NywxMSBAQAogCSAgICAmJiAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIGNvdW50ICogc2l6ZW9mKGRybV9idWZfZGVzYzMyX3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2YoZHJtX2J1Zl9kZXNjX3QpOworCW5ieXRlcyA9IHNpemVvZigqcmVxdWVzdCkgKyBjb3VudCAqIHNpemVvZihzdHJ1Y3QgZHJtX2J1Zl9kZXNjKTsKIAlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobmJ5dGVzKTsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIG5ieXRlcykpCiAJCXJldHVybiAtRUZBVUxUOwotCWxpc3QgPSAoZHJtX2J1Zl9kZXNjX3QgKikgKHJlcXVlc3QgKyAxKTsKKwlsaXN0ID0gKHN0cnVjdCBkcm1fYnVmX2Rlc2MgKikgKHJlcXVlc3QgKyAxKTsKIAogCWlmIChfX3B1dF91c2VyKGNvdW50LCAmcmVxdWVzdC0+Y291bnQpCiAJICAgIHx8IF9fcHV0X3VzZXIobGlzdCwgJnJlcXVlc3QtPmxpc3QpKQpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJaWYgKGNvdW50ID49IGFjdHVhbCkKIAkJZm9yIChpID0gMDsgaSA8IGFjdHVhbDsgKytpKQogCQkJaWYgKF9fY29weV9pbl91c2VyKCZ0b1tpXSwgJmxpc3RbaV0sCi0JCQkJCSAgIG9mZnNldG9mKGRybV9idWZfZGVzY190LCBmbGFncykpKQorCQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgZHJtX2J1Zl9kZXNjLCBmbGFncykpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKF9fcHV0X3VzZXIoYWN0dWFsLCAmYXJncC0+Y291bnQpKQpAQCAtNTA1LDggKzUwNSw4IEBACiAJZHJtX2J1Zl9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYnVmX21hcDMyX3QgcmVxMzI7CiAJZHJtX2J1Zl9wdWIzMl90IF9fdXNlciAqbGlzdDMyOwotCWRybV9idWZfbWFwX3QgX191c2VyICpyZXF1ZXN0OwotCWRybV9idWZfcHViX3QgX191c2VyICpsaXN0OworCXN0cnVjdCBkcm1fYnVmX21hcCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfcHViIF9fdXNlciAqbGlzdDsKIAlpbnQgaSwgZXJyOwogCWludCBjb3VudCwgYWN0dWFsOwogCXNpemVfdCBuYnl0ZXM7CkBAIC01MTksMTEgKzUxOSwxMSBAQAogCiAJaWYgKGNvdW50IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbmJ5dGVzID0gc2l6ZW9mKCpyZXF1ZXN0KSArIGNvdW50ICogc2l6ZW9mKGRybV9idWZfcHViX3QpOworCW5ieXRlcyA9IHNpemVvZigqcmVxdWVzdCkgKyBjb3VudCAqIHNpemVvZihzdHJ1Y3QgZHJtX2J1Zl9wdWIpOwogCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShuYnl0ZXMpOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgbmJ5dGVzKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JbGlzdCA9IChkcm1fYnVmX3B1Yl90ICopIChyZXF1ZXN0ICsgMSk7CisJbGlzdCA9IChzdHJ1Y3QgZHJtX2J1Zl9wdWIgKikgKHJlcXVlc3QgKyAxKTsKIAogCWlmIChfX3B1dF91c2VyKGNvdW50LCAmcmVxdWVzdC0+Y291bnQpCiAJICAgIHx8IF9fcHV0X3VzZXIobGlzdCwgJnJlcXVlc3QtPmxpc3QpKQpAQCAtNTM5LDcgKzUzOSw3IEBACiAJaWYgKGNvdW50ID49IGFjdHVhbCkKIAkJZm9yIChpID0gMDsgaSA8IGFjdHVhbDsgKytpKQogCQkJaWYgKF9fY29weV9pbl91c2VyKCZsaXN0MzJbaV0sICZsaXN0W2ldLAotCQkJCQkgICBvZmZzZXRvZihkcm1fYnVmX3B1Yl90LCBhZGRyZXNzKSkKKwkJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGRybV9idWZfcHViLCBhZGRyZXNzKSkKIAkJCSAgICB8fCBfX2dldF91c2VyKGFkZHIsICZsaXN0W2ldLmFkZHJlc3MpCiAJCQkgICAgfHwgX19wdXRfdXNlcigodW5zaWduZWQgbG9uZylhZGRyLAogCQkJCQkgICZsaXN0MzJbaV0uYWRkcmVzcykpCkBAIC01NjIsNyArNTYyLDcgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fYnVmX2ZyZWUzMl90IHJlcTMyOwotCWRybV9idWZfZnJlZV90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9mcmVlIF9fdXNlciAqcmVxdWVzdDsKIAlkcm1fYnVmX2ZyZWUzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQpAQCAtNTg5LDcgKzU4OSw3IEBACiAJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fY3R4X3ByaXZfbWFwMzJfdCByZXEzMjsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIF9fdXNlciAqcmVxdWVzdDsKIAlkcm1fY3R4X3ByaXZfbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKQEAgLTYxMCw3ICs2MTAsNyBAQAogc3RhdGljIGludCBjb21wYXRfZHJtX2dldHNhcmVhY3R4KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBfX3VzZXIgKnJlcXVlc3Q7CiAJZHJtX2N0eF9wcml2X21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IGN0eF9pZDsKQEAgLTY0OCw3ICs2NDgsNyBAQAogewogCWRybV9jdHhfcmVzMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2N0eF9yZXMzMl90IHJlczMyOwotCWRybV9jdHhfcmVzX3QgX191c2VyICpyZXM7CisJc3RydWN0IGRybV9jdHhfcmVzIF9fdXNlciAqcmVzOwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlczMyLCBhcmdwLCBzaXplb2YocmVzMzIpKSkKQEAgLTY1OCw3ICs2NTgsNyBAQAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVzLCBzaXplb2YoKnJlcykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAoX19wdXRfdXNlcihyZXMzMi5jb3VudCwgJnJlcy0+Y291bnQpCi0JICAgIHx8IF9fcHV0X3VzZXIoKGRybV9jdHhfdCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpcmVzMzIuY29udGV4dHMsCisJICAgIHx8IF9fcHV0X3VzZXIoKHN0cnVjdCBkcm1fY3R4IF9fdXNlciAqKSAodW5zaWduZWQgbG9uZylyZXMzMi5jb250ZXh0cywKIAkJCSAgJnJlcy0+Y29udGV4dHMpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtNjc5LDcgKzY3OSw3IEBACiAJaW50IHNlbmRfY291bnQ7CQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc2VuZCAqLwogCXUzMiBzZW5kX2luZGljZXM7CSAgLyoqPCBMaXN0IG9mIGhhbmRsZXMgdG8gYnVmZmVycyAqLwogCXUzMiBzZW5kX3NpemVzOwkJICAvKio8IExlbmd0aHMgb2YgZGF0YSB0byBzZW5kICovCi0JZHJtX2RtYV9mbGFnc190IGZsYWdzOwkJICAvKio8IEZsYWdzICovCisJZW51bSBkcm1fZG1hX2ZsYWdzIGZsYWdzOwkJICAvKio8IEZsYWdzICovCiAJaW50IHJlcXVlc3RfY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgKi8KIAlpbnQgcmVxdWVzdF9zaXplOwkgIC8qKjwgRGVzaXJlZCBzaXplIGZvciBidWZmZXJzICovCiAJdTMyIHJlcXVlc3RfaW5kaWNlczsJICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLwpAQCAtNjkyLDcgKzY5Miw3IEBACiB7CiAJZHJtX2RtYTMyX3QgZDMyOwogCWRybV9kbWEzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fZG1hX3QgX191c2VyICpkOworCXN0cnVjdCBkcm1fZG1hIF9fdXNlciAqZDsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZkMzIsIGFyZ3AsIHNpemVvZihkMzIpKSkKQEAgLTc0MCw3ICs3NDAsNyBAQAogewogCWRybV9hZ3BfbW9kZTMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9hZ3BfbW9kZTMyX3QgbTMyOwotCWRybV9hZ3BfbW9kZV90IF9fdXNlciAqbW9kZTsKKwlzdHJ1Y3QgZHJtX2FncF9tb2RlIF9fdXNlciAqbW9kZTsKIAogCWlmIChnZXRfdXNlcihtMzIubW9kZSwgJmFyZ3AtPm1vZGUpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTc3Miw3ICs3NzIsNyBAQAogewogCWRybV9hZ3BfaW5mbzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9hZ3BfaW5mbzMyX3QgaTMyOwotCWRybV9hZ3BfaW5mb190IF9fdXNlciAqaW5mbzsKKwlzdHJ1Y3QgZHJtX2FncF9pbmZvIF9fdXNlciAqaW5mbzsKIAlpbnQgZXJyOwogCiAJaW5mbyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW5mbykpOwpAQCAtODEzLDcgKzgxMyw3IEBACiB7CiAJZHJtX2FncF9idWZmZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYWdwX2J1ZmZlcjMyX3QgcmVxMzI7Ci0JZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9hZ3BfYnVmZmVyIF9fdXNlciAqcmVxdWVzdDsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCkBAIC04NDUsNyArODQ1LDcgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fYWdwX2J1ZmZlcjMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9hZ3BfYnVmZmVyX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciBfX3VzZXIgKnJlcXVlc3Q7CiAJdTMyIGhhbmRsZTsKIAogCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKQEAgLTg2OCw3ICs4NjgsNyBAQAogewogCWRybV9hZ3BfYmluZGluZzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9hZ3BfYmluZGluZzMyX3QgcmVxMzI7Ci0JZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgX191c2VyICpyZXF1ZXN0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtODg3LDcgKzg4Nyw3IEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9hZ3BfYmluZGluZzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIF9fdXNlciAqcmVxdWVzdDsKIAl1MzIgaGFuZGxlOwogCiAJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOwpAQCAtOTEwLDcgKzkxMCw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX3NjYXR0ZXJfZ2F0aGVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgX191c2VyICpyZXF1ZXN0OwogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyB4OwogCkBAIC05MzgsNyArOTM4LDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9zY2F0dGVyX2dhdGhlcjMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9zY2F0dGVyX2dhdGhlcl90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIF9fdXNlciAqcmVxdWVzdDsKIAl1bnNpZ25lZCBsb25nIHg7CiAKIAlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CkBAIC05NTMsMTMgKzk1MywxMyBAQAogfQogCiBzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QzMiB7Ci0JZHJtX3ZibGFua19zZXFfdHlwZV90IHR5cGU7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogCXUzMiBzaWduYWw7CiB9OwogCiBzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5MzIgewotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAlzMzIgdHZhbF9zZWM7CiAJczMyIHR2YWxfdXNlYzsKQEAgLTk3NSw3ICs5NzUsNyBAQAogewogCWRybV93YWl0X3ZibGFuazMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV93YWl0X3ZibGFuazMyX3QgcmVxMzI7Ci0JZHJtX3dhaXRfdmJsYW5rX3QgX191c2VyICpyZXF1ZXN0OworCXVuaW9uIGRybV93YWl0X3ZibGFuayBfX3VzZXIgKnJlcXVlc3Q7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKaW5kZXggNTY1ODk1NS4uYjE5NWUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCkBAIC01MiwxMCArNTIsMTAgQEAKIGludCBkcm1fZ2V0dW5pcXVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3VuaXF1ZV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fdW5pcXVlX3QgdTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3VuaXF1ZSBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV91bmlxdWUgdTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdSwgYXJncCwgc2l6ZW9mKHUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC04NiwxNSArODYsMTUgQEAKIGludCBkcm1fc2V0dW5pcXVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3VuaXF1ZV90IHU7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV91bmlxdWUgdTsKIAlpbnQgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMsIHJldDsKIAogCWlmIChkZXYtPnVuaXF1ZV9sZW4gfHwgZGV2LT51bmlxdWUpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnUsIChkcm1fdW5pcXVlX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHUpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJnUsIChzdHJ1Y3QgZHJtX3VuaXF1ZSBfX3VzZXIgKikgYXJnLCBzaXplb2YodSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmICghdS51bmlxdWVfbGVuIHx8IHUudW5pcXVlX2xlbiA+IDEwMjQpCkBAIC0xMzYsNyArMTM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcm1fc2V0X2J1c2lkKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgZHJtX3NldF9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpbnQgbGVuOwogCkBAIC0xODQsMTEgKzE4NCwxMSBAQAogaW50IGRybV9nZXRtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fbWFwX3QgbWFwOwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fbWFwIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX21hcCBtYXA7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0ID0gTlVMTDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCWludCBpZHg7CiAJaW50IGk7CkBAIC0yMDQsOSArMjA0LDkgQEAKIAl9CiAKIAlpID0gMDsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QpIHsKIAkJaWYgKGkgPT0gaWR4KSB7Ci0JCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRybV9tYXBfbGlzdCwgaGVhZCk7CiAJCQlicmVhazsKIAkJfQogCQlpKys7CkBAIC0yNDUsMTEgKzI0NSwxMSBAQAogaW50IGRybV9nZXRjbGllbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY2xpZW50X3QgX191c2VyICphcmdwID0gKGRybV9jbGllbnRfdCBfX3VzZXIgKilhcmc7Ci0JZHJtX2NsaWVudF90IGNsaWVudDsKLQlkcm1fZmlsZV90ICpwdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2NsaWVudCBfX3VzZXIgKmFyZ3AgPSAoc3RydWN0IGRybV9jbGllbnQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnB0OwogCWludCBpZHg7CiAJaW50IGk7CiAKQEAgLTI1NywxMiArMjU3LDE4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCWlkeCA9IGNsaWVudC5pZHg7CiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWZvciAoaSA9IDAsIHB0ID0gZGV2LT5maWxlX2ZpcnN0OyBpIDwgaWR4ICYmIHB0OyBpKyssIHB0ID0gcHQtPm5leHQpIDsKLQotCWlmICghcHQpIHsKKwkKKwlpZiAobGlzdF9lbXB0eSgmZGV2LT5maWxlbGlzdCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCWkgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHQsICZkZXYtPmZpbGVsaXN0LCBsaGVhZCkgeworCQlpZiAoaSsrID49IGlkeCkKKwkJCWJyZWFrOworCX0KKwogCWNsaWVudC5hdXRoID0gcHQtPmF1dGhlbnRpY2F0ZWQ7CiAJY2xpZW50LnBpZCA9IHB0LT5waWQ7CiAJY2xpZW50LnVpZCA9IHB0LT51aWQ7CkBAIC0yODgsOSArMjk0LDkgQEAKIGludCBkcm1fZ2V0c3RhdHMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9zdGF0c190IHN0YXRzOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fc3RhdHMgc3RhdHM7CiAJaW50IGk7CiAKIAltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKQEAgLTMxMCw3ICszMTYsNyBAQAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKLQlpZiAoY29weV90b191c2VyKChkcm1fc3RhdHNfdCBfX3VzZXIgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQorCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBkcm1fc3RhdHMgX191c2VyICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjksMTAgKzMzNSwxMCBAQAogaW50IGRybV9zZXR2ZXJzaW9uKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX3NldF92ZXJzaW9uX3Qgc3Y7Ci0JZHJtX3NldF92ZXJzaW9uX3QgcmV0djsKKwlzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIHN2OworCXN0cnVjdCBkcm1fc2V0X3ZlcnNpb24gcmV0djsKIAlpbnQgaWZfdmVyc2lvbjsKLQlkcm1fc2V0X3ZlcnNpb25fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCXN0cnVjdCBkcm1fc2V0X3ZlcnNpb24gX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKIAlpbnQgcmV0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZzdiwgYXJncCwgc2l6ZW9mKHN2KSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCmluZGV4IDJlNzUzMzEuLjg3MWQyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCkBAIC01MywxMCArNTMsMTAgQEAKIGludCBkcm1faXJxX2J5X2J1c2lkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2lycV9idXNpZF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1faXJxX2J1c2lkX3QgcDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2lycV9idXNpZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9pcnFfYnVzaWQgcDsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODcsNyArODcsNyBAQAogICogXGMgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCgpIGFuZCBcYyBkcm1fZHJpdmVyX2lycV9wb3N0aW5zdGFsbCgpIGZ1bmN0aW9ucwogICogYmVmb3JlIGFuZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLgogICovCi1zdGF0aWMgaW50IGRybV9pcnFfaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGRybV9pcnFfaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgc2hfZmxhZ3MgPSAwOwpAQCAtMTIwLDggKzEyMCw4IEBACiAKIAkJc3Bpbl9sb2NrX2luaXQoJmRldi0+dmJsX2xvY2spOwogCi0JCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibF9zaWdzLmhlYWQpOwotCQlJTklUX0xJU1RfSEVBRCgmZGV2LT52Ymxfc2lnczIuaGVhZCk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibF9zaWdzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJsX3NpZ3MyKTsKIAogCQlkZXYtPnZibF9wZW5kaW5nID0gMDsKIAl9CkBAIC0xNTUsNyArMTU1LDcgQEAKICAqCiAgKiBDYWxscyB0aGUgZHJpdmVyJ3MgXGMgZHJtX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCkgZnVuY3Rpb24sIGFuZCBzdG9wcyB0aGUgaXJxLgogICovCi1pbnQgZHJtX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWludCBpcnFfZW5hYmxlZDsKIApAQCAtMTk3LDEzICsxOTcsMTMgQEAKIGludCBkcm1fY29udHJvbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY29udHJvbF90IGN0bDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2NvbnRyb2wgY3RsOwogCiAJLyogaWYgd2UgaGF2ZW4ndCBpcnEgd2UgZmFsbGJhY2sgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyAtIHRoaXMgdXNlZCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIGRybV9kbWEuaCAqLwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjdGwsIChkcm1fY29udHJvbF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihjdGwpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0bCwgKHN0cnVjdCBkcm1fY29udHJvbCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3RsKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJc3dpdGNoIChjdGwuZnVuYykgewpAQCAtMjQ0LDEwICsyNDQsMTAgQEAKICAqLwogaW50IGRybV93YWl0X3ZibGFuayhEUk1fSU9DVExfQVJHUykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV93YWl0X3ZibGFua190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JZHJtX3dhaXRfdmJsYW5rX3QgdmJsd2FpdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwl1bmlvbiBkcm1fd2FpdF92YmxhbmsgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwl1bmlvbiBkcm1fd2FpdF92YmxhbmsgdmJsd2FpdDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgaW50IGZsYWdzLCBzZXE7CkBAIC0yOTIsOSArMjkyLDkgQEAKIAogCWlmIChmbGFncyAmIF9EUk1fVkJMQU5LX1NJR05BTCkgewogCQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCQlkcm1fdmJsX3NpZ190ICp2Ymxfc2lncyA9IChmbGFncyAmIF9EUk1fVkJMQU5LX1NFQ09OREFSWSkKKwkJc3RydWN0IGxpc3RfaGVhZCAqdmJsX3NpZ3MgPSAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19TRUNPTkRBUlkpCiAJCQkJICAgICAgPyAmZGV2LT52Ymxfc2lnczIgOiAmZGV2LT52Ymxfc2lnczsKLQkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZzsKKwkJc3RydWN0IGRybV92Ymxfc2lnICp2Ymxfc2lnOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAKQEAgLTMwMiw3ICszMDIsNyBAQAogCQkgKiBmb3IgdGhlIHNhbWUgdmJsYW5rIHNlcXVlbmNlIG51bWJlcjsgbm90aGluZyB0byBiZSBkb25lIGluCiAJCSAqIHRoYXQgY2FzZQogCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Ymxfc2lnLCAmdmJsX3NpZ3MtPmhlYWQsIGhlYWQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Ymxfc2lnLCB2Ymxfc2lncywgaGVhZCkgewogCQkJaWYgKHZibF9zaWctPnNlcXVlbmNlID09IHZibHdhaXQucmVxdWVzdC5zZXF1ZW5jZQogCQkJICAgICYmIHZibF9zaWctPmluZm8uc2lfc2lnbm8gPT0gdmJsd2FpdC5yZXF1ZXN0LnNpZ25hbAogCQkJICAgICYmIHZibF9zaWctPnRhc2sgPT0gY3VycmVudCkgewpAQCAtMzI0LDcgKzMyNCw3IEBACiAKIAkJaWYgKCEKIAkJICAgICh2Ymxfc2lnID0KLQkJICAgICBkcm1fYWxsb2Moc2l6ZW9mKGRybV92Ymxfc2lnX3QpLCBEUk1fTUVNX0RSSVZFUikpKSB7CisJCSAgICAgZHJtX2FsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX3ZibF9zaWcpLCBEUk1fTUVNX0RSSVZFUikpKSB7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0zMzYsNyArMzM2LDcgQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCi0JCWxpc3RfYWRkX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil2Ymxfc2lnLCAmdmJsX3NpZ3MtPmhlYWQpOworCQlsaXN0X2FkZF90YWlsKCZ2Ymxfc2lnLT5oZWFkLCB2Ymxfc2lncyk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCkBAIC0zNzEsNyArMzcxLDcgQEAKICAqCiAgKiBJZiBhIHNpZ25hbCBpcyBub3QgcmVxdWVzdGVkLCB0aGVuIGNhbGxzIHZibGFua193YWl0KCkuCiAgKi8KLXZvaWQgZHJtX3ZibF9zZW5kX3NpZ25hbHMoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBkcm1fdmJsX3NlbmRfc2lnbmFscyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwpAQCAtMzc5LDIwICszNzksMTggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgZmxhZ3MpOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdG1wOwotCQlkcm1fdmJsX3NpZ190ICp2Ymxfc2lnOwotCQlkcm1fdmJsX3NpZ190ICp2Ymxfc2lncyA9IGkgPyAmZGV2LT52Ymxfc2lnczIgOiAmZGV2LT52Ymxfc2lnczsKKwkJc3RydWN0IGRybV92Ymxfc2lnICp2Ymxfc2lnLCAqdG1wOworCQlzdHJ1Y3QgbGlzdF9oZWFkICp2Ymxfc2lncyA9IGkgPyAmZGV2LT52Ymxfc2lnczIgOiAmZGV2LT52Ymxfc2lnczsKIAkJdW5zaWduZWQgaW50IHZibF9zZXEgPSBhdG9taWNfcmVhZChpID8gJmRldi0+dmJsX3JlY2VpdmVkMiA6CiAJCQkJCQkgICAmZGV2LT52YmxfcmVjZWl2ZWQpOwogCi0JCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0bXAsICZ2Ymxfc2lncy0+aGVhZCkgewotCQkJdmJsX3NpZyA9IGxpc3RfZW50cnkobGlzdCwgZHJtX3ZibF9zaWdfdCwgaGVhZCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2Ymxfc2lnLCB0bXAsIHZibF9zaWdzLCBoZWFkKSB7CiAJCQlpZiAoKHZibF9zZXEgLSB2Ymxfc2lnLT5zZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSB7CiAJCQkJdmJsX3NpZy0+aW5mby5zaV9jb2RlID0gdmJsX3NlcTsKIAkJCQlzZW5kX3NpZ19pbmZvKHZibF9zaWctPmluZm8uc2lfc2lnbm8sCiAJCQkJCSAgICAgICZ2Ymxfc2lnLT5pbmZvLCB2Ymxfc2lnLT50YXNrKTsKIAotCQkJCWxpc3RfZGVsKGxpc3QpOworCQkJCWxpc3RfZGVsKCZ2Ymxfc2lnLT5oZWFkKTsKIAogCQkJCWRybV9mcmVlKHZibF9zaWcsIHNpemVvZigqdmJsX3NpZyksCiAJCQkJCSBEUk1fTUVNX0RSSVZFUik7CkBAIC00MTgsNyArNDE2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZHJtX2xvY2tlZF90YXNrbGV0X2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCopZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dGFza2xldF9sb2NrLCBpcnFmbGFncyk7CkBAIC00NTUsNyArNDUzLDcgQEAKICAqIGNvbnRleHQsIGl0IG11c3Qgbm90IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoaXMuIEFsc28sIHRoZSBIVyBsb2NrIHdpbGwKICAqIGJlIGhlbGQgd2l0aCB0aGUga2VybmVsIGNvbnRleHQgb3IgYW55IGNsaWVudCBjb250ZXh0LgogICovCi12b2lkIGRybV9sb2NrZWRfdGFza2xldChkcm1fZGV2aWNlX3QgKmRldiwgdm9pZCAoKmZ1bmMpKGRybV9kZXZpY2VfdCopKQordm9pZCBkcm1fbG9ja2VkX3Rhc2tsZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAoKmZ1bmMpKHN0cnVjdCBkcm1fZGV2aWNlICopKQogewogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAJc3RhdGljIERFQ0xBUkVfVEFTS0xFVChkcm1fdGFza2xldCwgZHJtX2xvY2tlZF90YXNrbGV0X2Z1bmMsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCmluZGV4IGJlZmQxYWYuLmMwNTM0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKQEAgLTUxLDE1ICs1MSwxNSBAQAogaW50IGRybV9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7Ci0JZHJtX2xvY2tfdCBsb2NrOworCXN0cnVjdCBkcm1fbG9jayBsb2NrOwogCWludCByZXQgPSAwOwogCiAJKytwcml2LT5sb2NrX2NvdW50OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZsb2NrLCAoZHJtX2xvY2tfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YobG9jaykpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKHN0cnVjdCBkcm1fbG9jayBfX3VzZXIgKikgYXJnLCBzaXplb2YobG9jaykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChsb2NrLmNvbnRleHQgPT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CkBAIC0xNTIsMTIgKzE1MiwxMiBAQAogaW50IGRybV91bmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2xvY2tfdCBsb2NrOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fbG9jayBsb2NrOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKSBhcmcsIHNpemVvZihsb2NrKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZsb2NrLCAoc3RydWN0IGRybV9sb2NrIF9fdXNlciAqKSBhcmcsIHNpemVvZihsb2NrKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGxvY2suY29udGV4dCA9PSBEUk1fS0VSTkVMX0NPTlRFWFQpIHsKQEAgLTIwMiw3ICsyMDIsNyBAQAogICoKICAqIEF0dGVtcHQgdG8gbWFyayB0aGUgbG9jayBhcyBoZWxkIGJ5IHRoZSBnaXZlbiBjb250ZXh0LCB2aWEgdGhlIFxwIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCiAgKi8KLWludCBkcm1fbG9ja190YWtlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhLAoraW50IGRybV9sb2NrX3Rha2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSwKIAkJICB1bnNpZ25lZCBpbnQgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CkBAIC0yNTEsNyArMjUxLDcgQEAKICAqIFJlc2V0cyB0aGUgbG9jayBmaWxlIHBvaW50ZXIuCiAgKiBNYXJrcyB0aGUgbG9jayBhcyBoZWxkIGJ5IHRoZSBnaXZlbiBjb250ZXh0LCB2aWEgdGhlIFxwIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2xvY2tfdHJhbnNmZXIoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEsCitzdGF0aWMgaW50IGRybV9sb2NrX3RyYW5zZmVyKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEsCiAJCQkgICAgIHVuc2lnbmVkIGludCBjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBvbGQsIG5ldywgcHJldjsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICogTWFya3MgdGhlIGxvY2sgYXMgbm90IGhlbGQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4gV2FrZXMgYW55IHRhc2sKICAqIHdhaXRpbmcgb24gdGhlIGxvY2sgcXVldWUuCiAgKi8KLWludCBkcm1fbG9ja19mcmVlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCkKK2ludCBkcm1fbG9ja19mcmVlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEsIHVuc2lnbmVkIGludCBjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBvbGQsIG5ldywgcHJldjsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmxvY2sgPSAmbG9ja19kYXRhLT5od19sb2NrLT5sb2NrOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZHJtX25vdGlmaWVyKHZvaWQgKnByaXYpCiB7Ci0JZHJtX3NpZ2RhdGFfdCAqcyA9IChkcm1fc2lnZGF0YV90ICopIHByaXY7CisJc3RydWN0IGRybV9zaWdkYXRhICpzID0gKHN0cnVjdCBkcm1fc2lnZGF0YSAqKSBwcml2OwogCXVuc2lnbmVkIGludCBvbGQsIG5ldywgcHJldjsKIAogCS8qIEFsbG93IHNpZ25hbCBkZWxpdmVyeSBpZiBsb2NrIGlzbid0IGhlbGQgKi8KQEAgLTM1MCw3ICszNTAsNyBAQAogICogaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHN0YXJ2YXRpb24uCiAgKi8KIAotdm9pZCBkcm1faWRsZWxvY2tfdGFrZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSkKK3ZvaWQgZHJtX2lkbGVsb2NrX3Rha2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSkKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMzY5LDcgKzM2OSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9pZGxlbG9ja190YWtlKTsKIAotdm9pZCBkcm1faWRsZWxvY2tfcmVsZWFzZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSkKK3ZvaWQgZHJtX2lkbGVsb2NrX3JlbGVhc2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgb2xkLCBwcmV2OwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqbG9jayA9ICZsb2NrX2RhdGEtPmh3X2xvY2stPmxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jCmluZGV4IDkyYTg2NzAuLjkzMDE5OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jCkBAIC04MCw3ICs4MCw3IEBACiAKICNpZiBfX09TX0hBU19BR1AKIHN0YXRpYyB2b2lkICphZ3BfcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJICAgICAgIGRybV9kZXZpY2VfdCAqIGRldikKKwkJICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXVuc2lnbmVkIGxvbmcgKnBoeXNfYWRkcl9tYXAsIGksIG51bV9wYWdlcyA9CiAJICAgIFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CkBAIC05NCw3ICs5NCw3IEBACiAJb2Zmc2V0IC09IGRldi0+aG9zZS0+bWVtX3NwYWNlLT5zdGFydDsKICNlbmRpZgogCi0JZm9yIChhZ3BtZW0gPSBkZXYtPmFncC0+bWVtb3J5OyBhZ3BtZW07IGFncG1lbSA9IGFncG1lbS0+bmV4dCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFncG1lbSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpCiAJCWlmIChhZ3BtZW0tPmJvdW5kIDw9IG9mZnNldAogCQkgICAgJiYgKGFncG1lbS0+Ym91bmQgKyAoYWdwbWVtLT5wYWdlcyA8PCBQQUdFX1NISUZUKSkgPj0KIAkJICAgIChvZmZzZXQgKyBzaXplKSkKQEAgLTEyMyw3ICsxMjMsNyBAQAogfQogCiAvKiogV3JhcHBlciBhcm91bmQgYWdwX2FsbG9jYXRlX21lbW9yeSgpICovCi1EUk1fQUdQX01FTSAqZHJtX2FsbG9jX2FncChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpCitEUk1fQUdQX01FTSAqZHJtX2FsbG9jX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IHBhZ2VzLCB1MzIgdHlwZSkKIHsKIAlyZXR1cm4gZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoZGV2LT5hZ3AtPmJyaWRnZSwgcGFnZXMsIHR5cGUpOwogfQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKICNlbHNlICAvKiAgX19PU19IQVNfQUdQICAqLwogc3RhdGljIGlubGluZSB2b2lkICphZ3BfcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCSAgICAgIGRybV9kZXZpY2VfdCAqIGRldikKKwkJCSAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMKaW5kZXggMmVjMWQ5Zi4uM2U2YmMxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tbS5jCkBAIC00NCwyNiArNDQsMjYgQEAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi11bnNpZ25lZCBsb25nIGRybV9tbV90YWlsX3NwYWNlKGRybV9tbV90ICptbSkKK3Vuc2lnbmVkIGxvbmcgZHJtX21tX3RhaWxfc3BhY2Uoc3RydWN0IGRybV9tbSAqbW0pCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqdGFpbF9ub2RlOwotCWRybV9tbV9ub2RlX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CiAKIAl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKLQllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CisJZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CiAJaWYgKCFlbnRyeS0+ZnJlZSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gZW50cnktPnNpemU7CiB9CiAKLWludCBkcm1fbW1fcmVtb3ZlX3NwYWNlX2Zyb21fdGFpbChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2ludCBkcm1fbW1fcmVtb3ZlX3NwYWNlX2Zyb21fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKLQlkcm1fbW1fbm9kZV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCiAJdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7Ci0JZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwogCWlmICghZW50cnktPmZyZWUpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC03NSwxMyArNzUsMTMgQEAKIH0KIAogCi1zdGF0aWMgaW50IGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKGRybV9tbV90ICptbSwKK3N0YXRpYyBpbnQgZHJtX21tX2NyZWF0ZV90YWlsX25vZGUoc3RydWN0IGRybV9tbSAqbW0sCiAJCQkgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JZHJtX21tX25vZGVfdCAqY2hpbGQ7CisJc3RydWN0IGRybV9tbV9ub2RlICpjaGlsZDsKIAotCWNoaWxkID0gKGRybV9tbV9ub2RlX3QgKikKKwljaGlsZCA9IChzdHJ1Y3QgZHJtX21tX25vZGUgKikKIAkJZHJtX2FsbG9jKHNpemVvZigqY2hpbGQpLCBEUk1fTUVNX01NKTsKIAlpZiAoIWNoaWxkKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTk4LDEzICs5OCwxMyBAQAogfQogCiAKLWludCBkcm1fbW1fYWRkX3NwYWNlX3RvX3RhaWwoZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpCitpbnQgZHJtX21tX2FkZF9zcGFjZV90b190YWlsKHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqdGFpbF9ub2RlOwotCWRybV9tbV9ub2RlX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CiAKIAl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKLQllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CisJZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CiAJaWYgKCFlbnRyeS0+ZnJlZSkgewogCQlyZXR1cm4gZHJtX21tX2NyZWF0ZV90YWlsX25vZGUobW0sIGVudHJ5LT5zdGFydCArIGVudHJ5LT5zaXplLCBzaXplKTsKIAl9CkBAIC0xMTIsMTIgKzExMiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgZHJtX21tX25vZGVfdCAqZHJtX21tX3NwbGl0X2F0X3N0YXJ0KGRybV9tbV9ub2RlX3QgKnBhcmVudCwKK3N0YXRpYyBzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9zcGxpdF9hdF9zdGFydChzdHJ1Y3QgZHJtX21tX25vZGUgKnBhcmVudCwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlkcm1fbW1fbm9kZV90ICpjaGlsZDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmNoaWxkOwogCi0JY2hpbGQgPSAoZHJtX21tX25vZGVfdCAqKQorCWNoaWxkID0gKHN0cnVjdCBkcm1fbW1fbm9kZSAqKQogCQlkcm1fYWxsb2Moc2l6ZW9mKCpjaGlsZCksIERSTV9NRU1fTU0pOwogCWlmICghY2hpbGQpCiAJCXJldHVybiBOVUxMOwpAQCAtMTM5LDEyICsxMzksMTIgQEAKIAogCiAKLWRybV9tbV9ub2RlX3QgKmRybV9tbV9nZXRfYmxvY2soZHJtX21tX25vZGVfdCAqIHBhcmVudCwKK3N0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX2dldF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBwYXJlbnQsCiAJCQkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQpCiB7CiAKLQlkcm1fbW1fbm9kZV90ICphbGlnbl9zcGxpdG9mZiA9IE5VTEw7Ci0JZHJtX21tX25vZGVfdCAqY2hpbGQ7CisJc3RydWN0IGRybV9tbV9ub2RlICphbGlnbl9zcGxpdG9mZiA9IE5VTEw7CisJc3RydWN0IGRybV9tbV9ub2RlICpjaGlsZDsKIAl1bnNpZ25lZCB0bXAgPSAwOwogCiAJaWYgKGFsaWdubWVudCkKQEAgLTE3NSwyNiArMTc1LDI2IEBACiAgKiBPdGhlcndpc2UgYWRkIHRvIHRoZSBmcmVlIHN0YWNrLgogICovCiAKLXZvaWQgZHJtX21tX3B1dF9ibG9jayhkcm1fbW1fbm9kZV90ICogY3VyKQordm9pZCBkcm1fbW1fcHV0X2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqIGN1cikKIHsKIAotCWRybV9tbV90ICptbSA9IGN1ci0+bW07CisJc3RydWN0IGRybV9tbSAqbW0gPSBjdXItPm1tOwogCXN0cnVjdCBsaXN0X2hlYWQgKmN1cl9oZWFkID0gJmN1ci0+bWxfZW50cnk7CiAJc3RydWN0IGxpc3RfaGVhZCAqcm9vdF9oZWFkID0gJm1tLT5tbF9lbnRyeTsKLQlkcm1fbW1fbm9kZV90ICpwcmV2X25vZGUgPSBOVUxMOwotCWRybV9tbV9ub2RlX3QgKm5leHRfbm9kZTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKnByZXZfbm9kZSA9IE5VTEw7CisJc3RydWN0IGRybV9tbV9ub2RlICpuZXh0X25vZGU7CiAKIAlpbnQgbWVyZ2VkID0gMDsKIAogCWlmIChjdXJfaGVhZC0+cHJldiAhPSByb290X2hlYWQpIHsKLQkJcHJldl9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+cHJldiwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCQlwcmV2X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5wcmV2LCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKIAkJaWYgKHByZXZfbm9kZS0+ZnJlZSkgewogCQkJcHJldl9ub2RlLT5zaXplICs9IGN1ci0+c2l6ZTsKIAkJCW1lcmdlZCA9IDE7CiAJCX0KIAl9CiAJaWYgKGN1cl9oZWFkLT5uZXh0ICE9IHJvb3RfaGVhZCkgewotCQluZXh0X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5uZXh0LCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CisJCW5leHRfbm9kZSA9IGxpc3RfZW50cnkoY3VyX2hlYWQtPm5leHQsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwogCQlpZiAobmV4dF9ub2RlLT5mcmVlKSB7CiAJCQlpZiAobWVyZ2VkKSB7CiAJCQkJcHJldl9ub2RlLT5zaXplICs9IG5leHRfbm9kZS0+c2l6ZTsKQEAgLTIxOCwxNCArMjE4LDE0IEBACiAJfQogfQogCi1kcm1fbW1fbm9kZV90ICpkcm1fbW1fc2VhcmNoX2ZyZWUoY29uc3QgZHJtX21tX3QgKiBtbSwKK3N0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IHN0cnVjdCBkcm1fbW0gKiBtbSwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgIHVuc2lnbmVkIGFsaWdubWVudCwgaW50IGJlc3RfbWF0Y2gpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAljb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpmcmVlX3N0YWNrID0gJm1tLT5mbF9lbnRyeTsKLQlkcm1fbW1fbm9kZV90ICplbnRyeTsKLQlkcm1fbW1fbm9kZV90ICpiZXN0OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CisJc3RydWN0IGRybV9tbV9ub2RlICpiZXN0OwogCXVuc2lnbmVkIGxvbmcgYmVzdF9zaXplOwogCXVuc2lnbmVkIHdhc3RlZDsKIApAQCAtMjMzLDcgKzIzMyw3IEBACiAJYmVzdF9zaXplID0gfjBVTDsKIAogCWxpc3RfZm9yX2VhY2gobGlzdCwgZnJlZV9zdGFjaykgewotCQllbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21tX25vZGVfdCwgZmxfZW50cnkpOworCQllbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRybV9tbV9ub2RlLCBmbF9lbnRyeSk7CiAJCXdhc3RlZCA9IDA7CiAKIAkJaWYgKGVudHJ5LT5zaXplIDwgc2l6ZSkKQEAgLTI1OSwxNCArMjU5LDE0IEBACiAJcmV0dXJuIGJlc3Q7CiB9CiAKLWludCBkcm1fbW1fY2xlYW4oZHJtX21tX3QgKiBtbSkKK2ludCBkcm1fbW1fY2xlYW4oc3RydWN0IGRybV9tbSAqIG1tKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmbW0tPm1sX2VudHJ5OwogCiAJcmV0dXJuIChoZWFkLT5uZXh0LT5uZXh0ID09IGhlYWQpOwogfQogCi1pbnQgZHJtX21tX2luaXQoZHJtX21tX3QgKiBtbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoraW50IGRybV9tbV9pbml0KHN0cnVjdCBkcm1fbW0gKiBtbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCUlOSVRfTElTVF9IRUFEKCZtbS0+bWxfZW50cnkpOwogCUlOSVRfTElTVF9IRUFEKCZtbS0+ZmxfZW50cnkpOwpAQCAtMjc1LDEyICsyNzUsMTIgQEAKIH0KIAogCi12b2lkIGRybV9tbV90YWtlZG93bihkcm1fbW1fdCAqIG1tKQordm9pZCBkcm1fbW1fdGFrZWRvd24oc3RydWN0IGRybV9tbSAqIG1tKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmJub2RlID0gbW0tPmZsX2VudHJ5Lm5leHQ7Ci0JZHJtX21tX25vZGVfdCAqZW50cnk7CisJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKIAotCWVudHJ5ID0gbGlzdF9lbnRyeShibm9kZSwgZHJtX21tX25vZGVfdCwgZmxfZW50cnkpOworCWVudHJ5ID0gbGlzdF9lbnRyeShibm9kZSwgc3RydWN0IGRybV9tbV9ub2RlLCBmbF9lbnRyeSk7CiAKIAlpZiAoZW50cnktPm1sX2VudHJ5Lm5leHQgIT0gJm1tLT5tbF9lbnRyeSB8fAogCSAgICBlbnRyeS0+ZmxfZW50cnkubmV4dCAhPSAmbW0tPmZsX2VudHJ5KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaAppbmRleCAwZmU3YjQ0Li4wYjhkMzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmgKQEAgLTM0LDggKzM0LDggQEAKIC8qKiBSZWFkL3dyaXRlIG1lbW9yeSBiYXJyaWVyICovCiAjZGVmaW5lIERSTV9NRU1PUllCQVJSSUVSKCkJCW1iKCkKIC8qKiBEUk0gZGV2aWNlIGxvY2FsIGRlY2xhcmF0aW9uICovCi0jZGVmaW5lIERSTV9ERVZJQ0UJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsgXAotCQkJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXYKKyNkZWZpbmUgRFJNX0RFVklDRQlzdHJ1Y3QgZHJtX2ZpbGUJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7IFwKKwkJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYJPSBwcml2LT5oZWFkLT5kZXYKIAogLyoqIElSUSBoYW5kbGVyIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHR5cGUgYW5kIHZhbHVlcyAqLwogI2RlZmluZSBEUk1fSVJRX0FSR1MJCWludCBpcnEsIHZvaWQgKmFyZwpAQCAtOTYsMjQgKzk2LDYgQEAKIAogI2RlZmluZSBEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oX3ByaXYsIF9maWxwKSBfcHJpdiA9IF9maWxwLT5wcml2YXRlX2RhdGEKIAotLyoqCi0gKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIFNBUkVBLgotICoKLSAqIFNlYXJjaGVzIHRoZSBTQVJFQSBvbiB0aGUgbWFwcGluZyBsaXN0cyBhbmQgcG9pbnRzIGRybV9kZXZpY2U6OnNhcmVhIHRvIGl0LgotICovCi0jZGVmaW5lIERSTV9HRVRTQVJFQSgpCQkJCQkJCSBcCi1kbyB7IAkJCQkJCQkJCSBcCi0JZHJtX21hcF9saXN0X3QgKmVudHJ5OwkJCQkJCSBcCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSggZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQgKSB7CSBcCi0JCWlmICggZW50cnktPm1hcCAmJgkJCQkJIFwKLQkJICAgICBlbnRyeS0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCQkJIFwKLQkJICAgICAoZW50cnktPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0spICkgewkgXAotCQkJZGV2X3ByaXYtPnNhcmVhID0gZW50cnktPm1hcDsJCQkgXAotIAkJCWJyZWFrOwkJCQkJCSBcCi0gCQl9CQkJCQkJCSBcCi0gCX0JCQkJCQkJCSBcCi19IHdoaWxlICgwKQotCiAjZGVmaW5lIERSTV9IWiBIWgogCiAjZGVmaW5lIERSTV9XQUlUX09OKCByZXQsIHF1ZXVlLCB0aW1lb3V0LCBjb25kaXRpb24gKQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYwppbmRleCA4NmEwZjFjLi5lMjkyYmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYwpAQCAtNDcsNyArNDcsNyBAQAogLyoqCiAgKiBcYnJpZWYgQWxsb2NhdGUgYSBQQ0kgY29uc2lzdGVudCBtZW1vcnkgYmxvY2ssIGZvciBETUEuCiAgKi8KLWRybV9kbWFfaGFuZGxlX3QgKmRybV9wY2lfYWxsb2MoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAorZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKIAkJCQlkbWFfYWRkcl90IG1heGFkZHIpCiB7CiAJZHJtX2RtYV9oYW5kbGVfdCAqZG1haDsKQEAgLTEyNiw3ICsxMjYsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIGludGVybmFsIHVzZSBpbiB0aGUgTGludXgtc3BlY2lmaWMgRFJNIGNvcmUgY29kZS4KICAqLwotdm9pZCBfX2RybV9wY2lfZnJlZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKQordm9pZCBfX2RybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpCiB7CiAjaWYgMQogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTE3Miw3ICsxNzIsNyBAQAogLyoqCiAgKiBcYnJpZWYgRnJlZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jawogICovCi12b2lkIGRybV9wY2lfZnJlZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKQordm9pZCBkcm1fcGNpX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKQogewogCV9fZHJtX3BjaV9mcmVlKGRldiwgZG1haCk7CiAJa2ZyZWUoZG1haCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKaW5kZXggYjIwNDQ5OC4uMTJkZmVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYwpAQCAtODcsNyArODcsNyBAQAogICogIi9wcm9jL2RyaS8lbWlub3IlLyIsIGFuZCBlYWNoIGVudHJ5IGluIHByb2NfbGlzdCBhcwogICogIi9wcm9jL2RyaS8lbWlub3IlLyVuYW1lJSIuCiAgKi8KLWludCBkcm1fcHJvY19pbml0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG1pbm9yLAoraW50IGRybV9wcm9jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBtaW5vciwKIAkJICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJvb3QsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKmRldl9yb290KQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwpAQCAtMTYzLDcgKzE2Myw3IEBACiBzdGF0aWMgaW50IGRybV9uYW1lX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwogCiAJaWYgKG9mZnNldCA+IERSTV9QUk9DX0xJTUlUKSB7CkBAIC0yMDUsMTEgKzIwNSwxMCBAQAogc3RhdGljIGludCBkcm1fX3ZtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7Ci0JZHJtX21hcF90ICptYXA7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fbWFwICptYXA7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCiAJLyogSGFyZGNvZGVkIGZyb20gX0RSTV9GUkFNRV9CVUZGRVIsCiAJICAgX0RSTV9SRUdJU1RFUlMsIF9EUk1fU0hNLCBfRFJNX0FHUCwgYW5kCkBAIC0yMjksOSArMjI4LDcgQEAKIAlEUk1fUFJPQ19QUklOVCgic2xvdAkgb2Zmc2V0CSAgICAgIHNpemUgdHlwZSBmbGFncwkgIgogCQkgICAgICAgImFkZHJlc3MgbXRyclxuXG4iKTsKIAlpID0gMDsKLQlpZiAoZGV2LT5tYXBsaXN0ICE9IE5VTEwpCi0JCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQltYXAgPSByX2xpc3QtPm1hcDsKIAkJaWYgKCFtYXApCiAJCQljb250aW51ZTsKQEAgLTI0MiwxNCArMjM5LDE1IEBACiAJCURSTV9QUk9DX1BSSU5UKCIlNGQgMHglMDhseCAweCUwOGx4ICU0LjRzICAweCUwMnggMHglMDh4ICIsCiAJCQkgICAgICAgaSwKIAkJCSAgICAgICBtYXAtPm9mZnNldCwKLQkJCSAgICAgICBtYXAtPnNpemUsIHR5cGUsIG1hcC0+ZmxhZ3MsIHJfbGlzdC0+dXNlcl90b2tlbik7CisJCQkgICAgICAgbWFwLT5zaXplLCB0eXBlLCBtYXAtPmZsYWdzLAorCQkJICAgICAgIHJfbGlzdC0+dXNlcl90b2tlbik7CiAJCWlmIChtYXAtPm10cnIgPCAwKSB7CiAJCQlEUk1fUFJPQ19QUklOVCgibm9uZVxuIik7CiAJCX0gZWxzZSB7CiAJCQlEUk1fUFJPQ19QUklOVCgiJTRkXG4iLCBtYXAtPm10cnIpOwogCQl9CiAJCWkrKzsKLQkJfQorCX0KIAogCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KQogCQlyZXR1cm4gcmVxdWVzdDsKQEAgLTI2Myw3ICsyNjEsNyBAQAogc3RhdGljIGludCBkcm1fdm1faW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMjg2LDEwICsyODQsMTAgQEAKIHN0YXRpYyBpbnQgZHJtX19xdWV1ZXNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkJICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7CiAJaW50IGk7Ci0JZHJtX3F1ZXVlX3QgKnE7CisJc3RydWN0IGRybV9xdWV1ZSAqcTsKIAogCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgewogCQkqZW9mID0gMTsKQEAgLTMzNiw3ICszMzQsNyBAQAogc3RhdGljIGludCBkcm1fcXVldWVzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQkgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTM1OSw5ICszNTcsOSBAQAogc3RhdGljIGludCBkcm1fX2J1ZnNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAKIAlpZiAoIWRtYSB8fCBvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgewpAQCAtNDA4LDcgKzQwNiw3IEBACiBzdGF0aWMgaW50IGRybV9idWZzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC00MzEsOSArNDI5LDkgQEAKIHN0YXRpYyBpbnQgZHJtX19jbGllbnRzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgICAgaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKLQlkcm1fZmlsZV90ICpwcml2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdjsKIAogCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgewogCQkqZW9mID0gMTsKQEAgLTQ0NCw3ICs0NDIsNyBAQAogCSplb2YgPSAwOwogCiAJRFJNX1BST0NfUFJJTlQoImEgZGV2CXBpZCAgICB1aWQJbWFnaWMJICBpb2N0bHNcblxuIik7Ci0JZm9yIChwcml2ID0gZGV2LT5maWxlX2ZpcnN0OyBwcml2OyBwcml2ID0gcHJpdi0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJmRldi0+ZmlsZWxpc3QsIGxoZWFkKSB7CiAJCURSTV9QUk9DX1BSSU5UKCIlYyAlM2QgJTVkICU1ZCAlMTB1ICUxMGx1XG4iLAogCQkJICAgICAgIHByaXYtPmF1dGhlbnRpY2F0ZWQgPyAneScgOiAnbicsCiAJCQkgICAgICAgcHJpdi0+bWlub3IsCkBAIC00NjQsNyArNDYyLDcgQEAKIHN0YXRpYyBpbnQgZHJtX2NsaWVudHNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkJICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTQ3OCw5ICs0NzYsOSBAQAogc3RhdGljIGludCBkcm1fX3ZtYV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKLQlkcm1fdm1hX2VudHJ5X3QgKnB0OworCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICpwdDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKICNpZiBkZWZpbmVkKF9faTM4Nl9fKQogCXVuc2lnbmVkIGludCBwZ3Byb3Q7CkBAIC00OTcsNyArNDk1LDcgQEAKIAlEUk1fUFJPQ19QUklOVCgidm1hIHVzZSBjb3VudDogJWQsIGhpZ2hfbWVtb3J5ID0gJXAsIDB4JTA4bHhcbiIsCiAJCSAgICAgICBhdG9taWNfcmVhZCgmZGV2LT52bWFfY291bnQpLAogCQkgICAgICAgaGlnaF9tZW1vcnksIHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkpOwotCWZvciAocHQgPSBkZXYtPnZtYWxpc3Q7IHB0OyBwdCA9IHB0LT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwdCwgJmRldi0+dm1hbGlzdCwgaGVhZCkgewogCQlpZiAoISh2bWEgPSBwdC0+dm1hKSkKIAkJCWNvbnRpbnVlOwogCQlEUk1fUFJPQ19QUklOVCgiXG4lNWQgMHglMDhseC0weCUwOGx4ICVjJWMlYyVjJWMlYyAweCUwOGx4MDAwIiwKQEAgLTUzNyw3ICs1MzUsNyBAQAogc3RhdGljIGludCBkcm1fdm1hX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCmluZGV4IGU5NDI5N2IuLmY1NDY2OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2FyZWEuaApAQCAtNTAsMjkgKzUwLDM1IEBACiAjZGVmaW5lIFNBUkVBX0RSQVdBQkxFX0NMQUlNRURfRU5UUlkgICAgMHg4MDAwMDAwMAogCiAvKiogU0FSRUEgZHJhd2FibGUgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSB7CitzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIHsKIAl1bnNpZ25lZCBpbnQgc3RhbXA7CiAJdW5zaWduZWQgaW50IGZsYWdzOwotfSBkcm1fc2FyZWFfZHJhd2FibGVfdDsKK307CiAKIC8qKiBTQVJFQSBmcmFtZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKK3N0cnVjdCBkcm1fc2FyZWFfZnJhbWUgewogCXVuc2lnbmVkIGludCB4OwogCXVuc2lnbmVkIGludCB5OwogCXVuc2lnbmVkIGludCB3aWR0aDsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0OwogCXVuc2lnbmVkIGludCBmdWxsc2NyZWVuOwotfSBkcm1fc2FyZWFfZnJhbWVfdDsKK307CiAKIC8qKiBTQVJFQSAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhIHsKK3N0cnVjdCBkcm1fc2FyZWEgewogICAgIC8qKiBmaXJzdCB0aGluZyBpcyBhbHdheXMgdGhlIERSTSBsb2NraW5nIHN0cnVjdHVyZSAqLwotCWRybV9od19sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgbG9jazsKICAgICAvKiogXHRvZG8gVXNlIHJlYWRlcnMvd3JpdGVyIGxvY2sgZm9yIGRybV9zYXJlYTo6ZHJhd2FibGVfbG9jayAqLwotCWRybV9od19sb2NrX3QgZHJhd2FibGVfbG9jazsKLQlkcm1fc2FyZWFfZHJhd2FibGVfdCBkcmF3YWJsZVRhYmxlW1NBUkVBX01BWF9EUkFXQUJMRVNdOwkvKio8IGRyYXdhYmxlcyAqLwotCWRybV9zYXJlYV9mcmFtZV90IGZyYW1lOwkvKio8IGZyYW1lICovCisJc3RydWN0IGRybV9od19sb2NrIGRyYXdhYmxlX2xvY2s7CisJc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSBkcmF3YWJsZVRhYmxlW1NBUkVBX01BWF9EUkFXQUJMRVNdOwkvKio8IGRyYXdhYmxlcyAqLworCXN0cnVjdCBkcm1fc2FyZWFfZnJhbWUgZnJhbWU7CS8qKjwgZnJhbWUgKi8KIAlkcm1fY29udGV4dF90IGR1bW15X2NvbnRleHQ7Ci19IGRybV9zYXJlYV90OworfTsKKworI2lmbmRlZiBfX0tFUk5FTF9fCit0eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgZHJtX3NhcmVhX2RyYXdhYmxlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWFfZnJhbWUgZHJtX3NhcmVhX2ZyYW1lX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWEgZHJtX3NhcmVhX3Q7CisjZW5kaWYKIAogI2VuZGlmCQkJCS8qIF9EUk1fU0FSRUFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYwppbmRleCAwNmVmN2RkLi4wNjdkMjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jCkBAIC0zNiw3ICszNiw3IEBACiAKICNkZWZpbmUgREVCVUdfU0NBVFRFUiAwCiAKLXZvaWQgZHJtX3NnX2NsZWFudXAoZHJtX3NnX21lbV90ICogZW50cnkpCit2b2lkIGRybV9zZ19jbGVhbnVwKHN0cnVjdCBkcm1fc2dfbWVtICogZW50cnkpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGk7CkBAIC02NSwxMSArNjUsMTEgQEAKIGludCBkcm1fc2dfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9zY2F0dGVyX2dhdGhlcl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fc2NhdHRlcl9nYXRoZXJfdCByZXF1ZXN0OwotCWRybV9zZ19tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciByZXF1ZXN0OworCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzLCBpLCBqOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTIwMSwxNiArMjAxLDE2IEBACiBpbnQgZHJtX3NnX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgcmVxdWVzdDsKLQlkcm1fc2dfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnk7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwKLQkJCSAgIChkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKikgYXJnLAorCQkJICAgKHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgX191c2VyICopIGFyZywKIAkJCSAgIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmMKaW5kZXggZTE1ZGI2ZC4uODQyMWE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uYwpAQCAtMzgsMTMgKzM4LDEzIEBACiAKICNpbmNsdWRlICJkcm1fc21hbi5oIgogCi10eXBlZGVmIHN0cnVjdCBkcm1fb3duZXJfaXRlbSB7Ci0JZHJtX2hhc2hfaXRlbV90IG93bmVyX2hhc2g7CitzdHJ1Y3QgZHJtX293bmVyX2l0ZW0geworCXN0cnVjdCBkcm1faGFzaF9pdGVtIG93bmVyX2hhc2g7CiAJc3RydWN0IGxpc3RfaGVhZCBzbWFuX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBtZW1fYmxvY2tzOwotfSBkcm1fb3duZXJfaXRlbV90OworfTsKIAotdm9pZCBkcm1fc21hbl90YWtlZG93bihkcm1fc21hbl90ICogc21hbikKK3ZvaWQgZHJtX3NtYW5fdGFrZWRvd24oc3RydWN0IGRybV9zbWFuICogc21hbikKIHsKIAlkcm1faHRfcmVtb3ZlKCZzbWFuLT51c2VyX2hhc2hfdGFiKTsKIAlkcm1faHRfcmVtb3ZlKCZzbWFuLT5vd25lcl9oYXNoX3RhYik7CkBAIC01NiwxMiArNTYsMTIgQEAKIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fdGFrZWRvd24pOwogCiBpbnQKLWRybV9zbWFuX2luaXQoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBudW1fbWFuYWdlcnMsCitkcm1fc21hbl9pbml0KHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBudW1fbWFuYWdlcnMsCiAJICAgICAgdW5zaWduZWQgaW50IHVzZXJfb3JkZXIsIHVuc2lnbmVkIGludCBvd25lcl9vcmRlcikKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXNtYW4tPm1tID0gKGRybV9zbWFuX21tX3QgKikgZHJtX2NhbGxvYyhudW1fbWFuYWdlcnMsIHNpemVvZigqc21hbi0+bW0pLAorCXNtYW4tPm1tID0gKHN0cnVjdCBkcm1fc21hbl9tbSAqKSBkcm1fY2FsbG9jKG51bV9tYW5hZ2Vycywgc2l6ZW9mKCpzbWFuLT5tbSksCiAJCQkJCQlEUk1fTUVNX01NKTsKIAlpZiAoIXNtYW4tPm1tKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC04OCw4ICs4OCw4IEBACiBzdGF0aWMgdm9pZCAqZHJtX3NtYW5fbW1fYWxsb2NhdGUodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgdW5zaWduZWQgYWxpZ25tZW50KQogewotCWRybV9tbV90ICptbSA9IChkcm1fbW1fdCAqKSBwcml2YXRlOwotCWRybV9tbV9ub2RlX3QgKnRtcDsKKwlzdHJ1Y3QgZHJtX21tICptbSA9IChzdHJ1Y3QgZHJtX21tICopIHByaXZhdGU7CisJc3RydWN0IGRybV9tbV9ub2RlICp0bXA7CiAKIAl0bXAgPSBkcm1fbW1fc2VhcmNoX2ZyZWUobW0sIHNpemUsIGFsaWdubWVudCwgMSk7CiAJaWYgKCF0bXApIHsKQEAgLTEwMSwzMCArMTAxLDMwIEBACiAKIHN0YXRpYyB2b2lkIGRybV9zbWFuX21tX2ZyZWUodm9pZCAqcHJpdmF0ZSwgdm9pZCAqcmVmKQogewotCWRybV9tbV9ub2RlX3QgKm5vZGUgPSAoZHJtX21tX25vZGVfdCAqKSByZWY7CisJc3RydWN0IGRybV9tbV9ub2RlICpub2RlID0gKHN0cnVjdCBkcm1fbW1fbm9kZSAqKSByZWY7CiAKIAlkcm1fbW1fcHV0X2Jsb2NrKG5vZGUpOwogfQogCiBzdGF0aWMgdm9pZCBkcm1fc21hbl9tbV9kZXN0cm95KHZvaWQgKnByaXZhdGUpCiB7Ci0JZHJtX21tX3QgKm1tID0gKGRybV9tbV90ICopIHByaXZhdGU7CisJc3RydWN0IGRybV9tbSAqbW0gPSAoc3RydWN0IGRybV9tbSAqKSBwcml2YXRlOwogCWRybV9tbV90YWtlZG93bihtbSk7CiAJZHJtX2ZyZWUobW0sIHNpemVvZigqbW0pLCBEUk1fTUVNX01NKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJtX3NtYW5fbW1fb2Zmc2V0KHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZikKIHsKLQlkcm1fbW1fbm9kZV90ICpub2RlID0gKGRybV9tbV9ub2RlX3QgKikgcmVmOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX21tX25vZGUgKikgcmVmOwogCXJldHVybiBub2RlLT5zdGFydDsKIH0KIAogaW50Ci1kcm1fc21hbl9zZXRfcmFuZ2UoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAorZHJtX3NtYW5fc2V0X3JhbmdlKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAogCQkgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JZHJtX3NtYW5fbW1fdCAqc21hbl9tbTsKLQlkcm1fbW1fdCAqbW07CisJc3RydWN0IGRybV9zbWFuX21tICpzbWFuX21tOworCXN0cnVjdCBkcm1fbW0gKm1tOwogCWludCByZXQ7CiAKIAlCVUdfT04obWFuYWdlciA+PSBzbWFuLT5udW1fbWFuYWdlcnMpOwpAQCAtMTUzLDggKzE1Myw4IEBACiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX3NldF9yYW5nZSk7CiAKIGludAotZHJtX3NtYW5fc2V0X21hbmFnZXIoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAotCQkgICAgIGRybV9zbWFuX21tX3QgKiBhbGxvY2F0b3IpCitkcm1fc21hbl9zZXRfbWFuYWdlcihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKKwkJICAgICBzdHJ1Y3QgZHJtX3NtYW5fbW0gKiBhbGxvY2F0b3IpCiB7CiAJQlVHX09OKG1hbmFnZXIgPj0gc21hbi0+bnVtX21hbmFnZXJzKTsKIAlzbWFuLT5tbVttYW5hZ2VyXSA9ICphbGxvY2F0b3I7CkBAIC0xNjMsMTYgKzE2MywxNiBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9zZXRfbWFuYWdlcik7CiAKLXN0YXRpYyBkcm1fb3duZXJfaXRlbV90ICpkcm1fc21hbl9nZXRfb3duZXJfaXRlbShkcm1fc21hbl90ICogc21hbiwKK3N0YXRpYyBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKmRybV9zbWFuX2dldF9vd25lcl9pdGVtKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sCiAJCQkJCQkgdW5zaWduZWQgbG9uZyBvd25lcikKIHsKIAlpbnQgcmV0OwotCWRybV9oYXNoX2l0ZW1fdCAqb3duZXJfaGFzaF9pdGVtOwotCWRybV9vd25lcl9pdGVtX3QgKm93bmVyX2l0ZW07CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKm93bmVyX2hhc2hfaXRlbTsKKwlzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKm93bmVyX2l0ZW07CiAKIAlyZXQgPSBkcm1faHRfZmluZF9pdGVtKCZzbWFuLT5vd25lcl9oYXNoX3RhYiwgb3duZXIsICZvd25lcl9oYXNoX2l0ZW0pOwogCWlmICghcmV0KSB7Ci0JCXJldHVybiBkcm1faGFzaF9lbnRyeShvd25lcl9oYXNoX2l0ZW0sIGRybV9vd25lcl9pdGVtX3QsCisJCXJldHVybiBkcm1faGFzaF9lbnRyeShvd25lcl9oYXNoX2l0ZW0sIHN0cnVjdCBkcm1fb3duZXJfaXRlbSwKIAkJCQkgICAgICBvd25lcl9oYXNoKTsKIAl9CiAKQEAgLTE5NCwxNCArMTk0LDE0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWRybV9tZW1ibG9ja19pdGVtX3QgKmRybV9zbWFuX2FsbG9jKGRybV9zbWFuX3QgKnNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAorc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICpkcm1fc21hbl9hbGxvYyhzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGFsaWdubWVudCwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBvd25lcikKIHsKIAl2b2lkICp0bXA7Ci0JZHJtX3NtYW5fbW1fdCAqc21hbl9tbTsKLQlkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtOwotCWRybV9tZW1ibG9ja19pdGVtX3QgKm1lbWJsb2NrOworCXN0cnVjdCBkcm1fc21hbl9tbSAqc21hbl9tbTsKKwlzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKm93bmVyX2l0ZW07CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICptZW1ibG9jazsKIAogCUJVR19PTihtYW5hZ2VyID49IHNtYW4tPm51bV9tYW5hZ2Vycyk7CiAKQEAgLTI0Niw5ICsyNDYsOSBAQAogCiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX2FsbG9jKTsKIAotc3RhdGljIHZvaWQgZHJtX3NtYW5fZnJlZShkcm1fbWVtYmxvY2tfaXRlbV90ICppdGVtKQorc3RhdGljIHZvaWQgZHJtX3NtYW5fZnJlZShzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKml0ZW0pCiB7Ci0JZHJtX3NtYW5fdCAqc21hbiA9IGl0ZW0tPnNtYW47CisJc3RydWN0IGRybV9zbWFuICpzbWFuID0gaXRlbS0+c21hbjsKIAogCWxpc3RfZGVsKCZpdGVtLT5vd25lcl9saXN0KTsKIAlkcm1faHRfcmVtb3ZlX2l0ZW0oJnNtYW4tPnVzZXJfaGFzaF90YWIsICZpdGVtLT51c2VyX2hhc2gpOwpAQCAtMjU2LDQwICsyNTYsNDEgQEAKIAlkcm1fZnJlZShpdGVtLCBzaXplb2YoKml0ZW0pLCBEUk1fTUVNX01NKTsKIH0KIAotaW50IGRybV9zbWFuX2ZyZWVfa2V5KGRybV9zbWFuX3QgKnNtYW4sIHVuc2lnbmVkIGludCBrZXkpCitpbnQgZHJtX3NtYW5fZnJlZV9rZXkoc3RydWN0IGRybV9zbWFuICpzbWFuLCB1bnNpZ25lZCBpbnQga2V5KQogewotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaF9pdGVtOwotCWRybV9tZW1ibG9ja19pdGVtX3QgKm1lbWJsb2NrX2l0ZW07CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2hfaXRlbTsKKwlzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKm1lbWJsb2NrX2l0ZW07CiAKIAlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmc21hbi0+dXNlcl9oYXNoX3RhYiwga2V5LCAmaGFzaF9pdGVtKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZW1ibG9ja19pdGVtID0gZHJtX2hhc2hfZW50cnkoaGFzaF9pdGVtLCBkcm1fbWVtYmxvY2tfaXRlbV90LCB1c2VyX2hhc2gpOworCW1lbWJsb2NrX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIHN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSwKKwkJCQkgICAgICAgdXNlcl9oYXNoKTsKIAlkcm1fc21hbl9mcmVlKG1lbWJsb2NrX2l0ZW0pOwogCXJldHVybiAwOwogfQogCiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX2ZyZWVfa2V5KTsKIAotc3RhdGljIHZvaWQgZHJtX3NtYW5fcmVtb3ZlX293bmVyKGRybV9zbWFuX3QgKnNtYW4sCi0JCQkJICBkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtKQorc3RhdGljIHZvaWQgZHJtX3NtYW5fcmVtb3ZlX293bmVyKHN0cnVjdCBkcm1fc21hbiAqc21hbiwKKwkJCQkgIHN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbSkKIHsKIAlsaXN0X2RlbCgmb3duZXJfaXRlbS0+c21hbl9saXN0KTsKIAlkcm1faHRfcmVtb3ZlX2l0ZW0oJnNtYW4tPm93bmVyX2hhc2hfdGFiLCAmb3duZXJfaXRlbS0+b3duZXJfaGFzaCk7CiAJZHJtX2ZyZWUob3duZXJfaXRlbSwgc2l6ZW9mKCpvd25lcl9pdGVtKSwgRFJNX01FTV9NTSk7CiB9CiAKLWludCBkcm1fc21hbl9vd25lcl9jbGVhbihkcm1fc21hbl90ICpzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKQoraW50IGRybV9zbWFuX293bmVyX2NsZWFuKHN0cnVjdCBkcm1fc21hbiAqc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcikKIHsKIAotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaF9pdGVtOwotCWRybV9vd25lcl9pdGVtX3QgKm93bmVyX2l0ZW07CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2hfaXRlbTsKKwlzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKm93bmVyX2l0ZW07CiAKIAlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmc21hbi0+b3duZXJfaGFzaF90YWIsIG93bmVyLCAmaGFzaF9pdGVtKSkgewogCQlyZXR1cm4gLTE7CiAJfQogCi0Jb3duZXJfaXRlbSA9IGRybV9oYXNoX2VudHJ5KGhhc2hfaXRlbSwgZHJtX293bmVyX2l0ZW1fdCwgb3duZXJfaGFzaCk7CisJb3duZXJfaXRlbSA9IGRybV9oYXNoX2VudHJ5KGhhc2hfaXRlbSwgc3RydWN0IGRybV9vd25lcl9pdGVtLCBvd25lcl9oYXNoKTsKIAlpZiAob3duZXJfaXRlbS0+bWVtX2Jsb2Nrcy5uZXh0ID09ICZvd25lcl9pdGVtLT5tZW1fYmxvY2tzKSB7CiAJCWRybV9zbWFuX3JlbW92ZV9vd25lcihzbWFuLCBvd25lcl9pdGVtKTsKIAkJcmV0dXJuIC0xOwpAQCAtMzAwLDEwICszMDEsMTAgQEAKIAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9vd25lcl9jbGVhbik7CiAKLXN0YXRpYyB2b2lkIGRybV9zbWFuX2RvX293bmVyX2NsZWFudXAoZHJtX3NtYW5fdCAqc21hbiwKLQkJCQkgICAgICBkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtKQorc3RhdGljIHZvaWQgZHJtX3NtYW5fZG9fb3duZXJfY2xlYW51cChzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sCisJCQkJICAgICAgc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtKQogewotCWRybV9tZW1ibG9ja19pdGVtX3QgKmVudHJ5LCAqbmV4dDsKKwlzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKmVudHJ5LCAqbmV4dDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJm93bmVyX2l0ZW0tPm1lbV9ibG9ja3MsCiAJCQkJIG93bmVyX2xpc3QpIHsKQEAgLTMxMiwyOCArMzEzLDI4IEBACiAJZHJtX3NtYW5fcmVtb3ZlX293bmVyKHNtYW4sIG93bmVyX2l0ZW0pOwogfQogCi12b2lkIGRybV9zbWFuX293bmVyX2NsZWFudXAoZHJtX3NtYW5fdCAqc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcikKK3ZvaWQgZHJtX3NtYW5fb3duZXJfY2xlYW51cChzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpCiB7CiAKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2hfaXRlbTsKLQlkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoX2l0ZW07CisJc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtOwogCiAJaWYgKGRybV9odF9maW5kX2l0ZW0oJnNtYW4tPm93bmVyX2hhc2hfdGFiLCBvd25lciwgJmhhc2hfaXRlbSkpIHsKIAogCQlyZXR1cm47CiAJfQogCi0Jb3duZXJfaXRlbSA9IGRybV9oYXNoX2VudHJ5KGhhc2hfaXRlbSwgZHJtX293bmVyX2l0ZW1fdCwgb3duZXJfaGFzaCk7CisJb3duZXJfaXRlbSA9IGRybV9oYXNoX2VudHJ5KGhhc2hfaXRlbSwgc3RydWN0IGRybV9vd25lcl9pdGVtLCBvd25lcl9oYXNoKTsKIAlkcm1fc21hbl9kb19vd25lcl9jbGVhbnVwKHNtYW4sIG93bmVyX2l0ZW0pOwogfQogCiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX293bmVyX2NsZWFudXApOwogCi12b2lkIGRybV9zbWFuX2NsZWFudXAoZHJtX3NtYW5fdCAqc21hbikKK3ZvaWQgZHJtX3NtYW5fY2xlYW51cChzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4pCiB7Ci0JZHJtX293bmVyX2l0ZW1fdCAqZW50cnksICpuZXh0OworCXN0cnVjdCBkcm1fb3duZXJfaXRlbSAqZW50cnksICpuZXh0OwogCXVuc2lnbmVkIGludCBpOwotCWRybV9zbWFuX21tX3QgKnNtYW5fbW07CisJc3RydWN0IGRybV9zbWFuX21tICpzbWFuX21tOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCAmc21hbi0+b3duZXJfaXRlbXMsIHNtYW5fbGlzdCkgewogCQlkcm1fc21hbl9kb19vd25lcl9jbGVhbnVwKHNtYW4sIGVudHJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uaAppbmRleCBkZGM3MzJhLi4zOWEzOWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5oCkBAIC01MCw3ICs1MCw3IEBACiAgKiBmb3IgbWVtb3J5IG1hbmFnZW1lbnQuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NtYW5fbW0geworc3RydWN0IGRybV9zbWFuX21tIHsKIAkvKiBwcml2YXRlIGluZm8uIElmIGFsbG9jYXRlZCwgbmVlZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95CiAJICAgZnVuY3Rpb24gKi8KIAl2b2lkICpwcml2YXRlOwpAQCAtNzQsMzAgKzc0LDMwIEBACiAJICAgImFsbG9jIiBmdW5jdGlvbiAqLwogCiAJdW5zaWduZWQgbG9uZyAoKm9mZnNldCkgKHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZik7Ci19IGRybV9zbWFuX21tX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSB7CitzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gewogCXN0cnVjdCBsaXN0X2hlYWQgb3duZXJfbGlzdDsKLQlkcm1faGFzaF9pdGVtX3QgdXNlcl9oYXNoOworCXN0cnVjdCBkcm1faGFzaF9pdGVtIHVzZXJfaGFzaDsKIAl2b2lkICptbV9pbmZvOwotCWRybV9zbWFuX21tX3QgKm1tOworCXN0cnVjdCBkcm1fc21hbl9tbSAqbW07CiAJc3RydWN0IGRybV9zbWFuICpzbWFuOwotfSBkcm1fbWVtYmxvY2tfaXRlbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NtYW4gewotCWRybV9zbWFuX21tX3QgKm1tOworc3RydWN0IGRybV9zbWFuIHsKKwlzdHJ1Y3QgZHJtX3NtYW5fbW0gKm1tOwogCWludCBudW1fbWFuYWdlcnM7Ci0JZHJtX29wZW5faGFzaF90IG93bmVyX2hhc2hfdGFiOwotCWRybV9vcGVuX2hhc2hfdCB1c2VyX2hhc2hfdGFiOworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIG93bmVyX2hhc2hfdGFiOworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIHVzZXJfaGFzaF90YWI7CiAJc3RydWN0IGxpc3RfaGVhZCBvd25lcl9pdGVtczsKLX0gZHJtX3NtYW5fdDsKK307CiAKIC8qCiAgKiBUYWtlIGRvd24gYSBtZW1vcnkgbWFuYWdlci4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYQogICogc3VjY2Vzc2Z1bCBpbml0IGFuZCBhZnRlciBhIGNhbGwgdG8gZHJtX3NtYW5fY2xlYW51cC4KICAqLwogCi1leHRlcm4gdm9pZCBkcm1fc21hbl90YWtlZG93bihkcm1fc21hbl90ICogc21hbik7CitleHRlcm4gdm9pZCBkcm1fc21hbl90YWtlZG93bihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuKTsKIAogLyoKICAqIEFsbG9jYXRlIHN0cnVjdHVyZXMgZm9yIGEgbWFuYWdlci4KQEAgLTExMiw3ICsxMTIsNyBAQAogICoKICAqLwogCi1leHRlcm4gaW50IGRybV9zbWFuX2luaXQoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBudW1fbWFuYWdlcnMsCitleHRlcm4gaW50IGRybV9zbWFuX2luaXQoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG51bV9tYW5hZ2VycywKIAkJCSB1bnNpZ25lZCBpbnQgdXNlcl9vcmRlciwgdW5zaWduZWQgaW50IG93bmVyX29yZGVyKTsKIAogLyoKQEAgLTEyMCw3ICsxMjAsNyBAQAogICogbWFuYWdlciB1bmxlc3MgYSBjdXN0b21pemVkIGFsbG9nYXRvciBpcyB1c2VkLgogICovCiAKLWV4dGVybiBpbnQgZHJtX3NtYW5fc2V0X3JhbmdlKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKK2V4dGVybiBpbnQgZHJtX3NtYW5fc2V0X3JhbmdlKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogLyoKQEAgLTEyOSwyMyArMTI5LDIzIEBACiAgKiBzbyBpdCBjYW4gYmUgZGVzdHJveWVkIGFmdGVyIHRoaXMgY2FsbC4KICAqLwogCi1leHRlcm4gaW50IGRybV9zbWFuX3NldF9tYW5hZ2VyKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYW5nZXIsCi0JCQkJZHJtX3NtYW5fbW1fdCAqIGFsbG9jYXRvcik7CitleHRlcm4gaW50IGRybV9zbWFuX3NldF9tYW5hZ2VyKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hbmdlciwKKwkJCQlzdHJ1Y3QgZHJtX3NtYW5fbW0gKiBhbGxvY2F0b3IpOwogCiAvKgogICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2suIEFsaWdtZW50IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCiAgKi8KIAotZXh0ZXJuIGRybV9tZW1ibG9ja19pdGVtX3QgKmRybV9zbWFuX2FsbG9jKGRybV9zbWFuX3QgKiBzbWFuLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgbWFuYWdlciwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCQkgICB1bnNpZ25lZCBhbGlnbm1lbnQsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgb3duZXIpOworZXh0ZXJuIHN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqZHJtX3NtYW5fYWxsb2Moc3RydWN0IGRybV9zbWFuICogc21hbiwKKwkJCQkJCXVuc2lnbmVkIGludCBtYW5hZ2VyLAorCQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkJdW5zaWduZWQgYWxpZ25tZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBvd25lcik7CiAvKgogICogRnJlZSBhIG1lbW9yeSBibG9jayBpZGVudGlmaWVkIGJ5IGl0cyB1c2VyIGhhc2gga2V5LgogICovCiAKLWV4dGVybiBpbnQgZHJtX3NtYW5fZnJlZV9rZXkoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBrZXkpOworZXh0ZXJuIGludCBkcm1fc21hbl9mcmVlX2tleShzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQga2V5KTsKIAogLyoKICAqIHJldHVybnMgMSBpZmYgdGhlcmUgYXJlIG5vIHN0YWxlIG1lbW9yeSBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3duZXIuCkBAIC0xNTQsNyArMTU0LDcgQEAKICAqIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggb3duZXIuCiAgKi8KIAotZXh0ZXJuIGludCBkcm1fc21hbl9vd25lcl9jbGVhbihkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcik7CitleHRlcm4gaW50IGRybV9zbWFuX293bmVyX2NsZWFuKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOwogCiAvKgogICogRnJlZXMgYWxsIHN0YWxlIG1lbW9yeSBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3duZXIuIE5vdGUgdGhhdCB0aGlzCkBAIC0xNjQsMTMgKzE2NCwxMyBAQAogICogaXMgbm90IGdvaW5nIHRvIGJlIHJlZmVyZW5jZWQgYW55bW9yZS4KICAqLwogCi1leHRlcm4gdm9pZCBkcm1fc21hbl9vd25lcl9jbGVhbnVwKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKTsKK2V4dGVybiB2b2lkIGRybV9zbWFuX293bmVyX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcik7CiAKIC8qCiAgKiBGcmVlcyBhbGwgc3RhbGUgbWVtb3J5IGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1lbW9yeSBtYW5hZ2VyLgogICogU2VlIGlkbGluZyBhYm92ZS4KICAqLwogCi1leHRlcm4gdm9pZCBkcm1fc21hbl9jbGVhbnVwKGRybV9zbWFuX3QgKiBzbWFuKTsKK2V4dGVybiB2b2lkIGRybV9zbWFuX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICogc21hbik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCmluZGV4IDE5NDA4YWQuLmVlODNmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKQEAgLTQ5LDE2ICs0OSwyMSBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGNhcmRzX2xpbWl0LCBkcm1fY2FyZHNfbGltaXQsIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRybV9kZWJ1ZywgaW50LCAwNjAwKTsKIAotZHJtX2hlYWRfdCAqKmRybV9oZWFkczsKK3N0cnVjdCBkcm1faGVhZCAqKmRybV9oZWFkczsKIHN0cnVjdCBjbGFzcyAqZHJtX2NsYXNzOwogc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcm1fcHJvY19yb290OwogCi1zdGF0aWMgaW50IGRybV9maWxsX2luX2Rldihkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorc3RhdGljIGludCBkcm1fZmlsbF9pbl9kZXYoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKIAkJCSAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCiB7CiAJaW50IHJldGNvZGU7CiAKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5maWxlbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+Y3R4bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dm1hbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFwbGlzdCk7CisKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5jb3VudF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5kcndfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+dGFza2xldF9sb2NrKTsKQEAgLTY3LDYgKzcyLDggQEAKIAltdXRleF9pbml0KCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZGV2LT5jdHhsaXN0X211dGV4KTsKIAorCWlkcl9pbml0KCZkZXYtPmRyd19pZHIpOworCiAJZGV2LT5wZGV2ID0gcGRldjsKIAlkZXYtPnBjaV9kZXZpY2UgPSBwZGV2LT5kZXZpY2U7CiAJZGV2LT5wY2lfdmVuZG9yID0gcGRldi0+dmVuZG9yOwpAQCAtNzYsMTIgKzgzLDcgQEAKICNlbmRpZgogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCi0JZGV2LT5tYXBsaXN0ID0gZHJtX2NhbGxvYygxLCBzaXplb2YoKmRldi0+bWFwbGlzdCksIERSTV9NRU1fTUFQUyk7Ci0JaWYgKGRldi0+bWFwbGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5tYXBsaXN0LT5oZWFkKTsKIAlpZiAoZHJtX2h0X2NyZWF0ZSgmZGV2LT5tYXBfaGFzaCwgMTIpKSB7Ci0JCWRybV9mcmVlKGRldi0+bWFwbGlzdCwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE0Myw5ICsxNDUsOSBAQAogICogY3JlYXRlIHRoZSBwcm9jIGluaXQgZW50cnkgdmlhIHByb2NfaW5pdCgpLiBUaGlzIHJvdXRpbmVzIGFzc2lnbnMKICAqIG1pbm9yIG51bWJlcnMgdG8gc2Vjb25kYXJ5IGhlYWRzIG9mIG11bHRpLWhlYWRlZCBjYXJkcwogICovCi1zdGF0aWMgaW50IGRybV9nZXRfaGVhZChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9oZWFkX3QgKiBoZWFkKQorc3RhdGljIGludCBkcm1fZ2V0X2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1faGVhZCAqIGhlYWQpCiB7Ci0JZHJtX2hlYWRfdCAqKmhlYWRzID0gZHJtX2hlYWRzOworCXN0cnVjdCBkcm1faGVhZCAqKmhlYWRzID0gZHJtX2hlYWRzOwogCWludCByZXQ7CiAJaW50IG1pbm9yOwogCkBAIC0xNTQsNyArMTU2LDcgQEAKIAlmb3IgKG1pbm9yID0gMDsgbWlub3IgPCBkcm1fY2FyZHNfbGltaXQ7IG1pbm9yKyssIGhlYWRzKyspIHsKIAkJaWYgKCEqaGVhZHMpIHsKIAotCQkJKmhlYWQgPSAoZHJtX2hlYWRfdCkgeworCQkJKmhlYWQgPSAoc3RydWN0IGRybV9oZWFkKSB7CiAJCQkuZGV2ID0gZGV2LC5kZXZpY2UgPQogCQkJCSAgICBNS0RFVihEUk1fTUFKT1IsIG1pbm9yKSwubWlub3IgPSBtaW5vcix9OwogCkBAIC0xODQsNyArMTg2LDcgQEAKICAgICAgIGVycl9nMjoKIAlkcm1fcHJvY19jbGVhbnVwKG1pbm9yLCBkcm1fcHJvY19yb290LCBoZWFkLT5kZXZfcm9vdCk7CiAgICAgICBlcnJfZzE6Ci0JKmhlYWQgPSAoZHJtX2hlYWRfdCkgeworCSpoZWFkID0gKHN0cnVjdCBkcm1faGVhZCkgewogCS5kZXYgPSBOVUxMfTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjAzLDcgKzIwNSw3IEBACiBpbnQgZHJtX2dldF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCXN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCiB7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlpbnQgcmV0OwogCiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtMjQ2LDcgKzI0OCw3IEBACiAgKiAiZHJtIiBkYXRhLCBvdGhlcndpc2UgdW5yZWdpc3RlcnMgdGhlICJkcm0iIGRhdGEsIGZyZWVzIHRoZSBkZXYgbGlzdCBhbmQKICAqIHVucmVnaXN0ZXJzIHRoZSBjaGFyYWN0ZXIgZGV2aWNlLgogICovCi1pbnQgZHJtX3B1dF9kZXYoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9wdXRfZGV2KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCURSTV9ERUJVRygicmVsZWFzZSBwcmltYXJ5ICVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKTsKIApAQCAtMjc0LDcgKzI3Niw3IEBACiAgKiBsYXN0IG1pbm9yIHJlbGVhc2VkLgogICoKICAqLwotaW50IGRybV9wdXRfaGVhZChkcm1faGVhZF90ICogaGVhZCkKK2ludCBkcm1fcHV0X2hlYWQoc3RydWN0IGRybV9oZWFkICogaGVhZCkKIHsKIAlpbnQgbWlub3IgPSBoZWFkLT5taW5vcjsKIApAQCAtMjgzLDcgKzI4NSw3IEBACiAJZHJtX3Byb2NfY2xlYW51cChtaW5vciwgZHJtX3Byb2Nfcm9vdCwgaGVhZC0+ZGV2X3Jvb3QpOwogCWRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKGhlYWQtPmRldl9jbGFzcyk7CiAKLQkqaGVhZCA9IChkcm1faGVhZF90KSB7LmRldiA9IE5VTEx9OworCSpoZWFkID0gKHN0cnVjdCBkcm1faGVhZCkgey5kZXYgPSBOVUxMfTsKIAogCWRybV9oZWFkc1ttaW5vcl0gPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYwppbmRleCBjYzhlMmViLi5jZjQzNDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogc3RhdGljIHNzaXplX3Qgc2hvd19kcmkoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCiB7Ci0JZHJtX2RldmljZV90ICogZGV2ID0gKChkcm1faGVhZF90ICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKSktPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiA9ICgoc3RydWN0IGRybV9oZWFkICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKSktPmRldjsKIAlpZiAoZGV2LT5kcml2ZXItPmRyaV9saWJyYXJ5X25hbWUpCiAJCXJldHVybiBkZXYtPmRyaXZlci0+ZHJpX2xpYnJhcnlfbmFtZShkZXYsIGJ1Zik7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgKiBOb3RlOiB0aGUgc3RydWN0IGNsYXNzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4KICAqIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG8gZHJtX3N5c2ZzX2NyZWF0ZSgpLgogICovCi1zdHJ1Y3QgY2xhc3NfZGV2aWNlICpkcm1fc3lzZnNfZGV2aWNlX2FkZChzdHJ1Y3QgY2xhc3MgKmNzLCBkcm1faGVhZF90ICpoZWFkKQorc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzICpjcywgc3RydWN0IGRybV9oZWFkICpoZWFkKQogewogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlpbnQgaSwgaiwgZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKaW5kZXggYjVjNWI5Zi4uNjhlMzZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCkBAIC03OSwxMSArNzksMTEgQEAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbWFwX3QgKm1hcCA9IE5VTEw7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2g7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CiAKIAkvKgogCSAqIEZpbmQgdGhlIHJpZ2h0IG1hcApAQCAtOTcsNyArOTcsNyBAQAogCWlmIChkcm1faHRfZmluZF9pdGVtKCZkZXYtPm1hcF9oYXNoLCB2bWEtPnZtX3Bnb2ZmLCAmaGFzaCkpCiAJCWdvdG8gdm1fbm9wYWdlX2Vycm9yOwogCi0Jcl9saXN0ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgZHJtX21hcF9saXN0X3QsIGhhc2gpOworCXJfbGlzdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFwX2xpc3QsIGhhc2gpOwogCW1hcCA9IHJfbGlzdC0+bWFwOwogCiAJaWYgKG1hcCAmJiBtYXAtPnR5cGUgPT0gX0RSTV9BR1ApIHsKQEAgLTExNiw3ICsxMTYsNyBAQAogCQkvKgogCQkgKiBJdCdzIEFHUCBtZW1vcnkgLSBmaW5kIHRoZSByZWFsIHBoeXNpY2FsIHBhZ2UgdG8gbWFwCiAJCSAqLwotCQlmb3IgKGFncG1lbSA9IGRldi0+YWdwLT5tZW1vcnk7IGFncG1lbTsgYWdwbWVtID0gYWdwbWVtLT5uZXh0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYWdwbWVtLCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQkJaWYgKGFncG1lbS0+Ym91bmQgPD0gYmFkZHIgJiYKIAkJCSAgICBhZ3BtZW0tPmJvdW5kICsgYWdwbWVtLT5wYWdlcyAqIFBBR0VfU0laRSA+IGJhZGRyKQogCQkJCWJyZWFrOwpAQCAtMTYzLDcgKzE2Myw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX3NobV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCWRybV9tYXBfdCAqbWFwID0gKGRybV9tYXBfdCAqKSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gKHN0cnVjdCBkcm1fbWFwICopIHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgaTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTE5NCwxMiArMTk0LDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIGRybV92bV9zaG1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV92bWFfZW50cnlfdCAqcHQsICpwcmV2LCAqbmV4dDsKLQlkcm1fbWFwX3QgKm1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqcHQsICp0ZW1wOworCXN0cnVjdCBkcm1fbWFwICptYXA7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCWludCBmb3VuZF9tYXBzID0gMDsKIAogCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLApAQCAtMjA5LDMwICsyMDgsMjIgQEAKIAltYXAgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlmb3IgKHB0ID0gZGV2LT52bWFsaXN0LCBwcmV2ID0gTlVMTDsgcHQ7IHB0ID0gbmV4dCkgewotCQluZXh0ID0gcHQtPm5leHQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCB0ZW1wLCAmZGV2LT52bWFsaXN0LCBoZWFkKSB7CiAJCWlmIChwdC0+dm1hLT52bV9wcml2YXRlX2RhdGEgPT0gbWFwKQogCQkJZm91bmRfbWFwcysrOwogCQlpZiAocHQtPnZtYSA9PSB2bWEpIHsKLQkJCWlmIChwcmV2KSB7Ci0JCQkJcHJldi0+bmV4dCA9IHB0LT5uZXh0OwotCQkJfSBlbHNlIHsKLQkJCQlkZXYtPnZtYWxpc3QgPSBwdC0+bmV4dDsKLQkJCX0KKwkJCWxpc3RfZGVsKCZwdC0+aGVhZCk7CiAJCQlkcm1fZnJlZShwdCwgc2l6ZW9mKCpwdCksIERSTV9NRU1fVk1BUyk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2ID0gcHQ7CiAJCX0KIAl9CisKIAkvKiBXZSB3ZXJlIHRoZSBvbmx5IG1hcCB0aGF0IHdhcyBmb3VuZCAqLwogCWlmIChmb3VuZF9tYXBzID09IDEgJiYgbWFwLT5mbGFncyAmIF9EUk1fUkVNT1ZBQkxFKSB7CiAJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1hcGxpc3QsIGlmIHdlIGFyZSBub3QsIHRoZW4KIAkJICogd2UgZGVsZXRlIHRoaXMgbWFwcGluZ3MgaW5mb3JtYXRpb24uCiAJCSAqLwogCQlmb3VuZF9tYXBzID0gMDsKLQkJbGlzdCA9ICZkZXYtPm1hcGxpc3QtPmhlYWQ7Ci0JCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCQlpZiAocl9saXN0LT5tYXAgPT0gbWFwKQogCQkJCWZvdW5kX21hcHMrKzsKIAkJfQpAQCAtMjgzLDkgKzI3NCw5IEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX2RtYV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBwYWdlX25yOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMzE5LDEwICszMTAsMTAgQEAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fc2dfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCWRybV9tYXBfdCAqbWFwID0gKGRybV9tYXBfdCAqKSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IChzdHJ1Y3QgZHJtX21hcCAqKSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeSA9IGRldi0+c2c7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBtYXBfb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgcGFnZV9vZmZzZXQ7CkBAIC00MTQsOSArNDA1LDkgQEAKICAqLwogc3RhdGljIHZvaWQgZHJtX3ZtX29wZW5fbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fdm1hX2VudHJ5X3QgKnZtYV9lbnRyeTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICp2bWFfZW50cnk7CiAKIAlEUk1fREVCVUcoIjB4JTA4bHgsMHglMDhseFxuIiwKIAkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOwpAQCAtNDI1LDE2ICs0MTYsMTUgQEAKIAl2bWFfZW50cnkgPSBkcm1fYWxsb2Moc2l6ZW9mKCp2bWFfZW50cnkpLCBEUk1fTUVNX1ZNQVMpOwogCWlmICh2bWFfZW50cnkpIHsKIAkJdm1hX2VudHJ5LT52bWEgPSB2bWE7Ci0JCXZtYV9lbnRyeS0+bmV4dCA9IGRldi0+dm1hbGlzdDsKIAkJdm1hX2VudHJ5LT5waWQgPSBjdXJyZW50LT5waWQ7Ci0JCWRldi0+dm1hbGlzdCA9IHZtYV9lbnRyeTsKKwkJbGlzdF9hZGQoJnZtYV9lbnRyeS0+aGVhZCwgJmRldi0+dm1hbGlzdCk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBkcm1fdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlkcm1fdm1fb3Blbl9sb2NrZWQodm1hKTsKQEAgLTQ1MSwyMiArNDQxLDE4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRybV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3ZtYV9lbnRyeV90ICpwdCwgKnByZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqcHQsICp0ZW1wOwogCiAJRFJNX0RFQlVHKCIweCUwOGx4LDB4JTA4bHhcbiIsCiAJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKIAlhdG9taWNfZGVjKCZkZXYtPnZtYV9jb3VudCk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZm9yIChwdCA9IGRldi0+dm1hbGlzdCwgcHJldiA9IE5VTEw7IHB0OyBwcmV2ID0gcHQsIHB0ID0gcHQtPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHQsIHRlbXAsICZkZXYtPnZtYWxpc3QsIGhlYWQpIHsKIAkJaWYgKHB0LT52bWEgPT0gdm1hKSB7Ci0JCQlpZiAocHJldikgewotCQkJCXByZXYtPm5leHQgPSBwdC0+bmV4dDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2LT52bWFsaXN0ID0gcHQtPm5leHQ7Ci0JCQl9CisJCQlsaXN0X2RlbCgmcHQtPmhlYWQpOwogCQkJZHJtX2ZyZWUocHQsIHNpemVvZigqcHQpLCBEUk1fTUVNX1ZNQVMpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ4Niw5ICs0NzIsOSBAQAogICovCiBzdGF0aWMgaW50IGRybV9tbWFwX2RtYShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWE7CiAJdW5zaWduZWQgbG9uZyBsZW5ndGggPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CiAKIAlkZXYgPSBwcml2LT5oZWFkLT5kZXY7CkBAIC01MjYsNyArNTEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfbWFwX29mcyhkcm1fbWFwX3QgKiBtYXApCit1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKHN0cnVjdCBkcm1fbWFwICogbWFwKQogewogCXJldHVybiBtYXAtPm9mZnNldDsKIH0KQEAgLTU1OSwxMSArNTQ1LDExIEBACiAgKi8KIHN0YXRpYyBpbnQgZHJtX21tYXBfbG9ja2VkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9tYXBfdCAqbWFwID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0JZHJtX2hhc2hfaXRlbV90ICpoYXNoOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOwogCiAJRFJNX0RFQlVHKCJzdGFydCA9IDB4JWx4LCBlbmQgPSAweCVseCwgcGFnZSBvZmZzZXQgPSAweCVseFxuIiwKIAkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgdm1hLT52bV9wZ29mZik7CkBAIC01ODgsNyArNTc0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWFwID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgZHJtX21hcF9saXN0X3QsIGhhc2gpLT5tYXA7CisJbWFwID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IGRybV9tYXBfbGlzdCwgaGFzaCktPm1hcDsKIAlpZiAoIW1hcCB8fCAoKG1hcC0+ZmxhZ3MgJiBfRFJNX1JFU1RSSUNURUQpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSkKIAkJcmV0dXJuIC1FUEVSTTsKIApAQCAtNjc3LDggKzY2Myw4IEBACiAKIGludCBkcm1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCmluZGV4IDYwM2QxN2YuLmNiNDQ5OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKQEAgLTQ1LDE2ICs0NSwxNiBAQAogI2RlZmluZSBJODEwX0JVRl9VTk1BUFBFRCAwCiAjZGVmaW5lIEk4MTBfQlVGX01BUFBFRCAgIDEKIAotc3RhdGljIGRybV9idWZfdCAqaTgxMF9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHN0cnVjdCBkcm1fYnVmICppODEwX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCWludCB1c2VkOwogCiAJLyogTGluZWFyIHNlYXJjaCBtaWdodCBub3QgYmUgdGhlIGJlc3Qgc29sdXRpb24gKi8KIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJCS8qIEluIHVzZSBpcyBhbHJlYWR5IGEgcG9pbnRlciAqLwogCQl1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9GUkVFLApAQCAtNzAsNyArNzAsNyBAQAogICogeWV0LCB0aGUgaGFyZHdhcmUgdXBkYXRlcyBpbiB1c2UgZm9yIHVzIG9uY2UgaXRzIG9uIHRoZSByaW5nIGJ1ZmZlci4KICAqLwogCi1zdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIGludCBpODEwX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWludCB1c2VkOwpAQCAtODcsMTAgKzg3LDEwIEBACiAKIHN0YXRpYyBpbnQgaTgxMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdjsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCiAJbG9ja19rZXJuZWwoKTsKQEAgLTEyMCwxMCArMTIwLDEwIEBACiAJLmZhc3luYyA9IGRybV9mYXN5bmMsCiB9OwogCi1zdGF0aWMgaW50IGk4MTBfbWFwX2J1ZmZlcihkcm1fYnVmX3QgKiBidWYsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBpODEwX21hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF91bm1hcF9idWZmZXIoZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIGludCBpODEwX3VubWFwX2J1ZmZlcihzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldGNvZGUgPSAwOwpAQCAtMTcyLDEwICsxNzIsMTAgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODEwX2RtYV9nZXRfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2k4MTBfZG1hX3QgKiBkLAorc3RhdGljIGludCBpODEwX2RtYV9nZXRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1faTgxMF9kbWFfdCAqIGQsCiAJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlpbnQgcmV0Y29kZSA9IDA7CiAKQEAgLTIwMiw5ICsyMDIsOSBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODEwX2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKIAkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCkBAIC0yMzMsNyArMjMzLDcgQEAKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CiAKIAkJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQkJaWYgKGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCAmJiBidWYtPnRvdGFsKQpAQCAtMjQzLDcgKzI0Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbikKK3N0YXRpYyBpbnQgaTgxMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTI3Niw3ICsyNzYsNyBAQAogCXJldHVybiBpdGVyczsKIH0KIAotc3RhdGljIHZvaWQgaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yODgsOSArMjg4LDkgQEAKIAkJcmluZy0+c3BhY2UgKz0gcmluZy0+U2l6ZTsKIH0KIAotc3RhdGljIGludCBpODEwX2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1faTgxMF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1faTgxMF9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBteV9pZHggPSAyNDsKIAl1MzIgKmh3X3N0YXR1cyA9ICh1MzIgKikgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSArIG15X2lkeCk7CiAJaW50IGk7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWJ1Zl9wcml2LT5pbl91c2UgPSBod19zdGF0dXMrKzsKQEAgLTMyMywxNiArMzIzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IGk4MTBfZG1hX2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICAgICAgZHJtX2k4MTBfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkgICAgICAgZHJtX2k4MTBfaW5pdF90ICogaW5pdCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pODEwX3ByaXZhdGVfdCkpOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAocl9saXN0LT5tYXAgJiYKIAkJICAgIHJfbGlzdC0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCiAJCSAgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0spIHsKQEAgLTQ3OCw4ICs0NzYsOCBAQAogc3RhdGljIGludCBpODEwX2RtYV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlkcm1faTgxMF9pbml0X3QgaW5pdDsKIAlpbnQgcmV0Y29kZSA9IDA7CkBAIC01MzYsNyArNTM0LDcgQEAKICAqIFVzZSAndm9sYXRpbGUnICYgbG9jYWwgdmFyIHRtcCB0byBmb3JjZSB0aGUgZW1pdHRlZCB2YWx1ZXMgdG8gYmUKICAqIGlkZW50aWNhbCB0byB0aGUgdmVyaWZpZWQgb25lcy4KICAqLwotc3RhdGljIHZvaWQgaTgxMEVtaXRDb250ZXh0VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgxMEVtaXRDb250ZXh0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU2OSw3ICs1NjcsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODEwRW1pdFRleFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgxMEVtaXRUZXhWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpLCBqID0gMDsKQEAgLTYwMiw3ICs2MDAsNyBAQAogCiAvKiBOZWVkIHRvIGRvIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZyB3aGVuIHNldHRpbmcgdGhlIGRlc3QgYnVmZmVyLgogICovCi1zdGF0aWMgdm9pZCBpODEwRW1pdERlc3RWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCBpODEwRW1pdERlc3RWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjM3LDcgKzYzNSw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBFbWl0U3RhdGUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMEVtaXRTdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CkBAIC02NjgsMTQgKzY2NiwxNCBAQAogCiAvKiBuZWVkIHRvIHZlcmlmeQogICovCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9jbGVhcihkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBmbGFncywKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgZmxhZ3MsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl9jb2xvciwKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX3p2YWwpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKIAlpbnQgY3BwID0gMjsKIAlpbnQgaTsKQEAgLTc0MywxMiArNzQxLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9zd2FwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKIAlpbnQgY3BwID0gMjsKIAlpbnQgaTsKQEAgLTc4OSwxMyArNzg3LDEzIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgZHJtX2J1Zl90ICogYnVmLCBpbnQgZGlzY2FyZCwgaW50IHVzZWQpCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2NsaXBfcmVjdF90ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YnVzX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHJlc3MgLSBkZXYtPmFncC0+YmFzZTsKQEAgLTg2OSw3ICs4NjcsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKQEAgLTkxNiw3ICs5MTQsNyBAQAogCiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC05MzUsMTAgKzkzMywxMCBAQAogCWk4MTBfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgpOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZmx1c2hfcXVldWUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODEwX2ZsdXNoX3F1ZXVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGksIHJldCA9IDA7CiAJUklOR19MT0NBTFM7CiAKQEAgLTk1NCw3ICs5NTIsNyBAQAogCWk4MTBfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgpOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpbnQgdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfSEFSRFdBUkUsCkBAIC05NzAsOSArOTY4LDkgQEAKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkICovCi1zdGF0aWMgdm9pZCBpODEwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAKIAlpZiAoIWRtYSkKQEAgLTk4NSw3ICs5ODMsNyBAQAogCWk4MTBfZmx1c2hfcXVldWUoZGV2KTsKIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJaWYgKGJ1Zi0+ZmlscCA9PSBmaWxwICYmIGJ1Zl9wcml2KSB7CkBAIC0xMDAzLDggKzEwMDEsOCBAQAogc3RhdGljIGludCBpODEwX2ZsdXNoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIApAQCAtMTAxNSw5ICsxMDEzLDkgQEAKIHN0YXRpYyBpbnQgaTgxMF9kbWFfdmVydGV4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCkBAIC0xMDUxLDggKzEwNDksOCBAQAogc3RhdGljIGludCBpODEwX2NsZWFyX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX2NsZWFyX3QgY2xlYXI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIKQEAgLTEwNzQsOCArMTA3Miw4IEBACiBzdGF0aWMgaW50IGk4MTBfc3dhcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJRFJNX0RFQlVHKCJpODEwX3N3YXBfYnVmc1xuIik7CiAKQEAgLTEwODgsOCArMTA4Niw4IEBACiBzdGF0aWMgaW50IGk4MTBfZ2V0YWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQpAQCAtMTEwMiw4ICsxMTAwLDggQEAKIHN0YXRpYyBpbnQgaTgxMF9nZXRidWYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWludCByZXRjb2RlID0gMDsKIAlkcm1faTgxMF9kbWFfdCBkOwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMTIzLDcgKzExMjEsNyBAQAogCURSTV9ERUJVRygiaTgxMF9kbWE6ICVkIHJldHVybmluZyAlZCwgZ3JhbnRlZCA9ICVkXG4iLAogCQkgIGN1cnJlbnQtPnBpZCwgcmV0Y29kZSwgZC5ncmFudGVkKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9kbWFfdCBfX3VzZXIgKikgYXJnLCAmZCwgc2l6ZW9mKGQpKSkKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZkLCBzaXplb2YoZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludClod19zdGF0dXNbNV07CiAKQEAgLTExNDQsNyArMTE0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX21jKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmLCBpbnQgdXNlZCwKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX21jKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IHVzZWQsCiAJCQkJIHVuc2lnbmVkIGludCBsYXN0X3JlbmRlcikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEyMDcsOSArMTIwNSw5IEBACiBzdGF0aWMgaW50IGk4MTBfZG1hX21jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCkBAIC0xMjM4LDggKzEyMzYsOCBAQAogc3RhdGljIGludCBpODEwX3JzdGF0dXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlyZXR1cm4gKGludCkoKCh1MzIgKikgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkpWzRdKTsKQEAgLTEyNDgsOCArMTI0Niw4IEBACiBzdGF0aWMgaW50IGk4MTBfb3YwX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX292ZXJsYXlfdCBkYXRhOwogCkBAIC0xMjY0LDggKzEyNjIsOCBAQAogc3RhdGljIGludCBpODEwX2ZzdGF0dXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKQEAgLTEyNzYsOCArMTI3NCw4IEBACiBzdGF0aWMgaW50IGk4MTBfb3YwX2ZsaXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CkBAIC0xMjkwLDcgKzEyODgsNyBAQAogCiAvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgogICovCi1zdGF0aWMgdm9pZCBpODEwX2RvX2luaXRfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9kb19pbml0X3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMzAwLDcgKzEyOTgsNyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZG9fY2xlYW51cF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MTBfZG9fY2xlYW51cF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTMxNSw4ICsxMzEzLDggQEAKIHN0YXRpYyBpbnQgaTgxMF9mbGlwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTMzMCw3ICsxMzI4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk4MTBfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbnQgaTgxMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCS8qIGk4MTAgaGFzIDQgbW9yZSBjb3VudGVycyAqLwogCWRldi0+Y291bnRlcnMgKz0gNDsKQEAgLTEzNDIsMTIgKzEzNDAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaTgxMF9kbWFfY2xlYW51cChkZXYpOwogfQogCi12b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTM1NywxMiArMTM1NSwxMiBAQAogCX0KIH0KIAotdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWk4MTBfcmVjbGFpbV9idWZmZXJzKGRldiwgZmlscCk7CiB9CiAKLWludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWk4MTBfZG1hX3F1aWVzY2VudChkZXYpOwogCXJldHVybiAwOwpAQCAtMTM5OSw3ICsxMzk3LDcgQEAKICAqIFxyZXR1cm5zCiAgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk4MTAgaXMgQUdQLgogICovCi1pbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaAppbmRleCAyZGViOTI1Li42MTQ5NzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCkBAIC0xNTgsNyArMTU4LDcgQEAKIAl1bnNpZ25lZCBpbnQgZGlydHk7CiAKIAl1bnNpZ25lZCBpbnQgbmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbSTgxMF9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW0k4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAogCS8qIE1haW50YWluIGFuIExSVSBvZiBjb250aWd1b3VzIHJlZ2lvbnMgb2YgdGV4dHVyZSBzcGFjZS4gIElmCiAJICogeW91IHRoaW5rIHlvdSBvd24gYSByZWdpb24gb2YgdGV4dHVyZSBtZW1vcnksIGFuZCBpdCBoYXMgYW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaAppbmRleCBlNmRmNDlmLi42NDg4MzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCkBAIC03Nyw4ICs3Nyw4IEBACiB9IGRybV9pODEwX3JpbmdfYnVmZmVyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9pODEwX3ByaXZhdGUgewotCWRybV9tYXBfdCAqc2FyZWFfbWFwOwotCWRybV9tYXBfdCAqbW1pb19tYXA7CisJc3RydWN0IGRybV9tYXAgKnNhcmVhX21hcDsKKwlzdHJ1Y3QgZHJtX21hcCAqbW1pb19tYXA7CiAKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2OwogCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgcmluZzsKQEAgLTg4LDcgKzg4LDcgQEAKIAogCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOwogCi0JZHJtX2J1Zl90ICptbWFwX2J1ZmZlcjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqbW1hcF9idWZmZXI7CiAKIAl1MzIgZnJvbnRfZGkxLCBiYWNrX2RpMSwgemkxOwogCkBAIC0xMTUsMTUgKzExNSwxNSBAQAogfSBkcm1faTgxMF9wcml2YXRlX3Q7CiAKIAkJCQkvKiBpODEwX2RtYS5jICovCi1leHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IGk4MTBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiBpbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTgxMF9pb2N0bHNbXTsKIGV4dGVybiBpbnQgaTgxMF9tYXhfaW9jdGw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKaW5kZXggMzMxNGE5Zi4uZGMyMGMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwpAQCAtNDcsMTYgKzQ3LDE2IEBACiAjZGVmaW5lIEk4MzBfQlVGX1VOTUFQUEVEIDAKICNkZWZpbmUgSTgzMF9CVUZfTUFQUEVEICAgMQogCi1zdGF0aWMgZHJtX2J1Zl90ICppODMwX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgc3RydWN0IGRybV9idWYgKmk4MzBfZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAJaW50IHVzZWQ7CiAKIAkvKiBMaW5lYXIgc2VhcmNoIG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCBzb2x1dGlvbiAqLwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJLyogSW4gdXNlIGlzIGFscmVhZHkgYSBwb2ludGVyICovCiAJCXVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0ZSRUUsCkBAIC03Miw3ICs3Miw3IEBACiAgKiB5ZXQsIHRoZSBoYXJkd2FyZSB1cGRhdGVzIGluIHVzZSBmb3IgdXMgb25jZSBpdHMgb24gdGhlIHJpbmcgYnVmZmVyLgogICovCiAKLXN0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJaW50IHVzZWQ7CkBAIC04OSwxMCArODksMTAgQEAKIAogc3RhdGljIGludCBpODMwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtMTIyLDEwICsxMjIsMTAgQEAKIAkuZmFzeW5jID0gZHJtX2Zhc3luYywKIH07CiAKLXN0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqIGJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IGk4MzBfbWFwX2J1ZmZlcihzdHJ1Y3QgZHJtX2J1ZiAqIGJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CkBAIC0xNTYsNyArMTU2LDcgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODMwX3VubWFwX2J1ZmZlcihkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgaW50IGk4MzBfdW5tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0Y29kZSA9IDA7CkBAIC0xNzYsMTAgKzE3NiwxMCBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG1hX2dldF9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1faTgzMF9kbWFfdCAqIGQsCitzdGF0aWMgaW50IGk4MzBfZG1hX2dldF9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODMwX2RtYV90ICogZCwKIAkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWludCByZXRjb2RlID0gMDsKIApAQCAtMjA2LDkgKzIwNiw5IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAogCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQkJaWYgKGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCAmJiBidWYtPnRvdGFsKQogCQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZidWZfcHJpdi0+bWFwLCBkZXYpOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpODMwX3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCitpbnQgaTgzMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJcmV0dXJuIGl0ZXJzOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTI5Niw5ICsyOTYsOSBAQAogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9SSU5HX0VNUFRZOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9pODMwX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODMwX3ByaXZhdGVfdCAqIGRldl9wcml2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IG15X2lkeCA9IDM2OwogCXUzMiAqaHdfc3RhdHVzID0gKHUzMiAqKSAoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlICsgbXlfaWR4KTsKIAlpbnQgaTsKQEAgLTMwOSw3ICszMDksNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJYnVmX3ByaXYtPmluX3VzZSA9IGh3X3N0YXR1cysrOwpAQCAtMzMwLDE2ICszMzAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpODMwX2RtYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgICAgICBkcm1faTgzMF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCSAgICAgICBkcm1faTgzMF9pbml0X3QgKiBpbml0KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCiAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k4MzBfcHJpdmF0ZV90KSk7CiAKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChyX2xpc3QtPm1hcCAmJgogCQkgICAgcl9saXN0LT5tYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYKIAkJICAgIHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fQ09OVEFJTlNfTE9DSykgewpAQCAtNDU1LDggKzQ1NCw4IEBACiBzdGF0aWMgaW50IGk4MzBfZG1hX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2OwogCWRybV9pODMwX2luaXRfdCBpbml0OwogCWludCByZXRjb2RlID0gMDsKQEAgLTQ5MCw3ICs0ODksNyBAQAogLyogTW9zdCBlZmZpY2llbnQgd2F5IHRvIHZlcmlmeSBzdGF0ZSBmb3IgdGhlIGk4MzAgaXMgYXMgaXQgaXMKICAqIGVtaXR0ZWQuICBOb24tY29uZm9ybWFudCBzdGF0ZSBpcyBzaWxlbnRseSBkcm9wcGVkLgogICovCi1zdGF0aWMgdm9pZCBpODMwRW1pdENvbnRleHRWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0Q29udGV4dFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGksIGogPSAwOwpAQCAtNTM1LDcgKzUzNCw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGksIGogPSAwOwpAQCAtNTY5LDcgKzU2OCw3IEBACiAJCXByaW50aygicmVqZWN0ZWQgcGFja2V0ICV4XG4iLCBjb2RlWzBdKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhCbGVuZFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgIHVuc2lnbmVkIGludCAqY29kZSwgdW5zaWduZWQgaW50IG51bSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU5NCw3ICs1OTMsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFRleFBhbGV0dGUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhQYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgICAgIHVuc2lnbmVkIGludCAqcGFsZXR0ZSwgaW50IG51bWJlciwgaW50IGlzX3NoYXJlZCkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYyMSw3ICs2MjAsNyBAQAogCiAvKiBOZWVkIHRvIGRvIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZyB3aGVuIHNldHRpbmcgdGhlIGRlc3QgYnVmZmVyLgogICovCi1zdGF0aWMgdm9pZCBpODMwRW1pdERlc3RWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0RGVzdFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaW50IHRtcDsKQEAgLTY4Miw3ICs2ODEsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFN0aXBwbGVWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0U3RpcHBsZVZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC02OTMsNyArNjkyLDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRTdGF0ZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwRW1pdFN0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTc5Niw3ICs3OTUsNyBAQAogICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCBpODMwX2ZpbGxfYm94KGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MzBfZmlsbF9ib3goc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgciwgaW50IGcsIGludCBiKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtODM0LDcgKzgzMyw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfY3BfcGVyZm9ybWFuY2VfYm94ZXMoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9jcF9wZXJmb3JtYW5jZV9ib3hlcyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtODc5LDcgKzg3OCw3IEBACiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9jbGVhcihkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBmbGFncywKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgZmxhZ3MsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl9jb2xvciwKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX3p2YWwsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl9kZXB0aG1hc2spCkBAIC04ODcsNyArODg2LDcgQEAKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOwogCWludCBjcHAgPSBkZXZfcHJpdi0+Y3BwOwogCWludCBpOwpAQCAtOTc0LDEyICs5NzMsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOwogCWludCBjcHAgPSBkZXZfcHJpdi0+Y3BwOwogCWludCBpOwpAQCAtMTA0NCw3ICsxMDQzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTEwODcsMTMgKzEwODYsMTMgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgIGRybV9idWZfdCAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgc3RydWN0IGRybV9idWYgKiBidWYsIGludCBkaXNjYXJkLCBpbnQgdXNlZCkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylidWYtPmJ1c19hZGRyZXNzOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyZXNzIC0gZGV2LT5hZ3AtPmJhc2U7CkBAIC0xMTk5LDcgKzExOTgsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTEyMTYsMTAgKzEyMTUsMTAgQEAKIAlpODMwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4LCBfX0ZVTkNUSU9OX18pOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODMwX2ZsdXNoX3F1ZXVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGksIHJldCA9IDA7CiAJUklOR19MT0NBTFM7CiAKQEAgLTEyMzMsNyArMTIzMiw3IEBACiAJaTgzMF93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0hBUkRXQVJFLApAQCAtMTI0OSw5ICsxMjQ4LDkgQEAKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkICovCi1zdGF0aWMgdm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgaTgzMF9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAKIAlpZiAoIWRtYSkKQEAgLTEyNjQsNyArMTI2Myw3IEBACiAJaTgzMF9mbHVzaF9xdWV1ZShkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpZiAoYnVmLT5maWxwID09IGZpbHAgJiYgYnVmX3ByaXYpIHsKQEAgLTEyODIsOCArMTI4MSw4IEBACiBzdGF0aWMgaW50IGk4MzBfZmx1c2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCkBAIC0xMjk0LDkgKzEyOTMsOSBAQAogc3RhdGljIGludCBpODMwX2RtYV92ZXJ0ZXgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODMwX3NhcmVhX3QgKikKQEAgLTEzMjgsOCArMTMyNyw4IEBACiBzdGF0aWMgaW50IGk4MzBfY2xlYXJfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfY2xlYXJfdCBjbGVhcjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcgpAQCAtMTM1Miw4ICsxMzUxLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9zd2FwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAlEUk1fREVCVUcoImk4MzBfc3dhcF9idWZzXG4iKTsKIApAQCAtMTM2NSw3ICsxMzY0LDcgQEAKIAogLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKICAqLwotc3RhdGljIHZvaWQgaTgzMF9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTM3NSw3ICsxMzc0LDcgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKIH0KIAotc3RhdGljIGludCBpODMwX2RvX2NsZWFudXBfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODMwX2RvX2NsZWFudXBfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzOTAsOCArMTM4OSw4IEBACiBzdGF0aWMgaW50IGk4MzBfZmxpcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTE0MDgsOCArMTQwNyw4IEBACiBzdGF0aWMgaW50IGk4MzBfZ2V0YWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MzBfc2FyZWFfdCAqKQpAQCAtMTQyMiw4ICsxNDIxLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9nZXRidWYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWludCByZXRjb2RlID0gMDsKIAlkcm1faTgzMF9kbWFfdCBkOwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNDQ0LDcgKzE0NDMsNyBAQAogCURSTV9ERUJVRygiaTgzMF9kbWE6ICVkIHJldHVybmluZyAlZCwgZ3JhbnRlZCA9ICVkXG4iLAogCQkgIGN1cnJlbnQtPnBpZCwgcmV0Y29kZSwgZC5ncmFudGVkKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9kbWFfdCBfX3VzZXIgKikgYXJnLCAmZCwgc2l6ZW9mKGQpKSkKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZkLCBzaXplb2YoZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludClod19zdGF0dXNbNV07CiAKQEAgLTE0NjcsOCArMTQ2Niw4IEBACiBzdGF0aWMgaW50IGk4MzBfZ2V0cGFyYW0oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9nZXRwYXJhbV90IHBhcmFtOwogCWludCB2YWx1ZTsKQEAgLTE1MDEsOCArMTUwMCw4IEBACiBzdGF0aWMgaW50IGk4MzBfc2V0cGFyYW0oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zZXRwYXJhbV90IHBhcmFtOwogCkBAIC0xNTI2LDcgKzE1MjUsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTgzMF9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCBpODMwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJLyogaTgzMCBoYXMgNCBtb3JlIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyArPSA0OwpAQCAtMTUzOCwxMiArMTUzNywxMiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpODMwX2RtYV9jbGVhbnVwKGRldik7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNTUzLDEyICsxNTUyLDEyIEBACiAJfQogfQogCi12b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaTgzMF9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKIH0KIAotaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaTgzMF9kbWFfcXVpZXNjZW50KGRldik7CiAJcmV0dXJuIDA7CkBAIC0xNTk0LDcgKzE1OTMsNyBAQAogICogXHJldHVybnMKICAqIEEgdmFsdWUgb2YgMSBpcyBhbHdheXMgcmV0dXJlZCB0byBpbmRpY3RhdGUgZXZlcnkgaTh4eCBpcyBBR1AuCiAgKi8KLWludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oCmluZGV4IDY2ZGQ3NTAuLjk2OGE2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXVuc2lnbmVkIGludCBkaXJ0eTsKIAogCXVuc2lnbmVkIGludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tJODMwX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbSTgzMF9OUl9TQVJFQV9DTElQUkVDVFNdOwogCiAJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKIAkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCmluZGV4IGU5MWY5NGEuLmRkZGE2NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKQEAgLTg0LDggKzg0LDggQEAKIH0gZHJtX2k4MzBfcmluZ19idWZmZXJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MzBfcHJpdmF0ZSB7Ci0JZHJtX21hcF90ICpzYXJlYV9tYXA7Ci0JZHJtX21hcF90ICptbWlvX21hcDsKKwlzdHJ1Y3QgZHJtX21hcCAqc2FyZWFfbWFwOworCXN0cnVjdCBkcm1fbWFwICptbWlvX21hcDsKIAogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCByaW5nOwpAQCAtOTUsNyArOTUsNyBAQAogCiAJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CiAKLQlkcm1fYnVmX3QgKm1tYXBfYnVmZmVyOworCXN0cnVjdCBkcm1fYnVmICptbWFwX2J1ZmZlcjsKIAogCXUzMiBmcm9udF9kaTEsIGJhY2tfZGkxLCB6aTE7CiAKQEAgLTEzMiwxNiArMTMyLDE2IEBACiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgaTgzMF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBpbnQgaTgzMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiAjZGVmaW5lIEk4MzBfUkVBRChyZWcpICAgICAgICAgIERSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcpCiAjZGVmaW5lIEk4MzBfV1JJVEUocmVnLHZhbCkgICAgIERSTV9XUklURTMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnLCB2YWwpCkBAIC0xODAsNyArMTgwLDcgQEAKIAlJODMwX1dSSVRFKExQX1JJTkcgKyBSSU5HX1RBSUwsIG91dHJpbmcpOwkJCVwKIH0gd2hpbGUoMCkKIAotZXh0ZXJuIGludCBpODMwX3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOworZXh0ZXJuIGludCBpODMwX3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CiAKICNkZWZpbmUgR0ZYX09QX1VTRVJfSU5URVJSVVBUIAkJKCgwPDwyOSl8KDI8PDIzKSkKICNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKaW5kZXggNTg0MWY3Ni4uYTFiNWM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwpAQCAtMzUsNyArMzUsNyBAQAogCiBpcnFyZXR1cm5fdCBpODMwX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiB0ZW1wOwogCkBAIC01Myw3ICs1Myw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODMwX2VtaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNzAsNyArNzAsNyBAQAogCXJldHVybiBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPmlycV9lbWl0dGVkKTsKIH0KIAotc3RhdGljIGludCBpODMwX3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgaTgzMF93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGlycV9ucikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKQEAgLTExNyw4ICsxMTcsOCBAQAogaW50IGk4MzBfaXJxX2VtaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9pcnFfZW1pdF90IGVtaXQ7CiAJaW50IHJlc3VsdDsKQEAgLTE0OSw4ICsxNDksOCBAQAogaW50IGk4MzBfaXJxX3dhaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9pcnFfd2FpdF90IGlycXdhaXQ7CiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAvKiBkcm1fZG1hLmggaG9va3MKICovCi12b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTgwLDE0ICsxODAsMTQgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCUk4MzBfV1JJVEUxNihJODMwUkVHX0lOVF9FTkFCTEVfUiwgMHgyKTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWlmICghZGV2X3ByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKaW5kZXggZWE1Mjc0MGEuLjMzNTljYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIHRoZSBoZWFkIHBvaW50ZXIgY2hhbmdlcywgc28gdGhhdCBFQlVTWSBvbmx5IGhhcHBlbnMgaWYgdGhlIHJpbmcKICAqIGFjdHVhbGx5IHN0YWxscyBmb3IgKGVnKSAzIHNlY29uZHMuCiAgKi8KLWludCBpOTE1X3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCitpbnQgaTkxNV93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k5MTVfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtNzMsNyArNzMsNyBAQAogCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKIH0KIAotdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k5MTVfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtODgsNyArODgsNyBAQAogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9SSU5HX0VNUFRZOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAogCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKQEAgLTEyNiwxMyArMTI2LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTkxNV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgZHJtX2k5MTVfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkgICBkcm1faTkxNV9pbml0X3QgKiBpbml0KQogewogCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCkpOwogCi0JRFJNX0dFVFNBUkVBKCk7CisJZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2RtYV9yZXN1bWUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2RtYV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMzU3LDcgKzM1Nyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpOTE1X2VtaXRfY21kcyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBfX3VzZXIgKiBidWZmZXIsIGludCBkd29yZHMpCitzdGF0aWMgaW50IGk5MTVfZW1pdF9jbWRzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgX191c2VyICogYnVmZmVyLCBpbnQgZHdvcmRzKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwpAQCAtMzk2LDEyICszOTYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2VtaXRfYm94KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCSBkcm1fY2xpcF9yZWN0X3QgX191c2VyICogYm94ZXMsCitzdGF0aWMgaW50IGk5MTVfZW1pdF9ib3goc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICogYm94ZXMsCiAJCQkgaW50IGksIGludCBEUjEsIGludCBEUjQpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2NsaXBfcmVjdF90IGJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3g7CiAJUklOR19MT0NBTFM7CiAKIAlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmYm94ZXNbaV0sIHNpemVvZihib3gpKSkgewpAQCAtNDM5LDcgKzQzOSw3IEBACiAgKiBlbWl0LiBGb3Igbm93LCBkbyBpdCBpbiBib3RoIHBsYWNlczoKICAqLwogCi1zdGF0aWMgdm9pZCBpOTE1X2VtaXRfYnJlYWRjcnVtYihkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyB2b2lkIGk5MTVfZW1pdF9icmVhZGNydW1iKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC00NTcsNyArNDU3LDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2NtZGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgIGRybV9pOTE1X2NtZGJ1ZmZlcl90ICogY21kKQogewogCWludCBuYm94ID0gY21kLT5udW1fY2xpcHJlY3RzOwpAQCAtNDg5LDExICs0ODksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9iYXRjaGJ1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgIGRybV9pOTE1X2JhdGNoYnVmZmVyX3QgKiBiYXRjaCkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlcyA9IGJhdGNoLT5jbGlwcmVjdHM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpib3hlcyA9IGJhdGNoLT5jbGlwcmVjdHM7CiAJaW50IG5ib3ggPSBiYXRjaC0+bnVtX2NsaXByZWN0czsKIAlpbnQgaSA9IDAsIGNvdW50OwogCVJJTkdfTE9DQUxTOwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNTgzLDcgKzU4Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNjI1LDcgKzYyNSw3IEBACiAKIAlpZiAoYmF0Y2gubnVtX2NsaXByZWN0cyAmJiBEUk1fVkVSSUZZQVJFQV9SRUFEKGJhdGNoLmNsaXByZWN0cywKIAkJCQkJCSAgICAgICBiYXRjaC5udW1fY2xpcHJlY3RzICoKLQkJCQkJCSAgICAgICBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSkpCisJCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSkpCiAJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAKIAlyZXQgPSBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKGRldiwgJmJhdGNoKTsKQEAgLTY1NSw3ICs2NTUsNyBAQAogCWlmIChjbWRidWYubnVtX2NsaXByZWN0cyAmJgogCSAgICBEUk1fVkVSSUZZQVJFQV9SRUFEKGNtZGJ1Zi5jbGlwcmVjdHMsCiAJCQkJY21kYnVmLm51bV9jbGlwcmVjdHMgKgotCQkJCXNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkgeworCQkJCXNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCkpKSB7CiAJCURSTV9FUlJPUigiRmF1bHQgYWNjZXNzaW5nIGNsaXByZWN0c1xuIik7CiAJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAJfQpAQCAtNzkyLDcgKzc5Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpOTE1X2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IGk5MTVfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAkvKiBpOTE1IGhhcyA0IG1vcmUgY291bnRlcnMgKi8KIAlkZXYtPmNvdW50ZXJzICs9IDQ7CkBAIC04MDQsNyArODA0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04MTMsNyArODEzLDcgQEAKIAlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiB9CiAKLXZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04NTQsNyArODU0LDcgQEAKICAqIFxyZXR1cm5zCiAgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk5eDUgaXMgQUdQLgogICovCi1pbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaAppbmRleCA3YjdiNjhiLi4wNWM2NmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCkBAIC02NCw3ICs2NCw3IEBACiB9IGRybV9pOTE1X2luaXRfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X3NhcmVhIHsKLQlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbSTkxNV9OUl9URVhfUkVHSU9OUyArIDFdOworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W0k5MTVfTlJfVEVYX1JFR0lPTlMgKyAxXTsKIAlpbnQgbGFzdF91cGxvYWQ7CS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLwogCWludCBsYXN0X2VucXVldWU7CS8qIGxhc3QgdGltZSBhIGJ1ZmZlciB3YXMgZW5xdWV1ZWQgKi8KIAlpbnQgbGFzdF9kaXNwYXRjaDsJLyogYWdlIG9mIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYnVmZmVyICovCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCiAJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCiAJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KIH0gZHJtX2k5MTVfYmF0Y2hidWZmZXJfdDsKIAogLyogQXMgYWJvdmUsIGJ1dCBwYXNzIGEgcG9pbnRlciB0byB1c2Vyc3BhY2UgYnVmZmVyIHdoaWNoIGNhbiBiZQpAQCAtMTgyLDcgKzE4Miw3IEBACiAJaW50IERSMTsJCS8qIGh3IGZsYWdzIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBEUjQ7CQkvKiB3aW5kb3cgb3JpZ2luIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBudW1fY2xpcHJlY3RzOwkvKiBtdWxpdHBhc3Mgd2l0aCBtdWx0aXBsZSBjbGlwcmVjdHM/ICovCi0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCiB9IGRybV9pOTE1X2NtZGJ1ZmZlcl90OwogCiAvKiBVc2Vyc3BhY2UgY2FuIHJlcXVlc3QgJiB3YWl0IG9uIGlycSdzOgpAQCAtMjU5LDcgKzI1OSw3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ZibGFua19zd2FwIHsKIAlkcm1fZHJhd2FibGVfdCBkcmF3YWJsZTsKLQlkcm1fdmJsYW5rX3NlcV90eXBlX3Qgc2VxdHlwZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgc2VxdHlwZTsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiB9IGRybV9pOTE1X3ZibGFua19zd2FwX3Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAppbmRleCA4NWUzMjNhLi5mZDkxODU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCkBAIC0xMjAsMTEgKzEyMCwxMSBAQAogZXh0ZXJuIGludCBpOTE1X21heF9pb2N0bDsKIAogCQkJCS8qIGk5MTVfZG1hLmMgKi8KLWV4dGVybiB2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIGludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gaW50IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGxvbmcgaTkxNV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKQEAgLTEzMiwxMiArMTMyLDEyIEBACiBleHRlcm4gaW50IGk5MTVfaXJxX2VtaXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KERSTV9JT0NUTF9BUkdTKTsKIAotZXh0ZXJuIGludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7Ci1leHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0Mihkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiBleHRlcm4gaXJxcmV0dXJuX3QgaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBpbnQgaTkxNV92YmxhbmtfcGlwZV9zZXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBpOTE1X3ZibGFua19waXBlX2dldChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3N3YXAoRFJNX0lPQ1RMX0FSR1MpOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiBleHRlcm4gaW50IGk5MTVfbWVtX2luaXRfaGVhcChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfbWVtX2Rlc3Ryb3lfaGVhcChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gdm9pZCBpOTE1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCk7Ci1leHRlcm4gdm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB2b2lkIGk5MTVfbWVtX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICAgIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCk7CiAKICNkZWZpbmUgSTkxNV9SRUFEKHJlZykgICAgICAgICAgRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIChyZWcpKQpAQCAtMTg4LDcgKzE4OCw3IEBACiAJSTkxNV9XUklURShMUF9SSU5HICsgUklOR19UQUlMLCBvdXRyaW5nKTsJCQlcCiB9IHdoaWxlKDApCiAKLWV4dGVybiBpbnQgaTkxNV93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKK2V4dGVybiBpbnQgaTkxNV93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOwogCiAjZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVCAJCSgoMDw8MjkpfCgyPDwyMykpCiAjZGVmaW5lIEdGWF9PUF9CUkVBS1BPSU5UX0lOVEVSUlVQVAkoKDA8PDI5KXwoMTw8MjMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCmluZGV4IGI5MjA2MmEuLjRiNGIyY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIEhXIGxvY2sgaGVsZC4KICAqLwotc3RhdGljIHZvaWQgaTkxNV92YmxhbmtfdGFza2xldChkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyB2b2lkIGk5MTVfdmJsYW5rX3Rhc2tsZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CkBAIC01MCw3ICs1MCw3IEBACiAJaW50IG5oaXRzLCBucmVjdHMsIHNsaWNlWzJdLCB1cHBlclsyXSwgbG93ZXJbMl0sIGk7CiAJdW5zaWduZWQgY291bnRlclsyXSA9IHsgYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKSwKIAkJCQlhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQyKSB9OwotCWRybV9kcmF3YWJsZV9pbmZvX3QgKmRydzsKKwlzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmRydzsKIAlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJdTMyIGNwcCA9IGRldl9wcml2LT5jcHA7CiAJdTMyIGNtZCA9IChjcHAgPT0gNCkgPyAoWFlfU1JDX0NPUFlfQkxUX0NNRCB8CkBAIC05NSw3ICs5NSw3IEBACiAJCWxpc3RfZm9yX2VhY2goaGl0LCAmaGl0cykgewogCQkJZHJtX2k5MTVfdmJsX3N3YXBfdCAqc3dhcF9jbXAgPQogCQkJCWxpc3RfZW50cnkoaGl0LCBkcm1faTkxNV92Ymxfc3dhcF90LCBoZWFkKTsKLQkJCWRybV9kcmF3YWJsZV9pbmZvX3QgKmRyd19jbXAgPQorCQkJc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICpkcndfY21wID0KIAkJCQlkcm1fZ2V0X2RyYXdhYmxlX2luZm8oZGV2LCBzd2FwX2NtcC0+ZHJ3X2lkKTsKIAogCQkJaWYgKGRyd19jbXAgJiYKQEAgLTE2MCw3ICsxNjAsNyBAQAogCQlsaXN0X2Zvcl9lYWNoKGhpdCwgJmhpdHMpIHsKIAkJCWRybV9pOTE1X3ZibF9zd2FwX3QgKnN3YXBfaGl0ID0KIAkJCQlsaXN0X2VudHJ5KGhpdCwgZHJtX2k5MTVfdmJsX3N3YXBfdCwgaGVhZCk7Ci0JCQlkcm1fY2xpcF9yZWN0X3QgKnJlY3Q7CisJCQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcmVjdDsKIAkJCWludCBudW1fcmVjdHMsIHBpcGU7CiAJCQl1bnNpZ25lZCBzaG9ydCB0b3AsIGJvdHRvbTsKIApAQCAtMjExLDcgKzIxMSw3IEBACiAKIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IHRlbXA7CiAKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTI4Myw3ICsyODMsNyBAQAogCXJldHVybiBkZXZfcHJpdi0+Y291bnRlcjsKIH0KIAotc3RhdGljIGludCBpOTE1X3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgaTkxNV93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGlycV9ucikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQgPSAwOwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpOTE1X2RyaXZlcl92YmxhbmtfZG9fd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSwKK3N0YXRpYyBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSwKIAkJCQkgICAgICBhdG9taWNfdCAqY291bnRlcikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMzMSwxMiArMzMxLDEyIEBACiB9CiAKIAotaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJcmV0dXJuIGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsICZkZXYtPnZibF9yZWNlaXZlZCk7CiB9CiAKLWludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJcmV0dXJuIGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsICZkZXYtPnZibF9yZWNlaXZlZDIpOwogfQpAQCAtMzg5LDcgKzM4OSw3IEBACiAJcmV0dXJuIGk5MTVfd2FpdF9pcnEoZGV2LCBpcnF3YWl0LmlycV9zZXEpOwogfQogCi1zdGF0aWMgdm9pZCBpOTE1X2VuYWJsZV9pbnRlcnJ1cHQgKGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV9lbmFibGVfaW50ZXJydXB0IChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IGZsYWc7CkBAIC01NjksNyArNTY5LDcgQEAKIAogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTU3OCw3ICs1NzgsNyBAQAogCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgMHgwKTsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNTkyLDcgKzU5Miw3IEBACiAJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiB0ZW1wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCmluZGV4IDUyYzY3MzIuLjUwYjRiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKQEAgLTQzLDExICs0MywxMSBAQAogICogYmxvY2sgdG8gYWxsb2NhdGUsIGFuZCB0aGUgcmluZyBpcyBkcmFpbmVkIHByaW9yIHRvIGFsbG9jYXRpb25zIC0tCiAgKiBpbiBvdGhlciB3b3JkcyBhbGxvY2F0aW9uIGlzIGV4cGVuc2l2ZS4KICAqLwotc3RhdGljIHZvaWQgbWFya19ibG9jayhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBtZW1fYmxvY2sgKnAsIGludCBpbl91c2UpCitzdGF0aWMgdm9pZCBtYXJrX2Jsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgbWVtX2Jsb2NrICpwLCBpbnQgaW5fdXNlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlkcm1fdGV4X3JlZ2lvbl90ICpsaXN0OworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiAqbGlzdDsKIAl1bnNpZ25lZCBzaGlmdCwgbnI7CiAJdW5zaWduZWQgc3RhcnQ7CiAJdW5zaWduZWQgZW5kOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAKIC8qIEZyZWUgYWxsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2luZyBmaWxlLgogICovCi12b2lkIGk5MTVfbWVtX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApCit2b2lkIGk5MTVfbWVtX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCkKIHsKIAlzdHJ1Y3QgbWVtX2Jsb2NrICpwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCmluZGV4IGMyYTRiYWMuLjljNzNhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCkBAIC00Niw3ICs0Niw3IEBACiAKICNkZWZpbmUgTUlOSU1BTF9DTEVBTlVQIDAKICNkZWZpbmUgRlVMTF9DTEVBTlVQIDEKLXN0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZnVsbF9jbGVhbnVwKTsKK3N0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBmdWxsX2NsZWFudXApOwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBFbmdpbmUgY29udHJvbApAQCAtMjI0LDcgKzIyNCw3IEBACiAjZGVmaW5lIE1HQV9CVUZGRVJfRlJFRQkJMAogCiAjaWYgTUdBX0ZSRUVMSVNUX0RFQlVHCi1zdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcHJpbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3ByaW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9mcmVlbGlzdF90ICplbnRyeTsKQEAgLTI0NSwxMCArMjQ1LDEwIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBtZ2FfZnJlZWxpc3RfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW50IG1nYV9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CiAJaW50IGk7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OwpAQCAtMzExLDEwICszMTEsMTAgQEAKICNpZiAwCiAvKiBGSVhNRTogU3RpbGwgbmVlZGVkPwogICovCi1zdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWludCBpOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgZHJtX2J1Zl90ICptZ2FfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqbWdhX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqbmV4dDsKQEAgLTM1OSw3ICszNTksNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgbWdhX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK2ludCBtZ2FfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtMzkzLDcgKzM5Myw3IEBACiAgKiBETUEgaW5pdGlhbGl6YXRpb24sIGNsZWFudXAKICAqLwogCi1pbnQgbWdhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCBtZ2FfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2OwogCkBAIC00MzQsNyArNDM0LDcgQEAKICAqCiAgKiBcc2EgbWdhX2RvX2RtYV9ib290c3RyYXAsIG1nYV9kb19wY2lfZG1hX2Jvb3RzdHJhcAogICovCi1zdGF0aWMgaW50IG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmNvbnN0IGRldl9wcml2ID0KQEAgLTQ0NSwxMSArNDQ1LDExIEBACiAJY29uc3QgdW5zaWduZWQgc2Vjb25kYXJ5X3NpemUgPSBkbWFfYnMtPnNlY29uZGFyeV9iaW5fY291bnQKIAkgICAgKiBkbWFfYnMtPnNlY29uZGFyeV9iaW5fc2l6ZTsKIAljb25zdCB1bnNpZ25lZCBhZ3Bfc2l6ZSA9IChkbWFfYnMtPmFncF9zaXplIDw8IDIwKTsKLQlkcm1fYnVmX2Rlc2NfdCByZXE7Ci0JZHJtX2FncF9tb2RlX3QgbW9kZTsKLQlkcm1fYWdwX2luZm9fdCBpbmZvOwotCWRybV9hZ3BfYnVmZmVyX3QgYWdwX3JlcTsKLQlkcm1fYWdwX2JpbmRpbmdfdCBiaW5kX3JlcTsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcTsKKwlzdHJ1Y3QgZHJtX2FncF9tb2RlIG1vZGU7CisJc3RydWN0IGRybV9hZ3BfaW5mbyBpbmZvOworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciBhZ3BfcmVxOworCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgYmluZF9yZXE7CiAKIAkvKiBBY3F1aXJlIEFHUC4gKi8KIAllcnIgPSBkcm1fYWdwX2FjcXVpcmUoZGV2KTsKQEAgLTU0OCwxMCArNTQ4LDEwIEBACiAJfQogCiAJewotCQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5OworCQlzdHJ1Y3QgZHJtX21hcF9saXN0ICpfZW50cnk7CiAJCXVuc2lnbmVkIGxvbmcgYWdwX3Rva2VuID0gMDsKIAkJCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCQlpZiAoX2VudHJ5LT5tYXAgPT0gZGV2LT5hZ3BfYnVmZmVyX21hcCkKIAkJCQlhZ3BfdG9rZW4gPSBfZW50cnktPnVzZXJfdG9rZW47CiAJCX0KQEAgLTU4OCw3ICs1ODgsNyBAQAogCXJldHVybiAwOwogfQogI2Vsc2UKLXN0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKIHsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwOSw3ICs2MDksNyBAQAogICoKICAqIFxzYSBtZ2FfZG9fZG1hX2Jvb3RzdHJhcCwgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwCiAgKi8KLXN0YXRpYyBpbnQgbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqY29uc3QgZGV2X3ByaXYgPQpAQCAtNjE4LDcgKzYxOCw3IEBACiAJdW5zaWduZWQgaW50IHByaW1hcnlfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgYmluX2NvdW50OwogCWludCBlcnI7Ci0JZHJtX2J1Zl9kZXNjX3QgcmVxOworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgcmVxOwogCiAJaWYgKGRldi0+ZG1hID09IE5VTEwpIHsKIAkJRFJNX0VSUk9SKCJkZXYtPmRtYSBpcyBOVUxMXG4iKTsKQEAgLTY5OSw3ICs2OTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1nYV9kb19kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgbWdhX2RvX2RtYV9ib290c3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCiB7CiAJY29uc3QgaW50IGlzX2FncCA9IChkbWFfYnMtPmFncF9tb2RlICE9IDApICYmIGRybV9kZXZpY2VfaXNfYWdwKGRldik7CkBAIC03OTMsNyArNzkzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG1nYV9kb19pbml0X2RtYShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tZ2FfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgbWdhX2RvX2luaXRfZG1hKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByZXQ7CkBAIC04MjMsOCArODIzLDcgQEAKIAlkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgPSBpbml0LT50ZXh0dXJlX29mZnNldFswXTsKIAlkZXZfcHJpdi0+dGV4dHVyZV9zaXplID0gaW5pdC0+dGV4dHVyZV9zaXplWzBdOwogCi0JRFJNX0dFVFNBUkVBKCk7Ci0KKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBmaW5kIHNhcmVhIVxuIik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CkBAIC05MzQsNyArOTMzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoZHJtX2RldmljZV90ICpkZXYsIGludCBmdWxsX2NsZWFudXApCitzdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZnVsbF9jbGVhbnVwKQogewogCWludCBlcnIgPSAwOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTk2Myw4ICs5NjIsOCBAQAogCQlpZiAoZGV2X3ByaXYtPnVzZWRfbmV3X2RtYV9pbml0KSB7CiAjaWYgX19PU19IQVNfQUdQCiAJCQlpZiAoZGV2X3ByaXYtPmFncF9oYW5kbGUgIT0gMCkgewotCQkJCWRybV9hZ3BfYmluZGluZ190IHVuYmluZF9yZXE7Ci0JCQkJZHJtX2FncF9idWZmZXJfdCBmcmVlX3JlcTsKKwkJCQlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIHVuYmluZF9yZXE7CisJCQkJc3RydWN0IGRybV9hZ3BfYnVmZmVyIGZyZWVfcmVxOwogCiAJCQkJdW5iaW5kX3JlcS5oYW5kbGUgPSBkZXZfcHJpdi0+YWdwX2hhbmRsZTsKIAkJCQlkcm1fYWdwX3VuYmluZChkZXYsICZ1bmJpbmRfcmVxKTsKQEAgLTEwNDEsMTEgKzEwNDAsMTEgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZHJtX2xvY2sgbG9jazsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKSBkYXRhLAorCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChsb2NrLCAoc3RydWN0IGRybV9sb2NrIF9fdXNlciAqKSBkYXRhLAogCQkJCSBzaXplb2YobG9jaykpOwogCiAJRFJNX0RFQlVHKCIlcyVzJXNcbiIsCkBAIC0xMDg3LDkgKzEwODYsOSBAQAogICogRE1BIGJ1ZmZlciBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdGljIGludCBtZ2FfZG1hX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX3QgKiBkKQorc3RhdGljIGludCBtZ2FfZG1hX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZG1hICogZCkKIHsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpOwogCiAJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewpAQCAtMTExNCwxMCArMTExMywxMCBAQAogaW50IG1nYV9kbWFfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RtYV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JZHJtX2RtYV90IGQ7CisJc3RydWN0IGRybV9kbWEgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlzdHJ1Y3QgZHJtX2RtYSBkOwogCWludCByZXQgPSAwOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CkBAIC0xMTU2LDcgKzExNTUsNyBAQAogLyoqCiAgKiBDYWxsZWQganVzdCBiZWZvcmUgdGhlIG1vZHVsZSBpcyB1bmxvYWRlZC4KICAqLwotaW50IG1nYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBtZ2FfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fZnJlZShkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CiAJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CkBAIC0xMTY3LDEyICsxMTY2LDEyIEBACiAvKioKICAqIENhbGxlZCB3aGVuIHRoZSBsYXN0IG9wZW5lciBvZiB0aGUgZGV2aWNlIGlzIGNsb3NlZC4KICAqLwotdm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCW1nYV9kb19jbGVhbnVwX2RtYShkZXYsIEZVTExfQ0xFQU5VUCk7CiB9CiAKLWludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQoraW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXJldHVybiBtZ2FfZG9fd2FpdF9mb3JfaWRsZShkZXZfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCmluZGV4IDQ0ZDEyOTMuLjk0NGI1MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCkBAIC0xODEsNyArMTgxLDcgQEAKIAogCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KIAkgKi8KLQlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CiAJdW5zaWduZWQgaW50IG5ib3g7CiAKIAkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIDNkIGRyYXdhYmxlLiAgVGhlCkBAIC0yMDIsNyArMjAyLDcgQEAKIAl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmJhY2s7CiAJaW50IGV4cG9ydGVkX2JhY2tfeCwgZXhwb3J0ZWRfZnJvbnRfeCwgZXhwb3J0ZWRfdzsKIAlpbnQgZXhwb3J0ZWRfYmFja195LCBleHBvcnRlZF9mcm9udF95LCBleHBvcnRlZF9oOwotCWRybV9jbGlwX3JlY3RfdCBleHBvcnRlZF9ib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBleHBvcnRlZF9ib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAogCS8qIENvdW50ZXJzIGZvciBhZ2luZyB0ZXh0dXJlcyBhbmQgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcuCiAJICovCkBAIC0yMTYsNyArMjE2LDcgQEAKIAogCS8qIExSVSBsaXN0cyBmb3IgdGV4dHVyZSBtZW1vcnkgaW4gYWdwIHNwYWNlIGFuZCBvbiB0aGUgY2FyZC4KIAkgKi8KLQlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbTUdBX05SX1RFWF9IRUFQU11bTUdBX05SX1RFWF9SRUdJT05TICsgMV07CisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleExpc3RbTUdBX05SX1RFWF9IRUFQU11bTUdBX05SX1RFWF9SRUdJT05TICsgMV07CiAJdW5zaWduZWQgaW50IHRleEFnZVtNR0FfTlJfVEVYX0hFQVBTXTsKIAogCS8qIE1lY2hhbmlzbSB0byB2YWxpZGF0ZSBjYXJkIHN0YXRlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwppbmRleCBiZTQ5ZGJiLi41NTcyOTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworc3RhdGljIGludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CiAJbWdhX1BDSV9JRFMKQEAgLTExOCw3ICsxMTgsNyBAQAogICogXHJldHVybnMKICAqIElmIHRoZSBkZXZpY2UgaXMgYSBQQ0kgRzQ1MCwgemVybyBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSAyIGlzIHJldHVybmVkLgogICovCi1zdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAljb25zdCBzdHJ1Y3QgcGNpX2RldiAqY29uc3QgcGRldiA9IGRldi0+cGRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAppbmRleCA2YjBjNTMxLi40OTI1M2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaApAQCAtNjUsNyArNjUsNyBAQAogCXN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0ICpuZXh0OwogCXN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0ICpwcmV2OwogCWRybV9tZ2FfYWdlX3QgYWdlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiB9IGRybV9tZ2FfZnJlZWxpc3RfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTU3LDEwICsxNTcsMTAgQEAKIGV4dGVybiBpbnQgbWdhX2RtYV9mbHVzaChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IG1nYV9kbWFfcmVzZXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBtZ2FfZG1hX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBleHRlcm4gaW50IG1nYV9kb193YWl0X2Zvcl9pZGxlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIGV4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9zdGFydChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9lbmQoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiAKLWV4dGVybiBpbnQgbWdhX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1Zik7CitleHRlcm4gaW50IG1nYV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKTsKIAogCQkJCS8qIG1nYV93YXJwLmMgKi8KIGV4dGVybiB1bnNpZ25lZCBpbnQgbWdhX3dhcnBfbWljcm9jb2RlX3NpemUoY29uc3QgZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CkBAIC0xNzYsMTIgKzE3NiwxMiBAQAogZXh0ZXJuIGludCBtZ2Ffd2FycF9pbml0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogCiAJCQkJLyogbWdhX2lycS5jICovCi1leHRlcm4gaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogZXh0ZXJuIGlycXJldHVybl90IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBsb25nIG1nYV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYwppbmRleCBlYjk2NDQwLi45MzAyY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYwpAQCAtMzcsNyArMzcsNyBAQAogCiBpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCBzdGF0dXM7CiAJaW50IGhhbmRsZWQgPSAwOwpAQCAtNzgsNyArNzgsNyBAQAogCXJldHVybiBJUlFfTk9ORTsKIH0KIAotaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CiAJaW50IHJldCA9IDA7CkBAIC05Niw3ICs5Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgbWdhX2RyaXZlcl9mZW5jZV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCBjdXJfZmVuY2U7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAlNR0FfV1JJVEUoTUdBX0lDTEVBUiwgfjApOwogfQogCi12b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogCU1HQV9XUklURShNR0FfSUVOLCBNR0FfVkxJTkVJRU4gfCBNR0FfU09GVFJBUEVOKTsKIH0KIAotdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCmluZGV4IDI4MzdlNjYuLmQ0NDhiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpAQCAtNDIsNyArNDIsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIG1nYV9lbWl0X2NsaXBfcmVjdChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgIGRybV9jbGlwX3JlY3RfdCAqIGJveCkKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIGJveCkKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKQEAgLTQ4MCwxMiArNDgwLDEyIEBACiAgKgogICovCiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWdhX2NsZWFyX3QgKiBjbGVhcikKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tZ2FfY2xlYXJfdCAqIGNsZWFyKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJaW50IGk7CiAJRE1BX0xPQ0FMUzsKQEAgLTUwMCw3ICs1MDAsNyBAQAogCUFEVkFOQ0VfRE1BKCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7Ci0JCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gJnBib3hbaV07CisJCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3ggPSAmcGJveFtpXTsKIAkJdTMyIGhlaWdodCA9IGJveC0+eTIgLSBib3gtPnkxOwogCiAJCURSTV9ERUJVRygiICAgZnJvbT0lZCwlZCB0bz0lZCwlZFxuIiwKQEAgLTU2OCwxMiArNTY4LDEyIEBACiAJRkxVU0hfRE1BKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAlpbnQgaTsKIAlETUFfTE9DQUxTOwpAQCAtNTk4LDcgKzU5OCw3IEBACiAJCSAgTUdBX1BMTldULCAweGZmZmZmZmZmLCBNR0FfRFdHQ1RMLCBNR0FfRFdHQ1RMX0NPUFkpOwogCiAJZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgewotCQlkcm1fY2xpcF9yZWN0X3QgKmJveCA9ICZwYm94W2ldOworCQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ID0gJnBib3hbaV07CiAJCXUzMiBoZWlnaHQgPSBib3gtPnkyIC0gYm94LT55MTsKIAkJdTMyIHN0YXJ0ID0gYm94LT55MSAqIGRldl9wcml2LT5mcm9udF9waXRjaDsKIApAQCAtNjIyLDcgKzYyMiw3IEBACiAJRFJNX0RFQlVHKCIlcy4uLiBkb25lLlxuIiwgX19GVU5DVElPTl9fKTsKIH0KIAotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTY2OSw3ICs2NjksNyBAQAogCUZMVVNIX0RNQSgpOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYsCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03MTgsNyArNzE4LDcgQEAKIC8qIFRoaXMgY29waWVzIGEgNjQgYnl0ZSBhbGlnbmVkIGFncCByZWdpb24gdG8gdGhlIGZyYW1idWZmZXIgd2l0aCBhCiAgKiBzdGFuZGFyZCBibGl0LCB0aGUgaW9jdGwgbmVlZHMgdG8gZG8gY2hlY2tpbmcuCiAgKi8KLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfaWxvYWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYsCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2lsb2FkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwKIAkJCQkgICB1bnNpZ25lZCBpbnQgZHN0b3JnLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03NjYsMTIgKzc2NiwxMiBAQAogCUZMVVNIX0RNQSgpOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2JsaXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWdhX2JsaXRfdCAqIGJsaXQpCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2JsaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tZ2FfYmxpdF90ICogYmxpdCkKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwogCXUzMiBzY2FuZGlyID0gMCwgaTsKIAlETUFfTE9DQUxTOwpAQCAtODgwLDggKzg4MCw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9tZ2FfdmVydGV4X3QgdmVydGV4OwogCkBAIC05MjAsOCArOTIwLDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX21nYV9pbmRpY2VzX3QgaW5kaWNlczsKIApAQCAtOTU5LDkgKzk1OSw5IEBACiBzdGF0aWMgaW50IG1nYV9kbWFfaWxvYWQoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9tZ2FfaWxvYWRfdCBpbG9hZDsKIAlEUk1fREVCVUcoIlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKaW5kZXggMTAxNDYwMi4uYjE2M2VkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYwpAQCAtODEsNyArODEsNyBAQAogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKIH07CiAKLXN0YXRpYyBpbnQgUjEyOF9SRUFEX1BMTChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBhZGRyKQorc3RhdGljIGludCBSMTI4X1JFQURfUExMKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgYWRkcikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMjcxLDcgKzI3MSw3IEBACiAKIC8qIFJlc2V0IHRoZSBlbmdpbmUuICBUaGlzIHdpbGwgc3RvcCB0aGUgQ0NFIGlmIGl0IGlzIHJ1bm5pbmcuCiAgKi8KLXN0YXRpYyBpbnQgcjEyOF9kb19lbmdpbmVfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByMTI4X2RvX2VuZ2luZV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgY2xvY2tfY250bF9pbmRleCwgbWNsa19jbnRsLCBnZW5fcmVzZXRfY250bDsKQEAgLTMwOCw3ICszMDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9pbml0X3JpbmdfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2luaXRfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICAgZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7CiAJdTMyIHJpbmdfc3RhcnQ7CkBAIC0zNDcsNyArMzQ3LDcgQEAKIAlSMTI4X1dSSVRFKFIxMjhfQlVTX0NOVEwsIHRtcCk7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb19pbml0X2NjZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9yMTI4X2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IHIxMjhfZG9faW5pdF9jY2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9yMTI4X2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIApAQCAtNDU2LDggKzQ1Niw3IEBACiAJZGV2X3ByaXYtPnNwYW5fcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyA4KSA8PCAyMSkgfAogCQkJCQkgKGRldl9wcml2LT5zcGFuX29mZnNldCA+PiA1KSk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKLQorCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CkBAIC01ODUsNyArNTg0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHIxMjhfZG9fY2xlYW51cF9jY2UoZHJtX2RldmljZV90ICogZGV2KQoraW50IHIxMjhfZG9fY2xlYW51cF9jY2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKQEAgLTc3MCwxMSArNzY5LDExIEBACiAjZGVmaW5lIFIxMjhfQlVGRkVSX0ZSRUUJMAogCiAjaWYgMAotc3RhdGljIGludCByMTI4X2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByMTI4X2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9yMTI4X2ZyZWVsaXN0X3QgKmVudHJ5OwogCWludCBpOwpAQCAtODE2LDEyICs4MTUsMTIgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgZHJtX2J1Zl90ICpyMTI4X2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgc3RydWN0IGRybV9idWYgKnIxMjhfZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgaSwgdDsKIAogCS8qIEZJWE1FOiBPcHRpbWl6ZSAtLSB1c2UgZnJlZWxpc3QgY29kZSAqLwpAQCAtODU0LDEzICs4NTMsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9mcmVlbGlzdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJYnVmX3ByaXYtPmFnZSA9IDA7CiAJfQpAQCAtODg3LDEwICs4ODYsMTAgQEAKIAlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9kbWFfdCAqIGQpCitzdGF0aWMgaW50IHIxMjhfY2NlX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZG1hICogZCkKIHsKIAlpbnQgaTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCiAJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewogCQlidWYgPSByMTI4X2ZyZWVsaXN0X2dldChkZXYpOwpAQCAtOTE0LDEwICs5MTMsMTAgQEAKIGludCByMTI4X2NjZV9idWZmZXJzKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgcmV0ID0gMDsKLQlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKLQlkcm1fZG1hX3QgZDsKKwlzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCXN0cnVjdCBkcm1fZG1hIGQ7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCmluZGV4IDZlOGFmMzEuLmU5NGEzOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiAJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgogCSAqLwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tSMTI4X05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbUjEyOF9OUl9TQVJFQV9DTElQUkVDVFNdOwogCXVuc2lnbmVkIGludCBuYm94OwogCiAJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCkBAIC0xNjEsNyArMTYxLDcgQEAKIAl1bnNpZ25lZCBpbnQgbGFzdF9mcmFtZTsKIAl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsKIAotCWRybV90ZXhfcmVnaW9uX3QgdGV4X2xpc3RbUjEyOF9OUl9URVhfSEVBUFNdW1IxMjhfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4X2xpc3RbUjEyOF9OUl9URVhfSEVBUFNdW1IxMjhfTlJfVEVYX1JFR0lPTlMgKyAxXTsKIAl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSMTI4X05SX1RFWF9IRUFQU107CiAJaW50IGN0eF9vd25lcjsKIAlpbnQgcGZBbGxvd1BhZ2VGbGlwOwkvKiBudW1iZXIgb2YgM2Qgd2luZG93cyAoMCwxLDIgb3IgbW9yZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaAppbmRleCA5MDg2ODM1Li43MjI0OWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCkBAIC01Nyw3ICs1Nyw3IEBACiAKIHR5cGVkZWYgc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0IHsKIAl1bnNpZ25lZCBpbnQgYWdlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0ICpuZXh0OwogCXN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCAqcHJldjsKIH0gZHJtX3IxMjhfZnJlZWxpc3RfdDsKQEAgLTExOCw3ICsxMTgsNyBAQAogCWRybV9sb2NhbF9tYXBfdCAqY2NlX3Jpbmc7CiAJZHJtX2xvY2FsX21hcF90ICpyaW5nX3JwdHI7CiAJZHJtX2xvY2FsX21hcF90ICphZ3BfdGV4dHVyZXM7Ci0JZHJtX2F0aV9wY2lnYXJ0X2luZm8gZ2FydF9pbmZvOworCXN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyBnYXJ0X2luZm87CiB9IGRybV9yMTI4X3ByaXZhdGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfYnVmX3ByaXYgewpAQCAtMTQyLDIxICsxNDIsMjEgQEAKIGV4dGVybiBpbnQgcjEyOF9mdWxsc2NyZWVuKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgcjEyOF9jY2VfYnVmZmVycyhEUk1fSU9DVExfQVJHUyk7CiAKLWV4dGVybiB2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBleHRlcm4gaW50IHIxMjhfd2FpdF9yaW5nKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgbik7CiAKIGV4dGVybiBpbnQgcjEyOF9kb19jY2VfaWRsZShkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdik7Ci1leHRlcm4gaW50IHIxMjhfZG9fY2xlYW51cF9jY2UoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgcjEyOF9kb19jbGVhbnVwX2NjZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKLWV4dGVybiBpbnQgcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgcjEyOF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOwogCiBleHRlcm4gbG9uZyByMTI4X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYwppbmRleCA4N2Y4Y2EyLi5jNzZmZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCkBAIC0zNyw3ICszNyw3IEBACiAKIGlycXJldHVybl90IHIxMjhfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3IxMjhfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHN0YXR1czsKIApAQCAtNTQsNyArNTQsNyBAQAogCXJldHVybiBJUlFfTk9ORTsKIH0KIAotaW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKIAlpbnQgcmV0ID0gMDsKQEAgLTcyLDcgKzcyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcjEyOF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtODIsNyArODIsNyBAQAogCVIxMjhfV1JJVEUoUjEyOF9HRU5fSU5UX1NUQVRVUywgUjEyOF9DUlRDX1ZCTEFOS19JTlRfQUspOwogfQogCi12b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yMTI4X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC05MCw3ICs5MCw3IEBACiAJUjEyOF9XUklURShSMTI4X0dFTl9JTlRfQ05UTCwgUjEyOF9DUlRDX1ZCTEFOS19JTlRfRU4pOwogfQogCi12b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3IxMjhfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKaW5kZXggMTdiMTFlNy4uN2IzMzRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKQEAgLTM4LDcgKzM4LDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZCByMTI4X2VtaXRfY2xpcF9yZWN0cyhkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgZHJtX2NsaXBfcmVjdF90ICogYm94ZXMsIGludCBjb3VudCkKKwkJCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3hlcywgaW50IGNvdW50KQogewogCXUzMiBhdXhfc2NfY250bCA9IDB4MDAwMDAwMDA7CiAJUklOR19MT0NBTFM7CkBAIC0zNTIsMTMgKzM1MiwxMyBAQAogCQkgKGZsYWdzICYgUjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0UpID8gInF1aWVzY2VuY2UsICIgOiAiIik7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICBkcm1fcjEyOF9jbGVhcl90ICogY2xlYXIpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCXVuc2lnbmVkIGludCBmbGFncyA9IGNsZWFyLT5mbGFnczsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTQ1OCwxMiArNDU4LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zd2FwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC01MjQsNyArNTI0LDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtNjM3LDggKzYzNyw4IEBACiAJc2FyZWFfcHJpdi0+bmJveCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgICAgZHJtX2J1Zl90ICogYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9idWYgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC02OTIsOCArNjkyLDggQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCsrOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpY2VzKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgICBkcm1fYnVmX3QgKiBidWYsCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpY2VzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkcm1fYnVmICogYnVmLAogCQkJCSAgICAgIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvdW50KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzc3LDExICs3NzcsMTEgQEAKIH0KIAogc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9ibGl0KERSTUZJTEUgZmlscCwKLQkJCQkgIGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3IxMjhfYmxpdF90ICogYmxpdCkKKwkJCQkgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fcjEyOF9ibGl0X3QgKiBibGl0KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAl1MzIgKmRhdGE7CiAJaW50IGR3b3JkX3NoaWZ0LCBkd29yZHM7CkBAIC04ODcsNyArODg3LDcgQEAKICAqIGhhdmUgaGFyZHdhcmUgc3RlbmNpbCBzdXBwb3J0LgogICovCiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfc3Bhbihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3NwYW4oc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCWRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTk4Myw3ICs5ODMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3BpeGVscyhkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3BpeGVscyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICBkcm1fcjEyOF9kZXB0aF90ICogZGVwdGgpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMTA1LDcgKzExMDUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfc3Bhbihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfc3BhbihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICAgZHJtX3IxMjhfZGVwdGhfdCAqIGRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTE0OCw3ICsxMTQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyhkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfcGl4ZWxzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgZHJtX3IxMjhfZGVwdGhfdCAqIGRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTIyMCw3ICsxMjIwLDcgQEAKICAqIFBvbHlnb24gc3RpcHBsZQogICovCiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N0aXBwbGUoZHJtX2RldmljZV90ICogZGV2LCB1MzIgKiBzdGlwcGxlKQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfc3RpcHBsZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdTMyICogc3RpcHBsZSkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKQEAgLTEyNjksNyArMTI2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9kb19pbml0X3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTEyODgsNyArMTI4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTEzNTQsOCArMTM1NCw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX3IxMjhfdmVydGV4X3QgdmVydGV4OwogCkBAIC0xNDEzLDggKzE0MTMsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9yMTI4X2luZGljZXNfdCBlbHRzOwogCWludCBjb3VudDsKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiBzdGF0aWMgaW50IHIxMjhfY2NlX2JsaXQoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X2JsaXRfdCBibGl0OwogCWludCByZXQ7CkBAIC0xNTcxLDggKzE1NzEsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9yMTI4X2luZGlyZWN0X3QgaW5kaXJlY3Q7CiAjaWYgMApAQCAtMTY3NSw3ICsxNjc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAJfQogfQogCi12b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyMTI4X2RvX2NsZWFudXBfY2NlKGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKaW5kZXggMDMyYTAyMi4uNGU1YWNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYwpAQCAtNTUsNyArNTUsNyBAQAogc3RhdGljIGludCByMzAwX2VtaXRfY2xpcHJlY3RzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJCSAgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwgaW50IG4pCiB7Ci0JZHJtX2NsaXBfcmVjdF90IGJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3g7CiAJaW50IG5yOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwpAQCAtMTQ4LDE1ICsxNDgsMTYgQEAKIAogCS8qIHRoZXNlIG1hdGNoIGNtZHVjcygpIGNvbW1hbmQgaW4gcjMwMF9kcml2ZXIvcjMwMC9yMzAwX2NtZGJ1Zi5jICovCiAJQUREX1JBTkdFKFIzMDBfU0VfVlBPUlRfWFNDQUxFLCA2KTsKLQlBRERfUkFOR0UoMHgyMDgwLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfQ05UTCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfU0VfVlRFX0NOVEwsIDIpOwogCUFERF9SQU5HRSgweDIxMzQsIDIpOwotCUFERF9SQU5HRSgweDIxNDAsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9DTlRMX1NUQVRVUywgMSk7CiAJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX0NOVExfMCwgMik7CiAJQUREX1JBTkdFKDB4MjFEQywgMSk7Ci0JQUREX1JBTkdFKDB4MjIxQywgMSk7Ci0JQUREX1JBTkdFKDB4MjIyMCwgNCk7Ci0JQUREX1JBTkdFKDB4MjI4OCwgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX1VOS05PV05fMjIxQywgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX0NMSVBfWF8wLCA0KTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfUFZTX1dBSVRJRExFLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfVU5LTk9XTl8yMjg4LCAxKTsKIAlBRERfUkFOR0UoUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMCwgMik7CiAJQUREX1JBTkdFKFIzMDBfVkFQX1BWU19DTlRMXzEsIDMpOwogCUFERF9SQU5HRShSMzAwX0dCX0VOQUJMRSwgMSk7CkBAIC0xNjgsMTMgKzE2OSwxMyBAQAogCUFERF9SQU5HRShSMzAwX1JFX1BPSU5UU0laRSwgMSk7CiAJQUREX1JBTkdFKDB4NDIzMCwgMyk7CiAJQUREX1JBTkdFKFIzMDBfUkVfTElORV9DTlQsIDEpOwotCUFERF9SQU5HRSgweDQyMzgsIDEpOworCUFERF9SQU5HRShSMzAwX1JFX1VOSzQyMzgsIDEpOwogCUFERF9SQU5HRSgweDQyNjAsIDMpOwotCUFERF9SQU5HRSgweDQyNzQsIDQpOwotCUFERF9SQU5HRSgweDQyODgsIDUpOwotCUFERF9SQU5HRSgweDQyQTAsIDEpOworCUFERF9SQU5HRShSMzAwX1JFX1NIQURFLCA0KTsKKwlBRERfUkFOR0UoUjMwMF9SRV9QT0xZR09OX01PREUsIDUpOworCUFERF9SQU5HRShSMzAwX1JFX1pCSUFTX0NOVEwsIDEpOwogCUFERF9SQU5HRShSMzAwX1JFX1pCSUFTX1RfRkFDVE9SLCA0KTsKLQlBRERfUkFOR0UoMHg0MkI0LCAxKTsKKwlBRERfUkFOR0UoUjMwMF9SRV9PQ0NMVVNJT05fQ05UTCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfUkVfQ1VMTF9DTlRMLCAxKTsKIAlBRERfUkFOR0UoMHg0MkMwLCAyKTsKIAlBRERfUkFOR0UoUjMwMF9SU19DTlRMXzAsIDIpOwpAQCAtMTkwLDIyICsxOTEsMjIgQEAKIAlBRERfUkFOR0UoUjMwMF9QRlNfSU5TVFIxXzAsIDY0KTsKIAlBRERfUkFOR0UoUjMwMF9QRlNfSU5TVFIyXzAsIDY0KTsKIAlBRERfUkFOR0UoUjMwMF9QRlNfSU5TVFIzXzAsIDY0KTsKLQlBRERfUkFOR0UoMHg0QkMwLCAxKTsKLQlBRERfUkFOR0UoMHg0QkM4LCAzKTsKKwlBRERfUkFOR0UoUjMwMF9SRV9GT0dfU1RBVEUsIDEpOworCUFERF9SQU5HRShSMzAwX0ZPR19DT0xPUl9SLCAzKTsKIAlBRERfUkFOR0UoUjMwMF9QUF9BTFBIQV9URVNULCAyKTsKIAlBRERfUkFOR0UoMHg0QkQ4LCAxKTsKIAlBRERfUkFOR0UoUjMwMF9QRlNfUEFSQU1fMF9YLCA2NCk7CiAJQUREX1JBTkdFKDB4NEUwMCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfUkIzRF9DQkxFTkQsIDIpOwogCUFERF9SQU5HRShSMzAwX1JCM0RfQ09MT1JNQVNLLCAxKTsKLQlBRERfUkFOR0UoMHg0RTEwLCAzKTsKKwlBRERfUkFOR0UoUjMwMF9SQjNEX0JMRU5EX0NPTE9SLCAzKTsKIAlBRERfUkFOR0VfTUFSSyhSMzAwX1JCM0RfQ09MT1JPRkZTRVQwLCAxLCBNQVJLX0NIRUNLX09GRlNFVCk7CS8qIGNoZWNrIG9mZnNldCAqLwogCUFERF9SQU5HRShSMzAwX1JCM0RfQ09MT1JQSVRDSDAsIDEpOwogCUFERF9SQU5HRSgweDRFNTAsIDkpOwogCUFERF9SQU5HRSgweDRFODgsIDEpOwogCUFERF9SQU5HRSgweDRFQTAsIDIpOwogCUFERF9SQU5HRShSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8wLCAzKTsKLQlBRERfUkFOR0UoMHg0RjEwLCA0KTsKKwlBRERfUkFOR0UoUjMwMF9SQjNEX1pTVEVOQ0lMX0ZPUk1BVCwgNCk7CiAJQUREX1JBTkdFX01BUksoUjMwMF9SQjNEX0RFUFRIT0ZGU0VULCAxLCBNQVJLX0NIRUNLX09GRlNFVCk7CS8qIGNoZWNrIG9mZnNldCAqLwogCUFERF9SQU5HRShSMzAwX1JCM0RfREVQVEhQSVRDSCwgMSk7CiAJQUREX1JBTkdFKDB4NEYyOCwgMSk7CkBAIC0yMjQsNyArMjI1LDcgQEAKIAlBRERfUkFOR0UoUjMwMF9UWF9CT1JERVJfQ09MT1JfMCwgMTYpOwogCiAJLyogU3BvcmFkaWMgcmVnaXN0ZXJzIHVzZWQgYXMgcHJpbWl0aXZlcyBhcmUgZW1pdHRlZCAqLwotCUFERF9SQU5HRSgweDRmMTgsIDEpOworCUFERF9SQU5HRShSMzAwX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDEpOwogCUFERF9SQU5HRShSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMCwgOCk7CiAJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMCwgOCk7CkBAIC02OTIsOSArNjkzLDkgQEAKIAogCUJFR0lOX1JJTkcoNik7CiAJT1VUX1JJTkcoQ1BfUEFDS0VUMChSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCwgMCkpOwotCU9VVF9SSU5HKDB4YSk7Ci0JT1VUX1JJTkcoQ1BfUEFDS0VUMCgweDRmMTgsIDApKTsKLQlPVVRfUklORygweDMpOworCU9VVF9SSU5HKFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzBBKTsKKwlPVVRfUklORyhDUF9QQUNLRVQwKFIzMDBfUkIzRF9aQ0FDSEVfQ1RMU1RBVCwgMCkpOworCU9VVF9SSU5HKFIzMDBfUkIzRF9aQ0FDSEVfVU5LTk9XTl8wMyk7CiAJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fQ1BfTk9QLCAwKSk7CiAJT1VUX1JJTkcoMHgwKTsKIAlBRFZBTkNFX1JJTkcoKTsKQEAgLTcwNSw3ICs3MDYsNyBAQAogICogVGhlIGFjdHVhbCBhZ2UgZW1pdCBpcyBkb25lIGJ5IHIzMDBfZG9fY3BfY21kYnVmLCB3aGljaCBpcyB3aHkgeW91IG11c3QKICAqIGJlIGNhcmVmdWwgYWJvdXQgaG93IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgogICovCi1zdGF0aWMgdm9pZCByMzAwX2Rpc2NhcmRfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIHZvaWQgcjMwMF9kaXNjYXJkX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTc2Niw4ICs3NjcsOCBAQAogCX0KIAkKIAlCRUdJTl9SSU5HKDIpOwotCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NDUkFUQ0hfUkVHMCArIGhlYWRlci5zY3JhdGNoLnJlZyAqIDQsIDApKTsKLQlPVVRfUklORyhkZXZfcHJpdi0+c2NyYXRjaF9hZ2VzW2hlYWRlci5zY3JhdGNoLnJlZ10pOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0NSQVRDSF9SRUcwICsgaGVhZGVyLnNjcmF0Y2gucmVnICogNCwgMCApICk7CisJT1VUX1JJTkcoIGRldl9wcml2LT5zY3JhdGNoX2FnZXNbaGVhZGVyLnNjcmF0Y2gucmVnXSApOwogCUFEVkFOQ0VfUklORygpOwogCQogCXJldHVybiAwOwpAQCAtNzc4LDE0ICs3NzksMTQgQEAKICAqIGNvbW1hbmRzIG9uIHRoZSBETUEgcmluZyBidWZmZXIuCiAgKiBDYWxsZWQgYnkgdGhlIGlvY3RsIGhhbmRsZXIgZnVuY3Rpb24gcmFkZW9uX2NwX2NtZGJ1Zi4KICAqLwotaW50IHIzMDBfZG9fY3BfY21kYnVmKGRybV9kZXZpY2VfdCAqZGV2LAoraW50IHIzMDBfZG9fY3BfY21kYnVmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCSAgICAgIERSTUZJTEUgZmlscCwKLQkJICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdiwKIAkJICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZiA9IE5VTEw7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gTlVMTDsKIAlpbnQgZW1pdF9kaXNwYXRjaF9hZ2UgPSAwOwogCWludCByZXQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmggYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKaW5kZXggZWNkYTc2MC4uM2FlNTdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaApAQCAtNDcsMTIgKzQ3LDEyIEBACiAjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0dMT0JXX0ZVTExfTEFUX1NISUZUCTI4CiAKIC8qCi1UaGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXJzIGFuZCBjb25zdGFudHMgZm9yIHRoZSBSMzAwLiBUaGV5IGhhdmUgYmVlbgotZm91bmQgbW9zdGx5IGJ5IGV4YW1pbmluZyBjb21tYW5kIGJ1ZmZlcnMgY2FwdHVyZWQgdXNpbmcgZ2x4dGVzdCwgYXMgd2VsbAotYXMgYnkgZXh0cmFwb2xhdGluZyBzb21lIGtub3duIHJlZ2lzdGVycyBhbmQgY29uc3RhbnRzIGZyb20gdGhlIFIyMDAuCi0KLUkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCB0aGV5IGFyZSBjb3JyZWN0IHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlIGluIGNvbW1lbnRzLgotKi8KKyAqIFRoaXMgZmlsZSBjb250YWlucyByZWdpc3RlcnMgYW5kIGNvbnN0YW50cyBmb3IgdGhlIFIzMDAuIFRoZXkgaGF2ZSBiZWVuCisgKiBmb3VuZCBtb3N0bHkgYnkgZXhhbWluaW5nIGNvbW1hbmQgYnVmZmVycyBjYXB0dXJlZCB1c2luZyBnbHh0ZXN0LCBhcyB3ZWxsCisgKiBhcyBieSBleHRyYXBvbGF0aW5nIHNvbWUga25vd24gcmVnaXN0ZXJzIGFuZCBjb25zdGFudHMgZnJvbSB0aGUgUjIwMC4KKyAqIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCB0aGV5IGFyZSBjb3JyZWN0IHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlCisgKiBpbiBjb21tZW50cy4KKyAqLwogCiAjZGVmaW5lIFIzMDBfU0VfVlBPUlRfWFNDQUxFICAgICAgICAgICAgICAgIDB4MUQ5OAogI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1hPRkZTRVQgICAgICAgICAgICAgICAweDFEOUMKQEAgLTYxLDQ5ICs2MSw2MCBAQAogI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1pTQ0FMRSAgICAgICAgICAgICAgICAweDFEQTgKICNkZWZpbmUgUjMwMF9TRV9WUE9SVF9aT0ZGU0VUICAgICAgICAgICAgICAgMHgxREFDCiAKLS8qIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdHRlbiBkaXJlY3RseSBhbmQgYWxzbyBzdGFydHMgZGF0YSBzZWN0aW9uIGluIG1hbnkgM2QgQ1BfUEFDS0VUMydzICovCisKKy8qCisgKiBWZXJ0ZXggQXJyYXkgUHJvY2Vzc2luZyAoVkFQKSBDb250cm9sCisgKiBTdG9sZW4gZnJvbSByMjAwIGNvZGUgZnJvbSBDaHJpc3RvcGggQnJpbGwgKEl0J3MgYSBndWVzcyEpCisgKi8KKyNkZWZpbmUgUjMwMF9WQVBfQ05UTAkweDIwODAKKworLyogVGhpcyByZWdpc3RlciBpcyB3cml0dGVuIGRpcmVjdGx5IGFuZCBhbHNvIHN0YXJ0cyBkYXRhIHNlY3Rpb24KKyAqIGluIG1hbnkgM2QgQ1BfUEFDS0VUMydzCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfVkZfQ05UTAkweDIwODQKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFlQRV9fU0hJRlQgICAgICAgICAgICAgIDAKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX05PTkUgICAgICAgICAgICAgICAgICAgICAoMDw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1BPSU5UUyAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVTICAgICAgICAgICAgICAgICAgICAoMjw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAoMzw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAoNDw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAoNTw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAoNjw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAoMTI8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9RVUFEUyAgICAgICAgICAgICAgICAgICAgKDEzPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUVVBRF9TVFJJUCAgICAgICAgICAgICAgICgxNDw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1BPTFlHT04gICAgICAgICAgICAgICAgICAoMTU8PDApCiAKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFlQRV9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX05PTkUJCQkJICgwPDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9JTlRTCQkJCSAoMTw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVTCQkJCSAoMjw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfU1RSSVAJCQkgKDM8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRVMJCQkgKDQ8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9GQU4JCQkgKDU8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9TVFJJUAkJCSAoNjw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfTE9PUAkJCSAoMTI8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9RVUFEUwkJCSAJICgxMzw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1FVQURfU1RSSVAJCQkgKDE0PDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9MWUdPTgkJCSAJICgxNTw8MCkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19fU0hJRlQgICAgICAgICAgICAgIDQKKwkvKiBTdGF0ZSBiYXNlZCAtIGRpcmVjdCB3cml0ZXMgdG8gcmVnaXN0ZXJzIHRyaWdnZXIgdmVydGV4CisgICAgICAgICAgIGdlbmVyYXRpb24gKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19TVEFURV9CQVNFRCAgICAgICAgICgwPDw0KQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX0lORElDRVMgICAgICAgICAgICAgKDE8PDQpCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfVkVSVEVYX0xJU1QgICAgICAgICAoMjw8NCkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19WRVJURVhfRU1CRURERUQgICAgICgzPDw0KQogCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA0Ci0JLyogU3RhdGUgYmFzZWQgLSBkaXJlY3Qgd3JpdGVzIHRvIHJlZ2lzdGVycyB0cmlnZ2VyIHZlcnRleCBnZW5lcmF0aW9uICovCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfU1RBVEVfQkFTRUQgICAgICAgICAgICAgICAgICAgICAgKDA8PDQpCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfSU5ESUNFUyAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDQpCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfVkVSVEVYX0xJU1QgICAgICAgICAgICAgICAgICAgICAgKDI8PDQpCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfVkVSVEVYX0VNQkVEREVEICAgICAgICAgICAgICAgICAgKDM8PDQpCisJLyogSSBkb24ndCB0aGluayBJIHNhdyB0aGVzZSB0aHJlZSB1c2VkLi4gKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0NPTE9SX09SREVSX19TSElGVCAgICAgICAgICAgIDYKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1RDTF9PVVRQVVRfQ1RMX0VOQV9fU0hJRlQgICAgIDkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BST0dfU1RSRUFNX0VOQV9fU0hJRlQgICAgICAgIDEwCiAKLQkJLyogSSBkb24ndCB0aGluayBJIHNhdyB0aGVzZSB0aHJlZSB1c2VkLi4gKi8KLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0NPTE9SX09SREVSX19TSElGVCAgICAgICAgICAgICAgICAgICAgIDYKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1RDTF9PVVRQVVRfQ1RMX0VOQV9fU0hJRlQgICAgICAgICAgICAgIDkKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BST0dfU1RSRUFNX0VOQV9fU0hJRlQgICAgICAgICAgICAgICAgIDEwCi0KLQkJLyogaW5kZXggc2l6ZSAtIHdoZW4gbm90IHNldCB0aGUgaW5kaWNlcyBhcmUgYXNzdW1lZCB0byBiZSAxNiBiaXQgKi8KLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0lOREVYX1NJWkVfMzJiaXQgICAgICAgICAgICAgICAgICAgICAgKDE8PDExKQotCQkvKiBudW1iZXIgb2YgdmVydGljZXMgKi8KLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX05VTV9WRVJUSUNFU19fU0hJRlQgICAgICAgICAgICAgICAgICAgIDE2CisJLyogaW5kZXggc2l6ZSAtIHdoZW4gbm90IHNldCB0aGUgaW5kaWNlcyBhcmUgYXNzdW1lZCB0byBiZSAxNiBiaXQgKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0lOREVYX1NJWkVfMzJiaXQgICAgICAgICAgICAgICgxPDwxMSkKKwkvKiBudW1iZXIgb2YgdmVydGljZXMgKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX05VTV9WRVJUSUNFU19fU0hJRlQgICAgICAgICAgIDE2CiAKIC8qIEJFR0lOOiBXaWxkIGd1ZXNzZXMgKi8KICNkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMCAgICAgICAgICAgMHgyMDkwCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QT1NfUFJFU0VOVCAgICAgKDE8PDApCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl9QUkVTRU5UICAgKDE8PDEpCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8xX1BSRVNFTlQgKDE8PDIpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8yX1BSRVNFTlQgKDE8PDMpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8zX1BSRVNFTlQgKDE8PDQpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QVF9TSVpFX1BSRVNFTlQgKDE8PDE2KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMV9QUkVTRU5UICgxPDwyKSAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzJfUFJFU0VOVCAoMTw8MykgIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8zX1BSRVNFTlQgKDE8PDQpICAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fUFRfU0laRV9QUkVTRU5UICgxPDwxNikgLyogR1VFU1MgKi8KIAogI2RlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xICAgICAgICAgICAweDIwOTQKKwkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMyBiaXRzIHdpZGUsIHNwZWNpZmllcyBudW1iZXIKKwkgICBvZiBjb21wb25lbnRzICovCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfMF9DT01QX0NOVF9TSElGVCAwCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfMV9DT01QX0NOVF9TSElGVCAzCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfMl9DT01QX0NOVF9TSElGVCA2CkBAIC0xMTIsNyArMTIzLDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF81X0NPTVBfQ05UX1NISUZUIDE1CiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfNl9DT01QX0NOVF9TSElGVCAxOAogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzdfQ09NUF9DTlRfU0hJRlQgMjEKLS8qIEVORCAqLworLyogRU5EOiBXaWxkIGd1ZXNzZXMgKi8KIAogI2RlZmluZSBSMzAwX1NFX1ZURV9DTlRMICAgICAgICAgICAgICAgICAgMHgyMGIwCiAjCWRlZmluZSAgICAgUjMwMF9WUE9SVF9YX1NDQUxFX0VOQSAgICAgICAgICAgICAgICAweDAwMDAwMDAxCkBAIC0xMjgsNDMgKzEzOSw1NCBAQAogIwlkZWZpbmUgICAgIFIzMDBfVlRYX1NUX0RFTk9STUFMSVpFRCAgICAgICAgICAgICAgMHgwMDAwMTAwMAogCiAvKiBCRUdJTjogVmVydGV4IGRhdGEgYXNzZW1ibHkgLSBsb3RzIG9mIHVuY2VydGFpbnRpZXMgKi8KLS8qIGdhcCAqLwotLyogV2hlcmUgZG8gd2UgZ2V0IG91ciB2ZXJ0ZXggZGF0YT8KLS8vCi0vLyBWZXJ0ZXggZGF0YSBlaXRoZXIgY29tZXMgZWl0aGVyIGZyb20gaW1tZWRpYXRlIG1vZGUgcmVnaXN0ZXJzIG9yIGZyb20KLS8vIHZlcnRleCBhcnJheXMuCi0vLyBUaGVyZSBhcHBlYXJzIHRvIGJlIG5vIG1peGVkIG1vZGUgKHRob3VnaCB3ZSBjYW4gZm9yY2UgdGhlIHBpdGNoIG9mCi0vLyB2ZXJ0ZXggYXJyYXlzIHRvIDAsIGVmZmVjdGl2ZWx5IHJldXNpbmcgdGhlIHNhbWUgZWxlbWVudCBvdmVyIGFuZCBvdmVyCi0vLyBhZ2FpbikuCi0vLwotLy8gSW1tZWRpYXRlIG1vZGUgaXMgY29udHJvbGxlZCBieSB0aGUgSU5QVVRfQ05UTCByZWdpc3RlcnMuIEkgYW0gbm90IHN1cmUKLS8vIGlmIHRoZXNlIHJlZ2lzdGVycyBpbmZsdWVuY2UgdmVydGV4IGFycmF5IHByb2Nlc3NpbmcuCi0vLwotLy8gVmVydGV4IGFycmF5cyBhcmUgY29udHJvbGxlZCB2aWEgdGhlIDNEX0xPQURfVkJQTlRSIHBhY2tldDMuCi0vLwotLy8gSW4gYm90aCBjYXNlcywgdmVydGV4IGF0dHJpYnV0ZXMgYXJlIHRoZW4gcGFzc2VkIHRocm91Z2ggSU5QVVRfUk9VVEUuCiAKLS8vIEJlZ2lubmluZyB3aXRoIElOUFVUX1JPVVRFXzBfMCBpcyBhIGxpc3Qgb2YgV09SRHMgdGhhdCByb3V0ZSB2ZXJ0ZXggZGF0YQotLy8gaW50byB0aGUgdmVydGV4IHByb2Nlc3NvcidzIGlucHV0IHJlZ2lzdGVycy4KLS8vIFRoZSBmaXJzdCB3b3JkIHJvdXRlcyB0aGUgZmlyc3QgaW5wdXQsIHRoZSBzZWNvbmQgd29yZCB0aGUgc2Vjb25kLCBldGMuCi0vLyBUaGUgY29ycmVzcG9uZGluZyBpbnB1dCBpcyByb3V0ZWQgaW50byB0aGUgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCi0vLyBUaGUgbGlzdCBpcyBlbmRlZCBieSBhIHdvcmQgd2l0aCBJTlBVVF9ST1VURV9FTkQgc2V0LgotLy8KLS8vIEFsd2F5cyBzZXQgQ09NUE9ORU5UU180IGluIGltbWVkaWF0ZSBtb2RlLiAqLworLyogZ2FwICovCisKKyNkZWZpbmUgUjMwMF9WQVBfQ05UTF9TVEFUVVMgICAgICAgICAgICAgIDB4MjE0MAorIwlkZWZpbmUgUjMwMF9WQ19OT19TV0FQICAgICAgICAgICAgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVkNfMTZCSVRfU1dBUCAgICAgICAgICAgICAgICgxIDw8IDApCisjCWRlZmluZSBSMzAwX1ZDXzMyQklUX1NXQVAgICAgICAgICAgICAgICAoMiA8PCAwKQorIwlkZWZpbmUgUjMwMF9WQVBfVENMX0JZUEFTUwkJKDEgPDwgOCkKKworLyogZ2FwICovCisKKy8qIFdoZXJlIGRvIHdlIGdldCBvdXIgdmVydGV4IGRhdGE/CisgKgorICogVmVydGV4IGRhdGEgZWl0aGVyIGNvbWVzIGVpdGhlciBmcm9tIGltbWVkaWF0ZSBtb2RlIHJlZ2lzdGVycyBvciBmcm9tCisgKiB2ZXJ0ZXggYXJyYXlzLgorICogVGhlcmUgYXBwZWFycyB0byBiZSBubyBtaXhlZCBtb2RlICh0aG91Z2ggd2UgY2FuIGZvcmNlIHRoZSBwaXRjaCBvZgorICogdmVydGV4IGFycmF5cyB0byAwLCBlZmZlY3RpdmVseSByZXVzaW5nIHRoZSBzYW1lIGVsZW1lbnQgb3ZlciBhbmQgb3ZlcgorICogYWdhaW4pLgorICoKKyAqIEltbWVkaWF0ZSBtb2RlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIElOUFVUX0NOVEwgcmVnaXN0ZXJzLiBJIGFtIG5vdCBzdXJlCisgKiBpZiB0aGVzZSByZWdpc3RlcnMgaW5mbHVlbmNlIHZlcnRleCBhcnJheSBwcm9jZXNzaW5nLgorICoKKyAqIFZlcnRleCBhcnJheXMgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSAzRF9MT0FEX1ZCUE5UUiBwYWNrZXQzLgorICoKKyAqIEluIGJvdGggY2FzZXMsIHZlcnRleCBhdHRyaWJ1dGVzIGFyZSB0aGVuIHBhc3NlZCB0aHJvdWdoIElOUFVUX1JPVVRFLgorICoKKyAqIEJlZ2lubmluZyB3aXRoIElOUFVUX1JPVVRFXzBfMCBpcyBhIGxpc3Qgb2YgV09SRHMgdGhhdCByb3V0ZSB2ZXJ0ZXggZGF0YQorICogaW50byB0aGUgdmVydGV4IHByb2Nlc3NvcidzIGlucHV0IHJlZ2lzdGVycy4KKyAqIFRoZSBmaXJzdCB3b3JkIHJvdXRlcyB0aGUgZmlyc3QgaW5wdXQsIHRoZSBzZWNvbmQgd29yZCB0aGUgc2Vjb25kLCBldGMuCisgKiBUaGUgY29ycmVzcG9uZGluZyBpbnB1dCBpcyByb3V0ZWQgaW50byB0aGUgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisgKiBUaGUgbGlzdCBpcyBlbmRlZCBieSBhIHdvcmQgd2l0aCBJTlBVVF9ST1VURV9FTkQgc2V0LgorICoKKyAqIEFsd2F5cyBzZXQgQ09NUE9ORU5UU180IGluIGltbWVkaWF0ZSBtb2RlLgorICovCiAKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8wICAgICAgICAgICAgMHgyMTUwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfMSAgICAgKDAgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU18yICAgICAoMSA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTXzMgICAgICgyIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfNCAgICAgKDMgPDwgMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU19SR0JBICAoNCA8PCAwKQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTX1JHQkEgICg0IDw8IDApIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9JRFhfU0hJRlQgICAgOAotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfSURYX01BU0sgICAgICgzMSA8PCA4KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfSURYX01BU0sgICAgICgzMSA8PCA4KSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfRU5EICAgICAgICAgICgxIDw8IDEzKQotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9JTU1FRElBVEVfTU9ERSAgICgwIDw8IDE0KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVCAgICAgICAgICAgICgxIDw8IDE0KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9VTlNJR05FRF9CWVRFICAgICgyIDw8IDE0KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVF9DT0xPUiAgICAgICgzIDw8IDE0KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9JTU1FRElBVEVfTU9ERSAgICgwIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVCAgICAgICAgICAgICgxIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9VTlNJR05FRF9CWVRFICAgICgyIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVF9DT0xPUiAgICAgICgzIDw8IDE0KSAvKiBHVUVTUyAqLwogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzEgICAgICAgICAgICAweDIxNTQKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8yICAgICAgICAgICAgMHgyMTU4CiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMyAgICAgICAgICAgIDB4MjE1QwpAQCAtMTc0LDEwICsxOTYsMTIgQEAKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF83ICAgICAgICAgICAgMHgyMTZDCiAKIC8qIGdhcCAqLworCiAvKiBOb3RlczoKLS8vICAtIGFsd2F5cyBzZXQgdXAgdG8gcHJvZHVjZSBhdCBsZWFzdCB0d28gYXR0cmlidXRlczoKLS8vICAgIGlmIHZlcnRleCBwcm9ncmFtIHVzZXMgb25seSBwb3NpdGlvbiwgZmdscnggd2lsbCBzZXQgbm9ybWFsLCB0b28KLS8vICAtIElOUFVUX0NOVExfMF9DT0xPUiBhbmQgSU5QVVRfQ05UTF9DT0xPUiBiaXRzIGFyZSBhbHdheXMgZXF1YWwgKi8KKyAqICAtIGFsd2F5cyBzZXQgdXAgdG8gcHJvZHVjZSBhdCBsZWFzdCB0d28gYXR0cmlidXRlczoKKyAqICAgIGlmIHZlcnRleCBwcm9ncmFtIHVzZXMgb25seSBwb3NpdGlvbiwgZmdscnggd2lsbCBzZXQgbm9ybWFsLCB0b28KKyAqICAtIElOUFVUX0NOVExfMF9DT0xPUiBhbmQgSU5QVVRfQ05UTF9DT0xPUiBiaXRzIGFyZSBhbHdheXMgZXF1YWwuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfQ05UTF8wICAgICAgICAgICAgICAgMHgyMTgwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfMF9DT0xPUiAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9DTlRMXzEgICAgICAgICAgICAgICAweDIxODQKQEAgLTE4NiwyMCArMjEwLDIyIEBACiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfQ09MT1IgICAgICAgICAgICAgMHgwMDAwMDAwNAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMCAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzEgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMyICAgICAgICAgICAgICAgMHgwMDAwMTAwMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMyAgICAgICAgICAgICAgIDB4MDAwMDIwMDAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzQgICAgICAgICAgICAgICAweDAwMDA0MDAwCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM1ICAgICAgICAgICAgICAgMHgwMDAwODAwMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNiAgICAgICAgICAgICAgIDB4MDAwMTAwMDAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzcgICAgICAgICAgICAgICAweDAwMDIwMDAwCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMyICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMyAgICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzQgICAgICAgICAgICAgICAweDAwMDA0MDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM1ICAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNiAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzcgICAgICAgICAgICAgICAweDAwMDIwMDAwIC8qIEdVRVNTICovCiAKIC8qIGdhcCAqLworCiAvKiBXb3JkcyBwYXJhbGxlbCB0byBJTlBVVF9ST1VURV8wOyBBbGwgd29yZHMgdGhhdCBhcmUgYWN0aXZlIGluIElOUFVUX1JPVVRFXzAKLS8vIGFyZSBzZXQgdG8gYSBzd2l6emxpbmcgYml0IHBhdHRlcm4sIG90aGVyIHdvcmRzIGFyZSAwLgotLy8KLS8vIEluIGltbWVkaWF0ZSBtb2RlLCB0aGUgcGF0dGVybiBpcyBhbHdheXMgc2V0IHRvIHh5encuIEluIHZlcnRleCBhcnJheQotLy8gbW9kZSwgdGhlIHN3aXp6bGluZyBwYXR0ZXJuIGlzIGUuZy4gdXNlZCB0byBzZXQgencgY29tcG9uZW50cyBpbiB0ZXh0dXJlCi0vLyBjb29yZGluYXRlcyB3aXRoIG9ubHkgdHdlbyBjb21wb25lbnRzLiAqLworICogYXJlIHNldCB0byBhIHN3aXp6bGluZyBiaXQgcGF0dGVybiwgb3RoZXIgd29yZHMgYXJlIDAuCisgKgorICogSW4gaW1tZWRpYXRlIG1vZGUsIHRoZSBwYXR0ZXJuIGlzIGFsd2F5cyBzZXQgdG8geHl6dy4gSW4gdmVydGV4IGFycmF5CisgKiBtb2RlLCB0aGUgc3dpenpsaW5nIHBhdHRlcm4gaXMgZS5nLiB1c2VkIHRvIHNldCB6dyBjb21wb25lbnRzIGluIHRleHR1cmUKKyAqIGNvb3JkaW5hdGVzIHdpdGggb25seSB0d2VvIGNvbXBvbmVudHMuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8wICAgICAgICAgICAgMHgyMUUwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9YICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX1kgICAgMQpAQCAtMjA4LDExICsyMzQsMTEgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX1pFUk8gNAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfT05FICA1CiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9NQVNLIDcKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWF9TSElGVCAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1lfU0hJRlQgICAgICAgICAgMwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9aX1NISUZUICAgICAgICAgIDYKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfV19TSElGVCAgICAgICAgICA5Ci0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0VOQUJMRSAgICAgICAgICAgKDE1IDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9YX1NISUZUICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1lfU0hJRlQgICAgIDMKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWl9TSElGVCAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9XX1NISUZUICAgICA5CisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0VOQUJMRSAgICAgICgxNSA8PCAxMikKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8xICAgICAgICAgICAgMHgyMUU0CiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMiAgICAgICAgICAgIDB4MjFFOAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzMgICAgICAgICAgICAweDIxRUMKQEAgLTIyMSw3OSArMjQ3LDEwNyBAQAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzYgICAgICAgICAgICAweDIxRjgKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV83ICAgICAgICAgICAgMHgyMUZDCiAKLS8qIEVORCAqLworLyogRU5EOiBWZXJ0ZXggZGF0YSBhc3NlbWJseSAqLwogCiAvKiBnYXAgKi8KLS8qIEJFR0lOOiBVcGxvYWQgdmVydGV4IHByb2dyYW0gYW5kIGRhdGEKLS8vIFRoZSBwcm9ncmFtbWFibGUgdmVydGV4IHNoYWRlciB1bml0IGhhcyBhIG1lbW9yeSBiYW5rIG9mIHVua25vd24gc2l6ZQotLy8gdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbiAxNiBieXRlIHVuaXRzIGJ5IHdyaXRpbmcgdGhlIGFkZHJlc3MgaW50bwotLy8gVVBMT0FEX0FERFJFU1MsIGZvbGxvd2VkIGJ5IGRhdGEgaW4gVVBMT0FEX0RBVEEgKG11bHRpcGxlcyBvZiA0IERXT1JEcykuCi0vLwotLy8gUG9pbnRlcnMgaW50byB0aGUgbWVtb3J5IGJhbmsgYXJlIGFsd2F5cyBpbiBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCi0vLwotLy8gVGhlIG1lbW9yeSBiYW5rIGlzIGRpdmlkZWQgaW50byBhcmVhcyB3aXRoIGZpeGVkIG1lYW5pbmcuCi0vLwotLy8gU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUFJPR1JBTTogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb25zLgotLy8gTmF0aXZlIGxpbWl0cyByZXBvcnRlZCBieSBkcml2ZXJzIGZyb20gQVRJIHN1Z2dlc3Qgc2l6ZSAyNTYgKGkuZS4gNEtCKSwKLS8vIHdoZXJlYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCi0vLwotLy8gU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUEFSQU1FVEVSUzogVmVydGV4IHByb2dyYW0gcGFyYW1ldGVycy4KLS8vIE5hdGl2ZSByZXBvcnRlZCBsaW1pdHMgYW5kIHRoZSBWUEkgbGF5b3V0IHN1Z2dlc3Qgc2l6ZSAyNTYsIHdoZXJlYXMKLS8vIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCi0vLwotLy8gQXQgYWRkcmVzcyBVUExPQURfUE9JTlRTSVpFIGlzIGEgdmVjdG9yICgwLCAwLCBwcywgMCksIHdoZXJlIHBzIGlzIHRoZQotLy8gZmxvYXRpbmcgcG9pbnQgcG9pbnRzaXplLiBUaGUgZXhhY3QgcHVycG9zZSBvZiB0aGlzIHN0YXRlIGlzIHVuY2VydGFpbiwKLS8vIGFzIHRoZXJlIGlzIGFsc28gdGhlIFIzMDBfUkVfUE9JTlRTSVpFIHJlZ2lzdGVyLgotLy8KLS8vIE11bHRpcGxlIHZlcnRleCBwcm9ncmFtcyBhbmQgcGFyYW1ldGVyIHNldHMgY2FuIGJlIGxvYWRlZCBhdCBvbmNlLAotLy8gd2hpY2ggY291bGQgZXhwbGFpbiB0aGUgc2l6ZSBkaXNjcmVwYW5jeS4gKi8KKworLyogQkVHSU46IFVwbG9hZCB2ZXJ0ZXggcHJvZ3JhbSBhbmQgZGF0YSAqLworCisvKgorICogVGhlIHByb2dyYW1tYWJsZSB2ZXJ0ZXggc2hhZGVyIHVuaXQgaGFzIGEgbWVtb3J5IGJhbmsgb2YgdW5rbm93biBzaXplCisgKiB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIGluIDE2IGJ5dGUgdW5pdHMgYnkgd3JpdGluZyB0aGUgYWRkcmVzcyBpbnRvCisgKiBVUExPQURfQUREUkVTUywgZm9sbG93ZWQgYnkgZGF0YSBpbiBVUExPQURfREFUQSAobXVsdGlwbGVzIG9mIDQgRFdPUkRzKS4KKyAqCisgKiBQb2ludGVycyBpbnRvIHRoZSBtZW1vcnkgYmFuayBhcmUgYWx3YXlzIGluIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KKyAqCisgKiBUaGUgbWVtb3J5IGJhbmsgaXMgZGl2aWRlZCBpbnRvIGFyZWFzIHdpdGggZml4ZWQgbWVhbmluZy4KKyAqCisgKiBTdGFydGluZyBhdCBhZGRyZXNzIFVQTE9BRF9QUk9HUkFNOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbnMuCisgKiBOYXRpdmUgbGltaXRzIHJlcG9ydGVkIGJ5IGRyaXZlcnMgZnJvbSBBVEkgc3VnZ2VzdCBzaXplIDI1NiAoaS5lLiA0S0IpLAorICogd2hlcmVhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGtub3duIGFkZHJlc3NlcyBzdWdnZXN0cyBzaXplIDUxMi4KKyAqCisgKiBTdGFydGluZyBhdCBhZGRyZXNzIFVQTE9BRF9QQVJBTUVURVJTOiBWZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzLgorICogTmF0aXZlIHJlcG9ydGVkIGxpbWl0cyBhbmQgdGhlIFZQSSBsYXlvdXQgc3VnZ2VzdCBzaXplIDI1Niwgd2hlcmVhcworICogZGlmZmVyZW5jZSBiZXR3ZWVuIGtub3duIGFkZHJlc3NlcyBzdWdnZXN0cyBzaXplIDUxMi4KKyAqCisgKiBBdCBhZGRyZXNzIFVQTE9BRF9QT0lOVFNJWkUgaXMgYSB2ZWN0b3IgKDAsIDAsIHBzLCAwKSwgd2hlcmUgcHMgaXMgdGhlCisgKiBmbG9hdGluZyBwb2ludCBwb2ludHNpemUuIFRoZSBleGFjdCBwdXJwb3NlIG9mIHRoaXMgc3RhdGUgaXMgdW5jZXJ0YWluLAorICogYXMgdGhlcmUgaXMgYWxzbyB0aGUgUjMwMF9SRV9QT0lOVFNJWkUgcmVnaXN0ZXIuCisgKgorICogTXVsdGlwbGUgdmVydGV4IHByb2dyYW1zIGFuZCBwYXJhbWV0ZXIgc2V0cyBjYW4gYmUgbG9hZGVkIGF0IG9uY2UsCisgKiB3aGljaCBjb3VsZCBleHBsYWluIHRoZSBzaXplIGRpc2NyZXBhbmN5LgorICovCiAjZGVmaW5lIFIzMDBfVkFQX1BWU19VUExPQURfQUREUkVTUyAgICAgICAgIDB4MjIwMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfVVBMT0FEX1BST0dSQU0gICAgICAgICAgIDB4MDAwMDAwMDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX1VQTE9BRF9QQVJBTUVURVJTICAgICAgICAweDAwMDAwMjAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUE9JTlRTSVpFICAgICAgICAgMHgwMDAwMDQwNgotLyogZ2FwICovCi0jZGVmaW5lIFIzMDBfVkFQX1BWU19VUExPQURfREFUQSAgICAgICAgICAgIDB4MjIwOAotLyogRU5EICovCiAKIC8qIGdhcCAqLworCisjZGVmaW5lIFIzMDBfVkFQX1BWU19VUExPQURfREFUQSAgICAgICAgICAgIDB4MjIwOAorCisvKiBFTkQ6IFVwbG9hZCB2ZXJ0ZXggcHJvZ3JhbSBhbmQgZGF0YSAqLworCisvKiBnYXAgKi8KKwogLyogSSBkbyBub3Qga25vdyB0aGUgcHVycG9zZSBvZiB0aGlzIHJlZ2lzdGVyLiBIb3dldmVyLCBJIGRvIGtub3cgdGhhdAotLy8gaXQgaXMgc2V0IHRvIDIyMUNfQ0xFQVIgZm9yIGNsZWFyIG9wZXJhdGlvbnMgYW5kIHRvIDIyMUNfTk9STUFMCi0vLyBmb3Igbm9ybWFsIHJlbmRlcmluZy4gKi8KKyAqIGl0IGlzIHNldCB0byAyMjFDX0NMRUFSIGZvciBjbGVhciBvcGVyYXRpb25zIGFuZCB0byAyMjFDX05PUk1BTAorICogZm9yIG5vcm1hbCByZW5kZXJpbmcuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfVU5LTk9XTl8yMjFDICAgICAgICAgICAgICAgMHgyMjFDCiAjICAgICAgIGRlZmluZSBSMzAwXzIyMUNfTk9STUFMICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAogIyAgICAgICBkZWZpbmUgUjMwMF8yMjFDX0NMRUFSICAgICAgICAgICAgICAgICAgIDB4MDAwMUMwMDAKIAorLyogVGhlc2Ugc2VlbSB0byBiZSBwZXItcGl4ZWwgYW5kIHBlci12ZXJ0ZXggWCBhbmQgWSBjbGlwcGluZyBwbGFuZXMuIFRoZSBmaXJzdAorICogcGxhbmUgaXMgcGVyLXBpeGVsIGFuZCB0aGUgc2Vjb25kIHBsYW5lIGlzIHBlci12ZXJ0ZXguCisgKgorICogVGhpcyB3YXMgZGV0ZXJtaW5lZCBieSBleHBlcmltZW50YXRpb24gYWxvbmUgYnV0IEkgYmVsaWV2ZSBpdCBpcyBjb3JyZWN0LgorICoKKyAqIFRoZXNlIHJlZ2lzdGVycyBhcmUgY2FsbGVkIFhfUVVBRDBfMV9GTCB0byBYX1FVQUQwXzRfRkwgYnkgZ2x4dGVzdC4KKyAqLworI2RlZmluZSBSMzAwX1ZBUF9DTElQX1hfMCAgICAgICAgICAgICAgICAgICAweDIyMjAKKyNkZWZpbmUgUjMwMF9WQVBfQ0xJUF9YXzEgICAgICAgICAgICAgICAgICAgMHgyMjI0CisjZGVmaW5lIFIzMDBfVkFQX0NMSVBfWV8wICAgICAgICAgICAgICAgICAgIDB4MjIyOAorI2RlZmluZSBSMzAwX1ZBUF9DTElQX1lfMSAgICAgICAgICAgICAgICAgICAweDIyMzAKKwogLyogZ2FwICovCisKIC8qIFNvbWV0aW1lcywgRU5EX09GX1BLVCBhbmQgMHgyMjg0PTAgYXJlIHRoZSBvbmx5IGNvbW1hbmRzIHNlbnQgYmV0d2VlbgotLy8gcmVuZGVyaW5nIGNvbW1hbmRzIGFuZCBvdmVyd3JpdGluZyB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzLgotLy8gVGhlcmVmb3JlLCBJIHN1c3BlY3Qgd3JpdGluZyB6ZXJvIHRvIDB4MjI4NCBzeW5jaHJvbml6ZXMgdGhlIGVuZ2luZSBhbmQKLS8vIGF2b2lkcyBidWdzIGNhdXNlZCBieSBzdGlsbCBydW5uaW5nIHNoYWRlcnMgcmVhZGluZyBiYWQgZGF0YSBmcm9tIG1lbW9yeS4gKi8KLSNkZWZpbmUgUjMwMF9WQVBfUFZTX1dBSVRJRExFICAgICAgICAgICAgICAgMHgyMjg0CS8qIEdVRVNTICovCisgKiByZW5kZXJpbmcgY29tbWFuZHMgYW5kIG92ZXJ3cml0aW5nIHZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMuCisgKiBUaGVyZWZvcmUsIEkgc3VzcGVjdCB3cml0aW5nIHplcm8gdG8gMHgyMjg0IHN5bmNocm9uaXplcyB0aGUgZW5naW5lIGFuZAorICogYXZvaWRzIGJ1Z3MgY2F1c2VkIGJ5IHN0aWxsIHJ1bm5pbmcgc2hhZGVycyByZWFkaW5nIGJhZCBkYXRhIGZyb20gbWVtb3J5LgorICovCisjZGVmaW5lIFIzMDBfVkFQX1BWU19XQUlUSURMRSAgICAgICAgICAgICAgIDB4MjI4NCAvKiBHVUVTUyAqLwogCiAvKiBBYnNvbHV0ZWx5IG5vIGNsdWUgd2hhdCB0aGlzIHJlZ2lzdGVyIGlzIGFib3V0LiAqLwogI2RlZmluZSBSMzAwX1ZBUF9VTktOT1dOXzIyODggICAgICAgICAgICAgICAweDIyODgKLSMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SMzAwICAgICAgICAgICAgICAgICAgICAweDAwNzUwMDAwCS8qIC0tIG5oICovCi0jICAgICAgIGRlZmluZSBSMzAwXzIyODhfUlYzNTAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgkvKiAtLSBWbGFkaW1pciAqLworIyAgICAgICBkZWZpbmUgUjMwMF8yMjg4X1IzMDAgICAgICAgICAgICAgICAgICAgIDB4MDA3NTAwMDAgLyogLS0gbmggKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SVjM1MCAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGIC8qIC0tIFZsYWRpbWlyICovCiAKIC8qIGdhcCAqLworCiAvKiBBZGRyZXNzZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbiBhcmVhIG9mIHRoZQotLy8gbWVtb3J5IGJhbmsuIFBST0dSQU1fRU5EIHBvaW50cyB0byB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgYWN0aXZlCi0vLyBwcm9ncmFtCi0vLwotLy8gVGhlIG1lYW5pbmcgb2YgdGhlIHR3byBVTktOT1dOIGZpZWxkcyBpcyBvYnZpb3VzbHkgbm90IGtub3duLiBIb3dldmVyLAotLy8gZXhwZXJpbWVudHMgc28gZmFyIGhhdmUgc2hvd24gdGhhdCBib3RoICptdXN0KiBwb2ludCB0byBhbiBpbnN0cnVjdGlvbgotLy8gaW5zaWRlIHRoZSB2ZXJ0ZXggcHJvZ3JhbSwgb3RoZXJ3aXNlIHRoZSBHUFUgbG9ja3MgdXAuCi0vLyBmZ2xyeCB1c3VhbGx5IHNldHMgQ05UTF8zX1VOS05PV04gdG8gdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSBhbmQKLS8vIENOVExfMV9VTktOT1dOIHBvaW50cyB0byBpbnN0cnVjdGlvbiB3aGVyZSBsYXN0IHdyaXRlIHRvIHBvc2l0aW9uIHRha2VzIHBsYWNlLgotLy8gTW9zdCBsaWtlbHkgdGhpcyBpcyB1c2VkIHRvIGlnbm9yZSByZXN0IG9mIHRoZSBwcm9ncmFtIGluIGNhc2VzIHdoZXJlIGdyb3VwIG9mIHZlcnRzIGFyZW50IHZpc2libGUuCi0vLyBGb3Igc29tZSByZWFzb24gdGhpcyAic2VjdGlvbiIgaXMgc29tZXRpbWVzIGFjY2VwdGVkIG90aGVyIGluc3RydWN0aW9uIHRoYXQgaGF2ZQotLy8gbm8gcmVsYXRpb25zaGlwIHdpdGggcG9zaXRpb24gY2FsY3VsYXRpb25zLgotKi8KKyAqIG1lbW9yeSBiYW5rLiBQUk9HUkFNX0VORCBwb2ludHMgdG8gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGFjdGl2ZQorICogcHJvZ3JhbQorICoKKyAqIFRoZSBtZWFuaW5nIG9mIHRoZSB0d28gVU5LTk9XTiBmaWVsZHMgaXMgb2J2aW91c2x5IG5vdCBrbm93bi4gSG93ZXZlciwKKyAqIGV4cGVyaW1lbnRzIHNvIGZhciBoYXZlIHNob3duIHRoYXQgYm90aCAqbXVzdCogcG9pbnQgdG8gYW4gaW5zdHJ1Y3Rpb24KKyAqIGluc2lkZSB0aGUgdmVydGV4IHByb2dyYW0sIG90aGVyd2lzZSB0aGUgR1BVIGxvY2tzIHVwLgorICoKKyAqIGZnbHJ4IHVzdWFsbHkgc2V0cyBDTlRMXzNfVU5LTk9XTiB0byB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIGFuZAorICogUjMwMF9QVlNfQ05UTF8xX1BPU19FTkRfU0hJRlQgcG9pbnRzIHRvIGluc3RydWN0aW9uIHdoZXJlIGxhc3Qgd3JpdGUgdG8KKyAqIHBvc2l0aW9uIHRha2VzIHBsYWNlLgorICoKKyAqIE1vc3QgbGlrZWx5IHRoaXMgaXMgdXNlZCB0byBpZ25vcmUgcmVzdCBvZiB0aGUgcHJvZ3JhbSBpbiBjYXNlcworICogd2hlcmUgZ3JvdXAgb2YgdmVydHMgYXJlbnQgdmlzaWJsZS4gRm9yIHNvbWUgcmVhc29uIHRoaXMgInNlY3Rpb24iCisgKiBpcyBzb21ldGltZXMgYWNjZXB0ZWQgb3RoZXIgaW5zdHJ1Y3Rpb24gdGhhdCBoYXZlIG5vIHJlbGF0aW9uc2hpcCB3aXRoCisgKiBwb3NpdGlvbiBjYWxjdWxhdGlvbnMuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfUFZTX0NOVExfMSAgICAgICAgICAgICAgICAgMHgyMkQwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9TVEFSVF9TSElGVCAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QT1NfRU5EX1NISUZUICAgICAgICAgMTAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QUk9HUkFNX0VORF9TSElGVCAgICAgMjAKLS8qIEFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMgYXJlYS4gKi8KKy8qIEFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdGhlIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzIGFyZWEuICovCiAjZGVmaW5lIFIzMDBfVkFQX1BWU19DTlRMXzIgICAgICAgICAgICAgICAgIDB4MjJENAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8yX1BBUkFNX09GRlNFVF9TSElGVCAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzJfUEFSQU1fQ09VTlRfU0hJRlQgIDE2CkBAIC0zMDIsMjMgKzM1NiwyNiBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8zX1BST0dSQU1fVU5LTk9XTjJfU0hJRlQgMAogCiAvKiBUaGUgZW50aXJlIHJhbmdlIGZyb20gMHgyMzAwIHRvIDB4MkFDIGluY2x1c2l2ZSBzZWVtcyB0byBiZSB1c2VkIGZvcgotLy8gaW1tZWRpYXRlIHZlcnRpY2VzICovCisgKiBpbW1lZGlhdGUgdmVydGljZXMKKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfUiAgICAgICAgICAgICAgICAweDI0NjQKICNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX0cgICAgICAgICAgICAgICAgMHgyNDY4CiAjZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9CICAgICAgICAgICAgICAgIDB4MjQ2QwotI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWF8xICAgICAgICAgICAgICAweDI0OTAJLyogdXNlZCBmb3IgZ2xWZXJ0ZXgyKigpICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9YXzEgICAgICAgICAgICAgIDB4MjQ5MCAvKiB1c2VkIGZvciBnbFZlcnRleDIqKCkgKi8KICNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1lfMSAgICAgICAgICAgICAgMHgyNDk0Ci0jZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9QS0QgICAgICAgICAgICAgIDB4MjQ5QwkvKiBSR0JBICovCi0jZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9YXzIgICAgICAgICAgICAgIDB4MjRBMAkvKiB1c2VkIGZvciBnbFZlcnRleDMqKCkgKi8KKyNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX1BLRCAgICAgICAgICAgICAgMHgyNDlDIC8qIFJHQkEgKi8KKyNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1hfMiAgICAgICAgICAgICAgMHgyNEEwIC8qIHVzZWQgZm9yIGdsVmVydGV4MyooKSAqLwogI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWV8yICAgICAgICAgICAgICAweDI0QTQKICNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1pfMiAgICAgICAgICAgICAgMHgyNEE4Ci0jZGVmaW5lIFIzMDBfVkFQX1ZUWF9FTkRfT0ZfUEtUICAgICAgICAgICAgIDB4MjRBQwkvKiB3cml0ZSAwIHRvIGluZGljYXRlIGVuZCBvZiBwYWNrZXQ/ICovCisvKiB3cml0ZSAwIHRvIGluZGljYXRlIGVuZCBvZiBwYWNrZXQ/ICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9FTkRfT0ZfUEtUICAgICAgICAgICAgIDB4MjRBQwogCiAvKiBnYXAgKi8KIAogLyogVGhlc2UgYXJlIHZhbHVlcyBmcm9tIHIzMDBfcmVnL3IzMDBfcmVnLmggLSB0aGV5IGFyZSBrbm93biB0byBiZSBjb3JyZWN0Ci0gICBhbmQgYXJlIGhlcmUgc28gd2UgY2FuIHVzZSBvbmUgcmVnaXN0ZXIgZmlsZSBpbnN0ZWFkIG9mIHNldmVyYWwKLSAgIC0gVmxhZGltaXIgKi8KKyAqIGFuZCBhcmUgaGVyZSBzbyB3ZSBjYW4gdXNlIG9uZSByZWdpc3RlciBmaWxlIGluc3RlYWQgb2Ygc2V2ZXJhbAorICogLSBWbGFkaW1pcgorICovCiAjZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzAJMHg0MDAwCiAjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8wX19QT1NfUFJFU0VOVAkoMTw8MCkKICMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX0NPTE9SXzBfUFJFU0VOVAkoMTw8MSkKQEAgLTM0MSwxNCArMzk4LDE2IEBACiAjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfN19DT01QX0NOVF9TSElGVAkyMQogCiAvKiBVTkszMCBzZWVtcyB0byBlbmFibGVzIHBvaW50IHRvIHF1YWQgdHJhbnNmb3JtYXRpb24gb24gdGV4dHVyZXMKLSAgIChvciBzb21ldGhpbmcgY2xvc2VseSByZWxhdGVkIHRvIHRoYXQpLgotICAgVGhpcyBiaXQgaXMgcmF0aGVyIGZhdGFsIGF0IHRoZSB0aW1lIGJlaW5nIGR1ZSB0byBsYWNraW5ncyBhdCBwaXhlbCBzaGFkZXIgc2lkZSAqLworICogKG9yIHNvbWV0aGluZyBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhhdCkuCisgKiBUaGlzIGJpdCBpcyByYXRoZXIgZmF0YWwgYXQgdGhlIHRpbWUgYmVpbmcgZHVlIHRvIGxhY2tpbmdzIGF0IHBpeGVsCisgKiBzaGFkZXIgc2lkZQorICovCiAjZGVmaW5lIFIzMDBfR0JfRU5BQkxFCTB4NDAwOAogIwlkZWZpbmUgUjMwMF9HQl9QT0lOVF9TVFVGRl9FTkFCTEUJKDE8PDApCiAjCWRlZmluZSBSMzAwX0dCX0xJTkVfU1RVRkZfRU5BQkxFCSgxPDwxKQogIwlkZWZpbmUgUjMwMF9HQl9UUklBTkdMRV9TVFVGRl9FTkFCTEUJKDE8PDIpCiAjCWRlZmluZSBSMzAwX0dCX1NURU5DSUxfQVVUT19FTkFCTEUJKDE8PDQpCi0jCWRlZmluZSBSMzAwX0dCX1VOSzMwCQkJKDE8PDMwKQorIwlkZWZpbmUgUjMwMF9HQl9VTkszMQkJCSgxPDwzMSkKIAkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMiBiaXRzIHdpZGUgKi8KICNkZWZpbmUgUjMwMF9HQl9URVhfUkVQTElDQVRFCTAKICNkZWZpbmUgUjMwMF9HQl9URVhfU1QJCTEKQEAgLTM4MywxMSArNDQyLDEzIEBACiAjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNfWTVfU0hJRlQJMjAKICMJZGVmaW5lIFIzMDBfR0JfTVNQT1MxX19NU0JEMQkJMjQKIAorCiAjZGVmaW5lIFIzMDBfR0JfVElMRV9DT05GSUcJMHg0MDE4CiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfRU5BQkxFCSgxPDwwKQogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUlYzMDAJMAogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUjMwMAkoMzw8MSkKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1I0MjAJKDc8PDEpCisjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SVjQxMAkoMzw8MSkKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzgJCTAKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzE2CQkoMTw8NCkKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzMyCQkoMjw8NCkKQEAgLTQ0MiwxNyArNTAzLDE4IEBACiAjCWRlZmluZSBSMzAwX0dCX1dfU0VMRUNUXzEJCSgxPDw0KQogCiAjZGVmaW5lIFIzMDBfR0JfQUFfQ09ORklHCQkweDQwMjAKKyMJZGVmaW5lIFIzMDBfQUFfRElTQUJMRQkJCTB4MDAKICMJZGVmaW5lIFIzMDBfQUFfRU5BQkxFCQkJMHgwMQogIwlkZWZpbmUgUjMwMF9BQV9TVUJTQU1QTEVTXzIJCTAKICMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU18zCQkoMTw8MSkKICMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU180CQkoMjw8MSkKICMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU182CQkoMzw8MSkKIAotLyogRU5EICovCi0KIC8qIGdhcCAqLworCiAvKiBaZXJvIHRvIGZsdXNoIGNhY2hlcy4gKi8KICNkZWZpbmUgUjMwMF9UWF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAwCisjZGVmaW5lIFIzMDBfVFhfRkxVU0ggICAgICAgICAgICAgICAgICAgICAgIDB4MAogCiAvKiBUaGUgdXBwZXIgZW5hYmxlIGJpdHMgYXJlIGd1ZXNzZWQsIGJhc2VkIG9uIGZnbHJ4IHJlcG9ydGVkIGxpbWl0cy4gKi8KICNkZWZpbmUgUjMwMF9UWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHg0MTA0CkBAIC00NzQsMjQgKzUzNiwyNSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTUgICAgICAgICAgICAgICAgICgxIDw8IDE1KQogCiAvKiBUaGUgcG9pbnRzaXplIGlzIGdpdmVuIGluIG11bHRpcGxlcyBvZiA2LiBUaGUgcG9pbnRzaXplIGNhbiBiZQotLy8gZW5vcm1vdXM6IENsZWFyKCkgcmVuZGVycyBhIHNpbmdsZSBwb2ludCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUKLS8vIGZyYW1lYnVmZmVyLiAqLworICogZW5vcm1vdXM6IENsZWFyKCkgcmVuZGVycyBhIHNpbmdsZSBwb2ludCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUKKyAqIGZyYW1lYnVmZmVyLgorICovCiAjZGVmaW5lIFIzMDBfUkVfUE9JTlRTSVpFICAgICAgICAgICAgICAgICAgIDB4NDIxQwogIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWV9TSElGVCAgICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1lfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDApCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9ZX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWF9TSElGVCAgICAgICAgICAgIDE2Ci0jICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9YX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAxNikJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1hfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDE2KSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfTUFYICAgICAgICAgICAgIChSMzAwX1BPSU5UU0laRV9ZX01BU0sgLyA2KQogCiAvKiBUaGUgbGluZSB3aWR0aCBpcyBnaXZlbiBpbiBtdWx0aXBsZXMgb2YgNi4KLSAgIEluIGRlZmF1bHQgbW9kZSBsaW5lcyBhcmUgY2xhc3NpZmllZCBhcyB2ZXJ0aWNhbCBsaW5lcy4KLSAgIEhPOiBob3Jpem9udGFsCi0gICBWRTogdmVydGljYWwgb3IgaG9yaXpvbnRhbAotICAgSE8gJiBWRTogbm8gY2xhc3NpZmljYXRpb24KLSovCisgKiBJbiBkZWZhdWx0IG1vZGUgbGluZXMgYXJlIGNsYXNzaWZpZWQgYXMgdmVydGljYWwgbGluZXMuCisgKiBITzogaG9yaXpvbnRhbAorICogVkU6IHZlcnRpY2FsIG9yIGhvcml6b250YWwKKyAqIEhPICYgVkU6IG5vIGNsYXNzaWZpY2F0aW9uCisgKi8KICNkZWZpbmUgUjMwMF9SRV9MSU5FX0NOVCAgICAgICAgICAgICAgICAgICAgICAweDQyMzQKICMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfU0hJRlQgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0xJTkVTSVpFX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMCkgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfTUFYICAgICAgICAgICAgIChSMzAwX0xJTkVTSVpFX01BU0sgLyA2KQogIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FX0NOVF9ITyAgICAgICAgICAgICAgICgxIDw8IDE2KQogIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FX0NOVF9WRSAgICAgICAgICAgICAgICgxIDw8IDE3KQpAQCAtNDk5LDYgKzU2Miw5IEBACiAvKiBTb21lIHNvcnQgb2Ygc2NhbGUgb3IgY2xhbXAgdmFsdWUgZm9yIHRleGNvb3JkbGVzcyB0ZXh0dXJlcy4gKi8KICNkZWZpbmUgUjMwMF9SRV9VTks0MjM4ICAgICAgICAgICAgICAgICAgICAgICAweDQyMzgKIAorLyogU29tZXRoaW5nIHNoYWRlIHJlbGF0ZWQgKi8KKyNkZWZpbmUgUjMwMF9SRV9TSEFERSAgICAgICAgICAgICAgICAgICAgICAgICAweDQyNzQKKwogI2RlZmluZSBSMzAwX1JFX1NIQURFX01PREVMICAgICAgICAgICAgICAgICAgIDB4NDI3OAogIwlkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTF9TTU9PVEggICAgIDB4M2FhYWEKICMJZGVmaW5lIFIzMDBfUkVfU0hBREVfTU9ERUxfRkxBVCAgICAgICAweDM5NTk1CkBAIC01MTMsMjQgKzU3OSwzMSBAQAogIwlkZWZpbmUgUjMwMF9QTV9CQUNLX0xJTkUgICAgICAgICAgICAgICgxIDw8IDcpCiAjCWRlZmluZSBSMzAwX1BNX0JBQ0tfRklMTCAgICAgICAgICAgICAgKDEgPDwgOCkKIAorLyogRm9nIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgUjMwMF9SRV9GT0dfU0NBTEUgICAgICAgICAgICAgICAgICAgICAweDQyOTQKKyNkZWZpbmUgUjMwMF9SRV9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDQyOTgKKwogLyogTm90IHN1cmUgd2h5IHRoZXJlIGFyZSBkdXBsaWNhdGUgb2YgZmFjdG9yIGFuZCBjb25zdGFudCB2YWx1ZXMuCi0gICBNeSBiZXN0IGd1ZXNzIHNvIGZhciBpcyB0aGF0IHRoZXJlIGFyZSBzZXBlcmF0ZSB6Ymlhc2VzIGZvciB0ZXN0IGFuZCB3cml0ZS4KLSAgIE9yZGVyaW5nIG1pZ2h0IGJlIHdyb25nLgotICAgU29tZSBvZiB0aGUgdGVzdHMgaW5kaWNhdGUgdGhhdCBmZ2wgaGFzIGEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgemJpYXMKLSAgIHZpYSBwaXhlbCBzaGFkZXJzLiAqLworICogTXkgYmVzdCBndWVzcyBzbyBmYXIgaXMgdGhhdCB0aGVyZSBhcmUgc2VwZXJhdGUgemJpYXNlcyBmb3IgdGVzdCBhbmQgd3JpdGUuCisgKiBPcmRlcmluZyBtaWdodCBiZSB3cm9uZy4KKyAqIFNvbWUgb2YgdGhlIHRlc3RzIGluZGljYXRlIHRoYXQgZmdsIGhhcyBhIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIHpiaWFzCisgKiB2aWEgcGl4ZWwgc2hhZGVycy4KKyAqLworI2RlZmluZSBSMzAwX1JFX1pCSUFTX0NOVEwgICAgICAgICAgICAgICAgICAgIDB4NDJBMCAvKiBHVUVTUyAqLwogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1RfRkFDVE9SICAgICAgICAgICAgICAgIDB4NDJBNAogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1RfQ09OU1RBTlQgICAgICAgICAgICAgIDB4NDJBOAogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1dfRkFDVE9SICAgICAgICAgICAgICAgIDB4NDJBQwogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1dfQ09OU1RBTlQgICAgICAgICAgICAgIDB4NDJCMAogCiAvKiBUaGlzIHJlZ2lzdGVyIG5lZWRzIHRvIGJlIHNldCB0byAoMTw8MSkgZm9yIFJWMzUwIHRvIGNvcnJlY3RseQotICAgcGVyZm9ybSBkZXB0aCB0ZXN0IChzZWUgLS12Yi10cmlhbmdsZXMgaW4gcjMwMF9kZW1vKQotICAgRG9uJ3Qga25vdyBhYm91dCBvdGhlciBjaGlwcy4gLSBWbGFkaW1pcgotICAgVGhpcyBpcyBzZXQgdG8gMyB3aGVuIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgaXMgb24uCi0gICBNeSBndWVzcyBpcyB0aGF0IHRoZXJlIGFyZSB0d28gYml0cyBmb3IgZWFjaCB6YmlhcyBwcmltaXRpdmUgKEZJTEwsIExJTkUsIFBPSU5UKS4KLSAgIE9uZSB0byBlbmFibGUgZGVwdGggdGVzdCBhbmQgb25lIGZvciBkZXB0aCB3cml0ZS4KLSAgIFlldCB0aGlzIGRvZXNudCBleHBsYWluIHdoeSBkZXB0aCB3cml0ZXMgd29yayAuLi4KLSAgICAqLworICogcGVyZm9ybSBkZXB0aCB0ZXN0IChzZWUgLS12Yi10cmlhbmdsZXMgaW4gcjMwMF9kZW1vKQorICogRG9uJ3Qga25vdyBhYm91dCBvdGhlciBjaGlwcy4gLSBWbGFkaW1pcgorICogVGhpcyBpcyBzZXQgdG8gMyB3aGVuIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgaXMgb24uCisgKiBNeSBndWVzcyBpcyB0aGF0IHRoZXJlIGFyZSB0d28gYml0cyBmb3IgZWFjaCB6YmlhcyBwcmltaXRpdmUKKyAqIChGSUxMLCBMSU5FLCBQT0lOVCkuCisgKiAgT25lIHRvIGVuYWJsZSBkZXB0aCB0ZXN0IGFuZCBvbmUgZm9yIGRlcHRoIHdyaXRlLgorICogWWV0IHRoaXMgZG9lc250IGV4cGxhaW4gd2h5IGRlcHRoIHdyaXRlcyB3b3JrIC4uLgorICovCiAjZGVmaW5lIFIzMDBfUkVfT0NDTFVTSU9OX0NOVEwJCSAgICAweDQyQjQKICMJZGVmaW5lIFIzMDBfT0NDTFVTSU9OX09OCQkoMTw8MSkKIApAQCAtNTQwLDMwICs2MTMsMzggQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlJPTlRfRkFDRV9DQ1cgICAgICAgICAgICAgICAoMCA8PCAyKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUk9OVF9GQUNFX0NXICAgICAgICAgICAgICAgICgxIDw8IDIpCiAKLS8qIEJFR0lOOiBSYXN0ZXJpemF0aW9uIC8gSW50ZXJwb2xhdG9ycyAtIG1hbnkgZ3Vlc3NlcwotLy8gMF9VTktOT1dOXzE4IGhhcyBhbHdheXMgYmVlbiBzZXQgZXhjZXB0IGZvciBjbGVhciBvcGVyYXRpb25zLgotLy8gVENfQ05UIGlzIHRoZSBudW1iZXIgb2YgaW5jb21pbmcgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgKGkuZS4gaXQgZGVwZW5kcwotLy8gb24gdGhlIHZlcnRleCBwcm9ncmFtLCAqbm90KiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSkgKi8KKworLyogQkVHSU46IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzICovCisKKy8qIDBfVU5LTk9XTl8xOCBoYXMgYWx3YXlzIGJlZW4gc2V0IGV4Y2VwdCBmb3IgY2xlYXIgb3BlcmF0aW9ucy4KKyAqIFRDX0NOVCBpcyB0aGUgbnVtYmVyIG9mIGluY29taW5nIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIChpLmUuIGl0IGRlcGVuZHMKKyAqIG9uIHRoZSB2ZXJ0ZXggcHJvZ3JhbSwgKm5vdCogdGhlIGZyYWdtZW50IHByb2dyYW0pCisgKi8KICNkZWZpbmUgUjMwMF9SU19DTlRMXzAgICAgICAgICAgICAgICAgICAgICAgMHg0MzAwCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfVENfQ05UX1NISUZUICAgICAgICAgMgogIyAgICAgICBkZWZpbmUgUjMwMF9SU19DTlRMX1RDX0NOVF9NQVNLICAgICAgICAgICg3IDw8IDIpCi0jCQlkZWZpbmUgUjMwMF9SU19DTlRMX0NJX0NOVF9TSElGVCAgICAgICAgIDcJLyogbnVtYmVyIG9mIGNvbG9yIGludGVycG9sYXRvcnMgdXNlZCAqLworCS8qIG51bWJlciBvZiBjb2xvciBpbnRlcnBvbGF0b3JzIHVzZWQgKi8KKyMJZGVmaW5lIFIzMDBfUlNfQ05UTF9DSV9DTlRfU0hJRlQgICAgICAgICA3CiAjICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfMF9VTktOT1dOXzE4ICAgICAgICAgKDEgPDwgMTgpCi0vKiBHdWVzczogUlNfQ05UTF8xIGhvbGRzIHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCB1c2VkIFJTX1JPVVRFX24gcmVnaXN0ZXIuICovCisJLyogR3Vlc3M6IFJTX0NOVExfMSBob2xkcyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCBSU19ST1VURV9uCisJICAgcmVnaXN0ZXIuICovCiAjZGVmaW5lIFIzMDBfUlNfQ05UTF8xICAgICAgICAgICAgICAgICAgICAgIDB4NDMwNAogCiAvKiBnYXAgKi8KKwogLyogT25seSB1c2VkIGZvciB0ZXh0dXJlIGNvb3JkaW5hdGVzLgotLy8gVXNlIHRoZSBzb3VyY2UgZmllbGQgdG8gcm91dGUgdGV4dHVyZSBjb29yZGluYXRlIGlucHV0IGZyb20gdGhlIHZlcnRleCBwcm9ncmFtCi0vLyB0byB0aGUgZGVzaXJlZCBpbnRlcnBvbGF0b3IuIE5vdGUgdGhhdCB0aGUgc291cmNlIGZpZWxkIGlzIHJlbGF0aXZlIHRvIHRoZQotLy8gb3V0cHV0cyB0aGUgdmVydGV4IHByb2dyYW0gKmFjdHVhbGx5KiB3cml0ZXMuIElmIGEgdmVydGV4IHByb2dyYW0gb25seSB3cml0ZXMKLS8vIHRleGNvb3JkWzFdLCB0aGlzIHdpbGwgYmUgc291cmNlIGluZGV4IDAuCi0vLyBTZXQgSU5URVJQX1VTRUQgb24gYWxsIGludGVycG9sYXRvcnMgdGhhdCBwcm9kdWNlIGRhdGEgdXNlZCBieSB0aGUKLS8vIGZyYWdtZW50IHByb2dyYW0uIElOVEVSUF9VU0VEIGxvb2tzIGxpa2UgYSBzd2l6emxpbmcgbWFzaywgYnV0Ci0vLyBJIGhhdmVuJ3Qgc2VlbiBpdCB1c2VkIHRoYXQgd2F5LgotLy8KLS8vIE5vdGU6IFRoZSBfVU5LTk9XTiBjb25zdGFudHMgYXJlIGFsd2F5cyBzZXQgaW4gdGhlaXIgcmVzcGVjdGl2ZSByZWdpc3Rlci4KLS8vIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lY2Vzc2FyeS4gKi8KKyAqIFVzZSB0aGUgc291cmNlIGZpZWxkIHRvIHJvdXRlIHRleHR1cmUgY29vcmRpbmF0ZSBpbnB1dCBmcm9tIHRoZQorICogdmVydGV4IHByb2dyYW0gdG8gdGhlIGRlc2lyZWQgaW50ZXJwb2xhdG9yLiBOb3RlIHRoYXQgdGhlIHNvdXJjZQorICogZmllbGQgaXMgcmVsYXRpdmUgdG8gdGhlIG91dHB1dHMgdGhlIHZlcnRleCBwcm9ncmFtICphY3R1YWxseSoKKyAqIHdyaXRlcy4gSWYgYSB2ZXJ0ZXggcHJvZ3JhbSBvbmx5IHdyaXRlcyB0ZXhjb29yZFsxXSwgdGhpcyB3aWxsCisgKiBiZSBzb3VyY2UgaW5kZXggMC4KKyAqIFNldCBJTlRFUlBfVVNFRCBvbiBhbGwgaW50ZXJwb2xhdG9ycyB0aGF0IHByb2R1Y2UgZGF0YSB1c2VkIGJ5CisgKiB0aGUgZnJhZ21lbnQgcHJvZ3JhbS4gSU5URVJQX1VTRUQgbG9va3MgbGlrZSBhIHN3aXp6bGluZyBtYXNrLAorICogYnV0IEkgaGF2ZW4ndCBzZWVuIGl0IHVzZWQgdGhhdCB3YXkuCisgKgorICogTm90ZTogVGhlIF9VTktOT1dOIGNvbnN0YW50cyBhcmUgYWx3YXlzIHNldCBpbiB0aGVpciByZXNwZWN0aXZlCisgKiByZWdpc3Rlci4gSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgbmVjZXNzYXJ5LgorICovCiAjZGVmaW5lIFIzMDBfUlNfSU5URVJQXzAgICAgICAgICAgICAgICAgICAgIDB4NDMxMAogI2RlZmluZSBSMzAwX1JTX0lOVEVSUF8xICAgICAgICAgICAgICAgICAgICAweDQzMTQKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQXzFfVU5LTk9XTiAgICAgICAgICAweDQwCkBAIC01ODAsNTQgKzY2MSw2MyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9SU19JTlRFUlBfVVNFRCAgICAgICAgICAgICAgIDB4MDBEMTAwMDAKIAogLyogVGhlc2UgRFdPUkRzIGNvbnRyb2wgaG93IHZlcnRleCBkYXRhIGlzIHJvdXRlZCBpbnRvIGZyYWdtZW50IHByb2dyYW0KLS8vIHJlZ2lzdGVycywgYWZ0ZXIgaW50ZXJwb2xhdG9ycy4gKi8KKyAqIHJlZ2lzdGVycywgYWZ0ZXIgaW50ZXJwb2xhdG9ycy4KKyAqLwogI2RlZmluZSBSMzAwX1JTX1JPVVRFXzAgICAgICAgICAgICAgICAgICAgICAweDQzMzAKICNkZWZpbmUgUjMwMF9SU19ST1VURV8xICAgICAgICAgICAgICAgICAgICAgMHg0MzM0CiAjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMiAgICAgICAgICAgICAgICAgICAgIDB4NDMzOAotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzMgICAgICAgICAgICAgICAgICAgICAweDQzM0MJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SU19ST1VURV80ICAgICAgICAgICAgICAgICAgICAgMHg0MzQwCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfNSAgICAgICAgICAgICAgICAgICAgIDB4NDM0NAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzYgICAgICAgICAgICAgICAgICAgICAweDQzNDgJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SU19ST1VURV83ICAgICAgICAgICAgICAgICAgICAgMHg0MzRDCS8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMyAgICAgICAgICAgICAgICAgICAgIDB4NDMzQyAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzQgICAgICAgICAgICAgICAgICAgICAweDQzNDAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SU19ST1VURV81ICAgICAgICAgICAgICAgICAgICAgMHg0MzQ0IC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfNiAgICAgICAgICAgICAgICAgICAgIDB4NDM0OCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzcgICAgICAgICAgICAgICAgICAgICAweDQzNEMgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8wICAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfMSAgICAgMQogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzIgICAgIDIKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8zICAgICAzCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNCAgICAgNAotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzUgICAgIDUJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF82ICAgICA2CS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNyAgICAgNwkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9FTkFCTEUgICAgICAgICAgICAgICgxIDw8IDMpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNSAgICAgNSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzYgICAgIDYgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF83ICAgICA3IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0VOQUJMRSAgICAgICAgICAgICAgKDEgPDwgMykgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfREVTVF9TSElGVCAgICAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0RFU1RfTUFTSyAgICAgICAgICAgKDMxIDw8IDYpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0RFU1RfTUFTSyAgICAgICAgICAgKDMxIDw8IDYpIC8qIEdVRVNTICovCiAKIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbG9yOiBXaGVuIHRoZSBmcmFnbWVudCBwcm9ncmFtIHVzZXMgY29sb3IsCi0vLyB0aGUgUk9VVEVfMF9DT0xPUiBiaXQgaXMgc2V0IGFuZCBST1VURV8wX0NPTE9SX0RFU1QgY29udGFpbnMgdGhlCi0vLyBjb2xvciByZWdpc3RlciBpbmRleC4gKi8KKyAqIHRoZSBST1VURV8wX0NPTE9SIGJpdCBpcyBzZXQgYW5kIFJPVVRFXzBfQ09MT1JfREVTVCBjb250YWlucyB0aGUKKyAqIGNvbG9yIHJlZ2lzdGVyIGluZGV4LgorICoKKyAqIEFwcGVyZW50bHkgeW91IG1heSBzZXQgdGhlIFIzMDBfUlNfUk9VVEVfMF9DT0xPUiBiaXQsIGJ1dCBub3QgcHJvdmlkZSBhbnkKKyAqIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUIHZhbHVlOyB0aGlzIHNldHVwIGlzIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBzdGF0ZS4KKyAqIFNlZSByMzAwX2lvY3RsLmM6cjMwMEVtaXRDbGVhclN0YXRlLiBJJ20gbm90IHN1cmUgaWYgdGhpcyBzZXR1cCBpcyBzdHJpY3RseQorICogY29ycmVjdCBvciBub3QuIC0gT2xpdmVyLgorICovCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1IgICAgICAgICAgICAgKDEgPDwgMTQpCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9TSElGVCAgMTcKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUX01BU0sgICAoMzEgPDwgMTcpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9NQVNLICAgKDMxIDw8IDE3KSAvKiBHVUVTUyAqLwogLyogQXMgYWJvdmUsIGJ1dCBmb3Igc2Vjb25kYXJ5IGNvbG9yICovCiAjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMSAgICAgICAgICAgICgxIDw8IDE0KQogIwkJZGVmaW5lIFIzMDBfUlNfUk9VVEVfMV9DT0xPUjFfREVTVF9TSElGVCAxNwogIwkJZGVmaW5lIFIzMDBfUlNfUk9VVEVfMV9DT0xPUjFfREVTVF9NQVNLICAoMzEgPDwgMTcpCiAjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX1VOS05PV04xMSAgICAgICAgICgxIDw8IDExKQotLyogRU5EICovCisvKiBFTkQ6IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzICovCiAKLS8qIEJFR0lOOiBTY2lzc29ycyBhbmQgY2xpcHJlY3RzCi0vLyBUaGVyZSBhcmUgZm91ciBjbGlwcGluZyByZWN0YW5nbGVzLiBUaGVpciBjb3JuZXIgY29vcmRpbmF0ZXMgYXJlIGluY2x1c2l2ZS4KLS8vIEV2ZXJ5IHBpeGVsIGlzIGFzc2lnbmVkIGEgbnVtYmVyIGZyb20gMCBhbmQgMTUgYnkgc2V0dGluZyBiaXRzIDAtMyBkZXBlbmRpbmcKLS8vIG9uIHdoZXRoZXIgdGhlIHBpeGVsIGlzIGluc2lkZSBjbGlwcmVjdHMgMC0zLCByZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLAotLy8gaWYgYSBwaXhlbCBpcyBpbnNpZGUgY2xpcHJlY3RzIDAgYW5kIDEsIGJ1dCBvdXRzaWRlIDIgYW5kIDMsIGl0IGlzIGFzc2lnbmVkCi0vLyB0aGUgbnVtYmVyIDMgKGJpbmFyeSAwMDExKS4KLS8vIElmZiB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsJ3MgbnVtYmVyIGluIFJFX0NMSVBSRUNUX0NOVEwgaXMgc2V0LAotLy8gdGhlIHBpeGVsIGlzIHJhc3Rlcml6ZWQuCi0vLwotLy8gSW4gYWRkaXRpb24gdG8gdGhpcywgdGhlcmUgaXMgYSBzY2lzc29ycyByZWN0YW5nbGUuIE9ubHkgcGl4ZWxzIGluc2lkZSB0aGUKLS8vIHNjaXNzb3JzIHJlY3RhbmdsZSBhcmUgZHJhd24uIChjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlKQotLy8KLS8vIEZvciBzb21lIHJlYXNvbiwgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWVidWZmZXIgaXMgYXQgKDE0NDAsIDE0NDApCi0vLyBmb3IgdGhlIHB1cnBvc2Ugb2YgY2xpcHBpbmcgYW5kIHNjaXNzb3JzLiAqLworLyogQkVHSU46IFNjaXNzb3JzIGFuZCBjbGlwcmVjdHMgKi8KKworLyogVGhlcmUgYXJlIGZvdXIgY2xpcHBpbmcgcmVjdGFuZ2xlcy4gVGhlaXIgY29ybmVyIGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUuCisgKiBFdmVyeSBwaXhlbCBpcyBhc3NpZ25lZCBhIG51bWJlciBmcm9tIDAgYW5kIDE1IGJ5IHNldHRpbmcgYml0cyAwLTMgZGVwZW5kaW5nCisgKiBvbiB3aGV0aGVyIHRoZSBwaXhlbCBpcyBpbnNpZGUgY2xpcHJlY3RzIDAtMywgcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZSwKKyAqIGlmIGEgcGl4ZWwgaXMgaW5zaWRlIGNsaXByZWN0cyAwIGFuZCAxLCBidXQgb3V0c2lkZSAyIGFuZCAzLCBpdCBpcyBhc3NpZ25lZAorICogdGhlIG51bWJlciAzIChiaW5hcnkgMDAxMSkuCisgKiBJZmYgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbCdzIG51bWJlciBpbiBSRV9DTElQUkVDVF9DTlRMIGlzIHNldCwKKyAqIHRoZSBwaXhlbCBpcyByYXN0ZXJpemVkLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoaXMsIHRoZXJlIGlzIGEgc2Npc3NvcnMgcmVjdGFuZ2xlLiBPbmx5IHBpeGVscyBpbnNpZGUgdGhlCisgKiBzY2lzc29ycyByZWN0YW5nbGUgYXJlIGRyYXduLiAoY29vcmRpbmF0ZXMgYXJlIGluY2x1c2l2ZSkKKyAqCisgKiBGb3Igc29tZSByZWFzb24sIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lYnVmZmVyIGlzIGF0ICgxNDQwLCAxNDQwKQorICogZm9yIHRoZSBwdXJwb3NlIG9mIGNsaXBwaW5nIGFuZCBzY2lzc29ycy4KKyAqLwogI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX1RMXzAgICAgICAgICAgICAgICAweDQzQjAKICNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9CUl8wICAgICAgICAgICAgICAgMHg0M0I0CiAjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfVExfMSAgICAgICAgICAgICAgIDB4NDNCOApAQCAtNjYxLDYgKzc1MSw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzIxMCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpCiAKIC8qIGdhcCAqLworCiAjZGVmaW5lIFIzMDBfUkVfU0NJU1NPUlNfVEwgICAgICAgICAgICAgICAgIDB4NDNFMAogI2RlZmluZSBSMzAwX1JFX1NDSVNTT1JTX0JSICAgICAgICAgICAgICAgICAweDQzRTQKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfT0ZGU0VUICAgICAgICAgICAgICAxNDQwCkBAIC02NjgsMTIgKzc1OSwxNSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19YX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfWV9TSElGVCAgICAgICAgICAgICAxMwogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19ZX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMTMpCi0vKiBFTkQgKi8KKy8qIEVORDogU2Npc3NvcnMgYW5kIGNsaXByZWN0cyAqLwogCi0vKiBCRUdJTjogVGV4dHVyZSBzcGVjaWZpY2F0aW9uCi0vLyBUaGUgdGV4dHVyZSBzcGVjaWZpY2F0aW9uIGR3b3JkcyBhcmUgZ3JvdXBlZCBieSBtZWFuaW5nIGFuZCBub3QgYnkgdGV4dHVyZSB1bml0LgotLy8gVGhpcyBtZWFucyB0aGF0IGUuZy4gdGhlIG9mZnNldCBmb3IgdGV4dHVyZSBpbWFnZSB1bml0IE4gaXMgZm91bmQgaW4gcmVnaXN0ZXIKLS8vIFRYX09GRlNFVF8wICsgKDQqTikgKi8KKy8qIEJFR0lOOiBUZXh0dXJlIHNwZWNpZmljYXRpb24gKi8KKworLyoKKyAqIFRoZSB0ZXh0dXJlIHNwZWNpZmljYXRpb24gZHdvcmRzIGFyZSBncm91cGVkIGJ5IG1lYW5pbmcgYW5kIG5vdCBieSB0ZXh0dXJlCisgKiB1bml0LiBUaGlzIG1lYW5zIHRoYXQgZS5nLiB0aGUgb2Zmc2V0IGZvciB0ZXh0dXJlIGltYWdlIHVuaXQgTiBpcyBmb3VuZCBpbgorICogcmVnaXN0ZXIgVFhfT0ZGU0VUXzAgKyAoNCpOKQorICovCiAjZGVmaW5lIFIzMDBfVFhfRklMVEVSXzAgICAgICAgICAgICAgICAgICAgIDB4NDQwMAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9SRVBFQVQgICAgICAgICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUlSUk9SRUQgICAgICAgICAgICAgICAgICAxCkBAIC02OTcsMTMgKzc5MSwxNCBAQAogIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUl9NSVBfTElORUFSICAgICAgICAgKDEwIDw8ICAxMSkKIAogLyogTk9URTogTkVBUkVTVCBkb2VzbnQgc2VlbSB0byBleGlzdC4KLSAgIEltIG5vdCBzZXRpbmcgTUFHX0ZJTFRFUl9NQVNLIGFuZCAoMyA8PCAxMSkgb24gZm9yIGFsbAotICAgYW5pc290cm9weSBtb2RlcyBiZWNhdXNlIHRoYXQgd291bGQgdm9pZCBzZWxlY3RlZCBtYWcgZmlsdGVyICovCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVCAgICAgICAgICAgICAoKDAgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19MSU5FQVIgICAgICAgICAgICAgICgoMCA8PCAxMykgLyp8UjMwMF9UWF9NQUdfRklMVEVSX01BU0t8KDM8PDExKSovKQotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX05FQVJFU1QgKCgxIDw8IDEzKSAvKnxSMzAwX1RYX01BR19GSUxURVJfTUFTS3woMzw8MTEpKi8pCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVF9NSVBfTElORUFSICAoKDIgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NQVNLICAgICAgICAgICAoICgxNSA8PCAxMSkgfCAoMyA8PCAxMykgKQorICogSW0gbm90IHNldGluZyBNQUdfRklMVEVSX01BU0sgYW5kICgzIDw8IDExKSBvbiBmb3IgYWxsCisgKiBhbmlzb3Ryb3B5IG1vZGVzIGJlY2F1c2UgdGhhdCB3b3VsZCB2b2lkIHNlbGVjdGVkIG1hZyBmaWx0ZXIKKyAqLworIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1QgICAgICAgICAgICAgKDAgPDwgMTMpCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTElORUFSICAgICAgICAgICAgICAoMCA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUX01JUF9ORUFSRVNUICgxIDw8IDEzKQorIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX0xJTkVBUiAgKDIgPDwgMTMpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfTUFTSyAgICggKDE1IDw8IDExKSB8ICgzIDw8IDEzKSApCiAjCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT18xX1RPXzEgICgwIDw8IDIxKQogIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fMl9UT18xICAoMiA8PCAyMSkKICMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzRfVE9fMSAgKDQgPDwgMjEpCkBAIC03MzQsMTAgKzgyOSwxMCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9IRUlHSFRNQVNLX1NISUZUICAgICAgICAgIDExCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0hFSUdIVE1BU0tfTUFTSyAgICAgICAgICAgKDIwNDcgPDwgMTEpCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX1VOSzIzICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjMpCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfU0hJRlQgICAgICAgICAgICAgICAgMjYJLyogbGFyZ2VzdCBvZiB3aWR0aCwgaGVpZ2h0ICovCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAgKDE1IDw8IDI2KQotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9TSVpFX1BST0pFQ1RFRCAgICAgICAgICAgICAgICAgICAgICgxPDwzMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9UWFBJVENIX0VOICAgICAgICAgICAgICAgICAgICAgKDE8PDMxKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NQVhfTUlQX0xFVkVMX1NISUZUICAgICAgIDI2CisjICAgICAgIGRlZmluZSBSMzAwX1RYX01BWF9NSVBfTEVWRUxfTUFTSyAgICAgICAgKDB4ZiA8PCAyNikKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9QUk9KRUNURUQgICAgICAgICAgICAoMTw8MzApCisjICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfVFhQSVRDSF9FTiAgICAgICAgICAgKDE8PDMxKQogI2RlZmluZSBSMzAwX1RYX0ZPUk1BVF8wICAgICAgICAgICAgICAgICAgICAweDQ0QzAKIAkvKiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGZvcm1hdCB3b3JkIGJ5IFdsYWRpbWlyIHZhbiBkZXIgTGFhbiAqLwogCS8qIFRoZSBYLCBZLCBaIGFuZCBXIHJlZmVyIHRvIHRoZSBsYXlvdXQgb2YgdGhlIGNvbXBvbmVudHMuCkBAIC03NjEsMTEgKzg1NiwxMSBAQAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRFhUMQkgICAgCSAgICAweEYKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0RYVDMJICAgIAkgICAgMHgxMAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRFhUNQkgICAgCSAgICAweDExCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EM0RNRlRfQ3hWOFU4CSAgICAweDEyCS8qIG5vIHN3aXp6bGUgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0E4UjhHOEI4CSAgICAJICAgIDB4MTMJLyogbm8gc3dpenpsZSAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQjhHOF9COEc4CSAgICAJICAgIDB4MTQJLyogbm8gc3dpenpsZSAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRzhSOF9HOEI4CSAgICAJICAgIDB4MTUJLyogbm8gc3dpenpsZSAqLwotCQkJCQkJICAvKiAweDE2IC0gc29tZSAxNiBiaXQgZ3JlZW4gZm9ybWF0Li4gPz8gKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0QzRE1GVF9DeFY4VTgJICAgIDB4MTIgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0E4UjhHOEI4CSAgICAJICAgIDB4MTMgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0I4RzhfQjhHOAkgICAgCSAgICAweDE0ICAgICAvKiBubyBzd2l6emxlICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9HOFI4X0c4QjgJICAgIAkgICAgMHgxNSAgICAgLyogbm8gc3dpenpsZSAqLworCS8qIDB4MTYgLSBzb21lIDE2IGJpdCBncmVlbiBmb3JtYXQuLiA/PyAqLwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfVU5LMjUJCSAgICgxIDw8IDI1KSAvKiBubyBzd2l6emxlICovCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVUJJQ19NQVAJCSAgICgxIDw8IDI2KQogCkBAIC03OTMsMjMgKzg4OCwyNiBAQAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfVwkJMwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWkVSTwk0CiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9PTkUJNQotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VUX1oJNgkvKiAyLjAqWiwgZXZlcnl0aGluZyBhYm92ZSAxLjAgaXMgc2V0IHRvIDAuMCAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VUX1cJNwkvKiAyLjAqVywgZXZlcnl0aGluZyBhYm92ZSAxLjAgaXMgc2V0IHRvIDAuMCAqLworCS8qIDIuMCpaLCBldmVyeXRoaW5nIGFib3ZlIDEuMCBpcyBzZXQgdG8gMC4wICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVVRfWgk2CisJLyogMi4wKlcsIGV2ZXJ5dGhpbmcgYWJvdmUgMS4wIGlzIHNldCB0byAwLjAgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVVF9XCTcKIAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQl9TSElGVAkxOAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfR19TSElGVAkxNQogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfUl9TSElGVAkxMgogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQV9TSElGVAk5CiAJLyogQ29udmVuaWVuY2UgbWFjcm8gdG8gdGFrZSBjYXJlIG9mIGxheW91dCBhbmQgc3dpenpsaW5nICovCi0jCWRlZmluZSBSMzAwX0VBU1lfVFhfRk9STUFUKEIsIEcsIFIsIEEsIEZNVCkJKFwKLQkgICgoUjMwMF9UWF9GT1JNQVRfIyNCKTw8UjMwMF9UWF9GT1JNQVRfQl9TSElGVCkgXAotCXwgKChSMzAwX1RYX0ZPUk1BVF8jI0cpPDxSMzAwX1RYX0ZPUk1BVF9HX1NISUZUKSBcCi0JfCAoKFIzMDBfVFhfRk9STUFUXyMjUik8PFIzMDBfVFhfRk9STUFUX1JfU0hJRlQpIFwKLQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNBKTw8UjMwMF9UWF9GT1JNQVRfQV9TSElGVCkgXAotCXwgKFIzMDBfVFhfRk9STUFUXyMjRk1UKSBcCi0JICApCi0JLyogVGhlc2UgY2FuIGJlIE9SZWQgd2l0aCByZXN1bHQgb2YgUjMwMF9FQVNZX1RYX0ZPUk1BVCgpICovCi0JLyogV2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGV5IGRvLiBUYWtlIHZhbHVlcyBmcm9tIGEgY29uc3RhbnQgY29sb3IgPyAqLworIwlkZWZpbmUgUjMwMF9FQVNZX1RYX0ZPUk1BVChCLCBHLCBSLCBBLCBGTVQpCSgJCVwKKwkJKChSMzAwX1RYX0ZPUk1BVF8jI0IpPDxSMzAwX1RYX0ZPUk1BVF9CX1NISUZUKQkJXAorCQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNHKTw8UjMwMF9UWF9GT1JNQVRfR19TSElGVCkJXAorCQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNSKTw8UjMwMF9UWF9GT1JNQVRfUl9TSElGVCkJXAorCQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNBKTw8UjMwMF9UWF9GT1JNQVRfQV9TSElGVCkJXAorCQl8IChSMzAwX1RYX0ZPUk1BVF8jI0ZNVCkJCQkJXAorCQkpCisJLyogVGhlc2UgY2FuIGJlIE9SZWQgd2l0aCByZXN1bHQgb2YgUjMwMF9FQVNZX1RYX0ZPUk1BVCgpCisJICAgV2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGV5IGRvLiBUYWtlIHZhbHVlcyBmcm9tIGEKKyAgICAgICAgICAgY29uc3RhbnQgY29sb3IgPyAqLwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ09OU1RfWAkJKDE8PDUpCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DT05TVF9ZCQkoMjw8NSkKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NPTlNUX1oJCSg0PDw1KQpAQCAtODE5LDcgKzkxNyw3IEBACiAKICNkZWZpbmUgUjMwMF9UWF9QSVRDSF8wCQkJICAgIDB4NDUwMCAvKiBvYnZpb3VzIG1pc3NpbmcgaW4gZ2FwICovCiAjZGVmaW5lIFIzMDBfVFhfT0ZGU0VUXzAgICAgICAgICAgICAgICAgICAgIDB4NDU0MAotLyogQkVHSU46IEd1ZXNzIGZyb20gUjIwMCAqLworCS8qIEJFR0lOOiBHdWVzcyBmcm9tIFIyMDAgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX0VORElBTl9OT19TV0FQICAgICAgICAgICAoMCA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fRU5ESUFOX0JZVEVfU1dBUCAgICAgICAgICgxIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fV09SRF9TV0FQICAgICAgICAgKDIgPDwgMCkKQEAgLTgyOCw1MyArOTI2LDYxIEBACiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19NSUNST19USUxFICAgICAgICAgICAgICAgKDEgPDwgMykKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX09GRlNFVF9NQVNLICAgICAgICAgICAgICAweGZmZmZmZmUwCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19PRkZTRVRfU0hJRlQgICAgICAgICAgICAgNQotLyogRU5EICovCi0jZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV8wICAgICAgICAgICAgICAgICAgICAgIDB4NDU4MCAvKiAzMiBiaXQgY2hyb21hIGtleSAqLwotI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl8wICAgICAgICAgICAgICAweDQ1QzAgLy9mZjAwZmYwMCA9PSB7IDAsIDEuMCwgMCwgMS4wIH0KKwkvKiBFTkQ6IEd1ZXNzIGZyb20gUjIwMCAqLwogCi0vKiBFTkQgKi8KKy8qIDMyIGJpdCBjaHJvbWEga2V5ICovCisjZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV8wICAgICAgICAgICAgICAgICAgICAgIDB4NDU4MAorLyogZmYwMGZmMDAgPT0geyAwLCAxLjAsIDAsIDEuMCB9ICovCisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzAgICAgICAgICAgICAgIDB4NDVDMAogCi0vKiBCRUdJTjogRnJhZ21lbnQgcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQKLS8vIEZyYWdtZW50IHByb2dyYW1zIGFyZSB3cml0dGVuIGRpcmVjdGx5IGludG8gcmVnaXN0ZXIgc3BhY2UuCi0vLyBUaGVyZSBhcmUgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24gc3RyZWFtcyBmb3IgdGV4dHVyZSBpbnN0cnVjdGlvbnMgYW5kIEFMVQotLy8gaW5zdHJ1Y3Rpb25zLgotLy8gSW4gb3JkZXIgdG8gc3luY2hyb25pemUgdGhlc2Ugc3RyZWFtcywgdGhlIHByb2dyYW0gaXMgZGl2aWRlZCBpbnRvIHVwCi0vLyB0byA0IG5vZGVzLiBFYWNoIG5vZGUgYmVnaW5zIHdpdGggYSBudW1iZXIgb2YgVEVYIG9wZXJhdGlvbnMsIGZvbGxvd2VkCi0vLyBieSBhIG51bWJlciBvZiBBTFUgb3BlcmF0aW9ucy4KLS8vIFRoZSBmaXJzdCBub2RlIGNhbiBoYXZlIHplcm8gVEVYIG9wcywgYWxsIHN1YnNlcXVlbnQgbm9kZXMgbXVzdCBoYXZlIGF0IGxlYXN0Ci0vLyBvbmUgVEVYIG9wcy4KLS8vIEFsbCBub2RlcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIEFMVSBvcC4KLS8vCi0vLyBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9kZSBpcyBzdG9yZWQgaW4gUEZTX0NOVExfMDogQSB2YWx1ZSBvZiAwIG1lYW5zCi0vLyAxIG5vZGUsIGEgdmFsdWUgb2YgMyBtZWFucyA0IG5vZGVzLgotLy8gVGhlIHRvdGFsIGFtb3VudCBvZiBpbnN0cnVjdGlvbnMgaXMgZGVmaW5lZCBpbiBQRlNfQ05UTF8yLiBUaGUgb2Zmc2V0cyBhcmUKLS8vIG9mZnNldHMgaW50byB0aGUgcmVzcGVjdGl2ZSBpbnN0cnVjdGlvbiBzdHJlYW1zLCB3aGlsZSAqX0VORCBwb2ludHMgdG8gdGhlCi0vLyBsYXN0IGluc3RydWN0aW9uIHJlbGF0aXZlIHRvIHRoaXMgb2Zmc2V0LiAqLworLyogRU5EOiBUZXh0dXJlIHNwZWNpZmljYXRpb24gKi8KKworLyogQkVHSU46IEZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCisKKy8qIEZyYWdtZW50IHByb2dyYW1zIGFyZSB3cml0dGVuIGRpcmVjdGx5IGludG8gcmVnaXN0ZXIgc3BhY2UuCisgKiBUaGVyZSBhcmUgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24gc3RyZWFtcyBmb3IgdGV4dHVyZSBpbnN0cnVjdGlvbnMgYW5kIEFMVQorICogaW5zdHJ1Y3Rpb25zLgorICogSW4gb3JkZXIgdG8gc3luY2hyb25pemUgdGhlc2Ugc3RyZWFtcywgdGhlIHByb2dyYW0gaXMgZGl2aWRlZCBpbnRvIHVwCisgKiB0byA0IG5vZGVzLiBFYWNoIG5vZGUgYmVnaW5zIHdpdGggYSBudW1iZXIgb2YgVEVYIG9wZXJhdGlvbnMsIGZvbGxvd2VkCisgKiBieSBhIG51bWJlciBvZiBBTFUgb3BlcmF0aW9ucy4KKyAqIFRoZSBmaXJzdCBub2RlIGNhbiBoYXZlIHplcm8gVEVYIG9wcywgYWxsIHN1YnNlcXVlbnQgbm9kZXMgbXVzdCBoYXZlIGF0CisgKiBsZWFzdAorICogb25lIFRFWCBvcHMuCisgKiBBbGwgbm9kZXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBBTFUgb3AuCisgKgorICogVGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vZGUgaXMgc3RvcmVkIGluIFBGU19DTlRMXzA6IEEgdmFsdWUgb2YgMCBtZWFucworICogMSBub2RlLCBhIHZhbHVlIG9mIDMgbWVhbnMgNCBub2Rlcy4KKyAqIFRoZSB0b3RhbCBhbW91bnQgb2YgaW5zdHJ1Y3Rpb25zIGlzIGRlZmluZWQgaW4gUEZTX0NOVExfMi4gVGhlIG9mZnNldHMgYXJlCisgKiBvZmZzZXRzIGludG8gdGhlIHJlc3BlY3RpdmUgaW5zdHJ1Y3Rpb24gc3RyZWFtcywgd2hpbGUgKl9FTkQgcG9pbnRzIHRvIHRoZQorICogbGFzdCBpbnN0cnVjdGlvbiByZWxhdGl2ZSB0byB0aGlzIG9mZnNldC4KKyAqLwogI2RlZmluZSBSMzAwX1BGU19DTlRMXzAgICAgICAgICAgICAgICAgICAgICAweDQ2MDAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfTEFTVF9OT0RFU19TSElGVCAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0xBU1RfTk9ERVNfTUFTSyAgICAgKDMgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfRklSU1RfTk9ERV9IQVNfVEVYICAoMSA8PCAzKQogI2RlZmluZSBSMzAwX1BGU19DTlRMXzEgICAgICAgICAgICAgICAgICAgICAweDQ2MDQKIC8qIFRoZXJlIGlzIGFuIHVuc2hpZnRlZCB2YWx1ZSBoZXJlIHdoaWNoIGhhcyBzbyBmYXIgYWx3YXlzIGJlZW4gZXF1YWwgdG8gdGhlCi0vLyBpbmRleCBvZiB0aGUgaGlnaGVzdCB1c2VkIHRlbXBvcmFyeSByZWdpc3Rlci4gKi8KKyAqIGluZGV4IG9mIHRoZSBoaWdoZXN0IHVzZWQgdGVtcG9yYXJ5IHJlZ2lzdGVyLgorICovCiAjZGVmaW5lIFIzMDBfUEZTX0NOVExfMiAgICAgICAgICAgICAgICAgICAgIDB4NDYwOAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfT0ZGU0VUX1NISUZUICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX09GRlNFVF9NQVNLICAgICAoNjMgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX0VORF9TSElGVCAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9FTkRfTUFTSyAgICAgICAgKDYzIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9FTkRfTUFTSyAgICAgICAgKDYzIDw8IDYpCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfU0hJRlQgICAgMTIKLSMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX09GRlNFVF9NQVNLICAgICAoMzEgPDwgMTIpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfTUFTSyAgICAgKDMxIDw8IDEyKSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfRU5EX1NISUZUICAgICAgIDE4Ci0jICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9FTkRfTUFTSyAgICAgICAgKDMxIDw8IDE4KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfRU5EX01BU0sgICAgICAgICgzMSA8PCAxOCkgLyogR1VFU1MgKi8KIAogLyogZ2FwICovCisKIC8qIE5vZGVzIGFyZSBzdG9yZWQgYmFja3dhcmRzLiBUaGUgbGFzdCBhY3RpdmUgbm9kZSBpcyBhbHdheXMgc3RvcmVkIGluCi0vLyBQRlNfTk9ERV8zLgotLy8gRXhhbXBsZTogSW4gYSAyLW5vZGUgcHJvZ3JhbSwgTk9ERV8wIGFuZCBOT0RFXzEgYXJlIHNldCB0byAwLiBUaGUKLS8vIGZpcnN0IG5vZGUgaXMgc3RvcmVkIGluIE5PREVfMiwgdGhlIHNlY29uZCBub2RlIGlzIHN0b3JlZCBpbiBOT0RFXzMuCi0vLwotLy8gT2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIG1hc3RlciBvZmZzZXQgZnJvbSBQRlNfQ05UTF8yLgotLy8gTEFTVF9OT0RFIGlzIHNldCBmb3IgdGhlIGxhc3Qgbm9kZSwgYW5kIG9ubHkgZm9yIHRoZSBsYXN0IG5vZGUuICovCisgKiBQRlNfTk9ERV8zLgorICogRXhhbXBsZTogSW4gYSAyLW5vZGUgcHJvZ3JhbSwgTk9ERV8wIGFuZCBOT0RFXzEgYXJlIHNldCB0byAwLiBUaGUKKyAqIGZpcnN0IG5vZGUgaXMgc3RvcmVkIGluIE5PREVfMiwgdGhlIHNlY29uZCBub2RlIGlzIHN0b3JlZCBpbiBOT0RFXzMuCisgKgorICogT2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIG1hc3RlciBvZmZzZXQgZnJvbSBQRlNfQ05UTF8yLgorICovCiAjZGVmaW5lIFIzMDBfUEZTX05PREVfMCAgICAgICAgICAgICAgICAgICAgIDB4NDYxMAogI2RlZmluZSBSMzAwX1BGU19OT0RFXzEgICAgICAgICAgICAgICAgICAgICAweDQ2MTQKICNkZWZpbmUgUjMwMF9QRlNfTk9ERV8yICAgICAgICAgICAgICAgICAgICAgMHg0NjE4CkBAIC04ODcsOTEgKzk5Myw5OCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfT0ZGU0VUX01BU0sgICAgICgzMSA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfVEVYX0VORF9TSElGVCAgICAgICAxNwogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfRU5EX01BU0sgICAgICAgICgzMSA8PCAxNykKLS8qIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9MQVNUX05PREUgICAgICAgICAgICgxIDw8IDIyKSAqLwogIwkJZGVmaW5lIFIzMDBfUEZTX05PREVfT1VUUFVUX0NPTE9SICAgICAgICAoMSA8PCAyMikKICMJCWRlZmluZSBSMzAwX1BGU19OT0RFX09VVFBVVF9ERVBUSCAgICAgICAgKDEgPDwgMjMpCiAKIC8qIFRFWAotLy8gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRleHR1cmUgaW5zdHJ1Y3Rpb25zIGNhbm5vdCB3cml0ZSBpbnRvIG91dHB1dAotLy8gcmVnaXN0ZXJzIGRpcmVjdGx5LiBBIHN1YnNlcXVlbnQgQUxVIGluc3RydWN0aW9uIGlzIGFsd2F5cyBuZWNlc3NhcnksCi0vLyBldmVuIGlmIGl0J3MganVzdCBNQUQgbzAsIHIwLCAxLCAwICovCisgKiBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGV4dHVyZSBpbnN0cnVjdGlvbnMgY2Fubm90IHdyaXRlIGludG8gb3V0cHV0CisgKiByZWdpc3RlcnMgZGlyZWN0bHkuIEEgc3Vic2VxdWVudCBBTFUgaW5zdHJ1Y3Rpb24gaXMgYWx3YXlzIG5lY2Vzc2FyeSwKKyAqIGV2ZW4gaWYgaXQncyBqdXN0IE1BRCBvMCwgcjAsIDEsIDAKKyAqLwogI2RlZmluZSBSMzAwX1BGU19URVhJXzAgICAgICAgICAgICAgICAgICAgICAweDQ2MjAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfU1JDX1NISUZUICAgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX1NSQ19NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX1NSQ19DT05TVCAgICAgICAgICAgICAgKDEgPDwgNSkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfRFNUX1NISUZUICAgICAgICAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0RTVF9NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDYpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX1NISUZUICAgICAgICAgICAgMTEKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfSU1BR0VfTUFTSyAgICAgICAgICAgICAoMTUgPDwgMTEpCS8qIEdVRVNTIGJhc2VkIG9uIGxheW91dCBhbmQgbmF0aXZlIGxpbWl0cyAqLworIwlkZWZpbmUgUjMwMF9GUElUWF9TUkNfU0hJRlQgICAgICAgICAgICAgIDAKKyMJZGVmaW5lIFIzMDBfRlBJVFhfU1JDX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMCkKKwkvKiBHVUVTUyAqLworIwlkZWZpbmUgUjMwMF9GUElUWF9TUkNfQ09OU1QgICAgICAgICAgICAgICgxIDw8IDUpCisjCWRlZmluZSBSMzAwX0ZQSVRYX0RTVF9TSElGVCAgICAgICAgICAgICAgNgorIwlkZWZpbmUgUjMwMF9GUElUWF9EU1RfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCA2KQorIwlkZWZpbmUgUjMwMF9GUElUWF9JTUFHRV9TSElGVCAgICAgICAgICAgIDExCisJLyogR1VFU1MgYmFzZWQgb24gbGF5b3V0IGFuZCBuYXRpdmUgbGltaXRzICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX01BU0sgICAgICAgICAgICAgKDE1IDw8IDExKQogLyogVW5zdXJlIGlmIHRoZXNlIGFyZSBvcGNvZGVzLCBvciBzb21lIGtpbmQgb2YgYml0ZmllbGQsIGJ1dCB0aGlzIGlzIGhvdwogICogdGhleSB3ZXJlIHNldCB3aGVuIEkgY2hlY2tlZAogICovCi0jCQlkZWZpbmUgUjMwMF9GUElUWF9PUENPREVfU0hJRlQJCQkxNQotIwkJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RFWAkJCTEKLSMJCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9LSUwJCQkyCi0jCQkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhQCQkJMwotIwkJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RYQgkJCTQKKyMJZGVmaW5lIFIzMDBfRlBJVFhfT1BDT0RFX1NISUZUCQkxNQorIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVEVYCTEKKyMJCWRlZmluZSBSMzAwX0ZQSVRYX09QX0tJTAkyCisjCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9UWFAJMworIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhCCTQKKyMJZGVmaW5lIFIzMDBfRlBJVFhfT1BDT0RFX01BU0sgICAgICAgICAgICg3IDw8IDE1KQogCiAvKiBBTFUKLS8vIFRoZSBBTFUgaW5zdHJ1Y3Rpb25zIHJlZ2lzdGVyIGJsb2NrcyBhcmUgZW51bWVyYXRlZCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyCi0vLyBpbiB3aGljaCBmZ2xyeC4gSSBhc3N1bWUgdGhlcmUgaXMgc3BhY2UgZm9yIDY0IGluc3RydWN0aW9ucywgc2luY2UKLS8vIGVhY2ggYmxvY2sgaGFzIHNwYWNlIGZvciBhIG1heGltdW0gb2YgNjQgRFdPUkRzLCBhbmQgdGhpcyBtYXRjaGVzIHJlcG9ydGVkCi0vLyBuYXRpdmUgbGltaXRzLgotLy8KLS8vIFRoZSBiYXNpYyBmdW5jdGlvbmFsIGJsb2NrIHNlZW1zIHRvIGJlIG9uZSBNQUQgZm9yIGVhY2ggY29sb3IgYW5kIGFscGhhLAotLy8gYW5kIGFuIGFkZGVyIHRoYXQgYWRkcyBhbGwgY29tcG9uZW50cyBhZnRlciB0aGUgTVVMLgotLy8gIC0gQURELCBNVUwsIE1BRCBldGMuOiB1c2UgTUFEIHdpdGggYXBwcm9wcmlhdGUgbmV1dHJhbCBvcGVyYW5kcwotLy8gIC0gRFA0OiBVc2UgT1VUQ19EUDQsIE9VVEFfRFA0Ci0vLyAgLSBEUDM6IFVzZSBPVVRDX0RQMywgT1VUQV9EUDQsIGFwcHJvcHJpYXRlIGFscGhhIG9wZXJhbmRzCi0vLyAgLSBEUEg6IFVzZSBPVVRDX0RQNCwgT1VUQV9EUDQsIGFwcHJvcHJpYXRlIGFscGhhIG9wZXJhbmRzCi0vLyAgLSBDTVA6IElmIEFSRzIgPCAwLCByZXR1cm4gQVJHMSwgZWxzZSByZXR1cm4gQVJHMAotLy8gIC0gRkxSOiB1c2UgRlJDK01BRAotLy8gIC0gWFBEOiB1c2UgTUFEK01BRAotLy8gIC0gU0dFLCBTTFQ6IHVzZSBNQUQrQ01QCi0vLyAgLSBSU1E6IHVzZSBBQlMgbW9kaWZpZXIgZm9yIGFyZ3VtZW50Ci0vLyAgLSBVc2UgT1VUQ19SRVBMX0FMUEhBIHRvIHdyaXRlIHJlc3VsdHMgb2YgYW4gYWxwaGEtb25seSBvcGVyYXRpb24gKGUuZy4gUkNQKQotLy8gICAgaW50byBjb2xvciByZWdpc3RlcgotLy8gIC0gYXBwYXJlbnRseSwgdGhlcmUncyBubyBxdWljayBEU1Qgb3BlcmF0aW9uCi0vLyAgLSBmZ2xyeCBzZXQgRlBJMl9VTktOT1dOXzMxIG9uIGEgIk1BRCBmcmFnbWVudC5jb2xvciwgdG1wMCwgdG1wMSwgdG1wMiIKLS8vICAtIGZnbHJ4IHNldCBGUEkyX1VOS05PV05fMzEgb24gYSAiTUFYIHIyLCByMSwgYzAiCi0vLyAgLSBmZ2xyeCBvbmNlIHNldCBGUEkwX1VOS05PV05fMzEgb24gYSAiRlJDIHIxLCByMSIKLS8vCi0vLyBPcGVyYW5kIHNlbGVjdGlvbgotLy8gRmlyc3Qgc3RhZ2Ugc2VsZWN0cyB0aHJlZSBzb3VyY2VzIGZyb20gdGhlIGF2YWlsYWJsZSByZWdpc3RlcnMgYW5kCi0vLyBjb25zdGFudCBwYXJhbWV0ZXJzLiBUaGlzIGlzIGRlZmluZWQgaW4gSU5TVFIxIChjb2xvcikgYW5kIElOU1RSMyAoYWxwaGEpLgotLy8gZmdscnggc29ydHMgdGhlIHRocmVlIHNvdXJjZSBmaWVsZHM6IFJlZ2lzdGVycyBiZWZvcmUgY29uc3RhbnRzLAotLy8gbG93ZXIgaW5kaWNlcyBiZWZvcmUgaGlnaGVyIGluZGljZXM7IEkgZG8gbm90IGtub3cgd2hldGhlciB0aGlzIGlzIG5lY2Vzc2FyeS4KLS8vIGZnbHJ4IGZpbGxzIHVudXNlZCBzb3VyY2VzIHdpdGggInJlYWQgY29uc3RhbnQgMCIKLS8vIEFjY29yZGluZyB0byBzcGVjcywgeW91IGNhbm5vdCBzZWxlY3QgbW9yZSB0aGFuIHR3byBkaWZmZXJlbnQgY29uc3RhbnRzLgotLy8KLS8vIFNlY29uZCBzdGFnZSBzZWxlY3RzIHRoZSBvcGVyYW5kcyBmcm9tIHRoZSBzb3VyY2VzLiBUaGlzIGlzIGRlZmluZWQgaW4KLS8vIElOU1RSMCAoY29sb3IpIGFuZCBJTlNUUjIgKGFscGhhKS4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgc3BlY2lhbCBjb25zdGFudHMKLS8vIHplcm8gYW5kIG9uZS4KLS8vIFN3aXp6bGluZyBhbmQgbmVnYXRpb24gaGFwcGVucyBpbiB0aGlzIHN0YWdlLCBhcyB3ZWxsLgotLy8KLS8vIEltcG9ydGFudDogQ29sb3IgYW5kIGFscGhhIHNlZW0gdG8gYmUgbW9zdGx5IHNlcGFyYXRlLCBpLmUuIHRoZWlyIHNvdXJjZXMKLS8vIHNlbGVjdGlvbiBhcHBlYXJzIHRvIGJlIGZ1bGx5IGluZGVwZW5kZW50ICh0aGUgcmVnaXN0ZXIgc3RvcmFnZSBpcyBwcm9iYWJseQotLy8gcGh5c2ljYWxseSBzcGxpdCBpbnRvIGEgY29sb3IgYW5kIGFuIGFscGhhIHNlY3Rpb24pLgotLy8gSG93ZXZlciAoYmVjYXVzZSBvZiB0aGUgYXBwYXJlbnQgcGh5c2ljYWwgc3BsaXQpLCB0aGVyZSBpcyBzb21lIGludGVyYWN0aW9uCi0vLyBXUlQgc3dpenpsaW5nLiBJZiwgZm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIGxvYWQgYW4gUiBjb21wb25lbnQgaW50byBhbgotLy8gQWxwaGEgb3BlcmFuZCwgdGhpcyBSIGNvbXBvbmVudCBpcyB0YWtlbiBmcm9tIGEgKmNvbG9yKiBzb3VyY2UsIG5vdCBmcm9tCi0vLyBhbiBhbHBoYSBzb3VyY2UuIFRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIGRvZXNuJ3QgZXZlbiBoYXZlIHRvIGFwcGVhciBpbgotLy8gdGhlIGFscGhhIHNvdXJjZXMgbGlzdC4gKEkgaG9wZSB0aGlzIGFsbGwgbWFrZXMgc2Vuc2UgdG8geW91KQotLy8KLS8vIERlc3RpbmF0aW9uIHNlbGVjdGlvbgotLy8gVGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGluZGV4IGlzIGluIEZQSTEgKGNvbG9yKSBhbmQgRlBJMyAoYWxwaGEpIHRvZ2V0aGVyCi0vLyB3aXRoIGVuYWJsZSBiaXRzLgotLy8gVGhlcmUgYXJlIHNlcGFyYXRlIGVuYWJsZSBiaXRzIGZvciB3cml0aW5nIGludG8gdGVtcG9yYXJ5IHJlZ2lzdGVycwotLy8gKERTVENfUkVHXyogL0RTVEFfUkVHKSBhbmQgYW5kIHByb2dyYW0gb3V0cHV0IHJlZ2lzdGVycyAoRFNUQ19PVVRQVVRfKiAvRFNUQV9PVVRQVVQpLgotLy8gWW91IGNhbiB3cml0ZSB0byBib3RoIGF0IG9uY2UsIG9yIG5vdCB3cml0ZSBhdCBhbGwgKHRoZSBzYW1lIGluZGV4Ci0vLyBtdXN0IGJlIHVzZWQgZm9yIGJvdGgpLgotLy8KLS8vIE5vdGU6IFRoZXJlIGlzIGEgc3BlY2lhbCBmb3JtIGZvciBMUlAKLS8vICAtIEFyZ3VtZW50IG9yZGVyIGlzIHRoZSBzYW1lIGFzIGluIEFSQl9mcmFnbWVudF9wcm9ncmFtLgotLy8gIC0gT3BlcmF0aW9uIGlzIE1BRAotLy8gIC0gQVJHMSBpcyBzZXQgdG8gQVJHQ19TUkMxQ19MUlAvQVJHQ19TUkMxQV9MUlAKLS8vICAtIFNldCBGUEkwL0ZQSTJfU1BFQ0lBTF9MUlAKLS8vIEFyYml0cmFyeSBMUlAgKGluY2x1ZGluZyBzdXBwb3J0IGZvciBzd2l6emxpbmcpIHJlcXVpcmVzIHZhbmlsbGEgTUFEK01BRCAqLworICogVGhlIEFMVSBpbnN0cnVjdGlvbnMgcmVnaXN0ZXIgYmxvY2tzIGFyZSBlbnVtZXJhdGVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIKKyAqIGluIHdoaWNoIGZnbHJ4LiBJIGFzc3VtZSB0aGVyZSBpcyBzcGFjZSBmb3IgNjQgaW5zdHJ1Y3Rpb25zLCBzaW5jZQorICogZWFjaCBibG9jayBoYXMgc3BhY2UgZm9yIGEgbWF4aW11bSBvZiA2NCBEV09SRHMsIGFuZCB0aGlzIG1hdGNoZXMgcmVwb3J0ZWQKKyAqIG5hdGl2ZSBsaW1pdHMuCisgKgorICogVGhlIGJhc2ljIGZ1bmN0aW9uYWwgYmxvY2sgc2VlbXMgdG8gYmUgb25lIE1BRCBmb3IgZWFjaCBjb2xvciBhbmQgYWxwaGEsCisgKiBhbmQgYW4gYWRkZXIgdGhhdCBhZGRzIGFsbCBjb21wb25lbnRzIGFmdGVyIHRoZSBNVUwuCisgKiAgLSBBREQsIE1VTCwgTUFEIGV0Yy46IHVzZSBNQUQgd2l0aCBhcHByb3ByaWF0ZSBuZXV0cmFsIG9wZXJhbmRzCisgKiAgLSBEUDQ6IFVzZSBPVVRDX0RQNCwgT1VUQV9EUDQKKyAqICAtIERQMzogVXNlIE9VVENfRFAzLCBPVVRBX0RQNCwgYXBwcm9wcmlhdGUgYWxwaGEgb3BlcmFuZHMKKyAqICAtIERQSDogVXNlIE9VVENfRFA0LCBPVVRBX0RQNCwgYXBwcm9wcmlhdGUgYWxwaGEgb3BlcmFuZHMKKyAqICAtIENNUEg6IElmIEFSRzIgPiAwLjUsIHJldHVybiBBUkcwLCBlbHNlIHJldHVybiBBUkcxCisgKiAgLSBDTVA6IElmIEFSRzIgPCAwLCByZXR1cm4gQVJHMSwgZWxzZSByZXR1cm4gQVJHMAorICogIC0gRkxSOiB1c2UgRlJDK01BRAorICogIC0gWFBEOiB1c2UgTUFEK01BRAorICogIC0gU0dFLCBTTFQ6IHVzZSBNQUQrQ01QCisgKiAgLSBSU1E6IHVzZSBBQlMgbW9kaWZpZXIgZm9yIGFyZ3VtZW50CisgKiAgLSBVc2UgT1VUQ19SRVBMX0FMUEhBIHRvIHdyaXRlIHJlc3VsdHMgb2YgYW4gYWxwaGEtb25seSBvcGVyYXRpb24KKyAqICAgIChlLmcuIFJDUCkgaW50byBjb2xvciByZWdpc3RlcgorICogIC0gYXBwYXJlbnRseSwgdGhlcmUncyBubyBxdWljayBEU1Qgb3BlcmF0aW9uCisgKiAgLSBmZ2xyeCBzZXQgRlBJMl9VTktOT1dOXzMxIG9uIGEgIk1BRCBmcmFnbWVudC5jb2xvciwgdG1wMCwgdG1wMSwgdG1wMiIKKyAqICAtIGZnbHJ4IHNldCBGUEkyX1VOS05PV05fMzEgb24gYSAiTUFYIHIyLCByMSwgYzAiCisgKiAgLSBmZ2xyeCBvbmNlIHNldCBGUEkwX1VOS05PV05fMzEgb24gYSAiRlJDIHIxLCByMSIKKyAqCisgKiBPcGVyYW5kIHNlbGVjdGlvbgorICogRmlyc3Qgc3RhZ2Ugc2VsZWN0cyB0aHJlZSBzb3VyY2VzIGZyb20gdGhlIGF2YWlsYWJsZSByZWdpc3RlcnMgYW5kCisgKiBjb25zdGFudCBwYXJhbWV0ZXJzLiBUaGlzIGlzIGRlZmluZWQgaW4gSU5TVFIxIChjb2xvcikgYW5kIElOU1RSMyAoYWxwaGEpLgorICogZmdscnggc29ydHMgdGhlIHRocmVlIHNvdXJjZSBmaWVsZHM6IFJlZ2lzdGVycyBiZWZvcmUgY29uc3RhbnRzLAorICogbG93ZXIgaW5kaWNlcyBiZWZvcmUgaGlnaGVyIGluZGljZXM7IEkgZG8gbm90IGtub3cgd2hldGhlciB0aGlzIGlzCisgKiBuZWNlc3NhcnkuCisgKgorICogZmdscnggZmlsbHMgdW51c2VkIHNvdXJjZXMgd2l0aCAicmVhZCBjb25zdGFudCAwIgorICogQWNjb3JkaW5nIHRvIHNwZWNzLCB5b3UgY2Fubm90IHNlbGVjdCBtb3JlIHRoYW4gdHdvIGRpZmZlcmVudCBjb25zdGFudHMuCisgKgorICogU2Vjb25kIHN0YWdlIHNlbGVjdHMgdGhlIG9wZXJhbmRzIGZyb20gdGhlIHNvdXJjZXMuIFRoaXMgaXMgZGVmaW5lZCBpbgorICogSU5TVFIwIChjb2xvcikgYW5kIElOU1RSMiAoYWxwaGEpLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSBzcGVjaWFsIGNvbnN0YW50cworICogemVybyBhbmQgb25lLgorICogU3dpenpsaW5nIGFuZCBuZWdhdGlvbiBoYXBwZW5zIGluIHRoaXMgc3RhZ2UsIGFzIHdlbGwuCisgKgorICogSW1wb3J0YW50OiBDb2xvciBhbmQgYWxwaGEgc2VlbSB0byBiZSBtb3N0bHkgc2VwYXJhdGUsIGkuZS4gdGhlaXIgc291cmNlcworICogc2VsZWN0aW9uIGFwcGVhcnMgdG8gYmUgZnVsbHkgaW5kZXBlbmRlbnQgKHRoZSByZWdpc3RlciBzdG9yYWdlIGlzIHByb2JhYmx5CisgKiBwaHlzaWNhbGx5IHNwbGl0IGludG8gYSBjb2xvciBhbmQgYW4gYWxwaGEgc2VjdGlvbikuCisgKiBIb3dldmVyIChiZWNhdXNlIG9mIHRoZSBhcHBhcmVudCBwaHlzaWNhbCBzcGxpdCksIHRoZXJlIGlzIHNvbWUgaW50ZXJhY3Rpb24KKyAqIFdSVCBzd2l6emxpbmcuIElmLCBmb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gbG9hZCBhbiBSIGNvbXBvbmVudCBpbnRvIGFuCisgKiBBbHBoYSBvcGVyYW5kLCB0aGlzIFIgY29tcG9uZW50IGlzIHRha2VuIGZyb20gYSAqY29sb3IqIHNvdXJjZSwgbm90IGZyb20KKyAqIGFuIGFscGhhIHNvdXJjZS4gVGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgZG9lc24ndCBldmVuIGhhdmUgdG8gYXBwZWFyIGluCisgKiB0aGUgYWxwaGEgc291cmNlcyBsaXN0LiAoSSBob3BlIHRoaXMgYWxsIG1ha2VzIHNlbnNlIHRvIHlvdSkKKyAqCisgKiBEZXN0aW5hdGlvbiBzZWxlY3Rpb24KKyAqIFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpbmRleCBpcyBpbiBGUEkxIChjb2xvcikgYW5kIEZQSTMgKGFscGhhKQorICogdG9nZXRoZXIgd2l0aCBlbmFibGUgYml0cy4KKyAqIFRoZXJlIGFyZSBzZXBhcmF0ZSBlbmFibGUgYml0cyBmb3Igd3JpdGluZyBpbnRvIHRlbXBvcmFyeSByZWdpc3RlcnMKKyAqIChEU1RDX1JFR18qIC9EU1RBX1JFRykgYW5kIGFuZCBwcm9ncmFtIG91dHB1dCByZWdpc3RlcnMgKERTVENfT1VUUFVUXyoKKyAqIC9EU1RBX09VVFBVVCkuIFlvdSBjYW4gd3JpdGUgdG8gYm90aCBhdCBvbmNlLCBvciBub3Qgd3JpdGUgYXQgYWxsICh0aGUKKyAqIHNhbWUgaW5kZXggbXVzdCBiZSB1c2VkIGZvciBib3RoKS4KKyAqCisgKiBOb3RlOiBUaGVyZSBpcyBhIHNwZWNpYWwgZm9ybSBmb3IgTFJQCisgKiAgLSBBcmd1bWVudCBvcmRlciBpcyB0aGUgc2FtZSBhcyBpbiBBUkJfZnJhZ21lbnRfcHJvZ3JhbS4KKyAqICAtIE9wZXJhdGlvbiBpcyBNQUQKKyAqICAtIEFSRzEgaXMgc2V0IHRvIEFSR0NfU1JDMUNfTFJQL0FSR0NfU1JDMUFfTFJQCisgKiAgLSBTZXQgRlBJMC9GUEkyX1NQRUNJQUxfTFJQCisgKiBBcmJpdHJhcnkgTFJQIChpbmNsdWRpbmcgc3VwcG9ydCBmb3Igc3dpenpsaW5nKSByZXF1aXJlcyB2YW5pbGxhIE1BRCtNQUQKKyAqLwogI2RlZmluZSBSMzAwX1BGU19JTlNUUjFfMCAgICAgICAgICAgICAgICAgICAweDQ2QzAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMwQ19TSElGVCAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMENfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCkBAIC05ODIsNiArMTA5NSw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfU0hJRlQgICAgICAgICAgICAgMTIKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMyQ19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfQ09OU1QgICAgICAgICAgICAgKDEgPDwgMTcpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDX01BU0sgICAgICAgICAgICAgICAgMHgwMDAzZmZmZgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfU0hJRlQgICAgICAgICAgICAgIDE4CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfRFNUQ19NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDE4KQogIwkJZGVmaW5lIFIzMDBfRlBJMV9EU1RDX1JFR19NQVNLX1NISUZUICAgICAyMwpAQCAtMTAwMyw2ICsxMTE3LDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9TSElGVCAgICAgICAgICAgICAxMgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzJBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDNmZmZmCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9TSElGVCAgICAgICAgICAgICAgMTgKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMTgpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9SRUcgICAgICAgICAgICAgICAgKDEgPDwgMjMpCkBAIC0xMDI4LDcgKzExNDMsOCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMUNfTFJQICAgICAgICAgIDE1CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19aRVJPICAgICAgICAgICAgICAgMjAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX09ORSAgICAgICAgICAgICAgICAyMQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfSEFMRiAgICAgICAgICAgICAgIDIyCS8qIEdVRVNTICovCisJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX0hBTEYgICAgICAgICAgICAgICAyMgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENfWVpYICAgICAgICAgIDIzCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19ZWlggICAgICAgICAgMjQKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDX1laWCAgICAgICAgICAyNQpAQCAtMTA1Nyw2ICsxMTczLDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0RQNCAgICAgICAgICAgICAgICAoMiA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX01JTiAgICAgICAgICAgICAgICAoNCA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX01BWCAgICAgICAgICAgICAgICAoNSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0NNUEggICAgICAgICAgICAgICAoNyA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0NNUCAgICAgICAgICAgICAgICAoOCA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0ZSQyAgICAgICAgICAgICAgICAoOSA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX1JFUExfQUxQSEEgICAgICAgICAoMTAgPDwgMjMpCkBAIC0xMDc5LDIwICsxMTk2LDIzIEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMxQV9MUlAgICAgICAgICAgMTUKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1pFUk8gICAgICAgICAgICAgICAxNgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfT05FICAgICAgICAgICAgICAgIDE3Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9IQUxGICAgICAgICAgICAgICAgMTgJLyogR1VFU1MgKi8KLQorCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9IQUxGICAgICAgICAgICAgICAgMTgKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcwQV9TSElGVCAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfTkVHICAgICAgICAgICAgICAgKDEgPDwgNSkKLSMJCWRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfQUJTCQkJCSAoMSA8PCA2KQkvKiBHVUVTUyAqLworCS8qIEdVRVNTICovCisjCWRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfQUJTCQkgKDEgPDwgNikKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9TSElGVCAgICAgICAgICAgICA3CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDcpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTIpCi0jCQlkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX0FCUwkJCQkgKDEgPDwgMTMpCS8qIEdVRVNTICovCisJLyogR1VFU1MgKi8KKyMJZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9BQlMJCSAoMSA8PCAxMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9TSElGVCAgICAgICAgICAgICAxNAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxNCkKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9ORUcgICAgICAgICAgICAgICAoMSA8PCAxOSkKLSMJCWRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfQUJTCQkJCSAoMSA8PCAyMCkJLyogR1VFU1MgKi8KKwkvKiBHVUVTUyAqLworIwlkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX0FCUwkJICgxIDw8IDIwKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX1NQRUNJQUxfTFJQICAgICAgICAgICAgICgxIDw8IDIxKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfTUFEICAgICAgICAgICAgICAgICgwIDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfRFA0ICAgICAgICAgICAgICAgICgxIDw8IDIzKQpAQCAtMTEwNiw5ICsxMjI2LDE5IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9SU1EgICAgICAgICAgICAgICAgKDExIDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfU0FUICAgICAgICAgICAgICAgICgxIDw8IDMwKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX1VOS05PV05fMzEgICAgICAgICAgICAgICgxIDw8IDMxKQotLyogRU5EICovCisvKiBFTkQ6IEZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCiAKLS8qIGdhcCAqLworLyogRm9nIHN0YXRlIGFuZCBjb2xvciAqLworI2RlZmluZSBSMzAwX1JFX0ZPR19TVEFURSAgICAgICAgICAgICAgICAgICAweDRCQzAKKyMgICAgICAgZGVmaW5lIFIzMDBfRk9HX0VOQUJMRSAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9GT0dfTU9ERV9MSU5FQVIgICAgICAgICAgICAgICgwIDw8IDEpCisjCWRlZmluZSBSMzAwX0ZPR19NT0RFX0VYUCAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyMJZGVmaW5lIFIzMDBfRk9HX01PREVfRVhQMiAgICAgICAgICAgICAgICAoMiA8PCAxKQorIwlkZWZpbmUgUjMwMF9GT0dfTU9ERV9NQVNLICAgICAgICAgICAgICAgICgzIDw8IDEpCisjZGVmaW5lIFIzMDBfRk9HX0NPTE9SX1IgICAgICAgICAgICAgICAgICAgIDB4NEJDOAorI2RlZmluZSBSMzAwX0ZPR19DT0xPUl9HICAgICAgICAgICAgICAgICAgICAweDRCQ0MKKyNkZWZpbmUgUjMwMF9GT0dfQ09MT1JfQiAgICAgICAgICAgICAgICAgICAgMHg0QkQwCisKICNkZWZpbmUgUjMwMF9QUF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgMHg0QkQ0CiAjICAgICAgIGRlZmluZSBSMzAwX1JFRl9BTFBIQV9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDBmZgogIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0ZBSUwgICAgICAgICAgICAgICgwIDw8IDgpCkBAIC0xMTIzLDYgKzEyNTMsNyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDExKQogCiAvKiBnYXAgKi8KKwogLyogRnJhZ21lbnQgcHJvZ3JhbSBwYXJhbWV0ZXJzIGluIDcuMTYgZmxvYXRpbmcgcG9pbnQgKi8KICNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMF9YICAgICAgICAgICAgICAgICAgMHg0QzAwCiAjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzBfWSAgICAgICAgICAgICAgICAgIDB4NEMwNApAQCAtMTEzNSw0NSArMTI2Niw0OCBAQAogI2RlZmluZSBSMzAwX1BGU19QQVJBTV8zMV9XICAgICAgICAgICAgICAgICAweDRERkMKIAogLyogTm90ZXM6Ci0vLyAtIEFGQUlLIGZnbHJ4IGFsd2F5cyBzZXRzIEJMRU5EX1VOS05PV04gd2hlbiBibGVuZGluZyBpcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbgotLy8gLSBBRkFJSyBmZ2xyeCBhbHdheXMgc2V0cyBCTEVORF9OT19TRVBBUkFURSB3aGVuIENCTEVORCBhbmQgQUJMRU5EIGFyZSBzZXQgdG8gdGhlIHNhbWUKLS8vICAgZnVuY3Rpb24gKGJvdGggcmVnaXN0ZXJzIGFyZSBhbHdheXMgc2V0IHVwIGNvbXBsZXRlbHkgaW4gYW55IGNhc2UpCi0vLyAtIE1vc3QgYmxlbmQgZmxhZ3MgYXJlIHNpbXBseSBjb3BpZWQgZnJvbSBSMjAwIGFuZCBub3QgdGVzdGVkIHlldCAqLworICogLSBBRkFJSyBmZ2xyeCBhbHdheXMgc2V0cyBCTEVORF9VTktOT1dOIHdoZW4gYmxlbmRpbmcgaXMgdXNlZCBpbgorICogICB0aGUgYXBwbGljYXRpb24KKyAqIC0gQUZBSUsgZmdscnggYWx3YXlzIHNldHMgQkxFTkRfTk9fU0VQQVJBVEUgd2hlbiBDQkxFTkQgYW5kIEFCTEVORAorICogICAgYXJlIHNldCB0byB0aGUgc2FtZQorICogICBmdW5jdGlvbiAoYm90aCByZWdpc3RlcnMgYXJlIGFsd2F5cyBzZXQgdXAgY29tcGxldGVseSBpbiBhbnkgY2FzZSkKKyAqIC0gTW9zdCBibGVuZCBmbGFncyBhcmUgc2ltcGx5IGNvcGllZCBmcm9tIFIyMDAgYW5kIG5vdCB0ZXN0ZWQgeWV0CisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX0NCTEVORCAgICAgICAgICAgICAgICAgICAgMHg0RTA0CiAjZGVmaW5lIFIzMDBfUkIzRF9BQkxFTkQgICAgICAgICAgICAgICAgICAgIDB4NEUwOAotIC8qIHRoZSBmb2xsb3dpbmcgb25seSBhcHBlYXIgaW4gQ0JMRU5EICovCisvKiB0aGUgZm9sbG93aW5nIG9ubHkgYXBwZWFyIGluIENCTEVORCAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAoMyA8PCAxKQogIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9OT19TRVBBUkFURSAgICAgICAgICAgICAgICAoMSA8PCAzKQotIC8qIHRoZSBmb2xsb3dpbmcgYXJlIHNoYXJlZCBiZXR3ZWVuIENCTEVORCBhbmQgQUJMRU5EICovCisvKiB0aGUgZm9sbG93aW5nIGFyZSBzaGFyZWQgYmV0d2VlbiBDQkxFTkQgYW5kIEFCTEVORCAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9GQ05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAoMyAgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX0FERF9DTEFNUCAgICAgICAgICAgICAgICgwICA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fQUREX05PQ0xBTVAgICAgICAgICAgICAgKDEgIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9TVUJfQ0xBTVAgICAgICAgICAgICAgICAoMiAgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX1NVQl9OT0NMQU1QICAgICAgICAgICAgICgzICA8PCAxMikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX1pFUk8gICAgICAgICAgICAgICAgKDMyIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FICAgICAgICAgICAgICAgICAoMzMgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9TUkNfQ09MT1IgICAgICAgICAgICgzNCA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQ09MT1IgKDM1IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfRFNUX0NPTE9SICAgICAgICAgICAoMzYgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0NPTE9SICgzNyA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX1NSQ19BTFBIQSAgICAgICAgICAgKDM4IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19BTFBIQSAoMzkgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9EU1RfQUxQSEEgICAgICAgICAgICg0MCA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQUxQSEEgKDQxIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAoNDIgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9NQVNLICAgICAgICAgICAgICAgICAgICg2MyA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX1pFUk8gICAgICAgICAgICAgICAgKDMyIDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FICAgICAgICAgICAgICAgICAoMzMgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9TUkNfQ09MT1IgICAgICAgICAgICgzNCA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQ09MT1IgKDM1IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfRFNUX0NPTE9SICAgICAgICAgICAoMzYgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0NPTE9SICgzNyA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX1NSQ19BTFBIQSAgICAgICAgICAgKDM4IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19BTFBIQSAoMzkgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9EU1RfQUxQSEEgICAgICAgICAgICg0MCA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQUxQSEEgKDQxIDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfTUFTSyAgICAgICAgICAgICAgICAgICAoNjMgPDwgMjQpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX01JTiAgICAgICAgICAgICAgICAgICAgICg0ICA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fTUFYICAgICAgICAgICAgICAgICAgICAgKDUgIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9SU1VCX0NMQU1QICAgICAgICAgICAgICAoNiAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX1JTVUJfTk9DTEFNUCAgICAgICAgICAgICg3ICA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgKDMyKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkUgICAgICAgICAgICAgICAgICAgICAoMzMpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICgzNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgKDM1KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAoMzYpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICgzNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgKDM4KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAoMzkpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICg0MCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgKDQxKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAoNDIpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX0NPTlNUX0NPTE9SICAgICAgICAgICAgICg0MykKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX0NPTlNUX0NPTE9SICAgKDQ0KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9DT05TVF9BTFBIQSAgICAgICAgICAgICAoNDUpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19DT05TVF9BTFBIQSAgICg0NikKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDYzKQorIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfU0hJRlQgICAgICAgICAgICAgICAgICAoMTYpCisjICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9TSElGVCAgICAgICAgICAgICAgICAgICgyNCkKKyNkZWZpbmUgUjMwMF9SQjNEX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgMHg0RTEwCiAjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk1BU0sgICAgICAgICAgICAgICAgIDB4NEUwQwogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0IgICAgICAgICAgICAgICAgICgxPDwwKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0cgICAgICAgICAgICAgICAgICgxPDwxKQpAQCAtMTE4MSw0MSArMTMxNSw0OSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0EgICAgICAgICAgICAgICAgICgxPDwzKQogCiAvKiBnYXAgKi8KKwogI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQwICAgICAgICAgICAgICAweDRFMjgKLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JPRkZTRVRfTUFTSyAgICAgICAgICAgICAweEZGRkZGRkYwCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDEgICAgICAgICAgICAgIDB4NEUyQwkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQyICAgICAgICAgICAgICAweDRFMzAJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMyAgICAgICAgICAgICAgMHg0RTM0CS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9ST0ZGU0VUX01BU0sgICAgICAgICAgICAgMHhGRkZGRkZGMCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQxICAgICAgICAgICAgICAweDRFMkMgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMiAgICAgICAgICAgICAgMHg0RTMwIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDMgICAgICAgICAgICAgIDB4NEUzNCAvKiBHVUVTUyAqLworCiAvKiBnYXAgKi8KKwogLyogQml0IDE2OiBMYXJnZXIgdGlsZXMKLS8vIEJpdCAxNzogNHgyIHRpbGVzCi0vLyBCaXQgMTg6IEV4dHJlbWVseSB3ZWlyZCB0aWxlIGxpa2UsIGJ1dCBzb21lIHBpeGVscyBkdXBsaWNhdGVkPyAqLworICogQml0IDE3OiA0eDIgdGlsZXMKKyAqIEJpdCAxODogRXh0cmVtZWx5IHdlaXJkIHRpbGUgbGlrZSwgYnV0IHNvbWUgcGl4ZWxzIGR1cGxpY2F0ZWQ/CisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gwICAgICAgICAgICAgICAgMHg0RTM4Ci0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SUElUQ0hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMUZGOAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9USUxFX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDE2KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9NSUNST1RJTEVfRU5BQkxFICAgICAgICgxIDw8IDE3KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fTk9fU1dBUCAgICAgICAgICgwIDw8IDE4KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fV09SRF9TV0FQICAgICAgICgxIDw8IDE4KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fRFdPUkRfU1dBUCAgICAgICgyIDw8IDE4KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUlBJVENIX01BU0sgICAgICAgICAgICAgIDB4MDAwMDFGRjggLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfVElMRV9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxNikgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfTUlDUk9USUxFX0VOQUJMRSAgICAgICAoMSA8PCAxNykgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX05PX1NXQVAgICAgICAgICAoMCA8PCAxOCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAoMSA8PCAxOCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX0RXT1JEX1NXQVAgICAgICAoMiA8PCAxOCkgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX1JHQjU2NSAgICAgICAgICAoMiA8PCAyMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX0FSR0I4ODg4ICAgICAgICAoMyA8PCAyMikKLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gxICAgICAgICAgICAgICAgMHg0RTNDCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMiAgICAgICAgICAgICAgIDB4NEU0MAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDMgICAgICAgICAgICAgICAweDRFNDQJLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gxICAgICAgICAgICAgICAgMHg0RTNDIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMiAgICAgICAgICAgICAgIDB4NEU0MCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDMgICAgICAgICAgICAgICAweDRFNDQgLyogR1VFU1MgKi8KIAogLyogZ2FwICovCisKIC8qIEd1ZXNzIGJ5IFZsYWRpbWlyLgotLy8gU2V0IHRvIDBBIGJlZm9yZSAzRCBvcGVyYXRpb25zLCBzZXQgdG8gMDIgYWZ0ZXJ3YXJkcy4gKi8KKyAqIFNldCB0byAwQSBiZWZvcmUgM0Qgb3BlcmF0aW9ucywgc2V0IHRvIDAyIGFmdGVyd2FyZHMuCisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVQgICAgICAgICAgMHg0RTRDCi0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfMDIgICAgICAgICAgICAgMHgwMDAwMDAwMgotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFXzBBICAgICAgICAgICAgIDB4MDAwMDAwMEEKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzAyICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzBBICAgICAgICAgICAgIDB4MDAwMDAwMEEKIAogLyogZ2FwICovCi0vKiBUaGVyZSBzZWVtcyB0byBiZSBubyAid3JpdGUgb25seSIgc2V0dGluZywgc28gdXNlIFotdGVzdCA9IEFMV0FZUyBmb3IgdGhpcy4gKi8KLS8qIEJpdCAoMTw8OCkgaXMgdGhlICJ0ZXN0IiBiaXQuIHNvIHBsYWluIHdyaXRlIGlzIDYgIC0gdmQgKi8KKy8qIFRoZXJlIHNlZW1zIHRvIGJlIG5vICJ3cml0ZSBvbmx5IiBzZXR0aW5nLCBzbyB1c2UgWi10ZXN0ID0gQUxXQVlTCisgKiBmb3IgdGhpcy4KKyAqIEJpdCAoMTw8OCkgaXMgdGhlICJ0ZXN0IiBiaXQuIHNvIHBsYWluIHdyaXRlIGlzIDYgIC0gdmQKKyAqLwogI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8wICAgICAgICAgICAgICAgICAgIDB4NEYwMAotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfRElTQUJMRURfMSAgICAgICAgICAgIDB4MDAwMDAwMTAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX0RJU0FCTEVEXzIgICAgICAgICAgICAweDAwMDAwMDE0CS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9ESVNBQkxFRF8xICAgICAgICAgICAgMHgwMDAwMDAxMAorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfRElTQUJMRURfMiAgICAgICAgICAgIDB4MDAwMDAwMTQKICMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1RFU1QgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyCiAjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9URVNUX0FORF9XUklURSAgICAgICAgMHgwMDAwMDAxNgogIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfV1JJVEVfT05MWSAgICAgICAgCSAweDAwMDAwMDA2CkBAIC0xMjI2LDcgKzEzNjgsNyBAQAogIwlkZWZpbmUgUjMwMF9SQjNEX1NURU5DSUxfRU5BQkxFCQkgMHgwMDAwMDAwMQogCiAjZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzEgICAgICAgICAgICAgICAgICAgMHg0RjA0Ci0JCS8qIGZ1bmN0aW9ucyAqLworCS8qIGZ1bmN0aW9ucyAqLwogIwlkZWZpbmUgUjMwMF9aU19ORVZFUgkJCTAKICMJZGVmaW5lIFIzMDBfWlNfTEVTUwkJCTEKICMJZGVmaW5lIFIzMDBfWlNfTEVRVUFMCQkJMgpAQCAtMTIzNiw3ICsxMzc4LDcgQEAKICMJZGVmaW5lIFIzMDBfWlNfTk9URVFVQUwJCQk2CiAjCWRlZmluZSBSMzAwX1pTX0FMV0FZUwkJCTcKICMgICAgICAgZGVmaW5lIFIzMDBfWlNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDcKLQkJLyogb3BlcmF0aW9ucyAqLworCS8qIG9wZXJhdGlvbnMgKi8KICMJZGVmaW5lIFIzMDBfWlNfS0VFUAkJCTAKICMJZGVmaW5lIFIzMDBfWlNfWkVSTwkJCTEKICMJZGVmaW5lIFIzMDBfWlNfUkVQTEFDRQkJCTIKQEAgLTEyNDUsOSArMTM4Nyw4IEBACiAjCWRlZmluZSBSMzAwX1pTX0lOVkVSVAkJCTUKICMJZGVmaW5lIFIzMDBfWlNfSU5DUl9XUkFQCQk2CiAjCWRlZmluZSBSMzAwX1pTX0RFQ1JfV1JBUAkJNwotCi0gICAgICAgLyogZnJvbnQgYW5kIGJhY2sgcmVmZXIgdG8gb3BlcmF0aW9ucyBkb25lIGZvciBmcm9udAotICAgICAgICAgIGFuZCBiYWNrIGZhY2VzLCBpLmUuIHNlcGFyYXRlIHN0ZW5jaWwgZnVuY3Rpb24gc3VwcG9ydCAqLworCS8qIGZyb250IGFuZCBiYWNrIHJlZmVyIHRvIG9wZXJhdGlvbnMgZG9uZSBmb3IgZnJvbnQKKwkgICBhbmQgYmFjayBmYWNlcywgaS5lLiBzZXBhcmF0ZSBzdGVuY2lsIGZ1bmN0aW9uIHN1cHBvcnQgKi8KICMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfREVQVEhfRlVOQ19TSElGVAkJMAogIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9GUk9OVF9GVU5DX1NISUZUCQkzCiAjCWRlZmluZSBSMzAwX1JCM0RfWlMxX0ZST05UX0ZBSUxfT1BfU0hJRlQJNgpAQCAtMTI2OSw0NSArMTQxMCw2NCBAQAogI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfRk9STUFUICAgICAgICAgICAgICAgICAgIDB4NEYxMAogIwlkZWZpbmUgUjMwMF9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1ogICAgICgwIDw8IDApCiAjCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF8yNEJJVF9JTlRfWiAgICAgKDIgPDwgMCkKKwkvKiAxNiBiaXQgZm9ybWF0IG9yIHNvbWUgYWRpdGlvbmFsIGJpdCA/ICovCisjCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF9VTkszMiAgICAgICAgICAoMzIgPDwgMCkKKworI2RlZmluZSBSMzAwX1JCM0RfRUFSTFlfWiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NEYxNAorIwlkZWZpbmUgUjMwMF9FQVJMWV9aX0RJU0FCTEUgICAgICAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX0VBUkxZX1pfRU5BQkxFICAgICAgICAgICAgICAgKDEgPDwgMCkKIAogLyogZ2FwICovCisKKyNkZWZpbmUgUjMwMF9SQjNEX1pDQUNIRV9DVExTVEFUICAgICAgICAgICAgMHg0RjE4IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWkNBQ0hFX1VOS05PV05fMDEgIDB4MQorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pDQUNIRV9VTktOT1dOXzAzICAweDMKKworLyogZ2FwICovCisKICNkZWZpbmUgUjMwMF9SQjNEX0RFUFRIT0ZGU0VUICAgICAgICAgICAgICAgMHg0RjIwCiAjZGVmaW5lIFIzMDBfUkIzRF9ERVBUSFBJVENIICAgICAgICAgICAgICAgIDB4NEYyNAotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSFBJVENIX01BU0sgICAgICAgICAgICAgIDB4MDAwMDFGRjgJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfVElMRV9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxNikJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfTUlDUk9USUxFX0VOQUJMRSAgICAgICAoMSA8PCAxNykJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX05PX1NXQVAgICAgICAgICAoMCA8PCAxOCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAoMSA8PCAxOCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX0RXT1JEX1NXQVAgICAgICAoMiA8PCAxOCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpIC8qIEdVRVNTICovCiAKLS8qIEJFR0lOOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQKLS8vIEV2ZXJ5IGluc3RydWN0aW9uIGlzIGZvdXIgZHdvcmRzIGxvbmc6Ci0vLyAgRFdPUkQgMDogb3V0cHV0IGFuZCBvcGNvZGUKLS8vICBEV09SRCAxOiBmaXJzdCBhcmd1bWVudAotLy8gIERXT1JEIDI6IHNlY29uZCBhcmd1bWVudAotLy8gIERXT1JEIDM6IHRoaXJkIGFyZ3VtZW50Ci0vLwotLy8gTm90ZXM6Ci0vLyAgLSBBQlMgciwgYSBpcyBpbXBsZW1lbnRlZCBhcyBNQVggciwgYSwgLWEKLS8vICAtIE1PViBpcyBpbXBsZW1lbnRlZCBhcyBBREQgdG8gemVybwotLy8gIC0gWFBEIGlzIGltcGxlbWVudGVkIGFzIE1VTCArIE1BRAotLy8gIC0gRkxSIGlzIGltcGxlbWVudGVkIGFzIEZSQyArIEFERAotLy8gIC0gYXBwYXJlbnRseSwgZmdscnggdHJpZXMgdG8gc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3QKLS8vICAgIG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIHRoZSB3cml0ZSB0byBhIHRlbXBvcmFyeSBhbmQgdGhlIGZpcnN0IHJlYWQKLS8vICAgIGZyb20gc2FpZCB0ZW1wb3Jhcnk7IGhvd2V2ZXIsIHZpb2xhdGlvbnMgb2YgdGhpcyBzY2hlZHVsaW5nIGFyZSBhbGxvd2VkCi0vLyAgLSByZWdpc3RlciBpbmRpY2VzIHNlZW0gdG8gYmUgdW5yZWxhdGVkIHdpdGggT3BlbkdMIGFsaWFzaW5nIHRvIGNvbnZlbnRpb25hbCBzdGF0ZQotLy8gIC0gb25seSBvbmUgYXR0cmlidXRlIGFuZCBvbmUgcGFyYW1ldGVyIGNhbiBiZSBsb2FkZWQgYXQgYSB0aW1lOyBob3dldmVyLCB0aGUKLS8vICAgIHNhbWUgYXR0cmlidXRlL3BhcmFtZXRlciBjYW4gYmUgdXNlZCBmb3IgbW9yZSB0aGFuIG9uZSBhcmd1bWVudAotLy8gIC0gdGhlIHNlY29uZCBzb2Z0d2FyZSBhcmd1bWVudCBmb3IgUE9XIGlzIHRoZSB0aGlyZCBoYXJkd2FyZSBhcmd1bWVudCAobm8gaWRlYSB3aHkpCi0vLyAgLSBNQUQgd2l0aCBvbmx5IHRlbXBvcmFyaWVzIGFzIGlucHV0IHNlZW1zIHRvIHVzZSBWUElfT1VUX1NFTEVDVF9NQURfMgotLy8KLS8vIFRoZXJlIGlzIHNvbWUgbWFnaWMgc3Vycm91bmRpbmcgTElUOgotLy8gIFRoZSBzaW5nbGUgYXJndW1lbnQgaXMgcmVwbGljYXRlZCBhY3Jvc3MgYWxsIHRocmVlIGlucHV0cywgYnV0IHN3aXp6bGVkOgotLy8gICBGaXJzdCBhcmd1bWVudDogeHl6eQotLy8gICBTZWNvbmQgYXJndW1lbnQ6IHh5engKLS8vICAgVGhpcmQgYXJndW1lbnQ6IHh5encKLS8vICBXaGVuZXZlciB0aGUgcmVzdWx0IGlzIHVzZWQgbGF0ZXIgaW4gdGhlIGZyYWdtZW50IHByb2dyYW0sIGZnbHJ4IGZvcmNlcyB4IGFuZCB3Ci0vLyAgdG8gYmUgMS4wIGluIHRoZSBpbnB1dCBzZWxlY3Rpb247IEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMgc3RyaWN0bHkgbmVjZXNzYXJ5ICovCisvKiBCRUdJTjogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCisKKy8qIEV2ZXJ5IGluc3RydWN0aW9uIGlzIGZvdXIgZHdvcmRzIGxvbmc6CisgKiAgRFdPUkQgMDogb3V0cHV0IGFuZCBvcGNvZGUKKyAqICBEV09SRCAxOiBmaXJzdCBhcmd1bWVudAorICogIERXT1JEIDI6IHNlY29uZCBhcmd1bWVudAorICogIERXT1JEIDM6IHRoaXJkIGFyZ3VtZW50CisgKgorICogTm90ZXM6CisgKiAgLSBBQlMgciwgYSBpcyBpbXBsZW1lbnRlZCBhcyBNQVggciwgYSwgLWEKKyAqICAtIE1PViBpcyBpbXBsZW1lbnRlZCBhcyBBREQgdG8gemVybworICogIC0gWFBEIGlzIGltcGxlbWVudGVkIGFzIE1VTCArIE1BRAorICogIC0gRkxSIGlzIGltcGxlbWVudGVkIGFzIEZSQyArIEFERAorICogIC0gYXBwYXJlbnRseSwgZmdscnggdHJpZXMgdG8gc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlcmUgaXMgYXQKKyAqICAgIGxlYXN0IG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIHRoZSB3cml0ZSB0byBhIHRlbXBvcmFyeSBhbmQgdGhlIGZpcnN0CisgKiAgICByZWFkIGZyb20gc2FpZCB0ZW1wb3Jhcnk7IGhvd2V2ZXIsIHZpb2xhdGlvbnMgb2YgdGhpcyBzY2hlZHVsaW5nIGFyZQorICogICAgYWxsb3dlZAorICogIC0gcmVnaXN0ZXIgaW5kaWNlcyBzZWVtIHRvIGJlIHVucmVsYXRlZCB3aXRoIE9wZW5HTCBhbGlhc2luZyB0bworICogICAgY29udmVudGlvbmFsIHN0YXRlCisgKiAgLSBvbmx5IG9uZSBhdHRyaWJ1dGUgYW5kIG9uZSBwYXJhbWV0ZXIgY2FuIGJlIGxvYWRlZCBhdCBhIHRpbWU7IGhvd2V2ZXIsCisgKiAgICB0aGUgc2FtZSBhdHRyaWJ1dGUvcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGZvciBtb3JlIHRoYW4gb25lIGFyZ3VtZW50CisgKiAgLSB0aGUgc2Vjb25kIHNvZnR3YXJlIGFyZ3VtZW50IGZvciBQT1cgaXMgdGhlIHRoaXJkIGhhcmR3YXJlIGFyZ3VtZW50CisgKiAgICAobm8gaWRlYSB3aHkpCisgKiAgLSBNQUQgd2l0aCBvbmx5IHRlbXBvcmFyaWVzIGFzIGlucHV0IHNlZW1zIHRvIHVzZSBWUElfT1VUX1NFTEVDVF9NQURfMgorICoKKyAqIFRoZXJlIGlzIHNvbWUgbWFnaWMgc3Vycm91bmRpbmcgTElUOgorICogICBUaGUgc2luZ2xlIGFyZ3VtZW50IGlzIHJlcGxpY2F0ZWQgYWNyb3NzIGFsbCB0aHJlZSBpbnB1dHMsIGJ1dCBzd2l6emxlZDoKKyAqICAgICBGaXJzdCBhcmd1bWVudDogeHl6eQorICogICAgIFNlY29uZCBhcmd1bWVudDogeHl6eAorICogICAgIFRoaXJkIGFyZ3VtZW50OiB4eXp3CisgKiAgIFdoZW5ldmVyIHRoZSByZXN1bHQgaXMgdXNlZCBsYXRlciBpbiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSwgZmdscnggZm9yY2VzCisgKiAgIHggYW5kIHcgdG8gYmUgMS4wIGluIHRoZSBpbnB1dCBzZWxlY3Rpb247IEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMKKyAqICAgc3RyaWN0bHkgbmVjZXNzYXJ5CisgKi8KICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0RPVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NVUwgICAgICAgICAgICAgICAgICAgICAoMiA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfQUREICAgICAgICAgICAgICAgICAgICAgKDMgPDwgMCkKQEAgLTEzMTgsMjYgKzE0NzgsMzMgQEAKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX01JTiAgICAgICAgICAgICAgICAgICAgICg4IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9TR0UgICAgICAgICAgICAgICAgICAgICAoOSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfU0xUICAgICAgICAgICAgICAgICAgICAgKDEwIDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMiAgICAgICAgICAgICAgICAgICAoMTIgPDwgMCkJLyogVXNlZCBpbiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIHZlY3RvcihzY2FsYXIsIHZlY3RvcikgKi8KKwkvKiBVc2VkIGluIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgdmVjdG9yKHNjYWxhciwgdmVjdG9yKSAqLworI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LMTIgICAgICAgICAgICAgICAgICAgKDEyIDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9BUkwgICAgICAgICAgICAgICAgICAgICAoMTMgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0VYUCAgICAgICAgICAgICAgICAgICAgICg2NSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTE9HICAgICAgICAgICAgICAgICAgICAgKDY2IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks2NyAgICAgICAgICAgICAgICAgICAoNjcgPDwgMCkJLyogVXNlZCBpbiBmb2cgY29tcHV0YXRpb25zLCBzY2FsYXIoc2NhbGFyKSAqLworCS8qIFVzZWQgaW4gZm9nIGNvbXB1dGF0aW9ucywgc2NhbGFyKHNjYWxhcikgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzY3ICAgICAgICAgICAgICAgICAgICg2NyA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTElUICAgICAgICAgICAgICAgICAgICAgKDY4IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9QT1cgICAgICAgICAgICAgICAgICAgICAoNjkgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1JDUCAgICAgICAgICAgICAgICAgICAgICg3MCA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfUlNRICAgICAgICAgICAgICAgICAgICAgKDcyIDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks3MyAgICAgICAgICAgICAgICAgICAoNzMgPDwgMCkJLyogVXNlZCBpbiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIHNjYWxhcihzY2FsYXIpICovCisJLyogVXNlZCBpbiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIHNjYWxhcihzY2FsYXIpICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks3MyAgICAgICAgICAgICAgICAgICAoNzMgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0VYMiAgICAgICAgICAgICAgICAgICAgICg3NSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTEcyICAgICAgICAgICAgICAgICAgICAgKDc2IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NQURfMiAgICAgICAgICAgICAgICAgICAoMTI4IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMjkgICAgICAgICAgICAgICAgICAoMTI5IDw8IDApCS8qIGFsbCB0ZW1wcywgdmVjdG9yKHNjYWxhciwgdmVjdG9yLCB2ZWN0b3IpICovCisJLyogYWxsIHRlbXBzLCB2ZWN0b3Ioc2NhbGFyLCB2ZWN0b3IsIHZlY3RvcikgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzEyOSAgICAgICAgICAgICAgICAgICgxMjkgPDwgMCkKIAogI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX1RFTVBPUkFSWSAgICAgICAgKDAgPDwgOCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19DTEFTU19BRERSICAgICAgICAgICAgICgxIDw8IDgpCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfUkVTVUxUICAgICAgICAgICAoMiA8PCA4KQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgKDMxIDw8IDgpCiAKICNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19JTkRFWF9TSElGVCAgICAgICAgICAgIDEzCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAoMzEgPDwgMTMpCS8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KKwkvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAoMzEgPDwgMTMpCiAKICNkZWZpbmUgUjMwMF9WUElfT1VUX1dSSVRFX1ggICAgICAgICAgICAgICAgICAgICgxIDw8IDIwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfV1JJVEVfWSAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjEpCkBAIC0xMzQ4LDE0ICsxNTE1LDE2IEBACiAjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19BVFRSSUJVVEUgICAgICAgICAoMSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfUEFSQU1FVEVSICAgICAgICAgKDIgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX05PTkUgICAgICAgICAgICAgICg5IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkJLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQogCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19JTkRFWF9TSElGVCAgICAgICAgICAgICA1Ci0jZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19JTkRFWF9NQVNLICAgICAgICAgICAgICAoMjU1IDw8IDUpCS8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KKwkvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCisjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19JTkRFWF9NQVNLICAgICAgICAgICAgICAoMjU1IDw8IDUpCiAKIC8qIFRoZSBSMzAwIGNhbiBzZWxlY3QgY29tcG9uZW50cyBmcm9tIHRoZSBpbnB1dCByZWdpc3RlciBhcmJpdHJhcmlseS4KLS8vIFVzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cywgc2hpZnRlZCBieSB0aGUgY29tcG9uZW50IHNoaWZ0IHlvdQotLy8gd2FudCB0byBzZWxlY3QgKi8KKyAqIFVzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cywgc2hpZnRlZCBieSB0aGUgY29tcG9uZW50IHNoaWZ0IHlvdQorICogd2FudCB0byBzZWxlY3QKKyAqLwogI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfWCAgICAwCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9ZICAgIDEKICNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX1ogICAgMgpAQCAtMTM3MywxMSArMTU0MiwxMSBAQAogI2RlZmluZSBSMzAwX1ZQSV9JTl9ORUdfWSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjYpCiAjZGVmaW5lIFIzMDBfVlBJX0lOX05FR19aICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNykKICNkZWZpbmUgUjMwMF9WUElfSU5fTkVHX1cgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI4KQotLyogRU5EICovCisvKiBFTkQ6IFZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9uIHNldCAqLwogCi0vL0JFR0lOOiBQYWNrZXQgMyBjb21tYW5kcworLyogQkVHSU46IFBhY2tldCAzIGNvbW1hbmRzICovCiAKLS8vIEEgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorLyogQSBwcmltaXRpdmUgZW1pc3Npb24gZHdvcmQuICovCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX05PTkUgICAgICAgICAgICAgICAgICAgICAoMCA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9QT0lOVCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfTElORSAgICAgICAgICAgICAgICAgICAgICgyIDw8IDApCkBAIC0xMzg5LDcgKzE1NTgsOCBAQAogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9SRUNUX0xJU1QgICAgICAgICAgICAgICAgKDggPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfM1ZSVF9QT0lOVF9MSVNUICAgICAgICAgICg5IDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUICAgICAgICAgICAoMTAgPDwgMCkKLSNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUE9JTlRfU1BSSVRFUyAgICAgICAgICAgICgxMSA8PCAwKQkvLyBHVUVTUyAoYmFzZWQgb24gcjIwMCkKKwkvKiBHVUVTUyAoYmFzZWQgb24gcjIwMCkgKi8KKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUE9JTlRfU1BSSVRFUyAgICAgICAgICAgICgxMSA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9MSU5FX0xPT1AgICAgICAgICAgICAgICAgKDEyIDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1FVQURTICAgICAgICAgICAgICAgICAgICAoMTMgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUVVBRF9TVFJJUCAgICAgICAgICAgICAgICgxNCA8PCAwKQpAQCAtMTM5OSwzNyArMTU2OSw1OCBAQAogI2RlZmluZSBSMzAwX1BSSU1fV0FMS19MSVNUICAgICAgICAgICAgICAgICAgICAgKDIgPDwgNCkKICNkZWZpbmUgUjMwMF9QUklNX1dBTEtfUklORyAgICAgICAgICAgICAgICAgICAgICgzIDw8IDQpCiAjZGVmaW5lIFIzMDBfUFJJTV9XQUxLX01BU0sgICAgICAgICAgICAgICAgICAgICAoMyA8PCA0KQotI2RlZmluZSBSMzAwX1BSSU1fQ09MT1JfT1JERVJfQkdSQSAgICAgICAgICAgICAgKDAgPDwgNikJLy8gR1VFU1MgKGJhc2VkIG9uIHIyMDApCi0jZGVmaW5lIFIzMDBfUFJJTV9DT0xPUl9PUkRFUl9SR0JBICAgICAgICAgICAgICAoMSA8PCA2KQkvLyBHVUVTUworCS8qIEdVRVNTIChiYXNlZCBvbiByMjAwKSAqLworI2RlZmluZSBSMzAwX1BSSU1fQ09MT1JfT1JERVJfQkdSQSAgICAgICAgICAgICAgKDAgPDwgNikKKyNkZWZpbmUgUjMwMF9QUklNX0NPTE9SX09SREVSX1JHQkEgICAgICAgICAgICAgICgxIDw8IDYpCiAjZGVmaW5lIFIzMDBfUFJJTV9OVU1fVkVSVElDRVNfU0hJRlQgICAgICAgICAgICAxNgorI2RlZmluZSBSMzAwX1BSSU1fTlVNX1ZFUlRJQ0VTX01BU0sgICAgICAgICAgICAgMHhmZmZmCiAKLS8vIERyYXcgYSBwcmltaXRpdmUgZnJvbSB2ZXJ0ZXggZGF0YSBpbiBhcnJheXMgbG9hZGVkIHZpYSAzRF9MT0FEX1ZCUE5UUi4KLS8vIFR3byBwYXJhbWV0ZXIgZHdvcmRzOgotLy8gMC4gVGhlIGZpcnN0IHBhcmFtZXRlciBhcHBlYXJzIHRvIGJlIGFsd2F5cyAwCi0vLyAxLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHN0YW5kYXJkIHByaW1pdGl2ZSBlbWlzc2lvbiBkd29yZC4KKy8qIERyYXcgYSBwcmltaXRpdmUgZnJvbSB2ZXJ0ZXggZGF0YSBpbiBhcnJheXMgbG9hZGVkIHZpYSAzRF9MT0FEX1ZCUE5UUi4KKyAqIFR3byBwYXJhbWV0ZXIgZHdvcmRzOgorICogMC4gVGhlIGZpcnN0IHBhcmFtZXRlciBhcHBlYXJzIHRvIGJlIGFsd2F5cyAwCisgKiAxLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHN0YW5kYXJkIHByaW1pdGl2ZSBlbWlzc2lvbiBkd29yZC4KKyAqLwogI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19WQlVGICAgICAgICAgICAweDAwMDAyODAwCiAKLS8vIFNwZWNpZnkgdGhlIGZ1bGwgc2V0IG9mIHZlcnRleCBhcnJheXMgYXMgKGFkZHJlc3MsIHN0cmlkZSkuCi0vLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgdmVydGV4IGFycmF5cyBzcGVjaWZpZWQuCi0vLyBUaGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHZhcmlhYmxlIGxlbmd0aCBsaXN0IG9mIGJsb2Nrcywgd2hlcmUKLS8vIGVhY2ggYmxvY2sgaXMgdGhyZWUgZHdvcmRzIGxvbmcgYW5kIHNwZWNpZmllcyB0d28gYXJyYXlzLgotLy8gVGhlIGZpcnN0IGR3b3JkIG9mIGEgYmxvY2sgaXMgc3BsaXQgaW50byB0d28gd29yZHMsIHRoZSBsb3dlciBzaWduaWZpY2FudAotLy8gd29yZCByZWZlcnMgdG8gdGhlIGZpcnN0IGFycmF5LCB0aGUgbW9yZSBzaWduaWZpY2FudCB3b3JkIHRvIHRoZSBzZWNvbmQKLS8vIGFycmF5IGluIHRoZSBibG9jay4KLS8vIFRoZSBsb3cgYnl0ZSBvZiBlYWNoIHdvcmQgY29udGFpbnMgdGhlIHNpemUgb2YgYW4gYXJyYXkgZW50cnkgaW4gZHdvcmRzLAotLy8gdGhlIGhpZ2ggYnl0ZSBjb250YWlucyB0aGUgc3RyaWRlIG9mIHRoZSBhcnJheS4KLS8vIFRoZSBzZWNvbmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgYXJyYXksCi0vLyB0aGUgdGhpcmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgc2Vjb25kIGFycmF5LgotLy8gTm90ZSB0aGF0IGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgYXJyYXlzIGlzIG9kZCwgdGhlIHRoaXJkIGR3b3JkIG9mCi0vLyB0aGUgbGFzdCBibG9jayBpcyBvbWl0dGVkLgorLyogU3BlY2lmeSB0aGUgZnVsbCBzZXQgb2YgdmVydGV4IGFycmF5cyBhcyAoYWRkcmVzcywgc3RyaWRlKS4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiB2ZXJ0ZXggYXJyYXlzIHNwZWNpZmllZC4KKyAqIFRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGxpc3Qgb2YgYmxvY2tzLCB3aGVyZQorICogZWFjaCBibG9jayBpcyB0aHJlZSBkd29yZHMgbG9uZyBhbmQgc3BlY2lmaWVzIHR3byBhcnJheXMuCisgKiBUaGUgZmlyc3QgZHdvcmQgb2YgYSBibG9jayBpcyBzcGxpdCBpbnRvIHR3byB3b3JkcywgdGhlIGxvd2VyIHNpZ25pZmljYW50CisgKiB3b3JkIHJlZmVycyB0byB0aGUgZmlyc3QgYXJyYXksIHRoZSBtb3JlIHNpZ25pZmljYW50IHdvcmQgdG8gdGhlIHNlY29uZAorICogYXJyYXkgaW4gdGhlIGJsb2NrLgorICogVGhlIGxvdyBieXRlIG9mIGVhY2ggd29yZCBjb250YWlucyB0aGUgc2l6ZSBvZiBhbiBhcnJheSBlbnRyeSBpbiBkd29yZHMsCisgKiB0aGUgaGlnaCBieXRlIGNvbnRhaW5zIHRoZSBzdHJpZGUgb2YgdGhlIGFycmF5LgorICogVGhlIHNlY29uZCBkd29yZCBvZiBhIGJsb2NrIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBhcnJheSwKKyAqIHRoZSB0aGlyZCBkd29yZCBvZiBhIGJsb2NrIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgYXJyYXkuCisgKiBOb3RlIHRoYXQgaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhcnJheXMgaXMgb2RkLCB0aGUgdGhpcmQgZHdvcmQgb2YKKyAqIHRoZSBsYXN0IGJsb2NrIGlzIG9taXR0ZWQuCisgKi8KICNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0xPQURfVkJQTlRSICAgICAgICAgMHgwMDAwMkYwMAogCiAjZGVmaW5lIFIzMDBfUEFDS0VUM19JTkRYX0JVRkZFUiAgICAgICAgICAgIDB4MDAwMDMzMDAKICMgICAgZGVmaW5lIFIzMDBfRUJfVU5LMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAyNAogIyAgICBkZWZpbmUgUjMwMF9FQl9VTksxICAgICAgICAgICAgICAgICAgICAoMHg4MDw8MjQpCiAjICAgIGRlZmluZSBSMzAwX0VCX1VOSzIgICAgICAgICAgICAgICAgICAgICAgICAweDA4MTAKKyNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0RSQVdfVkJVRl8yICAgICAgICAgMHgwMDAwMzQwMAogI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19JTkRYXzIgICAgICAgICAweDAwMDAzNjAwCiAKLS8vRU5ECisvKiBFTkQ6IFBhY2tldCAzIGNvbW1hbmRzICovCiAKLSNlbmRpZgkJCQkvKiBfUjMwMF9SRUdfSCAqLworCisvKiBDb2xvciBmb3JtYXRzIGZvciAyZCBwYWNrZXRzCisgKi8KKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfQ0k4CTIKKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfQVJHQjE1NTUJMworI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9SR0I1NjUJNAorI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9BUkdCODg4OAk2CisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX1JHQjMzMgk3CisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX1JHQjgJOQorI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9BUkdCNDQ0NAkxNQorCisvKgorICogQ1AgdHlwZS0zIHBhY2tldHMKKyAqLworI2RlZmluZSBSMzAwX0NQX0NNRF9CSVRCTFRfTVVMVEkJMHhDMDAwOUIwMAorCisjZW5kaWYgLyogX1IzMDBfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCmluZGV4IDY4MzM4Mzg5Li5hZjU3OTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogI2RlZmluZSBSQURFT05fRklGT19ERUJVRwkwCiAKLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3AoZHJtX2RldmljZV90ICogZGV2KTsKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiAvKiBDUCBtaWNyb2NvZGUgKGZyb20gQVRJKSAqLwogc3RhdGljIGNvbnN0IHUzMiBSMjAwX2NwX21pY3JvY29kZVtdWzJdID0gewpAQCAtODE2LDcgKzgxNiw3IEBACiAJezAwMDAwMDAwMDAsIDAwMDAwMDAwMDB9LAogfTsKIAotc3RhdGljIGludCBSQURFT05fUkVBRF9QTEwoZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWRkcikKK3N0YXRpYyBpbnQgUkFERU9OX1JFQURfUExMKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgYWRkcikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMDY2LDcgKzEwNjYsNyBAQAogCiAvKiBSZXNldCB0aGUgZW5naW5lLiAgVGhpcyB3aWxsIHN0b3AgdGhlIENQIGlmIGl0IGlzIHJ1bm5pbmcuCiAgKi8KLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2VuZ2luZV9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHJhZGVvbl9kb19lbmdpbmVfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgY2xvY2tfY250bF9pbmRleCwgbWNsa19jbnRsLCByYmJtX3NvZnRfcmVzZXQ7CkBAIC0xMTIyLDcgKzExMjIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfaW5pdF9yaW5nX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCByYWRlb25fY3BfaW5pdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICAgZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKIAl1MzIgcmluZ19zdGFydCwgY3VyX3JlYWRfcHRyOwpAQCAtMTE3NCw3ICsxMTc0LDcgQEAKIAl9IGVsc2UKICNlbmRpZgogCXsKLQkJZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeSA9IGRldi0+c2c7CiAJCXVuc2lnbmVkIGxvbmcgdG1wX29mcywgcGFnZV9vZnM7CiAKIAkJdG1wX29mcyA9IGRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldCAtCkBAIC0xMzg0LDcgKzEzODQsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCByYWRlb25fZG9faW5pdF9jcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9yYWRlb25faW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfY3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9yYWRlb25faW5pdF90ICogaW5pdCkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xNDIwLDYgKzE0MjAsMTAgQEAKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKKwkvKiBFbmFibGUgdmJsYW5rIG9uIENSVEMxIGZvciBvbGRlciBYIHNlcnZlcnMKKwkgKi8KKwlkZXZfcHJpdi0+dmJsYW5rX2NydGMgPSBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMTsKKwogCXN3aXRjaChpbml0LT5mdW5jKSB7CiAJY2FzZSBSQURFT05fSU5JVF9SMjAwX0NQOgogCQlkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPSBVQ09ERV9SMjAwOwpAQCAtMTUwMSwxMyArMTUwNSwxMyBAQAogCQkJCQkgUkFERU9OX1JPVU5EX01PREVfVFJVTkMgfAogCQkJCQkgUkFERU9OX1JPVU5EX1BSRUNfOFRIX1BJWCk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKIAogCWRldl9wcml2LT5yaW5nX29mZnNldCA9IGluaXQtPnJpbmdfb2Zmc2V0OwogCWRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0ID0gaW5pdC0+cmluZ19ycHRyX29mZnNldDsKIAlkZXZfcHJpdi0+YnVmZmVyc19vZmZzZXQgPSBpbml0LT5idWZmZXJzX29mZnNldDsKIAlkZXZfcHJpdi0+Z2FydF90ZXh0dXJlc19vZmZzZXQgPSBpbml0LT5nYXJ0X3RleHR1cmVzX29mZnNldDsKIAorCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKQEAgLTE3MzEsNyArMTczNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3AoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9jcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTE3ODcsNyArMTc5MSw3IEBACiAgKgogICogQ2hhcmwgUC4gQm90aGEgPGh0dHA6Ly9jcGJvdGhhLm5ldD4KICAqLwotc3RhdGljIGludCByYWRlb25fZG9fcmVzdW1lX2NwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3Jlc3VtZV9jcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xOTE0LDcgKzE5MTgsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9kb19yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RvX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgcmV0OwpAQCAtMjA0MiwxMiArMjA0NiwxMiBAQAogICogdGhleSBjYW4ndCBnZXQgdGhlIGxvY2suCiAgKi8KIAotZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0cnVjdCBkcm1fYnVmICpyYWRlb25fZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJaW50IGksIHQ7CiAJaW50IHN0YXJ0OwogCkBAIC0yMDgyLDEyICsyMDg2LDEyIEBACiB9CiAKICNpZiAwCi1kcm1fYnVmX3QgKnJhZGVvbl9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RydWN0IGRybV9idWYgKnJhZGVvbl9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgaSwgdDsKIAlpbnQgc3RhcnQ7CiAJdTMyIGRvbmVfYWdlID0gRFJNX1JFQUQzMihkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRigxKSk7CkBAIC0yMTE2LDE1ICsyMTIwLDE1IEBACiB9CiAjZW5kaWYKIAotdm9pZCByYWRlb25fZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwogCiAJZGV2X3ByaXYtPmxhc3RfYnVmID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJCWJ1Zl9wcml2LT5hZ2UgPSAwOwogCX0KQEAgLTIxNjYsMTEgKzIxNzAsMTEgQEAKIAlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2NwX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICogZGV2LAotCQkJCSBkcm1fZG1hX3QgKiBkKQorc3RhdGljIGludCByYWRlb25fY3BfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgc3RydWN0IGRybV9kbWEgKiBkKQogewogCWludCBpOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAKIAlmb3IgKGkgPSBkLT5ncmFudGVkX2NvdW50OyBpIDwgZC0+cmVxdWVzdF9jb3VudDsgaSsrKSB7CiAJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoZGV2KTsKQEAgLTIxOTQsMTAgKzIxOTgsMTAgQEAKIGludCByYWRlb25fY3BfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IHJldCA9IDA7Ci0JZHJtX2RtYV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JZHJtX2RtYV90IGQ7CisJc3RydWN0IGRybV9kbWEgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlzdHJ1Y3QgZHJtX2RtYSBkOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKaW5kZXggNjZjNGI2Zi4uNWE4ZTIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKQEAgLTQxNyw3ICs0MTcsNyBAQAogCiAJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgogCSAqLwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAl1bnNpZ25lZCBpbnQgbmJveDsKIAogCS8qIENvdW50ZXJzIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nIG9mIHJlbmRlcmluZyBjbGllbnRzLgpAQCAtNDI2LDcgKzQyNiw3IEBACiAJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CiAJdW5zaWduZWQgaW50IGxhc3RfY2xlYXI7CiAKLQlkcm1fdGV4X3JlZ2lvbl90IHRleF9saXN0W1JBREVPTl9OUl9URVhfSEVBUFNdW1JBREVPTl9OUl9URVhfUkVHSU9OUyArCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleF9saXN0W1JBREVPTl9OUl9URVhfSEVBUFNdW1JBREVPTl9OUl9URVhfUkVHSU9OUyArCiAJCQkJCQkgICAgICAgMV07CiAJdW5zaWduZWQgaW50IHRleF9hZ2VbUkFERU9OX05SX1RFWF9IRUFQU107CiAJaW50IGN0eF9vd25lcjsKQEAgLTYwNCw3ICs2MDQsNyBAQAogCWludCBidWZzejsKIAljaGFyIF9fdXNlciAqYnVmOwogCWludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94ZXM7CiB9IGRybV9yYWRlb25fY21kX2J1ZmZlcl90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3RleF9pbWFnZSB7CkBAIC02NTUsNiArNjU1LDcgQEAKICNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfVEVYX0hBTkRMRSAgICAgICAxMAogI2RlZmluZSBSQURFT05fUEFSQU1fU0NSQVRDSF9PRkZTRVQgICAgICAgIDExCiAjZGVmaW5lIFJBREVPTl9QQVJBTV9DQVJEX1RZUEUgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1ZCTEFOS19DUlRDICAgICAgICAgICAxMyAgIC8qIFZCTEFOSyBDUlRDICovCiAKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZ2V0cGFyYW0gewogCWludCBwYXJhbTsKQEAgLTcwOCw3ICs3MDksNyBAQAogI2RlZmluZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9MT0NBVElPTiAzCS8qIFBDSSBHYXJ0IExvY2F0aW9uICovCiAjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9ORVdfTUVNTUFQIDQJCS8qIFVzZSBuZXcgbWVtb3J5IG1hcCAqLwogI2RlZmluZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9UQUJMRV9TSVpFIDUgICAgLyogUENJIEdBUlQgVGFibGUgU2l6ZSAqLwotCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9WQkxBTktfQ1JUQyA2ICAgICAgICAgICAvKiBWQkxBTksgQ1JUQyAqLwogLyogMS4xNDogQ2xpZW50cyBjYW4gYWxsb2NhdGUvZnJlZSBhIHN1cmZhY2UKICAqLwogdHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jIHsKQEAgLTcyMSw0ICs3MjIsNyBAQAogCXVuc2lnbmVkIGludCBhZGRyZXNzOwogfSBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90OwogCisjZGVmaW5lCURSTV9SQURFT05fVkJMQU5LX0NSVEMxIAkxCisjZGVmaW5lCURSTV9SQURFT05fVkJMQU5LX0NSVEMyIAkyCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYwppbmRleCAyZWI2NTJlLi4zNDlhYzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYwpAQCAtNjAsNyArNjAsNyBAQAogCS5kcml2ZXJfZmVhdHVyZXMgPQogCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9QQ0lfRE1BIHwgRFJJVkVSX1NHIHwKIAkgICAgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0lSUV9TSEFSRUQgfAotCSAgICBEUklWRVJfSVJRX1ZCTCwKKwkgICAgRFJJVkVSX0lSUV9WQkwgfCBEUklWRVJfSVJRX1ZCTDIsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3JhZGVvbl9idWZfcHJpdl90KSwKIAkubG9hZCA9IHJhZGVvbl9kcml2ZXJfbG9hZCwKIAkuZmlyc3RvcGVuID0gcmFkZW9uX2RyaXZlcl9maXJzdG9wZW4sCkBAIC03MCw2ICs3MCw3IEBACiAJLmxhc3RjbG9zZSA9IHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlLAogCS51bmxvYWQgPSByYWRlb25fZHJpdmVyX3VubG9hZCwKIAkudmJsYW5rX3dhaXQgPSByYWRlb25fZHJpdmVyX3ZibGFua193YWl0LAorCS52Ymxhbmtfd2FpdDIgPSByYWRlb25fZHJpdmVyX3ZibGFua193YWl0MiwKIAkuZHJpX2xpYnJhcnlfbmFtZSA9IGRyaV9saWJyYXJ5X25hbWUsCiAJLmlycV9wcmVpbnN0YWxsID0gcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKIAkuaXJxX3Bvc3RpbnN0YWxsID0gcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCmluZGV4IDU0ZjQ5ZWYuLjNiM2Q5MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCkBAIC05Nyw5ICs5NywxMCBAQAogICogICAgICAgbmV3IHBhY2tldCB0eXBlKQogICogMS4yNi0gQWRkIHN1cHBvcnQgZm9yIHZhcmlhYmxlIHNpemUgUENJKEUpIGdhcnQgYXBlcnR1cmUKICAqIDEuMjctIEFkZCBzdXBwb3J0IGZvciBJR1AgR0FSVAorICogMS4yOC0gQWRkIHN1cHBvcnQgZm9yIFZCTCBvbiBDUlRDMgogICovCiAjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQotI2RlZmluZSBEUklWRVJfTUlOT1IJCTI3CisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMjgKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCiAvKgpAQCAtMTU0LDcgKzE1NSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgewogCXVuc2lnbmVkIGludCBhZ2U7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9mcmVlbGlzdCAqbmV4dDsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9mcmVlbGlzdCAqcHJldjsKIH0gZHJtX3JhZGVvbl9mcmVlbGlzdF90OwpAQCAtMjc3LDEzICsyNzgsMTYgQEAKIAkvKiBTVyBpbnRlcnJ1cHQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBzd2lfcXVldWU7CiAJYXRvbWljX3Qgc3dpX2VtaXR0ZWQ7CisJaW50IHZibGFua19jcnRjOworCXVpbnQzMl90IGlycV9lbmFibGVfcmVnOworCWludCBpcnFfZW5hYmxlZDsKIAogCXN0cnVjdCByYWRlb25fc3VyZmFjZSBzdXJmYWNlc1tSQURFT05fTUFYX1NVUkZBQ0VTXTsKIAlzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSB2aXJ0X3N1cmZhY2VzWzIgKiBSQURFT05fTUFYX1NVUkZBQ0VTXTsKIAogCXVuc2lnbmVkIGxvbmcgcGNpZ2FydF9vZmZzZXQ7CiAJdW5zaWduZWQgaW50IHBjaWdhcnRfb2Zmc2V0X3NldDsKLQlkcm1fYXRpX3BjaWdhcnRfaW5mbyBnYXJ0X2luZm87CisJc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvIGdhcnRfaW5mbzsKIAogCXUzMiBzY3JhdGNoX2FnZXNbNV07CiAKQEAgLTI5OSw3ICszMDMsNyBAQAogCWludCBidWZzejsKIAljaGFyICpidWY7CiAJaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpib3hlczsKIH0gZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90OwogCiBleHRlcm4gaW50IHJhZGVvbl9ub193YjsKQEAgLTMzMiw4ICszMzYsOCBAQAogZXh0ZXJuIGludCByYWRlb25fZnVsbHNjcmVlbihEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IHJhZGVvbl9jcF9idWZmZXJzKERSTV9JT0NUTF9BUkdTKTsKIAotZXh0ZXJuIHZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCByYWRlb25fZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHN0cnVjdCBkcm1fYnVmICpyYWRlb25fZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogZXh0ZXJuIGludCByYWRlb25fd2FpdF9yaW5nKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBuKTsKIApAQCAtMzUzLDI5ICszNTcsMzMgQEAKIGV4dGVybiBpbnQgcmFkZW9uX2lycV9lbWl0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgcmFkZW9uX2lycV93YWl0KERSTV9JT0NUTF9BUkdTKTsKIAotZXh0ZXJuIHZvaWQgcmFkZW9uX2RvX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdm9pZCByYWRlb25fZG9fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdDIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiBleHRlcm4gaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCByYWRlb25fdmJsYW5rX2NydGNfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCByYWRlb25fdmJsYW5rX2NydGNfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludDY0X3QgdmFsdWUpOwogCiBleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfZmlyc3RvcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3Bvc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfb3Blbihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcG9zdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9vcGVuKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYpOwogZXh0ZXJuIGxvbmcgcmFkZW9uX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CiAKIC8qIHIzMDBfY21kYnVmLmMgKi8KIGV4dGVybiB2b2lkIHIzMDBfaW5pdF9yZWdfZmxhZ3Modm9pZCk7CiAKLWV4dGVybiBpbnQgcjMwMF9kb19jcF9jbWRidWYoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHAsCi0JCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCitleHRlcm4gaW50IHIzMDBfZG9fY3BfY21kYnVmKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHAsCisJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmKTsKIAogLyogRmxhZ3MgZm9yIHN0YXRzLmJveGVzCkBAIC00OTYsMTIgKzUwNCwxNSBAQAogCiAjZGVmaW5lIFJBREVPTl9HRU5fSU5UX0NOVEwJCTB4MDA0MAogIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX01BU0sJCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fQ1JUQzJfVkJMQU5LX01BU0sJCSgxIDw8IDkpCiAjCWRlZmluZSBSQURFT05fR1VJX0lETEVfSU5UX0VOQUJMRQkoMSA8PCAxOSkKICMJZGVmaW5lIFJBREVPTl9TV19JTlRfRU5BQkxFCQkoMSA8PCAyNSkKIAogI2RlZmluZSBSQURFT05fR0VOX0lOVF9TVEFUVVMJCTB4MDA0NAogIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQJCSgxIDw8IDApCiAjCWRlZmluZSBSQURFT05fQ1JUQ19WQkxBTktfU1RBVF9BQ0sgICAJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVAkJKDEgPDwgOSkKKyMJZGVmaW5lIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVF9BQ0sgICAJKDEgPDwgOSkKICMJZGVmaW5lIFJBREVPTl9HVUlfSURMRV9JTlRfVEVTVF9BQ0sgICAgICgxIDw8IDE5KQogIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9URVNUCQkoMSA8PCAyNSkKICMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgICAJKDEgPDwgMjUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jCmluZGV4IDNmZjBiYWEuLmFkOGEwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jCkBAIC02NCw3ICs2NCw3IEBACiAKIGlycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXQ7CkBAIC03MywxOCArNzMsMzUgQEAKIAkgKiBvdXRzaWRlIHRoZSBEUk0KIAkgKi8KIAlzdGF0ID0gcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYsIChSQURFT05fU1dfSU5UX1RFU1RfQUNLIHwKLQkJCQkJCSAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpKTsKKwkJCQkJCSAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQgfAorCQkJCQkJICBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpKTsKIAlpZiAoIXN0YXQpCiAJCXJldHVybiBJUlFfTk9ORTsKIAorCXN0YXQgJj0gZGV2X3ByaXYtPmlycV9lbmFibGVfcmVnOworCiAJLyogU1cgaW50ZXJydXB0ICovCiAJaWYgKHN0YXQgJiBSQURFT05fU1dfSU5UX1RFU1QpIHsKIAkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPnN3aV9xdWV1ZSk7CiAJfQogCiAJLyogVkJMQU5LIGludGVycnVwdCAqLwotCWlmIChzdGF0ICYgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpIHsKLQkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworCWlmIChzdGF0ICYgKFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUfFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkpIHsKKwkJaW50IHZibGFua19jcnRjID0gZGV2X3ByaXYtPnZibGFua19jcnRjOworCisJCWlmICgodmJsYW5rX2NydGMgJgorCQkgICAgIChEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSB8IERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSkgPT0KKwkJICAgIChEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSB8IERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSkgeworCQkJaWYgKHN0YXQgJiBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkKKwkJCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCQlpZiAoc3RhdCAmIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkKKwkJCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZDIpOworCQl9IGVsc2UgaWYgKCgoc3RhdCAmIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSAmJgorCQkJICAgKHZibGFua19jcnRjICYgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEpKSB8fAorCQkJICAgKChzdGF0ICYgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUKSAmJgorCQkJICAgICh2YmxhbmtfY3J0YyAmIERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSkpCisJCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisKIAkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOwogCQlkcm1fdmJsX3NlbmRfc2lnbmFscyhkZXYpOwogCX0KQEAgLTkyLDcgKzEwOSw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCByZXQ7CkBAIC0xMTAsNyArMTI3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBzd2lfbnIpCitzdGF0aWMgaW50IHJhZGVvbl93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IHN3aV9ucikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEyNywxOSArMTQ0LDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UsCisJCQkJIGludCBjcnRjKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOwogCWludCByZXQgPSAwOwotCisJaW50IGFjayA9IDA7CisJYXRvbWljX3QgKmNvdW50ZXI7CiAJaWYgKCFkZXZfcHJpdikgewogCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCk7CisJaWYgKGNydGMgPT0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEpIHsKKwkJY291bnRlciA9ICZkZXYtPnZibF9yZWNlaXZlZDsKKwkJYWNrIHw9IFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUOworCX0gZWxzZSBpZiAoY3J0YyA9PSBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikgeworCQljb3VudGVyID0gJmRldi0+dmJsX3JlY2VpdmVkMjsKKwkJYWNrIHw9IFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVDsKKwl9IGVsc2UKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCBhY2spOwogCiAJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOwogCkBAIC0xNDgsNyArMTc2LDcgQEAKIAkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4KIAkgKi8KIAlEUk1fV0FJVF9PTihyZXQsIGRldi0+dmJsX3F1ZXVlLCAzICogRFJNX0haLAotCQkgICAgKCgoY3VyX3ZibGFuayA9IGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCkpCisJCSAgICAoKChjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoY291bnRlcikpCiAJCSAgICAgIC0gKnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpKTsKIAogCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CkBAIC0xNTYsNiArMTg0LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKwlyZXR1cm4gcmFkZW9uX2RyaXZlcl92YmxhbmtfZG9fd2FpdChkZXYsIHNlcXVlbmNlLCBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSk7Cit9CisKK2ludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0MihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCXJldHVybiByYWRlb25fZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsIERSTV9SQURFT05fVkJMQU5LX0NSVEMyKTsKK30KKwogLyogTmVlZHMgdGhlIGxvY2sgYXMgaXQgdG91Y2hlcyB0aGUgcmluZy4KICAqLwogaW50IHJhZGVvbl9pcnFfZW1pdChEUk1fSU9DVExfQVJHUykKQEAgLTIwNCw5ICsyNDIsMjQgQEAKIAlyZXR1cm4gcmFkZW9uX3dhaXRfaXJxKGRldiwgaXJxd2FpdC5pcnFfc2VxKTsKIH0KIAorc3RhdGljIHZvaWQgcmFkZW9uX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCWRldl9wcml2LT5pcnFfZW5hYmxlX3JlZyA9IFJBREVPTl9TV19JTlRfRU5BQkxFOworCWlmIChkZXZfcHJpdi0+dmJsYW5rX2NydGMgJiBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSkKKwkJZGV2X3ByaXYtPmlycV9lbmFibGVfcmVnIHw9IFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLOworCisJaWYgKGRldl9wcml2LT52YmxhbmtfY3J0YyAmIERSTV9SQURFT05fVkJMQU5LX0NSVEMyKQorCQlkZXZfcHJpdi0+aXJxX2VuYWJsZV9yZWcgfD0gUkFERU9OX0NSVEMyX1ZCTEFOS19NQVNLOworCisJUkFERU9OX1dSSVRFKFJBREVPTl9HRU5fSU5UX0NOVEwsIGRldl9wcml2LT5pcnFfZW5hYmxlX3JlZyk7CisJZGV2X3ByaXYtPmlycV9lbmFibGVkID0gMTsKK30KKwogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTIxNiwxMCArMjY5LDExIEBACiAKIAkvKiBDbGVhciBiaXRzIGlmIHRoZXkncmUgYWxyZWFkeSBoaWdoICovCiAJcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYsIChSQURFT05fU1dfSU5UX1RFU1RfQUNLIHwKLQkJCQkJICAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpKTsKKwkJCQkJICAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQgfAorCQkJCQkgICBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpKTsKIH0KIAotdm9pZCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjI3LDE4ICsyODEsNDggQEAKIAlhdG9taWNfc2V0KCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQsIDApOwogCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPnN3aV9xdWV1ZSk7CiAKLQkvKiBUdXJuIG9uIFNXIGFuZCBWQkwgaW50cyAqLwotCVJBREVPTl9XUklURShSQURFT05fR0VOX0lOVF9DTlRMLAotCQkgICAgIFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLIHwgUkFERU9OX1NXX0lOVF9FTkFCTEUpOworCXJhZGVvbl9lbmFibGVfaW50ZXJydXB0KGRldik7CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWlmICghZGV2X3ByaXYpCiAJCXJldHVybjsKIAorCWRldl9wcml2LT5pcnFfZW5hYmxlZCA9IDA7CisKIAkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KIAlSQURFT05fV1JJVEUoUkFERU9OX0dFTl9JTlRfQ05UTCwgMCk7CiB9CisKKworaW50IHJhZGVvbl92YmxhbmtfY3J0Y19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgZmxhZzsKKwl1MzIgdmFsdWU7CisKKwlmbGFnID0gUkFERU9OX1JFQUQoUkFERU9OX0dFTl9JTlRfQ05UTCk7CisJdmFsdWUgPSAwOworCisJaWYgKGZsYWcgJiBSQURFT05fQ1JUQ19WQkxBTktfTUFTSykKKwkJdmFsdWUgfD0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzE7CisKKwlpZiAoZmxhZyAmIFJBREVPTl9DUlRDMl9WQkxBTktfTUFTSykKKwkJdmFsdWUgfD0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzI7CisJcmV0dXJuIHZhbHVlOworfQorCitpbnQgcmFkZW9uX3ZibGFua19jcnRjX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQ2NF90IHZhbHVlKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWlmICh2YWx1ZSAmIH4oRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEgfCBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikpIHsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBpbnZhbGlkIGNydGMgMHgleFxuIiwgKHVuc2lnbmVkIGludCl2YWx1ZSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT52YmxhbmtfY3J0YyA9ICh1bnNpZ25lZCBpbnQpdmFsdWU7CisJcmFkZW9uX2VuYWJsZV9pbnRlcnJ1cHQoZGV2KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCmluZGV4IDk4YzVmMWQuLjNkZGY4NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpAQCAtMzksNyArMzksNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgogCQkJCQkJICAgIGRldl9wcml2LAotCQkJCQkJICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkJCQkgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJCQkJICAgIHUzMiAqb2Zmc2V0KQogewogCXU2NCBvZmYgPSAqb2Zmc2V0OwpAQCAtOTAsNyArOTAsNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXRzKGRybV9yYWRlb25fcHJpdmF0ZV90ICoKIAkJCQkJCSAgICAgZGV2X3ByaXYsCi0JCQkJCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCQkJCSAgICAgaW50IGlkLCB1MzIgKmRhdGEpCiB7CiAJc3dpdGNoIChpZCkgewpAQCAtMjY0LDcgKzI2NCw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgogCQkJCQkJICAgICBkZXZfcHJpdiwKLQkJCQkJCSAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdiwKIAkJCQkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICoKIAkJCQkJCSAgICAgY21kYnVmLAogCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNtZHN6KQpAQCAtNDIxLDcgKzQyMSw3IEBACiAgKi8KIAogc3RhdGljIF9faW5saW5lX18gdm9pZCByYWRlb25fZW1pdF9jbGlwX3JlY3QoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkJICAgICBkcm1fY2xpcF9yZWN0X3QgKiBib3gpCisJCQkJCSAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3gpCiB7CiAJUklOR19MT0NBTFM7CiAKQEAgLTQzOSw3ICs0MzksNyBAQAogLyogRW1pdCAxLjEgc3RhdGUKICAqLwogc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgIGRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgKiBjdHgsCiAJCQkgICAgIGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgKiB0ZXgsCiAJCQkgICAgIHVuc2lnbmVkIGludCBkaXJ0eSkKQEAgLTYwOCw3ICs2MDgsNyBAQAogLyogRW1pdCAxLjIgc3RhdGUKICAqLwogc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZTIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgICBkcm1fcmFkZW9uX3N0YXRlX3QgKiBzdGF0ZSkKIHsKIAlSSU5HX0xPQ0FMUzsKQEAgLTg0NCw3ICs4NDQsNyBAQAogICogQ1AgY29tbWFuZCBkaXNwYXRjaCBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgZHJtX3JhZGVvbl9jbGVhcl90ICogY2xlYXIsCiAJCQkJICAgICBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCAqIGRlcHRoX2JveGVzKQogewpAQCAtODUyLDcgKzg1Miw3IEBACiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90ICpkZXB0aF9jbGVhciA9ICZkZXZfcHJpdi0+ZGVwdGhfY2xlYXI7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gY2xlYXItPmZsYWdzOwogCXUzMiByYjNkX2NudGwgPSAwLCByYjNkX3N0ZW5jaWxyZWZtYXNrID0gMDsKIAlpbnQgaTsKQEAgLTEzMzUsMTIgKzEzMzUsMTIgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xNDEyLDEwICsxNDEyLDEwIEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX3NhcmVhX3QgKnNhcmVhID0gKGRybV9zYXJlYV90ICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlOworCXN0cnVjdCBkcm1fc2FyZWEgKnNhcmVhID0gKHN0cnVjdCBkcm1fc2FyZWEgKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CiAJaW50IG9mZnNldCA9IChkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9PSAxKQogCSAgICA/IGRldl9wcml2LT5mcm9udF9vZmZzZXQgOiBkZXZfcHJpdi0+YmFja19vZmZzZXQ7CiAJUklOR19MT0NBTFM7CkBAIC0xNDkxLDggKzE0OTEsOCBAQAogCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CiB9IGRybV9yYWRlb25fdGNsX3ByaW1fdDsKIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgICAgZHJtX2J1Zl90ICogYnVmLAorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwKIAkJCQkgICAgICBkcm1fcmFkZW9uX3RjbF9wcmltX3QgKiBwcmltKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNTM3LDcgKzE1MzcsNyBAQAogCX0gd2hpbGUgKGkgPCBuYm94KTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtMTU1NCw4ICsxNTU0LDggQEAKIAlidWYtPnVzZWQgPSAwOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoZHJtX2RldmljZV90ICogZGV2LAotCQkJCQlkcm1fYnVmX3QgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkJc3RydWN0IGRybV9idWYgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMTU4OCw4ICsxNTg4LDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgICAgZHJtX2J1Zl90ICogZWx0X2J1ZiwKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGVsdF9idWYsCiAJCQkJICAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqIHByaW0pCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE2NDcsMTMgKzE2NDcsMTMgQEAKICNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1NJWkUgUkFERU9OX0JVRkZFUl9TSVpFCiAKIHN0YXRpYyBpbnQgcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoRFJNRklMRSBmaWxwLAotCQkJCSAgICAgIGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfdCAqIHRleCwKIAkJCQkgICAgICBkcm1fcmFkZW9uX3RleF9pbWFnZV90ICogaW1hZ2UpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAl1MzIgZm9ybWF0OwogCXUzMiAqYnVmZmVyOwogCWNvbnN0IHU4IF9fdXNlciAqZGF0YTsKQEAgLTE4ODEsNyArMTg4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKGRybV9kZXZpY2VfdCAqIGRldiwgdTMyICogc3RpcHBsZSkKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1MzIgKiBzdGlwcGxlKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CkBAIC0yMTM0LDcgKzIxMzQsNyBAQAogCiAvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgogICovCi1zdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTIyMDYsMTAgKzIyMDYsMTAgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OwogCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcmFkZW9uX3ZlcnRleF90IHZlcnRleDsKIAlkcm1fcmFkZW9uX3RjbF9wcmltX3QgcHJpbTsKIApAQCAtMjI4OSwxMCArMjI4OSwxMCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25faW5kaWNlc190IGVsdHM7CiAJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHByaW07CiAJaW50IGNvdW50OwpAQCAtMjQzOCw4ICsyNDM4LDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25faW5kaXJlY3RfdCBpbmRpcmVjdDsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtMjUwNywxMCArMjUwNywxMCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25fdmVydGV4Ml90IHZlcnRleDsKIAlpbnQgaTsKIAl1bnNpZ25lZCBjaGFyIGxhc3RzdGF0ZTsKQEAgLTI2MDMsNyArMjYwMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkgICAgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJICAgICAgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKIAkJCSAgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKIHsKQEAgLTI3MjgsOCArMjcyOCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0Myhkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0MyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTI3NTQsMTYgKzI3NTQsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KGRybV9kZXZpY2VfdCAqZGV2LAotCQkJCQlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXYsCiAJCQkJCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLAogCQkJCQlpbnQgb3JpZ19uYm94KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2NsaXBfcmVjdF90IGJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3g7CiAJdW5zaWduZWQgaW50IGNtZHN6OwogCWludCByZXQ7Ci0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXMgPSBjbWRidWYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94ZXMgPSBjbWRidWYtPmJveGVzOwogCWludCBpID0gMDsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtMjgxNiw3ICsyODE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZW1pdF93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGZsYWdzKQorc3RhdGljIGludCByYWRlb25fZW1pdF93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgZmxhZ3MpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTI4NDksOSArMjg0OSw5IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZiA9IE5VTEw7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gTlVMTDsKIAlpbnQgaWR4OwogCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCBjbWRidWY7CiAJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyOwpAQCAtMzA4NSw2ICszMDg1LDkgQEAKIAkJZWxzZQogCQkJdmFsdWUgPSBSQURFT05fQ0FSRF9QQ0k7CiAJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX1ZCTEFOS19DUlRDOgorCQl2YWx1ZSA9IHJhZGVvbl92YmxhbmtfY3J0Y19nZXQoZGV2KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHKCJJbnZhbGlkIHBhcmFtZXRlciAlZFxuIiwgcGFyYW0ucGFyYW0pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtMzEwMiw3ICszMTA1LDcgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OwogCWRybV9yYWRlb25fc2V0cGFyYW1fdCBzcDsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2OwogCkBAIC0zMTQxLDYgKzMxNDQsOSBAQAogCQlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50YWJsZV9zaXplIDwgUkFERU9OX1BDSUdBUlRfVEFCTEVfU0laRSkKIAkJCWRldl9wcml2LT5nYXJ0X2luZm8udGFibGVfc2l6ZSA9IFJBREVPTl9QQ0lHQVJUX1RBQkxFX1NJWkU7CiAJCWJyZWFrOworCWNhc2UgUkFERU9OX1NFVFBBUkFNX1ZCTEFOS19DUlRDOgorCQlyZXR1cm4gcmFkZW9uX3ZibGFua19jcnRjX3NldChkZXYsIHNwLnZhbHVlKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHKCJJbnZhbGlkIHBhcmFtZXRlciAlZFxuIiwgc3AucGFyYW0pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtMzE1Niw3ICszMTYyLDcgQEAKICAqCiAgKiBEUk0gaW5mcmFzdHJ1Y3R1cmUgdGFrZXMgY2FyZSBvZiByZWNsYWltaW5nIGRtYSBidWZmZXJzLgogICovCi12b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zMTY3LDcgKzMxNzMsNyBAQAogCX0KIH0KIAotdm9pZCByYWRlb25fZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMxODAsNyArMzE4Niw3IEBACiAJcmFkZW9uX2RvX3JlbGVhc2UoZGV2KTsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfb3Blbihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpCitpbnQgcmFkZW9uX2RyaXZlcl9vcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKQEAgLTMyMDIsNyArMzIwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQordm9pZCByYWRlb25fZHJpdmVyX3Bvc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2ID0KIAkgICAgZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKaW5kZXggYjk0ZmFiNS4uMThjNzIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNkZWZpbmUgU0FWQUdFX0VWRU5UX1VTRUNfVElNRU9VVAk1MDAwMDAwCS8qIDVzICovCiAjZGVmaW5lIFNBVkFHRV9GUkVFTElTVF9ERUJVRwkJMAogCi1zdGF0aWMgaW50IHNhdmFnZV9kb19jbGVhbnVwX2JjaShkcm1fZGV2aWNlX3QgKmRldik7CitzdGF0aWMgaW50IHNhdmFnZV9kb19jbGVhbnVwX2JjaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogc3RhdGljIGludAogc2F2YWdlX2JjaV93YWl0X2ZpZm9fc2hhZG93KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVuc2lnbmVkIGludCBuKQpAQCAtMjAzLDExICsyMDMsMTEgQEAKIC8qCiAgKiBGcmVlbGlzdCBtYW5hZ2VtZW50CiAgKi8KLXN0YXRpYyBpbnQgc2F2YWdlX2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBzYXZhZ2VfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fc2F2YWdlX2J1Zl9wcml2X3QgKmVudHJ5OwogCWludCBpOwogCURSTV9ERUJVRygiY291bnQ9JWRcbiIsIGRtYS0+YnVmX2NvdW50KTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgZHJtX2J1Zl90ICpzYXZhZ2VfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqc2F2YWdlX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqdGFpbCA9IGRldl9wcml2LT50YWlsLnByZXY7CkBAIC0yNjksNyArMjY5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBzYXZhZ2VfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQordm9pZCBzYXZhZ2VfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqZW50cnkgPSBidWYtPmRldl9wcml2YXRlLCAqcHJldiwgKm5leHQ7CkBAIC01MzUsNyArNTM1LDcgQEAKIAlkZXZfcHJpdi0+Zmlyc3RfZG1hX3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9kbWFfcGFnZSA9IDA7CiB9CiAKLWludCBzYXZhZ2VfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKK2ludCBzYXZhZ2VfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIApAQCAtNTU4LDcgKzU1OCw3IEBACiAgKiBpbiBkcm1fYWRkbWFwLiBUaGVyZWZvcmUgd2UgYWRkIHRoZW0gbWFudWFsbHkgYmVmb3JlIHRoZSBtYXBzIGFyZQogICogaW5pdGlhbGl6ZWQsIGFuZCB0ZWFyIHRoZW0gZG93biBvbiBsYXN0IGNsb3NlLgogICovCi1pbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oZHJtX2RldmljZV90ICpkZXYpCitpbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlLCBmYl9iYXNlLCBmYl9zaXplLCBhcGVydHVyZV9iYXNlOwpAQCAtNjU1LDcgKzY1NSw3IEBACiAvKgogICogRGVsZXRlIE1UUlJzIGFuZCBmcmVlIGRldmljZS1wcml2YXRlIGRhdGEuCiAgKi8KLXZvaWQgc2F2YWdlX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpCit2b2lkIHNhdmFnZV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCQkJCSBkZXZfcHJpdi0+bXRycltpXS5zaXplLCBEUk1fTVRSUl9XQyk7CiB9CiAKLWludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldikKK2ludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTY3Niw3ICs2NzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhdmFnZV9kb19pbml0X2JjaShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9zYXZhZ2VfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgc2F2YWdlX2RvX2luaXRfYmNpKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fc2F2YWdlX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNzExLDcgKzcxMSw3IEBACiAJZGV2X3ByaXYtPnRleHR1cmVfb2Zmc2V0ID0gaW5pdC0+dGV4dHVyZV9vZmZzZXQ7CiAJZGV2X3ByaXYtPnRleHR1cmVfc2l6ZSA9IGluaXQtPnRleHR1cmVfc2l6ZTsKIAotCURSTV9HRVRTQVJFQSgpOworCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CkBAIC04OTgsNyArODk4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTAwNyw5ICsxMDA3LDkgQEAKICAqIERNQSBidWZmZXIgbWFuYWdlbWVudAogICovCiAKLXN0YXRpYyBpbnQgc2F2YWdlX2JjaV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQpCitzdGF0aWMgaW50IHNhdmFnZV9iY2lfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2RtYSAqZCkKIHsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpOwogCiAJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewpAQCAtMTAzNCwxMyArMTAzNCwxMyBAQAogaW50IHNhdmFnZV9iY2lfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9kbWFfdCBkOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kbWEgZDsKIAlpbnQgcmV0ID0gMDsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGQsIChkcm1fZG1hX3QgX191c2VyICopIGRhdGEsIHNpemVvZihkKSk7CisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGQsIChzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKikgZGF0YSwgc2l6ZW9mKGQpKTsKIAogCS8qIFBsZWFzZSBkb24ndCBzZW5kIHVzIGJ1ZmZlcnMuCiAJICovCkBAIC0xMDY0LDE0ICsxMDY0LDE0IEBACiAJCXJldCA9IHNhdmFnZV9iY2lfZ2V0X2J1ZmZlcnMoZmlscCwgZGV2LCAmZCk7CiAJfQogCi0JRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoZHJtX2RtYV90IF9fdXNlciAqKSBkYXRhLCBkLCBzaXplb2YoZCkpOworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKHN0cnVjdCBkcm1fZG1hIF9fdXNlciAqKSBkYXRhLCBkLCBzaXplb2YoZCkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgRFJNRklMRSBmaWxwKQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKIApAQCAtMTA4NSw3ICsxMDg1LDcgQEAKIAkvKmk4MzBfZmx1c2hfcXVldWUoZGV2KTsgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1fc2F2YWdlX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpZiAoYnVmLT5maWxwID09IGZpbHAgJiYgYnVmX3ByaXYgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJtLmgKaW5kZXggZTExNDhlOC4uOGE1NzZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJtLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKIHR5cGVkZWYgc3RydWN0IF9kcm1fc2F2YWdlX3NhcmVhIHsKIAkvKiBMUlUgbGlzdHMgZm9yIHRleHR1cmUgbWVtb3J5IGluIGFncCBzcGFjZSBhbmQgb24gdGhlIGNhcmQuCiAJICovCi0JZHJtX3RleF9yZWdpb25fdCB0ZXhMaXN0W1NBVkFHRV9OUl9URVhfSEVBUFNdW1NBVkFHRV9OUl9URVhfUkVHSU9OUyArCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleExpc3RbU0FWQUdFX05SX1RFWF9IRUFQU11bU0FWQUdFX05SX1RFWF9SRUdJT05TICsKIAkJCQkJCSAgICAgIDFdOwogCXVuc2lnbmVkIGludCB0ZXhBZ2VbU0FWQUdFX05SX1RFWF9IRUFQU107CiAKQEAgLTExMyw3ICsxMTMsNyBAQAogCXVuc2lnbmVkIGludCB2Yl9zaXplOwkvKiBzaXplIG9mIGNsaWVudCB2ZXJ0ZXggYnVmZmVyIGluIGJ5dGVzICovCiAJdW5zaWduZWQgaW50IHZiX3N0cmlkZTsJLyogc3RyaWRlIG9mIHZlcnRpY2VzIGluIDMyYml0IHdvcmRzICovCiAJLyogYm94ZXMgaW4gY2xpZW50J3MgYWRkcmVzcyBzcGFjZSAqLwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveF9hZGRyOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94X2FkZHI7CiAJdW5zaWduZWQgaW50IG5ib3g7CS8qIG51bWJlciBvZiBjbGlwcGluZyBib3hlcyAqLwogfSBkcm1fc2F2YWdlX2NtZGJ1Zl90OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCmluZGV4IDhmMDRiM2QuLjVmZDU0ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCkBAIC01OCw3ICs1OCw3IEBACiAJc3RydWN0IGRybV9zYXZhZ2VfYnVmX3ByaXYgKm5leHQ7CiAJc3RydWN0IGRybV9zYXZhZ2VfYnVmX3ByaXYgKnByZXY7CiAJZHJtX3NhdmFnZV9hZ2VfdCBhZ2U7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIH0gZHJtX3NhdmFnZV9idWZfcHJpdl90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX2RtYV9wYWdlIHsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCS8qIEVyciwgdGhlcmUgaXMgYSBtYWNybyB3YWl0X2V2ZW50IGluIGluY2x1ZGUvbGludXgvd2FpdC5oLgogCSAqIEF2b2lkIHVud2FudGVkIG1hY3JvIGV4cGFuc2lvbi4gKi8KIAl2b2lkICgqZW1pdF9jbGlwX3JlY3QpIChzdHJ1Y3QgZHJtX3NhdmFnZV9wcml2YXRlICogZGV2X3ByaXYsCi0JCQkJY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCk7CisJCQkJY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KTsKIAl2b2lkICgqZG1hX2ZsdXNoKSAoc3RydWN0IGRybV9zYXZhZ2VfcHJpdmF0ZSAqIGRldl9wcml2KTsKIH0gZHJtX3NhdmFnZV9wcml2YXRlX3Q7CiAKQEAgLTIwMywyMiArMjAzLDIyIEBACiAvKiBCQ0kgZnVuY3Rpb25zICovCiBleHRlcm4gdWludDE2X3Qgc2F2YWdlX2JjaV9lbWl0X2V2ZW50KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLWV4dGVybiB2b2lkIHNhdmFnZV9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpOworZXh0ZXJuIHZvaWQgc2F2YWdlX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpOwogZXh0ZXJuIHZvaWQgc2F2YWdlX2RtYV9yZXNldChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIHNhdmFnZV9kbWFfd2FpdChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LCB1bnNpZ25lZCBpbnQgcGFnZSk7CiBleHRlcm4gdWludDMyX3QgKnNhdmFnZV9kbWFfYWxsb2MoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgIHVuc2lnbmVkIGludCBuKTsKLWV4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOwotZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX2ZpcnN0b3Blbihkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gdm9pZCBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KTsKLWV4dGVybiB2b2lkIHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKK2V4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOwogCiAvKiBzdGF0ZSBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zM2QoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIHBib3gpOwogZXh0ZXJuIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3M0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogcGJveCk7CiAKICNkZWZpbmUgU0FWQUdFX0ZCX1NJWkVfUzMJMHgwMTAwMDAwMAkvKiAgMTZNQiAqLwogI2RlZmluZSBTQVZBR0VfRkJfU0laRV9TNAkweDAyMDAwMDAwCS8qICAzMk1CICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYwppbmRleCAxY2ExZTljLi43NzQ5Nzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJzYXZhZ2VfZHJ2LmgiCiAKIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3MzZChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KQogewogCXVpbnQzMl90IHNjc3RhcnQgPSBkZXZfcHJpdi0+c3RhdGUuczNkLm5ld19zY3N0YXJ0OwogCXVpbnQzMl90IHNjZW5kID0gZGV2X3ByaXYtPnN0YXRlLnMzZC5uZXdfc2NlbmQ7CkBAIC01Myw3ICs1Myw3IEBACiB9CiAKIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3M0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KQorCQkJICAgICAgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KQogewogCXVpbnQzMl90IGRyYXdjdHJsMCA9IGRldl9wcml2LT5zdGF0ZS5zNC5uZXdfZHJhd2N0cmwwOwogCXVpbnQzMl90IGRyYXdjdHJsMSA9IGRldl9wcml2LT5zdGF0ZS5zNC5uZXdfZHJhd2N0cmwxOwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2RtYV9wcmltKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKLQkJCQkgICAgY29uc3QgZHJtX2J1Zl90ICogZG1hYnVmKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgZHJtX2J1ZiAqIGRtYWJ1ZikKIHsKIAl1bnNpZ25lZCBjaGFyIHJlb3JkZXIgPSAwOwogCXVuc2lnbmVkIGludCBwcmltID0gY21kX2hlYWRlci0+cHJpbS5wcmltOwpAQCAtNTM2LDcgKzUzNiw3IEBACiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9kbWFfaWR4KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKiBjbWRfaGVhZGVyLAogCQkJCSAgIGNvbnN0IHVpbnQxNl90ICppZHgsCi0JCQkJICAgY29uc3QgZHJtX2J1Zl90ICogZG1hYnVmKQorCQkJCSAgIGNvbnN0IHN0cnVjdCBkcm1fYnVmICogZG1hYnVmKQogewogCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CiAJdW5zaWduZWQgaW50IHByaW0gPSBjbWRfaGVhZGVyLT5pZHgucHJpbTsKQEAgLTc5Miw3ICs3OTIsNyBAQAogCQkJCSBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCiAJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpkYXRhLAogCQkJCSB1bnNpZ25lZCBpbnQgbmJveCwKLQkJCQkgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3hlcykKKwkJCQkgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBmbGFncyA9IGNtZF9oZWFkZXItPmNsZWFyMC5mbGFnczsKIAl1bnNpZ25lZCBpbnQgY2xlYXJfY21kOwpAQCAtODYxLDcgKzg2MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX3N3YXAoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQl1bnNpZ25lZCBpbnQgbmJveCwgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3hlcykKKwkJCQl1bnNpZ25lZCBpbnQgbmJveCwgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBzd2FwX2NtZDsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTg5MiwxMSArODkyLDExIEBACiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9kcmF3KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKnN0YXJ0LAogCQkJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICplbmQsCi0JCQkJY29uc3QgZHJtX2J1Zl90ICogZG1hYnVmLAorCQkJCWNvbnN0IHN0cnVjdCBkcm1fYnVmICogZG1hYnVmLAogCQkJCWNvbnN0IHVuc2lnbmVkIGludCAqdnR4YnVmLAogCQkJCXVuc2lnbmVkIGludCB2Yl9zaXplLCB1bnNpZ25lZCBpbnQgdmJfc3RyaWRlLAogCQkJCXVuc2lnbmVkIGludCBuYm94LAotCQkJCWNvbnN0IGRybV9jbGlwX3JlY3RfdCAqYm94ZXMpCisJCQkJY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBpLCBqOwogCWludCByZXQ7CkBAIC05NTcsMTMgKzk1NywxMyBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmRtYWJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpkbWFidWY7CiAJZHJtX3NhdmFnZV9jbWRidWZfdCBjbWRidWY7CiAJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmtjbWRfYWRkciA9IE5VTEw7CiAJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmZpcnN0X2RyYXdfY21kOwogCXVuc2lnbmVkIGludCAqa3ZiX2FkZHIgPSBOVUxMOwotCWRybV9jbGlwX3JlY3RfdCAqa2JveF9hZGRyID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqa2JveF9hZGRyID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAkJY21kYnVmLnZiX2FkZHIgPSBrdmJfYWRkcjsKIAl9CiAJaWYgKGNtZGJ1Zi5uYm94KSB7Ci0JCWtib3hfYWRkciA9IGRybV9hbGxvYyhjbWRidWYubmJveCAqIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLAorCQlrYm94X2FkZHIgPSBkcm1fYWxsb2MoY21kYnVmLm5ib3ggKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLAogCQkJCSAgICAgICBEUk1fTUVNX0RSSVZFUik7CiAJCWlmIChrYm94X2FkZHIgPT0gTlVMTCkgewogCQkJcmV0ID0gRFJNX0VSUihFTk9NRU0pOwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAkJfQogCiAJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2JveF9hZGRyLCBjbWRidWYuYm94X2FkZHIsCi0JCQkJICAgICAgIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKSB7CisJCQkJICAgICAgIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSkpIHsKIAkJCXJldCA9IERSTV9FUlIoRUZBVUxUKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMTE1OCw3ICsxMTU4LDcgQEAKIAkvKiBJZiB3ZSBkaWRuJ3QgbmVlZCB0byBhbGxvY2F0ZSB0aGVtLCB0aGVzZSdsbCBiZSBOVUxMICovCiAJZHJtX2ZyZWUoa2NtZF9hZGRyLCBjbWRidWYuc2l6ZSAqIDgsIERSTV9NRU1fRFJJVkVSKTsKIAlkcm1fZnJlZShrdmJfYWRkciwgY21kYnVmLnZiX3NpemUsIERSTV9NRU1fRFJJVkVSKTsKLQlkcm1fZnJlZShrYm94X2FkZHIsIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJZHJtX2ZyZWUoa2JveF9hZGRyLCBjbWRidWYubmJveCAqIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksCiAJCSBEUk1fTUVNX0RSSVZFUik7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwppbmRleCA2OTBlMGFmLi4xOTEyZjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwpAQCAtMzUsNyArMzUsNyBAQAogCXNpc2Rydl9QQ0lfSURTCiB9OwogCi1zdGF0aWMgaW50IHNpc19kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQorc3RhdGljIGludCBzaXNfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQogewogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlpbnQgcmV0OwpAQCAtNTQsNyArNTQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2lzX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgaW50IHNpc19kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaAppbmRleCA3MGQ0ZWRlLi41NjMwZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaApAQCAtNDYsNiArNDYsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3NtYW4uaCIKIAorCiAjZGVmaW5lIFNJU19CQVNFIChkZXZfcHJpdi0+bW1pbykKICNkZWZpbmUgU0lTX1JFQUQocmVnKSAgICAgICAgIERSTV9SRUFEMzIoU0lTX0JBU0UsIHJlZyk7CiAjZGVmaW5lIFNJU19XUklURShyZWcsIHZhbCkgICBEUk1fV1JJVEUzMihTSVNfQkFTRSwgcmVnLCB2YWwpOwpAQCAtNTMsNyArNTQsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3Npc19wcml2YXRlIHsKIAlkcm1fbG9jYWxfbWFwX3QgKm1taW87CiAJdW5zaWduZWQgaW50IGlkbGVfZmF1bHQ7Ci0JZHJtX3NtYW5fdCBzbWFuOworCXN0cnVjdCBkcm1fc21hbiBzbWFuOwogCXVuc2lnbmVkIGludCBjaGlwc2V0OwogCWludCB2cmFtX2luaXRpYWxpemVkOwogCWludCBhZ3BfaW5pdGlhbGl6ZWQ7CkBAIC02MSw5ICs2Miw5IEBACiAJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OwogfSBkcm1fc2lzX3ByaXZhdGVfdDsKIAotZXh0ZXJuIGludCBzaXNfaWRsZShkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gdm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIHZvaWQgc2lzX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHNpc19pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgc2lzX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIHZvaWQgc2lzX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3Qgc2lzX2lvY3Rsc1tdOwogZXh0ZXJuIGludCBzaXNfbWF4X2lvY3RsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKaW5kZXggZDI2ZjVkYi4uNDQxYmJkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jCkBAIC05NCw3ICs5NCw3IEBACiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogI2lmIGRlZmluZWQoQ09ORklHX0ZCX1NJUykKIAl7Ci0JCWRybV9zbWFuX21tX3Qgc21hbl9tbTsKKwkJc3RydWN0IGRybV9zbWFuX21tIHNtYW5fbW07CiAJCXNtYW5fbW0ucHJpdmF0ZSA9ICh2b2lkICopMHhGRkZGRkZGRjsKIAkJc21hbl9tbS5hbGxvY2F0ZSA9IHNpc19zbWFuX21tX2FsbG9jYXRlOwogCQlzbWFuX21tLmZyZWUgPSBzaXNfc21hbl9tbV9mcmVlOwpAQCAtMTIzLDE0ICsxMjMsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzaXNfZHJtX2FsbG9jKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIHByaXYsCitzdGF0aWMgaW50IHNpc19kcm1fYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICogcHJpdiwKIAkJCSB1bnNpZ25lZCBsb25nIGRhdGEsIGludCBwb29sKQogewogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKikgZGF0YTsKIAlkcm1fc2lzX21lbV90IG1lbTsKIAlpbnQgcmV0dmFsID0gMDsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICppdGVtOworCXN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqaXRlbTsKIAogCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChtZW0sIGFyZ3AsIHNpemVvZihtZW0pKTsKIApAQCAtMjI5LDEyICsyMjksMTIgQEAKIAlyZXR1cm4gc2lzX2RybV9hbGxvYyhkZXYsIHByaXYsIGRhdGEsIEFHUF9UWVBFKTsKIH0KIAotc3RhdGljIGRybV9sb2NhbF9tYXBfdCAqc2lzX3JlZ19pbml0KGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIGRybV9sb2NhbF9tYXBfdCAqc2lzX3JlZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JZHJtX21hcF9saXN0X3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmVudHJ5OwogCWRybV9sb2NhbF9tYXBfdCAqbWFwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCwgaGVhZCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJbWFwID0gZW50cnktPm1hcDsKIAkJaWYgKCFtYXApCiAJCQljb250aW51ZTsKQEAgLTI0NSw3ICsyNDUsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgc2lzX2lkbGUoZHJtX2RldmljZV90ICpkZXYpCitpbnQgc2lzX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGlkbGVfcmVnOwpAQCAtMzE0LDEwICszMTQsMTAgQEAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIH0KIAotdm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAoZHJtX3NtYW5fb3duZXJfY2xlYW4oJmRldl9wcml2LT5zbWFuLCAodW5zaWduZWQgbG9uZylwcml2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwppbmRleCAxM2E5YzVjLi43ZmYyYjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJcmV0dXJuICh1aW50MzJfdCAqKSAoZGV2X3ByaXYtPmRtYV9wdHIgKyBkZXZfcHJpdi0+ZG1hX2xvdyk7CiB9CiAKLWludCB2aWFfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQoraW50IHZpYV9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQpAQCAtMTY5LDcgKzE2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlhX2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCB2aWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCSAgZHJtX3ZpYV9kbWFfaW5pdF90ICogaW5pdCkKIHsKQEAgLTI2Miw3ICsyNjIsNyBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQorc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAl1aW50MzJfdCAqdmI7CkBAIC0zMTYsNyArMzE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTM1Niw3ICszNTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX3BjaV9jbWRidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICAgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jCmluZGV4IDI4ODFhMDYuLmZkYjg2MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkCi12aWFfZmlyZV9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBpbnQgZW5naW5lKQordmlhX2ZpcmVfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBpbnQgZW5naW5lKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTI4OSw3ICsyODksNyBAQAogfQogCQkJCiBzdGF0aWMgdm9pZAotdmlhX2Fib3J0X2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUpCit2aWFfYWJvcnRfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTI5Nyw3ICsyOTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotdmlhX2RtYWJsaXRfZW5naW5lX29mZihkcm1fZGV2aWNlX3QgKmRldiwgaW50IGVuZ2luZSkKK3ZpYV9kbWFibGl0X2VuZ2luZV9vZmYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCkBAIC0zMTQsNyArMzE0LDcgQEAKICAqLwogCQkKIHZvaWQKLXZpYV9kbWFibGl0X2hhbmRsZXIoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUsIGludCBmcm9tX2lycSkKK3ZpYV9kbWFibGl0X2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSwgaW50IGZyb21faXJxKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IGRldl9wcml2LT5ibGl0X3F1ZXVlcyArIGVuZ2luZTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogICovCiAKIHN0YXRpYyBpbnQKLXZpYV9kbWFibGl0X3N5bmMoZHJtX2RldmljZV90ICpkZXYsIHVpbnQzMl90IGhhbmRsZSwgaW50IGVuZ2luZSkgCit2aWFfZG1hYmxpdF9zeW5jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGhhbmRsZSwgaW50IGVuZ2luZSkgCiB7CiAKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiB2aWFfZG1hYmxpdF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IChkcm1fdmlhX2JsaXRxX3QgKikgZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IGJsaXRxLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsaXRxLT5kZXY7CiAJaW50IGVuZ2luZSA9IChpbnQpCiAJCShibGl0cSAtICgoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlKS0+YmxpdF9xdWV1ZXMpOwogCQkKQEAgLTUwMiw3ICs1MDIsNyBAQAogdmlhX2RtYWJsaXRfd29ya3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gY29udGFpbmVyX29mKHdvcmssIGRybV92aWFfYmxpdHFfdCwgd3EpOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gYmxpdHEtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxpdHEtPmRldjsKIAl1bnNpZ25lZCBsb25nIGlycXNhdmU7CiAJZHJtX3ZpYV9zZ19pbmZvX3QgKmN1cl9zZzsKIAlpbnQgY3VyX3JlbGVhc2VkOwpAQCAtNTQ1LDcgKzU0NSw3IEBACiAKIAogdm9pZAotdmlhX2luaXRfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldikKK3ZpYV9pbml0X2RtYWJsaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaSxqOwogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CkBAIC01ODIsNyArNTgyLDcgQEAKIAkJCiAKIHN0YXRpYyBpbnQKLXZpYV9idWlsZF9zZ19pbmZvKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikKK3ZpYV9idWlsZF9zZ19pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2csIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQogewogCWludCBkcmF3ID0geGZlci0+dG9fZmI7CiAJaW50IHJldCA9IDA7CkBAIC03MzAsNyArNzMwLDcgQEAKIAogCiBzdGF0aWMgaW50IAotdmlhX2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYsIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQkgCit2aWFfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikJIAogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaAppbmRleCBmNDAzNmNkLi42ZjZhNTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oCkBAIC01OSw3ICs1OSw3IEBACiB9IGRybV92aWFfc2dfaW5mb190OwogCiB0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9ibGl0cSB7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAl1aW50MzJfdCBjdXJfYmxpdF9oYW5kbGU7CiAJdWludDMyX3QgZG9uZV9ibGl0X2hhbmRsZTsKIAl1bnNpZ25lZCBzZXJ2aWNlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKaW5kZXggZTRlZTk3ZC4uOGY1M2M3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKQEAgLTQwLDcgKzQwLDcgQEAKICNkZWZpbmUgVklBX05SX1hWTUNfTE9DS1MgICAgICAgICAgICAgICA1CiAjZGVmaW5lIFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgICAgICAgICAgNjQKICNkZWZpbmUgWFZNQ0xPQ0tQVFIoc2FQcml2LGxvY2tObykJCQkJCVwKLQkoKHZvbGF0aWxlIGRybV9od19sb2NrX3QgKikoKCgoKHVuc2lnbmVkIGxvbmcpIChzYVByaXYpLT5Ydk1DTG9ja0FyZWEpICsgXAorCSgodm9sYXRpbGUgc3RydWN0IGRybV9od19sb2NrICopKCgoKCh1bnNpZ25lZCBsb25nKSAoc2FQcml2KS0+WHZNQ0xvY2tBcmVhKSArIFwKIAkJCQkgICAgICAoVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSAmCVwKIAkJCQkgICAgIH4oVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSArCVwKIAkJCQkgICAgVklBX01BWF9DQUNIRUxJTkVfU0laRSoobG9ja05vKSkpCkBAIC0xODIsNyArMTgyLDcgQEAKIHR5cGVkZWYgc3RydWN0IF9kcm1fdmlhX3NhcmVhIHsKIAl1bnNpZ25lZCBpbnQgZGlydHk7CiAJdW5zaWduZWQgaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IGJveGVzW1ZJQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1ZJQV9OUl9TQVJFQV9DTElQUkVDVFNdOwogCWRybV92aWFfdGV4X3JlZ2lvbl90IHRleExpc3RbVklBX05SX1RFWF9SRUdJT05TICsgMV07CiAJaW50IHRleEFnZTsJCS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLwogCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKaW5kZXggYjQ2Y2E4ZS4uNTc2NzExNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKQEAgLTg3LDcgKzg3LDcgQEAKIAl1aW50MzJfdCBpcnFfcGVuZGluZ19tYXNrOwogCWludCAqaXJxX21hcDsKIAl1bnNpZ25lZCBpbnQgaWRsZV9mYXVsdDsKLQlkcm1fc21hbl90IHNtYW47CisJc3RydWN0IGRybV9zbWFuIHNtYW47CiAJaW50IHZyYW1faW5pdGlhbGl6ZWQ7CiAJaW50IGFncF9pbml0aWFsaXplZDsKIAl1bnNpZ25lZCBsb25nIHZyYW1fb2Zmc2V0OwpAQCAtMTIzLDMxICsxMjMsMzEgQEAKIGV4dGVybiBpbnQgdmlhX2RtYV9ibGl0X3N5bmMoIERSTV9JT0NUTF9BUkdTICk7CiBleHRlcm4gaW50IHZpYV9kbWFfYmxpdCggRFJNX0lPQ1RMX0FSR1MgKTsKIAotZXh0ZXJuIGludCB2aWFfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCk7Ci1leHRlcm4gaW50IHZpYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiBpbnQgdmlhX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCk7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi1leHRlcm4gaW50IHZpYV9pbml0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY29udGV4dCk7Ci1leHRlcm4gaW50IHZpYV9maW5hbF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCB2aWFfaW5pdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50IHZpYV9maW5hbF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgY29udGV4dCk7CiAKLWV4dGVybiBpbnQgdmlhX2RvX2NsZWFudXBfbWFwKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgdmlhX2RvX2NsZWFudXBfbWFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgdmlhX2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCB2aWFfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKLWV4dGVybiBpbnQgdmlhX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IHZpYV9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gdm9pZCB2aWFfaW5pdF9jb21tYW5kX3ZlcmlmaWVyKHZvaWQpOwotZXh0ZXJuIGludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiB2b2lkIHZpYV9pbml0X2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogZXh0ZXJuIHZvaWQgdmlhX2NsZWFudXBfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiBleHRlcm4gdm9pZCB2aWFfcmVsZWFzZV9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgY29udGV4dCk7CiAKLWV4dGVybiB2b2lkIHZpYV9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gdm9pZCB2aWFfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiB2b2lkIHZpYV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLWV4dGVybiB2b2lkIHZpYV9kbWFibGl0X2hhbmRsZXIoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUsIGludCBmcm9tX2lycSk7Ci1leHRlcm4gdm9pZCB2aWFfaW5pdF9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kbWFibGl0X2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSwgaW50IGZyb21faXJxKTsKK2V4dGVybiB2b2lkIHZpYV9pbml0X2RtYWJsaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYwppbmRleCAxYWM1OTQxLi44ZGM5OWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYwpAQCAtOTgsNyArOTgsNyBAQAogCiBpcnFyZXR1cm5fdCB2aWFfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBzdGF0dXM7CiAJaW50IGhhbmRsZWQgPSAwOwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJfQogfQogCi1pbnQgdmlhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgdmlhX2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKQEAgLTE5MSw3ICsxOTEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci12aWFfZHJpdmVyX2lycV93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IGlycSwgaW50IGZvcmNlX3NlcXVlbmNlLAordmlhX2RyaXZlcl9pcnFfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGlycSwgaW50IGZvcmNlX3NlcXVlbmNlLAogCQkgICAgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTI0NCw3ICsyNDQsNyBAQAogICogZHJtX2RtYS5oIGhvb2tzCiAgKi8KIAotdm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgc3RhdHVzOwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJfQogfQogCi12b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKQEAgLTMxMiw3ICszMTIsNyBAQAogCX0KIH0KIAotdm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKaW5kZXggNGUzZmMwNy4uN2ZiOWQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKQEAgLTI1LDEzICsyNSwxMyBAQAogI2luY2x1ZGUgInZpYV9kcm0uaCIKICNpbmNsdWRlICJ2aWFfZHJ2LmgiCiAKLXN0YXRpYyBpbnQgdmlhX2RvX2luaXRfbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3ZpYV9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCB2aWFfZG9faW5pdF9tYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV92aWFfaW5pdF90ICogaW5pdCkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAotCURSTV9HRVRTQVJFQSgpOworCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CkBAIC02OCw3ICs2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB2aWFfZG9fY2xlYW51cF9tYXAoZHJtX2RldmljZV90ICogZGV2KQoraW50IHZpYV9kb19jbGVhbnVwX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAl2aWFfZG1hX2NsZWFudXAoZGV2KTsKIApAQCAtOTUsNyArOTUsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1pbnQgdmlhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCitpbnQgdmlhX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJaW50IHJldCA9IDA7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgdmlhX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpCitpbnQgdmlhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwppbmRleCAyZmNmMDU3Li44NWQ1NmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiAJZHJtX3ZpYV9tZW1fdCBtZW07CiAJaW50IHJldHZhbCA9IDA7Ci0JZHJtX21lbWJsb2NrX2l0ZW1fdCAqaXRlbTsKKwlzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKml0ZW07CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyB0bXBTaXplOwogCkBAIC0xODgsMTAgKzE4OCwxMCBAQAogfQogCiAKLXZvaWQgdmlhX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgdmlhX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKGRybV9zbWFuX293bmVyX2NsZWFuKCZkZXZfcHJpdi0+c21hbiwgKHVuc2lnbmVkIGxvbmcpcHJpdikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jCmluZGV4IDJlN2UwODAuLjgzMmQ0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwpAQCAtMjUyLDEwICsyNTIsOSBAQAogc3RhdGljIF9faW5saW5lX18gZHJtX2xvY2FsX21hcF90ICp2aWFfZHJtX2xvb2t1cF9hZ3BfbWFwKGRybV92aWFfc3RhdGVfdCAqc2VxLAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkJCSAgICBkcm1fZGV2aWNlX3QgKiBkZXYpCisJCQkJCQkgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAlkcm1fbG9jYWxfbWFwX3QgKm1hcCA9IHNlcS0+bWFwX2NhY2hlOwogCiAJaWYgKG1hcCAmJiBtYXAtPm9mZnNldCA8PSBvZmZzZXQKQEAgLTI2Myw4ICsyNjIsNyBAQAogCQlyZXR1cm4gbWFwOwogCX0KIAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlyX2xpc3QgPSAoZHJtX21hcF9saXN0X3QgKikgbGlzdDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQltYXAgPSByX2xpc3QtPm1hcDsKIAkJaWYgKCFtYXApCiAJCQljb250aW51ZTsKQEAgLTk2NCw3ICs5NjIsNyBAQAogCiBpbnQKIHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLAotCQkJICBkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBhZ3ApCisJCQkgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgYWdwKQogewogCiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMDM5LDcgKzEwMzcsNyBAQAogfQogCiBpbnQKLXZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShkcm1fZGV2aWNlX3QgKiBkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLAordmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBjb25zdCB1aW50MzJfdCAqIGJ1ZiwKIAkJCSB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmgKaW5kZXggYjc3ZjU5ZC4uMjhiNTAyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCkBAIC00Nyw3ICs0Nyw3IEBACiAJZHJtX3ZpYV9zZXF1ZW5jZV90IHVuZmluaXNoZWQ7CiAJaW50IGFncF90ZXh0dXJlOwogCWludCBtdWx0aXRleDsKLQlkcm1fZGV2aWNlX3QgKmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCWRybV9sb2NhbF9tYXBfdCAqbWFwX2NhY2hlOwogCXVpbnQzMl90IHZlcnRleF9jb3VudDsKIAlpbnQgYWdwOwpAQCAtNTUsOCArNTUsOCBAQAogfSBkcm1fdmlhX3N0YXRlX3Q7CiAKIGV4dGVybiBpbnQgdmlhX3ZlcmlmeV9jb21tYW5kX3N0cmVhbShjb25zdCB1aW50MzJfdCAqIGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsCi0JCQkJICAgICBkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBhZ3ApOwotZXh0ZXJuIGludCB2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICpkZXYsIGNvbnN0IHVpbnQzMl90ICpidWYsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGFncCk7CitleHRlcm4gaW50IHZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCB1aW50MzJfdCAqYnVmLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VzcC5jIGIvZHJpdmVycy9jaGFyL2VzcC5jCmluZGV4IGQxYmZiYWEuLjc0Y2Q1MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9lc3AuYworKysgYi9kcml2ZXJzL2NoYXIvZXNwLmMKQEAgLTExMjEsOCArMTEyMSw2IEBACiAJLyoKIAkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKIAkgKi8KLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCiAJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOwogCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCiAJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9QRTsKQEAgLTE5MjAsMTEgKzE5MTgsNiBAQAogCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JICAgICYmICggICBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCQlyZXR1cm47Ci0KIAljaGFuZ2Vfc3BlZWQoaW5mbyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwppbmRleCA4ZWEwMjc1Li44ZmFjZjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwpAQCAtNDMsMTYgKzQzLDYgQEAKIAogI2RlZmluZSBmdW5jX2VudGVyKCkgZ3NfZHByaW50ayAoR1NfREVCVUdfRkxPVywgImdzOiBlbnRlciAlc1xuIiwgX19GVU5DVElPTl9fKQogI2RlZmluZSBmdW5jX2V4aXQoKSAgZ3NfZHByaW50ayAoR1NfREVCVUdfRkxPVywgImdzOiBleGl0ICAlc1xuIiwgX19GVU5DVElPTl9fKQotI2RlZmluZSBORVdfV1JJVEVfTE9DS0lORyAxCi0jaWYgTkVXX1dSSVRFX0xPQ0tJTkcKLSNkZWZpbmUgREVDTCAgICAgIC8qIE5vdGhpbmcgKi8KLSNkZWZpbmUgTE9DS0lUICAgIG11dGV4X2xvY2soJiBwb3J0LT5wb3J0X3dyaXRlX211dGV4KTsKLSNkZWZpbmUgUkVMRUFTRUlUIG11dGV4X3VubG9jaygmcG9ydC0+cG9ydF93cml0ZV9tdXRleCk7Ci0jZWxzZQotI2RlZmluZSBERUNMICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSNkZWZpbmUgTE9DS0lUICAgIHNhdmVfZmxhZ3MgKGZsYWdzKTtjbGkgKCkKLSNkZWZpbmUgUkVMRUFTRUlUIHJlc3RvcmVfZmxhZ3MgKGZsYWdzKQotI2VuZGlmCiAKICNkZWZpbmUgUlNfRVZFTlRfV1JJVEVfV0FLRVVQCTEKIApAQCAtNjIsNyArNTIsNiBAQAogdm9pZCBnc19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgdW5zaWduZWQgY2hhciBjaCkKIHsKIAlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKLQlERUNMCiAKIAlmdW5jX2VudGVyICgpOyAKIApAQCAtNzUsMTEgKzY0LDExIEBACiAJaWYgKCEgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSByZXR1cm47CiAKIAkvKiBUYWtlIGEgbG9jayBvbiB0aGUgc2VyaWFsIHRyYW5taXQgYnVmZmVyISAqLwotCUxPQ0tJVDsKKwltdXRleF9sb2NrKCYgcG9ydC0+cG9ydF93cml0ZV9tdXRleCk7CiAKIAlpZiAocG9ydC0+eG1pdF9jbnQgPj0gU0VSSUFMX1hNSVRfU0laRSAtIDEpIHsKIAkJLyogU29ycnksIGJ1ZmZlciBpcyBmdWxsLCBkcm9wIGNoYXJhY3Rlci4gVXBkYXRlIHN0YXRpc3RpY3M/Pz8/IC0tIFJFVyAqLwotCQlSRUxFQVNFSVQ7CisJCW11dGV4X3VubG9jaygmcG9ydC0+cG9ydF93cml0ZV9tdXRleCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg3LDEzICs3NiwxMSBAQAogCXBvcnQtPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKIAlwb3J0LT54bWl0X2NudCsrOyAgLyogQ2hhcmFjdGVycyBpbiBidWZmZXIgKi8KIAotCVJFTEVBU0VJVDsKKwltdXRleF91bmxvY2soJnBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwogCWZ1bmNfZXhpdCAoKTsKIH0KIAogCi0jaWZkZWYgTkVXX1dSSVRFX0xPQ0tJTkcKLQogLyoKID4gUHJvYmxlbXMgdG8gdGFrZSBpbnRvIGFjY291bnQgYXJlOgogPiAgICAgICAtMS0gSW50ZXJydXB0cyB0aGF0IGVtcHR5IHBhcnQgb2YgdGhlIGJ1ZmZlci4KQEAgLTE2Niw5MCArMTUzLDYgQEAKIAlmdW5jX2V4aXQgKCk7CiAJcmV0dXJuIHRvdGFsOwogfQotI2Vsc2UKLS8qCi0+IFByb2JsZW1zIHRvIHRha2UgaW50byBhY2NvdW50IGFyZToKLT4gICAgICAgLTEtIEludGVycnVwdHMgdGhhdCBlbXB0eSBwYXJ0IG9mIHRoZSBidWZmZXIuCi0+ICAgICAgIC0yLSBwYWdlIGZhdWx0cyBvbiB0aGUgYWNjZXNzIHRvIHVzZXJzcGFjZS4gCi0+ICAgICAgIC0zLSBPdGhlciBwcm9jZXNzZXMgdGhhdCBhcmUgYWxzbyB0cnlpbmcgdG8gZG8gYSAid3JpdGUiLiAKLSovCi0KLWludCBnc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCi17Ci0Jc3RydWN0IGdzX3BvcnQgKnBvcnQ7Ci0JaW50IGMsIHRvdGFsID0gMDsKLQlpbnQgdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZnVuY19lbnRlciAoKTsKLQotCS8qIFRoZSBzdGFuZGFyZCBzZXJpYWwgZHJpdmVyIHJldHVybnMgMCBpbiB0aGlzIGNhc2UuIAotCSAgIFRoYXQgc291bmRzIHRvIG1lIGFzICJObyBlcnJvciwgSSBqdXN0IGRpZG4ndCBnZXQgdG8gd3JpdGluZyBhbnkKLQkgICBieXRlcy4gRmVlbCBmcmVlIHRvIHRyeSBhZ2Fpbi4iIAotCSAgIFRoZSAib2ZmaWNpYWwiIHdheSB0byB3cml0ZSBuIGJ5dGVzIGZyb20gYnVmIGlzOgotCi0JCSBmb3IgKG53cml0dGVuID0gMDtud3JpdHRlbiA8IG47bndyaXR0ZW4gKz0gcnYpIHsKLQkJCSBydiA9IHdyaXRlIChmZCwgYnVmK253cml0dGVuLCBuLW53cml0dGVuKTsKLQkJCSBpZiAocnYgPCAwKSBicmVhazsgLy8gRXJyb3I6IGJhaWwgb3V0LiAvLwotCQkgfSAKLQotCSAgIHdoaWNoIHdpbGwgbG9vcCBlbmRsZXNzbHkgaW4gdGhpcyBjYXNlLiBUaGUgbWFudWFsIHBhZ2UgZm9yIHdyaXRlCi0JICAgYWdyZWVzIHdpdGggbWUuIEluIHByYWN0aXNlIGFsbW9zdCBldmVyeWJvZHkgd3JpdGVzIAotCSAgICJ3cml0ZSAoZmQsIGJ1ZixuKTsiIGJ1dCBzb21lIHBlb3BsZSBtaWdodCBoYXZlIGhhZCB0byBkZWFsIHdpdGggCi0JICAgaW5jb21wbGV0ZSB3cml0ZXMgaW4gdGhlIHBhc3QgYW5kIGNvcnJlY3RseSBpbXBsZW1lbnRlZCBpdCBieSBub3cuLi4gCi0JICovCi0KLQlpZiAoIXR0eSkgcmV0dXJuIC1FSU87Ci0KLQlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXBvcnQgfHwgIXBvcnQtPnhtaXRfYnVmKQotCQlyZXR1cm4gLUVJTzsKLQotCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotCXdoaWxlICgxKSB7Ci0JCWNsaSgpOwotCQljID0gY291bnQ7Ci0KLQkJLyogVGhpcyBpcyBzYWZlIGJlY2F1c2Ugd2UgIk9XTiIgdGhlICJoZWFkIi4gTm9vbmUgZWxzZSBjYW4gCi0JCSAgIGNoYW5nZSB0aGUgImhlYWQiOiB3ZSBvd24gdGhlIHBvcnRfd3JpdGVfbXV0ZXguICovCi0JCS8qIERvbid0IG92ZXJydW4gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCi0JCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkOwotCQlpZiAodCA8IGMpIGMgPSB0OwotCi0JCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHRoZSB4bWl0X2NudCBjYW4gb25seSBkZWNyZWFzZS4gVGhpcyAKLQkJICAgd291bGQgaW5jcmVhc2UgInQiLCBzbyB3ZSBtaWdodCBjb3B5IHRvbyBsaXR0bGUgY2hhcnMuICovCi0JCS8qIERvbid0IGNvcHkgcGFzdCB0aGUgImhlYWQiIG9mIHRoZSBidWZmZXIgKi8KLQkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSAxIC0gcG9ydC0+eG1pdF9jbnQ7Ci0JCWlmICh0IDwgYykgYyA9IHQ7Ci0KLQkJLyogQ2FuJ3QgY29weSBtb3JlPyBicmVhayBvdXQhICovCi0JCWlmIChjIDw9IDApIHsKLQkJCWxvY2FsX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQkJbWVtY3B5KHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGMpOwotCQlwb3J0LT54bWl0X2hlYWQgPSAoKHBvcnQtPnhtaXRfaGVhZCArIGMpICYKLQkJICAgICAgICAgICAgICAgICAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKLQkJcG9ydC0+eG1pdF9jbnQgKz0gYzsKLQkJbG9jYWxfcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0JCWJ1ZiArPSBjOwotCQljb3VudCAtPSBjOwotCQl0b3RhbCArPSBjOwotCX0KLQotCWlmIChwb3J0LT54bWl0X2NudCAmJiAKLQkgICAgIXR0eS0+c3RvcHBlZCAmJiAKLQkgICAgIXR0eS0+aHdfc3RvcHBlZCAmJgotCSAgICAhKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pKSB7Ci0JCXBvcnQtPmZsYWdzIHw9IEdTX1RYX0lOVEVOOwotCQlwb3J0LT5yZC0+ZW5hYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOwotCX0KLQlmdW5jX2V4aXQgKCk7Ci0JcmV0dXJuIHRvdGFsOwotfQotCi0jZW5kaWYKIAogCiAKQEAgLTczNywyMyArNjQwLDYgQEAKIAkJZ3NfZHByaW50ayAoR1NfREVCVUdfVEVSTUlPUywgInRlcm1pb3Mgc3RydWN0dXJlICglcCk6XG4iLCB0aW9zcCk7CiAJfQogCi0JLyogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gdGhhdCBpcyBvbmx5IGFsbG93ZWQgZm9yIGR1bWIgY2FyZHMgKi8KLQkvKiBTbWFydCBjYXJkcyByZXF1aXJlIGtub3dsZWRnZSBvZiBpZmxhZ3MgYW5kIG9mbGFncyB0b286IHRoYXQgCi0JICAgbWlnaHQgY2hhbmdlIGhhcmR3YXJlIGNvb2tpbmcgbW9kZS4uLi4gKi8KLQlpZiAob2xkX3Rlcm1pb3MpIHsKLQkJaWYoICAgKHRpb3NwLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQotCQkgICAmJiAodGlvc3AtPmNfb2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfb2ZsYWcpCi0JCSAgICYmICh0aW9zcC0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkJICAgJiYgKHRpb3NwLT5jX2xmbGFnID09IG9sZF90ZXJtaW9zLT5jX2xmbGFnKQotCQkgICAmJiAodGlvc3AtPmNfbGluZSAgPT0gb2xkX3Rlcm1pb3MtPmNfbGluZSkKLQkJICAgJiYgKG1lbWNtcCh0aW9zcC0+Y19jYywgb2xkX3Rlcm1pb3MtPmNfY2MsIE5DQykgPT0gMCkpIHsKLQkJCWdzX2RwcmludGsoR1NfREVCVUdfVEVSTUlPUywgImdzX3NldF90ZXJtaW9zOiBvcHRpbWl6ZWQgYXdheVxuIik7Ci0JCQlyZXR1cm4gLyogMCAqLzsKLQkJfQotCX0gZWxzZSAKLQkJZ3NfZHByaW50ayhHU19ERUJVR19URVJNSU9TLCAiZ3Nfc2V0X3Rlcm1pb3M6IG5vIG9sZF90ZXJtaW9zOiAiCi0JCSAgICAgICAgICAgIm5vIG9wdGltaXphdGlvblxuIik7Ci0KIAlpZihvbGRfdGVybWlvcyAmJiAoZ3NfZGVidWcgJiBHU19ERUJVR19URVJNSU9TKSkgewogCQlpZih0aW9zcC0+Y19pZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19pZmxhZykgIHByaW50aygiY19pZmxhZyBjaGFuZ2VkXG4iKTsKIAkJaWYodGlvc3AtPmNfb2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfb2ZsYWcpICBwcmludGsoImNfb2ZsYWcgY2hhbmdlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VucnRjLmMgYi9kcml2ZXJzL2NoYXIvZ2VucnRjLmMKaW5kZXggOWUxZmMwMi4uNjlmMGEyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9nZW5ydGMuYwpAQCAtMTczLDcgKzE3Myw2IEBACiBzdGF0aWMgc3NpemVfdCBnZW5fcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAl1bnNpZ25lZCBsb25nIGRhdGE7CiAJc3NpemVfdCByZXR2YWw7CiAKQEAgLTE4MywxOCArMTgyLDEwIEBACiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLICYmICFnZW5fcnRjX2lycV9kYXRhKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCWFkZF93YWl0X3F1ZXVlKCZnZW5fcnRjX3dhaXQsICZ3YWl0KTsKLQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0KLQl3aGlsZSAoMSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlkYXRhID0geGNoZygmZ2VuX3J0Y19pcnFfZGF0YSwgMCk7Ci0JCWlmIChkYXRhKQotCQkJYnJlYWs7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWdvdG8gb3V0OwotCQlzY2hlZHVsZSgpOwotCX0KKwlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZ2VuX3J0Y193YWl0LAorCQkJKGRhdGEgPSB4Y2hnKCZnZW5fcnRjX2lycV9kYXRhLCAwKSkpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OwogCiAJLyogZmlyc3QgdGVzdCBhbGxvd3Mgb3B0aW1pemVyIHRvIG51a2UgdGhpcyBjYXNlIGZvciAzMi1iaXQgbWFjaGluZXMgKi8KIAlpZiAoc2l6ZW9mIChpbnQpICE9IHNpemVvZiAobG9uZykgJiYgY291bnQgPT0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSB7CkBAIC0yMDYsMTAgKzE5Nyw3IEBACiAJCXJldHZhbCA9IHB1dF91c2VyKGRhdGEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWJ1ZikgPzoKIAkJCXNpemVvZih1bnNpZ25lZCBsb25nKTsKIAl9Ci0gb3V0OgotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmZ2VuX3J0Y193YWl0LCAmd2FpdCk7Ci0KK291dDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCmluZGV4IDMyMmJjNWYuLjgzYzExNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCkBAIC02NzQsMTEgKzY3NCwxMiBAQAogICogY2FsbGluZyBodmNfcG9sbCgpIHdobyBkZXRlcm1pbmVzIHdoZXRoZXIgYSBjb25zb2xlIGFkYXB0ZXIgc3VwcG9ydAogICogaW50ZXJydXB0cy4KICAqLwotaW50IGtodmNkKHZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQga2h2Y2Qodm9pZCAqdW51c2VkKQogewogCWludCBwb2xsX21hc2s7CiAJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlkbyB7CiAJCXBvbGxfbWFzayA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2ludGVsLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYwppbmRleCA0YWU5ODExLi43NTNmNDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2ludGVsLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vaW50ZWwtcm5nLmMKQEAgLTI5NiwxMiArMjk2LDEwIEBACiAJICAgICAoQklPU19DTlRMX0xPQ0tfRU5BQkxFX01BU0t8QklPU19DTlRMX1dSSVRFX0VOQUJMRV9NQVNLKSkKIAkgICAgPT0gQklPU19DTlRMX0xPQ0tfRU5BQkxFX01BU0spIHsKIAkJc3RhdGljIF9faW5pdGRhdGEgLypjb25zdCovIGNoYXIgd2FybmluZ1tdID0KLQkJCUtFUk5fV0FSTklORyBQRlggIkZpcm13YXJlIHNwYWNlIGlzIGxvY2tlZCByZWFkLW9ubHkuICIKLQkJCUtFUk5fV0FSTklORyBQRlggIklmIHlvdSBjYW4ndCBvclxuIGRvbid0IHdhbnQgdG8gIgotCQkJS0VSTl9XQVJOSU5HIFBGWCAiZGlzYWJsZSB0aGlzIGluIGZpcm13YXJlIHNldHVwLCBhbmQgIgotCQkJS0VSTl9XQVJOSU5HIFBGWCAiaWZcbiB5b3UgYXJlIGNlcnRhaW4gdGhhdCB5b3VyICIKLQkJCUtFUk5fV0FSTklORyBQRlggInN5c3RlbSBoYXMgYSBmdW5jdGlvbmFsXG4gUk5HLCB0cnkiCi0JCQlLRVJOX1dBUk5JTkcgUEZYICJ1c2luZyB0aGUgJ25vX2Z3aF9kZXRlY3QnIG9wdGlvbi5cbiI7CisJCQlLRVJOX1dBUk5JTkcgUEZYICJGaXJtd2FyZSBzcGFjZSBpcyBsb2NrZWQgcmVhZC1vbmx5LiBJZiB5b3UgY2FuJ3Qgb3JcbiIKKwkJCUtFUk5fV0FSTklORyBQRlggImRvbid0IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGluIGZpcm13YXJlIHNldHVwLCBhbmQgaWZcbiIKKwkJCUtFUk5fV0FSTklORyBQRlggInlvdSBhcmUgY2VydGFpbiB0aGF0IHlvdXIgc3lzdGVtIGhhcyBhIGZ1bmN0aW9uYWxcbiIKKwkJCUtFUk5fV0FSTklORyBQRlggIlJORywgdHJ5IHVzaW5nIHRoZSAnbm9fZndoX2RldGVjdCcgb3B0aW9uLlxuIjsKIAogCQlpZiAobm9fZndoX2RldGVjdCkKIAkJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuYwppbmRleCBkZDc2MWExLi42MWVmMDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuYwpAQCAtNDMsOCArNDMsNiBAQAogc3RhdGljIHZvaWQgaWlXcml0ZU1hc2tJSShpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyKTsKIHN0YXRpYyB2b2lkIGlpV3JpdGVNYXNrSUlFWChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyKTsKIAotc3RhdGljIHZvaWQgaWkyRGVsYXlUaW1lcih1bnNpZ25lZCBpbnQpOwotc3RhdGljIHZvaWQgaWkyRGVsYXlXYWtldXAodW5zaWduZWQgbG9uZyBpZCk7CiBzdGF0aWMgdm9pZCBpaTJOb3Aodm9pZCk7CiAKIC8vKioqKioqKioqKioqKioqCkBAIC01NSw4ICs1Myw2IEBACiAKIHN0YXRpYyBpbnQgaWlEZWxheWVkOwkvLyBTZXQgd2hlbiB0aGUgaWlSZXNldERlbGF5IGZ1bmN0aW9uIGlzCiAJCQkJCQkJLy8gY2FsbGVkLiBDbGVhcmVkIHdoZW4gQU5ZIGJvYXJkIGlzIHJlc2V0Lgotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0ICogcERlbGF5VGltZXI7ICAgLy8gVXNlZCBieSBpaURlbGF5VGltZXIKLXN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBwRGVsYXlXYWl0OyAgICAvLyBVc2VkIGJ5IGlpRGVsYXlUaW1lcgogc3RhdGljIHJ3bG9ja190IERsX3NwaW5sb2NrOwogCiAvLyoqKioqKioqCkBAIC04Niw5ICs4Miw2IEBACiBzdGF0aWMgdm9pZAogaWlFbGxpc0luaXQodm9pZCkKIHsKLQlwRGVsYXlUaW1lciA9IGttYWxsb2MgKCBzaXplb2YgKHN0cnVjdCB0aW1lcl9saXN0KSwgR0ZQX0tFUk5FTCApOwotCWluaXRfdGltZXIocERlbGF5VGltZXIpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBEZWxheVdhaXQpOwogCUxPQ0tfSU5JVCgmRGxfc3BpbmxvY2spOwogfQogCkBAIC0xMDYsNyArOTksNiBAQAogc3RhdGljIHZvaWQKIGlpRWxsaXNDbGVhbnVwKHZvaWQpCiB7Ci0Ja2ZyZWUocERlbGF5VGltZXIpOwogfQogCiAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTYwLDE5ICs1NTIsNiBAQAogCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOwogfQogCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIERlbGF5IFJvdXRpbmVzCi0vLwotLy8gaWlEZWxheUlPCi0vLyBpaU5vcAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXN0YXRpYyB2b2lkCi1paTJEZWxheVdha2V1cCh1bnNpZ25lZCBsb25nIGlkKQotewotCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoICZwRGVsYXlXYWl0ICk7Ci19Ci0KIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyBGdW5jdGlvbjogICBpaTJEZWxheVRpbWVyKG1zZWNvbmRzKQogLy8gUGFyYW1ldGVyczogbXNlY29uZHMgLSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5CkBAIC01OTQsMjggKzU3Myw3IEBACiBzdGF0aWMgdm9pZAogaWkyRGVsYXlUaW1lcih1bnNpZ25lZCBpbnQgbXNlY29uZHMpCiB7Ci0Jd2FpdF9xdWV1ZV90IHdhaXQ7Ci0KLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7Ci0KLQlpbml0X3RpbWVyICggcERlbGF5VGltZXIgKTsKLQotCWFkZF93YWl0X3F1ZXVlKCZwRGVsYXlXYWl0LCAmd2FpdCk7Ci0KLQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19JTlRFUlJVUFRJQkxFICk7Ci0KLQlwRGVsYXlUaW1lci0+ZXhwaXJlcyAgPSBqaWZmaWVzICsgKCBtc2Vjb25kcyArIDkgKSAvIDEwOwotCXBEZWxheVRpbWVyLT5mdW5jdGlvbiA9IGlpMkRlbGF5V2FrZXVwOwotCXBEZWxheVRpbWVyLT5kYXRhICAgICA9IDA7Ci0KLQlhZGRfdGltZXIgKCBwRGVsYXlUaW1lciApOwotCi0Jc2NoZWR1bGUoKTsKLQotCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX1JVTk5JTkcgKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmcERlbGF5V2FpdCwgJndhaXQpOwotCi0JZGVsX3RpbWVyICggcERlbGF5VGltZXIgKTsKKwltc2xlZXBfaW50ZXJydXB0aWJsZShtc2Vjb25kcyk7CiB9CiAKICNpZiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZwppbmRleCBiODk0ZjY3Li4wYmFhOGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL0tjb25maWcKQEAgLTIsMTEgKzIsOSBAQAogIyBJUE1JIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIklQTUkiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIElQTUlfSEFORExFUgorbWVudWNvbmZpZyBJUE1JX0hBTkRMRVIKICAgICAgICB0cmlzdGF0ZSAnSVBNSSB0b3AtbGV2ZWwgbWVzc2FnZSBoYW5kbGVyJworICAgICAgIGRlcGVuZHMgb24gSEFTX0lPTUVNCiAgICAgICAgaGVscAogICAgICAgICAgVGhpcyBlbmFibGVzIHRoZSBjZW50cmFsIElQTUkgbWVzc2FnZSBoYW5kbGVyLCByZXF1aXJlZCBmb3IgSVBNSQogCSB0byB3b3JrLgpAQCAtMTgsOSArMTYsMTAgQEAKIAogCSBJZiB1bnN1cmUsIHNheSBOLgogCitpZiBJUE1JX0hBTkRMRVIKKwogY29uZmlnIElQTUlfUEFOSUNfRVZFTlQKICAgICAgICBib29sICdHZW5lcmF0ZSBhIHBhbmljIGV2ZW50IHRvIGFsbCBCTUNzIG9uIGEgcGFuaWMnCi0gICAgICAgZGVwZW5kcyBvbiBJUE1JX0hBTkRMRVIKICAgICAgICBoZWxwCiAgICAgICAgICBXaGVuIGEgcGFuaWMgb2NjdXJzLCB0aGlzIHdpbGwgY2F1c2UgdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyIHRvCiAJIGdlbmVyYXRlIGFuIElQTUkgZXZlbnQgZGVzY3JpYmluZyB0aGUgcGFuaWMgdG8gZWFjaCBpbnRlcmZhY2UKQEAgLTQwLDE0ICszOSwxMiBAQAogCiBjb25maWcgSVBNSV9ERVZJQ0VfSU5URVJGQUNFCiAgICAgICAgdHJpc3RhdGUgJ0RldmljZSBpbnRlcmZhY2UgZm9yIElQTUknCi0gICAgICAgZGVwZW5kcyBvbiBJUE1JX0hBTkRMRVIKICAgICAgICBoZWxwCiAgICAgICAgICBUaGlzIHByb3ZpZGVzIGFuIElPQ1RMIGludGVyZmFjZSB0byB0aGUgSVBNSSBtZXNzYWdlIGhhbmRsZXIgc28KIAkgdXNlcmxhbmQgcHJvY2Vzc2VzIG1heSB1c2UgSVBNSS4gIEl0IHN1cHBvcnRzIHBvbGwoKSBhbmQgc2VsZWN0KCkuCiAKIGNvbmZpZyBJUE1JX1NJCiAgICAgICAgdHJpc3RhdGUgJ0lQTUkgU3lzdGVtIEludGVyZmFjZSBoYW5kbGVyJwotICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCiAgICAgICAgaGVscAogICAgICAgICAgUHJvdmlkZXMgYSBkcml2ZXIgZm9yIFN5c3RlbSBJbnRlcmZhY2VzIChLQ1MsIFNNSUMsIEJUKS4KIAkgQ3VycmVudGx5LCBvbmx5IEtDUyBhbmQgU01JQyBhcmUgc3VwcG9ydGVkLiAgSWYKQEAgLTU1LDE1ICs1MiwxMyBAQAogCiBjb25maWcgSVBNSV9XQVRDSERPRwogICAgICAgIHRyaXN0YXRlICdJUE1JIFdhdGNoZG9nIFRpbWVyJwotICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCiAgICAgICAgaGVscAogICAgICAgICAgVGhpcyBlbmFibGVzIHRoZSBJUE1JIHdhdGNoZG9nIHRpbWVyLgogCiBjb25maWcgSVBNSV9QT1dFUk9GRgogICAgICAgIHRyaXN0YXRlICdJUE1JIFBvd2Vyb2ZmJwotICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCiAgICAgICAgaGVscAogICAgICAgICAgVGhpcyBlbmFibGVzIGEgZnVuY3Rpb24gdG8gcG93ZXIgb2ZmIHRoZSBzeXN0ZW0gd2l0aCBJUE1JIGlmCiAJIHRoZSBJUE1JIG1hbmFnZW1lbnQgY29udHJvbGxlciBpcyBjYXBhYmxlIG9mIHRoaXMuCiAKLWVuZG1lbnUKK2VuZGlmICMgSVBNSV9IQU5ETEVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKaW5kZXggZTAyODkzYi4uYjg2MTg2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYwpAQCAtNjc5LDcgKzY3OSw3IEBACiB7CiAJaW50IHJ2OwogCi0JcHJpbnRrICgiQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgLSIKKwlwcmludGsgKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgLSIKIAkJIiBJUE1JIFBvd2VyZG93biB2aWEgc3lzX3JlYm9vdC5cbiIpOwogCiAJaWYgKHBvd2Vyb2ZmX3Bvd2VyY3ljbGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IDc4ZTFiOTYuLjRlZGZkZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC0yODU3LDcgKzI4NTcsNyBAQAogCiAJbXV0ZXhfdW5sb2NrKCZzbWlfaW5mb3NfbG9jayk7CiAKLQlwcmludGsoIiBJUE1JICVzIGludGVyZmFjZSBpbml0aWFsaXplZFxuIixzaV90b19zdHJbbmV3X3NtaS0+c2lfdHlwZV0pOworCXByaW50ayhLRVJOX0lORk8gIklQTUkgJXMgaW50ZXJmYWNlIGluaXRpYWxpemVkXG4iLHNpX3RvX3N0cltuZXdfc21pLT5zaV90eXBlXSk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCmluZGV4IDc2MWY3NzcuLjc3YTdhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pc2ljb20uYworKysgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKQEAgLTE3MSw5ICsxNzEsNiBAQAogc3RhdGljIGludCBwcmV2X2NhcmQgPSAzOwkvKglzdGFydCBzZXJ2aWNpbmcgaXNpX2NhcmRbMF0JKi8KIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaXNpY29tX25vcm1hbDsKIAotc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihpc2lfdGltZXJkb25lKTsKLXN0YXRpYyBjaGFyIHJlX3NjaGVkdWxlID0gMTsKLQogc3RhdGljIHZvaWQgaXNpY29tX3R4KHVuc2lnbmVkIGxvbmcgX2RhdGEpOwogc3RhdGljIHZvaWQgaXNpY29tX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogCkBAIC0xODcsNyArMTg0LDcgQEAKIAogc3RydWN0CWlzaV9ib2FyZCB7CiAJdW5zaWduZWQgbG9uZwkJYmFzZTsKLQl1bnNpZ25lZCBjaGFyCQlpcnE7CisJaW50CQkJaXJxOwogCXVuc2lnbmVkIGNoYXIJCXBvcnRfY291bnQ7CiAJdW5zaWduZWQgc2hvcnQJCXN0YXR1czsKIAl1bnNpZ25lZCBzaG9ydAkJcG9ydF9zdGF0dXM7IC8qIGVhY2ggYml0IGZvciBlYWNoIHBvcnQgKi8KQEAgLTIyNyw3ICsyMjQsNyBAQAogICoJaXQgd2FudHMgdG8gdGFsay4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBXYWl0VGlsbENhcmRJc0ZyZWUodTE2IGJhc2UpCitzdGF0aWMgaW5saW5lIGludCBXYWl0VGlsbENhcmRJc0ZyZWUodW5zaWduZWQgbG9uZyBiYXNlKQogewogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAJdW5zaWduZWQgaW50IGEgPSBpbl9hdG9taWMoKTsgLyogZG8gd2UgcnVuIHVuZGVyIHNwaW5sb2NrPyAqLwpAQCAtMjQzLDE3ICsyNDAsMTggQEAKIAogc3RhdGljIGludCBsb2NrX2NhcmQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKIHsKLQljaGFyCQlyZXRyaWVzOwogCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgaW50IHJldHJpZXMsIGE7CiAKLQlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMTAwOyByZXRyaWVzKyspIHsKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMTA7IHJldHJpZXMrKykgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7Ci0JCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpIHsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7Ci0JCQl1ZGVsYXkoMTAwMCk7ICAgLyogMW1zICovCisJCWZvciAoYSA9IDA7IGEgPCAxMDsgYSsrKSB7CisJCQlpZiAoaW53KGJhc2UgKyAweGUpICYgMHgxKQorCQkJCXJldHVybiAxOworCQkJdWRlbGF5KDEwKTsKIAkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKKwkJbXNsZWVwKDEwKTsKIAl9CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOiBGYWlsZWQgdG8gbG9jayBDYXJkICgweCVseClcbiIsCiAJCWNhcmQtPmJhc2UpOwpAQCAtMjYxLDIzICsyNTksNiBAQAogCXJldHVybiAwOwkvKiBGYWlsZWQgdG8gYWNxdWlyZSB0aGUgY2FyZCEgKi8KIH0KIAotc3RhdGljIGludCBsb2NrX2NhcmRfYXRfaW50ZXJydXB0KHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCi17Ci0JdW5zaWduZWQgY2hhcgkJcmV0cmllczsKLQl1bnNpZ25lZCBsb25nIGJhc2UgPSBjYXJkLT5iYXNlOwotCi0JZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDIwMDsgcmV0cmllcysrKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKLQotCQlpZiAoaW53KGJhc2UgKyAweGUpICYgMHgxKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwotCX0KLQkvKiBGYWlsaW5nIGluIGludGVycnVwdCBpcyBhbiBhY2NlcHRhYmxlIGV2ZW50ICovCi0JcmV0dXJuIDA7CS8qIEZhaWxlZCB0byBhY3F1aXJlIHRoZSBjYXJkISAqLwotfQotCiBzdGF0aWMgdm9pZCB1bmxvY2tfY2FyZChzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkKQogewogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwpAQCAtNDE1LDcgKzM5Niw5IEBACiAKIHN0YXRpYyB2b2lkIGlzaWNvbV90eCh1bnNpZ25lZCBsb25nIF9kYXRhKQogewotCXNob3J0IGNvdW50ID0gKEJPQVJEX0NPVU5ULTEpLCBjYXJkLCBiYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGJhc2U7CisJdW5zaWduZWQgaW50IHJldHJpZXM7CisJc2hvcnQgY291bnQgPSAoQk9BUkRfQ09VTlQtMSksIGNhcmQ7CiAJc2hvcnQgdHhjb3VudCwgd3JkLCByZXNpZHVlLCB3b3JkX2NvdW50LCBjbnQ7CiAJc3RydWN0IGlzaV9wb3J0ICpwb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CkBAIC00MzUsMzIgKzQxOCwzNCBAQAogCWNvdW50ID0gaXNpX2NhcmRbY2FyZF0ucG9ydF9jb3VudDsKIAlwb3J0ID0gaXNpX2NhcmRbY2FyZF0ucG9ydHM7CiAJYmFzZSA9IGlzaV9jYXJkW2NhcmRdLmJhc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNpX2NhcmRbY2FyZF0uY2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwMDsgcmV0cmllcysrKSB7CisJCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpCisJCQlicmVhazsKKwkJdWRlbGF5KDIpOworCX0KKwlpZiAocmV0cmllcyA+PSAxMDApCisJCWdvdG8gdW5sb2NrOworCiAJZm9yICg7Y291bnQgPiAwO2NvdW50LS0sIHBvcnQrKykgewotCQlpZiAoIWxvY2tfY2FyZF9hdF9pbnRlcnJ1cHQoJmlzaV9jYXJkW2NhcmRdKSkKLQkJCWNvbnRpbnVlOwogCQkvKiBwb3J0IG5vdCBhY3RpdmUgb3IgdHggZGlzYWJsZWQgdG8gZm9yY2UgZmxvdyBjb250cm9sICovCiAJCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHx8CiAJCQkJIShwb3J0LT5zdGF0dXMgJiBJU0lfVFhPSykpCi0JCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOwogCQkJY29udGludWU7CiAKIAkJdHR5ID0gcG9ydC0+dHR5OwogCi0KLQkJaWYgKHR0eSA9PSBOVUxMKSB7Ci0JCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCQlpZiAodHR5ID09IE5VTEwpCiAJCQljb250aW51ZTsKLQkJfQogCiAJCXR4Y291bnQgPSBtaW5fdChzaG9ydCwgVFhfU0laRSwgcG9ydC0+eG1pdF9jbnQpOwotCQlpZiAodHhjb3VudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpIHsKLQkJCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CisJCWlmICh0eGNvdW50IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkKIAkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghKGludyhiYXNlICsgMHgwMikgJiAoMSA8PCBwb3J0LT5jaGFubmVsKSkpIHsKLQkJCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CisKKwkJaWYgKCEoaW53KGJhc2UgKyAweDAyKSAmICgxIDw8IHBvcnQtPmNoYW5uZWwpKSkKIAkJCWNvbnRpbnVlOwotCQl9CisKIAkJcHJfZGJnKCJ0eGluZyAlZCBieXRlcywgcG9ydCVkLlxuIiwgdHhjb3VudCwKIAkJCXBvcnQtPmNoYW5uZWwgKyAxKTsKIAkJb3V0dygocG9ydC0+Y2hhbm5lbCA8PCBpc2lfY2FyZFtjYXJkXS5zaGlmdF9jb3VudCkgfCB0eGNvdW50LApAQCAtNTA4LDE2ICs0OTMsMTIgQEAKIAkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX1RYT0s7CiAJCWlmIChwb3J0LT54bWl0X2NudCA8PSBXQUtFVVBfQ0hBUlMpCiAJCQl0dHlfd2FrZXVwKHR0eSk7Ci0JCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CiAJfQogCit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNpX2NhcmRbY2FyZF0uY2FyZF9sb2NrLCBmbGFncyk7CiAJLyoJc2NoZWR1bGUgYW5vdGhlciB0eCBmb3IgaG9wZWZ1bGx5IGluIGFib3V0IDEwbXMJKi8KIHNjaGVkX2FnYWluOgotCWlmICghcmVfc2NoZWR1bGUpIHsKLQkJY29tcGxldGUoJmlzaV90aW1lcmRvbmUpOwotIAkJcmV0dXJuOwotCX0KLQogCW1vZF90aW1lcigmdHgsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwKSk7CiB9CiAKQEAgLTE3NDksMTcgKzE3MzAsMTMgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGlzaWNvbV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXVuc2lnbmVkIGludCBpb2FkZHIsIHNpZ25hdHVyZSwgaW5kZXg7CisJdW5zaWduZWQgaW50IHNpZ25hdHVyZSwgaW5kZXg7CiAJaW50IHJldHZhbCA9IC1FUEVSTTsKLQl1OCBwY2lpcnE7CiAJc3RydWN0IGlzaV9ib2FyZCAqYm9hcmQgPSBOVUxMOwogCiAJaWYgKGNhcmRfY291bnQgPj0gQk9BUkRfQ09VTlQpCiAJCWdvdG8gZXJyOwogCi0JaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOwotCS8qIGkuZSBhdCBvZmZzZXQgMHgxYyBpbiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgc3BhY2UuICovCi0JcGNpaXJxID0gcGRldi0+aXJxOwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJU0kgUENJIENhcmQoRGV2aWNlIElEIDB4JXgpXG4iLCBlbnQtPmRldmljZSk7CiAKIAkvKiBhbGxvdCB0aGUgZmlyc3QgZW1wdHkgc2xvdCBpbiB0aGUgYXJyYXkgKi8KQEAgLTE3NzAsOCArMTc0Nyw4IEBACiAJCX0KIAogCWJvYXJkLT5pbmRleCA9IGluZGV4OwotCWJvYXJkLT5iYXNlID0gaW9hZGRyOwotCWJvYXJkLT5pcnEgPSBwY2lpcnE7CisJYm9hcmQtPmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyk7CisJYm9hcmQtPmlycSA9IHBkZXYtPmlycTsKIAljYXJkX2NvdW50Kys7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgYm9hcmQpOwpAQCAtMTkwMSw5ICsxODc4LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGlzaWNvbV9leGl0KHZvaWQpCiB7Ci0JcmVfc2NoZWR1bGUgPSAwOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpc2lfdGltZXJkb25lLCBIWik7CisJZGVsX3RpbWVyX3N5bmMoJnR4KTsKIAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXNpY29tX2RyaXZlcik7CiAJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGlzaWNvbV9ub3JtYWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCmluZGV4IDdiMjc5ZDEuLjNjNjZmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKQEAgLTE3NTMsOSArMTc1Myw2IEBACiAJCXJldHVybjsKIAogCXRpb3NwID0gdHR5LT50ZXJtaW9zOwotCWlmICgodGlvc3AtPmNfY2ZsYWcgPT0gb2xkLT5jX2NmbGFnKSAmJgotCSAgICAodGlvc3AtPmNfaWZsYWcgPT0gb2xkLT5jX2lmbGFnKSkKLQkJcmV0dXJuOwogCiAJc3RsaV9ta2FzeXBvcnQocG9ydHAsICZhcG9ydCwgdGlvc3ApOwogCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRQT1JULCAmYXBvcnQsIHNpemVvZihhc3lwb3J0X3QpLCAwKTsKQEAgLTIxNjYsMTQgKzIxNjMsMTAgQEAKIAljZGtoZHJfdCBfX2lvbWVtICpoZHJwOwogCWNka2N0cmxfdCBfX2lvbWVtICpjcDsKIAl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmJpdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwogCiAJaWYgKHRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogY29tbWFuZCBhbHJlYWR5IGJ1c3ksIGNtZD0leCFcbiIsCiAJCQkJKGludCkgY21kKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnJkX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjE5NCw3ICsyMTg3LDYgQEAKIAl3cml0ZWIocmVhZGIoYml0cykgfCBwb3J0cC0+cG9ydGJpdCwgYml0cyk7CiAJc2V0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpOwogCUVCUkRESVNBQkxFKGJyZHApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZF9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0bGlfc2VuZGNtZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmFyZywgaW50IHNpemUsIGludCBjb3B5YmFjaykKQEAgLTMyMTgsMTMgKzMyMTAsMTMgQEAKIAkJZ290byBlcnI7CiAJfQogCisJYnJkcC0+aW9zaXplID0gRUNQX0lPU0laRTsKKwogCWlmICghcmVxdWVzdF9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUsICJpc3RhbGxpb24iKSkgewogCQlyZXR2YWwgPSAtRUlPOwogCQlnb3RvIGVycjsKIAl9CiAKLQlicmRwLT5pb3NpemUgPSBFQ1BfSU9TSVpFOwotCiAvKgogICoJQmFzZWQgb24gdGhlIHNwZWNpZmljIGJvYXJkIHR5cGUgc2V0dXAgdGhlIGNvbW1vbiB2YXJzIHRvIGFjY2VzcwogICoJYW5kIGVuYWJsZSBzaGFyZWQgbWVtb3J5LiBTZXQgYWxsIGJvYXJkIHNwZWNpZmljIGluZm9ybWF0aW9uIG5vdwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwppbmRleCA5MDk2NWI0Li4yY2UwYWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYworKysgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwpAQCAtMjQsNiArMjQsNyBAQAogICogMjEtMDgtMDI6IENvbnZlcnRlZCB0byBpbnB1dCBBUEksIG1ham9yIGNsZWFudXAuIChWb2p0ZWNoIFBhdmxpaykKICAqLwogCisjaW5jbHVkZSA8bGludXgvY29uc29sZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC0zMDgsMTAgKzMwOSw5IEBACiAgKiBNYW55IG90aGVyIHJvdXRpbmVzIGRvIHB1dF9xdWV1ZSwgYnV0IEkgdGhpbmsgZWl0aGVyCiAgKiB0aGV5IHByb2R1Y2UgQVNDSUksIG9yIHRoZXkgcHJvZHVjZSBzb21lIHVzZXItYXNzaWduZWQKICAqIHN0cmluZywgYW5kIGluIGJvdGggY2FzZXMgd2UgbWlnaHQgYXNzdW1lIHRoYXQgaXQgaXMKLSAqIGluIHV0Zi04IGFscmVhZHkuIFVURi04IGlzIGRlZmluZWQgZm9yIHdvcmRzIG9mIHVwIHRvIDMxIGJpdHMsCi0gKiBidXQgd2UgbmVlZCBvbmx5IDE2IGJpdHMgaGVyZQorICogaW4gdXRmLTggYWxyZWFkeS4KICAqLwotc3RhdGljIHZvaWQgdG9fdXRmOChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVzaG9ydCBjKQorc3RhdGljIHZvaWQgdG9fdXRmOChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVpbnQgYykKIHsKIAlpZiAoYyA8IDB4ODApCiAJCS8qICAwKioqKioqKiAqLwpAQCAtMzIwLDExICszMjAsMjEgQEAKIAkJLyogMTEwKioqKiogMTAqKioqKiogKi8KIAkJcHV0X3F1ZXVlKHZjLCAweGMwIHwgKGMgPj4gNikpOwogCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoYyAmIDB4M2YpKTsKLQl9IGVsc2UgeworICAgIAl9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7CisJICAgICAgIAlpZiAoYyA+PSAweEQ4MDAgJiYgYyA8IDB4RTAwMCkKKwkJCXJldHVybjsKKwkJaWYgKGMgPT0gMHhGRkZGKQorCQkJcmV0dXJuOwogCQkvKiAxMTEwKioqKiAxMCoqKioqKiAxMCoqKioqKiAqLwogCQlwdXRfcXVldWUodmMsIDB4ZTAgfCAoYyA+PiAxMikpOwogCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSk7CiAJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOworICAgIAl9IGVsc2UgaWYgKGMgPCAweDExMDAwMCkgeworCQkvKiAxMTExMCoqKiAxMCoqKioqKiAxMCoqKioqKiAxMCoqKioqKiAqLworCQlwdXRfcXVldWUodmMsIDB4ZjAgfCAoYyA+PiAxOCkpOworCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzZikpOworCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSk7CisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOwogCX0KIH0KIApAQCAtMzkzLDcgKzQwMyw3IEBACiAJCXJldHVybiBkOwogCiAJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFKQotCQl0b191dGY4KHZjLCBkKTsKKwkJdG9fdXRmOCh2YywgY29udl84Yml0X3RvX3VuaShkKSk7CiAJZWxzZSBpZiAoZCA8IDB4MTAwKQogCQlwdXRfcXVldWUodmMsIGQpOwogCkBAIC00MDcsNyArNDE3LDcgQEAKIHsKIAlpZiAoZGlhY3IpIHsKIAkJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFKQotCQkJdG9fdXRmOCh2YywgZGlhY3IpOworCQkJdG9fdXRmOCh2YywgY29udl84Yml0X3RvX3VuaShkaWFjcikpOwogCQllbHNlIGlmIChkaWFjciA8IDB4MTAwKQogCQkJcHV0X3F1ZXVlKHZjLCBkaWFjcik7CiAJCWRpYWNyID0gMDsKQEAgLTYxNyw3ICs2MjcsNyBAQAogCQlyZXR1cm47CiAJfQogCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfVU5JQ09ERSkKLQkJdG9fdXRmOCh2YywgdmFsdWUpOworCQl0b191dGY4KHZjLCBjb252XzhiaXRfdG9fdW5pKHZhbHVlKSk7CiAJZWxzZSBpZiAodmFsdWUgPCAweDEwMCkKIAkJcHV0X3F1ZXVlKHZjLCB2YWx1ZSk7CiB9CkBAIC03NzUsNyArNzg1LDcgQEAKIAkvKiBrbHVkZ2UgKi8KIAlpZiAodXBfZmxhZyAmJiBzaGlmdF9zdGF0ZSAhPSBvbGRfc3RhdGUgJiYgbnBhZGNoICE9IC0xKSB7CiAJCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfVU5JQ09ERSkKLQkJCXRvX3V0ZjgodmMsIG5wYWRjaCAmIDB4ZmZmZik7CisJCQl0b191dGY4KHZjLCBucGFkY2gpOwogCQllbHNlCiAJCQlwdXRfcXVldWUodmMsIG5wYWRjaCAmIDB4ZmYpOwogCQlucGFkY2ggPSAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9taXNjLmMgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCmluZGV4IDRlNmZiOTYuLjcxYzhjZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9taXNjLmMKKysrIGIvZHJpdmVycy9jaGFyL21pc2MuYwpAQCAtNjcsMjUgKzY3LDEzIEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyB2b2lkICptaXNjX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IG1pc2NkZXZpY2UgKnA7Ci0JbG9mZl90IG9mZiA9IDA7Ci0KIAltdXRleF9sb2NrKCZtaXNjX210eCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmbWlzY19saXN0LCBsaXN0KSB7Ci0JCWlmICgqcG9zID09IG9mZisrKSAKLQkJCXJldHVybiBwOwotCX0KLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJm1pc2NfbGlzdCwgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICptaXNjX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpuID0gKChzdHJ1Y3QgbWlzY2RldmljZSAqKXYpLT5saXN0Lm5leHQ7Ci0KLQkrKypwb3M7Ci0KLQlyZXR1cm4gKG4gIT0gJm1pc2NfbGlzdCkgPyBsaXN0X2VudHJ5KG4sIHN0cnVjdCBtaXNjZGV2aWNlLCBsaXN0KQotCQkgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZtaXNjX2xpc3QsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1pc2Nfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCkBAIC05NSw3ICs4Myw3IEBACiAKIHN0YXRpYyBpbnQgbWlzY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQljb25zdCBzdHJ1Y3QgbWlzY2RldmljZSAqcCA9IHY7CisJY29uc3Qgc3RydWN0IG1pc2NkZXZpY2UgKnAgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBtaXNjZGV2aWNlLCBsaXN0KTsKIAogCXNlcV9wcmludGYoc2VxLCAiJTNpICVzXG4iLCBwLT5taW5vciwgcC0+bmFtZSA/IHAtPm5hbWUgOiAiIik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwppbmRleCBlMGQzNWMyLi5lZDc2ZjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbW94YS5jCisrKyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKQEAgLTE0MDUsNyArMTQwNSw2IEBACiBzdGF0aWMgc3RydWN0IG1vbl9zdHIgbW94YUxvZzsKIHN0YXRpYyBpbnQgbW94YUZ1bmNUb3V0ID0gSFogLyAyOwogCi1zdGF0aWMgdm9pZCBtb3hhZGVsYXkoaW50KTsKIHN0YXRpYyB2b2lkIG1veGFmdW5jKHZvaWQgX19pb21lbSAqLCBpbnQsIHVzaG9ydCk7CiBzdGF0aWMgdm9pZCB3YWl0X2ZpbmlzaCh2b2lkIF9faW9tZW0gKik7CiBzdGF0aWMgdm9pZCBsb3dfd2F0ZXJfY2hlY2sodm9pZCBfX2lvbWVtICopOwpAQCAtMjQwNCwxMCArMjQwMywxMCBAQAogCW9mc0FkZHIgPSBtb3hhX3BvcnRzW3BvcnRdLnRhYmxlQWRkcjsKIAlpZiAobXMxMDApIHsKIAkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2VuZEJyZWFrLCBNYWdpY19jb2RlKTsKLQkJbW94YWRlbGF5KG1zMTAwICogKEhaIC8gMTApKTsKKwkJbXNsZWVwKG1zMTAwICogMTApOwogCX0gZWxzZSB7CiAJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NlbmRCcmVhaywgTWFnaWNfY29kZSk7Ci0JCW1veGFkZWxheShIWiAvIDQpOwkvKiAyNTAgbXMgKi8KKwkJbXNsZWVwKDI1MCk7CiAJfQogCW1veGFmdW5jKG9mc0FkZHIsIEZDX1N0b3BCcmVhaywgTWFnaWNfY29kZSk7CiB9CkBAIC0yNDc2LDE4ICsyNDc1LDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJU3RhdGljIGxvY2FsIGZ1bmN0aW9uczogCQkJCQkgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBtb3hhZGVsYXkgLSBkZWxheXMgYSBzcGVjaWZpZWQgbnVtYmVyIHRpY2tzCi0gKi8KLXN0YXRpYyB2b2lkIG1veGFkZWxheShpbnQgdGljaykKLXsKLQl1bnNpZ25lZCBsb25nIHN0LCBldDsKLQotCXN0ID0gamlmZmllczsKLQlldCA9IHN0ICsgdGljazsKLQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZXQpKTsKLX0KLQogc3RhdGljIHZvaWQgbW94YWZ1bmModm9pZCBfX2lvbWVtICpvZnNBZGRyLCBpbnQgY21kLCB1c2hvcnQgYXJnKQogewogCkBAIC0yNTM1LDcgKzI1MjIsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAliYXNlQWRkciA9IG1veGFfYm9hcmRzW2NhcmRub10uYmFzZW1lbTsKIAl3cml0ZWIoSFdfcmVzZXQsIGJhc2VBZGRyICsgQ29udHJvbF9yZWcpOwkvKiByZXNldCAqLwotCW1veGFkZWxheSgxKTsJCS8qIGRlbGF5IDEwIG1zICovCisJbXNsZWVwKDEwKTsKIAlmb3IgKGkgPSAwOyBpIDwgNDA5NjsgaSsrKQogCQl3cml0ZWIoMCwgYmFzZUFkZHIgKyBpKTsJLyogY2xlYXIgZml4IHBhZ2UgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCkBAIC0yNzEzLDcgKzI3MDAsNyBAQAogCQkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpID09IGtleWNvZGUpCiAJCQkJCWJyZWFrOwotCQkJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwkJCQltc2xlZXAoMTApOwogCQkJfQogCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpICE9IGtleWNvZGUpIHsKIAkJCQlyZXR1cm4gKC0xKTsKQEAgLTI3MjUsNyArMjcxMiw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpID09IGtleWNvZGUpCiAJCQkJYnJlYWs7Ci0JCQltb3hhZGVsYXkoMSk7CS8qIGRlbGF5IDEwIG1zICovCisJCQltc2xlZXAoMTApOwogCQl9CiAJCXJldHJ5Kys7CiAJfSB3aGlsZSAoKHJlYWRiKGJhc2VBZGRyICsgQzIxOGNoa3N1bV9vaykgIT0gMSkgJiYgKHJldHJ5IDwgMykpOwpAQCAtMjczNiw3ICsyNzIzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCiAJCQlicmVhazsKLQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQltc2xlZXAoMTApOwogCX0KIAlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkgewogCQlyZXR1cm4gKC0xKTsKQEAgLTI3NDYsNyArMjczMyw3IEBACiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQogCQkJYnJlYWs7Ci0JCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwkJbXNsZWVwKDEwKTsKIAl9CiAJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpIHsKIAkJcmV0dXJuICgtMSk7CkBAIC0yNzg4LDcgKzI3NzUsNyBAQAogCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKIAkJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMzIwX2tleSkgPT0gQzMyMF9LZXlDb2RlKQogCQkJCQlicmVhazsKLQkJCQltb3hhZGVsYXkoMSk7CisJCQkJbXNsZWVwKDEwKTsKIAkJCX0KIAkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSAhPSBDMzIwX0tleUNvZGUpCiAJCQkJcmV0dXJuICgtMSk7CkBAIC0yNzk5LDcgKzI3ODYsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewogCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzMyMF9rZXkpID09IEMzMjBfS2V5Q29kZSkKIAkJCQlicmVhazsKLQkJCW1veGFkZWxheSgxKTsKKwkJCW1zbGVlcCgxMCk7CiAJCX0KIAkJcmV0cnkrKzsKIAl9IHdoaWxlICgocmVhZGIoYmFzZUFkZHIgKyBDMzIwY2hrc3VtX29rKSAhPSAxKSAmJiAocmV0cnkgPCAzKSk7CkBAIC0yODA5LDcgKzI3OTYsNyBAQAogCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykgewogCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKIAkJCWJyZWFrOwotCQltb3hhZGVsYXkoMSk7CisJCW1zbGVlcCgxMCk7CiAJfQogCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKQogCQlyZXR1cm4gKC0xMDApOwpAQCAtMjgyOCw3ICsyODE1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKIAkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCiAJCQlicmVhazsKLQkJbW94YWRlbGF5KDEpOworCQltc2xlZXAoMTApOwogCX0KIAlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKIAkJcmV0dXJuICgtMTAyKTsKQEAgLTI4NDIsNyArMjgyOSw3IEBACiAJZm9yIChpID0gMDsgaSA8IDYwMDsgaSsrKSB7CiAJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQogCQkJYnJlYWs7Ci0JCW1veGFkZWxheSgxKTsKKwkJbXNsZWVwKDEwKTsKIAl9CiAJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpCiAJCXJldHVybiAoLTEwMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXNwZWMuYyBiL2RyaXZlcnMvY2hhci9tc3BlYy5jCmluZGV4IDdhYzMwNjEuLmM3MTZlZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tc3BlYy5jCisrKyBiL2RyaXZlcnMvY2hhci9tc3BlYy5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAl2ZGF0YS0+cmVmY250ID0gQVRPTUlDX0lOSVQoMSk7CiAJdm1hLT52bV9wcml2YXRlX2RhdGEgPSB2ZGF0YTsKIAotCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fTE9DS0VEIHwgVk1fUkVTRVJWRUQgfCBWTV9QRk5NQVApOworCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fUkVTRVJWRUQgfCBWTV9QRk5NQVApOwogCWlmICh2ZGF0YS0+dHlwZSA9PSBNU1BFQ19GRVRDSE9QIHx8IHZkYXRhLT50eXBlID09IE1TUEVDX1VOQ0FDSEVEKQogCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwogCXZtYS0+dm1fb3BzID0gJm1zcGVjX3ZtX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5jIGIvZHJpdmVycy9jaGFyL214c2VyLmMKaW5kZXggNTk1M2E0NS4uMmFlZTNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyLmMKKysrIGIvZHJpdmVycy9jaGFyL214c2VyLmMKQEAgLTkwLDggKzkwLDYgQEAKICNkZWZpbmUgVUFSVF9NQ1JfQUZFCQkweDIwCiAjZGVmaW5lIFVBUlRfTFNSX1NQRUNJQUwJMHgxRQogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKQkoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLfFwKLQkJCQkJICBJWE9OfElYT0ZGKSkKIAogI2RlZmluZSBJUlFfVChpbmZvKSAoKGluZm8tPmZsYWdzICYgQVNZTkNfU0hBUkVfSVJRKSA/IElSUUZfU0hBUkVEIDogSVJRRl9ESVNBQkxFRCkKIApAQCAtMTcyOSwxNiArMTcyNywxMiBAQAogCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgfHwKLQkJCShSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpICE9IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpIHsKKwlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOwogCi0JCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7Ci0KLQkJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCi0JCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgewotCQkJdHR5LT5od19zdG9wcGVkID0gMDsKLQkJCW14c2VyX3N0YXJ0KHR0eSk7Ci0JCX0KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkJCSEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJbXhzZXJfc3RhcnQodHR5KTsKIAl9CiAKIC8qIEhhbmRsZSBzdyBzdG9wcGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmMgYi9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmMKaW5kZXggNmNkZTQ0OC4uNmE1NjM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyX25ldy5jCisrKyBiL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYwpAQCAtNzIsOCArNzIsNiBAQAogI2RlZmluZSBVQVJUX01DUl9BRkUJCTB4MjAKICNkZWZpbmUgVUFSVF9MU1JfU1BFQ0lBTAkweDFFCiAKLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpCShpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0t8XAotCQkJCQkgIElYT058SVhPRkYpKQogCiAjZGVmaW5lIEMxNjhfQVNJQ19JRCAgICAxCiAjZGVmaW5lIEMxMDRfQVNJQ19JRCAgICAyCkBAIC0xNTYwLDcgKzE1NTgsNyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwogCWNhc2UgTU9YQV9BU1BQX01PTl9FWFQ6IHsKLQkJaW50IHN0YXR1cywgcCwgc2hpZnRiaXQ7CisJCWludCBwLCBzaGlmdGJpdDsKIAkJdW5zaWduZWQgbG9uZyBvcG1vZGU7CiAJCXVuc2lnbmVkIGNmbGFnLCBpZmxhZzsKIApAQCAtMTk5MCwxOCArMTk4OCwxNCBAQAogCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpIHx8Ci0JCQkoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAhPSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCi0JCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgotCQkJCSEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKLQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCQlteHNlcl9zdGFydCh0dHkpOwotCQl9CisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCW14c2VyX3N0YXJ0KHR0eSk7CiAJfQogCiAJLyogSGFuZGxlIHN3IHN0b3BwZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX2hkbGMuYyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwppbmRleCAzMzdhODdmLi5lODMzMmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKKysrIGIvZHJpdmVycy9jaGFyL25faGRsYy5jCkBAIC00MDAsNyArNDAwLDEyIEBACiAJCS8qIFNlbmQgdGhlIG5leHQgYmxvY2sgb2YgZGF0YSB0byBkZXZpY2UgKi8KIAkJdHR5LT5mbGFncyB8PSAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKIAkJYWN0dWFsID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgdGJ1Zi0+YnVmLCB0YnVmLT5jb3VudCk7Ci0JCSAgICAKKworCQkvKiByb2xsYmFjayB3YXMgcG9zc2libGUgYW5kIGhhcyBiZWVuIGRvbmUgKi8KKwkJaWYgKGFjdHVhbCA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJCW5faGRsYy0+dGJ1ZiA9IHRidWY7CisJCQlicmVhazsKKwkJfQogCQkvKiBpZiB0cmFuc21pdCBlcnJvciwgdGhyb3cgZnJhbWUgYXdheSBieSAqLwogCQkvKiBwcmV0ZW5kaW5nIGl0IHdhcyBhY2NlcHRlZCBieSBkcml2ZXIgKi8KIAkJaWYgKGFjdHVhbCA8IDApCkBAIC03ODAsMTMgKzc4NSwxNCBAQAogCQlwb2xsX3dhaXQoZmlscCwgJnR0eS0+d3JpdGVfd2FpdCwgd2FpdCk7CiAKIAkJLyogc2V0IGJpdHMgZm9yIG9wZXJhdGlvbnMgdGhhdCB3b24ndCBibG9jayAqLwotCQlpZihuX2hkbGMtPnJ4X2J1Zl9saXN0LmhlYWQpCisJCWlmIChuX2hkbGMtPnJ4X2J1Zl9saXN0LmhlYWQpCiAJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CS8qIHJlYWRhYmxlICovCiAJCWlmICh0ZXN0X2JpdChUVFlfT1RIRVJfQ0xPU0VELCAmdHR5LT5mbGFncykpCiAJCQltYXNrIHw9IFBPTExIVVA7Ci0JCWlmKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQogCQkJbWFzayB8PSBQT0xMSFVQOwotCQlpZihuX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QuaGVhZCkKKwkJaWYgKCF0dHlfaXNfd3JpdGVsb2NrZWQodHR5KSAmJgorCQkJCW5faGRsYy0+dHhfZnJlZV9idWZfbGlzdC5oZWFkKQogCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsJLyogd3JpdGFibGUgKi8KIAl9CiAJcmV0dXJuIG1hc2s7CkBAIC04NjEsNyArODY3LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+c3BpbmxvY2ssZmxhZ3MpOwogCQogCWJ1Zi0+bGluaz1OVUxMOwotCWlmKGxpc3QtPnRhaWwpCisJaWYgKGxpc3QtPnRhaWwpCiAJCWxpc3QtPnRhaWwtPmxpbmsgPSBidWY7CiAJZWxzZQogCQlsaXN0LT5oZWFkID0gYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fcjM5NjQuYyBiL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKaW5kZXggMTQ1NTdhNC4uNmI5MThiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fcjM5NjQuYworKysgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCkBAIC0xMDcxLDggKzEwNzEsNiBAQAogCXN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKIAlzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZzsKIAlzdHJ1Y3QgcjM5NjRfY2xpZW50X21lc3NhZ2UgdGhlTXNnOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCiAJaW50IGNvdW50OwogCiAJVFJBQ0VfTCgicmVhZCgpIik7CkBAIC0xMDg2LDE2ICsxMDg0LDggQEAKIAkJCQlyZXR1cm4gLUVBR0FJTjsKIAkJCX0KIAkJCS8qIGJsb2NrIHVudGlsIHRoZXJlIGlzIGEgbWVzc2FnZTogKi8KLQkJCWFkZF93YWl0X3F1ZXVlKCZwSW5mby0+cmVhZF93YWl0LCAmd2FpdCk7Ci1yZXBlYXQ6Ci0JCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlwTXNnID0gcmVtb3ZlX21zZyhwSW5mbywgcENsaWVudCk7Ci0JCQlpZiAoIXBNc2cgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJc2NoZWR1bGUoKTsKLQkJCQlnb3RvIHJlcGVhdDsKLQkJCX0KLQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwSW5mby0+cmVhZF93YWl0LCAmd2FpdCk7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocEluZm8tPnJlYWRfd2FpdCwKKwkJCQkJKHBNc2cgPSByZW1vdmVfbXNnKHBJbmZvLCBwQ2xpZW50KSkpOwogCQl9CiAKIAkJLyogSWYgd2Ugc3RpbGwgaGF2ZW4ndCBnb3QgYSBtZXNzYWdlLCB3ZSBtdXN0IGhhdmUgYmVlbiBzaWduYWxsZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKaW5kZXggMTU0ZjQyMi4uMDM4MDU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fdHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKQEAgLTQ1LDYgKzQ1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC03OCw2ICs4MCwxMyBAQAogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHR0eV9wdXRfdXNlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIHgsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKnB0cikKK3sKKwl0dHlfYXVkaXRfYWRkX2RhdGEodHR5LCAmeCwgMSk7CisJcmV0dXJuIHB1dF91c2VyKHgsIHB0cik7Cit9CisKIC8qKgogICoJbl90dHlfc2V0X19yb29tCS0JcmVjZWl2ZSBzcGFjZQogICoJQHR0eTogdGVybWluYWwKQEAgLTExNTMsNiArMTE2Miw3IEBACiAJaWYgKG4pIHsKIAkJcmV0dmFsID0gY29weV90b191c2VyKCpiLCAmdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfdGFpbF0sIG4pOwogCQluIC09IHJldHZhbDsKKwkJdHR5X2F1ZGl0X2FkZF9kYXRhKHR0eSwgJnR0eS0+cmVhZF9idWZbdHR5LT5yZWFkX3RhaWxdLCBuKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJCXR0eS0+cmVhZF90YWlsID0gKHR0eS0+cmVhZF90YWlsICsgbikgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CiAJCXR0eS0+cmVhZF9jbnQgLT0gbjsKQEAgLTEyNzksNyArMTI4OSw3IEBACiAJCQkJYnJlYWs7CiAJCQljcyA9IHR0eS0+bGluay0+Y3RybF9zdGF0dXM7CiAJCQl0dHktPmxpbmstPmN0cmxfc3RhdHVzID0gMDsKLQkJCWlmIChwdXRfdXNlcihjcywgYisrKSkgeworCQkJaWYgKHR0eV9wdXRfdXNlcih0dHksIGNzLCBiKyspKSB7CiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCQliLS07CiAJCQkJYnJlYWs7CkBAIC0xMzIxLDcgKzEzMzEsNyBAQAogCiAJCS8qIERlYWwgd2l0aCBwYWNrZXQgbW9kZS4gKi8KIAkJaWYgKHR0eS0+cGFja2V0ICYmIGIgPT0gYnVmKSB7Ci0JCQlpZiAocHV0X3VzZXIoVElPQ1BLVF9EQVRBLCBiKyspKSB7CisJCQlpZiAodHR5X3B1dF91c2VyKHR0eSwgVElPQ1BLVF9EQVRBLCBiKyspKSB7CiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCQliLS07CiAJCQkJYnJlYWs7CkBAIC0xMzUyLDE1ICsxMzYyLDE3IEBACiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKIAogCQkJCWlmICghZW9sIHx8IChjICE9IF9fRElTQUJMRURfQ0hBUikpIHsKLQkJCQkJaWYgKHB1dF91c2VyKGMsIGIrKykpIHsKKwkJCQkJaWYgKHR0eV9wdXRfdXNlcih0dHksIGMsIGIrKykpIHsKIAkJCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJCQliLS07CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQluci0tOwogCQkJCX0KLQkJCQlpZiAoZW9sKQorCQkJCWlmIChlb2wpIHsKKwkJCQkJdHR5X2F1ZGl0X3B1c2godHR5KTsKIAkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQogCQkJaWYgKHJldHZhbCkKIAkJCQlicmVhazsKQEAgLTE1MzgsNyArMTU1MCw4IEBACiAJCWVsc2UKIAkJCXR0eS0+bWluaW11bV90b193YWtlID0gMTsKIAl9Ci0JaWYgKHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSA8IFdBS0VVUF9DSEFSUyAmJgorCWlmICghdHR5X2lzX3dyaXRlbG9ja2VkKHR0eSkgJiYKKwkJCXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSA8IFdBS0VVUF9DSEFSUyAmJgogCQkJdHR5LT5kcml2ZXItPndyaXRlX3Jvb20odHR5KSA+IDApCiAJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CiAJcmV0dXJuIG1hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbnZyYW0uYyBiL2RyaXZlcnMvY2hhci9udnJhbS5jCmluZGV4IDIwNGRlYWEuLjk4ZGVjMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9udnJhbS5jCisrKyBiL2RyaXZlcnMvY2hhci9udnJhbS5jCkBAIC00MiwxOSArNDIsMTIgQEAKIAogI2RlZmluZSBQQwkJMQogI2RlZmluZSBBVEFSSQkJMgotI2RlZmluZSBDT0JBTFQJCTMKIAogLyogc2VsZWN0IG1hY2hpbmUgY29uZmlndXJhdGlvbiAqLwogI2lmIGRlZmluZWQoQ09ORklHX0FUQVJJKQogIyAgZGVmaW5lIE1BQ0ggQVRBUkkKICNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2FybV9fKSAgLyogYW5kIG90aGVycz8/ICovCi0jZGVmaW5lIE1BQ0ggUEMKLSMgIGlmIGRlZmluZWQoQ09ORklHX0NPQkFMVCkKLSMgICAgaW5jbHVkZSA8bGludXgvY29iYWx0LW52cmFtLmg+Ci0jICAgIGRlZmluZSBNQUNIIENPQkFMVAotIyAgZWxzZQotIyAgICBkZWZpbmUgTUFDSCBQQwotIyAgZW5kaWYKKyMgIGRlZmluZSBNQUNIIFBDCiAjZWxzZQogIyAgZXJyb3IgQ2Fubm90IGJ1aWxkIG52cmFtIGRyaXZlciBmb3IgdGhpcyBtYWNoaW5lIGNvbmZpZ3VyYXRpb24uCiAjZW5kaWYKQEAgLTc2LDE4ICs2OSw2IEBACiAKICNlbmRpZgogCi0jaWYgTUFDSCA9PSBDT0JBTFQKLQotI2RlZmluZSBDSEVDS19EUklWRVJfSU5JVCgpICAgICAxCi0KLSNkZWZpbmUgTlZSQU1fQllURVMJCSgxMjgtTlZSQU1fRklSU1RfQllURSkKLQotI2RlZmluZSBtYWNoX2NoZWNrX2NoZWNrc3VtCWNvYmFsdF9jaGVja19jaGVja3N1bQotI2RlZmluZSBtYWNoX3NldF9jaGVja3N1bQljb2JhbHRfc2V0X2NoZWNrc3VtCi0jZGVmaW5lIG1hY2hfcHJvY19pbmZvcwkJY29iYWx0X3Byb2NfaW5mb3MKLQotI2VuZGlmCi0KICNpZiBNQUNIID09IEFUQVJJCiAKIC8qIFNwZWNpYWwgcGFyYW1ldGVycyBmb3IgUlRDIGluIEF0YXJpIG1hY2hpbmVzICovCkBAIC02MDQsMTc3ICs1ODUsNiBAQAogCiAjZW5kaWYgLyogTUFDSCA9PSBQQyAqLwogCi0jaWYgTUFDSCA9PSBDT0JBTFQKLQotLyogdGhlIGNvYmFsdCBDTU9TIGhhcyBhIHdpZGVyIHJhbmdlIG9mIGl0cyBjaGVja3N1bSAqLwotc3RhdGljIGludCBjb2JhbHRfY2hlY2tfY2hlY2tzdW0odm9pZCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOwotCXVuc2lnbmVkIHNob3J0IGV4cGVjdDsKLQotCWZvciAoaSA9IENPQlRfQ01PU19DS1NfU1RBUlQ7IGkgPD0gQ09CVF9DTU9TX0NLU19FTkQ7ICsraSkgewotCQlpZiAoKGkgPT0gQ09CVF9DTU9TX0NIRUNLU1VNKSB8fCAoaSA9PSAoQ09CVF9DTU9TX0NIRUNLU1VNKzEpKSkKLQkJCWNvbnRpbnVlOwotCi0JCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKLQl9Ci0JZXhwZWN0ID0gX19udnJhbV9yZWFkX2J5dGUoQ09CVF9DTU9TX0NIRUNLU1VNKSA8PCA4IHwKLQkgICAgX19udnJhbV9yZWFkX2J5dGUoQ09CVF9DTU9TX0NIRUNLU1VNKzEpOwotCXJldHVybiAoKHN1bSAmIDB4ZmZmZikgPT0gZXhwZWN0KTsKLX0KLQotc3RhdGljIHZvaWQgY29iYWx0X3NldF9jaGVja3N1bSh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7Ci0KLQlmb3IgKGkgPSBDT0JUX0NNT1NfQ0tTX1NUQVJUOyBpIDw9IENPQlRfQ01PU19DS1NfRU5EOyArK2kpIHsKLQkJaWYgKChpID09IENPQlRfQ01PU19DSEVDS1NVTSkgfHwgKGkgPT0gKENPQlRfQ01PU19DSEVDS1NVTSsxKSkpCi0JCQljb250aW51ZTsKLQotCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7Ci0JfQotCi0JX19udnJhbV93cml0ZV9ieXRlKHN1bSA+PiA4LCBDT0JUX0NNT1NfQ0hFQ0tTVU0pOwotCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gJiAweGZmLCBDT0JUX0NNT1NfQ0hFQ0tTVU0rMSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCi1zdGF0aWMgaW50IGNvYmFsdF9wcm9jX2luZm9zKHVuc2lnbmVkIGNoYXIgKm52cmFtLCBjaGFyICpidWZmZXIsIGludCAqbGVuLAotCW9mZl90ICpiZWdpbiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgc2l6ZSkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgY2hlY2tzdW07Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotCWNoYXIgc2VybnVtWzE0XTsKLQljaGFyICprZXkgPSAiY05vRWJUYVdsT3RSISI7Ci0JdW5zaWduZWQgY2hhciBidG9fY3N1bTsKLQotCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKLQljaGVja3N1bSA9IF9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKTsKLQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKLQotCVBSSU5UX1BST0MoIkNoZWNrc3VtIHN0YXR1czogJXN2YWxpZFxuIiwgY2hlY2tzdW0gPyAiIiA6ICJub3QgIik7Ci0KLQlmbGFncyA9IG52cmFtW0NPQlRfQ01PU19GTEFHX0JZVEVfMF0gPDwgOCAKLQkgICAgfCBudnJhbVtDT0JUX0NNT1NfRkxBR19CWVRFXzFdOwotCi0JUFJJTlRfUFJPQygiQ29uc29sZTogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0NPTlNPTEVfRkxBRyA/ICAib24iOiAib2ZmIik7Ci0KLQlQUklOVF9QUk9DKCJGaXJtd2FyZSBEZWJ1ZyBNZXNzYWdlczogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0RFQlVHX0ZMQUcgPyAib24iOiAib2ZmIik7Ci0KLQlQUklOVF9QUk9DKCJBdXRvIFByb21wdDogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0FVVE9fUFJPTVBUX0ZMQUcgPyAib24iOiAib2ZmIik7Ci0KLQlQUklOVF9QUk9DKCJTaHV0ZG93biBTdGF0dXM6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19DTEVBTl9CT09UX0ZMQUcgPyAiY2xlYW4iOiAiZGlydHkiKTsKLQotCVBSSU5UX1BST0MoIkhhcmR3YXJlIFByb2JlOiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfSFdfTk9QUk9CRV9GTEFHID8gInBhcnRpYWwiOiAiZnVsbCIpOwotCi0JUFJJTlRfUFJPQygiU3lzdGVtIEZhdWx0OiAlc2RldGVjdGVkXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19TWVNGQVVMVF9GTEFHID8gIiI6ICJub3QgIik7Ci0KLQlQUklOVF9QUk9DKCJQYW5pYyBvbiBPT1BTOiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfT09QU1BBTklDX0ZMQUcgPyAieWVzIjogIm5vIik7Ci0KLQlQUklOVF9QUk9DKCJEZWxheWVkIENhY2hlIEluaXRpYWxpemF0aW9uOiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfREVMQVlfQ0FDSEVfRkxBRyA/ICJ5ZXMiOiAibm8iKTsKLQotCVBSSU5UX1BST0MoIlNob3cgTG9nbyBhdCBCb290OiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfTk9MT0dPX0ZMQUcgPyAibm8iOiAieWVzIik7Ci0KLQlQUklOVF9QUk9DKCJCb290IE1ldGhvZDogIik7Ci0Jc3dpdGNoIChudnJhbVtDT0JUX0NNT1NfQk9PVF9NRVRIT0RdKSB7Ci0JY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfRElTSzoKLQkJUFJJTlRfUFJPQygiZGlza1xuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfUk9NOgotCQlQUklOVF9QUk9DKCJyb21cbiIpOwotCQlicmVhazsKLQotCWNhc2UgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX05FVDoKLQkJUFJJTlRfUFJPQygibmV0XG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlQUklOVF9QUk9DKCJ1bmtub3duXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JUFJJTlRfUFJPQygiUHJpbWFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjBfTUFKXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMF9NSU5dICk7Ci0JUFJJTlRfUFJPQygiU2Vjb25kYXJ5IEJvb3QgRGV2aWNlOiAlZDolZFxuIiwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMV9NQUpdLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYxX01JTl0gKTsKLQlQUklOVF9QUk9DKCJUZXJ0aWFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjJfTUFKXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMl9NSU5dICk7Ci0KLQlQUklOVF9QUk9DKCJVcHRpbWU6ICVkXG4iLAotCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzBdIDw8IDI0IHwKLQkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8xXSA8PCAxNiB8Ci0JCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfMl0gPDwgOCAgfAotCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzNdKTsKLQotCVBSSU5UX1BST0MoIkJvb3QgQ291bnQ6ICVkXG4iLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzBdIDw8IDI0IHwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8xXSA8PCAxNiB8Ci0JCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfMl0gPDwgOCAgfAotCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzNdKTsKLQotCS8qIDEzIGJ5dGVzIG9mIHNlcmlhbCBudW0gKi8KLQlmb3IgKGk9MCA7IGk8MTMgOyBpKyspIHsKLQkJc2VybnVtW2ldID0gbnZyYW1bQ09CVF9DTU9TX1NZU19TRVJOVU1fMCArIGldOwotCX0KLQlzZXJudW1bMTNdID0gJ1wwJzsKLQotCWNoZWNrc3VtID0gMDsKLQlmb3IgKGk9MCA7IGk8MTMgOyBpKyspIHsKLQkJY2hlY2tzdW0gKz0gc2VybnVtW2ldIF4ga2V5W2ldOwotCX0KLQljaGVja3N1bSA9ICgoY2hlY2tzdW0gJiAweDdmKSBeICgweGQ2KSkgJiAweGZmOwotCi0JUFJJTlRfUFJPQygiU2VyaWFsIE51bWJlcjogJXMiLCBzZXJudW0pOwotCWlmIChjaGVja3N1bSAhPSBudnJhbVtDT0JUX0NNT1NfU1lTX1NFUk5VTV9DU1VNXSkgewotCQlQUklOVF9QUk9DKCIgKGludmFsaWQgY2hlY2tzdW0pIik7Ci0JfQotCVBSSU5UX1BST0MoIlxuIik7Ci0KLQlQUklOVF9QUk9DKCJSb20gUmV2aXNvbjogJWQuJWQuJWRcbiIsIG52cmFtW0NPQlRfQ01PU19ST01fUkVWX01BSl0sCi0JCW52cmFtW0NPQlRfQ01PU19ST01fUkVWX01JTl0sIG52cmFtW0NPQlRfQ01PU19ST01fUkVWX1JFVl0pOwotCi0JUFJJTlRfUFJPQygiQlRPIFNlcnZlcjogJWQuJWQuJWQuJWQiLCBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzBdLAotCQludnJhbVtDT0JUX0NNT1NfQlRPX0lQXzFdLCBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzJdLAotCQludnJhbVtDT0JUX0NNT1NfQlRPX0lQXzNdKTsKLQlidG9fY3N1bSA9IG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMF0gKyBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzFdCi0JCSsgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8yXSArIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfM107Ci0JaWYgKGJ0b19jc3VtICE9IG52cmFtW0NPQlRfQ01PU19CVE9fSVBfQ1NVTV0pIHsKLQkJUFJJTlRfUFJPQygiIChpbnZhbGlkIGNoZWNrc3VtKSIpOwotCX0KLQlQUklOVF9QUk9DKCJcbiIpOwotCi0JaWYgKGZsYWdzICYgQ09CVF9DTU9TX1ZFUlNJT05fRkxBRwotCSAmJiBudnJhbVtDT0JUX0NNT1NfVkVSU0lPTl0gPj0gQ09CVF9DTU9TX1ZFUl9CVE9DT0RFKSB7Ci0JCVBSSU5UX1BST0MoIkJUTyBDb2RlOiAweCV4XG4iLAotCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzBdIDw8IDI0IHwKLQkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8xXSA8PCAxNiB8Ci0JCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfMl0gPDwgOCB8Ci0JCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfM10pOwotCX0KLQotCXJldHVybiAxOwotfQotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0KLSNlbmRpZiAvKiBNQUNIID09IENPQkFMVCAqLwotCiAjaWYgTUFDSCA9PSBBVEFSSQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlzY29tOC5jIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguYwppbmRleCAzNDk0ZTNmLi5iMzdlNjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKQEAgLTIxMywxNCArMjEzLDYgQEAKIAkJcmVsZWFzZV9yZWdpb24oUkNfVE9fSVNBKHJjX2lvcG9ydFtpXSkgKyBicC0+YmFzZSwgMSk7CiB9CiAJCi0vKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGVuYWJsZWQgaW50ZXJydXB0cyAqLwotc3RhdGljIGlubGluZSB2b2lkIHJjX2xvbmdfZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkKLXsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JCi0JZm9yIChpID0gamlmZmllcyArIGRlbGF5OyB0aW1lX2FmdGVyKGksamlmZmllcyk7ICkgOwotfQotCiAvKiBSZXNldCBhbmQgc2V0dXAgQ0QxODAgY2hpcCAqLwogc3RhdGljIHZvaWQgX19pbml0IHJjX2luaXRfQ0QxODAoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQogewpAQCAtMjMxLDcgKzIyMyw3IEBACiAJcmNfd2FpdF9DQ1IoYnApOwkJCSAgIC8qIFdhaXQgZm9yIENDUiByZWFkeSAgICAgICAgKi8KIAlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX0hBUkRSRVNFVCk7ICAgICAgLyogUmVzZXQgQ0QxODAgY2hpcCAgICAgICAgICAqLwogCXN0aSgpOwotCXJjX2xvbmdfZGVsYXkoSFovMjApOyAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSAwLjA1IHNlYyAgICAgICAgICAgICovCisJbXNsZWVwKDUwKTsJCQkJICAgLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLwogCWNsaSgpOwogCXJjX291dChicCwgQ0QxODBfR0lWUiwgUkNfSUQpOyAgICAgICAgICAgICAvKiBTZXQgSUQgZm9yIHRoaXMgY2hpcCAgICAgICovCiAJcmNfb3V0KGJwLCBDRDE4MF9HSUNSLCAwKTsgICAgICAgICAgICAgICAgIC8qIENsZWFyIGFsbCBiaXRzICAgICAgICAgICAgKi8KQEAgLTI4MCw3ICsyNzIsNyBAQAogCQlyY193YWl0X0NDUihicCk7CiAJCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfVFhFTik7ICAgICAgICAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgICAgICovCiAJCXJjX291dChicCwgQ0QxODBfSUVSLCBJRVJfVFhSRFkpOyAgICAgICAvKiBFbmFibGUgdHggZW1wdHkgaW50ciAgICovCi0JCXJjX2xvbmdfZGVsYXkoSFovMjApOwkgICAgICAgCQkKKwkJbXNsZWVwKDUwKTsKIAkJaXJxcyA9IHByb2JlX2lycV9vZmYoaXJxcyk7CiAJCXZhbDEgPSByY19pbihicCwgUkNfQlNSKTsJCS8qIEdldCBCb2FyZCBTdGF0dXMgcmVnICAgKi8KIAkJdmFsMiA9IHJjX2luKGJwLCBSQ19BQ0tfVElOVCk7ICAgICAgICAgIC8qIEFDSyBpbnRlcnJ1cHQgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwppbmRleCBhM2ZkN2U3Li4wMjcwMDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCkBAIC0xNzAyLDcgKzE3MDIsOCBAQAogCWlmIChjb3VudCA8PSAwIHx8IHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfd3JpdGUiKSkKIAkJcmV0dXJuIDA7CiAKLQltdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmluZm8tPndyaXRlX210eCk7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaW5mby0+d3JpdGVfbXR4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQogCXByaW50ayhLRVJOX0lORk8gInJwX3dyaXRlICVkIGNoYXJzLi4uIiwgY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3J0Yy5jIGIvZHJpdmVycy9jaGFyL3J0Yy5jCmluZGV4IDIwMzgwYTIuLjIyY2Y3YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ydGMuYworKysgYi9kcml2ZXJzL2NoYXIvcnRjLmMKQEAgLTExNTksNyArMTE1OSw4IEBACiAKIAlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKIAotCXByaW50ayhLRVJOX1dBUk5JTkcgInJ0YzogbG9zdCBzb21lIGludGVycnVwdHMgYXQgJWxkSHouXG4iLCBmcmVxKTsKKwlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwgZnJlcSk7CiAKIAkvKiBOb3cgd2UgaGF2ZSBuZXcgZGF0YSAqLwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcnRjX3dhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCmluZGV4IGE2OWYwOTQuLmQ2M2Y1Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CkBAIC0zNCw2ICszNSw3IEBACiAvKiBWYXJpYWJsZXMgZm9yIHNlbGVjdGlvbiBjb250cm9sLiAqLwogLyogVXNlIGEgZHluYW1pYyBidWZmZXIsIGluc3RlYWQgb2Ygc3RhdGljIChEZWMgMTk5NCkgKi8KIHN0cnVjdCB2Y19kYXRhICpzZWxfY29uczsJCS8qIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkICovCitzdGF0aWMgaW50IHVzZV91bmljb2RlOwogc3RhdGljIHZvbGF0aWxlIGludCBzZWxfc3RhcnQgPSAtMTsgCS8qIGNsZWFyZWQgYnkgY2xlYXJfc2VsZWN0aW9uICovCiBzdGF0aWMgaW50IHNlbF9lbmQ7CiBzdGF0aWMgaW50IHNlbF9idWZmZXJfbHRoOwpAQCAtNTQsMTAgKzU2LDExIEBACiAJY29tcGxlbWVudF9wb3Moc2VsX2NvbnMsIHdoZXJlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIKK3N0YXRpYyB1MTYKIHNlbF9wb3MoaW50IG4pCiB7Ci0JcmV0dXJuIGludmVyc2VfdHJhbnNsYXRlKHNlbF9jb25zLCBzY3JlZW5fZ2x5cGgoc2VsX2NvbnMsIG4pKTsKKwlyZXR1cm4gaW52ZXJzZV90cmFuc2xhdGUoc2VsX2NvbnMsIHNjcmVlbl9nbHlwaChzZWxfY29ucywgbiksCisJCQkJdXNlX3VuaWNvZGUpOwogfQogCiAvKiByZW1vdmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGhpZ2hsaWdodCwgaWYgYW55LApAQCAtODYsOCArODksOCBAQAogICAweEZGN0ZGRkZGICAvKiBsYXRpbi0xIGFjY2VudGVkIGxldHRlcnMsIG5vdCBkaXZpc2lvbiBzaWduICovCiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBpbndvcmQoY29uc3QgdW5zaWduZWQgY2hhciBjKSB7Ci0JcmV0dXJuICggaW53b3JkTHV0W2M+PjVdID4+IChjICYgMHgxRikgKSAmIDE7CitzdGF0aWMgaW5saW5lIGludCBpbndvcmQoY29uc3QgdTE2IGMpIHsKKwlyZXR1cm4gYyA+IDB4ZmYgfHwgKCggaW53b3JkTHV0W2M+PjVdID4+IChjICYgMHgxRikgKSAmIDEpOwogfQogCiAvKiBzZXQgaW53b3JkTHV0IGNvbnRlbnRzLiBJbnZva2VkIGJ5IGlvY3RsKCkuICovCkBAIC0xMDgsMTMgKzExMSwzNiBAQAogCXJldHVybiAodiA+IHUpID8gdSA6IHY7CiB9CiAKKy8qIHN0b3JlcyB0aGUgY2hhciBpbiBVVEY4IGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCAoMS0zKSAqLworc3RhdGljIGludCBzdG9yZV91dGY4KHUxNiBjLCBjaGFyICpwKQoreworCWlmIChjIDwgMHg4MCkgeworCQkvKiAgMCoqKioqKiogKi8KKwkJcFswXSA9IGM7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7CisJCS8qIDExMCoqKioqIDEwKioqKioqICovCisJCXBbMF0gPSAweGMwIHwgKGMgPj4gNik7CisJCXBbMV0gPSAweDgwIHwgKGMgJiAweDNmKTsKKwkJcmV0dXJuIDI7CisgICAgCX0gZWxzZSB7CisJCS8qIDExMTAqKioqIDEwKioqKioqIDEwKioqKioqICovCisJCXBbMF0gPSAweGUwIHwgKGMgPj4gMTIpOworCQlwWzFdID0gMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpOworCQlwWzJdID0gMHg4MCB8IChjICYgMHgzZik7CisJCXJldHVybiAzOworICAgIAl9Cit9CisKIC8qIHNldCB0aGUgY3VycmVudCBzZWxlY3Rpb24uIEludm9rZWQgYnkgaW9jdGwoKSBvciBieSBrZXJuZWwgY29kZS4gKi8KIGludCBzZXRfc2VsZWN0aW9uKGNvbnN0IHN0cnVjdCB0aW9jbF9zZWxlY3Rpb24gX191c2VyICpzZWwsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOwogCWludCBzZWxfbW9kZSwgbmV3X3NlbF9zdGFydCwgbmV3X3NlbF9lbmQsIHNwYzsKIAljaGFyICpicCwgKm9icDsKLQlpbnQgaSwgcHMsIHBlOworCWludCBpLCBwcywgcGUsIG11bHRpcGxpZXI7CisJdTE2IGM7CisJc3RydWN0IGtiZF9zdHJ1Y3QgKmtiZCA9IGtiZF90YWJsZSArIGZnX2NvbnNvbGU7CiAKIAlwb2tlX2JsYW5rZWRfY29uc29sZSgpOwogCkBAIC0xNTgsNiArMTg0LDcgQEAKIAkJY2xlYXJfc2VsZWN0aW9uKCk7CiAJCXNlbF9jb25zID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOwogCX0KKwl1c2VfdW5pY29kZSA9IGtiZCAmJiBrYmQtPmtiZG1vZGUgPT0gVkNfVU5JQ09ERTsKIAogCXN3aXRjaCAoc2VsX21vZGUpCiAJewpAQCAtMjQwLDcgKzI2Nyw4IEBACiAJc2VsX2VuZCA9IG5ld19zZWxfZW5kOwogCiAJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGJlZm9yZSBmcmVlaW5nIHRoZSBvbGQgb25lIC4uLiAqLwotCWJwID0ga21hbGxvYygoc2VsX2VuZC1zZWxfc3RhcnQpLzIrMSwgR0ZQX0tFUk5FTCk7CisJbXVsdGlwbGllciA9IHVzZV91bmljb2RlID8gMyA6IDE7ICAvKiBjaGFycyBjYW4gdGFrZSB1cCB0byAzIGJ5dGVzICovCisJYnAgPSBrbWFsbG9jKChzZWxfZW5kLXNlbF9zdGFydCkvMiptdWx0aXBsaWVyKzEsIEdGUF9LRVJORUwpOwogCWlmICghYnApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VsZWN0aW9uOiBrbWFsbG9jKCkgZmFpbGVkXG4iKTsKIAkJY2xlYXJfc2VsZWN0aW9uKCk7CkBAIC0yNTEsOCArMjc5LDEyIEBACiAKIAlvYnAgPSBicDsKIAlmb3IgKGkgPSBzZWxfc3RhcnQ7IGkgPD0gc2VsX2VuZDsgaSArPSAyKSB7Ci0JCSpicCA9IHNlbF9wb3MoaSk7Ci0JCWlmICghaXNzcGFjZSgqYnArKykpCisJCWMgPSBzZWxfcG9zKGkpOworCQlpZiAodXNlX3VuaWNvZGUpCisJCQlicCArPSBzdG9yZV91dGY4KGMsIGJwKTsKKwkJZWxzZQorCQkJKmJwKysgPSBjOworCQlpZiAoIWlzc3BhY2UoYykpCiAJCQlvYnAgPSBicDsKIAkJaWYgKCEgKChpICsgMikgJSB2Yy0+dmNfc2l6ZV9yb3cpKSB7CiAJCQkvKiBzdHJpcCB0cmFpbGluZyBibGFua3MgZnJvbSBsaW5lIGFuZCBhZGQgbmV3bGluZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zb255cGkuYyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwppbmRleCAzZWY1OTNhLi43MzAzN2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc29ueXBpLmMKKysrIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCkBAIC04ODUsNTMgKzg4NSw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiBFeHRlcm5hbCBjYW1lcmEgY29tbWFuZCAoZXhwb3J0ZWQgdG8gdGhlIG1vdGlvbiBleWUgdjRsIGRyaXZlcikgKi8KLWludCBzb255cGlfY2FtZXJhX2NvbW1hbmQoaW50IGNvbW1hbmQsIHU4IHZhbHVlKQotewotCWlmICghY2FtZXJhKQotCQlyZXR1cm4gLUVJTzsKLQotCW11dGV4X2xvY2soJnNvbnlwaV9kZXZpY2UubG9jayk7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQToKLQkJaWYgKHZhbHVlKQotCQkJc29ueXBpX2NhbWVyYV9vbigpOwotCQllbHNlCi0JCQlzb255cGlfY2FtZXJhX29mZigpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1M6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9CUklHSFRORVNTLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09OVFJBU1Q6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9DT05UUkFTVCwgdmFsdWUpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUhVRToKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0hVRSwgdmFsdWUpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTE9SOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09MT1IsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1M6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfUElDVFVSRSwgdmFsdWUpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUFHQzoKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0FHQywgdmFsdWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogc29ueXBpX2NhbWVyYV9jb21tYW5kIGludmFsaWQ6ICVkXG4iLAotCQkgICAgICAgY29tbWFuZCk7Ci0JCWJyZWFrOwotCX0KLQltdXRleF91bmxvY2soJnNvbnlwaV9kZXZpY2UubG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woc29ueXBpX2NhbWVyYV9jb21tYW5kKTsKLQogc3RhdGljIGludCBzb255cGlfbWlzY19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQogewogCWludCByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKaW5kZXggYmFmNzIzNC4uNDU1ODU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCisrKyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwpAQCAtMzQ1LDE4ICszNDUsNiBAQAogfQogCiAKLS8qIE11c3QgYmUgY2FsbGVkIHdpdGggZW5hYmxlZCBpbnRlcnJ1cHRzICovCi0vKiBVZ2x5LiBWZXJ5IHVnbHkuIERvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZyBlbHNlIHRoYW4gaW5pdGlhbGl6YXRpb24KLSAgIGNvZGUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzeF9sb25nX2RlbGF5KHVuc2lnbmVkIGxvbmcgZGVsYXkpCi17Ci0JdW5zaWduZWQgbG9uZyBpOwotCi0JZm9yIChpID0gamlmZmllcyArIGRlbGF5OyB0aW1lX2FmdGVyKGksIGppZmZpZXMpOyApIDsKLX0KLQotCi0KIC8qIFNldCB0aGUgSVJRIHVzaW5nIHRoZSBSVFMgbGluZXMgdGhhdCBydW4gdG8gdGhlIFBBTCBvbiB0aGUgYm9hcmQuLi4uICovCiBzdGF0aWMgaW50IHN4X3NldF9pcnEgKCBzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCkKIHsKQEAgLTM5Nyw3ICszODUsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwogCXN4X291dF9vZmYoYnAsIENEMTg2eF9DQ1IsIENDUl9IQVJEUkVTRVQpOyAgICAgIC8qIFJlc2V0IENEMTg2eCBjaGlwICAgICAgICAgICovCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKLQlzeF9sb25nX2RlbGF5KEhaLzIwKTsgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLworCW1zbGVlcCg1MCk7CQkJCQkvKiBEZWxheSAwLjA1IHNlYyAgICAgICAgICAgICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CiAJc3hfb3V0X29mZihicCwgQ0QxODZ4X0dJVlIsIFNYX0lEKTsgICAgICAgICAgICAgLyogU2V0IElEIGZvciB0aGlzIGNoaXAgICAgICAqLwogCXN4X291dF9vZmYoYnAsIENEMTg2eF9HSUNSLCAwKTsgICAgICAgICAgICAgICAgIC8qIENsZWFyIGFsbCBiaXRzICAgICAgICAgICAgKi8KQEAgLTUzMyw3ICs1MjEsNyBAQAogCQlzeF93YWl0X0NDUihicCk7CiAJCXN4X291dChicCwgQ0QxODZ4X0NDUiwgQ0NSX1RYRU4pOyAgICAgICAgLyogRW5hYmxlIHRyYW5zbWl0dGVyICAgICAqLwogCQlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIElFUl9UWFJEWSk7ICAgICAgIC8qIEVuYWJsZSB0eCBlbXB0eSBpbnRyICAgKi8KLQkJc3hfbG9uZ19kZWxheShIWi8yMCk7CisJCW1zbGVlcCg1MCk7CiAJCWlycXMgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOwogCiAJCWRwcmludGsgKFNYX0RFQlVHX0lOSVQsICJTUlNSID0gJTAyeCwgIiwgc3hfaW4oYnAsIENEMTg2eF9TUlNSKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYyBiL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCmluZGV4IDhjNzNjY2IuLjkzZDBiYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCkBAIC0xNzg4LDcgKzE3ODgsNiBAQAogCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JbG9ja19rZXJuZWwoKTsKIAlpZiAodGVzdF9iaXQoQVNZSV9UWExPVywgJnBvcnRwLT5pc3RhdGUpKQogCQl0dHlfd2FrZXVwKHR0eSk7CiAKQEAgLTE4MDIsNyArMTgwMSw2IEBACiAJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpCiAJCQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBoZXJlIC0gQUtQTSAqLwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzNTcsOSArMjM1NSw2IEBACiAJaWYgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCiAJCWdvdG8gZXJyOwogCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgInBsZWFzZSwgcmVwb3J0IHRoaXMgdG8gTEtNTDogJXgvJXgvJXhcbiIsCi0JCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGRldi0+Y2xhc3MpOwotCiAJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCmluZGV4IGYwMmEwNzkuLmY1M2U1MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCkBAIC0xNjAsOCArMTYwLDYgQEAKIAogI2RlZmluZSBJT19QSU5fU0hVVERPV05fTElNSVQgMTAwCiAKLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCiBzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMgewogCWludAlyaV91cDsJCiAJaW50CXJpX2Rvd247CkBAIC0zMDY0LDEyICszMDYyLDYgQEAKIAkJcHJpbnRrKCIlcyglZCk6bWdzbF9zZXRfdGVybWlvcyAlc1xuIiwgX19GSUxFX18sX19MSU5FX18sCiAJCQl0dHktPmRyaXZlci0+bmFtZSApOwogCQotCS8qIGp1c3QgcmV0dXJuIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KLQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkgICAgJiYgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCi0JCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCi0JICByZXR1cm47Ci0KIAltZ3NsX2NoYW5nZV9wYXJhbXMoaW5mbyk7CiAKIAkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMKaW5kZXggMDJiNDliYy4uNDI4YjUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMKQEAgLTE0NCw4ICsxNDQsNiBAQAogLyoKICAqIHR0eSBzdXBwb3J0IGFuZCBjYWxsYmFja3MKICAqLwotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCi0KIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKIAogc3RhdGljIGludCAgb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwpAQCAtODIzLDEyICs4MjEsNiBAQAogCiAJREJHSU5GTygoIiVzIHNldF90ZXJtaW9zXG4iLCB0dHktPmRyaXZlci0+bmFtZSkpOwogCi0JLyoganVzdCByZXR1cm4gaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLwotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKQotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCQlyZXR1cm47Ci0KIAljaGFuZ2VfcGFyYW1zKGluZm8pOwogCiAJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwppbmRleCBlZjkzZDA1Li5hNjU0MDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKQEAgLTEzNSw4ICsxMzUsNiBAQAogCiAjZGVmaW5lIElPX1BJTl9TSFVURE9XTl9MSU1JVCAxMDAKIAotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCi0KIHN0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cyB7CiAJaW50CXJpX3VwOwogCWludAlyaV9kb3duOwpAQCAtOTI3LDEyICs5MjUsNiBAQAogCQlwcmludGsoIiVzKCVkKTolcyBzZXRfdGVybWlvcygpXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKIAkJCXR0eS0+ZHJpdmVyLT5uYW1lICk7CiAKLQkvKiBqdXN0IHJldHVybiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCi0JaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JICAgICYmIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpCi0JCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCi0JICByZXR1cm47Ci0KIAljaGFuZ2VfcGFyYW1zKGluZm8pOwogCiAJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKaW5kZXggZGM0ZTFmZi4uOGYzZjc2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZwpAQCAtMiwxMSArMiw5IEBACiAjIFRQTSBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJUUE0gZGV2aWNlcyIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCi1jb25maWcgVENHX1RQTQorbWVudWNvbmZpZyBUQ0dfVFBNCiAJdHJpc3RhdGUgIlRQTSBIYXJkd2FyZSBTdXBwb3J0IgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIGluIHlvdXIgc3lzdGVtLCB3aGljaApAQCAtMjEsOSArMTksMTEgQEAKIAkgIE5vdGU6IEZvciBtb3JlIFRQTSBkcml2ZXJzIGVuYWJsZSBDT05GSUdfUE5QLCBDT05GSUdfQUNQSQogCSAgYW5kIENPTkZJR19QTlBBQ1BJLgogCitpZiBUQ0dfVFBNCisKIGNvbmZpZyBUQ0dfVElTCiAJdHJpc3RhdGUgIlRQTSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiAxLjIgSW50ZXJmYWNlIgotCWRlcGVuZHMgb24gVENHX1RQTSAmJiBQTlBBQ1BJCisJZGVwZW5kcyBvbiBQTlBBQ1BJCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCB0aGF0IGlzIGNvbXBsaWFudCB3aXRoIHRoZQogCSAgVENHIFRJUyAxLjIgVFBNIHNwZWNpZmljYXRpb24gc2F5IFllcyBhbmQgaXQgd2lsbCBiZSBhY2Nlc3NpYmxlCkBAIC0zMiw3ICszMiw3IEBACiAKIGNvbmZpZyBUQ0dfTlNDCiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgVFBNIEludGVyZmFjZSIKLQlkZXBlbmRzIG9uIFRDR19UUE0gJiYgUE5QQUNQSQorCWRlcGVuZHMgb24gUE5QQUNQSQogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgZnJvbSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIAogCSAgc2F5IFllcyBhbmQgaXQgd2lsbCBiZSBhY2Nlc3NpYmxlIGZyb20gd2l0aGluIExpbnV4LiAgVG8gCkBAIC00MSw3ICs0MSw2IEBACiAKIGNvbmZpZyBUQ0dfQVRNRUwKIAl0cmlzdGF0ZSAiQXRtZWwgVFBNIEludGVyZmFjZSIKLQlkZXBlbmRzIG9uIFRDR19UUE0KIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIGZyb20gQXRtZWwgc2F5IFllcyBhbmQgaXQgCiAJICB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gTGludXguICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIApAQCAtNDksNyArNDgsNyBAQAogCiBjb25maWcgVENHX0lORklORU9OCiAJdHJpc3RhdGUgIkluZmluZW9uIFRlY2hub2xvZ2llcyBUUE0gSW50ZXJmYWNlIgotCWRlcGVuZHMgb24gVENHX1RQTSAmJiBQTlBBQ1BJCisJZGVwZW5kcyBvbiBQTlBBQ1BJCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBmcm9tIEluZmluZW9uIFRlY2hub2xvZ2llcwogCSAgKGVpdGhlciBTTEQgOTYzMCBUVCAxLjEgb3IgU0xCIDk2MzUgVFQgMS4yKSBzYXkgWWVzIGFuZCBpdApAQCAtNTksNSArNTgsNCBAQAogCSAgRnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciBhbmQgdGhlIHN1cHBvcnRlZCBoYXJkd2FyZQogCSAgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly93d3cucHJvc2VjLnJ1Yi5kZS90cG0KIAotZW5kbWVudQotCitlbmRpZiAjIFRDR19UUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfYXVkaXQuYyBiL2RyaXZlcnMvY2hhci90dHlfYXVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIyMDEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9hdWRpdC5jCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ3JlYXRpbmcgYXVkaXQgZXZlbnRzIGZyb20gVFRZIGlucHV0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBjb3B5cmlnaHRlZAorICogbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLCBtb2RpZnksIGNvcHksIG9yCisgKiByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogQXV0aG9yczogTWlsb3NsYXYgVHJtYWMgPG1pdHJAcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisKK3N0cnVjdCB0dHlfYXVkaXRfYnVmIHsKKwlhdG9taWNfdCBjb3VudDsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIFByb3RlY3RzIGFsbCBkYXRhIGJlbG93ICovCisJaW50IG1ham9yLCBtaW5vcjsJLyogVGhlIFRUWSB3aGljaCB0aGUgZGF0YSBpcyBmcm9tICovCisJdW5zaWduZWQgaWNhbm9uOjE7CisJc2l6ZV90IHZhbGlkOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CS8qIEFsbG9jYXRlZCBzaXplIE5fVFRZX0JVRl9TSVpFICovCit9OworCitzdGF0aWMgc3RydWN0IHR0eV9hdWRpdF9idWYgKnR0eV9hdWRpdF9idWZfYWxsb2MoaW50IG1ham9yLCBpbnQgbWlub3IsCisJCQkJCQkgaW50IGljYW5vbikKK3sKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmOworCisJYnVmID0ga21hbGxvYyhzaXplb2YgKCpidWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJZ290byBlcnI7CisJaWYgKFBBR0VfU0laRSAhPSBOX1RUWV9CVUZfU0laRSkKKwkJYnVmLT5kYXRhID0ga21hbGxvYyhOX1RUWV9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJZWxzZQorCQlidWYtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+ZGF0YSkKKwkJZ290byBlcnJfYnVmOworCWF0b21pY19zZXQoJmJ1Zi0+Y291bnQsIDEpOworCW11dGV4X2luaXQoJmJ1Zi0+bXV0ZXgpOworCWJ1Zi0+bWFqb3IgPSBtYWpvcjsKKwlidWYtPm1pbm9yID0gbWlub3I7CisJYnVmLT5pY2Fub24gPSBpY2Fub247CisJYnVmLT52YWxpZCA9IDA7CisJcmV0dXJuIGJ1ZjsKKworZXJyX2J1ZjoKKwlrZnJlZShidWYpOworZXJyOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB0dHlfYXVkaXRfYnVmX2ZyZWUoc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZikKK3sKKwlXQVJOX09OKGJ1Zi0+dmFsaWQgIT0gMCk7CisJaWYgKFBBR0VfU0laRSAhPSBOX1RUWV9CVUZfU0laRSkKKwkJa2ZyZWUoYnVmLT5kYXRhKTsKKwllbHNlCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYtPmRhdGEpOworCWtmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHR0eV9hdWRpdF9idWZfcHV0KHN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJ1Zi0+Y291bnQpKQorCQl0dHlfYXVkaXRfYnVmX2ZyZWUoYnVmKTsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfYnVmX3B1c2gJLQlQdXNoIGJ1ZmZlcmVkIGRhdGEgb3V0CisgKgorICoJR2VuZXJhdGUgYW4gYXVkaXQgbWVzc2FnZSBmcm9tIHRoZSBjb250ZW50cyBvZiBAYnVmLCB3aGljaCBpcyBvd25lZCBieQorICoJQHRzayB3aXRoIEBsb2dpbnVpZC4gIEBidWYtPm11dGV4IG11c3QgYmUgbG9ja2VkLgorICovCitzdGF0aWMgdm9pZCB0dHlfYXVkaXRfYnVmX3B1c2goc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVpZF90IGxvZ2ludWlkLAorCQkJICAgICAgIHN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYpCit7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWI7CisKKwlpZiAoYnVmLT52YWxpZCA9PSAwKQorCQlyZXR1cm47CisJaWYgKGF1ZGl0X2VuYWJsZWQgPT0gMCkKKwkJcmV0dXJuOworCWFiID0gYXVkaXRfbG9nX3N0YXJ0KE5VTEwsIEdGUF9LRVJORUwsIEFVRElUX1RUWSk7CisJaWYgKGFiKSB7CisJCWNoYXIgbmFtZVtzaXplb2YodHNrLT5jb21tKV07CisKKwkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgInR0eSBwaWQ9JXUgdWlkPSV1IGF1aWQ9JXUgbWFqb3I9JWQgIgorCQkJCSAibWlub3I9JWQgY29tbT0iLCB0c2stPnBpZCwgdHNrLT51aWQsCisJCQkJIGxvZ2ludWlkLCBidWYtPm1ham9yLCBidWYtPm1pbm9yKTsKKwkJZ2V0X3Rhc2tfY29tbShuYW1lLCB0c2spOworCQlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLCBuYW1lKTsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBkYXRhPSIpOworCQlhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoYWIsIGJ1Zi0+dmFsaWQsIGJ1Zi0+ZGF0YSk7CisJCWF1ZGl0X2xvZ19lbmQoYWIpOworCX0KKwlidWYtPnZhbGlkID0gMDsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfYnVmX3B1c2hfY3VycmVudAktCVB1c2ggYnVmZmVyZWQgZGF0YSBvdXQKKyAqCisgKglHZW5lcmF0ZSBhbiBhdWRpdCBtZXNzYWdlIGZyb20gdGhlIGNvbnRlbnRzIG9mIEBidWYsIHdoaWNoIGlzIG93bmVkIGJ5CisgKgl0aGUgY3VycmVudCB0YXNrLiAgQGJ1Zi0+bXV0ZXggbXVzdCBiZSBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkIHR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50KHN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYpCit7CisJdHR5X2F1ZGl0X2J1Zl9wdXNoKGN1cnJlbnQsIGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50LT5hdWRpdF9jb250ZXh0KSwKKwkJCSAgIGJ1Zik7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2V4aXQJLQlIYW5kbGUgYSB0YXNrIGV4aXQKKyAqCisgKglNYWtlIHN1cmUgYWxsIGJ1ZmZlcmVkIGRhdGEgaXMgd3JpdHRlbiBvdXQgYW5kIGRlYWxsb2NhdGUgdGhlIGJ1ZmZlci4KKyAqCU9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIGN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZiAhPSAlTlVMTC4KKyAqLwordm9pZCB0dHlfYXVkaXRfZXhpdCh2b2lkKQoreworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWY7CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlidWYgPSBjdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWY7CisJY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZidWYtPm11dGV4KTsKKwl0dHlfYXVkaXRfYnVmX3B1c2hfY3VycmVudChidWYpOworCW11dGV4X3VubG9jaygmYnVmLT5tdXRleCk7CisKKwl0dHlfYXVkaXRfYnVmX3B1dChidWYpOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9mb3JrCS0JQ29weSBUVFkgYXVkaXQgc3RhdGUgZm9yIGEgbmV3IHRhc2sKKyAqCisgKglTZXQgdXAgVFRZIGF1ZGl0IHN0YXRlIGluIEBzaWcgZnJvbSBjdXJyZW50LiAgQHNpZyBuZWVkcyBubyBsb2NraW5nLgorICovCit2b2lkIHR0eV9hdWRpdF9mb3JrKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpCit7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnLT5hdWRpdF90dHkgPSBjdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNpZy0+dHR5X2F1ZGl0X2J1ZiA9IE5VTEw7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X3B1c2hfdGFzawktCUZsdXNoIHRhc2sncyBwZW5kaW5nIGF1ZGl0IGRhdGEKKyAqLwordm9pZCB0dHlfYXVkaXRfcHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1aWRfdCBsb2dpbnVpZCkKK3sKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmOworCisJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlidWYgPSB0c2stPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZjsKKwlpZiAoYnVmKQorCQlhdG9taWNfaW5jKCZidWYtPmNvdW50KTsKKwlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmJ1Zi0+bXV0ZXgpOworCXR0eV9hdWRpdF9idWZfcHVzaCh0c2ssIGxvZ2ludWlkLCBidWYpOworCW11dGV4X3VubG9jaygmYnVmLT5tdXRleCk7CisKKwl0dHlfYXVkaXRfYnVmX3B1dChidWYpOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9idWZfZ2V0CS0JR2V0IGFuIGF1ZGl0IGJ1ZmZlci4KKyAqCisgKglHZXQgYW4gYXVkaXQgYnVmZmVyIGZvciBAdHR5LCBhbGxvY2F0ZSBpdCBpZiBuZWNlc3NhcnkuICBSZXR1cm4gJU5VTEwKKyAqCWlmIFRUWSBhdWRpdGluZyBpcyBkaXNhYmxlZCBvciBvdXQgb2YgbWVtb3J5LiAgT3RoZXJ3aXNlLCByZXR1cm4gYSBuZXcKKyAqCXJlZmVyZW5jZSB0byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgc3RydWN0IHR0eV9hdWRpdF9idWYgKnR0eV9hdWRpdF9idWZfZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZiwgKmJ1ZjI7CisKKwlidWYgPSBOVUxMOworCWJ1ZjIgPSBOVUxMOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChsaWtlbHkoIWN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5KSkKKwkJZ290byBvdXQ7CisJYnVmID0gY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmOworCWlmIChidWYpIHsKKwkJYXRvbWljX2luYygmYnVmLT5jb3VudCk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJYnVmMiA9IHR0eV9hdWRpdF9idWZfYWxsb2ModHR5LT5kcml2ZXItPm1ham9yLAorCQkJCSAgIHR0eS0+ZHJpdmVyLT5taW5vcl9zdGFydCArIHR0eS0+aW5kZXgsCisJCQkJICAgdHR5LT5pY2Fub24pOworCWlmIChidWYyID09IE5VTEwpIHsKKwkJYXVkaXRfbG9nX2xvc3QoIm91dCBvZiBtZW1vcnkgaW4gVFRZIGF1ZGl0aW5nIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghY3VycmVudC0+c2lnbmFsLT5hdWRpdF90dHkpCisJCWdvdG8gb3V0OworCWJ1ZiA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZjsKKwlpZiAoIWJ1ZikgeworCQljdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWYgPSBidWYyOworCQlidWYgPSBidWYyOworCQlidWYyID0gTlVMTDsKKwl9CisJYXRvbWljX2luYygmYnVmLT5jb3VudCk7CisJLyogRmFsbCB0aHJvdWdoICovCisgb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKGJ1ZjIpCisJCXR0eV9hdWRpdF9idWZfZnJlZShidWYyKTsKKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9hZGRfZGF0YQktCUFkZCBkYXRhIGZvciBUVFkgYXVkaXRpbmcuCisgKgorICoJQXVkaXQgQGRhdGEgb2YgQHNpemUgZnJvbSBAdHR5LCBpZiBuZWNlc3NhcnkuCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X2FkZF9kYXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQlzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmOworCWludCBtYWpvciwgbWlub3I7CisKKwlpZiAodW5saWtlbHkoc2l6ZSA9PSAwKSkKKwkJcmV0dXJuOworCisJYnVmID0gdHR5X2F1ZGl0X2J1Zl9nZXQodHR5KTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYnVmLT5tdXRleCk7CisJbWFqb3IgPSB0dHktPmRyaXZlci0+bWFqb3I7CisJbWlub3IgPSB0dHktPmRyaXZlci0+bWlub3Jfc3RhcnQgKyB0dHktPmluZGV4OworCWlmIChidWYtPm1ham9yICE9IG1ham9yIHx8IGJ1Zi0+bWlub3IgIT0gbWlub3IKKwkgICAgfHwgYnVmLT5pY2Fub24gIT0gdHR5LT5pY2Fub24pIHsKKwkJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQoYnVmKTsKKwkJYnVmLT5tYWpvciA9IG1ham9yOworCQlidWYtPm1pbm9yID0gbWlub3I7CisJCWJ1Zi0+aWNhbm9uID0gdHR5LT5pY2Fub247CisJfQorCWRvIHsKKwkJc2l6ZV90IHJ1bjsKKworCQlydW4gPSBOX1RUWV9CVUZfU0laRSAtIGJ1Zi0+dmFsaWQ7CisJCWlmIChydW4gPiBzaXplKQorCQkJcnVuID0gc2l6ZTsKKwkJbWVtY3B5KGJ1Zi0+ZGF0YSArIGJ1Zi0+dmFsaWQsIGRhdGEsIHJ1bik7CisJCWJ1Zi0+dmFsaWQgKz0gcnVuOworCQlkYXRhICs9IHJ1bjsKKwkJc2l6ZSAtPSBydW47CisJCWlmIChidWYtPnZhbGlkID09IE5fVFRZX0JVRl9TSVpFKQorCQkJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQoYnVmKTsKKwl9IHdoaWxlIChzaXplICE9IDApOworCW11dGV4X3VubG9jaygmYnVmLT5tdXRleCk7CisJdHR5X2F1ZGl0X2J1Zl9wdXQoYnVmKTsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfcHVzaAktCVB1c2ggYnVmZmVyZWQgZGF0YSBvdXQKKyAqCisgKglNYWtlIHN1cmUgbm8gYXVkaXQgZGF0YSBpcyBwZW5kaW5nIGZvciBAdHR5IG9uIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X3B1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKGxpa2VseSghY3VycmVudC0+c2lnbmFsLT5hdWRpdF90dHkpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCXJldHVybjsKKwl9CisJYnVmID0gY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmOworCWlmIChidWYpCisJCWF0b21pY19pbmMoJmJ1Zi0+Y291bnQpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAoYnVmKSB7CisJCWludCBtYWpvciwgbWlub3I7CisKKwkJbWFqb3IgPSB0dHktPmRyaXZlci0+bWFqb3I7CisJCW1pbm9yID0gdHR5LT5kcml2ZXItPm1pbm9yX3N0YXJ0ICsgdHR5LT5pbmRleDsKKwkJbXV0ZXhfbG9jaygmYnVmLT5tdXRleCk7CisJCWlmIChidWYtPm1ham9yID09IG1ham9yICYmIGJ1Zi0+bWlub3IgPT0gbWlub3IpCisJCQl0dHlfYXVkaXRfYnVmX3B1c2hfY3VycmVudChidWYpOworCQltdXRleF91bmxvY2soJmJ1Zi0+bXV0ZXgpOworCQl0dHlfYXVkaXRfYnVmX3B1dChidWYpOworCX0KK30KKworLyoqCisgKgl0dHlfYXVkaXRfb3BlbmluZwktCUEgVFRZIGlzIGJlaW5nIG9wZW5lZC4KKyAqCisgKglBcyBhIHNwZWNpYWwgaGFjaywgdGFza3MgdGhhdCBjbG9zZSBhbGwgdGhlaXIgVFRZcyBhbmQgb3BlbiBuZXcgb25lcworICoJYXJlIGFzc3VtZWQgdG8gYmUgc3lzdGVtIGRhZW1vbnMgKGUuZy4gZ2V0dHkpIGFuZCBhdWRpdGluZyBpcworICoJYXV0b21hdGljYWxseSBkaXNhYmxlZCBmb3IgdGhlbS4KKyAqLwordm9pZCB0dHlfYXVkaXRfb3BlbmluZyh2b2lkKQoreworCWludCBkaXNhYmxlOworCisJZGlzYWJsZSA9IDE7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKGN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5ID09IDApCisJCWRpc2FibGUgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKCFkaXNhYmxlKQorCQlyZXR1cm47CisKKwl0YXNrX2xvY2soY3VycmVudCk7CisJaWYgKGN1cnJlbnQtPmZpbGVzKSB7CisJCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisJCXVuc2lnbmVkIGk7CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgdGFrZSBhIHJlZiB0byB0aGUgZmlsZSwgc28gd2UgbXVzdCBob2xkIC0+ZmlsZV9sb2NrCisJCSAqIGluc3RlYWQuCisJCSAqLworCQlzcGluX2xvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCQlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwkJZm9yIChpID0gMDsgaSA8IGZkdC0+bWF4X2ZkczsgaSsrKSB7CisJCQlzdHJ1Y3QgZmlsZSAqZmlscDsKKworCQkJZmlscCA9IGZjaGVja19maWxlcyhjdXJyZW50LT5maWxlcywgaSk7CisJCQlpZiAoZmlscCAmJiBpc190dHkoZmlscCkpIHsKKwkJCQlkaXNhYmxlID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmY3VycmVudC0+ZmlsZXMtPmZpbGVfbG9jayk7CisJfQorCXRhc2tfdW5sb2NrKGN1cnJlbnQpOworCWlmICghZGlzYWJsZSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+c2lnbmFsLT5hdWRpdF90dHkgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKaW5kZXggYTk2ZjI2YS4uZGUzN2ViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pby5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtMTUwMyw2ICsxNTAzLDE1IEBACiAKIEVYUE9SVF9TWU1CT0wodHR5X2h1bmdfdXBfcCk7CiAKKy8qKgorICogaXNfdHR5CS0JY2hlY2tlciB3aGV0aGVyIGZpbGUgaXMgYSBUVFkKKyAqLworaW50IGlzX3R0eShzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gZmlscC0+Zl9vcC0+cmVhZCA9PSB0dHlfcmVhZAorCQl8fCBmaWxwLT5mX29wLT5yZWFkID09IGh1bmdfdXBfdHR5X3JlYWQ7Cit9CisKIHN0YXRpYyB2b2lkIHNlc3Npb25fY2xlYXJfdHR5KHN0cnVjdCBwaWQgKnNlc3Npb24pCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtMTcyNiw2ICsxNzM1LDIzIEBACiAJcmV0dXJuIGk7CiB9CiAKK3ZvaWQgdHR5X3dyaXRlX3VubG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCW11dGV4X3VubG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworfQorCitpbnQgdHR5X3dyaXRlX2xvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IG5kZWxheSkKK3sKKwlpZiAoIW11dGV4X3RyeWxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKSB7CisJCWlmIChuZGVsYXkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFNwbGl0IHdyaXRlcyB1cCBpbiBzYW5lIGJsb2Nrc2l6ZXMgdG8gYXZvaWQKICAqIGRlbmlhbC1vZi1zZXJ2aWNlIHR5cGUgYXR0YWNrcwpAQCAtMTczNywxMyArMTc2MywxMiBAQAogCWNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJc2l6ZV90IGNvdW50KQogewotCXNzaXplX3QgcmV0ID0gMCwgd3JpdHRlbiA9IDA7CisJc3NpemVfdCByZXQsIHdyaXR0ZW4gPSAwOwogCXVuc2lnbmVkIGludCBjaHVuazsKIAkKLQkvKiBGSVhNRTogT19OREVMQVkgLi4uICovCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpIHsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQl9CisJcmV0ID0gdHR5X3dyaXRlX2xvY2sodHR5LCBmaWxlLT5mX2ZsYWdzICYgT19OREVMQVkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyoKIAkgKiBXZSBjaHVuayB1cCB3cml0ZXMgaW50byBhIHRlbXBvcmFyeSBidWZmZXIuIFRoaXMKQEAgLTE3NzYsOCArMTgwMSw4IEBACiAKIAkJYnVmID0ga21hbGxvYyhjaHVuaywgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnVmKSB7Ci0JCQltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CiAJCX0KIAkJa2ZyZWUodHR5LT53cml0ZV9idWYpOwogCQl0dHktPndyaXRlX2NudCA9IGNodW5rOwpAQCAtMTgxMiw3ICsxODM3LDggQEAKIAkJaW5vZGUtPmlfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCQlyZXQgPSB3cml0dGVuOwogCX0KLQltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOworb3V0OgorCXR0eV93cml0ZV91bmxvY2sodHR5KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMDE2LDExICsyMDQyLDkgQEAKIAl9CiAKIAlpZiAoISpsdHBfbG9jKSB7Ci0JCWx0cCA9IChzdHJ1Y3Qga3Rlcm1pb3MgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSwKLQkJCQkJCSBHRlBfS0VSTkVMKTsKKwkJbHRwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbHRwKQogCQkJZ290byBmcmVlX21lbV9vdXQ7Ci0JCW1lbXNldChsdHAsIDAsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKIAl9CiAKIAlpZiAoZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkpIHsKQEAgLTIwNDksMTEgKzIwNzMsOSBAQAogCQl9CiAKIAkJaWYgKCEqb19sdHBfbG9jKSB7Ci0JCQlvX2x0cCA9IChzdHJ1Y3Qga3Rlcm1pb3MgKikKLQkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpLCBHRlBfS0VSTkVMKTsKKwkJCW9fbHRwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW9fbHRwKQogCQkJCWdvdG8gZnJlZV9tZW1fb3V0OwotCQkJbWVtc2V0KG9fbHRwLCAwLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CiAJCX0KIAogCQkvKgpAQCAtMjY2MCw2ICsyNjgyLDcgQEAKIAkJX19wcm9jX3NldF90dHkoY3VycmVudCwgdHR5KTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKKwl0dHlfYXVkaXRfb3BlbmluZygpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzIyLDggKzI3NDUsMTAgQEAKIAogCWNoZWNrX3R0eV9jb3VudCh0dHksICJ0dHlfb3BlbiIpOwogCXJldHZhbCA9IHB0bV9kcml2ZXItPm9wZW4odHR5LCBmaWxwKTsKLQlpZiAoIXJldHZhbCkKKwlpZiAoIXJldHZhbCkgeworCQl0dHlfYXVkaXRfb3BlbmluZygpOwogCQlyZXR1cm4gMDsKKwl9CiBvdXQxOgogCXJlbGVhc2VfZGV2KGZpbHApOwogCXJldHVybiByZXR2YWw7CkBAIC0zMTYzLDE0ICszMTg4LDEzIEBACiAKIHN0YXRpYyBpbnQgc2VuZF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgZHVyYXRpb24pCiB7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpCisJaWYgKHR0eV93cml0ZV9sb2NrKHR0eSwgMCkgPCAwKQogCQlyZXR1cm4gLUVJTlRSOwogCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAtMSk7Ci0JaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGR1cmF0aW9uKTsKLQl9CiAJdHR5LT5kcml2ZXItPmJyZWFrX2N0bCh0dHksIDApOwotCW11dGV4X3VubG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7CisJdHR5X3dyaXRlX3VubG9jayh0dHkpOwogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0dXJuIC1FSU5UUjsKIAlyZXR1cm4gMDsKQEAgLTM3MzksOSArMzc2Myw4IEBACiB7CiAJc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcjsKIAotCWRyaXZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJZHJpdmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZHJpdmVyKSB7Ci0JCW1lbXNldChkcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOwogCQlkcml2ZXItPm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKIAkJZHJpdmVyLT5udW0gPSBsaW5lczsKIAkJLyogbGF0ZXIgd2UnbGwgbW92ZSBhbGxvY2F0aW9uIG9mIHRhYmxlcyBoZXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKaW5kZXggZmQ0NzFjYi4uMzQyM2U5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKQEAgLTUyLDggKzUyLDYgQEAKIAogdm9pZCB0dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBsb25nIHRpbWVvdXQpCiB7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0KICNpZmRlZiBUVFlfREVCVUdfV0FJVF9VTlRJTF9TRU5UCiAJY2hhciBidWZbNjRdOwogCQpAQCAtNjEsMjYgKzU5LDEzIEBACiAjZW5kaWYKIAlpZiAoIXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIpCiAJCXJldHVybjsKLQlhZGRfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CiAJaWYgKCF0aW1lb3V0KQogCQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7Ci0JZG8gewotI2lmZGVmIFRUWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKLQkJcHJpbnRrKEtFUk5fREVCVUcgIndhaXRpbmcgJXMuLi4oJWQpXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCi0JCSAgICAgICB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpOwotI2VuZGlmCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWdvdG8gc3RvcF93YWl0aW5nOwotCQlpZiAoIXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSkKLQkJCWJyZWFrOwotCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQl9IHdoaWxlICh0aW1lb3V0KTsKKwlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodHR5LT53cml0ZV93YWl0LAorCQkJIXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSwgdGltZW91dCkpCisJCXJldHVybjsKIAlpZiAodHR5LT5kcml2ZXItPndhaXRfdW50aWxfc2VudCkKIAkJdHR5LT5kcml2ZXItPndhaXRfdW50aWxfc2VudCh0dHksIHRpbWVvdXQpOwotc3RvcF93YWl0aW5nOgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwogfQogCiBFWFBPUlRfU1lNQk9MKHR0eV93YWl0X3VudGlsX3NlbnQpOwpAQCAtMjc2LDEzICsyNjEsMTIgQEAKIAkJCQl0ZXJtaW9zLT5jX2NmbGFnIHw9IChiYXVkX2JpdHNbaV0gPDwgSUJTSElGVCk7CiAJCQlpZm91bmQgPSBpOwogCQl9Ci0JfQotCXdoaWxlKCsraSA8IG5fYmF1ZF90YWJsZSk7CisJfSB3aGlsZSAoKytpIDwgbl9iYXVkX3RhYmxlKTsKIAlpZiAob2ZvdW5kID09IC0xKQogCQl0ZXJtaW9zLT5jX2NmbGFnIHw9IEJPVEhFUjsKIAkvKiBTZXQgZXhhY3QgaW5wdXQgYml0cyBvbmx5IGlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRpZmZlciBvciB0aGUKIAkgICB1c2VyIGFscmVhZHkgZGlkICovCi0JaWYgKGlmb3VuZCA9PSAtMSAmJiAoaWJhdWQgIT0gb2JhdWQgIHx8IGliaW5wdXQpKQorCWlmIChpZm91bmQgPT0gLTEgJiYgKGliYXVkICE9IG9iYXVkIHx8IGliaW5wdXQpKQogCQl0ZXJtaW9zLT5jX2NmbGFnIHw9IChCT1RIRVIgPDwgSUJTSElGVCk7CiB9CiAKQEAgLTU3NSw3ICs1NTksNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJnR0eS0+dGVybWlvc19tdXRleCk7Ci0JdGVybWlvcyA9ICAqdHR5LT50ZXJtaW9zOworCXRlcm1pb3MgPSAqdHR5LT50ZXJtaW9zOwogCXRlcm1pb3MuY19jY1tWRVJBU0VdID0gdG1wLnNnX2VyYXNlOwogCXRlcm1pb3MuY19jY1tWS0lMTF0gPSB0bXAuc2dfa2lsbDsKIAlzZXRfc2dmbGFncygmdGVybWlvcywgdG1wLnNnX2ZsYWdzKTsKQEAgLTY2Nyw3ICs2NTEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkKKwlpZiAodHR5X3dyaXRlX2xvY2sodHR5LCAwKSA8IDApCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAod2FzX3N0b3BwZWQpCkBAIC02NzUsNyArNjU5LDcgQEAKIAl0dHktPmRyaXZlci0+d3JpdGUodHR5LCAmY2gsIDEpOwogCWlmICh3YXNfc3RvcHBlZCkKIAkJc3RvcF90dHkodHR5KTsKLQltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOworCXR0eV93cml0ZV91bmxvY2sodHR5KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYyBiL2RyaXZlcnMvY2hhci92aW90YXBlLmMKaW5kZXggMTNmYWY4ZC4uZGI1NzI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYworKysgYi9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCkBAIC04NzMsMTIgKzg3MywxMiBAQAogfQogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpb3RhcF9mb3BzID0gewotCW93bmVyOiBUSElTX01PRFVMRSwKLQlyZWFkOiB2aW90YXBfcmVhZCwKLQl3cml0ZTogdmlvdGFwX3dyaXRlLAotCWlvY3RsOiB2aW90YXBfaW9jdGwsCi0Jb3BlbjogdmlvdGFwX29wZW4sCi0JcmVsZWFzZTogdmlvdGFwX3JlbGVhc2UsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlYWQgPQkJdmlvdGFwX3JlYWQsCisJLndyaXRlID0JdmlvdGFwX3dyaXRlLAorCS5pb2N0bCA9CXZpb3RhcF9pb2N0bCwKKwkub3BlbiA9CQl2aW90YXBfb3BlbiwKKwkucmVsZWFzZSA9CXZpb3RhcF9yZWxlYXNlLAogfTsKIAogLyogSGFuZGxlIGludGVycnVwdCBldmVudHMgZm9yIHRhcGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dC5jIGIvZHJpdmVycy9jaGFyL3Z0LmMKaW5kZXggNjY1MGFlMS4uZWRiNzAwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0LmMKQEAgLTcyOSwxMCArNzI5LDkgQEAKIAkgICAgLyogYWx0aG91Z2ggdGhlIG51bWJlcnMgYWJvdmUgYXJlIG5vdCB2YWxpZCBzaW5jZSBsb25nIGFnbywgdGhlCiAJICAgICAgIHBvaW50IGlzIHN0aWxsIHVwLXRvLWRhdGUgYW5kIHRoZSBjb21tZW50IHN0aWxsIGhhcyBpdHMgdmFsdWUKIAkgICAgICAgZXZlbiBpZiBvbmx5IGFzIGEgaGlzdG9yaWNhbCBhcnRpZmFjdC4gIC0tbWosIEp1bHkgMTk5OCAqLwotCSAgICB2YyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJICAgIHZjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZjX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAkgICAgaWYgKCF2YykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JICAgIG1lbXNldCh2YywgMCwgc2l6ZW9mKCp2YykpOwogCSAgICB2Y19jb25zW2N1cnJjb25zXS5kID0gdmM7CiAJICAgIElOSVRfV09SSygmdmNfY29uc1tjdXJyY29uc10uU0FLX3dvcmssIHZjX1NBSyk7CiAJICAgIHZpc3VhbF9pbml0KHZjLCBjdXJyY29ucywgMSk7CkBAIC0xOTkxLDggKzE5OTAsNyBAQAogCQl7IDB4RkUxMCwgMHhGRTE5IH0sIHsgMHhGRTMwLCAweEZFNkYgfSwgeyAweEZGMDAsIDB4RkY2MCB9LAogCQl7IDB4RkZFMCwgMHhGRkU2IH0sIHsgMHgyMDAwMCwgMHgyRkZGRCB9LCB7IDB4MzAwMDAsIDB4M0ZGRkQgfQogCX07Ci0JcmV0dXJuIGJpc2VhcmNoKHVjcywgZG91YmxlX3dpZHRoLAotCQlzaXplb2YoZG91YmxlX3dpZHRoKSAvIHNpemVvZigqZG91YmxlX3dpZHRoKSAtIDEpOworCXJldHVybiBiaXNlYXJjaCh1Y3MsIGRvdWJsZV93aWR0aCwgQVJSQVlfU0laRShkb3VibGVfd2lkdGgpIC0gMSk7CiB9CiAKIC8qIGFjcXVpcmVzIGNvbnNvbGVfc2VtICovCkBAIC0yOTg5LDggKzI5ODcsMjQgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHVuYmluZF9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0LAotCQkJICAgICBpbnQgZGVmbHQpCisvKioKKyAqIHVuYmluZF9jb25fZHJpdmVyIC0gdW5iaW5kIGEgY29uc29sZSBkcml2ZXIKKyAqIEBjc3c6IHBvaW50ZXIgdG8gY29uc29sZSBkcml2ZXIgdG8gdW5yZWdpc3RlcgorICogQGZpcnN0OiBmaXJzdCBpbiByYW5nZSBvZiBjb25zb2xlcyB0aGF0IEBjc3cgc2hvdWxkIGJlIHVuYm91bmQgZnJvbQorICogQGxhc3Q6IGxhc3QgaW4gcmFuZ2Ugb2YgY29uc29sZXMgdGhhdCBAY3N3IHNob3VsZCBiZSB1bmJvdW5kIGZyb20KKyAqIEBkZWZsdDogc2hvdWxkIG5leHQgYm91bmQgY29uc29sZSBkcml2ZXIgYmUgZGVmYXVsdCBhZnRlciBAY3N3IGlzIHVuYm91bmQ/CisgKgorICogVG8gdW5iaW5kIGEgZHJpdmVyIGZyb20gYWxsIHBvc3NpYmxlIGNvbnNvbGVzLCBwYXNzIDAgYXMgQGZpcnN0IGFuZAorICogJU1BWF9OUl9DT05TT0xFUyBhcyBAbGFzdC4KKyAqCisgKiBAZGVmbHQgY29udHJvbHMgd2hldGhlciB0aGUgY29uc29sZSB0aGF0IGVuZHMgdXAgcmVwbGFjaW5nIEBjc3cgc2hvdWxkIGJlCisgKiB0aGUgZGVmYXVsdCBjb25zb2xlLgorICoKKyAqIFJFVFVSTlM6CisgKiAtRU5PREVWIGlmIEBjc3cgaXNuJ3QgYSByZWdpc3RlcmVkIGNvbnNvbGUgZHJpdmVyIG9yIGNhbid0IGJlIHVucmVnaXN0ZXJlZAorICogb3IgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdW5iaW5kX2Nvbl9kcml2ZXIoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3csIGludCBmaXJzdCwgaW50IGxhc3QsIGludCBkZWZsdCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IGNzdy0+b3duZXI7CiAJY29uc3Qgc3RydWN0IGNvbnN3ICpkZWZjc3cgPSBOVUxMOwpAQCAtMzA3NSw2ICszMDg5LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogCiB9CitFWFBPUlRfU1lNQk9MKHVuYmluZF9jb25fZHJpdmVyKTsKIAogc3RhdGljIGludCB2dF9iaW5kKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCiB7CkBAIC0zNDkxLDkgKzM1MDYsNiBAQAogCQl9CiAJCXJldHVybjsKIAl9Ci0JaWYgKGJsYW5rX3N0YXRlICE9IGJsYW5rX25vcm1hbF93YWl0KQotCQlyZXR1cm47Ci0JYmxhbmtfc3RhdGUgPSBibGFua19vZmY7CiAKIAkvKiBlbnRlcmluZyBncmFwaGljcyBtb2RlPyAqLwogCWlmIChlbnRlcmluZ19nZngpIHsKQEAgLTM1MDEsMTAgKzM1MTMsMTUgQEAKIAkJc2F2ZV9zY3JlZW4odmMpOwogCQl2Yy0+dmNfc3ctPmNvbl9ibGFuayh2YywgLTEsIDEpOwogCQljb25zb2xlX2JsYW5rZWQgPSBmZ19jb25zb2xlICsgMTsKKwkJYmxhbmtfc3RhdGUgPSBibGFua19vZmY7CiAJCXNldF9vcmlnaW4odmMpOwogCQlyZXR1cm47CiAJfQogCisJaWYgKGJsYW5rX3N0YXRlICE9IGJsYW5rX25vcm1hbF93YWl0KQorCQlyZXR1cm47CisJYmxhbmtfc3RhdGUgPSBibGFua19vZmY7CisKIAkvKiBkb24ndCBibGFuayBncmFwaGljcyAqLwogCWlmICh2Yy0+dmNfbW9kZSAhPSBLRF9URVhUKSB7CiAJCWNvbnNvbGVfYmxhbmtlZCA9IGZnX2NvbnNvbGUgKyAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvS2NvbmZpZyBiL2RyaXZlcnMvY29ubmVjdG9yL0tjb25maWcKaW5kZXggZTBiZGMwZC4uMTAwYmZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvS2NvbmZpZworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9LY29uZmlnCkBAIC0xLDYgKzEsNSBAQAotbWVudSAiQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlciIKIAotY29uZmlnIENPTk5FQ1RPUgorbWVudWNvbmZpZyBDT05ORUNUT1IKIAl0cmlzdGF0ZSAiQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlciIKIAlkZXBlbmRzIG9uIE5FVAogCS0tLWhlbHAtLS0KQEAgLTEwLDYgKzksOCBAQAogCSAgQ29ubmVjdG9yIHN1cHBvcnQgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgY24ua28uCiAKK2lmIENPTk5FQ1RPUgorCiBjb25maWcgUFJPQ19FVkVOVFMKIAlib29sZWFuICJSZXBvcnQgcHJvY2VzcyBldmVudHMgdG8gdXNlcnNwYWNlIgogCWRlcGVuZHMgb24gQ09OTkVDVE9SPXkKQEAgLTE4LDQgKzE5LDQgQEAKIAkgIFByb3ZpZGUgYSBjb25uZWN0b3IgdGhhdCByZXBvcnRzIHByb2Nlc3MgZXZlbnRzIHRvIHVzZXJzcGFjZS4gU2VuZAogCSAgZXZlbnRzIHN1Y2ggYXMgZm9yaywgZXhlYywgaWQgY2hhbmdlICh1aWQsIGdpZCwgc3VpZCwgZXRjKSwgYW5kIGV4aXQuCiAKLWVuZG1lbnUKK2VuZGlmICMgQ09OTkVDVE9SCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9LY29uZmlnIGIvZHJpdmVycy9jcnlwdG8vS2NvbmZpZwppbmRleCBiYjkwY2JkLi44NGViZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKQEAgLTEsNCArMSw5IEBACi1tZW51ICJIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcyIKKworbWVudWNvbmZpZyBDUllQVE9fSFcKKwlib29sICJIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcyIKKwlkZWZhdWx0IHkKKworaWYgQ1JZUFRPX0hXCiAKIGNvbmZpZyBDUllQVE9fREVWX1BBRExPQ0sKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgVklBIFBhZExvY2sgQUNFIgpAQCAtNzgsNCArODMsNCBAQAogCSAgdGhhdCBjb250YWlucyBhbGwgcGFydHMgb2YgdGhlIGNyeXB0byBkZXZpY2UgZHJpdmVyIChhcCBidXMsCiAJICByZXF1ZXN0IHJvdXRlciBhbmQgYWxsIHRoZSBjYXJkIGRyaXZlcnMpLgogCi1lbmRtZW51CitlbmRpZiAjIENSWVBUT19IVwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggYjMxNzU2ZC4uOGY2NzBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIwogCiBtZW51ICJETUEgRW5naW5lIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhUzM5MAorCWRlcGVuZHMgb24gSEFTX0RNQQogCiBjb25maWcgRE1BX0VOR0lORQogCWJvb2wgIlN1cHBvcnQgZm9yIERNQSBlbmdpbmVzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwppbmRleCA4MDdjNDAyLi5kZWJmMWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwpAQCAtNiwxMSArNiw5IEBACiAjICRJZDogS2NvbmZpZyx2IDEuNC4yLjcgMjAwNS8wNy8wOCAyMjowNTozOCBkc3BfbGxubCBFeHAgJAogIwogCi1tZW51ICdFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCknCittZW51Y29uZmlnIEVEQUMKKwl0cmlzdGF0ZSAiRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBFREFDCi0JdHJpc3RhdGUgIkVEQUMgY29yZSBzeXN0ZW0gZXJyb3IgcmVwb3J0aW5nIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gWDg2ICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIEVEQUMgaXMgZGVzaWduZWQgdG8gcmVwb3J0IGVycm9ycyBpbiB0aGUgY29yZSBzeXN0ZW0uCkBAIC0zMCwxMyArMjgsMTIgQEAKIAkgIFRoZXJlIGlzIGFsc28gYSBtYWlsaW5nIGxpc3QgZm9yIHRoZSBFREFDIHByb2plY3QsIHdoaWNoIGNhbgogCSAgYmUgZm91bmQgdmlhIHRoZSBzb3VyY2Vmb3JnZSBwYWdlLgogCitpZiBFREFDCiAKIGNvbW1lbnQgIlJlcG9ydGluZyBzdWJzeXN0ZW1zIgotCWRlcGVuZHMgb24gRURBQwogCiBjb25maWcgRURBQ19ERUJVRwogCWJvb2wgIkRlYnVnZ2luZyIKLQlkZXBlbmRzIG9uIEVEQUMKIAloZWxwCiAJICBUaGlzIHR1cm5zIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGlyZSBFREFDCiAJICBzdWItc3lzdGVtLiBZb3UgY2FuIGluc2VydCBtb2R1bGUgd2l0aCAiZGVidWdfbGV2ZWw9eCIsIGN1cnJlbnQKQEAgLTQ1LDcgKzQyLDYgQEAKIAogY29uZmlnIEVEQUNfTU1fRURBQwogCXRyaXN0YXRlICJNYWluIE1lbW9yeSBFREFDIChFcnJvciBEZXRlY3Rpb24gQW5kIENvcnJlY3Rpb24pIHJlcG9ydGluZyIKLQlkZXBlbmRzIG9uIEVEQUMKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBTb21lIHN5c3RlbXMgYXJlIGFibGUgdG8gZGV0ZWN0IGFuZCBjb3JyZWN0IGVycm9ycyBpbiBtYWluCkBAIC0xMDAsMTUgKzk2LDEzIEBACiAKIGNob2ljZQogCXByb21wdCAiRXJyb3IgZGV0ZWN0aW5nIG1ldGhvZCIKLQlkZXBlbmRzIG9uIEVEQUMKIAlkZWZhdWx0IEVEQUNfUE9MTAogCiBjb25maWcgRURBQ19QT0xMCiAJYm9vbCAiUG9sbCBmb3IgZXJyb3JzIgotCWRlcGVuZHMgb24gRURBQwogCWhlbHAKIAkgIFBvbGwgdGhlIGNoaXBzZXQgcGVyaW9kaWNhbGx5IHRvIGRldGVjdCBlcnJvcnMuCiAKIGVuZGNob2ljZQogCi1lbmRtZW51CitlbmRpZiAjIEVEQUMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCmluZGV4IDdiNjIyMzAuLjgwNDg3NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwpAQCAtMTkwNiw2ICsxOTA2LDcgQEAKIAogc3RhdGljIGludCBlZGFjX2tlcm5lbF90aHJlYWQodm9pZCAqYXJnKQogeworCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlkb19lZGFjX2NoZWNrKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jCmluZGV4IDE1MjMyMjcuLjBmYjczMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZGQuYwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJc3RydWN0IGVkZF9pbmZvICppbmZvID0gZWRkX2Rldl9nZXRfaW5mbyhlZGV2KTsKIAogCWlmIChlZGRfZGV2X2lzX3R5cGUoZWRldiwgIlBDSSIpKSB7Ci0JCXJldHVybiBwY2lfZmluZF9zbG90KGluZm8tPnBhcmFtcy5pbnRlcmZhY2VfcGF0aC5wY2kuYnVzLAorCQlyZXR1cm4gcGNpX2dldF9idXNfYW5kX3Nsb3QoaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5idXMsCiAJCQkJICAgICBQQ0lfREVWRk4oaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5zbG90LAogCQkJCQkgICAgICAgaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS4KIAkJCQkJICAgICAgIGZ1bmN0aW9uKSk7CkBAIC02ODIsOSArNjgyLDEyIEBACiB7CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IGVkZF9nZXRfcGNpX2RldihlZGV2KTsKKwlpbnQgcmV0OwogCWlmICghcGNpX2RldikKIAkJcmV0dXJuIDE7Ci0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rKCZlZGV2LT5rb2JqLCZwY2lfZGV2LT5kZXYua29iaiwicGNpX2RldiIpOworCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZlZGV2LT5rb2JqLCZwY2lfZGV2LT5kZXYua29iaiwicGNpX2RldiIpOworCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMgYi9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYwppbmRleCAyYjRiNzZlLi41OGU5ZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGFzbS92Z2EuaD4KICNpbmNsdWRlICJwY2RwLmgiCiAKQEAgLTI3LDcgKzI4LDcgQEAKIAljaGFyIHBhcml0eTsKIAogCW1taW8gPSAodWFydC0+YWRkci5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKTsKLQlwICs9IHNwcmludGYocCwgImNvbnNvbGU9dWFydCwlcywweCVseCIsCisJcCArPSBzcHJpbnRmKHAsICJ1YXJ0ODI1MCwlcywweCVseCIsCiAJCW1taW8gPyAibW1pbyIgOiAiaW8iLCB1YXJ0LT5hZGRyLmFkZHJlc3MpOwogCWlmICh1YXJ0LT5iYXVkKSB7CiAJCXAgKz0gc3ByaW50ZihwLCAiLCVsdSIsIHVhcnQtPmJhdWQpOwpAQCAtNDEsNyArNDIsOCBAQAogCQl9CiAJfQogCi0JcmV0dXJuIGVhcmx5X3NlcmlhbF9jb25zb2xlX2luaXQob3B0aW9ucyk7CisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ1YXJ0IiwgODI1MCwgJm9wdGlvbnNbOV0pOworCXJldHVybiBzZXR1cF9lYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUob3B0aW9ucyk7CiAjZWxzZQogCXJldHVybiAtRU5PREVWOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzAuYyBiL2RyaXZlcnMvaHdtb24vbG03MC5jCmluZGV4IDdlYWFlMzguLjI3NWQzOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03MC5jCkBAIC05Niw2ICs5NiwxMCBAQAogCXN0cnVjdCBsbTcwICpwX2xtNzA7CiAJaW50IHN0YXR1czsKIAorCS8qIHNpZ25hbGluZyBpcyBTUElfTU9ERV8wIG9uIGEgMy13aXJlIGxpbmsgKHNoYXJlZCBTSS9TTykgKi8KKwlpZiAoKHNwaS0+bW9kZSAmIChTUElfQ1BPTHxTUElfQ1BIQSkpIHx8ICEoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlwX2xtNzAgPSBremFsbG9jKHNpemVvZiAqcF9sbTcwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBfbG03MCkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYwppbmRleCAwMzE4OGQyLi4xN2NlY2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKQEAgLTYzMCw3ICs2MzAsNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG1jbXNwdHdpX2RyaXZlciA9IHsKIAkucHJvYmUgID0gcG1jbXNwdHdpX3Byb2JlLAogCS5yZW1vdmUJPSBfX2RldmV4aXRfcChwbWNtc3B0d2lfcmVtb3ZlKSwKLQkuZHJpdmVyIHsKKwkuZHJpdmVyID0gewogCQkubmFtZQk9IERSVl9OQU1FLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKaW5kZXggMzk0NGU4OC4uMmUxYzI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCkBAIC0xNTMsNCArMTUzLDE0IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB0c2wyNTUwLgogCitjb25maWcgTUVORUxBVVMKKwlib29sICJUV0w5MjMzMC9NZW5lbGF1cyBQTSBjaGlwIgorCWRlcGVuZHMgb24gSTJDPXkgJiYgQVJDSF9PTUFQMjRYWAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMKKwkgIFRXTDkyMzMwL01lbmVsYXVzIFBvd2VyIE1hbmFnZW1lbnQgY2hpcC4gVGhpcyBpbmNsdWRlIHZvbHRhZ2UKKwkgIHJlZ3VsYXRvcnMsIER1YWwgc2xvdCBtZW1vcnkgY2FyZCB0cmFuY2VpdmVycywgcmVhbC10aW1lIGNsb2NrCisJICBhbmQgb3RoZXIgZmVhdHVyZXMgdGhhdCBhcmUgb2Z0ZW4gdXNlZCBpbiBwb3J0YWJsZSBkZXZpY2VzIGxpa2UKKwkgIGNlbGwgcGhvbmVzIGFuZCBQREFzLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCmluZGV4IGQ4Y2JlYjMuLmNhOTI0ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTkxKQkrPSBwY2Y4NTkxLm8KIG9iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCiBvYmotJChDT05GSUdfVFBTNjUwMTApCQkrPSB0cHM2NTAxMC5vCitvYmotJChDT05GSUdfTUVORUxBVVMpCQkrPSBtZW5lbGF1cy5vCiBvYmotJChDT05GSUdfU0VOU09SU19UU0wyNTUwKQkrPSB0c2wyNTUwLm8KIAogaWZlcSAoJChDT05GSUdfSTJDX0RFQlVHX0NISVApLHkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9tZW5lbGF1cy5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbWVuZWxhdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE3ZTJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbWVuZWxhdXMuYwpAQCAtMCwwICsxLDEyODEgQEAKKyNkZWZpbmUgREVCVUcKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBTb21lIHBhcnRzIGJhc2VkIHRwczY1MDEwLmM6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMgYW5kCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFNvbWUgcGFydHMgYmFzZWQgb24gdGx2MzIwYWljMjQuYzoKKyAqIENvcHlyaWdodCAoQykgYnkgS2FpIFN2YWhuIDxrYWkuc3ZhaG5Abm9raWEuY29tPgorICoKKyAqIENoYW5nZXMgZm9yIGludGVycnVwdCBoYW5kbGluZyBhbmQgY2xlYW4tdXAgYnkKKyAqIFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+IGFuZCBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKiBDbGVhbnVwIGFuZCBnZW5lcmFsaXplZCBzdXBwb3J0IGZvciB2b2x0YWdlIHNldHRpbmcgYnkKKyAqIEp1aGEgWXJqb2xhCisgKiBBZGRlZCBzdXBwb3J0IGZvciBjb250cm9sbGluZyBWQ09SRSBhbmQgcmVndWxhdG9yIHNsZWVwIHN0YXRlcywKKyAqIEFtaXQgS3VjaGVyaWEgPGFtaXQua3VjaGVyaWFAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVuZWxhdXMuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRQkJCSJtZW5lbGF1cyIKKworI2RlZmluZSBwcl9lcnIoZm10LCBhcmcuLi4pCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiAiLCAjIyBhcmcpOworCisjZGVmaW5lIE1FTkVMQVVTX0kyQ19BRERSRVNTCQkweDcyCisKKyNkZWZpbmUgTUVORUxBVVNfUkVWCQkJMHgwMQorI2RlZmluZSBNRU5FTEFVU19WQ09SRV9DVFJMMQkJMHgwMgorI2RlZmluZSBNRU5FTEFVU19WQ09SRV9DVFJMMgkJMHgwMworI2RlZmluZSBNRU5FTEFVU19WQ09SRV9DVFJMMwkJMHgwNAorI2RlZmluZSBNRU5FTEFVU19WQ09SRV9DVFJMNAkJMHgwNQorI2RlZmluZSBNRU5FTEFVU19WQ09SRV9DVFJMNQkJMHgwNgorI2RlZmluZSBNRU5FTEFVU19EQ0RDX0NUUkwxCQkweDA3CisjZGVmaW5lIE1FTkVMQVVTX0RDRENfQ1RSTDIJCTB4MDgKKyNkZWZpbmUgTUVORUxBVVNfRENEQ19DVFJMMwkJMHgwOQorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDEJCTB4MEEKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkwyCQkweDBCCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMMwkJMHgwQworI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDQJCTB4MEQKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkw1CQkweDBFCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMNgkJMHgwRgorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDcJCTB4MTAKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkw4CQkweDExCisjZGVmaW5lIE1FTkVMQVVTX1NMRUVQX0NUUkwxCQkweDEyCisjZGVmaW5lIE1FTkVMQVVTX1NMRUVQX0NUUkwyCQkweDEzCisjZGVmaW5lIE1FTkVMQVVTX0RFVklDRV9PRkYJCTB4MTQKKyNkZWZpbmUgTUVORUxBVVNfT1NDX0NUUkwJCTB4MTUKKyNkZWZpbmUgTUVORUxBVVNfREVURUNUX0NUUkwJCTB4MTYKKyNkZWZpbmUgTUVORUxBVVNfSU5UX01BU0sxCQkweDE3CisjZGVmaW5lIE1FTkVMQVVTX0lOVF9NQVNLMgkJMHgxOAorI2RlZmluZSBNRU5FTEFVU19JTlRfU1RBVFVTMQkJMHgxOQorI2RlZmluZSBNRU5FTEFVU19JTlRfU1RBVFVTMgkJMHgxQQorI2RlZmluZSBNRU5FTEFVU19JTlRfQUNLMQkJMHgxQgorI2RlZmluZSBNRU5FTEFVU19JTlRfQUNLMgkJMHgxQworI2RlZmluZSBNRU5FTEFVU19HUElPX0NUUkwJCTB4MUQKKyNkZWZpbmUgTUVORUxBVVNfR1BJT19JTgkJMHgxRQorI2RlZmluZSBNRU5FTEFVU19HUElPX09VVAkJMHgxRgorI2RlZmluZSBNRU5FTEFVU19CQlNNUwkJCTB4MjAKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0NUUkwJCTB4MjEKKyNkZWZpbmUgTUVORUxBVVNfUlRDX1VQREFURQkJMHgyMgorI2RlZmluZSBNRU5FTEFVU19SVENfU0VDCQkweDIzCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19NSU4JCTB4MjQKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0hSCQkJMHgyNQorI2RlZmluZSBNRU5FTEFVU19SVENfREFZCQkweDI2CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19NT04JCTB4MjcKKyNkZWZpbmUgTUVORUxBVVNfUlRDX1lSCQkJMHgyOAorI2RlZmluZSBNRU5FTEFVU19SVENfV0tEQVkJCTB4MjkKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX1NFQwkJMHgyQQorI2RlZmluZSBNRU5FTEFVU19SVENfQUxfTUlOCQkweDJCCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9IUgkJMHgyQworI2RlZmluZSBNRU5FTEFVU19SVENfQUxfREFZCQkweDJECisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9NT04JCTB4MkUKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX1lSCQkweDJGCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19DT01QX01TQgkJMHgzMAorI2RlZmluZSBNRU5FTEFVU19SVENfQ09NUF9MU0IJCTB4MzEKKyNkZWZpbmUgTUVORUxBVVNfUzFfUFVMTF9FTgkJMHgzMgorI2RlZmluZSBNRU5FTEFVU19TMV9QVUxMX0RJUgkJMHgzMworI2RlZmluZSBNRU5FTEFVU19TMl9QVUxMX0VOCQkweDM0CisjZGVmaW5lIE1FTkVMQVVTX1MyX1BVTExfRElSCQkweDM1CisjZGVmaW5lIE1FTkVMQVVTX01DVF9DVFJMMQkJMHgzNgorI2RlZmluZSBNRU5FTEFVU19NQ1RfQ1RSTDIJCTB4MzcKKyNkZWZpbmUgTUVORUxBVVNfTUNUX0NUUkwzCQkweDM4CisjZGVmaW5lIE1FTkVMQVVTX01DVF9QSU5fU1QJCTB4MzkKKyNkZWZpbmUgTUVORUxBVVNfREVCT1VOQ0UxCQkweDNBCisKKyNkZWZpbmUgSUhfTUVORUxBVVNfSVJRUwkJMTIKKyNkZWZpbmUgTUVORUxBVVNfTU1DX1MxQ0RfSVJRCQkwCS8qIE1NQyBzbG90IDEgY2FyZCBjaGFuZ2UgKi8KKyNkZWZpbmUgTUVORUxBVVNfTU1DX1MyQ0RfSVJRCQkxCS8qIE1NQyBzbG90IDIgY2FyZCBjaGFuZ2UgKi8KKyNkZWZpbmUgTUVORUxBVVNfTU1DX1MxRDFfSVJRCQkyCS8qIE1NQyBEQVQxIGxvdyBpbiBzbG90IDEgKi8KKyNkZWZpbmUgTUVORUxBVVNfTU1DX1MyRDFfSVJRCQkzCS8qIE1NQyBEQVQxIGxvdyBpbiBzbG90IDIgKi8KKyNkZWZpbmUgTUVORUxBVVNfTE9XQkFUX0lSUQkJNAkvKiBMb3cgYmF0dGVyeSAqLworI2RlZmluZSBNRU5FTEFVU19IT1RESUVfSVJRCQk1CS8qIEhvdCBkaWUgZGV0ZWN0ICovCisjZGVmaW5lIE1FTkVMQVVTX1VWTE9fSVJRCQk2CS8qIFVWTE8gZGV0ZWN0ICovCisjZGVmaW5lIE1FTkVMQVVTX1RTSFVUX0lSUQkJNwkvKiBUaGVybWFsIHNodXRkb3duICovCisjZGVmaW5lIE1FTkVMQVVTX1JUQ1RNUl9JUlEJCTgJLyogUlRDIHRpbWVyICovCisjZGVmaW5lIE1FTkVMQVVTX1JUQ0FMTV9JUlEJCTkJLyogUlRDIGFsYXJtICovCisjZGVmaW5lIE1FTkVMQVVTX1JUQ0VSUl9JUlEJCTEwCS8qIFJUQyBlcnJvciAqLworI2RlZmluZSBNRU5FTEFVU19QU0hCVE5fSVJRCQkxMQkvKiBQdXNoIGJ1dHRvbiAqLworI2RlZmluZSBNRU5FTEFVU19SRVNFUlZFRDEyX0lSUQkJMTIJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUVORUxBVVNfUkVTRVJWRUQxM19JUlEJCTEzCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE1FTkVMQVVTX1JFU0VSVkVEMTRfSVJRCQkxNAkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNRU5FTEFVU19SRVNFUlZFRDE1X0lSUQkJMTUJLyogUmVzZXJ2ZWQgKi8KKworc3RhdGljIHZvaWQgbWVuZWxhdXNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl9tZW5lbGF1cyk7CisKK3N0cnVjdCBtZW5lbGF1c19jaGlwIHsKKwlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9UV0w5MjMzMAorCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJdTgJCQlydGNfY29udHJvbDsKKwl1bnNpZ25lZAkJdWllOjE7CisjZW5kaWYKKwl1bnNpZ25lZAkJdmNvcmVfaHdfbW9kZToxOworCXU4CQkJbWFzazEsIG1hc2syOworCXZvaWQJCQkoKmhhbmRsZXJzWzE2XSkoc3RydWN0IG1lbmVsYXVzX2NoaXAgKik7CisJdm9pZAkJCSgqbW1jX2NhbGxiYWNrKSh2b2lkICpkYXRhLCB1OCBtYXNrKTsKKwl2b2lkCQkJKm1tY19jYWxsYmFja19kYXRhOworfTsKKworc3RhdGljIHN0cnVjdCBtZW5lbGF1c19jaGlwICp0aGVfbWVuZWxhdXM7CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfd3JpdGVfcmVnKGludCByZWcsIHU4IHZhbHVlKQoreworCWludCB2YWwgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHRoZV9tZW5lbGF1cy0+Y2xpZW50LCByZWcsIHZhbHVlKTsKKworCWlmICh2YWwgPCAwKSB7CisJCXByX2Vycigid3JpdGUgZXJyb3IiKTsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19yZWFkX3JlZyhpbnQgcmVnKQoreworCWludCB2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEodGhlX21lbmVsYXVzLT5jbGllbnQsIHJlZyk7CisKKwlpZiAodmFsIDwgMCkKKwkJcHJfZXJyKCJyZWFkIGVycm9yIik7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX2VuYWJsZV9pcnEoaW50IGlycSkKK3sKKwlpZiAoaXJxID4gNykgeworCQlpcnEgLT0gODsKKwkJdGhlX21lbmVsYXVzLT5tYXNrMiAmPSB+KDEgPDwgaXJxKTsKKwkJcmV0dXJuIG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfTUFTSzIsCisJCQkJdGhlX21lbmVsYXVzLT5tYXNrMik7CisJfSBlbHNlIHsKKwkJdGhlX21lbmVsYXVzLT5tYXNrMSAmPSB+KDEgPDwgaXJxKTsKKwkJcmV0dXJuIG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfTUFTSzEsCisJCQkJdGhlX21lbmVsYXVzLT5tYXNrMSk7CisJfQorfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX2Rpc2FibGVfaXJxKGludCBpcnEpCit7CisJaWYgKGlycSA+IDcpIHsKKwkJaXJxIC09IDg7CisJCXRoZV9tZW5lbGF1cy0+bWFzazIgfD0gKDEgPDwgaXJxKTsKKwkJcmV0dXJuIG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfTUFTSzIsCisJCQkJdGhlX21lbmVsYXVzLT5tYXNrMik7CisJfSBlbHNlIHsKKwkJdGhlX21lbmVsYXVzLT5tYXNrMSB8PSAoMSA8PCBpcnEpOworCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMSwKKwkJCQl0aGVfbWVuZWxhdXMtPm1hc2sxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfYWNrX2lycShpbnQgaXJxKQoreworCWlmIChpcnEgPiA3KQorCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9BQ0syLCAxIDw8IChpcnEgLSA4KSk7CisJZWxzZQorCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9BQ0sxLCAxIDw8IGlycSk7Cit9CisKKy8qIEFkZHMgYSBoYW5kbGVyIGZvciBhbiBpbnRlcnJ1cHQuIERvZXMgbm90IHJ1biBpbiBpbnRlcnJ1cHQgY29udGV4dCAqLworc3RhdGljIGludCBtZW5lbGF1c19hZGRfaXJxX3dvcmsoaW50IGlycSwKKwkJdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBtZW5lbGF1c19jaGlwICopKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwl0aGVfbWVuZWxhdXMtPmhhbmRsZXJzW2lycV0gPSBoYW5kbGVyOworCXJldCA9IG1lbmVsYXVzX2VuYWJsZV9pcnEoaXJxKTsKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZW1vdmVzIGhhbmRsZXIgZm9yIGFuIGludGVycnVwdCAqLworc3RhdGljIGludCBtZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoaW50IGlycSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0ID0gbWVuZWxhdXNfZGlzYWJsZV9pcnEoaXJxKTsKKwl0aGVfbWVuZWxhdXMtPmhhbmRsZXJzW2lycV0gPSBOVUxMOworCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZXRzIHNjaGVkdWxlZCB3aGVuIGEgY2FyZCBkZXRlY3QgaW50ZXJydXB0IGhhcHBlbnMuIE5vdGUgdGhhdCBpbiBzb21lIGNhc2VzCisgKiB0aGlzIGxpbmUgaXMgd2lyZWQgdG8gY2FyZCBjb3ZlciBzd2l0Y2ggcmF0aGVyIHRoYW4gdGhlIGNhcmQgZGV0ZWN0IHN3aXRjaAorICogaW4gZWFjaCBzbG90LiBJbiB0aGlzIGNhc2UgdGhlIGNhcmRzIGFyZSBub3Qgc2VlbiBieSBtZW5lbGF1cy4KKyAqIEZJWE1FOiBBZGQgaGFuZGxpbmcgZm9yIEQxIHRvbworICovCitzdGF0aWMgdm9pZCBtZW5lbGF1c19tbWNfY2Rfd29yayhzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbWVuZWxhdXNfaHcpCit7CisJaW50IHJlZzsKKwl1bnNpZ25lZCBjaGFyIGNhcmRfbWFzayA9IDA7CisKKwlyZWcgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfUElOX1NUKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKCEocmVnICYgMHgxKSkKKwkJY2FyZF9tYXNrIHw9ICgxIDw8IDApOworCisJaWYgKCEocmVnICYgMHgyKSkKKwkJY2FyZF9tYXNrIHw9ICgxIDw8IDEpOworCisJaWYgKG1lbmVsYXVzX2h3LT5tbWNfY2FsbGJhY2spCisJCW1lbmVsYXVzX2h3LT5tbWNfY2FsbGJhY2sobWVuZWxhdXNfaHctPm1tY19jYWxsYmFja19kYXRhLAorCQkJCQkgIGNhcmRfbWFzayk7Cit9CisKKy8qCisgKiBUb2dnbGVzIHRoZSBNTUMgc2xvdHMgYmV0d2VlbiBvcGVuLWRyYWluIGFuZCBwdXNoLXB1bGwgbW9kZS4KKyAqLworaW50IG1lbmVsYXVzX3NldF9tbWNfb3BlbmRyYWluKGludCBzbG90LCBpbnQgZW5hYmxlKQoreworCWludCByZXQsIHZhbDsKKworCWlmIChzbG90ICE9IDEgJiYgc2xvdCAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9DVFJMMSk7CisJaWYgKHJldCA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwl2YWwgPSByZXQ7CisJaWYgKHNsb3QgPT0gMSkgeworCQlpZiAoZW5hYmxlKQorCQkJdmFsIHw9IDEgPDwgMjsKKwkJZWxzZQorCQkJdmFsICY9IH4oMSA8PCAyKTsKKwl9IGVsc2UgeworCQlpZiAoZW5hYmxlKQorCQkJdmFsIHw9IDEgPDwgMzsKKwkJZWxzZQorCQkJdmFsICY9IH4oMSA8PCAzKTsKKwl9CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX01DVF9DVFJMMSwgdmFsKTsKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfbW1jX29wZW5kcmFpbik7CisKK2ludCBtZW5lbGF1c19zZXRfc2xvdF9zZWwoaW50IGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19HUElPX0NUUkwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgfD0gMHgwMjsKKwlpZiAoZW5hYmxlKQorCQlyZXQgfD0gMSA8PCA1OworCWVsc2UKKwkJcmV0ICY9IH4oMSA8PCA1KTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfR1BJT19DVFJMLCByZXQpOworb3V0OgorCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfc2xvdF9zZWwpOworCitpbnQgbWVuZWxhdXNfc2V0X21tY19zbG90KGludCBzbG90LCBpbnQgZW5hYmxlLCBpbnQgcG93ZXIsIGludCBjZF9lbikKK3sKKwlpbnQgcmV0LCB2YWw7CisKKwlpZiAoc2xvdCAhPSAxICYmIHNsb3QgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvd2VyID49IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9DVFJMMik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXZhbCA9IHJldDsKKwlpZiAoc2xvdCA9PSAxKSB7CisJCWlmIChjZF9lbikKKwkJCXZhbCB8PSAoMSA8PCA0KSB8ICgxIDw8IDYpOworCQllbHNlCisJCQl2YWwgJj0gfigoMSA8PCA0KSB8ICgxIDw8IDYpKTsKKwl9IGVsc2UgeworCQlpZiAoY2RfZW4pCisJCQl2YWwgfD0gKDEgPDwgNSkgfCAoMSA8PCA3KTsKKwkJZWxzZQorCQkJdmFsICY9IH4oKDEgPDwgNSkgfCAoMSA8PCA3KSk7CisJfQorCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDIsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX0NUUkwzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmFsID0gcmV0OworCWlmIChzbG90ID09IDEpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCXZhbCB8PSAxIDw8IDA7CisJCWVsc2UKKwkJCXZhbCAmPSB+KDEgPDwgMCk7CisJfSBlbHNlIHsKKwkJaW50IGI7CisKKwkJaWYgKGVuYWJsZSkKKwkJCXJldCB8PSAxIDw8IDE7CisJCWVsc2UKKwkJCXJldCAmPSB+KDEgPDwgMSk7CisJCWIgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDIpOworCQliICY9IH4weDAzOworCQliIHw9IHBvd2VyOworCQlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwyLCBiKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJLyogRGlzYWJsZSBhdXRvbm9tb3VzIHNodXRkb3duICovCisJdmFsICY9IH4oMHgwMyA8PCAyKTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwzLCB2YWwpOworb3V0OgorCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfbW1jX3Nsb3QpOworCitpbnQgbWVuZWxhdXNfcmVnaXN0ZXJfbW1jX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSwgdTggY2FyZF9tYXNrKSwKKwkJCQkgICB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCisJdGhlX21lbmVsYXVzLT5tbWNfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisJdGhlX21lbmVsYXVzLT5tbWNfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlyZXQgPSBtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MxQ0RfSVJRLAorCQkJCSAgICBtZW5lbGF1c19tbWNfY2Rfd29yayk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbWVuZWxhdXNfYWRkX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMkNEX0lSUSwKKwkJCQkgICAgbWVuZWxhdXNfbW1jX2NkX3dvcmspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19NTUNfUzFEMV9JUlEsCisJCQkJICAgIG1lbmVsYXVzX21tY19jZF93b3JrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MyRDFfSVJRLAorCQkJCSAgICBtZW5lbGF1c19tbWNfY2Rfd29yayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19yZWdpc3Rlcl9tbWNfY2FsbGJhY2spOworCit2b2lkIG1lbmVsYXVzX3VucmVnaXN0ZXJfbW1jX2NhbGxiYWNrKHZvaWQpCit7CisJbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMUNEX0lSUSk7CisJbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMkNEX0lSUSk7CisJbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMUQxX0lSUSk7CisJbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMkQxX0lSUSk7CisKKwl0aGVfbWVuZWxhdXMtPm1tY19jYWxsYmFjayA9IE5VTEw7CisJdGhlX21lbmVsYXVzLT5tbWNfY2FsbGJhY2tfZGF0YSA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3VucmVnaXN0ZXJfbW1jX2NhbGxiYWNrKTsKKworc3RydWN0IG1lbmVsYXVzX3Z0ZyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCB2dGdfcmVnOworCXU4IHZ0Z19zaGlmdDsKKwl1OCB2dGdfYml0czsKKwl1OCBtb2RlX3JlZzsKK307CisKK3N0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgeworCXUxNiB2dGc7CisJdTE2IHZhbDsKK307CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyAqdnRnLCBpbnQgbVYsCisJCQkJaW50IHZ0Z192YWwsIGludCBtb2RlKQoreworCWludCB2YWwsIHJldDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHRoZV9tZW5lbGF1cy0+Y2xpZW50OworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlpZiAodnRnID09IDApCisJCWdvdG8gc2V0X3ZvbHRhZ2U7CisKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyh2dGctPnZ0Z19yZWcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YWwgPSByZXQgJiB+KCgoMSA8PCB2dGctPnZ0Z19iaXRzKSAtIDEpIDw8IHZ0Zy0+dnRnX3NoaWZ0KTsKKwl2YWwgfD0gdnRnX3ZhbCA8PCB2dGctPnZ0Z19zaGlmdDsKKworCWRldl9kYmcoJmMtPmRldiwgIlNldHRpbmcgdm9sdGFnZSAnJXMnIgorCQkJICJ0byAlZCBtViAocmVnIDB4JTAyeCwgdmFsIDB4JTAyeClcbiIsCisJCQl2dGctPm5hbWUsIG1WLCB2dGctPnZ0Z19yZWcsIHZhbCk7CisKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcodnRnLT52dGdfcmVnLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKK3NldF92b2x0YWdlOgorCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyh2dGctPm1vZGVfcmVnLCBtb2RlKTsKK291dDoKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJaWYgKHJldCA9PSAwKSB7CisJCS8qIFdhaXQgZm9yIHZvbHRhZ2UgdG8gc3RhYmlsaXplICovCisJCW1zbGVlcCgxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKGludCB2dGcsIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgKnRibCwKKwkJCQkgIGludCBuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKywgdGJsKyspCisJCWlmICh0YmwtPnZ0ZyA9PSB2dGcpCisJCQlyZXR1cm4gdGJsLT52YWw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBWY29yZSBjYW4gYmUgcHJvZ3JhbW1lZCBpbiB0d28gd2F5czoKKyAqIFNXLWNvbnRyb2xsZWQ6IFJlcXVpcmVkIHZvbHRhZ2UgaXMgcHJvZ3JhbW1lZCBpbnRvIFZDT1JFX0NUUkwxCisgKiBIVy1jb250cm9sbGVkOiBSZXF1aXJlZCByYW5nZSAocm9vZi1mbG9vcikgaXMgcHJvZ3JhbW1lZCBpbnRvIFZDT1JFX0NUUkwzCisgKiBhbmQgVkNPUkVfQ1RSTDQKKyAqCisgKiBDYWxsIGNvcnJlY3QgJ3NldCcgZnVuY3Rpb24gYWNjb3JkaW5nbHkKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2Y29yZV92YWx1ZXNbXSA9IHsKKwl7IDEwMDAsIDAgfSwKKwl7IDEwMjUsIDEgfSwKKwl7IDEwNTAsIDIgfSwKKwl7IDEwNzUsIDMgfSwKKwl7IDExMDAsIDQgfSwKKwl7IDExMjUsIDUgfSwKKwl7IDExNTAsIDYgfSwKKwl7IDExNzUsIDcgfSwKKwl7IDEyMDAsIDggfSwKKwl7IDEyMjUsIDkgfSwKKwl7IDEyNTAsIDEwIH0sCisJeyAxMjc1LCAxMSB9LAorCXsgMTMwMCwgMTIgfSwKKwl7IDEzMjUsIDEzIH0sCisJeyAxMzUwLCAxNCB9LAorCXsgMTM3NSwgMTUgfSwKKwl7IDE0MDAsIDE2IH0sCisJeyAxNDI1LCAxNyB9LAorCXsgMTQ1MCwgMTggfSwKK307CisKK2ludCBtZW5lbGF1c19zZXRfdmNvcmVfc3codW5zaWduZWQgaW50IG1WKQoreworCWludCB2YWwsIHJldDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHRoZV9tZW5lbGF1cy0+Y2xpZW50OworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdmNvcmVfdmFsdWVzLAorCQkJCSAgICAgQVJSQVlfU0laRSh2Y29yZV92YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKCZjLT5kZXYsICJTZXR0aW5nIFZDT1JFIHRvICVkIG1WICh2YWwgMHglMDJ4KVxuIiwgbVYsIHZhbCk7CisKKwkvKiBTZXQgU1cgbW9kZSBhbmQgdGhlIHZvbHRhZ2UgaW4gb25lIGdvLiAqLworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1ZDT1JFX0NUUkwxLCB2YWwpOworCWlmIChyZXQgPT0gMCkKKwkJdGhlX21lbmVsYXVzLT52Y29yZV9od19tb2RlID0gMDsKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJbXNsZWVwKDEpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG1lbmVsYXVzX3NldF92Y29yZV9odyh1bnNpZ25lZCBpbnQgcm9vZl9tViwgdW5zaWduZWQgaW50IGZsb29yX21WKQoreworCWludCBmdmFsLCBydmFsLCB2YWwsIHJldDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHRoZV9tZW5lbGF1cy0+Y2xpZW50OworCisJcnZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUocm9vZl9tViwgdmNvcmVfdmFsdWVzLAorCQkJCSAgICAgIEFSUkFZX1NJWkUodmNvcmVfdmFsdWVzKSk7CisJaWYgKHJ2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShmbG9vcl9tViwgdmNvcmVfdmFsdWVzLAorCQkJCSAgICAgIEFSUkFZX1NJWkUodmNvcmVfdmFsdWVzKSk7CisJaWYgKGZ2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoJmMtPmRldiwgIlNldHRpbmcgVkNPUkUgRkxPT1IgdG8gJWQgbVYgYW5kIFJPT0YgdG8gJWQgbVZcbiIsCisJICAgICAgIGZsb29yX21WLCByb29mX21WKTsKKworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1ZDT1JFX0NUUkwzLCBmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1ZDT1JFX0NUUkw0LCBydmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKCF0aGVfbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUpIHsKKwkJdmFsID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDEpOworCQkvKiBIVyBtb2RlLCB0dXJuIE9GRiBieXRlIGNvbXBhcmF0b3IgKi8KKwkJdmFsIHw9ICgoMSA8PCA3KSB8ICgxIDw8IDUpKTsKKwkJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1ZDT1JFX0NUUkwxLCB2YWwpOworCQl0aGVfbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAxOworCX0KKwltc2xlZXAoMSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZtZW1fdnRnID0geworCS5uYW1lID0gIlZNRU0iLAorCS52dGdfcmVnID0gTUVORUxBVVNfTERPX0NUUkwxLAorCS52dGdfc2hpZnQgPSAwLAorCS52dGdfYml0cyA9IDIsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfTERPX0NUUkwzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdm1lbV92YWx1ZXNbXSA9IHsKKwl7IDE1MDAsIDAgfSwKKwl7IDE4MDAsIDEgfSwKKwl7IDE5MDAsIDIgfSwKKwl7IDI1MDAsIDMgfSwKK307CisKK2ludCBtZW5lbGF1c19zZXRfdm1lbSh1bnNpZ25lZCBpbnQgbVYpCit7CisJaW50IHZhbDsKKworCWlmIChtViA9PSAwKQorCQlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZtZW1fdnRnLCAwLCAwLCAwKTsKKworCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZtZW1fdmFsdWVzLCBBUlJBWV9TSVpFKHZtZW1fdmFsdWVzKSk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdm1lbV92dGcsIG1WLCB2YWwsIDB4MDIpOworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfdm1lbSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZpb192dGcgPSB7CisJLm5hbWUgPSAiVklPIiwKKwkudnRnX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMMSwKKwkudnRnX3NoaWZ0ID0gMiwKKwkudnRnX2JpdHMgPSAyLAorCS5tb2RlX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMNCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHZpb192YWx1ZXNbXSA9IHsKKwl7IDE1MDAsIDAgfSwKKwl7IDE4MDAsIDEgfSwKKwl7IDI1MDAsIDIgfSwKKwl7IDI4MDAsIDMgfSwKK307CisKK2ludCBtZW5lbGF1c19zZXRfdmlvKHVuc2lnbmVkIGludCBtVikKK3sKKwlpbnQgdmFsOworCisJaWYgKG1WID09IDApCisJCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdmlvX3Z0ZywgMCwgMCwgMCk7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2aW9fdmFsdWVzLCBBUlJBWV9TSVpFKHZpb192YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2aW9fdnRnLCBtViwgdmFsLCAweDAyKTsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X3Zpbyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHZkY2RjX3ZhbHVlc1tdID0geworCXsgMTUwMCwgMCB9LAorCXsgMTgwMCwgMSB9LAorCXsgMjAwMCwgMiB9LAorCXsgMjIwMCwgMyB9LAorCXsgMjQwMCwgNCB9LAorCXsgMjgwMCwgNSB9LAorCXsgMzAwMCwgNiB9LAorCXsgMzMwMCwgNyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdmRjZGMyX3Z0ZyA9IHsKKwkubmFtZSA9ICJWRENEQzIiLAorCS52dGdfcmVnID0gTUVORUxBVVNfRENEQ19DVFJMMSwKKwkudnRnX3NoaWZ0ID0gMCwKKwkudnRnX2JpdHMgPSAzLAorCS5tb2RlX3JlZyA9IE1FTkVMQVVTX0RDRENfQ1RSTDIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyB2ZGNkYzNfdnRnID0geworCS5uYW1lID0gIlZEQ0RDMyIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19EQ0RDX0NUUkwxLAorCS52dGdfc2hpZnQgPSAzLAorCS52dGdfYml0cyA9IDMsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfRENEQ19DVFJMMywKK307CisKK2ludCBtZW5lbGF1c19zZXRfdmRjZGMoaW50IGRjZGMsIHVuc2lnbmVkIGludCBtVikKK3sKKwljb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnICp2dGc7CisJaW50IHZhbDsKKworCWlmIChkY2RjICE9IDIgJiYgZGNkYyAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGNkYyA9PSAyKQorCQl2dGcgPSAmdmRjZGMyX3Z0ZzsKKwllbHNlCisJCXZ0ZyA9ICZ2ZGNkYzNfdnRnOworCisJaWYgKG1WID09IDApCisJCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSh2dGcsIDAsIDAsIDApOworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdmRjZGNfdmFsdWVzLAorCQkJCSAgICAgQVJSQVlfU0laRSh2ZGNkY192YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKHZ0ZywgbVYsIHZhbCwgMHgwMyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHZtbWNfdmFsdWVzW10gPSB7CisJeyAxODUwLCAwIH0sCisJeyAyODAwLCAxIH0sCisJeyAzMDAwLCAyIH0sCisJeyAzMTAwLCAzIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyB2bW1jX3Z0ZyA9IHsKKwkubmFtZSA9ICJWTU1DIiwKKwkudnRnX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMMSwKKwkudnRnX3NoaWZ0ID0gNiwKKwkudnRnX2JpdHMgPSAyLAorCS5tb2RlX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMNywKK307CisKK2ludCBtZW5lbGF1c19zZXRfdm1tYyh1bnNpZ25lZCBpbnQgbVYpCit7CisJaW50IHZhbDsKKworCWlmIChtViA9PSAwKQorCQlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZtbWNfdnRnLCAwLCAwLCAwKTsKKworCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZtbWNfdmFsdWVzLCBBUlJBWV9TSVpFKHZtbWNfdmFsdWVzKSk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdm1tY192dGcsIG1WLCB2YWwsIDB4MDIpOworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfdm1tYyk7CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdmF1eF92YWx1ZXNbXSA9IHsKKwl7IDE1MDAsIDAgfSwKKwl7IDE4MDAsIDEgfSwKKwl7IDI1MDAsIDIgfSwKKwl7IDI4MDAsIDMgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZhdXhfdnRnID0geworCS5uYW1lID0gIlZBVVgiLAorCS52dGdfcmVnID0gTUVORUxBVVNfTERPX0NUUkwxLAorCS52dGdfc2hpZnQgPSA0LAorCS52dGdfYml0cyA9IDIsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfTERPX0NUUkw2LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92YXV4KHVuc2lnbmVkIGludCBtVikKK3sKKwlpbnQgdmFsOworCisJaWYgKG1WID09IDApCisJCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdmF1eF92dGcsIDAsIDAsIDApOworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdmF1eF92YWx1ZXMsIEFSUkFZX1NJWkUodmF1eF92YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2YXV4X3Z0ZywgbVYsIHZhbCwgMHgwMik7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF92YXV4KTsKKworaW50IG1lbmVsYXVzX2dldF9zbG90X3Bpbl9zdGF0ZXModm9pZCkKK3sKKwlyZXR1cm4gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX1BJTl9TVCk7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX2dldF9zbG90X3Bpbl9zdGF0ZXMpOworCitpbnQgbWVuZWxhdXNfc2V0X3JlZ3VsYXRvcl9zbGVlcChpbnQgZW5hYmxlLCB1MzIgdmFsKQoreworCWludCB0LCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB0aGVfbWVuZWxhdXMtPmNsaWVudDsKKworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1NMRUVQX0NUUkwyLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWRldl9kYmcoJmMtPmRldiwgInJlZ3VsYXRvciBzbGVlcCBjb25maWd1cmF0aW9uOiAlMDJ4XG4iLCB2YWwpOworCisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfR1BJT19DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdCA9ICgoMSA8PCA2KSB8IDB4MDQpOworCWlmIChlbmFibGUpCisJCXJldCB8PSB0OworCWVsc2UKKwkJcmV0ICY9IH50OworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19HUElPX0NUUkwsIHJldCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBIYW5kbGVzIE1lbmVsYXVzIGludGVycnVwdHMuIERvZXMgbm90IHJ1biBpbiBpbnRlcnJ1cHQgY29udGV4dCAqLworc3RhdGljIHZvaWQgbWVuZWxhdXNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl9tZW5lbGF1cykKK3sKKwlzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbWVuZWxhdXMgPQorCQkJY29udGFpbmVyX29mKF9tZW5lbGF1cywgc3RydWN0IG1lbmVsYXVzX2NoaXAsIHdvcmspOworCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbWVuZWxhdXMpOworCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgaXNyOworCisJCWlzciA9IChtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19JTlRfU1RBVFVTMikKKwkJCQkmIH5tZW5lbGF1cy0+bWFzazIpIDw8IDg7CisJCWlzciB8PSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19JTlRfU1RBVFVTMSkKKwkJCQkmIH5tZW5lbGF1cy0+bWFzazE7CisJCWlmICghaXNyKQorCQkJYnJlYWs7CisKKwkJd2hpbGUgKGlzcikgeworCQkJaW50IGlycSA9IGZscyhpc3IpIC0gMTsKKwkJCWlzciAmPSB+KDEgPDwgaXJxKTsKKworCQkJbXV0ZXhfbG9jaygmbWVuZWxhdXMtPmxvY2spOworCQkJbWVuZWxhdXNfZGlzYWJsZV9pcnEoaXJxKTsKKwkJCW1lbmVsYXVzX2Fja19pcnEoaXJxKTsKKwkJCWhhbmRsZXIgPSBtZW5lbGF1cy0+aGFuZGxlcnNbaXJxXTsKKwkJCWlmIChoYW5kbGVyKQorCQkJCWhhbmRsZXIobWVuZWxhdXMpOworCQkJbWVuZWxhdXNfZW5hYmxlX2lycShpcnEpOworCQkJbXV0ZXhfdW5sb2NrKCZtZW5lbGF1cy0+bG9jayk7CisJCX0KKwl9CisJZW5hYmxlX2lycShtZW5lbGF1cy0+Y2xpZW50LT5pcnEpOworfQorCisvKgorICogV2UgY2Fubm90IHVzZSBJMkMgaW4gaW50ZXJydXB0IGNvbnRleHQsIHNvIHdlIGp1c3Qgc2NoZWR1bGUgd29yay4KKyAqLworc3RhdGljIGlycXJldHVybl90IG1lbmVsYXVzX2lycShpbnQgaXJxLCB2b2lkICpfbWVuZWxhdXMpCit7CisJc3RydWN0IG1lbmVsYXVzX2NoaXAgKm1lbmVsYXVzID0gX21lbmVsYXVzOworCisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJKHZvaWQpc2NoZWR1bGVfd29yaygmbWVuZWxhdXMtPndvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoZSBSVEMgbmVlZHMgdG8gYmUgc2V0IG9uY2UsIHRoZW4gaXQgcnVucyBvbiBiYWNrdXAgYmF0dGVyeSBwb3dlci4KKyAqIEl0IHN1cHBvcnRzIGFsYXJtcywgaW5jbHVkaW5nIHN5c3RlbSB3YWtlIGFsYXJtcyAoZnJvbSBzb21lIG1vZGVzKTsKKyAqIGFuZCAxL3NlY29uZCBJUlFzIGlmIHJlcXVlc3RlZC4KKyAqLworI2lmZGVmIENPTkZJR19SVENfRFJWX1RXTDkyMzMwCisKKyNkZWZpbmUgUlRDX0NUUkxfUlRDX0VOCQkoMSA8PCAwKQorI2RlZmluZSBSVENfQ1RSTF9BTF9FTgkJKDEgPDwgMSkKKyNkZWZpbmUgUlRDX0NUUkxfTU9ERTEyCQkoMSA8PCAyKQorI2RlZmluZSBSVENfQ1RSTF9FVkVSWV9NQVNLCSgzIDw8IDMpCisjZGVmaW5lIFJUQ19DVFJMX0VWRVJZX1NFQwkoMCA8PCAzKQorI2RlZmluZSBSVENfQ1RSTF9FVkVSWV9NSU4JKDEgPDwgMykKKyNkZWZpbmUgUlRDX0NUUkxfRVZFUllfSFIJKDIgPDwgMykKKyNkZWZpbmUgUlRDX0NUUkxfRVZFUllfREFZCSgzIDw8IDMpCisKKyNkZWZpbmUgUlRDX1VQREFURV9FVkVSWQkweDA4CisKKyNkZWZpbmUgUlRDX0hSX1BNCQkoMSA8PCA3KQorCitzdGF0aWMgdm9pZCBtZW5lbGF1c190b190aW1lKGNoYXIgKnJlZ3MsIHN0cnVjdCBydGNfdGltZSAqdCkKK3sKKwl0LT50bV9zZWMgPSBCQ0QyQklOKHJlZ3NbMF0pOworCXQtPnRtX21pbiA9IEJDRDJCSU4ocmVnc1sxXSk7CisJaWYgKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9NT0RFMTIpIHsKKwkJdC0+dG1faG91ciA9IEJDRDJCSU4ocmVnc1syXSAmIDB4MWYpIC0gMTsKKwkJaWYgKHJlZ3NbMl0gJiBSVENfSFJfUE0pCisJCQl0LT50bV9ob3VyICs9IDEyOworCX0gZWxzZQorCQl0LT50bV9ob3VyID0gQkNEMkJJTihyZWdzWzJdICYgMHgzZik7CisJdC0+dG1fbWRheSA9IEJDRDJCSU4ocmVnc1szXSk7CisJdC0+dG1fbW9uID0gQkNEMkJJTihyZWdzWzRdKSAtIDE7CisJdC0+dG1feWVhciA9IEJDRDJCSU4ocmVnc1s1XSkgKyAxMDA7Cit9CisKK3N0YXRpYyBpbnQgdGltZV90b19tZW5lbGF1cyhzdHJ1Y3QgcnRjX3RpbWUgKnQsIGludCByZWdudW0pCit7CisJaW50CWhvdXIsIHN0YXR1czsKKworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhyZWdudW0rKywgQklOMkJDRCh0LT50bV9zZWMpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKHJlZ251bSsrLCBCSU4yQkNEKHQtPnRtX21pbikpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlpZiAodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX01PREUxMikgeworCQlob3VyID0gdC0+dG1faG91ciArIDE7CisJCWlmIChob3VyID4gMTIpCisJCQlob3VyID0gUlRDX0hSX1BNIHwgQklOMkJDRChob3VyIC0gMTIpOworCQllbHNlCisJCQlob3VyID0gQklOMkJDRChob3VyKTsKKwl9IGVsc2UKKwkJaG91ciA9IEJJTjJCQ0QodC0+dG1faG91cik7CisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKHJlZ251bSsrLCBob3VyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKHJlZ251bSsrLCBCSU4yQkNEKHQtPnRtX21kYXkpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKHJlZ251bSsrLCBCSU4yQkNEKHQtPnRtX21vbiArIDEpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKHJlZ251bSsrLCBCSU4yQkNEKHQtPnRtX3llYXIgLSAxMDApKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIDA7CitmYWlsOgorCWRldl9lcnIoJnRoZV9tZW5lbGF1cy0+Y2xpZW50LT5kZXYsICJydGMgd3JpdGUgcmVnICUwMngsIGVyciAlZFxuIiwKKwkJCS0tcmVnbnVtLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCXN0cnVjdCBpMmNfbXNnCW1zZ1syXTsKKwljaGFyCQlyZWdzWzddOworCWludAkJc3RhdHVzOworCisJLyogYmxvY2sgcmVhZCBkYXRlIGFuZCB0aW1lIHJlZ2lzdGVycyAqLworCXJlZ3NbMF0gPSBNRU5FTEFVU19SVENfU0VDOworCisJbXNnWzBdLmFkZHIgPSBNRU5FTEFVU19JMkNfQUREUkVTUzsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSAxOworCW1zZ1swXS5idWYgPSByZWdzOworCisJbXNnWzFdLmFkZHIgPSBNRU5FTEFVU19JMkNfQUREUkVTUzsKKwltc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwltc2dbMV0ubGVuID0gc2l6ZW9mKHJlZ3MpOworCW1zZ1sxXS5idWYgPSByZWdzOworCisJc3RhdHVzID0gaTJjX3RyYW5zZmVyKHRoZV9tZW5lbGF1cy0+Y2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworCWlmIChzdGF0dXMgIT0gMikgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAicmVhZCIsIHN0YXR1cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbmVsYXVzX3RvX3RpbWUocmVncywgdCk7CisJdC0+dG1fd2RheSA9IEJDRDJCSU4ocmVnc1s2XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdCkKK3sKKwlpbnQJCXN0YXR1czsKKworCS8qIHdyaXRlIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzICovCisJc3RhdHVzID0gdGltZV90b19tZW5lbGF1cyh0LCBNRU5FTEFVU19SVENfU0VDKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX1dLREFZLCBCSU4yQkNEKHQtPnRtX3dkYXkpKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZXJyKCZ0aGVfbWVuZWxhdXMtPmNsaWVudC0+ZGV2LCAicnRjIHdyaXRlIHJlZyAlMDJ4IiwKKwkJCQkiZXJyICVkXG4iLCBNRU5FTEFVU19SVENfV0tEQVksIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogbm93IGNvbW1pdCB0aGUgd3JpdGUgKi8KKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX1VQREFURSwgUlRDX1VQREFURV9FVkVSWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl9lcnIoJnRoZV9tZW5lbGF1cy0+Y2xpZW50LT5kZXYsICJydGMgY29tbWl0IHRpbWUsIGVyciAlZFxuIiwKKwkJCQlzdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp3KQoreworCXN0cnVjdCBpMmNfbXNnCW1zZ1syXTsKKwljaGFyCQlyZWdzWzZdOworCWludAkJc3RhdHVzOworCisJLyogYmxvY2sgcmVhZCBhbGFybSByZWdpc3RlcnMgKi8KKwlyZWdzWzBdID0gTUVORUxBVVNfUlRDX0FMX1NFQzsKKworCW1zZ1swXS5hZGRyID0gTUVORUxBVVNfSTJDX0FERFJFU1M7CisJbXNnWzBdLmZsYWdzID0gMDsKKwltc2dbMF0ubGVuID0gMTsKKwltc2dbMF0uYnVmID0gcmVnczsKKworCW1zZ1sxXS5hZGRyID0gTUVORUxBVVNfSTJDX0FERFJFU1M7CisJbXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJbXNnWzFdLmxlbiA9IHNpemVvZihyZWdzKTsKKwltc2dbMV0uYnVmID0gcmVnczsKKworCXN0YXR1cyA9IGkyY190cmFuc2Zlcih0aGVfbWVuZWxhdXMtPmNsaWVudC0+YWRhcHRlciwgbXNnLCAyKTsKKwlpZiAoc3RhdHVzICE9IDIpIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgImFsYXJtIHJlYWQiLCBzdGF0dXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW5lbGF1c190b190aW1lKHJlZ3MsICZ3LT50aW1lKTsKKworCXctPmVuYWJsZWQgPSAhISh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfQUxfRU4pOworCisJLyogTk9URSB3ZSAqY291bGQqIGNoZWNrIGlmIGFjdHVhbGx5IHBlbmRpbmcuLi4gKi8KKwl3LT5wZW5kaW5nID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp3KQoreworCWludAkJc3RhdHVzOworCisJaWYgKHRoZV9tZW5lbGF1cy0+Y2xpZW50LT5pcnEgPD0gMCAmJiB3LT5lbmFibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGNsZWFyIHByZXZpb3VzIGFsYXJtIGVuYWJsZSAqLworCWlmICh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfQUxfRU4pIHsKKwkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmPSB+UlRDX0NUUkxfQUxfRU47CisJCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfQ1RSTCwKKwkJCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHdyaXRlIGFsYXJtIHJlZ2lzdGVycyAqLworCXN0YXR1cyA9IHRpbWVfdG9fbWVuZWxhdXMoJnctPnRpbWUsIE1FTkVMQVVTX1JUQ19BTF9TRUMpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogZW5hYmxlIGFsYXJtIGlmIHJlcXVlc3RlZCAqLworCWlmICh3LT5lbmFibGVkKSB7CisJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgfD0gUlRDX0NUUkxfQUxfRU47CisJCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfQ1RSTCwKKwkJCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVgorCitzdGF0aWMgdm9pZCBtZW5lbGF1c19ydGNfdXBkYXRlX3dvcmsoc3RydWN0IG1lbmVsYXVzX2NoaXAgKm0pCit7CisJLyogcmVwb3J0IDEvc2VjIHVwZGF0ZSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcnRjX3VwZGF0ZV9pcnEobS0+cnRjLCAxLCBSVENfSVJRRiB8IFJUQ19VRik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKHRoZV9tZW5lbGF1cy0+Y2xpZW50LT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCXN3aXRjaCAoY21kKSB7CisJLyogYWxhcm0gSVJRICovCisJY2FzZSBSVENfQUlFX09OOgorCQlpZiAodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX0FMX0VOKQorCQkJcmV0dXJuIDA7CisJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgfD0gUlRDX0NUUkxfQUxfRU47CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PRkY6CisJCWlmICghKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9BTF9FTikpCisJCQlyZXR1cm4gMDsKKwkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmPSB+UlRDX0NUUkxfQUxfRU47CisJCWJyZWFrOworCS8qIDEvc2Vjb25kICJ1cGRhdGUiIElSUSAqLworCWNhc2UgUlRDX1VJRV9PTjoKKwkJaWYgKHRoZV9tZW5lbGF1cy0+dWllKQorCQkJcmV0dXJuIDA7CisJCXN0YXR1cyA9IG1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhNRU5FTEFVU19SVENUTVJfSVJRKTsKKwkJc3RhdHVzID0gbWVuZWxhdXNfYWRkX2lycV93b3JrKE1FTkVMQVVTX1JUQ1RNUl9JUlEsCisJCQkJbWVuZWxhdXNfcnRjX3VwZGF0ZV93b3JrKTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJdGhlX21lbmVsYXVzLT51aWUgPSAxOworCQlyZXR1cm4gc3RhdHVzOworCWNhc2UgUlRDX1VJRV9PRkY6CisJCWlmICghdGhlX21lbmVsYXVzLT51aWUpCisJCQlyZXR1cm4gMDsKKwkJc3RhdHVzID0gbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX1JUQ1RNUl9JUlEpOworCQlpZiAoc3RhdHVzID09IDApCisJCQl0aGVfbWVuZWxhdXMtPnVpZSA9IDA7CisJCXJldHVybiBzdGF0dXM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfQ1RSTCwgdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCk7Cit9CisKKyNlbHNlCisjZGVmaW5lIG1lbmVsYXVzX2lvY3RsCU5VTEwKKyNlbmRpZgorCisvKiBSRVZJU0lUIG5vIGNvbXBlbnNhdGlvbiByZWdpc3RlciBzdXBwb3J0IC4uLiAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbWVuZWxhdXNfcnRjX29wcyA9IHsKKwkuaW9jdGwJCQk9IG1lbmVsYXVzX2lvY3RsLAorCS5yZWFkX3RpbWUJCT0gbWVuZWxhdXNfcmVhZF90aW1lLAorCS5zZXRfdGltZQkJPSBtZW5lbGF1c19zZXRfdGltZSwKKwkucmVhZF9hbGFybQkJPSBtZW5lbGF1c19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JCT0gbWVuZWxhdXNfc2V0X2FsYXJtLAorfTsKKworc3RhdGljIHZvaWQgbWVuZWxhdXNfcnRjX2FsYXJtX3dvcmsoc3RydWN0IG1lbmVsYXVzX2NoaXAgKm0pCit7CisJLyogcmVwb3J0IGFsYXJtICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfdXBkYXRlX2lycShtLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX0FGKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkvKiB0aGVuIGRpc2FibGUgaXQ7IGFsYXJtcyBhcmUgb25lc2hvdCAqLworCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJj0gflJUQ19DVFJMX0FMX0VOOworCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfQ1RSTCwgdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW5lbGF1c19ydGNfaW5pdChzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbSkKK3sKKwlpbnQJYWxhcm0gPSAobS0+Y2xpZW50LT5pcnEgPiAwKTsKKworCS8qIGFzc3VtZSAzMktERVRFTiBwaW4gaXMgcHVsbGVkIGhpZ2ggKi8KKwlpZiAoIShtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19PU0NfQ1RSTCkgJiAweDgwKSkgeworCQlkZXZfZGJnKCZtLT5jbGllbnQtPmRldiwgIm5vIDMyayBvc2NpbGxhdG9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHN1cHBvcnQgUlRDIGFsYXJtOyBpdCBjYW4gaXNzdWUgd2FrZXVwcyAqLworCWlmIChhbGFybSkgeworCQlpZiAobWVuZWxhdXNfYWRkX2lycV93b3JrKE1FTkVMQVVTX1JUQ0FMTV9JUlEsCisJCQkJbWVuZWxhdXNfcnRjX2FsYXJtX3dvcmspIDwgMCkgeworCQkJZGV2X2VycigmbS0+Y2xpZW50LT5kZXYsICJjYW4ndCBoYW5kbGUgUlRDIGFsYXJtXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlkZXZpY2VfaW5pdF93YWtldXAoJm0tPmNsaWVudC0+ZGV2LCAxKTsKKwl9CisKKwkvKiBiZSBzdXJlIFJUQyBpcyBlbmFibGVkOyBhbGxvdyAxL3NlYyBpcnFzOyBsZWF2ZSAxMmhyIG1vZGUgYWxvbmUgKi8KKwltLT5ydGNfY29udHJvbCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX1JUQ19DVFJMKTsKKwlpZiAoIShtLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX1JUQ19FTikKKwkJCXx8IChtLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX0FMX0VOKQorCQkJfHwgKG0tPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfRVZFUllfTUFTSykpIHsKKwkJaWYgKCEobS0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9SVENfRU4pKSB7CisJCQlkZXZfd2FybigmbS0+Y2xpZW50LT5kZXYsICJydGMgY2xvY2sgbmVlZHMgc2V0dGluZ1xuIik7CisJCQltLT5ydGNfY29udHJvbCB8PSBSVENfQ1RSTF9SVENfRU47CisJCX0KKwkJbS0+cnRjX2NvbnRyb2wgJj0gflJUQ19DVFJMX0VWRVJZX01BU0s7CisJCW0tPnJ0Y19jb250cm9sICY9IH5SVENfQ1RSTF9BTF9FTjsKKwkJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLCBtLT5ydGNfY29udHJvbCk7CisJfQorCisJbS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihEUklWRVJfTkFNRSwKKwkJCSZtLT5jbGllbnQtPmRldiwKKwkJCSZtZW5lbGF1c19ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihtLT5ydGMpKSB7CisJCWlmIChhbGFybSkgeworCQkJbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX1JUQ0FMTV9JUlEpOworCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZtLT5jbGllbnQtPmRldiwgMCk7CisJCX0KKwkJZGV2X2VycigmbS0+Y2xpZW50LT5kZXYsICJjYW4ndCByZWdpc3RlciBSVEM6ICVkXG4iLAorCQkJCShpbnQpIFBUUl9FUlIobS0+cnRjKSk7CisJCXRoZV9tZW5lbGF1cy0+cnRjID0gTlVMTDsKKwl9Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW5lbGF1c19ydGNfaW5pdChzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbSkKK3sKKwkvKiBub3RoaW5nICovCit9CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1lbmVsYXVzX2kyY19kcml2ZXI7CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbWVuZWxhdXNfY2hpcAkqbWVuZWxhdXM7CisJaW50CQkJcmV2ID0gMCwgdmFsOworCWludAkJCWVyciA9IDA7CisJc3RydWN0IG1lbmVsYXVzX3BsYXRmb3JtX2RhdGEgKm1lbmVsYXVzX3BkYXRhID0KKwkJCQkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmICh0aGVfbWVuZWxhdXMpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJvbmx5IG9uZSAlcyBmb3Igbm93XG4iLAorCQkJCURSSVZFUl9OQU1FKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWVuZWxhdXMgPSBremFsbG9jKHNpemVvZiAqbWVuZWxhdXMsIEdGUF9LRVJORUwpOworCWlmICghbWVuZWxhdXMpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgbWVuZWxhdXMpOworCisJdGhlX21lbmVsYXVzID0gbWVuZWxhdXM7CisJbWVuZWxhdXMtPmNsaWVudCA9IGNsaWVudDsKKworCS8qIElmIGEgdHJ1ZSBwcm9iZSBjaGVjayB0aGUgZGV2aWNlICovCisJcmV2ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfUkVWKTsKKwlpZiAocmV2IDwgMCkgeworCQlwcl9lcnIoImRldmljZSBub3QgZm91bmQiKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsMTsKKwl9CisKKwkvKiBBY2sgYW5kIGRpc2FibGUgYWxsIE1lbmVsYXVzIGludGVycnVwdHMgKi8KKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX0FDSzEsIDB4ZmYpOworCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfQUNLMiwgMHhmZik7CisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMSwgMHhmZik7CisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMiwgMHhmZik7CisJbWVuZWxhdXMtPm1hc2sxID0gMHhmZjsKKwltZW5lbGF1cy0+bWFzazIgPSAweGZmOworCisJLyogU2V0IG91dHB1dCBidWZmZXIgc3RyZW5ndGhzICovCisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX01DVF9DVFJMMSwgMHg3Myk7CisKKwlpZiAoY2xpZW50LT5pcnEgPiAwKSB7CisJCWVyciA9IHJlcXVlc3RfaXJxKGNsaWVudC0+aXJxLCBtZW5lbGF1c19pcnEsIElSUUZfRElTQUJMRUQsCisJCQkJICBEUklWRVJfTkFNRSwgbWVuZWxhdXMpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgICJjYW4ndCBnZXQgSVJRICVkLCBlcnIgJWQiLAorCQkJCQljbGllbnQtPmlycSwgZXJyKTsKKwkJCWdvdG8gZmFpbDE7CisJCX0KKwl9CisKKwltdXRleF9pbml0KCZtZW5lbGF1cy0+bG9jayk7CisJSU5JVF9XT1JLKCZtZW5lbGF1cy0+d29yaywgbWVuZWxhdXNfd29yayk7CisKKwlwcl9pbmZvKCJNZW5lbGF1cyByZXYgJWQuJWRcbiIsIHJldiA+PiA0LCByZXYgJiAweDBmKTsKKworCXZhbCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX1ZDT1JFX0NUUkwxKTsKKwlpZiAodmFsIDwgMCkKKwkJZ290byBmYWlsMjsKKwlpZiAodmFsICYgKDEgPDwgNykpCisJCW1lbmVsYXVzLT52Y29yZV9od19tb2RlID0gMTsKKwllbHNlCisJCW1lbmVsYXVzLT52Y29yZV9od19tb2RlID0gMDsKKworCWlmIChtZW5lbGF1c19wZGF0YSAhPSBOVUxMICYmIG1lbmVsYXVzX3BkYXRhLT5sYXRlX2luaXQgIT0gTlVMTCkgeworCQllcnIgPSBtZW5lbGF1c19wZGF0YS0+bGF0ZV9pbml0KCZjbGllbnQtPmRldik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmYWlsMjsKKwl9CisKKwltZW5lbGF1c19ydGNfaW5pdChtZW5lbGF1cyk7CisKKwlyZXR1cm4gMDsKK2ZhaWwyOgorCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBtZW5lbGF1cyk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKK2ZhaWwxOgorCWtmcmVlKG1lbmVsYXVzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBtZW5lbGF1c19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbWVuZWxhdXNfY2hpcAkqbWVuZWxhdXMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBtZW5lbGF1cyk7CisJa2ZyZWUobWVuZWxhdXMpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCXRoZV9tZW5lbGF1cyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtZW5lbGF1c19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCX0sCisJLnByb2JlCQk9IG1lbmVsYXVzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19leGl0X3AobWVuZWxhdXNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1lbmVsYXVzX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJcmVzID0gaTJjX2FkZF9kcml2ZXIoJm1lbmVsYXVzX2kyY19kcml2ZXIpOworCWlmIChyZXMgPCAwKSB7CisJCXByX2VycigiZHJpdmVyIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWVuZWxhdXNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtZW5lbGF1c19pMmNfZHJpdmVyKTsKKworCS8qIEZJWE1FOiBTaHV0ZG93biBtZW5lbGF1cyBwYXJ0cyB0aGF0IGNhbiBiZSBzaHV0IGRvd24gKi8KK30KKworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4gKGFuZCBvdGhlcnMpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBpbnRlcmZhY2UgZm9yIE1lbmVsYXVzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChtZW5lbGF1c19pbml0KTsKK21vZHVsZV9leGl0KG1lbmVsYXVzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCmluZGV4IGY0MjliZTguLmEyMWY1ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKQEAgLTEyNTgsMTkgKzEyNTgsMjUgQEAKIAlzZXRfYml0KFBDX0RNQV9SRUNPTU1FTkRFRCwgJnBjLT5mbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiBpZGVmbG9wcHlfYmxvY2twY19jbWQoaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHksIGlkZWZsb3BweV9wY190ICpwYywgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCS8qCi0JICoganVzdCBzdXBwb3J0IGVqZWN0IGZvciBub3csIGl0IHdvdWxkIG5vdCBiZSBoYXJkIHRvIG1ha2UgdGhlCi0JICogUkVRX0JMT0NLX1BDIHN1cHBvcnQgZnVsbHktZmVhdHVyZWQKLQkgKi8KLQlpZiAocnEtPmNtZFswXSAhPSBJREVGTE9QUFlfU1RBUlRfU1RPUF9DTUQpCi0JCXJldHVybiAxOwotCiAJaWRlZmxvcHB5X2luaXRfcGMocGMpOworCXBjLT5jYWxsYmFjayA9ICZpZGVmbG9wcHlfcndfY2FsbGJhY2s7CiAJbWVtY3B5KHBjLT5jLCBycS0+Y21kLCBzaXplb2YocGMtPmMpKTsKLQlyZXR1cm4gMDsKKwlwYy0+cnEgPSBycTsKKwlwYy0+Yl9jb3VudCA9IHJxLT5kYXRhX2xlbjsKKwlpZiAocnEtPmRhdGFfbGVuICYmIHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKKwkJc2V0X2JpdChQQ19XUklUSU5HLCAmcGMtPmZsYWdzKTsKKwlwYy0+YnVmZmVyID0gcnEtPmRhdGE7CisJaWYgKHJxLT5iaW8pCisJCXNldF9iaXQoUENfRE1BX1JFQ09NTUVOREVELCAmcGMtPmZsYWdzKTsKKwkJCisJLyoKKwkgKiBwb3NzaWJseSBwcm9ibGVtYXRpYywgZG9lc24ndCBsb29rIGxpa2UgaWRlLWZsb3BweSBjb3JyZWN0bHkKKwkgKiBoYW5kbGVkIHNjYXR0ZXJlZCByZXF1ZXN0cyBpZiBkbWEgZmFpbHMuLi4KKwkgKi8KKwlwYy0+cmVxdWVzdF90cmFuc2ZlciA9IHBjLT5idWZmZXJfc2l6ZSA9IHJxLT5kYXRhX2xlbjsKIH0KIAogLyoKQEAgLTEzMTcsMTAgKzEzMjMsNyBAQAogCQlwYyA9IChpZGVmbG9wcHlfcGNfdCAqKSBycS0+YnVmZmVyOwogCX0gZWxzZSBpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7CiAJCXBjID0gaWRlZmxvcHB5X25leHRfcGNfc3RvcmFnZShkcml2ZSk7Ci0JCWlmIChpZGVmbG9wcHlfYmxvY2twY19jbWQoZmxvcHB5LCBwYywgcnEpKSB7Ci0JCQlpZGVmbG9wcHlfZG9fZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOwotCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwotCQl9CisJCWlkZWZsb3BweV9ibG9ja3BjX2NtZChmbG9wcHksIHBjLCBycSk7CiAJfSBlbHNlIHsKIAkJYmxrX2R1bXBfcnFfZmxhZ3MocnEsCiAJCQkiaWRlLWZsb3BweTogdW5zdXBwb3J0ZWQgY29tbWFuZCBpbiBxdWV1ZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwppbmRleCBjYzU4MDEzLi41YTRjNWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwpAQCAtMTA3MywxNCArMTA3MywxNCBAQAogCQlod2dyb3VwLT5od2lmLT5uZXh0ID0gaHdpZjsKIAkJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CiAJfSBlbHNlIHsKLQkJaHdncm91cCA9IGttYWxsb2Nfbm9kZShzaXplb2YoaWRlX2h3Z3JvdXBfdCksIEdGUF9LRVJORUwsCisJCWh3Z3JvdXAgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKGlkZV9od2dyb3VwX3QpLAorCQkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKIAkJCQkJaHdpZl90b19ub2RlKGh3aWYtPmRyaXZlc1swXS5od2lmKSk7CiAJCWlmICghaHdncm91cCkKIAkgICAgICAgCQlnb3RvIG91dF91cDsKIAogCQlod2lmLT5od2dyb3VwID0gaHdncm91cDsKIAotCQltZW1zZXQoaHdncm91cCwgMCwgc2l6ZW9mKGlkZV9od2dyb3VwX3QpKTsKIAkJaHdncm91cC0+aHdpZiAgICAgPSBod2lmLT5uZXh0ID0gaHdpZjsKIAkJaHdncm91cC0+cnEgICAgICAgPSBOVUxMOwogCQlod2dyb3VwLT5oYW5kbGVyICA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUuYyBiL2RyaXZlcnMvaWRlL2lkZS5jCmluZGV4IGM5NDhhNWMuLjhjZDc2OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS5jCkBAIC0xMDQ5LDkgKzEwNDksMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlkZV9kcml2ZXJfdCAqZHJ2OwogCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBlcnIgPSAwLCAoKnNldGZ1bmMpKGlkZV9kcml2ZV90ICosIGludCk7CisJaW50IGVyciwgKCpzZXRmdW5jKShpZGVfZHJpdmVfdCAqLCBpbnQpOwogCXU4ICp2YWw7CiAKKwllcnIgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBiZGV2LT5iZF9kaXNrLT5xdWV1ZSwgYmRldi0+YmRfZGlzaywgY21kLCBwKTsKKwlpZiAoZXJyICE9IC1FTk9UVFkpCisJCXJldHVybiBlcnI7CisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSERJT19HRVRfMzJCSVQ6CSAgICB2YWwgPSAmZHJpdmUtPmlvXzMyYml0OwkgZ290byByZWFkX3ZhbDsKIAljYXNlIEhESU9fR0VUX0tFRVBTRVRUSU5HUzogdmFsID0gJmRyaXZlLT5rZWVwX3NldHRpbmdzOyBnb3RvIHJlYWRfdmFsOwpAQCAtMTE3MSwxMCArMTE3NSw2IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCWNhc2UgQ0RST01FSkVDVDoKLQkJY2FzZSBDRFJPTUNMT1NFVFJBWToKLQkJCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxlLCBiZGV2LT5iZF9kaXNrLCBjbWQsIHApOwotCiAJCWNhc2UgSERJT19HRVRfQlVTU1RBVEU6CiAJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQkJcmV0dXJuIC1FQUNDRVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCmluZGV4IDBmYzhjNmUuLmVlNDUyNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CkBAIC0xMTI4LDggKzExMjksNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdG1wOwogCWludCBtYXlfc2NoZWR1bGU7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAKIAkJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCmluZGV4IDUxYTEyMDYuLjJmZmQ1MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCkBAIC0xNjk5LDYgKzE2OTksNyBAQAogCXVuc2lnbmVkIGludCBnLCBnZW5lcmF0aW9uID0gMDsKIAlpbnQgaSwgcmVzZXRfY3ljbGVzID0gMDsKIAorCXNldF9mcmVlemFibGUoKTsKIAkvKiBTZXR1cCBvdXIgZGV2aWNlLW1vZGVsIGVudHJpZXMgKi8KIAlub2RlbWdyX2NyZWF0ZV9ob3N0X2Rldl9maWxlcyhob3N0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCmluZGV4IGJkNjg2YTIuLjIwODk2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKQEAgLTQ0NSw2ICs0NDUsNyBAQAogCiBzdGF0aWMgaW50IGdhbWVwb3J0X3RocmVhZCh2b2lkICpub3RoaW5nKQogeworCXNldF9mcmVlemFibGUoKTsKIAlkbyB7CiAJCWdhbWVwb3J0X2hhbmRsZV9ldmVudCgpOwogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZ2FtZXBvcnRfd2FpdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCBhOGYzYmMxLi4zNzJjYTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCkBAIC0zODQsNiArMzg0LDcgQEAKIAogc3RhdGljIGludCBzZXJpb190aHJlYWQodm9pZCAqbm90aGluZykKIHsKKwlzZXRfZnJlZXphYmxlKCk7CiAJZG8gewogCQlzZXJpb19oYW5kbGVfZXZlbnQoKTsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNlcmlvX3dhaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCmluZGV4IGYwY2JjZGIuLjM2Zjk0NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCkBAIC0yOTIsNiArMjkyLDcgQEAKIAogCXNjaGVkX3NldHNjaGVkdWxlcih0c2ssIFNDSEVEX0ZJRk8sICZwYXJhbSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdW5zaWduZWQgaW50IHgsIHksIHA7CiAJCWxvbmcgdGltZW91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9LY29uZmlnIGIvZHJpdmVycy9pc2RuL0tjb25maWcKaW5kZXggM2UwODhjNC4uY2Y5MDZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL0tjb25maWcKQEAgLTIsMTIgKzIsMTAgQEAKICMgSVNETiBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJJU0ROIHN1YnN5c3RlbSIKLQlkZXBlbmRzIG9uICFTMzkwCi0KLWNvbmZpZyBJU0ROCittZW51Y29uZmlnIElTRE4KIAl0cmlzdGF0ZSAiSVNETiBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUCisJZGVwZW5kcyBvbiAhUzM5MAogCS0tLWhlbHAtLS0KIAkgIElTRE4gKCJJbnRlZ3JhdGVkIFNlcnZpY2VzIERpZ2l0YWwgTmV0d29ya3MiLCBjYWxsZWQgUk5JUyBpbiBGcmFuY2UpCiAJICBpcyBhIHNwZWNpYWwgdHlwZSBvZiBmdWxseSBkaWdpdGFsIHRlbGVwaG9uZSBzZXJ2aWNlOyBpdCdzIG1vc3RseQpAQCAtMjEsOSArMTksOSBAQAogCiAJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCBJU0ROLgogCitpZiBJU0ROCiAKIG1lbnUgIk9sZCBJU0RONExpbnV4IgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4KIAogY29uZmlnIElTRE5fSTRMCiAJdHJpc3RhdGUgIk9sZCBJU0RONExpbnV4IChkZXByZWNhdGVkKSIKQEAgLTUwLDIwICs0OCwyMSBAQAogZW5kbWVudQogCiBjb21tZW50ICJDQVBJIHN1YnN5c3RlbSIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROCiAKIGNvbmZpZyBJU0ROX0NBUEkKIAl0cmlzdGF0ZSAiQ0FQSTIuMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETgogCWhlbHAKIAkgIFRoaXMgcHJvdmlkZXMgdGhlIENBUEkgKENvbW1vbiBJU0ROIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nCiAJICBJbnRlcmZhY2UsIGEgc3RhbmRhcmQgbWFraW5nIGl0IGVhc3kgZm9yIHByb2dyYW1zIHRvIGFjY2VzcyBJU0ROCiAJICBoYXJkd2FyZSwgc2VlIDxodHRwOi8vd3d3LmNhcGkub3JnLz4uICBUaGlzIGlzIG5lZWRlZCBmb3IgQVZNJ3Mgc2V0CiAJICBvZiBhY3RpdmUgSVNETiBjb250cm9sbGVycyBsaWtlIEIxLCBUMSwgTTEuCiAKK2lmIElTRE5fQ0FQSQorCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9jYXBpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL2hhcmR3YXJlL0tjb25maWciCiAKLWVuZG1lbnUKK2VuZGlmICMgSVNETl9DQVBJCiAKK2VuZGlmICMgSVNETgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKaW5kZXggYzkyZjlkNy4uZTFhZmQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCkBAIC0zLDcgKzMsNiBAQAogIwogY29uZmlnIElTRE5fRFJWX0FWTUIxX1ZFUkJPU0VfUkVBU09OCiAJYm9vbCAiVmVyYm9zZSByZWFzb24gY29kZSByZXBvcnRpbmciCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIENBUEkgZHJpdmVycyB3aWxsIGdpdmUgdmVyYm9zZSByZWFzb25zIGZvcgpAQCAtMTIsNyArMTEsNiBAQAogCiBjb25maWcgQ0FQSV9UUkFDRQogCWJvb2wgIkNBUEkgdHJhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fQ0FQSQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsY2FwaSBkcml2ZXIgY2FuIG1ha2UgdmVyYm9zZSB0cmFjZXMKQEAgLTIzLDcgKzIxLDcgQEAKIAogY29uZmlnIElTRE5fQ0FQSV9NSURETEVXQVJFCiAJYm9vbCAiQ0FQSTIuMCBNaWRkbGV3YXJlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBUaGlzIG9wdGlvbiB3aWxsIGVuaGFuY2UgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgL2Rldi9jYXBpMjAKIAkgIGludGVyZmFjZS4gIEl0IHdpbGwgcHJvdmlkZSBhIG1lYW5zIG9mIG1vdmluZyBhIGRhdGEgY29ubmVjdGlvbiwKQEAgLTMzLDcgKzMxLDYgQEAKIAogY29uZmlnIElTRE5fQ0FQSV9DQVBJMjAKIAl0cmlzdGF0ZSAiQ0FQSTIuMCAvZGV2L2NhcGkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fQ0FQSQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHdpbGwgcHJvdmlkZSB0aGUgQ0FQSSAyLjAgaW50ZXJmYWNlIHRvIHVzZXJzcGFjZQogCSAgYXBwbGljYXRpb25zIHZpYSAvZGV2L2NhcGkyMC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlCkBAIC01Niw3ICs1Myw3IEBACiAKIGNvbmZpZyBJU0ROX0NBUElfQ0FQSURSVgogCXRyaXN0YXRlICJDQVBJMi4wIGNhcGlkcnYgaW50ZXJmYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkgJiYgSVNETl9JNEwKKwlkZXBlbmRzIG9uIElTRE5fSTRMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgdGhlIGdsdWUgY29kZSB0byBob29rIHVwIENBUEkgZHJpdmVuIGNhcmRzIHRvCiAJICB0aGUgbGVnYWN5IGlzZG40bGludXggbGluayBsYXllci4gIElmIHlvdSBoYXZlIGEgY2FyZCB3aGljaCBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCmluZGV4IDgxNjYxYjguLmY0NDlkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKQEAgLTU0OSw3ICs1NDksNyBAQAogCQljYXBpbXNnX3NldHU4IChza2ItPmRhdGEsIDUsIENBUElfUkVRKTsKIAkJY2FwaW1zZ19zZXR1MTYoc2tiLT5kYXRhLCA2LCBtcC0+bXNnaWQrKyk7CiAJCWNhcGltc2dfc2V0dTMyKHNrYi0+ZGF0YSwgOCwgbXAtPm5jY2kpOwkvKiBOQ0NJICovCi0JCWNhcGltc2dfc2V0dTMyKHNrYi0+ZGF0YSwgMTIsICh1MzIpIHNrYi0+ZGF0YSk7IC8qIERhdGEzMiAqLworCQljYXBpbXNnX3NldHUzMihza2ItPmRhdGEsIDEyLCAodTMyKShsb25nKXNrYi0+ZGF0YSk7LyogRGF0YTMyICovCiAJCWNhcGltc2dfc2V0dTE2KHNrYi0+ZGF0YSwgMTYsIGxlbik7CS8qIERhdGEgbGVuZ3RoICovCiAJCWNhcGltc2dfc2V0dTE2KHNrYi0+ZGF0YSwgMTgsIGRhdGFoYW5kbGUpOwogCQljYXBpbXNnX3NldHUxNihza2ItPmRhdGEsIDIwLCAwKTsJLyogRmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jCmluZGV4IDNlZDM0ZjcuLjlmNzNiYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJaWYgKCghYXApIHx8IChhcC0+cmVsZWFzZV9pbl9wcm9ncmVzcykpCiAJCXJldHVybjsKIAotCWRvd24oJmFwLT5yZWN2X3NlbSk7CisJbXV0ZXhfbG9jaygmYXAtPnJlY3ZfbXR4KTsKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhcC0+cmVjdl9xdWV1ZSkpKSB7CiAJCWlmIChDQVBJTVNHX0NNRChza2ItPmRhdGEpID09IENBUElfREFUQV9CM19JTkQpCiAJCQlhcC0+bnJlY3ZkYXRhcGt0Kys7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAogCQlhcC0+cmVjdl9tZXNzYWdlKGFwLCBza2IpOwogCX0KLQl1cCgmYXAtPnJlY3Zfc2VtKTsKKwltdXRleF91bmxvY2soJmFwLT5yZWN2X210eCk7CiB9CiAKIHZvaWQgY2FwaV9jdHJfaGFuZGxlX21lc3NhZ2Uoc3RydWN0IGNhcGlfY3RyICogY2FyZCwgdTE2IGFwcGwsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC01NDcsNyArNTQ3LDcgQEAKIAlhcC0+bnNlbnRjdGxwa3QgPSAwOwogCWFwLT5uc2VudGRhdGFwa3QgPSAwOwogCWFwLT5jYWxsYmFjayA9IE5VTEw7Ci0JaW5pdF9NVVRFWCgmYXAtPnJlY3Zfc2VtKTsKKwltdXRleF9pbml0KCZhcC0+cmVjdl9tdHgpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFwLT5yZWN2X3F1ZXVlKTsKIAlJTklUX1dPUksoJmFwLT5yZWN2X3dvcmssIHJlY3ZfaGFuZGxlcik7CiAJYXAtPnJlbGVhc2VfaW5fcHJvZ3Jlc3MgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jCmluZGV4IDMxZjRmZDguLjg0NWE3OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpX3Byb2MuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaV9wcm9jLmMKQEAgLTI0MywzNiArMjQzLDE1IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0KLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBjYXBpX2RyaXZlciAqY2FwaV9kcml2ZXJfZ2V0X2lkeChsb2ZmX3QgcG9zKQotewotCXN0cnVjdCBjYXBpX2RyaXZlciAqZHJ2ID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwotCWxvZmZfdCBpOwotCi0JaSA9IDA7Ci0JbGlzdF9mb3JfZWFjaChsLCAmY2FwaV9kcml2ZXJzKSB7Ci0JCWRydiA9IGxpc3RfZW50cnkobCwgc3RydWN0IGNhcGlfZHJpdmVyLCBsaXN0KTsKLQkJaWYgKGkrKyA9PSBwb3MpCi0JCQlyZXR1cm4gZHJ2OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIHZvaWQgKmNhcGlfZHJpdmVyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydjsKIAlyZWFkX2xvY2soJmNhcGlfZHJpdmVyc19saXN0X2xvY2spOwotCWRydiA9IGNhcGlfZHJpdmVyX2dldF9pZHgoKnBvcyk7Ci0JcmV0dXJuIGRydjsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJmNhcGlfZHJpdmVycywgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICpjYXBpX2RyaXZlcl9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydiA9IChzdHJ1Y3QgY2FwaV9kcml2ZXIgKil2OwotCSsrKnBvczsKLQlpZiAoZHJ2LT5saXN0Lm5leHQgPT0gJmNhcGlfZHJpdmVycykgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGxpc3RfZW50cnkoZHJ2LT5saXN0Lm5leHQsIHN0cnVjdCBjYXBpX2RyaXZlciwgbGlzdCk7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJmNhcGlfZHJpdmVycywgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgY2FwaV9kcml2ZXJfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKQEAgLTI4Miw3ICsyNjEsOCBAQAogCiBzdGF0aWMgaW50IGNhcGlfZHJpdmVyX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IGNhcGlfZHJpdmVyICpkcnYgPSAoc3RydWN0IGNhcGlfZHJpdmVyICopdjsKKwlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydiA9IGxpc3RfZW50cnkodiwgc3RydWN0IGNhcGlfZHJpdmVyLCBsaXN0KTsKKwogCXNlcV9wcmludGYoc2VxLCAiJS0zMnMgJXNcbiIsIGRydi0+bmFtZSwgZHJ2LT5yZXZpc2lvbik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnCmluZGV4IDEzOWYxOTcuLjMwZDAyOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnCkBAIC0yLDcgKzIsNiBAQAogIyBJU0ROIGhhcmR3YXJlIGRyaXZlcnMKICMKIGNvbW1lbnQgIkNBUEkgaGFyZHdhcmUgZHJpdmVycyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fQ0FQSQogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9LY29uZmlnCmluZGV4IDI5YTMyYTguLjVkYmNiZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL0tjb25maWcKQEAgLTIsMjMgKzIsMjIgQEAKICMgSVNETiBBVk0gZHJpdmVycwogIwogCi1tZW51ICJBY3RpdmUgQVZNIGNhcmRzIgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4gJiYgSVNETl9DQVBJIT1uCi0KLWNvbmZpZyBDQVBJX0FWTQotCWJvb2wgIlN1cHBvcnQgQVZNIGNhcmRzIgorbWVudWNvbmZpZyBDQVBJX0FWTQorCWJvb2wgIkFjdGl2ZSBBVk0gY2FyZHMiCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFWTSBhY3RpdmUgSVNETiBjYXJkcy4KIAoraWYgQ0FQSV9BVk0KKwogY29uZmlnIElTRE5fRFJWX0FWTUIxX0IxSVNBCiAJdHJpc3RhdGUgIkFWTSBCMSBJU0Egc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSSAmJiBJU0EKKwlkZXBlbmRzIG9uIElTQQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgSVNBIHZlcnNpb24gb2YgdGhlIEFWTSBCMSBjYXJkLgogCiBjb25maWcgSVNETl9EUlZfQVZNQjFfQjFQQ0kKIAl0cmlzdGF0ZSAiQVZNIEIxIFBDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJICYmIFBDSQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBQQ0kgdmVyc2lvbiBvZiB0aGUgQVZNIEIxIGNhcmQuCiAKQEAgLTMwLDE0ICsyOSwxMyBAQAogCiBjb25maWcgSVNETl9EUlZfQVZNQjFfVDFJU0EKIAl0cmlzdGF0ZSAiQVZNIFQxL1QxLUIgSVNBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkgJiYgSVNBCisJZGVwZW5kcyBvbiBJU0EKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEFWTSBUMSBUMUIgY2FyZC4KIAkgIE5vdGU6IFRoaXMgaXMgYSBQUkkgY2FyZCBhbmQgaGFuZGxlIDMwIEItY2hhbm5lbHMuCiAKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9CMVBDTUNJQQogCXRyaXN0YXRlICJBVk0gQjEvTTEvTTIgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFBDTUNJQSB2ZXJzaW9uIG9mIHRoZSBBVk0gQjEgY2FyZC4KIApAQCAtNTAsMTcgKzQ4LDE2IEBACiAKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9UMVBDSQogCXRyaXN0YXRlICJBVk0gVDEvVDEtQiBQQ0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSSAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQVZNIFQxIFQxQiBjYXJkLgogCSAgTm90ZTogVGhpcyBpcyBhIFBSSSBjYXJkIGFuZCBoYW5kbGUgMzAgQi1jaGFubmVscy4KIAogY29uZmlnIElTRE5fRFJWX0FWTUIxX0M0CiAJdHJpc3RhdGUgIkFWTSBDNC9DMiBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJICYmIFBDSQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBBVk0gQzQvQzIgUENJIGNhcmRzLgogCSAgVGhlc2UgY2FyZHMgaGFuZGxlIDQvMiBCUkkgSVNETiBsaW5lcyAoOC80IGNoYW5uZWxzKS4KIAotZW5kbWVudQotCitlbmRpZiAjIENBUElfQVZNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9LY29uZmlnCmluZGV4IDAxZDRhZmQuLjYwODJiNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9LY29uZmlnCkBAIC0yLDUyICsyLDUwIEBACiAjIElTRE4gRElWQVMgRWljb24gZHJpdmVyCiAjCiAKLW1lbnUgIkFjdGl2ZSBFaWNvbiBESVZBIFNlcnZlciBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fQ0FQSSE9bgotCi1jb25maWcgQ0FQSV9FSUNPTgotCWJvb2wgIlN1cHBvcnQgRWljb24gY2FyZHMiCittZW51Y29uZmlnIENBUElfRUlDT04KKwlib29sICJBY3RpdmUgRWljb24gRElWQSBTZXJ2ZXIgY2FyZHMiCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEVpY29uIE5ldHdvcmtzIGFjdGl2ZSBJU0ROIGNhcmRzLgogCitpZiBDQVBJX0VJQ09OCisKIGNvbmZpZyBJU0ROX0RJVkFTCiAJdHJpc3RhdGUgIlN1cHBvcnQgRWljb24gRElWQSBTZXJ2ZXIgY2FyZHMiCi0JZGVwZW5kcyBvbiBDQVBJX0VJQ09OICYmIFBST0NfRlMgJiYgUENJCisJZGVwZW5kcyBvbiBQUk9DX0ZTICYmIFBDSQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gRWljb24gTmV0d29ya3MgRElWQSBTZXJ2ZXIgUENJIElTRE4gY2FyZC4KIAkgIEluIG9yZGVyIHRvIHVzZSB0aGlzIGNhcmQsIGFkZGl0aW9uYWwgZmlybXdhcmUgaXMgbmVjZXNzYXJ5LCB3aGljaAogCSAgaGFzIHRvIGJlIGRvd25sb2FkZWQgaW50byB0aGUgY2FyZCB1c2luZyB0aGUgZGl2YWN0cmwgdXRpbGl0eS4KIAoraWYgSVNETl9ESVZBUworCiBjb25maWcgSVNETl9ESVZBU19CUklQQ0kKIAlib29sICJESVZBIFNlcnZlciBCUkkvUENJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0RJVkFTCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERJVkEgU2VydmVyIEJSSS1QQ0kuCiAKIGNvbmZpZyBJU0ROX0RJVkFTX1BSSVBDSQogCWJvb2wgIkRJVkEgU2VydmVyIFBSSS9QQ0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fRElWQVMKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgRElWQSBTZXJ2ZXIgUFJJLVBDSS4KIAogY29uZmlnIElTRE5fRElWQVNfRElWQUNBUEkKIAl0cmlzdGF0ZSAiRElWQSBDQVBJMi4wIGludGVyZmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9ESVZBUyAmJiBJU0ROX0NBUEkKIAloZWxwCiAJICBZb3UgbmVlZCB0aGlzIHRvIHByb3ZpZGUgdGhlIENBUEkgaW50ZXJmYWNlCiAJICBmb3IgRElWQSBTZXJ2ZXIgY2FyZHMuCiAKIGNvbmZpZyBJU0ROX0RJVkFTX1VTRVJJREkKIAl0cmlzdGF0ZSAiRElWQSBVc2VyLUlESSBpbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fRElWQVMKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdXNlci1tb2RlIElESSBpbnRlcmZhY2UuCiAKIGNvbmZpZyBJU0ROX0RJVkFTX01BSU5UCiAJdHJpc3RhdGUgIkRJVkEgTWFpbnQgZHJpdmVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0RJVkFTICYmIG0KKwlkZXBlbmRzIG9uIG0KIAloZWxwCiAJICBFbmFibGUgRGl2YXMgTWFpbnRlbmFuY2UgZHJpdmVyLgogCi1lbmRtZW51CitlbmRpZiAjIElTRE5fRElWQVMKIAorZW5kaWYgIyBDQVBJX0VJQ09OCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaWRpZnVuYy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2lkaWZ1bmMuYwppbmRleCA0Y2JjNjhjLi5kYjg3ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaWRpZnVuYy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pZGlmdW5jLmMKQEAgLTEwNiw2ICsxMDYsNyBAQAogCX0gZWxzZSB7CiAJCURCR19FUlIoKCJjb3VsZCBub3QgY3JlYXRlIHVzZXIgbW9kZSBpZGkgY2FyZCAlZCIsCiAJCQkgYWRhcHRlcl9ucikpOworCQlkaXZhX29zX2ZyZWUoMCwgY2FyZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKaW5kZXggOGQ1M2E3Zi4uYTQzMTYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYwpAQCAtMzYxLDExICszNjEsMTEgQEAKIAogaW50IG5yY2FyZHM7CiAKLWV4dGVybiBjaGFyICpsMV9yZXZpc2lvbjsKLWV4dGVybiBjaGFyICpsMl9yZXZpc2lvbjsKLWV4dGVybiBjaGFyICpsM19yZXZpc2lvbjsKLWV4dGVybiBjaGFyICpsbGlfcmV2aXNpb247Ci1leHRlcm4gY2hhciAqdGVpX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmwxX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmwyX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmwzX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmxsaV9yZXZpc2lvbjsKK2V4dGVybiBjb25zdCBjaGFyICp0ZWlfcmV2aXNpb247CiAKIGNoYXIgKkhpU2F4X2dldHJldihjb25zdCBjaGFyICpyZXZpc2lvbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYwppbmRleCAwMzBkMTYyLi5hZDA2ZjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jCkBAIC00NTEsNiArNDUxLDkgQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4oMCk7CiAJCWNhc2UgQ0FSRF9SRUxFQVNFOgorCQkJaWYgKGNzLT5ody5zZWRsLmJ1cyA9PSBTRURMX0JVU19QQ0kpCisJCQkJLyogZGlzYWJsZSBhbGwgSVJRICovCisJCQkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnKyA1LCAwKTsKIAkJCWlmIChjcy0+aHcuc2VkbC5jaGlwID09IFNFRExfQ0hJUF9JU0FDX0lTQVIpIHsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKIAkJCQl3cml0ZXJlZyhjcy0+aHcuc2VkbC5hZHIsIGNzLT5ody5zZWRsLmhzY3gsCkBAIC00NjgsNiArNDcxLDkgQEAKIAkJCXJldHVybigwKTsKIAkJY2FzZSBDQVJEX0lOSVQ6CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChjcy0+aHcuc2VkbC5idXMgPT0gU0VETF9CVVNfUENJKQorCQkJCS8qIGVuYWJsZSBhbGwgSVJRICovCisJCQkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnKyA1LCAweDAyKTsKIAkJCXJlc2V0X3NlZGxiYXVlcihjcyk7CiAJCQlpZiAoY3MtPmh3LnNlZGwuY2hpcCA9PSBTRURMX0NISVBfSVNBQ19JU0FSKSB7CiAJCQkJY2xlYXJfcGVuZGluZ19pc2FjX2ludHMoY3MpOwpAQCAtNjY3LDcgKzY3Myw3IEBACiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZywgMHhmZik7CiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZywgMHgwMCk7CiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgMiwgMHhkZCk7Ci0JCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgNSwgMHgwMik7CisJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgNSwgMCk7IC8qIGRpc2FibGUgYWxsIElSUSAqLwogCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcgKzMsIGNzLT5ody5zZWRsLnJlc2V0X29uKTsKIAkJbWRlbGF5KDIpOwogCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcgKzMsIGNzLT5ody5zZWRsLnJlc2V0X29mZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcKaW5kZXggM2VmNTY3Yi4uZTkxYzE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvS2NvbmZpZwpAQCAtODYsNyArODYsNiBAQAogCiAKIG1lbnUgIklTRE4gZmVhdHVyZSBzdWJtb2R1bGVzIgotCWRlcGVuZHMgb24gSVNETgogCiBjb25maWcgSVNETl9EUlZfTE9PUAogCXRyaXN0YXRlICJpc2RubG9vcCBzdXBwb3J0IgpAQCAtMTAwLDcgKzk5LDcgQEAKIAogY29uZmlnIElTRE5fRElWRVJTSU9OCiAJdHJpc3RhdGUgIlN1cHBvcnQgaXNkbiBkaXZlcnNpb24gc2VydmljZXMiCi0JZGVwZW5kcyBvbiBJU0ROICYmIElTRE5fSTRMCisJZGVwZW5kcyBvbiBJU0ROX0k0TAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gdXNlIHNvbWUgc3VwcGxlbWVudGFyeSBkaXZlcnNpb24KIAkgIHNlcnZpY2VzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEhpU2F4IGRyaXZlciBvbiBhbiBFVVJPL0RTUzEKQEAgLTEyMCwxMyArMTE5LDEzIEBACiBlbmRtZW51CiAKIGNvbW1lbnQgIklTRE40TGludXggaGFyZHdhcmUgZHJpdmVycyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fSTRMCisJZGVwZW5kcyBvbiBJU0ROX0k0TAogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9oaXNheC9LY29uZmlnIgogCiAKIG1lbnUgIkFjdGl2ZSBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fSTRMIT1uCisJZGVwZW5kcyBvbiBJU0ROX0k0TCE9bgogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9pY24vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMgYi9kcml2ZXJzL21hY2ludG9zaC9hZGIuYwppbmRleCBhZGZlYTNjLi5iYzc3YzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9hZGIuYwpAQCAtMjQ4LDIxICsyNDgsMTUgQEAKIHN0YXRpYyBpbnQKIGFkYl9wcm9iZV90YXNrKHZvaWQgKngpCiB7Ci0Jc2lnc2V0X3QgYmxvY2tlZDsKLQogCXN0cmNweShjdXJyZW50LT5jb21tLCAia2FkYnByb2JlIik7CiAKLQlzaWdmaWxsc2V0KCZibG9ja2VkKTsKLQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZibG9ja2VkLCBOVUxMKTsKLQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiYWRiOiBzdGFydGluZyBwcm9iZSB0YXNrLi4uXG4iKTsKIAlkb19hZGJfcmVzZXRfYnVzKCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiYWRiOiBmaW5pc2hlZCBwcm9iZSB0YXNrLi4uXG4iKTsKLQkKKwogCWFkYl9wcm9iZV90YXNrX3BpZCA9IDA7CiAJdXAoJmFkYl9wcm9iZV9tdXRleCk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCmluZGV4IGJkNTVlNmEuLmYyNTY4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKQEAgLTMzNSw2ICszMzUsNyBAQAogewogCXN0cnVjdCB0aGVybW9zdGF0KiB0aCA9IGFyZzsKIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXRyeV90b19mcmVlemUoKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMjAwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9jb3JlLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9jb3JlLmMKaW5kZXggNGZjYjI0NS4uZTE4ZDI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fY29yZS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2NvcmUuYwpAQCAtOTIsNiArOTIsNyBAQAogCiAJREJHKCJ3ZjogdGhyZWFkIHN0YXJ0ZWRcbiIpOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbmV4dCkpIHsKIAkJCXdmX25vdGlmeShXRl9FVkVOVF9USUNLLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvS2NvbmZpZyBiL2RyaXZlcnMvbWQvS2NvbmZpZwppbmRleCA2NGJmM2E4Li41MzFkNGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL0tjb25maWcKKysrIGIvZHJpdmVycy9tZC9LY29uZmlnCkBAIC0yLDE5ICsyLDE3IEBACiAjIEJsb2NrIGRldmljZSBkcml2ZXIgY29uZmlndXJhdGlvbgogIwogCi1pZiBCTE9DSwotCi1tZW51ICJNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKSIKLQotY29uZmlnIE1ECittZW51Y29uZmlnIE1ECiAJYm9vbCAiTXVsdGlwbGUgZGV2aWNlcyBkcml2ZXIgc3VwcG9ydCAoUkFJRCBhbmQgTFZNKSIKKwlkZXBlbmRzIG9uIEJMT0NLCiAJaGVscAogCSAgU3VwcG9ydCBtdWx0aXBsZSBwaHlzaWNhbCBzcGluZGxlcyB0aHJvdWdoIGEgc2luZ2xlIGxvZ2ljYWwgZGV2aWNlLgogCSAgUmVxdWlyZWQgZm9yIFJBSUQgYW5kIGxvZ2ljYWwgdm9sdW1lIG1hbmFnZW1lbnQuCiAKK2lmIE1ECisKIGNvbmZpZyBCTEtfREVWX01ECiAJdHJpc3RhdGUgIlJBSUQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1ECiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgbGV0cyB5b3UgY29tYmluZSBzZXZlcmFsIGhhcmQgZGlzayBwYXJ0aXRpb25zIGludG8gb25lCiAJICBsb2dpY2FsIGJsb2NrIGRldmljZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBzaW1wbHkgYXBwZW5kIG9uZQpAQCAtMTkxLDcgKzE4OSw2IEBACiAKIGNvbmZpZyBCTEtfREVWX0RNCiAJdHJpc3RhdGUgIkRldmljZSBtYXBwZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1ECiAJLS0taGVscC0tLQogCSAgRGV2aWNlLW1hcHBlciBpcyBhIGxvdyBsZXZlbCB2b2x1bWUgbWFuYWdlci4gIEl0IHdvcmtzIGJ5IGFsbG93aW5nCiAJICBwZW9wbGUgdG8gc3BlY2lmeSBtYXBwaW5ncyBmb3IgcmFuZ2VzIG9mIGxvZ2ljYWwgc2VjdG9ycy4gIFZhcmlvdXMKQEAgLTI3OSw2ICsyNzYsNCBAQAogCiAJSWYgdW5zdXJlLCBzYXkgTi4KIAotZW5kbWVudQotCi1lbmRpZgorZW5kaWYgIyBNRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggOTYyMGQ0NS4uOTI3Y2IzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0yNjgsNiArMjY4LDMxIEBACiAJCQlpZiAocGFnZS0+aW5kZXggPT0gYml0bWFwLT5maWxlX3BhZ2VzLTEpCiAJCQkJc2l6ZSA9IHJvdW5kdXAoYml0bWFwLT5sYXN0X3BhZ2Vfc2l6ZSwKIAkJCQkJICAgICAgIGJkZXZfaGFyZHNlY3Rfc2l6ZShyZGV2LT5iZGV2KSk7CisJCQkvKiBKdXN0IG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgY29ycnVwdGluZyBkYXRhIG9yCisJCQkgKiBtZXRhZGF0YQorCQkJICovCisJCQlpZiAoYml0bWFwLT5vZmZzZXQgPCAwKSB7CisJCQkJLyogREFUQSAgQklUTUFQIE1FVEFEQVRBICAqLworCQkJCWlmIChiaXRtYXAtPm9mZnNldAorCQkJCSAgICArIHBhZ2UtPmluZGV4ICogKFBBR0VfU0laRS81MTIpCisJCQkJICAgICsgc2l6ZS81MTIgPiAwKQorCQkJCQkvKiBiaXRtYXAgcnVucyBpbiB0byBtZXRhZGF0YSAqLworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAocmRldi0+ZGF0YV9vZmZzZXQgKyBtZGRldi0+c2l6ZSoyCisJCQkJICAgID4gcmRldi0+c2Jfb2Zmc2V0KjIgKyBiaXRtYXAtPm9mZnNldCkKKwkJCQkJLyogZGF0YSBydW5zIGluIHRvIGJpdG1hcCAqLworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSBpZiAocmRldi0+c2Jfb2Zmc2V0KjIgPCByZGV2LT5kYXRhX29mZnNldCkgeworCQkJCS8qIE1FVEFEQVRBIEJJVE1BUCBEQVRBICovCisJCQkJaWYgKHJkZXYtPnNiX29mZnNldCoyCisJCQkJICAgICsgYml0bWFwLT5vZmZzZXQKKwkJCQkgICAgKyBwYWdlLT5pbmRleCooUEFHRV9TSVpFLzUxMikgKyBzaXplLzUxMgorCQkJCSAgICA+IHJkZXYtPmRhdGFfb2Zmc2V0KQorCQkJCQkvKiBiaXRtYXAgcnVucyBpbiB0byBkYXRhICovCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEQVRBIE1FVEFEQVRBIEJJVE1BUCAtIG5vIHByb2JsZW1zICovCisJCQl9CiAJCQltZF9zdXBlcl93cml0ZShtZGRldiwgcmRldiwKIAkJCQkgICAgICAgKHJkZXYtPnNiX29mZnNldDw8MSkgKyBiaXRtYXAtPm9mZnNldAogCQkJCSAgICAgICArIHBhZ2UtPmluZGV4ICogKFBBR0VfU0laRS81MTIpLApAQCAtMjgwLDMyICszMDUsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYml0bWFwX2ZpbGVfa2ljayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogLyoKICAqIHdyaXRlIG91dCBhIHBhZ2UgdG8gYSBmaWxlCiAgKi8KLXN0YXRpYyBpbnQgd3JpdGVfcGFnZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd2FpdCkKK3N0YXRpYyB2b2lkIHdyaXRlX3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHdhaXQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAotCWlmIChiaXRtYXAtPmZpbGUgPT0gTlVMTCkKLQkJcmV0dXJuIHdyaXRlX3NiX3BhZ2UoYml0bWFwLCBwYWdlLCB3YWl0KTsKKwlpZiAoYml0bWFwLT5maWxlID09IE5VTEwpIHsKKwkJc3dpdGNoICh3cml0ZV9zYl9wYWdlKGJpdG1hcCwgcGFnZSwgd2FpdCkpIHsKKwkJY2FzZSAtRUlOVkFMOgorCQkJYml0bWFwLT5mbGFncyB8PSBCSVRNQVBfV1JJVEVfRVJST1I7CisJCX0KKwl9IGVsc2UgewogCi0JYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCi0Jd2hpbGUgKGJoICYmIGJoLT5iX2Jsb2NrbnIpIHsKLQkJYXRvbWljX2luYygmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk7Ci0JCXNldF9idWZmZXJfbG9ja2VkKGJoKTsKLQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOwotCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKLQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCXdoaWxlIChiaCAmJiBiaC0+Yl9ibG9ja25yKSB7CisJCQlhdG9taWNfaW5jKCZiaXRtYXAtPnBlbmRpbmdfd3JpdGVzKTsKKwkJCXNldF9idWZmZXJfbG9ja2VkKGJoKTsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCXN1Ym1pdF9iaChXUklURSwgYmgpOworCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCX0KKworCQlpZiAod2FpdCkgeworCQkJd2FpdF9ldmVudChiaXRtYXAtPndyaXRlX3dhaXQsCisJCQkJICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpPT0wKTsKKwkJfQogCX0KLQotCWlmICh3YWl0KSB7Ci0JCXdhaXRfZXZlbnQoYml0bWFwLT53cml0ZV93YWl0LAotCQkJICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpPT0wKTsKLQkJcmV0dXJuIChiaXRtYXAtPmZsYWdzICYgQklUTUFQX1dSSVRFX0VSUk9SKSA/IC1FSU8gOiAwOwotCX0KLQlyZXR1cm4gMDsKKwlpZiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikKKwkJYml0bWFwX2ZpbGVfa2ljayhiaXRtYXApOwogfQogCiBzdGF0aWMgdm9pZCBlbmRfYml0bWFwX3dyaXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKQEAgLTQyNSwxNyArNDU2LDE3IEBACiAgKi8KIAogLyogdXBkYXRlIHRoZSBldmVudCBjb3VudGVyIGFuZCBzeW5jIHRoZSBzdXBlcmJsb2NrIHRvIGRpc2sgKi8KLWludCBiaXRtYXBfdXBkYXRlX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3ZvaWQgYml0bWFwX3VwZGF0ZV9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApCiB7CiAJYml0bWFwX3N1cGVyX3QgKnNiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIWJpdG1hcCB8fCAhYml0bWFwLT5tZGRldikgLyogbm8gYml0bWFwIGZvciB0aGlzIGFycmF5ICovCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCWlmICghYml0bWFwLT5zYl9wYWdlKSB7IC8qIG5vIHN1cGVyYmxvY2sgKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCXNiID0gKGJpdG1hcF9zdXBlcl90ICopa21hcF9hdG9taWMoYml0bWFwLT5zYl9wYWdlLCBLTV9VU0VSMCk7CkBAIC00NDMsNyArNDc0LDcgQEAKIAlpZiAoIWJpdG1hcC0+bWRkZXYtPmRlZ3JhZGVkKQogCQlzYi0+ZXZlbnRzX2NsZWFyZWQgPSBjcHVfdG9fbGU2NChiaXRtYXAtPm1kZGV2LT5ldmVudHMpOwogCWt1bm1hcF9hdG9taWMoc2IsIEtNX1VTRVIwKTsKLQlyZXR1cm4gd3JpdGVfcGFnZShiaXRtYXAsIGJpdG1hcC0+c2JfcGFnZSwgMSk7CisJd3JpdGVfcGFnZShiaXRtYXAsIGJpdG1hcC0+c2JfcGFnZSwgMSk7CiB9CiAKIC8qIHByaW50IG91dCB0aGUgYml0bWFwIGZpbGUgc3VwZXJibG9jayAqLwpAQCAtNTcyLDIwICs2MDMsMjIgQEAKIAlNQVNLX1VOU0VUCiB9OwogCi0vKiByZWNvcmQgdGhlIHN0YXRlIG9mIHRoZSBiaXRtYXAgaW4gdGhlIHN1cGVyYmxvY2sgKi8KLXN0YXRpYyB2b2lkIGJpdG1hcF9tYXNrX3N0YXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgZW51bSBiaXRtYXBfc3RhdGUgYml0cywKLQkJCQllbnVtIGJpdG1hcF9tYXNrX29wIG9wKQorLyogcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgYml0bWFwIGluIHRoZSBzdXBlcmJsb2NrLiAgUmV0dXJuIHRoZSBvbGQgdmFsdWUgKi8KK3N0YXRpYyBpbnQgYml0bWFwX21hc2tfc3RhdGUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBlbnVtIGJpdG1hcF9zdGF0ZSBiaXRzLAorCQkJICAgICBlbnVtIGJpdG1hcF9tYXNrX29wIG9wKQogewogCWJpdG1hcF9zdXBlcl90ICpzYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvbGQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFiaXRtYXAtPnNiX3BhZ2UpIHsgLyogY2FuJ3Qgc2V0IHRoZSBzdGF0ZSAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJc2IgPSAoYml0bWFwX3N1cGVyX3QgKilrbWFwX2F0b21pYyhiaXRtYXAtPnNiX3BhZ2UsIEtNX1VTRVIwKTsKKwlvbGQgPSBsZTMyX3RvX2NwdShzYi0+c3RhdGUpICYgYml0czsKIAlzd2l0Y2ggKG9wKSB7CiAJCWNhc2UgTUFTS19TRVQ6IHNiLT5zdGF0ZSB8PSBjcHVfdG9fbGUzMihiaXRzKTsKIAkJCQlicmVhazsKQEAgLTU5NCw2ICs2MjcsNyBAQAogCQlkZWZhdWx0OiBCVUcoKTsKIAl9CiAJa3VubWFwX2F0b21pYyhzYiwgS01fVVNFUjApOworCXJldHVybiBvbGQ7CiB9CiAKIC8qCkBAIC02ODcsMTggKzcyMSwyMyBAQAogewogCWNoYXIgKnBhdGgsICpwdHIgPSBOVUxMOwogCi0JYml0bWFwX21hc2tfc3RhdGUoYml0bWFwLCBCSVRNQVBfU1RBTEUsIE1BU0tfU0VUKTsKLQliaXRtYXBfdXBkYXRlX3NiKGJpdG1hcCk7CisJaWYgKGJpdG1hcF9tYXNrX3N0YXRlKGJpdG1hcCwgQklUTUFQX1NUQUxFLCBNQVNLX1NFVCkgPT0gMCkgeworCQliaXRtYXBfdXBkYXRlX3NiKGJpdG1hcCk7CiAKLQlpZiAoYml0bWFwLT5maWxlKSB7Ci0JCXBhdGggPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwYXRoKQotCQkJcHRyID0gZmlsZV9wYXRoKGJpdG1hcC0+ZmlsZSwgcGF0aCwgUEFHRV9TSVpFKTsKKwkJaWYgKGJpdG1hcC0+ZmlsZSkgeworCQkJcGF0aCA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChwYXRoKQorCQkJCXB0ciA9IGZpbGVfcGF0aChiaXRtYXAtPmZpbGUsIHBhdGgsIFBBR0VfU0laRSk7CiAKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBraWNraW5nIGZhaWxlZCBiaXRtYXAgZmlsZSAlcyBmcm9tIGFycmF5IVxuIiwKLQkJICAgICAgIGJtbmFtZShiaXRtYXApLCBwdHIgPyBwdHIgOiAiIik7CisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJICAgICAgIiVzOiBraWNraW5nIGZhaWxlZCBiaXRtYXAgZmlsZSAlcyBmcm9tIGFycmF5IVxuIiwKKwkJCSAgICAgIGJtbmFtZShiaXRtYXApLCBwdHIgPyBwdHIgOiAiIik7CiAKLQkJa2ZyZWUocGF0aCk7CisJCQlrZnJlZShwYXRoKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJICAgICAgICIlczogZGlzYWJsaW5nIGludGVybmFsIGJpdG1hcCBkdWUgdG8gZXJyb3JzXG4iLAorCQkJICAgICAgIGJtbmFtZShiaXRtYXApKTsKIAl9CiAKIAliaXRtYXBfZmlsZV9wdXQoYml0bWFwKTsKQEAgLTc2OSwxNiArODA4LDE1IEBACiAvKiB0aGlzIGdldHMgY2FsbGVkIHdoZW4gdGhlIG1kIGRldmljZSBpcyByZWFkeSB0byB1bnBsdWcgaXRzIHVuZGVybHlpbmcKICAqIChzbGF2ZSkgZGV2aWNlIHF1ZXVlcyAtLSBiZWZvcmUgd2UgbGV0IGFueSB3cml0ZXMgZ28gZG93biwgd2UgbmVlZCB0bwogICogc3luYyB0aGUgZGlydHkgcGFnZXMgb2YgdGhlIGJpdG1hcCBmaWxlIHRvIGRpc2sgKi8KLWludCBiaXRtYXBfdW5wbHVnKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3ZvaWQgYml0bWFwX3VucGx1ZyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApCiB7CiAJdW5zaWduZWQgbG9uZyBpLCBmbGFnczsKIAlpbnQgZGlydHksIG5lZWRfd3JpdGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IHdhaXQgPSAwOwotCWludCBlcnI7CiAKIAlpZiAoIWJpdG1hcCkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCS8qIGxvb2sgYXQgZWFjaCBwYWdlIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNldCBiaXRzIHRoYXQgbmVlZCB0byBiZQogCSAqIGZsdXNoZWQgb3V0IHRvIGRpc2sgKi8KQEAgLTc4Niw3ICs4MjQsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJCWlmICghYml0bWFwLT5maWxlbWFwKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuOwogCQl9CiAJCXBhZ2UgPSBiaXRtYXAtPmZpbGVtYXBbaV07CiAJCWRpcnR5ID0gdGVzdF9wYWdlX2F0dHIoYml0bWFwLCBwYWdlLCBCSVRNQVBfUEFHRV9ESVJUWSk7CkBAIC03OTgsNyArODM2LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAKIAkJaWYgKGRpcnR5IHwgbmVlZF93cml0ZSkKLQkJCWVyciA9IHdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKTsKKwkJCXdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKTsKIAl9CiAJaWYgKHdhaXQpIHsgLyogaWYgYW55IHdyaXRlcyB3ZXJlIHBlcmZvcm1lZCwgd2UgbmVlZCB0byB3YWl0IG9uIHRoZW0gKi8KIAkJaWYgKGJpdG1hcC0+ZmlsZSkKQEAgLTgwOSw3ICs4NDcsNiBAQAogCX0KIAlpZiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikKIAkJYml0bWFwX2ZpbGVfa2ljayhiaXRtYXApOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBiaXRtYXBfc2V0X21lbW9yeV9iaXRzKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgbmVlZGVkKTsKQEAgLTg1OCwyMSArODk1LDIxIEBACiAJCQlibW5hbWUoYml0bWFwKSwKIAkJCSh1bnNpZ25lZCBsb25nKSBpX3NpemVfcmVhZChmaWxlLT5mX21hcHBpbmctPmhvc3QpLAogCQkJYnl0ZXMgKyBzaXplb2YoYml0bWFwX3N1cGVyX3QpKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IC1FTk9NRU07CiAKIAliaXRtYXAtPmZpbGVtYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG51bV9wYWdlcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiaXRtYXAtPmZpbGVtYXApCi0JCWdvdG8gb3V0OworCQlnb3RvIGVycjsKIAogCS8qIFdlIG5lZWQgNCBiaXRzIHBlciBwYWdlLCByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICovCiAJYml0bWFwLT5maWxlbWFwX2F0dHIgPSBremFsbG9jKAogCQlyb3VuZHVwKCBESVZfUk9VTkRfVVAobnVtX3BhZ2VzKjQsIDgpLCBzaXplb2YodW5zaWduZWQgbG9uZykpLAogCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWJpdG1hcC0+ZmlsZW1hcF9hdHRyKQotCQlnb3RvIG91dDsKKwkJZ290byBlcnI7CiAKIAlvbGRpbmRleCA9IH4wTDsKIApAQCAtOTA1LDcgKzk0Miw3IEBACiAJCQl9CiAJCQlpZiAoSVNfRVJSKHBhZ2UpKSB7IC8qIHJlYWQgZXJyb3IgKi8KIAkJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gZXJyOwogCQkJfQogCiAJCQlvbGRpbmRleCA9IGluZGV4OwpAQCAtOTIwLDExICs5NTcsMTMgQEAKIAkJCQltZW1zZXQocGFkZHIgKyBvZmZzZXQsIDB4ZmYsCiAJCQkJICAgICAgIFBBR0VfU0laRSAtIG9mZnNldCk7CiAJCQkJa3VubWFwX2F0b21pYyhwYWRkciwgS01fVVNFUjApOwotCQkJCXJldCA9IHdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAxKTsKLQkJCQlpZiAocmV0KSB7CisJCQkJd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDEpOworCisJCQkJcmV0ID0gLUVJTzsKKwkJCQlpZiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikgewogCQkJCQkvKiByZWxlYXNlLCBwYWdlIG5vdCBpbiBmaWxlbWFwIHlldCAqLwogCQkJCQlwdXRfcGFnZShwYWdlKTsKLQkJCQkJZ290byBvdXQ7CisJCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCX0KIApAQCAtOTU2LDExICs5OTUsMTUgQEAKIAkJbWRfd2FrZXVwX3RocmVhZChiaXRtYXAtPm1kZGV2LT50aHJlYWQpOwogCX0KIAotb3V0OgogCXByaW50ayhLRVJOX0lORk8gIiVzOiBiaXRtYXAgaW5pdGlhbGl6ZWQgZnJvbSBkaXNrOiAiCi0JCSJyZWFkICVsdS8lbHUgcGFnZXMsIHNldCAlbHUgYml0cywgc3RhdHVzOiAlZFxuIiwKLQkJYm1uYW1lKGJpdG1hcCksIGJpdG1hcC0+ZmlsZV9wYWdlcywgbnVtX3BhZ2VzLCBiaXRfY250LCByZXQpOworCQkicmVhZCAlbHUvJWx1IHBhZ2VzLCBzZXQgJWx1IGJpdHNcbiIsCisJCWJtbmFtZShiaXRtYXApLCBiaXRtYXAtPmZpbGVfcGFnZXMsIG51bV9wYWdlcywgYml0X2NudCk7CiAKKwlyZXR1cm4gMDsKKworIGVycjoKKwlwcmludGsoS0VSTl9JTkZPICIlczogYml0bWFwIGluaXRpYWxpc2F0aW9uIGZhaWxlZDogJWRcbiIsCisJICAgICAgIGJtbmFtZShiaXRtYXApLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk5NywxOSArMTA0MCwxOCBAQAogICoJCQlvdXQgdG8gZGlzawogICovCiAKLWludCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKQordm9pZCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewogCXVuc2lnbmVkIGxvbmcgajsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCwgKmxhc3RwYWdlID0gTlVMTDsKLQlpbnQgZXJyID0gMDsKIAlpbnQgYmxvY2tzOwogCXZvaWQgKnBhZGRyOwogCiAJaWYgKGJpdG1hcCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBiaXRtYXAtPmRhZW1vbl9sYXN0cnVuICsgYml0bWFwLT5kYWVtb25fc2xlZXAqSFopKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCWJpdG1hcC0+ZGFlbW9uX2xhc3RydW4gPSBqaWZmaWVzOwogCiAJZm9yIChqID0gMDsgaiA8IGJpdG1hcC0+Y2h1bmtzOyBqKyspIHsKQEAgLTEwMzIsMTQgKzEwNzQsOCBAQAogCQkJCQljbGVhcl9wYWdlX2F0dHIoYml0bWFwLCBwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKG5lZWRfd3JpdGUpIHsKLQkJCQkJc3dpdGNoICh3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMCkpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQliaXRtYXBfZmlsZV9raWNrKGJpdG1hcCk7Ci0JCQkJCX0KLQkJCQl9CisJCQkJaWYgKG5lZWRfd3JpdGUpCisJCQkJCXdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtMTA0OCwxMyArMTA4NCwxMSBAQAogCQkJCWlmICh0ZXN0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpKSB7CiAJCQkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJCQkJZXJyID0gd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKKwkJCQkJd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKIAkJCQl9IGVsc2UgewogCQkJCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQkJCX0KLQkJCQlpZiAoZXJyKQotCQkJCQliaXRtYXBfZmlsZV9raWNrKGJpdG1hcCk7CiAJCQl9IGVsc2UKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJCWxhc3RwYWdlID0gcGFnZTsKQEAgLTEwOTcsMTQgKzExMzEsMTMgQEAKIAkJaWYgKHRlc3RfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSkpIHsKIAkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQllcnIgPSB3cml0ZV9wYWdlKGJpdG1hcCwgbGFzdHBhZ2UsIDApOworCQkJd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKIAkJfSBlbHNlIHsKIAkJCXNldF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQl9CiAJfQogCi0JcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGJpdG1hcF9jb3VudGVyX3QgKmJpdG1hcF9nZXRfY291bnRlcihzdHJ1Y3QgYml0bWFwICpiaXRtYXAsCkBAIC0xNTE3LDcgKzE1NTAsOSBAQAogCiAJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IGJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7CiAKLQlyZXR1cm4gYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOworCWJpdG1hcF91cGRhdGVfc2IoYml0bWFwKTsKKworCXJldHVybiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikgPyAtRUlPIDogMDsKIAogIGVycm9yOgogCWJpdG1hcF9mcmVlKGJpdG1hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggZjRmN2QzNS4uODQ2NjE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMTYxLDkgKzE2MSw3IEBACiB7CiAJa21lbV9jYWNoZV9kZXN0cm95KF90aW9fY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShfaW9fY2FjaGUpOwotCi0JaWYgKHVucmVnaXN0ZXJfYmxrZGV2KF9tYWpvciwgX25hbWUpIDwgMCkKLQkJRE1FUlIoInVucmVnaXN0ZXJfYmxrZGV2IGZhaWxlZCIpOworCXVucmVnaXN0ZXJfYmxrZGV2KF9tYWpvciwgX25hbWUpOwogCiAJX21ham9yID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDMzYmVhYTcuLjY1ZGRjODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTE2NDAsNyArMTY0MCw2IEBACiAKIHN0YXRpYyB2b2lkIG1kX3VwZGF0ZV9zYihtZGRldl90ICogbWRkZXYsIGludCBmb3JjZV9jaGFuZ2UpCiB7Ci0JaW50IGVycjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlpbnQgc3luY19yZXE7CkBAIC0xNzI3LDcgKzE3MjYsNyBAQAogCQkibWQ6IHVwZGF0aW5nICVzIFJBSUQgc3VwZXJibG9jayBvbiBkZXZpY2UgKGluIHN5bmMgJWQpXG4iLAogCQltZG5hbWUobWRkZXYpLG1kZGV2LT5pbl9zeW5jKTsKIAotCWVyciA9IGJpdG1hcF91cGRhdGVfc2IobWRkZXYtPmJpdG1hcCk7CisJYml0bWFwX3VwZGF0ZV9zYihtZGRldi0+Yml0bWFwKTsKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQlkcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICIpOwpAQCAtMjA3Myw5ICsyMDcyLDExIEBACiAJCWVyciA9IHN1cGVyX3R5cGVzW3N1cGVyX2Zvcm1hdF0uCiAJCQlsb2FkX3N1cGVyKHJkZXYsIE5VTEwsIHN1cGVyX21pbm9yKTsKIAkJaWYgKGVyciA9PSAtRUlOVkFMKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCSJtZDogJXMgaGFzIGludmFsaWQgc2IsIG5vdCBpbXBvcnRpbmchXG4iLAotCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYikpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJtZDogJXMgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHYlZC4lZCAiCisJCQkgICAgICAgInN1cGVyYmxvY2ssIG5vdCBpbXBvcnRpbmchXG4iLAorCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksCisJCQkgICAgICAgc3VwZXJfZm9ybWF0LCBzdXBlcl9taW5vcik7CiAJCQlnb3RvIGFib3J0X2ZyZWU7CiAJCX0KIAkJaWYgKGVyciA8IDApIHsKQEAgLTMxNzQsMTMgKzMxNzUsMzMgQEAKIAkgKiBEcm9wIGFsbCBjb250YWluZXIgZGV2aWNlIGJ1ZmZlcnMsIGZyb20gbm93IG9uCiAJICogdGhlIG9ubHkgdmFsaWQgZXh0ZXJuYWwgaW50ZXJmYWNlIGlzIHRocm91Z2ggdGhlIG1kCiAJICogZGV2aWNlLgotCSAqIEFsc28gZmluZCBsYXJnZXN0IGhhcmRzZWN0b3Igc2l6ZQogCSAqLwogCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHRtcCkgewogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAJCXN5bmNfYmxvY2tkZXYocmRldi0+YmRldik7CiAJCWludmFsaWRhdGVfYmRldihyZGV2LT5iZGV2KTsKKworCQkvKiBwZXJmb3JtIHNvbWUgY29uc2lzdGVuY3kgdGVzdHMgb24gdGhlIGRldmljZS4KKwkJICogV2UgZG9uJ3Qgd2FudCB0aGUgZGF0YSB0byBvdmVybGFwIHRoZSBtZXRhZGF0YSwKKwkJICogSW50ZXJuYWwgQml0bWFwIGlzc3VlcyBoYXMgaGFuZGxlZCBlbHNld2hlcmUuCisJCSAqLworCQlpZiAocmRldi0+ZGF0YV9vZmZzZXQgPCByZGV2LT5zYl9vZmZzZXQpIHsKKwkJCWlmIChtZGRldi0+c2l6ZSAmJgorCQkJICAgIHJkZXYtPmRhdGFfb2Zmc2V0ICsgbWRkZXYtPnNpemUqMgorCQkJICAgID4gcmRldi0+c2Jfb2Zmc2V0KjIpIHsKKwkJCQlwcmludGsoIm1kOiAlczogZGF0YSBvdmVybGFwcyBtZXRhZGF0YVxuIiwKKwkJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocmRldi0+c2Jfb2Zmc2V0KjIgKyByZGV2LT5zYl9zaXplLzUxMgorCQkJICAgID4gcmRldi0+ZGF0YV9vZmZzZXQpIHsKKwkJCQlwcmludGsoIm1kOiAlczogbWV0YWRhdGEgb3ZlcmxhcHMgZGF0YVxuIiwKKwkJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KIAl9CiAKIAltZF9wcm9iZShtZGRldi0+dW5pdCwgTlVMTCwgTlVMTCk7CkBAIC00NjQyLDcgKzQ2NjMsNiBAQAogCSAqIG1hbnkgZGlydHkgUkFJRDUgYmxvY2tzLgogCSAqLwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAKQEAgLTUwOTAsNyArNTExMCw3IEBACiAJbWRrX3JkZXZfdCAqIHJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCBpZGxlOwotCXVuc2lnbmVkIGxvbmcgY3Vycl9ldmVudHM7CisJbG9uZyBjdXJyX2V2ZW50czsKIAogCWlkbGUgPSAxOwogCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHRtcCkgewpAQCAtNTA5OCwyMCArNTExOCwyOSBAQAogCQljdXJyX2V2ZW50cyA9IGRpc2tfc3RhdF9yZWFkKGRpc2ssIHNlY3RvcnNbMF0pICsgCiAJCQkJZGlza19zdGF0X3JlYWQoZGlzaywgc2VjdG9yc1sxXSkgLSAKIAkJCQlhdG9taWNfcmVhZCgmZGlzay0+c3luY19pbyk7Ci0JCS8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3Vycl9ldmVudHMgYW5kIGxhc3RfZXZlbnRzCi0JCSAqIHdpbGwgYmUgYWZmZWN0ZWQgYnkgYW55IG5ldyBub24tc3luYyBJTyAobWFraW5nCi0JCSAqIGN1cnJfZXZlbnRzIGJpZ2dlcikgYW5kIGFueSBkaWZmZXJlbmNlIGluIHRoZSBhbW91bnQgb2YKLQkJICogaW4tZmxpZ2h0IHN5bmNpbyAobWFraW5nIGN1cnJlbnRfZXZlbnRzIGJpZ2dlciBvciBzbWFsbGVyKQotCQkgKiBUaGUgYW1vdW50IGluLWZsaWdodCBpcyBjdXJyZW50bHkgbGltaXRlZCB0bwotCQkgKiAzMio2NEsgaW4gcmFpZDEvMTAgYW5kIDI1NipQQUdFX1NJWkUgaW4gcmFpZDUvNgotCQkgKiB3aGljaCBpcyBhdCBtb3N0IDQwOTYgc2VjdG9ycy4KLQkJICogVGhlc2UgbnVtYmVycyBhcmUgZmFpcmx5IGZyYWdpbGUgYW5kIHNob3VsZCBiZSBtYWRlCi0JCSAqIG1vcmUgcm9idXN0LCBwcm9iYWJseSBieSBlbmZvcmNpbmcgdGhlCi0JCSAqICd3aW5kb3cgc2l6ZScgdGhhdCBtZF9kb19zeW5jIHNvcnQtb2YgdXNlcy4KKwkJLyogc3luYyBJTyB3aWxsIGNhdXNlIHN5bmNfaW8gdG8gaW5jcmVhc2UgYmVmb3JlIHRoZSBkaXNrX3N0YXRzCisJCSAqIGFzIHN5bmNfaW8gaXMgY291bnRlZCB3aGVuIGEgcmVxdWVzdCBzdGFydHMsIGFuZAorCQkgKiBkaXNrX3N0YXRzIGlzIGNvdW50ZWQgd2hlbiBpdCBjb21wbGV0ZXMuCisJCSAqIFNvIHJlc3luYyBhY3Rpdml0eSB3aWxsIGNhdXNlIGN1cnJfZXZlbnRzIHRvIGJlIHNtYWxsZXIgdGhhbgorCQkgKiB3aGVuIHRoZXJlIHdhcyBubyBzdWNoIGFjdGl2aXR5LgorCQkgKiBub24tc3luYyBJTyB3aWxsIGNhdXNlIGRpc2tfc3RhdCB0byBpbmNyZWFzZSB3aXRob3V0CisJCSAqIGluY3JlYXNpbmcgc3luY19pbyBzbyBjdXJyX2V2ZW50cyB3aWxsIChldmVudHVhbGx5KQorCQkgKiBiZSBsYXJnZXIgdGhhbiBpdCB3YXMgYmVmb3JlLiAgT25jZSBpdCBiZWNvbWVzCisJCSAqIHN1YnN0YW50aWFsbHkgbGFyZ2VyLCB0aGUgdGVzdCBiZWxvdyB3aWxsIGNhdXNlCisJCSAqIHRoZSBhcnJheSB0byBhcHBlYXIgbm9uLWlkbGUsIGFuZCByZXN5bmMgd2lsbCBzbG93CisJCSAqIGRvd24uCisJCSAqIElmIHRoZXJlIGlzIGEgbG90IG9mIG91dHN0YW5kaW5nIHJlc3luYyBhY3Rpdml0eSB3aGVuCisJCSAqIHdlIHNldCBsYXN0X2V2ZW50IHRvIGN1cnJfZXZlbnRzLCB0aGVuIGFsbCB0aGF0IGFjdGl2aXR5CisJCSAqIGNvbXBsZXRpbmcgbWlnaHQgY2F1c2UgdGhlIGFycmF5IHRvIGFwcGVhciBub24taWRsZQorCQkgKiBhbmQgcmVzeW5jIHdpbGwgYmUgc2xvd2VkIGRvd24gZXZlbiB0aG91Z2ggdGhlcmUgbWlnaHQKKwkJICogbm90IGhhdmUgYmVlbiBub24tcmVzeW5jIGFjdGl2aXR5LiAgVGhpcyB3aWxsIG9ubHkKKwkJICogaGFwcGVuIG9uY2UgdGhvdWdoLiAgJ2xhc3RfZXZlbnRzJyB3aWxsIHNvb24gcmVmbGVjdAorCQkgKiB0aGUgc3RhdGUgd2hlcmUgdGhlcmUgaXMgbGl0dGxlIG9yIG5vIG91dHN0YW5kaW5nCisJCSAqIHJlc3luYyByZXF1ZXN0cywgYW5kIGZ1cnRoZXIgcmVzeW5jIGFjdGl2aXR5IHdpbGwKKwkJICogYWx3YXlzIG1ha2UgY3Vycl9ldmVudHMgbGVzcyB0aGFuIGxhc3RfZXZlbnRzLgogCQkgKgotCQkgKiBOb3RlOiB0aGUgZm9sbG93aW5nIGlzIGFuIHVuc2lnbmVkIGNvbXBhcmlzb24uCiAJCSAqLwotCQlpZiAoKGxvbmcpY3Vycl9ldmVudHMgLSAobG9uZylyZGV2LT5sYXN0X2V2ZW50cyA+IDQwOTYpIHsKKwkJaWYgKGN1cnJfZXZlbnRzIC0gcmRldi0+bGFzdF9ldmVudHMgPiA0MDk2KSB7CiAJCQlyZGV2LT5sYXN0X2V2ZW50cyA9IGN1cnJfZXZlbnRzOwogCQkJaWRsZSA9IDA7CiAJCX0KQEAgLTU3NzIsNyArNTgwMSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGRldl9jbnQ7IGkrKykgewogCQlkZXZfdCBkZXYgPSBkZXRlY3RlZF9kZXZpY2VzW2ldOwogCi0JCXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlKGRldiwwLCAwKTsKKwkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LDAsIDkwKTsKIAkJaWYgKElTX0VSUihyZGV2KSkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggNDY2NzdkNy4uMDBjNzhiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTUyNiw4ICsxNTI2LDcgQEAKIAkJCWJsa19yZW1vdmVfcGx1ZyhtZGRldi0+cXVldWUpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAkJCS8qIGZsdXNoIGFueSBwZW5kaW5nIGJpdG1hcCB3cml0ZXMgdG8gZGlzayBiZWZvcmUgcHJvY2VlZGluZyB3LyBJL08gKi8KLQkJCWlmIChiaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApICE9IDApCi0JCQkJcHJpbnRrKCIlczogYml0bWFwIGZpbGUgd3JpdGUgZmFpbGVkIVxuIiwgbWRuYW1lKG1kZGV2KSk7CisJCQliaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApOwogCiAJCQl3aGlsZSAoYmlvKSB7IC8qIHN1Ym1pdCBwZW5kaW5nIHdyaXRlcyAqLwogCQkJCXN0cnVjdCBiaW8gKm5leHQgPSBiaW8tPmJpX25leHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxMC5jIGIvZHJpdmVycy9tZC9yYWlkMTAuYwppbmRleCA5ZWI2NmMxLi5hOTVhZGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKQEAgLTE1MTAsOCArMTUxMCw3IEBACiAJCQlibGtfcmVtb3ZlX3BsdWcobWRkZXYtPnF1ZXVlKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJCQkvKiBmbHVzaCBhbnkgcGVuZGluZyBiaXRtYXAgd3JpdGVzIHRvIGRpc2sgYmVmb3JlIHByb2NlZWRpbmcgdy8gSS9PICovCi0JCQlpZiAoYml0bWFwX3VucGx1ZyhtZGRldi0+Yml0bWFwKSAhPSAwKQotCQkJCXByaW50aygiJXM6IGJpdG1hcCBmaWxlIHdyaXRlIGZhaWxlZCFcbiIsIG1kbmFtZShtZGRldikpOworCQkJYml0bWFwX3VucGx1ZyhtZGRldi0+Yml0bWFwKTsKIAogCQkJd2hpbGUgKGJpbykgeyAvKiBzdWJtaXQgcGVuZGluZyB3cml0ZXMgKi8KIAkJCQlzdHJ1Y3QgYmlvICpuZXh0ID0gYmlvLT5iaV9uZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwppbmRleCBmNGU0Y2EyLi5iNmM3ZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwpAQCAtNTIzLDYgKzUyMyw3IEBACiAKIAlkdmJfZnJvbnRlbmRfaW5pdChmZSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKDEpIHsKIAkJdXAoJmZlcHJpdi0+c2VtKTsJICAgIC8qIGlzIGxvY2tlZCB3aGVuIHdlIGVudGVyIHRoZSB0aHJlYWQuLi4gKi8KIHJlc3RhcnQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggMjU5ZWEwOC4uMWNjMmQyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtOTA2LDYgKzkwNiw3IEBACiAJdTMyIG1vZGUgPSAwOwogCiAJZHByaW50aygiY3g4ODogdHZhdWRpbyB0aHJlYWQgc3RhcnRlZFxuIik7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCmluZGV4IGUxODIxZWIuLmQ1ZWUyNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CkBAIC00NjgsNiArNDY5LDcgQEAKIAogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MDAgZGFlbW9uIHN0YXJ0ZWRcbiIpOworCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNDAwIHRocmVhZDogc2xlZXBcbiIpOwogCQltc3Bfc2xlZXAoc3RhdGUsIC0xKTsKQEAgLTY0Niw3ICs2NDgsNyBAQAogCWludCB2YWwsIGksIHN0ZCwgY291bnQ7CiAKIAl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCBkYWVtb24gc3RhcnRlZFxuIik7Ci0KKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCB0aHJlYWQ6IHNsZWVwXG4iKTsKIAkJbXNwX3NsZWVwKHN0YXRlLC0xKTsKQEAgLTk0MCw3ICs5NDIsNyBAQAogCWludCB2YWwsIGk7CiAKIAl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzR4eGcgZGFlbW9uIHN0YXJ0ZWRcbiIpOwotCisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0eHhnIHRocmVhZDogc2xlZXBcbiIpOwogCQltc3Bfc2xlZXAoc3RhdGUsIC0xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggYzliZjlkYi4uOWRhMzM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCXN0cnVjdCBDSElQREVTQyAgKmRlc2MgPSBjaGlwbGlzdCArIGNoaXAtPnR5cGU7CiAKIAl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgIiVzOiB0aHJlYWQgc3RhcnRlZFxuIiwgY2hpcC0+Yy5uYW1lKTsKLQorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwppbmRleCBmY2M1NDY3Li5lNjE3OTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwpAQCAtNDcsNiArNDcsNyBAQAogCWludCBlcnI7CiAKIAlkcHJpbnRrKCJkdmIgdGhyZWFkIHN0YXJ0ZWRcbiIpOworCXNldF9mcmVlemFibGUoKTsKIAl2aWRlb2J1Zl9yZWFkX3N0YXJ0KCZkdmItPmR2YnEpOwogCiAJZm9yICg7OykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwppbmRleCBmN2UxZDE5Li4zZWY0ZDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwpAQCAtNTczLDYgKzU3Myw3IEBACiAJZHByaW50aygxLCJ0aHJlYWQgc3RhcnRlZFxuIik7CiAKIAltb2RfdGltZXIoJmRtYV9xLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAKIAlmb3IgKDs7KSB7CiAJCXZpdmlfc2xlZXAoZG1hX3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnIGIvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnCmluZGV4IGY0YWMyMWUuLjVhZmEwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWcKQEAgLTEsOSArMSw2IEBACiAKLW1lbnUgIkkyTyBkZXZpY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSQotCi1jb25maWcgSTJPCi0JdHJpc3RhdGUgIkkyTyBzdXBwb3J0IgorbWVudWNvbmZpZyBJMk8KKwl0cmlzdGF0ZSAiSTJPIGRldmljZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCiAJLS0taGVscC0tLQogCSAgVGhlIEludGVsbGlnZW50IElucHV0L091dHB1dCAoSTJPKSBhcmNoaXRlY3R1cmUgYWxsb3dzIGhhcmR3YXJlCkBAIC0yNSw5ICsyMiwxMCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitpZiBJMk8KKwogY29uZmlnIEkyT19MQ1RfTk9USUZZX09OX0NIQU5HRVMKIAlib29sICJFbmFibGUgTENUIG5vdGlmaWNhdGlvbiIKLQlkZXBlbmRzIG9uIEkyTwogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIE9ubHkgc2F5IE4gaGVyZSBpZiB5b3UgaGF2ZSBhIEkyTyBjb250cm9sbGVyIGZyb20gU1VOLiBUaGUgU1VOCkBAIC0zOSw3ICszNyw2IEBACiAKIGNvbmZpZyBJMk9fRVhUX0FEQVBURUMKIAlib29sICJFbmFibGUgQWRhcHRlYyBleHRlbnNpb25zIgotCWRlcGVuZHMgb24gSTJPCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgU2F5IFkgZm9yIHN1cHBvcnQgb2YgcmFpZHV0aWxzIGZvciBBZGFwdGVjIEkyTyBjb250cm9sbGVycy4gWW91IGFsc28KQEAgLTU3LDcgKzU0LDcgQEAKIAogY29uZmlnIEkyT19DT05GSUcKIAl0cmlzdGF0ZSAiSTJPIENvbmZpZ3VyYXRpb24gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyTworCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBmb3Igc3VwcG9ydCBvZiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBJMk8gYWRhcHRlcnMuCiAJICBJZiB5b3UgaGF2ZSBhIFJBSUQgY29udHJvbGxlciBmcm9tIEFkYXB0ZWMgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKQEAgLTc4LDcgKzc1LDYgQEAKIAogY29uZmlnIEkyT19CVVMKIAl0cmlzdGF0ZSAiSTJPIEJ1cyBBZGFwdGVyIE9TTSIKLQlkZXBlbmRzIG9uIEkyTwogCS0tLWhlbHAtLS0KIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEkyTyBCdXMgQWRhcHRlciBPU00uIFRoZSBCdXMgQWRhcHRlciBPU00KIAkgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnVzc2VzIG9uIHRoZSBJMk8gY29udHJvbGxlci4gVGhlIG1haW4gcHVycG9zZQpAQCAtODksNyArODUsNyBAQAogCiBjb25maWcgSTJPX0JMT0NLCiAJdHJpc3RhdGUgIkkyTyBCbG9jayBPU00iCi0JZGVwZW5kcyBvbiBJMk8gJiYgQkxPQ0sKKwlkZXBlbmRzIG9uIEJMT0NLCiAJLS0taGVscC0tLQogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgSTJPIEJsb2NrIE9TTS4gVGhlIEJsb2NrIE9TTSBwcmVzZW50cyBkaXNrCiAJICBhbmQgb3RoZXIgc3RydWN0dXJlZCBibG9jayBkZXZpY2VzIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBJZiB5b3UKQEAgLTEwMiw3ICs5OCw3IEBACiAKIGNvbmZpZyBJMk9fU0NTSQogCXRyaXN0YXRlICJJMk8gU0NTSSBPU00iCi0JZGVwZW5kcyBvbiBJMk8gJiYgU0NTSQorCWRlcGVuZHMgb24gU0NTSQogCS0tLWhlbHAtLS0KIAkgIEFsbG93cyBkaXJlY3QgU0NTSSBhY2Nlc3MgdG8gU0NTSSBkZXZpY2VzIG9uIGEgU0NTSSBvciBGaWJyZUNoYW5uZWwKIAkgIEkyTyBjb250cm9sbGVyLiBZb3UgY2FuIHVzZSBib3RoIHRoZSBTQ1NJIGFuZCBCbG9jayBPU00gdG9nZXRoZXIgaWYKQEAgLTExNCw3ICsxMTAsNiBAQAogCiBjb25maWcgSTJPX1BST0MKIAl0cmlzdGF0ZSAiSTJPIC9wcm9jIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJMk8KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiLCB5b3Ugd2lsbCBiZQogCSAgYWJsZSB0byByZWFkIEkyTyByZWxhdGVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHZpcnR1YWwgZGlyZWN0b3J5CkBAIC0xMjMsNSArMTE4LDQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpMm9fcHJvYy4KIAotZW5kbWVudQotCitlbmRpZiAjIEkyTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jCmluZGV4IDhhYmU0NWUuLmNlNjJkOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAlpZiAoY21kID09IEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVIpCiAJCXJldHVybjsJCS8vIE5vIHN0YXR1cyBpbiB0aGlzIHJlcGx5CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMlczogIiwgc2V2ZXJpdHksIHN0cik7CisJcHJpbnRrKCIlcyVzOiAiLCBzZXZlcml0eSwgc3RyKTsKIAogCWlmIChjbWQgPCAweDFGKQkJLy8gVXRpbGl0eSBjbWQKIAkJaTJvX3JlcG9ydF91dGlsX2NtZChjbWQpOwpAQCAtMzIsNyArMzIsNyBAQAogCWVsc2UgaWYgKGNtZCA+PSAweEEwICYmIGNtZCA8PSAweEVGKQkvLyBFeGVjdXRpdmUgY21kCiAJCWkyb19yZXBvcnRfZXhlY19jbWQoY21kKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICJDbWQgPSAlMCMyeCwgIiwgY21kKTsJLy8gT3RoZXIgY21kcworCQlwcmludGsoIkNtZCA9ICUwIzJ4LCAiLCBjbWQpOwkvLyBPdGhlciBjbWRzCiAKIAlpZiAobXNnWzBdICYgTVNHX0ZBSUwpIHsKIAkJaTJvX3JlcG9ydF9mYWlsX3N0YXR1cyhyZXFfc3RhdHVzLCBtc2cpOwpAQCAtNDQsNyArNDQsNyBAQAogCWlmIChjbWQgPCAweDFGIHx8IChjbWQgPj0gMHhBMCAmJiBjbWQgPD0gMHhFRikpCiAJCWkyb19yZXBvcnRfY29tbW9uX2RzYyhkZXRhaWxlZF9zdGF0dXMpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAorCQlwcmludGsoIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAogCQkgICAgICAgZGV0YWlsZWRfc3RhdHVzKTsKIH0KIApAQCAtODksMTAgKzg5LDEwIEBACiAJfTsKIAogCWlmIChyZXFfc3RhdHVzID09IEkyT19GU0NfVFJBTlNQT1JUX1VOS05PV05fRkFJTFVSRSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlRSQU5TUE9SVF9VTktOT1dOX0ZBSUxVUkUgKCUwIzJ4KS5cbiIsCisJCXByaW50aygiVFJBTlNQT1JUX1VOS05PV05fRkFJTFVSRSAoJTAjMngpLlxuIiwKIAkJICAgICAgIHJlcV9zdGF0dXMpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlRSQU5TUE9SVF8lcy5cbiIsCisJCXByaW50aygiVFJBTlNQT1JUXyVzLlxuIiwKIAkJICAgICAgIEZBSUxfU1RBVFVTW3JlcV9zdGF0dXMgJiAweDBGXSk7CiAKIAkvKiBEdW1wIHNvbWUgZGV0YWlscyAqLwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJcHJpbnRrKEtFUk5fRVJSICIgIEZhaWxpbmdIb3N0VW5pdCA9IDB4JTA0WCwgIEZhaWxpbmdJT1AgPSAweCUwM1hcbiIsCiAJICAgICAgIG1zZ1s1XSA+PiAxNiwgbXNnWzVdICYgMHhGRkYpOwogCi0JcHJpbnRrKEtFUk5fRVJSICIgIFNldmVyaXR5OiAgMHglMDJYICIsIChtc2dbNF0gPj4gMTYpICYgMHhGRik7CisJcHJpbnRrKEtFUk5fRVJSICIgIFNldmVyaXR5OiAgMHglMDJYXG4iLCAobXNnWzRdID4+IDE2KSAmIDB4RkYpOwogCWlmIChtc2dbNF0gJiAoMSA8PCAxNikpCiAJCXByaW50ayhLRVJOX0RFQlVHICIoRm9ybWF0RXJyb3IpLCAiCiAJCSAgICAgICAidGhpcyBtc2cgY2FuIG5ldmVyIGJlIGRlbGl2ZXJlZC9wcm9jZXNzZWQuXG4iKTsKQEAgLTE0Miw5ICsxNDIsOSBAQAogCX07CiAKIAlpZiAocmVxX3N0YXR1cyA+PSBBUlJBWV9TSVpFKFJFUExZX1NUQVRVUykpCi0JCXByaW50ayhLRVJOX0RFQlVHICJSZXF1ZXN0U3RhdHVzID0gJTAjMngiLCByZXFfc3RhdHVzKTsKKwkJcHJpbnRrKCJSZXF1ZXN0U3RhdHVzID0gJTAjMngiLCByZXFfc3RhdHVzKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIFJFUExZX1NUQVRVU1tyZXFfc3RhdHVzXSk7CisJCXByaW50aygiJXMiLCBSRVBMWV9TVEFUVVNbcmVxX3N0YXR1c10pOwogfQogCiAvKgpAQCAtMTg3LDEwICsxODcsMTAgQEAKIAl9OwogCiAJaWYgKGRldGFpbGVkX3N0YXR1cyA+IEkyT19EU0NfREVWSUNFX05PVF9BVkFJTEFCTEUpCi0JCXByaW50ayhLRVJOX0RFQlVHICIgLyBEZXRhaWxlZFN0YXR1cyA9ICUwIzR4LlxuIiwKKwkJcHJpbnRrKCIgLyBEZXRhaWxlZFN0YXR1cyA9ICUwIzR4LlxuIiwKIAkJICAgICAgIGRldGFpbGVkX3N0YXR1cyk7CiAJZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiIC8gJXMuXG4iLCBDT01NT05fRFNDW2RldGFpbGVkX3N0YXR1c10pOworCQlwcmludGsoIiAvICVzLlxuIiwgQ09NTU9OX0RTQ1tkZXRhaWxlZF9zdGF0dXNdKTsKIH0KIAogLyoKQEAgLTIwMCw0OSArMjAwLDQ5IEBACiB7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEkyT19DTURfVVRJTF9OT1A6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX05PUCwgIik7CisJCXByaW50aygiVVRJTF9OT1AsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9BQk9SVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQUJPUlQsICIpOworCQlwcmludGsoIlVUSUxfQUJPUlQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9DTEFJTToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQ0xBSU0sICIpOworCQlwcmludGsoIlVUSUxfQ0xBSU0sICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9DTEFJTV9SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJVVElMX0NMQUlNX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9DT05GSUdfRElBTE9HOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9DT05GSUdfRElBTE9HLCAiKTsKKwkJcHJpbnRrKCJVVElMX0NPTkZJR19ESUFMT0csICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9ERVZJQ0VfUkVTRVJWRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfREVWSUNFX1JFU0VSVkUsICIpOworCQlwcmludGsoIlVUSUxfREVWSUNFX1JFU0VSVkUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9ERVZJQ0VfUkVMRUFTRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfREVWSUNFX1JFTEVBU0UsICIpOworCQlwcmludGsoIlVUSUxfREVWSUNFX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9FVlRfQUNLOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9FVkVOVF9BQ0tOT1dMRURHRSwgIik7CisJCXByaW50aygiVVRJTF9FVkVOVF9BQ0tOT1dMRURHRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfRVZFTlRfUkVHSVNURVIsICIpOworCQlwcmludGsoIlVUSUxfRVZFTlRfUkVHSVNURVIsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9MT0NLOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9MT0NLLCAiKTsKKwkJcHJpbnRrKCJVVElMX0xPQ0ssICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9MT0NLX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0xPQ0tfUkVMRUFTRSwgIik7CisJCXByaW50aygiVVRJTF9MT0NLX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9QQVJBTVNfR0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9QQVJBTVNfR0VULCAiKTsKKwkJcHJpbnRrKCJVVElMX1BBUkFNU19HRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9QQVJBTVNfU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9QQVJBTVNfU0VULCAiKTsKKwkJcHJpbnRrKCJVVElMX1BBUkFNU19TRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9SRVBMWV9GQVVMVF9OT1RJRlk6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX1JFUExZX0ZBVUxUX05PVElGWSwgIik7CisJCXByaW50aygiVVRJTF9SRVBMWV9GQVVMVF9OT1RJRlksICIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiQ21kID0gJTAjMngsICIsIGNtZCk7CisJCXByaW50aygiQ21kID0gJTAjMngsICIsIGNtZCk7CiAJfQogfQogCkBAIC0yNTMsMTA2ICsyNTMsMTA2IEBACiB7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEkyT19DTURfQURBUFRFUl9BU1NJR046Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0FEQVBURVJfQVNTSUdOLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0FEQVBURVJfQVNTSUdOLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfUkVBRDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQURBUFRFUl9SRUFELCAiKTsKKwkJcHJpbnRrKCJFWEVDX0FEQVBURVJfUkVBRCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9BREFQVEVSX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0FEQVBURVJfUkVMRUFTRSwgIik7CisJCXByaW50aygiRVhFQ19BREFQVEVSX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQklPU19JTkZPX1NFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQklPU19JTkZPX1NFVCwgIik7CisJCXByaW50aygiRVhFQ19CSU9TX0lORk9fU0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0JPT1RfREVWSUNFX1NFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQk9PVF9ERVZJQ0VfU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0JPT1RfREVWSUNFX1NFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9DT05GSUdfVkFMSURBVEU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0NPTkZJR19WQUxJREFURSwgIik7CisJCXByaW50aygiRVhFQ19DT05GSUdfVkFMSURBVEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQ09OTl9TRVRVUDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQ09OTl9TRVRVUCwgIik7CisJCXByaW50aygiRVhFQ19DT05OX1NFVFVQLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RETV9ERVNUUk9ZOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fREVTVFJPWSwgIik7CisJCXByaW50aygiRVhFQ19ERE1fREVTVFJPWSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERE1fRU5BQkxFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fRU5BQkxFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9FTkFCTEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfRERNX1FVSUVTQ0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9RVUlFU0NFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9RVUlFU0NFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RETV9SRVNFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX1JFU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9SRVNFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERE1fU1VTUEVORDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX1NVU1BFTkQsICIpOworCQlwcmludGsoIkVYRUNfRERNX1NVU1BFTkQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfREVWSUNFX0FTU0lHTjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfREVWSUNFX0FTU0lHTiwgIik7CisJCXByaW50aygiRVhFQ19ERVZJQ0VfQVNTSUdOLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RFVklDRV9SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERVZJQ0VfUkVMRUFTRSwgIik7CisJCXByaW50aygiRVhFQ19ERVZJQ0VfUkVMRUFTRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9IUlRfR0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19IUlRfR0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0hSVF9HRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQURBUFRFUl9DTEVBUjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSU9QX0NMRUFSLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0lPUF9DTEVBUiwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9BREFQVEVSX0NPTk5FQ1Q6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0lPUF9DT05ORUNULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0lPUF9DT05ORUNULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfUkVTRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0lPUF9SRVNFVCwgIik7CisJCXByaW50aygiRVhFQ19JT1BfUkVTRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfTENUX05PVElGWToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfTENUX05PVElGWSwgIik7CisJCXByaW50aygiRVhFQ19MQ1RfTk9USUZZLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX09VVEJPVU5EX0lOSVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX09VVEJPVU5EX0lOSVQsICIpOworCQlwcmludGsoIkVYRUNfT1VUQk9VTkRfSU5JVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9QQVRIX0VOQUJMRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfUEFUSF9FTkFCTEUsICIpOworCQlwcmludGsoIkVYRUNfUEFUSF9FTkFCTEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfUEFUSF9RVUlFU0NFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19QQVRIX1FVSUVTQ0UsICIpOworCQlwcmludGsoIkVYRUNfUEFUSF9RVUlFU0NFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1BBVEhfUkVTRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1BBVEhfUkVTRVQsICIpOworCQlwcmludGsoIkVYRUNfUEFUSF9SRVNFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TVEFUSUNfTUZfQ1JFQVRFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TVEFUSUNfTUZfQ1JFQVRFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NUQVRJQ19NRl9DUkVBVEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1RBVElDX01GX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRJQ19NRl9SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NUQVRJQ19NRl9SRUxFQVNFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NUQVRVU19HRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRVU19HRVQsICIpOworCQlwcmludGsoIkVYRUNfU1RBVFVTX0dFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TV19ET1dOTE9BRDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1dfRE9XTkxPQUQsICIpOworCQlwcmludGsoIkVYRUNfU1dfRE9XTkxPQUQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1dfVVBMT0FEOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TV19VUExPQUQsICIpOworCQlwcmludGsoIkVYRUNfU1dfVVBMT0FELCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NXX1JFTU9WRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1dfUkVNT1ZFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NXX1JFTU9WRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TWVNfRU5BQkxFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfRU5BQkxFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NZU19FTkFCTEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1lTX01PRElGWToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX01PRElGWSwgIik7CisJCXByaW50aygiRVhFQ19TWVNfTU9ESUZZLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NZU19RVUlFU0NFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfUVVJRVNDRSwgIik7CisJCXByaW50aygiRVhFQ19TWVNfUVVJRVNDRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TWVNfVEFCX1NFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX1RBQl9TRVQsICIpOworCQlwcmludGsoIkVYRUNfU1lTX1RBQl9TRVQsICIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiQ21kID0gJSMwMngsICIsIGNtZCk7CisJCXByaW50aygiQ21kID0gJSMwMngsICIsIGNtZCk7CiAJfQogfQogCkBAIC0zNjEsMjggKzM2MSwyOCBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGF0ZSA9ICIsIGMtPm5hbWUpOwogCXN3aXRjaCAoKChpMm9fc3RhdHVzX2Jsb2NrICopIGMtPnN0YXR1c19ibG9jay52aXJ0KS0+aW9wX3N0YXRlKSB7CiAJY2FzZSAweDAxOgotCQlwcmludGsoS0VSTl9ERUJVRyAiSU5JVFxuIik7CisJCXByaW50aygiSU5JVFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgwMjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlJFU0VUXG4iKTsKKwkJcHJpbnRrKCJSRVNFVFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgwNDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkhPTERcbiIpOworCQlwcmludGsoIkhPTERcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MDU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJSRUFEWVxuIik7CisJCXByaW50aygiUkVBRFlcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MDg6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJPUEVSQVRJT05BTFxuIik7CisJCXByaW50aygiT1BFUkFUSU9OQUxcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MTA6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJGQUlMRURcbiIpOworCQlwcmludGsoIkZBSUxFRFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgxMToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkZBVUxURURcbiIpOworCQlwcmludGsoIkZBVUxURURcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXggKHVua25vd24gISEpXG4iLAorCQlwcmludGsoIiV4ICh1bmtub3duICEhKVxuIiwKIAkJICAgICAgICgoaTJvX3N0YXR1c19ibG9jayAqKSBjLT5zdGF0dXNfYmxvY2sudmlydCktPmlvcF9zdGF0ZSk7CiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCmluZGV4IDYxMWFkYzMuLjQ4OWQ3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwpAQCAtNjIsNyArNjIsNyBAQAogewogCWludCByYyA9IDA7CiAKLQlkb3duKCZkZXYtPmxvY2spOworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAKIAlyYyA9IGkyb19kZXZpY2VfaXNzdWVfY2xhaW0oZGV2LCBJMk9fQ01EX1VUSUxfQ0xBSU0sIEkyT19DTEFJTV9QUklNQVJZKTsKIAlpZiAoIXJjKQpAQCAtNzIsNyArNzIsNyBAQAogCQlwcl9kZWJ1ZygiaTJvOiBjbGFpbSBvZiBkZXZpY2UgJWQgZmFpbGVkICVkXG4iLAogCQkJIGRldi0+bGN0X2RhdGEudGlkLCByYyk7CiAKLQl1cCgmZGV2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05Niw3ICs5Niw3IEBACiAJaW50IHRyaWVzOwogCWludCByYyA9IDA7CiAKLQlkb3duKCZkZXYtPmxvY2spOworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAKIAkvKgogCSAqICAgICAgSWYgdGhlIGNvbnRyb2xsZXIgdGFrZXMgYSBub25ibG9ja2luZyBhcHByb2FjaCB0bwpAQCAtMTE4LDcgKzExOCw3IEBACiAJCXByX2RlYnVnKCJpMm86IGNsYWltIHJlbGVhc2Ugb2YgZGV2aWNlICVkIGZhaWxlZCAlZFxuIiwKIAkJCSBkZXYtPmxjdF9kYXRhLnRpZCwgcmMpOwogCi0JdXAoJmRldi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTk4LDcgKzE5OCw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+bGlzdCk7Ci0JaW5pdF9NVVRFWCgmZGV2LT5sb2NrKTsKKwltdXRleF9pbml0KCZkZXYtPmxvY2spOwogCiAJZGV2LT5kZXZpY2UuYnVzID0gJmkyb19idXNfdHlwZTsKIAlkZXYtPmRldmljZS5yZWxlYXNlID0gJmkyb19kZXZpY2VfcmVsZWFzZTsKQEAgLTMyNiw3ICszMjYsNyBAQAogCXUxNiB0YWJsZV9zaXplOwogCXUzMiBidWY7CiAKLQlkb3duKCZjLT5sY3RfbG9jayk7CisJbXV0ZXhfbG9jaygmYy0+bGN0X2xvY2spOwogCiAJa2ZyZWUoYy0+bGN0KTsKIApAQCAtMzM1LDcgKzMzNSw3IEBACiAKIAlsY3QgPSBjLT5sY3QgPSBrbWFsbG9jKHRhYmxlX3NpemUgKiA0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxjdCkgewotCQl1cCgmYy0+bGN0X2xvY2spOworCQltdXRleF91bmxvY2soJmMtPmxjdF9sb2NrKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00MDgsNyArNDA4LDcgQEAKIAkJCWkyb19kZXZpY2VfcmVtb3ZlKGRldik7CiAJfQogCi0JdXAoJmMtPmxjdF9sb2NrKTsKKwltdXRleF91bmxvY2soJmMtPmxjdF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCmluZGV4IDUyNzhhYWQuLjhjODNlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKQEAgLTEzMSw4ICsxMzEsMTAgQEAKIAlpbnQgcmMgPSAwOwogCiAJd2FpdCA9IGkyb19leGVjX3dhaXRfYWxsb2MoKTsKLQlpZiAoIXdhaXQpCisJaWYgKCF3YWl0KSB7CisJCWkyb19tc2dfbm9wKGMsIG1zZyk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWlmICh0Y250eHQgPT0gMHhmZmZmZmZmZikKIAkJdGNudHh0ID0gMHg4MDAwMDAwMDsKQEAgLTMzNyw2ICszMzksOCBAQAogCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3Byb2R1Y3RfaWQpOwogCWlmIChyYykgZ290byBlcnJfdmlkOwogCisJaTJvX2Rldi0+aW9wLT5leGVjID0gaTJvX2RldjsKKwogCXJldHVybiAwOwogCiBlcnJfdmlkOgpAQCAtNTM3LDcgKzU0MSw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnOwogCi0JZG93bigmYy0+bGN0X2xvY2spOworCW11dGV4X2xvY2soJmMtPmxjdF9sb2NrKTsKIAogCWRldiA9ICZjLT5wZGV2LT5kZXY7CiAKQEAgLTU2MSw3ICs1NjUsNyBAQAogCiAJaTJvX21zZ19wb3N0KGMsIG1zZyk7CiAKLQl1cCgmYy0+bGN0X2xvY2spOworCW11dGV4X3VubG9jaygmYy0+bGN0X2xvY2spOwogCiAJcmV0dXJuIDA7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKaW5kZXggYjE3YzRiMi4uNjRhNTJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsKIAogCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKLQlpZiAoSVNfRVJSKG1zZykgPT0gSTJPX1FVRVVFX0VNUFRZKQorCWlmIChJU19FUlIobXNnKSkKIAkJcmV0dXJuIFBUUl9FUlIobXNnKTsKIAogCW1zZy0+dS5oZWFkWzBdID0gY3B1X3RvX2xlMzIoRklWRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKaW5kZXggOGJhMjc1YS4uODRlMDQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKQEAgLTU1NCw4ICs1NTQsNiBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwotCiAJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKIAogCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CkBAIC01NzMsMjQgKzU3MSwzMCBAQAogCiAJc2l6ZSA8PD0gMjsJCS8vIENvbnZlcnQgdG8gYnl0ZXMKIAorCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChJU19FUlIobXNnKSkKKwkJcmV0dXJuIFBUUl9FUlIobXNnKTsKKworCXJjb2RlID0gLUVGQVVMVDsKIAkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KIAlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKIAkJb3NtX3dhcm4oInVuYWJsZSB0byBjb3B5IHVzZXIgbWVzc2FnZVxuIik7Ci0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIG91dDsKIAl9CiAJaTJvX2R1bXBfbWVzc2FnZShtc2cpOwogCiAJaWYgKGdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKSA8IDApCi0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIG91dDsKIAogCXJlcGx5X3NpemUgPj49IDE2OwogCXJlcGx5X3NpemUgPDw9IDI7CiAKKwlyY29kZSA9IC1FTk9NRU07CiAJcmVwbHkgPSBremFsbG9jKHJlcGx5X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghcmVwbHkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZXBseSBidWZmZXJcbiIsCiAJCSAgICAgICBjLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAogCXNnX29mZnNldCA9IChtc2ctPnUuaGVhZFswXSA+PiA0KSAmIDB4MGY7CkBAIC02NjEsMTMgKzY2NSwxNCBAQAogCX0KIAogCXJjb2RlID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbXNnLCA2MCk7CisJbXNnID0gTlVMTDsKIAlpZiAocmNvZGUpIHsKIAkJcmVwbHlbNF0gPSAoKHUzMikgcmNvZGUpIDw8IDI0OwogCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAl9CiAKIAlpZiAoc2dfb2Zmc2V0KSB7Ci0JCXUzMiBtc2dbSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFXTsKKwkJdTMyIHJtc2dbSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFXTsKIAkJLyogQ29weSBiYWNrIHRoZSBTY2F0dGVyIEdhdGhlciBidWZmZXJzIGJhY2sgdG8gdXNlciBzcGFjZSAqLwogCQl1MzIgajsKIAkJLy8gVE9ETyA2NGJpdCBmaXgKQEAgLTY3NSw3ICs2ODAsNyBAQAogCQlpbnQgc2dfc2l6ZTsKIAogCQkvLyByZS1hY3F1aXJlIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIHNnIGNvcHkgb3BlcmF0aW9uCi0JCW1lbXNldCgmbXNnLCAwLCBJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkUgKiA0KTsKKwkJbWVtc2V0KCZybXNnLCAwLCBJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkUgKiA0KTsKIAkJLy8gZ2V0IHVzZXIgbXNnIHNpemUgaW4gdTMycwogCQlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkgewogCQkJcmNvZGUgPSAtRUZBVUxUOwpAQCAtNjg0LDcgKzY4OSw3IEBACiAJCXNpemUgPSBzaXplID4+IDE2OwogCQlzaXplICo9IDQ7CiAJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHJtc2csIHVzZXJfbXNnLCBzaXplKSkgewogCQkJcmNvZGUgPSAtRUZBVUxUOwogCQkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJCX0KQEAgLTY5Miw3ICs2OTcsNyBAQAogCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOwogCiAJCS8vIFRPRE8gNjRiaXQgZml4Ci0JCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShtc2cgKyBzZ19vZmZzZXQpOworCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikocm1zZyArIHNnX29mZnNldCk7CiAJCWZvciAoaiA9IDA7IGogPCBzZ19jb3VudDsgaisrKSB7CiAJCQkvKiBDb3B5IG91dCB0aGUgU0cgbGlzdCB0byB1c2VyJ3MgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwogCQkJaWYgKCEKQEAgLTcxNCw3ICs3MTksNyBAQAogCQl9CiAJfQogCi0gICAgICBzZ19saXN0X2NsZWFudXA6CitzZ19saXN0X2NsZWFudXA6CiAJLyogQ29weSBiYWNrIHRoZSByZXBseSB0byB1c2VyIHNwYWNlICovCiAJaWYgKHJlcGx5X3NpemUpIHsKIAkJLy8gd2Ugd3JvdGUgb3VyIG93biB2YWx1ZXMgZm9yIGNvbnRleHQgLSBub3cgcmVzdG9yZSB0aGUgdXNlciBzdXBwbGllZCBvbmVzCkBAIC03MjMsNyArNzI4LDYgQEAKIAkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IG1lc3NhZ2UgY29udGV4dCBGUk9NIHVzZXJcbiIsCiAJCQkgICAgICAgYy0+bmFtZSk7CiAJCQlyY29kZSA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQogCQlpZiAoY29weV90b191c2VyKHVzZXJfcmVwbHksIHJlcGx5LCByZXBseV9zaXplKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtNzMxLDEyICs3MzUsMTQgQEAKIAkJCXJjb2RlID0gLUVGQVVMVDsKIAkJfQogCX0KLQogCWZvciAoaSA9IDA7IGkgPCBzZ19pbmRleDsgaSsrKQogCQlpMm9fZG1hX2ZyZWUoJmMtPnBkZXYtPmRldiwgJnNnX2xpc3RbaV0pOwogCi0gICAgICBjbGVhbnVwOgorY2xlYW51cDoKIAlrZnJlZShyZXBseSk7CitvdXQ6CisJaWYgKG1zZykKKwkJaTJvX21zZ19ub3AoYywgbXNnKTsKIAlyZXR1cm4gcmNvZGU7CiB9CiAKQEAgLTc5Myw4ICs3OTksNiBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwotCiAJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKIAogCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKQpAQCAtODEwLDEyICs4MTQsMTcgQEAKIAogCXNpemUgPDw9IDI7CQkvLyBDb252ZXJ0IHRvIGJ5dGVzCiAKKwltc2cgPSBpMm9fbXNnX2dldF93YWl0KGMsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAoSVNfRVJSKG1zZykpCisJCXJldHVybiBQVFJfRVJSKG1zZyk7CisKKwlyY29kZSA9IC1FRkFVTFQ7CiAJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCiAJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJZ290byBvdXQ7CiAKIAlpZiAoZ2V0X3VzZXIocmVwbHlfc2l6ZSwgJnVzZXJfcmVwbHlbMF0pIDwgMCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCWdvdG8gb3V0OwogCiAJcmVwbHlfc2l6ZSA+Pj0gMTY7CiAJcmVwbHlfc2l6ZSA8PD0gMjsKQEAgLTgyNCw3ICs4MzMsOCBAQAogCWlmICghcmVwbHkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZXBseSBidWZmZXJcbiIsCiAJCSAgICAgICBjLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJjb2RlID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAJfQogCiAJc2dfb2Zmc2V0ID0gKG1zZy0+dS5oZWFkWzBdID4+IDQpICYgMHgwZjsKQEAgLTg5MSwxMyArOTAxLDE0IEBACiAJfQogCiAJcmNvZGUgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtc2csIDYwKTsKKwltc2cgPSBOVUxMOwogCWlmIChyY29kZSkgewogCQlyZXBseVs0XSA9ICgodTMyKSByY29kZSkgPDwgMjQ7CiAJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCX0KIAogCWlmIChzZ19vZmZzZXQpIHsKLQkJdTMyIG1zZ1sxMjhdOworCQl1MzIgcm1zZ1sxMjhdOwogCQkvKiBDb3B5IGJhY2sgdGhlIFNjYXR0ZXIgR2F0aGVyIGJ1ZmZlcnMgYmFjayB0byB1c2VyIHNwYWNlICovCiAJCXUzMiBqOwogCQkvLyBUT0RPIDY0Yml0IGZpeApAQCAtOTA1LDcgKzkxNiw3IEBACiAJCWludCBzZ19zaXplOwogCiAJCS8vIHJlLWFjcXVpcmUgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgdG8gaGFuZGxlIGNvcnJlY3RseSB0aGUgc2cgY29weSBvcGVyYXRpb24KLQkJbWVtc2V0KCZtc2csIDAsIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIDQpOworCQltZW1zZXQoJnJtc2csIDAsIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIDQpOwogCQkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzCiAJCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7CkBAIC05MTQsNyArOTI1LDcgQEAKIAkJc2l6ZSA9IHNpemUgPj4gMTY7CiAJCXNpemUgKj0gNDsKIAkJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIocm1zZywgdXNlcl9tc2csIHNpemUpKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7CiAJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQpAQCAtOTIyLDcgKzkzMyw3IEBACiAJCSAgICAoc2l6ZSAtIHNnX29mZnNldCAqIDQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CiAKIAkJLy8gVE9ETyA2NGJpdCBmaXgKLQkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKG1zZyArIHNnX29mZnNldCk7CisJCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShybXNnICsgc2dfb2Zmc2V0KTsKIAkJZm9yIChqID0gMDsgaiA8IHNnX2NvdW50OyBqKyspIHsKIAkJCS8qIENvcHkgb3V0IHRoZSBTRyBsaXN0IHRvIHVzZXIncyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCiAJCQlpZiAoIQpAQCAtOTQ0LDcgKzk1NSw3IEBACiAJCX0KIAl9CiAKLSAgICAgIHNnX2xpc3RfY2xlYW51cDoKK3NnX2xpc3RfY2xlYW51cDoKIAkvKiBDb3B5IGJhY2sgdGhlIHJlcGx5IHRvIHVzZXIgc3BhY2UgKi8KIAlpZiAocmVwbHlfc2l6ZSkgewogCQkvLyB3ZSB3cm90ZSBvdXIgb3duIHZhbHVlcyBmb3IgY29udGV4dCAtIG5vdyByZXN0b3JlIHRoZSB1c2VyIHN1cHBsaWVkIG9uZXMKQEAgLTk2NCw4ICs5NzUsMTEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2dfaW5kZXg7IGkrKykKIAkJa2ZyZWUoc2dfbGlzdFtpXSk7CiAKLSAgICAgIGNsZWFudXA6CitjbGVhbnVwOgogCWtmcmVlKHJlcGx5KTsKK291dDoKKwlpZiAobXNnKQorCQlpMm9fbXNnX25vcChjLCBtc2cpOwogCXJldHVybiByY29kZTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKaW5kZXggMzMwNWMxMi4uYTFlYzE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmMtPmRldmljZXMpOwogCXNwaW5fbG9ja19pbml0KCZjLT5sb2NrKTsKLQlpbml0X01VVEVYKCZjLT5sY3RfbG9jayk7CisJbXV0ZXhfaW5pdCgmYy0+bGN0X2xvY2spOwogCiAJZGV2aWNlX2luaXRpYWxpemUoJmMtPmRldmljZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYwppbmRleCAzOGU4MTVhLi5mZGJhYTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKKysrIGIvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCkBAIC0yMDksNiArMjA5LDcgQEAKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOwogCWludCB2YWxpZCA9IDA7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJYWRkX3dhaXRfcXVldWUoJnRzLT5pcnFfd2FpdCwgJndhaXQpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXVuc2lnbmVkIGludCB4LCB5LCBwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwppbmRleCBiZDYwMWVmLi4xZDUxNmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwpAQCAtMiwxMSArMiwxNSBAQAogIyBNaXNjIHN0cmFuZ2UgZGV2aWNlcwogIwogCi1tZW51ICJNaXNjIGRldmljZXMiCittZW51Y29uZmlnIE1JU0NfREVWSUNFUworCWJvb2wgIk1pc2MgZGV2aWNlcyIKKwlkZWZhdWx0IHkKKworaWYgTUlTQ19ERVZJQ0VTCiAKIGNvbmZpZyBJQk1fQVNNCiAJdHJpc3RhdGUgIkRldmljZSBkcml2ZXIgZm9yIElCTSBSU0Egc2VydmljZSBwcm9jZXNzb3IiCi0JZGVwZW5kcyBvbiBYODYgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gWDg2ICYmIFBDSSAmJiBJTlBVVCAmJiBFWFBFUklNRU5UQUwKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldmljZSBkcml2ZXIgc3VwcG9ydCBmb3IgaW4tYmFuZCBhY2Nlc3MgdG8gdGhlCiAJICBJQk0gUlNBIChDb25kb3IpIHNlcnZpY2UgcHJvY2Vzc29yIGluIGVTZXJ2ZXIgeFNlcmllcyBzeXN0ZW1zLgpAQCAtMTkyLDQgKzE5Niw0IEBACiAKIAkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBZIGhlcmUuCiAKLWVuZG1lbnUKK2VuZGlmICMgTUlTQ19ERVZJQ0VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2NvbW1hbmQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jCmluZGV4IDA3YTA4NWMuLmI1ZGYzNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtNzIsNyArNzIsNyBAQAogc3RhdGljIHZvaWQgZnJlZV9jb21tYW5kKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewogCXN0cnVjdCBjb21tYW5kICpjbWQgPSB0b19jb21tYW5kKGtvYmopOwotIAorCiAJbGlzdF9kZWwoJmNtZC0+cXVldWVfbm9kZSk7CiAJYXRvbWljX2RlYygmY29tbWFuZF9jb3VudCk7CiAJZGJnKCJjb21tYW5kIGNvdW50OiAlZFxuIiwgYXRvbWljX3JlYWQoJmNvbW1hbmRfY291bnQpKTsKQEAgLTExMywxNCArMTEzLDE0IEBACiAJCWV4ZWNfbmV4dF9jb21tYW5kKHNwKTsKIAl9CiB9Ci0JCisKIC8qKgogICogZXhlY19jb21tYW5kCiAgKiBzZW5kIGEgY29tbWFuZCB0byBhIHNlcnZpY2UgcHJvY2Vzc29yCiAgKiBDb21tYW5kcyBhcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LiBPbmUgY29tbWFuZCAoc3AtPmN1cnJlbnRfY29tbWFuZCkKICAqIGlzIHNlbnQgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yLiBPbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBnZXRzIGEKICAqIG1lc3NhZ2Ugb2YgdHlwZSBjb21tYW5kX3Jlc3BvbnNlLCB0aGUgbWVzc2FnZSBpcyBjb3BpZWQgaW50bwotICogdGhlIGN1cnJlbnQgY29tbWFuZHMgYnVmZmVyLCAKKyAqIHRoZSBjdXJyZW50IGNvbW1hbmRzIGJ1ZmZlciwKICAqLwogdm9pZCBpYm1hc21fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBjb21tYW5kICpjbWQpCiB7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAl9CiB9CiAKLS8qKiAKKy8qKgogICogU2xlZXAgdW50aWwgYSBjb21tYW5kIGhhcyBmYWlsZWQgb3IgYSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZAogICogYW5kIHRoZSBjb21tYW5kIHN0YXR1cyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyLgogICogKHNlZSByZWNlaXZlX3Jlc3BvbnNlKS4KQEAgLTE4Miw4ICsxODIsOCBAQAogewogCXN0cnVjdCBjb21tYW5kICpjbWQgPSBzcC0+Y3VycmVudF9jb21tYW5kOwogCi0JaWYgKCFzcC0+Y3VycmVudF9jb21tYW5kKSAKLQkJcmV0dXJuOyAKKwlpZiAoIXNwLT5jdXJyZW50X2NvbW1hbmQpCisJCXJldHVybjsKIAogCW1lbWNweV9mcm9taW8oY21kLT5idWZmZXIsIHJlc3BvbnNlLCBtaW4oc2l6ZSwgY21kLT5idWZmZXJfc2l6ZSkpOwogCWNtZC0+c3RhdHVzID0gSUJNQVNNX0NNRF9DT01QTEVURTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuYwppbmRleCAxM2M1MmY4Li4zZGQyZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtNDQsMTEgKzQ0LDExIEBACiAJCXNpemUgPSBtZXNzYWdlX3NpemU7CiAKIAlzd2l0Y2ggKGhlYWRlci0+dHlwZSkgewotCWNhc2Ugc3BfZXZlbnQ6IAorCWNhc2Ugc3BfZXZlbnQ6CiAJCWlibWFzbV9yZWNlaXZlX2V2ZW50KHNwLCBtZXNzYWdlLCBzaXplKTsKIAkJYnJlYWs7CiAJY2FzZSBzcF9jb21tYW5kX3Jlc3BvbnNlOgotCQlpYm1hc21fcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlKHNwLCBtZXNzYWdlLCBzaXplKTsgCisJCWlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3AsIG1lc3NhZ2UsIHNpemUpOwogCQlicmVhazsKIAljYXNlIHNwX2hlYXJ0YmVhdDoKIAkJaWJtYXNtX3JlY2VpdmVfaGVhcnRiZWF0KHNwLCBtZXNzYWdlLCBzaXplKTsKQEAgLTk1LDcgKzk1LDcgQEAKIAlzdHJjYXQodnBkX2RhdGEsIElCTUFTTV9EUklWRVJfVlBEKTsKIAl2cGRfZGF0YVsxMF0gPSAwOwogCXZwZF9kYXRhWzE1XSA9IDA7Ci0JCisKIAlpYm1hc21fZXhlY19jb21tYW5kKHNwLCBjb21tYW5kKTsKIAlpYm1hc21fd2FpdF9mb3JfcmVzcG9uc2UoY29tbWFuZCwgSUJNQVNNX0NNRF9USU1FT1VUX05PUk1BTCk7CiAKQEAgLTExOCw3ICsxMTgsNyBAQAogICogRHVyaW5nIGRyaXZlciBpbml0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggb3Mgc3RhdGUgInVwIi4KICAqIFRoaXMgY2F1c2VzIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciB0byBzdGFydCBzZW5kaW5nIGhlYXJ0YmVhdHMgdGhlCiAgKiBkcml2ZXIuCi0gKiBEdXJpbmcgZHJpdmVyIGV4aXQgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG9zIHN0YXRlICJkb3duIiwgCisgKiBEdXJpbmcgZHJpdmVyIGV4aXQgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG9zIHN0YXRlICJkb3duIiwKICAqIGNhdXNpbmcgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIHRvIHN0b3AgdGhlIGhlYXJ0YmVhdHMuCiAgKi8KIGludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmggYi9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmgKaW5kZXggMmQyMWMyNy4uNmNiYmExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuaApAQCAtMTcsNyArMTcsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYwppbmRleCBmZTFlODE5Li5mZGE2YTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtNTEsNyArNTEsNyBAQAogICogZXZlbnQgcmVhZGVycy4KICAqIFRoZXJlIGlzIG5vIHJlYWRlciBtYXJrZXIgaW4gdGhlIGJ1ZmZlciwgdGhlcmVmb3JlIHJlYWRlcnMgYXJlCiAgKiByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB1cCB3aXRoIHRoZSB3cml0ZXIsIG9yIHRoZXkgd2lsbCBsb29zZSBldmVudHMuCi0gKi8gCisgKi8KIHZvaWQgaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgZXZlbnRfYnVmZmVyICpidWZmZXIgPSBzcC0+ZXZlbnRfYnVmZmVyOwpAQCAtNzcsMTMgKzc3LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV2ZW50X2F2YWlsYWJsZShzdHJ1Y3QgZXZlbnRfYnVmZmVyICpiLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyKQogewotCXJldHVybiAJKHItPm5leHRfc2VyaWFsX251bWJlciA8IGItPm5leHRfc2VyaWFsX251bWJlcik7CisJcmV0dXJuIChyLT5uZXh0X3NlcmlhbF9udW1iZXIgPCBiLT5uZXh0X3NlcmlhbF9udW1iZXIpOwogfQogCiAvKioKICAqIGdldF9uZXh0X2V2ZW50CiAgKiBDYWxsZWQgYnkgZXZlbnQgcmVhZGVycyAoaW5pdGlhdGVkIGZyb20gdXNlciBzcGFjZSB0aHJvdWdoIHRoZSBmaWxlCi0gKiBzeXN0ZW0pLiAKKyAqIHN5c3RlbSkuCiAgKiBTbGVlcHMgdW50aWwgYSBuZXcgZXZlbnQgaXMgYXZhaWxhYmxlLgogICovCiBpbnQgaWJtYXNtX2dldF9uZXh0X2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaGVhcnRiZWF0LmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2hlYXJ0YmVhdC5jCmluZGV4IDdmZDdhNDMuLjMwMzZlNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaGVhcnRiZWF0LmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9oZWFydGJlYXQuYwpAQCAtMTgsNyArMTgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaTJvLmggYi9kcml2ZXJzL21pc2MvaWJtYXNtL2kyby5oCmluZGV4IDk1OGM5NTcuLmJmMmM3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaTJvLmgKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9pMm8uaApAQCAtMTcsNyArMTcsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKQEAgLTI2LDkgKzI2LDkgQEAKIAl1OAl2ZXJzaW9uOwogCXU4CW1lc3NhZ2VfZmxhZ3M7CiAJdTE2CW1lc3NhZ2Vfc2l6ZTsKLQl1OAl0YXJnZXQ7ICAgICAgICAgICAKKwl1OAl0YXJnZXQ7CiAJdTgJaW5pdGlhdG9yX2FuZF90YXJnZXQ7Ci0JdTgJaW5pdGlhdG9yOyAgICAgICAgCisJdTgJaW5pdGlhdG9yOwogCXU4CWZ1bmN0aW9uOwogCXUzMglpbml0aWF0b3JfY29udGV4dDsKIH07CkBAIC02NCwxMiArNjQsMTIgQEAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBpMm9faGVhZGVyKSArIGRhdGFfc2l6ZTsKIAogCWkyb19zaXplID0gc2l6ZSAvIHNpemVvZih1MzIpOwotCQorCiAJaWYgKHNpemUgJSBzaXplb2YodTMyKSkKIAkgICAgICAgaTJvX3NpemUrKzsKIAogCXJldHVybiBpMm9fc2l6ZTsKLX0JCit9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGluY29taW5nX2RhdGFfc2l6ZShzdHJ1Y3QgaTJvX21lc3NhZ2UgKmkyb19tZXNzYWdlKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc20uaCBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtLmgKaW5kZXggNDhkNWFiZS4uZGU4NjBiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc20uaAorKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtNTgsOCArNTgsOCBAQAogCXJldHVybiBidWY7CiB9CiAKLSNkZWZpbmUgSUJNQVNNX0NNRF9QRU5ESU5HCTAJCi0jZGVmaW5lIElCTUFTTV9DTURfQ09NUExFVEUJMQkKKyNkZWZpbmUgSUJNQVNNX0NNRF9QRU5ESU5HCTAKKyNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCiAjZGVmaW5lIElCTUFTTV9DTURfRkFJTEVECTIKIAogI2RlZmluZSBJQk1BU01fQ01EX1RJTUVPVVRfTk9STUFMCTQ1CkBAIC0xNjMsNTUgKzE2Myw1NSBAQAogfTsKIAogLyogY29tbWFuZCBwcm9jZXNzaW5nICovCi1leHRlcm4gc3RydWN0IGNvbW1hbmQgKmlibWFzbV9uZXdfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzaXplX3QgYnVmZmVyX3NpemUpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V4ZWNfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgY29tbWFuZCAqY21kKTsKLWV4dGVybiB2b2lkIGlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgY29tbWFuZCAqY21kLCBpbnQgdGltZW91dCk7Ci1leHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKnJlc3BvbnNlLCAgc2l6ZV90IHNpemUpOworc3RydWN0IGNvbW1hbmQgKmlibWFzbV9uZXdfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzaXplX3QgYnVmZmVyX3NpemUpOwordm9pZCBpYm1hc21fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBjb21tYW5kICpjbWQpOwordm9pZCBpYm1hc21fd2FpdF9mb3JfcmVzcG9uc2Uoc3RydWN0IGNvbW1hbmQgKmNtZCwgaW50IHRpbWVvdXQpOwordm9pZCBpYm1hc21fcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKnJlc3BvbnNlLCAgc2l6ZV90IHNpemUpOwogCiAvKiBldmVudCBwcm9jZXNzaW5nICovCi1leHRlcm4gaW50IGlibWFzbV9ldmVudF9idWZmZXJfaW5pdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKLWV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9idWZmZXJfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKLWV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKTsKLWV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfcmVnaXN0ZXIoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKLWV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwotZXh0ZXJuIGludCBpYm1hc21fZ2V0X25leHRfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKLWV4dGVybiB2b2lkIGlibWFzbV9jYW5jZWxfbmV4dF9ldmVudChzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOworaW50IGlibWFzbV9ldmVudF9idWZmZXJfaW5pdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwordm9pZCBpYm1hc21fcmVjZWl2ZV9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSk7Cit2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfcmVnaXN0ZXIoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKK3ZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl91bnJlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CitpbnQgaWJtYXNtX2dldF9uZXh0X2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7Cit2b2lkIGlibWFzbV9jYW5jZWxfbmV4dF9ldmVudChzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwogCiAvKiBoZWFydGJlYXQgLSBmcm9tIFNQIHRvIE9TICovCi1leHRlcm4gdm9pZCBpYm1hc21fcmVnaXN0ZXJfcGFuaWNfbm90aWZpZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBpYm1hc21fdW5yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKLWV4dGVybiBpbnQgaWJtYXNtX2hlYXJ0YmVhdF9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2hlYXJ0YmVhdF9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsICB2b2lkICptZXNzYWdlLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIGlibWFzbV9yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKK3ZvaWQgaWJtYXNtX3VucmVnaXN0ZXJfcGFuaWNfbm90aWZpZXIodm9pZCk7CitpbnQgaWJtYXNtX2hlYXJ0YmVhdF9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwordm9pZCBpYm1hc21faGVhcnRiZWF0X2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCAgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IHNpemUpOwogCiAvKiByZXZlcnNlIGhlYXJ0YmVhdCAtIGZyb20gT1MgdG8gU1AgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9pbml0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKLWV4dGVybiBpbnQgaWJtYXNtX3N0YXJ0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKLWV4dGVybiB2b2lkIGlibWFzbV9zdG9wX3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKK3ZvaWQgaWJtYXNtX2luaXRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOworaW50IGlibWFzbV9zdGFydF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7Cit2b2lkIGlibWFzbV9zdG9wX3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKIAogLyogZG90IGNvbW1hbmRzICovCi1leHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsIGludCBkYXRhX3NpemUpOwotZXh0ZXJuIGludCBpYm1hc21fc2VuZF9kcml2ZXJfdnBkKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIGludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpOwordm9pZCBpYm1hc21fcmVjZWl2ZV9tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsIGludCBkYXRhX3NpemUpOworaW50IGlibWFzbV9zZW5kX2RyaXZlcl92cGQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CitpbnQgaWJtYXNtX3NlbmRfb3Nfc3RhdGUoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgaW50IG9zX3N0YXRlKTsKIAogLyogbG93IGxldmVsIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwotZXh0ZXJuIGludCBpYm1hc21fc2VuZF9pMm9fbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKLWV4dGVybiBpcnFyZXR1cm5fdCBpYm1hc21faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqIGRldl9pZCk7CitpbnQgaWJtYXNtX3NlbmRfaTJvX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CitpcnFyZXR1cm5fdCBpYm1hc21faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqIGRldl9pZCk7CiAKIC8qIHJlbW90ZSBjb25zb2xlICovCi1leHRlcm4gdm9pZCBpYm1hc21faGFuZGxlX21vdXNlX2ludGVycnVwdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKLWV4dGVybiBpbnQgaWJtYXNtX2luaXRfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKLWV4dGVybiB2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOworaW50IGlibWFzbV9pbml0X3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiAKIC8qIGZpbGUgc3lzdGVtICovCi1leHRlcm4gaW50IGlibWFzbWZzX3JlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaWJtYXNtZnNfdW5yZWdpc3Rlcih2b2lkKTsKLWV4dGVybiB2b2lkIGlibWFzbWZzX2FkZF9zcChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK2ludCBpYm1hc21mc19yZWdpc3Rlcih2b2lkKTsKK3ZvaWQgaWJtYXNtZnNfdW5yZWdpc3Rlcih2b2lkKTsKK3ZvaWQgaWJtYXNtZnNfYWRkX3NwKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwogCiAvKiB1YXJ0ICovCiAjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCi1leHRlcm4gdm9pZCBpYm1hc21fcmVnaXN0ZXJfdWFydChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKLWV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwordm9pZCBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwogI2Vsc2UKICNkZWZpbmUgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQogI2RlZmluZSBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHNwKQlkbyB7IH0gd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYwppbmRleCBjNDM2ZDNkLi5lYjdiMDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCkBAIC0xNywxMiArMTcsMTIgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCiAvKgotICogUGFydHMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiBhbiBhcnRpY2xlIGJ5IEpvbmF0aGFuIENvcmJldCAKKyAqIFBhcnRzIG9mIHRoaXMgY29kZSBhcmUgYmFzZWQgb24gYW4gYXJ0aWNsZSBieSBKb25hdGhhbiBDb3JiZXQKICAqIHRoYXQgYXBwZWFyZWQgaW4gTGludXggV2Vla2x5IE5ld3MuCiAgKi8KIApAQCAtNTUsMjIgKzU1LDIyIEBACiAgKiBGb3IgZWFjaCBzZXJ2aWNlIHByb2Nlc3NvciB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBjcmVhdGVkOgogICoKICAqIGNvbW1hbmQ6IGV4ZWN1dGUgZG90IGNvbW1hbmRzCi0gKiAJd3JpdGU6IGV4ZWN1dGUgYSBkb3QgY29tbWFuZCBvbiB0aGUgc2VydmljZSBwcm9jZXNzb3IKLSAqIAlyZWFkOiByZXR1cm4gdGhlIHJlc3VsdCBvZiBhIHByZXZpb3VzbHkgZXhlY3V0ZWQgZG90IGNvbW1hbmQKKyAqCXdyaXRlOiBleGVjdXRlIGEgZG90IGNvbW1hbmQgb24gdGhlIHNlcnZpY2UgcHJvY2Vzc29yCisgKglyZWFkOiByZXR1cm4gdGhlIHJlc3VsdCBvZiBhIHByZXZpb3VzbHkgZXhlY3V0ZWQgZG90IGNvbW1hbmQKICAqCiAgKiBldmVudHM6IGxpc3RlbiBmb3Igc2VydmljZSBwcm9jZXNzb3IgZXZlbnRzCi0gKiAJcmVhZDogc2xlZXAgKGludGVycnVwdGlibGUpIHVudGlsIGFuIGV2ZW50IG9jY3VycworICoJcmVhZDogc2xlZXAgKGludGVycnVwdGlibGUpIHVudGlsIGFuIGV2ZW50IG9jY3VycwogICogICAgICB3cml0ZTogd2FrZXVwIHNsZWVwaW5nIGV2ZW50IGxpc3RlbmVyCiAgKgogICogcmV2ZXJzZV9oZWFydGJlYXQ6IHNlbmQgYSBoZWFydGJlYXQgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yCi0gKiAJcmVhZDogc2xlZXAgKGludGVycnVwdGlibGUpIHVudGlsIHRoZSByZXZlcnNlIGhlYXJ0YmVhdCBmYWlscworICoJcmVhZDogc2xlZXAgKGludGVycnVwdGlibGUpIHVudGlsIHRoZSByZXZlcnNlIGhlYXJ0YmVhdCBmYWlscwogICogICAgICB3cml0ZTogd2FrZXVwIHNsZWVwaW5nIGhlYXJ0YmVhdCBsaXN0ZW5lcgogICoKICAqIHJlbW90ZV92aWRlby93aWR0aAogICogcmVtb3RlX3ZpZGVvL2hlaWdodAogICogcmVtb3RlX3ZpZGVvL3dpZHRoOiBjb250cm9sIHJlbW90ZSBkaXNwbGF5IHNldHRpbmdzCi0gKiAJd3JpdGU6IHNldCB2YWx1ZQotICogCXJlYWQ6IHJlYWQgdmFsdWUKKyAqCXdyaXRlOiBzZXQgdmFsdWUKKyAqCXJlYWQ6IHJlYWQgdmFsdWUKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTE1NSw3ICsxNTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqaWJtYXNtZnNfY3JlYXRlX2ZpbGUgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCi0JCSAgICAgICAJY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLAogCQkJdm9pZCAqZGF0YSwKIAkJCWludCBtb2RlKQpAQCAtMjYxLDcgKzI2MSw3IEBACiAJc3RydWN0IGlibWFzbWZzX2NvbW1hbmRfZGF0YSAqY29tbWFuZF9kYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGNvbW1hbmRfZGF0YS0+Y29tbWFuZCkKLQkJY29tbWFuZF9wdXQoY29tbWFuZF9kYXRhLT5jb21tYW5kKTsJCisJCWNvbW1hbmRfcHV0KGNvbW1hbmRfZGF0YS0+Y29tbWFuZCk7CiAKIAlrZnJlZShjb21tYW5kX2RhdGEpOwogCXJldHVybiAwOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiBzdGF0aWMgaW50IGV2ZW50X2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaWJtYXNtZnNfZXZlbnRfZGF0YSAqZXZlbnRfZGF0YTsKLQlzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwOyAKKwlzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwOwogCiAJaWYgKCFpbm9kZS0+aV9wcml2YXRlKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTU3Myw3ICs1NzMsNyBAQAogCQlrZnJlZShidWZmKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCQorCiAJdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmLCBOVUxMLCAxMCk7CiAJd3JpdGVsKHZhbHVlLCBhZGRyZXNzKTsKIAlrZnJlZShidWZmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbG93bGV2ZWwuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vbG93bGV2ZWwuYwppbmRleCBhM2M1ODliLi40YjIzOThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5oIGIvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5oCmluZGV4IGU1ZWQ1OWMuLjc2Njc2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbG93bGV2ZWwuaAorKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmgKQEAgLTE3LDcgKzE3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC00OCw5ICs0OCw5IEBACiAjZGVmaW5lIElOVFJfQ09OVFJPTF9SRUdJU1RFUiAgMHgxM0E0CiAKICNkZWZpbmUgU0NPVVRfQ09NX0FfQkFTRSAgICAgICAgIDB4MDAwMAotI2RlZmluZSBTQ09VVF9DT01fQl9CQVNFICAgICAgICAgMHgwMTAwICAgCi0jZGVmaW5lIFNDT1VUX0NPTV9DX0JBU0UgICAgICAgICAweDAyMDAgICAKLSNkZWZpbmUgU0NPVVRfQ09NX0RfQkFTRSAgICAgICAgIDB4MDMwMCAgIAorI2RlZmluZSBTQ09VVF9DT01fQl9CQVNFICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFNDT1VUX0NPTV9DX0JBU0UgICAgICAgICAweDAyMDAKKyNkZWZpbmUgU0NPVVRfQ09NX0RfQkFTRSAgICAgICAgIDB4MDMwMAogCiBzdGF0aWMgaW5saW5lIGludCBzcF9pbnRlcnJ1cHRfcGVuZGluZyh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcykKIHsKQEAgLTg2LDEyICs4NiwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX3VhcnRfaW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcykKIHsKLQlpYm1hc21fZW5hYmxlX2ludGVycnVwdHMoYmFzZV9hZGRyZXNzLCBVQVJUX0lOVFJfTUFTSyk7IAorCWlibWFzbV9lbmFibGVfaW50ZXJydXB0cyhiYXNlX2FkZHJlc3MsIFVBUlRfSU5UUl9NQVNLKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfdWFydF9pbnRlcnJ1cHRzKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQogewotCWlibWFzbV9kaXNhYmxlX2ludGVycnVwdHMoYmFzZV9hZGRyZXNzLCBVQVJUX0lOVFJfTUFTSyk7IAorCWlibWFzbV9kaXNhYmxlX2ludGVycnVwdHMoYmFzZV9hZGRyZXNzLCBVQVJUX0lOVFJfTUFTSyk7CiB9CiAKICNkZWZpbmUgdmFsaWRfbWZhKG1mYSkJKCAobWZhKSAhPSBOT19NRkFTX0FWQUlMQUJMRSApCkBAIC0xMTEsNyArMTExLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9tZmFfb3V0Ym91bmQodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsIHUzMiBtZmEpCiB7Ci0gICAJd3JpdGVsKG1mYSwgYmFzZV9hZGRyZXNzICsgT1VUQk9VTkRfUVVFVUVfUE9SVCk7CisJd3JpdGVsKG1mYSwgYmFzZV9hZGRyZXNzICsgT1VUQk9VTkRfUVVFVUVfUE9SVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGdldF9tZmFfaW5ib3VuZCh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcykKQEAgLTEyNiw3ICsxMjYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21mYV9pbmJvdW5kKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLCB1MzIgbWZhKQogewotICAgCXdyaXRlbChtZmEsIGJhc2VfYWRkcmVzcyArIElOQk9VTkRfUVVFVUVfUE9SVCk7CisJd3JpdGVsKG1mYSwgYmFzZV9hZGRyZXNzICsgSU5CT1VORF9RVUVVRV9QT1JUKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaTJvX21lc3NhZ2UgKmdldF9pMm9fbWVzc2FnZSh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywgdTMyIG1mYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL21vZHVsZS5jCmluZGV4IDJmM2JkZGYuLmZiMDNhODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYwpAQCAtMTgsOSArMTgsOSBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gY29kZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGV0ZSBSZXlub2xkcyAKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGNvZGUgb3JpZ2luYWxseSB3cml0dGVuIGJ5IFBldGUgUmV5bm9sZHMKICAqIGFuZCBvdGhlcnMuCiAgKgogICovCkBAIC0zMCwxMyArMzAsMTMgQEAKICAqCiAgKiAxKSBXaGVuIGxvYWRlZCBpdCBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yLAogICogaW5kaWNhdGluZyB0aGF0IGFuIE9TIGlzICogcnVubmluZy4gVGhpcyBjYXVzZXMgdGhlIHNlcnZpY2UgcHJvY2Vzc29yCi0gKiB0byBzZW5kIHBlcmlvZGljIGhlYXJ0YmVhdHMgdG8gdGhlIE9TLiAKKyAqIHRvIHNlbmQgcGVyaW9kaWMgaGVhcnRiZWF0cyB0byB0aGUgT1MuCiAgKgogICogMikgQW5zd2VycyB0aGUgcGVyaW9kaWMgaGVhcnRiZWF0cyBzZW50IGJ5IHRoZSBzZXJ2aWNlIHByb2Nlc3Nvci4KICAqIEZhaWx1cmUgdG8gZG8gc28gd291bGQgcmVzdWx0IGluIHN5c3RlbSByZWJvb3QuCiAgKgogICogMykgQWN0cyBhcyBhIHBhc3MgdGhyb3VnaCBmb3IgZG90IGNvbW1hbmRzIHNlbnQgZnJvbSB1c2VyIGFwcGxpY2F0aW9ucy4KLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgaXMgdGhlIGlibWFzbWZzIGZpbGUgc3lzdGVtLiAKKyAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgaXMgdGhlIGlibWFzbWZzIGZpbGUgc3lzdGVtLgogICoKICAqIDQpIEFsbG93cyB1c2VyIGFwcGxpY2F0aW9ucyB0byByZWdpc3RlciBmb3IgZXZlbnQgbm90aWZpY2F0aW9uLiBFdmVudHMKICAqIGFyZSBzZW50IHRvIHRoZSBkcml2ZXIgdGhyb3VnaCBpbnRlcnJ1cHRzLiBUaGV5IGNhbiBiZSByZWFkIGZyb20gdXNlcgpAQCAtMTA1LDcgKzEwNSw3IEBACiAJfQogCiAJc3AtPmlycSA9IHBkZXYtPmlycTsKLQlzcC0+YmFzZV9hZGRyZXNzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIAorCXNwLT5iYXNlX2FkZHJlc3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKIAkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CiAJaWYgKHNwLT5iYXNlX2FkZHJlc3MgPT0gMCkgewogCQlkZXZfZXJyKHNwLT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBwY2kgbWVtb3J5XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcl9oZWFydGJlYXQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vcl9oZWFydGJlYXQuYwppbmRleCBmOGZkYjJkLi5iZWM5ZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JfaGVhcnRiZWF0LmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9yX2hlYXJ0YmVhdC5jCkBAIC0xNiw3ICsxNiw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtMzYsMTAgKzM2LDEwIEBACiAJdW5zaWduZWQgY2hhcgkJCWNvbW1hbmRbM107CiB9IHJoYl9kb3RfY21kID0gewogCS5oZWFkZXIgPSB7Ci0JCS50eXBlID0gCXNwX3JlYWQsCisJCS50eXBlID0JCXNwX3JlYWQsCiAJCS5jb21tYW5kX3NpemUgPSAzLAogCQkuZGF0YV9zaXplID0JMCwKLQkJLnN0YXR1cyA9IAkwCisJCS5zdGF0dXMgPQkwCiAJfSwKIAkuY29tbWFuZCA9IHsgNCwgMywgNiB9CiB9OwpAQCAtNzYsOSArNzYsOSBAQAogCQlpZiAoY21kLT5zdGF0dXMgIT0gSUJNQVNNX0NNRF9DT01QTEVURSkKIAkJCXRpbWVzX2ZhaWxlZCsrOwogCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHJoYi0+d2FpdCwgCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHJoYi0+d2FpdCwKIAkJCXJoYi0+c3RvcHBlZCwKLQkJCVJFVkVSU0VfSEVBUlRCRUFUX1RJTUVPVVQgKiBIWik7IAkKKwkJCVJFVkVSU0VfSEVBUlRCRUFUX1RJTUVPVVQgKiBIWik7CiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8IHJoYi0+c3RvcHBlZCkgewogCQkJcmVzdWx0ID0gLUVJTlRSOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmMKaW5kZXggYTQwZmRhNi4uMDU1MGNlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5jCkBAIC0yOCwxMSArMjgsMTAgQEAKICNpbmNsdWRlICJpYm1hc20uaCIKICNpbmNsdWRlICJyZW1vdGUuaCIKIAotc3RhdGljIGludCB4bWF4ID0gMTYwMDsKLXN0YXRpYyBpbnQgeW1heCA9IDEyMDA7CisjZGVmaW5lIE1PVVNFX1hfTUFYCTE2MDAKKyNkZWZpbmUgTU9VU0VfWV9NQVgJMTIwMAogCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB4bGF0ZV9oaWdoW1hMQVRFX1NJWkVdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHhsYXRlX2hpZ2hbWExBVEVfU0laRV0gPSB7CiAJW0tFWV9TWU1fRU5URVIgJiAweGZmXSA9IEtFWV9FTlRFUiwKIAlbS0VZX1NZTV9LUFNMQVNIICYgMHhmZl0gPSBLRVlfS1BTTEFTSCwKIAlbS0VZX1NZTV9LUFNUQVIgJiAweGZmXSA9IEtFWV9LUEFTVEVSSVNLLApAQCAtODEsNyArODAsOCBAQAogCVtLRVlfU1lNX05VTV9MT0NLICYgMHhmZl0gPSBLRVlfTlVNTE9DSywKIAlbS0VZX1NZTV9TQ1JfTE9DSyAmIDB4ZmZdID0gS0VZX1NDUk9MTExPQ0ssCiB9Owotc3RhdGljIHVuc2lnbmVkIHNob3J0IHhsYXRlW1hMQVRFX1NJWkVdID0geworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeGxhdGVbWExBVEVfU0laRV0gPSB7CiAJW05PX0tFWUNPREVdID0gS0VZX1JFU0VSVkVELAogCVtLRVlfU1lNX1NQQUNFXSA9IEtFWV9TUEFDRSwKIAlbS0VZX1NZTV9USUxERV0gPSBLRVlfR1JBVkUsICAgICAgICBbS0VZX1NZTV9CS1RJQ10gPSBLRVlfR1JBVkUsCkBAIC0xMzMsMTkgKzEzMywxNiBAQAogCVtLRVlfU1lNX1pdID0gS0VZX1osICAgICAgICAgICAgICAgIFtLRVlfU1lNX3pdID0gS0VZX1osCiB9OwogCi1zdGF0aWMgY2hhciByZW1vdGVfbW91c2VfbmFtZVtdID0gImlibWFzbSBSU0EgSSByZW1vdGUgbW91c2UiOwotc3RhdGljIGNoYXIgcmVtb3RlX2tleWJkX25hbWVbXSA9ICJpYm1hc20gUlNBIEkgcmVtb3RlIGtleWJvYXJkIjsKLQogc3RhdGljIHZvaWQgcHJpbnRfaW5wdXQoc3RydWN0IHJlbW90ZV9pbnB1dCAqaW5wdXQpCiB7CiAJaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfTU9VU0UpIHsKIAkJdW5zaWduZWQgY2hhciBidXR0b25zID0gaW5wdXQtPm1vdXNlX2J1dHRvbnM7CiAJCWRiZygicmVtb3RlIG1vdXNlIG1vdmVtZW50OiAoeCx5KT0oJWQsJWQpJXMlcyVzJXNcbiIsCiAJCQlpbnB1dC0+ZGF0YS5tb3VzZS54LCBpbnB1dC0+ZGF0YS5tb3VzZS55LAotCQkJKGJ1dHRvbnMpPyIgLS0gYnV0dG9uczoiOiIiLAotCQkJKGJ1dHRvbnMgJiBSRU1PVEVfQlVUVE9OX0xFRlQpPyJsZWZ0ICI6IiIsCi0JCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTUlERExFKT8ibWlkZGxlICI6IiIsCi0JCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fUklHSFQpPyJyaWdodCI6IiIKKwkJCShidXR0b25zKSA/ICIgLS0gYnV0dG9uczoiIDogIiIsCisJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTEVGVCkgPyAibGVmdCAiIDogIiIsCisJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTUlERExFKSA/ICJtaWRkbGUgIiA6ICIiLAorCQkJKGJ1dHRvbnMgJiBSRU1PVEVfQlVUVE9OX1JJR0hUKSA/ICJyaWdodCIgOiAiIgogCQkgICAgICApOwogCX0gZWxzZSB7CiAJCWRiZygicmVtb3RlIGtleXByZXNzIChjb2RlLCBmbGFnLCBkb3duKToiCkBAIC0xODAsNyArMTc3LDcgQEAKIAkJa2V5ID0geGxhdGVfaGlnaFtjb2RlICYgMHhmZl07CiAJZWxzZQogCQlrZXkgPSB4bGF0ZVtjb2RlXTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwga2V5LCAoaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2Rvd24pID8gMSA6IDApOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXksIGlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9kb3duKTsKIAlpbnB1dF9zeW5jKGRldik7CiB9CiAKQEAgLTIyOCwyMCArMjI1LDIyIEBACiAJbW91c2VfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7CiAJbW91c2VfZGV2LT5pZC5wcm9kdWN0ID0gcGRldi0+ZGV2aWNlOwogCW1vdXNlX2Rldi0+aWQudmVyc2lvbiA9IDE7CisJbW91c2VfZGV2LT5kZXYucGFyZW50ID0gc3AtPmRldjsKIAltb3VzZV9kZXYtPmV2Yml0WzBdICA9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7CiAJbW91c2VfZGV2LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9IEJJVChCVE5fTEVGVCkgfAogCQlCSVQoQlROX1JJR0hUKSB8IEJJVChCVE5fTUlERExFKTsKIAlzZXRfYml0KEJUTl9UT1VDSCwgbW91c2VfZGV2LT5rZXliaXQpOwotCW1vdXNlX2Rldi0+bmFtZSA9IHJlbW90ZV9tb3VzZV9uYW1lOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKG1vdXNlX2RldiwgQUJTX1gsIDAsIHhtYXgsIDAsIDApOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKG1vdXNlX2RldiwgQUJTX1ksIDAsIHltYXgsIDAsIDApOworCW1vdXNlX2Rldi0+bmFtZSA9ICJpYm1hc20gUlNBIEkgcmVtb3RlIG1vdXNlIjsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhtb3VzZV9kZXYsIEFCU19YLCAwLCBNT1VTRV9YX01BWCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWSwgMCwgTU9VU0VfWV9NQVgsIDAsIDApOwogCi0JbW91c2VfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BDSTsKKwlrZXliZF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOwogCWtleWJkX2Rldi0+aWQudmVuZG9yID0gcGRldi0+dmVuZG9yOwogCWtleWJkX2Rldi0+aWQucHJvZHVjdCA9IHBkZXYtPmRldmljZTsKLQltb3VzZV9kZXYtPmlkLnZlcnNpb24gPSAyOworCWtleWJkX2Rldi0+aWQudmVyc2lvbiA9IDI7CisJa2V5YmRfZGV2LT5kZXYucGFyZW50ID0gc3AtPmRldjsKIAlrZXliZF9kZXYtPmV2Yml0WzBdICA9IEJJVChFVl9LRVkpOwotCWtleWJkX2Rldi0+bmFtZSA9IHJlbW90ZV9rZXliZF9uYW1lOworCWtleWJkX2Rldi0+bmFtZSA9ICJpYm1hc20gUlNBIEkgcmVtb3RlIGtleWJvYXJkIjsKIAogCWZvciAoaSA9IDA7IGkgPCBYTEFURV9TSVpFOyBpKyspIHsKIAkJaWYgKHhsYXRlX2hpZ2hbaV0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5oIGIvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuaAppbmRleCBiNzA3NmE4Li43MmFjZjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqIE9yaWduYWxseSB3cml0dGVuIGJ5IFBldGUgUmV5bm9sZHMKICAqLwpAQCAtNzMsNyArNzMsNyBAQAogCiAKIAotc3RydWN0IHJlbW90ZV9pbnB1dCB7IAorc3RydWN0IHJlbW90ZV9pbnB1dCB7CiAJdW5pb24gewogCQlzdHJ1Y3QgbW91c2VfaW5wdXQJbW91c2U7CiAJCXN0cnVjdCBrZXlib2FyZF9pbnB1dAlrZXlib2FyZDsKQEAgLTg1LDcgKzg1LDcgQEAKIAl1bnNpZ25lZCBjaGFyCXBhZDM7CiB9OwogCi0jZGVmaW5lIG1vdXNlX2FkZHIoc3ApIAkJKHNwLT5iYXNlX2FkZHJlc3MgKyBDT05ET1JfTU9VU0VfREFUQSkKKyNkZWZpbmUgbW91c2VfYWRkcihzcCkJCShzcC0+YmFzZV9hZGRyZXNzICsgQ09ORE9SX01PVVNFX0RBVEEpCiAjZGVmaW5lIGRpc3BsYXlfd2lkdGgoc3ApCShtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9JTlBVVF9ESVNQTEFZX1JFU1gpCiAjZGVmaW5lIGRpc3BsYXlfaGVpZ2h0KHNwKQkobW91c2VfYWRkcihzcCkgKyBDT05ET1JfSU5QVVRfRElTUExBWV9SRVNZKQogI2RlZmluZSBkaXNwbGF5X2RlcHRoKHNwKQkobW91c2VfYWRkcihzcCkgKyBDT05ET1JfSU5QVVRfRElTUExBWV9CSVRTKQpAQCAtOTMsNyArOTMsNyBAQAogI2RlZmluZSB2bmNfc3RhdHVzKHNwKQkJKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX09VVFBVVF9WTkNfU1RBVFVTKQogI2RlZmluZSBpc3JfY29udHJvbChzcCkJCShtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9NT1VTRV9JU1JfQ09OVFJPTCkKIAotI2RlZmluZSBtb3VzZV9pbnRlcnJ1cHRfcGVuZGluZyhzcCkgCXJlYWRsKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9TVEFUVVMpCisjZGVmaW5lIG1vdXNlX2ludGVycnVwdF9wZW5kaW5nKHNwKQlyZWFkbChtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9NT1VTRV9JU1JfU1RBVFVTKQogI2RlZmluZSBjbGVhcl9tb3VzZV9pbnRlcnJ1cHQoc3ApCXdyaXRlbCgwLCBtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9NT1VTRV9JU1JfU1RBVFVTKQogI2RlZmluZSBlbmFibGVfbW91c2VfaW50ZXJydXB0cyhzcCkJd3JpdGVsKDEsIG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9DT05UUk9MKQogI2RlZmluZSBkaXNhYmxlX21vdXNlX2ludGVycnVwdHMoc3ApCXdyaXRlbCgwLCBtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9NT1VTRV9JU1JfQ09OVFJPTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vdWFydC5jIGIvZHJpdmVycy9taXNjL2libWFzbS91YXJ0LmMKaW5kZXggOTc4M2NhZi4uOTNiYWEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS91YXJ0LmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS91YXJ0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCmluZGV4IDhlZTAzMjEuLjk2MjNlYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCkBAIC0xOTE3LDcgKzE5MTcsOCBAQAogICovCiBzdGF0aWMgaW50IHNvbnlfcGljX2Rpc2FibGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKEFDUElfRkFJTFVSRShhY3BpX2V2YWx1YXRlX29iamVjdChkZXZpY2UtPmhhbmRsZSwgIl9ESVMiLCAwLCBOVUxMKSkpCisJaWYgKEFDUElfRkFJTFVSRShhY3BpX2V2YWx1YXRlX29iamVjdChkZXZpY2UtPmhhbmRsZSwKKwkJCSJfRElTIiwgTlVMTCwgTlVMTCkpKQogCQlyZXR1cm4gLUVOWElPOwogCiAJZHByaW50aygiRGV2aWNlIGRpc2FibGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwppbmRleCA0ZmIyMDg5Li5iNTNkYWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KQEAgLTQ0LDExICs0NSw3IEBACiAJc3RydWN0IG1tY19xdWV1ZSAqbXEgPSBkOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbXEtPnF1ZXVlOwogCi0JLyoKLQkgKiBTZXQgaW90aHJlYWQgdG8gZW5zdXJlIHRoYXQgd2UgYXJlbid0IHB1dCB0byBzbGVlcCBieQotCSAqIHRoZSBwcm9jZXNzIGZyZWV6aW5nLiAgV2UgaGFuZGxlIHN1c3BlbnNpb24gb3Vyc2VsdmVzLgotCSAqLwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DfFBGX05PRlJFRVpFOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOwogCiAJZG93bigmbXEtPnRocmVhZF9zZW0pOwogCWRvIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCmluZGV4IDUxYmM3ZTIuLmVmODk3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtODAsNyArODEsNyBAQAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSA9IHRyLT5ibGtjb3JlX3ByaXYtPnJxOwogCiAJLyogd2UgbWlnaHQgZ2V0IGludm9sdmVkIHdoZW4gbWVtb3J5IGdldHMgbG93LCBzbyB1c2UgUEZfTUVNQUxMT0MgKi8KLQljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQyB8IFBGX05PRlJFRVpFOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOwogCiAJc3Bpbl9sb2NrX2lycShycS0+cXVldWVfbG9jayk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS93bC5jIGIvZHJpdmVycy9tdGQvdWJpL3dsLmMKaW5kZXggOWVjYWY3Ny4uYWIyMTc0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3dsLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3dsLmMKQEAgLTEzNDYsNiArMTM0Niw3IEBACiAJdWJpX21zZygiYmFja2dyb3VuZCB0aHJlYWQgXCIlc1wiIHN0YXJ0ZWQsIFBJRCAlZCIsCiAJCXViaS0+Ymd0X25hbWUsIGN1cnJlbnQtPnBpZCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCmluZGV4IDgwN2U2OTkuLmU5NzBlNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgxMzljcC5jCisrKyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCkBAIC0yNiw3ICsyNiw2IEBACiAKIAlUT0RPOgogCSogVGVzdCBUeCBjaGVja3N1bW1pbmcgdGhvcm91Z2hseQotCSogSW1wbGVtZW50IGRldi0+dHhfdGltZW91dAogCiAJTG93IHByaW9yaXR5IFRPRE86CiAJKiBDb21wbGV0ZSByZXNldCBvbiBQY2lFcnIKQEAgLTEyMTgsNiArMTIxNywzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjcF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lb3V0LCBzdGF0dXMgJTJ4ICU0eCAlNHggJTR4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGNwcjgoQ21kKSwgY3ByMTYoQ3BDbWQpLAorCSAgICAgICBjcHIxNihJbnRyU3RhdHVzKSwgY3ByMTYoSW50ck1hc2spKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCisJY3Bfc3RvcF9odyhjcCk7CisJY3BfY2xlYW5fcmluZ3MoY3ApOworCXJjID0gY3BfaW5pdF9yaW5ncyhjcCk7CisJY3Bfc3RhcnRfaHcoY3ApOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKwogI2lmZGVmIEJST0tFTgogc3RhdGljIGludCBjcF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewpAQCAtMTkyMCwxMCArMTk0Myw4IEBACiAJZGV2LT5jaGFuZ2VfbXR1ID0gY3BfY2hhbmdlX210dTsKICNlbmRpZgogCWRldi0+ZXRodG9vbF9vcHMgPSAmY3BfZXRodG9vbF9vcHM7Ci0jaWYgMAogCWRldi0+dHhfdGltZW91dCA9IGNwX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0jZW5kaWYKIAogI2lmIENQX1ZMQU5fVEFHX1VTRUQKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IGQxN2Q2NGUuLjQzZDAzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMjA1LDcgKzIwNSw3IEBACiBjb25maWcgTUFDQgogCXRyaXN0YXRlICJBdG1lbCBNQUNCIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVlIzMiB8fCBBUkNIX0FUOTFTQU05MjYwIHx8IEFSQ0hfQVQ5MVNBTTkyNjMKLQlzZWxlY3QgTUlJCisJc2VsZWN0IFBIWUxJQgogCWhlbHAKIAkgIFRoZSBBdG1lbCBNQUNCIGV0aGVybmV0IGludGVyZmFjZSBpcyBmb3VuZCBvbiBtYW55IEFUMzIgYW5kIEFUOTEKIAkgIHBhcnRzLiBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBNQUNCIGNoaXAuCkBAIC00MDUsMjIgKzQwNSw2IEBACiAJICBvbiB0aGUgQU1EIExhbmNlIGNoaXBzZXQ6IFJpZWJsQ2FyZCAod2l0aCBvciB3aXRob3V0IGJhdHRlcnkpLCBvcgogCSAgUEFNQ2FyZCBWTUUgKGFsc28gdGhlIHZlcnNpb24gYnkgUmhvdHJvbiwgd2l0aCBkaWZmZXJlbnQgYWRkcmVzc2VzKS4KIAotY29uZmlnIEFUQVJJX0JJT05FVAotCXRyaXN0YXRlICJCaW9OZXQtMTAwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBVEFSSSAmJiBBVEFSSV9BQ1NJICYmIEJST0tFTgotCWhlbHAKLQkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQmlvRGF0YSdzIEJpb05ldC0xMDAgRXRoZXJuZXQgYWRhcHRlcgotCSAgZm9yIHRoZSBBQ1NJIHBvcnQuIFRoZSBkcml2ZXIgd29ya3MgKGhhcyB0byB3b3JrLi4uKSB3aXRoIGEgcG9sbGVkCi0JICBJL08gc2NoZW1lLCBzbyBpdCdzIHJhdGhlciBzbG93IDotKAotCi1jb25maWcgQVRBUklfUEFNU05FVAotCXRyaXN0YXRlICJQQU1zTmV0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBVEFSSSAmJiBBVEFSSV9BQ1NJICYmIEJST0tFTgotCWhlbHAKLQkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBBTXNOZXQgRXRoZXJuZXQgYWRhcHRlciBmb3IgdGhlCi0JICBBQ1NJIHBvcnQgKCJBQ1NJIG5vZGUiKS4gVGhlIGRyaXZlciB3b3JrcyAoaGFzIHRvIHdvcmsuLi4pIHdpdGggYQotCSAgcG9sbGVkIEkvTyBzY2hlbWUsIHNvIGl0J3MgcmF0aGVyIHNsb3cgOi0oCi0KIGNvbmZpZyBTVU4zTEFOQ0UKIAl0cmlzdGF0ZSAiU3VuMy9TdW4zeCBvbi1ib2FyZCBMQU5DRSBzdXBwb3J0IgogCWRlcGVuZHMgb24gU1VOMyB8fCBTVU4zWApAQCAtNjA0LDYgKzU4OCwxMiBAQAogCSAgU3VwcG9ydCBmb3IgdGhlIFN1biBDYXNzaW5pIGNoaXAsIGFrYSBTdW4gR2lnYVN3aWZ0IEV0aGVybmV0LiBTZWUgYWxzbwogCSAgPGh0dHA6Ly93d3cuc3VuLmNvbS9wcm9kdWN0cy1uLXNvbHV0aW9ucy9oYXJkd2FyZS9kb2NzL3BkZi84MTctNDM0MS0xMC5wZGY+CiAKK2NvbmZpZyBTVU5WTkVUCisJdHJpc3RhdGUgIlN1biBWaXJ0dWFsIE5ldHdvcmsgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNVTl9MRE9NUworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHZpcnR1YWwgbmV0d29yayBkZXZpY2VzIHVuZGVyIFN1biBMb2dpY2FsIERvbWFpbnMuCisKIGNvbmZpZyBORVRfVkVORE9SXzNDT00KIAlib29sICIzQ09NIGNhcmRzIgogCWRlcGVuZHMgb24gSVNBIHx8IEVJU0EgfHwgTUNBIHx8IFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQppbmRleCBjMjZiODY3Li5lYjQxNjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtMzQsNiArMzQsNyBAQAogb2JqLSQoQ09ORklHX01ZUklfU0JVUykgKz0gbXlyaV9zYnVzLm8KIG9iai0kKENPTkZJR19TVU5HRU0pICs9IHN1bmdlbS5vIHN1bmdlbV9waHkubwogb2JqLSQoQ09ORklHX0NBU1NJTkkpICs9IGNhc3Npbmkubworb2JqLSQoQ09ORklHX1NVTlZORVQpICs9IHN1bnZuZXQubwogCiBvYmotJChDT05GSUdfTUFDRSkgKz0gbWFjZS5vCiBvYmotJChDT05GSUdfQk1BQykgKz0gYm1hYy5vCkBAIC0xODAsOCArMTgxLDYgQEAKIG9iai0kKENPTkZJR19TR0lfSU9DM19FVEgpICs9IGlvYzMtZXRoLm8KIG9iai0kKENPTkZJR19ERUNMQU5DRSkgKz0gZGVjbGFuY2Uubwogb2JqLSQoQ09ORklHX0FUQVJJTEFOQ0UpICs9IGF0YXJpbGFuY2Uubwotb2JqLSQoQ09ORklHX0FUQVJJX0JJT05FVCkgKz0gYXRhcmlfYmlvbmV0Lm8KLW9iai0kKENPTkZJR19BVEFSSV9QQU1TTkVUKSArPSBhdGFyaV9wYW1zbmV0Lm8KIG9iai0kKENPTkZJR19BMjA2NSkgKz0gYTIwNjUubwogb2JqLSQoQ09ORklHX0hZRFJBKSArPSBoeWRyYS5vCiBvYmotJChDT05GSUdfQVJJQURORSkgKz0gYXJpYWRuZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9TcGFjZS5jIGIvZHJpdmVycy9uZXQvU3BhY2UuYwppbmRleCAxYzNlMjkzLi4zYjc5YzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9TcGFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKQEAgLTc1LDggKzc1LDYgQEAKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM2xhbmNlX3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM184MjU4Nl9wcm9iZShpbnQgdW5pdCk7CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFwbmVfcHJvYmUoaW50IHVuaXQpOwotZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpiaW9uZXRfcHJvYmUoaW50IHVuaXQpOwotZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpwYW1zbmV0X3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY3M4OXgwX3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaHBsYW5jZV9wcm9iZShpbnQgdW5pdCk7CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmJhZ2V0bGFuY2VfcHJvYmUoaW50IHVuaXQpOwpAQCAtMjY0LDEyICsyNjIsNiBAQAogI2lmZGVmIENPTkZJR19BUE5FCQkvKiBBMTIwMCBQQ01DSUEgTkUyMDAwICovCiAJe2FwbmVfcHJvYmUsIDB9LAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FUQVJJX0JJT05FVAkvKiBBdGFyaSBCaW9uZXQgRXRoZXJuZXQgYm9hcmQgKi8KLQl7YmlvbmV0X3Byb2JlLCAwfSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BVEFSSV9QQU1TTkVUCS8qIEF0YXJpIFBBTXNOZXQgRXRoZXJuZXQgYm9hcmQgKi8KLQl7cGFtc25ldF9wcm9iZSwgMH0sCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfTVZNRTE0N19ORVQJLyogTVZNRTE0NyBpbnRlcm5hbCBFdGhlcm5ldCAqLwogCXttdm1lMTQ3bGFuY2VfcHJvYmUsIDB9LAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2FybS9LY29uZmlnCmluZGV4IDViZjJkMzMuLmY5Y2MyYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2FybS9LY29uZmlnCkBAIC00Myw2ICs0Myw3IEBACiBjb25maWcgRVA5M1hYX0VUSAogCXRyaXN0YXRlICJFUDkzeHggRXRoZXJuZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSTSAmJiBBUkNIX0VQOTNYWAorCXNlbGVjdCBNSUkKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgZXRoZXJuZXQgaGFyZHdhcmUgaW5jbHVkZWQgaW4gRVA5M3h4IENQVXMuCiAJICBTYXkgWSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBFUDkzeHggYmFzZWQgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkODdiZDIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzUgKzAsMCBAQAotLyogYmlvbmV0LmMgICAgIEJpb05ldC0xMDAgZGV2aWNlIGRyaXZlciBmb3IgbGludXg2OGsuCi0gKgotICogVmVyc2lvbjoJQCgjKWJpb25ldC5jCTEuMAkwMi8wNi85NgotICoKLSAqIEF1dGhvcjoJSGFydG11dCBMYXVlIDxsYXVlQGlmay1tcC51bmkta2llbC5kZT4KLSAqIGFuZAkJVG9yc3RlbiBOYXJqZXMgPG5hcmplc0BpZmstbXAudW5pLWtpZWwuZGU+Ci0gKgotICogTGl0dGxlIGFkYXB0aW9ucyBmb3IgaW50ZWdyYXRpb24gaW50byBwbDcgYnkgUm9tYW4gSG9kZWsKLSAqCi0gKiBTb21lIGNoYW5nZXMgaW4gYmlvbmV0X3BvbGxfcnggYnkgS2FybC1IZWlueiBMb2huZXIKLSAqCi0JV2hhdCBpcyBpdCA/Ci0JLS0tLS0tLS0tLS0tCi0JVGhpcyBkcml2ZXIgY29udHJvbHMgdGhlIEJJT05FVC0xMDAgTEFOLUFkYXB0ZXIgd2hpY2ggY29ubmVjdHMKLQlhbiBBVEFSSSBTVC9UVCB2aWEgdGhlIEFDU0ktcG9ydCB0byBhbiBFdGhlcm5ldC1iYXNlZCBuZXR3b3JrLgotCi0JVGhpcyB2ZXJzaW9uIGNhbiBiZSBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSAoU2VlIHRoZQotCWNvbXBpbGUgY29tbWFuZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSkuCi0JQXQgbG9hZCB0aW1lLCB5b3UgY2FuIG9wdGlvbmFsbHkgc2V0IHRoZSBkZWJ1Z2dpbmcgbGV2ZWwgYW5kIHRoZQotCWZhc3Rlc3QgcmVzcG9uc2UgdGltZSBvbiB0aGUgY29tbWFuZCBsaW5lIG9mICdpbnNtb2QnLgotCi0JJ2Jpb25ldF9kZWJ1ZycKLQkJY29udHJvbHMgdGhlIGFtb3VudCBvZiBkaWFnbm9zdGljIG1lc3NhZ2VzOgotCSAgMCAgOiBubyBtZXNzYWdlcwotCSAgPjAgOiBzZWUgY29kZSBmb3IgbWVhbmluZyBvZiBwcmludGVkIG1lc3NhZ2VzCi0KLQknYmlvbmV0X21pbl9wb2xsX3RpbWUnIChhbHdheXMgPj0xKQotCQlnaXZlcyB0aGUgdGltZSAoaW4gamlmZmllcykgYmV0d2VlbiBwb2xscy4gTG93IHZhbHVlcwotCQlpbmNyZWFzZSB0aGUgc3lzdGVtIGxvYWQgKGJld2FyZSEpCi0KLQlXaGVuIGxvYWRlZCwgYSBuZXQgZGV2aWNlIHdpdGggdGhlIG5hbWUgJ2JpbzAnIGJlY29tZXMgYXZhaWxhYmxlLAotCXdoaWNoIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIHVzdWFsICdpZmNvbmZpZycgY29tbWFuZC4KLQotCUl0IGlzIHBvc3NpYmxlIHRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgaW50byB0aGUga2VybmVsIGxpa2Ugb3RoZXIKLQkobmV0KSBkcml2ZXJzLiBGb3IgdGhpcyBwdXJwb3NlLCBzb21lIHNvdXJjZSBmaWxlcyAoZS5nLiBjb25maWctZmlsZXMKLQltYWtlZmlsZXMsIFNwYWNlLmMpIG11c3QgYmUgY2hhbmdlZCBhY2NvcmRpbmdseS4gKFlvdSBtYXkgcmVmZXIgdG8KLQlvdGhlciBkcml2ZXJzIGhvdyB0byBkbyBpdC4pIEluIHRoaXMgY2FzZSwgdGhlIGRldmljZSB3aWxsIGJlIGRldGVjdGVkCi0JYXQgYm9vdCB0aW1lIGFuZCAocHJvYmFibHkpIGFwcGVhciBhcyAnZXRoMCcuCi0KLQlUaGlzIGNvZGUgaXMgYmFzZWQgb24gc2V2ZXJhbCBzb3VyY2VzOgotCS0gVGhlIGRyaXZlciBjb2RlIGZvciBhIHBhcmFsbGVsIHBvcnQgZXRoZXJuZXQgYWRhcHRlciBieQotCSAgRG9uYWxkIEJlY2tlciAoc2VlIGZpbGUgJ2F0cC5jJyBmcm9tIHRoZSBQQyBsaW51eCBkaXN0cmlidXRpb24pCi0JLSBUaGUgQUNTSSBjb2RlIGJ5IFJvbWFuIEhvZGVrIGZvciB0aGUgQVRBUkktQUNTSSBoYXJkZGlzayBzdXBwb3J0Ci0JICBhbmQgRE1BIGhhbmRsaW5nLgotCS0gVmVyeSBsaW1pdGVkIGluZm9ybWF0aW9uIGFib3V0IG1vdmluZyBwYWNrZXRzIGluIGFuZCBvdXQgb2YgdGhlCi0JICBCSU9ORVQtYWRhcHRlciBmcm9tIHRoZSBUQ1AgcGFja2FnZSBmb3IgVE9TIGJ5IEJpb0RhdGEgR21iSC4KLQotCVRoZW9yeSBvZiBPcGVyYXRpb24KLQktLS0tLS0tLS0tLS0tLS0tLS0tCi0JQmVjYXVzZSB0aGUgQVRBUkkgRE1BIHBvcnQgaXMgdXN1YWxseSBzaGFyZWQgYmV0d2VlbiBzZXZlcmFsCi0JZGV2aWNlcyAoZWcuIGhhcmRkaXNrLCBmbG9wcHkpIHdlIGNhbm5vdCBibG9jayB0aGUgQUNTSSBidXMKLQl3aGlsZSB3YWl0aW5nIGZvciBpbnRlcnJ1cHRzLiBUaGVyZWZvcmUgd2UgdXNlIGEgcG9sbGluZyBtZWNoYW5pc20KLQl0byBmZXRjaCBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHNlbmQKLQlwYWNrZXRzIHdpdGhvdXQgY2hlY2tpbmcgdGhhdCB0aGUgcHJldmlvdXMgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8KLQl0aGUgTEFOLiBXZSByZWx5IG9uIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBuZXR3b3JraW5nIGNvZGUgdG8gZGV0ZWN0Ci0JbWlzc2luZyBwYWNrZXRzIGFuZCByZXNlbmQgdGhlbS4KLQotCUJlZm9yZSB3ZSBhY2Nlc3MgdGhlIEFUQVJJIERNQSBjb250cm9sbGVyLCB3ZSBjaGVjayBpZiBhbm90aGVyCi0JcHJvY2VzcyBpcyB1c2luZyB0aGUgRE1BLiBJZiBub3QsIHdlIGxvY2sgdGhlIERNQSwgcGVyZm9ybSBvbmUgb3IKLQltb3JlIHBhY2tldCB0cmFuc2ZlcnMgYW5kIHVubG9jayB0aGUgRE1BIGJlZm9yZSByZXR1cm5pbmcuCi0JV2UgZG8gbm90IHVzZSAnc3RkbWFfbG9jaycgdW5jb25kaXRpb25hbGx5IGJlY2F1c2UgaXQgaXMgdW5jbGVhcgotCWlmIHRoZSBuZXR3b3JraW5nIGNvZGUgY2FuIGJlIHNldCB0byBzbGVlcCwgd2hpY2ggd2lsbCBoYXBwZW4gaWYKLQlhbm90aGVyIChwb3NzaWJseSBzbG93KSBkZXZpY2UgaXMgdXNpbmcgdGhlIERNQSBjb250cm9sbGVyLgotCi0JVGhlIHBvbGxpbmcgaXMgZG9uZSB2aWEgdGltZXIgaW50ZXJydXB0cyB3aGljaCBwZXJpb2RpY2FsbHkKLQknc2ltdWxhdGUnIGFuIGludGVycnVwdCBmcm9tIHRoZSBFdGhlcm5ldCBhZGFwdGVyLiBUaGUgdGltZSAoaW4gamlmZmllcykKLQliZXR3ZWVuIHBvbGxzIHZhcmllcyBkZXBlbmRpbmcgb24gYW4gZXN0aW1hdGUgb2YgdGhlIG5ldCBhY3Rpdml0eS4KLQlUaGUgYWxsb3dlZCByYW5nZSBpcyBnaXZlbiBieSB0aGUgdmFyaWFibGUgJ2Jpb25ldF9taW5fcG9sbF90aW1lJwotCWZvciB0aGUgbG93ZXIgKGZhc3Rlc3QpIGxpbWl0IGFuZCB0aGUgY29uc3RhbnQgJ01BWF9QT0xMX1RJTUUnCi0JZm9yIHRoZSBoaWdoZXIgKHNsb3dlc3QpIGxpbWl0LgotCi0JV2hlbmV2ZXIgYSBwYWNrZXQgYXJyaXZlcywgd2Ugc3dpdGNoIHRvIGZhc3Rlc3QgcmVzcG9uc2UgYnkgc2V0dGluZwotCXRoZSBwb2xsaW5nIHRpbWUgdG8gaXRzIGxvd2VzdCBsaW1pdC4gSWYgdGhlIGZvbGxvd2luZyBwb2xsIGZhaWxzLAotCWJlY2F1c2Ugbm8gcGFja2V0cyBoYXZlIGFycml2ZWQsIHdlIGluY3JlYXNlIHRoZSB0aW1lIGZvciB0aGUgbmV4dAotCXBvbGwuIFdoZW4gdGhlIG5ldCBhY3Rpdml0eSBpcyBsb3csIHRoZSBwb2xsaW5nIHRpbWUgZWZmZWN0aXZlbHkKLQlzdGF5cyBhdCBpdHMgbWF4aW11bSB2YWx1ZSwgcmVzdWx0aW5nIGluIHRoZSBsb3dlc3QgbG9hZCBmb3IgdGhlCi0JbWFjaGluZS4KLSAqLwotCi0jZGVmaW5lIE1BWF9QT0xMX1RJTUUJMTAKLQotc3RhdGljIGNoYXIgdmVyc2lvbltdID0KLQkiYmlvbmV0LmM6djEuMCAwNi1mZWItOTYgKGMpIEhhcnRtdXQgTGF1ZS5cbiI7Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlody5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfYWNzaS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9zdGRtYS5oPgotCi0KLS8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZwotICovCi0jaWZuZGVmIE5FVF9ERUJVRwotI2RlZmluZSBORVRfREVCVUcgMAotI2VuZGlmCi0vKgotICogR2xvYmFsIHZhcmlhYmxlICdiaW9uZXRfZGVidWcnLiBDYW4gYmUgc2V0IGF0IGxvYWQgdGltZSBieSAnaW5zbW9kJwotICovCi11bnNpZ25lZCBpbnQgYmlvbmV0X2RlYnVnID0gTkVUX0RFQlVHOwotbW9kdWxlX3BhcmFtKGJpb25ldF9kZWJ1ZywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYmlvbmV0X2RlYnVnLCAiYmlvbmV0IGRlYnVnIGxldmVsICgwLTIpIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYmlvbmV0X21pbl9wb2xsX3RpbWUgPSAyOwotCi0KLS8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLgotICovCi1zdHJ1Y3QgbmV0X2xvY2FsIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlsb25nIG9wZW5fdGltZTsJCQkvKiBmb3IgZGVidWdnaW5nICovCi0JaW50ICBwb2xsX3RpbWU7CQkJLyogcG9sbGluZyB0aW1lIHZhcmllcyB3aXRoIG5ldCBsb2FkICovCi19OwotCi1zdGF0aWMgc3RydWN0IG5pY19wa3RfcyB7CQkvKiBwYWNrZXQgZm9ybWF0ICovCi0JdW5zaWduZWQgY2hhcglzdGF0dXM7Ci0JdW5zaWduZWQgY2hhcglkdW1teTsKLQl1bnNpZ25lZCBjaGFyCWxfbG8sIGxfaGk7Ci0JdW5zaWduZWQgY2hhcglidWZmZXJbMzAwMF07Ci19ICpuaWNfcGFja2V0OwotdW5zaWduZWQgY2hhciAqcGh5c19uaWNfcGFja2V0OwotCi0vKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0gKi8KLXN0YXRpYyBpbnQgYmlvbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IGJpb25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGJpb25ldF9wb2xsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOwotc3RhdGljIGludCBiaW9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBiaW9uZXRfdGljayh1bnNpZ25lZCBsb25nKTsKLQotc3RhdGljIERFRklORV9USU1FUihiaW9uZXRfdGltZXIsIGJpb25ldF90aWNrLCAwLCAwKTsKLQotI2RlZmluZSBTVFJBTV9BRERSKGEpCSgoKGEpICYgMHhmZjAwMDAwMCkgPT0gMCkKLQotLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY2Nlc3MgdGhlIGV0aGVybmV0IGJvYXJkIGNvbm5lY3RlZCB0byB0aGUKLSAqIEFDU0kgcG9ydCB2aWEgdGhlIHN0X2RtYSBjaGlwLgotICovCi0jZGVmaW5lIE5PREVfQURSIDB4NjAKLQotI2RlZmluZSBDX1JFQUQgOAotI2RlZmluZSBDX1dSSVRFIDB4MGEKLSNkZWZpbmUgQ19HRVRFQSAweDBmCi0jZGVmaW5lIENfU0VUQ1IgMHgwZQotCi1zdGF0aWMgaW50Ci1zZW5kY21kKHVuc2lnbmVkIGludCBhMCwgdW5zaWduZWQgaW50IG1vZCwgdW5zaWduZWQgaW50IGNtZCkgewotCXVuc2lnbmVkIGludCBjOwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IChtb2QgfCAoKGEwKSA/IDIgOiAwKSB8IDB4ODgpOwotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSBjbWQ7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IChtb2QgfCAweDhhKTsKLQotCWlmKCAhYWNzaV93YWl0X2Zvcl9JUlEoSFovMikgKQkvKiB3YWl0IGZvciBjbWQgYWNrICovCi0JCXJldHVybiAtMTsJCS8qIHRpbWVvdXQgKi8KLQotCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OwotCXJldHVybiAoYyAmIDB4ZmYpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfc3RhdHVzKGludCBjcikgewotCXNlbmRjbWQoMCwweDEwMCxOT0RFX0FEUiB8IENfU0VUQ1IpOyAgICAvKiBDTUQ6IFNFVCBDUiAqLwotCXNlbmRjbWQoMSwweDEwMCxjcik7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg4MDsKLX0KLQotc3RhdGljIGludAotZ2V0X3N0YXR1cyh1bnNpZ25lZCBjaGFyICphZHIpIHsKLQlpbnQgaSxjOwotCi0JRElTQUJMRV9JUlEoKTsKLQljID0gc2VuZGNtZCgwLDB4MDAsTk9ERV9BRFIgfCBDX0dFVEVBKTsgIC8qIENNRDogR0VUIEVUSCBBRFIqLwotCWlmKCBjIDwgMCApIGdvdG8gZ3NlbmQ7Ci0KLQkvKiBub3cgcmVhZCBzdGF0dXMgYnl0ZXMgKi8KLQotCWZvciAoaT0wOyBpPDY7IGkrKykgewotCQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50ID0gMDsJLyogcmVxdWVzdCBuZXh0IGJ5dGUgKi8KLQotICAgIAkJaWYoICFhY3NpX3dhaXRfZm9yX0lSUShIWi8yKSApIHsJLyogd2FpdCBmb3IgY21kIGFjayAqLwotCQkJYyA9IC0xOwotCQkJZ290byBnc2VuZDsJCS8qIHRpbWVvdXQgKi8KLQkJfQotCQljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKLQkJKmFkcisrID0gKHVuc2lnbmVkIGNoYXIpYzsKLQl9Ci0JYyA9IDE7Ci1nc2VuZDoKLSAgCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDgwOwotCXJldHVybiBjOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QKLWJpb25ldF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpIHsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotc3RhdGljIGludAotZ2V0X2ZyYW1lKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBvZGQpIHsKLQlpbnQgYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRElTQUJMRV9JUlEoKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCQk9IDB4OWE7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwkJPSAweDE5YTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCQk9IDB4OWE7Ci0JZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudAk9IDB4MDQ7CQkvKiBzZWN0b3IgY291bnQgKHdhcyA1KSAqLwotCWRtYV93ZC5kbWFfbG8JCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCXBhZGRyID4+PSA4OwotCWRtYV93ZC5kbWFfbWQJCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCXBhZGRyID4+PSA4OwotCWRtYV93ZC5kbWFfaGkJCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWMgPSBzZW5kY21kKDAsMHgwMCxOT0RFX0FEUiB8IENfUkVBRCk7CS8qIENNRDogUkVBRCAqLwotCWlmKCBjIDwgMTI4ICkgZ290byByZW5kOwotCi0JLyogbm93IHJlYWQgYmxvY2sgKi8KLQotCWMgPSBzZW5kY21kKDEsMHgwMCxvZGQpOwkvKiBvZGQgZmxhZyBmb3IgYWRkcmVzcyBzaGlmdCAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDBhOwotCi0JaWYoICFhY3NpX3dhaXRfZm9yX0lSUSgxMDApICkgewkvKiB3YWl0IGZvciBETUEgdG8gY29tcGxldGUgKi8KLQkJYyA9IC0xOwotCQlnb3RvIHJlbmQ7Ci0JfQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDhhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE4YTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4YTsKLQljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDg4OwotCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OwotCWMgPSAxOwotCi1yZW5kOgotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDgwOwotCXVkZWxheSg0MCk7Ci0JYWNzaV93YWl0X2Zvcl9ub0lSUSgyMCk7Ci0JcmV0dXJuIGM7Ci19Ci0KLQotc3RhdGljIGludAotaGFyZHdhcmVfc2VuZF9wYWNrZXQodW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGNudCkgewotCXVuc2lnbmVkIGludCBjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlESVNBQkxFX0lSUSgpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE5YTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg5YTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOWE7Ci0JZG1hX3dkLmRtYV9sbwkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlkbWFfd2QuZG1hX21kCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCXBhZGRyID4+PSA4OwotCWRtYV93ZC5kbWFfaGkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0KLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50CT0gMHg0OwkJLyogc2VjdG9yIGNvdW50ICovCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JYyA9IHNlbmRjbWQoMCwweDEwMCxOT0RFX0FEUiB8IENfV1JJVEUpOwkvKiBDTUQ6IFdSSVRFICovCi0JYyA9IHNlbmRjbWQoMSwweDEwMCxjbnQmMHhmZik7Ci0JYyA9IHNlbmRjbWQoMSwweDEwMCxjbnQ+PjgpOwotCi0JLyogbm93IHdyaXRlIGJsb2NrICovCi0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxMGE7CS8qIERNQSBlbmFibGUgKi8KLQlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKDEwMCkgKQkJLyogd2FpdCBmb3IgRE1BIHRvIGNvbXBsZXRlICovCi0JCWdvdG8gZW5kOwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTlhOwkvKiBETUEgZGlzYWJsZSAhICovCi0JYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7Ci0KLWVuZDoKLQljID0gc2VuZGNtZCgxLDB4MTAwLDApOwotCWMgPSBzZW5kY21kKDEsMHgxMDAsMCk7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxODA7Ci0JdWRlbGF5KDQwKTsKLQlhY3NpX3dhaXRfZm9yX25vSVJRKDIwKTsKLQlyZXR1cm4oIGMgJiAweDAyKTsKLX0KLQotCi0vKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgotICovCi1zdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBiaW9uZXRfcHJvYmUoaW50IHVuaXQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBjaGFyIHN0YXRpb25fYWRkcls2XTsKLQlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwotCXN0YXRpYyBpbnQgbm9fbW9yZV9mb3VuZDsJLyogYXZvaWQgIlByb2JpbmcgZm9yLi4uIiBwcmludGVkIDQgdGltZXMgKi8KLQlpbnQgaTsKLQlpbnQgZXJyOwotCi0JaWYgKCFNQUNIX0lTX0FUQVJJIHx8IG5vX21vcmVfZm91bmQpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCi0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaWYgKHVuaXQgPj0gMCkgewotCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7Ci0JCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7Ci0JfQotCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKLQotCXByaW50aygiUHJvYmluZyBmb3IgQmlvTmV0IDEwMCBBZGFwdGVyLi4uXG4iKTsKLQotCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOwotCWkgPSBnZXRfc3RhdHVzKHN0YXRpb25fYWRkcik7CS8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NLiAgKi8KLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCi0JLyogQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgUy5BLiBmb3IgdGhlIG1hbnVmYWN0b3IncyBjb2RlLgotCSAqLwotCi0JaWYoIGkgPCAwCi0JfHwgIHN0YXRpb25fYWRkclswXSAhPSAnQicKLQl8fCAgc3RhdGlvbl9hZGRyWzFdICE9ICdJJwotCXx8ICBzdGF0aW9uX2FkZHJbMl0gIT0gJ08nICkgewotCQlub19tb3JlX2ZvdW5kID0gMTsKLQkJcHJpbnRrKCAiTm8gQmlvTmV0IDEwMCBmb3VuZC5cbiIgKTsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JfQotCi0JaWYgKGJpb25ldF9kZWJ1ZyA+IDAgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKLQkJcHJpbnRrKHZlcnNpb24pOwotCi0JcHJpbnRrKCIlczogJXMgZm91bmQsIGV0aC1hZGRyOiAlMDJ4LSUwMngtJTAyeDolMDJ4LSUwMngtJTAyeC5cbiIsCi0JCWRldi0+bmFtZSwgIkJpb05ldCAxMDAiLAotCQlzdGF0aW9uX2FkZHJbMF0sIHN0YXRpb25fYWRkclsxXSwgc3RhdGlvbl9hZGRyWzJdLAotCQlzdGF0aW9uX2FkZHJbM10sIHN0YXRpb25fYWRkcls0XSwgc3RhdGlvbl9hZGRyWzVdKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0KLQluaWNfcGFja2V0ID0gKHN0cnVjdCBuaWNfcGt0X3MgKilhY3NpX2J1ZmZlcjsKLQlwaHlzX25pY19wYWNrZXQgPSAodW5zaWduZWQgY2hhciAqKXBoeXNfYWNzaV9idWZmZXI7Ci0JaWYgKGJpb25ldF9kZWJ1ZyA+IDApIHsKLQkJcHJpbnRrKCJuaWNfcGFja2V0IGF0IDB4JXAsIHBoeXMgYXQgMHglcFxuIiwKLQkJCW5pY19wYWNrZXQsIHBoeXNfbmljX3BhY2tldCApOwotCX0KLQotCWRldi0+b3BlbgkJPSBiaW9uZXRfb3BlbjsKLQlkZXYtPnN0b3AJCT0gYmlvbmV0X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gYmlvbmV0X3NlbmRfcGFja2V0OwotCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7Ci0KLQkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldC1nZW5lcmljCi0JICogdmFsdWVzLiBUaGlzIHNob3VsZCBiZSBpbiBhIGNvbW1vbiBmaWxlIGluc3RlYWQgb2YgcGVyLWRyaXZlci4KLQkgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7Ci0jaWYgMAotCQlkZXYtPmJyb2FkY2FzdFtpXSA9IDB4ZmY7Ci0jZW5kaWYKLQkJZGV2LT5kZXZfYWRkcltpXSAgPSBzdGF0aW9uX2FkZHJbaV07Ci0JfQotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmICghZXJyKQotCQlyZXR1cm4gZGV2OwotCWZyZWVfbmV0ZGV2KGRldik7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCi0gICBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCi0KLSAgIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KLSAgIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0Ci0gICB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgotICovCi1zdGF0aWMgaW50Ci1iaW9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKGJpb25ldF9kZWJ1ZyA+IDApCi0JCXByaW50aygiYmlvbmV0X29wZW5cbiIpOwotCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOwotCi0JLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuCi0JICovCi0Jc2V0X3N0YXR1cyg0KTsKLQlscC0+b3Blbl90aW1lID0gMDsJLypqaWZmaWVzKi8KLQlscC0+cG9sbF90aW1lID0gTUFYX1BPTExfVElNRTsKLQotCWRldi0+dGJ1c3kgPSAwOwotCWRldi0+aW50ZXJydXB0ID0gMDsKLQlkZXYtPnN0YXJ0ID0gMTsKLQotCXN0ZG1hX3JlbGVhc2UoKTsKLQliaW9uZXRfdGltZXIuZGF0YSA9IChsb25nKWRldjsKLQliaW9uZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOwotCWFkZF90aW1lcigmYmlvbmV0X3RpbWVyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotYmlvbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gIFRoaXMgY291bGQgYmV0dGVyIGJlCi0JICogZG9uZSB3aXRoIGF0b21pY19zd2FwKDEsIGRldi0+dGJ1c3kpLCBidXQgc2V0X2JpdCgpIHdvcmtzIGFzIHdlbGwuCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlscC0+c3RhdHMudHhfZXJyb3JzKys7Ci0JfQotCWVsc2UgewotCQlpbnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47Ci0JCXVuc2lnbmVkIGxvbmcgYnVmID0gdmlydF90b19waHlzKHNrYi0+ZGF0YSk7Ci0JCWludCBzdGF0OwotCi0JCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWlmKCAhU1RSQU1fQUREUihidWYrbGVuZ3RoLTEpICkgewotCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKLQkJCQkJCSAgbGVuZ3RoKTsKLQkJCWJ1ZiA9ICh1bnNpZ25lZCBsb25nKSYoKHN0cnVjdCBuaWNfcGt0X3MgKilwaHlzX25pY19wYWNrZXQpLT5idWZmZXI7Ci0JCX0KLQotCQlpZiAoYmlvbmV0X2RlYnVnID4xKSB7Ci0JCQl1X2NoYXIgKmRhdGEgPSBuaWNfcGFja2V0LT5idWZmZXIsICpwOwotCQkJaW50IGk7Ci0KLQkJCXByaW50ayggIiVzOiBUWCBwa3QgdHlwZSAweCU0eCBmcm9tICIsIGRldi0+bmFtZSwKLQkJCQkgICgodV9zaG9ydCAqKWRhdGEpWzZdKTsKLQotCQkJZm9yKCBwID0gJmRhdGFbNl0sIGkgPSAwOyBpIDwgNjsgaSsrICkKLQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgKTsKLQkJCXByaW50aygiIHRvICIpOwotCi0JCQlmb3IoIHAgPSBkYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCi0JCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLGkgIT0gNSA/ICI6IiA6ICIiICJcbiIgKTsKLQotCQkJcHJpbnRrKCAiJXM6ICIsIGRldi0+bmFtZSApOwotCQkJcHJpbnRrKCIgZGF0YSAlMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4IgotCQkJICAgICAgICIgJTAyeCUwMnglMDJ4JTAyeCBsZW4gJWRcbiIsCi0JCQkJICBkYXRhWzEyXSwgZGF0YVsxM10sIGRhdGFbMTRdLCBkYXRhWzE1XSwgZGF0YVsxNl0sIGRhdGFbMTddLCBkYXRhWzE4XSwgZGF0YVsxOV0sCi0JCQkJICBkYXRhWzIwXSwgZGF0YVsyMV0sIGRhdGFbMjJdLCBkYXRhWzIzXSwgZGF0YVsyNF0sIGRhdGFbMjVdLCBkYXRhWzI2XSwgZGF0YVsyN10sCi0JCQkJICBkYXRhWzI4XSwgZGF0YVsyOV0sIGRhdGFbMzBdLCBkYXRhWzMxXSwgZGF0YVszMl0sIGRhdGFbMzNdLAotCQkJCSAgbGVuZ3RoICk7Ci0JCX0KLQkJZG1hX2NhY2hlX21haW50ZW5hbmNlKGJ1ZiwgbGVuZ3RoLCAxKTsKLQotCQlzdGF0ID0gaGFyZHdhcmVfc2VuZF9wYWNrZXQoYnVmLCBsZW5ndGgpOwotCQlFTkFCTEVfSVJRKCk7Ci0JCXN0ZG1hX3JlbGVhc2UoKTsKLQotCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJZGV2LT50YnVzeQkgPSAwOwotCQlscC0+c3RhdHMudHhfcGFja2V0cysrOwotCQlscC0+c3RhdHMudHhfYnl0ZXMrPWxlbmd0aDsKLQl9Ci0JZGV2X2tmcmVlX3NrYihza2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgotICovCi1zdGF0aWMgdm9pZAotYmlvbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgYm9ndXNjb3VudCA9IDEwOwotCWludCBwa3RfbGVuLCBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiArK3JvbWFuOiBUYWtlIGNhcmUgYXQgbG9ja2luZyB0aGUgU1QtRE1BLi4uIFRoaXMgbXVzdCBiZSBkb25lIHdpdGggaW50cwotCSAqIG9mZiwgc2luY2Ugb3RoZXJ3aXNlIGFuIGludCBjb3VsZCBzbGlwIGluIGJldHdlZW4gdGhlIHF1ZXN0aW9uIGFuZCB0aGUKLQkgKiBsb2NraW5nIGl0c2VsZiwgYW5kIHRoZW4gd2UnZCBnbyB0byBzbGVlcC4uLiBBbmQgbG9ja2luZyBpdHNlbGYgaXMKLQkgKiBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgZmxvcHB5X2NoYW5nZSB0aW1lciBmcm9tIHdvcmtpbmcgd2l0aCBTVC1ETUEKLQkgKiByZWdpc3RlcnMuICovCi0JaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOwotCURJU0FCTEVfSVJRKCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JaWYoIGxwLT5wb2xsX3RpbWUgPCBNQVhfUE9MTF9USU1FICkgbHAtPnBvbGxfdGltZSsrOwotCi0Jd2hpbGUoYm9ndXNjb3VudC0tKSB7Ci0JCXN0YXR1cyA9IGdldF9mcmFtZSgodW5zaWduZWQgbG9uZylwaHlzX25pY19wYWNrZXQsIDApOwotCi0JCWlmKCBzdGF0dXMgPT0gMCApIGJyZWFrOwotCi0JCS8qIEdvb2QgcGFja2V0Li4uICovCi0KLQkJZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgMTUyMCwgMCk7Ci0KLQkJcGt0X2xlbiA9IChuaWNfcGFja2V0LT5sX2hpIDw8IDgpIHwgbmljX3BhY2tldC0+bF9sbzsKLQotCQlscC0+cG9sbF90aW1lID0gYmlvbmV0X21pbl9wb2xsX3RpbWU7ICAgIC8qIGZhc3QgcG9sbCAqLwotCQlpZiggcGt0X2xlbiA+PSA2MCAmJiBwa3RfbGVuIDw9IDE1MjAgKSB7Ci0JCQkJCS8qCV5eXl4gd2FyIDE1MTQgIEtITCAqLwotCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuCi0JCQkgKi8KLQkJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKCBwa3RfbGVuICsgMiApOwotCQkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCi0JCQkJCWRldi0+bmFtZSk7Ci0JCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkJLyogMTYgQnl0ZSBhbGlnbiAgKi8KLQkJCXNrYl9wdXQoIHNrYiwgcGt0X2xlbiApOwkvKiBtYWtlIHJvb20gKi8KLQotCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KLQkJCSAqLwotCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBuaWNfcGFja2V0LT5idWZmZXIsCi0JCQkJCQlwa3RfbGVuKTsKLQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyggc2tiLCBkZXYgKTsKLQkJCW5ldGlmX3J4KHNrYik7Ci0JCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKLQotCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQotCSAgIGhhcyBkb25lIGEgbWFya19iaChJTkVUX0JIKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCi0JICAgd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuCi0JICovCi0KLSAJCQlpZiAoYmlvbmV0X2RlYnVnID4xKSB7Ci0gCQkJCXVfY2hhciAqZGF0YSA9IG5pY19wYWNrZXQtPmJ1ZmZlciwgKnA7Ci0gCQkJCWludCBpOwotCi0gCQkJCXByaW50ayggIiVzOiBSWCBwa3QgdHlwZSAweCU0eCBmcm9tICIsIGRldi0+bmFtZSwKLSAJCQkJCSAgKCh1X3Nob3J0ICopZGF0YSlbNl0pOwotCi0KLSAJCQkJZm9yKCBwID0gJmRhdGFbNl0sIGkgPSAwOyBpIDwgNjsgaSsrICkKLSAJCQkJCXByaW50aygiJTAyeCVzIiwgKnArKyxpICE9IDUgPyAiOiIgOiAiIiApOwotIAkJCQlwcmludGsoIiB0byAiKTsKLSAJCQkJZm9yKCBwID0gZGF0YSwgaSA9IDA7IGkgPCA2OyBpKysgKQotIAkJCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLGkgIT0gNSA/ICI6IiA6ICIiICJcbiIgKTsKLQotIAkJCQlwcmludGsoICIlczogIiwgZGV2LT5uYW1lICk7Ci0gCQkJCXByaW50aygiIGRhdGEgJTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCIKLSAJCQkJICAgICAgICIgJTAyeCUwMnglMDJ4JTAyeCBsZW4gJWRcbiIsCi0gCQkJCQkgIGRhdGFbMTJdLCBkYXRhWzEzXSwgZGF0YVsxNF0sIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMThdLCBkYXRhWzE5XSwKLSAJCQkJCSAgZGF0YVsyMF0sIGRhdGFbMjFdLCBkYXRhWzIyXSwgZGF0YVsyM10sIGRhdGFbMjRdLCBkYXRhWzI1XSwgZGF0YVsyNl0sIGRhdGFbMjddLAotIAkJCQkJICBkYXRhWzI4XSwgZGF0YVsyOV0sIGRhdGFbMzBdLCBkYXRhWzMxXSwgZGF0YVszMl0sIGRhdGFbMzNdLAotIAkJCQkJCSAgcGt0X2xlbiApOwotIAkJCX0KLSAJCX0KLSAJCWVsc2UgewotIAkJCXByaW50aygiIFBhY2tldCBoYXMgd3JvbmcgbGVuZ3RoOiAlMDRkIGJ5dGVzXG4iLCBwa3RfbGVuKTsKLSAJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7Ci0gCQl9Ci0gCX0KLQlzdGRtYV9yZWxlYXNlKCk7Ci0JRU5BQkxFX0lSUSgpOwotCXJldHVybjsKLX0KLQotLyogYmlvbmV0X3RpY2s6IGNhbGxlZCBieSBiaW9uZXRfdGltZXIuIFJlYWRzIHBhY2tldHMgZnJvbSB0aGUgYWRhcHRlciwKLSAqIHBhc3NlcyB0aGVtIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZCByZXN0YXJ0cyB0aGUgdGltZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1iaW9uZXRfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpIHsKLQlzdHJ1Y3QgbmV0X2RldmljZQkgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYoIGJpb25ldF9kZWJ1ZyA+IDAgJiYgKGxwLT5vcGVuX3RpbWUrKyAmIDcpID09IDggKQotCQlwcmludGsoImJpb25ldF90aWNrOiAlbGRcbiIsIGxwLT5vcGVuX3RpbWUpOwotCi0JaWYoICFzdGRtYV9pc2xvY2tlZCgpICkgYmlvbmV0X3BvbGxfcngoZGV2KTsKLQotCWJpb25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7Ci0JYWRkX3RpbWVyKCZiaW9uZXRfdGltZXIpOwotfQotCi0vKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGJpb25ldF9vcGVuKCkuCi0gKi8KLXN0YXRpYyBpbnQKLWJpb25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKGJpb25ldF9kZWJ1ZyA+IDApCi0JCXByaW50aygiYmlvbmV0X2Nsb3NlLCBvcGVuX3RpbWU9JWxkXG4iLCBscC0+b3Blbl90aW1lKTsKLQlkZWxfdGltZXIoJmJpb25ldF90aW1lcik7Ci0Jc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0KLQlzZXRfc3RhdHVzKDApOwotCWxwLT5vcGVuX3RpbWUgPSAwOwotCi0JZGV2LT50YnVzeSA9IDE7Ci0JZGV2LT5zdGFydCA9IDA7Ci0KLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgotICAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gJmxwLT5zdGF0czsKLX0KLQotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYmlvX2RldjsKLQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JYmlvX2RldiA9IGJpb25ldF9wcm9iZSgtMSk7Ci0JaWYgKElTX0VSUihiaW9fZGV2KSkKLQkJcmV0dXJuIFBUUl9FUlIoYmlvX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX25ldGRldihiaW9fZGV2KTsKLQlmcmVlX25ldGRldihiaW9fZGV2KTsKLX0KLQotI2VuZGlmIC8qIE1PRFVMRSAqLwotCi0vKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L2luY2x1ZGUKLQktYiBtNjhrLWxpbnV4YW91dCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMgotCS1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1ETU9EVUxFIC1JLi4vLi4vbmV0L2luZXQgLWMgYmlvbmV0LmMiCi0gKiAgdmVyc2lvbi1jb250cm9sOiB0Ci0gKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKLSAqICB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jIGIvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzM1NjM3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDg3OCArMCwwIEBACi0vKiBhdGFyaV9wYW1zbmV0LmMgICAgIFBBTXNOZXQgZGV2aWNlIGRyaXZlciBmb3IgbGludXg2OGsuCi0gKgotICogVmVyc2lvbjoJQCgjKVBBTXNOZXQuYwkwLjLfCTAzLzMxLzk2Ci0gKgotICogQXV0aG9yOiAgVG9yc3RlbiBMYW5nIDxUb3JzdGVuLkxhbmdAYXAucGh5c2lrLnVuaS1naWVzc2VuLmRlPgotICogICAgICAgICAgICAgICAgICAgICAgIDxUb3JzdGVuLkxhbmdAanVuZy5kZT4KLSAqCi0gKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBteSBkcml2ZXIgUEFNU0RNQS5jIGZvciBNaU5ULU5ldCBhbmQKLSAqIG9uIHRoZSBkcml2ZXIgYmlvbmV0LmMgd3JpdHRlbiBieQotICogICAgICAgICAgSGFydG11dCBMYXVlIDxsYXVlQGlmay1tcC51bmkta2llbC5kZT4KLSAqIGFuZCAgICAgIFRvcnN0ZW4gTmFyamVzIDxuYXJqZXNAaWZrLW1wLnVuaS1raWVsLmRlPgotICoKLSAqIExpdHRsZSBhZGFwdGlvbnMgZm9yIGludGVncmF0aW9uIGludG8gcGw3IGJ5IFJvbWFuIEhvZGVrCi0gKgotCVdoYXQgaXMgaXQgPwotCS0tLS0tLS0tLS0tLQotCVRoaXMgZHJpdmVyIGNvbnRyb2xzIHRoZSBQQU1zTmV0IExBTi1BZGFwdGVyIHdoaWNoIGNvbm5lY3RzCi0JYW4gQVRBUkkgU1QvVFQgdmlhIHRoZSBBQ1NJLXBvcnQgdG8gYW4gRXRoZXJuZXQtYmFzZWQgbmV0d29yay4KLQotCVRoaXMgdmVyc2lvbiBjYW4gYmUgY29tcGlsZWQgYXMgYSBsb2FkYWJsZSBtb2R1bGUgKFNlZSB0aGUKLQljb21waWxlIGNvbW1hbmQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUpLgotCUF0IGxvYWQgdGltZSwgeW91IGNhbiBvcHRpb25hbGx5IHNldCB0aGUgZGVidWdnaW5nIGxldmVsIGFuZCB0aGUKLQlmYXN0ZXN0IHJlc3BvbnNlIHRpbWUgb24gdGhlIGNvbW1hbmQgbGluZSBvZiAnaW5zbW9kJy4KLQotCSdwYW1zbmV0X2RlYnVnJwotCQljb250cm9scyB0aGUgYW1vdW50IG9mIGRpYWdub3N0aWMgbWVzc2FnZXM6Ci0JICAwICA6IG5vIG1lc3NhZ2VzCi0JICA+MCA6IHNlZSBjb2RlIGZvciBtZWFuaW5nIG9mIHByaW50ZWQgbWVzc2FnZXMKLQotCSdwYW1zbmV0X21pbl9wb2xsX3RpbWUnIChhbHdheXMgPj0xKQotCQlnaXZlcyB0aGUgdGltZSAoaW4gamlmZmllcykgYmV0d2VlbiBwb2xscy4gTG93IHZhbHVlcwotCQlpbmNyZWFzZSB0aGUgc3lzdGVtIGxvYWQgKGJld2FyZSEpCi0KLQlXaGVuIGxvYWRlZCwgYSBuZXQgZGV2aWNlIHdpdGggdGhlIG5hbWUgJ2V0aD8nIGJlY29tZXMgYXZhaWxhYmxlLAotCXdoaWNoIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIHVzdWFsICdpZmNvbmZpZycgY29tbWFuZC4KLQotCUl0IGlzIHBvc3NpYmxlIHRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgaW50byB0aGUga2VybmVsIGxpa2Ugb3RoZXIKLQkobmV0KSBkcml2ZXJzLiBGb3IgdGhpcyBwdXJwb3NlLCBzb21lIHNvdXJjZSBmaWxlcyAoZS5nLiBjb25maWctZmlsZXMKLQltYWtlZmlsZXMsIFNwYWNlLmMpIG11c3QgYmUgY2hhbmdlZCBhY2NvcmRpbmdseS4gKFlvdSBtYXkgcmVmZXIgdG8KLQlvdGhlciBkcml2ZXJzIGhvdyB0byBkbyBpdC4pIEluIHRoaXMgY2FzZSwgdGhlIGRldmljZSB3aWxsIGJlIGRldGVjdGVkCi0JYXQgYm9vdCB0aW1lIGFuZCAocHJvYmFibHkpIGFwcGVhciBhcyAnZXRoMCcuCi0KLQlUaGVvcnkgb2YgT3BlcmF0aW9uCi0JLS0tLS0tLS0tLS0tLS0tLS0tLQotCUJlY2F1c2UgdGhlIEFUQVJJIERNQSBwb3J0IGlzIHVzdWFsbHkgc2hhcmVkIGJldHdlZW4gc2V2ZXJhbAotCWRldmljZXMgKGVnLiBoYXJkZGlzaywgZmxvcHB5KSB3ZSBjYW5ub3QgYmxvY2sgdGhlIEFDU0kgYnVzCi0Jd2hpbGUgd2FpdGluZyBmb3IgaW50ZXJydXB0cy4gVGhlcmVmb3JlIHdlIHVzZSBhIHBvbGxpbmcgbWVjaGFuaXNtCi0JdG8gZmV0Y2ggcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBzZW5kCi0JcGFja2V0cyB3aXRob3V0IGNoZWNraW5nIHRoYXQgdGhlIHByZXZpb3VzIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvCi0JdGhlIExBTi4gV2UgcmVseSBvbiB0aGUgaGlnaGVyIGxldmVscyBvZiB0aGUgbmV0d29ya2luZyBjb2RlIHRvIGRldGVjdAotCW1pc3NpbmcgcGFja2V0cyBhbmQgcmVzZW5kIHRoZW0uCi0KLQlCZWZvcmUgd2UgYWNjZXNzIHRoZSBBVEFSSSBETUEgY29udHJvbGxlciwgd2UgY2hlY2sgaWYgYW5vdGhlcgotCXByb2Nlc3MgaXMgdXNpbmcgdGhlIERNQS4gSWYgbm90LCB3ZSBsb2NrIHRoZSBETUEsIHBlcmZvcm0gb25lIG9yCi0JbW9yZSBwYWNrZXQgdHJhbnNmZXJzIGFuZCB1bmxvY2sgdGhlIERNQSBiZWZvcmUgcmV0dXJuaW5nLgotCVdlIGRvIG5vdCB1c2UgJ3N0ZG1hX2xvY2snIHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIGl0IGlzIHVuY2xlYXIKLQlpZiB0aGUgbmV0d29ya2luZyBjb2RlIGNhbiBiZSBzZXQgdG8gc2xlZXAsIHdoaWNoIHdpbGwgaGFwcGVuIGlmCi0JYW5vdGhlciAocG9zc2libHkgc2xvdykgZGV2aWNlIGlzIHVzaW5nIHRoZSBETUEgY29udHJvbGxlci4KLQotCVRoZSBwb2xsaW5nIGlzIGRvbmUgdmlhIHRpbWVyIGludGVycnVwdHMgd2hpY2ggcGVyaW9kaWNhbGx5Ci0JJ3NpbXVsYXRlJyBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgRXRoZXJuZXQgYWRhcHRlci4gVGhlIHRpbWUgKGluIGppZmZpZXMpCi0JYmV0d2VlbiBwb2xscyB2YXJpZXMgZGVwZW5kaW5nIG9uIGFuIGVzdGltYXRlIG9mIHRoZSBuZXQgYWN0aXZpdHkuCi0JVGhlIGFsbG93ZWQgcmFuZ2UgaXMgZ2l2ZW4gYnkgdGhlIHZhcmlhYmxlICdiaW9uZXRfbWluX3BvbGxfdGltZScKLQlmb3IgdGhlIGxvd2VyIChmYXN0ZXN0KSBsaW1pdCBhbmQgdGhlIGNvbnN0YW50ICdNQVhfUE9MTF9USU1FJwotCWZvciB0aGUgaGlnaGVyIChzbG93ZXN0KSBsaW1pdC4KLQotCVdoZW5ldmVyIGEgcGFja2V0IGFycml2ZXMsIHdlIHN3aXRjaCB0byBmYXN0ZXN0IHJlc3BvbnNlIGJ5IHNldHRpbmcKLQl0aGUgcG9sbGluZyB0aW1lIHRvIGl0cyBsb3dlc3QgbGltaXQuIElmIHRoZSBmb2xsb3dpbmcgcG9sbCBmYWlscywKLQliZWNhdXNlIG5vIHBhY2tldHMgaGF2ZSBhcnJpdmVkLCB3ZSBpbmNyZWFzZSB0aGUgdGltZSBmb3IgdGhlIG5leHQKLQlwb2xsLiBXaGVuIHRoZSBuZXQgYWN0aXZpdHkgaXMgbG93LCB0aGUgcG9sbGluZyB0aW1lIGVmZmVjdGl2ZWx5Ci0Jc3RheXMgYXQgaXRzIG1heGltdW0gdmFsdWUsIHJlc3VsdGluZyBpbiB0aGUgbG93ZXN0IGxvYWQgZm9yIHRoZQotCW1hY2hpbmUuCi0gKi8KLQotI2RlZmluZSBNQVhfUE9MTF9USU1FCTEwCi0KLXN0YXRpYyBjaGFyICp2ZXJzaW9uID0KLQkicGFtc25ldC5jOnYwLjJiZXRhIDMwLW1hci05NiAoYykgVG9yc3RlbiBMYW5nLlxuIjsKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlody5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfc3RkbWEuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfYWNzaS5oPgotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSN1bmRlZiBSRUFECi0jdW5kZWYgV1JJVEUKLQotLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnCi0gKi8KLSNpZm5kZWYgTkVUX0RFQlVHCi0jZGVmaW5lIE5FVF9ERUJVRyAwCi0jZW5kaWYKLS8qCi0gKiBHbG9iYWwgdmFyaWFibGUgJ3BhbXNuZXRfZGVidWcnLiBDYW4gYmUgc2V0IGF0IGxvYWQgdGltZSBieSAnaW5zbW9kJwotICovCi11bnNpZ25lZCBpbnQgcGFtc25ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKLW1vZHVsZV9wYXJhbShwYW1zbmV0X2RlYnVnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhwYW1zbmV0X2RlYnVnLCAicGFtc25ldCBkZWJ1ZyBlbmFibGUgKDAtMSkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBwYW1zbmV0X21pbl9wb2xsX3RpbWUgPSAyOwotCi0KLS8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLgotICovCi1zdHJ1Y3QgbmV0X2xvY2FsIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlsb25nIG9wZW5fdGltZTsJCQkvKiBmb3IgZGVidWdnaW5nICovCi0JaW50ICBwb2xsX3RpbWU7CQkJLyogcG9sbGluZyB0aW1lIHZhcmllcyB3aXRoIG5ldCBsb2FkICovCi19OwotCi1zdGF0aWMgc3RydWN0IG5pY19wa3RfcyB7CQkvKiBwYWNrZXQgZm9ybWF0ICovCi0JdW5zaWduZWQgY2hhcglidWZmZXJbMjA0OF07Ci19ICpuaWNfcGFja2V0ID0gMDsKLXVuc2lnbmVkIGNoYXIgKnBoeXNfbmljX3BhY2tldDsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEhBRERSWzZdOyAvKiA2LWJ5dGUgaGFyZHdhcmUgYWRkcmVzcyBvZiBsYW5jZSAqLwotCi0vKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0gKi8KLXN0YXRpYyB2b2lkCXN0YXJ0IChpbnQgdGFyZ2V0KTsKLXN0YXRpYyBpbnQJc3RvcCAoaW50IHRhcmdldCk7Ci1zdGF0aWMgaW50CXRlc3Rwa3QgKGludCB0YXJnZXQpOwotc3RhdGljIGludAlzZW5kcGt0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOwotc3RhdGljIGludAlyZWNlaXZlcGt0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpOwotc3RhdGljIGludAlpbnF1aXJ5IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpOwotc3RhdGljIEhBRERSCSpyZWFkX2h3X2FkZHIoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKLXN0YXRpYyB2b2lkCXNldHVwX2RtYSAodm9pZCAqYWRkcmVzcywgdW5zaWduZWQgcndfZmxhZywgaW50IG51bV9ibG9ja3MpOwotc3RhdGljIGludAlzZW5kX2ZpcnN0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyIGJ5dGUpOwotc3RhdGljIGludAlzZW5kXzFfNSAoaW50IGx1biwgdW5zaWduZWQgY2hhciAqY29tbWFuZCwgaW50IGRtYSk7Ci1zdGF0aWMgaW50CWdldF9zdGF0dXMgKHZvaWQpOwotc3RhdGljIGludAljYWxjX3JlY2VpdmVkICh2b2lkICpzdGFydF9hZGRyZXNzKTsKLQotc3RhdGljIGludCBwYW1zbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IHBhbXNuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBwYW1zbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgaW50IHBhbXNuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBwYW1zbmV0X3RpY2sodW5zaWduZWQgbG9uZyk7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBwYW1zbmV0X2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSk7Ci0KLXN0YXRpYyBERUZJTkVfVElNRVIocGFtc25ldF90aW1lciwgcGFtc25ldF90aWNrLCAwLCAwKTsKLQotI2RlZmluZSBTVFJBTV9BRERSKGEpCSgoKGEpICYgMHhmZjAwMDAwMCkgPT0gMCkKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkMVsweDM4XTsKLQlIQUREUiAgaHdhZGRyOwotCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQyWzB4MWMyXTsKLX0gRE1BSFdBRERSOwotCi0vKgotICogRGVmaW5pdGlvbnMgb2YgY29tbWFuZHMgdW5kZXJzdG9vZCBieSB0aGUgUEFNcyBETUEgYWRhcHRvci4KLSAqCi0gKiBJbiBnZW5lcmFsIHRoZSBETUEgYWRhcHRvciB1c2VzIExVTiAwLCA1LCA2IGFuZCA3IG9uIG9uZSBJRCBjaGFuZ2VhYmxlCi0gKiBieSB0aGUgUEFNJ3MgTmV0IHNvZnR3YXJlLgotICoKLSAqIExVTiAwIHdvcmtzIGFzIGEgaGFyZGRpc2suIFlvdSBjYW4gYm9vdCB0aGUgUEFNJ3MgTmV0IGRyaXZlciB0aGVyZS4KLSAqIExVTiA1IHdvcmtzIGFzIGEgaGFyZGRpc2sgYW5kIGxldHMgeW91IGFjY2VzcyB0aGUgUkFNIGFuZCBzb21lIEkvTyBIVwotICogICAgICAgYXJlYS4gSW4gc2VjdG9yIDAsIGJ5dGVzIDB4MzgtMHgzZCB5b3UgZmluZCB0aGUgZXRoZXJuZXQgSFcgYWRkcmVzcwotICogICAgICAgb2YgdGhlIGFkYXB0b3IuCi0gKiBMVU4gNiB3b3JrcyBhcyBhIGhhcmRkaXNrIGFuZCBsZXRzIHlvdSBhY2Nlc3MgdGhlIGZpcm13YXJlIFJPTS4KLSAqIExVTiA3IGxldHMgeW91IHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cy4KLSAqCi0gKiBTb21lIGNvbW1hbmRzIGxpa2UgdGhlIElOUVVJUlkgY29tbWFuZCB3b3JrIGlkZW50aWNhbCBvbiBhbGwgdXNlZCBMVU5zLgotICoKLSAqIFVOS05PV04xIHNlZW1zIHRvIHJlYWQgc29tZSBkYXRhLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KLSAqIFVOS05PV04yIHNlZW1zIHRvIHJlYWQgc29tZSBkYXRhIChjb21tYW5kIGJ5dGUgMSBtdXN0IGJlICE9MCkuIFRoZQotICogICAgICAgICAgZm9sbG93aW5nIGJ5dGVzIHNlZW0gdG8gYmUgc29tZXRoaW5nIGxpa2UgYW4gYWxsb2NhdGlvbiBsZW5ndGguCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogUkVBRFBLVCAgcmVhZHMgYSBwYWNrZXQgcmVjZWl2ZWQgYnkgdGhlIERNQSBhZGFwdG9yLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KLSAqIFdSSVRFUEtUIHNlbmRzIGEgcGFja2V0IHRyYW5zZmVycmVkIGJ5IHRoZSBmb2xsb3dpbmcgRE1BIHBoYXNlLiBUaGUgbGVuZ3RoCi0gKiAgICAgICAgICBvZiB0aGUgcGFja2V0IGlzIHRyYW5zZmVycmVkIGluIGNvbW1hbmQgYnl0ZXMgMyBhbmQgNC4KLSAqICAgICAgICAgIFRoZSBhZGFwdG9yIGF1dG9tYXRpY2FsbHkgcmVwbGFjZXMgdGhlIHNyYyBodyBhZGRyZXNzIGluIGFuIGV0aGVybmV0Ci0gKiAgICAgICAgICBwYWNrZXQgYnkgaXRzIG93biBodyBhZGRyZXNzLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KLSAqIElOUVVJUlkgIGhhcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgSU5RVUlSWSBjb21tYW5kIHN1cHBvcnRlZCBieSBoYXJkZGlza3MKLSAqICAgICAgICAgIGFuZCBvdGhlciBTQ1NJIGRldmljZXMuIEl0IGxldHMgeW91IGRldGVjdCB3aGljaCBkZXZpY2UgeW91IGZvdW5kCi0gKiAgICAgICAgICBhdCBhIGdpdmVuIGFkZHJlc3MuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogU1RBUlQgICAgaW5pdGlhbGl6ZXMgdGhlIERNQSBhZGFwdG9yLiBBZnRlciB0aGlzIGNvbW1hbmQgaXQgaXMgYWJsZSB0byBzZW5kCi0gKiAgICAgICAgICBhbmQgcmVjZWl2ZSBwYWNrZXRzLiBUaGVyZSBpcyBubyBzdGF0dXMgYnl0ZSByZXR1cm5lZCEKLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDEgYnl0ZS4KLSAqIE5VTVBLVFMgIGdpdmVzIGJhY2sgdGhlIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzIHdhaXRpbmcgaW4gdGhlIHF1ZXVlIGluCi0gKiAgICAgICAgICB0aGUgc3RhdHVzIGJ5dGUuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyAxIGJ5dGUuCi0gKiBVTktOT1dOMwotICogVU5LTk9XTjQgRnVuY3Rpb24gb2YgdGhlc2UgdGhyZWUgY29tbWFuZHMgaXMgdW5rbm93bi4KLSAqIFVOS05PV041IFRoZSBjb21tYW5kIGxlbmd0aCBvZiB0aGVzZSB0aHJlZSBjb21tYW5kcyBpcyAxIGJ5dGUuCi0gKiBERVNFTEVDVCBpbW1lZGlhdGVseSBkZXNlbGVjdHMgdGhlIERNQSBhZGFwdG9yLiBNYXkgaW1wb3J0YW50IHdpdGggaW50ZXJydXB0Ci0gKiAgICAgICAgICBkcml2ZW4gb3BlcmF0aW9uLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgMSBieXRlLgotICogU1RPUCAgICAgcmVzZXRzIHRoZSBETUEgYWRhcHRvci4gQWZ0ZXIgdGhpcyBjb21tYW5kIHBhY2tldHMgY2FuIG5vIGxvbmdlcgotICogICAgICAgICAgYmUgcmVjZWl2ZWQgb3IgdHJhbnNmZXJyZWQuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGUuCi0gKi8KLQotZW51bSB7VU5LTk9XTjE9MywgUkVBRFBLVD04LCBVTktOT1dOMiwgV1JJVEVQS1Q9MTAsIElOUVVJUlk9MTgsIFNUQVJULAotICAgICAgTlVNUEtUUz0yMiwgVU5LTk9XTjMsIFVOS05PV040LCBVTktOT1dONSwgREVTRUxFQ1QsIFNUT1B9OwotCi0jZGVmaW5lIFJFQURTRUNUT1IgIFJFQURQS1QKLSNkZWZpbmUgV1JJVEVTRUNUT1IgV1JJVEVQS1QKLQotdV9jaGFyICppbnF1aXJlOD0iTVYgICAgICBQQU0ncyBORVQvR0siOwotCi0jZGVmaW5lIERNQUxPVyAgIGRtYV93ZC5kbWFfbG8KLSNkZWZpbmUgRE1BTUlEICAgZG1hX3dkLmRtYV9tZAotI2RlZmluZSBETUFISUdIICBkbWFfd2QuZG1hX2hpCi0jZGVmaW5lIERBQ0NFU1MgIGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQKLQotI2RlZmluZSBNRlBfR1BJUCBtZnAucGFyX2R0X3JlZwotCi0vKiBTb21lIHVzZWZ1bCBmdW5jdGlvbnMgKi8KLQotI2RlZmluZSBJTlQgICAgICAoIShNRlBfR1BJUCAmIDB4MjApKQotI2RlZmluZSBERUxBWSAoe01GUF9HUElQOyBNRlBfR1BJUDsgTUZQX0dQSVA7fSkKLSNkZWZpbmUgV1JJVEVNT0RFKHZhbHVlKQkJCQkJXAotCSh7CXVfc2hvcnQgZHVtbXkgPSB2YWx1ZTsJCQkJXAotCQlfX2FzbV9fIHZvbGF0aWxlKCJtb3ZldyAlMCwgMHhGRkZGODYwNiIgOiA6ICJkIihkdW1teSkpOwlcCi0JCURFTEFZOwkJCQkJCVwKLQl9KQotI2RlZmluZSBXUklURUJPVEgodmFsdWUxLCB2YWx1ZTIpCQkJCVwKLQkoewl1X2xvbmcgZHVtbXkgPSAodV9sb25nKSh2YWx1ZTEpPDwxNiB8ICh1X3Nob3J0KSh2YWx1ZTIpOwlcCi0JCV9fYXNtX18gdm9sYXRpbGUoIm1vdmVsICUwLCAweEZGRkY4NjA0IiA6IDogImQiKGR1bW15KSk7CVwKLQkJREVMQVk7CQkJCQkJXAotCX0pCi0KLS8qIERlZmluaXRpb25zIGZvciBETU9ERSAqLwotCi0jZGVmaW5lIFJFQUQgICAgICAgIDB4MDAwCi0jZGVmaW5lIFdSSVRFICAgICAgIDB4MTAwCi0KLSNkZWZpbmUgRE1BX0ZEQyAgICAgMHgwODAKLSNkZWZpbmUgRE1BX0FDU0kgICAgMHgwMDAKLQotI2RlZmluZSBETUFfRElTQUJMRSAweDA0MAotCi0jZGVmaW5lIFNFQ19DT1VOVCAgIDB4MDEwCi0jZGVmaW5lIERNQV9XSU5ET1cgIDB4MDAwCi0KLSNkZWZpbmUgUkVHX0FDU0kgICAgMHgwMDgKLSNkZWZpbmUgUkVHX0ZEQyAgICAgMHgwMDAKLQotI2RlZmluZSBBMSAgICAgICAgICAweDAwMgotCi0vKiBUaW1lb3V0IGNvbnN0YW50cyAqLwotCi0jZGVmaW5lIFRJTUVPVVRDTUQgSFovMiAgIC8qIGNhLiA1MDBtcyAqLwotI2RlZmluZSBUSU1FT1VURE1BIEhaICAgICAvKiBjYS4gMXMgKi8KLSNkZWZpbmUgQ09NTUFORF9ERUxBWSA1MDAgLyogY2EuIDAuNW1zICovCi0KLXVuc2lnbmVkIHJ3OwotaW50IGxhbmNlX3RhcmdldCA9IC0xOwotaW50IGlmX3VwID0gMDsKLQotLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY2Nlc3MgdGhlIGV0aGVybmV0IGJvYXJkIGNvbm5lY3RlZCB0byB0aGUKLSAqIEFDU0kgcG9ydCB2aWEgdGhlIHN0X2RtYSBjaGlwLgotICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgbG93bGV2ZWwgcm91dGluZXMgd29yayBvbiBwaHlzaWNhbCBhZGRyZXNzZXMgb25seSBhbmQgYXNzdW1lCi0gKiB0aGF0IGV2ZW50dWFsbHkgbmVlZGVkIGJ1ZmZlcnMgYXJlCi0gKiAtIGNvbXBsZXRlbHkgbG9jYXRlZCBpbiBTVCBSQU0KLSAqIC0gYXJlIGNvbnRpZ291cyBpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZQotICovCi0KLS8qIFNldHVwIHRoZSBETUEgY291bnRlciAqLwotCi1zdGF0aWMgdm9pZAotc2V0dXBfZG1hICh2b2lkICphZGRyZXNzLCB1bnNpZ25lZCByd19mbGFnLCBpbnQgbnVtX2Jsb2NrcykKLXsKLQlXUklURU1PREUoKHVuc2lnbmVkKSByd19mbGFnICAgICAgICAgIHwgRE1BX0ZEQyB8IFNFQ19DT1VOVCB8IFJFR19BQ1NJIHwKLQkJICBBMSk7Ci0JV1JJVEVNT0RFKCh1bnNpZ25lZCkocndfZmxhZyBeIFdSSVRFKSB8IERNQV9GREMgfCBTRUNfQ09VTlQgfCBSRUdfQUNTSSB8Ci0JCSAgQTEpOwotCVdSSVRFTU9ERSgodW5zaWduZWQpIHJ3X2ZsYWcgICAgICAgICAgfCBETUFfRkRDIHwgU0VDX0NPVU5UIHwgUkVHX0FDU0kgfAotCQkgIEExKTsKLQlETUFMT1cgID0gKHVuc2lnbmVkIGNoYXIpKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MgJiAweEZGKTsKLQlETUFNSUQgID0gKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgbG9uZylhZGRyZXNzID4+ICA4KSAmIDB4RkYpOwotCURNQUhJR0ggPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MgPj4gMTYpICYgMHhGRik7Ci0JV1JJVEVCT1RIKCh1bnNpZ25lZCludW1fYmxvY2tzICYgMHhGRiwKLQkJICByd19mbGFnIHwgRE1BX0ZEQyB8IERNQV9XSU5ET1cgfCBSRUdfQUNTSSB8IEExKTsKLQlydyA9IHJ3X2ZsYWc7Ci19Ci0KLS8qIFNlbmQgdGhlIGZpcnN0IGJ5dGUgb2YgYW4gY29tbWFuZCBibG9jayAqLwotCi1zdGF0aWMgaW50Ci1zZW5kX2ZpcnN0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyIGJ5dGUpCi17Ci0JcncgPSBSRUFEOwotCWFjc2lfZGVsYXlfZW5kKENPTU1BTkRfREVMQVkpOwotCS8qCi0JICogd2FrZSB1cCBBQ1NJCi0JICovCi0JV1JJVEVNT0RFKERNQV9GREMgfCBETUFfV0lORE9XIHwgUkVHX0FDU0kpOwotCS8qCi0JICogd3JpdGUgY29tbWFuZCBieXRlCi0JICovCi0JV1JJVEVCT1RIKCh0YXJnZXQgPDwgNSkgfCAoYnl0ZSAmIDB4MUYpLCBETUFfRkRDIHwKLQkgICAgICAgICAgRE1BX1dJTkRPVyB8IFJFR19BQ1NJIHwgQTEpOwotCXJldHVybiAoIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRDTUQpKTsKLX0KLQotLyogU2VuZCB0aGUgcmVzdCBvZiBhbiBjb21tYW5kIGJsb2NrICovCi0KLXN0YXRpYyBpbnQKLXNlbmRfMV81IChpbnQgbHVuLCB1bnNpZ25lZCBjaGFyICpjb21tYW5kLCBpbnQgZG1hKQotewotCWludCBpLCBqOwotCi0JZm9yIChpPTA7IGk8NTsgaSsrKSB7Ci0JCVdSSVRFQk9USCgoIWkgPyAoKChsdW4gJiAweDcpIDw8IDUpIHwgKGNvbW1hbmRbaV0gJiAweDFGKSkKLQkJCSAgICAgIDogY29tbWFuZFtpXSksCi0JCQkgIHJ3IHwgUkVHX0FDU0kgfCBETUFfV0lORE9XIHwKLQkJCSAgICgoaSA8IDQpID8gRE1BX0ZEQwotCQkJCSAgICA6IChkbWEgPyBETUFfQUNTSQotCQkJCQkgICA6IERNQV9GREMpKSB8IEExKTsKLQkJaWYgKGkgPCA0ICYmIChqID0gIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRDTUQpKSkKLQkJCXJldHVybiAoaik7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLS8qIFJlYWQgYSBzdGF0dXMgYnl0ZSAqLwotCi1zdGF0aWMgaW50Ci1nZXRfc3RhdHVzICh2b2lkKQotewotCVdSSVRFTU9ERShETUFfRkRDIHwgRE1BX1dJTkRPVyB8IFJFR19BQ1NJIHwgQTEpOwotCWFjc2lfZGVsYXlfc3RhcnQoKTsKLQlyZXR1cm4gKChpbnQpKERBQ0NFU1MgJiAweEZGKSk7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzICovCi0KLXN0YXRpYyBpbnQKLWNhbGNfcmVjZWl2ZWQgKHZvaWQgKnN0YXJ0X2FkZHJlc3MpCi17Ci0JcmV0dXJuIChpbnQpKAotCQkoKCh1bnNpZ25lZCBsb25nKURNQUhJR0ggPDwgMTYpIHwgKCh1bnNpZ25lZClETUFNSUQgPDwgOCkgfCBETUFMT1cpCi0JICAgICAgLSAodW5zaWduZWQgbG9uZylzdGFydF9hZGRyZXNzKTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBtaWRsZXZlbCByb3V0aW5lcyBzdGlsbCB3b3JrIG9uIHBoeXNpY2FsIGFkZHJlc3NlcyAuLi4gKi8KLQotLyogc3RhcnQoKSBzdGFydHMgdGhlIFBBTSdzIERNQSBhZGFwdG9yICovCi0KLXN0YXRpYyB2b2lkCi1zdGFydCAoaW50IHRhcmdldCkKLXsKLQlzZW5kX2ZpcnN0KHRhcmdldCwgU1RBUlQpOwotfQotCi0vKiBzdG9wKCkgc3RvcHMgdGhlIFBBTSdzIERNQSBhZGFwdG9yIGFuZCByZXR1cm5zIGEgdmFsdWUgb2YgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgKi8KLQotc3RhdGljIGludAotc3RvcCAoaW50IHRhcmdldCkKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBTVE9QKSkKLQkJZ290byBiYWQ7Ci0JY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzJdID0KLQljbWRfYnVmZmVyWzNdID0gY21kX2J1ZmZlcls0XSA9IDA7Ci0JaWYgKHNlbmRfMV81KDcsIGNtZF9idWZmZXIsIDApIHx8Ci0JICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAotCSAgICBnZXRfc3RhdHVzKCkpCi0JCWdvdG8gYmFkOwotCXJldCA9IDA7Ci1iYWQ6Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiB0ZXN0cGt0KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgd2FpdGluZyBpbiB0aGUgcXVldWUgKi8KLQotc3RhdGljIGludAotdGVzdHBrdChpbnQgdGFyZ2V0KQotewotCWludCByZXQgPSAtMTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgTlVNUEtUUykpCi0JCWdvdG8gYmFkOwotCXJldCA9IGdldF9zdGF0dXMoKTsKLWJhZDoKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qIGlucXVpcnkoKSByZXR1cm5zIDAgd2hlbiBQQU0ncyBETUEgZm91bmQsIC0xIHdoZW4gdGltZW91dCwgLTIgb3RoZXJ3aXNlICovCi0vKiBQbGVhc2Ugbm90ZTogVGhlIGJ1ZmZlciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgYnV0IG11c3QgYmUgZGVmaW5lZCEgICAqLwotCi1zdGF0aWMgaW50Ci1pbnF1aXJ5IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0JaW50IHJldCA9IC0xOwotCXVuc2lnbmVkIGNoYXIgKnZidWZmZXIgPSBwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpYnVmZmVyKTsKLQl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07Ci0KLQlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIElOUVVJUlkpKQotCQlnb3RvIGJhZDsKLQlzZXR1cF9kbWEoYnVmZmVyLCBSRUFELCAxKTsKLQl2YnVmZmVyWzhdID0gdmJ1ZmZlclsyN10gPSAwOyAvKiBBdm9pZCBjb25mdXNpb24gd2l0aCBwcmV2aW91cyByZWFkIGRhdGEgKi8KLQljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPSBjbWRfYnVmZmVyWzRdID0gMDsKLQljbWRfYnVmZmVyWzNdID0gNDg7Ci0JaWYgKHNlbmRfMV81KDUsIGNtZF9idWZmZXIsIDEpIHx8Ci0JICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAotCSAgICBnZXRfc3RhdHVzKCkgfHwKLQkgICAgKGNhbGNfcmVjZWl2ZWQoYnVmZmVyKSA8IDMyKSkKLQkJZ290byBiYWQ7Ci0JZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKShidWZmZXIrOCksIDIwLCAwKTsKLQlpZiAobWVtY21wKGlucXVpcmU4LCB2YnVmZmVyKzgsIDIwKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gMDsKLWJhZDoKLQlpZiAoISFORVRfREVCVUcpIHsKLQkJdmJ1ZmZlcls4KzIwXT0wOwotCQlwcmludGsoImlucXVpcnkgb2YgdGFyZ2V0ICVkOiAlc1xuIiwgdGFyZ2V0LCB2YnVmZmVyKzgpOwotCX0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qCi0gKiByZWFkX2h3X2FkZHIoKSByZWFkcyB0aGUgc2VjdG9yIGNvbnRhaW5pbmcgdGhlIGh3YWRkciBhbmQgcmV0dXJucwotICogYSBwb2ludGVyIHRvIGl0ICh2aXJ0dWFsIGFkZHJlc3MhKSBvciAwIGluIGNhc2Ugb2YgYW4gZXJyb3IKLSAqLwotCi1zdGF0aWMgSEFERFIKLSpyZWFkX2h3X2FkZHIoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotCUhBRERSICpyZXQgPSAwOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgUkVBRFNFQ1RPUikpCi0JCWdvdG8gYmFkOwotCXNldHVwX2RtYShidWZmZXIsIFJFQUQsIDEpOwotCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9IGNtZF9idWZmZXJbNF0gPSAwOwotCWNtZF9idWZmZXJbM10gPSAxOwotCWlmIChzZW5kXzFfNSg1LCBjbWRfYnVmZmVyLCAxKSB8fAotCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKLQkgICAgZ2V0X3N0YXR1cygpKQotCQlnb3RvIGJhZDsKLQlyZXQgPSBwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpJigoKERNQUhXQUREUiAqKWJ1ZmZlciktPmh3YWRkcikpOwotCWRtYV9jYWNoZV9tYWludGVuYW5jZSgodW5zaWduZWQgbG9uZylidWZmZXIsIDUxMiwgMCk7Ci1iYWQ6Ci0JcmV0dXJuIChyZXQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QKLXBhbXNuZXRfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyogcmVjZWl2ZXBrdCgpIGxvYWRzIGEgcGFja2V0IHRvIGEgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0cyBsZW5ndGggKi8KLQotc3RhdGljIGludAotcmVjZWl2ZXBrdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotCWludCByZXQgPSAtMTsKLQl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07Ci0KLQlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFJFQURQS1QpKQotCQlnb3RvIGJhZDsKLQlzZXR1cF9kbWEoYnVmZmVyLCBSRUFELCAzKTsKLQljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPSBjbWRfYnVmZmVyWzRdID0gMDsKLQljbWRfYnVmZmVyWzNdID0gMzsKLQlpZiAoc2VuZF8xXzUoNywgY21kX2J1ZmZlciwgMSkgfHwKLQkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8Ci0JICAgIGdldF9zdGF0dXMoKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gY2FsY19yZWNlaXZlZChidWZmZXIpOwotYmFkOgotCXJldHVybiAocmV0KTsKLX0KLQotLyogc2VuZHBrdCgpIHNlbmRzIGEgcGFja2V0IGFuZCByZXR1cm5zIGEgdmFsdWUgb2YgemVybyB3aGVuIHRoZSBwYWNrZXQgd2FzIHNlbnQKLSAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgKi8KLQotc3RhdGljIGludAotc2VuZHBrdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQotewotCWludCByZXQgPSAtMTsKLQl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07Ci0KLQlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFdSSVRFUEtUKSkKLQkJZ290byBiYWQ7Ci0Jc2V0dXBfZG1hKGJ1ZmZlciwgV1JJVEUsIDMpOwotCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlcls0XSA9IDA7Ci0JY21kX2J1ZmZlclsyXSA9IGxlbmd0aCA+PiA4OwotCWNtZF9idWZmZXJbM10gPSBsZW5ndGggJiAweEZGOwotCWlmIChzZW5kXzFfNSg3LCBjbWRfYnVmZmVyLCAxKSB8fAotCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKLQkgICAgZ2V0X3N0YXR1cygpKQotCQlnb3RvIGJhZDsKLQlyZXQgPSAwOwotYmFkOgotCXJldHVybiAocmV0KTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBoaWdoZXIgbGV2ZWwgcm91dGluZXMgd29yayBvbiB2aXJ0dWFsIGFkZHJlc3NlcyBhbmQgY29udmVydCB0aGVtIHRvCi0gKiBwaHlzaWNhbCBhZGRyZXNzZXMgd2hlbiBwYXNzZWQgdG8gdGhlIGxvd2xldmVsIHJvdXRpbmVzLiBJdCdzIHVwIHRvIHRoZSBoaWdoZXIgbGV2ZWwKLSAqIHJvdXRpbmVzIHRvIGNvcHkgZGF0YSBmcm9tIEFsdGVybmF0ZSBSQU0gdG8gU1QgUkFNIGlmIG5lY2Nlc2FyeSEKLSAqLwotCi0vKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgotICovCi0KLXN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHBhbXNuZXRfcHJvYmUgKGludCB1bml0KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGk7Ci0JSEFERFIgKmh3YWRkcjsKLQlpbnQgZXJyOwotCi0JdW5zaWduZWQgY2hhciBzdGF0aW9uX2FkZHJbNl07Ci0Jc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKLQkvKiBhdm9pZCAiUHJvYmluZyBmb3IuLi4iIHByaW50ZWQgNCB0aW1lcyAtIHRoZSBkcml2ZXIgaXMgc3VwcG9ydGluZyBvbmx5IG9uZSBhZGFwdGVyIG5vdyEgKi8KLQlzdGF0aWMgaW50IG5vX21vcmVfZm91bmQ7Ci0KLQlpZiAobm9fbW9yZV9mb3VuZCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0Jbm9fbW9yZV9mb3VuZCA9IDE7Ci0KLQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOwotCWlmICghZGV2KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlpZiAodW5pdCA+PSAwKSB7Ci0JCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKLQkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKLQl9Ci0JU0VUX01PRFVMRV9PV05FUihkZXYpOwotCi0JcHJpbnRrKCJQcm9iaW5nIGZvciBQQU0ncyBOZXQvR0sgQWRhcHRlci4uLlxuIik7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgRE1BIGJ1ZmZlciBoZXJlIHNpbmNlIHdlIG5lZWQgaXQgZm9yIHByb2JpbmchICovCi0KLQluaWNfcGFja2V0ID0gKHN0cnVjdCBuaWNfcGt0X3MgKilhY3NpX2J1ZmZlcjsKLQlwaHlzX25pY19wYWNrZXQgPSAodW5zaWduZWQgY2hhciAqKXBoeXNfYWNzaV9idWZmZXI7Ci0JaWYgKHBhbXNuZXRfZGVidWcgPiAwKSB7Ci0JCXByaW50aygibmljX3BhY2tldCBhdCAweCVwLCBwaHlzIGF0IDB4JXBcbiIsCi0JCQkgICBuaWNfcGFja2V0LCBwaHlzX25pY19wYWNrZXQgKTsKLQl9Ci0KLQlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7Ci0JRElTQUJMRV9JUlEoKTsKLQotCWZvciAoaT0wOyBpPDg7IGkrKykgewotCQkvKiBEbyB0d28gaW5xdWlyaWVzIHRvIGNvdmVyIGNhc2VzIHdpdGggc3RyYW5nZSBlcXVpcG1lbnQgb24gcHJldmlvdXMgSUQgKi8KLQkJLyogYmxvY2tpbmcgdGhlIEFDU0kgYnVzIChsaWtlIHRoZSBTTE1DODA0IGxhc2VyIHByaW50ZXIgY29udHJvbGxlci4uLiAgICovCi0JCWlucXVpcnkoaSwgcGh5c19uaWNfcGFja2V0KTsKLQkJaWYgKCFpbnF1aXJ5KGksIHBoeXNfbmljX3BhY2tldCkpIHsKLQkJCWxhbmNlX3RhcmdldCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghIU5FVF9ERUJVRykKLQkJcHJpbnRrKCJJRDogJWRcbiIsaSk7Ci0KLQlpZiAobGFuY2VfdGFyZ2V0ID49IDApIHsKLQkJaWYgKCEoaHdhZGRyID0gcmVhZF9od19hZGRyKGxhbmNlX3RhcmdldCwgcGh5c19uaWNfcGFja2V0KSkpCi0JCQlsYW5jZV90YXJnZXQgPSAtMTsKLQkJZWxzZQotCQkJbWVtY3B5IChzdGF0aW9uX2FkZHIsIGh3YWRkciwgRVRIX0FMRU4pOwotCX0KLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0KLQlpZiAobGFuY2VfdGFyZ2V0IDwgMCkgewotCQlwcmludGsoIk5vIFBBTSdzIE5ldC9HSyBmb3VuZC5cbiIpOwotCQlmcmVlX25ldGRldihkZXYpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9Ci0KLQlpZiAocGFtc25ldF9kZWJ1ZyA+IDAgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKLQkJcHJpbnRrKHZlcnNpb24pOwotCi0JcHJpbnRrKCIlczogJXMgZm91bmQgb24gdGFyZ2V0ICUwMWQsIGV0aC1hZGRyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC5cbiIsCi0JCWRldi0+bmFtZSwgIlBBTSdzIE5ldC9HSyIsIGxhbmNlX3RhcmdldCwKLQkJc3RhdGlvbl9hZGRyWzBdLCBzdGF0aW9uX2FkZHJbMV0sIHN0YXRpb25fYWRkclsyXSwKLQkJc3RhdGlvbl9hZGRyWzNdLCBzdGF0aW9uX2FkZHJbNF0sIHN0YXRpb25fYWRkcls1XSk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbgkJPSBwYW1zbmV0X29wZW47Ci0JZGV2LT5zdG9wCQk9IHBhbXNuZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBwYW1zbmV0X3NlbmRfcGFja2V0OwotCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7Ci0KLQkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldC1nZW5lcmljCi0JICogdmFsdWVzLiBUaGlzIHNob3VsZCBiZSBpbiBhIGNvbW1vbiBmaWxlIGluc3RlYWQgb2YgcGVyLWRyaXZlci4KLQkgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7Ci0jaWYgMAotCQlkZXYtPmJyb2FkY2FzdFtpXSA9IDB4ZmY7Ci0jZW5kaWYKLQkJZGV2LT5kZXZfYWRkcltpXSAgPSBzdGF0aW9uX2FkZHJbaV07Ci0JfQotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmICghZXJyKQotCQlyZXR1cm4gZGV2OwotCi0JZnJlZV9uZXRkZXYoZGV2KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKLSAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KLQotICAgVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgotICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKLSAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCi0gKi8KLXN0YXRpYyBpbnQKLXBhbXNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChwYW1zbmV0X2RlYnVnID4gMCkKLQkJcHJpbnRrKCJwYW1zbmV0X29wZW5cbiIpOwotCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKLQlESVNBQkxFX0lSUSgpOwotCi0JLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuCi0JICovCi0JaWYgKCFpZl91cCkKLQkJc3RhcnQobGFuY2VfdGFyZ2V0KTsKLQlpZl91cCA9IDE7Ci0JbHAtPm9wZW5fdGltZSA9IDA7CS8qamlmZmllcyovCi0JbHAtPnBvbGxfdGltZSA9IE1BWF9QT0xMX1RJTUU7Ci0KLQlkZXYtPnRidXN5ID0gMDsKLQlkZXYtPmludGVycnVwdCA9IDA7Ci0JZGV2LT5zdGFydCA9IDE7Ci0KLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXBhbXNuZXRfdGltZXIuZGF0YSA9IChsb25nKWRldjsKLQlwYW1zbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKLQlhZGRfdGltZXIoJnBhbXNuZXRfdGltZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1wYW1zbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICBUaGlzIGNvdWxkIGJldHRlciBiZQotCSAqIGRvbmUgd2l0aCBhdG9taWNfc3dhcCgxLCBkZXYtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLgotCSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOwotCX0KLQllbHNlIHsKLQkJaW50IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOwotCQl1bnNpZ25lZCBsb25nIGJ1ZiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpOwotCQlpbnQgc3RhdDsKLQotCQlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7Ci0JCURJU0FCTEVfSVJRKCk7Ci0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlpZiggIVNUUkFNX0FERFIoYnVmK2xlbmd0aC0xKSApIHsKLQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBuaWNfcGFja2V0LT5idWZmZXIsCi0JCQkJCQkgIGxlbmd0aCk7Ci0JCQlidWYgPSAodW5zaWduZWQgbG9uZylwaHlzX25pY19wYWNrZXQ7Ci0JCX0KLQotCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoYnVmLCBsZW5ndGgsIDEpOwotCi0JCXN0YXQgPSBzZW5kcGt0KGxhbmNlX3RhcmdldCwgKHVuc2lnbmVkIGNoYXIgKilidWYsIGxlbmd0aCk7Ci0JCUVOQUJMRV9JUlEoKTsKLQkJc3RkbWFfcmVsZWFzZSgpOwotCi0JCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQlkZXYtPnRidXN5CSA9IDA7Ci0JCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWxwLT5zdGF0cy50eF9ieXRlcys9bGVuZ3RoOwotCX0KLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1wYW1zbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGJvZ3VzY291bnQ7Ci0JaW50IHBrdF9sZW47Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qICsrcm9tYW46IFRha2UgY2FyZSBhdCBsb2NraW5nIHRoZSBTVC1ETUEuLi4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aCBpbnRzCi0JICogb2ZmLCBzaW5jZSBvdGhlcndpc2UgYW4gaW50IGNvdWxkIHNsaXAgaW4gYmV0d2VlbiB0aGUgcXVlc3Rpb24gYW5kIHRoZQotCSAqIGxvY2tpbmcgaXRzZWxmLCBhbmQgdGhlbiB3ZSdkIGdvIHRvIHNsZWVwLi4uIEFuZCBsb2NraW5nIGl0c2VsZiBpcwotCSAqIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSBmbG9wcHlfY2hhbmdlIHRpbWVyIGZyb20gd29ya2luZyB3aXRoIFNULURNQQotCSAqIHJlZ2lzdGVycy4gKi8KLQlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0Jc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOwotCURJU0FCTEVfSVJRKCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JYm9ndXNjb3VudCA9IHRlc3Rwa3QobGFuY2VfdGFyZ2V0KTsKLQlpZiggbHAtPnBvbGxfdGltZSA8IE1BWF9QT0xMX1RJTUUgKSBscC0+cG9sbF90aW1lKys7Ci0KLQl3aGlsZShib2d1c2NvdW50LS0pIHsKLQkJcGt0X2xlbiA9IHJlY2VpdmVwa3QobGFuY2VfdGFyZ2V0LCBwaHlzX25pY19wYWNrZXQpOwotCi0JCWlmKCBwa3RfbGVuIDwgNjAgKSBicmVhazsKLQotCQkvKiBHb29kIHBhY2tldC4uLiAqLwotCi0JCWRtYV9jYWNoZV9tYWludGVuYW5jZSgodW5zaWduZWQgbG9uZylwaHlzX25pY19wYWNrZXQsIHBrdF9sZW4sIDApOwotCi0JCWxwLT5wb2xsX3RpbWUgPSBwYW1zbmV0X21pbl9wb2xsX3RpbWU7ICAgIC8qIGZhc3QgcG9sbCAqLwotCQlpZiggcGt0X2xlbiA+PSA2MCAmJiBwa3RfbGVuIDw9IDIwNDggKSB7Ci0JCQlpZiAocGt0X2xlbiA+IDE1MTQpCi0JCQkJcGt0X2xlbiA9IDE1MTQ7Ci0KLQkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLgotCQkJICovCi0JCQlza2IgPSBhbGxvY19za2IocGt0X2xlbiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoc2tiID09IE5VTEwpIHsKLQkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKLQkJCQkJZGV2LT5uYW1lKTsKLQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2tiLT5sZW4gPSBwa3RfbGVuOwotCQkJc2tiLT5kZXYgPSBkZXY7Ci0KLQkJCS8qICdza2ItPmRhdGEnIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuCi0JCQkgKi8KLQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAotCQkJCQkJcGt0X2xlbik7Ci0JCQluZXRpZl9yeChza2IpOwotCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47Ci0JCX0KLQl9Ci0KLQkvKiBJZiBhbnkgd29ydGgtd2hpbGUgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQsIGRldl9yaW50KCkKLQkgICBoYXMgZG9uZSBhIG1hcmtfYmgoSU5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQotCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLgotCSAqLwotCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm47Ci19Ci0KLS8qIHBhbXNuZXRfdGljazogY2FsbGVkIGJ5IHBhbXNuZXRfdGltZXIuIFJlYWRzIHBhY2tldHMgZnJvbSB0aGUgYWRhcHRlciwKLSAqIHBhc3NlcyB0aGVtIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZCByZXN0YXJ0cyB0aGUgdGltZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1wYW1zbmV0X3RpY2sodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlCSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiggcGFtc25ldF9kZWJ1ZyA+IDAgJiYgKGxwLT5vcGVuX3RpbWUrKyAmIDcpID09IDggKQotCQlwcmludGsoInBhbXNuZXRfdGljazogJWxkXG4iLCBscC0+b3Blbl90aW1lKTsKLQotCXBhbXNuZXRfcG9sbF9yeChkZXYpOwotCi0JcGFtc25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7Ci0JYWRkX3RpbWVyKCZwYW1zbmV0X3RpbWVyKTsKLX0KLQotLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBwYW1zbmV0X29wZW4oKS4KLSAqLwotc3RhdGljIGludAotcGFtc25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChwYW1zbmV0X2RlYnVnID4gMCkKLQkJcHJpbnRrKCJwYW1zbmV0X2Nsb3NlLCBvcGVuX3RpbWU9JWxkXG4iLCBscC0+b3Blbl90aW1lKTsKLQlkZWxfdGltZXIoJnBhbXNuZXRfdGltZXIpOwotCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKLQlESVNBQkxFX0lSUSgpOwotCi0JaWYgKGlmX3VwKQotCQlzdG9wKGxhbmNlX3RhcmdldCk7Ci0JaWZfdXAgPSAwOwotCi0JbHAtPm9wZW5fdGltZSA9IDA7Ci0KLQlkZXYtPnRidXN5ID0gMTsKLQlkZXYtPnN0YXJ0ID0gMDsKLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgotICAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gJmxwLT5zdGF0czsKLX0KLQotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcGFtX2RldjsKLQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JcGFtX2RldiA9IHBhbXNuZXRfcHJvYmUoLTEpOwotCWlmIChJU19FUlIocGFtX2RldikpCi0JCXJldHVybiBQVFJfRVJSKHBhbV9kZXYpOwotCXJldHVybiAwOwotfQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9uZXRkZXYocGFtX2Rldik7Ci0JZnJlZV9uZXRkZXYocGFtX2Rldik7Ci19Ci0KLSNlbmRpZiAvKiBNT0RVTEUgKi8KLQotLyogTG9jYWwgdmFyaWFibGVzOgotICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9pbmNsdWRlCi0JLWIgbTY4ay1saW51eGFvdXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIKLQktZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtRE1PRFVMRSAtSS4uLy4uL25ldC9pbmV0IC1jIGF0YXJpX3BhbXNuZXQuYyIKLSAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKLSAqICBrZXB0LW5ldy12ZXJzaW9uczogNQotICogIHRhYi13aWR0aDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDEuaCBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oCmluZGV4IGRmNGMxYTAuLmZmNDc2NWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxL2F0bDEuaAorKysgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDEuaApAQCAtNDMsNiArNDMsNyBAQAogc3RydWN0IGF0bDFfYWRhcHRlcjsKIAogI2RlZmluZSBBVEwxX01BWF9JTlRSCQkzCisjZGVmaW5lIEFUTDFfTUFYX1RYX0JVRl9MRU4JMHgzMDAwCS8qIDEyMjg4IGJ5dGVzICovCiAKICNkZWZpbmUgQVRMMV9ERUZBVUxUX1RQRAkyNTYKICNkZWZpbmUgQVRMMV9NQVhfVFBECQkxMDI0CkBAIC01NywyOSArNTgsNDUgQEAKICNkZWZpbmUgQVRMMV9SUkRfREVTQyhSLCBpKQlBVEwxX0dFVF9ERVNDKFIsIGksIHN0cnVjdCByeF9yZXR1cm5fZGVzYykKIAogLyoKKyAqIFRoaXMgZGV0YWNoZWQgY29tbWVudCBpcyBwcmVzZXJ2ZWQgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgb25seS4KKyAqIEl0IHdhcyBvcmlnaW5hbGx5IGF0dGFjaGVkIHRvIHNvbWUgY29kZSB0aGF0IGdvdCBkZWxldGVkLCBidXQgc2VlbXMKKyAqIGltcG9ydGFudCBlbm91Z2ggdG8ga2VlcCBhcm91bmQuLi4KKyAqCisgKiA8YmVnaW4gZGV0YWNoZWQgY29tbWVudD4KICAqIFNvbWUgd29ya2Fyb3VuZHMgcmVxdWlyZSBtaWxsaXNlY29uZCBkZWxheXMgYW5kIGFyZSBydW4gZHVyaW5nIGludGVycnVwdAogICogY29udGV4dC4gIE1vc3Qgbm90YWJseSwgd2hlbiBlc3RhYmxpc2hpbmcgbGluaywgdGhlIHBoeSBtYXkgbmVlZCB0d2Vha2luZwogICogYnV0IGNhbm5vdCBwcm9jZXNzIHBoeSByZWdpc3RlciByZWFkcy93cml0ZXMgZmFzdGVyIHRoYW4gbWlsbGlzZWNvbmQKICAqIGludGVydmFscy4uLmFuZCB3ZSBlc3RhYmxpc2ggbGluayBkdWUgdG8gYSAibGluayBzdGF0dXMgY2hhbmdlIiBpbnRlcnJ1cHQuCisgKiA8ZW5kIGRldGFjaGVkIGNvbW1lbnQ+CiAgKi8KIAogLyoKLSAqIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIsCi0gKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBidWZmZXIKKyAqIGF0bDFfcmluZ19oZWFkZXIgcmVwcmVzZW50cyBhIHNpbmdsZSwgY29udGlndW91cyBibG9jayBvZiBETUEgc3BhY2UKKyAqIG1hcHBlZCBmb3IgdGhlIHRocmVlIGRlc2NyaXB0b3IgcmluZ3MgKHRwZCwgcmZkLCBycmQpIGFuZCB0aGUgdHdvCisgKiBtZXNzYWdlIGJsb2NrcyAoY21iLCBzbWIpIGRlc2NyaWJlZCBiZWxvdworICovCitzdHJ1Y3QgYXRsMV9yaW5nX2hlYWRlciB7CisJdm9pZCAqZGVzYzsJCS8qIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZG1hOwkJLyogcGh5c2ljYWwgYWRkcmVzcyovCisJdW5zaWduZWQgaW50IHNpemU7CS8qIGxlbmd0aCBpbiBieXRlcyAqLworfTsKKworLyoKKyAqIGF0bDFfYnVmZmVyIGlzIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIKKyAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIHNrYgogICovCiBzdHJ1Y3QgYXRsMV9idWZmZXIgewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGxlbmd0aDsKLQl1MTYgYWxsb2NlZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwkvKiBzb2NrZXQgYnVmZmVyICovCisJdTE2IGxlbmd0aDsJCS8qIHJ4IGJ1ZmZlciBsZW5ndGggKi8KKwl1MTYgYWxsb2NlZDsJCS8qIDEgaWYgc2tiIGFsbG9jYXRlZCAqLwogCWRtYV9hZGRyX3QgZG1hOwogfTsKIAotI2RlZmluZSBNQVhfVFhfQlVGX0xFTgkJMHgzMDAwCS8qIDEyS0IgKi8KLQorLyogdHJhbnNtaXQgcGFja2V0IGRlc2NyaXB0b3IgKHRwZCkgcmluZyAqLwogc3RydWN0IGF0bDFfdHBkX3JpbmcgewotCXZvaWQgKmRlc2M7CQkvKiBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5ICovCi0JZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzaWNhbCBhZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgcmluZyAqLwotCXUxNiBzaXplOwkJLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3IgcmluZyBpbiBieXRlcyAqLworCXZvaWQgKmRlc2M7CQkvKiBkZXNjcmlwdG9yIHJpbmcgdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBkZXNjcmlwdG9yIHJpbmcgcGh5c2ljYWwgYWRkcmVzcyAqLworCXUxNiBzaXplOwkJLyogZGVzY3JpcHRvciByaW5nIGxlbmd0aCBpbiBieXRlcyAqLwogCXUxNiBjb3VudDsJCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLwogCXUxNiBod19pZHg7CQkvKiBoYXJkd2FyZSBpbmRleCAqLwogCWF0b21pY190IG5leHRfdG9fY2xlYW47CkBAIC04NywzNiArMTA0LDM0IEBACiAJc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKIH07CiAKKy8qIHJlY2VpdmUgZnJlZSBkZXNjcmlwdG9yIChyZmQpIHJpbmcgKi8KIHN0cnVjdCBhdGwxX3JmZF9yaW5nIHsKLQl2b2lkICpkZXNjOwotCWRtYV9hZGRyX3QgZG1hOwotCXUxNiBzaXplOwotCXUxNiBjb3VudDsKKwl2b2lkICpkZXNjOwkJLyogZGVzY3JpcHRvciByaW5nIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZG1hOwkJLyogZGVzY3JpcHRvciByaW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1MTYgc2l6ZTsJCS8qIGRlc2NyaXB0b3IgcmluZyBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1MTYgY291bnQ7CQkvKiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgKi8KIAlhdG9taWNfdCBuZXh0X3RvX3VzZTsKIAl1MTYgbmV4dF90b19jbGVhbjsKIAlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogfTsKIAorLyogcmVjZWl2ZSByZXR1cm4gZGVzY3JpcHRvciAocnJkKSByaW5nICovCiBzdHJ1Y3QgYXRsMV9ycmRfcmluZyB7Ci0Jdm9pZCAqZGVzYzsKLQlkbWFfYWRkcl90IGRtYTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl1MTYgY291bnQ7CisJdm9pZCAqZGVzYzsJCS8qIGRlc2NyaXB0b3IgcmluZyB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IGRtYTsJCS8qIGRlc2NyaXB0b3IgcmluZyBwaHlzaWNhbCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHNpemU7CS8qIGRlc2NyaXB0b3IgcmluZyBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1MTYgY291bnQ7CQkvKiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgKi8KIAl1MTYgbmV4dF90b191c2U7CiAJYXRvbWljX3QgbmV4dF90b19jbGVhbjsKIH07CiAKLXN0cnVjdCBhdGwxX3JpbmdfaGVhZGVyIHsKLQl2b2lkICpkZXNjOwkJLyogcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciByaW5nIG1lbW9yeSAqLwotCWRtYV9hZGRyX3QgZG1hOwkJLyogcGh5c2ljYWwgYWRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KLQl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3IgcmluZyBpbiBieXRlcyAqLwotfTsKLQorLyogY29hbGVzY2luZyBtZXNzYWdlIGJsb2NrIChjbWIpICovCiBzdHJ1Y3QgYXRsMV9jbWIgewogCXN0cnVjdCBjb2Fsc19tc2dfYmxvY2sgKmNtYjsKIAlkbWFfYWRkcl90IGRtYTsKIH07CiAKKy8qIHN0YXRpc3RpY3MgbWVzc2FnZSBibG9jayAoc21iKSAqLwogc3RydWN0IGF0bDFfc21iIHsKIAlzdHJ1Y3Qgc3RhdHNfbXNnX2Jsb2NrICpzbWI7CiAJZG1hX2FkZHJfdCBkbWE7CkBAIC0xNDEsMjQgKzE1NiwyNiBAQAogCXU2NCB0eF9hYm9ydGVkX2Vycm9yczsKIAl1NjQgdHhfd2luZG93X2Vycm9yczsKIAl1NjQgdHhfY2Fycmllcl9lcnJvcnM7Ci0KLQl1NjQgdHhfcGF1c2U7CQkvKiBudW0gUGF1c2UgcGFja2V0IHRyYW5zbWl0dGVkLiAqLwotCXU2NCBleGNlY29sOwkJLyogbnVtIHR4IHBhY2tldHMgYWJvcnRlZCBkdWUgdG8gZXhjZXNzaXZlIGNvbGxpc2lvbnMuICovCi0JdTY0IGRlZmZlcjsJCS8qIG51bSBkZWZlcnJlZCB0eCBwYWNrZXRzICovCi0JdTY0IHNjYzsJCS8qIG51bSBwYWNrZXRzIHN1YnNlcXVlbnRseSB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgdy8gc2luZ2xlIHByaW9yIGNvbGxpc2lvbi4gKi8KLQl1NjQgbWNjOwkJLyogbnVtIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSB3LyBtdWx0aXBsZSBwcmlvciBjb2xsaXNpb25zLiAqLworCXU2NCB0eF9wYXVzZTsJCS8qIG51bSBwYXVzZSBwYWNrZXRzIHRyYW5zbWl0dGVkLiAqLworCXU2NCBleGNlY29sOwkJLyogbnVtIHR4IHBhY2tldHMgdy8gZXhjZXNzaXZlIGNvbGxpc2lvbnMuICovCisJdTY0IGRlZmZlcjsJCS8qIG51bSB0eCBwYWNrZXRzIGRlZmVycmVkICovCisJdTY0IHNjYzsJCS8qIG51bSBwYWNrZXRzIHN1YnNlcXVlbnRseSB0cmFuc21pdHRlZAorCQkJCSAqIHN1Y2Nlc3NmdWxseSB3LyBzaW5nbGUgcHJpb3IgY29sbGlzaW9uLiAqLworCXU2NCBtY2M7CQkvKiBudW0gcGFja2V0cyBzdWJzZXF1ZW50bHkgdHJhbnNtaXR0ZWQKKwkJCQkgKiBzdWNjZXNzZnVsbHkgdy8gbXVsdGlwbGUgcHJpb3IgY29sbGlzaW9ucy4gKi8KIAl1NjQgbGF0ZWNvbDsJCS8qIG51bSB0eCBwYWNrZXRzICB3LyBsYXRlIGNvbGxpc2lvbnMuICovCi0JdTY0IHR4X3VuZGVydW47CQkvKiBudW0gdHggcGFja2V0cyBhYm9ydGVkIGR1ZSB0byB0cmFuc21pdCBGSUZPIHVuZGVycnVuLCBvciBUUkQgRklGTyB1bmRlcnJ1biAqLwotCXU2NCB0eF90cnVuYzsJCS8qIG51bSB0eCBwYWNrZXRzIHRydW5jYXRlZCBkdWUgdG8gc2l6ZSBleGNlZWRpbmcgTVRVLCByZWdhcmRsZXNzIHdoZXRoZXIgdHJ1bmNhdGVkIGJ5IFNlbGVuZSBvciBub3QuIChUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSByZWZsZWN0IHRoZSBtZWFuaW5nIGluIHRoaXMgY2FzZS4pICovCisJdTY0IHR4X3VuZGVydW47CQkvKiBudW0gdHggcGFja2V0cyBhYm9ydGVkIGR1ZSB0byB0cmFuc21pdAorCQkJCSAqIEZJRk8gdW5kZXJydW4sIG9yIFRSRCBGSUZPIHVuZGVycnVuICovCisJdTY0IHR4X3RydW5jOwkJLyogbnVtIHR4IHBhY2tldHMgdHJ1bmNhdGVkIGR1ZSB0byBzaXplCisJCQkJICogZXhjZWVkaW5nIE1UVSwgcmVnYXJkbGVzcyB3aGV0aGVyIHRydW5jYXRlZAorCQkJCSAqIGJ5IHRoZSBjaGlwIG9yIG5vdC4gKFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5CisJCQkJICogcmVmbGVjdCB0aGUgbWVhbmluZyBpbiB0aGlzIGNhc2UuKSAqLwogCXU2NCByeF9wYXVzZTsJCS8qIG51bSBQYXVzZSBwYWNrZXRzIHJlY2VpdmVkLiAqLwogCXU2NCByeF9ycmRfb3Y7CiAJdTY0IHJ4X3RydW5jOwogfTsKIAotLyogYm9hcmQgc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLwotI2RlZmluZSBBVEwxX1JFR1NfTEVOCTgKLQotLyogU3RydWN0dXJlIGNvbnRhaW5pbmcgdmFyaWFibGVzIHVzZWQgYnkgdGhlIHNoYXJlZCBjb2RlICovCisvKiBoYXJkd2FyZSBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBhdGwxX2h3IHsKIAl1OCBfX2lvbWVtICpod19hZGRyOwogCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmJhY2s7CkBAIC0xNjcsMjQgKzE4NCwzNSBAQAogCWVudW0gYXRsMV9kbWFfcmVxX2Jsb2NrIGRtYXJfYmxvY2s7CiAJZW51bSBhdGwxX2RtYV9yZXFfYmxvY2sgZG1hd19ibG9jazsKIAl1OCBwcmVhbWJsZV9sZW47Ci0JdTggbWF4X3JldHJ5OwkJLyogUmV0cmFuc21pc3Npb24gbWF4aW11bSwgYWZ0ZXIgd2hpY2ggdGhlIHBhY2tldCB3aWxsIGJlIGRpc2NhcmRlZCAqLwotCXU4IGphbV9pcGc7CQkvKiBJUEcgdG8gc3RhcnQgSkFNIGZvciBjb2xsaXNpb24gYmFzZWQgZmxvdyBjb250cm9sIGluIGhhbGYtZHVwbGV4IG1vZGUuIEluIHVuaXRzIG9mIDgtYml0IHRpbWUgKi8KLQl1OCBpcGd0OwkJLyogRGVzaXJlZCBiYWNrIHRvIGJhY2sgaW50ZXItcGFja2V0IGdhcC4gVGhlIGRlZmF1bHQgaXMgOTYtYml0IHRpbWUgKi8KLQl1OCBtaW5faWZnOwkJLyogTWluaW11bSBudW1iZXIgb2YgSUZHIHRvIGVuZm9yY2UgaW4gYmV0d2VlbiBSWCBmcmFtZXMuIEZyYW1lIGdhcCBiZWxvdyBzdWNoIElGUCBpcyBkcm9wcGVkICovCisJdTggbWF4X3JldHJ5OwkJLyogUmV0cmFuc21pc3Npb24gbWF4aW11bSwgYWZ0ZXIgd2hpY2ggdGhlCisJCQkJICogcGFja2V0IHdpbGwgYmUgZGlzY2FyZGVkICovCisJdTggamFtX2lwZzsJCS8qIElQRyB0byBzdGFydCBKQU0gZm9yIGNvbGxpc2lvbiBiYXNlZCBmbG93CisJCQkJICogY29udHJvbCBpbiBoYWxmLWR1cGxleCBtb2RlLiBJbiB1bml0cyBvZgorCQkJCSAqIDgtYml0IHRpbWUgKi8KKwl1OCBpcGd0OwkJLyogRGVzaXJlZCBiYWNrIHRvIGJhY2sgaW50ZXItcGFja2V0IGdhcC4KKwkJCQkgKiBUaGUgZGVmYXVsdCBpcyA5Ni1iaXQgdGltZSAqLworCXU4IG1pbl9pZmc7CQkvKiBNaW5pbXVtIG51bWJlciBvZiBJRkcgdG8gZW5mb3JjZSBpbiBiZXR3ZWVuCisJCQkJICogcmVjZWl2ZSBmcmFtZXMuIEZyYW1lIGdhcCBiZWxvdyBzdWNoIElGUAorCQkJCSAqIGlzIGRyb3BwZWQgKi8KIAl1OCBpcGdyMTsJCS8qIDY0Yml0IENhcnJpZXItU2Vuc2Ugd2luZG93ICovCiAJdTggaXBncjI7CQkvKiA5Ni1iaXQgSVBHIHdpbmRvdyAqLwotCXU4IHRwZF9idXJzdDsJCS8qIE51bWJlciBvZiBUUEQgdG8gcHJlZmV0Y2ggaW4gY2FjaGUtYWxpZ25lZCBidXJzdC4gRWFjaCBUUEQgaXMgMTYgYnl0ZXMgbG9uZyAqLwotCXU4IHJmZF9idXJzdDsJCS8qIE51bWJlciBvZiBSRkQgdG8gcHJlZmV0Y2ggaW4gY2FjaGUtYWxpZ25lZCBidXJzdC4gRWFjaCBSRkQgaXMgMTIgYnl0ZXMgbG9uZyAqLworCXU4IHRwZF9idXJzdDsJCS8qIE51bWJlciBvZiBUUEQgdG8gcHJlZmV0Y2ggaW4gY2FjaGUtYWxpZ25lZAorCQkJCSAqIGJ1cnN0LiBFYWNoIFRQRCBpcyAxNiBieXRlcyBsb25nICovCisJdTggcmZkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFJGRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkCisJCQkJICogYnVyc3QuIEVhY2ggUkZEIGlzIDEyIGJ5dGVzIGxvbmcgKi8KIAl1OCByZmRfZmV0Y2hfZ2FwOwotCXU4IHJyZF9idXJzdDsJCS8qIFRocmVzaG9sZCBudW1iZXIgb2YgUlJEcyB0aGF0IGNhbiBiZSByZXRpcmVkIGluIGEgYnVyc3QuIEVhY2ggUlJEIGlzIDE2IGJ5dGVzIGxvbmcgKi8KKwl1OCBycmRfYnVyc3Q7CQkvKiBUaHJlc2hvbGQgbnVtYmVyIG9mIFJSRHMgdGhhdCBjYW4gYmUgcmV0aXJlZAorCQkJCSAqIGluIGEgYnVyc3QuIEVhY2ggUlJEIGlzIDE2IGJ5dGVzIGxvbmcgKi8KIAl1OCB0cGRfZmV0Y2hfdGg7CiAJdTggdHBkX2ZldGNoX2dhcDsKIAl1MTYgdHhfanVtYm9fdGFza190aDsKLQl1MTYgdHhmX2J1cnN0OwkJLyogTnVtYmVyIG9mIGRhdGEgYnl0ZXMgdG8gcmVhZCBpbiBhIGNhY2hlLWFsaWduZWQgYnVyc3QuIEVhY2ggU1JBTSBlbnRyeSBpcwotCQkJCSAgIDggYnl0ZXMgbG9uZyAqLwotCXUxNiByeF9qdW1ib190aDsJLyogSnVtYm8gcGFja2V0IHNpemUgZm9yIG5vbi1WTEFOIHBhY2tldC4gVkxBTiBwYWNrZXRzIHNob3VsZCBhZGQgNCBieXRlcyAqLworCXUxNiB0eGZfYnVyc3Q7CQkvKiBOdW1iZXIgb2YgZGF0YSBieXRlcyB0byByZWFkIGluIGEgY2FjaGUtCisJCQkJICogYWxpZ25lZCBidXJzdC4gRWFjaCBTUkFNIGVudHJ5IGlzIDggYnl0ZXMgKi8KKwl1MTYgcnhfanVtYm9fdGg7CS8qIEp1bWJvIHBhY2tldCBzaXplIGZvciBub24tVkxBTiBwYWNrZXQuIFZMQU4KKwkJCQkgKiBwYWNrZXRzIHNob3VsZCBhZGQgNCBieXRlcyAqLwogCXUxNiByeF9qdW1ib19sa2FoOwotCXUxNiBycmRfcmV0X3RpbWVyOwkvKiBSUkQgcmV0aXJlbWVudCB0aW1lci4gRGVjcmVtZW50IGJ5IDEgYWZ0ZXIgZXZlcnkgNTEybnMgcGFzc2VzLiAqLworCXUxNiBycmRfcmV0X3RpbWVyOwkvKiBSUkQgcmV0aXJlbWVudCB0aW1lci4gRGVjcmVtZW50IGJ5IDEgYWZ0ZXIKKwkJCQkgKiBldmVyeSA1MTJucyBwYXNzZXMuICovCiAJdTE2IGxjb2w7CQkvKiBDb2xsaXNpb24gV2luZG93ICovCiAKIAl1MTYgY21iX3RwZDsKQEAgLTE5NCw0OCArMjIyLDM1IEBACiAJdTMyIHNtYl90aW1lcjsKIAl1MTYgbWVkaWFfdHlwZTsKIAl1MTYgYXV0b25lZ19hZHZlcnRpc2VkOwotCXUxNiBwY2lfY21kX3dvcmQ7CiAKIAl1MTYgbWlpX2F1dG9uZWdfYWR2X3JlZzsKIAl1MTYgbWlpXzEwMDB0X2N0cmxfcmVnOwogCi0JdTMyIG1lbV9yYW5nOwotCXUzMiB0eGN3OwogCXUzMiBtYXhfZnJhbWVfc2l6ZTsKIAl1MzIgbWluX2ZyYW1lX3NpemU7Ci0JdTMyIG1jX2ZpbHRlcl90eXBlOwotCXUzMiBudW1fbWNfYWRkcnM7Ci0JdTMyIGNvbGxpc2lvbl9kZWx0YTsKLQl1MzIgdHhfcGFja2V0X2RlbHRhOwotCXUxNiBwaHlfc3BkX2RlZmF1bHQ7CiAKIAl1MTYgZGV2X3JldjsKIAogCS8qIHNwaSBmbGFzaCAqLwogCXU4IGZsYXNoX3ZlbmRvcjsKIAotCXU4IGRtYV9mYWlybmVzczsKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07CiAJdTggcGVybV9tYWNfYWRkcltFVEhfQUxFTl07CiAKLQkvKiBib29sIHBoeV9wcmVhbWJsZV9zdXA7ICovCiAJYm9vbCBwaHlfY29uZmlndXJlZDsKIH07CiAKIHN0cnVjdCBhdGwxX2FkYXB0ZXIgewotCS8qIE9TIGRlZmluZWQgc3RydWN0cyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOwogCXN0cnVjdCBhdGwxX3NmdF9zdGF0cyBzb2Z0X3N0YXRzOwotCiAJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOwogCXUzMiByeF9idWZmZXJfbGVuOwogCXUzMiB3b2w7CiAJdTE2IGxpbmtfc3BlZWQ7CiAJdTE2IGxpbmtfZHVwbGV4OwogCXNwaW5sb2NrX3QgbG9jazsKLQlhdG9taWNfdCBpcnFfc2VtOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IGxpbmtfY2hnX3Rhc2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IHBjaWVfZG1hX3RvX3JzdF90YXNrOwpAQCAtMjQzLDkgKzI1OCw3IEBACiAJc3RydWN0IHRpbWVyX2xpc3QgcGh5X2NvbmZpZ190aW1lcjsKIAlib29sIHBoeV90aW1lcl9wZW5kaW5nOwogCi0JYm9vbCBtYWNfZGlzYWJsZWQ7Ci0KLQkvKiBBbGwgZGVzY3JpcHRvciByaW5ncycgbWVtb3J5ICovCisJLyogYWxsIGRlc2NyaXB0b3IgcmluZ3MnIG1lbW9yeSAqLwogCXN0cnVjdCBhdGwxX3JpbmdfaGVhZGVyIHJpbmdfaGVhZGVyOwogCiAJLyogVFggKi8KQEAgLTI1OCwyNSArMjcxLDE2IEBACiAJdTY0IGh3X2NzdW1fZXJyOwogCXU2NCBod19jc3VtX2dvb2Q7CiAKLQl1MzIgZ29yY2w7Ci0JdTY0IGdvcmNsX29sZDsKLQotCS8qIEludGVycnVwdCBNb2RlcmF0b3IgdGltZXIgKCAydXMgcmVzb2x1dGlvbikgKi8KLQl1MTYgaW10OwotCS8qIEludGVycnVwdCBDbGVhciB0aW1lciAoMnVzIHJlc29sdXRpb24pICovCi0JdTE2IGljdDsKLQotCS8qIE1JSSBpbnRlcmZhY2UgaW5mbyAqLwotCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWk7CisJdTE2IGltdDsJLyogaW50ZXJydXB0IG1vZGVyYXRvciB0aW1lciAoMnVzIHJlc29sdXRpb24gKi8KKwl1MTYgaWN0OwkvKiBpbnRlcnJ1cHQgY2xlYXIgdGltZXIgKDJ1cyByZXNvbHV0aW9uICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsJCS8qIE1JSSBpbnRlcmZhY2UgaW5mbyAqLwogCiAJLyogc3RydWN0cyBkZWZpbmVkIGluIGF0bDFfaHcuaCAqLwotCXUzMiBiZF9udW1iZXI7CQkvKiBib2FyZCBudW1iZXIgKi8KKwl1MzIgYmRfbnVtYmVyOwkJCS8qIGJvYXJkIG51bWJlciAqLwogCWJvb2wgcGNpX3VzaW5nXzY0OwogCXN0cnVjdCBhdGwxX2h3IGh3OwogCXN0cnVjdCBhdGwxX3NtYiBzbWI7CiAJc3RydWN0IGF0bDFfY21iIGNtYjsKLQotCXUzMiBwY2lfc3RhdGVbMTZdOwogfTsKIAogI2VuZGlmCS8qIF9BVEwxX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwppbmRleCA1MDE5MTllLi5mZDFlMTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMKQEAgLTM4LDcgKzM4LDcgQEAKICAqIFRPRE86CiAgKiBGaXggVFNPOyB0eCBwZXJmb3JtYW5jZSBpcyBob3JyaWJsZSB3aXRoIFRTTyBlbmFibGVkLgogICogV2FrZSBvbiBMQU4uCi0gKiBBZGQgbW9yZSBldGh0b29sIGZ1bmN0aW9ucywgaW5jbHVkaW5nIHNldCByaW5nIHBhcmFtZXRlcnMuCisgKiBBZGQgbW9yZSBldGh0b29sIGZ1bmN0aW9ucy4KICAqIEZpeCBhYnN0cnVzZSBpcnEgZW5hYmxlL2Rpc2FibGUgY29uZGl0aW9uIGRlc2NyaWJlZCBoZXJlOgogICoJaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1saW51eC1uZXRkZXYmbT0xMTYzOTg1MDg1MDA1NTMmdz0yCiAgKgpAQCAtNzUsNiArNzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTE1OCwxMyArMTU5LDcwIEBACiAJaHctPmNtYl90eF90aW1lciA9IDE7CS8qIGFib3V0IDJ1cyAqLwogCWh3LT5zbWJfdGltZXIgPSAxMDAwMDA7CS8qIGFib3V0IDIwMG1zICovCiAKLQlhdG9taWNfc2V0KCZhZGFwdGVyLT5pcnFfc2VtLCAwKTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPm1iX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUxNiByZXN1bHQ7CisKKwlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0gJiAweDFmLCAmcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0sCisJaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWF0bDFfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0sIHZhbCk7Cit9CisKKy8qCisgKiBhdGwxX21paV9pb2N0bCAtCisgKiBAbmV0ZGV2OgorICogQGlmcmVxOgorICogQGNtZDoKKyAqLworc3RhdGljIGludCBhdGwxX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IGdlbmVyaWNfbWlpX2lvY3RsKCZhZGFwdGVyLT5taWksIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBhdGwxX2lvY3RsIC0KKyAqIEBuZXRkZXY6CisgKiBAaWZyZXE6CisgKiBAY21kOgorICovCitzdGF0aWMgaW50IGF0bDFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCWNhc2UgU0lPQ0dNSUlSRUc6CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJcmV0dXJuIGF0bDFfbWlpX2lvY3RsKG5ldGRldiwgaWZyLCBjbWQpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKIC8qCiAgKiBhdGwxX3NldHVwX21lbV9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBUeCAvIFJYIGRlc2NyaXB0b3IgcmVzb3VyY2VzCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKQEAgLTE4OCwxOSArMjQ2LDIyIEBACiAJCWdvdG8gZXJyX25vbWVtOwogCX0KIAlyZmRfcmluZy0+YnVmZmVyX2luZm8gPQotCSAgICAoc3RydWN0IGF0bDFfYnVmZmVyICopKHRwZF9yaW5nLT5idWZmZXJfaW5mbyArIHRwZF9yaW5nLT5jb3VudCk7CisJCShzdHJ1Y3QgYXRsMV9idWZmZXIgKikodHBkX3JpbmctPmJ1ZmZlcl9pbmZvICsgdHBkX3JpbmctPmNvdW50KTsKIAotCS8qIHJlYWwgcmluZyBETUEgYnVmZmVyICovCi0JcmluZ19oZWFkZXItPnNpemUgPSBzaXplID0gc2l6ZW9mKHN0cnVjdCB0eF9wYWNrZXRfZGVzYykgKgotCQkJCQl0cGRfcmluZy0+Y291bnQKLQkgICAgKyBzaXplb2Yoc3RydWN0IHJ4X2ZyZWVfZGVzYykgKiByZmRfcmluZy0+Y291bnQKLQkgICAgKyBzaXplb2Yoc3RydWN0IHJ4X3JldHVybl9kZXNjKSAqIHJyZF9yaW5nLT5jb3VudAotCSAgICArIHNpemVvZihzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrKQotCSAgICArIHNpemVvZihzdHJ1Y3Qgc3RhdHNfbXNnX2Jsb2NrKQotCSAgICArIDQwOwkJLyogIjQwOiBmb3IgOCBieXRlcyBhbGlnbiIgaHVoPyAtLSBDSFMgKi8KKwkvKiByZWFsIHJpbmcgRE1BIGJ1ZmZlcgorCSAqIGVhY2ggcmluZy9ibG9jayBtYXkgbmVlZCB1cCB0byA4IGJ5dGVzIGZvciBhbGlnbm1lbnQsIGhlbmNlIHRoZQorCSAqIGFkZGl0aW9uYWwgNDAgYnl0ZXMgdGFja2VkIG9udG8gdGhlIGVuZC4KKwkgKi8KKwlyaW5nX2hlYWRlci0+c2l6ZSA9IHNpemUgPQorCQlzaXplb2Yoc3RydWN0IHR4X3BhY2tldF9kZXNjKSAqIHRwZF9yaW5nLT5jb3VudAorCQkrIHNpemVvZihzdHJ1Y3QgcnhfZnJlZV9kZXNjKSAqIHJmZF9yaW5nLT5jb3VudAorCQkrIHNpemVvZihzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MpICogcnJkX3JpbmctPmNvdW50CisJCSsgc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spCisJCSsgc2l6ZW9mKHN0cnVjdCBzdGF0c19tc2dfYmxvY2spCisJCSsgNDA7CiAKIAlyaW5nX2hlYWRlci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHJpbmdfaGVhZGVyLT5zaXplLAotCQkJCQkJJnJpbmdfaGVhZGVyLT5kbWEpOworCQkmcmluZ19oZWFkZXItPmRtYSk7CiAJaWYgKHVubGlrZWx5KCFyaW5nX2hlYWRlci0+ZGVzYykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2FsbG9jX2NvbnNpc3RlbnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfbm9tZW07CkBAIC0yMTQsOCArMjc1LDYgQEAKIAl0cGRfcmluZy0+ZG1hICs9IG9mZnNldDsKIAl0cGRfcmluZy0+ZGVzYyA9ICh1OCAqKSByaW5nX2hlYWRlci0+ZGVzYyArIG9mZnNldDsKIAl0cGRfcmluZy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MpICogdHBkX3JpbmctPmNvdW50OwotCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7Ci0JYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOwogCiAJLyogaW5pdCBSRkQgcmluZyAqLwogCXJmZF9yaW5nLT5kbWEgPSB0cGRfcmluZy0+ZG1hICsgdHBkX3JpbmctPnNpemU7CkBAIC0yMjMsOSArMjgyLDcgQEAKIAlyZmRfcmluZy0+ZG1hICs9IG9mZnNldDsKIAlyZmRfcmluZy0+ZGVzYyA9ICh1OCAqKSB0cGRfcmluZy0+ZGVzYyArICh0cGRfcmluZy0+c2l6ZSArIG9mZnNldCk7CiAJcmZkX3JpbmctPnNpemUgPSBzaXplb2Yoc3RydWN0IHJ4X2ZyZWVfZGVzYykgKiByZmRfcmluZy0+Y291bnQ7Ci0JcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOwotCS8qIHJmZF9yaW5nLT5uZXh0X3RvX3VzZSA9IHJmZF9yaW5nLT5jb3VudCAtIDE7ICovCi0JYXRvbWljX3NldCgmcmZkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKKwogCiAJLyogaW5pdCBSUkQgcmluZyAqLwogCXJyZF9yaW5nLT5kbWEgPSByZmRfcmluZy0+ZG1hICsgcmZkX3JpbmctPnNpemU7CkBAIC0yMzMsMjMgKzI5MCwyMiBAQAogCXJyZF9yaW5nLT5kbWEgKz0gb2Zmc2V0OwogCXJyZF9yaW5nLT5kZXNjID0gKHU4ICopIHJmZF9yaW5nLT5kZXNjICsgKHJmZF9yaW5nLT5zaXplICsgb2Zmc2V0KTsKIAlycmRfcmluZy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MpICogcnJkX3JpbmctPmNvdW50OwotCXJyZF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7Ci0JYXRvbWljX3NldCgmcnJkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworCiAKIAkvKiBpbml0IENNQiAqLwogCWFkYXB0ZXItPmNtYi5kbWEgPSBycmRfcmluZy0+ZG1hICsgcnJkX3JpbmctPnNpemU7CiAJb2Zmc2V0ID0gKGFkYXB0ZXItPmNtYi5kbWEgJiAweDcpID8gKDggLSAoYWRhcHRlci0+Y21iLmRtYSAmIDB4NykpIDogMDsKIAlhZGFwdGVyLT5jbWIuZG1hICs9IG9mZnNldDsKLQlhZGFwdGVyLT5jbWIuY21iID0KLQkgICAgKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2sgKikgKCh1OCAqKSBycmRfcmluZy0+ZGVzYyArCi0JCQkJICAgKHJyZF9yaW5nLT5zaXplICsgb2Zmc2V0KSk7CisJYWRhcHRlci0+Y21iLmNtYiA9IChzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrICopCisJCSgodTggKikgcnJkX3JpbmctPmRlc2MgKyAocnJkX3JpbmctPnNpemUgKyBvZmZzZXQpKTsKIAogCS8qIGluaXQgU01CICovCiAJYWRhcHRlci0+c21iLmRtYSA9IGFkYXB0ZXItPmNtYi5kbWEgKyBzaXplb2Yoc3RydWN0IGNvYWxzX21zZ19ibG9jayk7CiAJb2Zmc2V0ID0gKGFkYXB0ZXItPnNtYi5kbWEgJiAweDcpID8gKDggLSAoYWRhcHRlci0+c21iLmRtYSAmIDB4NykpIDogMDsKIAlhZGFwdGVyLT5zbWIuZG1hICs9IG9mZnNldDsKIAlhZGFwdGVyLT5zbWIuc21iID0gKHN0cnVjdCBzdGF0c19tc2dfYmxvY2sgKikKLQkgICAgKCh1OCAqKSBhZGFwdGVyLT5jbWIuY21iICsgKHNpemVvZihzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrKSArIG9mZnNldCkpOworCQkoKHU4ICopIGFkYXB0ZXItPmNtYi5jbWIgKworCQkoc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spICsgb2Zmc2V0KSk7CiAKIAlyZXR1cm4gQVRMMV9TVUNDRVNTOwogCkBAIC0yNTgsMTQgKzMxNCw2ODIgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAordm9pZCBhdGwxX2luaXRfcmluZ19wdHJzKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyZmRfcmluZyA9ICZhZGFwdGVyLT5yZmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkX3JpbmcgPSAmYWRhcHRlci0+cnJkX3Jpbmc7CisKKwlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b191c2UsIDApOworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKKworCXJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwlhdG9taWNfc2V0KCZyZmRfcmluZy0+bmV4dF90b191c2UsIDApOworCisJcnJkX3JpbmctPm5leHRfdG9fdXNlID0gMDsKKwlhdG9taWNfc2V0KCZycmRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7Cit9CisKKy8qCisgKiBhdGwxX2NsZWFuX3J4X3JpbmcgLSBGcmVlIFJGRCBCdWZmZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV9jbGVhbl9yeF9yaW5nKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBGcmVlIGFsbCB0aGUgUnggcmluZyBza19idWZmcyAqLworCWZvciAoaSA9IDA7IGkgPCByZmRfcmluZy0+Y291bnQ7IGkrKykgeworCQlidWZmZXJfaW5mbyA9ICZyZmRfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7CisJCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBidWZmZXJfaW5mby0+ZG1hLAorCQkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKKwkJfQorCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYihidWZmZXJfaW5mby0+c2tiKTsKKwkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRsMV9idWZmZXIpICogcmZkX3JpbmctPmNvdW50OworCW1lbXNldChyZmRfcmluZy0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCW1lbXNldChyZmRfcmluZy0+ZGVzYywgMCwgcmZkX3JpbmctPnNpemUpOworCisJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCWF0b21pY19zZXQoJnJmZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisKKwlycmRfcmluZy0+bmV4dF90b191c2UgPSAwOworCWF0b21pY19zZXQoJnJyZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKK30KKworLyoKKyAqIGF0bDFfY2xlYW5fdHhfcmluZyAtIEZyZWUgVHggQnVmZmVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBGcmVlIGFsbCB0aGUgVHggcmluZyBza19idWZmcyAqLworCWZvciAoaSA9IDA7IGkgPCB0cGRfcmluZy0+Y291bnQ7IGkrKykgeworCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7CisJCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBidWZmZXJfaW5mby0+ZG1hLAorCQkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdHBkX3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmdHBkX3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmZmVyX2luZm8tPnNrYik7CisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwkJfQorCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bDFfYnVmZmVyKSAqIHRwZF9yaW5nLT5jb3VudDsKKwltZW1zZXQodHBkX3JpbmctPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKworCS8qIFplcm8gb3V0IHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KKwltZW1zZXQodHBkX3JpbmctPmRlc2MsIDAsIHRwZF9yaW5nLT5zaXplKTsKKworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworfQorCisvKgorICogYXRsMV9mcmVlX3JpbmdfcmVzb3VyY2VzIC0gRnJlZSBUeCAvIFJYIGRlc2NyaXB0b3IgUmVzb3VyY2VzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqLwordm9pZCBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyZmRfcmluZyA9ICZhZGFwdGVyLT5yZmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkX3JpbmcgPSAmYWRhcHRlci0+cnJkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkYXB0ZXItPnJpbmdfaGVhZGVyOworCisJYXRsMV9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOworCWF0bDFfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKKworCWtmcmVlKHRwZF9yaW5nLT5idWZmZXJfaW5mbyk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByaW5nX2hlYWRlci0+c2l6ZSwgcmluZ19oZWFkZXItPmRlc2MsCisJCXJpbmdfaGVhZGVyLT5kbWEpOworCisJdHBkX3JpbmctPmJ1ZmZlcl9pbmZvID0gTlVMTDsKKwl0cGRfcmluZy0+ZGVzYyA9IE5VTEw7CisJdHBkX3JpbmctPmRtYSA9IDA7CisKKwlyZmRfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOworCXJmZF9yaW5nLT5kZXNjID0gTlVMTDsKKwlyZmRfcmluZy0+ZG1hID0gMDsKKworCXJyZF9yaW5nLT5kZXNjID0gTlVMTDsKKwlycmRfcmluZy0+ZG1hID0gMDsKK30KKworc3RhdGljIHZvaWQgYXRsMV9zZXR1cF9tYWNfY3RybChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2YWx1ZTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwkvKiBDb25maWcgTUFDIENUUkwgUmVnaXN0ZXIgKi8KKwl2YWx1ZSA9IE1BQ19DVFJMX1RYX0VOIHwgTUFDX0NUUkxfUlhfRU47CisJLyogZHVwbGV4ICovCisJaWYgKEZVTExfRFVQTEVYID09IGFkYXB0ZXItPmxpbmtfZHVwbGV4KQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9EVVBMWDsKKwkvKiBzcGVlZCAqLworCXZhbHVlIHw9ICgodTMyKSAoKFNQRUVEXzEwMDAgPT0gYWRhcHRlci0+bGlua19zcGVlZCkgPworCQkJIE1BQ19DVFJMX1NQRUVEXzEwMDAgOiBNQUNfQ1RSTF9TUEVFRF8xMF8xMDApIDw8CisJCSAgTUFDX0NUUkxfU1BFRURfU0hJRlQpOworCS8qIGZsb3cgY29udHJvbCAqLworCXZhbHVlIHw9IChNQUNfQ1RSTF9UWF9GTE9XIHwgTUFDX0NUUkxfUlhfRkxPVyk7CisJLyogUEFEICYgQ1JDICovCisJdmFsdWUgfD0gKE1BQ19DVFJMX0FERF9DUkMgfCBNQUNfQ1RSTF9QQUQpOworCS8qIHByZWFtYmxlIGxlbmd0aCAqLworCXZhbHVlIHw9ICgoKHUzMikgYWRhcHRlci0+aHcucHJlYW1ibGVfbGVuCisJCSAgICYgTUFDX0NUUkxfUFJNTEVOX01BU0spIDw8IE1BQ19DVFJMX1BSTUxFTl9TSElGVCk7CisJLyogdmxhbiAqLworCWlmIChhZGFwdGVyLT52bGdycCkKKwkJdmFsdWUgfD0gTUFDX0NUUkxfUk1WX1ZMQU47CisJLyogcnggY2hlY2tzdW0KKwkgICBpZiAoYWRhcHRlci0+cnhfY3N1bSkKKwkgICB2YWx1ZSB8PSBNQUNfQ1RSTF9SWF9DSEtTVU1fRU47CisJICovCisJLyogZmlsdGVyIG1vZGUgKi8KKwl2YWx1ZSB8PSBNQUNfQ1RSTF9CQ19FTjsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9QUk9NSVNfRU47CisJZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJdmFsdWUgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOworCS8qIHZhbHVlIHw9IE1BQ19DVFJMX0xPT1BCQUNLOyAqLworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworfQorCisvKgorICogYXRsMV9zZXRfbWFjIC0gQ2hhbmdlIHRoZSBFdGhlcm5ldCBBZGRyZXNzIG9mIHRoZSBOSUMKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwOiBwb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhdGwxX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlhdGwxX3NldF9tYWNfYWRkcigmYWRhcHRlci0+aHcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGF0bDFfY2hlY2tfbGluayhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXUzMiByZXRfdmFsOworCXUxNiBzcGVlZCwgZHVwbGV4LCBwaHlfZGF0YTsKKwlpbnQgcmVjb25maWcgPSAwOworCisJLyogTUlJX0JNU1IgbXVzdCByZWFkIHR3aWNlICovCisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlpZiAoIShwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsJLyogbGluayBkb3duICovCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsJLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCisJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAibGluayBpcyBkb3duXG4iKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJfQorCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCX0KKworCS8qIExpbmsgVXAgKi8KKwlyZXRfdmFsID0gYXRsMV9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7CisJY2FzZSBNRURJQV9UWVBFXzEwMDBNX0ZVTEw6CisJCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xMDBNX0hBTEY6CisJCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAgfHwgZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6CisJCWlmIChzcGVlZCAhPSBTUEVFRF8xMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xME1fSEFMRjoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBIQUxGX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyogbGluayByZXN1bHQgaXMgb3VyIHNldHRpbmcgKi8KKwlpZiAoIXJlY29uZmlnKSB7CisJCWlmIChhZGFwdGVyLT5saW5rX3NwZWVkICE9IHNwZWVkCisJCSAgICB8fCBhZGFwdGVyLT5saW5rX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBzcGVlZDsKKwkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gZHVwbGV4OworCQkJYXRsMV9zZXR1cF9tYWNfY3RybChhZGFwdGVyKTsKKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJIiVzIGxpbmsgaXMgdXAgJWQgTWJwcyAlc1xuIiwKKwkJCQluZXRkZXYtPm5hbWUsIGFkYXB0ZXItPmxpbmtfc3BlZWQsCisJCQkJYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVggPworCQkJCSJmdWxsIGR1cGxleCIgOiAiaGFsZiBkdXBsZXgiKTsKKwkJfQorCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBMaW5rIGRvd24gLT4gVXAgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwkJfQorCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCX0KKworCS8qIGNoYW5nZSBvcmlnbmFsIGxpbmsgc3RhdHVzICovCisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCWlmIChody0+bWVkaWFfdHlwZSAhPSBNRURJQV9UWVBFX0FVVE9fU0VOU09SICYmCisJICAgIGh3LT5tZWRpYV90eXBlICE9IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgeworCQlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7CisJCWNhc2UgTUVESUFfVFlQRV8xMDBNX0ZVTEw6CisJCQlwaHlfZGF0YSA9IE1JSV9DUl9GVUxMX0RVUExFWCB8IE1JSV9DUl9TUEVFRF8xMDAgfAorCQkJICAgICAgICAgICBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6CisJCQlwaHlfZGF0YSA9CisJCQkgICAgTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIE1FRElBX1RZUEVfMTBNX0hBTEY6ICovCisJCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQl9CisJCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIHBoeV9kYXRhKTsKKwkJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKKwl9CisKKwkvKiBhdXRvLW5lZywgaW5zZXJ0IHRpbWVyIHRvIHJlLWNvbmZpZyBwaHkgKi8KKwlpZiAoIWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nKSB7CisJCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gdHJ1ZTsKKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyLCBqaWZmaWVzICsgMyAqIEhaKTsKKwl9CisKKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2NoZWNrX2Zvcl9saW5rKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwl1MTYgcGh5X2RhdGEgPSAwOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJYXRsMV9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwkvKiBub3RpZnkgdXBwZXIgbGF5ZXIgbGluayBkb3duIEFTQVAgKi8KKwlpZiAoIShwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsJLyogTGluayBEb3duICovCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsJLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCisJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXMgbGluayBpcyBkb3duXG4iLAorCQkJCW5ldGRldi0+bmFtZSk7CisJCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCX0KKwl9CisJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+bGlua19jaGdfdGFzayk7Cit9CisKKy8qCisgKiBhdGwxX3NldF9tdWx0aSAtIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgc2V0X211bHRpIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgbXVsdGljYXN0IGFkZHJlc3MKKyAqIGxpc3Qgb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZsYWdzIGFyZSB1cGRhdGVkLiAgVGhpcyByb3V0aW5lIGlzCisgKiByZXNwb25zaWJsZSBmb3IgY29uZmlndXJpbmcgdGhlIGhhcmR3YXJlIGZvciBwcm9wZXIgbXVsdGljYXN0LAorICogcHJvbWlzY3VvdXMgbW9kZSwgYW5kIGFsbC1tdWx0aSBiZWhhdmlvci4KKyAqLworc3RhdGljIHZvaWQgYXRsMV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CisJdTMyIHJjdGw7CisJdTMyIGhhc2hfdmFsdWU7CisKKwkvKiBDaGVjayBmb3IgUHJvbWlzY3VvdXMgYW5kIEFsbCBNdWx0aWNhc3QgbW9kZXMgKi8KKwlyY3RsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXJjdGwgfD0gTUFDX0NUUkxfUFJPTUlTX0VOOworCWVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJcmN0bCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47CisJCXJjdGwgJj0gfk1BQ19DVFJMX1BST01JU19FTjsKKwl9IGVsc2UKKwkJcmN0bCAmPSB+KE1BQ19DVFJMX1BST01JU19FTiB8IE1BQ19DVFJMX01DX0FMTF9FTik7CisKKwlpb3dyaXRlMzIocmN0bCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCisJLyogY2xlYXIgdGhlIG9sZCBzZXR0aW5ncyBmcm9tIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLworCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKTsKKwlpb3dyaXRlMzIoMCwgKGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpICsgKDEgPDwgMikpOworCisJLyogY29tcHV0ZSBtYyBhZGRyZXNzZXMnIGhhc2ggdmFsdWUgLGFuZCBwdXQgaXQgaW50byBoYXNoIHRhYmxlICovCisJZm9yIChtY19wdHIgPSBuZXRkZXYtPm1jX2xpc3Q7IG1jX3B0cjsgbWNfcHRyID0gbWNfcHRyLT5uZXh0KSB7CisJCWhhc2hfdmFsdWUgPSBhdGwxX2hhc2hfbWNfYWRkcihodywgbWNfcHRyLT5kbWlfYWRkcik7CisJCWF0bDFfaGFzaF9zZXQoaHcsIGhhc2hfdmFsdWUpOworCX0KK30KKworLyoKKyAqIGF0bDFfY2hhbmdlX210dSAtIENoYW5nZSB0aGUgTWF4aW11bSBUcmFuc2ZlciBVbml0CisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbmV3X210dTogbmV3IHZhbHVlIGZvciBtYXhpbXVtIGZyYW1lIHNpemUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGF0bDFfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgb2xkX210dSA9IG5ldGRldi0+bXR1OworCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOworCisJaWYgKChtYXhfZnJhbWUgPCBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUpIHx8CisJICAgIChtYXhfZnJhbWUgPiBNQVhfSlVNQk9fRlJBTUVfU0laRSkpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgImludmFsaWQgTVRVIHNldHRpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGFwdGVyLT5ody5tYXhfZnJhbWVfc2l6ZSA9IG1heF9mcmFtZTsKKwlhZGFwdGVyLT5ody50eF9qdW1ib190YXNrX3RoID0gKG1heF9mcmFtZSArIDcpID4+IDM7CisJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IChtYXhfZnJhbWUgKyA3KSAmIH43OworCWFkYXB0ZXItPmh3LnJ4X2p1bWJvX3RoID0gYWRhcHRlci0+cnhfYnVmZmVyX2xlbiAvIDg7CisKKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisJaWYgKChvbGRfbXR1ICE9IG5ld19tdHUpICYmIG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQlhdGwxX2Rvd24oYWRhcHRlcik7CisJCWF0bDFfdXAoYWRhcHRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbG93X2N0cmxfb2xkKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGhpLCBsbywgdmFsdWU7CisKKwkvKiBSRkQgRmxvdyBDb250cm9sICovCisJdmFsdWUgPSBhZGFwdGVyLT5yZmRfcmluZy5jb3VudDsKKwloaSA9IHZhbHVlIC8gMTY7CisJaWYgKGhpIDwgMikKKwkJaGkgPSAyOworCWxvID0gdmFsdWUgKiA3IC8gODsKKworCXZhbHVlID0gKChoaSAmIFJYUV9SWEZfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9ISV9TSElGVCkgfAorCQkoKGxvICYgUlhRX1JYRl9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0xPX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfUlhRX1JYRl9QQVVTRV9USFJFU0gpOworCisJLyogUlJEIEZsb3cgQ29udHJvbCAqLworCXZhbHVlID0gYWRhcHRlci0+cnJkX3JpbmcuY291bnQ7CisJbG8gPSB2YWx1ZSAvIDE2OworCWhpID0gdmFsdWUgKiA3IC8gODsKKwlpZiAobG8gPCAyKQorCQlsbyA9IDI7CisJdmFsdWUgPSAoKGhpICYgUlhRX1JSRF9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0hJX1NISUZUKSB8CisJCSgobG8gJiBSWFFfUlJEX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfTE9fU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19SWFFfUlJEX1BBVVNFX1RIUkVTSCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbG93X2N0cmxfbmV3KHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKwl1MzIgaGksIGxvLCB2YWx1ZTsKKworCS8qIFJYRiBGbG93IENvbnRyb2wgKi8KKwl2YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NSQU1fUlhGX0xFTik7CisJbG8gPSB2YWx1ZSAvIDE2OworCWlmIChsbyA8IDE5MikKKwkJbG8gPSAxOTI7CisJaGkgPSB2YWx1ZSAqIDcgLyA4OworCWlmIChoaSA8IGxvKQorCQloaSA9IGxvICsgMTY7CisJdmFsdWUgPSAoKGhpICYgUlhRX1JYRl9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0hJX1NISUZUKSB8CisJCSgobG8gJiBSWFFfUlhGX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfTE9fU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX1JYRl9QQVVTRV9USFJFU0gpOworCisJLyogUlJEIEZsb3cgQ29udHJvbCAqLworCXZhbHVlID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfU1JBTV9SUkRfTEVOKTsKKwlsbyA9IHZhbHVlIC8gODsKKwloaSA9IHZhbHVlICogNyAvIDg7CisJaWYgKGxvIDwgMikKKwkJbG8gPSAyOworCWlmIChoaSA8IGxvKQorCQloaSA9IGxvICsgMzsKKwl2YWx1ZSA9ICgoaGkgJiBSWFFfUlJEX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkJKChsbyAmIFJYUV9SUkRfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9MT19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfUlJEX1BBVVNFX1RIUkVTSCk7Cit9CisKKy8qCisgKiBhdGwxX2NvbmZpZ3VyZSAtIENvbmZpZ3VyZSBUcmFuc21pdCZSZWNlaXZlIFVuaXQgYWZ0ZXIgUmVzZXQKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZSB0aGUgVHggL1J4IHVuaXQgb2YgdGhlIE1BQyBhZnRlciBhIHJlc2V0LgorICovCitzdGF0aWMgdTMyIGF0bDFfY29uZmlndXJlKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiB2YWx1ZTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCisJLyogc2V0IE1BQyBBZGRyZXNzICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT5tYWNfYWRkclsyXSkgPDwgMjQpIHwKKwkJKCgodTMyKSBody0+bWFjX2FkZHJbM10pIDw8IDE2KSB8CisJCSgoKHUzMikgaHctPm1hY19hZGRyWzRdKSA8PCA4KSB8CisJCSgoKHUzMikgaHctPm1hY19hZGRyWzVdKSk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfU1RBX0FERFIpOworCXZhbHVlID0gKCgodTMyKSBody0+bWFjX2FkZHJbMF0pIDw8IDgpIHwgKCgodTMyKSBody0+bWFjX2FkZHJbMV0pKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgKFJFR19NQUNfU1RBX0FERFIgKyA0KSk7CisKKwkvKiB0eCAvIHJ4IHJpbmcgKi8KKworCS8qIEhJIGJhc2UgYWRkcmVzcyAqLworCWlvd3JpdGUzMigodTMyKSAoKGFkYXB0ZXItPnRwZF9yaW5nLmRtYSAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkgPj4gMzIpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX0JBU0VfQUREUl9ISSk7CisJLyogTE8gYmFzZSBhZGRyZXNzICovCisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5yZmRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX1JGRF9BRERSX0xPKTsKKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnJyZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfUlJEX0FERFJfTE8pOworCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+dHBkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19UUERfQUREUl9MTyk7CisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5jbWIuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19DTUJfQUREUl9MTyk7CisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5zbWIuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19TTUJfQUREUl9MTyk7CisKKwkvKiBlbGVtZW50IGNvdW50ICovCisJdmFsdWUgPSBhZGFwdGVyLT5ycmRfcmluZy5jb3VudDsKKwl2YWx1ZSA8PD0gMTY7CisJdmFsdWUgKz0gYWRhcHRlci0+cmZkX3JpbmcuY291bnQ7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19ERVNDX1JGRF9SUkRfUklOR19TSVpFKTsKKwlpb3dyaXRlMzIoYWRhcHRlci0+dHBkX3JpbmcuY291bnQsIGh3LT5od19hZGRyICsKKwkJUkVHX0RFU0NfVFBEX1JJTkdfU0laRSk7CisKKwkvKiBMb2FkIFB0ciAqLworCWlvd3JpdGUzMigxLCBody0+aHdfYWRkciArIFJFR19MT0FEX1BUUik7CisKKwkvKiBjb25maWcgTWFpbGJveCAqLworCXZhbHVlID0gKChhdG9taWNfcmVhZCgmYWRhcHRlci0+dHBkX3JpbmcubmV4dF90b191c2UpCisJCSAgJiBNQl9UUERfUFJPRF9JTkRYX01BU0spIDw8IE1CX1RQRF9QUk9EX0lORFhfU0hJRlQpIHwKKwkJKChhdG9taWNfcmVhZCgmYWRhcHRlci0+cnJkX3JpbmcubmV4dF90b19jbGVhbikKKwkJJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8IE1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKKwkJKChhdG9taWNfcmVhZCgmYWRhcHRlci0+cmZkX3JpbmcubmV4dF90b191c2UpCisJCSYgTUJfUkZEX1BST0RfSU5EWF9NQVNLKSA8PCBNQl9SRkRfUFJPRF9JTkRYX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BSUxCT1gpOworCisJLyogY29uZmlnIElQRy9JRkcgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPmlwZ3QgJiBNQUNfSVBHX0lGR19JUEdUX01BU0spCisJCSA8PCBNQUNfSVBHX0lGR19JUEdUX1NISUZUKSB8CisJCSgoKHUzMikgaHctPm1pbl9pZmcgJiBNQUNfSVBHX0lGR19NSUZHX01BU0spCisJCTw8IE1BQ19JUEdfSUZHX01JRkdfU0hJRlQpIHwKKwkJKCgodTMyKSBody0+aXBncjEgJiBNQUNfSVBHX0lGR19JUEdSMV9NQVNLKQorCQk8PCBNQUNfSVBHX0lGR19JUEdSMV9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5pcGdyMiAmIE1BQ19JUEdfSUZHX0lQR1IyX01BU0spCisJCTw8IE1BQ19JUEdfSUZHX0lQR1IyX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19JUEdfSUZHKTsKKworCS8qIGNvbmZpZyAgSGFsZi1EdXBsZXggQ29udHJvbCAqLworCXZhbHVlID0gKCh1MzIpIGh3LT5sY29sICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9MQ09MX01BU0spIHwKKwkJKCgodTMyKSBody0+bWF4X3JldHJ5ICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9SRVRSWV9NQVNLKQorCQk8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX1NISUZUKSB8CisJCU1BQ19IQUxGX0RVUExYX0NUUkxfRVhDX0RFRl9FTiB8CisJCSgweGEgPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCVF9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5qYW1faXBnICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9KQU1JUEdfTUFTSykKKwkJPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9KQU1JUEdfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0hBTEZfRFVQTFhfQ1RSTCk7CisKKwkvKiBzZXQgSW50ZXJydXB0IE1vZGVyYXRvciBUaW1lciAqLworCWlvd3JpdGUxNihhZGFwdGVyLT5pbXQsIGh3LT5od19hZGRyICsgUkVHX0lSUV9NT0RVX1RJTUVSX0lOSVQpOworCWlvd3JpdGUzMihNQVNURVJfQ1RSTF9JVElNRVJfRU4sIGh3LT5od19hZGRyICsgUkVHX01BU1RFUl9DVFJMKTsKKworCS8qIHNldCBJbnRlcnJ1cHQgQ2xlYXIgVGltZXIgKi8KKwlpb3dyaXRlMTYoYWRhcHRlci0+aWN0LCBody0+aHdfYWRkciArIFJFR19DTUJESVNETUFfVElNRVIpOworCisJLyogc2V0IE1UVSwgNCA6IFZMQU4gKi8KKwlpb3dyaXRlMzIoaHctPm1heF9mcmFtZV9zaXplICsgNCwgaHctPmh3X2FkZHIgKyBSRUdfTVRVKTsKKworCS8qIGp1bWJvIHNpemUgJiBycmQgcmV0aXJlbWVudCB0aW1lciAqLworCXZhbHVlID0gKCgodTMyKSBody0+cnhfanVtYm9fdGggJiBSWFFfSk1CT1NaX1RIX01BU0spCisJCSA8PCBSWFFfSk1CT1NaX1RIX1NISUZUKSB8CisJCSgoKHUzMikgaHctPnJ4X2p1bWJvX2xrYWggJiBSWFFfSk1CT19MS0FIX01BU0spCisJCTw8IFJYUV9KTUJPX0xLQUhfU0hJRlQpIHwKKwkJKCgodTMyKSBody0+cnJkX3JldF90aW1lciAmIFJYUV9SUkRfVElNRVJfTUFTSykKKwkJPDwgUlhRX1JSRF9USU1FUl9TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfSk1CT1NaX1JSRFRJTSk7CisKKwkvKiBGbG93IENvbnRyb2wgKi8KKwlzd2l0Y2ggKGh3LT5kZXZfcmV2KSB7CisJY2FzZSAweDgwMDE6CisJY2FzZSAweDkwMDE6CisJY2FzZSAweDkwMDI6CisJY2FzZSAweDkwMDM6CisJCXNldF9mbG93X2N0cmxfb2xkKGFkYXB0ZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXRfZmxvd19jdHJsX25ldyhodyk7CisJCWJyZWFrOworCX0KKworCS8qIGNvbmZpZyBUWFEgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPnRwZF9idXJzdCAmIFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fTUFTSykKKwkJIDw8IFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fU0hJRlQpIHwKKwkJKCgodTMyKSBody0+dHhmX2J1cnN0ICYgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9NQVNLKQorCQk8PCBUWFFfQ1RSTF9UWEZfQlVSU1RfTlVNX1NISUZUKSB8CisJCSgoKHUzMikgaHctPnRwZF9mZXRjaF90aCAmIFRYUV9DVFJMX1RQRF9GRVRDSF9USF9NQVNLKQorCQk8PCBUWFFfQ1RSTF9UUERfRkVUQ0hfVEhfU0hJRlQpIHwgVFhRX0NUUkxfRU5IX01PREUgfAorCQlUWFFfQ1RSTF9FTjsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1RYUV9DVFJMKTsKKworCS8qIG1pbiB0cGQgZmV0Y2ggZ2FwICYgdHgganVtYm8gcGFja2V0IHNpemUgdGhyZXNob2xkIGZvciB0YXNrb2ZmbG9hZCAqLworCXZhbHVlID0gKCgodTMyKSBody0+dHhfanVtYm9fdGFza190aCAmIFRYX0pVTUJPX1RBU0tfVEhfTUFTSykKKwkJPDwgVFhfSlVNQk9fVEFTS19USF9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT50cGRfZmV0Y2hfZ2FwICYgVFhfVFBEX01JTl9JUEdfTUFTSykKKwkJPDwgVFhfVFBEX01JTl9JUEdfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfVFhfSlVNQk9fVEFTS19USF9UUERfSVBHKTsKKworCS8qIGNvbmZpZyBSWFEgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPnJmZF9idXJzdCAmIFJYUV9DVFJMX1JGRF9CVVJTVF9OVU1fTUFTSykKKwkJPDwgUlhRX0NUUkxfUkZEX0JVUlNUX05VTV9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5ycmRfYnVyc3QgJiBSWFFfQ1RSTF9SUkRfQlVSU1RfVEhSRVNIX01BU0spCisJCTw8IFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfU0hJRlQpIHwKKwkJKCgodTMyKSBody0+cmZkX2ZldGNoX2dhcCAmIFJYUV9DVFJMX1JGRF9QUkVGX01JTl9JUEdfTUFTSykKKwkJPDwgUlhRX0NUUkxfUkZEX1BSRUZfTUlOX0lQR19TSElGVCkgfCBSWFFfQ1RSTF9DVVRfVEhSVV9FTiB8CisJCVJYUV9DVFJMX0VOOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX0NUUkwpOworCisJLyogY29uZmlnIERNQSBFbmdpbmUgKi8KKwl2YWx1ZSA9ICgoKCh1MzIpIGh3LT5kbWFyX2Jsb2NrKSAmIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0spCisJCTw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8CisJCSgoKCh1MzIpIGh3LT5kbWF3X2Jsb2NrKSAmIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0spCisJCTw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8IERNQV9DVFJMX0RNQVJfRU4gfAorCQlETUFfQ1RSTF9ETUFXX0VOOworCXZhbHVlIHw9ICh1MzIpIGh3LT5kbWFfb3JkOworCWlmIChhdGwxX3JjYl8xMjggPT0gaHctPnJjYl92YWx1ZSkKKwkJdmFsdWUgfD0gRE1BX0NUUkxfUkNCX1ZBTFVFOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfRE1BX0NUUkwpOworCisJLyogY29uZmlnIENNQiAvIFNNQiAqLworCXZhbHVlID0gaHctPmNtYl9ycmQgfCAoKHUzMikgaHctPmNtYl90cGQgPDwgMTYpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ01CX1dSSVRFX1RIKTsKKwl2YWx1ZSA9IGh3LT5jbWJfcnhfdGltZXIgfCAoKHUzMikgaHctPmNtYl90eF90aW1lciA8PCAxNik7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DTUJfV1JJVEVfVElNRVIpOworCWlvd3JpdGUzMihody0+c21iX3RpbWVyLCBody0+aHdfYWRkciArIFJFR19TTUJfVElNRVIpOworCisJLyogLS0tIGVuYWJsZSBDTUIgLyBTTUIgKi8KKwl2YWx1ZSA9IENTTUJfQ1RSTF9DTUJfRU4gfCBDU01CX0NUUkxfU01CX0VOOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ1NNQl9DVFJMKTsKKworCXZhbHVlID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCWlmICh1bmxpa2VseSgodmFsdWUgJiBJU1JfUEhZX0xJTktET1dOKSAhPSAwKSkKKwkJdmFsdWUgPSAxOwkvKiBjb25maWcgZmFpbGVkICovCisJZWxzZQorCQl2YWx1ZSA9IDA7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0IHN0YXR1cyAqLworCWlvd3JpdGUzMigweDNmZmZmZmZmLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBhdGwxX3BjaWVfcGF0Y2ggLSBQYXRjaCBmb3IgUENJRSBtb2R1bGUKKyAqLworc3RhdGljIHZvaWQgYXRsMV9wY2llX3BhdGNoKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHZhbHVlOworCisJLyogbXVjaCB2ZW5kb3IgbWFnaWMgaGVyZSAqLworCXZhbHVlID0gMHg2NTAwOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTJGQyk7CisJLyogcGNpZSBmbG93IGNvbnRyb2wgbW9kZSBjaGFuZ2UgKi8KKwl2YWx1ZSA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEwMDgpOworCXZhbHVlIHw9IDB4ODAwMDsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEwMDgpOworfQorCisvKgorICogV2hlbiBBQ1BJIHJlc3VtZSBvbiBzb21lIFZJQSBNb3RoZXJCb2FyZCwgdGhlIEludGVycnVwdCBEaXNhYmxlIGJpdC8weDQwMAorICogb24gUENJIENvbW1hbmQgcmVnaXN0ZXIgaXMgZGlzYWJsZS4KKyAqIFRoZSBmdW5jdGlvbiBlbmFibGUgdGhpcyBiaXQuCisgKiBCcmFja2V0dCwgMjAwNi8wMy8xNQorICovCitzdGF0aWMgdm9pZCBhdGwxX3ZpYV93b3JrYXJvdW5kKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCXZhbHVlID0gaW9yZWFkMTYoYWRhcHRlci0+aHcuaHdfYWRkciArIFBDSV9DT01NQU5EKTsKKwlpZiAodmFsdWUgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpCisJCXZhbHVlICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUENJX0NPTU1BTkQpOworfQorCiAvKgogICogYXRsMV9pcnFfZW5hYmxlIC0gRW5hYmxlIGRlZmF1bHQgaW50ZXJydXB0IGdlbmVyYXRpb24gc2V0dGluZ3MKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICovCiBzdGF0aWMgdm9pZCBhdGwxX2lycV9lbmFibGUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZhZGFwdGVyLT5pcnFfc2VtKSkpCi0JCWlvd3JpdGUzMihJTVJfTk9STUFMX01BU0ssIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlpb3dyaXRlMzIoSU1SX05PUk1BTF9NQVNLLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7CisJaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworfQorCisvKgorICogYXRsMV9pcnFfZGlzYWJsZSAtIE1hc2sgb2ZmIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHRoZSBOSUMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwxX2lycV9kaXNhYmxlKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7CisJc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0bDFfY2xlYXJfcGh5X2ludChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMjg4LDI1ICsxMDEyLDE5IEBACiAJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9ieXRlcyArPSBzbWItPnJ4X2J5dGVfY250OwogCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYnl0ZXMgKz0gc21iLT50eF9ieXRlX2NudDsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLm11bHRpY2FzdCArPSBzbWItPnJ4X21jYXN0OwotCWFkYXB0ZXItPnNvZnRfc3RhdHMuY29sbGlzaW9ucyArPSAoc21iLT50eF8xX2NvbCArCi0JCQkJCSAgIHNtYi0+dHhfMl9jb2wgKiAyICsKLQkJCQkJICAgc21iLT50eF9sYXRlX2NvbCArCi0JCQkJCSAgIHNtYi0+dHhfYWJvcnRfY29sICoKLQkJCQkJICAgYWRhcHRlci0+aHcubWF4X3JldHJ5KTsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLmNvbGxpc2lvbnMgKz0gKHNtYi0+dHhfMV9jb2wgKyBzbWItPnR4XzJfY29sICogMiArCisJCXNtYi0+dHhfbGF0ZV9jb2wgKyBzbWItPnR4X2Fib3J0X2NvbCAqIGFkYXB0ZXItPmh3Lm1heF9yZXRyeSk7CiAKIAkvKiBSeCBFcnJvcnMgKi8KLQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2Vycm9ycyArPSAoc21iLT5yeF9mcmFnICsKLQkJCQkJICBzbWItPnJ4X2Zjc19lcnIgKwotCQkJCQkgIHNtYi0+cnhfbGVuX2VyciArCi0JCQkJCSAgc21iLT5yeF9zel9vdiArCi0JCQkJCSAgc21iLT5yeF9yeGZfb3YgKwotCQkJCQkgIHNtYi0+cnhfcnJkX292ICsgc21iLT5yeF9hbGlnbl9lcnIpOworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZXJyb3JzICs9IChzbWItPnJ4X2ZyYWcgKyBzbWItPnJ4X2Zjc19lcnIgKworCQlzbWItPnJ4X2xlbl9lcnIgKyBzbWItPnJ4X3N6X292ICsgc21iLT5yeF9yeGZfb3YgKworCQlzbWItPnJ4X3JyZF9vdiArIHNtYi0+cnhfYWxpZ25fZXJyKTsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzICs9IHNtYi0+cnhfcnhmX292OwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSBzbWItPnJ4X2xlbl9lcnI7CiAJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9jcmNfZXJyb3JzICs9IHNtYi0+cnhfZmNzX2VycjsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBzbWItPnJ4X2FsaWduX2VycjsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHNtYi0+cnhfcnJkX292ICsKLQkJCQkJCSBzbWItPnJ4X3J4Zl9vdik7CisJCXNtYi0+cnhfcnhmX292KTsKIAogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfcGF1c2UgKz0gc21iLT5yeF9wYXVzZTsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X3JyZF9vdiArPSBzbWItPnJ4X3JyZF9vdjsKQEAgLTMxNCw4ICsxMDMyLDcgQEAKIAogCS8qIFR4IEVycm9ycyAqLwogCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfZXJyb3JzICs9IChzbWItPnR4X2xhdGVfY29sICsKLQkJCQkJICBzbWItPnR4X2Fib3J0X2NvbCArCi0JCQkJCSAgc21iLT50eF91bmRlcnJ1biArIHNtYi0+dHhfdHJ1bmMpOworCQlzbWItPnR4X2Fib3J0X2NvbCArIHNtYi0+dHhfdW5kZXJydW4gKyBzbWItPnR4X3RydW5jKTsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzICs9IHNtYi0+dHhfdW5kZXJydW47CiAJYWRhcHRlci0+c29mdF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSBzbWItPnR4X2Fib3J0X2NvbDsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMgKz0gc21iLT50eF9sYXRlX2NvbDsKQEAgLTMzNywzNiArMTA1NCwxMDEgQEAKIAlhZGFwdGVyLT5uZXRfc3RhdHMuY29sbGlzaW9ucyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMuY29sbGlzaW9uczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzID0KLQkgICAgYWRhcHRlci0+c29mdF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzOworCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfY3JjX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzID0KLQkgICAgYWRhcHRlci0+c29mdF9zdGF0cy5yeF9mcmFtZV9lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZnJhbWVfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZmlmb19lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMudHhfZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy50eF9lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy50eF9maWZvX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzOworCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy50eF93aW5kb3dfZXJyb3JzID0KLQkgICAgYWRhcHRlci0+c29mdF9zdGF0cy50eF93aW5kb3dfZXJyb3JzOworCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0KLQkgICAgYWRhcHRlci0+c29mdF9zdGF0cy50eF9jYXJyaWVyX2Vycm9yczsKKwkJYWRhcHRlci0+c29mdF9zdGF0cy50eF9jYXJyaWVyX2Vycm9yczsKK30KKworLyoKKyAqIGF0bDFfZ2V0X3N0YXRzIC0gR2V0IFN5c3RlbSBOZXR3b3JrIFN0YXRpc3RpY3MKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisgKiBUaGUgc3RhdGlzdGljcyBhcmUgYWN0dWFsbHkgdXBkYXRlZCBmcm9tIHRoZSB0aW1lciBjYWxsYmFjay4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdGwxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiAmYWRhcHRlci0+bmV0X3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3VwZGF0ZV9tYWlsYm94KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdHBkX25leHRfdG9fdXNlOworCXUzMiByZmRfbmV4dF90b191c2U7CisJdTMyIHJyZF9uZXh0X3RvX2NsZWFuOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5tYl9sb2NrLCBmbGFncyk7CisKKwl0cGRfbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHBkX3JpbmcubmV4dF90b191c2UpOworCXJmZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSk7CisJcnJkX25leHRfdG9fY2xlYW4gPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+cnJkX3JpbmcubmV4dF90b19jbGVhbik7CisKKwl2YWx1ZSA9ICgocmZkX25leHRfdG9fdXNlICYgTUJfUkZEX1BST0RfSU5EWF9NQVNLKSA8PAorCQlNQl9SRkRfUFJPRF9JTkRYX1NISUZUKSB8CisJCSgocnJkX25leHRfdG9fY2xlYW4gJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8CisJCU1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKKwkJKCh0cGRfbmV4dF90b191c2UgJiBNQl9UUERfUFJPRF9JTkRYX01BU0spIDw8CisJCU1CX1RQRF9QUk9EX0lORFhfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUlMQk9YKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm1iX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYXRsMV9jbGVhbl9hbGxvY19mbGFnKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCisJc3RydWN0IHJ4X3JldHVybl9kZXNjICpycmQsIHUxNiBvZmZzZXQpCit7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCisJd2hpbGUgKHJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuICE9IChycmQtPmJ1Zl9pbmR4ICsgb2Zmc2V0KSkgeworCQlyZmRfcmluZy0+YnVmZmVyX2luZm9bcmZkX3JpbmctPm5leHRfdG9fY2xlYW5dLmFsbG9jZWQgPSAwOworCQlpZiAoKytyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9PSByZmRfcmluZy0+Y291bnQpIHsKKwkJCXJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYXRsMV91cGRhdGVfcmZkX2luZGV4KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCisJc3RydWN0IHJ4X3JldHVybl9kZXNjICpycmQpCit7CisJdTE2IG51bV9idWY7CisKKwludW1fYnVmID0gKHJyZC0+eHN6LnhzdW1fc3oucGt0X3NpemUgKyBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIC0gMSkgLworCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuOworCWlmIChycmQtPm51bV9idWYgPT0gbnVtX2J1ZikKKwkJLyogY2xlYW4gYWxsb2MgZmxhZyBmb3IgYmFkIHJyZCAqLworCQlhdGwxX2NsZWFuX2FsbG9jX2ZsYWcoYWRhcHRlciwgcnJkLCBudW1fYnVmKTsKIH0KIAogc3RhdGljIHZvaWQgYXRsMV9yeF9jaGVja3N1bShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLAotCQkJCQlzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MgKnJyZCwKLQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKKwlzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MgKnJyZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAlpZiAodW5saWtlbHkocnJkLT5wa3RfZmxnICYgUEFDS0VUX0ZMQUdfRVJSKSkgewogCQlpZiAocnJkLT5lcnJfZmxnICYgKEVSUl9GTEFHX0NSQyB8IEVSUl9GTEFHX1RSVU5DIHwKIAkJCQkJRVJSX0ZMQUdfQ09ERSB8IEVSUl9GTEFHX09WKSkgewogCQkJYWRhcHRlci0+aHdfY3N1bV9lcnIrKzsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwgInJ4IGNoZWNrc3VtIGVycm9yXG4iKTsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKKwkJCQkicnggY2hlY2tzdW0gZXJyb3JcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMzg1LDcgKzExNjcsNyBAQAogCX0KIAogCS8qIElQdjQsIGJ1dCBoYXJkd2FyZSB0aGlua3MgaXRzIGNoZWNrc3VtIGlzIHdyb25nICovCi0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LAorCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKIAkJImh3IGNzdW0gd3JvbmcsIHBrdF9mbGFnOiV4LCBlcnJfZmxhZzoleFxuIiwKIAkJcnJkLT5wa3RfZmxnLCBycmQtPmVycl9mbGcpOwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fQ09NUExFVEU7CkBAIC01MDAsMzQgKzEyODIsMTcgQEAKIAkJCS8qIHJyZCBzZWVtcyB0byBiZSBiYWQgKi8KIAkJCWlmICh1bmxpa2VseShpLS0gPiAwKSkgewogCQkJCS8qIHJyZCBtYXkgbm90IGJlIERNQWVkIGNvbXBsZXRlbHkgKi8KLQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCQkiaW5jb21wbGV0ZSBSUkQgRE1BIHRyYW5zZmVyXG4iKTsKIAkJCQl1ZGVsYXkoMSk7CiAJCQkJZ290byBjaGtfcnJkOwogCQkJfQogCQkJLyogYmFkIHJyZCAqLwotCQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiYmFkIFJSRFxuIik7CisJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJImJhZCBSUkRcbiIpOwogCQkJLyogc2VlIGlmIHVwZGF0ZSBSRkQgaW5kZXggKi8KLQkJCWlmIChycmQtPm51bV9idWYgPiAxKSB7Ci0JCQkJdTE2IG51bV9idWY7Ci0JCQkJbnVtX2J1ZiA9Ci0JCQkJICAgIChycmQtPnhzei54c3VtX3N6LnBrdF9zaXplICsKLQkJCQkgICAgIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gLQotCQkJCSAgICAgMSkgLyBhZGFwdGVyLT5yeF9idWZmZXJfbGVuOwotCQkJCWlmIChycmQtPm51bV9idWYgPT0gbnVtX2J1ZikgewotCQkJCQkvKiBjbGVhbiBhbGxvYyBmbGFnIGZvciBiYWQgcnJkICovCi0JCQkJCXdoaWxlIChyZmRfcmluZy0+bmV4dF90b19jbGVhbiAhPQotCQkJCQkgICAgICAgKHJyZC0+YnVmX2luZHggKyBudW1fYnVmKSkgewotCQkJCQkJcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW3JmZF9yaW5nLT4KLQkJCQkJCQkJICAgICAgbmV4dF90b19jbGVhbl0uYWxsb2NlZCA9IDA7Ci0JCQkJCQlpZiAoKytyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9PQotCQkJCQkJICAgIHJmZF9yaW5nLT5jb3VudCkgewotCQkJCQkJCXJmZF9yaW5nLT4KLQkJCQkJCQkgICAgbmV4dF90b19jbGVhbiA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisJCQlpZiAocnJkLT5udW1fYnVmID4gMSkKKwkJCQlhdGwxX3VwZGF0ZV9yZmRfaW5kZXgoYWRhcHRlciwgcnJkKTsKIAogCQkJLyogdXBkYXRlIHJyZCAqLwogCQkJcnJkLT54c3oudmFsaWQgPSAwOwpAQCAtNTQxLDEyICsxMzA2LDcgQEAKIAkJfQogcnJkX29rOgogCQkvKiBjbGVhbiBhbGxvYyBmbGFnIGZvciBiYWQgcnJkICovCi0JCXdoaWxlIChyZmRfcmluZy0+bmV4dF90b19jbGVhbiAhPSBycmQtPmJ1Zl9pbmR4KSB7Ci0JCQlyZmRfcmluZy0+YnVmZmVyX2luZm9bcmZkX3JpbmctPm5leHRfdG9fY2xlYW5dLmFsbG9jZWQgPQotCQkJICAgIDA7Ci0JCQlpZiAoKytyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9PSByZmRfcmluZy0+Y291bnQpCi0JCQkJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOwotCQl9CisJCWF0bDFfY2xlYW5fYWxsb2NfZmxhZyhhZGFwdGVyLCBycmQsIDApOwogCiAJCWJ1ZmZlcl9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tycmQtPmJ1Zl9pbmR4XTsKIAkJaWYgKCsrcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPT0gcmZkX3JpbmctPmNvdW50KQpAQCAtNjYyLDU4MCArMTQyMiwxMyBAQAogCQluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIGF0bDFfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCXUxNiBwaHlfZGF0YSA9IDA7Ci0KLQlzcGluX2xvY2soJmFkYXB0ZXItPmxvY2spOwotCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7Ci0JYXRsMV9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKLQlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOwotCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKLQotCS8qIG5vdGlmeSB1cHBlciBsYXllciBsaW5rIGRvd24gQVNBUCAqLwotCWlmICghKHBoeV9kYXRhICYgQk1TUl9MU1RBVFVTKSkgewkvKiBMaW5rIERvd24gKi8KLQkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBvbGQgbGluayBzdGF0ZTogVXAgKi8KLQkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlcyBsaW5rIGlzIGRvd25cbiIsCi0JCQkJbmV0ZGV2LT5uYW1lKTsKLQkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOwotCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJfQotCX0KLQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5saW5rX2NoZ190YXNrKTsKLX0KLQotLyoKLSAqIGF0bDFfaW50ciAtIEludGVycnVwdCBIYW5kbGVyCi0gKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAZGF0YTogcG9pbnRlciB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBwdF9yZWdzOiBDUFUgcmVnaXN0ZXJzIHN0cnVjdHVyZQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXRsMV9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JLypzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpLT5wcml2OyovCi0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRhdGEpOwotCXUzMiBzdGF0dXM7Ci0JdTggdXBkYXRlX3J4OwotCWludCBtYXhfaW50cyA9IDEwOwotCi0Jc3RhdHVzID0gYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzOwotCWlmICghc3RhdHVzKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQl1cGRhdGVfcnggPSAwOwotCi0JZG8gewotCQkvKiBjbGVhciBDTUIgaW50ZXJydXB0IHN0YXR1cyBhdCBvbmNlICovCi0JCWFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0cyA9IDA7Ci0KLQkJaWYgKHN0YXR1cyAmIElTUl9HUEhZKQkvKiBjbGVhciBwaHkgc3RhdHVzICovCi0JCQlhdGwxX2NsZWFyX3BoeV9pbnQoYWRhcHRlcik7Ci0KLQkJLyogY2xlYXIgSVNSIHN0YXR1cywgYW5kIEVuYWJsZSBDTUIgRE1BL0Rpc2FibGUgSW50ZXJydXB0ICovCi0JCWlvd3JpdGUzMihzdGF0dXMgfCBJU1JfRElTX0lOVCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOwotCi0JCS8qIGNoZWNrIGlmIFNNQiBpbnRyICovCi0JCWlmIChzdGF0dXMgJiBJU1JfU01CKQotCQkJYXRsMV9pbmNfc21iKGFkYXB0ZXIpOwotCi0JCS8qIGNoZWNrIGlmIFBDSUUgUEhZIExpbmsgZG93biAqLwotCQlpZiAoc3RhdHVzICYgSVNSX1BIWV9MSU5LRE9XTikgewotCQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAicGNpZSBwaHkgbGluayBkb3duICV4XG4iLAotCQkJCXN0YXR1cyk7Ci0JCQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CS8qIHJlc2V0IE1BQyAqLwotCQkJCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7Ci0JCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cGNpZV9kbWFfdG9fcnN0X3Rhc2spOwotCQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJCX0KLQkJfQotCi0JCS8qIGNoZWNrIGlmIERNQSByZWFkL3dyaXRlIGVycm9yID8gKi8KLQkJaWYgKHN0YXR1cyAmIChJU1JfRE1BUl9UT19SU1QgfCBJU1JfRE1BV19UT19SU1QpKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJInBjaWUgRE1BIHIvdyBlcnJvciAoc3RhdHVzID0gMHgleClcbiIsCi0JCQkJc3RhdHVzKTsKLQkJCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7Ci0JCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5wY2llX2RtYV90b19yc3RfdGFzayk7Ci0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0KLQotCQkvKiBsaW5rIGV2ZW50ICovCi0JCWlmIChzdGF0dXMgJiBJU1JfR1BIWSkgewotCQkJYWRhcHRlci0+c29mdF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwotCQkJYXRsMV9jaGVja19mb3JfbGluayhhZGFwdGVyKTsKLQkJfQotCi0JCS8qIHRyYW5zbWl0IGV2ZW50ICovCi0JCWlmIChzdGF0dXMgJiBJU1JfQ01CX1RYKQotCQkJYXRsMV9pbnRyX3R4KGFkYXB0ZXIpOwotCi0JCS8qIHJ4IGV4Y2VwdGlvbiAqLwotCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKElTUl9SWEZfT1YgfCBJU1JfUkZEX1VOUlVOIHwKLQkJCUlTUl9SUkRfT1YgfCBJU1JfSE9TVF9SRkRfVU5SVU4gfAotCQkJSVNSX0hPU1RfUlJEX09WIHwgSVNSX0NNQl9SWCkpKSB7Ci0JCQlpZiAoc3RhdHVzICYgKElTUl9SWEZfT1YgfCBJU1JfUkZEX1VOUlVOIHwKLQkJCQlJU1JfUlJEX09WIHwgSVNSX0hPU1RfUkZEX1VOUlVOIHwKLQkJCQlJU1JfSE9TVF9SUkRfT1YpKQotCQkJCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkJInJ4IGV4Y2VwdGlvbiwgSVNSID0gMHgleFxuIiwgc3RhdHVzKTsKLQkJCWF0bDFfaW50cl9yeChhZGFwdGVyKTsKLQkJfQotCi0JCWlmICgtLW1heF9pbnRzIDwgMCkKLQkJCWJyZWFrOwotCi0JfSB3aGlsZSAoKHN0YXR1cyA9IGFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0cykpOwotCi0JLyogcmUtZW5hYmxlIEludGVycnVwdCAqLwotCWlvd3JpdGUzMihJU1JfRElTX1NNQiB8IElTUl9ESVNfRE1BLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotICogYXRsMV9zZXRfbXVsdGkgLSBNdWx0aWNhc3QgYW5kIFByb21pc2N1b3VzIG1vZGUgc2V0Ci0gKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogVGhlIHNldF9tdWx0aSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG11bHRpY2FzdCBhZGRyZXNzCi0gKiBsaXN0IG9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmbGFncyBhcmUgdXBkYXRlZC4gIFRoaXMgcm91dGluZSBpcwotICogcmVzcG9uc2libGUgZm9yIGNvbmZpZ3VyaW5nIHRoZSBoYXJkd2FyZSBmb3IgcHJvcGVyIG11bHRpY2FzdCwKLSAqIHByb21pc2N1b3VzIG1vZGUsIGFuZCBhbGwtbXVsdGkgYmVoYXZpb3IuCi0gKi8KLXN0YXRpYyB2b2lkIGF0bDFfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOwotCXUzMiByY3RsOwotCXUzMiBoYXNoX3ZhbHVlOwotCi0JLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCi0JcmN0bCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQlyY3RsIHw9IE1BQ19DVFJMX1BST01JU19FTjsKLQllbHNlIGlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7Ci0JCXJjdGwgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOwotCQlyY3RsICY9IH5NQUNfQ1RSTF9QUk9NSVNfRU47Ci0JfSBlbHNlCi0JCXJjdGwgJj0gfihNQUNfQ1RSTF9QUk9NSVNfRU4gfCBNQUNfQ1RSTF9NQ19BTExfRU4pOwotCi0JaW93cml0ZTMyKHJjdGwsIGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQotCS8qIGNsZWFyIHRoZSBvbGQgc2V0dGluZ3MgZnJvbSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KLQlpb3dyaXRlMzIoMCwgaHctPmh3X2FkZHIgKyBSRUdfUlhfSEFTSF9UQUJMRSk7Ci0JaW93cml0ZTMyKDAsIChody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKSArICgxIDw8IDIpKTsKLQotCS8qIGNvbXB1dGUgbWMgYWRkcmVzc2VzJyBoYXNoIHZhbHVlICxhbmQgcHV0IGl0IGludG8gaGFzaCB0YWJsZSAqLwotCWZvciAobWNfcHRyID0gbmV0ZGV2LT5tY19saXN0OyBtY19wdHI7IG1jX3B0ciA9IG1jX3B0ci0+bmV4dCkgewotCQloYXNoX3ZhbHVlID0gYXRsMV9oYXNoX21jX2FkZHIoaHcsIG1jX3B0ci0+ZG1pX2FkZHIpOwotCQlhdGwxX2hhc2hfc2V0KGh3LCBoYXNoX3ZhbHVlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bDFfc2V0dXBfbWFjX2N0cmwoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JLyogQ29uZmlnIE1BQyBDVFJMIFJlZ2lzdGVyICovCi0JdmFsdWUgPSBNQUNfQ1RSTF9UWF9FTiB8IE1BQ19DVFJMX1JYX0VOOwotCS8qIGR1cGxleCAqLwotCWlmIChGVUxMX0RVUExFWCA9PSBhZGFwdGVyLT5saW5rX2R1cGxleCkKLQkJdmFsdWUgfD0gTUFDX0NUUkxfRFVQTFg7Ci0JLyogc3BlZWQgKi8KLQl2YWx1ZSB8PSAoKHUzMikgKChTUEVFRF8xMDAwID09IGFkYXB0ZXItPmxpbmtfc3BlZWQpID8KLQkJCSBNQUNfQ1RSTF9TUEVFRF8xMDAwIDogTUFDX0NUUkxfU1BFRURfMTBfMTAwKSA8PAotCQkgIE1BQ19DVFJMX1NQRUVEX1NISUZUKTsKLQkvKiBmbG93IGNvbnRyb2wgKi8KLQl2YWx1ZSB8PSAoTUFDX0NUUkxfVFhfRkxPVyB8IE1BQ19DVFJMX1JYX0ZMT1cpOwotCS8qIFBBRCAmIENSQyAqLwotCXZhbHVlIHw9IChNQUNfQ1RSTF9BRERfQ1JDIHwgTUFDX0NUUkxfUEFEKTsKLQkvKiBwcmVhbWJsZSBsZW5ndGggKi8KLQl2YWx1ZSB8PSAoKCh1MzIpIGFkYXB0ZXItPmh3LnByZWFtYmxlX2xlbgotCQkgICAmIE1BQ19DVFJMX1BSTUxFTl9NQVNLKSA8PCBNQUNfQ1RSTF9QUk1MRU5fU0hJRlQpOwotCS8qIHZsYW4gKi8KLQlpZiAoYWRhcHRlci0+dmxncnApCi0JCXZhbHVlIHw9IE1BQ19DVFJMX1JNVl9WTEFOOwotCS8qIHJ4IGNoZWNrc3VtCi0JICAgaWYgKGFkYXB0ZXItPnJ4X2NzdW0pCi0JICAgdmFsdWUgfD0gTUFDX0NUUkxfUlhfQ0hLU1VNX0VOOwotCSAqLwotCS8qIGZpbHRlciBtb2RlICovCi0JdmFsdWUgfD0gTUFDX0NUUkxfQkNfRU47Ci0JaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKLQkJdmFsdWUgfD0gTUFDX0NUUkxfUFJPTUlTX0VOOwotCWVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCi0JCXZhbHVlIHw9IE1BQ19DVFJMX01DX0FMTF9FTjsKLQkvKiB2YWx1ZSB8PSBNQUNfQ1RSTF9MT09QQkFDSzsgKi8KLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLX0KLQotc3RhdGljIHUzMiBhdGwxX2NoZWNrX2xpbmsoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQl1MzIgcmV0X3ZhbDsKLQl1MTYgc3BlZWQsIGR1cGxleCwgcGh5X2RhdGE7Ci0JaW50IHJlY29uZmlnID0gMDsKLQotCS8qIE1JSV9CTVNSIG11c3QgcmVhZCB0d2ljZSAqLwotCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKLQlhdGwxX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICZwaHlfZGF0YSk7Ci0JaWYgKCEocGh5X2RhdGEgJiBCTVNSX0xTVEFUVVMpKSB7CS8qIGxpbmsgZG93biAqLwotCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CS8qIG9sZCBsaW5rIHN0YXRlOiBVcCAqLwotCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgImxpbmsgaXMgZG93blxuIik7Ci0JCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7Ci0JCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7Ci0JCX0KLQkJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKLQl9Ci0KLQkvKiBMaW5rIFVwICovCi0JcmV0X3ZhbCA9IGF0bDFfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7Ci0JaWYgKHJldF92YWwpCi0JCXJldHVybiByZXRfdmFsOwotCi0Jc3dpdGNoIChody0+bWVkaWFfdHlwZSkgewotCWNhc2UgTUVESUFfVFlQRV8xMDAwTV9GVUxMOgotCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAwMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCi0JCQlyZWNvbmZpZyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgTUVESUFfVFlQRV8xMDBNX0ZVTEw6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAgfHwgZHVwbGV4ICE9IEZVTExfRFVQTEVYKQotCQkJcmVjb25maWcgPSAxOwotCQlicmVhazsKLQljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgotCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAwIHx8IGR1cGxleCAhPSBIQUxGX0RVUExFWCkKLQkJCXJlY29uZmlnID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBNRURJQV9UWVBFXzEwTV9GVUxMOgotCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAgfHwgZHVwbGV4ICE9IEZVTExfRFVQTEVYKQotCQkJcmVjb25maWcgPSAxOwotCQlicmVhazsKLQljYXNlIE1FRElBX1RZUEVfMTBNX0hBTEY6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMCB8fCBkdXBsZXggIT0gSEFMRl9EVVBMRVgpCi0JCQlyZWNvbmZpZyA9IDE7Ci0JCWJyZWFrOwotCX0KLQotCS8qIGxpbmsgcmVzdWx0IGlzIG91ciBzZXR0aW5nICovCi0JaWYgKCFyZWNvbmZpZykgewotCQlpZiAoYWRhcHRlci0+bGlua19zcGVlZCAhPSBzcGVlZAotCQkgICAgfHwgYWRhcHRlci0+bGlua19kdXBsZXggIT0gZHVwbGV4KSB7Ci0JCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gc3BlZWQ7Ci0JCQlhZGFwdGVyLT5saW5rX2R1cGxleCA9IGR1cGxleDsKLQkJCWF0bDFfc2V0dXBfbWFjX2N0cmwoYWRhcHRlcik7Ci0JCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSIlcyBsaW5rIGlzIHVwICVkIE1icHMgJXNcbiIsCi0JCQkJbmV0ZGV2LT5uYW1lLCBhZGFwdGVyLT5saW5rX3NwZWVkLAotCQkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYID8KLQkJCQkiZnVsbCBkdXBsZXgiIDogImhhbGYgZHVwbGV4Iik7Ci0JCX0KLQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsJLyogTGluayBkb3duIC0+IFVwICovCi0JCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7Ci0JCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7Ci0JCX0KLQkJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKLQl9Ci0KLQkvKiBjaGFuZ2Ugb3JpZ25hbCBsaW5rIHN0YXR1cyAqLwotCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKLQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7Ci0JCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQl9Ci0KLQlpZiAoaHctPm1lZGlhX3R5cGUgIT0gTUVESUFfVFlQRV9BVVRPX1NFTlNPUiAmJgotCSAgICBody0+bWVkaWFfdHlwZSAhPSBNRURJQV9UWVBFXzEwMDBNX0ZVTEwpIHsKLQkJc3dpdGNoIChody0+bWVkaWFfdHlwZSkgewotCQljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgotCQkJcGh5X2RhdGEgPSBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAwIHwKLQkJCSAgICAgICAgICAgTUlJX0NSX1JFU0VUOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVESUFfVFlQRV8xMDBNX0hBTEY6Ci0JCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMDAgfCBNSUlfQ1JfUkVTRVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBNRURJQV9UWVBFXzEwTV9GVUxMOgotCQkJcGh5X2RhdGEgPQotCQkJICAgIE1JSV9DUl9GVUxMX0RVUExFWCB8IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgkvKiBNRURJQV9UWVBFXzEwTV9IQUxGOiAqLwotCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAgfCBNSUlfQ1JfUkVTRVQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9CTUNSLCBwaHlfZGF0YSk7Ci0JCXJldHVybiBBVEwxX1NVQ0NFU1M7Ci0JfQotCi0JLyogYXV0by1uZWcsIGluc2VydCB0aW1lciB0byByZS1jb25maWcgcGh5ICovCi0JaWYgKCFhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZykgewotCQlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IHRydWU7Ci0JCW1vZF90aW1lcigmYWRhcHRlci0+cGh5X2NvbmZpZ190aW1lciwgamlmZmllcyArIDMgKiBIWik7Ci0JfQotCi0JcmV0dXJuIEFUTDFfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2Zsb3dfY3RybF9vbGQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1MzIgaGksIGxvLCB2YWx1ZTsKLQotCS8qIFJGRCBGbG93IENvbnRyb2wgKi8KLQl2YWx1ZSA9IGFkYXB0ZXItPnJmZF9yaW5nLmNvdW50OwotCWhpID0gdmFsdWUgLyAxNjsKLQlpZiAoaGkgPCAyKQotCQloaSA9IDI7Ci0JbG8gPSB2YWx1ZSAqIDcgLyA4OwotCi0JdmFsdWUgPSAoKGhpICYgUlhRX1JYRl9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0hJX1NISUZUKSB8Ci0JICAgICgobG8gJiBSWFFfUlhGX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfTE9fU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19SWFFfUlhGX1BBVVNFX1RIUkVTSCk7Ci0KLQkvKiBSUkQgRmxvdyBDb250cm9sICovCi0JdmFsdWUgPSBhZGFwdGVyLT5ycmRfcmluZy5jb3VudDsKLQlsbyA9IHZhbHVlIC8gMTY7Ci0JaGkgPSB2YWx1ZSAqIDcgLyA4OwotCWlmIChsbyA8IDIpCi0JCWxvID0gMjsKLQl2YWx1ZSA9ICgoaGkgJiBSWFFfUlJEX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfSElfU0hJRlQpIHwKLQkgICAgKChsbyAmIFJYUV9SUkRfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9MT19TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1JYUV9SUkRfUEFVU0VfVEhSRVNIKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2Zsb3dfY3RybF9uZXcoc3RydWN0IGF0bDFfaHcgKmh3KQotewotCXUzMiBoaSwgbG8sIHZhbHVlOwotCi0JLyogUlhGIEZsb3cgQ29udHJvbCAqLwotCXZhbHVlID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfU1JBTV9SWEZfTEVOKTsKLQlsbyA9IHZhbHVlIC8gMTY7Ci0JaWYgKGxvIDwgMTkyKQotCQlsbyA9IDE5MjsKLQloaSA9IHZhbHVlICogNyAvIDg7Ci0JaWYgKGhpIDwgbG8pCi0JCWhpID0gbG8gKyAxNjsKLQl2YWx1ZSA9ICgoaGkgJiBSWFFfUlhGX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQpIHwKLQkgICAgKChsbyAmIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9MT19TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfUlhGX1BBVVNFX1RIUkVTSCk7Ci0KLQkvKiBSUkQgRmxvdyBDb250cm9sICovCi0JdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUkFNX1JSRF9MRU4pOwotCWxvID0gdmFsdWUgLyA4OwotCWhpID0gdmFsdWUgKiA3IC8gODsKLQlpZiAobG8gPCAyKQotCQlsbyA9IDI7Ci0JaWYgKGhpIDwgbG8pCi0JCWhpID0gbG8gKyAzOwotCXZhbHVlID0gKChoaSAmIFJYUV9SUkRfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9ISV9TSElGVCkgfAotCSAgICAoKGxvICYgUlhRX1JSRF9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0xPX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9SUkRfUEFVU0VfVEhSRVNIKTsKLX0KLQotLyoKLSAqIGF0bDFfY29uZmlndXJlIC0gQ29uZmlndXJlIFRyYW5zbWl0JlJlY2VpdmUgVW5pdCBhZnRlciBSZXNldAotICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCi0gKgotICogQ29uZmlndXJlIHRoZSBUeCAvUnggdW5pdCBvZiB0aGUgTUFDIGFmdGVyIGEgcmVzZXQuCi0gKi8KLXN0YXRpYyB1MzIgYXRsMV9jb25maWd1cmUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0JdTMyIHZhbHVlOwotCi0JLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCWlvd3JpdGUzMigweGZmZmZmZmZmLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7Ci0KLQkvKiBzZXQgTUFDIEFkZHJlc3MgKi8KLQl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzJdKSA8PCAyNCkgfAotCQkoKCh1MzIpIGh3LT5tYWNfYWRkclszXSkgPDwgMTYpIHwKLQkJKCgodTMyKSBody0+bWFjX2FkZHJbNF0pIDw8IDgpIHwKLQkJKCgodTMyKSBody0+bWFjX2FkZHJbNV0pKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19TVEFfQUREUik7Ci0JdmFsdWUgPSAoKCh1MzIpIGh3LT5tYWNfYWRkclswXSkgPDwgOCkgfCAoKCh1MzIpIGh3LT5tYWNfYWRkclsxXSkpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyAoUkVHX01BQ19TVEFfQUREUiArIDQpKTsKLQotCS8qIHR4IC8gcnggcmluZyAqLwotCi0JLyogSEkgYmFzZSBhZGRyZXNzICovCi0JaW93cml0ZTMyKCh1MzIpICgoYWRhcHRlci0+dHBkX3JpbmcuZG1hICYgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKSA+PiAzMiksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfQkFTRV9BRERSX0hJKTsKLQkvKiBMTyBiYXNlIGFkZHJlc3MgKi8KLQlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnJmZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfUkZEX0FERFJfTE8pOwotCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+cnJkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKLQkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SUkRfQUREUl9MTyk7Ci0JaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT50cGRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAotCQlody0+aHdfYWRkciArIFJFR19ERVNDX1RQRF9BRERSX0xPKTsKLQlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPmNtYi5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAotCQlody0+aHdfYWRkciArIFJFR19ERVNDX0NNQl9BRERSX0xPKTsKLQlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnNtYi5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAotCQlody0+aHdfYWRkciArIFJFR19ERVNDX1NNQl9BRERSX0xPKTsKLQotCS8qIGVsZW1lbnQgY291bnQgKi8KLQl2YWx1ZSA9IGFkYXB0ZXItPnJyZF9yaW5nLmNvdW50OwotCXZhbHVlIDw8PSAxNjsKLQl2YWx1ZSArPSBhZGFwdGVyLT5yZmRfcmluZy5jb3VudDsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0RFU0NfUkZEX1JSRF9SSU5HX1NJWkUpOwotCWlvd3JpdGUzMihhZGFwdGVyLT50cGRfcmluZy5jb3VudCwgaHctPmh3X2FkZHIgKyBSRUdfREVTQ19UUERfUklOR19TSVpFKTsKLQotCS8qIExvYWQgUHRyICovCi0JaW93cml0ZTMyKDEsIGh3LT5od19hZGRyICsgUkVHX0xPQURfUFRSKTsKLQotCS8qIGNvbmZpZyBNYWlsYm94ICovCi0JdmFsdWUgPSAoKGF0b21pY19yZWFkKCZhZGFwdGVyLT50cGRfcmluZy5uZXh0X3RvX3VzZSkKLQkJICAmIE1CX1RQRF9QUk9EX0lORFhfTUFTSykgPDwgTUJfVFBEX1BST0RfSU5EWF9TSElGVCkgfAotCSAgICAoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5ycmRfcmluZy5uZXh0X3RvX2NsZWFuKQotCSAgICAgICYgTUJfUlJEX0NPTlNfSU5EWF9NQVNLKSA8PCBNQl9SUkRfQ09OU19JTkRYX1NISUZUKSB8Ci0JICAgICgoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJmZF9yaW5nLm5leHRfdG9fdXNlKQotCSAgICAgICYgTUJfUkZEX1BST0RfSU5EWF9NQVNLKSA8PCBNQl9SRkRfUFJPRF9JTkRYX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BSUxCT1gpOwotCi0JLyogY29uZmlnIElQRy9JRkcgKi8KLQl2YWx1ZSA9ICgoKHUzMikgaHctPmlwZ3QgJiBNQUNfSVBHX0lGR19JUEdUX01BU0spCi0JCSA8PCBNQUNfSVBHX0lGR19JUEdUX1NISUZUKSB8Ci0JICAgICgoKHUzMikgaHctPm1pbl9pZmcgJiBNQUNfSVBHX0lGR19NSUZHX01BU0spCi0JICAgICA8PCBNQUNfSVBHX0lGR19NSUZHX1NISUZUKSB8Ci0JICAgICgoKHUzMikgaHctPmlwZ3IxICYgTUFDX0lQR19JRkdfSVBHUjFfTUFTSykKLQkgICAgIDw8IE1BQ19JUEdfSUZHX0lQR1IxX1NISUZUKSB8Ci0JICAgICgoKHUzMikgaHctPmlwZ3IyICYgTUFDX0lQR19JRkdfSVBHUjJfTUFTSykKLQkgICAgIDw8IE1BQ19JUEdfSUZHX0lQR1IyX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19JUEdfSUZHKTsKLQotCS8qIGNvbmZpZyAgSGFsZi1EdXBsZXggQ29udHJvbCAqLwotCXZhbHVlID0gKCh1MzIpIGh3LT5sY29sICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9MQ09MX01BU0spIHwKLQkgICAgKCgodTMyKSBody0+bWF4X3JldHJ5ICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9SRVRSWV9NQVNLKQotCSAgICAgPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9SRVRSWV9TSElGVCkgfAotCSAgICBNQUNfSEFMRl9EVVBMWF9DVFJMX0VYQ19ERUZfRU4gfAotCSAgICAoMHhhIDw8IE1BQ19IQUxGX0RVUExYX0NUUkxfQUJFQlRfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+amFtX2lwZyAmIE1BQ19IQUxGX0RVUExYX0NUUkxfSkFNSVBHX01BU0spCi0JICAgICA8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfSEFMRl9EVVBMWF9DVFJMKTsKLQotCS8qIHNldCBJbnRlcnJ1cHQgTW9kZXJhdG9yIFRpbWVyICovCi0JaW93cml0ZTE2KGFkYXB0ZXItPmltdCwgaHctPmh3X2FkZHIgKyBSRUdfSVJRX01PRFVfVElNRVJfSU5JVCk7Ci0JaW93cml0ZTMyKE1BU1RFUl9DVFJMX0lUSU1FUl9FTiwgaHctPmh3X2FkZHIgKyBSRUdfTUFTVEVSX0NUUkwpOwotCi0JLyogc2V0IEludGVycnVwdCBDbGVhciBUaW1lciAqLwotCWlvd3JpdGUxNihhZGFwdGVyLT5pY3QsIGh3LT5od19hZGRyICsgUkVHX0NNQkRJU0RNQV9USU1FUik7Ci0KLQkvKiBzZXQgTVRVLCA0IDogVkxBTiAqLwotCWlvd3JpdGUzMihody0+bWF4X2ZyYW1lX3NpemUgKyA0LCBody0+aHdfYWRkciArIFJFR19NVFUpOwotCi0JLyoganVtYm8gc2l6ZSAmIHJyZCByZXRpcmVtZW50IHRpbWVyICovCi0JdmFsdWUgPSAoKCh1MzIpIGh3LT5yeF9qdW1ib190aCAmIFJYUV9KTUJPU1pfVEhfTUFTSykKLQkJIDw8IFJYUV9KTUJPU1pfVEhfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+cnhfanVtYm9fbGthaCAmIFJYUV9KTUJPX0xLQUhfTUFTSykKLQkgICAgIDw8IFJYUV9KTUJPX0xLQUhfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+cnJkX3JldF90aW1lciAmIFJYUV9SUkRfVElNRVJfTUFTSykKLQkgICAgIDw8IFJYUV9SUkRfVElNRVJfU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX0pNQk9TWl9SUkRUSU0pOwotCi0JLyogRmxvdyBDb250cm9sICovCi0Jc3dpdGNoIChody0+ZGV2X3JldikgewotCWNhc2UgMHg4MDAxOgotCWNhc2UgMHg5MDAxOgotCWNhc2UgMHg5MDAyOgotCWNhc2UgMHg5MDAzOgotCQlzZXRfZmxvd19jdHJsX29sZChhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2V0X2Zsb3dfY3RybF9uZXcoaHcpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBjb25maWcgVFhRICovCi0JdmFsdWUgPSAoKCh1MzIpIGh3LT50cGRfYnVyc3QgJiBUWFFfQ1RSTF9UUERfQlVSU1RfTlVNX01BU0spCi0JCSA8PCBUWFFfQ1RSTF9UUERfQlVSU1RfTlVNX1NISUZUKSB8Ci0JICAgICgoKHUzMikgaHctPnR4Zl9idXJzdCAmIFRYUV9DVFJMX1RYRl9CVVJTVF9OVU1fTUFTSykKLQkgICAgIDw8IFRYUV9DVFJMX1RYRl9CVVJTVF9OVU1fU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+dHBkX2ZldGNoX3RoICYgVFhRX0NUUkxfVFBEX0ZFVENIX1RIX01BU0spCi0JICAgICA8PCBUWFFfQ1RSTF9UUERfRkVUQ0hfVEhfU0hJRlQpIHwgVFhRX0NUUkxfRU5IX01PREUgfCBUWFFfQ1RSTF9FTjsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1RYUV9DVFJMKTsKLQotCS8qIG1pbiB0cGQgZmV0Y2ggZ2FwICYgdHgganVtYm8gcGFja2V0IHNpemUgdGhyZXNob2xkIGZvciB0YXNrb2ZmbG9hZCAqLwotCXZhbHVlID0gKCgodTMyKSBody0+dHhfanVtYm9fdGFza190aCAmIFRYX0pVTUJPX1RBU0tfVEhfTUFTSykKLQkJIDw8IFRYX0pVTUJPX1RBU0tfVEhfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+dHBkX2ZldGNoX2dhcCAmIFRYX1RQRF9NSU5fSVBHX01BU0spCi0JICAgICA8PCBUWF9UUERfTUlOX0lQR19TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19UWF9KVU1CT19UQVNLX1RIX1RQRF9JUEcpOwotCi0JLyogY29uZmlnIFJYUSAqLwotCXZhbHVlID0gKCgodTMyKSBody0+cmZkX2J1cnN0ICYgUlhRX0NUUkxfUkZEX0JVUlNUX05VTV9NQVNLKQotCQkgPDwgUlhRX0NUUkxfUkZEX0JVUlNUX05VTV9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT5ycmRfYnVyc3QgJiBSWFFfQ1RSTF9SUkRfQlVSU1RfVEhSRVNIX01BU0spCi0JICAgICA8PCBSWFFfQ1RSTF9SUkRfQlVSU1RfVEhSRVNIX1NISUZUKSB8Ci0JICAgICgoKHUzMikgaHctPnJmZF9mZXRjaF9nYXAgJiBSWFFfQ1RSTF9SRkRfUFJFRl9NSU5fSVBHX01BU0spCi0JICAgICA8PCBSWFFfQ1RSTF9SRkRfUFJFRl9NSU5fSVBHX1NISUZUKSB8Ci0JICAgIFJYUV9DVFJMX0NVVF9USFJVX0VOIHwgUlhRX0NUUkxfRU47Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfQ1RSTCk7Ci0KLQkvKiBjb25maWcgRE1BIEVuZ2luZSAqLwotCXZhbHVlID0gKCgoKHUzMikgaHctPmRtYXJfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKLQkJIDw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8Ci0JICAgICgoKCh1MzIpIGh3LT5kbWF3X2Jsb2NrKSAmIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0spCi0JICAgICA8PCBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9TSElGVCkgfAotCSAgICBETUFfQ1RSTF9ETUFSX0VOIHwgRE1BX0NUUkxfRE1BV19FTjsKLQl2YWx1ZSB8PSAodTMyKSBody0+ZG1hX29yZDsKLQlpZiAoYXRsMV9yY2JfMTI4ID09IGh3LT5yY2JfdmFsdWUpCi0JCXZhbHVlIHw9IERNQV9DVFJMX1JDQl9WQUxVRTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0RNQV9DVFJMKTsKLQotCS8qIGNvbmZpZyBDTUIgLyBTTUIgKi8KLQl2YWx1ZSA9IGh3LT5jbWJfcnJkIHwgKCh1MzIpIGh3LT5jbWJfdHBkIDw8IDE2KTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0NNQl9XUklURV9USCk7Ci0JdmFsdWUgPSBody0+Y21iX3J4X3RpbWVyIHwgKCh1MzIpIGh3LT5jbWJfdHhfdGltZXIgPDwgMTYpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ01CX1dSSVRFX1RJTUVSKTsKLQlpb3dyaXRlMzIoaHctPnNtYl90aW1lciwgaHctPmh3X2FkZHIgKyBSRUdfU01CX1RJTUVSKTsKLQotCS8qIC0tLSBlbmFibGUgQ01CIC8gU01CICovCi0JdmFsdWUgPSBDU01CX0NUUkxfQ01CX0VOIHwgQ1NNQl9DVFJMX1NNQl9FTjsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0NTTUJfQ1RSTCk7Ci0KLQl2YWx1ZSA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKLQlpZiAodW5saWtlbHkoKHZhbHVlICYgSVNSX1BIWV9MSU5LRE9XTikgIT0gMCkpCi0JCXZhbHVlID0gMTsJLyogY29uZmlnIGZhaWxlZCAqLwotCWVsc2UKLQkJdmFsdWUgPSAwOwotCi0JLyogY2xlYXIgYWxsIGludGVycnVwdCBzdGF0dXMgKi8KLQlpb3dyaXRlMzIoMHgzZmZmZmZmZiwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOwotCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0vKgotICogYXRsMV9pcnFfZGlzYWJsZSAtIE1hc2sgb2ZmIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHRoZSBOSUMKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICovCi1zdGF0aWMgdm9pZCBhdGwxX2lycV9kaXNhYmxlKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7Ci0JaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQlpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7Ci0Jc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bDFfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCXN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgY3RybDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci0JLyogYXRsMV9pcnFfZGlzYWJsZShhZGFwdGVyKTsgKi8KLQlhZGFwdGVyLT52bGdycCA9IGdycDsKLQotCWlmIChncnApIHsKLQkJLyogZW5hYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwotCQljdHJsID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7Ci0JCWN0cmwgfD0gTUFDX0NUUkxfUk1WX1ZMQU47Ci0JCWlvd3JpdGUzMihjdHJsLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQl9IGVsc2UgewotCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwotCQljdHJsID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7Ci0JCWN0cmwgJj0gfk1BQ19DVFJMX1JNVl9WTEFOOwotCQlpb3dyaXRlMzIoY3RybCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7Ci0JfQotCi0JLyogYXRsMV9pcnFfZW5hYmxlKGFkYXB0ZXIpOyAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXRsMV9yZXN0b3JlX3ZsYW4oc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlhdGwxX3ZsYW5fcnhfcmVnaXN0ZXIoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT52bGdycCk7Ci19Ci0KIHN0YXRpYyB1MTYgdHBkX2F2YWlsKHN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZykKIHsKIAl1MTYgbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbik7CiAJdTE2IG5leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSk7Ci0JcmV0dXJuICgobmV4dF90b19jbGVhbiA+Ci0JCSBuZXh0X3RvX3VzZSkgPyBuZXh0X3RvX2NsZWFuIC0gbmV4dF90b191c2UgLQotCQkxIDogdHBkX3JpbmctPmNvdW50ICsgbmV4dF90b19jbGVhbiAtIG5leHRfdG9fdXNlIC0gMSk7CisJcmV0dXJuICgobmV4dF90b19jbGVhbiA+IG5leHRfdG9fdXNlKSA/CisJCW5leHRfdG9fY2xlYW4gLSBuZXh0X3RvX3VzZSAtIDEgOgorCQl0cGRfcmluZy0+Y291bnQgKyBuZXh0X3RvX2NsZWFuIC0gbmV4dF90b191c2UgLSAxKTsKIH0KIAogc3RhdGljIGludCBhdGwxX3RzbyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTI1OCw5ICsxNDUxLDcgQEAKIAkJCWlwaC0+dG90X2xlbiA9IDA7CiAJCQlpcGgtPmNoZWNrID0gMDsKIAkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKLQkJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCi0JCQkJCQkJCSBJUFBST1RPX1RDUCwKLQkJCQkJCQkJIDApOworCQkJCWlwaC0+ZGFkZHIsIDAsIElQUFJPVE9fVENQLCAwKTsKIAkJCWlwb2ZzdCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCQkJaWYgKGlwb2ZzdCAhPSBFTkVUX0hFQURFUl9TSVpFKSAvKiA4MDIuMyBmcmFtZSAqLwogCQkJCXRzby0+dHNvcGwgfD0gMSA8PCBUU09fUEFSQU1fRVRIVFlQRV9TSElGVDsKQEAgLTEyNjgsNyArMTQ1OSw4IEBACiAJCQl0c28tPnRzb3BsIHw9IChpcGgtPmlobCAmCiAJCQkJQ1NVTV9QQVJBTV9JUEhMX01BU0spIDw8IENTVU1fUEFSQU1fSVBITF9TSElGVDsKIAkJCXRzby0+dHNvcGwgfD0gKHRjcF9oZHJsZW4oc2tiKSAmCi0JCQkJVFNPX1BBUkFNX1RDUEhEUkxFTl9NQVNLKSA8PCBUU09fUEFSQU1fVENQSERSTEVOX1NISUZUOworCQkJCVRTT19QQVJBTV9UQ1BIRFJMRU5fTUFTSykgPDwKKwkJCQlUU09fUEFSQU1fVENQSERSTEVOX1NISUZUOwogCQkJdHNvLT50c29wbCB8PSAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSAmCiAJCQkJVFNPX1BBUkFNX01TU19NQVNLKSA8PCBUU09fUEFSQU1fTVNTX1NISUZUOwogCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9JUENLU1VNX1NISUZUOwpAQCAtMTI4MSw3ICsxNDczLDcgQEAKIH0KIAogc3RhdGljIGludCBhdGwxX3R4X2NzdW0oc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCXN0cnVjdCBjc3VtX3BhcmFtICpjc3VtKQorCXN0cnVjdCBjc3VtX3BhcmFtICpjc3VtKQogewogCXU4IGNzcywgY3NvOwogCkBAIC0xMjg5LDcgKzE0ODEsNyBAQAogCQljc28gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCQljc3MgPSBjc28gKyBza2ItPmNzdW1fb2Zmc2V0OwogCQlpZiAodW5saWtlbHkoY3NvICYgMHgxKSkgewotCQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSJwYXlsb2FkIG9mZnNldCBub3QgYW4gZXZlbiBudW1iZXJcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xMzA0LDggKzE0OTYsOCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBhdGwxX3R4X21hcChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLAotCQkJCXN0cnVjdCBza19idWZmICpza2IsIGJvb2wgdGNwX3NlZykKK3N0YXRpYyB2b2lkIGF0bDFfdHhfbWFwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCisJYm9vbCB0Y3Bfc2VnKQogewogCS8qIFdlIGVudGVyIHRoaXMgZnVuY3Rpb24gaG9sZGluZyBhIHNwaW5sb2NrLiAqLwogCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKQEAgLTEzNDIsMjYgKzE1MzQsMjUgQEAKIAogCQlpZiAoZmlyc3RfYnVmX2xlbiA+IHByb3RvX2hkcl9sZW4pIHsKIAkJCWxlbjEyID0gZmlyc3RfYnVmX2xlbiAtIHByb3RvX2hkcl9sZW47Ci0JCQltID0gKGxlbjEyICsgTUFYX1RYX0JVRl9MRU4gLSAxKSAvIE1BWF9UWF9CVUZfTEVOOworCQkJbSA9IChsZW4xMiArIEFUTDFfTUFYX1RYX0JVRl9MRU4gLSAxKSAvCisJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTjsKIAkJCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKIAkJCQlidWZmZXJfaW5mbyA9CiAJCQkJICAgICZ0cGRfcmluZy0+YnVmZmVyX2luZm9bdHBkX25leHRfdG9fdXNlXTsKIAkJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKIAkJCQlidWZmZXJfaW5mby0+bGVuZ3RoID0KLQkJCQkgICAgKE1BWF9UWF9CVUZfTEVOID49Ci0JCQkJICAgICBsZW4xMikgPyBNQVhfVFhfQlVGX0xFTiA6IGxlbjEyOworCQkJCSAgICAoQVRMMV9NQVhfVFhfQlVGX0xFTiA+PQorCQkJCSAgICAgbGVuMTIpID8gQVRMMV9NQVhfVFhfQlVGX0xFTiA6IGxlbjEyOwogCQkJCWxlbjEyIC09IGJ1ZmZlcl9pbmZvLT5sZW5ndGg7CiAJCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEgKwotCQkJCQkJIChwcm90b19oZHJfbGVuICsKLQkJCQkJCSAgaSAqIE1BWF9UWF9CVUZfTEVOKSk7CisJCQkJCShwcm90b19oZHJfbGVuICsKKwkJCQkJaSAqIEFUTDFfTUFYX1RYX0JVRl9MRU4pKTsKIAkJCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZykoc2tiLT5kYXRhICsKLQkJCQkJCQkocHJvdG9faGRyX2xlbiArCi0JCQkJCQkJaSAqIE1BWF9UWF9CVUZfTEVOKSkgJgotCQkJCQkJCX5QQUdFX01BU0s7Ci0JCQkJYnVmZmVyX2luZm8tPmRtYSA9Ci0JCQkJICAgIHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBwYWdlLCBvZmZzZXQsCi0JCQkJCQkgYnVmZmVyX2luZm8tPmxlbmd0aCwKLQkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJKHByb3RvX2hkcl9sZW4gKworCQkJCQlpICogQVRMMV9NQVhfVFhfQlVGX0xFTikpICYgflBBR0VfTUFTSzsKKwkJCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJCXBhZ2UsIG9mZnNldCwgYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CiAJCQkJaWYgKCsrdHBkX25leHRfdG9fdXNlID09IHRwZF9yaW5nLT5jb3VudCkKIAkJCQkJdHBkX25leHRfdG9fdXNlID0gMDsKIAkJCX0KQEAgLTEzNzIsOCArMTU2Myw3IEBACiAJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKTsKIAkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICYgflBBR0VfTUFTSzsKIAkJYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBwYWdlLAotCQkJCQkJb2Zmc2V0LCBmaXJzdF9idWZfbGVuLAotCQkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlvZmZzZXQsIGZpcnN0X2J1Zl9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQlpZiAoKyt0cGRfbmV4dF90b191c2UgPT0gdHBkX3JpbmctPmNvdW50KQogCQkJdHBkX25leHRfdG9fdXNlID0gMDsKIAl9CkBAIC0xMzg1LDE5ICsxNTc1LDE5IEBACiAJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXTsKIAkJbGVuZiA9IGZyYWctPnNpemU7CiAKLQkJbSA9IChsZW5mICsgTUFYX1RYX0JVRl9MRU4gLSAxKSAvIE1BWF9UWF9CVUZfTEVOOworCQltID0gKGxlbmYgKyBBVEwxX01BWF9UWF9CVUZfTEVOIC0gMSkgLyBBVEwxX01BWF9UWF9CVUZfTEVOOwogCQlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAJCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9bdHBkX25leHRfdG9fdXNlXTsKIAkJCWlmICh1bmxpa2VseShidWZmZXJfaW5mby0+c2tiKSkKIAkJCQlCVUcoKTsKIAkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwotCQkJYnVmZmVyX2luZm8tPmxlbmd0aCA9Ci0JCQkgICAgKGxlbmYgPiBNQVhfVFhfQlVGX0xFTikgPyBNQVhfVFhfQlVGX0xFTiA6IGxlbmY7CisJCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gKGxlbmYgPiBBVEwxX01BWF9UWF9CVUZfTEVOKSA/CisJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTiA6IGxlbmY7CiAJCQlsZW5mIC09IGJ1ZmZlcl9pbmZvLT5sZW5ndGg7Ci0JCQlidWZmZXJfaW5mby0+ZG1hID0KLQkJCSAgICBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgZnJhZy0+cGFnZSwKLQkJCQkJIGZyYWctPnBhZ2Vfb2Zmc2V0ICsgaSAqIE1BWF9UWF9CVUZfTEVOLAotCQkJCQkgYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJZnJhZy0+cGFnZSwKKwkJCQlmcmFnLT5wYWdlX29mZnNldCArIChpICogQVRMMV9NQVhfVFhfQlVGX0xFTiksCisJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CiAKIAkJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCiAJCQkJdHBkX25leHRfdG9fdXNlID0gMDsKQEAgLTE0MDksNyArMTU5OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGF0bDFfdHhfcXVldWUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgaW50IGNvdW50LAotCQkJICAgICAgIHVuaW9uIHRwZF9kZXNjciAqZGVzY3IpCisgICAgICAgdW5pb24gdHBkX2Rlc2NyICpkZXNjcikKIHsKIAkvKiBXZSBlbnRlciB0aGlzIGZ1bmN0aW9uIGhvbGRpbmcgYSBzcGlubG9jay4gKi8KIAlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CkBAIC0xNDUzLDMxICsxNjQzLDYgQEAKIAlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b191c2UsIChpbnQpdHBkX25leHRfdG9fdXNlKTsKIH0KIAotc3RhdGljIHZvaWQgYXRsMV91cGRhdGVfbWFpbGJveChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHRwZF9uZXh0X3RvX3VzZTsKLQl1MzIgcmZkX25leHRfdG9fdXNlOwotCXUzMiBycmRfbmV4dF90b19jbGVhbjsKLQl1MzIgdmFsdWU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bWJfbG9jaywgZmxhZ3MpOwotCi0JdHBkX25leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnRwZF9yaW5nLm5leHRfdG9fdXNlKTsKLQlyZmRfbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+cmZkX3JpbmcubmV4dF90b191c2UpOwotCXJyZF9uZXh0X3RvX2NsZWFuID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJyZF9yaW5nLm5leHRfdG9fY2xlYW4pOwotCi0JdmFsdWUgPSAoKHJmZF9uZXh0X3RvX3VzZSAmIE1CX1JGRF9QUk9EX0lORFhfTUFTSykgPDwKLQkJTUJfUkZEX1BST0RfSU5EWF9TSElGVCkgfAotCQkoKHJyZF9uZXh0X3RvX2NsZWFuICYgTUJfUlJEX0NPTlNfSU5EWF9NQVNLKSA8PAotCQlNQl9SUkRfQ09OU19JTkRYX1NISUZUKSB8Ci0JCSgodHBkX25leHRfdG9fdXNlICYgTUJfVFBEX1BST0RfSU5EWF9NQVNLKSA8PAotCQlNQl9UUERfUFJPRF9JTkRYX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFJTEJPWCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5tYl9sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbnQgYXRsMV94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CkBAIC0xNTEzLDggKzE2NzgsOCBAQAogCWZvciAoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKSB7CiAJCWZyYWdfc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZl0uc2l6ZTsKIAkJaWYgKGZyYWdfc2l6ZSkKLQkJCWNvdW50ICs9Ci0JCQkgICAgKGZyYWdfc2l6ZSArIE1BWF9UWF9CVUZfTEVOIC0gMSkgLyBNQVhfVFhfQlVGX0xFTjsKKwkJCWNvdW50ICs9IChmcmFnX3NpemUgKyBBVEwxX01BWF9UWF9CVUZfTEVOIC0gMSkgLworCQkJCUFUTDFfTUFYX1RYX0JVRl9MRU47CiAJfQogCiAJLyogbXNzIHdpbGwgYmUgbm9uemVybyBpZiB3ZSdyZSBkb2luZyBzZWdtZW50IG9mZmxvYWQgKFRTTy9HU08pICovCkBAIC0xNTMwLDcgKzE2OTUsOCBAQAogCQkJLyogbmVlZCBhZGRpdGlvbmFsIFRQRCA/ICovCiAJCQlpZiAocHJvdG9faGRyX2xlbiAhPSBsZW4pCiAJCQkJY291bnQgKz0gKGxlbiAtIHByb3RvX2hkcl9sZW4gKwotCQkJCQlNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJCQkJCUFUTDFfTUFYX1RYX0JVRl9MRU4gLSAxKSAvCisJCQkJCUFUTDFfTUFYX1RYX0JVRl9MRU47CiAJCX0KIAl9CiAKQEAgLTE1MzgsNyArMTcwNCw3IEBACiAJaWYgKCFzcGluX3RyeWxvY2soJmFkYXB0ZXItPmxvY2spKSB7CiAJCS8qIENhbid0IGdldCBsb2NrIC0gdGVsbCB1cHBlciBsYXllciB0byByZXF1ZXVlICovCiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAidHggbG9ja2VkXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYWRhcHRlci0+cGRldi0+ZGV2LCAidHggbG9ja2VkXG4iKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7CiAJfQogCkBAIC0xNTQ2LDcgKzE3MTIsNyBAQAogCQkvKiBub3QgZW5vdWdoIGRlc2NyaXB0b3JzICovCiAJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJ0eCBidXN5XG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYWRhcHRlci0+cGRldi0+ZGV2LCAidHggYnVzeVxuIik7CiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CiAKQEAgLTE1ODgsMTMxICsxNzU0LDIwOCBAQAogfQogCiAvKgotICogYXRsMV9nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcwotICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KLSAqIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3R1YWxseSB1cGRhdGVkIGZyb20gdGhlIHRpbWVyIGNhbGxiYWNrLgorICogYXRsMV9pbnRyIC0gSW50ZXJydXB0IEhhbmRsZXIKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHB0X3JlZ3M6IENQVSByZWdpc3RlcnMgc3RydWN0dXJlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXRsMV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdGwxX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGF0YSk7CisJdTMyIHN0YXR1czsKKwl1OCB1cGRhdGVfcng7CisJaW50IG1heF9pbnRzID0gMTA7CisKKwlzdGF0dXMgPSBhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHM7CisJaWYgKCFzdGF0dXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXVwZGF0ZV9yeCA9IDA7CisKKwlkbyB7CisJCS8qIGNsZWFyIENNQiBpbnRlcnJ1cHQgc3RhdHVzIGF0IG9uY2UgKi8KKwkJYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzID0gMDsKKworCQlpZiAoc3RhdHVzICYgSVNSX0dQSFkpCS8qIGNsZWFyIHBoeSBzdGF0dXMgKi8KKwkJCWF0bDFfY2xlYXJfcGh5X2ludChhZGFwdGVyKTsKKworCQkvKiBjbGVhciBJU1Igc3RhdHVzLCBhbmQgRW5hYmxlIENNQiBETUEvRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKwkJaW93cml0ZTMyKHN0YXR1cyB8IElTUl9ESVNfSU5ULCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisKKwkJLyogY2hlY2sgaWYgU01CIGludHIgKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9TTUIpCisJCQlhdGwxX2luY19zbWIoYWRhcHRlcik7CisKKwkJLyogY2hlY2sgaWYgUENJRSBQSFkgTGluayBkb3duICovCisJCWlmIChzdGF0dXMgJiBJU1JfUEhZX0xJTktET1dOKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJInBjaWUgcGh5IGxpbmsgZG93biAleFxuIiwgc3RhdHVzKTsKKwkJCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsJLyogcmVzZXQgTUFDICovCisJCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwkJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5wY2llX2RtYV90b19yc3RfdGFzayk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9CisKKwkJLyogY2hlY2sgaWYgRE1BIHJlYWQvd3JpdGUgZXJyb3IgPyAqLworCQlpZiAoc3RhdHVzICYgKElTUl9ETUFSX1RPX1JTVCB8IElTUl9ETUFXX1RPX1JTVCkpIHsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkicGNpZSBETUEgci93IGVycm9yIChzdGF0dXMgPSAweCV4KVxuIiwKKwkJCQlzdGF0dXMpOworCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnBjaWVfZG1hX3RvX3JzdF90YXNrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCS8qIGxpbmsgZXZlbnQgKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9HUEhZKSB7CisJCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlhdGwxX2NoZWNrX2Zvcl9saW5rKGFkYXB0ZXIpOworCQl9CisKKwkJLyogdHJhbnNtaXQgZXZlbnQgKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9DTUJfVFgpCisJCQlhdGwxX2ludHJfdHgoYWRhcHRlcik7CisKKwkJLyogcnggZXhjZXB0aW9uICovCisJCWlmICh1bmxpa2VseShzdGF0dXMgJiAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfAorCQkJSVNSX1JSRF9PViB8IElTUl9IT1NUX1JGRF9VTlJVTiB8CisJCQlJU1JfSE9TVF9SUkRfT1YgfCBJU1JfQ01CX1JYKSkpIHsKKwkJCWlmIChzdGF0dXMgJiAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfAorCQkJCUlTUl9SUkRfT1YgfCBJU1JfSE9TVF9SRkRfVU5SVU4gfAorCQkJCUlTUl9IT1NUX1JSRF9PVikpCisJCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCQkicnggZXhjZXB0aW9uLCBJU1IgPSAweCV4XG4iLCBzdGF0dXMpOworCQkJYXRsMV9pbnRyX3J4KGFkYXB0ZXIpOworCQl9CisKKwkJaWYgKC0tbWF4X2ludHMgPCAwKQorCQkJYnJlYWs7CisKKwl9IHdoaWxlICgoc3RhdHVzID0gYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzKSk7CisKKwkvKiByZS1lbmFibGUgSW50ZXJydXB0ICovCisJaW93cml0ZTMyKElTUl9ESVNfU01CIHwgSVNSX0RJU19ETUEsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBhdGwxX3dhdGNoZG9nIC0gVGltZXIgQ2FsbC1iYWNrCisgKiBAZGF0YTogcG9pbnRlciB0byBuZXRkZXYgY2FzdCBpbnRvIGFuIHVuc2lnbmVkIGxvbmcKKyAqLworc3RhdGljIHZvaWQgYXRsMV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYXRsMV9hZGFwdGVyICopZGF0YTsKKworCS8qIFJlc2V0IHRoZSB0aW1lciAqLworCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyAyICogSFopOworfQorCisvKgorICogYXRsMV9waHlfY29uZmlnIC0gVGltZXIgQ2FsbC1iYWNrCisgKiBAZGF0YTogcG9pbnRlciB0byBuZXRkZXYgY2FzdCBpbnRvIGFuIHVuc2lnbmVkIGxvbmcKKyAqLworc3RhdGljIHZvaWQgYXRsMV9waHlfY29uZmlnKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKilkYXRhOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FEVkVSVElTRSwgaHctPm1paV9hdXRvbmVnX2Fkdl9yZWcpOworCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FUMDAxX0NSLCBody0+bWlpXzEwMDB0X2N0cmxfcmVnKTsKKwlhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9CTUNSLCBNSUlfQ1JfUkVTRVQgfCBNSUlfQ1JfQVVUT19ORUdfRU4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIGF0bDFfdHhfdGltZW91dCAtIFJlc3BvbmQgdG8gYSBUeCBIYW5nCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAmYWRhcHRlci0+bmV0X3N0YXRzOworCS8qIERvIHRoZSByZXNldCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0ICovCisJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrKTsKIH0KIAogLyoKLSAqIGF0bDFfY2xlYW5fcnhfcmluZyAtIEZyZWUgUkZEIEJ1ZmZlcnMKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICogT3JwaGFuZWQgdmVuZG9yIGNvbW1lbnQgbGVmdCBpbnRhY3QgaGVyZToKKyAqIDx2ZW5kb3IgY29tbWVudD4KKyAqIElmIFRQRCBCdWZmZXIgc2l6ZSBlcXVhbCB0byAwLCBQQ0lFIERNQVJfVE9fSU5UCisgKiB3aWxsIGFzc2VydC4gV2UgZG8gc29mdCByZXNldCA8MHgxNDAwPTE+IGFjY29yZGluZworICogd2l0aCB0aGUgU1BFQy4gQlVULCBpdCBzZWVtZXMgdGhhdCBQQ0lFIG9yIERNQQorICogc3RhdGUtbWFjaGluZSB3aWxsIG5vdCBiZSByZXNldC4gRE1BUl9UT19JTlQgd2lsbAorICogYXNzZXJ0IGFnYWluIGFuZCBhZ2Fpbi4KKyAqIDwvdmVuZG9yIGNvbW1lbnQ+CiAgKi8KLXN0YXRpYyB2b2lkIGF0bDFfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYXRsMV90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyZmRfcmluZyA9ICZhZGFwdGVyLT5yZmRfcmluZzsKLQlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkX3JpbmcgPSAmYWRhcHRlci0+cnJkX3Jpbmc7Ci0Jc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0bDFfYWRhcHRlciwgdHhfdGltZW91dF90YXNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCi0JLyogRnJlZSBhbGwgdGhlIFJ4IHJpbmcgc2tfYnVmZnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcmZkX3JpbmctPmNvdW50OyBpKyspIHsKLQkJYnVmZmVyX2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwotCQlpZiAoYnVmZmVyX2luZm8tPmRtYSkgewotCQkJcGNpX3VubWFwX3BhZ2UocGRldiwKLQkJCQkJYnVmZmVyX2luZm8tPmRtYSwKLQkJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwKLQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOwotCQl9Ci0JCWlmIChidWZmZXJfaW5mby0+c2tiKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOwotCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiByZmRfcmluZy0+Y291bnQ7Ci0JbWVtc2V0KHJmZF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7Ci0KLQkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCi0JbWVtc2V0KHJmZF9yaW5nLT5kZXNjLCAwLCByZmRfcmluZy0+c2l6ZSk7Ci0KLQlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7Ci0JYXRvbWljX3NldCgmcmZkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKLQotCXJyZF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7Ci0JYXRvbWljX3NldCgmcnJkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwlhdGwxX2Rvd24oYWRhcHRlcik7CisJYXRsMV91cChhZGFwdGVyKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CiB9CiAKIC8qCi0gKiBhdGwxX2NsZWFuX3R4X3JpbmcgLSBGcmVlIFR4IEJ1ZmZlcnMKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICogYXRsMV9saW5rX2NoZ190YXNrIC0gZGVhbCB3aXRoIGxpbmsgY2hhbmdlIGV2ZW50IE91dCBvZiBpbnRlcnJ1cHQgY29udGV4dAogICovCi1zdGF0aWMgdm9pZCBhdGwxX2NsZWFuX3R4X3Jpbmcoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIGF0bDFfbGlua19jaGdfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOwotCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0KKyAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMV9hZGFwdGVyLCBsaW5rX2NoZ190YXNrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogRnJlZSBhbGwgdGhlIFR4IHJpbmcgc2tfYnVmZnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdHBkX3JpbmctPmNvdW50OyBpKyspIHsKLQkJYnVmZmVyX2luZm8gPSAmdHBkX3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwotCQlpZiAoYnVmZmVyX2luZm8tPmRtYSkgewotCQkJcGNpX3VubWFwX3BhZ2UocGRldiwgYnVmZmVyX2luZm8tPmRtYSwKLQkJCQkgICAgICAgYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCB0cGRfcmluZy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9baV07Ci0JCWlmIChidWZmZXJfaW5mby0+c2tiKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShidWZmZXJfaW5mby0+c2tiKTsKLQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwotCQl9Ci0JfQotCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRsMV9idWZmZXIpICogdHBkX3JpbmctPmNvdW50OwotCW1lbXNldCh0cGRfcmluZy0+YnVmZmVyX2luZm8sIDAsIHNpemUpOwotCi0JLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLwotCW1lbXNldCh0cGRfcmluZy0+ZGVzYywgMCwgdHBkX3JpbmctPnNpemUpOwotCi0JYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKLQlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlhdGwxX2NoZWNrX2xpbmsoYWRhcHRlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogfQogCi0vKgotICogYXRsMV9mcmVlX3JpbmdfcmVzb3VyY2VzIC0gRnJlZSBUeCAvIFJYIGRlc2NyaXB0b3IgUmVzb3VyY2VzCi0gKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKLSAqLwotdm9pZCBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIGF0bDFfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCB2bGFuX2dyb3VwICpncnApCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKLQlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7Ci0Jc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZF9yaW5nID0gJmFkYXB0ZXItPnJyZF9yaW5nOwotCXN0cnVjdCBhdGwxX3JpbmdfaGVhZGVyICpyaW5nX2hlYWRlciA9ICZhZGFwdGVyLT5yaW5nX2hlYWRlcjsKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjdHJsOwogCi0JYXRsMV9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOwotCWF0bDFfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCS8qIGF0bDFfaXJxX2Rpc2FibGUoYWRhcHRlcik7ICovCisJYWRhcHRlci0+dmxncnAgPSBncnA7CiAKLQlrZnJlZSh0cGRfcmluZy0+YnVmZmVyX2luZm8pOwotCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcmluZ19oZWFkZXItPnNpemUsIHJpbmdfaGVhZGVyLT5kZXNjLAotCQkJICAgIHJpbmdfaGVhZGVyLT5kbWEpOworCWlmIChncnApIHsKKwkJLyogZW5hYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLworCQljdHJsID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJCWN0cmwgfD0gTUFDX0NUUkxfUk1WX1ZMQU47CisJCWlvd3JpdGUzMihjdHJsLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLworCQljdHJsID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJCWN0cmwgJj0gfk1BQ19DVFJMX1JNVl9WTEFOOworCQlpb3dyaXRlMzIoY3RybCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJfQogCi0JdHBkX3JpbmctPmJ1ZmZlcl9pbmZvID0gTlVMTDsKLQl0cGRfcmluZy0+ZGVzYyA9IE5VTEw7Ci0JdHBkX3JpbmctPmRtYSA9IDA7CisJLyogYXRsMV9pcnFfZW5hYmxlKGFkYXB0ZXIpOyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKK30KIAotCXJmZF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7Ci0JcmZkX3JpbmctPmRlc2MgPSBOVUxMOwotCXJmZF9yaW5nLT5kbWEgPSAwOworc3RhdGljIHZvaWQgYXRsMV9yZXN0b3JlX3ZsYW4oc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhdGwxX3ZsYW5fcnhfcmVnaXN0ZXIoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT52bGdycCk7Cit9CiAKLQlycmRfcmluZy0+ZGVzYyA9IE5VTEw7Ci0JcnJkX3JpbmctPmRtYSA9IDA7CitpbnQgYXRsMV9yZXNldChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhdGwxX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7CisJaWYgKHJldCAhPSBBVEwxX1NVQ0NFU1MpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGF0bDFfaW5pdF9odygmYWRhcHRlci0+aHcpOwogfQogCiBzMzIgYXRsMV91cChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMTcyMyw2ICsxOTY2LDcgQEAKIAogCS8qIGhhcmR3YXJlIGhhcyBiZWVuIHJlc2V0LCB3ZSBuZWVkIHRvIHJlbG9hZCBzb21lIHRoaW5ncyAqLwogCWF0bDFfc2V0X211bHRpKG5ldGRldik7CisJYXRsMV9pbml0X3JpbmdfcHRycyhhZGFwdGVyKTsKIAlhdGwxX3Jlc3RvcmVfdmxhbihhZGFwdGVyKTsKIAllcnIgPSBhdGwxX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CiAJaWYgKHVubGlrZWx5KCFlcnIpKQkJLyogbm8gUlggQlVGRkVSIGFsbG9jYXRlZCAqLwpAQCAtMTc1MCwxMSArMTk5NCw2IEBACiAJYXRsMV9jaGVja19saW5rKGFkYXB0ZXIpOwogCXJldHVybiAwOwogCi0JLyogRklYTUU6IHVucmVhY2hhYmxlIGNvZGUhIC0tIENIUyAqLwotCS8qIGZyZWUgaXJxIGRpc2FibGUgYW55IGludGVycnVwdCAqLwotCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7Ci0JZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBuZXRkZXYpOwotCiBlcnJfdXA6CiAJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOwogCS8qIGZyZWUgcnhfYnVmZmVycyAqLwpAQCAtMTc4NiwxNzIgKzIwMjUsNiBAQAogfQogCiAvKgotICogYXRsMV9jaGFuZ2VfbXR1IC0gQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQKLSAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBuZXdfbXR1OiBuZXcgdmFsdWUgZm9yIG1heGltdW0gZnJhbWUgc2l6ZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgYXRsMV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBvbGRfbXR1ID0gbmV0ZGV2LT5tdHU7Ci0JaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7Ci0KLQlpZiAoKG1heF9mcmFtZSA8IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgfHwKLQkgICAgKG1heF9mcmFtZSA+IE1BWF9KVU1CT19GUkFNRV9TSVpFKSkgewotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiaW52YWxpZCBNVFUgc2V0dGluZ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFkYXB0ZXItPmh3Lm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOwotCWFkYXB0ZXItPmh3LnR4X2p1bWJvX3Rhc2tfdGggPSAobWF4X2ZyYW1lICsgNykgPj4gMzsKLQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gKG1heF9mcmFtZSArIDcpICYgfjc7Ci0JYWRhcHRlci0+aHcucnhfanVtYm9fdGggPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIC8gODsKLQotCW5ldGRldi0+bXR1ID0gbmV3X210dTsKLQlpZiAoKG9sZF9tdHUgIT0gbmV3X210dSkgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCWF0bDFfZG93bihhZGFwdGVyKTsKLQkJYXRsMV91cChhZGFwdGVyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGF0bDFfc2V0X21hYyAtIENoYW5nZSB0aGUgRXRoZXJuZXQgQWRkcmVzcyBvZiB0aGUgTklDCi0gKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAcDogcG9pbnRlciB0byBhbiBhZGRyZXNzIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgYXRsMV9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCi0JCXJldHVybiAtRUFERFJOT1RBVkFJTDsKLQotCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKLQltZW1jcHkoYWRhcHRlci0+aHcubWFjX2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOwotCi0JYXRsMV9zZXRfbWFjX2FkZHIoJmFkYXB0ZXItPmh3KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGF0bDFfd2F0Y2hkb2cgLSBUaW1lciBDYWxsLWJhY2sKLSAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZwotICovCi1zdGF0aWMgdm9pZCBhdGwxX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKilkYXRhOwotCi0JLyogUmVzZXQgdGhlIHRpbWVyICovCi0JbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Ci19Ci0KLXN0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXUxNiByZXN1bHQ7Ci0KLQlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0gJiAweDFmLCAmcmVzdWx0KTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0sIGludCB2YWwpCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhdGwxX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCByZWdfbnVtLCB2YWwpOwotfQotCi0vKgotICogYXRsMV9taWlfaW9jdGwgLQotICogQG5ldGRldjoKLSAqIEBpZnJlcToKLSAqIEBjbWQ6Ci0gKi8KLXN0YXRpYyBpbnQgYXRsMV9taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQlyZXR2YWwgPSBnZW5lcmljX21paV9pb2N0bCgmYWRhcHRlci0+bWlpLCBpZl9taWkoaWZyKSwgY21kLCBOVUxMKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogYXRsMV9pb2N0bCAtCi0gKiBAbmV0ZGV2OgotICogQGlmcmVxOgotICogQGNtZDoKLSAqLwotc3RhdGljIGludCBhdGwxX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQotewotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTSU9DR01JSVBIWToKLQljYXNlIFNJT0NHTUlJUkVHOgotCWNhc2UgU0lPQ1NNSUlSRUc6Ci0JCXJldHVybiBhdGwxX21paV9pb2N0bChuZXRkZXYsIGlmciwgY21kKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotfQotCi0vKgotICogYXRsMV90eF90aW1lb3V0IC0gUmVzcG9uZCB0byBhIFR4IEhhbmcKLSAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHZvaWQgYXRsMV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KLQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOwotfQotCi0vKgotICogYXRsMV9waHlfY29uZmlnIC0gVGltZXIgQ2FsbC1iYWNrCi0gKiBAZGF0YTogcG9pbnRlciB0byBuZXRkZXYgY2FzdCBpbnRvIGFuIHVuc2lnbmVkIGxvbmcKLSAqLwotc3RhdGljIHZvaWQgYXRsMV9waHlfY29uZmlnKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKilkYXRhOwotCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IGZhbHNlOwotCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FEVkVSVElTRSwgaHctPm1paV9hdXRvbmVnX2Fkdl9yZWcpOwotCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FUMDAxX0NSLCBody0+bWlpXzEwMDB0X2N0cmxfcmVnKTsKLQlhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9CTUNSLCBNSUlfQ1JfUkVTRVQgfCBNSUlfQ1JfQVVUT19ORUdfRU4pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLX0KLQotaW50IGF0bDFfcmVzZXQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYXRsMV9yZXNldF9odygmYWRhcHRlci0+aHcpOwotCWlmIChyZXQgIT0gQVRMMV9TVUNDRVNTKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBhdGwxX2luaXRfaHcoJmFkYXB0ZXItPmh3KTsKLX0KLQotLyoKICAqIGF0bDFfb3BlbiAtIENhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZSBhY3RpdmUKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKICAqCkBAIC0yMDAzLDYgKzIwNzYsMTA1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXRsMV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIGN0cmwgPSAwOworCXUzMiB3dWZjID0gYWRhcHRlci0+d29sOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWF0bDFfZG93bihhZGFwdGVyKTsKKworCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgKHUxNiAqKSAmIGN0cmwpOworCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgKHUxNiAqKSAmIGN0cmwpOworCWlmIChjdHJsICYgQk1TUl9MU1RBVFVTKQorCQl3dWZjICY9IH5BVEwxX1dVRkNfTE5LQzsKKworCS8qIHJlZHVjZSBzcGVlZCB0byAxMC8xMDBNICovCisJaWYgKHd1ZmMpIHsKKwkJYXRsMV9waHlfZW50ZXJfcG93ZXJfc2F2aW5nKGh3KTsKKwkJLyogaWYgcmVzdW1lLCBsZXQgZHJpdmVyIHRvIHJlLSBzZXR1cCBsaW5rICovCisJCWh3LT5waHlfY29uZmlndXJlZCA9IGZhbHNlOworCQlhdGwxX3NldF9tYWNfYWRkcihodyk7CisJCWF0bDFfc2V0X211bHRpKG5ldGRldik7CisKKwkJY3RybCA9IDA7CisJCS8qIHR1cm4gb24gbWFnaWMgcGFja2V0IHdvbCAqLworCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19NQUcpCisJCQljdHJsID0gV09MX01BR0lDX0VOIHwgV09MX01BR0lDX1BNRV9FTjsKKworCQkvKiB0dXJuIG9uIExpbmsgY2hhbmdlIFdPTCAqLworCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19MTktDKQorCQkJY3RybCB8PSAoV09MX0xJTktfQ0hHX0VOIHwgV09MX0xJTktfQ0hHX1BNRV9FTik7CisJCWlvd3JpdGUzMihjdHJsLCBody0+aHdfYWRkciArIFJFR19XT0xfQ1RSTCk7CisKKwkJLyogdHVybiBvbiBhbGwtbXVsdGkgbW9kZSBpZiB3YWtlIG9uIG11bHRpY2FzdCBpcyBlbmFibGVkICovCisJCWN0cmwgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJCWN0cmwgJj0gfk1BQ19DVFJMX0RCRzsKKwkJY3RybCAmPSB+TUFDX0NUUkxfUFJPTUlTX0VOOworCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19NQykKKwkJCWN0cmwgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOworCQllbHNlCisJCQljdHJsICY9IH5NQUNfQ1RSTF9NQ19BTExfRU47CisKKwkJLyogdHVybiBvbiBicm9hZGNhc3QgbW9kZSBpZiB3YWtlIG9uLUJDIGlzIGVuYWJsZWQgKi8KKwkJaWYgKHd1ZmMgJiBBVEwxX1dVRkNfQkMpCisJCQljdHJsIHw9IE1BQ19DVFJMX0JDX0VOOworCQllbHNlCisJCQljdHJsICY9IH5NQUNfQ1RSTF9CQ19FTjsKKworCQkvKiBlbmFibGUgUlggKi8KKwkJY3RybCB8PSBNQUNfQ1RSTF9SWF9FTjsKKwkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMSk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAxKTsKKwl9IGVsc2UgeworCQlpb3dyaXRlMzIoMCwgaHctPmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCX0KKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bDFfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHJldF92YWw7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJcmV0X3ZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKKworCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKKwlhdGwxX3Jlc2V0KGFkYXB0ZXIpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMV91cChhZGFwdGVyKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisKKwlhdGwxX3ZpYV93b3JrYXJvdW5kKGFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBhdGwxX3N1c3BlbmQgTlVMTAorI2RlZmluZSBhdGwxX3Jlc3VtZSBOVUxMCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCBhdGwxX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewpAQCAtMjAxMyw2OSArMjE4NSw2IEBACiAjZW5kaWYKIAogLyoKLSAqIElmIFRQRCBCdWZmZXIgc2l6ZSBlcXVhbCB0byAwLCBQQ0lFIERNQVJfVE9fSU5UCi0gKiB3aWxsIGFzc2VydC4gV2UgZG8gc29mdCByZXNldCA8MHgxNDAwPTE+IGFjY29yZGluZwotICogd2l0aCB0aGUgU1BFQy4gQlVULCBpdCBzZWVtZXMgdGhhdCBQQ0lFIG9yIERNQQotICogc3RhdGUtbWFjaGluZSB3aWxsIG5vdCBiZSByZXNldC4gRE1BUl9UT19JTlQgd2lsbAotICogYXNzZXJ0IGFnYWluIGFuZCBhZ2Fpbi4KLSAqLwotc3RhdGljIHZvaWQgYXRsMV90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0bDFfYWRhcHRlciwgdHhfdGltZW91dF90YXNrKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCi0JbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwotCWF0bDFfZG93bihhZGFwdGVyKTsKLQlhdGwxX3VwKGFkYXB0ZXIpOwotCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKLX0KLQotLyoKLSAqIGF0bDFfbGlua19jaGdfdGFzayAtIGRlYWwgd2l0aCBsaW5rIGNoYW5nZSBldmVudCBPdXQgb2YgaW50ZXJydXB0IGNvbnRleHQKLSAqLwotc3RhdGljIHZvaWQgYXRsMV9saW5rX2NoZ190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0KLSAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMV9hZGFwdGVyLCBsaW5rX2NoZ190YXNrKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQlhdGwxX2NoZWNrX2xpbmsoYWRhcHRlcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotfQotCi0vKgotICogYXRsMV9wY2llX3BhdGNoIC0gUGF0Y2ggZm9yIFBDSUUgbW9kdWxlCi0gKi8KLXN0YXRpYyB2b2lkIGF0bDFfcGNpZV9wYXRjaChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiB2YWx1ZTsKLQl2YWx1ZSA9IDB4NjUwMDsKLQlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEyRkMpOwotCS8qIHBjaWUgZmxvdyBjb250cm9sIG1vZGUgY2hhbmdlICovCi0JdmFsdWUgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgMHgxMDA4KTsKLQl2YWx1ZSB8PSAweDgwMDA7Ci0JaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgMHgxMDA4KTsKLX0KLQotLyoKLSAqIFdoZW4gQUNQSSByZXN1bWUgb24gc29tZSBWSUEgTW90aGVyQm9hcmQsIHRoZSBJbnRlcnJ1cHQgRGlzYWJsZSBiaXQvMHg0MDAKLSAqIG9uIFBDSSBDb21tYW5kIHJlZ2lzdGVyIGlzIGRpc2FibGUuCi0gKiBUaGUgZnVuY3Rpb24gZW5hYmxlIHRoaXMgYml0LgotICogQnJhY2tldHQsIDIwMDYvMDMvMTUKLSAqLwotc3RhdGljIHZvaWQgYXRsMV92aWFfd29ya2Fyb3VuZChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQl2YWx1ZSA9IGlvcmVhZDE2KGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBQQ0lfQ09NTUFORCk7Ci0JaWYgKHZhbHVlICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKQotCQl2YWx1ZSAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOwotCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFBDSV9DT01NQU5EKTsKLX0KLQotLyoKICAqIGF0bDFfcHJvYmUgLSBEZXZpY2UgSW5pdGlhbGl6YXRpb24gUm91dGluZQogICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CiAgKiBAZW50OiBlbnRyeSBpbiBhdGwxX3BjaV90YmwKQEAgLTIwODcsNyArMjE5Niw3IEBACiAgKiBhbmQgYSBoYXJkd2FyZSByZXNldCBvY2N1ci4KICAqLwogc3RhdGljIGludCBfX2RldmluaXQgYXRsMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXI7CkBAIC0yMTQxLDcgKzIyNTAsNyBAQAogCX0KIAkvKiBnZXQgZGV2aWNlIHJldmlzaW9uIG51bWJlciAqLwogCWFkYXB0ZXItPmh3LmRldl9yZXYgPSBpb3JlYWQxNihhZGFwdGVyLT5ody5od19hZGRyICsKLQkJCQkJKFJFR19NQVNURVJfQ1RSTCArIDIpKTsKKwkJKFJFR19NQVNURVJfQ1RSTCArIDIpKTsKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAidmVyc2lvbiAlc1xuIiwgRFJJVkVSX1ZFUlNJT04pOwogCiAJLyogc2V0IGRlZmF1bHQgcmluZyByZXNvdXJjZSBjb3VudHMgKi8KQEAgLTIyOTQsNyArMjQwMyw4IEBACiAJICogYWRkcmVzcywgd2UgbmVlZCB0byBzYXZlIHRoZSBwZXJtYW5lbnQgb25lLgogCSAqLwogCWlmIChtZW1jbXAoYWRhcHRlci0+aHcubWFjX2FkZHIsIGFkYXB0ZXItPmh3LnBlcm1fbWFjX2FkZHIsIEVUSF9BTEVOKSkgewotCQltZW1jcHkoYWRhcHRlci0+aHcubWFjX2FkZHIsIGFkYXB0ZXItPmh3LnBlcm1fbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGFkYXB0ZXItPmh3Lm1hY19hZGRyLCBhZGFwdGVyLT5ody5wZXJtX21hY19hZGRyLAorCQkJRVRIX0FMRU4pOwogCQlhdGwxX3NldF9tYWNfYWRkcigmYWRhcHRlci0+aHcpOwogCX0KIApAQCAtMjMwNiwxMTIgKzI0MTYsMTEgQEAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgYXRsMV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0JdTMyIGN0cmwgPSAwOwotCXUzMiB3dWZjID0gYWRhcHRlci0+d29sOwotCi0JbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCWF0bDFfZG93bihhZGFwdGVyKTsKLQotCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgKHUxNiAqKSAmIGN0cmwpOwotCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgKHUxNiAqKSAmIGN0cmwpOwotCWlmIChjdHJsICYgQk1TUl9MU1RBVFVTKQotCQl3dWZjICY9IH5BVEwxX1dVRkNfTE5LQzsKLQotCS8qIHJlZHVjZSBzcGVlZCB0byAxMC8xMDBNICovCi0JaWYgKHd1ZmMpIHsKLQkJYXRsMV9waHlfZW50ZXJfcG93ZXJfc2F2aW5nKGh3KTsKLQkJLyogaWYgcmVzdW1lLCBsZXQgZHJpdmVyIHRvIHJlLSBzZXR1cCBsaW5rICovCi0JCWh3LT5waHlfY29uZmlndXJlZCA9IGZhbHNlOwotCQlhdGwxX3NldF9tYWNfYWRkcihodyk7Ci0JCWF0bDFfc2V0X211bHRpKG5ldGRldik7Ci0KLQkJY3RybCA9IDA7Ci0JCS8qIHR1cm4gb24gbWFnaWMgcGFja2V0IHdvbCAqLwotCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19NQUcpCi0JCQljdHJsID0gV09MX01BR0lDX0VOIHwgV09MX01BR0lDX1BNRV9FTjsKLQotCQkvKiB0dXJuIG9uIExpbmsgY2hhbmdlIFdPTCAqLwotCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19MTktDKQotCQkJY3RybCB8PSAoV09MX0xJTktfQ0hHX0VOIHwgV09MX0xJTktfQ0hHX1BNRV9FTik7Ci0JCWlvd3JpdGUzMihjdHJsLCBody0+aHdfYWRkciArIFJFR19XT0xfQ1RSTCk7Ci0KLQkJLyogdHVybiBvbiBhbGwtbXVsdGkgbW9kZSBpZiB3YWtlIG9uIG11bHRpY2FzdCBpcyBlbmFibGVkICovCi0JCWN0cmwgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7Ci0JCWN0cmwgJj0gfk1BQ19DVFJMX0RCRzsKLQkJY3RybCAmPSB+TUFDX0NUUkxfUFJPTUlTX0VOOwotCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19NQykKLQkJCWN0cmwgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOwotCQllbHNlCi0JCQljdHJsICY9IH5NQUNfQ1RSTF9NQ19BTExfRU47Ci0KLQkJLyogdHVybiBvbiBicm9hZGNhc3QgbW9kZSBpZiB3YWtlIG9uLUJDIGlzIGVuYWJsZWQgKi8KLQkJaWYgKHd1ZmMgJiBBVEwxX1dVRkNfQkMpCi0JCQljdHJsIHw9IE1BQ19DVFJMX0JDX0VOOwotCQllbHNlCi0JCQljdHJsICY9IH5NQUNfQ1RSTF9CQ19FTjsKLQotCQkvKiBlbmFibGUgUlggKi8KLQkJY3RybCB8PSBNQUNfQ1RSTF9SWF9FTjsKLQkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMSk7Ci0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAxKTsJLyogNCA9PSBEMyBjb2xkICovCi0JfSBlbHNlIHsKLQkJaW93cml0ZTMyKDAsIGh3LT5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7Ci0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsJLyogNCA9PSBEMyBjb2xkICovCi0JfQotCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXRsMV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgcmV0X3ZhbDsKLQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7Ci0JcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0KLQlyZXRfdmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7Ci0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwotCi0JaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOwotCWF0bDFfcmVzZXQoYWRhcHRlcik7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQlhdGwxX3VwKGFkYXB0ZXIpOwotCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKLQotCWF0bDFfdmlhX3dvcmthcm91bmQoYWRhcHRlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGF0bDFfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGF0bDFfcmVzdW1lIE5VTEwKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXRsMV9kcml2ZXIgPSB7CiAJLm5hbWUgPSBhdGwxX2RyaXZlcl9uYW1lLAogCS5pZF90YWJsZSA9IGF0bDFfcGNpX3RibCwKIAkucHJvYmUgPSBhdGwxX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhdGwxX3JlbW92ZSksCi0JLyogUG93ZXIgTWFuYWdtZW50IEhvb2tzICovCi0JLyogcHJvYmFibHkgYnJva2VuIHJpZ2h0IG5vdyAtLSBDSFMgKi8KIAkuc3VzcGVuZCA9IGF0bDFfc3VzcGVuZCwKIAkucmVzdW1lID0gYXRsMV9yZXN1bWUKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCmluZGV4IGYwM2YwNzAuLjY2MjhmYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCkBAIC0zOSwxMyArMzksMTMgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBEUlZfTkFNRQkiZWhlYSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIkVIRUFfMDA2NyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIkVIRUFfMDA3MCIKIAotLyogRUhFQSBjYXBhYmlsaXR5IGZsYWdzICovCisvKiBlSEVBIGNhcGFiaWxpdHkgZmxhZ3MgKi8KICNkZWZpbmUgRExQQVJfUE9SVF9BRERfUkVNIDEKLSNkZWZpbmUgRExQQVJfTUVNX0FERCAyCi0jZGVmaW5lIERMUEFSX01FTV9SRU0gNAotI2RlZmluZSBFSEVBX0NBUEFCSUxJVElFUyAoRExQQVJfUE9SVF9BRERfUkVNKQorI2RlZmluZSBETFBBUl9NRU1fQUREICAgICAgMgorI2RlZmluZSBETFBBUl9NRU1fUkVNICAgICAgNAorI2RlZmluZSBFSEVBX0NBUEFCSUxJVElFUyAgKERMUEFSX1BPUlRfQUREX1JFTSkKIAogI2RlZmluZSBFSEVBX01TR19ERUZBVUxUIChORVRJRl9NU0dfTElOSyB8IE5FVElGX01TR19USU1FUiBcCiAJfCBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKQEAgLTExMyw2ICsxMTMsOCBAQAogLyogTWVtb3J5IFJlZ2lvbnMgKi8KICNkZWZpbmUgRUhFQV9NUl9BQ0NfQ1RSTCAgICAgICAweDAwODAwMDAwCiAKKyNkZWZpbmUgRUhFQV9CVVNNQVBfU1RBUlQgICAgICAweDgwMDAwMDAwMDAwMDAwMDBVTEwKKwogI2RlZmluZSBFSEVBX1dBVENIX0RPR19USU1FT1VUIDEwKkhaCiAKIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCkBAIC0xODYsNiArMTg4LDEyIEBACiAJCQkJICAgc2V0IHRvIDAgaWYgdW51c2VkICovCiB9OwogCitzdHJ1Y3QgZWhlYV9idXNtYXAgeworCXVuc2lnbmVkIGludCBlbnRyaWVzOwkJLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgdmFsaWRfc2VjdGlvbnM7CS8qIG51bWJlciBvZiB2YWxpZCBzZWN0aW9ucyAqLworCXU2NCAqdmFkZHI7Cit9OworCiBzdHJ1Y3QgZWhlYV9xcDsKIHN0cnVjdCBlaGVhX2NxOwogc3RydWN0IGVoZWFfZXE7CkBAIC0zODIsNiArMzkwLDggQEAKIAlzdHJ1Y3QgZWhlYV9tciBtcjsKIAl1MzIgcGQ7ICAgICAgICAgICAgICAgICAgICAvKiBwcm90ZWN0aW9uIGRvbWFpbiAqLwogCXU2NCBtYXhfbWNfbWFjOyAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgbXVsdGljYXN0IG1hYyBhZGRyZXNzZXMgKi8KKwlpbnQgYWN0aXZlX3BvcnRzOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKIApAQCAtNDMxLDYgKzQ0MSw5IEBACiAJaW50IG1heF9lbnRyaWVzX3JxMzsKIH07CiAKK2VudW0gZWhlYV9mbGFnX2JpdHMgeworCV9fRUhFQV9TVE9QX1hGRVIKK307CiAKIHZvaWQgZWhlYV9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgZWhlYV9zZW5zZV9wb3J0X2F0dHIoc3RydWN0IGVoZWFfcG9ydCAqcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwppbmRleCAzODMxNDRkLi4xZDE1NzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKQEAgLTc5LDYgKzc5LDExIEBACiBNT0RVTEVfUEFSTV9ERVNDKHVzZV9tY3MsICIgMDpOQVBJLCAxOk11bHRpcGxlIHJlY2VpdmUgcXVldWVzLCBEZWZhdWx0ID0gMSAiKTsKIAogc3RhdGljIGludCBwb3J0X25hbWVfY250ID0gMDsKK3N0YXRpYyBMSVNUX0hFQUQoYWRhcHRlcl9saXN0KTsKK3U2NCBlaGVhX2RyaXZlcl9mbGFncyA9IDA7CitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZWhlYV9kcml2ZXJfd3E7CitzdHJ1Y3Qgd29ya19zdHJ1Y3QgZWhlYV9yZXJlZ19tcl90YXNrOworCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGVoZWFfcHJvYmVfYWRhcHRlcihzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldiwKIAkJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQpOwpAQCAtMjM4LDEzICsyNDMsMTcgQEAKIAkJcndxZS0+d3JfaWQgPSBFSEVBX0JNQVNLX1NFVChFSEVBX1dSX0lEX1RZUEUsIHdxZV90eXBlKQogCQkJICAgIHwgRUhFQV9CTUFTS19TRVQoRUhFQV9XUl9JRF9JTkRFWCwgaW5kZXgpOwogCQlyd3FlLT5zZ19saXN0WzBdLmxfa2V5ID0gcHItPnJlY3ZfbXIubGtleTsKLQkJcndxZS0+c2dfbGlzdFswXS52YWRkciA9ICh1NjQpc2tiLT5kYXRhOworCQlyd3FlLT5zZ19saXN0WzBdLnZhZGRyID0gZWhlYV9tYXBfdmFkZHIoc2tiLT5kYXRhKTsKIAkJcndxZS0+c2dfbGlzdFswXS5sZW4gPSBwYWNrZXRfc2l6ZTsKIAkJcndxZS0+ZGF0YV9zZWdtZW50cyA9IDE7CiAKIAkJaW5kZXgrKzsKIAkJaW5kZXggJj0gbWF4X2luZGV4X21hc2s7CisKKwkJaWYgKHVubGlrZWx5KHRlc3RfYml0KF9fRUhFQV9TVE9QX1hGRVIsICZlaGVhX2RyaXZlcl9mbGFncykpKQorCQkJZ290byBvdXQ7CiAJfQorCiAJcV9za2JhLT5pbmRleCA9IGluZGV4OwogCiAJLyogUmluZyBkb29yYmVsbCAqLwpAQCAtMjUzLDcgKzI2Miw3IEBACiAJCWVoZWFfdXBkYXRlX3JxMmEocHItPnFwLCBpKTsKIAllbHNlCiAJCWVoZWFfdXBkYXRlX3JxM2EocHItPnFwLCBpKTsKLQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzMjEsNyArMTMzMCw3IEBACiAJCQlzZzFlbnRyeS0+bGVuID0gc2tiX2RhdGFfc2l6ZSAtIGhlYWRlcnNpemU7CiAKIAkJCXRtcF9hZGRyID0gKHU2NCkoc2tiLT5kYXRhICsgaGVhZGVyc2l6ZSk7Ci0JCQlzZzFlbnRyeS0+dmFkZHIgPSB0bXBfYWRkcjsKKwkJCXNnMWVudHJ5LT52YWRkciA9IGVoZWFfbWFwX3ZhZGRyKHRtcF9hZGRyKTsKIAkJCXN3cWUtPmRlc2NyaXB0b3JzKys7CiAJCX0KIAl9IGVsc2UKQEAgLTEzNTIsNyArMTM2MSw3IEBACiAJCQlzZzFlbnRyeS0+bF9rZXkgPSBsa2V5OwogCQkJc2cxZW50cnktPmxlbiA9IHNrYl9kYXRhX3NpemUgLSBTV1FFMl9NQVhfSU1NOwogCQkJdG1wX2FkZHIgPSAodTY0KShza2ItPmRhdGEgKyBTV1FFMl9NQVhfSU1NKTsKLQkJCXNnMWVudHJ5LT52YWRkciA9IHRtcF9hZGRyOworCQkJc2cxZW50cnktPnZhZGRyID0gZWhlYV9tYXBfdmFkZHIodG1wX2FkZHIpOwogCQkJc3dxZS0+ZGVzY3JpcHRvcnMrKzsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMzkxLDcgKzE0MDAsNyBAQAogCQkJc2cxZW50cnktPmxlbiA9IGZyYWctPnNpemU7CiAJCQl0bXBfYWRkciA9ICAodTY0KShwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkKIAkJCQkJICArIGZyYWctPnBhZ2Vfb2Zmc2V0KTsKLQkJCXNnMWVudHJ5LT52YWRkciA9IHRtcF9hZGRyOworCQkJc2cxZW50cnktPnZhZGRyID0gZWhlYV9tYXBfdmFkZHIodG1wX2FkZHIpOwogCQkJc3dxZS0+ZGVzY3JpcHRvcnMrKzsKIAkJCXNnMWVudHJ5X2NvbnRhaW5zX2ZyYWdfZGF0YSA9IDE7CiAJCX0KQEAgLTE0MDYsNyArMTQxNSw3IEBACiAKIAkJCXRtcF9hZGRyID0gKHU2NCkocGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UpCiAJCQkJCSArIGZyYWctPnBhZ2Vfb2Zmc2V0KTsKLQkJCXNnZW50cnktPnZhZGRyID0gdG1wX2FkZHI7CisJCQlzZ2VudHJ5LT52YWRkciA9IGVoZWFfbWFwX3ZhZGRyKHRtcF9hZGRyKTsKIAkJCXN3cWUtPmRlc2NyaXB0b3JzKys7CiAJCX0KIAl9CkBAIC0xODc4LDYgKzE4ODcsOSBAQAogCQllaGVhX2R1bXAoc3dxZSwgNTEyLCAic3dxZSIpOwogCX0KIAorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChfX0VIRUFfU1RPUF9YRkVSLCAmZWhlYV9kcml2ZXJfZmxhZ3MpKSkKKwkJZ290byBvdXQ7CisKIAllaGVhX3Bvc3Rfc3dxZShwci0+cXAsIHN3cWUpOwogCXByLT50eF9wYWNrZXRzKys7CiAKQEAgLTE4OTIsNyArMTkwNCw3IEBACiAJfQogCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCXNwaW5fdW5sb2NrKCZwci0+eG1pdF9sb2NrKTsKLQorb3V0OgogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKQEAgLTIyMjAsNiArMjIzMiw5IEBACiBvdXRfY2xlYW5fcHI6CiAJZWhlYV9jbGVhbl9hbGxfcG9ydHJlcyhwb3J0KTsKIG91dDoKKwlpZiAocmV0KQorCQllaGVhX2luZm8oIkZhaWxlZCBzdGFydGluZyAlcy4gcmV0PSVpIiwgZGV2LT5uYW1lLCByZXQpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjI1OSw4ICsyMjc0LDEzIEBACiAJCQltc2xlZXAoMSk7CiAKIAllaGVhX2Jyb2FkY2FzdF9yZWdfaGVscGVyKHBvcnQsIEhfREVSRUdfQkNNQyk7Ci0JcmV0ID0gZWhlYV9jbGVhbl9hbGxfcG9ydHJlcyhwb3J0KTsKIAlwb3J0LT5zdGF0ZSA9IEVIRUFfUE9SVF9ET1dOOworCisJcmV0ID0gZWhlYV9jbGVhbl9hbGxfcG9ydHJlcyhwb3J0KTsKKwlpZiAocmV0KQorCQllaGVhX2luZm8oIkZhaWxlZCBmcmVlaW5nIHJlc291cmNlcyBmb3IgJXMuIHJldD0laSIsCisJCQkgIGRldi0+bmFtZSwgcmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIyOTIsMTUgKzIzMTIsMTEgQEAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJbmV0aWZfcG9sbF9kaXNhYmxlKGRldik7CiAKLQlyZXQgPSBlaGVhX2Rvd24oZGV2KTsKLQlpZiAocmV0KQotCQllaGVhX2Vycm9yKCJlaGVhX2Rvd24gZmFpbGVkLiBub3QgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQiKTsKKwllaGVhX2Rvd24oZGV2KTsKIAogCXJldCA9IGVoZWFfdXAoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWVoZWFfZXJyb3IoIlJlc2V0IGRldmljZSAlcyBmYWlsZWQ6IHJldD0lZCIsIGRldi0+bmFtZSwgcmV0KTsKKwlpZiAocmV0KQogCQlnb3RvIG91dDsKLQl9CiAKIAlpZiAobmV0aWZfbXNnX3RpbWVyKHBvcnQpKQogCQllaGVhX2luZm8oIkRldmljZSAlcyByZXNldHRlZCBzdWNjZXNzZnVsbHkiLCBkZXYtPm5hbWUpOwpAQCAtMjMxMiw2ICsyMzI4LDg4IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBlaGVhX3JlcmVnX21ycyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyOworCisJZWhlYV9pbmZvKCJMUEFSIG1lbW9yeSBlbmxhcmdlZCAtIHJlLWluaXRpYWxpemluZyBkcml2ZXIiKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcHRlciwgJmFkYXB0ZXJfbGlzdCwgbGlzdCkKKwkJaWYgKGFkYXB0ZXItPmFjdGl2ZV9wb3J0cykgeworCQkJLyogU2h1dGRvd24gYWxsIHBvcnRzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgRUhFQV9NQVhfUE9SVFM7IGkrKykgeworCQkJCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPSBhZGFwdGVyLT5wb3J0W2ldOworCisJCQkJaWYgKHBvcnQpIHsKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnQtPm5ldGRldjsKKworCQkJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgeworCQkJCQkJZWhlYV9pbmZvKCJzdG9wcGluZyAlcyIsCisJCQkJCQkJICBkZXYtPm5hbWUpOworCQkJCQkJZG93bigmcG9ydC0+cG9ydF9sb2NrKTsKKwkJCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCQkJCW5ldGlmX3BvbGxfZGlzYWJsZShkZXYpOworCQkJCQkJZWhlYV9kb3duKGRldik7CisJCQkJCQl1cCgmcG9ydC0+cG9ydF9sb2NrKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyogVW5yZWdpc3RlciBvbGQgbWVtb3J5IHJlZ2lvbiAqLworCQkJcmV0ID0gZWhlYV9yZW1fbXIoJmFkYXB0ZXItPm1yKTsKKwkJCWlmIChyZXQpIHsKKwkJCQllaGVhX2Vycm9yKCJ1bnJlZ2lzdGVyIE1SIGZhaWxlZCAtIGRyaXZlciIKKwkJCQkJICAgIiBpbm9wZXJhYmxlISIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwllaGVhX2Rlc3Ryb3lfYnVzbWFwKCk7CisKKwlyZXQgPSBlaGVhX2NyZWF0ZV9idXNtYXAoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWNsZWFyX2JpdChfX0VIRUFfU1RPUF9YRkVSLCAmZWhlYV9kcml2ZXJfZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwdGVyLCAmYWRhcHRlcl9saXN0LCBsaXN0KQorCQlpZiAoYWRhcHRlci0+YWN0aXZlX3BvcnRzKSB7CisJCQkvKiBSZWdpc3RlciBuZXcgbWVtb3J5IHJlZ2lvbiAqLworCQkJcmV0ID0gZWhlYV9yZWdfa2VybmVsX21yKGFkYXB0ZXIsICZhZGFwdGVyLT5tcik7CisJCQlpZiAocmV0KSB7CisJCQkJZWhlYV9lcnJvcigicmVnaXN0ZXIgTVIgZmFpbGVkIC0gZHJpdmVyIgorCQkJCQkgICAiIGlub3BlcmFibGUhIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgYWxsIHBvcnRzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgRUhFQV9NQVhfUE9SVFM7IGkrKykgeworCQkJCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPSBhZGFwdGVyLT5wb3J0W2ldOworCisJCQkJaWYgKHBvcnQpIHsKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnQtPm5ldGRldjsKKworCQkJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgeworCQkJCQkJZWhlYV9pbmZvKCJyZXN0YXJ0aW5nICVzIiwKKwkJCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJCQlkb3duKCZwb3J0LT5wb3J0X2xvY2spOworCisJCQkJCQlyZXQgPSBlaGVhX3VwKGRldik7CisJCQkJCQlpZiAoIXJldCkgeworCQkJCQkJCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CisJCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCQkJfQorCisJCQkJCQl1cCgmcG9ydC0+cG9ydF9sb2NrKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorb3V0OgorCXJldHVybjsKK30KKwogc3RhdGljIHZvaWQgZWhlYV90eF93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjU3Myw2ICsyNjcxLDggQEAKIAllaGVhX2luZm8oIiVzOiBKdW1ibyBmcmFtZXMgYXJlICVzYWJsZWQiLCBkZXYtPm5hbWUsCiAJCSAganVtYm8gPT0gMSA/ICJlbiIgOiAiZGlzIik7CiAKKwlhZGFwdGVyLT5hY3RpdmVfcG9ydHMrKzsKKwogCXJldHVybiBwb3J0OwogCiBvdXRfdW5yZWdfcG9ydDoKQEAgLTI1OTYsNiArMjY5Niw3IEBACiAJZWhlYV91bnJlZ2lzdGVyX3BvcnQocG9ydCk7CiAJa2ZyZWUocG9ydC0+bWNfbGlzdCk7CiAJZnJlZV9uZXRkZXYocG9ydC0+bmV0ZGV2KTsKKwlwb3J0LT5hZGFwdGVyLT5hY3RpdmVfcG9ydHMtLTsKIH0KIAogc3RhdGljIGludCBlaGVhX3NldHVwX3BvcnRzKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0yNzg4LDYgKzI4ODksOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlsaXN0X2FkZCgmYWRhcHRlci0+bGlzdCwgJmFkYXB0ZXJfbGlzdCk7CisKIAlhZGFwdGVyLT5lYnVzX2RldiA9IGRldjsKIAogCWFkYXB0ZXJfaGFuZGxlID0gb2ZfZ2V0X3Byb3BlcnR5KGRldi0+b2ZkZXYubm9kZSwgImlibSxoZWEtaGFuZGxlIiwKQEAgLTI4OTEsNyArMjk5NCwxMCBAQAogCiAJZWhlYV9kZXN0cm95X2VxKGFkYXB0ZXItPm5lcSk7CiAJZWhlYV9yZW1vdmVfYWRhcHRlcl9tcihhZGFwdGVyKTsKKwlsaXN0X2RlbCgmYWRhcHRlci0+bGlzdCk7CisKIAlrZnJlZShhZGFwdGVyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yOTM5LDkgKzMwNDUsMTggQEAKIAlwcmludGsoS0VSTl9JTkZPICJJQk0gZUhFQSBldGhlcm5ldCBkZXZpY2UgZHJpdmVyIChSZWxlYXNlICVzKVxuIiwKIAkgICAgICAgRFJWX1ZFUlNJT04pOwogCisJZWhlYV9kcml2ZXJfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJlaGVhX2RyaXZlcl93cSIpOworCisJSU5JVF9XT1JLKCZlaGVhX3JlcmVnX21yX3Rhc2ssIGVoZWFfcmVyZWdfbXJzKTsKKwogCXJldCA9IGNoZWNrX21vZHVsZV9wYXJtKCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CisKKwlyZXQgPSBlaGVhX2NyZWF0ZV9idXNtYXAoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwogCXJldCA9IGlibWVidXNfcmVnaXN0ZXJfZHJpdmVyKCZlaGVhX2RyaXZlcik7CiAJaWYgKHJldCkgewogCQllaGVhX2Vycm9yKCJmYWlsZWQgcmVnaXN0ZXJpbmcgZUhFQSBkZXZpY2UgZHJpdmVyIG9uIGVidXMiKTsKQEAgLTI5NjUsNiArMzA4MCw3IEBACiB7CiAJZHJpdmVyX3JlbW92ZV9maWxlKCZlaGVhX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9jYXBhYmlsaXRpZXMpOwogCWlibWVidXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmVoZWFfZHJpdmVyKTsKKwllaGVhX2Rlc3Ryb3lfYnVzbWFwKCk7CiB9CiAKIG1vZHVsZV9pbml0KGVoZWFfbW9kdWxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKaW5kZXggZDE3YTQ1YS4uODliNjM1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCkBAIC02MCw2ICs2MCw5IEBACiAJfQogfQogCisvKiBOdW1iZXIgb2YgcGFnZXMgd2hpY2ggY2FuIGJlIHJlZ2lzdGVyZWQgYXQgb25jZSBieSBIX1JFR0lTVEVSX0hFQV9SUEFHRVMgKi8KKyNkZWZpbmUgRUhFQV9NQVhfUlBBR0UgNTEyCisKIC8qIE5vdGlmaWNhdGlvbiBFdmVudCBRdWV1ZSAoTkVRKSBFbnRyeSBiaXQgbWFza3MgKi8KICNkZWZpbmUgTkVRRV9FVkVOVF9DT0RFCQlFSEVBX0JNQVNLX0lCTSgyLCA3KQogI2RlZmluZSBORVFFX1BPUlROVU0gIAkJRUhFQV9CTUFTS19JQk0oMzIsIDQ3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCmluZGV4IDI5ZWFhNDYuLmEzNmZhNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKQEAgLTMxLDYgKzMxLDEzIEBACiAjaW5jbHVkZSAiZWhlYV9waHlwLmgiCiAjaW5jbHVkZSAiZWhlYV9xbXIuaCIKIAorCitzdHJ1Y3QgZWhlYV9idXNtYXAgZWhlYV9ibWFwID0geyAwLCAwLCBOVUxMIH07CitleHRlcm4gdTY0IGVoZWFfZHJpdmVyX2ZsYWdzOworZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICplaGVhX2RyaXZlcl93cTsKK2V4dGVybiBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZWhlYV9yZXJlZ19tcl90YXNrOworCisKIHN0YXRpYyB2b2lkICpod19xcGFnZWl0X2dldF9pbmMoc3RydWN0IGh3X3F1ZXVlICpxdWV1ZSkKIHsKIAl2b2lkICpyZXR2YWx1ZSA9IGh3X3FlaXRfZ2V0KHF1ZXVlKTsKQEAgLTU0NywxOCArNTU0LDg0IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBlaGVhX2NyZWF0ZV9idXNtYXAoIHZvaWQgKQoreworCXU2NCB2YWRkciA9IEVIRUFfQlVTTUFQX1NUQVJUOworCXVuc2lnbmVkIGxvbmcgYWJzX21heF9wZm4gPSAwOworCXVuc2lnbmVkIGxvbmcgc2VjX21heF9wZm47CisJaW50IGk7CisKKwkvKgorCSAqIFNlY3Rpb25zIGFyZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIC0+IExvb3Agb3ZlciBhbGwgc2VjdGlvbnMgYW5kCisJICogZmluZCB0aGUgaGlnaGVzdCBQRk4gdG8gY29tcHV0ZSB0aGUgcmVxdWlyZWQgbWFwIHNpemUuCisJKi8KKwllaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5SX01FTV9TRUNUSU9OUzsgaSsrKQorCQlpZiAodmFsaWRfc2VjdGlvbl9ucihpKSkgeworCQkJc2VjX21heF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihpKTsKKwkJCWlmIChzZWNfbWF4X3BmbiA+IGFic19tYXhfcGZuKQorCQkJCWFic19tYXhfcGZuID0gc2VjX21heF9wZm47CisJCQllaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMrKzsKKwkJfQorCisJZWhlYV9ibWFwLmVudHJpZXMgPSBhYnNfbWF4X3BmbiAvIEVIRUFfUEFHRVNfUEVSX1NFQ1RJT04gKyAxOworCWVoZWFfYm1hcC52YWRkciA9IHZtYWxsb2MoZWhlYV9ibWFwLmVudHJpZXMgKiBzaXplb2YoKmVoZWFfYm1hcC52YWRkcikpOworCisJaWYgKCFlaGVhX2JtYXAudmFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMCA7IGkgPCBlaGVhX2JtYXAuZW50cmllczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gc2VjdGlvbl9ucl90b19wZm4oaSk7CisKKwkJaWYgKHBmbl92YWxpZChwZm4pKSB7CisJCQllaGVhX2JtYXAudmFkZHJbaV0gPSB2YWRkcjsKKwkJCXZhZGRyICs9IEVIRUFfU0VDVFNJWkU7CisJCX0gZWxzZQorCQkJZWhlYV9ibWFwLnZhZGRyW2ldID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlaGVhX2Rlc3Ryb3lfYnVzbWFwKCB2b2lkICkKK3sKKwl2ZnJlZShlaGVhX2JtYXAudmFkZHIpOworfQorCit1NjQgZWhlYV9tYXBfdmFkZHIodm9pZCAqY2FkZHIpCit7CisJdTY0IG1hcHBlZF9hZGRyOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBfX3BhKGNhZGRyKSA+PiBTRUNUSU9OX1NJWkVfQklUUzsKKworCWlmIChsaWtlbHkoaW5kZXggPCBlaGVhX2JtYXAuZW50cmllcykpIHsKKwkJbWFwcGVkX2FkZHIgPSBlaGVhX2JtYXAudmFkZHJbaW5kZXhdOworCQlpZiAobGlrZWx5KG1hcHBlZF9hZGRyKSkKKwkJCW1hcHBlZF9hZGRyIHw9ICgoKHVuc2lnbmVkIGxvbmcpY2FkZHIpCisJCQkJCSYgKEVIRUFfU0VDVFNJWkUgLSAxKSk7CisJCWVsc2UKKwkJCW1hcHBlZF9hZGRyID0gLTE7CisJfSBlbHNlCisJCW1hcHBlZF9hZGRyID0gLTE7CisKKwlpZiAodW5saWtlbHkobWFwcGVkX2FkZHIgPT0gLTEpKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoX19FSEVBX1NUT1BfWEZFUiwgJmVoZWFfZHJpdmVyX2ZsYWdzKSkKKwkJCXF1ZXVlX3dvcmsoZWhlYV9kcml2ZXJfd3EsICZlaGVhX3JlcmVnX21yX3Rhc2spOworCisJcmV0dXJuIG1hcHBlZF9hZGRyOworfQorCiBpbnQgZWhlYV9yZWdfa2VybmVsX21yKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBlaGVhX21yICptcikKIHsKLQlpbnQgaSwgaywgcmV0OwotCXU2NCBocmV0LCBwdF9hYnMsIHN0YXJ0LCBlbmQsIG5yX3BhZ2VzOwotCXUzMiBhY2NfY3RybCA9IEVIRUFfTVJfQUNDX0NUUkw7CisJaW50IHJldDsKIAl1NjQgKnB0OworCXZvaWQgKnBnOworCXU2NCBocmV0LCBwdF9hYnMsIGksIGosIG0sIG1yX2xlbjsKKwl1MzIgYWNjX2N0cmwgPSBFSEVBX01SX0FDQ19DVFJMOwogCi0Jc3RhcnQgPSBLRVJORUxCQVNFOwotCWVuZCA9ICh1NjQpaGlnaF9tZW1vcnk7Ci0JbnJfcGFnZXMgPSAoZW5kIC0gc3RhcnQpIC8gRUhFQV9QQUdFU0laRTsKKwltcl9sZW4gPSBlaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMgKiBFSEVBX1NFQ1RTSVpFOwogCi0JcHQgPSAga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCXB0ID0gIGt6YWxsb2MoRUhFQV9NQVhfUlBBR0UgKiBzaXplb2YodTY0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwdCkgewogCQllaGVhX2Vycm9yKCJubyBtZW0iKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTU2Niw3ICs2MzksOCBAQAogCX0KIAlwdF9hYnMgPSB2aXJ0X3RvX2FicyhwdCk7CiAKLQlocmV0ID0gZWhlYV9oX2FsbG9jX3Jlc291cmNlX21yKGFkYXB0ZXItPmhhbmRsZSwgc3RhcnQsIGVuZCAtIHN0YXJ0LAorCWhyZXQgPSBlaGVhX2hfYWxsb2NfcmVzb3VyY2VfbXIoYWRhcHRlci0+aGFuZGxlLAorCQkJCQlFSEVBX0JVU01BUF9TVEFSVCwgbXJfbGVuLAogCQkJCQlhY2NfY3RybCwgYWRhcHRlci0+cGQsCiAJCQkJCSZtci0+aGFuZGxlLCAmbXItPmxrZXkpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewpAQCAtNTc1LDQ5ICs2NDksNDMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbXItPnZhZGRyID0gS0VSTkVMQkFTRTsKLQlrID0gMDsKKwlmb3IgKGkgPSAwIDsgaSA8IGVoZWFfYm1hcC5lbnRyaWVzOyBpKyspCisJCWlmIChlaGVhX2JtYXAudmFkZHJbaV0pIHsKKwkJCXZvaWQgKnNlY3RiYXNlID0gX192YShpIDw8IFNFQ1RJT05fU0laRV9CSVRTKTsKKwkJCXVuc2lnbmVkIGxvbmcgayA9IDA7CiAKLQl3aGlsZSAobnJfcGFnZXMgPiAwKSB7Ci0JCWlmIChucl9wYWdlcyA+IDEpIHsKLQkJCXU2NCBudW1fcGFnZXMgPSBtaW4obnJfcGFnZXMsICh1NjQpNTEyKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykKLQkJCQlwdFtpXSA9IHZpcnRfdG9fYWJzKCh2b2lkKikoKCh1NjQpc3RhcnQpICsKLQkJCQkJCQkgICAgKChrKyspICoKLQkJCQkJCQkgICAgIEVIRUFfUEFHRVNJWkUpKSk7CisJCQlmb3IgKGogPSAwOyBqIDwgKFBBR0VTX1BFUl9TRUNUSU9OIC8gRUhFQV9NQVhfUlBBR0UpOworCQkJICAgICAgaisrKSB7CiAKLQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAotCQkJCQkJCW1yLT5oYW5kbGUsIDAsCi0JCQkJCQkJMCwgKHU2NClwdF9hYnMsCi0JCQkJCQkJbnVtX3BhZ2VzKTsKLQkJCW5yX3BhZ2VzIC09IG51bV9wYWdlczsKLQkJfSBlbHNlIHsKLQkJCXU2NCBhYnNfYWRyID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkgKwotCQkJCQkJCSAgKGsgKiBFSEVBX1BBR0VTSVpFKSkpOworCQkJCWZvciAobSA9IDA7IG0gPCBFSEVBX01BWF9SUEFHRTsgbSsrKSB7CisJCQkJCXBnID0gc2VjdGJhc2UgKyAoKGsrKykgKiBFSEVBX1BBR0VTSVpFKTsKKwkJCQkJcHRbbV0gPSB2aXJ0X3RvX2FicyhwZyk7CisJCQkJfQogCi0JCQlocmV0ID0gZWhlYV9oX3JlZ2lzdGVyX3JwYWdlX21yKGFkYXB0ZXItPmhhbmRsZSwKLQkJCQkJCQltci0+aGFuZGxlLCAwLAotCQkJCQkJCTAsIGFic19hZHIsMSk7Ci0JCQlucl9wYWdlcy0tOworCQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAorCQkJCQkJCQltci0+aGFuZGxlLAorCQkJCQkJCQkwLCAwLCBwdF9hYnMsCisJCQkJCQkJCUVIRUFfTUFYX1JQQUdFKTsKKwkJCQlpZiAoKGhyZXQgIT0gSF9TVUNDRVNTKQorCQkJCSAgICAmJiAoaHJldCAhPSBIX1BBR0VfUkVHSVNURVJFRCkpIHsKKwkJCQkJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLAorCQkJCQkJCSAgICAgbXItPmhhbmRsZSwKKwkJCQkJCQkgICAgIEZPUkNFX0ZSRUUpOworCQkJCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZV9tciBmYWlsZWQiKTsKKwkJCQkJcmV0ID0gLUVJTzsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQogCQl9CiAKLQkJaWYgKChocmV0ICE9IEhfU1VDQ0VTUykgJiYgKGhyZXQgIT0gSF9QQUdFX1JFR0lTVEVSRUQpKSB7Ci0JCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsCi0JCQkJCSAgICAgbXItPmhhbmRsZSwgRk9SQ0VfRlJFRSk7Ci0JCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZV9tciBmYWlsZWQiKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIG1yLT5oYW5kbGUsCi0JCQkJICAgICBGT1JDRV9GUkVFKTsKLQkJZWhlYV9lcnJvcigicmVnaXN0ZXJfcnBhZ2UgZmFpbGVkIGZvciBsYXN0IHBhZ2UiKTsKKwkJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBtci0+aGFuZGxlLCBGT1JDRV9GUkVFKTsKKwkJZWhlYV9lcnJvcigicmVnaXN0ZXJpbmcgbXIgZmFpbGVkIik7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gb3V0OwogCX0KIAorCW1yLT52YWRkciA9IEVIRUFfQlVTTUFQX1NUQVJUOwogCW1yLT5hZGFwdGVyID0gYWRhcHRlcjsKIAlyZXQgPSAwOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oCmluZGV4IGMwZWIzZTAuLmI3MWY4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmgKQEAgLTM2LDggKzM2LDE0IEBACiAgKiBwYWdlIHNpemUgb2YgZWhlYSBoYXJkd2FyZSBxdWV1ZXMKICAqLwogCi0jZGVmaW5lIEVIRUFfUEFHRVNISUZUICAxMgotI2RlZmluZSBFSEVBX1BBR0VTSVpFICAgNDA5NlVMCisjZGVmaW5lIEVIRUFfUEFHRVNISUZUICAgICAgICAgMTIKKyNkZWZpbmUgRUhFQV9QQUdFU0laRSAgICAgICAgICAoMVVMIDw8IEVIRUFfUEFHRVNISUZUKQorI2RlZmluZSBFSEVBX1NFQ1RTSVpFICAgICAgICAgICgxVUwgPDwgMjQpCisjZGVmaW5lIEVIRUFfUEFHRVNfUEVSX1NFQ1RJT04gKEVIRUFfU0VDVFNJWkUgPj4gUEFHRV9TSElGVCkKKworI2lmICgxVUwgPDwgU0VDVElPTl9TSVpFX0JJVFMpIDwgRUhFQV9TRUNUU0laRQorI2Vycm9yIGVIRUEgbW9kdWxlIGNhbid0IHdvcmsgaWYga2VybmVsIHNlY3Rpb25zaXplIDwgZWhlYSBzZWN0aW9uc2l6ZQorI2VuZGlmCiAKIC8qIFNvbWUgYWJicmV2aWF0aW9ucyB1c2VkIGhlcmU6CiAgKgpAQCAtMzcyLDQgKzM3OCw4IEBACiAKIHZvaWQgZWhlYV9lcnJvcl9kYXRhKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCByZXNfaGFuZGxlKTsKIAoraW50IGVoZWFfY3JlYXRlX2J1c21hcCggdm9pZCApOwordm9pZCBlaGVhX2Rlc3Ryb3lfYnVzbWFwKCB2b2lkICk7Cit1NjQgZWhlYV9tYXBfdmFkZHIodm9pZCAqY2FkZHIpOworCiAjZW5kaWYJLyogX19FSEVBX1FNUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggNjcwNDZlOC4uMTM2ODI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTU1MCw2ICs1NTAsOCBAQAogLyogUEhZIGRlZmluZXMgKi8KICNkZWZpbmUgUEhZX09VSV9NQVJWRUxMCTB4NTA0MwogI2RlZmluZSBQSFlfT1VJX0NJQ0FEQQkweDAzZjEKKyNkZWZpbmUgUEhZX09VSV9WSVRFU1NFCTB4MDFjMQorI2RlZmluZSBQSFlfT1VJX1JFQUxURUsJMHgwMWMxCiAjZGVmaW5lIFBIWUlEMV9PVUlfTUFTSwkweDAzZmYKICNkZWZpbmUgUEhZSUQxX09VSV9TSEZUCTYKICNkZWZpbmUgUEhZSUQyX09VSV9NQVNLCTB4ZmMwMApAQCAtNTU3LDEyICs1NTksMzYgQEAKICNkZWZpbmUgUEhZSUQyX01PREVMX01BU0sJCTB4MDNmMAogI2RlZmluZSBQSFlfTU9ERUxfTUFSVkVMTF9FMzAxNgkJMHgyMjAKICNkZWZpbmUgUEhZX01BUlZFTExfRTMwMTZfSU5JVE1BU0sJMHgwMzAwCi0jZGVmaW5lIFBIWV9JTklUMQkweDBmMDAwCi0jZGVmaW5lIFBIWV9JTklUMgkweDBlMDAKLSNkZWZpbmUgUEhZX0lOSVQzCTB4MDEwMDAKLSNkZWZpbmUgUEhZX0lOSVQ0CTB4MDIwMAotI2RlZmluZSBQSFlfSU5JVDUJMHgwMDA0Ci0jZGVmaW5lIFBIWV9JTklUNgkweDAyMDAwCisjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDEJMHgwZjAwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQyCTB4MGUwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQzCTB4MDEwMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNAkweDAyMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNQkweDAwMDQKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNgkweDAyMDAwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMQkweDFmCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMgkweDEwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMwkweDExCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHNAkweDEyCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfTVNLMQkweGMKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9NU0syCTB4MDE4MAorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMQkweDUyYjUKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDIJMHhhZjhhCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQzCTB4OAorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNAkweDhmOGEKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDUJMHhhZjg2CisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ2CTB4OGY4NgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNwkweGFmODIKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDgJMHgwMTAwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ5CTB4OGY4MgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMTAJMHgwCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMQkweDFmCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMgkweDE5CisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMwkweDEzCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQxCTB4MDAwMAorI2RlZmluZSBQSFlfUkVBTFRFS19JTklUMgkweDhlMDAKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDMJMHgwMDAxCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQ0CTB4YWQxNworCiAjZGVmaW5lIFBIWV9HSUdBQklUCTB4MDEwMAogCiAjZGVmaW5lIFBIWV9USU1FT1VUCTB4MQpAQCAtMTA5Niw2ICsxMTIyLDI4IEBACiAJCQlyZXR1cm4gUEhZX0VSUk9SOwogCQl9CiAJfQorCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX1JFQUxURUspIHsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzMsIFBIWV9SRUFMVEVLX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KIAogCS8qIHNldCBhZHZlcnRpc2UgcmVnaXN0ZXIgKi8KIAlyZWcgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOwpAQCAtMTE0MSwxNCArMTE4OSwxNCBAQAogCS8qIHBoeSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLwogCWlmICgobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9DSUNBREEpICYmIChwaHlpbnRlcmZhY2UgJiBQSFlfUkdNSUkpICkgewogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1JFU1YxLCBNSUlfUkVBRCk7Ci0JCXBoeV9yZXNlcnZlZCAmPSB+KFBIWV9JTklUMSB8IFBIWV9JTklUMik7Ci0JCXBoeV9yZXNlcnZlZCB8PSAoUEhZX0lOSVQzIHwgUEhZX0lOSVQ0KTsKKwkJcGh5X3Jlc2VydmVkICY9IH4oUEhZX0NJQ0FEQV9JTklUMSB8IFBIWV9DSUNBREFfSU5JVDIpOworCQlwaHlfcmVzZXJ2ZWQgfD0gKFBIWV9DSUNBREFfSU5JVDMgfCBQSFlfQ0lDQURBX0lOSVQ0KTsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKIAkJfQogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIE1JSV9SRUFEKTsKLQkJcGh5X3Jlc2VydmVkIHw9IFBIWV9JTklUNTsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9DSUNBREFfSU5JVDU7CiAJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKQEAgLTExNTYsMTIgKzEyMDQsMTA2IEBACiAJfQogCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX0NJQ0FEQSkgewogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1NSRVZJU0lPTiwgTUlJX1JFQUQpOwotCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ2OworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0NJQ0FEQV9JTklUNjsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfU1JFVklTSU9OLCBwaHlfcmVzZXJ2ZWQpKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKIAkJCXJldHVybiBQSFlfRVJST1I7CiAJCX0KIAl9CisJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfVklURVNTRSkgeworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMSwgUEhZX1ZJVEVTU0VfSU5JVDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIE1JSV9SRUFEKTsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+UEhZX1ZJVEVTU0VfSU5JVF9NU0sxOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX1ZJVEVTU0VfSU5JVDM7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+UEhZX1ZJVEVTU0VfSU5JVF9NU0sxOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX1ZJVEVTU0VfSU5JVDM7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDcpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH5QSFlfVklURVNTRV9JTklUX01TSzI7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfVklURVNTRV9JTklUODsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDkpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzEsIFBIWV9WSVRFU1NFX0lOSVQxMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9SRUFMVEVLKSB7CisJCS8qIHJlc2V0IGNvdWxkIGhhdmUgY2xlYXJlZCB0aGVzZSBvdXQsIHNldCB0aGVtIGJhY2sgKi8KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzMsIFBIWV9SRUFMVEVLX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwogCS8qIHNvbWUgcGh5cyBjbGVhciBvdXQgcGF1c2UgYWR2ZXJ0aXNtZW50IG9uIHJlc2V0LCBzZXQgaXQgYmFjayAqLwogCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCByZWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwppbmRleCA1ZGQzNGExLi5hYzM1OTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9vY3AuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5jIGIvZHJpdmVycy9uZXQvbWFjYi5jCmluZGV4IDBlMDRmN2EuLmE0YmIwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuYworKysgYi9kcml2ZXJzL25ldC9tYWNiLmMKQEAgLTE3LDEzICsxNywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21paS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgogCiAjaW5jbHVkZSAibWFjYi5oIgogCkBAIC04NSwxNzIgKzg0LDIwMiBAQAogCQltZW1jcHkoYnAtPmRldi0+ZGV2X2FkZHIsIGFkZHIsIHNpemVvZihhZGRyKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfZW5hYmxlX21kaW8oc3RydWN0IG1hY2IgKmJwKQorc3RhdGljIGludCBtYWNiX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHJlZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwotCXJlZyA9IG1hY2JfcmVhZGwoYnAsIE5DUik7Ci0JcmVnIHw9IE1BQ0JfQklUKE1QRSk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DUiwgcmVnKTsKLQltYWNiX3dyaXRlbChicCwgSUVSLCBNQUNCX0JJVChNRkQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtYWNiX2Rpc2FibGVfbWRpbyhzdHJ1Y3QgbWFjYiAqYnApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7Ci0JcmVnID0gbWFjYl9yZWFkbChicCwgTkNSKTsKLQlyZWcgJj0gfk1BQ0JfQklUKE1QRSk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DUiwgcmVnKTsKLQltYWNiX3dyaXRlbChicCwgSURSLCBNQUNCX0JJVChNRkQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IG1hY2JfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKLXsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtYWNiICpicCA9IGJ1cy0+cHJpdjsKIAlpbnQgdmFsdWU7CiAKLQltdXRleF9sb2NrKCZicC0+bWRpb19tdXRleCk7Ci0KLQltYWNiX2VuYWJsZV9tZGlvKGJwKTsKIAltYWNiX3dyaXRlbChicCwgTUFOLCAoTUFDQl9CRihTT0YsIE1BQ0JfTUFOX1NPRikKIAkJCSAgICAgIHwgTUFDQl9CRihSVywgTUFDQl9NQU5fUkVBRCkKLQkJCSAgICAgIHwgTUFDQl9CRihQSFlBLCBwaHlfaWQpCi0JCQkgICAgICB8IE1BQ0JfQkYoUkVHQSwgbG9jYXRpb24pCisJCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgbWlpX2lkKQorCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIHJlZ251bSkKIAkJCSAgICAgIHwgTUFDQl9CRihDT0RFLCBNQUNCX01BTl9DT0RFKSkpOwogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmYnAtPm1kaW9fY29tcGxldGUpOworCS8qIHdhaXQgZm9yIGVuZCBvZiB0cmFuc2ZlciAqLworCXdoaWxlICghTUFDQl9CRkVYVChJRExFLCBtYWNiX3JlYWRsKGJwLCBOU1IpKSkKKwkJY3B1X3JlbGF4KCk7CiAKIAl2YWx1ZSA9IE1BQ0JfQkZFWFQoREFUQSwgbWFjYl9yZWFkbChicCwgTUFOKSk7Ci0JbWFjYl9kaXNhYmxlX21kaW8oYnApOwotCW11dGV4X3VubG9jaygmYnAtPm1kaW9fbXV0ZXgpOwogCiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwKLQkJCSAgICBpbnQgbG9jYXRpb24sIGludCB2YWwpCitzdGF0aWMgaW50IG1hY2JfbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLAorCQkJICAgdTE2IHZhbHVlKQogewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAibWRpb193cml0ZSAlMDJ4OiUwMnggPC0gJTA0eFxuIiwKLQkJcGh5X2lkLCBsb2NhdGlvbiwgdmFsKTsKLQotCW11dGV4X2xvY2soJmJwLT5tZGlvX211dGV4KTsKLQltYWNiX2VuYWJsZV9tZGlvKGJwKTsKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBidXMtPnByaXY7CiAKIAltYWNiX3dyaXRlbChicCwgTUFOLCAoTUFDQl9CRihTT0YsIE1BQ0JfTUFOX1NPRikKIAkJCSAgICAgIHwgTUFDQl9CRihSVywgTUFDQl9NQU5fV1JJVEUpCi0JCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgcGh5X2lkKQotCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIGxvY2F0aW9uKQorCQkJICAgICAgfCBNQUNCX0JGKFBIWUEsIG1paV9pZCkKKwkJCSAgICAgIHwgTUFDQl9CRihSRUdBLCByZWdudW0pCiAJCQkgICAgICB8IE1BQ0JfQkYoQ09ERSwgTUFDQl9NQU5fQ09ERSkKLQkJCSAgICAgIHwgTUFDQl9CRihEQVRBLCB2YWwpKSk7CisJCQkgICAgICB8IE1BQ0JfQkYoREFUQSwgdmFsdWUpKSk7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7CisJLyogd2FpdCBmb3IgZW5kIG9mIHRyYW5zZmVyICovCisJd2hpbGUgKCFNQUNCX0JGRVhUKElETEUsIG1hY2JfcmVhZGwoYnAsIE5TUikpKQorCQljcHVfcmVsYXgoKTsKIAotCW1hY2JfZGlzYWJsZV9tZGlvKGJwKTsKLQltdXRleF91bmxvY2soJmJwLT5tZGlvX211dGV4KTsKLX0KLQotc3RhdGljIGludCBtYWNiX3BoeV9wcm9iZShzdHJ1Y3QgbWFjYiAqYnApCi17Ci0JaW50IHBoeV9hZGRyZXNzOwotCXUxNiBwaHlpZDEsIHBoeWlkMjsKLQotCWZvciAocGh5X2FkZHJlc3MgPSAwOyBwaHlfYWRkcmVzcyA8IDMyOyBwaHlfYWRkcmVzcysrKSB7Ci0JCXBoeWlkMSA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMSk7Ci0JCXBoeWlkMiA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMik7Ci0KLQkJaWYgKHBoeWlkMSAhPSAweGZmZmYgJiYgcGh5aWQxICE9IDB4MDAwMAotCQkgICAgJiYgcGh5aWQyICE9IDB4ZmZmZiAmJiBwaHlpZDIgIT0gMHgwMDAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBoeV9hZGRyZXNzID09IDMyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldl9pbmZvKCZicC0+cGRldi0+ZGV2LAotCQkgImRldGVjdGVkIFBIWSBhdCBhZGRyZXNzICVkIChJRCAlMDR4OiUwNHgpXG4iLAotCQkgcGh5X2FkZHJlc3MsIHBoeWlkMSwgcGh5aWQyKTsKLQotCWJwLT5taWkucGh5X2lkID0gcGh5X2FkZHJlc3M7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2Jfc2V0X21lZGlhKHN0cnVjdCBtYWNiICpicCwgaW50IG1lZGlhKQorc3RhdGljIGludCBtYWNiX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKIHsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOwotCXJlZyA9IG1hY2JfcmVhZGwoYnAsIE5DRkdSKTsKLQlyZWcgJj0gfihNQUNCX0JJVChTUEQpIHwgTUFDQl9CSVQoRkQpKTsKLQlpZiAobWVkaWEgJiAoQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCkpCi0JCXJlZyB8PSBNQUNCX0JJVChTUEQpOwotCWlmIChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKQotCQlyZWcgfD0gTUFDQl9CSVQoRkQpOwotCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgcmVnKTsKLQlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9jaGVja19tZWRpYShzdHJ1Y3QgbWFjYiAqYnAsIGludCBva190b19wcmludCwgaW50IGluaXRfbWVkaWEpCitzdGF0aWMgdm9pZCBtYWNiX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpID0gJmJwLT5taWk7Ci0JdW5zaWduZWQgaW50IG9sZF9jYXJyaWVyLCBuZXdfY2FycmllcjsKLQlpbnQgYWR2ZXJ0aXNlLCBscGEsIG1lZGlhLCBkdXBsZXg7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIGlmIGZvcmNlZCBtZWRpYSwgZ28gbm8gZnVydGhlciAqLwotCWlmIChtaWktPmZvcmNlX21lZGlhKQotCQlyZXR1cm47CisJaW50IHN0YXR1c19jaGFuZ2UgPSAwOwogCi0JLyogY2hlY2sgY3VycmVudCBhbmQgb2xkIGxpbmsgc3RhdHVzICovCi0Jb2xkX2NhcnJpZXIgPSBuZXRpZl9jYXJyaWVyX29rKG1paS0+ZGV2KSA/IDEgOiAwOwotCW5ld19jYXJyaWVyID0gKHVuc2lnbmVkIGludCkgbWlpX2xpbmtfb2sobWlpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIGlmIGNhcnJpZXIgc3RhdGUgZGlkIG5vdCBjaGFuZ2UsIGFzc3VtZSBub3RoaW5nIGVsc2UgZGlkICovCi0JaWYgKCFpbml0X21lZGlhICYmIG9sZF9jYXJyaWVyID09IG5ld19jYXJyaWVyKQotCQlyZXR1cm47CisJaWYgKHBoeWRldi0+bGluaykgeworCQlpZiAoKGJwLT5zcGVlZCAhPSBwaHlkZXYtPnNwZWVkKSB8fAorCQkgICAgKGJwLT5kdXBsZXggIT0gcGh5ZGV2LT5kdXBsZXgpKSB7CisJCQl1MzIgcmVnOwogCi0JLyogbm8gY2Fycmllciwgbm90aGluZyBtdWNoIHRvIGRvICovCi0JaWYgKCFuZXdfY2FycmllcikgewotCQluZXRpZl9jYXJyaWVyX29mZihtaWktPmRldik7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIG1paS0+ZGV2LT5uYW1lKTsKLQkJcmV0dXJuOworCQkJcmVnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOworCQkJcmVnICY9IH4oTUFDQl9CSVQoU1BEKSB8IE1BQ0JfQklUKEZEKSk7CisKKwkJCWlmIChwaHlkZXYtPmR1cGxleCkKKwkJCQlyZWcgfD0gTUFDQl9CSVQoRkQpOworCQkJaWYgKHBoeWRldi0+c3BlZWQpCisJCQkJcmVnIHw9IE1BQ0JfQklUKFNQRCk7CisKKwkJCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgcmVnKTsKKworCQkJYnAtPnNwZWVkID0gcGh5ZGV2LT5zcGVlZDsKKwkJCWJwLT5kdXBsZXggPSBwaHlkZXYtPmR1cGxleDsKKwkJCXN0YXR1c19jaGFuZ2UgPSAxOworCQl9CiAJfQogCi0JLyoKLQkgKiB3ZSBoYXZlIGNhcnJpZXIsIHNlZSB3aG8ncyBvbiB0aGUgb3RoZXIgZW5kCi0JICovCi0JbmV0aWZfY2Fycmllcl9vbihtaWktPmRldik7CisJaWYgKHBoeWRldi0+bGluayAhPSBicC0+bGluaykgeworCQlpZiAocGh5ZGV2LT5saW5rKQorCQkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKKwkJZWxzZSB7CisJCQlicC0+c3BlZWQgPSAwOworCQkJYnAtPmR1cGxleCA9IC0xOworCQl9CisJCWJwLT5saW5rID0gcGh5ZGV2LT5saW5rOwogCi0JLyogZ2V0IE1JSSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KLQlpZiAoIWluaXRfbWVkaWEgJiYgbWlpLT5hZHZlcnRpc2luZykgewotCQlhZHZlcnRpc2UgPSBtaWktPmFkdmVydGlzaW5nOworCQlzdGF0dXNfY2hhbmdlID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXR1c19jaGFuZ2UpIHsKKwkJaWYgKHBoeWRldi0+bGluaykKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwICglZC8lcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwaHlkZXYtPnNwZWVkLAorCQkJICAgICAgIERVUExFWF9GVUxMID09IHBoeWRldi0+ZHVwbGV4ID8gIkZ1bGwiOiJIYWxmIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJfQorfQorCisvKiBiYXNlZCBvbiBhdTEwMDBfZXRoLiBjKi8KK3N0YXRpYyBpbnQgbWFjYl9taWlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBOVUxMOworCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IHBoeV9hZGRyOworCisJLyogZmluZCB0aGUgZmlyc3QgcGh5ICovCisJZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgUEhZX01BWF9BRERSOyBwaHlfYWRkcisrKSB7CisJCWlmIChicC0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXSkgeworCQkJcGh5ZGV2ID0gYnAtPm1paV9idXMucGh5X21hcFtwaHlfYWRkcl07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcGh5ZGV2KSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBubyBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwZGF0YSA9IGJwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkvKiBUT0RPIDogYWRkIHBpbl9pcnEgKi8KKworCS8qIGF0dGFjaCB0aGUgbWFjIHRvIHRoZSBwaHkgKi8KKwlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpIHsKKwkJcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlkZXYtPmRldi5idXNfaWQsCisJCQkmbWFjYl9oYW5kbGVfbGlua19jaGFuZ2UsIDAsIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKTsKIAl9IGVsc2UgewotCQlhZHZlcnRpc2UgPSBtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOwotCQltaWktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeWRldi0+ZGV2LmJ1c19pZCwKKwkJCSZtYWNiX2hhbmRsZV9saW5rX2NoYW5nZSwgMCwgUEhZX0lOVEVSRkFDRV9NT0RFX01JSSk7CiAJfQotCWxwYSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0xQQSk7CiAKLQkvKiBmaWd1cmUgb3V0IG1lZGlhIGFuZCBkdXBsZXggZnJvbSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KLQltZWRpYSA9IG1paV9ud2F5X3Jlc3VsdChscGEgJiBhZHZlcnRpc2UpOwotCWR1cGxleCA9IChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKSA/IDEgOiAwOworCWlmIChJU19FUlIocGh5ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5ZGV2KTsKKwl9CiAKLQlpZiAob2tfdG9fcHJpbnQpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCAlc01icHMsICVzLWR1cGxleCwgbHBhIDB4JTA0WFxuIiwKLQkJICAgICAgIG1paS0+ZGV2LT5uYW1lLAotCQkgICAgICAgbWVkaWEgJiAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTAwSEFMRikgPyAiMTAwIiA6ICIxMCIsCi0JCSAgICAgICBkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIGxwYSk7CisJLyogbWFzayB3aXRoIE1BQyBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KKwlwaHlkZXYtPnN1cHBvcnRlZCAmPSBQSFlfQkFTSUNfRkVBVFVSRVM7CiAKLQltaWktPmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKIAotCS8qIExldCB0aGUgTUFDIGtub3cgYWJvdXQgdGhlIG5ldyBsaW5rIHN0YXRlICovCi0JbWFjYl9zZXRfbWVkaWEoYnAsIG1lZGlhKTsKKwlicC0+bGluayA9IDA7CisJYnAtPnNwZWVkID0gMDsKKwlicC0+ZHVwbGV4ID0gLTE7CisJYnAtPnBoeV9kZXYgPSBwaHlkZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNiX21paV9pbml0KHN0cnVjdCBtYWNiICpicCkKK3sKKwlzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCBlcnIgPSAtRU5YSU8sIGk7CisKKwkvKiBFbmFibGUgbWFuYWdtZW50IHBvcnQgKi8KKwltYWNiX3dyaXRlbChicCwgTkNSLCBNQUNCX0JJVChNUEUpKTsKKworCWJwLT5taWlfYnVzLm5hbWUgPSAiTUFDQl9taWlfYnVzIiwKKwlicC0+bWlpX2J1cy5yZWFkID0gJm1hY2JfbWRpb19yZWFkLAorCWJwLT5taWlfYnVzLndyaXRlID0gJm1hY2JfbWRpb193cml0ZSwKKwlicC0+bWlpX2J1cy5yZXNldCA9ICZtYWNiX21kaW9fcmVzZXQsCisJYnAtPm1paV9idXMuaWQgPSBicC0+cGRldi0+aWQsCisJYnAtPm1paV9idXMucHJpdiA9IGJwLAorCWJwLT5taWlfYnVzLmRldiA9ICZicC0+ZGV2LT5kZXY7CisJcGRhdGEgPSBicC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRhdGEpCisJCWJwLT5taWlfYnVzLnBoeV9tYXNrID0gcGRhdGEtPnBoeV9tYXNrOworCisJYnAtPm1paV9idXMuaXJxID0ga21hbGxvYyhzaXplb2YoaW50KSpQSFlfTUFYX0FERFIsIEdGUF9LRVJORUwpOworCWlmICghYnAtPm1paV9idXMuaXJxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspCisJCWJwLT5taWlfYnVzLmlycVtpXSA9IFBIWV9QT0xMOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoYnAtPmRldiwgJmJwLT5taWlfYnVzKTsKKworCWlmIChtZGlvYnVzX3JlZ2lzdGVyKCZicC0+bWlpX2J1cykpCisJCWdvdG8gZXJyX291dF9mcmVlX21kaW9faXJxOworCisJaWYgKG1hY2JfbWlpX3Byb2JlKGJwLT5kZXYpICE9IDApIHsKKwkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfYnVzOworCX0KKworCXJldHVybiAwOworCitlcnJfb3V0X3VucmVnaXN0ZXJfYnVzOgorCW1kaW9idXNfdW5yZWdpc3RlcigmYnAtPm1paV9idXMpOworZXJyX291dF9mcmVlX21kaW9faXJxOgorCWtmcmVlKGJwLT5taWlfYnVzLmlycSk7CitlcnJfb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIG1hY2JfdXBkYXRlX3N0YXRzKHN0cnVjdCBtYWNiICpicCkKQEAgLTI2NSwxNiArMjk0LDYgQEAKIAkJKnAgKz0gX19yYXdfcmVhZGwocmVnKTsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9wZXJpb2RpY190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1hY2IsIHBlcmlvZGljX3Rhc2sud29yayk7Ci0KLQltYWNiX3VwZGF0ZV9zdGF0cyhicCk7Ci0JbWFjYl9jaGVja19tZWRpYShicCwgMSwgMCk7Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrLCBIWik7Ci19Ci0KIHN0YXRpYyB2b2lkIG1hY2JfdHgoc3RydWN0IG1hY2IgKmJwKQogewogCXVuc2lnbmVkIGludCB0YWlsOwpAQCAtNTE5LDkgKzUzOCw2IEBACiAJc3Bpbl9sb2NrKCZicC0+bG9jayk7CiAKIAl3aGlsZSAoc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgJiBNQUNCX0JJVChNRkQpKQotCQkJY29tcGxldGUoJmJwLT5tZGlvX2NvbXBsZXRlKTsKLQogCQkvKiBjbG9zZSBwb3NzaWJsZSByYWNlIHdpdGggZGV2X2Nsb3NlICovCiAJCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgewogCQkJbWFjYl93cml0ZWwoYnAsIElEUiwgfjBVTCk7CkBAIC01MzUsNyArNTUxLDggQEAKIAkJCQkgKiB1bnRpbCB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgYnVmZmVycwogCQkJCSAqLwogCQkJCW1hY2Jfd3JpdGVsKGJwLCBJRFIsIE1BQ0JfUlhfSU5UX0ZMQUdTKTsKLQkJCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAic2NoZWR1bGluZyBSWCBzb2Z0aXJxXG4iKTsKKwkJCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LAorCQkJCQkic2NoZWR1bGluZyBSWCBzb2Z0aXJxXG4iKTsKIAkJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CiAJCQl9CiAJCX0KQEAgLTc2NSw3ICs3ODIsNyBAQAogCW1hY2Jfd3JpdGVsKGJwLCBUQlFQLCBicC0+dHhfcmluZ19kbWEpOwogCiAJLyogRW5hYmxlIFRYIGFuZCBSWCAqLwotCW1hY2Jfd3JpdGVsKGJwLCBOQ1IsIE1BQ0JfQklUKFJFKSB8IE1BQ0JfQklUKFRFKSk7CisJbWFjYl93cml0ZWwoYnAsIE5DUiwgTUFDQl9CSVQoUkUpIHwgTUFDQl9CSVQoVEUpIHwgTUFDQl9CSVQoTVBFKSk7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogCW1hY2Jfd3JpdGVsKGJwLCBJRVIsIChNQUNCX0JJVChSQ09NUCkKQEAgLTc3NiwxOCArNzkzLDEyNiBAQAogCQkJICAgICAgfCBNQUNCX0JJVChUQ09NUCkKIAkJCSAgICAgIHwgTUFDQl9CSVQoSVNSX1JPVlIpCiAJCQkgICAgICB8IE1BQ0JfQklUKEhSRVNQKSkpOworCiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfaW5pdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKy8qCisgKiBUaGUgaGFzaCBhZGRyZXNzIHJlZ2lzdGVyIGlzIDY0IGJpdHMgbG9uZyBhbmQgdGFrZXMgdXAgdHdvCisgKiBsb2NhdGlvbnMgaW4gdGhlIG1lbW9yeSBtYXAuICBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgc3RvcmVkCisgKiBpbiBFTUFDX0hTTCBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBFTUFDX0hTSC4KKyAqCisgKiBUaGUgdW5pY2FzdCBoYXNoIGVuYWJsZSBhbmQgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXRzIGluIHRoZQorICogbmV0d29yayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGVuYWJsZSB0aGUgcmVjZXB0aW9uIG9mIGhhc2ggbWF0Y2hlZAorICogZnJhbWVzLiBUaGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyByZWR1Y2VkIHRvIGEgNiBiaXQgaW5kZXggaW50bworICogdGhlIDY0IGJpdCBoYXNoIHJlZ2lzdGVyIHVzaW5nIHRoZSBmb2xsb3dpbmcgaGFzaCBmdW5jdGlvbi4gIFRoZQorICogaGFzaCBmdW5jdGlvbiBpcyBhbiBleGNsdXNpdmUgb3Igb2YgZXZlcnkgc2l4dGggYml0IG9mIHRoZQorICogZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqCisgKiBoaVs1XSA9IGRhWzVdIF4gZGFbMTFdIF4gZGFbMTddIF4gZGFbMjNdIF4gZGFbMjldIF4gZGFbMzVdIF4gZGFbNDFdIF4gZGFbNDddCisgKiBoaVs0XSA9IGRhWzRdIF4gZGFbMTBdIF4gZGFbMTZdIF4gZGFbMjJdIF4gZGFbMjhdIF4gZGFbMzRdIF4gZGFbNDBdIF4gZGFbNDZdCisgKiBoaVszXSA9IGRhWzNdIF4gZGFbMDldIF4gZGFbMTVdIF4gZGFbMjFdIF4gZGFbMjddIF4gZGFbMzNdIF4gZGFbMzldIF4gZGFbNDVdCisgKiBoaVsyXSA9IGRhWzJdIF4gZGFbMDhdIF4gZGFbMTRdIF4gZGFbMjBdIF4gZGFbMjZdIF4gZGFbMzJdIF4gZGFbMzhdIF4gZGFbNDRdCisgKiBoaVsxXSA9IGRhWzFdIF4gZGFbMDddIF4gZGFbMTNdIF4gZGFbMTldIF4gZGFbMjVdIF4gZGFbMzFdIF4gZGFbMzddIF4gZGFbNDNdCisgKiBoaVswXSA9IGRhWzBdIF4gZGFbMDZdIF4gZGFbMTJdIF4gZGFbMThdIF4gZGFbMjRdIF4gZGFbMzBdIF4gZGFbMzZdIF4gZGFbNDJdCisgKgorICogZGFbMF0gcmVwcmVzZW50cyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmaXJzdCBieXRlCisgKiByZWNlaXZlZCwgdGhhdCBpcywgdGhlIG11bHRpY2FzdC91bmljYXN0IGluZGljYXRvciwgYW5kIGRhWzQ3XQorICogcmVwcmVzZW50cyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxhc3QgYnl0ZSByZWNlaXZlZC4gIElmCisgKiB0aGUgaGFzaCBpbmRleCwgaGlbbl0sIHBvaW50cyB0byBhIGJpdCB0aGF0IGlzIHNldCBpbiB0aGUgaGFzaAorICogcmVnaXN0ZXIgdGhlbiB0aGUgZnJhbWUgd2lsbCBiZSBtYXRjaGVkIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZQorICogZnJhbWUgaXMgbXVsdGljYXN0IG9yIHVuaWNhc3QuICBBIG11bHRpY2FzdCBtYXRjaCB3aWxsIGJlIHNpZ25hbGxlZAorICogaWYgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXQgaXMgc2V0LCBkYVswXSBpcyAxIGFuZCB0aGUgaGFzaAorICogaW5kZXggcG9pbnRzIHRvIGEgYml0IHNldCBpbiB0aGUgaGFzaCByZWdpc3Rlci4gIEEgdW5pY2FzdCBtYXRjaAorICogd2lsbCBiZSBzaWduYWxsZWQgaWYgdGhlIHVuaWNhc3QgaGFzaCBlbmFibGUgYml0IGlzIHNldCwgZGFbMF0gaXMgMAorICogYW5kIHRoZSBoYXNoIGluZGV4IHBvaW50cyB0byBhIGJpdCBzZXQgaW4gdGhlIGhhc2ggcmVnaXN0ZXIuICBUbworICogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IGZyYW1lcywgdGhlIGhhc2ggcmVnaXN0ZXIgc2hvdWxkIGJlIHNldCB3aXRoCisgKiBhbGwgb25lcyBhbmQgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXQgc2hvdWxkIGJlIHNldCBpbiB0aGUKKyAqIG5ldHdvcmsgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBoYXNoX2JpdF92YWx1ZShpbnQgYml0bnIsIF9fdTggKmFkZHIpCiB7CisJaWYgKGFkZHJbYml0bnIgLyA4XSAmICgxIDw8IChiaXRuciAlIDgpKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGhhc2ggaW5kZXggdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBoYXNoX2dldF9pbmRleChfX3U4ICphZGRyKQoreworCWludCBpLCBqLCBiaXR2YWw7CisJaW50IGhhc2hfaW5kZXggPSAwOworCisJZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworCQlmb3IgKGkgPSAwLCBiaXR2YWwgPSAwOyBpIDwgODsgaSsrKQorCQkJYml0dmFsIF49IGhhc2hfYml0X3ZhbHVlKGkqNiArIGosIGFkZHIpOworCisJCWhhc2hfaW5kZXggfD0gKGJpdHZhbCA8PCBqKTsKKwl9CisKKwlyZXR1cm4gaGFzaF9pbmRleDsKK30KKworLyoKKyAqIEFkZCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIHRoZSBpbnRlcm5hbCBtdWx0aWNhc3QtaGFzaCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgbWFjYl9zZXRoYXNodGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmN1cnI7CisJdW5zaWduZWQgbG9uZyBtY19maWx0ZXJbMl07CisJdW5zaWduZWQgaW50IGksIGJpdG5yOwogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKLQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHQgc2V0dGluZ3MgKi8KLQltYWNiX21kaW9fd3JpdGUoZGV2LCBicC0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKLQkJCUFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX0FMTCk7Ci0JbWFjYl9tZGlvX3dyaXRlKGRldiwgYnAtPm1paS5waHlfaWQsIE1JSV9CTUNSLAotCQkJKEJNQ1JfU1BFRUQxMDAgfCBCTUNSX0FORU5BQkxFCi0JCQkgfCBCTUNSX0FOUkVTVEFSVCB8IEJNQ1JfRlVMTERQTFgpKTsKKwltY19maWx0ZXJbMF0gPSBtY19maWx0ZXJbMV0gPSAwOworCisJY3VyciA9IGRldi0+bWNfbGlzdDsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBjdXJyID0gY3Vyci0+bmV4dCkgeworCQlpZiAoIWN1cnIpIGJyZWFrOwkvKiB1bmV4cGVjdGVkIGVuZCBvZiBsaXN0ICovCisKKwkJYml0bnIgPSBoYXNoX2dldF9pbmRleChjdXJyLT5kbWlfYWRkcik7CisJCW1jX2ZpbHRlcltiaXRuciA+PiA1XSB8PSAxIDw8IChiaXRuciAmIDMxKTsKKwl9CisKKwltYWNiX3dyaXRlbChicCwgSFJCLCBtY19maWx0ZXJbMF0pOworCW1hY2Jfd3JpdGVsKGJwLCBIUlQsIG1jX2ZpbHRlclsxXSk7Cit9CisKKy8qCisgKiBFbmFibGUvRGlzYWJsZSBwcm9taXNjdW91cyBhbmQgbXVsdGljYXN0IG1vZGVzLgorICovCitzdGF0aWMgdm9pZCBtYWNiX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBjZmc7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNmZyA9IG1hY2JfcmVhZGwoYnAsIE5DRkdSKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCWNmZyB8PSBNQUNCX0JJVChDQUYpOworCWVsc2UgaWYgKGRldi0+ZmxhZ3MgJiAofklGRl9QUk9NSVNDKSkKKwkJIC8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQljZmcgJj0gfk1BQ0JfQklUKENBRik7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBFbmFibGUgYWxsIG11bHRpY2FzdCBtb2RlICovCisJCW1hY2Jfd3JpdGVsKGJwLCBIUkIsIC0xKTsKKwkJbWFjYl93cml0ZWwoYnAsIEhSVCwgLTEpOworCQljZmcgfD0gTUFDQl9CSVQoTkNGR1JfTVRJKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCS8qIEVuYWJsZSBzcGVjaWZpYyBtdWx0aWNhc3RzICovCisJCW1hY2Jfc2V0aGFzaHRhYmxlKGRldik7CisJCWNmZyB8PSBNQUNCX0JJVChOQ0ZHUl9NVEkpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmICh+SUZGX0FMTE1VTFRJKSkgeworCQkvKiBEaXNhYmxlIGFsbCBtdWx0aWNhc3QgbW9kZSAqLworCQltYWNiX3dyaXRlbChicCwgSFJCLCAwKTsKKwkJbWFjYl93cml0ZWwoYnAsIEhSVCwgMCk7CisJCWNmZyAmPSB+TUFDQl9CSVQoTkNGR1JfTVRJKTsKKwl9CisKKwltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNmZyk7CiB9CiAKIHN0YXRpYyBpbnQgbWFjYl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03OTcsNiArOTIyLDEwIEBACiAKIAlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAib3BlblxuIik7CiAKKwkvKiBpZiB0aGUgcGh5IGlzIG5vdCB5ZXQgcmVnaXN0ZXIsIHJldHJ5IGxhdGVyKi8KKwlpZiAoIWJwLT5waHlfZGV2KQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCkBAIC04MTAsMTMgKzkzOSwxMiBAQAogCiAJbWFjYl9pbml0X3JpbmdzKGJwKTsKIAltYWNiX2luaXRfaHcoYnApOwotCW1hY2JfaW5pdF9waHkoZGV2KTsKIAotCW1hY2JfY2hlY2tfbWVkaWEoYnAsIDEsIDEpOworCS8qIHNjaGVkdWxlIGEgbGluayBzdGF0ZSBjaGVjayAqLworCXBoeV9zdGFydChicC0+cGh5X2Rldik7CisKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kaWNfdGFzaywgSFopOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyNSwxMCArOTUzLDExIEBACiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmYnAtPnBlcmlvZGljX3Rhc2spOwotCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCisJaWYgKGJwLT5waHlfZGV2KQorCQlwaHlfc3RvcChicC0+cGh5X2Rldik7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAltYWNiX3Jlc2V0X2h3KGJwKTsKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwpAQCAtODQ1LDYgKzk3NCw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0ID0gJmJwLT5zdGF0czsKIAlzdHJ1Y3QgbWFjYl9zdGF0cyAqaHdzdGF0ID0gJmJwLT5od19zdGF0czsKIAorCS8qIHJlYWQgc3RhdHMgZnJvbSBoYXJkd2FyZSAqLworCW1hY2JfdXBkYXRlX3N0YXRzKGJwKTsKKwogCS8qIENvbnZlcnQgSFcgc3RhdHMgaW50byBuZXRkZXZpY2Ugc3RhdHMgKi8KIAluc3RhdC0+cnhfZXJyb3JzID0gKGh3c3RhdC0+cnhfZmNzX2Vycm9ycyArCiAJCQkgICAgaHdzdGF0LT5yeF9hbGlnbl9lcnJvcnMgKwpAQCAtODgyLDE4ICsxMDE0LDI3IEBACiBzdGF0aWMgaW50IG1hY2JfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCi0JcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJmJwLT5taWksIGNtZCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocGh5ZGV2LCBjbWQpOwogfQogCiBzdGF0aWMgaW50IG1hY2Jfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCi0JcmV0dXJuIG1paV9ldGh0b29sX3NzZXQoJmJwLT5taWksIGNtZCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBjbWQpOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCitzdGF0aWMgdm9pZCBtYWNiX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtOTAyLDEwNCArMTA0MywzNCBAQAogCXN0cmNweShpbmZvLT5idXNfaW5mbywgYnAtPnBkZXYtPmRldi5idXNfaWQpOwogfQogCi1zdGF0aWMgaW50IG1hY2JfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmJwLT5taWkpOwotfQotCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG1hY2JfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkJPSBtYWNiX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzCQk9IG1hY2Jfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBtYWNiX2dldF9kcnZpbmZvLAotCS5ud2F5X3Jlc2V0CQk9IG1hY2JfbndheV9yZXNldCwKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIH07CiAKIHN0YXRpYyBpbnQgbWFjYl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZicC0+bWlpLCBpZl9taWkocnEpLCBjbWQsIE5VTEwpOworCWlmICghcGh5ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgaWZfbWlpKHJxKSwgY21kKTsKIH0KIAotc3RhdGljIHNzaXplX3QgbWFjYl9taWlfc2hvdyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpfZGV2LCBjaGFyICpidWYsCi0JCQl1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoX2Rldik7Ci0Jc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzc2l6ZV90IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCWludCB2YWx1ZTsKLQkJdmFsdWUgPSBtYWNiX21kaW9fcmVhZChkZXYsIGJwLT5taWkucGh5X2lkLCBhZGRyKTsKLQkJcmV0ID0gc3ByaW50ZihidWYsICIweCUwNHhcbiIsICh1aW50MTZfdCl2YWx1ZSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBNSUlfRU5UUlkobmFtZSwgYWRkcikJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKl9kZXYsCQkJXAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCSAgIGNoYXIgKmJ1ZikJCQkJXAotewkJCQkJCQkJXAotCXJldHVybiBtYWNiX21paV9zaG93KF9kZXYsIGJ1ZiwgYWRkcik7CQkJXAotfQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQotCi1NSUlfRU5UUlkoYm1jciwgTUlJX0JNQ1IpOwotTUlJX0VOVFJZKGJtc3IsIE1JSV9CTVNSKTsKLU1JSV9FTlRSWShwaHlzaWQxLCBNSUlfUEhZU0lEMSk7Ci1NSUlfRU5UUlkocGh5c2lkMiwgTUlJX1BIWVNJRDIpOwotTUlJX0VOVFJZKGFkdmVydGlzZSwgTUlJX0FEVkVSVElTRSk7Ci1NSUlfRU5UUlkobHBhLCBNSUlfTFBBKTsKLU1JSV9FTlRSWShleHBhbnNpb24sIE1JSV9FWFBBTlNJT04pOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWFjYl9taWlfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfYm1jci5hdHRyLAotCSZkZXZfYXR0cl9ibXNyLmF0dHIsCi0JJmRldl9hdHRyX3BoeXNpZDEuYXR0ciwKLQkmZGV2X2F0dHJfcGh5c2lkMi5hdHRyLAotCSZkZXZfYXR0cl9hZHZlcnRpc2UuYXR0ciwKLQkmZGV2X2F0dHJfbHBhLmF0dHIsCi0JJmRldl9hdHRyX2V4cGFuc2lvbi5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYWNiX21paV9ncm91cCA9IHsKLQkubmFtZQk9ICJtaWkiLAotCS5hdHRycwk9IG1hY2JfbWlpX2F0dHJzLAotfTsKLQotc3RhdGljIHZvaWQgbWFjYl91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IGRldmljZSAqX2RldiA9ICZuZXQtPmRldjsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmX2Rldi0+a29iaiwgJm1hY2JfbWlpX2dyb3VwKTsKLX0KLQotc3RhdGljIGludCBtYWNiX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IGRldmljZSAqX2RldiA9ICZuZXQtPmRldjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZfZGV2LT5rb2JqLCAmbWFjYl9taWlfZ3JvdXApOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlczogc3lzZnMgbWlpIGF0dHJpYnV0ZSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIG5ldC0+bmFtZSwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQogc3RhdGljIGludCBfX2RldmluaXQgbWFjYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZWdzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG1hY2IgKmJwOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJdW5zaWduZWQgbG9uZyBwY2xrX2h6OwogCXUzMiBjb25maWc7CiAJaW50IGVyciA9IC1FTlhJTzsKQEAgLTEwNzMsNiArMTE0NCw3IEBACiAJZGV2LT5zdG9wID0gbWFjYl9jbG9zZTsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG1hY2Jfc3RhcnRfeG1pdDsKIAlkZXYtPmdldF9zdGF0cyA9IG1hY2JfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbWFjYl9zZXRfcnhfbW9kZTsKIAlkZXYtPmRvX2lvY3RsID0gbWFjYl9pb2N0bDsKIAlkZXYtPnBvbGwgPSBtYWNiX3BvbGw7CiAJZGV2LT53ZWlnaHQgPSA2NDsKQEAgLTEwODAsMTAgKzExNTIsNiBAQAogCiAJZGV2LT5iYXNlX2FkZHIgPSByZWdzLT5zdGFydDsKIAotCUlOSVRfREVMQVlFRF9XT1JLKCZicC0+cGVyaW9kaWNfdGFzaywgbWFjYl9wZXJpb2RpY190YXNrKTsKLQltdXRleF9pbml0KCZicC0+bWRpb19tdXRleCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7Ci0KIAkvKiBTZXQgTUlJIG1hbmFnZW1lbnQgY2xvY2sgZGl2aWRlciAqLwogCXBjbGtfaHogPSBjbGtfZ2V0X3JhdGUoYnAtPnBjbGspOwogCWlmIChwY2xrX2h6IDw9IDIwMDAwMDAwKQpAQCAtMTA5NiwyMCArMTE2NCw5IEBACiAJCWNvbmZpZyA9IE1BQ0JfQkYoQ0xLLCBNQUNCX0NMS19ESVY2NCk7CiAJbWFjYl93cml0ZWwoYnAsIE5DRkdSLCBjb25maWcpOwogCi0JYnAtPm1paS5kZXYgPSBkZXY7Ci0JYnAtPm1paS5tZGlvX3JlYWQgPSBtYWNiX21kaW9fcmVhZDsKLQlicC0+bWlpLm1kaW9fd3JpdGUgPSBtYWNiX21kaW9fd3JpdGU7Ci0JYnAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7Ci0JYnAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOwotCiAJbWFjYl9nZXRfaHdhZGRyKGJwKTsKLQllcnIgPSBtYWNiX3BoeV9wcm9iZShicCk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZGV0ZWN0IFBIWSwgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfaXJxOwotCX0KLQogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQogCQltYWNiX3dyaXRlbChicCwgVVNSSU8sIChNQUNCX0JJVChSTUlJKSB8IE1BQ0JfQklUKENMS0VOKSkgKTsKQEAgLTExMzEsOSArMTE4OCwxMSBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlpZiAobWFjYl9taWlfaW5pdChicCkgIT0gMCkgeworCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY7CisJfQogCi0JbWFjYl9yZWdpc3Rlcl9zeXNmcyhkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogQXRtZWwgTUFDQiBhdCAweCUwOGx4IGlycSAlZCAiCiAJICAgICAgICIoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLApAQCAtMTE0MSw4ICsxMjAwLDE1IEBACiAJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCiAJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOwogCisJcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF0dGFjaGVkIFBIWSBkcml2ZXIgWyVzXSAiCisJCSIobWlpX2J1czpwaHlfYWRkcj0lcywgaXJxPSVkKVxuIiwKKwkJZGV2LT5uYW1lLCBwaHlkZXYtPmRydi0+bmFtZSwgcGh5ZGV2LT5kZXYuYnVzX2lkLCBwaHlkZXYtPmlycSk7CisKIAlyZXR1cm4gMDsKIAorZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjoKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogZXJyX291dF9mcmVlX2lycToKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIGVycl9vdXRfaW91bm1hcDoKQEAgLTExNTMsNyArMTIxOSw5IEBACiAJY2xrX3B1dChicC0+aGNsayk7CiAjZW5kaWYKIAljbGtfZGlzYWJsZShicC0+cGNsayk7CisjaWZuZGVmIENPTkZJR19BUkNIX0FUOTEKIGVycl9vdXRfcHV0X3BjbGs6CisjZW5kaWYKIAljbGtfcHV0KGJwLT5wY2xrKTsKIGVycl9vdXRfZnJlZV9kZXY6CiAJZnJlZV9uZXRkZXYoZGV2KTsKQEAgLTExNzEsNyArMTIzOSw4IEBACiAKIAlpZiAoZGV2KSB7CiAJCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkJbWFjYl91bnJlZ2lzdGVyX3N5c2ZzKGRldik7CisJCW1kaW9idXNfdW5yZWdpc3RlcigmYnAtPm1paV9idXMpOworCQlrZnJlZShicC0+bWlpX2J1cy5pcnEpOwogCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJaW91bm1hcChicC0+cmVncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmggYi9kcml2ZXJzL25ldC9tYWNiLmgKaW5kZXggYjNiYjIxOC4uNGUzMjgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjYi5oCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuaApAQCAtMzgzLDExICszODMsMTEgQEAKIAogCXVuc2lnbmVkIGludAkJcnhfcGVuZGluZywgdHhfcGVuZGluZzsKIAotCXN0cnVjdCBkZWxheWVkX3dvcmsJcGVyaW9kaWNfdGFzazsKLQotCXN0cnVjdCBtdXRleAkJbWRpb19tdXRleDsKLQlzdHJ1Y3QgY29tcGxldGlvbgltZGlvX2NvbXBsZXRlOwotCXN0cnVjdCBtaWlfaWZfaW5mbwltaWk7CisJc3RydWN0IG1paV9idXMJCW1paV9idXM7CisJc3RydWN0IHBoeV9kZXZpY2UJKnBoeV9kZXY7CisJdW5zaWduZWQgaW50IAkJbGluazsKKwl1bnNpZ25lZCBpbnQgCQlzcGVlZDsKKwl1bnNpZ25lZCBpbnQgCQlkdXBsZXg7CiB9OwogCiAjZW5kaWYgLyogX01BQ0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggZTE3MzJjMS4uZGVjYTY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC0xMDYwLDcgKzEwNjAsNiBAQAogCXN0cnVjdCBteXJpMTBnZV90eF9idWYgKnR4ID0gJm1ncC0+dHg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaWR4LCBsZW47Ci0JaW50IGxpbWl0ID0gMDsKIAogCXdoaWxlICh0eC0+cGt0X2RvbmUgIT0gbWNwX2luZGV4KSB7CiAJCWlkeCA9IHR4LT5kb25lICYgdHgtPm1hc2s7CkBAIC0xMDkxLDExICsxMDkwLDYgQEAKIAkJCQkJCQkgICAgICBidXMpLCBsZW4sCiAJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJfQotCi0JCS8qIGxpbWl0IHBvdGVudGlhbCBmb3IgbGl2ZWxvY2sgYnkgb25seSBoYW5kbGluZwotCQkgKiAyIGZ1bGwgdHggcmluZ3MgcGVyIGNhbGwgKi8KLQkJaWYgKHVubGlrZWx5KCsrbGltaXQgPiAyICogdHgtPm1hc2spKQotCQkJYnJlYWs7CiAJfQogCS8qIHN0YXJ0IHRoZSBxdWV1ZSBpZiB3ZSd2ZSBzdG9wcGVkIGl0ICovCiAJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobWdwLT5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggNThiYmZkZC4uYWZlZjZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtNzk2LDEyICs3OTYsMTQgQEAKIAlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgcGFnZV9udW0gPSAwOwogCiAJaWYgKCFuaWMpCiAJCXJldHVybjsKIAorCWRldiA9IG5pYy0+ZGV2OworCiAJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKIAljb25maWcgPSAmbmljLT5jb25maWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnZuZXQuYyBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY2N2MxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5jCkBAIC0wLDAgKzEsMTE2NCBAQAorLyogc3Vudm5ldC5jOiBTdW4gTERPTSBWaXJ0dWFsIE5ldHdvcmsgRHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KKworI2luY2x1ZGUgInN1bnZuZXQuaCIKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJzdW52bmV0IgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuZSAyNSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gTERPTSB2aXJ0dWFsIG5ldHdvcmsgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCisvKiBPcmRlcmVkIGZyb20gbGFyZ2VzdCBtYWpvciB0byBsb3dlc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlvX3ZlcnNpb24gdm5ldF92ZXJzaW9uc1tdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworc3RhdGljIGlubGluZSB1MzIgdm5ldF90eF9kcmluZ19hdmFpbChzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlyZXR1cm4gdmlvX2RyaW5nX2F2YWlsKGRyLCBWTkVUX1RYX1JJTkdfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9oYW5kbGVfdW5rbm93bihzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICpwa3QgPSBhcmc7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSZWNlaXZlZCB1bmtub3duIG1zZyBbJTAyeDolMDJ4OiUwNHg6JTA4eF1cbiIsCisJICAgICAgIHBrdC0+dHlwZSwgcGt0LT5zdHlwZSwgcGt0LT5zdHlwZV9lbnYsIHBrdC0+c2lkKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSZXNldHRpbmcgY29ubmVjdGlvbi5cbiIpOworCisJbGRjX2Rpc2Nvbm5lY3QocG9ydC0+dmlvLmxwKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCB2bmV0X3NlbmRfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQgPSB0b192bmV0X3BvcnQodmlvKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+dnAtPmRldjsKKwlzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gcGt0OworCWludCBpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QudGFnLnR5cGUgPSBWSU9fVFlQRV9DVFJMOworCXBrdC50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9JTkZPOworCXBrdC50YWcuc3R5cGVfZW52ID0gVklPX0FUVFJfSU5GTzsKKwlwa3QudGFnLnNpZCA9IHZpb19zZW5kX3NpZCh2aW8pOworCXBrdC54ZmVyX21vZGUgPSBWSU9fRFJJTkdfTU9ERTsKKwlwa3QuYWRkcl90eXBlID0gVk5FVF9BRERSX0VUSEVSTUFDOworCXBrdC5hY2tfZnJlcSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcGt0LmFkZHIgfD0gKHU2NClkZXYtPmRldl9hZGRyW2ldIDw8ICgoNSAtIGkpICogOCk7CisJcGt0Lm10dSA9IEVUSF9GUkFNRV9MRU47CisKKwl2aW9kYmcoSFMsICJTRU5EIE5FVCBBVFRSIHhtb2RlWzB4JXhdIGF0eXBlWzB4JXhdIGFkZHJbJWxseF0gIgorCSAgICAgICAiYWNrZnJlcVsldV0gbXR1WyVsbHVdXG4iLAorCSAgICAgICBwa3QueGZlcl9tb2RlLCBwa3QuYWRkcl90eXBlLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QuYWRkciwKKwkgICAgICAgcGt0LmFja19mcmVxLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QubXR1KTsKKworCXJldHVybiB2aW9fbGRjX3NlbmQodmlvLCAmcGt0LCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2F0dHJfaW5mbyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgIHN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBORVQgQVRUUiBJTkZPIHhtb2RlWzB4JXhdIGF0eXBlWzB4JXhdIGFkZHJbJWxseF0gIgorCSAgICAgICAiYWNrZnJlcVsldV0gbXR1WyVsbHVdXG4iLAorCSAgICAgICBwa3QtPnhmZXJfbW9kZSwgcGt0LT5hZGRyX3R5cGUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+YWRkciwKKwkgICAgICAgcGt0LT5hY2tfZnJlcSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5tdHUpOworCisJcGt0LT50YWcuc2lkID0gdmlvX3NlbmRfc2lkKHZpbyk7CisKKwlpZiAocGt0LT54ZmVyX21vZGUgIT0gVklPX0RSSU5HX01PREUgfHwKKwkgICAgcGt0LT5hZGRyX3R5cGUgIT0gVk5FVF9BRERSX0VUSEVSTUFDIHx8CisJICAgIHBrdC0+bXR1ICE9IEVUSF9GUkFNRV9MRU4pIHsKKwkJdmlvZGJnKEhTLCAiU0VORCBORVQgQVRUUiBOQUNLXG4iKTsKKworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisKKwkJKHZvaWQpIHZpb19sZGNfc2VuZCh2aW8sIHBrdCwgc2l6ZW9mKCpwa3QpKTsKKworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfSBlbHNlIHsKKwkJdmlvZGJnKEhTLCAiU0VORCBORVQgQVRUUiBBQ0tcbiIpOworCisJCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfQUNLOworCisJCXJldHVybiB2aW9fbGRjX3NlbmQodmlvLCBwa3QsIHNpemVvZigqcGt0KSk7CisJfQorCit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2F0dHJfYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICBzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgTkVUIEFUVFIgQUNLXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9hdHRyX25hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgTkVUIEFUVFIgTkFDS1xuIik7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9oYW5kbGVfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvICpwa3QgPSBhcmc7CisKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gaGFuZGxlX2F0dHJfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIGhhbmRsZV9hdHRyX2Fjayh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX05BQ0s6CisJCXJldHVybiBoYW5kbGVfYXR0cl9uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUNPTk5SRVNFVDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfaGFuZHNoYWtlX2NvbXBsZXRlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCWRyLT5zbmRfbnh0ID0gZHItPnJjdl9ueHQgPSAxOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlkci0+c25kX254dCA9IGRyLT5yY3Zfbnh0ID0gMTsKK30KKworLyogVGhlIGh5cGVydmlzb3IgaW50ZXJmYWNlIHRoYXQgaW1wbGVtZW50cyBjb3B5aW5nIHRvL2Zyb20gaW1wb3J0ZWQKKyAqIG1lbW9yeSBmcm9tIGFub3RoZXIgZG9tYWluIHJlcXVpcmVzIHRoYXQgY29waWVzIGFyZSBkb25lIHRvIDgtYnl0ZQorICogYWxpZ25lZCBidWZmZXJzLCBhbmQgdGhhdCB0aGUgbGVuZ3RocyBvZiBzdWNoIGNvcGllcyBhcmUgYWxzbyA4LWJ5dGUKKyAqIG11bHRpcGxlcy4KKyAqCisgKiBTbyB3ZSBhbGlnbiBza2ItPmRhdGEgdG8gYW4gOC1ieXRlIG11bHRpcGxlIGFuZCBwYWQtb3V0IHRoZSBkYXRhCisgKiBhcmVhIHNvIHdlIGNhbiByb3VuZCB0aGUgY29weSBsZW5ndGggdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YKKyAqIDggZm9yIHRoZSBjb3B5LgorICoKKyAqIFRoZSB0cmFuc21pdHRlciBwdXRzIHRoZSBhY3R1YWwgc3RhcnQgb2YgdGhlIHBhY2tldCA2IGJ5dGVzIGludG8KKyAqIHRoZSBidWZmZXIgaXQgc2VuZHMgb3Zlciwgc28gdGhhdCB0aGUgSVAgaGVhZGVycyBhZnRlciB0aGUgZXRoZXJuZXQKKyAqIGhlYWRlciBhcmUgYWxpZ25lZCBwcm9wZXJseS4gIFRoZXNlIDYgYnl0ZXMgYXJlIG5vdCBpbiB0aGUgZGVzY3JpcHRvcgorICogbGVuZ3RoLCB0aGV5IGFyZSBzaW1wbHkgaW1wbGllZC4gIFRoaXMgb2Zmc2V0IGlzIHJlcHJlc2VudGVkIHVzaW5nCisgKiB0aGUgVk5FVF9QQUNLRVRfU0tJUCBtYWNyby4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICphbGxvY19hbmRfYWxpZ25fc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBsZW4rVk5FVF9QQUNLRVRfU0tJUCs4KzgpOworCXVuc2lnbmVkIGxvbmcgYWRkciwgb2ZmOworCisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm4gTlVMTDsKKworCWFkZHIgPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhOworCW9mZiA9ICgoYWRkciArIDdVTCkgJiB+N1VMKSAtIGFkZHI7CisJaWYgKG9mZikKKwkJc2tiX3Jlc2VydmUoc2tiLCBvZmYpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCB2bmV0X3J4X29uZShzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+dnAtPmRldjsKKwl1bnNpZ25lZCBpbnQgY29weV9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJZXJyID0gLUVNU0dTSVpFOworCWlmICh1bmxpa2VseShsZW4gPCBFVEhfWkxFTiB8fCBsZW4gPiBFVEhfRlJBTUVfTEVOKSkgeworCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJZ290byBvdXRfZHJvcHBlZDsKKwl9CisKKwlza2IgPSBhbGxvY19hbmRfYWxpZ25fc2tiKGRldiwgbGVuKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJZ290byBvdXRfZHJvcHBlZDsKKwl9CisKKwljb3B5X2xlbiA9IChsZW4gKyBWTkVUX1BBQ0tFVF9TS0lQICsgN1UpICYgfjdVOworCXNrYl9wdXQoc2tiLCBjb3B5X2xlbik7CisJZXJyID0gbGRjX2NvcHkocG9ydC0+dmlvLmxwLCBMRENfQ09QWV9JTiwKKwkJICAgICAgIHNrYi0+ZGF0YSwgY29weV9sZW4sIDAsCisJCSAgICAgICBjb29raWVzLCBuY29va2llcyk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWdvdG8gb3V0X2ZyZWVfc2tiOworCX0KKworCXNrYl9wdWxsKHNrYiwgVk5FVF9QQUNLRVRfU0tJUCk7CisJc2tiX3RyaW0oc2tiLCBsZW4pOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCW5ldGlmX3J4KHNrYik7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfc2tiOgorCWtmcmVlX3NrYihza2IpOworCitvdXRfZHJvcHBlZDoKKwlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZuZXRfc2VuZF9hY2soc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkgdTMyIHN0YXJ0LCB1MzIgZW5kLCB1OCB2aW9fZHJpbmdfc3RhdGUpCit7CisJc3RydWN0IHZpb19kcmluZ19kYXRhIGhkciA9IHsKKwkJLnRhZyA9IHsKKwkJCS50eXBlCQk9IFZJT19UWVBFX0RBVEEsCisJCQkuc3R5cGUJCT0gVklPX1NVQlRZUEVfQUNLLAorCQkJLnN0eXBlX2Vudgk9IFZJT19EUklOR19EQVRBLAorCQkJLnNpZAkJPSB2aW9fc2VuZF9zaWQoJnBvcnQtPnZpbyksCisJCX0sCisJCS5kcmluZ19pZGVudAkJPSBkci0+aWRlbnQsCisJCS5zdGFydF9pZHgJCT0gc3RhcnQsCisJCS5lbmRfaWR4CQk9IGVuZCwKKwkJLnN0YXRlCQkJPSB2aW9fZHJpbmdfc3RhdGUsCisJfTsKKwlpbnQgZXJyLCBkZWxheTsKKworCWhkci5zZXEgPSBkci0+c25kX254dDsKKwlkZWxheSA9IDE7CisJZG8geworCQllcnIgPSB2aW9fbGRjX3NlbmQoJnBvcnQtPnZpbywgJmhkciwgc2l6ZW9mKGhkcikpOworCQlpZiAoZXJyID4gMCkgeworCQkJZHItPnNuZF9ueHQrKzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheShkZWxheSk7CisJCWlmICgoZGVsYXkgPDw9IDEpID4gMTI4KQorCQkJZGVsYXkgPSAxMjg7CisJfSB3aGlsZSAoZXJyID09IC1FQUdBSU4pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHUzMiBuZXh0X2lkeCh1MzIgaWR4LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlpZiAoKytpZHggPT0gZHItPm51bV9lbnRyaWVzKQorCQlpZHggPSAwOworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB1MzIgcHJldl9pZHgodTMyIGlkeCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIpCit7CisJaWYgKGlkeCA9PSAwKQorCQlpZHggPSBkci0+bnVtX2VudHJpZXMgLSAxOworCWVsc2UKKwkJaWR4LS07CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgc3RydWN0IHZpb19uZXRfZGVzYyAqZ2V0X3J4X2Rlc2Moc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwKKwkJCQkJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkJCXUzMiBpbmRleCkKK3sKKwlzdHJ1Y3QgdmlvX25ldF9kZXNjICpkZXNjID0gcG9ydC0+dmlvLmRlc2NfYnVmOworCWludCBlcnI7CisKKwllcnIgPSBsZGNfZ2V0X2RyaW5nX2VudHJ5KHBvcnQtPnZpby5scCwgZGVzYywgZHItPmVudHJ5X3NpemUsCisJCQkJICAoaW5kZXggKiBkci0+ZW50cnlfc2l6ZSksCisJCQkJICBkci0+Y29va2llcywgZHItPm5jb29raWVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCXJldHVybiBkZXNjOworfQorCitzdGF0aWMgaW50IHB1dF9yeF9kZXNjKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsCisJCSAgICAgICBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJICAgICAgIHN0cnVjdCB2aW9fbmV0X2Rlc2MgKmRlc2MsCisJCSAgICAgICB1MzIgaW5kZXgpCit7CisJaW50IGVycjsKKworCWVyciA9IGxkY19wdXRfZHJpbmdfZW50cnkocG9ydC0+dmlvLmxwLCBkZXNjLCBkci0+ZW50cnlfc2l6ZSwKKwkJCQkgIChpbmRleCAqIGRyLT5lbnRyeV9zaXplKSwKKwkJCQkgIGRyLT5jb29raWVzLCBkci0+bmNvb2tpZXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF93YWxrX3J4X29uZShzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LAorCQkJICAgIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJICAgIHUzMiBpbmRleCwgaW50ICpuZWVkc19hY2spCit7CisJc3RydWN0IHZpb19uZXRfZGVzYyAqZGVzYyA9IGdldF9yeF9kZXNjKHBvcnQsIGRyLCBpbmRleCk7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisJaW50IGVycjsKKworCWlmIChJU19FUlIoZGVzYykpCisJCXJldHVybiBQVFJfRVJSKGRlc2MpOworCisJdmlvZGJnKERBVEEsICJ2aW9fd2Fsa19yeF9vbmUgZGVzY1slMDJ4OiUwMng6JTA4eDolMDh4OiVseDolbHhdXG4iLAorCSAgICAgICBkZXNjLT5oZHIuc3RhdGUsIGRlc2MtPmhkci5hY2ssCisJICAgICAgIGRlc2MtPnNpemUsIGRlc2MtPm5jb29raWVzLAorCSAgICAgICBkZXNjLT5jb29raWVzWzBdLmNvb2tpZV9hZGRyLAorCSAgICAgICBkZXNjLT5jb29raWVzWzBdLmNvb2tpZV9zaXplKTsKKworCWlmIChkZXNjLT5oZHIuc3RhdGUgIT0gVklPX0RFU0NfUkVBRFkpCisJCXJldHVybiAxOworCWVyciA9IHZuZXRfcnhfb25lKHBvcnQsIGRlc2MtPnNpemUsIGRlc2MtPmNvb2tpZXMsIGRlc2MtPm5jb29raWVzKTsKKwlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQlyZXR1cm4gZXJyOworCWRlc2MtPmhkci5zdGF0ZSA9IFZJT19ERVNDX0RPTkU7CisJZXJyID0gcHV0X3J4X2Rlc2MocG9ydCwgZHIsIGRlc2MsIGluZGV4KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkqbmVlZHNfYWNrID0gZGVzYy0+aGRyLmFjazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X3dhbGtfcngoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQl1MzIgc3RhcnQsIHUzMiBlbmQpCit7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisJaW50IGFja19zdGFydCA9IC0xLCBhY2tfZW5kID0gLTE7CisKKwllbmQgPSAoZW5kID09ICh1MzIpIC0xKSA/IHByZXZfaWR4KHN0YXJ0LCBkcikgOiBuZXh0X2lkeChlbmQsIGRyKTsKKworCXZpb2RiZyhEQVRBLCAidm5ldF93YWxrX3J4IHN0YXJ0WyUwOHhdIGVuZFslMDh4XVxuIiwgc3RhcnQsIGVuZCk7CisKKwl3aGlsZSAoc3RhcnQgIT0gZW5kKSB7CisJCWludCBhY2sgPSAwLCBlcnIgPSB2bmV0X3dhbGtfcnhfb25lKHBvcnQsIGRyLCBzdGFydCwgJmFjayk7CisJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoZXJyICE9IDApCisJCQlicmVhazsKKwkJaWYgKGFja19zdGFydCA9PSAtMSkKKwkJCWFja19zdGFydCA9IHN0YXJ0OworCQlhY2tfZW5kID0gc3RhcnQ7CisJCXN0YXJ0ID0gbmV4dF9pZHgoc3RhcnQsIGRyKTsKKwkJaWYgKGFjayAmJiBzdGFydCAhPSBlbmQpIHsKKwkJCWVyciA9IHZuZXRfc2VuZF9hY2socG9ydCwgZHIsIGFja19zdGFydCwgYWNrX2VuZCwKKwkJCQkJICAgIFZJT19EUklOR19BQ1RJVkUpOworCQkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCQlyZXR1cm4gZXJyOworCQkJYWNrX3N0YXJ0ID0gLTE7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KGFja19zdGFydCA9PSAtMSkpCisJCWFja19zdGFydCA9IGFja19lbmQgPSBwcmV2X2lkeChzdGFydCwgZHIpOworCXJldHVybiB2bmV0X3NlbmRfYWNrKHBvcnQsIGRyLCBhY2tfc3RhcnQsIGFja19lbmQsIFZJT19EUklOR19TVE9QUEVEKTsKK30KKworc3RhdGljIGludCB2bmV0X3J4KHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHZvaWQgKm1zZ2J1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgKnBrdCA9IG1zZ2J1ZjsKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisKKwl2aW9kYmcoREFUQSwgInZuZXRfcnggc3R5cGVfZW52WyUwNHhdIHNlcVslMDE2bHhdIHJjdl9ueHRbJTAxNmx4XVxuIiwKKwkgICAgICAgcGt0LT50YWcuc3R5cGVfZW52LCBwa3QtPnNlcSwgZHItPnJjdl9ueHQpOworCisJaWYgKHVubGlrZWx5KHBrdC0+dGFnLnN0eXBlX2VudiAhPSBWSU9fRFJJTkdfREFUQSkpCisJCXJldHVybiAwOworCWlmICh1bmxpa2VseShwa3QtPnNlcSAhPSBkci0+cmN2X254dCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUlggb3V0IG9mIHNlcXVlbmNlIHNlcVsweCVseF0gIgorCQkgICAgICAgInJjdl9ueHRbMHglbHhdXG4iLCBwa3QtPnNlcSwgZHItPnJjdl9ueHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkci0+cmN2X254dCsrOworCisJLyogWFhYIFZhbGlkYXRlIHBrdC0+c3RhcnRfaWR4IGFuZCBwa3QtPmVuZF9pZHggWFhYICovCisKKwlyZXR1cm4gdm5ldF93YWxrX3J4KHBvcnQsIGRyLCBwa3QtPnN0YXJ0X2lkeCwgcGt0LT5lbmRfaWR4KTsKK30KKworc3RhdGljIGludCBpZHhfaXNfcGVuZGluZyhzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwgdTMyIGVuZCkKK3sKKwl1MzIgaWR4ID0gZHItPmNvbnM7CisJaW50IGZvdW5kID0gMDsKKworCXdoaWxlIChpZHggIT0gZHItPnByb2QpIHsKKwkJaWYgKGlkeCA9PSBlbmQpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlkeCA9IG5leHRfaWR4KGlkeCwgZHIpOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9hY2soc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgKnBrdCA9IG1zZ2J1ZjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB2bmV0ICp2cDsKKwl1MzIgZW5kOworCisJaWYgKHVubGlrZWx5KHBrdC0+dGFnLnN0eXBlX2VudiAhPSBWSU9fRFJJTkdfREFUQSkpCisJCXJldHVybiAwOworCisJZW5kID0gcGt0LT5lbmRfaWR4OworCWlmICh1bmxpa2VseSghaWR4X2lzX3BlbmRpbmcoZHIsIGVuZCkpKQorCQlyZXR1cm4gMDsKKworCWRyLT5jb25zID0gbmV4dF9pZHgoZW5kLCBkcik7CisKKwl2cCA9IHBvcnQtPnZwOworCWRldiA9IHZwLT5kZXY7CisJaWYgKHVubGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkgICAgIHZuZXRfdHhfZHJpbmdfYXZhaWwoZHIpID49IFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfbmFjayhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJLyogWFhYIGp1c3QgcmVzZXQgb3Igc2ltaWxhciBYWFggKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWF5YmVfdHhfd2FrZXVwKHN0cnVjdCB2bmV0ICp2cCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdnAtPmRldjsKKworCW5ldGlmX3R4X2xvY2soZGV2KTsKKwlpZiAobGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpIHsKKwkJc3RydWN0IHZuZXRfcG9ydCAqcG9ydDsKKwkJaW50IHdha2UgPSAxOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJnZwLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJCQlkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJCQlpZiAodm5ldF90eF9kcmluZ19hdmFpbChkcikgPAorCQkJICAgIFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikpIHsKKwkJCQl3YWtlID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAod2FrZSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJbmV0aWZfdHhfdW5sb2NrKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfZXZlbnQodm9pZCAqYXJnLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0eF93YWtldXAsIGVycjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseShldmVudCA9PSBMRENfRVZFTlRfUkVTRVQgfHwKKwkJICAgICBldmVudCA9PSBMRENfRVZFTlRfVVApKSB7CisJCXZpb19saW5rX3N0YXRlX2NoYW5nZSh2aW8sIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVuZXhwZWN0ZWQgTERDIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJdHhfd2FrZXVwID0gZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgdmlvX21zZ190YWcgdGFnOworCQkJdTY0IHJhd1s4XTsKKwkJfSBtc2didWY7CisKKwkJZXJyID0gbGRjX3JlYWQodmlvLT5scCwgJm1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZikpOworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJdmlvX2Nvbm5fcmVzZXQodmlvKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlcnIgPT0gMCkKKwkJCWJyZWFrOworCQl2aW9kYmcoREFUQSwgIlRBRyBbJTAyeDolMDJ4OiUwNHg6JTA4eF1cbiIsCisJCSAgICAgICBtc2didWYudGFnLnR5cGUsCisJCSAgICAgICBtc2didWYudGFnLnN0eXBlLAorCQkgICAgICAgbXNnYnVmLnRhZy5zdHlwZV9lbnYsCisJCSAgICAgICBtc2didWYudGFnLnNpZCk7CisJCWVyciA9IHZpb192YWxpZGF0ZV9zaWQodmlvLCAmbXNnYnVmLnRhZyk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGxpa2VseShtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfREFUQSkpIHsKKwkJCWlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0lORk8pIHsKKwkJCQllcnIgPSB2bmV0X3J4KHBvcnQsICZtc2didWYpOworCQkJfSBlbHNlIGlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0FDSykgeworCQkJCWVyciA9IHZuZXRfYWNrKHBvcnQsICZtc2didWYpOworCQkJCWlmIChlcnIgPiAwKQorCQkJCQl0eF93YWtldXAgfD0gZXJyOworCQkJfSBlbHNlIGlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX05BQ0spIHsKKwkJCQllcnIgPSB2bmV0X25hY2socG9ydCwgJm1zZ2J1Zik7CisJCQl9CisJCX0gZWxzZSBpZiAobXNnYnVmLnRhZy50eXBlID09IFZJT19UWVBFX0NUUkwpIHsKKwkJCWVyciA9IHZpb19jb250cm9sX3BrdF9lbmdpbmUodmlvLCAmbXNnYnVmKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQllcnIgPSB2bmV0X2hhbmRsZV91bmtub3duKHBvcnQsICZtc2didWYpOworCQl9CisJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnZpby0+bG9jayk7CisJaWYgKHVubGlrZWx5KHR4X3dha2V1cCAmJiBlcnIgIT0gLUVDT05OUkVTRVQpKQorCQltYXliZV90eF93YWtldXAocG9ydC0+dnApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX3ZuZXRfdHhfdHJpZ2dlcihzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgaGRyID0geworCQkudGFnID0geworCQkJLnR5cGUJCT0gVklPX1RZUEVfREFUQSwKKwkJCS5zdHlwZQkJPSBWSU9fU1VCVFlQRV9JTkZPLAorCQkJLnN0eXBlX2Vudgk9IFZJT19EUklOR19EQVRBLAorCQkJLnNpZAkJPSB2aW9fc2VuZF9zaWQoJnBvcnQtPnZpbyksCisJCX0sCisJCS5kcmluZ19pZGVudAkJPSBkci0+aWRlbnQsCisJCS5zdGFydF9pZHgJCT0gZHItPnByb2QsCisJCS5lbmRfaWR4CQk9ICh1MzIpIC0xLAorCX07CisJaW50IGVyciwgZGVsYXk7CisKKwloZHIuc2VxID0gZHItPnNuZF9ueHQ7CisJZGVsYXkgPSAxOworCWRvIHsKKwkJZXJyID0gdmlvX2xkY19zZW5kKCZwb3J0LT52aW8sICZoZHIsIHNpemVvZihoZHIpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCWRyLT5zbmRfbnh0Kys7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoZGVsYXkpOworCQlpZiAoKGRlbGF5IDw8PSAxKSA+IDEyOCkKKwkJCWRlbGF5ID0gMTI4OworCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCB2bmV0X3BvcnQgKl9fdHhfcG9ydF9maW5kKHN0cnVjdCB2bmV0ICp2cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IHZuZXRfaGFzaGZuKHNrYi0+ZGF0YSk7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhwID0gJnZwLT5wb3J0X2hhc2hbaGFzaF07CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsIG4sIGhwLCBoYXNoKSB7CisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHBvcnQtPnJhZGRyLCBza2ItPmRhdGEpKQorCQkJcmV0dXJuIHBvcnQ7CisJfQorCXBvcnQgPSBOVUxMOworCWlmICghbGlzdF9lbXB0eSgmdnAtPnBvcnRfbGlzdCkpCisJCXBvcnQgPSBsaXN0X2VudHJ5KHZwLT5wb3J0X2xpc3QubmV4dCwgc3RydWN0IHZuZXRfcG9ydCwgbGlzdCk7CisKKwlyZXR1cm4gcG9ydDsKK30KKworc3RydWN0IHZuZXRfcG9ydCAqdHhfcG9ydF9maW5kKHN0cnVjdCB2bmV0ICp2cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCXJldCA9IF9fdHhfcG9ydF9maW5kKHZwLCBza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZuZXRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2bmV0ICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IHR4X3BvcnRfZmluZCh2cCwgc2tiKTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwlzdHJ1Y3QgdmlvX25ldF9kZXNjICpkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGxlbjsKKwl2b2lkICp0eF9idWY7CisJaW50IGksIGVycjsKKworCWlmICh1bmxpa2VseSghcG9ydCkpCisJCWdvdG8gb3V0X2Ryb3BwZWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlpZiAodW5saWtlbHkodm5ldF90eF9kcmluZ19hdmFpbChkcikgPCAyKSkgeworCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCQkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJVRyEgVHggUmluZyBmdWxsIHdoZW4gIgorCQkJICAgICAgICJxdWV1ZSBhd2FrZSFcbiIsIGRldi0+bmFtZSk7CisJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlkID0gdmlvX2RyaW5nX2N1cihkcik7CisKKwl0eF9idWYgPSBwb3J0LT50eF9idWZzW2RyLT5wcm9kXS5idWY7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHR4X2J1ZiArIFZORVRfUEFDS0VUX1NLSVAsIHNrYi0+bGVuKTsKKworCWxlbiA9IHNrYi0+bGVuOworCWlmIChsZW4gPCBFVEhfWkxFTikgeworCQlsZW4gPSBFVEhfWkxFTjsKKwkJbWVtc2V0KHR4X2J1ZitWTkVUX1BBQ0tFVF9TS0lQK3NrYi0+bGVuLCAwLCBsZW4gLSBza2ItPmxlbik7CisJfQorCisJZC0+aGRyLmFjayA9IFZJT19BQ0tfRU5BQkxFOworCWQtPnNpemUgPSBsZW47CisJZC0+bmNvb2tpZXMgPSBwb3J0LT50eF9idWZzW2RyLT5wcm9kXS5uY29va2llczsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+bmNvb2tpZXM7IGkrKykKKwkJZC0+Y29va2llc1tpXSA9IHBvcnQtPnR4X2J1ZnNbZHItPnByb2RdLmNvb2tpZXNbaV07CisKKwkvKiBUaGlzIGhhcyB0byBiZSBhIG5vbi1TTVAgd3JpdGUgYmFycmllciBiZWNhdXNlIHdlIGFyZSB3cml0aW5nCisJICogdG8gbWVtb3J5IHdoaWNoIGlzIHNoYXJlZCB3aXRoIHRoZSBwZWVyIExET00uCisJICovCisJd21iKCk7CisKKwlkLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19SRUFEWTsKKworCWVyciA9IF9fdm5ldF90eF90cmlnZ2VyKHBvcnQpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IFRYIHRyaWdnZXIgZXJyb3IgJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCWQtPmhkci5zdGF0ZSA9IFZJT19ERVNDX0ZSRUU7CisJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJZ290byBvdXRfZHJvcHBlZF91bmxvY2s7CisJfQorCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCWRyLT5wcm9kID0gKGRyLT5wcm9kICsgMSkgJiAoVk5FVF9UWF9SSU5HX1NJWkUgLSAxKTsKKwlpZiAodW5saWtlbHkodm5ldF90eF9kcmluZ19hdmFpbChkcikgPCAyKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWlmICh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA+IFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiBORVRERVZfVFhfT0s7CisKK291dF9kcm9wcGVkX3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCitvdXRfZHJvcHBlZDoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHZvaWQgdm5ldF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogWFhYIEltcGxlbWVudCBtZSBYWFggKi8KK30KKworc3RhdGljIGludCB2bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9jYXJyaWVyX29uKGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bmV0X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogWFhYIEltcGxlbWVudCBtdWx0aWNhc3Qgc3VwcG9ydCBYWFggKi8KK30KKworc3RhdGljIGludCB2bmV0X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgIT0gRVRIX0RBVEFfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCB2bmV0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKK30KKworc3RhdGljIHUzMiB2bmV0X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2bmV0ICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIHZwLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCB2bmV0X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IHZuZXQgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2cC0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHZuZXRfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHZuZXRfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAkJPSB2bmV0X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IHZuZXRfc2V0X21zZ2xldmVsLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcGVybV9hZGRyCQk9IGV0aHRvb2xfb3BfZ2V0X3Blcm1fYWRkciwKK307CisKK3N0YXRpYyB2b2lkIHZuZXRfcG9ydF9mcmVlX3R4X2J1ZnMoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwlpbnQgaTsKKworCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlpZiAoZHItPmJhc2UpIHsKKwkJbGRjX2ZyZWVfZXhwX2RyaW5nKHBvcnQtPnZpby5scCwgZHItPmJhc2UsCisJCQkJICAgKGRyLT5lbnRyeV9zaXplICogZHItPm51bV9lbnRyaWVzKSwKKwkJCQkgICBkci0+Y29va2llcywgZHItPm5jb29raWVzKTsKKwkJZHItPmJhc2UgPSBOVUxMOworCQlkci0+ZW50cnlfc2l6ZSA9IDA7CisJCWRyLT5udW1fZW50cmllcyA9IDA7CisJCWRyLT5wZW5kaW5nID0gMDsKKwkJZHItPm5jb29raWVzID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVk5FVF9UWF9SSU5HX1NJWkU7IGkrKykgeworCQl2b2lkICpidWYgPSBwb3J0LT50eF9idWZzW2ldLmJ1ZjsKKworCQlpZiAoIWJ1ZikKKwkJCWNvbnRpbnVlOworCisJCWxkY191bm1hcChwb3J0LT52aW8ubHAsCisJCQkgIHBvcnQtPnR4X2J1ZnNbaV0uY29va2llcywKKwkJCSAgcG9ydC0+dHhfYnVmc1tpXS5uY29va2llcyk7CisKKwkJa2ZyZWUoYnVmKTsKKwkJcG9ydC0+dHhfYnVmc1tpXS5idWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgdm5ldF9wb3J0X2FsbG9jX3R4X2J1ZnMoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlpbnQgaSwgZXJyLCBuY29va2llczsKKwl2b2lkICpkcmluZzsKKworCWZvciAoaSA9IDA7IGkgPCBWTkVUX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXZvaWQgKmJ1ZiA9IGt6YWxsb2MoRVRIX0ZSQU1FX0xFTiArIDgsIEdGUF9LRVJORUwpOworCQlpbnQgbWFwX2xlbiA9IChFVEhfRlJBTUVfTEVOICsgNykgJiB+NzsKKworCQllcnIgPSAtRU5PTUVNOworCQlpZiAoIWJ1ZikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJUWCBidWZmZXIgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQllcnIgPSAtRUZBVUxUOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpYnVmICYgKDhVTCAtIDEpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRYIGJ1ZmZlciBtaXNhbGlnbmVkXG4iKTsKKwkJCWtmcmVlKGJ1Zik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKworCQllcnIgPSBsZGNfbWFwX3NpbmdsZShwb3J0LT52aW8ubHAsIGJ1ZiwgbWFwX2xlbiwKKwkJCQkgICAgIHBvcnQtPnR4X2J1ZnNbaV0uY29va2llcywgMiwKKwkJCQkgICAgIChMRENfTUFQX1NIQURPVyB8CisJCQkJICAgICAgTERDX01BUF9ESVJFQ1QgfAorCQkJCSAgICAgIExEQ19NQVBfUlcpKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJcG9ydC0+dHhfYnVmc1tpXS5idWYgPSBidWY7CisJCXBvcnQtPnR4X2J1ZnNbaV0ubmNvb2tpZXMgPSBlcnI7CisJfQorCisJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCisJbGVuID0gKFZORVRfVFhfUklOR19TSVpFICoKKwkgICAgICAgKHNpemVvZihzdHJ1Y3QgdmlvX25ldF9kZXNjKSArCisJCShzaXplb2Yoc3RydWN0IGxkY190cmFuc19jb29raWUpICogMikpKTsKKworCW5jb29raWVzID0gVklPX01BWF9SSU5HX0NPT0tJRVM7CisJZHJpbmcgPSBsZGNfYWxsb2NfZXhwX2RyaW5nKHBvcnQtPnZpby5scCwgbGVuLAorCQkJCSAgICBkci0+Y29va2llcywgJm5jb29raWVzLAorCQkJCSAgICAoTERDX01BUF9TSEFET1cgfAorCQkJCSAgICAgTERDX01BUF9ESVJFQ1QgfAorCQkJCSAgICAgTERDX01BUF9SVykpOworCWlmIChJU19FUlIoZHJpbmcpKSB7CisJCWVyciA9IFBUUl9FUlIoZHJpbmcpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZHItPmJhc2UgPSBkcmluZzsKKwlkci0+ZW50cnlfc2l6ZSA9IChzaXplb2Yoc3RydWN0IHZpb19uZXRfZGVzYykgKworCQkJICAoc2l6ZW9mKHN0cnVjdCBsZGNfdHJhbnNfY29va2llKSAqIDIpKTsKKwlkci0+bnVtX2VudHJpZXMgPSBWTkVUX1RYX1JJTkdfU0laRTsKKwlkci0+cHJvZCA9IGRyLT5jb25zID0gMDsKKwlkci0+cGVuZGluZyA9IFZORVRfVFhfUklOR19TSVpFOworCWRyLT5uY29va2llcyA9IG5jb29raWVzOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJdm5ldF9wb3J0X2ZyZWVfdHhfYnVmcyhwb3J0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIHZuZXRfbGRjX2NmZyA9IHsKKwkuZXZlbnQJCT0gdm5ldF9ldmVudCwKKwkubXR1CQk9IDY0LAorCS5tb2RlCQk9IExEQ19NT0RFX1VOUkVMSUFCTEUsCit9OworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXJfb3BzIHZuZXRfdmlvX29wcyA9IHsKKwkuc2VuZF9hdHRyCQk9IHZuZXRfc2VuZF9hdHRyLAorCS5oYW5kbGVfYXR0cgkJPSB2bmV0X2hhbmRsZV9hdHRyLAorCS5oYW5kc2hha2VfY29tcGxldGUJPSB2bmV0X2hhbmRzaGFrZV9jb21wbGV0ZSwKK307CisKK2NvbnN0IGNoYXIgKnJlbW90ZV9tYWNhZGRyX3Byb3AgPSAicmVtb3RlLW1hYy1hZGRyZXNzIjsKKworc3RhdGljIGludCBfX2RldmluaXQgdm5ldF9wb3J0X3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgdm5ldCAqdnA7CisJY29uc3QgdTY0ICpybWFjOworCWludCBsZW4sIGksIGVyciwgc3dpdGNoX3BvcnQ7CisKKwl2cCA9IGRldl9nZXRfZHJ2ZGF0YSh2ZGV2LT5kZXYucGFyZW50KTsKKwlpZiAoIXZwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHBvcnQgcGFyZW50IHZuZXQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaHAgPSBtZGVzY19ncmFiKCk7CisKKwlybWFjID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgcmVtb3RlX21hY2FkZHJfcHJvcCwgJmxlbik7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXJtYWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUG9ydCBsYWNrcyAlcyBwcm9wZXJ0eS5cbiIsCisJCSAgICAgICByZW1vdGVfbWFjYWRkcl9wcm9wKTsKKwkJZ290byBlcnJfb3V0X3B1dF9tZGVzYzsKKwl9CisKKwlwb3J0ID0ga3phbGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfS0VSTkVMKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghcG9ydCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgdm5ldF9wb3J0LlxuIik7CisJCWdvdG8gZXJyX291dF9wdXRfbWRlc2M7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCXBvcnQtPnJhZGRyW2ldID0gKCpybWFjID4+ICg1IC0gaSkgKiA4KSAmIDB4ZmY7CisKKwlwb3J0LT52cCA9IHZwOworCisJZXJyID0gdmlvX2RyaXZlcl9pbml0KCZwb3J0LT52aW8sIHZkZXYsIFZERVZfTkVUV09SSywKKwkJCSAgICAgIHZuZXRfdmVyc2lvbnMsIEFSUkFZX1NJWkUodm5ldF92ZXJzaW9ucyksCisJCQkgICAgICAmdm5ldF92aW9fb3BzLCB2cC0+ZGV2LT5uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJZXJyID0gdmlvX2xkY19hbGxvYygmcG9ydC0+dmlvLCAmdm5ldF9sZGNfY2ZnLCBwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJZXJyID0gdm5ldF9wb3J0X2FsbG9jX3R4X2J1ZnMocG9ydCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfbGRjOworCisJSU5JVF9ITElTVF9OT0RFKCZwb3J0LT5oYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmcG9ydC0+bGlzdCk7CisKKwlzd2l0Y2hfcG9ydCA9IDA7CisJaWYgKG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdmRldi0+bXAsICJzd2l0Y2gtcG9ydCIsIE5VTEwpICE9IE5VTEwpCisJCXN3aXRjaF9wb3J0ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCWlmIChzd2l0Y2hfcG9ydCkKKwkJbGlzdF9hZGQoJnBvcnQtPmxpc3QsICZ2cC0+cG9ydF9saXN0KTsKKwllbHNlCisJCWxpc3RfYWRkX3RhaWwoJnBvcnQtPmxpc3QsICZ2cC0+cG9ydF9saXN0KTsKKwlobGlzdF9hZGRfaGVhZCgmcG9ydC0+aGFzaCwgJnZwLT5wb3J0X2hhc2hbdm5ldF9oYXNoZm4ocG9ydC0+cmFkZHIpXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBwb3J0KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBQT1JUICggcmVtb3RlLW1hYyAiLCB2cC0+ZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBwb3J0LT5yYWRkcltpXSwgaSA9PSA1ID8gJyAnIDogJzonKTsKKwlpZiAoc3dpdGNoX3BvcnQpCisJCXByaW50aygic3dpdGNoLXBvcnQgIik7CisJcHJpbnRrKCIpXG4iKTsKKworCXZpb19wb3J0X3VwKCZwb3J0LT52aW8pOworCisJbWRlc2NfcmVsZWFzZShocCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX2xkYzoKKwl2aW9fbGRjX2ZyZWUoJnBvcnQtPnZpbyk7CisKK2Vycl9vdXRfZnJlZV9wb3J0OgorCWtmcmVlKHBvcnQpOworCitlcnJfb3V0X3B1dF9tZGVzYzoKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZuZXRfcG9ydF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKKworCWlmIChwb3J0KSB7CisJCXN0cnVjdCB2bmV0ICp2cCA9IHBvcnQtPnZwOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWRlbF90aW1lcl9zeW5jKCZwb3J0LT52aW8udGltZXIpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CisJCWhsaXN0X2RlbCgmcG9ydC0+aGFzaCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisKKwkJdm5ldF9wb3J0X2ZyZWVfdHhfYnVmcyhwb3J0KTsKKwkJdmlvX2xkY19mcmVlKCZwb3J0LT52aW8pOworCisJCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBOVUxMKTsKKworCQlrZnJlZShwb3J0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2bmV0X3BvcnRfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gInZuZXQtcG9ydCIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgdm5ldF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2bmV0X3BvcnRfZHJpdmVyID0geworCS5pZF90YWJsZQk9IHZuZXRfcG9ydF9tYXRjaCwKKwkucHJvYmUJCT0gdm5ldF9wb3J0X3Byb2JlLAorCS5yZW1vdmUJCT0gdm5ldF9wb3J0X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidm5ldF9wb3J0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworY29uc3QgY2hhciAqbG9jYWxfbWFjX3Byb3AgPSAibG9jYWwtbWFjLWFkZHJlc3MiOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bmV0X3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgaW50IHZuZXRfdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZuZXQgKnZwOworCWNvbnN0IHU2NCAqbWFjOworCWludCBlcnIsIGksIGxlbjsKKworCWlmICh2bmV0X3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKworCW1hYyA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdmRldi0+bXAsIGxvY2FsX21hY19wcm9wLCAmbGVuKTsKKwlpZiAoIW1hYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2bmV0IGxhY2tzICVzIHByb3BlcnR5LlxuIiwKKwkJICAgICAgIGxvY2FsX21hY19wcm9wKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdnApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9ICgqbWFjID4+ICg1IC0gaSkgKiA4KSAmIDB4ZmY7CisKKwltZW1jcHkoZGV2LT5wZXJtX2FkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCisJU0VUX05FVERFVl9ERVYoZGV2LCAmdmRldi0+ZGV2KTsKKworCXZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZ2cC0+bG9jayk7CisJdnAtPmRldiA9IGRldjsKKwl2cC0+dmRldiA9IHZkZXY7CisKKwlJTklUX0xJU1RfSEVBRCgmdnAtPnBvcnRfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IFZORVRfUE9SVF9IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZ2cC0+cG9ydF9oYXNoW2ldKTsKKworCWRldi0+b3BlbiA9IHZuZXRfb3BlbjsKKwlkZXYtPnN0b3AgPSB2bmV0X2Nsb3NlOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdm5ldF9zZXRfcnhfbW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHZuZXRfc2V0X21hY19hZGRyOworCWRldi0+dHhfdGltZW91dCA9IHZuZXRfdHhfdGltZW91dDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnZuZXRfZXRodG9vbF9vcHM7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFZORVRfVFhfVElNRU9VVDsKKwlkZXYtPmNoYW5nZV9tdHUgPSB2bmV0X2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2bmV0X3N0YXJ0X3htaXQ7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdW4gTERPTSB2bmV0ICIsIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnXG4nIDogJzonKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCB2cCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisKK2Vycl9vdXQ6CisJbWRlc2NfcmVsZWFzZShocCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2bmV0X3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKworCXN0cnVjdCB2bmV0ICp2cCA9IGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKKworCWlmICh2cCkgeworCQkvKiBYWFggdW5yZWdpc3RlciBwb3J0LCBvciBhdCBsZWFzdCBjaGVjayBYWFggKi8KKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UodnAtPmRldik7CisJCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBOVUxMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2bmV0X21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJuZXR3b3JrIiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2bmV0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZuZXRfZHJpdmVyID0geworCS5pZF90YWJsZQk9IHZuZXRfbWF0Y2gsCisJLnByb2JlCQk9IHZuZXRfcHJvYmUsCisJLnJlbW92ZQkJPSB2bmV0X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidm5ldCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZuZXRfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X2RyaXZlcik7CisKKwlpZiAoIWVycikgeworCQllcnIgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X3BvcnRfZHJpdmVyKTsKKwkJaWYgKGVycikKKwkJCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdm5ldF9kcml2ZXIpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2bmV0X2V4aXQodm9pZCkKK3sKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfcG9ydF9kcml2ZXIpOworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdm5ldF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2bmV0X2luaXQpOworbW9kdWxlX2V4aXQodm5ldF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnZuZXQuaCBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg4NzMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgX1NVTlZORVRfSAorI2RlZmluZSBfU1VOVk5FVF9ICisKKyNkZWZpbmUgREVTQ19OQ09PS0lFUyhlbnRyeV9zaXplKQlcCisJKChlbnRyeV9zaXplKSAtIHNpemVvZihzdHJ1Y3QgdmlvX25ldF9kZXNjKSkKKworLyogbGVuZ3RoIG9mIHRpbWUgYmVmb3JlIHdlIGRlY2lkZSB0aGUgaGFyZHdhcmUgaXMgYm9ya2VkLAorICogYW5kIGRldi0+dHhfdGltZW91dCgpIHNob3VsZCBiZSBjYWxsZWQgdG8gZml4IHRoZSBwcm9ibGVtCisgKi8KKyNkZWZpbmUgVk5FVF9UWF9USU1FT1VUCQkJKDUgKiBIWikKKworI2RlZmluZSBWTkVUX1RYX1JJTkdfU0laRQkJNTEyCisjZGVmaW5lIFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikJKChkciktPnBlbmRpbmcgLyA0KQorCisvKiBWTkVUIHBhY2tldHMgYXJlIHNlbnQgaW4gYnVmZmVycyB3aXRoIHRoZSBmaXJzdCA2IGJ5dGVzIHNraXBwZWQKKyAqIHNvIHRoYXQgYWZ0ZXIgdGhlIGV0aGVybmV0IGhlYWRlciB0aGUgSVB2NC9JUHY2IGhlYWRlcnMgYXJlIGFsaWduZWQKKyAqIHByb3Blcmx5LgorICovCisjZGVmaW5lIFZORVRfUEFDS0VUX1NLSVAJCTYKKworc3RydWN0IHZuZXRfdHhfZW50cnkgeworCXZvaWQJCQkqYnVmOworCXVuc2lnbmVkIGludAkJbmNvb2tpZXM7CisJc3RydWN0IGxkY190cmFuc19jb29raWUJY29va2llc1syXTsKK307CisKK3N0cnVjdCB2bmV0Oworc3RydWN0IHZuZXRfcG9ydCB7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUJdmlvOworCisJc3RydWN0IGhsaXN0X25vZGUJaGFzaDsKKwl1OAkJCXJhZGRyW0VUSF9BTEVOXTsKKworCXN0cnVjdCB2bmV0CQkqdnA7CisKKwlzdHJ1Y3Qgdm5ldF90eF9lbnRyeQl0eF9idWZzW1ZORVRfVFhfUklOR19TSVpFXTsKKworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZuZXRfcG9ydCAqdG9fdm5ldF9wb3J0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2aW8sIHN0cnVjdCB2bmV0X3BvcnQsIHZpbyk7Cit9CisKKyNkZWZpbmUgVk5FVF9QT1JUX0hBU0hfU0laRQkxNgorI2RlZmluZSBWTkVUX1BPUlRfSEFTSF9NQVNLCShWTkVUX1BPUlRfSEFTSF9TSVpFIC0gMSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdm5ldF9oYXNoZm4odTggKm1hYykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gbWFjWzRdIF4gbWFjWzVdOworCisJcmV0dXJuIHZhbCAmIChWTkVUX1BPUlRfSEFTSF9NQVNLKTsKK30KKworc3RydWN0IHZuZXQgeworCS8qIFByb3RlY3RzIHBvcnRfbGlzdCBhbmQgcG9ydF9oYXNoLiAgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKworCXUzMgkJCW1zZ19lbmFibGU7CisJc3RydWN0IHZpb19kZXYJCSp2ZGV2OworCisJc3RydWN0IGxpc3RfaGVhZAlwb3J0X2xpc3Q7CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlwb3J0X2hhc2hbVk5FVF9QT1JUX0hBU0hfU0laRV07Cit9OworCisjZW5kaWYgLyogX1NVTlZORVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2NkY19zdWJzZXQuYyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfc3Vic2V0LmMKaW5kZXggYmM2MmIwMS4uOTQzOTg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2NkY19zdWJzZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvY2RjX3N1YnNldC5jCkBAIC0zMDUsNiArMzA1LDkgQEAKIAlVU0JfREVWSUNFICgweDgwODYsIDB4MDdkMyksCS8vICJibG9iIiBib290bG9hZGVyCiAJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZibG9iX2luZm8sCiB9LCB7CisJVVNCX0RFVklDRSAoMHgxMjg2LCAweDgwMDEpLCAgICAvLyAiYmxvYiIgYm9vdGxvYWRlcgorCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmJsb2JfaW5mbywKK30sIHsKIAkvLyBMaW51eCBFdGhlcm5ldC9STkRJUyBnYWRnZXQgb24gcHhhMjEwLzI1eC8yNngsIHNlY29uZCBjb25maWcKIAkvLyBlLmcuIEd1bXN0aXgsIGN1cnJlbnQgT3BlblphdXJ1cywgLi4uCiAJVVNCX0RFVklDRV9WRVIgKDB4MDUyNSwgMHhhNGEyLCAweDAyMDMsIDB4MDIwMyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCmluZGV4IDRmYzg2ODEuLmEzZGYwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCkBAIC02MSw3ICs2MSw3IEBACiAjCiBjb25maWcgTEFOTUVESUEKIAl0cmlzdGF0ZSAiTGFuTWVkaWEgQ29ycC4gU1NJL1YuMzUsIFQxL0UxLCBIU1NJLCBUMyBib2FyZHMiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCS0tLWhlbHAtLS0KIAkgIERyaXZlciBmb3IgdGhlIGZvbGxvd2luZyBMYW4gTWVkaWEgZmFtaWx5IG9mIHNlcmlhbCBib2FyZHM6CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwppbmRleCAyZDNhMTgwLi5lZTFjYzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCkBAIC01Miw2ICs1Miw4IEBACiAKICNpbmNsdWRlICJhaXJvLmgiCiAKKyNkZWZpbmUgRFJWX05BTUUgImFpcm8iCisKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FyZF9pZHNbXSA9IHsKIAl7IDB4MTRiOSwgMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKQEAgLTcxLDcgKzczLDcgQEAKIHN0YXRpYyBpbnQgYWlyb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFpcm9fZHJpdmVyID0gewotCS5uYW1lICAgICA9ICJhaXJvIiwKKwkubmFtZSAgICAgPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUgPSBjYXJkX2lkcywKIAkucHJvYmUgICAgPSBhaXJvX3BjaV9wcm9iZSwKIAkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhaXJvX3BjaV9yZW1vdmUpLApAQCAtMTA5Miw3ICsxMDk0LDcgQEAKIHN0YXRpYyB2b2lkIE9VVDQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJlZ2lzdGVyLCB1MTYgdmFsdWUgKTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBJTjQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJlZ2lzdGVyICk7CiBzdGF0aWMgdTE2IHNldHVwX2NhcmQoc3RydWN0IGFpcm9faW5mbyosIHU4ICptYWMsIGludCBsb2NrKTsKLXN0YXRpYyBpbnQgZW5hYmxlX01BQyggc3RydWN0IGFpcm9faW5mbyAqYWksIFJlc3AgKnJzcCwgaW50IGxvY2sgKTsKK3N0YXRpYyBpbnQgZW5hYmxlX01BQyhzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxvY2spOwogc3RhdGljIHZvaWQgZGlzYWJsZV9NQUMoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrKTsKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBhaXJvX2luZm8qKTsKIHN0YXRpYyB2b2lkIGRpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgYWlyb19pbmZvKik7CkBAIC0xMjUwLDcgKzEyNTIsNyBAQAogc3RhdGljIGludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqYWksc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKICNkZWZpbmUgYWlyb19wcmludCh0eXBlLCBuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKLQl7IHByaW50ayh0eXBlICJhaXJvKCVzKTogIiBmbXQgIlxuIiwgbmFtZSwgIyNhcmdzKTsgfQorCXByaW50ayh0eXBlIERSVl9OQU1FICIoJXMpOiAiIGZtdCAiXG4iLCBuYW1lLCAjI2FyZ3MpCiAKICNkZWZpbmUgYWlyb19wcmludF9pbmZvKG5hbWUsIGZtdCwgYXJncy4uLikgXAogCWFpcm9fcHJpbnQoS0VSTl9JTkZPLCBuYW1lLCBmbXQsICMjYXJncykKQEAgLTE5MjYsMjggKzE5MjgsNTQgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgYWlyb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgYWlyb19pbmZvICppbmZvID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOworc3RhdGljIHZvaWQgdHJ5X2F1dG9fd2VwKHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCWlmIChhdXRvX3dlcCAmJiAhKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fRE9XTikpIHsKKwkJYWktPmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWktPnRocl93YWl0KTsKKwl9Cit9CiAKLQlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmluZm8tPmZsYWdzKSkKK3N0YXRpYyBpbnQgYWlyb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAwOworCisJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBjb25maWd1cmVkLgogCSAqIFdpcmVsZXNzIEV4dGVuc2lvbnMgbWF5IHBvc3Rwb25lIGNvbmZpZyBjaGFuZ2VzIHVudGlsIHRoZSBjYXJkCiAJICogaXMgb3BlbiAodG8gcGlwZWxpbmUgY2hhbmdlcyBhbmQgc3BlZWQtdXAgY2FyZCBzZXR1cCkuIElmCiAJICogdGhvc2UgY2hhbmdlcyBhcmUgbm90IHlldCBjb21taXRlZCwgZG8gaXQgbm93IC0gSmVhbiBJSSAqLwotCWlmICh0ZXN0X2JpdCAoRkxBR19DT01NSVQsICZpbmZvLT5mbGFncykpIHsKLQkJZGlzYWJsZV9NQUMoaW5mbywgMSk7Ci0JCXdyaXRlQ29uZmlnUmlkKGluZm8sIDEpOworCWlmICh0ZXN0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncykpIHsKKwkJZGlzYWJsZV9NQUMoYWksIDEpOworCQl3cml0ZUNvbmZpZ1JpZChhaSwgMSk7CiAJfQogCi0JaWYgKGluZm8tPndpZmlkZXYgIT0gZGV2KSB7CisJaWYgKGFpLT53aWZpZGV2ICE9IGRldikgeworCQljbGVhcl9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKKwkJYWktPmFpcm9fdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihhaXJvX3RocmVhZCwgZGV2LCBkZXYtPm5hbWUpOworCQlpZiAoSVNfRVJSKGFpLT5haXJvX3RocmVhZF90YXNrKSkKKwkJCXJldHVybiAoaW50KVBUUl9FUlIoYWktPmFpcm9fdGhyZWFkX3Rhc2spOworCisJCXJjID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGFpcm9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCWRldi0+bmFtZSwgZGV2KTsKKwkJaWYgKHJjKSB7CisJCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsCisJCQkJInJlZ2lzdGVyIGludGVycnVwdCAlZCBmYWlsZWQsIHJjICVkIiwKKwkJCQlkZXYtPmlycSwgcmMpOworCQkJc2V0X2JpdChKT0JfRElFLCAmYWktPmpvYnMpOworCQkJa3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKKwkJCXJldHVybiByYzsKKwkJfQorCiAJCS8qIFBvd2VyIG9uIHRoZSBNQUMgY29udHJvbGxlciAod2hpY2ggbWF5IGhhdmUgYmVlbiBkaXNhYmxlZCkgKi8KLQkJY2xlYXJfYml0KEZMQUdfUkFESU9fRE9XTiwgJmluZm8tPmZsYWdzKTsKLQkJZW5hYmxlX2ludGVycnVwdHMoaW5mbyk7CisJCWNsZWFyX2JpdChGTEFHX1JBRElPX0RPV04sICZhaS0+ZmxhZ3MpOworCQllbmFibGVfaW50ZXJydXB0cyhhaSk7CisKKwkJdHJ5X2F1dG9fd2VwKGFpKTsKIAl9Ci0JZW5hYmxlX01BQyhpbmZvLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAJcmV0dXJuIDA7CkBAIC0yMzM4LDE0ICsyMzY2LDEzIEBACiB7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQlSZXNwIHJzcDsKIAogCXJlYWRDb25maWdSaWQoYWksIDEpOwogCW1lbWNweSAoYWktPmNvbmZpZy5tYWNBZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKIAlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCXdyaXRlQ29uZmlnUmlkIChhaSwgMSk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhhaSwgMSk7CiAJbWVtY3B5IChhaS0+ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CiAJaWYgKGFpLT53aWZpZGV2KQogCQltZW1jcHkgKGFpLT53aWZpZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CkBAIC0yMzkyLDYgKzI0MTksMTEgQEAKIAkJZGlzYWJsZV9NQUMoYWksIDEpOwogI2VuZGlmCiAJCWRpc2FibGVfaW50ZXJydXB0cyggYWkgKTsKKworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCQlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7CisJCWt0aHJlYWRfc3RvcChhaS0+YWlyb190aHJlYWRfdGFzayk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjQwMyw3ICsyNDM1LDYgQEAKIAlzZXRfYml0KEZMQUdfUkFESU9fRE9XTiwgJmFpLT5mbGFncyk7CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCWRpc2FibGVfaW50ZXJydXB0cyhhaSk7Ci0JZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKIAl0YWtlZG93bl9wcm9jX2VudHJ5KCBkZXYsIGFpICk7CiAJaWYgKHRlc3RfYml0KEZMQUdfUkVHSVNURVJFRCwgJmFpLT5mbGFncykpIHsKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoIGRldiApOwpAQCAtMjQxNCw5ICsyNDQ1LDYgQEAKIAkJfQogCQljbGVhcl9iaXQoRkxBR19SRUdJU1RFUkVELCAmYWktPmZsYWdzKTsKIAl9Ci0Jc2V0X2JpdChKT0JfRElFLCAmYWktPmpvYnMpOwotCWt0aHJlYWRfc3RvcChhaS0+YWlyb190aHJlYWRfdGFzayk7Ci0KIAkvKgogCSAqIENsZWFuIG91dCB0eCBxdWV1ZQogCSAqLwpAQCAtMjU1NCw4ICsyNTgyLDcgQEAKICAqIDIpIE1hcCBQQ0kgbWVtb3J5IGZvciBpc3N1ZWluZyBjb21tYW5kcy4KICAqIDMpIEFsbG9jYXRlIG1lbW9yeSAoc2hhcmVkKSB0byBzZW5kIGFuZCByZWNlaXZlIGV0aGVybmV0IGZyYW1lcy4KICAqLwotc3RhdGljIGludCBtcGlfbWFwX2NhcmQoc3RydWN0IGFpcm9faW5mbyAqYWksIHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCSAgICBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGludCBtcGlfbWFwX2NhcmQoc3RydWN0IGFpcm9faW5mbyAqYWksIHN0cnVjdCBwY2lfZGV2ICpwY2kpCiB7CiAJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQsIG1lbV9sZW4sIGF1eF9zdGFydCwgYXV4X2xlbjsKIAlpbnQgcmMgPSAtMTsKQEAgLTI1NjksMzUgKzI1OTYsMzUgQEAKIAlhdXhfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAyKTsKIAlhdXhfbGVuID0gQVVYTUVNU0laRTsKIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgbWVtX2xlbiwgbmFtZSkpIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIGZvciAlcyIsCi0JCSAgICAgICAoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuLCBuYW1lKTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIG1lbV9sZW4sIERSVl9OQU1FKSkgeworCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIiwKKwkJCShpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4pOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuLCBuYW1lKSkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzIiwKLQkJICAgICAgIChpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4sIG5hbWUpOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGF1eF9zdGFydCwgYXV4X2xlbiwgRFJWX05BTUUpKSB7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0iLAorCQkJKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbik7CiAJCWdvdG8gZnJlZV9yZWdpb24xOwogCX0KIAogCWFpLT5wY2ltZW0gPSBpb3JlbWFwKG1lbV9zdGFydCwgbWVtX2xlbik7CiAJaWYgKCFhaS0+cGNpbWVtKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSBmb3IgJXMiLAotCQkgICAgICAgKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbiwgbmFtZSk7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0iLAorCQkJKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbik7CiAJCWdvdG8gZnJlZV9yZWdpb24yOwogCX0KIAlhaS0+cGNpYXV4ID0gaW9yZW1hcChhdXhfc3RhcnQsIGF1eF9sZW4pOwogCWlmICghYWktPnBjaWF1eCkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0gZm9yICVzIiwKLQkJICAgICAgIChpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4sIG5hbWUpOworCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIiwKKwkJCShpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4pOwogCQlnb3RvIGZyZWVfbWVtbWFwOwogCX0KIAogCS8qIFJlc2VydmUgUEtUU0laRSBmb3IgZWFjaCBmaWQgYW5kIDJLIGZvciB0aGUgUmlkcyAqLwogCWFpLT5zaGFyZWQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2ksIFBDSV9TSEFSRURfTEVOLCAmYWktPnNoYXJlZF9kbWEpOwogCWlmICghYWktPnNoYXJlZCkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgYWxsb2NfY29uc2lzdGVudCAlZCIsCi0JCSAgICAgICBQQ0lfU0hBUkVEX0xFTik7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgYWxsb2NfY29uc2lzdGVudCAlZCIsCisJCQlQQ0lfU0hBUkVEX0xFTik7CiAJCWdvdG8gZnJlZV9hdXhtYXA7CiAJfQogCkBAIC0yNzQyLDcgKzI3NjksNyBAQAogCSAgICBremFsbG9jKEFJUk9fTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2YoQlNTTGlzdEVsZW1lbnQpLAogCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhaS0+bmV0d29ya3MpIHsKLQkJYWlyb19wcmludF93YXJuKGFpLT5kZXYtPm5hbWUsICJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29ucyIpOworCQlhaXJvX3ByaW50X3dhcm4oIiIsICJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29ucyIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI3NzAsNyArMjc5Nyw2IEBACiB7CiAJaW50IHN0YXR1czsKIAlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7Ci0JY29uc3QgY2hhciAqbmFtZSA9IGFpLT5kZXYtPm5hbWU7CiAKIAlzdGF0dXMgPSByZWFkQ2FwYWJpbGl0eVJpZChhaSwgJmNhcF9yaWQsIDEpOwogCWlmIChzdGF0dXMgIT0gU1VDQ0VTUykgcmV0dXJuIDA7CkBAIC0yNzc4LDEyICsyODA0LDEyIEBACiAJLyogT25seSBmaXJtd2FyZSB2ZXJzaW9ucyA1LjMwLjE3IG9yIGJldHRlciBjYW4gZG8gV1BBICovCiAJaWYgKChjYXBfcmlkLnNvZnRWZXIgPiAweDUzMCkKIAkgIHx8ICgoY2FwX3JpZC5zb2Z0VmVyID09IDB4NTMwKSAmJiAoY2FwX3JpZC5zb2Z0U3ViVmVyID49IDE3KSkpIHsKLQkJYWlyb19wcmludF9pbmZvKG5hbWUsICJXUEEgaXMgc3VwcG9ydGVkLiIpOworCQlhaXJvX3ByaW50X2luZm8oIiIsICJXUEEgaXMgc3VwcG9ydGVkLiIpOwogCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBObyBXUEEgc3VwcG9ydCAqLwotCWFpcm9fcHJpbnRfaW5mbyhuYW1lLCAiV1BBIHVuc3VwcG9ydGVkIChvbmx5IGZpcm13YXJlIHZlcnNpb25zIDUuMzAuMTciCisJYWlyb19wcmludF9pbmZvKCIiLCAiV1BBIHVuc3VwcG9ydGVkIChvbmx5IGZpcm13YXJlIHZlcnNpb25zIDUuMzAuMTciCiAJCSIgYW5kIGdyZWF0ZXIgc3VwcG9ydCBXUEEuICBEZXRlY3RlZCAlcykiLCBjYXBfcmlkLnByb2RWZXIpOwogCXJldHVybiAwOwogfQpAQCAtMjc5NywyMyArMjgyMywxOSBAQAogCWludCBpLCByYzsKIAogCS8qIENyZWF0ZSB0aGUgbmV0d29yayBkZXZpY2Ugb2JqZWN0LiAqLwotICAgICAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKmFpKSk7Ci0gICAgICAgIGlmICghZGV2KSB7CisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqYWkpLCAiIiwgZXRoZXJfc2V0dXApOworCWlmICghZGV2KSB7CiAJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgYWxsb2NfZXRoZXJkZXYiKTsKIAkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpIDwgMCkgewotCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IGdldCBuYW1lISIpOwotCQlnb3RvIGVycl9vdXRfZnJlZTsKIAl9CiAKIAlhaSA9IGRldi0+cHJpdjsKIAlhaS0+d2lmaWRldiA9IE5VTEw7Ci0JYWktPmZsYWdzID0gMDsKKwlhaS0+ZmxhZ3MgPSAxIDw8IEZMQUdfUkFESU9fRE9XTjsKIAlhaS0+am9icyA9IDA7CiAJYWktPmRldiA9IGRldjsKIAlpZiAocGNpICYmIChwY2ktPmRldmljZSA9PSAweDUwMDAgfHwgcGNpLT5kZXZpY2UgPT0gMHhhNTA0KSkgewotCQlhaXJvX3ByaW50X2RiZyhkZXYtPm5hbWUsICJGb3VuZCBhbiBNUEkzNTAgY2FyZCIpOworCQlhaXJvX3ByaW50X2RiZygiIiwgIkZvdW5kIGFuIE1QSTM1MCBjYXJkIik7CiAJCXNldF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmYWktPmF1eF9sb2NrKTsKQEAgLTI4MjEsMTQgKzI4NDMsMTEgQEAKIAlhaS0+Y29uZmlnLmxlbiA9IDA7CiAJYWktPnBjaSA9IHBjaTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkICgmYWktPnRocl93YWl0KTsKLQlhaS0+YWlyb190aHJlYWRfdGFzayA9IGt0aHJlYWRfcnVuKGFpcm9fdGhyZWFkLCBkZXYsIGRldi0+bmFtZSk7Ci0JaWYgKElTX0VSUihhaS0+YWlyb190aHJlYWRfdGFzaykpCi0JCWdvdG8gZXJyX291dF9mcmVlOwogCWFpLT50Zm0gPSBOVUxMOwogCWFkZF9haXJvX2RldihhaSk7CiAKIAlpZiAoYWlyb19uZXR3b3Jrc19hbGxvY2F0ZSAoYWkpKQotCQlnb3RvIGVycl9vdXRfdGhyOworCQlnb3RvIGVycl9vdXRfZnJlZTsKIAlhaXJvX25ldHdvcmtzX2luaXRpYWxpemUgKGFpKTsKIAogCS8qIFRoZSBBaXJvLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCkBAIC0yODUxLDI3ICsyODcwLDIyIEBACiAJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OwogCiAJU0VUX05FVERFVl9ERVYoZGV2LCBkbWRldik7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOwogCiAJcmVzZXRfY2FyZCAoZGV2LCAxKTsKIAltc2xlZXAoNDAwKTsKIAotCXJjID0gcmVxdWVzdF9pcnEoIGRldi0+aXJxLCBhaXJvX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2ICk7Ci0JaWYgKHJjKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgInJlZ2lzdGVyIGludGVycnVwdCAlZCBmYWlsZWQsIHJjICVkIiwKLQkJCQlpcnEsIHJjKTsKLQkJZ290byBlcnJfb3V0X25ldHM7Ci0JfQogCWlmICghaXNfcGNtY2lhKSB7Ci0JCWlmICghcmVxdWVzdF9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCwgZGV2LT5uYW1lICkpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgNjQsIERSVl9OQU1FKSkgewogCQkJcmMgPSAtRUJVU1k7CiAJCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICJDb3VsZG4ndCByZXF1ZXN0IHJlZ2lvbiIpOwotCQkJZ290byBlcnJfb3V0X2lycTsKKwkJCWdvdG8gZXJyX291dF9uZXRzOwogCQl9CiAJfQogCiAJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7Ci0JCWlmIChtcGlfbWFwX2NhcmQoYWksIHBjaSwgZGV2LT5uYW1lKSkgewotCQkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAiQ291bGQgbm90IG1hcCBtZW1vcnkiKTsKKwkJaWYgKG1waV9tYXBfY2FyZChhaSwgcGNpKSkgeworCQkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZCBub3QgbWFwIG1lbW9yeSIpOwogCQkJZ290byBlcnJfb3V0X3JlczsKIAkJfQogCX0KQEAgLTI4OTksNiArMjkxMyw3IEBACiAJCWFpLT5ic3NMaXN0UmlkTGVuID0gc2l6ZW9mKEJTU0xpc3RSaWQpIC0gc2l6ZW9mKEJTU0xpc3RSaWRFeHRyYSk7CiAJfQogCisJc3RyY3B5KGRldi0+bmFtZSwgImV0aCVkIik7CiAJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmMpIHsKIAkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAiQ291bGRuJ3QgcmVnaXN0ZXJfbmV0ZGV2Iik7CkBAIC0yOTIxLDggKzI5MzYsNiBAQAogCWlmIChzZXR1cF9wcm9jX2VudHJ5KGRldiwgZGV2LT5wcml2KSA8IDApCiAJCWdvdG8gZXJyX291dF93aWZpOwogCi0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLQlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAJcmV0dXJuIGRldjsKIAogZXJyX291dF93aWZpOgpAQCAtMjk0MCwxNCArMjk1Myw5IEBACiBlcnJfb3V0X3JlczoKIAlpZiAoIWlzX3BjbWNpYSkKIAkgICAgICAgIHJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQgKTsKLWVycl9vdXRfaXJxOgotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogZXJyX291dF9uZXRzOgogCWFpcm9fbmV0d29ya3NfZnJlZShhaSk7Ci1lcnJfb3V0X3RocjoKIAlkZWxfYWlyb19kZXYoYWkpOwotCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKLQlrdGhyZWFkX3N0b3AoYWktPmFpcm9fdGhyZWFkX3Rhc2spOwogZXJyX291dF9mcmVlOgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIE5VTEw7CkBAIC0zMDc4LDcgKzMwODYsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCWludCBsb2NrZWQ7Ci0JCisKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUoMSkgewogCQkvKiBtYWtlIHN3c3VzcCBoYXBweSB3aXRoIG91ciB0aHJlYWQgKi8KIAkJdHJ5X3RvX2ZyZWV6ZSgpOwpAQCAtMzUyOSw5ICszNTM4LDExIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGVuYWJsZV9NQUMoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCBSZXNwICpyc3AsIGludCBsb2NrICkgeworc3RhdGljIGludCBlbmFibGVfTUFDKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jaykKK3sKIAlpbnQgcmM7Ci0gICAgICAgIENtZCBjbWQ7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKIAogCS8qIEZMQUdfUkFESU9fT0ZGIDogUmFkaW8gZGlzYWJsZWQgdmlhIC9wcm9jIG9yIFdpcmVsZXNzIEV4dGVuc2lvbnMKIAkgKiBGTEFHX1JBRElPX0RPV04gOiBSYWRpbyBkaXNhYmxlZCB2aWEgImlmY29uZmlnIGV0aFggZG93biIKQEAgLTM1NDcsNyArMzU1OCw3IEBACiAJaWYgKCF0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKSB7CiAJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAJCWNtZC5jbWQgPSBNQUNfRU5BQkxFOwotCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgcnNwKTsKKwkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOwogCQlpZiAocmMgPT0gU1VDQ0VTUykKIAkJCXNldF9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKTsKIAl9IGVsc2UKQEAgLTM1NTcsOCArMzU2OCwxMiBAQAogCSAgICB1cCgmYWktPnNlbSk7CiAKIAlpZiAocmMpCi0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICIlczogQ2Fubm90IGVuYWJsZSBNQUMsIGVycj0lZCIsCi0JCQlfX0ZVTkNUSU9OX18sIHJjKTsKKwkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNhbm5vdCBlbmFibGUgTUFDIik7CisJZWxzZSBpZiAoKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHsKKwkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkJhZCBNQUMgZW5hYmxlIHJlYXNvbj0leCwgIgorCQkJInJpZD0leCwgb2Zmc2V0PSVkIiwgcnNwLnJzcDAsIHJzcC5yc3AxLCByc3AucnNwMik7CisJCXJjID0gRVJST1I7CisJfQogCXJldHVybiByYzsKIH0KIApAQCAtMzkwMiwxMiArMzkxNyw5IEBACiAJCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CiAJfQogCi0Jc3RhdHVzID0gZW5hYmxlX01BQyhhaSwgJnJzcCwgbG9jayk7Ci0JaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyB8fCAocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQmFkIE1BQyBlbmFibGUgcmVhc29uID0gJXgsIHJpZCA9ICV4LCIKLQkJCSIgb2Zmc2V0ID0gJWQiLCByc3AucnNwMCwgcnNwLnJzcDEsIHJzcC5yc3AyICk7CisJc3RhdHVzID0gZW5hYmxlX01BQyhhaSwgbG9jayk7CisJaWYgKHN0YXR1cyAhPSBTVUNDRVNTKQogCQlyZXR1cm4gRVJST1I7Ci0JfQogCiAJLyogR3JhYiB0aGUgaW5pdGlhbCB3ZXAga2V5LCB3ZSBnb3R0YSBzYXZlIGl0IGZvciBhdXRvX3dlcCAqLwogCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMSwgbG9jayk7CkBAIC0zOTE5LDEwICszOTMxLDcgQEAKIAkJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAwLCBsb2NrKTsKIAl9IHdoaWxlKGxhc3RpbmRleCAhPSB3a3Iua2luZGV4KTsKIAotCWlmIChhdXRvX3dlcCkgewotCQlhaS0+ZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhaS0+dGhyX3dhaXQpOwotCX0KKwl0cnlfYXV0b193ZXAoYWkpOwogCiAJcmV0dXJuIFNVQ0NFU1M7CiB9CkBAIC00MDA0LDcgKzQwMTMsNyBAQAogCQl9CiAJCWlmICggIShtYXhfdHJpZXMtLSkgKSB7CiAJCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLAotCQkJCSJhaXJvOiBCQVAgc2V0dXAgZXJyb3IgdG9vIG1hbnkgcmV0cmllc1xuIik7CisJCQkJIkJBUCBzZXR1cCBlcnJvciB0b28gbWFueSByZXRyaWVzXG4iKTsKIAkJCXJldHVybiBFUlJPUjsKIAkJfQogCQkvLyAtLSBQQzQ1MDAgbWlzc2VkIGl0LCB0cnkgYWdhaW4KQEAgLTUxNTIsNyArNTE2MSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCVNzaWRSaWQgU1NJRF9yaWQ7Ci0JUmVzcCByc3A7CiAJaW50IGk7CiAJaW50IG9mZnNldCA9IDA7CiAKQEAgLTUxNzcsNyArNTE4NSw3IEBACiAJCVNTSURfcmlkLmxlbiA9IHNpemVvZihTU0lEX3JpZCk7CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCXdyaXRlU3NpZFJpZChhaSwgJlNTSURfcmlkLCAxKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIH0KIAogc3RhdGljIGlubGluZSB1OCBoZXhWYWwoY2hhciBjKSB7CkBAIC01MTkzLDcgKzUyMDEsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlBUExpc3RSaWQgQVBMaXN0X3JpZDsKLQlSZXNwIHJzcDsKIAlpbnQgaTsKIAogCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOwpAQCAtNTIxOCwxOCArNTIyNSwxNyBAQAogCX0KIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJd3JpdGVBUExpc3RSaWQoYWksICZBUExpc3RfcmlkLCAxKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3cmFwcyBQQzQ1MDBfd3JpdGVyaWQgd2l0aCBhIE1BQyBkaXNhYmxlICovCiBzdGF0aWMgaW50IGRvX3dyaXRlcmlkKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqcmlkX2RhdGEsCiAJCQlpbnQgbGVuLCBpbnQgZHVtbXkgKSB7CiAJaW50IHJjOwotCVJlc3AgcnNwOwogCiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCByaWQsIHJpZF9kYXRhLCBsZW4sIDEpOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogCXJldHVybiByYzsKIH0KIApAQCAtNTI2MCw3ICs1MjY2LDYgQEAKIAkJICAgICAgIGNvbnN0IGNoYXIgKmtleSwgdTE2IGtleWxlbiwgaW50IHBlcm0sIGludCBsb2NrICkgewogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hY2FkZHJbRVRIX0FMRU5dID0geyAweDAxLCAwLCAwLCAwLCAwLCAwIH07CiAJV2VwS2V5UmlkIHdrcjsKLQlSZXNwIHJzcDsKIAogCW1lbXNldCgmd2tyLCAwLCBzaXplb2Yod2tyKSk7CiAJaWYgKGtleWxlbiA9PSAwKSB7CkBAIC01MjgwLDcgKzUyODUsNyBAQAogCiAJaWYgKHBlcm0pIGRpc2FibGVfTUFDKGFpLCBsb2NrKTsKIAl3cml0ZVdlcEtleVJpZChhaSwgJndrciwgcGVybSwgbG9jayk7Ci0JaWYgKHBlcm0pIGVuYWJsZV9NQUMoYWksICZyc3AsIGxvY2spOworCWlmIChwZXJtKSBlbmFibGVfTUFDKGFpLCBsb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTU0OCw3ICs1NTUzLDYgQEAKICAgIGNoYW5nZWQuICovCiBzdGF0aWMgdm9pZCB0aW1lcl9mdW5jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkgewogCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCiAvKiBXZSBkb24ndCBoYXZlIGEgbGluayBzbyB0cnkgY2hhbmdpbmcgdGhlIGF1dGh0eXBlICovCiAJcmVhZENvbmZpZ1JpZChhcHJpdiwgMCk7CkBAIC01NTc1LDcgKzU1NzksNyBAQAogCX0KIAlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFwcml2LT5mbGFncyk7CiAJd3JpdGVDb25maWdSaWQoYXByaXYsIDApOwotCWVuYWJsZV9NQUMoYXByaXYsICZyc3AsIDApOworCWVuYWJsZV9NQUMoYXByaXYsIDApOwogCXVwKCZhcHJpdi0+c2VtKTsKIAogLyogU2NoZWR1bGUgY2hlY2sgdG8gc2VlIGlmIHRoZSBjaGFuZ2Ugd29ya2VkICovCkBAIC01NTk3LDggKzU2MDEsMTAgQEAKIAkJCWRldiA9IF9pbml0X2Fpcm9fY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCAwLCBwZGV2LCAmcGRldi0+ZGV2KTsKIAllbHNlCiAJCQlkZXYgPSBfaW5pdF9haXJvX2NhcmQocGRldi0+aXJxLCBwZGV2LT5yZXNvdXJjZVsyXS5zdGFydCwgMCwgcGRldiwgJnBkZXYtPmRldik7Ci0JaWYgKCFkZXYpCisJaWYgKCFkZXYpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTU2MTAsNiArNTYxNiw4IEBACiAKIAlhaXJvX3ByaW50X2luZm8oZGV2LT5uYW1lLCAiVW5yZWdpc3RlcmluZy4uLiIpOwogCXN0b3BfYWlyb19jYXJkKGRldiwgMSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBhaXJvX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC01NjQ2LDcgKzU2NTQsNiBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAJcGNpX3Bvd2VyX3QgcHJldl9zdGF0ZSA9IHBkZXYtPmN1cnJlbnRfc3RhdGU7CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CkBAIC01Njc5LDcgKzU2ODYsNyBAQAogCQlhaS0+QVBMaXN0ID0gTlVMTDsKIAl9CiAJd3JpdGVDb25maWdSaWQoYWksIDApOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDApOworCWVuYWJsZV9NQUMoYWksIDApOwogCWFpLT5wb3dlciA9IFBNU0dfT047CiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKQEAgLTU5MDMsNyArNTkxMCw2IEBACiAJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCVNzaWRSaWQgU1NJRF9yaWQ7CQkvKiBTU0lEcyAqLwogCiAJLyogUmVsb2FkIHRoZSBsaXN0IG9mIGN1cnJlbnQgU1NJRCAqLwpAQCAtNTkzNSw3ICs1OTQxLDcgQEAKIAkvKiBXcml0ZSBpdCB0byB0aGUgY2FyZCAqLwogCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKIAl3cml0ZVNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCwgMSk7Ci0JZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhsb2NhbCwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwMDAsNyArNjAwNiw3IEBACiAJCW1lbWNweShBUExpc3RfcmlkLmFwWzBdLCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTik7CiAJCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKIAkJd3JpdGVBUExpc3RSaWQobG9jYWwsICZBUExpc3RfcmlkLCAxKTsKLQkJZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisJCWVuYWJsZV9NQUMobG9jYWwsIDEpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc0NTQsNyArNzQ2MCw2IEBACiAJCQkgICAgICBjaGFyICpleHRyYSkJCQkvKiBOVUxMICovCiB7CiAJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAKIAlpZiAoIXRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncykpCiAJCXJldHVybiAwOwpAQCAtNzQ3OSw3ICs3NDg0LDcgQEAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl3cml0ZUNvbmZpZ1JpZChsb2NhbCwgMCk7Ci0JZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMCk7CisJZW5hYmxlX01BQyhsb2NhbCwgMCk7CiAJaWYgKHRlc3RfYml0IChGTEFHX1JFU0VULCAmbG9jYWwtPmZsYWdzKSkKIAkJYWlyb19zZXRfcHJvbWlzYyhsb2NhbCk7CiAJZWxzZQpAQCAtNzc0Niw3ICs3NzUxLDYgQEAKIAl1bnNpZ25lZCBjaGFyICppb2J1ZjsKIAlpbnQgbGVuOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCiAJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTc3NTgsNyArNzc2Miw3IEBACiAJCWlmICh0ZXN0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncykpIHsKIAkJCWRpc2FibGVfTUFDIChhaSwgMSk7CiAJCQl3cml0ZUNvbmZpZ1JpZCAoYWksIDEpOwotCQkJZW5hYmxlX01BQyAoYWksICZyc3AsIDEpOworCQkJZW5hYmxlX01BQyhhaSwgMSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBBSVJPR1NMSVNUOiAgICByaWRjb2RlID0gUklEX1NTSUQ7ICAgICAgICAgYnJlYWs7CkBAIC03ODE1LDcgKzc4MTksNiBAQAogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCWludCAgcmlkY29kZTsKICAgICAgICAgaW50ICBlbmFibGVkOwotCVJlc3AgICAgICByc3A7CiAJc3RhdGljIGludCAoKiB3cml0ZXIpKHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7CiAJdW5zaWduZWQgY2hhciAqaW9idWY7CiAKQEAgLTc4NDksNyArNzg1Miw3IEBACiAJCSAqIHNhbWUgd2l0aCBNQUMgb2ZmCiAJCSAqLwogCWNhc2UgQUlST1BNQUNPTjoKLQkJaWYgKGVuYWJsZV9NQUMoYWksICZyc3AsIDEpICE9IDApCisJCWlmIChlbmFibGVfTUFDKGFpLCAxKSAhPSAwKQogCQkJcmV0dXJuIC1FSU87CiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggZDUxZGFmOC4uMDcyZWRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtMTc2OCw3ICsxNzY4LDggQEAKIAogCQlpZiAocHJpdi0+c3RvcF9yZl9raWxsKSB7CiAJCQlwcml2LT5zdG9wX3JmX2tpbGwgPSAwOwotCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAorCQkJCQkgICByb3VuZF9qaWZmaWVzKEhaKSk7CiAJCX0KIAogCQlkZWZlcnJlZCA9IDE7CkBAIC0yMDk4LDcgKzIwOTksNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUgUkYgS2lsbCBjaGVjayB0aW1lciBpcyBydW5uaW5nICovCiAJcHJpdi0+c3RvcF9yZl9raWxsID0gMDsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgSFopOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCByb3VuZF9qaWZmaWVzKEhaKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcl9zY2FuX2NvbXBsZXRlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBzdGF0dXMpCkBAIC00MjMzLDcgKzQyMzQsOCBAQAogCQkJLyogTWFrZSBzdXJlIHRoZSBSRl9LSUxMIGNoZWNrIHRpbWVyIGlzIHJ1bm5pbmcgKi8KIAkJCXByaXYtPnN0b3BfcmZfa2lsbCA9IDA7CiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKKwkJCQkJICAgcm91bmRfamlmZmllcyhIWikpOwogCQl9IGVsc2UKIAkJCXNjaGVkdWxlX3Jlc2V0KHByaXYpOwogCX0KQEAgLTU5NjksNyArNTk3MSw4IEBACiAJaWYgKHJmX2tpbGxfYWN0aXZlKHByaXYpKSB7CiAJCUlQV19ERUJVR19SRl9LSUxMKCJSRiBLaWxsIGFjdGl2ZSwgcmVzY2hlZHVsaW5nIEdQSU8gY2hlY2tcbiIpOwogCQlpZiAoIXByaXYtPnN0b3BfcmZfa2lsbCkKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKKwkJCQkJICAgcm91bmRfamlmZmllcyhIWikpOwogCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCmluZGV4IDdjYjIwNTIuLmFhMzJhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKQEAgLTE3NTEsNyArMTc1MSw3IEBACiAJCQkvKiBNYWtlIHN1cmUgdGhlIFJGX0tJTEwgY2hlY2sgdGltZXIgaXMgcnVubmluZyAqLwogCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmZfa2lsbCk7CiAJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKLQkJCQkJICAgMiAqIEhaKTsKKwkJCQkJICAgcm91bmRfamlmZmllcygyICogSFopKTsKIAkJfSBlbHNlCiAJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnVwKTsKIAl9CkBAIC00NjkwLDcgKzQ2OTAsOCBAQAogCQkJZWxzZSBpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX0JBQ0tHUk9VTkRfU0NBTgogCQkJCSAmJiBwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkKIAkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2NhbiwgSFopOworCQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2NhbiwKKwkJCQkJCSAgIHJvdW5kX2ppZmZpZXMoSFopKTsKIAogCQkJLyogU2VuZCBhbiBlbXB0eSBldmVudCB0byB1c2VyIHNwYWNlLgogCQkJICogV2UgZG9uJ3Qgc2VuZCB0aGUgcmVjZWl2ZWQgZGF0YSBvbiB0aGUgZXZlbnQgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwppbmRleCAxM2Y2NTI4Li40YThmNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJCWlmICgqZW5hYmxlKQogCQkJcGVuYWJsZVJTTi0+ZW5hYmxlID0gY3B1X3RvX2xlMTYoY21kX2VuYWJsZV9yc24pOwogCQllbHNlCi0JCQlwZW5hYmxlUlNOLT5lbmFibGUgPSBjcHVfdG9fbGUxNihjbWRfZW5hYmxlX3Jzbik7CisJCQlwZW5hYmxlUlNOLT5lbmFibGUgPSBjcHVfdG9fbGUxNihjbWRfZGlzYWJsZV9yc24pOwogCX0KIAogCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCmluZGV4IDRhNTkzMDYuLjlmMzY2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKQEAgLTYxMyw2ICs2MTMsNyBAQAogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJbGJzX2RlYl90aHJlYWQoICJtYWluLXRocmVhZCAxMTE6IGludGNvdW50ZXI9JWQgIgogCQkgICAgICAgImN1cnJlbnR0eHNrYj0lcCBkbmxkX3NlbnQ9JWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwppbmRleCA4OGQ5ZDJkLi43NjljODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKQEAgLTQzOSw3ICs0MzksNiBAQAogCXJldCA9IDA7CiAKIGRvbmU6Ci0Jc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoMHgwMDE5KTsJLyogRVRIX1BfODAyMTFfUkFXICovCiAJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfUlgsICJyZXQgJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKaW5kZXggZjQyYjc5Ni4uMmZjYzNiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYwpAQCAtMTcxOSw5ICsxNzE5LDYgQEAKIAkJCXBrZXktPnR5cGUgPSBLRVlfVFlQRV9JRF9US0lQOwogCQl9IGVsc2UgaWYgKGFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApIHsKIAkJCXBrZXktPnR5cGUgPSBLRVlfVFlQRV9JRF9BRVM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiBJZiBXUEEgaXNuJ3QgZW5hYmxlZCB5ZXQsIGRvIHRoYXQgbm93ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwppbmRleCAyODNiZTRhLi41ODVmNTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTE4NTMsNyArMTg1Myw2IEBACiAJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKIAlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKIAogCWlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQpAQCAtMTg2MSwxMSArMTg2MCw5IEBACiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQ7IHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIF9saXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZhY2wtPm1hY19saXN0LCBfbGlzdCkgewogCQlpZiAobWVtY21wKGVudHJ5LT5hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTikgPT0gMCkgewotCQkJbGlzdF9kZWwocHRyKTsKKwkJCWxpc3RfZGVsKCZlbnRyeS0+X2xpc3QpOwogCQkJYWNsLT5zaXplLS07CiAJCQlrZnJlZShlbnRyeSk7CiAJCQl1cCgmYWNsLT5zZW0pOwpAQCAtMTg4Myw3ICsxODgwLDYgQEAKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOwogCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmRzdCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CiAKIAlkd3JxLT5sZW5ndGggPSAwOwpAQCAtMTg5MSw5ICsxODg3LDcgQEAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFjbC0+bWFjX2xpc3QsIF9saXN0KSB7CiAJCW1lbWNweShkc3QtPnNhX2RhdGEsIGVudHJ5LT5hZGRyLCBFVEhfQUxFTik7CiAJCWRzdC0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQlkd3JxLT5sZW5ndGgrKzsKQEAgLTE5NjAsNyArMTk1NCw2IEBACiBzdGF0aWMgaW50CiBwcmlzbTU0X21hY19hY2NlcHQoc3RydWN0IGlzbHBjaV9hY2wgKmFjbCwgY2hhciAqbWFjKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKIAlpbnQgcmVzID0gMDsKIApAQCAtMTk3Miw4ICsxOTY1LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQ7IHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYWNsLT5tYWNfbGlzdCwgX2xpc3QpIHsKIAkJaWYgKG1lbWNtcChlbnRyeS0+YWRkciwgbWFjLCBFVEhfQUxFTikgPT0gMCkgewogCQkJcmVzID0gMTsKIAkJCWJyZWFrOwpAQCAtMjIxNiwxMSArMjIwOCw5IEBACiB2b2lkCiBwcmlzbTU0X3dwYV9ic3NfaWVfY2xlYW4oaXNscGNpX3ByaXZhdGUgKnByaXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKwlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzcywgKm47CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuLCAmcHJpdi0+YnNzX3dwYV9saXN0KSB7Ci0JCXN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSAqYnNzOwotCQlic3MgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnNzLCBuLCAmcHJpdi0+YnNzX3dwYV9saXN0LCBsaXN0KSB7CiAJCWtmcmVlKGJzcyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4N19ydGw4MjI1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYwppbmRleCBlMjVhMDlmLi5lZmM0MTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYwpAQCAtNjcsNyArNjcsNyBAQAogCW1zbGVlcCgyKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODIyNV93cml0ZV84MDUxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTggYWRkciwgdTE2IGRhdGEpCitzdGF0aWMgdm9pZCBydGw4MjI1X3dyaXRlXzgwNTEoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1OCBhZGRyLCBfX2xlMTYgZGF0YSkKIHsKIAlzdHJ1Y3QgcnRsODE4N19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXUxNiByZWc4MCwgcmVnODIsIHJlZzg0OwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJc3RydWN0IHJ0bDgxODdfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAogCWlmIChwcml2LT5hc2ljX3JldikKLQkJcnRsODIyNV93cml0ZV84MDUxKGRldiwgYWRkciwgZGF0YSk7CisJCXJ0bDgyMjVfd3JpdGVfODA1MShkZXYsIGFkZHIsIGNwdV90b19sZTE2KGRhdGEpKTsKIAllbHNlCiAJCXJ0bDgyMjVfd3JpdGVfYml0YmFuZyhkZXYsIGFkZHIsIGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCmluZGV4IDViNjI0YmYuLmMzOWYxOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKQEAgLTQ5LDggKzQ5LDkgQEAKIAlaRF9NRU1DTEVBUihjaGlwLCBzaXplb2YoKmNoaXApKTsKIH0KIAotc3RhdGljIGludCBzY25wcmludF9tYWNfb3VpKGNvbnN0IHU4ICphZGRyLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBzY25wcmludF9tYWNfb3VpKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogeworCXU4ICphZGRyID0gemRfdXNiX3RvX25ldGRldigmY2hpcC0+dXNiKS0+ZGV2X2FkZHI7CiAJcmV0dXJuIHNjbnByaW50ZihidWZmZXIsIHNpemUsICIlMDJ4LSUwMngtJTAyeCIsCiAJCSAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0pOwogfQpAQCAtNjEsMTAgKzYyLDEwIEBACiAJaW50IGkgPSAwOwogCiAJaSA9IHNjbnByaW50ZihidWZmZXIsIHNpemUsICJ6ZDEyMTElcyBjaGlwICIsCi0JCSAgICAgIGNoaXAtPmlzX3pkMTIxMWIgPyAiYiIgOiAiIik7CisJCSAgICAgIHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSA/ICJiIiA6ICIiKTsKIAlpICs9IHpkX3VzYl9zY25wcmludF9pZCgmY2hpcC0+dXNiLCBidWZmZXIraSwgc2l6ZS1pKTsKIAlpICs9IHNjbnByaW50ZihidWZmZXIraSwgc2l6ZS1pLCAiICIpOwotCWkgKz0gc2NucHJpbnRfbWFjX291aShjaGlwLT5lMnBfbWFjLCBidWZmZXIraSwgc2l6ZS1pKTsKKwlpICs9IHNjbnByaW50X21hY19vdWkoY2hpcCwgYnVmZmVyK2ksIHNpemUtaSk7CiAJaSArPSBzY25wcmludGYoYnVmZmVyK2ksIHNpemUtaSwgIiAiKTsKIAlpICs9IHpkX3JmX3NjbnByaW50X2lkKCZjaGlwLT5yZiwgYnVmZmVyK2ksIHNpemUtaSk7CiAJaSArPSBzY25wcmludGYoYnVmZmVyK2ksIHNpemUtaSwgIiBwYSUxeCAlYyVjJWMlYyVjIiwgY2hpcC0+cGFfdHlwZSwKQEAgLTM2Niw2NCArMzY3LDkgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyLAotCSAgICAgICAgICAgICAgICAgIGNvbnN0IHpkX2FkZHJfdCAqYWRkcikKLXsKLQlpbnQgcjsKLQl1MzIgcGFydHNbMl07Ci0KLQlyID0gemRfaW9yZWFkMzJ2X2xvY2tlZChjaGlwLCBwYXJ0cywgKGNvbnN0IHpkX2FkZHJfdCAqKWFkZHIsIDIpOwotCWlmIChyKSB7Ci0JCWRldl9kYmdfZih6ZF9jaGlwX2RldihjaGlwKSwKLQkJCSJlcnJvcjogY291bGRuJ3QgcmVhZCBlMnAgbWFjcy4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JbWFjX2FkZHJbMF0gPSBwYXJ0c1swXTsKLQltYWNfYWRkclsxXSA9IHBhcnRzWzBdID4+ICA4OwotCW1hY19hZGRyWzJdID0gcGFydHNbMF0gPj4gMTY7Ci0JbWFjX2FkZHJbM10gPSBwYXJ0c1swXSA+PiAyNDsKLQltYWNfYWRkcls0XSA9IHBhcnRzWzFdOwotCW1hY19hZGRyWzVdID0gcGFydHNbMV0gPj4gIDg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX2UycF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKLXsKLQlzdGF0aWMgY29uc3QgemRfYWRkcl90IGFkZHJbMl0gPSB7IEUyUF9NQUNfQUREUl9QMSwgRTJQX01BQ19BRERSX1AyIH07Ci0KLQlaRF9BU1NFUlQobXV0ZXhfaXNfbG9ja2VkKCZjaGlwLT5tdXRleCkpOwotCXJldHVybiBfcmVhZF9tYWNfYWRkcihjaGlwLCBjaGlwLT5lMnBfbWFjLCAoY29uc3QgemRfYWRkcl90ICopYWRkcik7Ci19Ci0KIC8qIE1BQyBhZGRyZXNzOiBpZiBjdXN0b20gbWFjIGFkZHJlc3NlcyBhcmUgdG8gdG8gYmUgdXNlZCBDUl9NQUNfQUREUl9QMSBhbmQKICAqICAgICAgICAgICAgICBDUl9NQUNfQUREUl9QMiBtdXN0IGJlIG92ZXJ3cml0dGVuCiAgKi8KLXZvaWQgemRfZ2V0X2UycF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKQotewotCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQltZW1jcHkobWFjX2FkZHIsIGNoaXAtPmUycF9tYWMsIEVUSF9BTEVOKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLX0KLQotc3RhdGljIGludCByZWFkX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpCi17Ci0Jc3RhdGljIGNvbnN0IHpkX2FkZHJfdCBhZGRyWzJdID0geyBDUl9NQUNfQUREUl9QMSwgQ1JfTUFDX0FERFJfUDIgfTsKLQlyZXR1cm4gX3JlYWRfbWFjX2FkZHIoY2hpcCwgbWFjX2FkZHIsIChjb25zdCB6ZF9hZGRyX3QgKilhZGRyKTsKLX0KLQotaW50IHpkX3JlYWRfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcikKLXsKLQlpbnQgcjsKLQotCWRldl9kYmdfZih6ZF9jaGlwX2RldihjaGlwKSwgIlxuIik7Ci0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCXIgPSByZWFkX21hY19hZGRyKGNoaXAsIG1hY19hZGRyKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLQlyZXR1cm4gcjsKLX0KLQogaW50IHpkX3dyaXRlX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBjb25zdCB1OCAqbWFjX2FkZHIpCiB7CiAJaW50IHI7CkBAIC00NDQsMTIgKzM5MCw2IEBACiAKIAltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CiAJciA9IHpkX2lvd3JpdGUzMmFfbG9ja2VkKGNoaXAsIHJlcXMsIEFSUkFZX1NJWkUocmVxcykpOwotI2lmZGVmIERFQlVHCi0JewotCQl1OCB0bXBbRVRIX0FMRU5dOwotCQlyZWFkX21hY19hZGRyKGNoaXAsIHRtcCk7Ci0JfQotI2VuZGlmIC8qIERFQlVHICovCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CiAJcmV0dXJuIHI7CiB9CkBAIC04MDksNyArNzQ5LDcgQEAKIAogc3RhdGljIGludCBod19yZXNldF9waHkoc3RydWN0IHpkX2NoaXAgKmNoaXApCiB7Ci0JcmV0dXJuIGNoaXAtPmlzX3pkMTIxMWIgPyB6ZDEyMTFiX2h3X3Jlc2V0X3BoeShjaGlwKSA6CisJcmV0dXJuIHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSA/IHpkMTIxMWJfaHdfcmVzZXRfcGh5KGNoaXApIDoKIAkJICAgICAgICAgICAgICAgICAgemQxMjExX2h3X3Jlc2V0X3BoeShjaGlwKTsKIH0KIApAQCAtODc0LDcgKzgxNCw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JcmV0dXJuIGNoaXAtPmlzX3pkMTIxMWIgPworCXJldHVybiB6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkgPwogCQl6ZDEyMTFiX2h3X2luaXRfaG1hYyhjaGlwKSA6IHpkMTIxMV9od19pbml0X2htYWMoY2hpcCk7CiB9CiAKQEAgLTExMzYsOCArMTA3NiwxNSBAQAogCXJldHVybiAwOwogfQogCisvKiBSZWFkIG1hYyBhZGRyZXNzIHVzaW5nIHByZS1maXJtd2FyZSBpbnRlcmZhY2UgKi8KK2ludCB6ZF9jaGlwX3JlYWRfbWFjX2FkZHJfZncoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICphZGRyKQoreworCWRldl9kYmdfZih6ZF9jaGlwX2RldihjaGlwKSwgIlxuIik7CisJcmV0dXJuIHpkX3VzYl9yZWFkX2Z3KCZjaGlwLT51c2IsIEUyUF9NQUNfQUREUl9QMSwgYWRkciwKKwkJRVRIX0FMRU4pOworfQogCi1pbnQgemRfY2hpcF9pbml0X2h3KHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCBkZXZpY2VfdHlwZSkKK2ludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXApCiB7CiAJaW50IHI7CiAJdTggcmZfdHlwZTsKQEAgLTExNDUsNyArMTA5Miw2IEBACiAJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQljaGlwLT5pc196ZDEyMTFiID0gKGRldmljZV90eXBlID09IERFVklDRV9aRDEyMTFCKSAhPSAwOwogCiAjaWZkZWYgREVCVUcKIAlyID0gdGVzdF9pbml0KGNoaXApOwpAQCAtMTIwMSwxMCArMTE0Nyw2IEBACiAJCWdvdG8gb3V0OwogI2VuZGlmIC8qIERFQlVHICovCiAKLQlyID0gcmVhZF9lMnBfbWFjX2FkZHIoY2hpcCk7Ci0JaWYgKHIpCi0JCWdvdG8gb3V0OwotCiAJciA9IHJlYWRfY2FsX2ludF90YWJsZXMoY2hpcCk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0OwpAQCAtMTI1OSw3ICsxMjAxLDcgQEAKIAlyID0gdXBkYXRlX3B3cl9pbnQoY2hpcCwgY2hhbm5lbCk7CiAJaWYgKHIpCiAJCXJldHVybiByOwotCWlmIChjaGlwLT5pc196ZDEyMTFiKSB7CisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkgewogCQlzdGF0aWMgY29uc3Qgc3RydWN0IHpkX2lvcmVxMTYgaW9yZXFzW10gPSB7CiAJCQl7IENSNjksIDB4MjggfSwKIAkJCXt9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCmluZGV4IDc5ZDAyODguLmY0Njk4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKQEAgLTcwNCw3ICs3MDQsNiBAQAogCXN0cnVjdCBtdXRleCBtdXRleDsKIAkvKiBCYXNlIGFkZHJlc3Mgb2YgRldfUkVHXyByZWdpc3RlcnMgKi8KIAl6ZF9hZGRyX3QgZndfcmVnc19iYXNlOwotCXU4IGUycF9tYWNbRVRIX0FMRU5dOwogCS8qIEVlcFNldFBvaW50IGluIHRoZSB2ZW5kb3IgZHJpdmVyICovCiAJdTggcHdyX2NhbF92YWx1ZXNbRTJQX0NIQU5ORUxfQ09VTlRdOwogCS8qIGludGVncmF0aW9uIHZhbHVlcyBpbiB0aGUgdmVuZG9yIGRyaXZlciAqLwpAQCAtNzE1LDcgKzcxNCw3IEBACiAJdW5zaWduZWQgaW50IHBhX3R5cGU6NCwKIAkJcGF0Y2hfY2NrX2dhaW46MSwgcGF0Y2hfY3IxNTc6MSwgcGF0Y2hfNm1fYmFuZF9lZGdlOjEsCiAJCW5ld19waHlfbGF5b3V0OjEsIGFsMjIzMHNfYml0OjEsCi0JCWlzX3pkMTIxMWI6MSwgc3VwcG9ydHNfdHhfbGVkOjE7CisJCXN1cHBvcnRzX3R4X2xlZDoxOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgemRfY2hpcCAqemRfdXNiX3RvX2NoaXAoc3RydWN0IHpkX3VzYiAqdXNiKQpAQCAtNzM0LDkgKzczMywxNSBAQAogCSAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJICAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogdm9pZCB6ZF9jaGlwX2NsZWFyKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKLWludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4IGRldmljZV90eXBlKTsKK2ludCB6ZF9jaGlwX3JlYWRfbWFjX2FkZHJfZncoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICphZGRyKTsKK2ludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogaW50IHpkX2NoaXBfcmVzZXQoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogCitzdGF0aWMgaW5saW5lIGludCB6ZF9jaGlwX2lzX3pkMTIxMWIoc3RydWN0IHpkX2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNoaXAtPnVzYi5pc196ZDEyMTFiOworfQorCiBzdGF0aWMgaW5saW5lIGludCB6ZF9pb3JlYWQxNnZfbG9ja2VkKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MTYgKnZhbHVlcywKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6ZF9hZGRyX3QgKmFkZHJlc3NlcywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQpCkBAIC04MjUsOCArODMwLDYgQEAKIH0KIHU4ICB6ZF9jaGlwX2dldF9jaGFubmVsKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIGludCB6ZF9yZWFkX3JlZ2RvbWFpbihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKnJlZ2RvbWFpbik7Ci12b2lkIHpkX2dldF9lMnBfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcik7Ci1pbnQgemRfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKTsKIGludCB6ZF93cml0ZV9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgY29uc3QgdTggKm1hY19hZGRyKTsKIGludCB6ZF9jaGlwX3N3aXRjaF9yYWRpb19vbihzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiBpbnQgemRfY2hpcF9zd2l0Y2hfcmFkaW9fb2ZmKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKaW5kZXggNjc1M2QyNC4uZjZjNDg3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKQEAgLTg2LDM4ICs4Niw0NiBAQAogCXJldHVybiByOwogfQogCi1pbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjLCB1OCBkZXZpY2VfdHlwZSkKK2ludCB6ZF9tYWNfcHJlaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMpCit7CisJaW50IHI7CisJdTggYWRkcltFVEhfQUxFTl07CisKKwlyID0gemRfY2hpcF9yZWFkX21hY19hZGRyX2Z3KCZtYWMtPmNoaXAsIGFkZHIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCW1lbWNweShtYWMtPm5ldGRldi0+ZGV2X2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHpkX21hY19pbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYykKIHsKIAlpbnQgcjsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9ICZtYWMtPmNoaXA7Ci0JdTggYWRkcltFVEhfQUxFTl07CiAJdTggZGVmYXVsdF9yZWdkb21haW47CiAKIAlyID0gemRfY2hpcF9lbmFibGVfaW50KGNoaXApOwogCWlmIChyKQogCQlnb3RvIG91dDsKLQlyID0gemRfY2hpcF9pbml0X2h3KGNoaXAsIGRldmljZV90eXBlKTsKKwlyID0gemRfY2hpcF9pbml0X2h3KGNoaXApOwogCWlmIChyKQogCQlnb3RvIGRpc2FibGVfaW50OwogCi0JemRfZ2V0X2UycF9tYWNfYWRkcihjaGlwLCBhZGRyKTsKLQlyID0gemRfd3JpdGVfbWFjX2FkZHIoY2hpcCwgYWRkcik7Ci0JaWYgKHIpCi0JCWdvdG8gZGlzYWJsZV9pbnQ7CiAJWkRfQVNTRVJUKCFpcnFzX2Rpc2FibGVkKCkpOwotCXNwaW5fbG9ja19pcnEoJm1hYy0+bG9jayk7Ci0JbWVtY3B5KG1hYy0+bmV0ZGV2LT5kZXZfYWRkciwgYWRkciwgRVRIX0FMRU4pOwotCXNwaW5fdW5sb2NrX2lycSgmbWFjLT5sb2NrKTsKIAogCXIgPSB6ZF9yZWFkX3JlZ2RvbWFpbihjaGlwLCAmZGVmYXVsdF9yZWdkb21haW4pOwogCWlmIChyKQogCQlnb3RvIGRpc2FibGVfaW50OwogCWlmICghemRfcmVnZG9tYWluX3N1cHBvcnRlZChkZWZhdWx0X3JlZ2RvbWFpbikpIHsKLQkJZGV2X2RiZ19mKHpkX21hY19kZXYobWFjKSwKLQkJCSAgIlJlZ3VsYXRvcnkgRG9tYWluICUjMDR4IGlzIG5vdCBzdXBwb3J0ZWQuXG4iLAotCQkgICAgICAgICAgZGVmYXVsdF9yZWdkb21haW4pOwotCQlyID0gLUVJTlZBTDsKLQkJZ290byBkaXNhYmxlX2ludDsKKwkJLyogVGhlIHZlbmRvciBkcml2ZXIgb3ZlcnJpZGVzIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBhbmQKKwkJICogYWxsb3dlZCBjaGFubmVsIHJlZ2lzdGVycyBhbmQgdW5jb25kaXRpb25hbGx5IHJlc3RyaWN0cworCQkgKiBhdmFpbGFibGUgY2hhbm5lbHMgdG8gMS0xMSBldmVyeXdoZXJlLiBNYXRjaCB0aGVpcgorCQkgKiBxdWVzdGlvbmFibGUgYmVoYXZpb3VyIG9ubHkgZm9yIHJlZ2RvbWFpbnMgd2hpY2ggd2UgZG9uJ3QKKwkJICogcmVjb2duaXNlLiAqLworCQlkZXZfd2Fybih6ZF9tYWNfZGV2KG1hYyksICAiVW5yZWNvZ25pc2VkIHJlZ3VsYXRvcnkgZG9tYWluOiAiCisJCQkiJSMwNHguIERlZmF1bHRpbmcgdG8gRkNDLlxuIiwgZGVmYXVsdF9yZWdkb21haW4pOworCQlkZWZhdWx0X3JlZ2RvbWFpbiA9IFpEX1JFR0RPTUFJTl9GQ0M7CiAJfQogCXNwaW5fbG9ja19pcnEoJm1hYy0+bG9jayk7CiAJbWFjLT5yZWdkb21haW4gPSBtYWMtPmRlZmF1bHRfcmVnZG9tYWluID0gZGVmYXVsdF9yZWdkb21haW47CkBAIC0xNjQsMTQgKzE3MiwyNSBAQAogewogCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IHpkX25ldGRldl9tYWMobmV0ZGV2KTsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9ICZtYWMtPmNoaXA7CisJc3RydWN0IHpkX3VzYiAqdXNiID0gJmNoaXAtPnVzYjsKIAlpbnQgcjsKIAorCWlmICghdXNiLT5pbml0aWFsaXplZCkgeworCQlyID0gemRfdXNiX2luaXRfaHcodXNiKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwl9CisKIAl0YXNrbGV0X2VuYWJsZSgmbWFjLT5yeF90YXNrbGV0KTsKIAogCXIgPSB6ZF9jaGlwX2VuYWJsZV9pbnQoY2hpcCk7CiAJaWYgKHIgPCAwKQogCQlnb3RvIG91dDsKIAorCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBuZXRkZXYtPmRldl9hZGRyKTsKKwlpZiAocikKKwkJZ290byBkaXNhYmxlX2ludDsKKwogCXIgPSB6ZF9jaGlwX3NldF9iYXNpY19yYXRlcyhjaGlwLCBDUl9SQVRFU184MDIxMUIgfCBDUl9SQVRFU184MDIxMUcpOwogCWlmIChyIDwgMCkKIAkJZ290byBkaXNhYmxlX2ludDsKQEAgLTI1MSw5ICsyNzAsMTEgQEAKIAlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLAogCQkgICJTZXR0aW5nIE1BQyB0byAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhhZGRyLT5zYV9kYXRhKSk7CiAKLQlyID0gemRfd3JpdGVfbWFjX2FkZHIoY2hpcCwgYWRkci0+c2FfZGF0YSk7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBhZGRyLT5zYV9kYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CiAJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKQEAgLTg1NSw3ICs4NzYsNyBAQAogCS8qIFpEMTIxMUI6IENvbXB1dGluZyB0aGUgbGVuZ3RoIGRpZmZlcmVuY2UgdGhpcyB3YXksIGdpdmVzIHVzCiAJICogZmxleGliaWxpdHkgdG8gY29tcHV0ZSB0aGUgcGFja2V0IGxlbmd0aC4KIAkgKi8KLQljcy0+cGFja2V0X2xlbmd0aCA9IGNwdV90b19sZTE2KG1hYy0+Y2hpcC5pc196ZDEyMTFiID8KKwljcy0+cGFja2V0X2xlbmd0aCA9IGNwdV90b19sZTE2KHpkX2NoaXBfaXNfemQxMjExYigmbWFjLT5jaGlwKSA/CiAJCQlwYWNrZXRfbGVuZ3RoIC0gZnJhZ19sZW4gOiBwYWNrZXRfbGVuZ3RoKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCmluZGV4IGZhZjRjNzguLjlmOTM0NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCkBAIC0xODksNyArMTg5LDggQEAKIAkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogdm9pZCB6ZF9tYWNfY2xlYXIoc3RydWN0IHpkX21hYyAqbWFjKTsKIAotaW50IHpkX21hY19pbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYywgdTggZGV2aWNlX3R5cGUpOworaW50IHpkX21hY19wcmVpbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYyk7CitpbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjKTsKIAogaW50IHpkX21hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogaW50IHpkX21hY19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMKaW5kZXggNzQwNzQwOS4uYWJlNWQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jCkBAIC0zNCw3ICszNCw3IEBACiAJW0FMMjIxMF9SRl0JPSAiQUwyMjEwX1JGIiwKIAlbTUFYSU1fTkVXX1JGXQk9ICJNQVhJTV9ORVdfUkYiLAogCVtVVzI0NTNfUkZdCT0gIlVXMjQ1M19SRiIsCi0JW1VOS05PV05fQV9SRl0JPSAiVU5LTk9XTl9BX1JGIiwKKwlbQUwyMjMwU19SRl0JPSAiQUwyMjMwU19SRiIsCiAJW1JBTElOS19SRl0JPSAiUkFMSU5LX1JGIiwKIAlbSU5URVJTSUxfUkZdCT0gIklOVEVSU0lMX1JGIiwKIAlbUkYyOTU5X1JGXQk9ICJSRjI5NTlfUkYiLApAQCAtNzcsNiArNzcsNyBAQAogCQlyID0gemRfcmZfaW5pdF9yZjI5NTkocmYpOwogCQlicmVhazsKIAljYXNlIEFMMjIzMF9SRjoKKwljYXNlIEFMMjIzMFNfUkY6CiAJCXIgPSB6ZF9yZl9pbml0X2FsMjIzMChyZik7CiAJCWJyZWFrOwogCWNhc2UgQUw3MjMwQl9SRjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oCmluZGV4IGM2ZGZkODIuLjMwNTAyZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaApAQCAtMjYsNyArMjYsNyBAQAogI2RlZmluZSBBTDIyMTBfUkYJCQkweDcKICNkZWZpbmUgTUFYSU1fTkVXX1JGCQkJMHg4CiAjZGVmaW5lIFVXMjQ1M19SRgkJCTB4OQotI2RlZmluZSBVTktOT1dOX0FfUkYJCQkweGEKKyNkZWZpbmUgQUwyMjMwU19SRgkJCTB4YQogI2RlZmluZSBSQUxJTktfUkYJCQkweGIKICNkZWZpbmUgSU5URVJTSUxfUkYJCQkweGMKICNkZWZpbmUgUkYyOTU5X1JGCQkJMHhkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDIyMzAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jCmluZGV4IGU3YTRlY2YuLjAwNjc3NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSAiemRfdXNiLmgiCiAjaW5jbHVkZSAiemRfY2hpcC5oIgogCisjZGVmaW5lIElTX0FMMjIzMFMoY2hpcCkgKChjaGlwKS0+YWwyMjMwc19iaXQgfHwgKGNoaXApLT5yZi50eXBlID09IEFMMjIzMFNfUkYpCisKIHN0YXRpYyBjb25zdCB1MzIgemQxMjExX2FsMjIzMF90YWJsZVtdWzNdID0gewogCVJGX0NIQU5ORUwoIDEpID0geyAweDAzZjc5MCwgMHgwMzMzMzEsIDB4MDAwMDBkLCB9LAogCVJGX0NIQU5ORUwoIDIpID0geyAweDAzZjc5MCwgMHgwYjMzMzEsIDB4MDAwMDBkLCB9LApAQCAtMTc2LDcgKzE3OCw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KSB7CisJaWYgKElTX0FMMjIzMFMoY2hpcCkpIHsKIAkJciA9IHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxc19pbml0X2FsMjIzMHMsCiAJCQlBUlJBWV9TSVpFKGlvcmVxc19pbml0X2FsMjIzMHMpKTsKIAkJaWYgKHIpCkBAIC0xODgsNyArMTkwLDcgQEAKIAkJcmV0dXJuIHI7CiAKIAkvKiBpbXByb3ZlIGJhbmQgZWRnZSBmb3IgQUwyMjMwUyAqLwotCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MDAwODI0LCBSRl9SVl9CSVRTKTsKIAllbHNlCiAJCXIgPSB6ZF9yZndyaXRlX2xvY2tlZChjaGlwLCAweDAwMDVhNCwgUkZfUlZfQklUUyk7CkBAIC0zMTQsNyArMzE2LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlpZiAoY2hpcC0+YWwyMjMwc19iaXQpIHsKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkgewogCQlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzX2luaXRfYWwyMjMwcywKIAkJCUFSUkFZX1NJWkUoaW9yZXFzX2luaXRfYWwyMjMwcykpOwogCQlpZiAocikKQEAgLTMyOCw3ICszMzAsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MjQxMDAwLCBSRl9SVl9CSVRTKTsKIAllbHNlCiAJCXIgPSB6ZF9yZndyaXRlX2xvY2tlZChjaGlwLCAweDI1YTAwMCwgUkZfUlZfQklUUyk7CkBAIC00MjIsNyArNDI0LDcgQEAKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCiAJcmYtPnN3aXRjaF9yYWRpb19vZmYgPSBhbDIyMzBfc3dpdGNoX3JhZGlvX29mZjsKLQlpZiAoY2hpcC0+aXNfemQxMjExYikgeworCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpIHsKIAkJcmYtPmluaXRfaHcgPSB6ZDEyMTFiX2FsMjIzMF9pbml0X2h3OwogCQlyZi0+c2V0X2NoYW5uZWwgPSB6ZDEyMTFiX2FsMjIzMF9zZXRfY2hhbm5lbDsKIAkJcmYtPnN3aXRjaF9yYWRpb19vbiA9IHpkMTIxMWJfYWwyMjMwX3N3aXRjaF9yYWRpb19vbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYwppbmRleCBmNGU4YjZhLi43M2QwYmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDcyMzBiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jCkBAIC00NzMsNyArNDczLDcgQEAKIHsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCi0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKSB7CiAJCXJmLT5pbml0X2h3ID0gemQxMjExYl9hbDcyMzBiX2luaXRfaHc7CiAJCXJmLT5zd2l0Y2hfcmFkaW9fb24gPSB6ZDEyMTFiX2FsNzIzMGJfc3dpdGNoX3JhZGlvX29uOwogCQlyZi0+c2V0X2NoYW5uZWwgPSB6ZDEyMTFiX2FsNzIzMGJfc2V0X2NoYW5uZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jCmluZGV4IDJkNzM2YmQuLmNjNzBkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIHsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCi0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKSB7CiAJCWRldl9lcnIoemRfY2hpcF9kZXYoY2hpcCksCiAJCSAgICAgICAiUkYyOTU5IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGZvciBaRDEyMTFCIgogCQkgICAgICAgIiBkZXZpY2VzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3V3MjQ1My5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMKaW5kZXggNDE0ZTQwZC4uODU3ZGNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChjaGlwLT5pc196ZDEyMTFiKQorCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpCiAJCWlvcmVxc1sxXS52YWx1ZSA9IDB4N2Y7CiAKIAlyZXR1cm4gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzLCBBUlJBWV9TSVpFKGlvcmVxcykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCBjYTI0Mjk5Li4yOGQ0MWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtNzEsNiArNzEsNyBAQAogCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQxMiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDEzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwMDUzLCAweDUzMDEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAorCXsgVVNCX0RFVklDRSgweDA0MTEsIDB4MDBkYSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJLyogIkRyaXZlcmxlc3MiIGRldmljZXMgdGhhdCBuZWVkIGVqZWN0aW5nICovCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgyMDExKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX0lOU1RBTExFUiB9LAogCXsgVVNCX0RFVklDRSgweDBhY2UsIDB4MjBmZiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9JTlNUQUxMRVIgfSwKQEAgLTE5NSwyNiArMTk2LDI3IEBACiAJcmV0dXJuIGxlMTZfdG9fY3B1KHBbb2Zmc2V0XSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXRfZndfbmFtZShjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCB1OCBkZXZpY2VfdHlwZSwKK3N0YXRpYyBjaGFyICpnZXRfZndfbmFtZShzdHJ1Y3QgemRfdXNiICp1c2IsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCiAJICAgICAgICAgICAgICAgY29uc3QgY2hhciogcG9zdGZpeCkKIHsKIAlzY25wcmludGYoYnVmZmVyLCBzaXplLCAiJXMlcyIsCi0JCWRldmljZV90eXBlID09IERFVklDRV9aRDEyMTFCID8KKwkJdXNiLT5pc196ZDEyMTFiID8KIAkJCUZXX1pEMTIxMUJfUFJFRklYIDogRldfWkQxMjExX1BSRUZJWCwKIAkJcG9zdGZpeCk7CiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfdmVyc2lvbl9taXNtYXRjaChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggZGV2aWNlX3R5cGUsCitzdGF0aWMgaW50IGhhbmRsZV92ZXJzaW9uX21pc21hdGNoKHN0cnVjdCB6ZF91c2IgKnVzYiwKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnViX2Z3KQogeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdXJfZncgPSBOVUxMOwogCWludCBvZmZzZXQ7CiAJaW50IHIgPSAwOwogCWNoYXIgZndfbmFtZVsxMjhdOwogCiAJciA9IHJlcXVlc3RfZndfZmlsZSgmdXJfZncsCi0JCWdldF9md19uYW1lKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgZGV2aWNlX3R5cGUsICJ1ciIpLAorCQlnZXRfZndfbmFtZSh1c2IsIGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInVyIiksCiAJCSZ1ZGV2LT5kZXYpOwogCWlmIChyKQogCQlnb3RvIGVycm9yOwpAQCAtMjM3LDExICsyMzksMTIgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCB1cGxvYWRfZmlybXdhcmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHU4IGRldmljZV90eXBlKQorc3RhdGljIGludCB1cGxvYWRfZmlybXdhcmUoc3RydWN0IHpkX3VzYiAqdXNiKQogewogCWludCByOwogCXUxNiBmd19iY2REZXZpY2U7CiAJdTE2IGJjZERldmljZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHpkX3VzYl90b191c2JkZXYodXNiKTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnViX2Z3ID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVwaF9mdyA9IE5VTEw7CiAJY2hhciBmd19uYW1lWzEyOF07CkBAIC0yNDksNyArMjUyLDcgQEAKIAliY2REZXZpY2UgPSBnZXRfYmNkRGV2aWNlKHVkZXYpOwogCiAJciA9IHJlcXVlc3RfZndfZmlsZSgmdWJfZncsCi0JCWdldF9md19uYW1lKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgZGV2aWNlX3R5cGUsICAidWIiKSwKKwkJZ2V0X2Z3X25hbWUodXNiLCBmd19uYW1lLCBzaXplb2YoZndfbmFtZSksICJ1YiIpLAogCQkmdWRldi0+ZGV2KTsKIAlpZiAocikKIAkJZ290byBlcnJvcjsKQEAgLTI2NCw3ICsyNjcsNyBAQAogCQkJZGV2X3dhcm4oJnVkZXYtPmRldiwgImRldmljZSBoYXMgb2xkIGJvb3Rjb2RlLCBwbGVhc2UgIgogCQkJCSJyZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlXG4iKTsKIAotCQlyID0gaGFuZGxlX3ZlcnNpb25fbWlzbWF0Y2godWRldiwgZGV2aWNlX3R5cGUsIHViX2Z3KTsKKwkJciA9IGhhbmRsZV92ZXJzaW9uX21pc21hdGNoKHVzYiwgdWJfZncpOwogCQlpZiAocikKIAkJCWdvdG8gZXJyb3I7CiAJfSBlbHNlIHsKQEAgLTI3NSw3ICsyNzgsNyBAQAogCiAKIAlyID0gcmVxdWVzdF9md19maWxlKCZ1cGhfZncsCi0JCWdldF9md19uYW1lKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgZGV2aWNlX3R5cGUsICJ1cGhyIiksCisJCWdldF9md19uYW1lKHVzYiwgZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAidXBociIpLAogCQkmdWRldi0+ZGV2KTsKIAlpZiAocikKIAkJZ290byBlcnJvcjsKQEAgLTI5NCw2ICsyOTcsMzAgQEAKIAlyZXR1cm4gcjsKIH0KIAorLyogUmVhZCBkYXRhIGZyb20gZGV2aWNlIGFkZHJlc3Mgc3BhY2UgdXNpbmcgImZpcm13YXJlIGludGVyZmFjZSIgd2hpY2ggZG9lcworICogbm90IHJlcXVpcmUgZmlybXdhcmUgdG8gYmUgbG9hZGVkLiAqLworaW50IHpkX3VzYl9yZWFkX2Z3KHN0cnVjdCB6ZF91c2IgKnVzYiwgemRfYWRkcl90IGFkZHIsIHU4ICpkYXRhLCB1MTYgbGVuKQoreworCWludCByOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOworCisJciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCVVTQl9SRVFfRklSTVdBUkVfUkVBRF9EQVRBLCBVU0JfRElSX0lOIHwgMHg0MCwgYWRkciwgMCwKKwkJZGF0YSwgbGVuLCA1MDAwKTsKKwlpZiAociA8IDApIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJInJlYWQgb3ZlciBmaXJtd2FyZSBpbnRlcmZhY2UgZmFpbGVkOiAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0gZWxzZSBpZiAociAhPSBsZW4pIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJImluY29tcGxldGUgcmVhZCBvdmVyIGZpcm13YXJlIGludGVyZmFjZTogJWQvJWRcbiIsCisJCQlyLCBsZW4pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSB1cmJfZGV2KHVyYikgKCYodXJiKS0+ZGV2LT5kZXYpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfcmVnc19pbnQoc3RydWN0IHVyYiAqdXJiKQpAQCAtOTIwLDkgKzk0Nyw0MiBAQAogCXJldHVybiAwOwogfQogCitpbnQgemRfdXNiX2luaXRfaHcoc3RydWN0IHpkX3VzYiAqdXNiKQoreworCWludCByOworCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IHpkX3VzYl90b19tYWModXNiKTsKKworCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJcbiIpOworCisJciA9IHVwbG9hZF9maXJtd2FyZSh1c2IpOworCWlmIChyKSB7CisJCWRldl9lcnIoemRfdXNiX2Rldih1c2IpLAorCQkgICAgICAgImNvdWxkbid0IGxvYWQgZmlybXdhcmUuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0KKworCXIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbih6ZF91c2JfdG9fdXNiZGV2KHVzYikpOworCWlmIChyKSB7CisJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksCisJCQkiY291bGRuJ3QgcmVzZXQgY29uZmlndXJhdGlvbi4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IHpkX21hY19pbml0X2h3KG1hYyk7CisJaWYgKHIpIHsKKwkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwKKwkJICAgICAgICAgImNvdWxkbid0IGluaXRpYWxpemUgbWFjLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwl1c2ItPmluaXRpYWxpemVkID0gMTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCWludCByOworCXN0cnVjdCB6ZF91c2IgKnVzYjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IE5VTEw7CiAKQEAgLTk1MCwyNiArMTAxMCwxMCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXIgPSB1cGxvYWRfZmlybXdhcmUodWRldiwgaWQtPmRyaXZlcl9pbmZvKTsKLQlpZiAocikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsCi0JCSAgICAgICAiY291bGRuJ3QgbG9hZCBmaXJtd2FyZS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKLQkJZ290byBlcnJvcjsKLQl9CisJdXNiID0gJnpkX25ldGRldl9tYWMobmV0ZGV2KS0+Y2hpcC51c2I7CisJdXNiLT5pc196ZDEyMTFiID0gKGlkLT5kcml2ZXJfaW5mbyA9PSBERVZJQ0VfWkQxMjExQikgIT0gMDsKIAotCXIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbih1ZGV2KTsKLQlpZiAocikgewotCQlkZXZfZGJnX2YoJmludGYtPmRldiwKLQkJCSJjb3VsZG4ndCByZXNldCBjb25maWd1cmF0aW9uLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIEF0IHRoaXMgcG9pbnQgdGhlIGludGVycnVwdCBlbmRwb2ludCBpcyBub3QgZ2VuZXJhbGx5IGVuYWJsZWQuIFdlCi0JICogc2F2ZSB0aGUgVVNCIGJhbmR3aWR0aCB1bnRpbCB0aGUgbmV0d29yayBkZXZpY2UgaXMgb3BlbmVkLiBCdXQKLQkgKiBub3RpZnkgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIE1BQyB3aWxsIHJlcXVpcmUgdGhlCi0JICogaW50ZXJydXB0cyB0byBiZSB0ZW1wb3JhcnkgZW5hYmxlZC4KLQkgKi8KLQlyID0gemRfbWFjX2luaXRfaHcoemRfbmV0ZGV2X21hYyhuZXRkZXYpLCBpZC0+ZHJpdmVyX2luZm8pOworCXIgPSB6ZF9tYWNfcHJlaW5pdF9odyh6ZF9uZXRkZXZfbWFjKG5ldGRldikpOwogCWlmIChyKSB7CiAJCWRldl9kYmdfZigmaW50Zi0+ZGV2LAogCQkgICAgICAgICAiY291bGRuJ3QgaW5pdGlhbGl6ZSBtYWMuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCmluZGV4IDUwNmVhNmEuLjk2MWE3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCkBAIC0xODgsNiArMTg4LDcgQEAKIAlzdHJ1Y3QgemRfdXNiX3J4IHJ4OwogCXN0cnVjdCB6ZF91c2JfdHggdHg7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJdTggaXNfemQxMjExYjoxLCBpbml0aWFsaXplZDoxOwogfTsKIAogI2RlZmluZSB6ZF91c2JfZGV2KHVzYikgKCZ1c2ItPmludGYtPmRldikKQEAgLTIzNiw2ICsyMzcsOCBAQAogCiBpbnQgemRfdXNiX3Jmd3JpdGUoc3RydWN0IHpkX3VzYiAqdXNiLCB1MzIgdmFsdWUsIHU4IGJpdHMpOwogCitpbnQgemRfdXNiX3JlYWRfZncoc3RydWN0IHpkX3VzYiAqdXNiLCB6ZF9hZGRyX3QgYWRkciwgdTggKmRhdGEsIHUxNiBsZW4pOworCiBleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnpkX3dvcmtxdWV1ZTsKIAogI2VuZGlmIC8qIF9aRF9VU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L0tjb25maWcgYi9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZwppbmRleCBmNDZjNjllLi4wOWM5M2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZworKysgYi9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZwpAQCAtNSwxMSArNSw5IEBACiAjIFBhcnBvcnQgY29uZmlndXJhdGlvbi4KICMKIAotbWVudSAiUGFyYWxsZWwgcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBQQVJQT1JUCittZW51Y29uZmlnIFBBUlBPUlQKIAl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHdhbnQgdG8gdXNlIGRldmljZXMgY29ubmVjdGVkIHRvIHlvdXIgbWFjaGluZSdzIHBhcmFsbGVsIHBvcnQKIAkgICh0aGUgY29ubmVjdG9yIGF0IHRoZSBjb21wdXRlciB3aXRoIDI1IGhvbGVzKSwgZS5nLiBwcmludGVyLCBaSVAKQEAgLTMzLDkgKzMxLDExIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKK2lmIFBBUlBPUlQKKwogY29uZmlnIFBBUlBPUlRfUEMKIAl0cmlzdGF0ZSAiUEMtc3R5bGUgaGFyZHdhcmUiCi0JZGVwZW5kcyBvbiBQQVJQT1JUICYmICghU1BBUkM2NCB8fCBQQ0kpICYmICFTUEFSQzMyICYmICFNMzJSICYmICFGUlYKKwlkZXBlbmRzIG9uICghU1BBUkM2NCB8fCBQQ0kpICYmICFTUEFSQzMyICYmICFNMzJSICYmICFGUlYKIAktLS1oZWxwLS0tCiAJICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBQQy1zdHlsZSBwYXJhbGxlbCBwb3J0LiBBbGwKIAkgIElCTSBQQyBjb21wYXRpYmxlIGNvbXB1dGVycyBhbmQgc29tZSBBbHBoYXMgaGF2ZSBQQy1zdHlsZQpAQCAtODUsNyArODUsNyBAQAogCiBjb25maWcgUEFSUE9SVF9JUDMyCiAJdHJpc3RhdGUgIlNHSSBJUDMyIGJ1aWx0aW4gcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFNHSV9JUDMyICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBTR0lfSVAzMiAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IG9uCkBAIC05NCw3ICs5NCw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0FNSUdBCiAJdHJpc3RhdGUgIkFtaWdhIGJ1aWx0aW4gcG9ydCIKLQlkZXBlbmRzIG9uIEFNSUdBICYmIFBBUlBPUlQKKwlkZXBlbmRzIG9uIEFNSUdBCiAJc2VsZWN0IFBBUlBPUlRfTk9UX1BDCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgbmVlZCBzdXBwb3J0IGZvciB0aGUgcGFyYWxsZWwgcG9ydCBoYXJkd2FyZSBvbgpAQCAtMTAzLDcgKzEwMyw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX01GQzMKIAl0cmlzdGF0ZSAiTXVsdGlmYWNlIElJSSBwYXJhbGxlbCBwb3J0IgotCWRlcGVuZHMgb24gWk9SUk8gJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gWk9SUk8KIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHBhcmFsbGVsIHBvcnQgc3VwcG9ydCBmb3IgdGhlIE1GQzMgY2FyZC4KQEAgLTExMiw3ICsxMTIsNyBAQAogCiBjb25maWcgUEFSUE9SVF9BVEFSSQogCXRyaXN0YXRlICJBdGFyaSBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uIEFUQVJJICYmIFBBUlBPUlQKKwlkZXBlbmRzIG9uIEFUQVJJCiAJc2VsZWN0IFBBUlBPUlRfTk9UX1BDCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgbmVlZCBzdXBwb3J0IGZvciB0aGUgcGFyYWxsZWwgcG9ydCBoYXJkd2FyZSBvbgpAQCAtMTIyLDEyICsxMjIsMTEgQEAKIGNvbmZpZyBQQVJQT1JUX0dTQwogCXRyaXN0YXRlCiAJZGVmYXVsdCBHU0MKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAogY29uZmlnIFBBUlBPUlRfU1VOQlBQCiAJdHJpc3RhdGUgIlNwYXJjIGhhcmR3YXJlIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gU0JVUyAmJiBQQVJQT1JUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gU0JVUyAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgYmlkaXJlY3Rpb25hbCBwYXJhbGxlbCBwb3J0CkBAIC0xMzYsNyArMTM1LDYgQEAKIAogY29uZmlnIFBBUlBPUlRfQVg4ODc5NgogCXRyaXN0YXRlICJBWDg4Nzk2IFBhcmFsbGVsIFBvcnQiCi0JZGVwZW5kcyBvbiBQQVJQT1JUCiAJc2VsZWN0IFBBUlBPUlRfTk9UX1BDCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgbmVlZCBzdXBwb3J0IGZvciB0aGUgcGFyYWxsZWwgcG9ydCBoYXJkd2FyZSBvbgpAQCAtMTQ4LDcgKzE0Niw2IEBACiAKIGNvbmZpZyBQQVJQT1JUXzEyODQKIAlib29sICJJRUVFIDEyODQgdHJhbnNmZXIgbW9kZXMiCi0JZGVwZW5kcyBvbiBQQVJQT1JUCiAJaGVscAogCSAgSWYgeW91IGhhdmUgYSBwcmludGVyIHRoYXQgc3VwcG9ydHMgc3RhdHVzIHJlYWRiYWNrIG9yIGRldmljZSBJRCwgb3IKIAkgIHdhbnQgdG8gdXNlIGEgZGV2aWNlIHRoYXQgdXNlcyBlbmhhbmNlZCBwYXJhbGxlbCBwb3J0IHRyYW5zZmVyIG1vZGVzCkBAIC0xNTksNSArMTU2LDQgQEAKIGNvbmZpZyBQQVJQT1JUX05PVF9QQwogCWJvb2wKIAotZW5kbWVudQotCitlbmRpZiAjIFBBUlBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCmluZGV4IDdiZmJhZDUuLjVkNThhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwpAQCAtMjQyNCw3ICsyNDI0LDYgQEAKIAl1MzIgaXRlODg3MnNldDsKIAl1MzIgaXRlODg3Ml9scHQsIGl0ZTg4NzJfbHB0aGk7CiAJdTggaXRlODg3Ml9pcnEsIHR5cGU7Ci0JY2hhciAqZmFrZV9uYW1lID0gInBhcnBvcnQgcHJvYmUiOwogCWludCBpcnE7CiAJaW50IGk7CiAKQEAgLTI0MzIsMTEgKzI0MzEsMTEgQEAKIAkKIAkvLyBtYWtlIHN1cmUgd2hpY2ggb25lIGNoaXAKIAlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJYmFzZV9yZXMgPSByZXF1ZXN0X3JlZ2lvbihpbnRhX2FkZHJbaV0sIDB4OCwgZmFrZV9uYW1lKTsKKwkJYmFzZV9yZXMgPSByZXF1ZXN0X3JlZ2lvbihpbnRhX2FkZHJbaV0sIDMyLCAiaXQ4ODd4Iik7CiAJCWlmIChiYXNlX3JlcykgewogCQkJaW50IHRlc3Q7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChwZGV2LCAweDYwLAotCQkJCQkJMHhlNzAwMDAwMCB8IGludGFfYWRkcltpXSk7CisJCQkJCQkweGU1MDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NzgsCiAJCQkJCQkweDAwMDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKIAkJCXRlc3QgPSBpbmIgKGludGFfYWRkcltpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCmluZGV4IGJiM2MxMDEuLmRlYjZiNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCkBAIC0xNTksOCArMTU5LDggQEAKIAkvKiBDbGFpbSBuZXcgYnVzIHJlc291cmNlcyAqLwogCXBjaWJpb3NfY2xhaW1fb25lX2J1cyhkZXYtPmJ1cyk7CiAKLQkvKiBpb3JlbWFwKCkgZm9yIGNoaWxkIGJ1cywgd2hpY2ggbWF5IG9yIG1heSBub3Qgc3VjY2VlZCAqLwotCXJlbWFwX2J1c19yYW5nZShkZXYtPnN1Ym9yZGluYXRlKTsKKwkvKiBNYXAgSU8gc3BhY2UgZm9yIGNoaWxkIGJ1cywgd2hpY2ggbWF5IG9yIG1heSBub3Qgc3VjY2VlZCAqLworCXBjaWJpb3NfbWFwX2lvX3NwYWNlKGRldi0+c3Vib3JkaW5hdGUpOwogCiAJLyogQWRkIG5ldyBkZXZpY2VzIHRvIGdsb2JhbCBsaXN0cy4gIFJlZ2lzdGVyIGluIHByb2MsIHN5c2ZzLiAqLwogCXBjaV9idXNfYWRkX2RldmljZXMocGhiLT5idXMpOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAJfSBlbHNlCiAJCXBjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKGJ1cyk7CiAKLQlpZiAodW5tYXBfYnVzX3JhbmdlKGJ1cykpIHsKKwlpZiAocGNpYmlvc191bm1hcF9pb19zcGFjZShidXMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byB1bm1hcCBidXMgcmFuZ2VcbiIsCiAJCQlfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVSQU5HRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggMTBkYmRlYy4uMWI3YjI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgInBjaS5oIgogCiBzdGF0aWMgaW50IHN5c2ZzX2luaXRpYWxpemVkOwkvKiA9IDAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IGE3YmNlNzUuLjM0YjhkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMjIsNiArMjIsMTggQEAKIAogTElTVF9IRUFEKHBjaV9kZXZpY2VzKTsKIAorLyoKKyAqIFNvbWUgZGV2aWNlIGRyaXZlcnMgbmVlZCBrbm93IGlmIHBjaSBpcyBpbml0aWF0ZWQuCisgKiBCYXNpY2FsbHksIHdlIHRoaW5rIHBjaSBpcyBub3QgaW5pdGlhdGVkIHdoZW4gdGhlcmUKKyAqIGlzIG5vIGRldmljZSBpbiBsaXN0IG9mIHBjaV9kZXZpY2VzLgorICovCitpbnQgbm9fcGNpX2RldmljZXModm9pZCkKK3sKKwlyZXR1cm4gbGlzdF9lbXB0eSgmcGNpX2RldmljZXMpOworfQorCitFWFBPUlRfU1lNQk9MKG5vX3BjaV9kZXZpY2VzKTsKKwogI2lmZGVmIEhBVkVfUENJX0xFR0FDWQogLyoqCiAgKiBwY2lfY3JlYXRlX2xlZ2FjeV9maWxlcyAtIGNyZWF0ZSBsZWdhY3kgSS9PIHBvcnQgYW5kIG1lbW9yeSBmaWxlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYy5jIGIvZHJpdmVycy9wY2kvcHJvYy5jCmluZGV4IGNmYTBkZmUuLjkwYWRjNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2MuYworKysgYi9kcml2ZXJzL3BjaS9wcm9jLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlICJwY2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKaW5kZXggOWY3MDkwZi4uYzZlNzlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2VhcmNoLmMKKysrIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCSAqIGNhbiBjYXVzZSBzb21lIG1hY2hpbmVzIHRvIGNyYXNoLiAgU28gaGVyZSB3ZSBkZXRlY3QgYW5kIGZsYWcgdGhhdAogCSAqIHNpdHVhdGlvbiBhbmQgYmFpbCBvdXQgZWFybHkuCiAJICovCi0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnBjaV9kZXZpY2VzKSkpCisJaWYgKHVubGlrZWx5KG5vX3BjaV9kZXZpY2VzKCkpKQogCQlyZXR1cm4gTlVMTDsKIAlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKIAluID0gZnJvbSA/IGZyb20tPmdsb2JhbF9saXN0Lm5leHQgOiBwY2lfZGV2aWNlcy5uZXh0OwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJICogY2FuIGNhdXNlIHNvbWUgbWFjaGluZXMgdG8gY3Jhc2guICBTbyBoZXJlIHdlIGRldGVjdCBhbmQgZmxhZyB0aGF0CiAJICogc2l0dWF0aW9uIGFuZCBiYWlsIG91dCBlYXJseS4KIAkgKi8KLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcGNpX2RldmljZXMpKSkKKwlpZiAodW5saWtlbHkobm9fcGNpX2RldmljZXMoKSkpCiAJCXJldHVybiBOVUxMOwogCWRvd25fcmVhZCgmcGNpX2J1c19zZW0pOwogCW4gPSBmcm9tID8gZnJvbS0+Z2xvYmFsX2xpc3QubmV4dCA6IHBjaV9kZXZpY2VzLm5leHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCAzNWY4ODY0Li5jMGM3N2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTE4MCwxNCArMTgwLDE1IEBACiAJICBQQ01DSUEgY2FyZHMgYXJlIHBsdWdnZWQgaW50by4gSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFBDTUNJQV9NOFhYCi0gICAgICAgIHRyaXN0YXRlICJNUEM4eHggUENNQ0lBIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gUENNQ0lBICYmIFBQQyAmJiA4eHggCi0gICAgICAgIHNlbGVjdCBQQ0NBUkRfSU9EWU4KLSAgICAgICAgaGVscAotICAgICAgICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgUG93ZXJQQyA4eHggc2VyaWVzIFBDTUNJQQotICAgICAgICBjb250cm9sbGVyLgorCXRyaXN0YXRlICJNUEM4eHggUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ01DSUEgJiYgUFBDICYmIDh4eAorCXNlbGVjdCBQQ0NBUkRfSU9EWU4KKwlzZWxlY3QgUENDQVJEX05PTlNUQVRJQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBQb3dlclBDIDh4eCBzZXJpZXMgUENNQ0lBCisJICBjb250cm9sbGVyLgogCi0gICAgICAgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIGNhbGxlZCBtOHh4X3BjbWNpYS4KKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIGNhbGxlZCBtOHh4X3BjbWNpYS4KIAogY29uZmlnIEhENjQ0NjVfUENNQ0lBCiAJdHJpc3RhdGUgIkhENjQ0NjUgaG9zdCBicmlkZ2Ugc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzLmMgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCmluZGV4IDUwY2FkM2EuLjdjOTNhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY3MuYwpAQCAtNjUxLDYgKzY1MSw3IEBACiAJYWRkX3dhaXRfcXVldWUoJnNrdC0+dGhyZWFkX3dhaXQsICZ3YWl0KTsKIAljb21wbGV0ZSgmc2t0LT50aHJlYWRfZG9uZSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl1bnNpZ25lZCBpbnQgZXZlbnRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKaW5kZXggOTcyMWVkNy4uM2M0NTE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBGdXJ0aGVyIGZpeGVzLCB2Mi42IGtlcm5lbCBwb3J0CiAgKiAgICAgPG1hcmNlbG8udG9zYXR0aUBjeWNsYWRlcy5jb20+CiAgKiAKLSAqIFNvbWUgZml4ZXMsIGFkZGl0aW9ucyAoQykgMjAwNSBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMuIAorICogU29tZSBmaXhlcywgYWRkaXRpb25zIChDKSAyMDA1LTIwMDcgTW9udGF2aXN0YSBTb2Z0d2FyZSwgSW5jLgogICogICAgIDx2Ym9yZHVnQHJ1Lm12aXN0YS5jb20+CiAgKgogICogIlRoZSBFeENBIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHNvY2tldCBjb250cm9sbGVycyBzaG91bGQgcHJvdmlkZQpAQCAtNDAsMTAgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTEsMTEgKzQ3LDE4IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KICNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9mc19wZC5oPgorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CkBAIC0xMTAsNyArMTEzLDcgQEAKICNkZWZpbmUgQ09ORklHX1BDTUNJQV9TTE9UX0IKICNlbmRpZgogCi0jZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0EpICYmICFkZWZpbmVkKENPTkZJR19QQ01DSUFfU0xPVF9CKSAqLworI2VuZGlmCQkJCS8qICFkZWZpbmVkKENPTkZJR19QQ01DSUFfU0xPVF9BKSAmJiAhZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQikgKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0EpICYmIGRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0IpCiAKQEAgLTE0MywzMCArMTQ2LDIwIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9CQVNFIDB4ZTAwMDAwMDAgLyogYmFzZSBhZGRyZXNzIGZvciBtZW1vcnkgd2luZG93IDAgICAqLwotI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9TSVpFIDB4MDQwMDAwMDAgLyogZWFjaCBtZW1vcnkgd2luZG93IGlzIDY0IE1CeXRlICAgICAqLwotI2RlZmluZSBQQ01DSUFfSU9fV0lOX0JBU0UgIF9JT19CQVNFICAgLyogYmFzZSBhZGRyZXNzIGZvciBpbyB3aW5kb3cgMCAgICAgICAqLwotCi0jZGVmaW5lIFBDTUNJQV9TQ0hMVkwgUENNQ0lBX0lOVEVSUlVQVCAvKiBTdGF0dXMgQ2hhbmdlIEludGVycnVwdCBMZXZlbCAgICAgICovCi0KKyNkZWZpbmUgUENNQ0lBX01FTV9XSU5fQkFTRSAweGUwMDAwMDAwCS8qIGJhc2UgYWRkcmVzcyBmb3IgbWVtb3J5IHdpbmRvdyAwICAgKi8KKyNkZWZpbmUgUENNQ0lBX01FTV9XSU5fU0laRSAweDA0MDAwMDAwCS8qIGVhY2ggbWVtb3J5IHdpbmRvdyBpcyA2NCBNQnl0ZSAgICAgKi8KKyNkZWZpbmUgUENNQ0lBX0lPX1dJTl9CQVNFICBfSU9fQkFTRQkvKiBiYXNlIGFkZHJlc3MgZm9yIGlvIHdpbmRvdyAwICAgICAgICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIDIuNC54IGFuZCBuZXdlciBoYXMgdGhpcyBhbHdheXMgaW4gSFogKi8KLSNkZWZpbmUgTThYWF9CVVNGUkVRICgoKChiZF90ICopJihfX3JlcykpLT5iaV9idXNmcmVxKSkKLQotc3RhdGljIGludCBwY21jaWFfc2NobHZsID0gUENNQ0lBX1NDSExWTDsKK3N0YXRpYyBpbnQgcGNtY2lhX3NjaGx2bDsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhldmVudHNfbG9jayk7CiAKLQogI2RlZmluZSBQQ01DSUFfU09DS0VUX0tFWV81ViAxCiAjZGVmaW5lIFBDTUNJQV9TT0NLRVRfS0VZX0xWIDIKIAogLyogbG9vayB1cCB0YWJsZSBmb3IgcGdjcnggcmVnaXN0ZXJzICovCi1zdGF0aWMgdTMyICptOHh4X3BnY3J4WzJdID0gewotCSYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZ2NyYSwKLQkmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGdjcmIKLX07CitzdGF0aWMgdTMyICptOHh4X3BnY3J4WzJdOwogCiAvKgogICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBhZGRyZXNzIGVhY2ggd2luZG93IGluIHRoZSBQQ01DSUEgY29udHJvbGxlci4KQEAgLTE3Niw4ICsxNjksOCBAQAogICovCiAKIHN0cnVjdCBwY21jaWFfd2luIHsKLQl1MzIJYnI7Ci0JdTMyCW9yOworCXUzMiBicjsKKwl1MzIgb3I7CiB9OwogCiAvKgpAQCAtMjIxLDIyICsyMTQsMjcgQEAKIAogLyogd2Uga2VlcCBvbmUgbG9va3VwIHRhYmxlIHBlciBzb2NrZXQgdG8gY2hlY2sgZmxhZ3MgKi8KIAotI2RlZmluZSBQQ01DSUFfRVZFTlRTX01BWCA1ICAvKiA0IG1heCBhdCBhIHRpbWUgKyB0ZXJtaW5hdGlvbiAqLworI2RlZmluZSBQQ01DSUFfRVZFTlRTX01BWCA1CS8qIDQgbWF4IGF0IGEgdGltZSArIHRlcm1pbmF0aW9uICovCiAKIHN0cnVjdCBldmVudF90YWJsZSB7CiAJdTMyIHJlZ2JpdDsKIAl1MzIgZXZlbnRiaXQ7CiB9OwogCitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gIm04eHgtcGNtY2lhIjsKKwogc3RydWN0IHNvY2tldF9pbmZvIHsKLQl2b2lkCSgqaGFuZGxlcikodm9pZCAqaW5mbywgdTMyIGV2ZW50cyk7Ci0Jdm9pZAkqaW5mbzsKKwl2b2lkICgqaGFuZGxlcikgKHZvaWQgKmluZm8sIHUzMiBldmVudHMpOworCXZvaWQgKmluZm87CiAKIAl1MzIgc2xvdDsKKwlwY21jb25mOHh4X3QgKnBjbWNpYTsKKwl1MzIgYnVzX2ZyZXE7CisJaW50IGh3aXJxOwogCiAJc29ja2V0X3N0YXRlX3Qgc3RhdGU7CiAJc3RydWN0IHBjY2FyZF9tZW1fbWFwIG1lbV93aW5bUENNQ0lBX01FTV9XSU5fTk9dOwotCXN0cnVjdCBwY2NhcmRfaW9fbWFwICBpb193aW5bUENNQ0lBX0lPX1dJTl9OT107CisJc3RydWN0IHBjY2FyZF9pb19tYXAgaW9fd2luW1BDTUNJQV9JT19XSU5fTk9dOwogCXN0cnVjdCBldmVudF90YWJsZSBldmVudHNbUENNQ0lBX0VWRU5UU19NQVhdOwogCXN0cnVjdCBwY21jaWFfc29ja2V0IHNvY2tldDsKIH07CkBAIC0yNTAsOCArMjQ4LDcgQEAKIAogI2RlZmluZSBNOFhYX1NJWkVTX05PIDMyCiAKLXN0YXRpYyBjb25zdCB1MzIgbTh4eF9zaXplX3RvX2dyYXlbTThYWF9TSVpFU19OT10gPQoteworc3RhdGljIGNvbnN0IHUzMiBtOHh4X3NpemVfdG9fZ3JheVtNOFhYX1NJWkVTX05PXSA9IHsKIAkweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA4LCAweDAwMDAwMDA0LAogCTB4MDAwMDAwODAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsCiAJMHgwMDAwODAwMCwgMHgwMDAwNDAwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMjAwMCwKQEAgLTI2Nyw3ICsyNjQsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbTh4eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KTsKIAotI2RlZmluZSBQQ01DSUFfQk1UX0xJTUlUICgxNSo0KSAgLyogQnVzIE1vbml0b3IgVGltZW91dCB2YWx1ZSAqLworI2RlZmluZSBQQ01DSUFfQk1UX0xJTUlUICgxNSo0KQkvKiBCdXMgTW9uaXRvciBUaW1lb3V0IHZhbHVlICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGJvYXJkIHNwZWNpZmljIHN0dWZmOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI5MSw4ICsyODgsOSBAQAogewogCXUzMiByZWcgPSAwOwogCi0Jc3dpdGNoKHZjYykgewotCWNhc2UgMDogYnJlYWs7CisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOwogCWNhc2UgMzM6CiAJCXJlZyB8PSBCQ1NSMV9QQ1ZDVEw0OwogCQlicmVhazsKQEAgLTMwMywxMSArMzAxLDEyIEBACiAJCXJldHVybiAxOwogCX0KIAotCXN3aXRjaCh2cHApIHsKLQljYXNlIDA6IGJyZWFrOworCXN3aXRjaCAodnBwKSB7CisJY2FzZSAwOgorCQlicmVhazsKIAljYXNlIDMzOgogCWNhc2UgNTA6Ci0JCWlmKHZjYyA9PSB2cHApCisJCWlmICh2Y2MgPT0gdnBwKQogCQkJcmVnIHw9IEJDU1IxX1BDVkNUTDY7CiAJCWVsc2UKIAkJCXJldHVybiAxOwpAQCAtMzE4LDI1ICszMTcsMjkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JaWYoISgodmNjID09IDUwKSB8fCAodmNjID09IDApKSkKKwlpZiAoISgodmNjID09IDUwKSB8fCAodmNjID09IDApKSkKIAkJcmV0dXJuIDE7CiAKIAkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCiAKLQlvdXRfYmUzMigoKHUzMiAqKVJQWF9DU1JfQUREUiksIGluX2JlMzIoKCh1MzIgKilSUFhfQ1NSX0FERFIpKSAmIH4oQkNTUjFfUENWQ1RMNCB8IEJDU1IxX1BDVkNUTDUgfCBCQ1NSMV9QQ1ZDVEw2IHwgQkNTUjFfUENWQ1RMNykpOworCW91dF9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUiksCisJCSBpbl9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUikpICYgfihCQ1NSMV9QQ1ZDVEw0IHwKKwkJCQkJCSAgICAgQkNTUjFfUENWQ1RMNSB8CisJCQkJCQkgICAgIEJDU1IxX1BDVkNUTDYgfAorCQkJCQkJICAgICBCQ1NSMV9QQ1ZDVEw3KSk7CiAKIAkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KIAotCW91dF9iZTMyKCgodTMyICopUlBYX0NTUl9BRERSKSwgaW5fYmUzMigoKHUzMiAqKVJQWF9DU1JfQUREUikpIHwgcmVnKTsKKwlvdXRfYmUzMigoKHUzMiAqKSBSUFhfQ1NSX0FERFIpLCBpbl9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUikpIHwgcmVnKTsKIAogCXJldHVybiAwOwogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgotI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKSAgLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCi0jZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKSAvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLwogCi0jZW5kaWYgLyogQ09ORklHX1JQWENMQVNTSUMgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfUlBYQ0xBU1NJQyAqLwogCiAvKiBGQURTIEJvYXJkcyBmcm9tIE1vdG9yb2xhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC0zNDgsNDMgKzM1MSw0NSBAQAogewogCXUzMiByZWcgPSAwOwogCi0Jc3dpdGNoKHZjYykgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAzMzoKLQkJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTA6Ci0JCQlyZWcgfD0gQkNTUjFfUENDVkNDMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDE7CisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MwOworCQlicmVhazsKKwljYXNlIDUwOgorCQlyZWcgfD0gQkNTUjFfUENDVkNDMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CiAJfQogCi0Jc3dpdGNoKHZwcCkgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAzMzoKLQkJY2FzZSA1MDoKLQkJCWlmKHZjYyA9PSB2cHApCi0JCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjA6Ci0JCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCi0JCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCWRlZmF1bHQ6CisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJY2FzZSA1MDoKKwkJaWYgKHZjYyA9PSB2cHApCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKKwkJZWxzZQogCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CiAJfQogCiAJLyogZmlyc3QsIHR1cm4gb2ZmIGFsbCBwb3dlciAqLwotCW91dF9iZTMyKCh1MzIgKilCQ1NSMSwgaW5fYmUzMigodTMyICopQkNTUjEpICYgfihCQ1NSMV9QQ0NWQ0NfTUFTSyB8IEJDU1IxX1BDQ1ZQUF9NQVNLKSk7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwKKwkJIGluX2JlMzIoKHUzMiAqKSBCQ1NSMSkgJiB+KEJDU1IxX1BDQ1ZDQ19NQVNLIHwKKwkJCQkJICAgIEJDU1IxX1BDQ1ZQUF9NQVNLKSk7CiAKIAkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KLQlvdXRfYmUzMigodTMyICopQkNTUjEsIGluX2JlMzIoKHUzMiAqKUJDU1IxKSB8IHJlZyk7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwgaW5fYmUzMigodTMyICopIEJDU1IxKSB8IHJlZyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM5MywxMiArMzk4LDEyIEBACiAKIHN0YXRpYyB2b2lkIGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCkKIHsKLQlvdXRfYmUzMigodTMyICopQkNTUjEsIGluX2JlMzIoKHUzMiAqKUJDU1IxKSAmIH5CQ1NSMV9QQ0NFTik7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwgaW5fYmUzMigodTMyICopIEJDU1IxKSAmIH5CQ1NSMV9QQ0NFTik7CiB9CiAKIHN0YXRpYyB2b2lkIGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7Ci0Jb3V0X2JlMzIoKHUzMiAqKUJDU1IxLCBpbl9iZTMyKCh1MzIgKilCQ1NSMSkgfCAgQkNTUjFfUENDRU4pOworCW91dF9iZTMyKCh1MzIgKikgQkNTUjEsIGluX2JlMzIoKHUzMiAqKSBCQ1NSMSkgfCBCQ1NSMV9QQ0NFTik7CiB9CiAKICNlbmRpZgpAQCAtNDA4LDc4ICs0MTMsMjEgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NUEM4ODVBRFMpCiAKICNkZWZpbmUgUENNQ0lBX0JPQVJEX01TRyAiTVBDODg1QURTIgotCi1zdGF0aWMgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQotewotCXUzMiByZWcgPSAwOwotCXVuc2lnbmVkICpiY3NyX2lvOwotCi0JYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQlzd2l0Y2godmNjKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlnb3RvIG91dF91bm1hcDsKLQl9Ci0KLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKLQkJCWVsc2UKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCWJyZWFrOwotCQljYXNlIDEyMDoKLQkJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKLQkJCWVsc2UKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gb3V0X3VubWFwOwotCX0KLQotCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pICYgfihCQ1NSMV9QQ0NWQ0NfTUFTSyB8IEJDU1IxX1BDQ1ZQUF9NQVNLKSk7Ci0KLQkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pIHwgcmVnKTsKLQotCWlvdW5tYXAoYmNzcl9pbyk7Ci0JcmV0dXJuIDA7Ci0KLW91dF91bm1hcDoKLQlpb3VubWFwKGJjc3JfaW8pOwotCXJldHVybiAxOwotfQotCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgogCi1zdGF0aWMgdm9pZCBoYXJkd2FyZV9lbmFibGUoaW50IHNsb3QpCitzdGF0aWMgaW5saW5lIHZvaWQgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KQogewotCXVuc2lnbmVkICpiY3NyX2lvOwotCi0JYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0Jb3V0X2JlMzIoYmNzcl9pbywgaW5fYmUzMihiY3NyX2lvKSAmIH5CQ1NSMV9QQ0NFTik7Ci0JaW91bm1hcChiY3NyX2lvKTsKKwltOHh4X3BjbWNpYV9vcHMuaHdfY3RybChzbG90LCAxKTsKIH0KIAotc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewotCXVuc2lnbmVkICpiY3NyX2lvOworCW04eHhfcGNtY2lhX29wcy5od19jdHJsKHNsb3QsIDApOworfQogCi0JYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0Jb3V0X2JlMzIoYmNzcl9pbywgaW5fYmUzMihiY3NyX2lvKSB8ICBCQ1NSMV9QQ0NFTik7Ci0JaW91bm1hcChiY3NyX2lvKTsKK3N0YXRpYyBpbmxpbmUgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXJldHVybiBtOHh4X3BjbWNpYV9vcHMudm9sdGFnZV9zZXQoc2xvdCwgdmNjLCB2cHApOwogfQogCiAjZW5kaWYKQEAgLTQ5NSw1MiArNDQzLDUzIEBACiB7CiAJdTggcmVnID0gMDsKIAotCXN3aXRjaCh2Y2MpIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCQlyZWcgfD0gQ1NSMl9WQ0NfMzM7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBDU1IyX1ZDQ181MDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDE7CisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJCXJlZyB8PSBDU1IyX1ZDQ18zMzsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJcmVnIHw9IENTUjJfVkNDXzUwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gQ1NSMl9WUFBfVkNDOwotCQkJZWxzZQotCQkJCXJldHVybiAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTIwOgotCQkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQotCQkJCXJlZyB8PSBDU1IyX1ZQUF8xMjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJZGVmYXVsdDoKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBDU1IyX1ZQUF9WQ0M7CisJCWVsc2UKIAkJCXJldHVybiAxOworCQlicmVhazsKKwljYXNlIDEyMDoKKwkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQorCQkJcmVnIHw9IENTUjJfVlBQXzEyOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCi0Jb3V0XzgoKHU4ICopTUJYX0NTUjJfQUREUiwgaW5fOCgodTggKilNQlhfQ1NSMl9BRERSKSAmIH4oQ1NSMl9WQ0NfTUFTSyB8IENTUjJfVlBQX01BU0spKTsKKwlvdXRfOCgodTggKikgTUJYX0NTUjJfQUREUiwKKwkgICAgICBpbl84KCh1OCAqKSBNQlhfQ1NSMl9BRERSKSAmIH4oQ1NSMl9WQ0NfTUFTSyB8IENTUjJfVlBQX01BU0spKTsKIAogCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwotCW91dF84KCh1OCAqKU1CWF9DU1IyX0FERFIsIGluXzgoKHU4ICopTUJYX0NTUjJfQUREUikgfCByZWcpOworCW91dF84KCh1OCAqKSBNQlhfQ1NSMl9BRERSLCBpbl84KCh1OCAqKSBNQlhfQ1NSMl9BRERSKSB8IHJlZyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogI2RlZmluZSBzb2NrZXRfZ2V0KF9zbG90XykgUENNQ0lBX1NPQ0tFVF9LRVlfNVYKLSNkZWZpbmUgaGFyZHdhcmVfZW5hYmxlKF9zbG90XykgIC8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLwotI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykgLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKQkvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KKyNkZWZpbmUgaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KIAotI2VuZGlmIC8qIENPTkZJR19NQlggKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfTUJYICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19QUnhLKQogI2luY2x1ZGUgPGFzbS9jcGxkLmg+CkBAIC01NTQsNDMgKzUwMyw0NiBAQAogCXU4IHJlZ3JlYWQ7CiAJY3BsZF9yZWdzICpjY3BsZCA9IGdldF9jcGxkKCk7CiAKLQlzd2l0Y2godmNjKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQkJcmVnIHw9IFBDTUNJQV9WQ0NfMzM7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBQQ01DSUFfVkNDXzUwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IFBDTUNJQV9WQ0NfMzM7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBQQ01DSUFfVkNDXzUwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gUENNQ0lBX1ZQUF9WQ0M7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjA6Ci0JCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCi0JCQkJcmVnIHw9IFBDTUNJQV9WUFBfMTI7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCWRlZmF1bHQ6CisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJY2FzZSA1MDoKKwkJaWYgKHZjYyA9PSB2cHApCisJCQlyZWcgfD0gUENNQ0lBX1ZQUF9WQ0M7CisJCWVsc2UKIAkJCXJldHVybiAxOworCQlicmVhazsKKwljYXNlIDEyMDoKKwkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQorCQkJcmVnIHw9IFBDTUNJQV9WUFBfMTI7CisJCWVsc2UKKwkJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAogCXJlZyA9IHJlZyA+PiAoc2xvdCA8PCAyKTsKIAlyZWdyZWFkID0gaW5fOCgmY2NwbGQtPmZwZ2FfcGNfY3RsKTsKLQlpZiAocmVnICE9IChyZWdyZWFkICYgKChQQ01DSUFfVkNDX01BU0sgfCBQQ01DSUFfVlBQX01BU0spID4+IChzbG90IDw8IDIpKSkpIHsKKwlpZiAocmVnICE9CisJICAgIChyZWdyZWFkICYgKChQQ01DSUFfVkNDX01BU0sgfCBQQ01DSUFfVlBQX01BU0spID4+IChzbG90IDw8IDIpKSkpIHsKIAkJLyogZW5hYmxlIG5ldyBwb3dlcnNldHRpbmdzICovCi0JCXJlZ3JlYWQgPSByZWdyZWFkICYgfigoUENNQ0lBX1ZDQ19NQVNLIHwgUENNQ0lBX1ZQUF9NQVNLKSA+PiAoc2xvdCA8PCAyKSk7CisJCXJlZ3JlYWQgPQorCQkgICAgcmVncmVhZCAmIH4oKFBDTUNJQV9WQ0NfTUFTSyB8IFBDTUNJQV9WUFBfTUFTSykgPj4KKwkJCQkoc2xvdCA8PCAyKSk7CiAJCW91dF84KCZjY3BsZC0+ZnBnYV9wY19jdGwsIHJlZyB8IHJlZ3JlYWQpOwogCQltc2xlZXAoMTAwKTsKIAl9CkBAIC01OTksNTIgKzU1MSwxMCBAQAogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV9MVgotI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKSAgLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCi0jZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKSAvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLwogCi0jZW5kaWYgLyogQ09ORklHX1BSeEsgKi8KLQotc3RhdGljIHZvaWQgbTh4eF9zaHV0ZG93bih2b2lkKQotewotCXUzMiBtLCBpOwotCXN0cnVjdCBwY21jaWFfd2luICp3OwotCi0JZm9yKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKyl7Ci0JCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKLQotCQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcHNjciwgTThYWF9QQ01DSUFfTUFTSyhpKSk7Ci0JCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZXIsIGluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcikgJiB+TThYWF9QQ01DSUFfTUFTSyhpKSk7Ci0KLQkJLyogdHVybiBvZmYgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KLQkJb3V0X2JlMzIoTThYWF9QR0NSWChpKSwgTThYWF9QR0NSWF9DWE9FKTsKLQotCQkvKiB0dXJuIG9mZiBtZW1vcnkgd2luZG93cyAqLwotCQlmb3IobSA9IDA7IG0gPCBQQ01DSUFfTUVNX1dJTl9OTzsgbSsrKSB7Ci0JCQlvdXRfYmUzMigmdy0+b3IsIDApOyAvKiBzZXQgdG8gbm90IHZhbGlkICovCi0JCQl3Kys7Ci0JCX0KLQotCQkvKiB0dXJuIG9mZiB2b2x0YWdlICovCi0JCXZvbHRhZ2Vfc2V0KGksIDAsIDApOwotCi0JCS8qIGRpc2FibGUgZXh0ZXJuYWwgaGFyZHdhcmUgKi8KLQkJaGFyZHdhcmVfZGlzYWJsZShpKTsKLQl9Ci0KLQlmcmVlX2lycShwY21jaWFfc2NobHZsLCBOVUxMKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG04eHhfZHJpdmVyID0gewotICAgICAgICAubmFtZSA9ICJtOHh4LXBjbWNpYSIsCi0gICAgICAgIC5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0gICAgICAgIC5zdXNwZW5kID0gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCwKLSAgICAgICAgLnJlc3VtZSA9IHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG04eHhfZGV2aWNlID0gewotICAgICAgICAubmFtZSA9ICJtOHh4LXBjbWNpYSIsCi0gICAgICAgIC5pZCA9IDAsCi19OworI2VuZGlmCQkJCS8qIENPTkZJR19QUnhLICovCiAKIHN0YXRpYyB1MzIgcGVuZGluZ19ldmVudHNbUENNQ0lBX1NPQ0tFVFNfTk9dOwogc3RhdGljIERFRklORV9TUElOTE9DSyhwZW5kaW5nX2V2ZW50X2xvY2spOwpAQCAtNjU0LDI0ICs1NjQsMjUgQEAKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnM7CiAJc3RydWN0IGV2ZW50X3RhYmxlICplOwogCXVuc2lnbmVkIGludCBpLCBldmVudHMsIHBzY3IsIHBpcHIsIHBlcjsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHNvY2tldFswXS5wY21jaWE7CiAKIAlkcHJpbnRrKCJJbnRlcnJ1cHQhXG4iKTsKIAkvKiBnZXQgaW50ZXJydXB0IHNvdXJjZXMgKi8KIAotCXBzY3IgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyKTsKLQlwaXByID0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGlwcik7Ci0JcGVyID0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKTsKKwlwc2NyID0gaW5fYmUzMigmcGNtY2lhLT5wY21jX3BzY3IpOworCXBpcHIgPSBpbl9iZTMyKCZwY21jaWEtPnBjbWNfcGlwcik7CisJcGVyID0gaW5fYmUzMigmcGNtY2lhLT5wY21jX3Blcik7CiAKLQlmb3IoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKIAkJcyA9ICZzb2NrZXRbaV07CiAJCWUgPSAmcy0+ZXZlbnRzWzBdOwogCQlldmVudHMgPSAwOwogCi0JCXdoaWxlKGUtPnJlZ2JpdCkgewotCQkJaWYocHNjciAmIGUtPnJlZ2JpdCkKKwkJd2hpbGUgKGUtPnJlZ2JpdCkgeworCQkJaWYgKHBzY3IgJiBlLT5yZWdiaXQpCiAJCQkJZXZlbnRzIHw9IGUtPmV2ZW50Yml0OwogCi0JCQkJZSsrOworCQkJZSsrOwogCQl9CiAKIAkJLyoKQEAgLTY3OSwxMyArNTkwLDExIEBACiAJCSAqIG5vdCB0b28gbmljZSBkb25lLAogCQkgKiB3ZSBkZXBlbmQgb24gdGhhdCBDRDIgaXMgdGhlIGJpdCB0byB0aGUgbGVmdCBvZiBDRDEuLi4KIAkJICovCi0JCWlmKGV2ZW50cyAmIFNTX0RFVEVDVCkKLQkJCWlmKCgocGlwciAmIE04WFhfUENNQ0lBX0NEMihpKSkgPj4gMSkgXgotCQkJCShwaXByICYgTThYWF9QQ01DSUFfQ0QxKGkpKSkKLQkJCXsKKwkJaWYgKGV2ZW50cyAmIFNTX0RFVEVDVCkKKwkJCWlmICgoKHBpcHIgJiBNOFhYX1BDTUNJQV9DRDIoaSkpID4+IDEpIF4KKwkJCSAgICAocGlwciAmIE04WFhfUENNQ0lBX0NEMShpKSkpIHsKIAkJCQlldmVudHMgJj0gflNTX0RFVEVDVDsKIAkJCX0KLQogI2lmZGVmIFBDTUNJQV9HTElUQ0hZX0NECiAJCS8qCiAJCSAqIEkndmUgZXhwZXJpZW5jZWQgQ0QgcHJvYmxlbXMgd2l0aCBteSBBRFMgYm9hcmQuCkBAIC02OTMsMjQgKzYwMiwyMyBAQAogCQkgKiByZWFsIGNoYW5nZSBvZiBDYXJkIGRldGVjdGlvbi4KIAkJICovCiAKLQkJaWYoKGV2ZW50cyAmIFNTX0RFVEVDVCkgJiYKLQkJICAgKChwaXByICYKLQkJICAgICAoTThYWF9QQ01DSUFfQ0QyKGkpIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkgPT0gMCkgJiYKLQkJICAgKHMtPnN0YXRlLlZjYyB8IHMtPnN0YXRlLlZwcCkpIHsKKwkJaWYgKChldmVudHMgJiBTU19ERVRFQ1QpICYmCisJCSAgICAoKHBpcHIgJgorCQkgICAgICAoTThYWF9QQ01DSUFfQ0QyKGkpIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkgPT0gMCkgJiYKKwkJICAgIChzLT5zdGF0ZS5WY2MgfCBzLT5zdGF0ZS5WcHApKSB7CiAJCQlldmVudHMgJj0gflNTX0RFVEVDVDsKIAkJCS8qcHJpbnRrKCAiQ0QgZ2xpdGNoIHdvcmthcm91bmQgLSBDRCA9IDB4JTA4eCFcbiIsCi0JCQkJKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QyKGkpCi0JCQkJCSB8IE04WFhfUENNQ0lBX0NEMShpKSkpKTsqLworCQkJICAgKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QyKGkpCisJCQkgICB8IE04WFhfUENNQ0lBX0NEMShpKSkpKTsgKi8KIAkJfQogI2VuZGlmCiAKIAkJLyogY2FsbCB0aGUgaGFuZGxlciAqLwogCiAJCWRwcmludGsoInNsb3QgJXU6IGV2ZW50cyA9IDB4JTAyeCwgcHNjciA9IDB4JTA4eCwgIgotCQkJInBpcHIgPSAweCUwOHhcbiIsCi0JCQlpLCBldmVudHMsIHBzY3IsIHBpcHIpOworCQkJInBpcHIgPSAweCUwOHhcbiIsIGksIGV2ZW50cywgcHNjciwgcGlwcik7CiAKLQkJaWYoZXZlbnRzKSB7CisJCWlmIChldmVudHMpIHsKIAkJCXNwaW5fbG9jaygmcGVuZGluZ19ldmVudF9sb2NrKTsKIAkJCXBlbmRpbmdfZXZlbnRzW2ldIHw9IGV2ZW50czsKIAkJCXNwaW5fdW5sb2NrKCZwZW5kaW5nX2V2ZW50X2xvY2spOwpAQCAtNzI0LDcgKzYzMiw3IEBACiAJCQlwZXIgJj0gfk04WFhfUENNQ0lBX1JEWV9MKDApOwogCQkJcGVyICY9IH5NOFhYX1BDTUNJQV9SRFlfTCgxKTsKIAotCQkJb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwgcGVyKTsKKwkJCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcGVyLCBwZXIpOwogCiAJCQlpZiAoZXZlbnRzKQogCQkJCXBjbWNpYV9wYXJzZV9ldmVudHMoJnNvY2tldFtpXS5zb2NrZXQsIGV2ZW50cyk7CkBAIC03MzIsNyArNjQwLDcgQEAKIAl9CiAKIAkvKiBjbGVhciB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8KLQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcHNjciwgcHNjcik7CisJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wc2NyLCBwc2NyKTsKIAogCWRwcmludGsoIkludGVycnVwdCBkb25lLlxuIik7CiAKQEAgLTc0MywyMSArNjUxLDIxIEBACiB7CiAJdTMyIGs7CiAKLQlmb3IoayA9IDA7IGsgPCBNOFhYX1NJWkVTX05POyBrKyspCi0JCWlmKG04eHhfc2l6ZV90b19ncmF5W2tdID09IHNpemUpCisJZm9yIChrID0gMDsgayA8IE04WFhfU0laRVNfTk87IGsrKykKKwkJaWYgKG04eHhfc2l6ZV90b19ncmF5W2tdID09IHNpemUpCiAJCQlicmVhazsKIAotCWlmKChrID09IE04WFhfU0laRVNfTk8pIHx8IChtOHh4X3NpemVfdG9fZ3JheVtrXSA9PSAtMSkpCisJaWYgKChrID09IE04WFhfU0laRVNfTk8pIHx8IChtOHh4X3NpemVfdG9fZ3JheVtrXSA9PSAtMSkpCiAJCWsgPSAtMTsKIAogCXJldHVybiBrOwogfQogCi1zdGF0aWMgdTMyIG04eHhfZ2V0X3NwZWVkKHUzMiBucywgdTMyIGlzX2lvKQorc3RhdGljIHUzMiBtOHh4X2dldF9zcGVlZCh1MzIgbnMsIHUzMiBpc19pbywgdTMyIGJ1c19mcmVxKQogewogCXUzMiByZWcsIGNsb2NrcywgcHNzdCwgcHNsLCBwc2h0OwogCi0JaWYoIW5zKSB7CisJaWYgKCFucykgewogCiAJCS8qCiAJCSAqIFdlIGdldCBjYWxsZWQgd2l0aCBJTyBtYXBzIHNldHVwIHRvIDBucwpAQCAtNzY1LDEwICs2NzMsMTAgQEAKIAkJICogVGhleSBzaG91bGQgYmUgMjU1bnMuCiAJCSAqLwogCi0JCWlmKGlzX2lvKQorCQlpZiAoaXNfaW8pCiAJCQlucyA9IDI1NTsKIAkJZWxzZQotCQkJbnMgPSAxMDA7ICAvKiBmYXN0IG1lbW9yeSBpZiAwICovCisJCQlucyA9IDEwMDsJLyogZmFzdCBtZW1vcnkgaWYgMCAqLwogCX0KIAogCS8qCkBAIC03NzksMjMgKzY4NywyMyBAQAogCiAvKiBob3cgd2Ugd2FudCB0byBhZGp1c3QgdGhlIHRpbWluZyAtIGluIHBlcmNlbnQgKi8KIAotI2RlZmluZSBBREogMTgwIC8qIDgwICUgbG9uZ2VyIGFjY2Vzc3RpbWUgLSB0byBiZSBzdXJlICovCisjZGVmaW5lIEFESiAxODAJCQkvKiA4MCAlIGxvbmdlciBhY2Nlc3N0aW1lIC0gdG8gYmUgc3VyZSAqLwogCi0JY2xvY2tzID0gKChNOFhYX0JVU0ZSRVEgLyAxMDAwKSAqIG5zKSAvIDEwMDA7Ci0JY2xvY2tzID0gKGNsb2NrcyAqIEFESikgLyAoMTAwKjEwMDApOwotCWlmKGNsb2NrcyA+PSBQQ01DSUFfQk1UX0xJTUlUKSB7Ci0JCXByaW50ayggIk1heCBhY2Nlc3MgdGltZSBsaW1pdCByZWFjaGVkXG4iKTsKLQkJY2xvY2tzID0gUENNQ0lBX0JNVF9MSU1JVC0xOworCWNsb2NrcyA9ICgoYnVzX2ZyZXEgLyAxMDAwKSAqIG5zKSAvIDEwMDA7CisJY2xvY2tzID0gKGNsb2NrcyAqIEFESikgLyAoMTAwICogMTAwMCk7CisJaWYgKGNsb2NrcyA+PSBQQ01DSUFfQk1UX0xJTUlUKSB7CisJCXByaW50aygiTWF4IGFjY2VzcyB0aW1lIGxpbWl0IHJlYWNoZWRcbiIpOworCQljbG9ja3MgPSBQQ01DSUFfQk1UX0xJTUlUIC0gMTsKIAl9CiAKLQlwc3N0ID0gY2xvY2tzIC8gNzsgICAgICAgICAgLyogc2V0dXAgdGltZSAqLwotCXBzaHQgPSBjbG9ja3MgLyA3OyAgICAgICAgICAvKiBob2xkIHRpbWUgKi8KLQlwc2wgID0gKGNsb2NrcyAqIDUpIC8gNzsgICAgLyogc3Ryb2JlIGxlbmd0aCAqLworCXBzc3QgPSBjbG9ja3MgLyA3OwkvKiBzZXR1cCB0aW1lICovCisJcHNodCA9IGNsb2NrcyAvIDc7CS8qIGhvbGQgdGltZSAqLworCXBzbCA9IChjbG9ja3MgKiA1KSAvIDc7CS8qIHN0cm9iZSBsZW5ndGggKi8KIAogCXBzc3QgKz0gY2xvY2tzIC0gKHBzc3QgKyBwc2h0ICsgcHNsKTsKIAotCXJlZyA9ICBwc3N0IDw8IDEyOwotCXJlZyB8PSBwc2wgIDw8IDc7CisJcmVnID0gcHNzdCA8PCAxMjsKKwlyZWcgfD0gcHNsIDw8IDc7CiAJcmVnIHw9IHBzaHQgPDwgMTY7CiAKIAlyZXR1cm4gcmVnOwpAQCAtODA2LDExICs3MTQsMTIgQEAKIAlpbnQgbHNvY2sgPSBjb250YWluZXJfb2Yoc29jaywgc3RydWN0IHNvY2tldF9pbmZvLCBzb2NrZXQpLT5zbG90OwogCXN0cnVjdCBzb2NrZXRfaW5mbyAqcyA9ICZzb2NrZXRbbHNvY2tdOwogCXVuc2lnbmVkIGludCBwaXByLCByZWc7CisJcGNtY29uZjh4eF90ICpwY21jaWEgPSBzLT5wY21jaWE7CiAKLQlwaXByID0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGlwcik7CisJcGlwciA9IGluX2JlMzIoJnBjbWNpYS0+cGNtY19waXByKTsKIAotCSp2YWx1ZSAgPSAoKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QxKGxzb2NrKQotCQkJICAgIHwgTThYWF9QQ01DSUFfQ0QyKGxzb2NrKSkpID09IDApID8gU1NfREVURUNUIDogMDsKKwkqdmFsdWUgPSAoKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QxKGxzb2NrKQorCQkJICAgfCBNOFhYX1BDTUNJQV9DRDIobHNvY2spKSkgPT0gMCkgPyBTU19ERVRFQ1QgOiAwOwogCSp2YWx1ZSB8PSAocGlwciAmIE04WFhfUENNQ0lBX1dQKGxzb2NrKSkgPyBTU19XUlBST1QgOiAwOwogCiAJaWYgKHMtPnN0YXRlLmZsYWdzICYgU1NfSU9DQVJEKQpAQCAtODk0LDE2ICs4MDMsMTYgQEAKIAkvKiByZWFkIG91dCBWUzEgYW5kIFZTMiAqLwogCiAJcmVnID0gKHBpcHIgJiBNOFhYX1BDTUNJQV9WU19NQVNLKGxzb2NrKSkKLQkJPj4gTThYWF9QQ01DSUFfVlNfU0hJRlQobHNvY2spOworCSAgICA+PiBNOFhYX1BDTUNJQV9WU19TSElGVChsc29jayk7CiAKLQlpZihzb2NrZXRfZ2V0KGxzb2NrKSA9PSBQQ01DSUFfU09DS0VUX0tFWV9MVikgewotCQlzd2l0Y2gocmVnKSB7CisJaWYgKHNvY2tldF9nZXQobHNvY2spID09IFBDTUNJQV9TT0NLRVRfS0VZX0xWKSB7CisJCXN3aXRjaCAocmVnKSB7CiAJCWNhc2UgMToKIAkJCSp2YWx1ZSB8PSBTU18zVkNBUkQ7Ci0JCQlicmVhazsgLyogR05ELCBOQyAtIDMuM1Ygb25seSAqLworCQkJYnJlYWs7CS8qIEdORCwgTkMgLSAzLjNWIG9ubHkgKi8KIAkJY2FzZSAyOgogCQkJKnZhbHVlIHw9IFNTX1hWQ0FSRDsKLQkJCWJyZWFrOyAvKiBOQy4gR05EIC0geC54ViBvbmx5ICovCisJCQlicmVhazsJLyogTkMuIEdORCAtIHgueFYgb25seSAqLwogCQl9OwogCX0KIApAQCAtOTExLDI3ICs4MjAsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtOHh4X3NldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2ssIHNvY2tldF9zdGF0ZV90ICpzdGF0ZSkKK3N0YXRpYyBpbnQgbTh4eF9zZXRfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBzb2NrZXRfc3RhdGVfdCAqIHN0YXRlKQogewogCWludCBsc29jayA9IGNvbnRhaW5lcl9vZihzb2NrLCBzdHJ1Y3Qgc29ja2V0X2luZm8sIHNvY2tldCktPnNsb3Q7CiAJc3RydWN0IHNvY2tldF9pbmZvICpzID0gJnNvY2tldFtsc29ja107CiAJc3RydWN0IGV2ZW50X3RhYmxlICplOwogCXVuc2lnbmVkIGludCByZWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHNvY2tldFswXS5wY21jaWE7CiAKLQlkcHJpbnRrKCAiU2V0U29ja2V0KCVkLCBmbGFncyAlIzMuM3gsIFZjYyAlZCwgVnBwICVkLCAiCi0JICAgICAgImlvX2lycSAlZCwgY3NjX21hc2sgJSMyLjJ4KVxuIiwgbHNvY2ssIHN0YXRlLT5mbGFncywKLQkgICAgICBzdGF0ZS0+VmNjLCBzdGF0ZS0+VnBwLCBzdGF0ZS0+aW9faXJxLCBzdGF0ZS0+Y3NjX21hc2spOworCWRwcmludGsoIlNldFNvY2tldCglZCwgZmxhZ3MgJSMzLjN4LCBWY2MgJWQsIFZwcCAlZCwgIgorCQkiaW9faXJxICVkLCBjc2NfbWFzayAlIzIuMngpXG4iLCBsc29jaywgc3RhdGUtPmZsYWdzLAorCQlzdGF0ZS0+VmNjLCBzdGF0ZS0+VnBwLCBzdGF0ZS0+aW9faXJxLCBzdGF0ZS0+Y3NjX21hc2spOwogCiAJLyogRmlyc3QsIHNldCB2b2x0YWdlIC0gYmFpbCBvdXQgaWYgaW52YWxpZCAqLwotCWlmKHZvbHRhZ2Vfc2V0KGxzb2NrLCBzdGF0ZS0+VmNjLCBzdGF0ZS0+VnBwKSkKKwlpZiAodm9sdGFnZV9zZXQobHNvY2ssIHN0YXRlLT5WY2MsIHN0YXRlLT5WcHApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIFRha2UgY2FyZSBvZiByZXNldC4uLiAqLwotCWlmKHN0YXRlLT5mbGFncyAmIFNTX1JFU0VUKQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCAgTThYWF9QR0NSWF9DWFJFU0VUKTsgLyogYWN0aXZlIGhpZ2ggKi8KKwlpZiAoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpCisJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8IE04WFhfUEdDUlhfQ1hSRVNFVCk7CS8qIGFjdGl2ZSBoaWdoICovCiAJZWxzZQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWFJFU0VUKTsKKwkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWFJFU0VUKTsKIAogCS8qIC4uLiBhbmQgb3V0cHV0IGVuYWJsZS4gKi8KIApAQCAtOTQzLDEwICs4NTQsMTEgQEAKIAkgICBubyBwdWxsdXBzIGFyZSBwcmVzZW50IC0+IHRoZSBjYXJkcyBhY3Qgd2llcmQuCiAJICAgU28gcmlnaHQgbm93IHRoZSBidWZmZXJzIGFyZSBlbmFibGVkIGlmIHRoZSBwb3dlciBpcyBvbi4gKi8KIAotCWlmKHN0YXRlLT5WY2MgfHwgc3RhdGUtPlZwcCkKLQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpICYgfk04WFhfUEdDUlhfQ1hPRSk7IC8qIGFjdGl2ZSBsb3cgKi8KKwlpZiAoc3RhdGUtPlZjYyB8fCBzdGF0ZS0+VnBwKQorCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWE9FKTsJLyogYWN0aXZlIGxvdyAqLwogCWVsc2UKLQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpIHwgTThYWF9QR0NSWF9DWE9FKTsKKwkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCBNOFhYX1BHQ1JYX0NYT0UpOwogCiAJLyoKIAkgKiBXZSdkIGJldHRlciB0dXJuIG9mZiBpbnRlcnJ1cHRzIGJlZm9yZQpAQCAtOTYzLDE3ICs4NzUsMTcgQEAKIAllID0gJnMtPmV2ZW50c1swXTsKIAlyZWcgPSAwOwogCi0JaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfREVURUNUKSB7CisJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0RFVEVDVCkgewogCQllLT5ldmVudGJpdCA9IFNTX0RFVEVDVDsKIAkJcmVnIHw9IGUtPnJlZ2JpdCA9IChNOFhYX1BDTUNJQV9DRDIobHNvY2spCiAJCQkJICAgIHwgTThYWF9QQ01DSUFfQ0QxKGxzb2NrKSk7CiAJCWUrKzsKIAl9Ci0JaWYoc3RhdGUtPmZsYWdzICYgU1NfSU9DQVJEKSB7CisJaWYgKHN0YXRlLT5mbGFncyAmIFNTX0lPQ0FSRCkgewogCQkvKgogCQkgKiBJL08gY2FyZAogCQkgKi8KLQkJaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfU1RTQ0hHKSB7CisJCWlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19TVFNDSEcpIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfU1RTQ0hHOwogCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IE04WFhfUENNQ0lBX0JWRDEobHNvY2spOwogCQkJZSsrOwpAQCAtOTgxLDggKzg5MywxMCBAQAogCQkvKgogCQkgKiBJZiBpb19pcnEgaXMgbm9uLXplcm8gd2Ugc2hvdWxkIGVuYWJsZSBpcnEuCiAJCSAqLwotCQlpZihzdGF0ZS0+aW9faXJxKSB7Ci0JCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCBta19pbnRfaW50X21hc2soc3RhdGUtPmlvX2lycSkgPDwgMjQpOworCQlpZiAoc3RhdGUtPmlvX2lycSkgeworCQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkJIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpIHwKKwkJCQkgbWtfaW50X2ludF9tYXNrKHMtPmh3aXJxKSA8PCAyNCk7CiAJCQkvKgogCQkJICogU3RyYW5nZSB0aGluZyBoZXJlOgogCQkJICogVGhlIG1hbnVhbCBkb2VzIG5vdCB0ZWxsIHVzIHdoaWNoIGludGVycnVwdApAQCAtOTkzLDMzICs5MDcsMzIgQEAKIAkJCSAqIGhhdmUgdG8gYmUgY2xlYXJlZCBpbiBQU0NSIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KIAkJCSAqLwogCQkJcmVnIHw9IE04WFhfUENNQ0lBX1JEWV9MKGxzb2NrKTsKLQkJfQotCQllbHNlCi0JCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiAweDAwZmZmZmZmKTsKLQl9Ci0JZWxzZSB7CisJCX0gZWxzZQorCQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkJIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpICYgMHgwMGZmZmZmZik7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogTWVtb3J5IGNhcmQKIAkJICovCi0JCWlmKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVERFQUQpIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVERFQUQpIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfQkFUREVBRDsKIAkJCXJlZyB8PSBlLT5yZWdiaXQgPSBNOFhYX1BDTUNJQV9CVkQxKGxzb2NrKTsKIAkJCWUrKzsKIAkJfQotCQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19CQVRXQVJOKSB7CisJCWlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19CQVRXQVJOKSB7CiAJCQllLT5ldmVudGJpdCA9IFNTX0JBVFdBUk47CiAJCQlyZWcgfD0gZS0+cmVnYml0ID0gTThYWF9QQ01DSUFfQlZEMihsc29jayk7CiAJCQllKys7CiAJCX0KIAkJLyogV2hhdCBzaG91bGQgSSB0cmlnZ2VyIG9uIC0gbG93L2hpZ2gscmFpc2UsZmFsbD8gKi8KLQkJaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfUkVBRFkpIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX1JFQURZKSB7CiAJCQllLT5ldmVudGJpdCA9IFNTX1JFQURZOwotCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IDA7IC8vPz8KKwkJCXJlZyB8PSBlLT5yZWdiaXQgPSAwOwkvLz8/CiAJCQllKys7CiAJCX0KIAl9CiAKLQllLT5yZWdiaXQgPSAwOyAgLyogdGVybWluYXRlIGxpc3QgKi8KKwllLT5yZWdiaXQgPSAwOwkJLyogdGVybWluYXRlIGxpc3QgKi8KIAogCS8qCiAJICogQ2xlYXIgdGhlIHN0YXR1cyBjaGFuZ2VkIC4KQEAgLTEwMjcsNyArOTQwLDcgQEAKIAkgKiBXcml0aW5nIG9uZXMgd2lsbCBjbGVhciB0aGUgYml0cy4KIAkgKi8KIAotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLCByZWcpOworCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcHNjciwgcmVnKTsKIAogCS8qCiAJICogV3JpdGUgdGhlIG1hc2suCkBAIC0xMDM2LDE1ICs5NDksMTAgQEAKIAkgKiBPbmVzIHdpbGwgZW5hYmxlIHRoZSBpbnRlcnJ1cHQuCiAJICovCiAKLQkvKgotCSAgcmVnIHw9ICgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcgotCSAgJiBNOFhYX1BDTUNJQV9NQVNLKGxzb2NrKTsKLQkqLwotCi0JcmVnIHw9IGluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcikgJgotCQkoTThYWF9QQ01DSUFfTUFTSygwKSB8IE04WFhfUENNQ0lBX01BU0soMSkpOwotCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwgcmVnKTsKKwlyZWcgfD0KKwkgICAgaW5fYmUzMigmcGNtY2lhLT4KKwkJICAgIHBjbWNfcGVyKSAmIChNOFhYX1BDTUNJQV9NQVNLKDApIHwgTThYWF9QQ01DSUFfTUFTSygxKSk7CisJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wZXIsIHJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHNfbG9jaywgZmxhZ3MpOwogCkBAIC0xMDYyLDY2ICs5NzAsNjggQEAKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnMgPSAmc29ja2V0W2xzb2NrXTsKIAlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKIAl1bnNpZ25lZCBpbnQgcmVnLCB3aW5ucjsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHMtPnBjbWNpYTsKIAogI2RlZmluZSBNOFhYX1NJWkUgKGlvLT5zdG9wIC0gaW8tPnN0YXJ0ICsgMSkKICNkZWZpbmUgTThYWF9CQVNFIChQQ01DSUFfSU9fV0lOX0JBU0UgKyBpby0+c3RhcnQpCiAKLQlkcHJpbnRrKCAiU2V0SU9NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCi0JICAgICAgIiUjNC40eC0lIzQuNHgpXG4iLCBsc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAotCSAgICAgIGlvLT5zcGVlZCwgaW8tPnN0YXJ0LCBpby0+c3RvcCk7CisJZHByaW50aygiU2V0SU9NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCisJCSIlIzQuNHgtJSM0LjR4KVxuIiwgbHNvY2ssIGlvLT5tYXAsIGlvLT5mbGFncywKKwkJaW8tPnNwZWVkLCBpby0+c3RhcnQsIGlvLT5zdG9wKTsKIAogCWlmICgoaW8tPm1hcCA+PSBQQ01DSUFfSU9fV0lOX05PKSB8fCAoaW8tPnN0YXJ0ID4gMHhmZmZmKQogCSAgICB8fCAoaW8tPnN0b3AgPiAweGZmZmYpIHx8IChpby0+c3RvcCA8IGlvLT5zdGFydCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoKHJlZyA9IG04eHhfZ2V0X2dyYXljb2RlKE04WFhfU0laRSkpID09IC0xKQorCWlmICgocmVnID0gbTh4eF9nZXRfZ3JheWNvZGUoTThYWF9TSVpFKSkgPT0gLTEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoaW8tPmZsYWdzICYgTUFQX0FDVElWRSkgeworCWlmIChpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CiAKLQkJZHByaW50ayggImlvLT5mbGFncyAmIE1BUF9BQ1RJVkVcbiIpOworCQlkcHJpbnRrKCJpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFXG4iKTsKIAogCQl3aW5uciA9IChQQ01DSUFfTUVNX1dJTl9OTyAqIFBDTUNJQV9TT0NLRVRTX05PKQotCQkJKyAobHNvY2sgKiBQQ01DSUFfSU9fV0lOX05PKSArIGlvLT5tYXA7CisJCSAgICArIChsc29jayAqIFBDTUNJQV9JT19XSU5fTk8pICsgaW8tPm1hcDsKIAogCQkvKiBzZXR1cCByZWdpc3RlcnMgKi8KIAotCQl3ID0gKHZvaWQgKikgJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BicjA7CisJCXcgPSAodm9pZCAqKSZwY21jaWEtPnBjbWNfcGJyMDsKIAkJdyArPSB3aW5ucjsKIAotCQlvdXRfYmUzMigmdy0+b3IsIDApOyAvKiB0dXJuIG9mZiB3aW5kb3cgZmlyc3QgKi8KKwkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogdHVybiBvZmYgd2luZG93IGZpcnN0ICovCiAJCW91dF9iZTMyKCZ3LT5iciwgTThYWF9CQVNFKTsKIAogCQlyZWcgPDw9IDI3OwotICAJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfSU8gfChsc29jayA8PCAyKTsKKwkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9JTyB8IChsc29jayA8PCAyKTsKIAotCQlyZWcgfD0gbTh4eF9nZXRfc3BlZWQoaW8tPnNwZWVkLCAxKTsKKwkJcmVnIHw9IG04eHhfZ2V0X3NwZWVkKGlvLT5zcGVlZCwgMSwgcy0+YnVzX2ZyZXEpOwogCi0JCWlmKGlvLT5mbGFncyAmIE1BUF9XUlBST1QpCisJCWlmIChpby0+ZmxhZ3MgJiBNQVBfV1JQUk9UKQogCQkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9XUlBST1Q7CiAKLQkJaWYoaW8tPmZsYWdzICYgKE1BUF8xNkJJVCB8IE1BUF9BVVRPU1opKQorCQkvKmlmKGlvLT5mbGFncyAmIChNQVBfMTZCSVQgfCBNQVBfQVVUT1NaKSkgKi8KKwkJaWYgKGlvLT5mbGFncyAmIE1BUF8xNkJJVCkKIAkJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfMTZCSVQ7CiAKLQkJaWYoaW8tPmZsYWdzICYgTUFQX0FDVElWRSkKKwkJaWYgKGlvLT5mbGFncyAmIE1BUF9BQ1RJVkUpCiAJCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX1ZBTElEOwogCiAJCW91dF9iZTMyKCZ3LT5vciwgcmVnKTsKIAogCQlkcHJpbnRrKCJTb2NrZXQgJXU6IE1hcHBlZCBpbyB3aW5kb3cgJXUgYXQgJSM4Ljh4LCAiCi0JCSAgICAgICJPUiA9ICUjOC44eC5cbiIsIGxzb2NrLCBpby0+bWFwLCB3LT5iciwgdy0+b3IpOworCQkJIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIGlvLT5tYXAsIHctPmJyLCB3LT5vcik7CiAJfSBlbHNlIHsKIAkJLyogc2h1dGRvd24gSU8gd2luZG93ICovCiAJCXdpbm5yID0gKFBDTUNJQV9NRU1fV0lOX05PICogUENNQ0lBX1NPQ0tFVFNfTk8pCi0JCQkrIChsc29jayAqIFBDTUNJQV9JT19XSU5fTk8pICsgaW8tPm1hcDsKKwkJICAgICsgKGxzb2NrICogUENNQ0lBX0lPX1dJTl9OTykgKyBpby0+bWFwOwogCiAJCS8qIHNldHVwIHJlZ2lzdGVycyAqLwogCi0JCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKKwkJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCQl3ICs9IHdpbm5yOwogCi0JCW91dF9iZTMyKCZ3LT5vciwgMCk7IC8qIHR1cm4gb2ZmIHdpbmRvdyAqLwotCQlvdXRfYmUzMigmdy0+YnIsIDApOyAvKiB0dXJuIG9mZiBiYXNlIGFkZHJlc3MgKi8KKwkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogdHVybiBvZmYgd2luZG93ICovCisJCW91dF9iZTMyKCZ3LT5iciwgMCk7CS8qIHR1cm4gb2ZmIGJhc2UgYWRkcmVzcyAqLwogCiAJCWRwcmludGsoIlNvY2tldCAldTogVW5tYXBwZWQgaW8gd2luZG93ICV1IGF0ICUjOC44eCwgIgogCQkJIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIGlvLT5tYXAsIHctPmJyLCB3LT5vcik7CkBAIC0xMTI5LDM1ICsxMDM5LDM1IEBACiAKIAkvKiBjb3B5IHRoZSBzdHJ1Y3QgYW5kIG1vZGlmeSB0aGUgY29weSAqLwogCXMtPmlvX3dpbltpby0+bWFwXSA9ICppbzsKLQlzLT5pb193aW5baW8tPm1hcF0uZmxhZ3MgJj0gKE1BUF9XUlBST1QKLQkJCQkgICAgIHwgTUFQXzE2QklUCi0JCQkJICAgICB8IE1BUF9BQ1RJVkUpOworCXMtPmlvX3dpbltpby0+bWFwXS5mbGFncyAmPSAoTUFQX1dSUFJPVCB8IE1BUF8xNkJJVCB8IE1BUF9BQ1RJVkUpOwogCWRwcmludGsoIlNldElPTWFwIGV4aXRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbTh4eF9zZXRfbWVtX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptZW0pCitzdGF0aWMgaW50IG04eHhfc2V0X21lbV9tYXAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2ssCisJCQkgICAgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptZW0pCiB7CiAJaW50IGxzb2NrID0gY29udGFpbmVyX29mKHNvY2ssIHN0cnVjdCBzb2NrZXRfaW5mbywgc29ja2V0KS0+c2xvdDsKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnMgPSAmc29ja2V0W2xzb2NrXTsKIAlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKIAlzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgKm9sZDsKIAl1bnNpZ25lZCBpbnQgcmVnLCB3aW5ucjsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHMtPnBjbWNpYTsKIAotCWRwcmludGsoICJTZXRNZW1NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCi0JICAgICAgIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKLQkgICAgICBtZW0tPnNwZWVkLCBtZW0tPnN0YXRpY19zdGFydCwgbWVtLT5jYXJkX3N0YXJ0KTsKKwlkcHJpbnRrKCJTZXRNZW1NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCisJCSIlIzUuNWx4LCAlIzUuNXgpXG4iLCBsc29jaywgbWVtLT5tYXAsIG1lbS0+ZmxhZ3MsCisJCW1lbS0+c3BlZWQsIG1lbS0+c3RhdGljX3N0YXJ0LCBtZW0tPmNhcmRfc3RhcnQpOwogCiAJaWYgKChtZW0tPm1hcCA+PSBQQ01DSUFfTUVNX1dJTl9OTykKLS8vCSAgICB8fCAoKG1lbS0+cykgPj0gUENNQ0lBX01FTV9XSU5fU0laRSkKKy8vICAgICAgICAgIHx8ICgobWVtLT5zKSA+PSBQQ01DSUFfTUVNX1dJTl9TSVpFKQogCSAgICB8fCAobWVtLT5jYXJkX3N0YXJ0ID49IDB4MDQwMDAwMDApCi0JICAgIHx8IChtZW0tPnN0YXRpY19zdGFydCAmIDB4ZmZmKSAgICAgICAgICAgICAgICAvKiA0S0J5dGUgcmVzb2x1dGlvbiAqLwotCSAgICB8fCAobWVtLT5jYXJkX3N0YXJ0ICYgMHhmZmYpKQorCSAgICB8fCAobWVtLT5zdGF0aWNfc3RhcnQgJiAweGZmZikJLyogNEtCeXRlIHJlc29sdXRpb24gKi8KKwkgICAgfHwobWVtLT5jYXJkX3N0YXJ0ICYgMHhmZmYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmKChyZWcgPSBtOHh4X2dldF9ncmF5Y29kZShQQ01DSUFfTUVNX1dJTl9TSVpFKSkgPT0gLTEpIHsKLQkJcHJpbnRrKCAiQ2Fubm90IHNldCBzaXplIHRvIDB4JTA4eC5cbiIsIFBDTUNJQV9NRU1fV0lOX1NJWkUpOworCWlmICgocmVnID0gbTh4eF9nZXRfZ3JheWNvZGUoUENNQ0lBX01FTV9XSU5fU0laRSkpID09IC0xKSB7CisJCXByaW50aygiQ2Fubm90IHNldCBzaXplIHRvIDB4JTA4eC5cbiIsIFBDTUNJQV9NRU1fV0lOX1NJWkUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmVnIDw8PSAyNzsKQEAgLTExNjYsNTAgKzEwNzYsNDcgQEAKIAogCS8qIFNldHVwIHRoZSB3aW5kb3cgaW4gdGhlIHBjbWNpYSBjb250cm9sbGVyICovCiAKLQl3ID0gKHZvaWQgKikgJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BicjA7CisJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCXcgKz0gd2lubnI7CiAKIAlyZWcgfD0gbHNvY2sgPDwgMjsKIAotCXJlZyB8PSBtOHh4X2dldF9zcGVlZChtZW0tPnNwZWVkLCAwKTsKKwlyZWcgfD0gbTh4eF9nZXRfc3BlZWQobWVtLT5zcGVlZCwgMCwgcy0+YnVzX2ZyZXEpOwogCi0JaWYobWVtLT5mbGFncyAmIE1BUF9BVFRSSUIpCi0JCXJlZyB8PSAgTThYWF9QQ01DSUFfUE9SX0FUVFJNRU07CisJaWYgKG1lbS0+ZmxhZ3MgJiBNQVBfQVRUUklCKQorCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX0FUVFJNRU07CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQX1dSUFJPVCkKKwlpZiAobWVtLT5mbGFncyAmIE1BUF9XUlBST1QpCiAJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfV1JQUk9UOwogCi0JaWYobWVtLT5mbGFncyAmIE1BUF8xNkJJVCkKKwlpZiAobWVtLT5mbGFncyAmIE1BUF8xNkJJVCkKIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl8xNkJJVDsKIAotCWlmKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKQorCWlmIChtZW0tPmZsYWdzICYgTUFQX0FDVElWRSkKIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9WQUxJRDsKIAogCW91dF9iZTMyKCZ3LT5vciwgcmVnKTsKIAogCWRwcmludGsoIlNvY2tldCAldTogTWFwcGVkIG1lbW9yeSB3aW5kb3cgJXUgYXQgJSM4Ljh4LCAiCi0JICAgICAgIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIG1lbS0+bWFwLCB3LT5iciwgdy0+b3IpOworCQkiT1IgPSAlIzguOHguXG4iLCBsc29jaywgbWVtLT5tYXAsIHctPmJyLCB3LT5vcik7CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQX0FDVElWRSkgeworCWlmIChtZW0tPmZsYWdzICYgTUFQX0FDVElWRSkgewogCQkvKiBnZXQgdGhlIG5ldyBiYXNlIGFkZHJlc3MgKi8KIAkJbWVtLT5zdGF0aWNfc3RhcnQgPSBQQ01DSUFfTUVNX1dJTl9CQVNFICsKLQkJCShQQ01DSUFfTUVNX1dJTl9TSVpFICogd2lubnIpCi0JCQkrIG1lbS0+Y2FyZF9zdGFydDsKKwkJICAgIChQQ01DSUFfTUVNX1dJTl9TSVpFICogd2lubnIpCisJCSAgICArIG1lbS0+Y2FyZF9zdGFydDsKIAl9CiAKIAlkcHJpbnRrKCJTZXRNZW1NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCi0JICAgICAgIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKLQkgICAgICBtZW0tPnNwZWVkLCBtZW0tPnN0YXRpY19zdGFydCwgbWVtLT5jYXJkX3N0YXJ0KTsKKwkJIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKKwkJbWVtLT5zcGVlZCwgbWVtLT5zdGF0aWNfc3RhcnQsIG1lbS0+Y2FyZF9zdGFydCk7CiAKIAkvKiBjb3B5IHRoZSBzdHJ1Y3QgYW5kIG1vZGlmeSB0aGUgY29weSAqLwogCiAJb2xkID0gJnMtPm1lbV93aW5bbWVtLT5tYXBdOwogCiAJKm9sZCA9ICptZW07Ci0Jb2xkLT5mbGFncyAmPSAoTUFQX0FUVFJJQgotCQkgICAgICAgfCBNQVBfV1JQUk9UCi0JCSAgICAgICB8IE1BUF8xNkJJVAotCQkgICAgICAgfCBNQVBfQUNUSVZFKTsKKwlvbGQtPmZsYWdzICY9IChNQVBfQVRUUklCIHwgTUFQX1dSUFJPVCB8IE1BUF8xNkJJVCB8IE1BUF9BQ1RJVkUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjIwLDcgKzExMjcsNyBAQAogCXBjY2FyZF9pb19tYXAgaW8gPSB7IDAsIDAsIDAsIDAsIDEgfTsKIAlwY2NhcmRfbWVtX21hcCBtZW0gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKIAotCWRwcmludGsoICJzb2NrX2luaXQoJWQpXG4iLCBzKTsKKwlkcHJpbnRrKCJzb2NrX2luaXQoJWQpXG4iLCBzKTsKIAogCW04eHhfc2V0X3NvY2tldChzb2NrLCAmZGVhZF9zb2NrZXQpOwogCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfSU9fV0lOX05POyBpKyspIHsKQEAgLTEyMzYsMTExICsxMTQzLDE5NSBAQAogCiB9CiAKLXN0YXRpYyBpbnQgbTh4eF9zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrKQorc3RhdGljIGludCBtOHh4X3NvY2tfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaykKIHsKIAlyZXR1cm4gbTh4eF9zZXRfc29ja2V0KHNvY2ssICZkZWFkX3NvY2tldCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNjYXJkX29wZXJhdGlvbnMgbTh4eF9zZXJ2aWNlcyA9IHsKLQkuaW5pdAk9IG04eHhfc29ja19pbml0LAotCS5zdXNwZW5kID0gbTh4eF9zdXNwZW5kLAorCS5pbml0ID0gbTh4eF9zb2NrX2luaXQsCisJLnN1c3BlbmQgPSBtOHh4X3NvY2tfc3VzcGVuZCwKIAkuZ2V0X3N0YXR1cyA9IG04eHhfZ2V0X3N0YXR1cywKIAkuc2V0X3NvY2tldCA9IG04eHhfc2V0X3NvY2tldCwKIAkuc2V0X2lvX21hcCA9IG04eHhfc2V0X2lvX21hcCwKIAkuc2V0X21lbV9tYXAgPSBtOHh4X3NldF9tZW1fbWFwLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgbTh4eF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtOHh4X3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKLQl1bnNpZ25lZCBpbnQgaSxtOworCXVuc2lnbmVkIGludCBpLCBtLCBod2lycTsKKwlwY21jb25mOHh4X3QgKnBjbWNpYTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+bm9kZTsKIAogCXBjbWNpYV9pbmZvKCIlc1xuIiwgdmVyc2lvbik7CiAKLQlpZiAoZHJpdmVyX3JlZ2lzdGVyKCZtOHh4X2RyaXZlcikpCi0JCXJldHVybiAtMTsKKwlwY21jaWEgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKHBjbWNpYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjbWNpYV9zY2hsdmwgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJaHdpcnEgPSBpcnFfbWFwW3BjbWNpYV9zY2hsdmxdLmh3aXJxOworCWlmIChwY21jaWFfc2NobHZsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltOHh4X3BnY3J4WzBdID0gJnBjbWNpYS0+cGNtY19wZ2NyYTsKKwltOHh4X3BnY3J4WzFdID0gJnBjbWNpYS0+cGNtY19wZ2NyYjsKIAogCXBjbWNpYV9pbmZvKFBDTUNJQV9CT0FSRF9NU0cgIiB1c2luZyAiIFBDTUNJQV9TTE9UX01TRwotCQkgICAgIiB3aXRoIElSUSAldS5cbiIsIHBjbWNpYV9zY2hsdmwpOworCQkgICAgIiB3aXRoIElSUSAldSAgKCVkKS4gXG4iLCBwY21jaWFfc2NobHZsLCBod2lycSk7CiAKIAkvKiBDb25maWd1cmUgU3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgKi8KIAotCWlmKHJlcXVlc3RfaXJxKHBjbWNpYV9zY2hsdmwsIG04eHhfaW50ZXJydXB0LCAwLAotCQkJICAibTh4eF9wY21jaWEiLCBOVUxMKSkgeworCWlmIChyZXF1ZXN0X2lycShwY21jaWFfc2NobHZsLCBtOHh4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQlkcml2ZXJfbmFtZSwgc29ja2V0KSkgewogCQlwY21jaWFfZXJyb3IoIkNhbm5vdCBhbGxvY2F0ZSBJUlEgJXUgZm9yIFNDSExWTCFcbiIsCiAJCQkgICAgIHBjbWNpYV9zY2hsdmwpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JdyA9ICh2b2lkICopICYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wYnIwOworCXcgPSAodm9pZCAqKSZwY21jaWEtPnBjbWNfcGJyMDsKIAotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLAotCQlNOFhYX1BDTUNJQV9NQVNLKDApfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKKwlvdXRfYmUzMigmcGNtY2lhLT5wY21jX3BzY3IsIE04WFhfUENNQ0lBX01BU0soMCkgfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKKwljbHJiaXRzMzIoJnBjbWNpYS0+cGNtY19wZXIsIE04WFhfUENNQ0lBX01BU0soMCkgfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKIAotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZXIsCi0JCWluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcikgJgotCQl+KE04WFhfUENNQ0lBX01BU0soMCl8IE04WFhfUENNQ0lBX01BU0soMSkpKTsKKwkvKiBjb25uZWN0IGludGVycnVwdCBhbmQgZGlzYWJsZSBDeE9FICovCiAKLS8qIGNvbm5lY3QgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KKwlvdXRfYmUzMihNOFhYX1BHQ1JYKDApLAorCQkgTThYWF9QR0NSWF9DWE9FIHwgKG1rX2ludF9pbnRfbWFzayhod2lycSkgPDwgMTYpKTsKKwlvdXRfYmUzMihNOFhYX1BHQ1JYKDEpLAorCQkgTThYWF9QR0NSWF9DWE9FIHwgKG1rX2ludF9pbnRfbWFzayhod2lycSkgPDwgMTYpKTsKIAotCW91dF9iZTMyKE04WFhfUEdDUlgoMCksIE04WFhfUEdDUlhfQ1hPRSB8IChta19pbnRfaW50X21hc2socGNtY2lhX3NjaGx2bCkgPDwgMTYpKTsKLQlvdXRfYmUzMihNOFhYX1BHQ1JYKDEpLCBNOFhYX1BHQ1JYX0NYT0UgfCAobWtfaW50X2ludF9tYXNrKHBjbWNpYV9zY2hsdmwpIDw8IDE2KSk7CisJLyogaW50aWFsaXplIHRoZSBmaXhlZCBtZW1vcnkgd2luZG93cyAqLwogCi0vKiBpbnRpYWxpemUgdGhlIGZpeGVkIG1lbW9yeSB3aW5kb3dzICovCi0KLQlmb3IoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKXsKLQkJZm9yKG0gPSAwOyBtIDwgUENNQ0lBX01FTV9XSU5fTk87IG0rKykgeworCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJCWZvciAobSA9IDA7IG0gPCBQQ01DSUFfTUVNX1dJTl9OTzsgbSsrKSB7CiAJCQlvdXRfYmUzMigmdy0+YnIsIFBDTUNJQV9NRU1fV0lOX0JBU0UgKwotCQkJCShQQ01DSUFfTUVNX1dJTl9TSVpFCi0JCQkJICogKG0gKyBpICogUENNQ0lBX01FTV9XSU5fTk8pKSk7CisJCQkJIChQQ01DSUFfTUVNX1dJTl9TSVpFCisJCQkJICAqIChtICsgaSAqIFBDTUNJQV9NRU1fV0lOX05PKSkpOwogCi0JCQlvdXRfYmUzMigmdy0+b3IsIDApOyAgLyogc2V0IHRvIG5vdCB2YWxpZCAqLworCQkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogc2V0IHRvIG5vdCB2YWxpZCAqLwogCiAJCQl3Kys7CiAJCX0KIAl9CiAKLS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KKwkvKiB0dXJuIG9mZiB2b2x0YWdlICovCiAJdm9sdGFnZV9zZXQoMCwgMCwgMCk7CiAJdm9sdGFnZV9zZXQoMSwgMCwgMCk7CiAKLS8qIEVuYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLworCS8qIEVuYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLwogCWhhcmR3YXJlX2VuYWJsZSgwKTsKIAloYXJkd2FyZV9lbmFibGUoMSk7CiAKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm04eHhfZGV2aWNlKTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CiAJCXNvY2tldFtpXS5zbG90ID0gaTsKIAkJc29ja2V0W2ldLnNvY2tldC5vd25lciA9IFRISVNfTU9EVUxFOwotCQlzb2NrZXRbaV0uc29ja2V0LmZlYXR1cmVzID0gU1NfQ0FQX1BDQ0FSRCB8IFNTX0NBUF9NRU1fQUxJR04gfCBTU19DQVBfU1RBVElDX01BUDsKKwkJc29ja2V0W2ldLnNvY2tldC5mZWF0dXJlcyA9CisJCSAgICBTU19DQVBfUENDQVJEIHwgU1NfQ0FQX01FTV9BTElHTiB8IFNTX0NBUF9TVEFUSUNfTUFQOwogCQlzb2NrZXRbaV0uc29ja2V0LmlycV9tYXNrID0gMHgwMDA7CiAJCXNvY2tldFtpXS5zb2NrZXQubWFwX3NpemUgPSAweDEwMDA7CiAJCXNvY2tldFtpXS5zb2NrZXQuaW9fb2Zmc2V0ID0gMDsKLQkJc29ja2V0W2ldLnNvY2tldC5wY2lfaXJxID0gaSAgPyA3IDogOTsKKwkJc29ja2V0W2ldLnNvY2tldC5wY2lfaXJxID0gcGNtY2lhX3NjaGx2bDsKIAkJc29ja2V0W2ldLnNvY2tldC5vcHMgPSAmbTh4eF9zZXJ2aWNlczsKLQkJc29ja2V0W2ldLnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX2lvZHluX29wczsKKwkJc29ja2V0W2ldLnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX25vbnN0YXRpY19vcHM7CiAJCXNvY2tldFtpXS5zb2NrZXQuY2JfZGV2ID0gTlVMTDsKLQkJc29ja2V0W2ldLnNvY2tldC5kZXYucGFyZW50ID0gJm04eHhfZGV2aWNlLmRldjsKKwkJc29ja2V0W2ldLnNvY2tldC5kZXYucGFyZW50ID0gJm9mZGV2LT5kZXY7CisJCXNvY2tldFtpXS5wY21jaWEgPSBwY21jaWE7CisJCXNvY2tldFtpXS5idXNfZnJlcSA9IHBwY19wcm9jX2ZyZXE7CisJCXNvY2tldFtpXS5od2lycSA9IGh3aXJxOworCiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspCi0JCXBjbWNpYV9yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldFtpXS5zb2NrZXQpOworCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJCXN0YXR1cyA9IHBjbWNpYV9yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldFtpXS5zb2NrZXQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXBjbWNpYV9lcnJvcigiU29ja2V0IHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBtOHh4X2V4aXQodm9pZCkKK3N0YXRpYyBpbnQgbTh4eF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCiB7Ci0JaW50IGk7CisJdTMyIG0sIGk7CisJc3RydWN0IHBjbWNpYV93aW4gKnc7CisJcGNtY29uZjh4eF90ICpwY21jaWEgPSBzb2NrZXRbMF0ucGNtY2lhOwogCisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwkJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOworCisJCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcHNjciwgTThYWF9QQ01DSUFfTUFTSyhpKSk7CisJCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcGVyLAorCQkJIGluX2JlMzIoJnBjbWNpYS0+cGNtY19wZXIpICYgfk04WFhfUENNQ0lBX01BU0soaSkpOworCisJCS8qIHR1cm4gb2ZmIGludGVycnVwdCBhbmQgZGlzYWJsZSBDeE9FICovCisJCW91dF9iZTMyKE04WFhfUEdDUlgoaSksIE04WFhfUEdDUlhfQ1hPRSk7CisKKwkJLyogdHVybiBvZmYgbWVtb3J5IHdpbmRvd3MgKi8KKwkJZm9yIChtID0gMDsgbSA8IFBDTUNJQV9NRU1fV0lOX05POyBtKyspIHsKKwkJCW91dF9iZTMyKCZ3LT5vciwgMCk7CS8qIHNldCB0byBub3QgdmFsaWQgKi8KKwkJCXcrKzsKKwkJfQorCisJCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KKwkJdm9sdGFnZV9zZXQoaSwgMCwgMCk7CisKKwkJLyogZGlzYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLworCQloYXJkd2FyZV9kaXNhYmxlKGkpOworCX0KIAlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykKIAkJcGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KCZzb2NrZXRbaV0uc29ja2V0KTsKIAotCW04eHhfc2h1dGRvd24oKTsKKwlmcmVlX2lycShwY21jaWFfc2NobHZsLCBOVUxMKTsKIAotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZtOHh4X2RldmljZSk7Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJm04eHhfZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBtOHh4X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZwZGV2LT5kZXYsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBtOHh4X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJnBkZXYtPmRldik7Cit9CisjZWxzZQorI2RlZmluZSBtOHh4X3N1c3BlbmQgTlVMTAorI2RlZmluZSBtOHh4X3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbTh4eF9wY21jaWFfbWF0Y2hbXSA9IHsKKwl7CisJIC50eXBlID0gInBjbWNpYSIsCisJIC5jb21wYXRpYmxlID0gImZzbCxwcS1wY21jaWEiLAorCSB9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbTh4eF9wY21jaWFfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtOHh4X3BjbWNpYV9kcml2ZXIgPSB7CisJLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9uYW1lLAorCS5tYXRjaF90YWJsZSA9IG04eHhfcGNtY2lhX21hdGNoLAorCS5wcm9iZSA9IG04eHhfcHJvYmUsCisJLnJlbW92ZSA9IG04eHhfcmVtb3ZlLAorCS5zdXNwZW5kID0gbTh4eF9zdXNwZW5kLAorCS5yZXN1bWUgPSBtOHh4X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG04eHhfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm04eHhfcGNtY2lhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtOHh4X2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbTh4eF9wY21jaWFfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQobTh4eF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL0tjb25maWcgYi9kcml2ZXJzL3BucC9LY29uZmlnCmluZGV4IDE5NTljZWYuLjgyMTkzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL0tjb25maWcKKysrIGIvZHJpdmVycy9wbnAvS2NvbmZpZwpAQCAtMiwxMSArMiw5IEBACiAjIFBsdWcgYW5kIFBsYXkgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJQbHVnIGFuZCBQbGF5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBOUAorbWVudWNvbmZpZyBQTlAKIAlib29sICJQbHVnIGFuZCBQbGF5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAlkZXBlbmRzIG9uIElTQSB8fCBBQ1BJCiAJLS0taGVscC0tLQogCSAgUGx1ZyBhbmQgUGxheSAoUG5QKSBpcyBhIHN0YW5kYXJkIGZvciBwZXJpcGhlcmFscyB3aGljaCBhbGxvd3MgdGhvc2UKQEAgLTIyLDE1ICsyMCwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitpZiBQTlAKKwogY29uZmlnIFBOUF9ERUJVRwogCWJvb2wgIlBuUCBEZWJ1ZyBNZXNzYWdlcyIKLQlkZXBlbmRzIG9uIFBOUAogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRoZSBQbHVnIGFuZCBQbGF5IExheWVyIHRvIHByaW50IGRlYnVnIG1lc3NhZ2VzLgogCSAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkZXZlbG9waW5nIGEgUG5QIGRyaXZlciBvciB0cm91Ymxlc2hvb3RpbmcuCiAKIGNvbW1lbnQgIlByb3RvY29scyIKLQlkZXBlbmRzIG9uIFBOUAogCiBzb3VyY2UgImRyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnIgogCkBAIC0zOCw1ICszNiw0IEBACiAKIHNvdXJjZSAiZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnIgogCi1lbmRtZW51Ci0KK2VuZGlmICMgUE5QCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnCmluZGV4IDU3ODY1MWUuLmYxZWYzNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIwogY29uZmlnIElTQVBOUAogCWJvb2wgIklTQSBQbHVnIGFuZCBQbGF5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQTlAgJiYgSVNBCisJZGVwZW5kcyBvbiBJU0EKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHN1cHBvcnQgZm9yIElTQSBQbHVnIGFuZCBQbGF5IGRldmljZXMuCiAJICBTb21lIGluZm9ybWF0aW9uIGlzIGluIDxmaWxlOkRvY3VtZW50YXRpb24vaXNhcG5wLnR4dD4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwppbmRleCBhMGIxNTg3Li45MTRkMDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKQEAgLTM3MCw4ICszNzAsNiBAQAogI2lmIDAKIAlwcmludGsoS0VSTl9ERUJVRyAidGFnID0gMHgleCwgdHlwZSA9IDB4JXgsIHNpemUgPSAlaVxuIiwgdGFnLCAqdHlwZSwgKnNpemUpOwogI2VuZGlmCi0JaWYgKHR5cGUgPT0gMCkJCQkJLyogd3JvbmcgdHlwZSAqLwotCQlyZXR1cm4gLTE7CiAJaWYgKCp0eXBlID09IDB4ZmYgJiYgKnNpemUgPT0gMHhmZmZmKQkvKiBwcm9iYWJseSBpbnZhbGlkIGRhdGEgKi8KIAkJcmV0dXJuIC0xOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9LY29uZmlnIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9LY29uZmlnCmluZGV4IGZhYjg0OGMuLmI5ODZkOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvS2NvbmZpZworKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL0tjb25maWcKQEAgLTMsNyArMyw3IEBACiAjCiBjb25maWcgUE5QQklPUwogCWJvb2wgIlBsdWcgYW5kIFBsYXkgQklPUyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUE5QICYmIElTQSAmJiBYODYgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJU0EgJiYgWDg2ICYmIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAkgIExpbnV4IHVzZXMgdGhlIFBOUEJJT1MgYXMgZGVmaW5lZCBpbiAiUGx1ZyBhbmQgUGxheSBCSU9TCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCmluZGV4IDNhMjAxYjcuLjAzYmFmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCkBAIC0xNjAsNiArMTYwLDcgQEAKIHsKIAlzdGF0aWMgc3RydWN0IHBucF9kb2NraW5nX3N0YXRpb25faW5mbyBub3c7CiAJaW50IGRvY2tlZCA9IC0xLCBkID0gMDsKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCF1bmxvYWRpbmcpCiAJewogCQlpbnQgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvTWFrZWZpbGUgYi9kcml2ZXJzL3BzMy9NYWtlZmlsZQppbmRleCBlMjUxZDFjLi43NDYwMzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BzMy9NYWtlZmlsZQpAQCAtMSwzICsxLDYgQEAKIG9iai0kKENPTkZJR19QUzNfVlVBUlQpICs9IHZ1YXJ0Lm8KLW9iai0kKENPTkZJR19QUzNfUFMzQVYpICs9IHBzM2F2Lm8gcHMzYXZfY21kLm8KK29iai0kKENPTkZJR19QUzNfUFMzQVYpICs9IHBzM2F2X21vZC5vCitwczNhdl9tb2Qtb2JqcwkJKz0gcHMzYXYubyBwczNhdl9jbWQubworb2JqLSQoQ09ORklHX1BQQ19QUzMpICs9IHN5cy1tYW5hZ2VyLWNvcmUubwogb2JqLSQoQ09ORklHX1BTM19TWVNfTUFOQUdFUikgKz0gc3lzLW1hbmFnZXIubworb2JqLSQoQ09ORklHX1BTM19TVE9SQUdFKSArPSBwczNzdG9yX2xpYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9wczNhdi5jIGIvZHJpdmVycy9wczMvcHMzYXYuYwppbmRleCAxMzkzZTY0Li44NWUyMTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczNhdi5jCisrKyBiL2RyaXZlcnMvcHMzL3BzM2F2LmMKQEAgLTEsMzIgKzEsMzAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KLSAqIENvcHlyaWdodCAyMDA2LCAyMDA3IFNvbnkgQ29ycG9yYXRpb24KKyAqICBQUzMgQVYgYmFja2VuZCBzdXBwb3J0LgogICoKLSAqIEFWIGJhY2tlbmQgc3VwcG9ydCBmb3IgUFMzCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KIAogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BzM2F2Lmg+CiAjaW5jbHVkZSA8YXNtL3BzMy5oPgogCkBAIC0zOSwxMyArMzcsMTIgQEAKIG1vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDA2NDQpOwogCiBzdGF0aWMgc3RydWN0IHBzM2F2IHsKLQlpbnQgYXZhaWxhYmxlOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAlpbnQgb3Blbl9jb3VudDsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXY7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OwogCiAJaW50IHJlZ2lvbjsKIAlzdHJ1Y3QgcHMzYXZfcGt0X2F2X2dldF9od19jb25mIGF2X2h3X2NvbmY7CkBAIC01NSwxMSArNTIsMTMgQEAKIAl1MzIgYXVkaW9fcG9ydDsKIAlpbnQgcHMzYXZfbW9kZTsKIAlpbnQgcHMzYXZfbW9kZV9vbGQ7Ci19IHBzM2F2OwotCi1zdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSBwczNhdl9kZXYgPSB7Ci0JLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTCi19OworCXVuaW9uIHsKKwkJc3RydWN0IHBzM2F2X3JlcGx5X2hkciByZXBseV9oZHI7CisJCXU4IHJhd1tQUzNBVl9CVUZfU0laRV07CisJfSByZWN2X2J1ZjsKKwl2b2lkICgqZmxpcF9jdGwpKGludCBvbiwgdm9pZCAqZGF0YSk7CisJdm9pZCAqZmxpcF9kYXRhOworfSAqcHMzYXY7CiAKIC8qIGNvbG9yIHNwYWNlICovCiAjZGVmaW5lIFlVVjQ0NCBQUzNBVl9DTURfVklERU9fQ1NfWVVWNDQ0XzgKQEAgLTE2OSw3ICsxNjgsNyBAQAogCWlmIChoZHItPmNpZCAmIFBTM0FWX0VWRU5UX0NNRF9NQVNLKSB7CiAJCXRhYmxlID0gcHMzYXZfc2VhcmNoX2NtZF90YWJsZShoZHItPmNpZCwgUFMzQVZfRVZFTlRfQ01EX01BU0spOwogCQlpZiAodGFibGUpCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJInJlY3YgZXZlbnQgcGFja2V0IGNpZDolMDh4IHBvcnQ6MHgleCBzaXplOiVkXG4iLAogCQkJCWhkci0+Y2lkLCBwczNhdl9ldmVudF9nZXRfcG9ydF9pZChoZHItPmNpZCksCiAJCQkJaGRyLT5zaXplKTsKQEAgLTE4Miw2ICsxODEsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorCisjZGVmaW5lIFBPTExJTkdfSU5URVJWQUwgIDI1CS8qIGluIG1zZWMgKi8KKworc3RhdGljIGludCBwczNhdl92dWFydF93cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJCQkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBlcnJvcjsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJZXJyb3IgPSBwczNfdnVhcnRfd3JpdGUoZGV2LCBidWYsIHNpemUpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IHNpemU7Cit9CisKK3N0YXRpYyBpbnQgcHMzYXZfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCB0aW1lb3V0KQoreworCWludCBlcnJvcjsKKwlpbnQgbG9vcGNudCA9IDA7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJdGltZW91dCA9ICh0aW1lb3V0ICsgUE9MTElOR19JTlRFUlZBTCAtIDEpIC8gUE9MTElOR19JTlRFUlZBTDsKKwl3aGlsZSAobG9vcGNudCsrIDw9IHRpbWVvdXQpIHsKKwkJZXJyb3IgPSBwczNfdnVhcnRfcmVhZChkZXYsIGJ1Ziwgc2l6ZSk7CisJCWlmICghZXJyb3IpCisJCQlyZXR1cm4gc2l6ZTsKKwkJaWYgKGVycm9yICE9IC1FQUdBSU4pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM192dWFydF9yZWFkIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCW1zbGVlcChQT0xMSU5HX0lOVEVSVkFMKTsKKwl9CisJcmV0dXJuIC1FV09VTERCTE9DSzsKK30KKwogc3RhdGljIGludCBwczNhdl9zZW5kX2NtZF9wa3QoY29uc3Qgc3RydWN0IHBzM2F2X3NlbmRfaGRyICpzZW5kX2J1ZiwKIAkJCSAgICAgIHN0cnVjdCBwczNhdl9yZXBseV9oZHIgKnJlY3ZfYnVmLCBpbnQgd3JpdGVfbGVuLAogCQkJICAgICAgaW50IHJlYWRfbGVuKQpAQCAtMTkwLDEzICsyMjQsMTMgQEAKIAl1MzIgY21kOwogCWludCBldmVudDsKIAotCWlmICghcHMzYXYuYXZhaWxhYmxlKQorCWlmICghcHMzYXYpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogc2VuZCBwa3QgKi8KLQlyZXMgPSBwczNhdl92dWFydF93cml0ZShwczNhdi5kZXYsIHNlbmRfYnVmLCB3cml0ZV9sZW4pOworCXJlcyA9IHBzM2F2X3Z1YXJ0X3dyaXRlKHBzM2F2LT5kZXYsIHNlbmRfYnVmLCB3cml0ZV9sZW4pOwogCWlmIChyZXMgPCAwKSB7Ci0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJIiVzOiBwczNhdl92dWFydF93cml0ZSgpIGZhaWxlZCAocmVzdWx0PSVkKVxuIiwKIAkJCV9fZnVuY19fLCByZXMpOwogCQlyZXR1cm4gcmVzOwpAQCAtMjA2LDIwICsyNDAsMjAgQEAKIAljbWQgPSBzZW5kX2J1Zi0+Y2lkOwogCWRvIHsKIAkJLyogcmVhZCBoZWFkZXIgKi8KLQkJcmVzID0gcHMzYXZfdnVhcnRfcmVhZChwczNhdi5kZXYsIHJlY3ZfYnVmLCBQUzNBVl9IRFJfU0laRSwKKwkJcmVzID0gcHMzYXZfdnVhcnRfcmVhZChwczNhdi0+ZGV2LCByZWN2X2J1ZiwgUFMzQVZfSERSX1NJWkUsCiAJCQkJICAgICAgIHRpbWVvdXQpOwogCQlpZiAocmVzICE9IFBTM0FWX0hEUl9TSVpFKSB7Ci0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJIiVzOiBwczNhdl92dWFydF9yZWFkKCkgZmFpbGVkIChyZXN1bHQ9JWQpXG4iLAogCQkJCV9fZnVuY19fLCByZXMpOwogCQkJcmV0dXJuIHJlczsKIAkJfQogCiAJCS8qIHJlYWQgYm9keSAqLwotCQlyZXMgPSBwczNhdl92dWFydF9yZWFkKHBzM2F2LmRldiwgJnJlY3ZfYnVmLT5jaWQsCisJCXJlcyA9IHBzM2F2X3Z1YXJ0X3JlYWQocHMzYXYtPmRldiwgJnJlY3ZfYnVmLT5jaWQsCiAJCQkJICAgICAgIHJlY3ZfYnVmLT5zaXplLCB0aW1lb3V0KTsKIAkJaWYgKHJlcyA8IDApIHsKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkiJXM6IHBzM2F2X3Z1YXJ0X3JlYWQoKSBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCiAJCQkJX19mdW5jX18sIHJlcyk7CiAJCQlyZXR1cm4gcmVzOwpAQCAtMjMwLDcgKzI2NCw3IEBACiAJfSB3aGlsZSAoZXZlbnQpOwogCiAJaWYgKChjbWQgfCBQUzNBVl9SRVBMWV9CSVQpICE9IHJlY3ZfYnVmLT5jaWQpIHsKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICIlczogcmVwbHkgZXJyIChyZXN1bHQ9JXgpXG4iLAorCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLCAiJXM6IHJlcGx5IGVyciAocmVzdWx0PSV4KVxuIiwKIAkJCV9fZnVuY19fLCByZWN2X2J1Zi0+Y2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjQ1LDcgKzI3OSw3IEBACiAJaW50IHJldHVybl9sZW47CiAKIAlpZiAocmVjdl9idWYtPnZlcnNpb24gIT0gUFMzQVZfVkVSU0lPTikgewotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInJlcGx5X3BhY2tldCBpbnZhbGlkIHZlcnNpb246JXhcbiIsCisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICJyZXBseV9wYWNrZXQgaW52YWxpZCB2ZXJzaW9uOiV4XG4iLAogCQkJcmVjdl9idWYtPnZlcnNpb24pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0yNjcsMTYgKzMwMSwxMSBAQAogCQkgc3RydWN0IHBzM2F2X3NlbmRfaGRyICpidWYpCiB7CiAJaW50IHJlcyA9IDA7Ci0Jc3RhdGljIHVuaW9uIHsKLQkJc3RydWN0IHBzM2F2X3JlcGx5X2hkciByZXBseV9oZHI7Ci0JCXU4IHJhd1tQUzNBVl9CVUZfU0laRV07Ci0JfSByZWN2X2J1ZjsKLQogCXUzMiAqdGFibGU7CiAKLQlCVUdfT04oIXBzM2F2LmF2YWlsYWJsZSk7CisJQlVHX09OKCFwczNhdik7CiAKLQltdXRleF9sb2NrKCZwczNhdi5tdXRleCk7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKIAogCXRhYmxlID0gcHMzYXZfc2VhcmNoX2NtZF90YWJsZShjaWQsIFBTM0FWX0NJRF9NQVNLKTsKIAlCVUdfT04oIXRhYmxlKTsKQEAgLTI4OCw3ICszMTcsNyBAQAogCXBzM2F2X3NldF9oZHIoY2lkLCBzZW5kX2xlbiwgYnVmKTsKIAogCS8qIHNlbmQgcGFja2V0IHZpYSB2dWFydCAqLwotCXJlcyA9IHBzM2F2X3NlbmRfY21kX3BrdChidWYsICZyZWN2X2J1Zi5yZXBseV9oZHIsIHNlbmRfbGVuLAorCXJlcyA9IHBzM2F2X3NlbmRfY21kX3BrdChidWYsICZwczNhdi0+cmVjdl9idWYucmVwbHlfaGRyLCBzZW5kX2xlbiwKIAkJCQkgdXNyX2J1Zl9zaXplKTsKIAlpZiAocmVzIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIKQEAgLTI5OCw3ICszMjcsNyBAQAogCX0KIAogCS8qIHByb2Nlc3MgcmVwbHkgcGFja2V0ICovCi0JcmVzID0gcHMzYXZfcHJvY2Vzc19yZXBseV9wYWNrZXQoYnVmLCAmcmVjdl9idWYucmVwbHlfaGRyLAorCXJlcyA9IHBzM2F2X3Byb2Nlc3NfcmVwbHlfcGFja2V0KGJ1ZiwgJnBzM2F2LT5yZWN2X2J1Zi5yZXBseV9oZHIsCiAJCQkJCSB1c3JfYnVmX3NpemUpOwogCWlmIChyZXMgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHB1dF9yZXR1cm5fc3RhdHVzKCkgZmFpbGVkIChyZXN1bHQ9JWQpXG4iLApAQCAtMzA2LDExICszMzUsMTEgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOwogCXJldHVybiAwOwogCiAgICAgICBlcnI6Ci0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOwogCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCBjaWQ6JXggcmVzOiVkXG4iLCBfX2Z1bmNfXywgY2lkLCByZXMpOwogCXJldHVybiByZXM7CiB9CkBAIC0zMTksMTEgKzM0OCwxMSBAQAogewogCWludCBpLCBudW1fb2ZfYXZfcG9ydCwgcmVzOwogCi0JbnVtX29mX2F2X3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJCSBwczNhdi5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOworCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkJIHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwogCS8qIHZpZGVvIG11dGUgb24gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2F2X3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXZfdmlkZW9fbXV0ZSgxLCAmcHMzYXYuYXZfcG9ydFtpXSwgbXV0ZSk7CisJCXJlcyA9IHBzM2F2X2NtZF9hdl92aWRlb19tdXRlKDEsICZwczNhdi0+YXZfcG9ydFtpXSwgbXV0ZSk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTMzNSwxMyArMzY0LDEzIEBACiB7CiAJaW50IGksIG51bV9vZl9oZG1pX3BvcnQsIG51bV9vZl9hdl9wb3J0LCByZXM7CiAKLQludW1fb2ZfaGRtaV9wb3J0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaTsKLQludW1fb2ZfYXZfcG9ydCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKwotCQkJIHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CisJbnVtX29mX2hkbWlfcG9ydCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pOworCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkJIHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwogCiAJLyogdHYgbXV0ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfaGRtaV9wb3J0OyBpKyspIHsKLQkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYuYXZfcG9ydFtpXSwKKwkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYtPmF2X3BvcnRbaV0sCiAJCQkJCSAgIFBTM0FWX0NNRF9NVVRFX09OKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CkBAIC0zNTAsMTEgKzM3OSwxMSBAQAogCiAJLyogdmlkZW8gbXV0ZSBvbiAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfYXZfcG9ydDsgaSsrKSB7Ci0JCXJlcyA9IHBzM2F2X2NtZF9hdl92aWRlb19kaXNhYmxlX3NpZyhwczNhdi5hdl9wb3J0W2ldKTsKKwkJcmVzID0gcHMzYXZfY21kX2F2X3ZpZGVvX2Rpc2FibGVfc2lnKHBzM2F2LT5hdl9wb3J0W2ldKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJCWlmIChpIDwgbnVtX29mX2hkbWlfcG9ydCkgewotCQkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYuYXZfcG9ydFtpXSwKKwkJCXJlcyA9IHBzM2F2X2NtZF9hdl90dl9tdXRlKHBzM2F2LT5hdl9wb3J0W2ldLAogCQkJCQkJICAgUFMzQVZfQ01EX01VVEVfT0ZGKTsKIAkJCWlmIChyZXMgPCAwKQogCQkJCXJldHVybiAtMTsKQEAgLTM2OSwxNyArMzk4LDE3IEBACiB7CiAJaW50IGksIG51bV9vZl9hdl9wb3J0LCBudW1fb2Zfb3B0X3BvcnQsIHJlczsKIAotCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCi0JCQkgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKLQludW1fb2Zfb3B0X3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9zcGRpZjsKKwludW1fb2ZfYXZfcG9ydCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pICsKKwkJCSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKKwludW1fb2Zfb3B0X3BvcnQgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2Zfc3BkaWY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2F2X3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXZfYXVkaW9fbXV0ZSgxLCAmcHMzYXYuYXZfcG9ydFtpXSwgbXV0ZSk7CisJCXJlcyA9IHBzM2F2X2NtZF9hdl9hdWRpb19tdXRlKDEsICZwczNhdi0+YXZfcG9ydFtpXSwgbXV0ZSk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX29wdF9wb3J0OyBpKyspIHsKLQkJcmVzID0gcHMzYXZfY21kX2F1ZGlvX211dGUoMSwgJnBzM2F2Lm9wdF9wb3J0W2ldLCBtdXRlKTsKKwkJcmVzID0gcHMzYXZfY21kX2F1ZGlvX211dGUoMSwgJnBzM2F2LT5vcHRfcG9ydFtpXSwgbXV0ZSk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTM5NCw0MCArNDIzLDQwIEBACiAJc3RydWN0IHBzM2F2X3BrdF9hdWRpb19tb2RlIGF1ZGlvX21vZGU7CiAJdTMyIGxlbiA9IDA7CiAKLQludW1fb2ZfYXVkaW8gPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJICAgICAgIHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGkgKwotCQkgICAgICAgcHMzYXYuYXZfaHdfY29uZi5udW1fb2Zfc3BkaWY7CisJbnVtX29mX2F1ZGlvID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkgICAgICAgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGkgKworCQkgICAgICAgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX3NwZGlmOwogCiAJYXZiX3BhcmFtLm51bV9vZl92aWRlb19wa3QgPSAwOwogCWF2Yl9wYXJhbS5udW1fb2ZfYXVkaW9fcGt0ID0gUFMzQVZfQVZCX05VTV9BVURJTzsJLyogYWx3YXlzIDAgKi8KIAlhdmJfcGFyYW0ubnVtX29mX2F2X3ZpZGVvX3BrdCA9IDA7Ci0JYXZiX3BhcmFtLm51bV9vZl9hdl9hdWRpb19wa3QgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pOworCWF2Yl9wYXJhbS5udW1fb2ZfYXZfYXVkaW9fcGt0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWk7CiAKLQl2aWQgPSB2aWRlb19tb2RlX3RhYmxlW3BzM2F2LnBzM2F2X21vZGVdLnZpZDsKKwl2aWQgPSB2aWRlb19tb2RlX3RhYmxlW3BzM2F2LT5wczNhdl9tb2RlXS52aWQ7CiAKIAkvKiBhdWRpbyBtdXRlICovCiAJcHMzYXZfc2V0X2F1ZGlvX211dGUoUFMzQVZfQ01EX01VVEVfT04pOwogCiAJLyogYXVkaW8gaW5hY3RpdmUgKi8KLQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fYWN0aXZlKDAsIHBzM2F2LmF1ZGlvX3BvcnQpOworCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19hY3RpdmUoMCwgcHMzYXYtPmF1ZGlvX3BvcnQpOwogCWlmIChyZXMgPCAwKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCSJwczNhdl9jbWRfYXVkaW9fYWN0aXZlIE9GRiBmYWlsZWRcbiIpOwogCiAJLyogYXVkaW9fcGt0ICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9vZl9hdWRpbzsgaSsrKSB7Ci0JCXBzM2F2X2NtZF9zZXRfYXVkaW9fbW9kZSgmYXVkaW9fbW9kZSwgcHMzYXYuYXZfcG9ydFtpXSwgY2gsIGZzLAotCQkJCQkgd29yZF9iaXRzLCBmb3JtYXQsIHNvdXJjZSk7Ci0JCWlmIChpIDwgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSkgeworCQlwczNhdl9jbWRfc2V0X2F1ZGlvX21vZGUoJmF1ZGlvX21vZGUsIHBzM2F2LT5hdl9wb3J0W2ldLCBjaCwKKwkJCQkJIGZzLCB3b3JkX2JpdHMsIGZvcm1hdCwgc291cmNlKTsKKwkJaWYgKGkgPCBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSkgewogCQkJLyogaGRtaSBvbmx5ICovCiAJCQlsZW4gKz0gcHMzYXZfY21kX3NldF9hdl9hdWRpb19wYXJhbSgmYXZiX3BhcmFtLmJ1ZltsZW5dLAotCQkJCQkJCSAgICBwczNhdi5hdl9wb3J0W2ldLAorCQkJCQkJCSAgICBwczNhdi0+YXZfcG9ydFtpXSwKIAkJCQkJCQkgICAgJmF1ZGlvX21vZGUsIHZpZCk7CiAJCX0KIAkJLyogYXVkaW9fbW9kZSBwa3Qgc2hvdWxkIGJlIHNlbnQgc2VwYXJhdGVseSAqLwogCQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fbW9kZSgmYXVkaW9fbW9kZSk7CiAJCWlmIChyZXMgPCAwKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSJwczNhdl9jbWRfYXVkaW9fbW9kZSBmYWlsZWQsIHBvcnQ6JXhcbiIsIGkpOwogCX0KIApAQCAtNDM1LDE1ICs0NjQsMTYgQEAKIAlsZW4gKz0gb2Zmc2V0b2Yoc3RydWN0IHBzM2F2X3BrdF9hdmJfcGFyYW0sIGJ1Zik7CiAJcmVzID0gcHMzYXZfY21kX2F2Yl9wYXJhbSgmYXZiX3BhcmFtLCBsZW4pOwogCWlmIChyZXMgPCAwKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKIAogCS8qIGF1ZGlvIG11dGUgKi8KIAlwczNhdl9zZXRfYXVkaW9fbXV0ZShQUzNBVl9DTURfTVVURV9PRkYpOwogCiAJLyogYXVkaW8gYWN0aXZlICovCi0JcmVzID0gcHMzYXZfY21kX2F1ZGlvX2FjdGl2ZSgxLCBwczNhdi5hdWRpb19wb3J0KTsKKwlyZXMgPSBwczNhdl9jbWRfYXVkaW9fYWN0aXZlKDEsIHBzM2F2LT5hdWRpb19wb3J0KTsKIAlpZiAocmVzIDwgMCkKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJwczNhdl9jbWRfYXVkaW9fYWN0aXZlIE9OIGZhaWxlZFxuIik7CisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCisJCQkicHMzYXZfY21kX2F1ZGlvX2FjdGl2ZSBPTiBmYWlsZWRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTYsNyArNDg2LDcgQEAKIAlwczNhdl9zZXRfYXZfdmlkZW9fbXV0ZShQUzNBVl9DTURfTVVURV9PTik7CiAKIAkvKiB3YWtlIHVwIHBzM2F2ZCB0byBkbyB0aGUgYWN0dWFsIHZpZGVvIG1vZGUgc2V0dGluZyAqLwotCXF1ZXVlX3dvcmsocHMzYXYud3EsICZwczNhdi53b3JrKTsKKwlxdWV1ZV93b3JrKHBzM2F2LT53cSwgJnBzM2F2LT53b3JrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDczLDggKzUwMyw4IEBACiAKIAlhdmJfcGFyYW0ubnVtX29mX3ZpZGVvX3BrdCA9IFBTM0FWX0FWQl9OVU1fVklERU87CS8qIG51bSBvZiBoZWFkICovCiAJYXZiX3BhcmFtLm51bV9vZl9hdWRpb19wa3QgPSAwOwotCWF2Yl9wYXJhbS5udW1fb2ZfYXZfdmlkZW9fcGt0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCi0JCQkJCXBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CisJYXZiX3BhcmFtLm51bV9vZl9hdl92aWRlb19wa3QgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCQkJCXBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwogCWF2Yl9wYXJhbS5udW1fb2ZfYXZfYXVkaW9fcGt0ID0gMDsKIAogCS8qIHZpZGVvIHNpZ25hbCBvZmYgKi8KQEAgLTQ4NCwyMSArNTE0LDIxIEBACiAJaWYgKGlkICYgUFMzQVZfTU9ERV9IRENQX09GRikgewogCQlyZXMgPSBwczNhdl9jbWRfYXZfaGRtaV9tb2RlKFBTM0FWX0NNRF9BVl9IRE1JX0hEQ1BfT0ZGKTsKIAkJaWYgKHJlcyA9PSBQUzNBVl9TVEFUVVNfVU5TVVBQT1JURURfSERNSV9NT0RFKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJOb3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICJOb3Qgc3VwcG9ydGVkXG4iKTsKIAkJZWxzZSBpZiAocmVzKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSJwczNhdl9jbWRfYXZfaGRtaV9tb2RlIGZhaWxlZFxuIik7CiAJfSBlbHNlIGlmIChvbGRfaWQgJiBQUzNBVl9NT0RFX0hEQ1BfT0ZGKSB7CiAJCXJlcyA9IHBzM2F2X2NtZF9hdl9oZG1pX21vZGUoUFMzQVZfQ01EX0FWX0hETUlfTU9ERV9OT1JNQUwpOwogCQlpZiAocmVzIDwgMCAmJiByZXMgIT0gUFMzQVZfU1RBVFVTX1VOU1VQUE9SVEVEX0hETUlfTU9ERSkKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkicHMzYXZfY21kX2F2X2hkbWlfbW9kZSBmYWlsZWRcbiIpOwogCX0KIAogCS8qIHZpZGVvX3BrdCAqLwogCWZvciAoaSA9IDA7IGkgPCBhdmJfcGFyYW0ubnVtX29mX3ZpZGVvX3BrdDsgaSsrKQogCQlsZW4gKz0gcHMzYXZfY21kX3NldF92aWRlb19tb2RlKCZhdmJfcGFyYW0uYnVmW2xlbl0sCi0JCQkJCQlwczNhdi5oZWFkW2ldLCB2aWRlb19tb2RlLT52aWQsCisJCQkJCQlwczNhdi0+aGVhZFtpXSwgdmlkZW9fbW9kZS0+dmlkLAogCQkJCQkJdmlkZW9fbW9kZS0+Zm10LCBpZCk7CiAJLyogYXZfdmlkZW9fcGt0ICovCiAJZm9yIChpID0gMDsgaSA8IGF2Yl9wYXJhbS5udW1fb2ZfYXZfdmlkZW9fcGt0OyBpKyspIHsKQEAgLTUwNywxMiArNTM3LDEyIEBACiAJCWVsc2UKIAkJCWF2X3ZpZGVvX2NzID0gdmlkZW9fbW9kZS0+Y3M7CiAjaWZuZGVmIFBTM0FWX0hETUlfWVVWCi0JCWlmIChwczNhdi5hdl9wb3J0W2ldID09IFBTM0FWX0NNRF9BVlBPUlRfSERNSV8wIHx8Ci0JCSAgICBwczNhdi5hdl9wb3J0W2ldID09IFBTM0FWX0NNRF9BVlBPUlRfSERNSV8xKQorCQlpZiAocHMzYXYtPmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzAgfHwKKwkJICAgIHBzM2F2LT5hdl9wb3J0W2ldID09IFBTM0FWX0NNRF9BVlBPUlRfSERNSV8xKQogCQkJYXZfdmlkZW9fY3MgPSBSR0I4OwkvKiB1c2UgUkdCIGZvciBIRE1JICovCiAjZW5kaWYKIAkJbGVuICs9IHBzM2F2X2NtZF9zZXRfYXZfdmlkZW9fY3MoJmF2Yl9wYXJhbS5idWZbbGVuXSwKLQkJCQkJCSBwczNhdi5hdl9wb3J0W2ldLAorCQkJCQkJIHBzM2F2LT5hdl9wb3J0W2ldLAogCQkJCQkJIHZpZGVvX21vZGUtPnZpZCwgYXZfdmlkZW9fY3MsCiAJCQkJCQkgdmlkZW9fbW9kZS0+YXNwZWN0LCBpZCk7CiAJfQpAQCAtNTI0LDcgKzU1NCw3IEBACiAJCSAgICAgICAiJXM6IENvbW1hbmQgZmFpbGVkLiBQbGVhc2UgdHJ5IHlvdXIgcmVxdWVzdCBhZ2Fpbi4gXG4iLAogCQkgICAgICAgX19mdW5jX18pOwogCWVsc2UgaWYgKHJlcykKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJwczNhdl9jbWRfYXZiX3BhcmFtIGZhaWxlZFxuIik7CisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICJwczNhdl9jbWRfYXZiX3BhcmFtIGZhaWxlZFxuIik7CiAKIAltc2xlZXAoMTUwMCk7CiAJLyogYXYgdmlkZW8gbXV0ZSAqLwpAQCAtNTMzLDggKzU2Myw4IEBACiAKIHN0YXRpYyB2b2lkIHBzM2F2ZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JcHMzYXZfc2V0X3ZpZGVvbW9kZV9jb250KHBzM2F2LnBzM2F2X21vZGUsIHBzM2F2LnBzM2F2X21vZGVfb2xkKTsKLQljb21wbGV0ZSgmcHMzYXYuZG9uZSk7CisJcHMzYXZfc2V0X3ZpZGVvbW9kZV9jb250KHBzM2F2LT5wczNhdl9tb2RlLCBwczNhdi0+cHMzYXZfbW9kZV9vbGQpOworCWNvbXBsZXRlKCZwczNhdi0+ZG9uZSk7CiB9CiAKIHN0YXRpYyBpbnQgcHMzYXZfdmlkMnRhYmxlX2lkKGludCB2aWQpCkBAIC02MDEsNyArNjMxLDcgQEAKIAkJcmV0dXJuIHZpZDsKIAl9CiAKLQlpZiAocHMzYXYucmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKQorCWlmIChwczNhdi0+cmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKQogCQl2aWQgPSBQUzNBVl9ERUZBVUxUX0hETUlfVklEX1JFR182MDsKIAllbHNlCiAJCXZpZCA9IFBTM0FWX0RFRkFVTFRfSERNSV9WSURfUkVHXzUwOwpAQCAtNjQzLDE2ICs2NzMsMTYgQEAKIAkJdmlkID0gUFMzQVZfREVGQVVMVF9EVklfVklEOwogCX0gZWxzZSBpZiAodmlkID09IC0xKSB7CiAJCS8qIG5vIEhETUkgaW50ZXJmYWNlIG9yIEhETUkgaXMgb2ZmICovCi0JCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCisJCWlmIChwczNhdi0+cmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKQogCQkJdmlkID0gUFMzQVZfREVGQVVMVF9BVk1VTFRJX1ZJRF9SRUdfNjA7CiAJCWVsc2UKIAkJCXZpZCA9IFBTM0FWX0RFRkFVTFRfQVZNVUxUSV9WSURfUkVHXzUwOwotCQlpZiAocHMzYXYucmVnaW9uICYgUFMzQVZfUkVHSU9OX1JHQikKKwkJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fUkdCKQogCQkJcmdiID0gUFMzQVZfTU9ERV9SR0I7CiAJfSBlbHNlIGlmIChib290KSB7CiAJCS8qIEhETUk6IHVzaW5nIERFRkFVTFQgSERNSV9WSUQgd2hpbGUgYm9vdGluZyB1cCAqLwogCQlpbmZvID0gJm1vbml0b3JfaW5mby5pbmZvOwotCQlpZiAocHMzYXYucmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKSB7CisJCWlmIChwczNhdi0+cmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKSB7CiAJCQlpZiAoaW5mby0+cmVzXzYwLnJlc19iaXRzICYgUFMzQVZfUkVTQklUXzcyMHg0ODBQKQogCQkJCXZpZCA9IFBTM0FWX0RFRkFVTFRfSERNSV9WSURfUkVHXzYwOwogCQkJZWxzZSBpZiAoaW5mby0+cmVzXzUwLnJlc19iaXRzICYgUFMzQVZfUkVTQklUXzcyMHg1NzZQKQpAQCAtNzE1LDE0ICs3NDUsMTQgQEAKIAogCXNpemUgPSBBUlJBWV9TSVpFKHZpZGVvX21vZGVfdGFibGUpOwogCWlmICgoaWQgJiBQUzNBVl9NT0RFX01BU0spID4gc2l6ZSAtIDEgfHwgaWQgPCAwKSB7Ci0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAiJXM6IGVycm9yIGlkIDolZFxuIiwgX19mdW5jX18sIGlkKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgIiVzOiBlcnJvciBpZCA6JWRcbiIsIF9fZnVuY19fLCBpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGF1dG8gbW9kZSAqLwogCW9wdGlvbiA9IGlkICYgflBTM0FWX01PREVfTUFTSzsKIAlpZiAoKGlkICYgUFMzQVZfTU9ERV9NQVNLKSA9PSAwKSB7Ci0JCWlkID0gcHMzYXZfYXV0b192aWRlb21vZGUoJnBzM2F2LmF2X2h3X2NvbmYsIGJvb3QpOworCQlpZCA9IHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi0+YXZfaHdfY29uZiwgYm9vdCk7CiAJCWlmIChpZCA8IDEpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgaWQgOiVkXG4iLCBfX2Z1bmNfXywgaWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC03MzEsMTEgKzc2MSwxMSBAQAogCX0KIAogCS8qIHNldCB2aWRlb21vZGUgKi8KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwczNhdi5kb25lKTsKLQlwczNhdi5wczNhdl9tb2RlX29sZCA9IHBzM2F2LnBzM2F2X21vZGU7Ci0JcHMzYXYucHMzYXZfbW9kZSA9IGlkOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBzM2F2LT5kb25lKTsKKwlwczNhdi0+cHMzYXZfbW9kZV9vbGQgPSBwczNhdi0+cHMzYXZfbW9kZTsKKwlwczNhdi0+cHMzYXZfbW9kZSA9IGlkOwogCWlmIChwczNhdl9zZXRfdmlkZW9tb2RlKCkpCi0JCXBzM2F2LnBzM2F2X21vZGUgPSBwczNhdi5wczNhdl9tb2RlX29sZDsKKwkJcHMzYXYtPnBzM2F2X21vZGUgPSBwczNhdi0+cHMzYXZfbW9kZV9vbGQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NCw3ICs3NzQsNyBAQAogCiBpbnQgcHMzYXZfZ2V0X2F1dG9fbW9kZShpbnQgYm9vdCkKIHsKLQlyZXR1cm4gcHMzYXZfYXV0b192aWRlb21vZGUoJnBzM2F2LmF2X2h3X2NvbmYsIGJvb3QpOworCXJldHVybiBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYtPmF2X2h3X2NvbmYsIGJvb3QpOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChwczNhdl9nZXRfYXV0b19tb2RlKTsKQEAgLTc3Miw3ICs4MDIsNyBAQAogCiBpbnQgcHMzYXZfZ2V0X21vZGUodm9pZCkKIHsKLQlyZXR1cm4gcHMzYXYucHMzYXZfbW9kZTsKKwlyZXR1cm4gcHMzYXYgPyBwczNhdi0+cHMzYXZfbW9kZSA6IDA7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2dldF9tb2RlKTsKQEAgLTg0Miw4MiArODcyLDY1IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2F1ZGlvX211dGUpOwogCi1pbnQgcHMzYXZfZGV2X29wZW4odm9pZCkKK3ZvaWQgcHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwodm9pZCAoKmZsaXBfY3RsKShpbnQgb24sIHZvaWQgKmRhdGEpLAorCQkJICAgICB2b2lkICpmbGlwX2RhdGEpCiB7Ci0JaW50IHN0YXR1cyA9IDA7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKKwlwczNhdi0+ZmxpcF9jdGwgPSBmbGlwX2N0bDsKKwlwczNhdi0+ZmxpcF9kYXRhID0gZmxpcF9kYXRhOworCW11dGV4X3VubG9jaygmcHMzYXYtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X3JlZ2lzdGVyX2ZsaXBfY3RsKTsKIAotCW11dGV4X2xvY2soJnBzM2F2Lm11dGV4KTsKLQlpZiAoIXBzM2F2Lm9wZW5fY291bnQrKykgewotCQlzdGF0dXMgPSBsdjFfZ3B1X29wZW4oMCk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGx2MV9ncHVfb3BlbiBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0JCQlwczNhdi5vcGVuX2NvdW50LS07Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7Ci0KLQlyZXR1cm4gc3RhdHVzOwordm9pZCBwczNhdl9mbGlwX2N0bChpbnQgb24pCit7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKKwlpZiAocHMzYXYtPmZsaXBfY3RsKQorCQlwczNhdi0+ZmxpcF9jdGwob24sIHBzM2F2LT5mbGlwX2RhdGEpOworCW11dGV4X3VubG9jaygmcHMzYXYtPm11dGV4KTsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfZGV2X29wZW4pOwotCi1pbnQgcHMzYXZfZGV2X2Nsb3NlKHZvaWQpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQltdXRleF9sb2NrKCZwczNhdi5tdXRleCk7Ci0JaWYgKHBzM2F2Lm9wZW5fY291bnQgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBHUFUgYWxyZWFkeSBjbG9zZWRcbiIsIF9fZnVuY19fKTsKLQkJc3RhdHVzID0gLTE7Ci0JfSBlbHNlIGlmICghLS1wczNhdi5vcGVuX2NvdW50KSB7Ci0JCXN0YXR1cyA9IGx2MV9ncHVfY2xvc2UoKTsKLQkJaWYgKHN0YXR1cykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBsdjFfZ3B1X2Nsb3NlIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChwczNhdl9kZXZfY2xvc2UpOwotCi1zdGF0aWMgaW50IHBzM2F2X3Byb2JlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzYXZfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXM7CiAJdTMyIGlkOwogCi0JZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJpbml0IC4uLlxuIik7Ci0JZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICIgIHRpbWVvdXQ9JWRcbiIsIHRpbWVvdXQpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgIHRpbWVvdXQ9JWRcbiIsIHRpbWVvdXQpOwogCi0JbWVtc2V0KCZwczNhdiwgMCwgc2l6ZW9mKHBzM2F2KSk7CisJaWYgKHBzM2F2KSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIk9ubHkgb25lIHBzM2F2IGRldmljZSBpcyBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAotCW11dGV4X2luaXQoJnBzM2F2Lm11dGV4KTsKLQlwczNhdi5wczNhdl9tb2RlID0gMDsKLQlwczNhdi5kZXYgPSBkZXY7Ci0KLQlJTklUX1dPUksoJnBzM2F2LndvcmssIHBzM2F2ZCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZwczNhdi5kb25lKTsKLQljb21wbGV0ZSgmcHMzYXYuZG9uZSk7Ci0JcHMzYXYud3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgicHMzYXZkIik7Ci0JaWYgKCFwczNhdi53cSkKKwlwczNhdiA9IGt6YWxsb2Moc2l6ZW9mKCpwczNhdiksIEdGUF9LRVJORUwpOworCWlmICghcHMzYXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcHMzYXYuYXZhaWxhYmxlID0gMTsKKwltdXRleF9pbml0KCZwczNhdi0+bXV0ZXgpOworCXBzM2F2LT5wczNhdl9tb2RlID0gMDsKKwlwczNhdi0+ZGV2ID0gZGV2OworCisJSU5JVF9XT1JLKCZwczNhdi0+d29yaywgcHMzYXZkKTsKKwlpbml0X2NvbXBsZXRpb24oJnBzM2F2LT5kb25lKTsKKwljb21wbGV0ZSgmcHMzYXYtPmRvbmUpOworCXBzM2F2LT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwczNhdmQiKTsKKwlpZiAoIXBzM2F2LT53cSkKKwkJZ290byBmYWlsOworCiAJc3dpdGNoIChwczNfb3NfYXJlYV9nZXRfYXZfbXVsdGlfb3V0KCkpIHsKIAljYXNlIFBTM19QQVJBTV9BVl9NVUxUSV9PVVRfTlRTQzoKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOwogCQlicmVhazsKIAljYXNlIFBTM19QQVJBTV9BVl9NVUxUSV9PVVRfUEFMX1lDQkNSOgogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9TRUNBTToKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwOwogCQlicmVhazsKIAljYXNlIFBTM19QQVJBTV9BVl9NVUxUSV9PVVRfUEFMX1JHQjoKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwIHwgUFMzQVZfUkVHSU9OX1JHQjsKKwkJcHMzYXYtPnJlZ2lvbiA9IFBTM0FWX1JFR0lPTl81MCB8IFBTM0FWX1JFR0lPTl9SR0I7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXBzM2F2LnJlZ2lvbiA9IFBTM0FWX1JFR0lPTl82MDsKKwkJcHMzYXYtPnJlZ2lvbiA9IFBTM0FWX1JFR0lPTl82MDsKIAkJYnJlYWs7CiAJfQogCkBAIC05MjcsMzkgKzk0MCw0NyBAQAogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwczNhdl9jbWRfaW5pdCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAogCQkgICAgICAgcmVzKTsKIAotCXBzM2F2X2dldF9od19jb25mKCZwczNhdik7Ci0JaWQgPSBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYuYXZfaHdfY29uZiwgMSk7Ci0JbXV0ZXhfbG9jaygmcHMzYXYubXV0ZXgpOwotCXBzM2F2LnBzM2F2X21vZGUgPSBpZDsKLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKKwlwczNhdl9nZXRfaHdfY29uZihwczNhdik7CisJaWQgPSBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYtPmF2X2h3X2NvbmYsIDEpOworCW11dGV4X2xvY2soJnBzM2F2LT5tdXRleCk7CisJcHMzYXYtPnBzM2F2X21vZGUgPSBpZDsKKwltdXRleF91bmxvY2soJnBzM2F2LT5tdXRleCk7CiAKLQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgImluaXQuLi5kb25lXG4iKTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlyZXR1cm4gMDsKKworZmFpbDoKKwlrZnJlZShwczNhdik7CisJcHMzYXYgPSBOVUxMOworCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgaW50IHBzM2F2X3JlbW92ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM2F2X3JlbW92ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKHBzM2F2LmF2YWlsYWJsZSkgeworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlpZiAocHMzYXYpIHsKIAkJcHMzYXZfY21kX2ZpbigpOwotCQlpZiAocHMzYXYud3EpCi0JCQlkZXN0cm95X3dvcmtxdWV1ZShwczNhdi53cSk7Ci0JCXBzM2F2LmF2YWlsYWJsZSA9IDA7CisJCWlmIChwczNhdi0+d3EpCisJCQlkZXN0cm95X3dvcmtxdWV1ZShwczNhdi0+d3EpOworCQlrZnJlZShwczNhdik7CisJCXBzM2F2ID0gTlVMTDsKIAl9CiAKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBzM2F2X3NodXRkb3duKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHBzM2F2X3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcHMzYXZfcmVtb3ZlKGRldik7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQogCiBzdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciBwczNhdl9kcml2ZXIgPSB7Ci0JLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTLAotCS5jb3JlID0gewotCQkubmFtZSA9ICJwczNfYXYiLAotCX0sCisJLmNvcmUubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MsCisJLmNvcmUuY29yZS5uYW1lID0gInBzM19hdiIsCiAJLnByb2JlID0gcHMzYXZfcHJvYmUsCiAJLnJlbW92ZSA9IHBzM2F2X3JlbW92ZSwKIAkuc2h1dGRvd24gPSBwczNhdl9zaHV0ZG93biwKQEAgLTk3Miw2ICs5OTMsOCBAQAogCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCiAJZXJyb3IgPSBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIoJnBzM2F2X2RyaXZlcik7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtOTgwLDIwICsxMDAzLDIxIEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQllcnJvciA9IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlcigmcHMzYXZfZGV2KTsKLQlpZiAoZXJyb3IpCi0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBwczNfdnVhcnRfcG9ydF9kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGVycm9yKTsKLQorCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcHMzYXZfbW9kdWxlX2V4aXQodm9pZCkKIHsKLQlkZXZpY2VfdW5yZWdpc3RlcigmcHMzYXZfZGV2LmNvcmUpOworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIoJnBzM2F2X2RyaXZlcik7CisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIAogc3Vic3lzX2luaXRjYWxsKHBzM2F2X21vZHVsZV9pbml0KTsKIG1vZHVsZV9leGl0KHBzM2F2X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQUzMgQVYgU2V0dGluZ3MgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLiIpOworTU9EVUxFX0FMSUFTKFBTM19NT0RVTEVfQUxJQVNfQVZfU0VUVElOR1MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvcHMzYXZfY21kLmMgYi9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYwppbmRleCAwMTQ1ZWExLi5mNzJmNWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYworKysgYi9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYwpAQCAtMTQzLDYgKzE0MywxNCBAQAogCXJldHVybiBQUzNBVl9DTURfQVZfVklEXzQ4MFA7CiB9CiAKK3N0YXRpYyBpbnQgcHMzYXZfaGRtaV9yYW5nZSh2b2lkKQoreworCWlmIChwczNfY29tcGFyZV9maXJtd2FyZV92ZXJzaW9uKDEsIDgsIDApIDwgMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsgLyogc3VwcG9ydGVkICovCit9CisKIGludCBwczNhdl9jbWRfaW5pdCh2b2lkKQogewogCWludCByZXM7CkBAIC0zNTAsNiArMzU4LDEwIEBACiAJLyogc2hvdWxkIGJlIHNhbWUgYXMgdmlkZW9fbW9kZS52aWRlb19jc19vdXQgKi8KIAlhdl92aWRlb19jcy0+YXZfY3NfaW4gPSBwczNhdl9jc192aWRlbzJhdihQUzNBVl9DTURfVklERU9fQ1NfUkdCXzgpOwogCWF2X3ZpZGVvX2NzLT5iaXRsZW5fb3V0ID0gcHMzYXZfY3NfdmlkZW8yYXZfYml0bGVuKGNzX291dCk7CisJaWYgKChpZCAmIFBTM0FWX01PREVfV0hJVEUpICYmIHBzM2F2X2hkbWlfcmFuZ2UoKSkKKwkJYXZfdmlkZW9fY3MtPnN1cGVyX3doaXRlID0gUFMzQVZfQ01EX0FWX1NVUEVSX1dISVRFX09OOworCWVsc2UgLyogZGVmYXVsdCBvZmYgKi8KKwkJYXZfdmlkZW9fY3MtPnN1cGVyX3doaXRlID0gUFMzQVZfQ01EX0FWX1NVUEVSX1dISVRFX09GRjsKIAlhdl92aWRlb19jcy0+YXNwZWN0ID0gYXNwZWN0OwogCWlmIChpZCAmIFBTM0FWX01PREVfRElUSEVSKSB7CiAJCWF2X3ZpZGVvX2NzLT5kaXRoZXIgPSBQUzNBVl9DTURfQVZfRElUSEVSX09OCkBAIC0zOTIsNiArNDA0LDEwIEBACiAJdmlkZW9fbW9kZS0+cGl0Y2ggPSB2aWRlb19tb2RlLT53aWR0aCAqIDQ7CS8qIGxpbmVfbGVuZ3RoICovCiAJdmlkZW9fbW9kZS0+dmlkZW9fb3V0X2Zvcm1hdCA9IFBTM0FWX0NNRF9WSURFT19PVVRfRk9STUFUX1JHQl8xMkJJVDsKIAl2aWRlb19tb2RlLT52aWRlb19mb3JtYXQgPSBwczNhdl92aWRlb19mbXRfdGFibGVbdmlkZW9fZm10XS5mb3JtYXQ7CisJaWYgKChpZCAmIFBTM0FWX01PREVfQ09MT1IpICYmIHBzM2F2X2hkbWlfcmFuZ2UoKSkKKwkJdmlkZW9fbW9kZS0+dmlkZW9fY2xfY252ID0gUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9ESVNBQkxFX0xVVDsKKwllbHNlIC8qIGRlZmF1bHQgZW5hYmxlICovCisJCXZpZGVvX21vZGUtPnZpZGVvX2NsX2NudiA9IFBTM0FWX0NNRF9WSURFT19DTF9DTlZfRU5BQkxFX0xVVDsKIAl2aWRlb19tb2RlLT52aWRlb19vcmRlciA9IHBzM2F2X3ZpZGVvX2ZtdF90YWJsZVt2aWRlb19mbXRdLm9yZGVyOwogCiAJcHJfZGVidWcoIiVzOiB2aWRlb19tb2RlOnZpZDoleCB3aWR0aDolZCBoZWlnaHQ6JWQgcGl0Y2g6JWQgb3V0X2Zvcm1hdDolZCBmb3JtYXQ6JXggb3JkZXI6JXhcbiIsCkBAIC04NTIsNyArODY4LDcgQEAKIHsKIAlpbnQgcmVzOwogCi0JcHMzZmJfZmxpcF9jdGwoMCk7CS8qIGZsaXAgb2ZmICovCisJcHMzYXZfZmxpcF9jdGwoMCk7CS8qIGZsaXAgb2ZmICovCiAKIAkvKiBhdmIgcGFja2V0ICovCiAJcmVzID0gcHMzYXZfZG9fcGt0KFBTM0FWX0NJRF9BVkJfUEFSQU0sIHNlbmRfbGVuLCBzaXplb2YoKmF2YiksCkBAIC04NjYsNyArODgyLDcgQEAKIAkJCSByZXMpOwogCiAgICAgICBvdXQ6Ci0JcHMzZmJfZmxpcF9jdGwoMSk7CS8qIGZsaXAgb24gKi8KKwlwczNhdl9mbGlwX2N0bCgxKTsJLyogZmxpcCBvbiAqLwogCXJldHVybiByZXM7CiB9CiAKQEAgLTk4NywzNCArMTAwMywzIEBACiAJCXwgUFMzQVZfQ01EX0FWX0xBWU9VVF8xNzYgXAogCQl8IFBTM0FWX0NNRF9BVl9MQVlPVVRfMTkyKQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiB2dWFydCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUE9MTElOR19JTlRFUlZBTCAgMjUJLyogaW4gbXNlYyAqLwotCi1pbnQgcHMzYXZfdnVhcnRfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgZXJyb3IgPSBwczNfdnVhcnRfd3JpdGUoZGV2LCBidWYsIHNpemUpOwotCXJldHVybiBlcnJvciA/IGVycm9yIDogc2l6ZTsKLX0KLQotaW50IHBzM2F2X3Z1YXJ0X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkICpidWYsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgZXJyb3I7Ci0JaW50IGxvb3BjbnQgPSAwOwotCi0JdGltZW91dCA9ICh0aW1lb3V0ICsgUE9MTElOR19JTlRFUlZBTCAtIDEpIC8gUE9MTElOR19JTlRFUlZBTDsKLQl3aGlsZSAobG9vcGNudCsrIDw9IHRpbWVvdXQpIHsKLQkJZXJyb3IgPSBwczNfdnVhcnRfcmVhZChkZXYsIGJ1Ziwgc2l6ZSk7Ci0JCWlmICghZXJyb3IpCi0JCQlyZXR1cm4gc2l6ZTsKLQkJaWYgKGVycm9yICE9IC1FQUdBSU4pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM192dWFydF9yZWFkIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgZXJyb3IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCW1zbGVlcChQT0xMSU5HX0lOVEVSVkFMKTsKLQl9Ci0JcmV0dXJuIC1FV09VTERCTE9DSzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMgYi9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTgyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogUFMzIFN0b3JhZ2UgTGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKyNpbmNsdWRlIDxhc20vcHMzc3Rvci5oPgorCisKK3N0YXRpYyBpbnQgcHMzc3Rvcl9wcm9iZV9hY2Nlc3Moc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2KQoreworCWludCByZXMsIGVycm9yOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgbjsKKworCWlmIChkZXYtPnNiZC5tYXRjaF9pZCA9PSBQUzNfTUFUQ0hfSURfU1RPUl9ST00pIHsKKwkJLyogc3BlY2lhbCBjYXNlOiBDRC1ST00gaXMgYXNzdW1lZCBhbHdheXMgYWNjZXNzaWJsZSAqLworCQlkZXYtPmFjY2Vzc2libGVfcmVnaW9ucyA9IDE7CisJCXJldHVybiAwOworCX0KKworCWVycm9yID0gLUVQRVJNOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yZWdpb25zOyBpKyspIHsKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogY2hlY2tpbmcgYWNjZXNzaWJpbGl0eSBvZiByZWdpb24gJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGkpOworCisJCWRldi0+cmVnaW9uX2lkeCA9IGk7CisJCXJlcyA9IHBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzKGRldiwgZGV2LT5ib3VuY2VfbHBhciwgMCwgMSwKKwkJCQkJCSAwKTsKKwkJaWYgKHJlcykgeworCQkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZWFkIGZhaWxlZCwgIgorCQkJCSJyZWdpb24gJXUgaXMgbm90IGFjY2Vzc2libGVcbiIsIF9fZnVuY19fLAorCQkJCV9fTElORV9fLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZWdpb24gJXUgaXMgYWNjZXNzaWJsZVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgaSk7CisJCXNldF9iaXQoaSwgJmRldi0+YWNjZXNzaWJsZV9yZWdpb25zKTsKKworCQkvKiBXZSBjYW4gYWNjZXNzIGF0IGxlYXN0IG9uZSByZWdpb24gKi8KKwkJZXJyb3IgPSAwOworCX0KKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCW4gPSBod2VpZ2h0X2xvbmcoZGV2LT5hY2Nlc3NpYmxlX3JlZ2lvbnMpOworCWlmIChuID4gMSkKKwkJZGV2X2luZm8oJmRldi0+c2JkLmNvcmUsCisJCQkgIiVzOiV1OiAlbHUgYWNjZXNzaWJsZSByZWdpb25zIGZvdW5kLiBPbmx5IHRoZSBmaXJzdCAiCisJCQkgIm9uZSB3aWxsIGJlIHVzZWQiLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgbik7CisJZGV2LT5yZWdpb25faWR4ID0gX19mZnMoZGV2LT5hY2Nlc3NpYmxlX3JlZ2lvbnMpOworCWRldl9pbmZvKCZkZXYtPnNiZC5jb3JlLAorCQkgIkZpcnN0IGFjY2Vzc2libGUgcmVnaW9uIGhhcyBpbmRleCAldSBzdGFydCAlbHUgc2l6ZSAlbHVcbiIsCisJCSBkZXYtPnJlZ2lvbl9pZHgsIGRldi0+cmVnaW9uc1tkZXYtPnJlZ2lvbl9pZHhdLnN0YXJ0LAorCQkgZGV2LT5yZWdpb25zW2Rldi0+cmVnaW9uX2lkeF0uc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCXBzM3N0b3Jfc2V0dXAgLSBTZXR1cCBhIHN0b3JhZ2UgZGV2aWNlIGJlZm9yZSB1c2UKKyAqCUBkZXY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlCisgKglAaGFuZGxlcjogUG9pbnRlciB0byBhbiBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZQorICovCitpbnQgcHMzc3Rvcl9zZXR1cChzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlpbnQgZXJyb3IsIHJlcywgYWxpZ25tZW50OworCWVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplOworCisJZXJyb3IgPSBwczNfb3Blbl9odl9kZXZpY2UoJmRldi0+c2JkKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogcHMzX29wZW5faHZfZGV2aWNlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZXJyb3IpOworCQlnb3RvIGZhaWw7CisJfQorCisJZXJyb3IgPSBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKCZkZXYtPnNiZCwgUFMzX0JJTkRJTkdfQ1BVX0FOWSwKKwkJCQkJCSZkZXYtPmlycSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAgZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBlcnJvcik7CisJCWdvdG8gZmFpbF9jbG9zZV9kZXZpY2U7CisJfQorCisJZXJyb3IgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICBkZXYtPnNiZC5jb3JlLmRyaXZlci0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZXF1ZXN0X2lycSBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGVycm9yKTsKKwkJZ290byBmYWlsX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95OworCX0KKworCWFsaWdubWVudCA9IG1pbihfX2ZmcyhkZXYtPmJvdW5jZV9zaXplKSwKKwkJCV9fZmZzKCh1bnNpZ25lZCBsb25nKWRldi0+Ym91bmNlX2J1ZikpOworCWlmIChhbGlnbm1lbnQgPCAxMikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBib3VuY2UgYnVmZmVyIG5vdCBhbGlnbmVkICglbHggYXQgMHglcClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Ym91bmNlX3NpemUsIGRldi0+Ym91bmNlX2J1Zik7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2ZyZWVfaXJxOworCX0gZWxzZSBpZiAoYWxpZ25tZW50IDwgMTYpCisJCXBhZ2Vfc2l6ZSA9IFBTM19ETUFfNEs7CisJZWxzZQorCQlwYWdlX3NpemUgPSBQUzNfRE1BXzY0SzsKKwlkZXYtPnNiZC5kX3JlZ2lvbiA9ICZkZXYtPmRtYV9yZWdpb247CisJcHMzX2RtYV9yZWdpb25faW5pdCgmZGV2LT5zYmQsICZkZXYtPmRtYV9yZWdpb24sIHBhZ2Vfc2l6ZSwKKwkJCSAgICBQUzNfRE1BX09USEVSLCBkZXYtPmJvdW5jZV9idWYsIGRldi0+Ym91bmNlX3NpemUpOworCXJlcyA9IHBzM19kbWFfcmVnaW9uX2NyZWF0ZSgmZGV2LT5kbWFfcmVnaW9uKTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogY2Fubm90IGNyZWF0ZSBETUEgcmVnaW9uXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisJfQorCisJZGV2LT5ib3VuY2VfbHBhciA9IHBzM19tbV9waHlzX3RvX2xwYXIoX19wYShkZXYtPmJvdW5jZV9idWYpKTsKKwlkZXYtPmJvdW5jZV9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmZGV2LT5zYmQuY29yZSwgZGV2LT5ib3VuY2VfYnVmLAorCQkJCQkgZGV2LT5ib3VuY2Vfc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICghZGV2LT5ib3VuY2VfZG1hKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogbWFwIERNQSByZWdpb24gZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZnJlZV9kbWE7CisJfQorCisJZXJyb3IgPSBwczNzdG9yX3Byb2JlX2FjY2VzcyhkZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IE5vIGFjY2Vzc2libGUgcmVnaW9ucyBmb3VuZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF91bm1hcF9kbWE7CisJfQorCXJldHVybiAwOworCitmYWlsX3VubWFwX2RtYToKKwlkbWFfdW5tYXBfc2luZ2xlKCZkZXYtPnNiZC5jb3JlLCBkZXYtPmJvdW5jZV9kbWEsIGRldi0+Ym91bmNlX3NpemUsCisJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworZmFpbF9mcmVlX2RtYToKKwlwczNfZG1hX3JlZ2lvbl9mcmVlKCZkZXYtPmRtYV9yZWdpb24pOworZmFpbF9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2ZhaWxfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3k6CisJcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KCZkZXYtPnNiZCwgZGV2LT5pcnEpOworZmFpbF9jbG9zZV9kZXZpY2U6CisJcHMzX2Nsb3NlX2h2X2RldmljZSgmZGV2LT5zYmQpOworZmFpbDoKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNzdG9yX3NldHVwKTsKKworCisvKioKKyAqCXBzM3N0b3JfdGVhcmRvd24gLSBUZWFyIGRvd24gYSBzdG9yYWdlIGRldmljZSBhZnRlciB1c2UKKyAqCUBkZXY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlCisgKi8KK3ZvaWQgcHMzc3Rvcl90ZWFyZG93bihzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYpCit7CisJaW50IGVycm9yOworCisJZG1hX3VubWFwX3NpbmdsZSgmZGV2LT5zYmQuY29yZSwgZGV2LT5ib3VuY2VfZG1hLCBkZXYtPmJvdW5jZV9zaXplLAorCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwlwczNfZG1hX3JlZ2lvbl9mcmVlKCZkZXYtPmRtYV9yZWdpb24pOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwllcnJvciA9IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSgmZGV2LT5zYmQsIGRldi0+aXJxKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IGRlc3Ryb3kgZXZlbnQgcmVjZWl2ZSBwb3J0IGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXJyb3IpOworCisJZXJyb3IgPSBwczNfY2xvc2VfaHZfZGV2aWNlKCZkZXYtPnNiZCk7CisJaWYgKGVycm9yKQorCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBwczNfY2xvc2VfaHZfZGV2aWNlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZXJyb3IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzc3Rvcl90ZWFyZG93bik7CisKKworLyoqCisgKglwczNzdG9yX3JlYWRfd3JpdGVfc2VjdG9ycyAtIHJlYWQvd3JpdGUgZnJvbS90byBhIHN0b3JhZ2UgZGV2aWNlCisgKglAZGV2OiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19zdG9yYWdlX2RldmljZQorICoJQGxwYXI6IEhWIGxvZ2ljYWwgcGFydGl0aW9uIGFkZHJlc3MKKyAqCUBzdGFydF9zZWN0b3I6IEZpcnN0IHNlY3RvciB0byByZWFkL3dyaXRlCisgKglAc2VjdG9yczogTnVtYmVyIG9mIHNlY3RvcnMgdG8gcmVhZC93cml0ZQorICoJQHdyaXRlOiBGbGFnIGluZGljYXRpbmcgd3JpdGUgKG5vbi16ZXJvKSBvciByZWFkICh6ZXJvKQorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgaW4gY2FzZSBvZiBmYWlsdXJlIHRvIHN1Ym1pdCB0aGUgY29tbWFuZCwgb3IKKyAqCWFuIExWMSBzdGF0dXMgdmFsdWUgaW4gY2FzZSBvZiBvdGhlciBlcnJvcnMKKyAqLwordTY0IHBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwgdTY0IGxwYXIsCisJCQkgICAgICAgdTY0IHN0YXJ0X3NlY3RvciwgdTY0IHNlY3RvcnMsIGludCB3cml0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnaW9uX2lkID0gZGV2LT5yZWdpb25zW2Rldi0+cmVnaW9uX2lkeF0uaWQ7CisJY29uc3QgY2hhciAqb3AgPSB3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCI7CisJaW50IHJlczsKKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgJWx1IHNlY3RvcnMgc3RhcnRpbmcgYXQgJWx1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIG9wLCBzZWN0b3JzLCBzdGFydF9zZWN0b3IpOworCisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCXJlcyA9IHdyaXRlID8gbHYxX3N0b3JhZ2Vfd3JpdGUoZGV2LT5zYmQuZGV2X2lkLCByZWdpb25faWQsCisJCQkJCXN0YXJ0X3NlY3Rvciwgc2VjdG9ycywgMCwgbHBhciwKKwkJCQkJJmRldi0+dGFnKQorCQkgICAgOiBsdjFfc3RvcmFnZV9yZWFkKGRldi0+c2JkLmRldl9pZCwgcmVnaW9uX2lkLAorCQkJCSAgICAgICBzdGFydF9zZWN0b3IsIHNlY3RvcnMsIDAsIGxwYXIsCisJCQkJICAgICAgICZkZXYtPnRhZyk7CisJaWYgKHJlcykgeworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgb3AsIHJlcyk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCWlmIChkZXYtPmx2MV9zdGF0dXMpIHsKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyBmYWlsZWQgMHglbHhcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIG9wLCBkZXYtPmx2MV9zdGF0dXMpOworCQlyZXR1cm4gZGV2LT5sdjFfc3RhdHVzOworCX0KKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgY29tcGxldGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCW9wKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzc3Rvcl9yZWFkX3dyaXRlX3NlY3RvcnMpOworCisKKy8qKgorICoJcHMzc3Rvcl9zZW5kX2NvbW1hbmQgLSBzZW5kIGEgZGV2aWNlIGNvbW1hbmQgdG8gYSBzdG9yYWdlIGRldmljZQorICoJQGRldjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UKKyAqCUBjbWQ6IENvbW1hbmQgbnVtYmVyCisgKglAYXJnMTogRmlyc3QgY29tbWFuZCBhcmd1bWVudAorICoJQGFyZzI6IFNlY29uZCBjb21tYW5kIGFyZ3VtZW50CisgKglAYXJnMzogVGhpcmQgY29tbWFuZCBhcmd1bWVudAorICoJQGFyZzQ6IEZvdXJ0aCBjb21tYW5kIGFyZ3VtZW50CisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBpbiBjYXNlIG9mIGZhaWx1cmUgdG8gc3VibWl0IHRoZSBjb21tYW5kLCBvcgorICoJYW4gTFYxIHN0YXR1cyB2YWx1ZSBpbiBjYXNlIG9mIG90aGVyIGVycm9ycworICovCit1NjQgcHMzc3Rvcl9zZW5kX2NvbW1hbmQoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2LCB1NjQgY21kLCB1NjQgYXJnMSwKKwkJCSB1NjQgYXJnMiwgdTY0IGFyZzMsIHU2NCBhcmc0KQoreworCWludCByZXM7CisKKwlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHNlbmQgZGV2aWNlIGNvbW1hbmQgMHglbHhcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgY21kKTsKKworCWluaXRfY29tcGxldGlvbigmZGV2LT5kb25lKTsKKworCXJlcyA9IGx2MV9zdG9yYWdlX3NlbmRfZGV2aWNlX2NvbW1hbmQoZGV2LT5zYmQuZGV2X2lkLCBjbWQsIGFyZzEsCisJCQkJCSAgICAgIGFyZzIsIGFyZzMsIGFyZzQsICZkZXYtPnRhZyk7CisJaWYgKHJlcykgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBzZW5kX2RldmljZV9jb21tYW5kIDB4JWx4IGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgY21kLCByZXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmZGV2LT5kb25lKTsKKwlpZiAoZGV2LT5sdjFfc3RhdHVzKSB7CisJCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVseCBmYWlsZWQgMHglbHhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGNtZCwgZGV2LT5sdjFfc3RhdHVzKTsKKwkJcmV0dXJuIGRldi0+bHYxX3N0YXR1czsKKwl9CisKKwlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IGNvbW1hbmQgMHglbHggY29tcGxldGVkXG4iLCBfX2Z1bmNfXywKKwkJX19MSU5FX18sIGNtZCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM3N0b3Jfc2VuZF9jb21tYW5kKTsKKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBTMyBTdG9yYWdlIEJ1cyBMaWJyYXJ5Iik7CitNT0RVTEVfQVVUSE9SKCJTb255IENvcnBvcmF0aW9uIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci1jb3JlLmMgYi9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2NDhmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIFBTMyBTeXN0ZW0gTWFuYWdlciBjb3JlLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKworLyoqCisgKiBTdGF0aWNseSBsaW5rZWQgcm91dGluZXMgdGhhdCBhbGxvdyBsYXRlIGJpbmRpbmcgb2YgYSBsb2FkZWQgc3lzLW1hbmFnZXIKKyAqIG1vZHVsZS4KKyAqLworCitzdGF0aWMgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgcHMzX3N5c19tYW5hZ2VyX29wczsKKworLyoqCisgKiBwczNfcmVnaXN0ZXJfc3lzX21hbmFnZXJfb3BzIC0gQmluZCBwczNfc3lzX21hbmFnZXJfb3BzIHRvIGEgbW9kdWxlLgorICogQG9wczogc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMuCisgKgorICogVG8gYmUgY2FsbGVkIGZyb20gcHMzX3N5c19tYW5hZ2VyX3Byb2JlKCkgYW5kIHBzM19zeXNfbWFuYWdlcl9yZW1vdmUoKSB0bworICogcmVnaXN0ZXIgY2FsbCBiYWNrIG9wcyBmb3IgcG93ZXIgY29udHJvbC4gIENvcGllcyBkYXRhIHRvIHRoZSBzdGF0aWMKKyAqIHZhcmlhYmxlIHBzM19zeXNfbWFuYWdlcl9vcHMuCisgKi8KKwordm9pZCBwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzKGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfb3BzICpvcHMpCit7CisJQlVHX09OKCFvcHMpOworCUJVR19PTighb3BzLT5kZXYpOworCXBzM19zeXNfbWFuYWdlcl9vcHMgPSBvcHMgPyAqb3BzIDogcHMzX3N5c19tYW5hZ2VyX29wczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMpOworCit2b2lkIHBzM19zeXNfbWFuYWdlcl9wb3dlcl9vZmYodm9pZCkKK3sKKwlpZiAocHMzX3N5c19tYW5hZ2VyX29wcy5wb3dlcl9vZmYpCisJCXBzM19zeXNfbWFuYWdlcl9vcHMucG93ZXJfb2ZmKHBzM19zeXNfbWFuYWdlcl9vcHMuZGV2KTsKKworCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3aGlsZSAoMSkKKwkJKHZvaWQpMDsKK30KKwordm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKQoreworCWlmIChwczNfc3lzX21hbmFnZXJfb3BzLnJlc3RhcnQpCisJCXBzM19zeXNfbWFuYWdlcl9vcHMucmVzdGFydChwczNfc3lzX21hbmFnZXJfb3BzLmRldik7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIEhhbHRlZCwgT0sgdG8gdHVybiBvZmYgcG93ZXJcbiIpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJd2hpbGUgKDEpCisJCSh2b2lkKTA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci5jIGIvZHJpdmVycy9wczMvc3lzLW1hbmFnZXIuYwppbmRleCAzYWEyYjBkLi44NDYxYjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLmMKQEAgLTM1LDcgKzM1LDcgQEAKIC8qKgogICogcHMzX3N5c19tYW5hZ2VyIC0gUFMzIHN5c3RlbSBtYW5hZ2VyIGRyaXZlci4KICAqCi0gKiBUaGUgc3lzdGVtIG1hbmFnZXIgcHJvdmlkZXMgYW4gYXN5bmNyb25vdXMgc3lzdGVtIGV2ZW50IG5vdGlmaWNhdGlvbgorICogVGhlIHN5c3RlbSBtYW5hZ2VyIHByb3ZpZGVzIGFuIGFzeW5jaHJvbm91cyBzeXN0ZW0gZXZlbnQgbm90aWZpY2F0aW9uCiAgKiBtZWNoYW5pc20gZm9yIHJlcG9ydGluZyBldmVudHMgbGlrZSB0aGVybWFsIGFsZXJ0IGFuZCBidXR0b24gcHJlc3NlcyB0bwogICogZ3Vlc3RzLiAgSXQgYWxzbyBwcm92aWRlcyBzdXBwb3J0IHRvIGNvbnRyb2wgc3lzdGVtIHNodXRkb3duIGFuZCBzdGFydHVwLgogICoKQEAgLTUyLDYgKzUyLDcgQEAKICAqIEBzaXplOiBIZWFkZXIgc2l6ZSBpbiBieXRlcywgY3VyZW50bHkgMTYuCiAgKiBAcGF5bG9hZF9zaXplOiBNZXNzYWdlIHBheWxvYWQgc2l6ZSBpbiBieXRlcy4KICAqIEBzZXJ2aWNlX2lkOiBNZXNzYWdlIHR5cGUsIG9uZSBvZiBlbnVtIHBzM19zeXNfbWFuYWdlcl9zZXJ2aWNlX2lkLgorICogQHJlcXVlc3RfdGFnOiBVbmlxdWUgbnVtYmVyIHRvIGlkZW50aWZ5IHJlcGx5LgogICovCiAKIHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIHsKQEAgLTYxLDI5ICs2Miw0OSBAQAogCXUxNiByZXNlcnZlZF8xOwogCXUzMiBwYXlsb2FkX3NpemU7CiAJdTE2IHNlcnZpY2VfaWQ7Ci0JdTE2IHJlc2VydmVkXzJbM107CisJdTE2IHJlc2VydmVkXzI7CisJdTMyIHJlcXVlc3RfdGFnOwogfTsKIAorI2RlZmluZSBkdW1wX3NtX2hlYWRlcihfaCkgX2R1bXBfc21faGVhZGVyKF9oLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF9zbV9oZWFkZXIoCisJY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgKmgsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogdmVyc2lvbjogICAgICAleGhcbiIsIGZ1bmMsIGxpbmUsIGgtPnZlcnNpb24pOworCXByX2RlYnVnKCIlczolZDogc2l6ZTogICAgICAgICAleGhcbiIsIGZ1bmMsIGxpbmUsIGgtPnNpemUpOworCXByX2RlYnVnKCIlczolZDogcGF5bG9hZF9zaXplOiAleGhcbiIsIGZ1bmMsIGxpbmUsIGgtPnBheWxvYWRfc2l6ZSk7CisJcHJfZGVidWcoIiVzOiVkOiBzZXJ2aWNlX2lkOiAgICV4aFxuIiwgZnVuYywgbGluZSwgaC0+c2VydmljZV9pZCk7CisJcHJfZGVidWcoIiVzOiVkOiByZXF1ZXN0X3RhZzogICV4aFxuIiwgZnVuYywgbGluZSwgaC0+cmVxdWVzdF90YWcpOworfQorCiAvKioKLSAqIEBQUzNfU01fUlhfTVNHX0xFTiAtIFN5c3RlbSBtYW5hZ2VyIHJlY2VpdmVkIG1lc3NhZ2UgbGVuZ3RoLgorICogQFBTM19TTV9SWF9NU0dfTEVOX01JTiAtIFNob3J0ZXN0IHJlY2VpdmVkIG1lc3NhZ2UgbGVuZ3RoLgorICogQFBTM19TTV9SWF9NU0dfTEVOX01BWCAtIExvbmdlc3QgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGguCiAgKgotICogQ3VycmVudGx5IGFsbCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlciBhcmUgdGhlIHNhbWUgbGVuZ3RoCi0gKiAoMTYgYnl0ZXMgaGVhZGVyICsgMTYgYnl0ZXMgcGF5bG9hZCA9IDMyIGJ5dGVzKS4gIFRoaXMga25vd2xlZ2UgaXMgdXNlZCB0bwotICogc2ltcGxpZnkgdGhlIGxvZ2ljLgorICogQ3VycmVudGx5IGFsbCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlciBhcmUgZWl0aGVyCisgKiAoMTYgYnl0ZXMgaGVhZGVyICsgOCBieXRlcyBwYXlsb2FkID0gMjQgYnl0ZXMpIG9yICgxNiBieXRlcyBoZWFkZXIKKyAqICsgMTYgYnl0ZXMgcGF5bG9hZCA9IDMyIGJ5dGVzKS4gIFRoaXMga25vd2xlZ2UgaXMgdXNlZCB0byBzaW1wbGlmeQorICogdGhlIGxvZ2ljLgogICovCiAKIGVudW0gewotCVBTM19TTV9SWF9NU0dfTEVOID0gMzIsCisJUFMzX1NNX1JYX01TR19MRU5fTUlOID0gMjQsCisJUFMzX1NNX1JYX01TR19MRU5fTUFYID0gMzIsCiB9OwogCiAvKioKICAqIGVudW0gcHMzX3N5c19tYW5hZ2VyX3NlcnZpY2VfaWQgLSBNZXNzYWdlIGhlYWRlciBzZXJ2aWNlX2lkLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1Q6ICAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX0NPTU1BTkQ6ICAgICAgZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1JFU1BPTlNFOiAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSOiAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX0VYVEVSTl9FVkVOVDogZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QOiAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1Q6ICAgICAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SOiBndWVzdCA8LS0gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfQ09NTUFORDogICAgICAgZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1JFU1BPTlNFOiAgICAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUjogICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfRVhURVJOX0VWRU5UOiAgZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QOiAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqCisgKiBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SIGlzIHJldHVybmVkIGZvciBpbnZhbGlkIGRhdGEgdmFsdWVzIGluIGEKKyAqIGEgUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVCBtZXNzYWdlLiAgSXQgYWxzbyBzZWVtcyB0byBiZSByZXR1cm5lZCB3aGVuCisgKiBhIFJFUVVFU1QgbWVzc2FnZSBpcyBzZW50IGF0IHRoZSB3cm9uZyB0aW1lLgogICovCiAKIGVudW0gcHMzX3N5c19tYW5hZ2VyX3NlcnZpY2VfaWQgewpAQCAtOTMsNiArMTE0LDcgQEAKIAlQUzNfU01fU0VSVklDRV9JRF9DT01NQU5EID0gMywKIAlQUzNfU01fU0VSVklDRV9JRF9FWFRFUk5fRVZFTlQgPSA0LAogCVBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QID0gNSwKKwlQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SID0gNiwKIAlQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUiA9IDgsCiB9OwogCkBAIC0xODUsMTEgKzIwNywyMSBAQAogfTsKIAogLyoqCisgKiBwczNfc21fZm9yY2VfcG93ZXJfb2ZmIC0gUG93ZXJvZmYgaGVscGVyLgorICoKKyAqIEEgZ2xvYmFsIHZhcmlhYmxlIHVzZWQgdG8gZm9yY2UgYSBwb3dlcm9mZiB3aGVuIHRoZSBwb3dlciBidXR0b24gaGFzCisgKiBiZWVuIHByZXNzZWQgaXJyZXNwZWN0aXZlIG9mIGhvdyBpbml0IGhhbmRsZXMgdGhlIGN0cmxfYWx0X2RlbCBzaWduYWwuCisgKgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHMzX3NtX2ZvcmNlX3Bvd2VyX29mZjsKKworLyoqCiAgKiBwczNfc3lzX21hbmFnZXJfd3JpdGUgLSBIZWxwZXIgdG8gd3JpdGUgYSB0d28gcGFydCBtZXNzYWdlIHRvIHRoZSB2dWFydC4KICAqCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHZvaWQgKnBheWxvYWQpCiB7CiAJaW50IHJlc3VsdDsKQEAgLTIxMywxNSArMjQ1LDEwIEBACiAgKgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfYXR0cihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX2F0dHIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWVudW0gcHMzX3N5c19tYW5hZ2VyX2F0dHIgYXR0cikKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyID0gewotCQkudmVyc2lvbiA9IDEsCi0JCS5zaXplID0gMTYsCi0JCS5wYXlsb2FkX3NpemUgPSAxNiwKLQkJLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUiwKLQl9OworCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgewogCQl1OCB2ZXJzaW9uOwogCQl1OCByZXNlcnZlZF8xWzNdOwpAQCAtMjMyLDYgKzI1OSwxMiBAQAogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBhdHRyKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfU0VUX0FUVFI7CisKIAltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CiAJcGF5bG9hZC52ZXJzaW9uID0gMTsKIAlwYXlsb2FkLmF0dHJpYnV0ZSA9IGF0dHI7CkBAIC0yNDUsMTYgKzI3OCwxMSBAQAogICogVGVsbCB0aGUgc3lzdGVtIG1hbmFnZXIgd2hhdCB0byBkbyBhZnRlciB0aGlzIGxwYXIgaXMgZGVzdHJveWVkLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX25leHRfb3Aoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWVudW0gcHMzX3N5c19tYW5hZ2VyX25leHRfb3Agb3AsCiAJZW51bSBwczNfc3lzX21hbmFnZXJfd2FrZV9zb3VyY2Ugd2FrZV9zb3VyY2UpCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlciA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkuc2l6ZSA9IDE2LAotCQkucGF5bG9hZF9zaXplID0gMTYsCi0JCS5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1AsCi0JfTsKKwlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IHsKIAkJdTggdmVyc2lvbjsKIAkJdTggdHlwZTsKQEAgLTI2OCw2ICsyOTYsMTIgQEAKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAoJXhoKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBvcCk7CiAKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCWhlYWRlci52ZXJzaW9uID0gMTsKKwloZWFkZXIuc2l6ZSA9IDE2OworCWhlYWRlci5wYXlsb2FkX3NpemUgPSAxNjsKKwloZWFkZXIuc2VydmljZV9pZCA9IFBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QOworCiAJbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOwogCXBheWxvYWQudmVyc2lvbiA9IDM7CiAJcGF5bG9hZC50eXBlID0gb3A7CkBAIC0yODYsMzIgKzMyMCwzNSBAQAogICogdGhlIGNvbW1hbmQgaXMgdGhlbiBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgc3lzdGVtIG1hbmFnZXIgd2l0aCBhIHJlc3BvbnNlCiAgKiBtZXNzYWdlLgogICoKLSAqIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIHJlcXVlc3QgaXQgdGhlICdzaHV0ZG93biBzZWxmJyByZXF1ZXN0LgorICogQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgcmVxdWVzdCBpcyB0aGUgJ3NodXRkb3duIHNlbGYnIHJlcXVlc3QuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfcmVxdWVzdF9zaHV0ZG93bigKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlciA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkuc2l6ZSA9IDE2LAotCQkucGF5bG9hZF9zaXplID0gMTYsCi0JCS5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVCwKLQl9OworCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgewogCQl1OCB2ZXJzaW9uOwogCQl1OCB0eXBlOwogCQl1OCBnb3NfaWQ7CiAJCXU4IHJlc2VydmVkXzFbMTNdOwotCX0gc3RhdGljIGNvbnN0IHBheWxvYWQgPSB7Ci0JCS52ZXJzaW9uID0gMSwKLQkJLnR5cGUgPSAxLCAvKiBzaHV0ZG93biAqLwotCQkuZ29zX2lkID0gMCwgLyogc2VsZiAqLwotCX07CisJfSBwYXlsb2FkOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihwYXlsb2FkKSAhPSAxNik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVDsKKworCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKwlwYXlsb2FkLnZlcnNpb24gPSAxOworCXBheWxvYWQudHlwZSA9IDE7IC8qIHNodXRkb3duICovCisJcGF5bG9hZC5nb3NfaWQgPSAwOyAvKiBzZWxmICovCisKIAlyZXR1cm4gcHMzX3N5c19tYW5hZ2VyX3dyaXRlKGRldiwgJmhlYWRlciwgJnBheWxvYWQpOwogfQogCkBAIC0zMjMsMTUgKzM2MCwxMCBAQAogICogZmFpbHVyZSBvZiBhIGNvbW1hbmQgc2VudCBieSB0aGUgc3lzdGVtIG1hbmFnZXIuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9yZXNwb25zZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1NjQgc3RhdHVzKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXIgPSB7Ci0JCS52ZXJzaW9uID0gMSwKLQkJLnNpemUgPSAxNiwKLQkJLnBheWxvYWRfc2l6ZSA9IDE2LAotCQkuc2VydmljZV9pZCA9IFBTM19TTV9TRVJWSUNFX0lEX1JFU1BPTlNFLAotCX07CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCB7CiAJCXU4IHZlcnNpb247CiAJCXU4IHJlc2VydmVkXzFbM107CkBAIC0zNDQsNiArMzc2LDEyIEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJKHN0YXR1cyA/ICJuYWsiIDogImFjayIpKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0U7CisKIAltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CiAJcGF5bG9hZC52ZXJzaW9uID0gMTsKIAlwYXlsb2FkLnN0YXR1cyA9IHN0YXR1czsKQEAgLTM1Niw3ICszOTQsNyBAQAogICoKICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfZXZlbnQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2V2ZW50KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCB7CkBAIC0zNzAsNyArNDA4LDcgQEAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGV2ZW50KSAhPSAxNik7CiAKIAlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZChkZXYsICZldmVudCwgc2l6ZW9mKGV2ZW50KSk7Ci0JQlVHX09OKHJlc3VsdCk7CisJQlVHX09OKHJlc3VsdCAmJiAibmVlZCB0byByZXRyeSBoZXJlIik7CiAKIAlpZiAoZXZlbnQudmVyc2lvbiAhPSAxKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB1bnN1cHBvcnRlZCBldmVudCB2ZXJzaW9uICgldSlcbiIsCkBAIC0zODIsMTEgKzQyMCwzNCBAQAogCWNhc2UgUFMzX1NNX0VWRU5UX1BPV0VSX1BSRVNTRUQ6CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBQT1dFUl9QUkVTU0VEXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHMzX3NtX2ZvcmNlX3Bvd2VyX29mZiA9IDE7CisJCS8qCisJCSAqIEEgbWVtb3J5IGJhcnJpZXIgaXMgdXNlIGhlcmUgdG8gc3luYyBtZW1vcnkgc2luY2UKKwkJICogcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Jlc3RhcnQoKSBjb3VsZCBiZSBjYWxsZWQgb24KKwkJICogYW5vdGhlciBjcHUuCisJCSAqLworCQl3bWIoKTsKKwkJa2lsbF9jYWRfcGlkKFNJR0lOVCwgMSk7IC8qIGN0cmxfYWx0X2RlbCAqLwogCQlicmVhazsKIAljYXNlIFBTM19TTV9FVkVOVF9QT1dFUl9SRUxFQVNFRDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFBPV0VSX1JFTEVBU0VEICgldSBtcylcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGV2ZW50LnZhbHVlKTsKLQkJa2lsbF9jYWRfcGlkKFNJR0lOVCwgMSk7CisJCWJyZWFrOworCWNhc2UgUFMzX1NNX0VWRU5UX1JFU0VUX1BSRVNTRUQ6CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBSRVNFVF9QUkVTU0VEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHMzX3NtX2ZvcmNlX3Bvd2VyX29mZiA9IDA7CisJCS8qCisJCSAqIEEgbWVtb3J5IGJhcnJpZXIgaXMgdXNlIGhlcmUgdG8gc3luYyBtZW1vcnkgc2luY2UKKwkJICogcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Jlc3RhcnQoKSBjb3VsZCBiZSBjYWxsZWQgb24KKwkJICogYW5vdGhlciBjcHUuCisJCSAqLworCQl3bWIoKTsKKwkJa2lsbF9jYWRfcGlkKFNJR0lOVCwgMSk7IC8qIGN0cmxfYWx0X2RlbCAqLworCQlicmVhazsKKwljYXNlIFBTM19TTV9FVkVOVF9SRVNFVF9SRUxFQVNFRDoKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFJFU0VUX1JFTEVBU0VEICgldSBtcylcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGV2ZW50LnZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBQUzNfU01fRVZFTlRfVEhFUk1BTF9BTEVSVDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFRIRVJNQUxfQUxFUlQgKHpvbmUgJXUpXG4iLApAQCAtNDExLDcgKzQ3Miw3IEBACiAgKiBUaGUgc3lzdGVtIG1hbmFnZXIgc2VuZHMgdGhpcyBpbiByZXBseSB0byBhICdyZXF1ZXN0JyBtZXNzYWdlIGZyb20gdGhlIGd1ZXN0LgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9jbWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2NtZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgewpAQCAtNDI1LDYgKzQ4Niw3IEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZChkZXYsICZjbWQsIHNpemVvZihjbWQpKTsKKwlCVUdfT04ocmVzdWx0ICYmICJuZWVkIHRvIHJldHJ5IGhlcmUiKTsKIAogCWlmKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTQ0OCw5ICs1MTAsMTAgQEAKIC8qKgogICogcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2cgLSBGaXJzdCBzdGFnZSBtc2cgaGFuZGxlci4KICAqCisgKiBDYW4gYmUgY2FsbGVkIGRpcmVjdGx5IHRvIG1hbnVhbGx5IHBvbGwgdnVhcnQgYW5kIHB1bXAgbWVzc2FnZSBoYW5kbGVyLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXI7CkBAIC00NjQsMTIgKzUyNywxNyBAQAogCWlmIChoZWFkZXIudmVyc2lvbiAhPSAxKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB1bnN1cHBvcnRlZCBoZWFkZXIgdmVyc2lvbiAoJXUpXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBoZWFkZXIudmVyc2lvbik7CisJCWR1bXBfc21faGVhZGVyKCZoZWFkZXIpOwogCQlnb3RvIGZhaWxfaGVhZGVyOwogCX0KIAogCUJVSUxEX0JVR19PTihzaXplb2YoaGVhZGVyKSAhPSAxNik7Ci0JQlVHX09OKGhlYWRlci5zaXplICE9IDE2KTsKLQlCVUdfT04oaGVhZGVyLnBheWxvYWRfc2l6ZSAhPSAxNik7CisKKwlpZiAoaGVhZGVyLnNpemUgIT0gMTYgfHwgKGhlYWRlci5wYXlsb2FkX3NpemUgIT0gOAorCQkmJiBoZWFkZXIucGF5bG9hZF9zaXplICE9IDE2KSkgeworCQlkdW1wX3NtX2hlYWRlcigmaGVhZGVyKTsKKwkJQlVHKCk7CisJfQogCiAJc3dpdGNoIChoZWFkZXIuc2VydmljZV9pZCkgewogCWNhc2UgUFMzX1NNX1NFUlZJQ0VfSURfRVhURVJOX0VWRU5UOgpAQCAtNDc4LDYgKzU0NiwxMSBAQAogCWNhc2UgUFMzX1NNX1NFUlZJQ0VfSURfQ09NTUFORDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IENPTU1BTkRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2NtZChkZXYpOworCWNhc2UgUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVF9FUlJPUjoKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFJFUVVFU1RfRVJST1JcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlkdW1wX3NtX2hlYWRlcigmaGVhZGVyKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVua25vd24gc2VydmljZV9pZCAoJXUpXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBoZWFkZXIuc2VydmljZV9pZCk7CkBAIC00OTQsNjkgKzU2NywxOSBAQAogfQogCiAvKioKLSAqIHBzM19zeXNfbWFuYWdlcl93b3JrIC0gQXN5bmNyb25vdXMgcmVhZCBoYW5kbGVyLgorICogcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZiAtIFRoZSBmaW5hbCBwbGF0Zm9ybSBtYWNoaW5lX3Bvd2VyX29mZiByb3V0aW5lLgogICoKLSAqIFNpZ25hbGVkIHdoZW4gYSBjb21wbGV0ZSBtZXNzYWdlIGFycml2ZXMgYXQgdGhlIHZ1YXJ0IHBvcnQuCi0gKi8KLQotc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHBzM192dWFydF93b3JrX3RvX3BvcnRfZGV2aWNlKHdvcmspOwotCi0JcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKLQlwczNfdnVhcnRfcmVhZF9hc3luYyhkZXYsIHBzM19zeXNfbWFuYWdlcl93b3JrLCBQUzNfU01fUlhfTVNHX0xFTik7Ci19Ci0KLXN0cnVjdCB7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2OwotfSBzdGF0aWMgZHJ2X3ByaXY7Ci0KLS8qKgotICogcHMzX3N5c19tYW5hZ2VyX3Jlc3RhcnQgLSBUaGUgZmluYWwgcGxhdGZvcm0gbWFjaGluZV9yZXN0YXJ0IHJvdXRpbmUuCi0gKgotICogVGhpcyByb3V0aW5lIG5ldmVyIHJldHVybnMuICBUaGUgcm91dGluZSBkaXNhYmxlcyBhc3luY3Jvbm91cyB2dWFydCByZWFkcworICogVGhpcyByb3V0aW5lIG5ldmVyIHJldHVybnMuICBUaGUgcm91dGluZSBkaXNhYmxlcyBhc3luY2hyb25vdXMgdnVhcnQgcmVhZHMKICAqIHRoZW4gc3BpbnMgY2FsbGluZyBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZygpIHRvIHJlY2VpdmUgYW5kIGFja25vd2xlZGdlCiAgKiB0aGUgc2h1dGRvd24gY29tbWFuZCBzZW50IGZyb20gdGhlIHN5c3RlbSBtYW5hZ2VyLiAgU29vbiBhZnRlciB0aGUKICAqIGFja25vd2xlZGdlbWVudCBpcyBzZW50IHRoZSBscGFyIGlzIGRlc3Ryb3llZCBieSB0aGUgSFYuICBUaGlzIHJvdXRpbmUKLSAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHBzM19yZXN0YXJ0KCkuCisgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBwczNfcG93ZXJfb2ZmKCkgdGhyb3VnaAorICogcHMzX3N5c19tYW5hZ2VyX29wcy5wb3dlcl9vZmYuCiAgKi8KIAotdm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKQorc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gZHJ2X3ByaXYuZGV2OwotCi0JQlVHX09OKCFkcnZfcHJpdi5kZXYpOwotCi0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlwczNfdnVhcnRfY2FuY2VsX2FzeW5jKGRldik7Ci0KLQlwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKGRldiwgMCk7Ci0JcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChkZXYsIFBTM19TTV9ORVhUX09QX0xQQVJfUkVCT09ULAotCQlQUzNfU01fV0FLRV9ERUZBVUxUKTsKLQlwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKGRldik7Ci0KLQlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIEhhbHRlZCwgT0sgdG8gdHVybiBvZmYgcG93ZXJcbiIpOwotCi0Jd2hpbGUoMSkKLQkJcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKLX0KLQotLyoqCi0gKiBwczNfc3lzX21hbmFnZXJfcG93ZXJfb2ZmIC0gVGhlIGZpbmFsIHBsYXRmb3JtIG1hY2hpbmVfcG93ZXJfb2ZmIHJvdXRpbmUuCi0gKgotICogVGhpcyByb3V0aW5lIG5ldmVyIHJldHVybnMuICBUaGUgcm91dGluZSBkaXNhYmxlcyBhc3luY3Jvbm91cyB2dWFydCByZWFkcwotICogdGhlbiBzcGlucyBjYWxsaW5nIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKCkgdG8gcmVjZWl2ZSBhbmQgYWNrbm93bGVkZ2UKLSAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHNlbnQgZnJvbSB0aGUgc3lzdGVtIG1hbmFnZXIuICBTb29uIGFmdGVyIHRoZQotICogYWNrbm93bGVkZ2VtZW50IGlzIHNlbnQgdGhlIGxwYXIgaXMgZGVzdHJveWVkIGJ5IHRoZSBIVi4gIFRoaXMgcm91dGluZQotICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcHMzX3Bvd2VyX29mZigpLgotICovCi0KLXZvaWQgcHMzX3N5c19tYW5hZ2VyX3Bvd2VyX29mZih2b2lkKQotewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IGRydl9wcml2LmRldjsKLQotCUJVR19PTighZHJ2X3ByaXYuZGV2KTsKKwlCVUdfT04oIWRldik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIApAQCAtNTcyLDMxICs1OTUsOTcgQEAKIAkJcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKIH0KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfcHJvYmUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorLyoqCisgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydCAtIFRoZSBmaW5hbCBwbGF0Zm9ybSBtYWNoaW5lX3Jlc3RhcnQgcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jaHJvbm91cyB2dWFydCByZWFkcworICogdGhlbiBzcGlucyBjYWxsaW5nIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKCkgdG8gcmVjZWl2ZSBhbmQgYWNrbm93bGVkZ2UKKyAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHNlbnQgZnJvbSB0aGUgc3lzdGVtIG1hbmFnZXIuICBTb29uIGFmdGVyIHRoZQorICogYWNrbm93bGVkZ2VtZW50IGlzIHNlbnQgdGhlIGxwYXIgaXMgZGVzdHJveWVkIGJ5IHRoZSBIVi4gIFRoaXMgcm91dGluZQorICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcHMzX3Jlc3RhcnQoKSB0aHJvdWdoIHBzM19zeXNfbWFuYWdlcl9vcHMucmVzdGFydC4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JaW50IHJlc3VsdDsKKwlCVUdfT04oIWRldik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAotCUJVR19PTihkcnZfcHJpdi5kZXYpOwotCWRydl9wcml2LmRldiA9IGRldjsKKwkvKiBDaGVjayBpZiB3ZSBnb3QgaGVyZSB2aWEgYSBwb3dlciBidXR0b24gZXZlbnQuICovCisKKwlpZiAocHMzX3NtX2ZvcmNlX3Bvd2VyX29mZikgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogZm9yY2luZyBwb3dlcm9mZlxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXBzM19zeXNfbWFuYWdlcl9maW5hbF9wb3dlcl9vZmYoZGV2KTsKKwl9CisKKwlwczNfdnVhcnRfY2FuY2VsX2FzeW5jKGRldik7CisKKwlwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKGRldiwgMCk7CisJcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChkZXYsIFBTM19TTV9ORVhUX09QX0xQQVJfUkVCT09ULAorCQlQUzNfU01fV0FLRV9ERUZBVUxUKTsKKwlwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKGRldik7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIEhhbHRlZCwgT0sgdG8gdHVybiBvZmYgcG93ZXJcbiIpOworCisJd2hpbGUoMSkKKwkJcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKK30KKworLyoqCisgKiBwczNfc3lzX21hbmFnZXJfd29yayAtIEFzeW5jaHJvbm91cyByZWFkIGhhbmRsZXIuCisgKgorICogU2lnbmFsZWQgd2hlbiBQUzNfU01fUlhfTVNHX0xFTl9NSU4gYnl0ZXMgYXJyaXZlIGF0IHRoZSB2dWFydCBwb3J0LgorICovCisKK3N0YXRpYyB2b2lkIHBzM19zeXNfbWFuYWdlcl93b3JrKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOworCXBzM192dWFydF9yZWFkX2FzeW5jKGRldiwgUFMzX1NNX1JYX01TR19MRU5fTUlOKTsKK30KKworc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgb3BzOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlvcHMucG93ZXJfb2ZmID0gcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZjsKKwlvcHMucmVzdGFydCA9IHBzM19zeXNfbWFuYWdlcl9maW5hbF9yZXN0YXJ0OworCW9wcy5kZXYgPSBkZXY7CisKKwkvKiBwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzIGNvcGllcyBvcHMuICovCisKKwlwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzKCZvcHMpOwogCiAJcmVzdWx0ID0gcHMzX3N5c19tYW5hZ2VyX3NlbmRfYXR0cihkZXYsIFBTM19TTV9BVFRSX0FMTCk7CiAJQlVHX09OKHJlc3VsdCk7CiAKLQlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZF9hc3luYyhkZXYsIHBzM19zeXNfbWFuYWdlcl93b3JrLAotCQlQUzNfU01fUlhfTVNHX0xFTik7CisJcmVzdWx0ID0gcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoZGV2LCBQUzNfU01fUlhfTVNHX0xFTl9NSU4pOwogCUJVR19PTihyZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfcmVtb3ZlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKK30KKwogc3RhdGljIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgcHMzX3N5c19tYW5hZ2VyID0gewotCS5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiwKLQkuY29yZSA9IHsKLQkJLm5hbWUgPSAicHMzX3N5c19tYW5hZ2VyIiwKLQl9LAorCS5jb3JlLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSLAorCS5jb3JlLmNvcmUubmFtZSA9ICJwczNfc3lzX21hbmFnZXIiLAogCS5wcm9iZSA9IHBzM19zeXNfbWFuYWdlcl9wcm9iZSwKKwkucmVtb3ZlID0gcHMzX3N5c19tYW5hZ2VyX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBwczNfc3lzX21hbmFnZXJfc2h1dGRvd24sCisJLndvcmsgPSBwczNfc3lzX21hbmFnZXJfd29yaywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBzM19zeXNfbWFuYWdlcl9pbml0KHZvaWQpCkBAIC02MDgsMyArNjk3LDYgQEAKIH0KIAogbW9kdWxlX2luaXQocHMzX3N5c19tYW5hZ2VyX2luaXQpOworLyogTW9kdWxlIHJlbW92ZSBub3Qgc3VwcG9ydGVkLiAqLworCitNT0RVTEVfQUxJQVMoUFMzX01PRFVMRV9BTElBU19TWVNURU1fTUFOQUdFUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy92dWFydC5jIGIvZHJpdmVycy9wczMvdnVhcnQuYwppbmRleCBlYzJkMzZhLi5iZWEyNWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy92dWFydC5jCisrKyBiL2RyaXZlcnMvcHMzL3Z1YXJ0LmMKQEAgLTcxLDYgKzcxLDM0IEBACiB9OwogCiAvKioKKyAqIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IC0gcHJpdmF0ZSB2dWFydCBkZXZpY2UgZGF0YS4KKyAqLworCitzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiB7CisJdTY0IGludGVycnVwdF9tYXNrOworCisJc3RydWN0IHsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJfSB0eF9saXN0OworCXN0cnVjdCB7CisJCXN0cnVjdCBwczNfdnVhcnRfd29yayB3b3JrOworCQl1bnNpZ25lZCBsb25nIGJ5dGVzX2hlbGQ7CisJCXNwaW5sb2NrX3QgbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCX0gcnhfbGlzdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3N0YXRzIHN0YXRzOworfTsKKworc3RhdGljIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICp0b19wb3J0X3ByaXYoCisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCUJVR19PTighZGV2KTsKKwlCVUdfT04oIWRldi0+ZHJpdmVyX3ByaXYpOworCXJldHVybiAoc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKilkZXYtPmRyaXZlcl9wcml2OworfQorCisvKioKICAqIHN0cnVjdCBwb3J0c19ibXAgLSBiaXRtYXAgaW5kaWNhdGluZyBwb3J0cyBuZWVkaW5nIHNlcnZpY2UuCiAgKgogICogQSAyNTYgYml0IHJlYWQgb25seSBiaXRtYXAgaW5kaWNhdGluZyBwb3J0cyBuZWVkaW5nIHNlcnZpY2UuICBEbyBub3Qgd3JpdGUKQEAgLTgzLDMxICsxMTEsMTQgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDMyKSkpOwogCiAjZGVmaW5lIGR1bXBfcG9ydHNfYm1wKF9iKSBfZHVtcF9wb3J0c19ibXAoX2IsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBfZHVtcF9wb3J0c19ibXAoCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF9wb3J0c19ibXAoCiAJY29uc3Qgc3RydWN0IHBvcnRzX2JtcCogYm1wLCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6IHBvcnRzX2JtcDogJTAxNmx4aFxuIiwgZnVuYywgbGluZSwgYm1wLT5zdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9tYXRjaF9pZF90b19wb3J0KGVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkLAotCXVuc2lnbmVkIGludCAqcG9ydF9udW1iZXIpCi17Ci0Jc3dpdGNoKG1hdGNoX2lkKSB7Ci0JY2FzZSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1M6Ci0JCSpwb3J0X251bWJlciA9IDA7Ci0JCXJldHVybiAwOwotCWNhc2UgUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSOgotCQkqcG9ydF9udW1iZXIgPSAyOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlXQVJOX09OKDEpOwotCQkqcG9ydF9udW1iZXIgPSBVSU5UX01BWDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKLX0KLQogI2RlZmluZSBkdW1wX3BvcnRfcGFyYW1zKF9iKSBfZHVtcF9wb3J0X3BhcmFtcyhfYiwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3BvcnRfcGFyYW1zKHVuc2lnbmVkIGludCBwb3J0X251bWJlciwKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX3BvcnRfcGFyYW1zKHVuc2lnbmVkIGludCBwb3J0X251bWJlciwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKICNpZiBkZWZpbmVkKERFQlVHKQpAQCAtMTQ0LDE0ICsxNTUsMTQgQEAKIAl1bnNpZ25lZCBsb25nIHR4OwogfTsKIAotaW50IHBzM192dWFydF9nZXRfdHJpZ2dlcnMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAoraW50IHBzM192dWFydF9nZXRfdHJpZ2dlcnMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXN0cnVjdCB2dWFydF90cmlnZ2VycyAqdHJpZykKIHsKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fVFhfVFJJR0dFUiwgJnRyaWctPnR4KTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTE2MCw3ICsxNzEsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfQlVGX1NJWkUsICZzaXplKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTE2OSw3ICsxODAsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfVFJJR0dFUiwgJnZhbCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0xODYsMTMgKzE5NywxMyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBwczNfdnVhcnRfc2V0X3RyaWdnZXJzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHR4LAoraW50IHBzM192dWFydF9zZXRfdHJpZ2dlcnMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdHgsCiAJdW5zaWduZWQgaW50IHJ4KQogewogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCi0JcmVzdWx0ID0gbHYxX3NldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9UWF9UUklHR0VSLCB0eCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0yMDEsNyArMjEyLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1JYX0JVRl9TSVpFLCAmc2l6ZSk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0yMTAsNyArMjIxLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1JYX1RSSUdHRVIsIHNpemUgLSByeCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0yMjUsMTAgKzIzNiwxMiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9yeF9ieXRlc193YWl0aW5nKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9yeF9ieXRlc193YWl0aW5nKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1NjQgKmJ5dGVzX3dhaXRpbmcpCiB7Ci0JaW50IHJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1JYX0JZVEVTLCBieXRlc193YWl0aW5nKTsKIAogCWlmIChyZXN1bHQpCkBAIC0yNDAsMTcgKzI1MywyNCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCisvKioKKyAqIHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2sgLSBFbmFibGUvZGlzYWJsZSB0aGUgcG9ydCBpbnRlcnJ1cHQgc291cmNlcy4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICogQGJtcDogTG9naWNhbCBPUiBvZiBlbnVtIHZ1YXJ0X2ludGVycnVwdF9tYXNrIHZhbHVlcy4gQSB6ZXJvIGJpdCBkaXNhYmxlcy4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXVuc2lnbmVkIGxvbmcgbWFzaykKIHsKIAlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtYXNrKTsKIAotCWRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgPSBtYXNrOworCXByaXYtPmludGVycnVwdF9tYXNrID0gbWFzazsKIAotCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCi0JCVBBUkFNX0lOVEVSUlVQVF9NQVNLLCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrKTsKKwlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAorCQlQQVJBTV9JTlRFUlJVUFRfTUFTSywgcHJpdi0+aW50ZXJydXB0X21hc2spOwogCiAJaWYgKHJlc3VsdCkKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGludGVycnVwdF9tYXNrIGZhaWxlZDogJXNcbiIsCkBAIC0yNTksNzkgKzI3OSw5NiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9pbnRlcnJ1cHRfc3RhdHVzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9pbnRlcnJ1cHRfc3RhdHVzKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1bnNpZ25lZCBsb25nICpzdGF0dXMpCiB7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXU2NCB0bXA7Ci0JaW50IHJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9JTlRFUlJVUFRfU1RBVFVTLCAmdG1wKTsKIAogCWlmIChyZXN1bHQpCiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBpbnRlcnJ1cHRfc3RhdHVzIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQkqc3RhdHVzID0gdG1wICYgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzazsKKwkqc3RhdHVzID0gdG1wICYgcHJpdi0+aW50ZXJydXB0X21hc2s7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbSAlbHhoLCBzICVseGgsIG0mcyAlbHhoXG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2ssIHRtcCwgKnN0YXR1cyk7CisJCV9fZnVuY19fLCBfX0xJTkVfXywgcHJpdi0+aW50ZXJydXB0X21hc2ssIHRtcCwgKnN0YXR1cyk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19UWCkgPyAwCi0JCTogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1RYKSA/IDAKKwkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgcHJpdi0+aW50ZXJydXB0X21hc2sKIAkJfCBJTlRFUlJVUFRfTUFTS19UWCk7CiB9CiAKLWludCBwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfcngoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1JYKSA/IDAKLQkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpID8gMAorCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQl8IElOVEVSUlVQVF9NQVNLX1JYKTsKIH0KIAotaW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpID8gMAotCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKSA/IDAKKwkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgcHJpdi0+aW50ZXJydXB0X21hc2sKIAkJfCBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKTsKIH0KIAotaW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF90eChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19UWCkKLQkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfVFgpCisJCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCSYgfklOVEVSUlVQVF9NQVNLX1RYKSA6IDA7CiB9CiAKLWludCBwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfcngoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIChkZXYtPnByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpCi0JCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1JYKQorCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQkmIH5JTlRFUlJVUFRfTUFTS19SWCkgOiAwOwogfQogCi1pbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9kaXNjb25uZWN0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKQotCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKQorCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQkmIH5JTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKSA6IDA7CiB9CiAKIC8qKgogICogcHMzX3Z1YXJ0X3Jhd193cml0ZSAtIExvdyBsZXZlbCB3cml0ZSBoZWxwZXIuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KICAqCiAgKiBEbyBub3QgY2FsbCBwczNfdnVhcnRfcmF3X3dyaXRlIGRpcmVjdGx5LCB1c2UgcHMzX3Z1YXJ0X3dyaXRlLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Jhd193cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM192dWFydF9yYXdfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWNvbnN0IHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGJ5dGVzLCB1bnNpZ25lZCBsb25nICpieXRlc193cml0dGVuKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAotCXJlc3VsdCA9IGx2MV93cml0ZV92aXJ0dWFsX3VhcnQoZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfd3JpdGVfdmlydHVhbF91YXJ0KGRldi0+cG9ydF9udW1iZXIsCiAJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYShidWYpKSwgYnl0ZXMsIGJ5dGVzX3dyaXR0ZW4pOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMzQwLDI4ICszNzcsMzAgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3dyaXR0ZW4gKz0gKmJ5dGVzX3dyaXR0ZW47CisJcHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbiArPSAqYnl0ZXNfd3JpdHRlbjsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB3cm90ZSAlbHhoLyV4aD0+JWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkqYnl0ZXNfd3JpdHRlbiwgYnl0ZXMsIGRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbik7CisJCSpieXRlc193cml0dGVuLCBieXRlcywgcHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbik7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAvKioKICAqIHBzM192dWFydF9yYXdfcmVhZCAtIExvdyBsZXZlbCByZWFkIGhlbHBlci4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgogICoKICAqIERvIG5vdCBjYWxsIHBzM192dWFydF9yYXdfcmVhZCBkaXJlY3RseSwgdXNlIHBzM192dWFydF9yZWFkLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Jhd19yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCogYnVmLAorc3RhdGljIGludCBwczNfdnVhcnRfcmF3X3JlYWQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzLCB1bnNpZ25lZCBsb25nICpieXRlc19yZWFkKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAleGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXMpOwogCi0JcmVzdWx0ID0gbHYxX3JlYWRfdmlydHVhbF91YXJ0KGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX3JlYWRfdmlydHVhbF91YXJ0KGRldi0+cG9ydF9udW1iZXIsCiAJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYShidWYpKSwgYnl0ZXMsIGJ5dGVzX3JlYWQpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMzcwLDI1ICs0MDksMjcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3JlYWQgKz0gKmJ5dGVzX3JlYWQ7CisJcHJpdi0+c3RhdHMuYnl0ZXNfcmVhZCArPSAqYnl0ZXNfcmVhZDsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiByZWFkICVseGgvJXhoPT4lbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSpieXRlc19yZWFkLCBieXRlcywgZGV2LT5wcml2LT5zdGF0cy5ieXRlc19yZWFkKTsKKwkJKmJ5dGVzX3JlYWQsIGJ5dGVzLCBwcml2LT5zdGF0cy5ieXRlc19yZWFkKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgogICogcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzIC0gRGlzY2FyZCBieXRlcyByZWNlaXZlZC4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgogICogQGJ5dGVzOiBNYXggYnl0ZSBjb3VudCB0byBkaXNjYXJkLCB6ZXJvID0gYWxsIHBlbmRpbmcuCiAgKgogICogVXNlZCB0byBjbGVhciBwZW5kaW5nIHJ4IGludGVycnVwdCBzb3VyY2UuICBXaWxsIG5vdCBibG9jay4KICAqLwogCi12b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCit2b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1NjQgYnl0ZXNfd2FpdGluZzsKIAl2b2lkKiB0bXA7CiAKQEAgLTQxOCw4ICs0NTksOSBAQAogCiAJLyogRG9uJ3QgaW5jbHVkZSB0aGVzZSBieXRlcyBpbiB0aGUgc3RhdHMuICovCiAKLQlkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3JlYWQgLT0gYnl0ZXNfd2FpdGluZzsKKwlwcml2LT5zdGF0cy5ieXRlc19yZWFkIC09IGJ5dGVzX3dhaXRpbmc7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfY2xlYXJfcnhfYnl0ZXMpOwogCiAvKioKICAqIHN0cnVjdCBsaXN0X2J1ZmZlciAtIEFuIGVsZW1lbnQgZm9yIGEgcG9ydCBkZXZpY2UgZmlmbyBidWZmZXIgbGlzdC4KQEAgLTQzNSw2ICs0NzcsNyBAQAogCiAvKioKICAqIHBzM192dWFydF93cml0ZSAtIHRoZSBlbnRyeSBwb2ludCBmb3Igd3JpdGluZyBkYXRhIHRvIGEgcG9ydAorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCiAgKgogICogSWYgdGhlIHBvcnQgaXMgaWRsZSBvbiBlbnRyeSBhcyBtdWNoIG9mIHRoZSBpbmNvbWluZyBkYXRhIGlzIHdyaXR0ZW4gdG8KICAqIHRoZSBwb3J0IGFzIHRoZSBwb3J0IHdpbGwgYWNjZXB0LiAgT3RoZXJ3aXNlIGEgbGlzdCBidWZmZXIgaXMgY3JlYXRlZApAQCAtNDQyLDI1ICs0ODUsMjYgQEAKICAqIHRoZW4gZW5xdWV1ZWQgZm9yIHRyYW5zbWlzaW9uIHZpYSB0aGUgdHJhbnNtaXQgaW50ZXJydXB0LgogICovCiAKLWludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCBjb25zdCB2b2lkKiBidWYsCitpbnQgcHMzX3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgY29uc3Qgdm9pZCAqYnVmLAogCXVuc2lnbmVkIGludCBieXRlcykKIHsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZyBkYmdfbnVtYmVyOwogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGI7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXUoJXhoKSBieXRlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlieXRlcywgYnl0ZXMpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmRldi0+cHJpdi0+dHhfbGlzdC5oZWFkKSkgeworCWlmIChsaXN0X2VtcHR5KCZwcml2LT50eF9saXN0LmhlYWQpKSB7CiAJCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKIAogCQlyZXN1bHQgPSBwczNfdnVhcnRfcmF3X3dyaXRlKGRldiwgYnVmLCBieXRlcywgJmJ5dGVzX3dyaXR0ZW4pOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCWRldl9kYmcoJmRldi0+Y29yZSwKQEAgLTQ3OCw3ICs1MjIsNyBAQAogCQlieXRlcyAtPSBieXRlc193cml0dGVuOwogCQlidWYgKz0gYnl0ZXNfd3JpdHRlbjsKIAl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKIAlsYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2J1ZmZlcikgKyBieXRlcywgR0ZQX0tFUk5FTCk7CiAKQEAgLTQ5MSwyOSArNTM1LDg2IEBACiAJbGItPnRhaWwgPSBsYi0+ZGF0YSArIGJ5dGVzOwogCWxiLT5kYmdfbnVtYmVyID0gKytkYmdfbnVtYmVyOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmbGItPmxpbmssICZkZXYtPnByaXYtPnR4X2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmxiLT5saW5rLCAmcHJpdi0+dHhfbGlzdC5oZWFkKTsKIAlwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF90eChkZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcXVldWVkIGJ1Zl8lbHUsICV4aCBieXRlc1xuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCBsYi0+ZGJnX251bWJlciwgYnl0ZXMpOwogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfd3JpdGUpOwogCiAvKioKLSAqIHBzM192dWFydF9yZWFkIC0gdGhlIGVudHJ5IHBvaW50IGZvciByZWFkaW5nIGRhdGEgZnJvbSBhIHBvcnQKKyAqIHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyAtIFF1ZXVlIHdhaXRpbmcgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGxpc3QuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqIEBieXRlc19xdWV1ZWQ6IE51bWJlciBvZiBieXRlcyBxdWV1ZWQgdG8gdGhlIGJ1ZmZlciBsaXN0LgogICoKLSAqIElmIGVub3VnaCBieXRlcyB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0IGFyZSBoZWxkIGluIHRoZSBidWZmZXIgbGlzdCB0aG9zZQotICogYnl0ZXMgYXJlIGRlcXVldWVkIGFuZCBjb3BpZWQgdG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4gIEVtcHRpZWQgbGlzdCBidWZmZXJzCi0gKiBhcmUgcmV0aWVyZWQuICBJZiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgc3RhdGlmaWVkIGJ5IGJ5dGVzIGhlbGQgaW4gdGhlIGxpc3QKLSAqIGJ1ZmZlcnMgLUVBR0FJTiBpcyByZXR1cm5lZC4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggcHJpdi0+cnhfbGlzdC5sb2NrIGhlbGQuCiAgKi8KIAotaW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCogYnVmLAorc3RhdGljIGludCBwczNfdnVhcnRfcXVldWVfcnhfYnl0ZXMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXU2NCAqYnl0ZXNfcXVldWVkKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGI7CisJdTY0IGJ5dGVzOworCisJKmJ5dGVzX3F1ZXVlZCA9IDA7CisKKwlyZXN1bHQgPSBwczNfdnVhcnRfZ2V0X3J4X2J5dGVzX3dhaXRpbmcoZGV2LCAmYnl0ZXMpOworCUJVR19PTihyZXN1bHQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWJ5dGVzKQorCQlyZXR1cm4gMDsKKworCS8qIEFkZCBzb21lIGV4dHJhIHNwYWNlIGZvciByZWNlbnRseSBhcnJpdmVkIGRhdGEuICovCisKKwlieXRlcyArPSAxMjg7CisKKwlsYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2J1ZmZlcikgKyBieXRlcywgR0ZQX0FUT01JQyk7CisKKwlpZiAoIWxiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBzM192dWFydF9yYXdfcmVhZChkZXYsIGxiLT5kYXRhLCBieXRlcywgJmJ5dGVzKTsKKworCWxiLT5oZWFkID0gbGItPmRhdGE7CisJbGItPnRhaWwgPSBsYi0+ZGF0YSArIGJ5dGVzOworCWxiLT5kYmdfbnVtYmVyID0gKytkYmdfbnVtYmVyOworCisJbGlzdF9hZGRfdGFpbCgmbGItPmxpbmssICZwcml2LT5yeF9saXN0LmhlYWQpOworCXByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCArPSBieXRlczsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBidWZfJWx1OiBxdWV1ZWQgJWx4aCBieXRlc1xuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBsYi0+ZGJnX251bWJlciwgYnl0ZXMpOworCisJKmJ5dGVzX3F1ZXVlZCA9IGJ5dGVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3JlYWQgLSBUaGUgZW50cnkgcG9pbnQgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIGEgcG9ydC4KKyAqCisgKiBRdWV1ZSBkYXRhIHdhaXRpbmcgYXQgdGhlIHBvcnQsIGFuZCBpZiBlbm91Z2ggYnl0ZXMgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdAorICogYXJlIGhlbGQgaW4gdGhlIGJ1ZmZlciBsaXN0IHRob3NlIGJ5dGVzIGFyZSBkZXF1ZXVlZCBhbmQgY29waWVkIHRvIHRoZQorICogY2FsbGVyJ3MgYnVmZmVyLiAgRW1wdGllZCBsaXN0IGJ1ZmZlcnMgYXJlIHJldGllcmVkLiAgSWYgdGhlIHJlcXVlc3QgY2Fubm90CisgKiBiZSBzdGF0aWZpZWQgYnkgYnl0ZXMgaGVsZCBpbiB0aGUgbGlzdCBidWZmZXJzIC1FQUdBSU4gaXMgcmV0dXJuZWQuCisgKi8KKworaW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAogCXVuc2lnbmVkIGludCBieXRlcykKIHsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9idWZmZXIgKmxiLCAqbjsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlYWQ7CkBAIC01MjEsMzAgKzYyMiwzNyBAQAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAldSgleGgpIGJ5dGVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCWJ5dGVzLCBieXRlcyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZGV2LT5wcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgPCBieXRlcykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc3RhcnZlZCBmb3IgJWx4aCBieXRlc1xuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywKLQkJCWJ5dGVzIC0gZGV2LT5wcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQpOwotCQlyZXR1cm4gLUVBR0FJTjsKKwkvKiBRdWV1ZSByeCBieXRlcyBoZXJlIGZvciBwb2xsZWQgcmVhZHMuICovCisKKwl3aGlsZSAocHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkIDwgYnl0ZXMpIHsKKwkJdTY0IHRtcDsKKworCQlyZXN1bHQgPSBwczNfdnVhcnRfcXVldWVfcnhfYnl0ZXMoZGV2LCAmdG1wKTsKKwkJaWYgKHJlc3VsdCB8fCAhdG1wKSB7CisJCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc3RhcnZlZCBmb3IgJWx4aCBieXRlc1xuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJYnl0ZXMgLSBwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYiwgbiwgJmRldi0+cHJpdi0+cnhfbGlzdC5oZWFkLCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxiLCBuLCAmcHJpdi0+cnhfbGlzdC5oZWFkLCBsaW5rKSB7CiAJCWJ5dGVzX3JlYWQgPSBtaW4oKHVuc2lnbmVkIGludCkobGItPnRhaWwgLSBsYi0+aGVhZCksIGJ5dGVzKTsKIAogCQltZW1jcHkoYnVmLCBsYi0+aGVhZCwgYnl0ZXNfcmVhZCk7CiAJCWJ1ZiArPSBieXRlc19yZWFkOwogCQlieXRlcyAtPSBieXRlc19yZWFkOwotCQlkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCAtPSBieXRlc19yZWFkOworCQlwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgLT0gYnl0ZXNfcmVhZDsKIAogCQlpZiAoYnl0ZXNfcmVhZCA8IGxiLT50YWlsIC0gbGItPmhlYWQpIHsKIAkJCWxiLT5oZWFkICs9IGJ5dGVzX3JlYWQ7CiAJCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogYnVmXyVsdTogZGVxdWV1ZWQgJWx4aCAiCiAJCQkJImJ5dGVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLAogCQkJCWJ5dGVzX3JlYWQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtNTU2LDE2ICs2NjQsMzIgQEAKIAkJa2ZyZWUobGIpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfcmVhZCk7CiAKLWludCBwczNfdnVhcnRfcmVhZF9hc3luYyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHdvcmtfZnVuY190IGZ1bmMsCi0JdW5zaWduZWQgaW50IGJ5dGVzKQorLyoqCisgKiBwczNfdnVhcnRfd29yayAtIEFzeW5jaHJvbm91cyByZWFkIGhhbmRsZXIuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX3Z1YXJ0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9CisJCXBzM192dWFydF93b3JrX3RvX3N5c3RlbV9idXNfZGV2KHdvcmspOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydiA9CisJCXBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoZGV2KTsKKworCUJVR19PTighZHJ2KTsKKwlkcnYtPndvcmsoZGV2KTsKK30KKworaW50IHBzM192dWFydF9yZWFkX2FzeW5jKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmKGRldi0+cHJpdi0+d29yay50cmlnZ2VyKSB7CisJaWYgKHByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB3YXJuaW5nLCBtdWx0aXBsZSBjYWxsc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtRUFHQUlOOwpAQCAtNTczLDMwICs2OTcsMzIgQEAKIAogCUJVR19PTighYnl0ZXMpOwogCi0JUFJFUEFSRV9XT1JLKCZkZXYtPnByaXYtPndvcmsud29yaywgZnVuYyk7CisJUFJFUEFSRV9XT1JLKCZwcml2LT5yeF9saXN0Lndvcmsud29yaywgcHMzX3Z1YXJ0X3dvcmspOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7Ci0JaWYoZGV2LT5wcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgPj0gYnl0ZXMpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJaWYgKHByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA+PSBieXRlcykgewogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc2NoZWR1bGVfd29yayAleGggYnl0ZXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ5dGVzKTsKLQkJc2NoZWR1bGVfd29yaygmZGV2LT5wcml2LT53b3JrLndvcmspOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPndvcmsubG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yeF9saXN0Lndvcmsud29yayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkZXYtPnByaXYtPndvcmsudHJpZ2dlciA9IGJ5dGVzOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7CisJcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgPSBieXRlczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB3YWl0aW5nIGZvciAldSgleGgpIGJ5dGVzXG4iLCBfX2Z1bmNfXywKIAkJX19MSU5FX18sIGJ5dGVzLCBieXRlcyk7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9yZWFkX2FzeW5jKTsKIAotdm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3ZvaWQgcHMzX3Z1YXJ0X2NhbmNlbF9hc3luYyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5wcml2LT53b3JrLnRyaWdnZXIgPSAwOworCXRvX3BvcnRfcHJpdihkZXYpLT5yeF9saXN0LndvcmsudHJpZ2dlciA9IDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfY2FuY2VsX2FzeW5jKTsKIAogLyoqCiAgKiBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF90eCAtIHRoaXJkIHN0YWdlIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCkBAIC02MDYsMTggKzczMiwxOSBAQAogICogYWRqdXN0cyB0aGUgZmluYWwgbGlzdCBidWZmZXIgc3RhdGUgZm9yIGEgcGFydGlhbCB3cml0ZS4KICAqLwogCi1zdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9idWZmZXIgKmxiLCAqbjsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzX3RvdGFsID0gMDsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxiLCBuLCAmZGV2LT5wcml2LT50eF9saXN0LmhlYWQsIGxpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGIsIG4sICZwcml2LT50eF9saXN0LmhlYWQsIGxpbmspIHsKIAogCQl1bnNpZ25lZCBsb25nIGJ5dGVzX3dyaXR0ZW47CiAKQEAgLTY1MSw3ICs3NzgsNyBAQAogCiAJcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3R4KGRldik7CiBwb3J0X2Z1bGw6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCB3cm90ZSAlbHhoIGJ5dGVzIHRvdGFsXG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ5dGVzX3RvdGFsKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtNjY1LDYwICs3OTIsMzcgQEAKICAqIGJ1ZmZlciBsaXN0LiAgQnVmZmVyIGxpc3QgZGF0YSBpcyBkZXF1ZXVlZCB2aWEgcHMzX3Z1YXJ0X3JlYWQuCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBkYmdfbnVtYmVyOwotCWludCByZXN1bHQgPSAwOworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGI7Ci0JdW5zaWduZWQgbG9uZyBieXRlczsKKwl1NjQgYnl0ZXM7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAotCXJlc3VsdCA9IHBzM192dWFydF9nZXRfcnhfYnl0ZXNfd2FpdGluZyhkZXYsICZieXRlcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCXJlc3VsdCA9IHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyhkZXYsICZieXRlcyk7CiAKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gLUVJTzsKLQotCUJVR19PTighYnl0ZXMpOwotCi0JLyogQWRkIHNvbWUgZXh0cmEgc3BhY2UgZm9yIHJlY2VudGx5IGFycml2ZWQgZGF0YS4gKi8KLQotCWJ5dGVzICs9IDEyODsKLQotCWxiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfYnVmZmVyKSArIGJ5dGVzLCBHRlBfQVRPTUlDKTsKLQotCWlmICghbGIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHMzX3Z1YXJ0X3Jhd19yZWFkKGRldiwgbGItPmRhdGEsIGJ5dGVzLCAmYnl0ZXMpOwotCi0JbGItPmhlYWQgPSBsYi0+ZGF0YTsKLQlsYi0+dGFpbCA9IGxiLT5kYXRhICsgYnl0ZXM7Ci0JbGItPmRiZ19udW1iZXIgPSArK2RiZ19udW1iZXI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZsYi0+bGluaywgJmRldi0+cHJpdi0+cnhfbGlzdC5oZWFkKTsKLQlkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCArPSBieXRlczsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwotCi0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGJ1Zl8lbHU6IHF1ZXVlZCAlbHhoIGJ5dGVzXG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKLQlpZihkZXYtPnByaXYtPndvcmsudHJpZ2dlcgotCQkmJiBkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA+PSBkZXYtPnByaXYtPndvcmsudHJpZ2dlcikgewotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc2NoZWR1bGVfd29yayAlbHhoIGJ5dGVzXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPnByaXYtPndvcmsudHJpZ2dlcik7Ci0JCWRldi0+cHJpdi0+d29yay50cmlnZ2VyID0gMDsKLQkJc2NoZWR1bGVfd29yaygmZGV2LT5wcml2LT53b3JrLndvcmspOworCWlmIChyZXN1bHQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXN1bHQ7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7CisKKwlpZiAocHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgJiYgcHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkCisJCT49IHByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzY2hlZHVsZV93b3JrICVseGggYnl0ZXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyKTsKKwkJcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgPSAwOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yeF9saXN0Lndvcmsud29yayk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF9kaXNjb25uZWN0KAotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJQlVHX09OKCJubyBzdXBwb3J0Iik7CkBAIC03MzMsOSArODM3LDEwIEBACiAgKiBzdGFnZSBoYW5kbGVyIGFmdGVyIG9uZSBpdGVyYXRpb24uCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX3BvcnRfaW50ZXJydXB0KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9wb3J0X2ludGVycnVwdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwogCiAJcmVzdWx0ID0gcHMzX3Z1YXJ0X2dldF9pbnRlcnJ1cHRfc3RhdHVzKGRldiwgJnN0YXR1cyk7CkBAIC03NDcsMjEgKzg1MiwyMSBAQAogCQlzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpIHsKLQkJZGV2LT5wcml2LT5zdGF0cy5kaXNjb25uZWN0X2ludGVycnVwdHMrKzsKKwkJcHJpdi0+c3RhdHMuZGlzY29ubmVjdF9pbnRlcnJ1cHRzKys7CiAJCXJlc3VsdCA9IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoZGV2KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9kaXNjb25uZWN0KGRldik7CiAJfQogCiAJaWYgKHN0YXR1cyAmIElOVEVSUlVQVF9NQVNLX1RYKSB7Ci0JCWRldi0+cHJpdi0+c3RhdHMudHhfaW50ZXJydXB0cysrOworCQlwcml2LT5zdGF0cy50eF9pbnRlcnJ1cHRzKys7CiAJCXJlc3VsdCA9IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4KGRldik7CiAJCWlmIChyZXN1bHQpCiAJCQlwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKIAl9CiAKIAlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfUlgpIHsKLQkJZGV2LT5wcml2LT5zdGF0cy5yeF9pbnRlcnJ1cHRzKys7CisJCXByaXYtPnN0YXRzLnJ4X2ludGVycnVwdHMrKzsKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfcngoZGV2KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9yeChkZXYpOwpAQCAtNzcxLDExICs4NzYsMTEgQEAKIH0KIAogc3RydWN0IHZ1YXJ0X2J1c19wcml2IHsKLQljb25zdCBzdHJ1Y3QgcG9ydHNfYm1wIGJtcDsKKwlzdHJ1Y3QgcG9ydHNfYm1wICpibXA7CiAJdW5zaWduZWQgaW50IHZpcnE7CiAJc3RydWN0IHNlbWFwaG9yZSBwcm9iZV9tdXRleDsKIAlpbnQgdXNlX2NvdW50OwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldmljZXNbUE9SVF9DT1VOVF07CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2aWNlc1tQT1JUX0NPVU5UXTsKIH0gc3RhdGljIHZ1YXJ0X2J1c19wcml2OwogCiAvKioKQEAgLTc4OCwxNyArODkzLDE2IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwczNfdnVhcnRfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX3ByaXZhdGUpCiB7Ci0Jc3RydWN0IHZ1YXJ0X2J1c19wcml2ICpidXNfcHJpdjsKKwlzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgKmJ1c19wcml2ID0gX3ByaXZhdGU7CiAKLQlCVUdfT04oIV9wcml2YXRlKTsKLQlidXNfcHJpdiA9IChzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgKilfcHJpdmF0ZTsKKwlCVUdfT04oIWJ1c19wcml2KTsKIAogCXdoaWxlICgxKSB7CiAJCXVuc2lnbmVkIGludCBwb3J0OwogCi0JCWR1bXBfcG9ydHNfYm1wKCZidXNfcHJpdi0+Ym1wKTsKKwkJZHVtcF9wb3J0c19ibXAoYnVzX3ByaXYtPmJtcCk7CiAKLQkJcG9ydCA9IChCSVRTX1BFUl9MT05HIC0gMSkgLSBfX2lsb2cyKGJ1c19wcml2LT5ibXAuc3RhdHVzKTsKKwkJcG9ydCA9IChCSVRTX1BFUl9MT05HIC0gMSkgLSBfX2lsb2cyKGJ1c19wcml2LT5ibXAtPnN0YXR1cyk7CiAKIAkJaWYgKHBvcnQgPT0gQklUU19QRVJfTE9ORykKIAkJCWJyZWFrOwpAQCAtODEyLDEwMCArOTE2LDE0NCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfbWF0Y2goc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCitzdGF0aWMgaW50IHBzM192dWFydF9idXNfaW50ZXJydXB0X2dldCh2b2lkKQogewogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyKF9kcnYpOwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKIAotCXJlc3VsdCA9IGRldi0+bWF0Y2hfaWQgPT0gZHJ2LT5tYXRjaF9pZDsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JZGV2X2luZm8oJmRldi0+Y29yZSwgIiVzOiVkOiBkZXY9JXUoJXMpLCBkcnY9JXUoJXMpOiAlc1xuIiwgX19mdW5jX18sCi0JCV9fTElORV9fLCBkZXYtPm1hdGNoX2lkLCBkZXYtPmNvcmUuYnVzX2lkLCBkcnYtPm1hdGNoX2lkLAotCQlkcnYtPmNvcmUubmFtZSwgKHJlc3VsdCA/ICJtYXRjaCIgOiAibWlzcyIpKTsKKwl2dWFydF9idXNfcHJpdi51c2VfY291bnQrKzsKIAorCUJVR19PTih2dWFydF9idXNfcHJpdi51c2VfY291bnQgPiAyKTsKKworCWlmICh2dWFydF9idXNfcHJpdi51c2VfY291bnQgIT0gMSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlCVUdfT04odnVhcnRfYnVzX3ByaXYuYm1wKTsKKworCXZ1YXJ0X2J1c19wcml2LmJtcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwb3J0c19ibXApLCBHRlBfS0VSTkVMKTsKKworCWlmICghdnVhcnRfYnVzX3ByaXYuYm1wKSB7CisJCXByX2RlYnVnKCIlczolZDoga3phbGxvYyBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYm1wX21hbGxvYzsKKwl9CisKKwlyZXN1bHQgPSBwczNfdnVhcnRfaXJxX3NldHVwKFBTM19CSU5ESU5HX0NQVV9BTlksIHZ1YXJ0X2J1c19wcml2LmJtcCwKKwkJJnZ1YXJ0X2J1c19wcml2LnZpcnEpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM192dWFydF9pcnFfc2V0dXAgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXJlc3VsdCA9IC1FUEVSTTsKKwkJZ290byBmYWlsX2FsbG9jX2lycTsKKwl9CisKKwlyZXN1bHQgPSByZXF1ZXN0X2lycSh2dWFydF9idXNfcHJpdi52aXJxLCBwczNfdnVhcnRfaXJxX2hhbmRsZXIsCisJCUlSUUZfRElTQUJMRUQsICJ2dWFydCIsICZ2dWFydF9idXNfcHJpdik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCWdvdG8gZmFpbF9yZXF1ZXN0X2lycTsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiBva1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX3JlcXVlc3RfaXJxOgorCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKKwl2dWFydF9idXNfcHJpdi52aXJxID0gTk9fSVJROworZmFpbF9hbGxvY19pcnE6CisJa2ZyZWUodnVhcnRfYnVzX3ByaXYuYm1wKTsKKwl2dWFydF9idXNfcHJpdi5ibXAgPSBOVUxMOworZmFpbF9ibXBfbWFsbG9jOgorCXZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudC0tOworCXByX2RlYnVnKCIgPC0gJXM6JWQ6IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQorc3RhdGljIGludCBwczNfdnVhcnRfYnVzX2ludGVycnVwdF9wdXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50LS07CisKKwlCVUdfT04odnVhcnRfYnVzX3ByaXYudXNlX2NvdW50IDwgMCk7CisKKwlpZiAodnVhcnRfYnVzX3ByaXYudXNlX2NvdW50ICE9IDApCisJCXJldHVybiAwOworCisJZnJlZV9pcnEodnVhcnRfYnVzX3ByaXYudmlycSwgJnZ1YXJ0X2J1c19wcml2KTsKKworCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKKwl2dWFydF9idXNfcHJpdi52aXJxID0gTk9fSVJROworCisJa2ZyZWUodnVhcnRfYnVzX3ByaXYuYm1wKTsKKwl2dWFydF9idXNfcHJpdi5ibXAgPSBOVUxMOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwczNfdnVhcnRfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQotCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnY7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSBOVUxMOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fdnVhcnRfZHJ2KGRldik7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkcnYtPmNvcmUuY29yZS5uYW1lKTsKKwogCUJVR19PTighZHJ2KTsKIAorCWlmIChkZXYtPnBvcnRfbnVtYmVyID49IFBPUlRfQ09VTlQpIHsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWRvd24oJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKIAotCS8qIFNldHVwIHZ1YXJ0X2J1c19wcml2LmRldmljZXNbXS4gKi8KKwlyZXN1bHQgPSBwczNfdnVhcnRfYnVzX2ludGVycnVwdF9nZXQoKTsKIAotCXJlc3VsdCA9IHBzM192dWFydF9tYXRjaF9pZF90b19wb3J0KGRldi0+bWF0Y2hfaWQsCi0JCSZwb3J0X251bWJlcik7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX3NldHVwX2ludGVycnVwdDsKIAotCWlmIChyZXN1bHQpIHsKLQkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVua25vd24gbWF0Y2hfaWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9tYXRjaDsKLQl9Ci0KLQlpZiAodnVhcnRfYnVzX3ByaXYuZGV2aWNlc1twb3J0X251bWJlcl0pIHsKKwlpZiAodnVhcnRfYnVzX3ByaXYuZGV2aWNlc1tkZXYtPnBvcnRfbnVtYmVyXSkgewogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcG9ydCBidXN5ICglZClcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIHBvcnRfbnVtYmVyKTsKKwkJCV9fTElORV9fLCBkZXYtPnBvcnRfbnVtYmVyKTsKIAkJcmVzdWx0ID0gLUVCVVNZOwotCQlnb3RvIGZhaWxfbWF0Y2g7CisJCWdvdG8gZmFpbF9idXN5OwogCX0KIAotCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbcG9ydF9udW1iZXJdID0gZGV2OworCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wb3J0X251bWJlcl0gPSBkZXY7CiAKLQkvKiBTZXR1cCBkZXYtPnByaXYuICovCisJLyogU2V0dXAgZGV2LT5kcml2ZXJfcHJpdi4gKi8KIAotCWRldi0+cHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2KSwgR0ZQX0tFUk5FTCk7CisJZGV2LT5kcml2ZXJfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2KSwKKwkJR0ZQX0tFUk5FTCk7CiAKLQlpZiAoIWRldi0+cHJpdikgeworCWlmICghZGV2LT5kcml2ZXJfcHJpdikgewogCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfYWxsb2M7CisJCWdvdG8gZmFpbF9kZXZfbWFsbG9jOwogCX0KIAotCWRldi0+cHJpdi0+cG9ydF9udW1iZXIgPSBwb3J0X251bWJlcjsKKwlwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5wcml2LT50eF9saXN0LmhlYWQpOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPnByaXYtPnR4X2xpc3QubG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnR4X2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xpc3QubG9jayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5wcml2LT5yeF9saXN0LmhlYWQpOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnJ4X2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJ4X2xpc3QubG9jayk7CiAKLQlJTklUX1dPUksoJmRldi0+cHJpdi0+d29yay53b3JrLCBOVUxMKTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5wcml2LT53b3JrLmxvY2spOwotCWRldi0+cHJpdi0+d29yay50cmlnZ2VyID0gMDsKLQlkZXYtPnByaXYtPndvcmsuZGV2ID0gZGV2OwotCi0JaWYgKCsrdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50ID09IDEpIHsKLQotCQlyZXN1bHQgPSBwczNfdnVhcnRfaXJxX3NldHVwKFBTM19CSU5ESU5HX0NQVV9BTlksCi0JCQkodm9pZCopJnZ1YXJ0X2J1c19wcml2LmJtcC5zdGF0dXMsICZ2dWFydF9idXNfcHJpdi52aXJxKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlkZXZfZGJnKCZkZXYtPmNvcmUsCi0JCQkJIiVzOiVkOiBwczNfdnVhcnRfaXJxX3NldHVwIGZhaWxlZCAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKLQkJCXJlc3VsdCA9IC1FUEVSTTsKLQkJCWdvdG8gZmFpbF9hbGxvY19pcnE7Ci0JCX0KLQotCQlyZXN1bHQgPSByZXF1ZXN0X2lycSh2dWFydF9idXNfcHJpdi52aXJxLCBwczNfdnVhcnRfaXJxX2hhbmRsZXIsCi0JCQlJUlFGX0RJU0FCTEVELCAidnVhcnQiLCAmdnVhcnRfYnVzX3ByaXYpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCWRldl9pbmZvKCZkZXYtPmNvcmUsICIlczolZDogcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQkJZ290byBmYWlsX3JlcXVlc3RfaXJxOwotCQl9Ci0JfQorCUlOSVRfV09SSygmcHJpdi0+cnhfbGlzdC53b3JrLndvcmssIE5VTEwpOworCXByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyID0gMDsKKwlwcml2LT5yeF9saXN0LndvcmsuZGV2ID0gZGV2OwogCiAJLyogY2xlYXIgc3RhbGUgcGVuZGluZyBpbnRlcnJ1cHRzICovCiAKQEAgLTkzNiwxNTIgKzEwODQsMTYwIEBACiAKIGZhaWxfcHJvYmU6CiAJcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIDApOwotZmFpbF9yZXF1ZXN0X2lycToKLQlwczNfdnVhcnRfaXJxX2Rlc3Ryb3kodnVhcnRfYnVzX3ByaXYudmlycSk7Ci0JdnVhcnRfYnVzX3ByaXYudmlycSA9IE5PX0lSUTsKLWZhaWxfYWxsb2NfaXJxOgotCS0tdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50OwotCWtmcmVlKGRldi0+cHJpdik7Ci0JZGV2LT5wcml2ID0gTlVMTDsKLWZhaWxfYWxsb2M6Ci0JdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1twb3J0X251bWJlcl0gPSBOVUxMOwotZmFpbF9tYXRjaDoKKwlrZnJlZShkZXYtPmRyaXZlcl9wcml2KTsKKwlkZXYtPmRyaXZlcl9wcml2ID0gTlVMTDsKK2ZhaWxfZGV2X21hbGxvYzoKKwl2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cG9ydF9udW1iZXJdID0gTlVMTDsKK2ZhaWxfYnVzeToKKwlwczNfdnVhcnRfYnVzX2ludGVycnVwdF9wdXQoKTsKK2ZhaWxfc2V0dXBfaW50ZXJydXB0OgogCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7Ci0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCisvKioKKyAqIHBzM192dWFydF9jbGVhbnVwIC0gY29tbW9uIGNsZWFudXAgaGVscGVyLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCisgKgorICogQ2xlYW5zIGludGVycnVwdHMgYW5kIEhWIHJlc291cmNlcy4gIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIHZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4IGhlbGQuICBVc2VkIGJ5IHBzM192dWFydF9yZW1vdmUgYW5kCisgKiBwczNfdnVhcnRfc2h1dGRvd24uICBBZnRlciB0aGlzIGNhbGwsIHBvbGxlZCByZWFkaW5nIHdpbGwgc3RpbGwgd29yay4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9jbGVhbnVwKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSB0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwczNfdnVhcnRfY2FuY2VsX2FzeW5jKGRldik7CisJcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIDApOworCXBzM192dWFydF9idXNfaW50ZXJydXB0X3B1dCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM192dWFydF9yZW1vdmUgLSBDb21wbGV0ZWx5IGNsZWFuIHRoZSBkZXZpY2UgaW5zdGFuY2UuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqCisgKiBDbGVhbnMgYWxsIG1lbW9yeSwgaW50ZXJydXB0cyBhbmQgSFYgcmVzb3VyY2VzLiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZQorICogZGV2aWNlIGNhbiBubyBsb25nZXIgYmUgdXNlZC4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9yZW1vdmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisJc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2OworCisJQlVHX09OKCFkZXYpOwogCiAJZG93bigmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwogCi0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWRldi0+Y29yZS5idXNfaWQpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZDogbWF0Y2hfaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CiAKLQlCVUdfT04odnVhcnRfYnVzX3ByaXYudXNlX2NvdW50IDwgMSk7Ci0KLQlpZiAoZHJ2LT5yZW1vdmUpCi0JCWRydi0+cmVtb3ZlKGRldik7Ci0JZWxzZQotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXMgbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7Ci0KLQl2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cHJpdi0+cG9ydF9udW1iZXJdID0gTlVMTDsKLQotCWlmICgtLXZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCA9PSAwKSB7Ci0JCUJVRygpOwotCQlmcmVlX2lycSh2dWFydF9idXNfcHJpdi52aXJxLCAmdnVhcnRfYnVzX3ByaXYpOwotCQlwczNfdnVhcnRfaXJxX2Rlc3Ryb3kodnVhcnRfYnVzX3ByaXYudmlycSk7Ci0JCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CisJaWYgKCFkZXYtPmNvcmUuZHJpdmVyKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBkcml2ZXIgYm91bmRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOworCQlyZXR1cm4gMDsKIAl9CiAKLQlrZnJlZShkZXYtPnByaXYpOwotCWRldi0+cHJpdiA9IE5VTEw7CisJZHJ2ID0gcHMzX3N5c3RlbV9idXNfZGV2X3RvX3Z1YXJ0X2RydihkZXYpOworCisJQlVHX09OKCFkcnYpOworCisJaWYgKGRydi0+cmVtb3ZlKSB7CisJCWRydi0+cmVtb3ZlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIHJlbW92ZSBtZXRob2RcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXyk7CisJCUJVRygpOworCX0KKworCXBzM192dWFydF9jbGVhbnVwKGRldik7CisKKwl2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cG9ydF9udW1iZXJdID0gTlVMTDsKKwlrZnJlZShwcml2KTsKKwlwcml2ID0gTlVMTDsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM192dWFydF9zaHV0ZG93biAtIENsZWFucyBpbnRlcnJ1cHRzIGFuZCBIViByZXNvdXJjZXMuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqCisgKiBDbGVhbnMgaW50ZXJydXB0cyBhbmQgSFYgcmVzb3VyY2VzLiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZQorICogZGV2aWNlIGNhbiBzdGlsbCBiZSB1c2VkIGluIHBvbGxpbmcgbW9kZS4gIFRoaXMgYmVoYXZpb3IgcmVxdWlyZWQKKyAqIGJ5IHN5cy1tYW5hZ2VyIHRvIGJlIGFibGUgdG8gY29tcGxldGUgdGhlIGRldmljZSBwb3dlciBvcGVyYXRpb24KKyAqIHNlcXVlbmNlLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnY7CisKKwlCVUdfT04oIWRldik7CisKKwlkb3duKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWQ6IG1hdGNoX2lkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRldi0+bWF0Y2hfaWQpOworCisJaWYgKCFkZXYtPmNvcmUuZHJpdmVyKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBkcml2ZXIgYm91bmRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fdnVhcnRfZHJ2KGRldik7CisKKwlCVUdfT04oIWRydik7CisKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihkZXYpOworCWVsc2UgaWYgKGRydi0+cmVtb3ZlKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBzaHV0ZG93biwgY2FsbGluZyByZW1vdmVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlkcnYtPnJlbW92ZShkZXYpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBzaHV0ZG93biBtZXRob2RcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlCVUcoKTsKKwl9CisKKwlwczNfdnVhcnRfY2xlYW51cChkZXYpOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCiAJdXAoJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHMzX3Z1YXJ0X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKl9kZXYpCitzdGF0aWMgaW50IF9faW5pdCBwczNfdnVhcnRfYnVzX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSB0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyKF9kZXYtPmRyaXZlcik7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJZGV2LT5jb3JlLmJ1c19pZCk7Ci0KLQlpZiAoZHJ2LT5zaHV0ZG93bikKLQkJZHJ2LT5zaHV0ZG93bihkZXYpOwotCWVsc2UKLQkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVzIG5vIHNodXRkb3duIG1ldGhvZFxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7Ci19Ci0KLS8qKgotICogcHMzX3Z1YXJ0X2J1cyAtIFRoZSB2dWFydCBidXMgaW5zdGFuY2UuCi0gKgotICogVGhlIHZ1YXJ0IGlzIG1hbmFnZWQgYXMgYSBidXMgdGhhdCBwb3J0IGRldmljZXMgY29ubmVjdCB0by4KLSAqLwotCi1zdHJ1Y3QgYnVzX3R5cGUgcHMzX3Z1YXJ0X2J1cyA9IHsKLSAgICAgICAgLm5hbWUgPSAicHMzX3Z1YXJ0IiwKLQkubWF0Y2ggPSBwczNfdnVhcnRfbWF0Y2gsCi0JLnByb2JlID0gcHMzX3Z1YXJ0X3Byb2JlLAotCS5yZW1vdmUgPSBwczNfdnVhcnRfcmVtb3ZlLAotCS5zaHV0ZG93biA9IHBzM192dWFydF9zaHV0ZG93biwKLX07Ci0KLWludCBfX2luaXQgcHMzX3Z1YXJ0X2J1c19pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQogCXByX2RlYnVnKCIlczolZDpcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaW5pdF9NVVRFWCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwotCXJlc3VsdCA9IGJ1c19yZWdpc3RlcigmcHMzX3Z1YXJ0X2J1cyk7Ci0JQlVHX09OKHJlc3VsdCk7CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCi12b2lkIF9fZXhpdCBwczNfdnVhcnRfYnVzX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwczNfdnVhcnRfYnVzX2V4aXQodm9pZCkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWJ1c191bnJlZ2lzdGVyKCZwczNfdnVhcnRfYnVzKTsKIH0KIAogY29yZV9pbml0Y2FsbChwczNfdnVhcnRfYnVzX2luaXQpOwogbW9kdWxlX2V4aXQocHMzX3Z1YXJ0X2J1c19leGl0KTsKIAogLyoqCi0gKiBwczNfdnVhcnRfcG9ydF9yZWxlYXNlX2RldmljZSAtIFJlbW92ZSBhIHZ1YXJ0IHBvcnQgZGV2aWNlLgotICovCi0KLXN0YXRpYyB2b2lkIHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCi17Ci0jaWYgZGVmaW5lZChERUJVRykKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSB0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoX2Rldik7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCUJVR19PTihkZXYtPnByaXYgJiYgImZvcmdvdCB0byBmcmVlIik7Ci0JbWVtc2V0KCZkZXYtPmNvcmUsIDAsIHNpemVvZihkZXYtPmNvcmUpKTsKLSNlbmRpZgotfQotCi0vKioKLSAqIHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlciAtIEFkZCBhIHZ1YXJ0IHBvcnQgZGV2aWNlLgotICovCi0KLWludCBwczNfdnVhcnRfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X2NvdW50ID0gMTsKLQotCUJVR19PTihkZXYtPnByaXYgJiYgImZvcmdvdCB0byBmcmVlIik7Ci0KLQlkZXYtPmNvcmUucGFyZW50ID0gTlVMTDsKLQlkZXYtPmNvcmUuYnVzID0gJnBzM192dWFydF9idXM7Ci0JZGV2LT5jb3JlLnJlbGVhc2UgPSBwczNfdnVhcnRfcG9ydF9yZWxlYXNlX2RldmljZTsKLQotCXNucHJpbnRmKGRldi0+Y29yZS5idXNfaWQsIHNpemVvZihkZXYtPmNvcmUuYnVzX2lkKSwgInZ1YXJ0XyUwMngiLAotCQlkZXZfY291bnQrKyk7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCByZWdpc3RlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCXJldHVybiBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+Y29yZSk7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3Rlcik7Ci0KLS8qKgogICogcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3JlZ2lzdGVyIC0gQWRkIGEgdnVhcnQgcG9ydCBkZXZpY2UgZHJpdmVyLgogICovCiAKQEAgLTEwODksMTIgKzEyNDUsMTggQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKLQlkcnYtPmNvcmUuYnVzID0gJnBzM192dWFydF9idXM7Ci0JcmVzdWx0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmUpOworCXByX2RlYnVnKCIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUuY29yZS5uYW1lKTsKKworCUJVR19PTighZHJ2LT5jb3JlLm1hdGNoX2lkKTsKKwlCVUdfT04oIWRydi0+Y29yZS5jb3JlLm5hbWUpOworCisJZHJ2LT5jb3JlLnByb2JlID0gcHMzX3Z1YXJ0X3Byb2JlOworCWRydi0+Y29yZS5yZW1vdmUgPSBwczNfdnVhcnRfcmVtb3ZlOworCWRydi0+Y29yZS5zaHV0ZG93biA9IHBzM192dWFydF9zaHV0ZG93bjsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcigmZHJ2LT5jb3JlKTsKIAlyZXR1cm4gcmVzdWx0OwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIpOwogCiAvKioKQEAgLTExMDMsOCArMTI2NSw3IEBACiAKIHZvaWQgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KQogewotCXByX2RlYnVnKCIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5jb3JlLm5hbWUpOworCXBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmNvcmUpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy92dWFydC5oIGIvZHJpdmVycy9wczMvdnVhcnQuaAppbmRleCAxYmU5OTJkLi5lYjdmNmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy92dWFydC5oCisrKyBiL2RyaXZlcnMvcHMzL3Z1YXJ0LmgKQEAgLTM0LDI5ICszNCw3IEBACiBzdHJ1Y3QgcHMzX3Z1YXJ0X3dvcmsgewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXVuc2lnbmVkIGxvbmcgdHJpZ2dlcjsKLQlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSogZGV2OyAvKiB0byBjb252ZXJ0IHdvcmsgdG8gZGV2aWNlICovCi19OwotCi0vKioKLSAqIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IC0gcHJpdmF0ZSB2dWFydCBkZXZpY2UgZGF0YS4KLSAqLwotCi1zdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiB7Ci0JdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOwotCXU2NCBpbnRlcnJ1cHRfbWFzazsKLQotCXN0cnVjdCB7Ci0JCXNwaW5sb2NrX3QgbG9jazsKLQkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwotCX0gdHhfbGlzdDsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBsb25nIGJ5dGVzX2hlbGQ7Ci0JCXNwaW5sb2NrX3QgbG9jazsKLQkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwotCX0gcnhfbGlzdDsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3N0YXRzIHN0YXRzOwotCXN0cnVjdCBwczNfdnVhcnRfd29yayB3b3JrOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldjsgLyogdG8gY29udmVydCB3b3JrIHRvIGRldmljZSAqLwogfTsKIAogLyoqCkBAIC02NCwzMiArNDIsMzAgQEAKICAqLwogCiBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyIHsKLQllbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZDsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBjb3JlOwotCWludCAoKnByb2JlKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICopOwotCWludCAoKnJlbW92ZSkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqKTsKLQl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKik7Ci0JaW50ICgqdHhfZXZlbnQpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci0JaW50ICgqcnhfZXZlbnQpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci0JaW50ICgqZGlzY29ubmVjdF9ldmVudCkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLQkvKiBpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7ICovCi0JLyogaW50ICgqcmVzdW1lKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICopOyAqLworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgY29yZTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworCXZvaWQgKCp3b3JrKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworCS8qIGludCAoKnR4X2V2ZW50KShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOyAqLworCS8qIGludCAoKnJ4X2V2ZW50KShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOyAqLworCS8qIGludCAoKmRpc2Nvbm5lY3RfZXZlbnQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7ICovCisJLyogaW50ICgqc3VzcGVuZCkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqLCBwbV9tZXNzYWdlX3QpOyAqLworCS8qIGludCAoKnJlc3VtZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsgKi8KIH07CiAKIGludCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KTsKIHZvaWQgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICp0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoCi0Jc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKgorCXBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqX2RldikKIHsKLQlyZXR1cm4gY29udGFpbmVyX29mKF9kcnYsIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIsIGNvcmUpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKnNiZCA9CisJCXBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihfZGV2KTsKKwlCVUdfT04oIXNiZCk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzYmQsIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIsIGNvcmUpOwogfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICp0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoCi0Jc3RydWN0IGRldmljZSAqX2RldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UsIGNvcmUpOwotfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpwczNfdnVhcnRfd29ya190b19wb3J0X2RldmljZSgKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqcHMzX3Z1YXJ0X3dvcmtfdG9fc3lzdGVtX2J1c19kZXYoCiAJc3RydWN0IHdvcmtfc3RydWN0ICpfd29yaykKIHsKIAlzdHJ1Y3QgcHMzX3Z1YXJ0X3dvcmsgKnZ3ID0gY29udGFpbmVyX29mKF93b3JrLCBzdHJ1Y3QgcHMzX3Z1YXJ0X3dvcmssCkBAIC05NywxNCArNzMsMTMgQEAKIAlyZXR1cm4gdnctPmRldjsKIH0KIAotaW50IHBzM192dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQqIGJ1ZiwKK2ludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKTsKLWludCBwczNfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHZvaWQqIGJ1ZiwKK2ludCBwczNfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpOwotaW50IHBzM192dWFydF9yZWFkX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgd29ya19mdW5jX3QgZnVuYywKLQl1bnNpZ25lZCBpbnQgYnl0ZXMpOwotdm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci12b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitpbnQgcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYnl0ZXMpOwordm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7Cit2b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9LY29uZmlnIGIvZHJpdmVycy9ydGMvS2NvbmZpZwppbmRleCA0ZTRjMTBhLi5jZWE0MDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcnRjL0tjb25maWcKQEAgLTEwLDcgKzEwLDYgQEAKIAogY29uZmlnIFJUQ19DTEFTUwogCXRyaXN0YXRlICJSVEMgY2xhc3MiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IG4KIAlzZWxlY3QgUlRDX0xJQgogCWhlbHAKQEAgLTExOSw3ICsxMTgsNyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXRlc3QuCiAKIGNvbW1lbnQgIkkyQyBSVEMgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQwogCiBjb25maWcgUlRDX0RSVl9EUzEzMDcKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNy8zNy8zOC8zOS80MCwgU1QgTTQxVDAwIgpAQCAtMTYwLDExICsxNTksMTEgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tYXg2OTAwLgogCiBjb25maWcgUlRDX0RSVl9SUzVDMzcyCi0JdHJpc3RhdGUgIlJpY29oIFJTNUMzNzJBL0IiCisJdHJpc3RhdGUgIlJpY29oIFJTNUMzNzJBL0IsIFJWNUMzODYsIFJWNUMzODdBIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKLQkgIFJpY29oIFJTNUMzNzJBIGFuZCBSUzVDMzcyQiBSVEMgY2hpcHMuCisJICBSaWNvaCBSUzVDMzcyQSwgUlM1QzM3MkIsIFJWNUMzODYsIGFuZCBSVjVDMzg3QSBSVEMgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXJzNWMzNzIuCkBAIC0yMTMsMTIgKzIxMiw0MCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtcGNmODU4My4KIAorY29uZmlnIFJUQ19EUlZfTTQxVDgwCisJdHJpc3RhdGUgIlNUIE00MVQ4MCBzZXJpZXMgUlRDIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFNUIE00MVQ4MCBSVEMgY2hpcHMgc2VyaWVzLiBDdXJyZW50bHkgZm9sbG93aW5nIGNoaXBzIGFyZQorCSAgc3VwcG9ydGVkOiBNNDFUODAsIE00MVQ4MSwgTTQxVDgyLCBNNDFUODMsIE00MVNUODQsIE00MVNUODUKKwkgIGFuZCBNNDFTVDg3LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tNDF0ODAuCisKK2NvbmZpZyBSVENfRFJWX000MVQ4MF9XRFQKKwlib29sICJTVCBNNDFUODAgc2VyaWVzIFJUQyB3YXRjaGRvZyB0aW1lciIKKwlkZXBlbmRzIG9uIFJUQ19EUlZfTTQxVDgwCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgd2F0Y2hkb2cgdGltZXIgaW4gU1QgTTQxVDgwIFJUQyBjaGlwcyBzZXJpZXMuCisKK2NvbmZpZyBSVENfRFJWX1RXTDkyMzMwCisJYm9vbGVhbiAiVEkgVFdMOTIzMzAvTWVuZWxhdXMiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDICYmIE1FTkVMQVVTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgb24gdGhlCisJICBUV0w5MjMzMCAiTWVuZWxhdXMiIHBvd2VyIG1hbmdlbWVudCBjaGlwLCB1c2VkIHdpdGggT01BUDIKKwkgIHBsYXRmb3Jtcy4gIFRoZSBzdXBwb3J0IGlzIGludGVncmF0ZWQgd2l0aCB0aGUgcmVzdCBvZgorCSAgdGhlIE1lbmVsYXVzIGRyaXZlcjsgaXQncyBub3Qgc2VwYXJhdGUgbW9kdWxlLgorCiBjb21tZW50ICJTUEkgUlRDIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBSVENfQ0xBU1MKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUElfTUFTVEVSCiAKIGNvbmZpZyBSVENfRFJWX1JTNUMzNDgKIAl0cmlzdGF0ZSAiUmljb2ggUlM1QzM0OEEvQiIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUEkKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUElfTUFTVEVSCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQogCSAgUmljb2ggUlM1QzM0OEEgYW5kIFJTNUMzNDhCIFJUQyBjaGlwcy4KQEAgLTIyOCw3ICsyNTUsNyBAQAogCiBjb25maWcgUlRDX0RSVl9NQVg2OTAyCiAJdHJpc3RhdGUgIk1heGltIDY5MDIiCi0JZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgU1BJCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgU1BJX01BU1RFUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQogCSAgTWF4aW0gTUFYNjkwMiBTUEkgUlRDIGNoaXAuCkBAIC0yNDYsNyArMjczLDcgQEAKIGNvbmZpZyBSVENfRFJWX0NNT1MKIAl0cmlzdGF0ZSAiUEMtc3R5bGUgJ0NNT1MnIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIChYODYgfHwgQUxQSEEgfHwgQVJNMjYgfHwgQVJNIFwKLQkJfHwgTTMyUiB8fCBBVEFSSSB8fCBQT1dFUlBDIHx8IE1JUFMpCisJCXx8IE0zMlIgfHwgQVRBUkkgfHwgUFBDIHx8IE1JUFMpCiAJaGVscAogCSAgU2F5ICJ5ZXMiIGhlcmUgdG8gZ2V0IGRpcmVjdCBzdXBwb3J0IGZvciB0aGUgcmVhbCB0aW1lIGNsb2NrCiAJICBmb3VuZCBpbiBldmVyeSBQQyBvciBBQ1BJLWJhc2VkIHN5c3RlbSwgYW5kIHNvbWUgb3RoZXIgYm9hcmRzLgpAQCAtMjYyLDYgKzI4OSwxMiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtY21vcy4KIAorY29uZmlnIFJUQ19EUlZfRFMxMjE2CisJdHJpc3RhdGUgIkRhbGxhcyBEUzEyMTYiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgU05JX1JNCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBEYWxsYXMgRFMxMjE2IFJUQyBjaGlwcy4KKwogY29uZmlnIFJUQ19EUlZfRFMxNTUzCiAJdHJpc3RhdGUgIkRhbGxhcyBEUzE1NTMiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MKQEAgLTI5Miw2ICszMjUsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW00OHQ4Ni4KIAorY29uZmlnIFJUQ19EUlZfTTQ4VDU5CisJdHJpc3RhdGUgIlNUIE00OFQ1OSIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFNUIE00OFQ1OSBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCAicnRjLW00OHQ1OSIuCisKIGNvbmZpZyBSVENfRFJWX1YzMDIwCiAJdHJpc3RhdGUgIkVNIE1pY3JvZWxlY3Ryb25pYyBWMzAyMCIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUwpAQCAtMzc5LDYgKzQyMiwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcnRjLXBsMDMxLgogCitjb25maWcgUlRDX0RSVl9BVDMyQVA3MDBYCisJdHJpc3RhdGUgIkFUMzJBUDcwMFggc2VyaWVzIFJUQyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBQTEFURk9STV9BVDMyQVAKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBpbnRlcm5hbCBSVEMgKFJlYWx0aW1lIENsb2NrKSBvbiBBdG1lbCBBVlIzMgorCSAgQVQzMkFQNzAweCBmYW1pbHkgcHJvY2Vzc29ycy4KKwogY29uZmlnIFJUQ19EUlZfQVQ5MVJNOTIwMAogCXRyaXN0YXRlICJBVDkxUk05MjAwIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEFSQ0hfQVQ5MVJNOTIwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQppbmRleCBhMWFmYmMyLi4zMTA5YWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfWDEyMDUpCSs9IHJ0Yy14MTIwNS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9JU0wxMjA4KQkrPSBydGMtaXNsMTIwOC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9URVNUKQkrPSBydGMtdGVzdC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYKQkrPSBydGMtYXQzMmFwNzAweC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzEzMDcpCSs9IHJ0Yy1kczEzMDcubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNjcyKQkrPSBydGMtZHMxNjcyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTc0MikJKz0gcnRjLWRzMTc0Mi5vCkBAIC0yOCw2ICsyOSw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzcyKQkrPSBydGMtcnM1YzM3Mi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TM0MpCSs9IHJ0Yy1zM2Mubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzM0OCkJKz0gcnRjLXJzNWMzNDgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQxVDgwKQkrPSBydGMtbTQxdDgwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX000OFQ4NikJKz0gcnRjLW00OHQ4Ni5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzE1NTMpCSs9IHJ0Yy1kczE1NTMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzMxMykJKz0gcnRjLXJzNWMzMTMubwpAQCAtNDEsMyArNDMsNSBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQ5MVJNOTIwMCkrPSBydGMtYXQ5MXJtOTIwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TSCkJKz0gcnRjLXNoLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0JGSU4pCSs9IHJ0Yy1iZmluLm8KK29iai0kKENPTkZJR19SVENfRFJWX000OFQ1OSkJKz0gcnRjLW00OHQ1OS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzEyMTYpCSs9IHJ0Yy1kczEyMTYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5OTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBBbiBSVEMgZHJpdmVyIGZvciB0aGUgQVZSMzIgQVQzMkFQNzAweCBwcm9jZXNzb3Igc2VyaWVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKy8qCisgKiBUaGlzIGlzIGEgYmFyZS1ib25lcyBSVEMuIEl0IHJ1bnMgZHVyaW5nIG1vc3Qgc3lzdGVtIHNsZWVwIHN0YXRlcywgYnV0IGhhcworICogbm8gYmF0dGVyeSBiYWNrdXAgYW5kIGdldHMgcmVzZXQgZHVyaW5nIHN5c3RlbSByZXN0YXJ0LiAgSXQgbXVzdCBiZQorICogaW5pdGlhbGl6ZWQgZnJvbSBhbiBleHRlcm5hbCBjbG9jayAobmV0d29yaywgSTJDLCBldGMpIGJlZm9yZSBpdCBjYW4gYmUgb2YKKyAqIG11Y2ggdXNlLgorICoKKyAqIFRoZSBhbGFybSBmdW5jdGlvbmFsaXR5IGlzIGxpbWl0ZWQgYnkgdGhlIGhhcmR3YXJlLCBub3Qgc3VwcG9ydGluZworICogcGVyaW9kaWMgaW50ZXJydXB0cy4KKyAqLworCisjZGVmaW5lIFJUQ19DVFJMCQkweDAwCisjZGVmaW5lIFJUQ19DVFJMX0VOCQkgICAwCisjZGVmaW5lIFJUQ19DVFJMX1BDTFIJCSAgIDEKKyNkZWZpbmUgUlRDX0NUUkxfVE9QRU4JCSAgIDIKKyNkZWZpbmUgUlRDX0NUUkxfUFNFTAkJICAgOAorCisjZGVmaW5lIFJUQ19WQUwJCQkweDA0CisKKyNkZWZpbmUgUlRDX1RPUAkJCTB4MDgKKworI2RlZmluZSBSVENfSUVSCQkJMHgxMAorI2RlZmluZSBSVENfSUVSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSURSCQkJMHgxNAorI2RlZmluZSBSVENfSURSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSU1SCQkJMHgxOAorI2RlZmluZSBSVENfSU1SX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSVNSCQkJMHgxYworI2RlZmluZSBSVENfSVNSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSUNSCQkJMHgyMAorI2RlZmluZSBSVENfSUNSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfQklUKG5hbWUpCQkoMSA8PCBSVENfIyNuYW1lKQorI2RlZmluZSBSVENfQkYobmFtZSwgdmFsdWUpCSgodmFsdWUpIDw8IFJUQ18jI25hbWUpCisKKyNkZWZpbmUgcnRjX3JlYWRsKGRldiwgcmVnKQkJCQlcCisJX19yYXdfcmVhZGwoKGRldiktPnJlZ3MgKyBSVENfIyNyZWcpCisjZGVmaW5lIHJ0Y193cml0ZWwoZGV2LCByZWcsIHZhbHVlKQkJCVwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKGRldiktPnJlZ3MgKyBSVENfIyNyZWcpCisKK3N0cnVjdCBydGNfYXQzMmFwNzAweCB7CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCXVuc2lnbmVkIGxvbmcJCWFsYXJtX3RpbWU7CisJdW5zaWduZWQgbG9uZwkJaXJxOworCS8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHJlZ2lzdGVyIGFjY2Vzcy4gKi8KKwlzcGlubG9ja190CQlsb2NrOworfTsKKworc3RhdGljIGludCBhdDMyX3J0Y19yZWFkdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKworCW5vdyA9IHJ0Y19yZWFkbChydGMsIFZBTCk7CisJcnRjX3RpbWVfdG9fdG0obm93LCB0bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDMyX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgbm93OworCWludCByZXQ7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSh0bSwgJm5vdyk7CisJaWYgKHJldCA9PSAwKQorCQlydGNfd3JpdGVsKHJ0YywgVkFMLCBub3cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdDMyX3J0Y19yZWFkYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3RpbWVfdG9fdG0ocnRjLT5hbGFybV90aW1lLCAmYWxybS0+dGltZSk7CisJYWxybS0+cGVuZGluZyA9IHJ0Y19yZWFkbChydGMsIElNUikgJiBSVENfQklUKElNUl9UT1BJKSA/IDEgOiAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQzMl9ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgcnRjX3VuaXhfdGltZTsKKwl1bnNpZ25lZCBsb25nIGFsYXJtX3VuaXhfdGltZTsKKwlpbnQgcmV0OworCisJcnRjX3VuaXhfdGltZSA9IHJ0Y19yZWFkbChydGMsIFZBTCk7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSgmYWxybS0+dGltZSwgJmFsYXJtX3VuaXhfdGltZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhbGFybV91bml4X3RpbWUgPCBydGNfdW5peF90aW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisJcnRjLT5hbGFybV90aW1lID0gYWxhcm1fdW5peF90aW1lOworCXJ0Y193cml0ZWwocnRjLCBUT1AsIHJ0Yy0+YWxhcm1fdGltZSk7CisJaWYgKGFscm0tPnBlbmRpbmcpCisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCXwgUlRDX0JJVChDVFJMX1RPUEVOKSk7CisJZWxzZQorCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgcnRjX3JlYWRsKHJ0YywgQ1RSTCkKKwkJCQkmIH5SVENfQklUKENUUkxfVE9QRU4pKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT046CisJCWlmIChydGNfcmVhZGwocnRjLCBWQUwpID4gcnRjLT5hbGFybV90aW1lKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJfCBSVENfQklUKENUUkxfVE9QRU4pKTsKKwkJcnRjX3dyaXRlbChydGMsIElDUiwgUlRDX0JJVChJQ1JfVE9QSSkpOworCQlydGNfd3JpdGVsKHJ0YywgSUVSLCBSVENfQklUKElFUl9UT1BJKSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PRkY6CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCSYgflJUQ19CSVQoQ1RSTF9UT1BFTikpOworCQlydGNfd3JpdGVsKHJ0YywgSURSLCBSVENfQklUKElEUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJQ1IsIFJUQ19CSVQoSUNSX1RPUEkpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQzMl9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IChzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKilkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBpc3IgPSBydGNfcmVhZGwocnRjLCBJU1IpOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnJ0Yy0+bG9jayk7CisKKwlpZiAoaXNyICYgUlRDX0JJVChJU1JfVE9QSSkpIHsKKwkJcnRjX3dyaXRlbChydGMsIElDUiwgUlRDX0JJVChJQ1JfVE9QSSkpOworCQlydGNfd3JpdGVsKHJ0YywgSURSLCBSVENfQklUKElEUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCSYgflJUQ19CSVQoQ1RSTF9UT1BFTikpOworCQlydGNfd3JpdGVsKHJ0YywgVkFMLCBydGMtPmFsYXJtX3RpbWUpOworCQlldmVudHMgPSBSVENfQUYgfCBSVENfSVJRRjsKKwkJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGMsIDEsIGV2ZW50cyk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKworCXNwaW5fdW5sb2NrKCZydGMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGF0MzJfcnRjX29wcyA9IHsKKwkuaW9jdGwJCT0gYXQzMl9ydGNfaW9jdGwsCisJLnJlYWRfdGltZQk9IGF0MzJfcnRjX3JlYWR0aW1lLAorCS5zZXRfdGltZQk9IGF0MzJfcnRjX3NldHRpbWUsCisJLnJlYWRfYWxhcm0JPSBhdDMyX3J0Y19yZWFkYWxhcm0sCisJLnNldF9hbGFybQk9IGF0MzJfcnRjX3NldGFsYXJtLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQzMl9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlZ3M7CisJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGM7CisJaW50IGlycSA9IC0xOworCWludCByZXQ7CisKKwlydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRjX2F0MzJhcDcwMHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ0YykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGlycVxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBhdDMyX3J0Y19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAicnRjIiwgcnRjKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZXF1ZXN0IGlycSAlZFxuIiwgaXJxKTsKKwkJZ290byBvdXQ7CisJfQorCisJcnRjLT5pcnEgPSBpcnE7CisJcnRjLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxKTsKKwlpZiAoIXJ0Yy0+cmVncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgbWFwIEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIG91dF9mcmVlX2lycTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+bG9jayk7CisKKwkvKgorCSAqIE1heWJlIGluaXQgUlRDOiBjb3VudCBmcm9tIHplcm8gYXQgMSBIeiwgZGlzYWJsZSB3cmFwIGlycS4KKwkgKgorCSAqIERvIG5vdCByZXNldCBWQUwgcmVnaXN0ZXIsIGFzIGl0IGNhbiBob2xkIGFuIG9sZCB0aW1lCisJICogZnJvbSBsYXN0IEpUQUcgcmVzZXQuCisJICovCisJaWYgKCEocnRjX3JlYWRsKHJ0YywgQ1RSTCkgJiBSVENfQklUKENUUkxfRU4pKSkgeworCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgUlRDX0JJVChDVFJMX1BDTFIpKTsKKwkJcnRjX3dyaXRlbChydGMsIElEUiwgUlRDX0JJVChJRFJfVE9QSSkpOworCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgUlRDX0JGKENUUkxfUFNFTCwgMHhlKQorCQkJCXwgUlRDX0JJVChDVFJMX0VOKSk7CisJfQorCisJcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJJmF0MzJfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjLT5ydGMpKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBydGMgZGV2aWNlXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihydGMtPnJ0Yyk7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJBdG1lbCBSVEMgZm9yIEFUMzJBUDcwMHggYXQgJTA4bHggaXJxICVsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXJ0Yy0+cmVncywgcnRjLT5pcnEpOworCisJcmV0dXJuIDA7CisKK291dF9pb3VubWFwOgorCWlvdW5tYXAocnRjLT5yZWdzKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShpcnEsIHJ0Yyk7CitvdXQ6CisJa2ZyZWUocnRjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhdDMyX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZnJlZV9pcnEocnRjLT5pcnEsIHJ0Yyk7CisJaW91bm1hcChydGMtPnJlZ3MpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Yyk7CisJa2ZyZWUocnRjKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQUxJQVMoImF0MzJhcDcwMHhfcnRjIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0MzJfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGF0MzJfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImF0MzJhcDcwMHhfcnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0MzJfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdDMyX3J0Y19kcml2ZXIsIGF0MzJfcnRjX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGF0MzJfcnRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXQzMl9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdDMyX3J0Y19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYXQzMl9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhjZWd0dmVkdEBhdG1lbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWwgdGltZSBjbG9jayBmb3IgQVZSMzIgQVQzMkFQNzAweCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRldi5jIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCmluZGV4IGY0ZTVmMDAuLjMwNDUzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKQEAgLTM0MSw2ICszNDEsOCBAQAogCWNhc2UgUlRDX0lSUVBfUkVBRDoKIAkJaWYgKG9wcy0+aXJxX3NldF9mcmVxKQogCQkJZXJyID0gcHV0X3VzZXIocnRjLT5pcnFfZnJlcSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopdWFyZyk7CisJCWVsc2UKKwkJCWVyciA9IC1FTk9UVFk7CiAJCWJyZWFrOwogCiAJY2FzZSBSVENfSVJRUF9TRVQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlZmI4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIERhbGxhcyBEUzEyMTYgUlRDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBUaG9tYXMgQm9nZW5kb2VyZmVyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgorCitzdHJ1Y3QgZHMxMjE2X3JlZ3MgeworCXU4IHRzZWM7CisJdTggc2VjOworCXU4IG1pbjsKKwl1OCBob3VyOworCXU4IHdkYXk7CisJdTggbWRheTsKKwl1OCBtb250aDsKKwl1OCB5ZWFyOworfTsKKworI2RlZmluZSBEUzEyMTZfSE9VUl8xMjI0CSgxIDw8IDcpCisjZGVmaW5lIERTMTIxNl9IT1VSX0FNUE0JKDEgPDwgNSkKKworc3RydWN0IGRzMTIxNl9wcml2IHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgYmFzZWFkZHI7Cit9OworCitzdGF0aWMgY29uc3QgdTggbWFnaWNbXSA9IHsKKwkweGM1LCAweDNhLCAweGEzLCAweDVjLCAweGM1LCAweDNhLCAweGEzLCAweDVjCit9OworCisvKgorICogUmVhZCB0aGUgNjQgYml0IHdlJ2QgbGlrZSB0byBoYXZlIC0gSXQgYSBzZXJpZXMKKyAqIG9mIDY0IGJpdHMgc2hvd2luZyB1cCBpbiB0aGUgTFNCIG9mIHRoZSBiYXNlIHJlZ2lzdGVyLgorICoKKyAqLworc3RhdGljIHZvaWQgZHMxMjE2X3JlYWQodTggX19pb21lbSAqaW9hZGRyLCB1OCAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYyA9IDA7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQljIHw9IChyZWFkYihpb2FkZHIpICYgMHgxKSA8PCBqOworCQlidWZbaV0gPSBjOworCX0KK30KKworc3RhdGljIHZvaWQgZHMxMjE2X3dyaXRlKHU4IF9faW9tZW0gKmlvYWRkciwgY29uc3QgdTggKmJ1ZikKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWMgPSBidWZbaV07CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCXdyaXRlYihjLCBpb2FkZHIpOworCQkJYyA9IGMgPj4gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayh1OCBfX2lvbWVtICppb2FkZHIpCit7CisJLyogUmVzZXQgbWFnaWMgcG9pbnRlciAqLworCXJlYWRiKGlvYWRkcik7CisJLyogV3JpdGUgNjQgYml0IG1hZ2ljIHRvIERTMTIxNiAqLworCWRzMTIxNl93cml0ZShpb2FkZHIsIG1hZ2ljKTsKK30KKworc3RhdGljIGludCBkczEyMTZfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkczEyMTZfcmVncyByZWdzOworCisJZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayhwcml2LT5pb2FkZHIpOworCWRzMTIxNl9yZWFkKHByaXYtPmlvYWRkciwgKHU4ICopJnJlZ3MpOworCisJdG0tPnRtX3NlYyA9IEJDRDJCSU4ocmVncy5zZWMpOworCXRtLT50bV9taW4gPSBCQ0QyQklOKHJlZ3MubWluKTsKKwlpZiAocmVncy5ob3VyICYgRFMxMjE2X0hPVVJfMTIyNCkgeworCQkvKiBBTS9QTSBtb2RlICovCisJCXRtLT50bV9ob3VyID0gQkNEMkJJTihyZWdzLmhvdXIgJiAweDFmKTsKKwkJaWYgKHJlZ3MuaG91ciAmIERTMTIxNl9IT1VSX0FNUE0pCisJCQl0bS0+dG1faG91ciArPSAxMjsKKwl9IGVsc2UKKwkJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKHJlZ3MuaG91ciAmIDB4M2YpOworCXRtLT50bV93ZGF5ID0gKHJlZ3Mud2RheSAmIDcpIC0gMTsKKwl0bS0+dG1fbWRheSA9IEJDRDJCSU4ocmVncy5tZGF5ICYgMHgzZik7CisJdG0tPnRtX21vbiA9IEJDRDJCSU4ocmVncy5tb250aCAmIDB4MWYpOworCXRtLT50bV95ZWFyID0gQkNEMkJJTihyZWdzLnllYXIpOworCWlmICh0bS0+dG1feWVhciA8IDcwKQorCQl0bS0+dG1feWVhciArPSAxMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMjE2X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkczEyMTZfcmVncyByZWdzOworCisJZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayhwcml2LT5pb2FkZHIpOworCWRzMTIxNl9yZWFkKHByaXYtPmlvYWRkciwgKHU4ICopJnJlZ3MpOworCisJcmVncy50c2VjID0gMDsgLyogY2xlYXIgMC4xIGFuZCAwLjAxIHNlY29uZHMgKi8KKwlyZWdzLnNlYyA9IEJJTjJCQ0QodG0tPnRtX3NlYyk7CisJcmVncy5taW4gPSBCSU4yQkNEKHRtLT50bV9taW4pOworCXJlZ3MuaG91ciAmPSBEUzEyMTZfSE9VUl8xMjI0OworCWlmIChyZWdzLmhvdXIgJiYgdG0tPnRtX2hvdXIgPiAxMikgeworCQlyZWdzLmhvdXIgfD0gRFMxMjE2X0hPVVJfQU1QTTsKKwkJdG0tPnRtX2hvdXIgLT0gMTI7CisJfQorCXJlZ3MuaG91ciB8PSBCSU4yQkNEKHRtLT50bV9ob3VyKTsKKwlyZWdzLndkYXkgJj0gfjc7CisJcmVncy53ZGF5IHw9IHRtLT50bV93ZGF5OworCXJlZ3MubWRheSA9IEJJTjJCQ0QodG0tPnRtX21kYXkpOworCXJlZ3MubW9udGggPSBCSU4yQkNEKHRtLT50bV9tb24pOworCXJlZ3MueWVhciA9IEJJTjJCQ0QodG0tPnRtX3llYXIgJSAxMDApOworCisJZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayhwcml2LT5pb2FkZHIpOworCWRzMTIxNl93cml0ZShwcml2LT5pb2FkZHIsICh1OCAqKSZyZWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTIxNl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczEyMTZfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBkczEyMTZfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZHMxMjE2X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2OworCWludCByZXQgPSAwOworCXU4IGR1bW15WzhdOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCXByaXYtPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHByaXYtPnNpemUsIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCXByaXYtPmJhc2VhZGRyID0gcmVzLT5zdGFydDsKKwlwcml2LT5pb2FkZHIgPSBpb3JlbWFwKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlpZiAoIXByaXYtPmlvYWRkcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMjE2IiwgJnBkZXYtPmRldiwKKwkJCQkgICZkczEyMTZfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gb3V0OworCX0KKwlwcml2LT5ydGMgPSBydGM7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwkvKiBkdW1teSByZWFkIHRvIGdldCBjbG9jayBpbnRvIGEga25vd24gc3RhdGUgKi8KKwlkczEyMTZfcmVhZChwcml2LT5pb2FkZHIsIGR1bW15KTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmIChwcml2LT5ydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlmIChwcml2LT5pb2FkZHIpCisJCWlvdW5tYXAocHJpdi0+aW9hZGRyKTsKKwlpZiAocHJpdi0+YmFzZWFkZHIpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwcml2LT5iYXNlYWRkciwgcHJpdi0+c2l6ZSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxMjE2X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlvdW5tYXAocHJpdi0+aW9hZGRyKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWtmcmVlKHByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLWRzMTIxNiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGRzMTIxNl9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczEyMTZfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkczEyMTZfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczEyMTZfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHMxMjE2X3J0Y19wbGF0Zm9ybV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgQm9nZW5kb2VyZmVyIDx0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzEyMTYgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChkczEyMTZfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoZHMxMjE2X3J0Y19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCAzZjBmN2I4Li41MTU4YTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0yNCwyOSArMjQsMjkgQEAKICAqIHNldHRpbmcgdGhlIGRhdGUgYW5kIHRpbWUpLCBMaW51eCBjYW4gaWdub3JlIHRoZSBub24tY2xvY2sgZmVhdHVyZXMuCiAgKiBUaGF0J3MgYSBuYXR1cmFsIGpvYiBmb3IgYSBmYWN0b3J5IG9yIHJlcGFpciBiZW5jaC4KICAqCi0gKiBJZiB0aGUgSTJDICJmb3JjZSIgbWVjaGFuaXNtIGlzIHVzZWQsIHdlIGFzc3VtZSB0aGUgY2hpcCBpcyBhIGRzMTMzNy4KLSAqIChNdWNoIGJldHRlciB3b3VsZCBiZSBib2FyZC1zcGVjaWZpYyB0YWJsZXMgb2YgSTJDIGRldmljZXMsIGFsb25nIHdpdGgKLSAqIHRoZSBwbGF0Zm9ybV9kYXRhIGRyaXZlcnMgd291bGQgdXNlIHRvIHNvcnQgc3VjaCBpc3N1ZXMgb3V0LikKKyAqIFRoaXMgaXMgY3VycmVudGx5IGEgc2ltcGxlIG5vLWFsYXJtcyBkcml2ZXIuICBJZiB5b3VyIGJvYXJkIGhhcyB0aGUKKyAqIGFsYXJtIGlycSB3aXJlZCB1cCBvbiBhIGRzMTMzNyBvciBkczEzMzksIGFuZCB5b3Ugd2FudCB0byB1c2UgdGhhdCwKKyAqIHRoZW4gbG9vayBhdCB0aGUgcnRjLXJzNWMzNzIgZHJpdmVyIGZvciBjb2RlIHRvIHN0ZWFsLi4uCiAgKi8KIGVudW0gZHNfdHlwZSB7Ci0JdW5rbm93biA9IDAsCi0JZHNfMTMwNywJCS8qIG9yIGRzMTMzOCwgLi4uICovCi0JZHNfMTMzNywJCS8qIG9yIGRzMTMzOSwgLi4uICovCi0JZHNfMTM0MCwJCS8qIG9yIHN0IG00MXQwMCwgLi4uICovCisJZHNfMTMwNywKKwlkc18xMzM3LAorCWRzXzEzMzgsCisJZHNfMTMzOSwKKwlkc18xMzQwLAorCW00MXQwMCwKIAkvLyByczVjMzcyIHRvbz8gIGRpZmZlcmVudCBhZGRyZXNzLi4uCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDY4LCBJMkNfQ0xJRU5UX0VORCB9OwotCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQotCiAKIC8qIFJUQyByZWdpc3RlcnMgZG9uJ3QgZGlmZmVyIG11Y2gsIGV4Y2VwdCBmb3IgdGhlIGNlbnR1cnkgZmxhZyAqLwogI2RlZmluZSBEUzEzMDdfUkVHX1NFQ1MJCTB4MDAJLyogMDAtNTkgKi8KICMJZGVmaW5lIERTMTMwN19CSVRfQ0gJCTB4ODAKKyMJZGVmaW5lIERTMTM0MF9CSVRfbkVPU0MJCTB4ODAKICNkZWZpbmUgRFMxMzA3X1JFR19NSU4JCTB4MDEJLyogMDAtNTkgKi8KICNkZWZpbmUgRFMxMzA3X1JFR19IT1VSCQkweDAyCS8qIDAwLTIzLCBvciAxLTEye2FtLHBtfSAqLworIwlkZWZpbmUgRFMxMzA3X0JJVF8xMkhSCQkweDQwCS8qIGluIFJFR19IT1VSICovCisjCWRlZmluZSBEUzEzMDdfQklUX1BNCQkweDIwCS8qIGluIFJFR19IT1VSICovCiAjCWRlZmluZSBEUzEzNDBfQklUX0NFTlRVUllfRU4JMHg4MAkvKiBpbiBSRUdfSE9VUiAqLwogIwlkZWZpbmUgRFMxMzQwX0JJVF9DRU5UVVJZCTB4NDAJLyogaW4gUkVHX0hPVVIgKi8KICNkZWZpbmUgRFMxMzA3X1JFR19XREFZCQkweDAzCS8qIDAxLTA3ICovCkBAIC01NiwxMSArNTYsMTIgQEAKICNkZWZpbmUgRFMxMzA3X1JFR19ZRUFSCQkweDA2CS8qIDAwLTk5ICovCiAKIC8qIE90aGVyIHJlZ2lzdGVycyAoY29udHJvbCwgc3RhdHVzLCBhbGFybXMsIHRyaWNrbGUgY2hhcmdlLCBOVlJBTSwgZXRjKQotICogc3RhcnQgYXQgNywgYW5kIHRoZXkgZGlmZmVyIGEgbG90LiBPbmx5IGNvbnRyb2wgYW5kIHN0YXR1cyBtYXR0ZXIgZm9yIFJUQzsKLSAqIGJlIGNhcmVmdWwgdXNpbmcgdGhlbS4KKyAqIHN0YXJ0IGF0IDcsIGFuZCB0aGV5IGRpZmZlciBhIExPVC4gT25seSBjb250cm9sIGFuZCBzdGF0dXMgbWF0dGVyIGZvcgorICogYmFzaWMgUlRDIGRhdGUgYW5kIHRpbWUgZnVuY3Rpb25hbGl0eTsgYmUgY2FyZWZ1bCB1c2luZyB0aGVtLgogICovCi0jZGVmaW5lIERTMTMwN19SRUdfQ09OVFJPTAkweDA3CisjZGVmaW5lIERTMTMwN19SRUdfQ09OVFJPTAkweDA3CQkvKiBvciBkczEzMzggKi8KICMJZGVmaW5lIERTMTMwN19CSVRfT1VUCQkweDgwCisjCWRlZmluZSBEUzEzMzhfQklUX09TRgkJMHgyMAogIwlkZWZpbmUgRFMxMzA3X0JJVF9TUVdFCQkweDEwCiAjCWRlZmluZSBEUzEzMDdfQklUX1JTMQkJMHgwMgogIwlkZWZpbmUgRFMxMzA3X0JJVF9SUzAJCTB4MDEKQEAgLTcxLDYgKzcyLDEzIEBACiAjCWRlZmluZSBEUzEzMzdfQklUX0lOVENOCQkweDA0CiAjCWRlZmluZSBEUzEzMzdfQklUX0EySUUJCTB4MDIKICMJZGVmaW5lIERTMTMzN19CSVRfQTFJRQkJMHgwMQorI2RlZmluZSBEUzEzNDBfUkVHX0NPTlRST0wJMHgwNworIwlkZWZpbmUgRFMxMzQwX0JJVF9PVVQJCTB4ODAKKyMJZGVmaW5lIERTMTM0MF9CSVRfRlQJCTB4NDAKKyMJZGVmaW5lIERTMTM0MF9CSVRfQ0FMSUJfU0lHTgkweDIwCisjCWRlZmluZSBEUzEzNDBfTV9DQUxJQlJBVElPTgkweDFmCisjZGVmaW5lIERTMTM0MF9SRUdfRkxBRwkJMHgwOQorIwlkZWZpbmUgRFMxMzQwX0JJVF9PU0YJCTB4ODAKICNkZWZpbmUgRFMxMzM3X1JFR19TVEFUVVMJMHgwZgogIwlkZWZpbmUgRFMxMzM3X0JJVF9PU0YJCTB4ODAKICMJZGVmaW5lIERTMTMzN19CSVRfQTJJCQkweDAyCkBAIC04NCwyMSArOTIsNjMgQEAKIAl1OAkJCXJlZ3NbOF07CiAJZW51bSBkc190eXBlCQl0eXBlOwogCXN0cnVjdCBpMmNfbXNnCQltc2dbMl07Ci0Jc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQJZGV2OwogCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CiB9OwogCitzdHJ1Y3QgY2hpcF9kZXNjIHsKKwljaGFyCQkJbmFtZVs5XTsKKwl1bnNpZ25lZAkJbnZyYW01NjoxOworCXVuc2lnbmVkCQlhbGFybToxOworCWVudW0gZHNfdHlwZQkJdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hpcF9kZXNjIGNoaXBzW10gPSB7IHsKKwkubmFtZQkJPSAiZHMxMzA3IiwKKwkudHlwZQkJPSBkc18xMzA3LAorCS5udnJhbTU2CT0gMSwKK30sIHsKKwkubmFtZQkJPSAiZHMxMzM3IiwKKwkudHlwZQkJPSBkc18xMzM3LAorCS5hbGFybQkJPSAxLAorfSwgeworCS5uYW1lCQk9ICJkczEzMzgiLAorCS50eXBlCQk9IGRzXzEzMzgsCisJLm52cmFtNTYJPSAxLAorfSwgeworCS5uYW1lCQk9ICJkczEzMzkiLAorCS50eXBlCQk9IGRzXzEzMzksCisJLmFsYXJtCQk9IDEsCit9LCB7CisJLm5hbWUJCT0gImRzMTM0MCIsCisJLnR5cGUJCT0gZHNfMTM0MCwKK30sIHsKKwkubmFtZQkJPSAibTQxdDAwIiwKKwkudHlwZQkJPSBtNDF0MDAsCit9LCB9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MgKmZpbmRfY2hpcChjb25zdCBjaGFyICpzKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGlwcyk7IGkrKykKKwkJaWYgKHN0cm5pY21wKHMsIGNoaXBzW2ldLm5hbWUsIHNpemVvZiBjaGlwc1tpXS5uYW1lKSA9PSAwKQorCQkJcmV0dXJuICZjaGlwc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KIAogc3RhdGljIGludCBkczEzMDdfZ2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCiB7CiAJc3RydWN0IGRzMTMwNwkqZHMxMzA3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50CQl0bXA7CiAKLQkvKiByZWFkIHRoZSBSVEMgcmVnaXN0ZXJzIGFsbCBhdCBvbmNlICovCisJLyogcmVhZCB0aGUgUlRDIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzIGFsbCBhdCBvbmNlICovCiAJZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKIAlkczEzMDctPm1zZ1sxXS5sZW4gPSA3OwogCi0JdG1wID0gaTJjX3RyYW5zZmVyKGRzMTMwNy0+Y2xpZW50LmFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKKwl0bXAgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoZHMxMzA3LT5jbGllbnQtPmRldi5wYXJlbnQpLAorCQkJZHMxMzA3LT5tc2csIDIpOwogCWlmICh0bXAgIT0gMikgewogCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAicmVhZCIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMTI5LDcgKzE3OSw4IEBACiAJCXQtPnRtX2hvdXIsIHQtPnRtX21kYXksCiAJCXQtPnRtX21vbiwgdC0+dG1feWVhciwgdC0+dG1fd2RheSk7CiAKLQlyZXR1cm4gMDsKKwkvKiBpbml0aWFsIGNsb2NrIHNldHRpbmcgY2FuIGJlIHVuZGVmaW5lZCAqLworCXJldHVybiBydGNfdmFsaWRfdG0odCk7CiB9CiAKIHN0YXRpYyBpbnQgZHMxMzA3X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQpAQCAtMTU3LDExICsyMDgsMTggQEAKIAl0bXAgPSB0LT50bV95ZWFyIC0gMTAwOwogCWJ1ZltEUzEzMDdfUkVHX1lFQVJdID0gQklOMkJDRCh0bXApOwogCi0JaWYgKGRzMTMwNy0+dHlwZSA9PSBkc18xMzM3KQorCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSBkc18xMzM3OgorCWNhc2UgZHNfMTMzOToKIAkJYnVmW0RTMTMwN19SRUdfTU9OVEhdIHw9IERTMTMzN19CSVRfQ0VOVFVSWTsKLQllbHNlIGlmIChkczEzMDctPnR5cGUgPT0gZHNfMTM0MCkKKwkJYnJlYWs7CisJY2FzZSBkc18xMzQwOgogCQlidWZbRFMxMzA3X1JFR19IT1VSXSB8PSBEUzEzNDBfQklUX0NFTlRVUllfRU4KIAkJCQl8IERTMTM0MF9CSVRfQ0VOVFVSWTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSAwOwogCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDg7CkBAIC0xNzAsNyArMjI4LDggQEAKIAkJIndyaXRlIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAogCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKIAotCXJlc3VsdCA9IGkyY190cmFuc2ZlcihkczEzMDctPmNsaWVudC5hZGFwdGVyLCAmZHMxMzA3LT5tc2dbMV0sIDEpOworCXJlc3VsdCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihkczEzMDctPmNsaWVudC0+ZGV2LnBhcmVudCksCisJCQkmZHMxMzA3LT5tc2dbMV0sIDEpOwogCWlmIChyZXN1bHQgIT0gMSkgewogCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAid3JpdGUiLCB0bXApOwogCQlyZXR1cm4gLUVJTzsKQEAgLTE4NSwyNSArMjQ0LDI5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczEzMDdfZHJpdmVyOwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotZHMxMzA3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRzMTMwN19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBkczEzMDcJCSpkczEzMDc7CiAJaW50CQkJZXJyID0gLUVOT0RFVjsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwogCWludAkJCXRtcDsKKwljb25zdCBzdHJ1Y3QgY2hpcF9kZXNjCSpjaGlwOworCXN0cnVjdCBpMmNfYWRhcHRlcgkqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CiAKLQlpZiAoIShkczEzMDcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMzA3KSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKKwljaGlwID0gZmluZF9jaGlwKGNsaWVudC0+bmFtZSk7CisJaWYgKCFjaGlwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5rbm93biBjaGlwIHR5cGUgJyVzJ1xuIiwKKwkJCQljbGllbnQtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQljbGllbnQgPSAmZHMxMzA3LT5jbGllbnQ7Ci0JY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwotCWNsaWVudC0+ZHJpdmVyID0gJmRzMTMwN19kcml2ZXI7Ci0JY2xpZW50LT5mbGFncyA9IDA7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLAorCQkJSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBKSkKKwkJcmV0dXJuIC1FSU87CiAKKwlpZiAoIShkczEzMDcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMzA3KSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRzMTMwNy0+Y2xpZW50ID0gY2xpZW50OwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRzMTMwNyk7CiAKIAlkczEzMDctPm1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOwpAQCAtMjE2LDE0ICsyNzksMTYgQEAKIAlkczEzMDctPm1zZ1sxXS5sZW4gPSBzaXplb2YoZHMxMzA3LT5yZWdzKTsKIAlkczEzMDctPm1zZ1sxXS5idWYgPSBkczEzMDctPnJlZ3M7CiAKLQkvKiBIQUNLOiAiZm9yY2UiIGltcGxpZXMgIm5lZWRzIGRzMTMzNy1zdHlsZS1vc2NpbGxhdG9yIHNldHVwIiAqLwotCWlmIChraW5kID49IDApIHsKLQkJZHMxMzA3LT50eXBlID0gZHNfMTMzNzsKKwlkczEzMDctPnR5cGUgPSBjaGlwLT50eXBlOwogCisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzMzc6CisJY2FzZSBkc18xMzM5OgogCQlkczEzMDctPnJlZ19hZGRyID0gRFMxMzM3X1JFR19DT05UUk9MOwogCQlkczEzMDctPm1zZ1sxXS5sZW4gPSAyOwogCi0JCXRtcCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKKwkJLyogZ2V0IHJlZ2lzdGVycyB0aGF0IHRoZSAicnRjIiByZWFkIGJlbG93IHdvbid0IHJlYWQuLi4gKi8KKwkJdG1wID0gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKIAkJaWYgKHRtcCAhPSAyKSB7CiAJCQlwcl9kZWJ1ZygicmVhZCBlcnJvciAlZFxuIiwgdG1wKTsKIAkJCWVyciA9IC1FSU87CkBAIC0yMzMsMTkgKzI5OCwyNiBAQAogCQlkczEzMDctPnJlZ19hZGRyID0gMDsKIAkJZHMxMzA3LT5tc2dbMV0ubGVuID0gc2l6ZW9mKGRzMTMwNy0+cmVncyk7CiAKLQkJLyogb3NjaWxsYXRvciBpcyBvZmY7IG5lZWQgdG8gdHVybiBpdCBvbiAqLwotCQlpZiAoKGRzMTMwNy0+cmVnc1swXSAmIERTMTMzN19CSVRfbkVPU0MpCi0JCQkJfHwgKGRzMTMwNy0+cmVnc1sxXSAmIERTMTMzN19CSVRfT1NGKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJubyBkczEzMzcgb3NjaWxsYXRvciBjb2RlXG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOworCQkvKiBvc2NpbGxhdG9yIG9mZj8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLworCQlpZiAoZHMxMzA3LT5yZWdzWzBdICYgRFMxMzM3X0JJVF9uRU9TQykKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMzdfUkVHX0NPTlRST0wsCisJCQkJZHMxMzA3LT5yZWdzWzBdICYgfkRTMTMzN19CSVRfbkVPU0MpOworCisJCS8qIG9zY2lsbGF0b3IgZmF1bHQ/ICBjbGVhciBmbGFnLCBhbmQgd2FybiAqLworCQlpZiAoZHMxMzA3LT5yZWdzWzFdICYgRFMxMzM3X0JJVF9PU0YpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMzdfUkVHX1NUQVRVUywKKwkJCQlkczEzMDctPnJlZ3NbMV0gJiB+RFMxMzM3X0JJVF9PU0YpOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKIAkJfQotCX0gZWxzZQotCQlkczEzMDctPnR5cGUgPSBkc18xMzA3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIHJlYWRfcnRjOgogCS8qIHJlYWQgUlRDIHJlZ2lzdGVycyAqLwogCi0JdG1wID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCXRtcCA9IGkyY190cmFuc2ZlcihhZGFwdGVyLCBkczEzMDctPm1zZywgMik7CiAJaWYgKHRtcCAhPSAyKSB7CiAJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOwogCQllcnIgPSAtRUlPOwpAQCAtMjU3LDExOSArMzI5LDEyMSBAQAogCSAqIHN0aWxsIGEgZmV3IHZhbHVlcyB0aGF0IGFyZSBjbGVhcmx5IG91dC1vZi1yYW5nZS4KIAkgKi8KIAl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19TRUNTXTsKLQlpZiAodG1wICYgRFMxMzA3X0JJVF9DSCkgewotCQlpZiAoZHMxMzA3LT50eXBlICYmIGRzMTMwNy0+dHlwZSAhPSBkc18xMzA3KSB7Ci0JCQlwcl9kZWJ1Zygibm90IGEgZHMxMzA3P1xuIik7Ci0JCQlnb3RvIGV4aXRfZnJlZTsKLQkJfQotCQlkczEzMDctPnR5cGUgPSBkc18xMzA3OwotCi0JCS8qIHRoaXMgcGFydGlhbCBpbml0aWFsaXphdGlvbiBzaG91bGQgd29yayBmb3IgZHMxMzA3LAotCQkgKiBkczEzMzgsIGRzMTM0MCwgc3QgbTQxdDAwLCBhbmQgbW9yZS4KKwlzd2l0Y2ggKGRzMTMwNy0+dHlwZSkgeworCWNhc2UgZHNfMTM0MDoKKwkJLyogRklYTUUgcmVhZCByZWdpc3RlciB3aXRoIERTMTM0MF9CSVRfT1NGLCB1c2UgdGhhdCB0bworCQkgKiB0cmlnZ2VyIHRoZSAic2V0IHRpbWUiIHdhcm5pbmcgKCphZnRlciogcmVzdGFydGluZyB0aGUKKwkJICogb3NjaWxsYXRvciEpIGluc3RlYWQgb2YgdGhpcyB3ZWFrZXIgZHMxMzA3L200MXQwMCB0ZXN0LgogCQkgKi8KLQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAib3NjaWxsYXRvciBzdGFydGVkOyBTRVQgVElNRSFcbiIpOwotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgMCwgMCk7Ci0JCWdvdG8gcmVhZF9ydGM7CisJY2FzZSBkc18xMzA3OgorCWNhc2UgbTQxdDAwOgorCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKHRtcCAmIERTMTMwN19CSVRfQ0gpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX1NFQ1MsIDApOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwkJCWdvdG8gcmVhZF9ydGM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkc18xMzM4OgorCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKHRtcCAmIERTMTMwN19CSVRfQ0gpCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzA3X1JFR19TRUNTLCAwKTsKKworCQkvKiBvc2NpbGxhdG9yIGZhdWx0PyAgY2xlYXIgZmxhZywgYW5kIHdhcm4gKi8KKwkJaWYgKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0NPTlRST0xdICYgRFMxMzM4X0JJVF9PU0YpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX0NPTlRST0wsCisJCQkJCWRzMTMwNy0+cmVnc1tEUzEzMzdfUkVHX0NPTlRST0xdCisJCQkJCSYgfkRTMTMzOF9CSVRfT1NGKTsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlNFVCBUSU1FIVxuIik7CisJCQlnb3RvIHJlYWRfcnRjOworCQl9CisJCWJyZWFrOworCWNhc2UgZHNfMTMzNzoKKwljYXNlIGRzXzEzMzk6CisJCWJyZWFrOwogCX0KKworCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdOwogCXRtcCA9IEJDRDJCSU4odG1wICYgMHg3Zik7CiAJaWYgKHRtcCA+IDYwKQotCQlnb3RvIGV4aXRfZnJlZTsKKwkJZ290byBleGl0X2JhZDsKIAl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01JTl0gJiAweDdmKTsKIAlpZiAodG1wID4gNjApCi0JCWdvdG8gZXhpdF9mcmVlOworCQlnb3RvIGV4aXRfYmFkOwogCiAJdG1wID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NREFZXSAmIDB4M2YpOwogCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAzMSkKLQkJZ290byBleGl0X2ZyZWU7CisJCWdvdG8gZXhpdF9iYWQ7CiAKIAl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01PTlRIXSAmIDB4MWYpOwogCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAxMikKLQkJZ290byBleGl0X2ZyZWU7CisJCWdvdG8gZXhpdF9iYWQ7CiAKLQkvKiBmb3JjZSBpbnRvIGluIDI0IGhvdXIgbW9kZSAobW9zdCBjaGlwcykgb3IKLQkgKiBkaXNhYmxlIGNlbnR1cnkgYml0IChkczEzNDApCi0JICovCiAJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl07Ci0JaWYgKHRtcCAmICgxIDw8IDYpKSB7Ci0JCWlmICh0bXAgJiAoMSA8PCA1KSkKLQkJCXRtcCA9IEJDRDJCSU4odG1wICYgMHgxZikgKyAxMjsKLQkJZWxzZQotCQkJdG1wID0gQkNEMkJJTih0bXApOworCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSBkc18xMzQwOgorCWNhc2UgbTQxdDAwOgorCQkvKiBOT1RFOiBpZ25vcmVzIGNlbnR1cnkgYml0czsgZml4IGJlZm9yZSBkZXBsb3lpbmcKKwkJICogc3lzdGVtcyB0aGF0IHdpbGwgcnVuIHRocm91Z2ggeWVhciAyMTAwLgorCQkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCEodG1wICYgRFMxMzA3X0JJVF8xMkhSKSkKKwkJCWJyZWFrOworCisJCS8qIEJlIHN1cmUgd2UncmUgaW4gMjQgaG91ciBtb2RlLiAgTXVsdGktbWFzdGVyIHN5c3RlbXMKKwkJICogdGFrZSBub3RlLi4uCisJCSAqLworCQl0bXAgPSBCQ0QyQklOKHRtcCAmIDB4MWYpOworCQlpZiAodG1wID09IDEyKQorCQkJdG1wID0gMDsKKwkJaWYgKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0hPVVJdICYgRFMxMzA3X0JJVF9QTSkKKwkJCXRtcCArPSAxMjsKIAkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJRFMxMzA3X1JFR19IT1VSLAogCQkJCUJJTjJCQ0QodG1wKSk7CiAJfQogCi0JLyogRklYTUUgY2hpcHMgbGlrZSAxMzM3IGNhbiBnZW5lcmF0ZSBhbGFybSBpcnFzIHRvbzsgdGhvc2UgYXJlCi0JICogd29ydGggZXhwb3NpbmcgdGhyb3VnaCB0aGUgQVBJIChlc3BlY2lhbGx5IHdoZW4gdGhlIGlycSBpcwotCSAqIHdha2V1cC1jYXBhYmxlKS4KLQkgKi8KLQotCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7Ci0JY2FzZSB1bmtub3duOgotCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgInVua25vd24iLCBJMkNfTkFNRV9TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSBkc18xMzA3OgotCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgImRzMTMwNyIsIEkyQ19OQU1FX1NJWkUpOwotCQlicmVhazsKLQljYXNlIGRzXzEzMzc6Ci0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAiZHMxMzM3IiwgSTJDX05BTUVfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgZHNfMTM0MDoKLQkJc3RybGNweShjbGllbnQtPm5hbWUsICJkczEzNDAiLCBJMkNfTkFNRV9TSVpFKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCWdvdG8gZXhpdF9mcmVlOwotCiAJZHMxMzA3LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGNsaWVudC0+bmFtZSwgJmNsaWVudC0+ZGV2LAogCQkJCSZkczEzeHhfcnRjX29wcywgVEhJU19NT0RVTEUpOwogCWlmIChJU19FUlIoZHMxMzA3LT5ydGMpKSB7CiAJCWVyciA9IFBUUl9FUlIoZHMxMzA3LT5ydGMpOwogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCSJ1bmFibGUgdG8gcmVnaXN0ZXIgdGhlIGNsYXNzIGRldmljZVxuIik7Ci0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9mcmVlOwogCX0KIAogCXJldHVybiAwOwogCi1leGl0X2RldGFjaDoKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworZXhpdF9iYWQ6CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSJib2d1cyByZWdpc3RlciIsCisJCQlkczEzMDctPnJlZ3NbMF0sIGRzMTMwNy0+cmVnc1sxXSwKKwkJCWRzMTMwNy0+cmVnc1syXSwgZHMxMzA3LT5yZWdzWzNdLAorCQkJZHMxMzA3LT5yZWdzWzRdLCBkczEzMDctPnJlZ3NbNV0sCisJCQlkczEzMDctPnJlZ3NbNl0pOworCiBleGl0X2ZyZWU6CiAJa2ZyZWUoZHMxMzA3KTsKLWV4aXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQKLWRzMTMwN19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzMDdfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGRzMTMwN19kZXRlY3QpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzMDdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWludAkJZXJyOwogCXN0cnVjdCBkczEzMDcJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKGRzMTMwNy0+cnRjKTsKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQotCQlyZXR1cm4gZXJyOwogCWtmcmVlKGRzMTMwNyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczEzMDdfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gImRzMTMwNyIsCisJCS5uYW1lCT0gInJ0Yy1kczEzMDciLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAotCS5hdHRhY2hfYWRhcHRlcgk9IGRzMTMwN19hdHRhY2hfYWRhcHRlciwKLQkuZGV0YWNoX2NsaWVudAk9IF9fZGV2ZXhpdF9wKGRzMTMwN19kZXRhY2hfY2xpZW50KSwKKwkucHJvYmUJCT0gZHMxMzA3X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHMxMzA3X3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBkczEzMDdfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jIGIvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzRhODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMKQEAgLTAsMCArMSw5MTcgQEAKKy8qCisgKiBJMkMgY2xpZW50L2RyaXZlciBmb3IgdGhlIFNUIE00MVQ4MCBmYW1pbHkgb2YgaTJjIHJ0YyBjaGlwcy4KKyAqCisgKiBBdXRob3I6IEFsZXhhbmRlciBCaWdnYSA8YWJAbXljYWJsZS5kZT4KKyAqCisgKiBCYXNlZCBvbiBtNDF0MDAuYyBieSBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA2IChjKSBteWNhYmxlIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2VuZGlmCisKKyNkZWZpbmUgTTQxVDgwX1JFR19TU0VDCTAKKyNkZWZpbmUgTTQxVDgwX1JFR19TRUMJMQorI2RlZmluZSBNNDFUODBfUkVHX01JTgkyCisjZGVmaW5lIE00MVQ4MF9SRUdfSE9VUgkzCisjZGVmaW5lIE00MVQ4MF9SRUdfV0RBWQk0CisjZGVmaW5lIE00MVQ4MF9SRUdfREFZCTUKKyNkZWZpbmUgTTQxVDgwX1JFR19NT04JNgorI2RlZmluZSBNNDFUODBfUkVHX1lFQVIJNworI2RlZmluZSBNNDFUODBfUkVHX0FMQVJNX01PTgkweGEKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9EQVkJMHhiCisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fSE9VUgkweGMKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9NSU4JMHhkCisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fU0VDCTB4ZQorI2RlZmluZSBNNDFUODBfUkVHX0ZMQUdTCTB4ZgorI2RlZmluZSBNNDFUODBfUkVHX1NRVwkweDEzCisKKyNkZWZpbmUgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFCShNNDFUODBfUkVHX1lFQVIgKyAxKQorI2RlZmluZSBNNDFUODBfQUxBUk1fUkVHX1NJWkUJXAorCShNNDFUODBfUkVHX0FMQVJNX1NFQyArIDEgLSBNNDFUODBfUkVHX0FMQVJNX01PTikKKworI2RlZmluZSBNNDFUODBfU0VDX1NUCQkoMSA8PCA3KQkvKiBTVDogU3RvcCBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMTU9OX0FGRQkoMSA8PCA3KQkvKiBBRkU6IEFGIEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMTU9OX1NRV0UJKDEgPDwgNikJLyogU1FXRTogU1FXIEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMSE9VUl9IVAkoMSA8PCA2KQkvKiBIVDogSGFsdCBVcGRhdGUgQml0ICovCisjZGVmaW5lIE00MVQ4MF9GTEFHU19BRgkJKDEgPDwgNikJLyogQUY6IEFsYXJtIEZsYWcgQml0ICovCisjZGVmaW5lIE00MVQ4MF9GTEFHU19CQVRUX0xPVwkoMSA8PCA0KQkvKiBCTDogQmF0dGVyeSBMb3cgQml0ICovCisKKyNkZWZpbmUgTTQxVDgwX0ZFQVRVUkVfSFQJKDEgPDwgMCkKKyNkZWZpbmUgTTQxVDgwX0ZFQVRVUkVfQkwJKDEgPDwgMSkKKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4wNSIKKworc3RydWN0IG00MXQ4MF9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggZmVhdHVyZXM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG00MXQ4MF9jaGlwX2luZm8gbTQxdDgwX2NoaXBfaW5mb190YmxbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODAiLAorCQkuZmVhdHVyZXMJPSAwLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxdDgxIiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODFzIiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXQ4MiIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODMiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxc3Q4NCIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDFzdDg1IiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXN0ODciLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCit9OworCitzdHJ1Y3QgbTQxdDgwX2RhdGEgeworCWNvbnN0IHN0cnVjdCBtNDF0ODBfY2hpcF9pbmZvICpjaGlwOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Cit9OworCitzdGF0aWMgaW50IG00MXQ4MF9nZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgICBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXU4IGJ1ZltNNDFUODBfREFURVRJTUVfUkVHX1NJWkVdLCBkdF9hZGRyWzFdID0geyBNNDFUODBfUkVHX1NFQyB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gZHRfYWRkciwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSBNNDFUODBfREFURVRJTUVfUkVHX1NJWkUgLSBNNDFUODBfUkVHX1NFQywKKwkJCS5idWYJPSBidWYgKyBNNDFUODBfUkVHX1NFQywKKwkJfSwKKwl9OworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl0bS0+dG1fc2VjID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19TRUNdICYgMHg3Zik7CisJdG0tPnRtX21pbiA9IEJDRDJCSU4oYnVmW000MVQ4MF9SRUdfTUlOXSAmIDB4N2YpOworCXRtLT50bV9ob3VyID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19IT1VSXSAmIDB4M2YpOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19EQVldICYgMHgzZik7CisJdG0tPnRtX3dkYXkgPSBidWZbTTQxVDgwX1JFR19XREFZXSAmIDB4MDc7CisJdG0tPnRtX21vbiA9IEJDRDJCSU4oYnVmW000MVQ4MF9SRUdfTU9OXSAmIDB4MWYpIC0gMTsKKworCS8qIGFzc3VtZSAyMFlZIG5vdCAxOVlZLCBhbmQgaWdub3JlIHRoZSBDZW50dXJ5IEJpdCAqLworCXRtLT50bV95ZWFyID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19ZRUFSXSkgKyAxMDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldHMgdGhlIGdpdmVuIGRhdGUgYW5kIHRpbWUgdG8gdGhlIHJlYWwgdGltZSBjbG9jay4gKi8KK3N0YXRpYyBpbnQgbTQxdDgwX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXU4IHdidWZbMSArIE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRV07CisJdTggKmJ1ZiA9ICZ3YnVmWzFdOworCXU4IGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfU0VDIH07CisJc3RydWN0IGkyY19tc2cgbXNnc19pbltdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRSAtIE00MVQ4MF9SRUdfU0VDLAorCQkJLmJ1Zgk9IGJ1ZiArIE00MVQ4MF9SRUdfU0VDLAorCQl9LAorCX07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSArIE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRSwKKwkJCS5idWYJPSB3YnVmLAorCQkgfSwKKwl9OworCisJLyogUmVhZCBjdXJyZW50IHJlZyB2YWx1ZXMgaW50byBidWZbMS4uN10gKi8KKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnc19pbiwgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXdidWZbMF0gPSAwOyAvKiBvZmZzZXQgaW50byBydGMncyByZWdzICovCisJLyogTWVyZ2UgdGltZS1kYXRhIGFuZCByZWdpc3RlciBmbGFncyBpbnRvIGJ1ZlswLi43XSAqLworCWJ1ZltNNDFUODBfUkVHX1NTRUNdID0gMDsKKwlidWZbTTQxVDgwX1JFR19TRUNdID0KKwkJQklOMkJDRCh0bS0+dG1fc2VjKSB8IChidWZbTTQxVDgwX1JFR19TRUNdICYgfjB4N2YpOworCWJ1ZltNNDFUODBfUkVHX01JTl0gPQorCQlCSU4yQkNEKHRtLT50bV9taW4pIHwgKGJ1ZltNNDFUODBfUkVHX01JTl0gJiB+MHg3Zik7CisJYnVmW000MVQ4MF9SRUdfSE9VUl0gPQorCQlCSU4yQkNEKHRtLT50bV9ob3VyKSB8IChidWZbTTQxVDgwX1JFR19IT1VSXSAmIH4weDNmKSA7CisJYnVmW000MVQ4MF9SRUdfV0RBWV0gPQorCQkodG0tPnRtX3dkYXkgJiAweDA3KSB8IChidWZbTTQxVDgwX1JFR19XREFZXSAmIH4weDA3KTsKKwlidWZbTTQxVDgwX1JFR19EQVldID0KKwkJQklOMkJDRCh0bS0+dG1fbWRheSkgfCAoYnVmW000MVQ4MF9SRUdfREFZXSAmIH4weDNmKTsKKwlidWZbTTQxVDgwX1JFR19NT05dID0KKwkJQklOMkJDRCh0bS0+dG1fbW9uICsgMSkgfCAoYnVmW000MVQ4MF9SRUdfTU9OXSAmIH4weDFmKTsKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSAqLworCWJ1ZltNNDFUODBfUkVHX1lFQVJdID0gQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCk7CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMSkgIT0gMSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQ19NT0RVTEUpCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVnOworCisJaWYgKGNsaWVudGRhdGEtPmNoaXAtPmZlYXR1cmVzICYgTTQxVDgwX0ZFQVRVUkVfQkwpIHsKKwkJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19GTEFHUyk7CisJCXNlcV9wcmludGYoc2VxLCAiYmF0dGVyeVx0XHQ6ICVzXG4iLAorCQkJICAgKHJlZyAmIE00MVQ4MF9GTEFHU19CQVRUX0xPVykgPyAiZXhoYXVzdGVkIiA6ICJvayIpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIG00MXQ4MF9ydGNfcHJvYyBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBtNDF0ODBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIG00MXQ4MF9nZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIG00MXQ4MF9zZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfSU5URl9ERVYpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX0RFVl9NT0RVTEUpCitzdGF0aWMgaW50CittNDF0ODBfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CisJY2FzZSBSVENfQUlFX09OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04pOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJcmMgJj0gfk00MVQ4MF9BTE1PTl9BRkU7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoKKwkJcmMgfD0gTTQxVDgwX0FMTU9OX0FGRTsKKwkJYnJlYWs7CisJfQorCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sIHJjKSA8IDApCisJCWdvdG8gZXJyOworCXJldHVybiAwOworZXJyOgorCXJldHVybiAtRUlPOworfQorI2Vsc2UKKyNkZWZpbmUJbTQxdDgwX3J0Y19pb2N0bCBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBtNDF0ODBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdTggd2J1ZlsxICsgTTQxVDgwX0FMQVJNX1JFR19TSVpFXTsKKwl1OCAqYnVmID0gJndidWZbMV07CisJdTggKnJlZyA9IGJ1ZiAtIE00MVQ4MF9SRUdfQUxBUk1fTU9OOworCXU4IGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfQUxBUk1fTU9OIH07CisJc3RydWN0IGkyY19tc2cgbXNnc19pbltdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9BTEFSTV9SRUdfU0laRSwKKwkJCS5idWYJPSBidWYsCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxICsgTTQxVDgwX0FMQVJNX1JFR19TSVpFLAorCQkJLmJ1Zgk9IHdidWYsCisJCSB9LAorCX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnc19pbiwgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dICY9IH4oMHgxZiB8IE00MVQ4MF9BTE1PTl9BRkUpOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gPSAwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0hPVVJdICY9IH4oMHgzZiB8IDB4ODApOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gPSAwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX1NFQ10gPSAwOworCisJd2J1ZlswXSA9IE00MVQ4MF9SRUdfQUxBUk1fTU9OOyAvKiBvZmZzZXQgaW50byBydGMncyByZWdzICovCisJcmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSB8PSB0LT50aW1lLnRtX3NlYyA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX3NlYykgOiAweDgwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gfD0gdC0+dGltZS50bV9taW4gPj0gMCA/CisJCUJJTjJCQ0QodC0+dGltZS50bV9taW4pIDogMHg4MDsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9IT1VSXSB8PSB0LT50aW1lLnRtX2hvdXIgPj0gMCA/CisJCUJJTjJCQ0QodC0+dGltZS50bV9ob3VyKSA6IDB4ODA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSB8PSB0LT50aW1lLnRtX21kYXkgPj0gMCA/CisJCUJJTjJCQ0QodC0+dGltZS50bV9tZGF5KSA6IDB4ODA7CisJaWYgKHQtPnRpbWUudG1fbW9uID49IDApCisJCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gfD0gQklOMkJDRCh0LT50aW1lLnRtX21vbiArIDEpOworCWVsc2UKKwkJcmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSB8PSAweDQwOworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDEpICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0ZSBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICh0LT5lbmFibGVkKSB7CisJCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gfD0gTTQxVDgwX0FMTU9OX0FGRTsKKwkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTiwKKwkJCQkJICAgICAgcmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSkgPCAwKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndyaXRlIGVycm9yXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdTggYnVmW000MVQ4MF9BTEFSTV9SRUdfU0laRSArIDFdOyAvKiBhbGwgYWxhcm0gcmVncyBhbmQgZmxhZ3MgKi8KKwl1OCBkdF9hZGRyWzFdID0geyBNNDFUODBfUkVHX0FMQVJNX01PTiB9OworCXU4ICpyZWcgPSBidWYgLSBNNDFUODBfUkVHX0FMQVJNX01PTjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGR0X2FkZHIsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gTTQxVDgwX0FMQVJNX1JFR19TSVpFICsgMSwKKwkJCS5idWYJPSBidWYsCisJCX0sCisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXQtPnRpbWUudG1fc2VjID0gLTE7CisJdC0+dGltZS50bV9taW4gPSAtMTsKKwl0LT50aW1lLnRtX2hvdXIgPSAtMTsKKwl0LT50aW1lLnRtX21kYXkgPSAtMTsKKwl0LT50aW1lLnRtX21vbiA9IC0xOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX1NFQ10gJiAweDgwKSkKKwkJdC0+dGltZS50bV9zZWMgPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX1NFQ10gJiAweDdmKTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9NSU5dICYgMHg4MCkpCisJCXQtPnRpbWUudG1fbWluID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9NSU5dICYgMHg3Zik7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fSE9VUl0gJiAweDgwKSkKKwkJdC0+dGltZS50bV9ob3VyID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9IT1VSXSAmIDB4M2YpOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gJiAweDgwKSkKKwkJdC0+dGltZS50bV9tZGF5ID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldICYgMHgzZik7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSAmIDB4NDApKQorCQl0LT50aW1lLnRtX21vbiA9IEJDRDJCSU4ocmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSAmIDB4MWYpIC0gMTsKKwl0LT50aW1lLnRtX3llYXIgPSAtMTsKKwl0LT50aW1lLnRtX3dkYXkgPSAtMTsKKwl0LT50aW1lLnRtX3lkYXkgPSAtMTsKKwl0LT50aW1lLnRtX2lzZHN0ID0gLTE7CisJdC0+ZW5hYmxlZCA9ICEhKHJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gJiBNNDFUODBfQUxNT05fQUZFKTsKKwl0LT5wZW5kaW5nID0gISEocmVnW000MVQ4MF9SRUdfRkxBR1NdICYgTTQxVDgwX0ZMQUdTX0FGKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00MXQ4MF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSBtNDF0ODBfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUgPSBtNDF0ODBfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gbTQxdDgwX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBtNDF0ODBfcnRjX3NldF9hbGFybSwKKwkucHJvYyA9IG00MXQ4MF9ydGNfcHJvYywKKwkuaW9jdGwgPSBtNDF0ODBfcnRjX2lvY3RsLAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9TWVNGU19NT0RVTEUpCitzdGF0aWMgc3NpemVfdCBtNDF0ODBfc3lzZnNfc2hvd19mbGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCB2YWw7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0ZMQUdTKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJSN4XG4iLCB2YWwpOworfQorc3RhdGljIERFVklDRV9BVFRSKGZsYWdzLCBTX0lSVUdPLCBtNDF0ODBfc3lzZnNfc2hvd19mbGFncywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IG00MXQ4MF9zeXNmc19zaG93X3Nxd2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlpbnQgdmFsOworCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TUVcpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwl2YWwgPSAodmFsID4+IDQpICYgMHhmOworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXZhbCA9IDMyNzY4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWwgPSAzMjc2OCA+PiB2YWw7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorc3RhdGljIHNzaXplX3QgbTQxdDgwX3N5c2ZzX3NldF9zcXdmcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCBhbG1vbiwgc3F3OworCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJaWYgKHZhbCkgeworCQlpZiAoIWlzX3Bvd2VyX29mXzIodmFsKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl2YWwgPSBpbG9nMih2YWwpOworCQlpZiAodmFsID09IDE1KQorCQkJdmFsID0gMTsKKwkJZWxzZSBpZiAodmFsIDwgMTQpCisJCQl2YWwgPSAxNSAtIHZhbDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGRpc2FibGUgU1FXLCBzZXQgU1FXIGZyZXF1ZW5jeSAmIHJlLWVuYWJsZSAqLworCWFsbW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04pOworCWlmIChhbG1vbiA8IDApCisJCXJldHVybiAtRUlPOworCXNxdyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfU1FXKTsKKwlpZiAoc3F3IDwgMCkKKwkJcmV0dXJuIC1FSU87CisJc3F3ID0gKHNxdyAmIDB4MGYpIHwgKHZhbCA8PCA0KTsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfQUxBUk1fTU9OLAorCQkJCSAgICAgIGFsbW9uICYgfk00MVQ4MF9BTE1PTl9TUVdFKSA8IDAgfHwKKwkgICAgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfU1FXLCBzcXcpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHZhbCAmJiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sCisJCQkJCSAgICAgYWxtb24gfCBNNDFUODBfQUxNT05fU1FXRSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3F3ZnJlcSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG00MXQ4MF9zeXNmc19zaG93X3Nxd2ZyZXEsIG00MXQ4MF9zeXNmc19zZXRfc3F3ZnJlcSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1tdID0geworCSZkZXZfYXR0cl9mbGFncy5hdHRyLAorCSZkZXZfYXR0cl9zcXdmcmVxLmF0dHIsCisJTlVMTCwKK307CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dyb3VwID0geworCS5hdHRycyA9IGF0dHJzLAorfTsKKworc3RhdGljIGludCBtNDF0ODBfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmF0dHJfZ3JvdXApOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgbTQxdDgwX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfTTQxVDgwX1dEVAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdhdGNoZG9nIERyaXZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKnNhdmVfY2xpZW50OworCisvKiBEZWZhdWx0IG1hcmdpbiAqLworI2RlZmluZSBXRF9USU1PIDYwCQkvKiAxLi4zMSBzZWNvbmRzICovCisKK3N0YXRpYyBpbnQgd2R0X21hcmdpbiA9IFdEX1RJTU87Cittb2R1bGVfcGFyYW0od2R0X21hcmdpbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X21hcmdpbiwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcyAoZGVmYXVsdCA2MHMpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGludCBib290X2ZsYWc7CisKKy8qKgorICoJd2R0X3Bpbmc6CisgKgorICoJUmVsb2FkIGNvdW50ZXIgb25lIHdpdGggdGhlIHdhdGNoZG9nIHRpbWVvdXQuIFdlIGRvbid0IGJvdGhlciByZWxvYWRpbmcKKyAqCXRoZSBjYXNjYWRlIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdkdF9waW5nKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBpMmNfZGF0YVsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzMVsxXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMiwKKwkJCS5idWYJPSBpMmNfZGF0YSwKKwkJfSwKKwl9OworCWkyY19kYXRhWzBdID0gMHgwOTsJCS8qIHdhdGNoZG9nIHJlZ2lzdGVyICovCisKKwlpZiAod2R0X21hcmdpbiA+IDMxKQorCQlpMmNfZGF0YVsxXSA9ICh3ZHRfbWFyZ2luICYgMHhGQykgfCAweDgzOyAvKiByZXNvbHV0aW9uID0gNHMgKi8KKwllbHNlCisJCS8qCisJCSAqIFdEUyA9IDEgKDB4ODApLCBtdWxpdHBsaWVyID0gV0RfVElNTywgcmVzb2x1dGlvbiA9IDFzICgweDAyKQorCQkgKi8KKwkJaTJjX2RhdGFbMV0gPSB3ZHRfbWFyZ2luPDwyIHwgMHg4MjsKKworCWkyY190cmFuc2ZlcihzYXZlX2NsaWVudC0+YWRhcHRlciwgbXNnczEsIDEpOworfQorCisvKioKKyAqCXdkdF9kaXNhYmxlOgorICoKKyAqCWRpc2FibGVzIHdhdGNoZG9nLgorICovCitzdGF0aWMgdm9pZCB3ZHRfZGlzYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgaTJjX2RhdGFbMl0sIGkyY19idWZbMHgxMF07CisJc3RydWN0IGkyY19tc2cgbXNnczBbMl0gPSB7CisJCXsKKwkJCS5hZGRyCT0gc2F2ZV9jbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gaTJjX2RhdGEsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gc2F2ZV9jbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGkyY19idWYsCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzMVsxXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMiwKKwkJCS5idWYJPSBpMmNfZGF0YSwKKwkJfSwKKwl9OworCisJaTJjX2RhdGFbMF0gPSAweDA5OworCWkyY190cmFuc2ZlcihzYXZlX2NsaWVudC0+YWRhcHRlciwgbXNnczAsIDIpOworCisJaTJjX2RhdGFbMF0gPSAweDA5OworCWkyY19kYXRhWzFdID0gMHgwMDsKKwlpMmNfdHJhbnNmZXIoc2F2ZV9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MxLCAxKTsKK30KKworLyoqCisgKgl3ZHRfd3JpdGU6CisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIHdhdGNoZG9nCisgKglAYnVmOiBidWZmZXIgdG8gd3JpdGUgKHVudXNlZCBhcyBkYXRhIGRvZXMgbm90IG1hdHRlciBoZXJlCisgKglAY291bnQ6IGNvdW50IG9mIGJ5dGVzCisgKglAcHBvczogcG9pbnRlciB0byB0aGUgcG9zaXRpb24gdG8gd3JpdGUuIE5vIHNlZWtzIGFsbG93ZWQKKyAqCisgKglBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgc2lnbmFsLiBBbnkKKyAqCXdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2Ugd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KKyAqLworc3RhdGljIHNzaXplX3Qgd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCS8qICBDYW4ndCBzZWVrIChwd3JpdGUpIG9uIHRoaXMgZGV2aWNlCisJaWYgKHBwb3MgIT0gJmZpbGUtPmZfcG9zKQorCXJldHVybiAtRVNQSVBFOworCSovCisJaWYgKGNvdW50KSB7CisJCXdkdF9waW5nKCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd2R0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRfaW9jdGw6CisgKglAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKglAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKglAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICoJVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqCWFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuIFdlIG9ubHkgYWN0dWFsbHkgdXNlZnVsbHkgc3VwcG9ydAorICoJcXVlcnlpbmcgY2FwYWJpbGl0aWVzIGFuZCBjdXJyZW50IHN0YXR1cy4KKyAqLworc3RhdGljIGludCB3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld19tYXJnaW4sIHJ2OworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9QT1dFUlVOREVSIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCQlXRElPRl9TRVRUSU1FT1VULAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJNNDFUODAgV1REIgorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICopYXJnLCAmaWRlbnQsCisJCQkJICAgIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcihib290X2ZsYWcsIChpbnQgX191c2VyICopYXJnKTsKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJd2R0X3BpbmcoKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIobmV3X21hcmdpbiwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCS8qIEFyYml0cmFyeSwgY2FuJ3QgZmluZCB0aGUgY2FyZCdzIGxpbWl0cyAqLworCQlpZiAobmV3X21hcmdpbiA8IDEgfHwgbmV3X21hcmdpbiA+IDEyNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQl3ZHRfbWFyZ2luID0gbmV3X21hcmdpbjsKKwkJd2R0X3BpbmcoKTsKKwkJLyogRmFsbCAqLworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKHdkdF9tYXJnaW4sIChpbnQgX191c2VyICopYXJnKTsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZydiwgKGludCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChydiAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgInJ0Yy1tNDF0ODA6IGRpc2FibGUgd2F0Y2hkb2dcbiIpOworCQkJd2R0X2Rpc2FibGUoKTsKKwkJfQorCisJCWlmIChydiAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAicnRjLW00MXQ4MDogZW5hYmxlIHdhdGNoZG9nXG4iKTsKKwkJCXdkdF9waW5nKCk7CisJCX0KKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKKy8qKgorICoJd2R0X29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoTUlOT1IoaW5vZGUtPmlfcmRldikgPT0gV0FUQ0hET0dfTUlOT1IpIHsKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCS8qCisJCSAqCUFjdGl2YXRlCisJCSAqLworCQl3ZHRfaXNfb3BlbiA9IDE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqCisgKgl3ZHRfY2xvc2U6CisgKglAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKE1JTk9SKGlub2RlLT5pX3JkZXYpID09IFdBVENIRE9HX01JTk9SKQorCQljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglub3RpZnlfc3lzOgorICoJQHRoaXM6IG91ciBub3RpZmllciBibG9jaworICoJQGNvZGU6IHRoZSBldmVudCBiZWluZyByZXBvcnRlZAorICoJQHVudXNlZDogdW51c2VkCisgKgorICoJT3VyIG5vdGlmaWVyIGlzIGNhbGxlZCBvbiBzeXN0ZW0gc2h1dGRvd25zLiBXZSB3YW50IHRvIHR1cm4gdGhlIGNhcmQKKyAqCW9mZiBhdCByZWJvb3Qgb3RoZXJ3aXNlIHRoZSBtYWNoaW5lIHdpbGwgcmVib290IGFnYWluIGR1cmluZyBtZW1vcnkKKyAqCXRlc3Qgb3Igd29yc2UgeWV0IGR1cmluZyB0aGUgZm9sbG93aW5nIGZzY2suIFRoaXMgd291bGQgc3VjaywgaW4gZmFjdAorICoJdHJ1c3QgbWUgLSBpZiBpdCBoYXBwZW5zIGl0IGRvZXMgc3Vjay4KKyAqLworc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwkJCSAgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpCisJCS8qIERpc2FibGUgV2F0Y2hkb2cgKi8KKwkJd2R0X2Rpc2FibGUoKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5yZWFkCT0gd2R0X3JlYWQsCisJLmlvY3RsCT0gd2R0X2lvY3RsLAorCS53cml0ZQk9IHdkdF93cml0ZSwKKwkub3Blbgk9IHdkdF9vcGVuLAorCS5yZWxlYXNlID0gd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBjYXJkIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEcml2ZXIgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgbTQxdDgwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGksIHJjID0gMDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gTlVMTDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJY29uc3Qgc3RydWN0IG00MXQ4MF9jaGlwX2luZm8gKmNoaXA7CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gTlVMTDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMKKwkJCQkgICAgIHwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCSAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCWNoaXAgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG00MXQ4MF9jaGlwX2luZm9fdGJsKTsgaSsrKSB7CisJCWlmICghc3RyY21wKG00MXQ4MF9jaGlwX2luZm9fdGJsW2ldLm5hbWUsIGNsaWVudC0+bmFtZSkpIHsKKwkJCWNoaXAgPSAmbTQxdDgwX2NoaXBfaW5mb190YmxbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWNoaXApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBjbGllbnQtPm5hbWUpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwljbGllbnRkYXRhID0ga3phbGxvYyhzaXplb2YoKmNsaWVudGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudGRhdGEpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihjbGllbnQtPm5hbWUsICZjbGllbnQtPmRldiwKKwkJCQkgICZtNDF0ODBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlyYyA9IFBUUl9FUlIocnRjKTsKKwkJcnRjID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCWNsaWVudGRhdGEtPnJ0YyA9IHJ0YzsKKwljbGllbnRkYXRhLT5jaGlwID0gY2hpcDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjbGllbnRkYXRhKTsKKworCS8qIE1ha2Ugc3VyZSBIVCAoSGFsdCBVcGRhdGUpIGJpdCBpcyBjbGVhcmVkICovCisJcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX0hPVVIpOworCWlmIChyYyA8IDApCisJCWdvdG8gaHRfZXJyOworCisJaWYgKHJjICYgTTQxVDgwX0FMSE9VUl9IVCkgeworCQlpZiAoY2hpcC0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9IVCkgeworCQkJbTQxdDgwX2dldF9kYXRldGltZShjbGllbnQsICZ0bSk7CisJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJIVCBiaXQgd2FzIHNldCFcbiIpOworCQkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LAorCQkJCSAiUG93ZXIgRG93biBhdCAiCisJCQkJICIlMDRpLSUwMmktJTAyaSAlMDJpOiUwMmk6JTAyaVxuIiwKKwkJCQkgdG0udG1feWVhciArIDE5MDAsCisJCQkJIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksIHRtLnRtX2hvdXIsCisJCQkJIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKKwkJfQorCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgICAgIE00MVQ4MF9SRUdfQUxBUk1fSE9VUiwKKwkJCQkJICAgICAgcmMgJiB+TTQxVDgwX0FMSE9VUl9IVCkgPCAwKQorCQkJZ290byBodF9lcnI7CisJfQorCisJLyogTWFrZSBzdXJlIFNUIChzdG9wKSBiaXQgaXMgY2xlYXJlZCAqLworCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TRUMpOworCWlmIChyYyA8IDApCisJCWdvdG8gc3RfZXJyOworCisJaWYgKHJjICYgTTQxVDgwX1NFQ19TVCkgeworCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfU0VDLAorCQkJCQkgICAgICByYyAmIH5NNDFUODBfU0VDX1NUKSA8IDApCisJCQlnb3RvIHN0X2VycjsKKwl9CisKKwlyYyA9IG00MXQ4MF9zeXNmc19yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChyYykKKwkJZ290byBleGl0OworCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfTTQxVDgwX1dEVAorCWlmIChjaGlwLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX0hUKSB7CisJCXJjID0gbWlzY19yZWdpc3Rlcigmd2R0X2Rldik7CisJCWlmIChyYykKKwkJCWdvdG8gZXhpdDsKKwkJcmMgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJCWlmIChyYykgeworCQkJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfZGV2KTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlzYXZlX2NsaWVudCA9IGNsaWVudDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKKworc3RfZXJyOgorCXJjID0gLUVJTzsKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNhbid0IGNsZWFyIFNUIGJpdFxuIik7CisJZ290byBleGl0OworaHRfZXJyOgorCXJjID0gLUVJTzsKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNhbid0IGNsZWFyIEhUIGJpdFxuIik7CisJZ290byBleGl0OworCitleGl0OgorCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWtmcmVlKGNsaWVudGRhdGEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtNDF0ODBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNsaWVudGRhdGEtPnJ0YzsKKworI2lmZGVmIENPTkZJR19SVENfRFJWX000MVQ4MF9XRFQKKwlpZiAoY2xpZW50ZGF0YS0+Y2hpcC0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9IVCkgeworCQltaXNjX2RlcmVnaXN0ZXIoJndkdF9kZXYpOworCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwl9CisjZW5kaWYKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlrZnJlZShjbGllbnRkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbTQxdDgwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtNDF0ODAiLAorCX0sCisJLnByb2JlID0gbTQxdDgwX3Byb2JlLAorCS5yZW1vdmUgPSBtNDF0ODBfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTQxdDgwX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtNDF0ODBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG00MXQ4MF9ydGNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtNDF0ODBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxleGFuZGVyIEJpZ2dhIDxhYkBteWNhYmxlLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVCBNaWNyb2VsZWN0cm9uaWNzIE00MVQ4MCBzZXJpZXMgUlRDIEkyQyBDbGllbnQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KG00MXQ4MF9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChtNDF0ODBfcnRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jIGIvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjc1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBTVCBNNDhUNTkgUlRDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBBdXRob3I6IE1hcmsgWmhhbiA8cm9uZ2thaS56aGFuQHdpbmRyaXZlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjL200OHQ1OS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaWZuZGVmIE5PX0lSUQorI2RlZmluZSBOT19JUlEJKC0xKQorI2VuZGlmCisKKyNkZWZpbmUgTTQ4VDU5X1JFQUQocmVnKQlwZGF0YS0+cmVhZF9ieXRlKGRldiwgcmVnKQorI2RlZmluZSBNNDhUNTlfV1JJVEUodmFsLCByZWcpCXBkYXRhLT53cml0ZV9ieXRlKGRldiwgcmVnLCB2YWwpCisKKyNkZWZpbmUgTTQ4VDU5X1NFVF9CSVRTKG1hc2ssIHJlZykJXAorCU00OFQ1OV9XUklURSgoTTQ4VDU5X1JFQUQocmVnKSB8IChtYXNrKSksIChyZWcpKQorI2RlZmluZSBNNDhUNTlfQ0xFQVJfQklUUyhtYXNrLCByZWcpCVwKKwlNNDhUNTlfV1JJVEUoKE00OFQ1OV9SRUFEKHJlZykgJiB+KG1hc2spKSwgKHJlZykpCisKK3N0cnVjdCBtNDh0NTlfcHJpdmF0ZSB7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7IC8qIGlvbWVtIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3BpbmxvY2tfdCBsb2NrOyAvKiBzZXJpYWxpemUgdGhlIE5WUkFNIGFuZCBSVEMgYWNjZXNzICovCit9OworCisvKgorICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBhY2Nlc3MgbWV0aG9kIHdoZW4gdGhlIGNoaXAgaXMgbWVtb3J5LW1hcHBlZAorICovCitzdGF0aWMgdm9pZAorbTQ4dDU5X21lbV93cml0ZWIoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzLCB1OCB2YWwpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl3cml0ZWIodmFsLCBtNDh0NTktPmlvYWRkcitvZnMpOworfQorCitzdGF0aWMgdTgKK200OHQ1OV9tZW1fcmVhZGIoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIHJlYWRiKG00OHQ1OS0+aW9hZGRyK29mcyk7Cit9CisKKy8qCisgKiBOT1RFOiBNNDhUNTkgb25seSB1c2VzIEJDRCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCS8qIElzc3VlIHRoZSBSRUFEIGNvbW1hbmQgKi8KKwlNNDhUNTlfU0VUX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCisJdG0tPnRtX3llYXIJPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9ZRUFSKSk7CisJLyogdG1fbW9uIGlzIDAtMTEgKi8KKwl0bS0+dG1fbW9uCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfTU9OVEgpKSAtIDE7CisJdG0tPnRtX21kYXkJPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9NREFZKSk7CisKKwl2YWwgPSBNNDhUNTlfUkVBRChNNDhUNTlfV0RBWSk7CisJaWYgKCh2YWwgJiBNNDhUNTlfV0RBWV9DRUIpICYmICh2YWwgJiBNNDhUNTlfV0RBWV9DQikpIHsKKwkJZGV2X2RiZyhkZXYsICJDZW50dXJ5IGJpdCBpcyBlbmFibGVkXG4iKTsKKwkJdG0tPnRtX3llYXIgKz0gMTAwOwkvKiBvbmUgY2VudHVyeSAqLworCX0KKworCXRtLT50bV93ZGF5CT0gQkNEMkJJTih2YWwgJiAweDA3KTsKKwl0bS0+dG1faG91cgk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0hPVVIpICYgMHgzRik7CisJdG0tPnRtX21pbgk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01JTikgJiAweDdGKTsKKwl0bS0+dG1fc2VjCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfU0VDKSAmIDB4N0YpOworCisJLyogQ2xlYXIgdGhlIFJFQUQgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgcmVhZCB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWwgPSAwOworCisJZGV2X2RiZyhkZXYsICJSVEMgc2V0IHRpbWUgJTA0ZC0lMDJkLSUwMmQgJTAyZC8lMDJkLyUwMmRcbiIsCisJCXRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkvKiBJc3N1ZSB0aGUgV1JJVEUgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCisJTTQ4VDU5X1dSSVRFKChCSU4yQkNEKHRtLT50bV9zZWMpICYgMHg3RiksIE00OFQ1OV9TRUMpOworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1fbWluKSAmIDB4N0YpLCBNNDhUNTlfTUlOKTsKKwlNNDhUNTlfV1JJVEUoKEJJTjJCQ0QodG0tPnRtX2hvdXIpICYgMHgzRiksIE00OFQ1OV9IT1VSKTsKKwlNNDhUNTlfV1JJVEUoKEJJTjJCQ0QodG0tPnRtX21kYXkpICYgMHgzRiksIE00OFQ1OV9NREFZKTsKKwkvKiB0bV9tb24gaXMgMC0xMSAqLworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1fbW9uICsgMSkgJiAweDFGKSwgTTQ4VDU5X01PTlRIKTsKKwlNNDhUNTlfV1JJVEUoQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCksIE00OFQ1OV9ZRUFSKTsKKworCWlmICh0bS0+dG1feWVhci8xMDApCisJCXZhbCA9IChNNDhUNTlfV0RBWV9DRUIgfCBNNDhUNTlfV0RBWV9DQik7CisJdmFsIHw9IChCSU4yQkNEKHRtLT50bV93ZGF5KSAmIDB4MDcpOworCU00OFQ1OV9XUklURSh2YWwsIE00OFQ1OV9XREFZKTsKKworCS8qIENsZWFyIHRoZSBXUklURSBiaXQgKi8KKwlNNDhUNTlfQ0xFQVJfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhbGFybSB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IG00OHQ1OV9ydGNfcmVhZGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdmFsOworCisJLyogSWYgbm8gaXJxLCB3ZSBkb24ndCBzdXBwb3J0IEFMQVJNICovCisJaWYgKG00OHQ1OS0+aXJxID09IE5PX0lSUSkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFJFQUQgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9SRUFELCBNNDhUNTlfQ05UTCk7CisKKwl0bS0+dG1feWVhciA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X1lFQVIpKTsKKwkvKiB0bV9tb24gaXMgMC0xMSAqLworCXRtLT50bV9tb24gPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9NT05USCkpIC0gMTsKKworCXZhbCA9IE00OFQ1OV9SRUFEKE00OFQ1OV9XREFZKTsKKwlpZiAoKHZhbCAmIE00OFQ1OV9XREFZX0NFQikgJiYgKHZhbCAmIE00OFQ1OV9XREFZX0NCKSkKKwkJdG0tPnRtX3llYXIgKz0gMTAwOwkvKiBvbmUgY2VudHVyeSAqLworCisJdG0tPnRtX21kYXkgPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9BTEFSTV9EQVRFKSk7CisJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9BTEFSTV9IT1VSKSk7CisJdG0tPnRtX21pbiA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX01JTikpOworCXRtLT50bV9zZWMgPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9BTEFSTV9TRUMpKTsKKworCS8qIENsZWFyIHRoZSBSRUFEIGJpdCAqLworCU00OFQ1OV9DTEVBUl9CSVRTKE00OFQ1OV9DTlRMX1JFQUQsIE00OFQ1OV9DTlRMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoZGV2LCAiUlRDIHJlYWQgYWxhcm0gdGltZSAlMDRkLSUwMmQtJTAyZCAlMDJkLyUwMmQvJTAyZFxuIiwKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1OCBtZGF5LCBob3VyLCBtaW4sIHNlYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWYgbm8gaXJxLCB3ZSBkb24ndCBzdXBwb3J0IEFMQVJNICovCisJaWYgKG00OHQ1OS0+aXJxID09IE5PX0lSUSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKgorCSAqIDB4ZmYgbWVhbnMgImFsd2F5cyBtYXRjaCIKKwkgKi8KKwltZGF5ID0gdG0tPnRtX21kYXk7CisJbWRheSA9IChtZGF5ID49IDEgJiYgbWRheSA8PSAzMSkgPyBCSU4yQkNEKG1kYXkpIDogMHhmZjsKKwlpZiAobWRheSA9PSAweGZmKQorCQltZGF5ID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X01EQVkpOworCisJaG91ciA9IHRtLT50bV9ob3VyOworCWhvdXIgPSAoaG91ciA8IDI0KSA/IEJJTjJCQ0QoaG91cikgOiAweDAwOworCisJbWluID0gdG0tPnRtX21pbjsKKwltaW4gPSAobWluIDwgNjApID8gQklOMkJDRChtaW4pIDogMHgwMDsKKworCXNlYyA9IHRtLT50bV9zZWM7CisJc2VjID0gKHNlYyA8IDYwKSA/IEJJTjJCQ0Qoc2VjKSA6IDB4MDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFdSSVRFIGNvbW1hbmQgKi8KKwlNNDhUNTlfU0VUX0JJVFMoTTQ4VDU5X0NOVExfV1JJVEUsIE00OFQ1OV9DTlRMKTsKKworCU00OFQ1OV9XUklURShtZGF5LCBNNDhUNTlfQUxBUk1fREFURSk7CisJTTQ4VDU5X1dSSVRFKGhvdXIsIE00OFQ1OV9BTEFSTV9IT1VSKTsKKwlNNDhUNTlfV1JJVEUobWluLCBNNDhUNTlfQUxBUk1fTUlOKTsKKwlNNDhUNTlfV1JJVEUoc2VjLCBNNDhUNTlfQUxBUk1fU0VDKTsKKworCS8qIENsZWFyIHRoZSBXUklURSBiaXQgKi8KKwlNNDhUNTlfQ0xFQVJfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgc2V0IGFsYXJtIHRpbWUgJTA0ZC0lMDJkLSUwMmQgJTAyZC8lMDJkLyUwMmRcbiIsCisJCXRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBjb21tYW5kcyBmcm9tIHVzZXItc3BhY2UKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgkvKiBhbGFybSBpbnRlcnJ1cHQgb2ZmICovCisJCU00OFQ1OV9XUklURSgweDAwLCBNNDhUNTlfSU5UUik7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoJLyogYWxhcm0gaW50ZXJydXB0IG9uICovCisJCU00OFQ1OV9XUklURShNNDhUNTlfSU5UUl9BRkUsIE00OFQ1OV9JTlRSKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG00OHQ1OV9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCXZhbCA9IE00OFQ1OV9SRUFEKE00OFQ1OV9GTEFHUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlzZXFfcHJpbnRmKHNlcSwgImJhdHRlcnlcdFx0OiAlc1xuIiwKKwkJICh2YWwgJiBNNDhUNTlfRkxBR1NfQkYpID8gImxvdyIgOiAibm9ybWFsIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIFJUQworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbTQ4dDU5X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IChzdHJ1Y3QgZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXU4IGV2ZW50OworCisJc3Bpbl9sb2NrKCZtNDh0NTktPmxvY2spOworCWV2ZW50ID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X0ZMQUdTKTsKKwlzcGluX3VubG9jaygmbTQ4dDU5LT5sb2NrKTsKKworCWlmIChldmVudCAmIE00OFQ1OV9GTEFHU19BRikgeworCQlydGNfdXBkYXRlX2lycShtNDh0NTktPnJ0YywgMSwgKFJUQ19BRiB8IFJUQ19JUlFGKSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtNDh0NTlfcnRjX29wcyA9IHsKKwkuaW9jdGwJCT0gbTQ4dDU5X3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gbTQ4dDU5X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gbTQ4dDU5X3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IG00OHQ1OV9ydGNfcmVhZGFsYXJtLAorCS5zZXRfYWxhcm0JPSBtNDh0NTlfcnRjX3NldGFsYXJtLAorCS5wcm9jCQk9IG00OHQ1OV9ydGNfcHJvYywKK307CisKK3N0YXRpYyBzc2l6ZV90IG00OHQ1OV9udnJhbV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzc2l6ZV90IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoOyBzaXplID4gMCAmJiBwb3MgPCBNNDhUNTlfTlZSQU1fU0laRTsgY250KyssIHNpemUtLSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJCSpidWYrKyA9IE00OFQ1OV9SRUFEKGNudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG00OHQ1OV9udnJhbV93cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3NpemVfdCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKDsgc2l6ZSA+IDAgJiYgcG9zIDwgTTQ4VDU5X05WUkFNX1NJWkU7IGNudCsrLCBzaXplLS0pIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCQlNNDhUNTlfV1JJVEUoKmJ1ZisrLCBjbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgbTQ4dDU5X252cmFtX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIm52cmFtIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VHTywKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVhZCA9IG00OHQ1OV9udnJhbV9yZWFkLAorCS53cml0ZSA9IG00OHQ1OV9udnJhbV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG00OHQ1OV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwkvKiBUaGlzIGNoaXAgY291bGQgYmUgbWVtb3J5LW1hcHBlZCBvciBJL08tbWFwcGVkICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CisJCWlmICghcmVzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCS8qIElmIHdlIGFyZSBJL08tbWFwcGVkLCB0aGUgcGxhdGZvcm0gc2hvdWxkIHByb3ZpZGUKKwkJICogdGhlIG9wZXJhdGlvbnMgYWNjZXNzaW5nIGNoaXAgcmVnaXN0ZXJzLgorCQkgKi8KKwkJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPndyaXRlX2J5dGUgfHwgIXBkYXRhLT5yZWFkX2J5dGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQkvKiB3ZSBhcmUgbWVtb3J5LW1hcHBlZCAqLworCQlpZiAoIXBkYXRhKSB7CisJCQlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFwZGF0YSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCS8qIEVuc3VyZSB3ZSBvbmx5IGttYWxsb2MgcGxhdGZvcm0gZGF0YSBvbmNlICovCisJCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCQl9CisKKwkJLyogVHJ5IHRvIHVzZSB0aGUgZ2VuZXJpYyBtZW1vcnkgcmVhZC93cml0ZSBvcHMgKi8KKwkJaWYgKCFwZGF0YS0+d3JpdGVfYnl0ZSkKKwkJCXBkYXRhLT53cml0ZV9ieXRlID0gbTQ4dDU5X21lbV93cml0ZWI7CisJCWlmICghcGRhdGEtPnJlYWRfYnl0ZSkKKwkJCXBkYXRhLT5yZWFkX2J5dGUgPSBtNDh0NTlfbWVtX3JlYWRiOworCX0KKworCW00OHQ1OSA9IGt6YWxsb2Moc2l6ZW9mKCptNDh0NTkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW00OHQ1OSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltNDh0NTktPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCW00OHQ1OS0+aW9hZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBtNDh0NTktPnNpemUpOworCWlmICghbTQ4dDU5LT5pb2FkZHIpCisJCWdvdG8gb3V0OworCisJLyogVHJ5IHRvIGdldCBpcnEgbnVtYmVyLiBXZSBhbHNvIGNhbiB3b3JrIGluCisJICogdGhlIG1vZGUgd2l0aG91dCBJUlEuCisJICovCisJbTQ4dDU5LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChtNDh0NTktPmlycSA8IDApCisJCW00OHQ1OS0+aXJxID0gTk9fSVJROworCisJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkgeworCQlyZXQgPSByZXF1ZXN0X2lycShtNDh0NTktPmlycSwgbTQ4dDU5X3J0Y19pbnRlcnJ1cHQsCisJCQlJUlFGX1NIQVJFRCwgInJ0Yy1tNDh0NTkiLCAmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCW00OHQ1OS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibTQ4dDU5IiwgJnBkZXYtPmRldiwKKwkJCQkmbTQ4dDU5X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKG00OHQ1OS0+cnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKG00OHQ1OS0+cnRjKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJm00OHQ1OV9udnJhbV9hdHRyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9ja19pbml0KCZtNDh0NTktPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG00OHQ1OSk7CisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAoIUlTX0VSUihtNDh0NTktPnJ0YykpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihtNDh0NTktPnJ0Yyk7CisJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEobTQ4dDU5LT5pcnEsICZwZGV2LT5kZXYpOworCWlmIChtNDh0NTktPmlvYWRkcikKKwkJaW91bm1hcChtNDh0NTktPmlvYWRkcik7CisJaWYgKG00OHQ1OSkKKwkJa2ZyZWUobTQ4dDU5KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtNDh0NTlfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmbTQ4dDU5X252cmFtX2F0dHIpOworCWlmICghSVNfRVJSKG00OHQ1OS0+cnRjKSkKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKG00OHQ1OS0+cnRjKTsKKwlpZiAobTQ4dDU5LT5pb2FkZHIpCisJCWlvdW5tYXAobTQ4dDU5LT5pb2FkZHIpOworCWlmIChtNDh0NTktPmlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKG00OHQ1OS0+aXJxLCAmcGRldi0+ZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShtNDh0NTkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtNDh0NTlfcnRjX3BsYXRkcnYgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1tNDh0NTkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBtNDh0NTlfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobTQ4dDU5X3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTQ4dDU5X3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbTQ4dDU5X3J0Y19wbGF0ZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG00OHQ1OV9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtNDh0NTlfcnRjX3BsYXRkcnYpOworfQorCittb2R1bGVfaW5pdChtNDh0NTlfcnRjX2luaXQpOworbW9kdWxlX2V4aXQobTQ4dDU5X3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTTQ4VDU5IFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCmluZGV4IDA5YmJlNTcuLjZiNjdiNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYwpAQCAtMTMsMTMgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40IgotCi0vKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgLyogMHgzMiwqLyBJMkNfQ0xJRU5UX0VORCB9OwotCi0vKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotSTJDX0NMSUVOVF9JTlNNT0Q7CisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjUiCiAKIAogLyoKQEAgLTg4LDkgKzgyLDYgQEAKIAl1bnNpZ25lZAkJaGFzX2lycToxOwogCWNoYXIJCQlidWZbMTddOwogCWNoYXIJCQkqcmVnczsKLQotCS8qIG9uIGNvbnZlcnNpb24gdG8gYSAibmV3IHN0eWxlIiBpMmMgZHJpdmVyLCB0aGlzIHZhbmlzaGVzICovCi0Jc3RydWN0IGkyY19jbGllbnQJZGV2OwogfTsKIAogc3RhdGljIGludCByczVjX2dldF9yZWdzKHN0cnVjdCByczVjMzcyICpyczVjKQpAQCAtNDgzLDI1ICs0NzQsMzUgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCByczVjX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl90cmltKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfb3NjKTsKK30KKwogI2Vsc2UKIHN0YXRpYyBpbnQgcnM1Y19zeXNmc19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyB2b2lkIHJzNWNfc3lzZnNfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyogbm90aGluZyAqLworfQogI2VuZGlmCS8qIFNZU0ZTICovCiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciByczVjMzcyX2RyaXZlcjsKIAotc3RhdGljIGludCByczVjMzcyX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCByczVjMzcyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJaW50IGVyciA9IDA7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgcnM1YzM3MiAqcnM1YzM3MjsKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAKLQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTUxNCwzNSArNTE1LDIyIEBACiAJLyogd2UgcmVhZCByZWdpc3RlcnMgMHgwZiB0aGVuIDB4MDAtMHgwZjsgc2tpcCB0aGUgZmlyc3Qgb25lICovCiAJcnM1YzM3Mi0+cmVncz0mcnM1YzM3Mi0+YnVmWzFdOwogCi0JLyogT24gY29udmVyc2lvbiB0byBhICJuZXcgc3R5bGUiIGkyYyBkcml2ZXIsIHdlJ2xsIGJlIGhhbmRlZAotCSAqIHRoZSBpMmNfY2xpZW50ICh3ZSB3b24ndCBjcmVhdGUgaXQpCi0JICovCi0JY2xpZW50ID0gJnJzNWMzNzItPmRldjsKIAlyczVjMzcyLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQkvKiBJMkMgY2xpZW50ICovCi0JY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQljbGllbnQtPmRyaXZlciA9ICZyczVjMzcyX2RyaXZlcjsKLQljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwotCi0Jc3RybGNweShjbGllbnQtPm5hbWUsIHJzNWMzNzJfZHJpdmVyLmRyaXZlci5uYW1lLCBJMkNfTkFNRV9TSVpFKTsKLQogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHJzNWMzNzIpOwogCi0JLyogSW5mb3JtIHRoZSBpMmMgbGF5ZXIgKi8KLQlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCkpKQotCQlnb3RvIGV4aXRfa2ZyZWU7Ci0KIAllcnIgPSByczVjX2dldF9yZWdzKHJzNWMzNzIpOwogCWlmIChlcnIgPCAwKQotCQlnb3RvIGV4aXRfZGV0YWNoOworCQlnb3RvIGV4aXRfa2ZyZWU7CiAKLQkvKiBGb3IgIm5ldyBzdHlsZSIgZHJpdmVycywgaXJxIGlzIGluIGkyY19jbGllbnQgYW5kIGNoaXAgdHlwZQotCSAqIGluZm8gY29tZXMgZnJvbSBpMmNfY2xpZW50LmRldi5wbGF0Zm9ybV9kYXRhLiAgTWVhbndoaWxlOgotCSAqCi0JICogU1RJQ0sgQk9BUkQtU1BFQ0lGSUMgU0VUVVAgQ09ERSBSSUdIVCBIRVJFCi0JICovCi0JaWYgKHJzNWMzNzItPnR5cGUgPT0gcnRjX3VuZGVmKSB7CisJaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsICJyczVjMzcyYSIpID09IDApCisJCXJzNWMzNzItPnR5cGUgPSBydGNfcnM1YzM3MmE7CisJZWxzZSBpZiAoc3RyY21wKGNsaWVudC0+bmFtZSwgInJzNWMzNzJiIikgPT0gMCkKKwkJcnM1YzM3Mi0+dHlwZSA9IHJ0Y19yczVjMzcyYjsKKwllbHNlIGlmIChzdHJjbXAoY2xpZW50LT5uYW1lLCAicnY1YzM4NiIpID09IDApCisJCXJzNWMzNzItPnR5cGUgPSBydGNfcnY1YzM4NjsKKwllbHNlIGlmIChzdHJjbXAoY2xpZW50LT5uYW1lLCAicnY1YzM4N2EiKSA9PSAwKQorCQlyczVjMzcyLT50eXBlID0gcnRjX3J2NWMzODdhOworCWVsc2UgewogCQlyczVjMzcyLT50eXBlID0gcnRjX3JzNWMzNzJiOwogCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJhc3N1bWluZyByczVjMzcyYlxuIik7CiAJfQpAQCAtNTY3LDcgKzU1NSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5rbm93biBSVEMgdHlwZVxuIik7Ci0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9rZnJlZTsKIAl9CiAKIAkvKiBpZiB0aGUgb3NjaWxsYXRvciBsb3N0IHBvd2VyIGFuZCBubyBvdGhlciBzb2Z0d2FyZSAobGlrZQpAQCAtNjAxLDcgKzU4OSw3IEBACiAKIAkJaWYgKChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDMpKSAhPSAzKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInNldHVwIGVycm9yXG4iKTsKLQkJCWdvdG8gZXhpdF9kZXRhY2g7CisJCQlnb3RvIGV4aXRfa2ZyZWU7CiAJCX0KIAkJcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMV0gPSBidWZbMV07CiAJCXJzNWMzNzItPnJlZ3NbUlM1Q19SRUdfQ1RSTDJdID0gYnVmWzJdOwpAQCAtNjIxLDE0ICs2MDksMTQgQEAKIAkJCXJzNWMzNzItPnRpbWUyNCA/ICIyNGhyIiA6ICJhbS9wbSIKIAkJCSk7CiAKLQkvKiBGSVhNRSB3aGVuIGNsaWVudC0+aXJxIGV4aXN0cywgdXNlIGl0IHRvIHJlZ2lzdGVyIGFsYXJtIGlycSAqLworCS8qIFJFVklTSVQgdXNlIGNsaWVudC0+aXJxIHRvIHJlZ2lzdGVyIGFsYXJtIGlycSAuLi4gKi8KIAogCXJzNWMzNzItPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocnM1YzM3Ml9kcml2ZXIuZHJpdmVyLm5hbWUsCiAJCQkJJmNsaWVudC0+ZGV2LCAmcnM1YzM3Ml9ydGNfb3BzLCBUSElTX01PRFVMRSk7CiAKIAlpZiAoSVNfRVJSKHJzNWMzNzItPnJ0YykpIHsKIAkJZXJyID0gUFRSX0VSUihyczVjMzcyLT5ydGMpOwotCQlnb3RvIGV4aXRfZGV0YWNoOworCQlnb3RvIGV4aXRfa2ZyZWU7CiAJfQogCiAJZXJyID0gcnM1Y19zeXNmc19yZWdpc3RlcigmY2xpZW50LT5kZXYpOwpAQCAtNjQwLDkgKzYyOCw2IEBACiBleGl0X2RldnJlZzoKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnM1YzM3Mi0+cnRjKTsKIAotZXhpdF9kZXRhY2g6Ci0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQogZXhpdF9rZnJlZToKIAlrZnJlZShyczVjMzcyKTsKIApAQCAtNjUwLDI0ICs2MzUsMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJzNWMzNzJfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgcnM1YzM3Ml9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHJzNWMzNzJfcHJvYmUpOwotfQotCi1zdGF0aWMgaW50IHJzNWMzNzJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IGVycjsKIAlzdHJ1Y3QgcnM1YzM3MiAqcnM1YzM3MiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCi0JaWYgKHJzNWMzNzItPnJ0YykKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJzNWMzNzItPnJ0Yyk7Ci0KLQkvKiBSRVZJU0lUIHByb3Blcmx5IGRlc3Ryb3kgdGhlIHN5c2ZzIGZpbGVzIC4uLiAqLwotCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKLQkJcmV0dXJuIGVycjsKLQorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihyczVjMzcyLT5ydGMpOworCXJzNWNfc3lzZnNfdW5yZWdpc3RlcigmY2xpZW50LT5kZXYpOwogCWtmcmVlKHJzNWMzNzIpOwogCXJldHVybiAwOwogfQpAQCAtNjc2LDggKzY0OSw4IEBACiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInJ0Yy1yczVjMzcyIiwKIAl9LAotCS5hdHRhY2hfYWRhcHRlcgk9ICZyczVjMzcyX2F0dGFjaCwKLQkuZGV0YWNoX2NsaWVudAk9ICZyczVjMzcyX2RldGFjaCwKKwkucHJvYmUJCT0gcnM1YzM3Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IHJzNWMzNzJfcmVtb3ZlLAogfTsKIAogc3RhdGljIF9faW5pdCBpbnQgcnM1YzM3Ml9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCAxMzQwNDUxLi4zNTc2NWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKQEAgLTc0NywxNCArNzQ3LDkgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogZGNzc2Jsa19leGl0KHZvaWQpCiB7Ci0JaW50IHJjOwotCiAJUFJJTlRfREVCVUcoIkRDU1NCTE9DSyBFWElULi4uXG4iKTsKIAlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7Ci0JcmMgPSB1bnJlZ2lzdGVyX2Jsa2RldihkY3NzYmxrX21ham9yLCBEQ1NTQkxLX05BTUUpOwotCWlmIChyYykgewotCQlQUklOVF9FUlIoInVucmVnaXN0ZXJfYmxrZGV2KCkgZmFpbGVkIVxuIik7Ci0JfQorCXVucmVnaXN0ZXJfYmxrZGV2KGRjc3NibGtfbWFqb3IsIERDU1NCTEtfTkFNRSk7CiAJUFJJTlRfREVCVUcoIi4uLmZpbmlzaGVkIVxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKaW5kZXggYjM0ZWI4Mi4uZWMxOGJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKQEAgLTIxMSw2ICsyMTEsMTAgQEAKIAkvKiBpbml0aWFsIHZhbHVlcyB3aGVuIG1lYXN1cmluZyBzdGFydHMgKi8KIAl1bnNpZ25lZCBsb25nIGluaXRpYWxfcnhfcGFja2V0czsKIAl1bnNpZ25lZCBsb25nIGluaXRpYWxfdHhfcGFja2V0czsKKwkvKiBpbmJvdW5kIHNjYXR0ZXIgZ2F0aGVyIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgc2dfc2tic19yeDsKKwl1bnNpZ25lZCBpbnQgc2dfZnJhZ3Nfcng7CisJdW5zaWduZWQgaW50IHNnX2FsbG9jX3BhZ2Vfcng7CiB9OwogCiAvKiBSb3V0aW5nIHN0dWZmICovCkBAIC0zNDEsNiArMzQ1LDkgQEAKIAogI2RlZmluZSBRRVRIX0lQX0hFQURFUl9TSVpFIDQwCiAKKy8qIGxhcmdlIHJlY2VpdmUgc2NhdHRlciBnYXRoZXIgY29weSBicmVhayAqLworI2RlZmluZSBRRVRIX1JYX1NHX0NCIChQQUdFX1NJWkUgPj4gMSkKKwogc3RydWN0IHFldGhfaGRyX2xheWVyMyB7CiAJX191OCAgaWQ7CiAJX191OCAgZmxhZ3M7CkBAIC03NzEsNiArNzc4LDcgQEAKIAlpbnQgbGF5ZXIyOwogCWVudW0gcWV0aF9sYXJnZV9zZW5kX3R5cGVzIGxhcmdlX3NlbmQ7CiAJaW50IHBlcmZvcm1hbmNlX3N0YXRzOworCWludCByeF9zZ19jYjsKIH07CiAKIC8qCkBAIC04MjgsNiArODM2LDcgQEAKIAlpbnQgKCpvcmlnX2hhcmRfaGVhZGVyKShzdHJ1Y3Qgc2tfYnVmZiAqLHN0cnVjdCBuZXRfZGV2aWNlICosCiAJCQkJdW5zaWduZWQgc2hvcnQsdm9pZCAqLHZvaWQgKix1bnNpZ25lZCk7CiAJc3RydWN0IHFldGhfb3NuX2luZm8gb3NuX2luZm87CisJYXRvbWljX3QgZm9yY2VfYWxsb2Nfc2tiOwogfTsKIAogc3RydWN0IHFldGhfY2FyZF9saXN0X3N0cnVjdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwppbmRleCA4NmIwYzQ0Li41N2Y2OTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKQEAgLTEwNTQsNiArMTA1NCw3IEBACiAJZWxzZQogCQljYXJkLT5vcHRpb25zLmxheWVyMiA9IDA7CiAJY2FyZC0+b3B0aW9ucy5wZXJmb3JtYW5jZV9zdGF0cyA9IDA7CisJY2FyZC0+b3B0aW9ucy5yeF9zZ19jYiA9IFFFVEhfUlhfU0dfQ0I7CiB9CiAKIC8qKgpAQCAtMTkzNCw2ICsxOTM1LDcgQEAKIAkJCWF0b21pY19pbmMoJnJlcGx5LT5yZWNlaXZlZCk7CiAJCQl3YWtlX3VwKCZyZXBseS0+d2FpdF9xKTsKIAkJfQorCQljcHVfcmVsYXgoKTsKIAl9OwogCXJjID0gcmVwbHktPnJjOwogCXFldGhfcHV0X3JlcGx5KHJlcGx5KTsKQEAgLTIyNTgsNiArMjI2MCw4OSBAQAogCXJldHVybiBza2I7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CitxZXRoX2NyZWF0ZV9za2JfZnJhZyhzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqZWxlbWVudCwKKwkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgICAgaW50IG9mZnNldCwgaW50ICpwZnJhZywgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKGVsZW1lbnQtPmFkZHIpOworCWlmICgqcGZyYWcgPT0gMCkgeworCQkvKiB0aGUgdXBwZXIgcHJvdG9jb2wgbGF5ZXJzIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGRhdGEgaW4gdGhlCisJCSAqIHNrYiBpdHNlbGYuIENvcHkgYSBzbWFsbCBhbW91bnQgKDY0IGJ5dGVzKSB0byBtYWtlIHRoZW0KKwkJICogaGFwcHkuICovCisJCSpwc2tiID0gZGV2X2FsbG9jX3NrYig2NCArIFFFVEhfRkFLRV9MTF9MRU5fRVRIKTsKKwkJaWYgKCEoKnBza2IpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNrYl9yZXNlcnZlKCpwc2tiLCBRRVRIX0ZBS0VfTExfTEVOX0VUSCk7CisJCWlmIChkYXRhX2xlbiA8PSA2NCkgeworCQkJbWVtY3B5KHNrYl9wdXQoKnBza2IsIGRhdGFfbGVuKSwgZWxlbWVudC0+YWRkciArIG9mZnNldCwKKwkJCQlkYXRhX2xlbik7CisJCX0gZWxzZSB7CisJCQlnZXRfcGFnZShwYWdlKTsKKwkJCW1lbWNweShza2JfcHV0KCpwc2tiLCA2NCksIGVsZW1lbnQtPmFkZHIgKyBvZmZzZXQsIDY0KTsKKwkJCXNrYl9maWxsX3BhZ2VfZGVzYygqcHNrYiwgKnBmcmFnLCBwYWdlLCBvZmZzZXQgKyA2NCwKKwkJCQlkYXRhX2xlbiAtIDY0KTsKKwkJCSgqcHNrYiktPmRhdGFfbGVuICs9IGRhdGFfbGVuIC0gNjQ7CisJCQkoKnBza2IpLT5sZW4JICArPSBkYXRhX2xlbiAtIDY0OworCQkJKCpwc2tiKS0+dHJ1ZXNpemUgKz0gZGF0YV9sZW4gLSA2NDsKKwkJfQorCX0gZWxzZSB7CisJCWdldF9wYWdlKHBhZ2UpOworCQlza2JfZmlsbF9wYWdlX2Rlc2MoKnBza2IsICpwZnJhZywgcGFnZSwgb2Zmc2V0LCBkYXRhX2xlbik7CisJCSgqcHNrYiktPmRhdGFfbGVuICs9IGRhdGFfbGVuOworCQkoKnBza2IpLT5sZW4JICArPSBkYXRhX2xlbjsKKwkJKCpwc2tiKS0+dHJ1ZXNpemUgKz0gZGF0YV9sZW47CisJfQorCSgqcGZyYWcpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKgorcWV0aF9maW5kX2ZyZWVfYnVmZmVyX3Bvb2xfZW50cnkoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwbGg7CisJc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKmVudHJ5OworCWludCBpLCBmcmVlOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGxpc3RfZW1wdHkoJmNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdCkpCisJCXJldHVybiBOVUxMOworCisJbGlzdF9mb3JfZWFjaChwbGgsICZjYXJkLT5xZGlvLmluX2J1Zl9wb29sLmVudHJ5X2xpc3QpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHBsaCwgc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnksIGxpc3QpOworCQlmcmVlID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IFFFVEhfTUFYX0JVRkZFUl9FTEVNRU5UUyhjYXJkKTsgKytpKSB7CisJCQlpZiAocGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2UoZW50cnktPmVsZW1lbnRzW2ldKSkgPiAxKSB7CisJCQkJZnJlZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGZyZWUpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCX0KKworCS8qIG5vIGZyZWUgYnVmZmVyIGluIHBvb2wgc28gdGFrZSBmaXJzdCBvbmUgYW5kIHN3YXAgcGFnZXMgKi8KKwllbnRyeSA9IGxpc3RfZW50cnkoY2FyZC0+cWRpby5pbl9idWZfcG9vbC5lbnRyeV9saXN0Lm5leHQsCisJCQlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSwgbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IFFFVEhfTUFYX0JVRkZFUl9FTEVNRU5UUyhjYXJkKTsgKytpKSB7CisJCWlmIChwYWdlX2NvdW50KHZpcnRfdG9fcGFnZShlbnRyeS0+ZWxlbWVudHNbaV0pKSA+IDEpIHsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUN8R0ZQX0RNQSk7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWVudHJ5LT5lbGVtZW50c1tpXSk7CisJCQkJZW50cnktPmVsZW1lbnRzW2ldID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQkJCWlmIChjYXJkLT5vcHRpb25zLnBlcmZvcm1hbmNlX3N0YXRzKQorCQkJCQljYXJkLT5wZXJmX3N0YXRzLnNnX2FsbG9jX3BhZ2VfcngrKzsKKwkJCX0KKwkJfQorCX0KKwlsaXN0X2RlbF9pbml0KCZlbnRyeS0+bGlzdCk7CisJcmV0dXJuIGVudHJ5OworfQorCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogcWV0aF9nZXRfbmV4dF9za2Ioc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgc3RydWN0IHFkaW9fYnVmZmVyICpidWZmZXIsCiAJCSAgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKipfX2VsZW1lbnQsIGludCAqX19vZmZzZXQsCkBAIC0yMjY5LDYgKzIzNTQsOCBAQAogCWludCBza2JfbGVuOwogCXZvaWQgKmRhdGFfcHRyOwogCWludCBkYXRhX2xlbjsKKwlpbnQgdXNlX3J4X3NnID0gMDsKKwlpbnQgZnJhZyA9IDA7CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLDYsIm5leHRza2IiKTsKIAkvKiBxZXRoX2hkciBtdXN0IG5vdCBjcm9zcyBlbGVtZW50IGJvdW5kYXJpZXMgKi8KQEAgLTIyOTMsMjMgKzIzODAsNDMgQEAKIAogCWlmICghc2tiX2xlbikKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNhcmQtPm9wdGlvbnMuZmFrZV9sbCl7Ci0JCWlmKGNhcmQtPmRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUil7Ci0JCQlpZiAoIShza2IgPSBxZXRoX2dldF9za2Ioc2tiX2xlbitRRVRIX0ZBS0VfTExfTEVOX1RSLCAqaGRyKSkpCi0JCQkJZ290byBub19tZW07Ci0JCQlza2JfcmVzZXJ2ZShza2IsUUVUSF9GQUtFX0xMX0xFTl9UUik7CisJaWYgKChza2JfbGVuID49IGNhcmQtPm9wdGlvbnMucnhfc2dfY2IpICYmCisJICAgICghKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9PU04pKSAmJgorCSAgICAoIWF0b21pY19yZWFkKCZjYXJkLT5mb3JjZV9hbGxvY19za2IpKSkgeworCQl1c2Vfcnhfc2cgPSAxOworCX0gZWxzZSB7CisJCWlmIChjYXJkLT5vcHRpb25zLmZha2VfbGwpIHsKKwkJCWlmIChjYXJkLT5kZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDJfVFIpIHsKKwkJCQlpZiAoIShza2IgPSBxZXRoX2dldF9za2Ioc2tiX2xlbiArCisJCQkJCQlRRVRIX0ZBS0VfTExfTEVOX1RSLCAqaGRyKSkpCisJCQkJCWdvdG8gbm9fbWVtOworCQkJCXNrYl9yZXNlcnZlKHNrYiwgUUVUSF9GQUtFX0xMX0xFTl9UUik7CisJCQl9IGVsc2UgeworCQkJCWlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuICsKKwkJCQkJCVFFVEhfRkFLRV9MTF9MRU5fRVRILCAqaGRyKSkpCisJCQkJCWdvdG8gbm9fbWVtOworCQkJCXNrYl9yZXNlcnZlKHNrYiwgUUVUSF9GQUtFX0xMX0xFTl9FVEgpOworCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKCEoc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4rUUVUSF9GQUtFX0xMX0xFTl9FVEgsICpoZHIpKSkKKwkJCXNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuLCAqaGRyKTsKKwkJCWlmICghc2tiKQogCQkJCWdvdG8gbm9fbWVtOwotCQkJc2tiX3Jlc2VydmUoc2tiLFFFVEhfRkFLRV9MTF9MRU5fRVRIKTsKIAkJfQotCX0gZWxzZSBpZiAoIShza2IgPSBxZXRoX2dldF9za2Ioc2tiX2xlbiwgKmhkcikpKQotCQlnb3RvIG5vX21lbTsKKwl9CisKIAlkYXRhX3B0ciA9IGVsZW1lbnQtPmFkZHIgKyBvZmZzZXQ7CiAJd2hpbGUgKHNrYl9sZW4pIHsKIAkJZGF0YV9sZW4gPSBtaW4oc2tiX2xlbiwgKGludCkoZWxlbWVudC0+bGVuZ3RoIC0gb2Zmc2V0KSk7Ci0JCWlmIChkYXRhX2xlbikKLQkJCW1lbWNweShza2JfcHV0KHNrYiwgZGF0YV9sZW4pLCBkYXRhX3B0ciwgZGF0YV9sZW4pOworCQlpZiAoZGF0YV9sZW4pIHsKKwkJCWlmICh1c2Vfcnhfc2cpIHsKKwkJCQlpZiAocWV0aF9jcmVhdGVfc2tiX2ZyYWcoZWxlbWVudCwgJnNrYiwgb2Zmc2V0LAorCQkJCSAgICAmZnJhZywgZGF0YV9sZW4pKQorCQkJCQlnb3RvIG5vX21lbTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBkYXRhX2xlbiksIGRhdGFfcHRyLAorCQkJCQlkYXRhX2xlbik7CisJCQl9CisJCX0KIAkJc2tiX2xlbiAtPSBkYXRhX2xlbjsKIAkJaWYgKHNrYl9sZW4pewogCQkJaWYgKHFldGhfaXNfbGFzdF9zYmFsZShlbGVtZW50KSl7CkBAIC0yMzMxLDYgKzI0MzgsMTAgQEAKIAl9CiAJKl9fZWxlbWVudCA9IGVsZW1lbnQ7CiAJKl9fb2Zmc2V0ID0gb2Zmc2V0OworCWlmICh1c2Vfcnhfc2cgJiYgY2FyZC0+b3B0aW9ucy5wZXJmb3JtYW5jZV9zdGF0cykgeworCQljYXJkLT5wZXJmX3N0YXRzLnNnX3NrYnNfcngrKzsKKwkJY2FyZC0+cGVyZl9zdGF0cy5zZ19mcmFnc19yeCArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCX0KIAlyZXR1cm4gc2tiOwogbm9fbWVtOgogCWlmIChuZXRfcmF0ZWxpbWl0KCkpewpAQCAtMjYwOCwyOCArMjcxOSwxNSBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5ICoKLXFldGhfZ2V0X2J1ZmZlcl9wb29sX2VudHJ5KHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKmVudHJ5OwotCi0JUUVUSF9EQkZfVEVYVCh0cmFjZSwgNiwgImd0YmZwbGVuIik7Ci0JaWYgKCFsaXN0X2VtcHR5KCZjYXJkLT5xZGlvLmluX2J1Zl9wb29sLmVudHJ5X2xpc3QpKSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShjYXJkLT5xZGlvLmluX2J1Zl9wb29sLmVudHJ5X2xpc3QubmV4dCwKLQkJCQlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSwgbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHFldGhfaW5pdF9pbnB1dF9idWZmZXIoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgc3RydWN0IHFldGhfcWRpb19idWZmZXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqcG9vbF9lbnRyeTsKIAlpbnQgaTsKLSAKLQlwb29sX2VudHJ5ID0gcWV0aF9nZXRfYnVmZmVyX3Bvb2xfZW50cnkoY2FyZCk7CisKKwlwb29sX2VudHJ5ID0gcWV0aF9maW5kX2ZyZWVfYnVmZmVyX3Bvb2xfZW50cnkoY2FyZCk7CisJaWYgKCFwb29sX2VudHJ5KQorCQlyZXR1cm4gMTsKIAkvKgogCSAqIHNpbmNlIHRoZSBidWZmZXIgaXMgYWNjZXNzZWQgb25seSBmcm9tIHRoZSBpbnB1dF90YXNrbGV0CiAJICogdGhlcmUgc2hvdWxkbid0IGJlIGEgbmVlZCB0byBzeW5jaHJvbml6ZTsgYWxzbywgc2luY2Ugd2UgdXNlCkBAIC0yNjQ4LDYgKzI3NDYsNyBAQAogCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZmxhZ3MgPSAwOwogCX0KIAlidWYtPnN0YXRlID0gUUVUSF9RRElPX0JVRl9FTVBUWTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTI2ODIsNiArMjc4MSw3IEBACiAJaW50IGNvdW50OwogCWludCBpOwogCWludCByYzsKKwlpbnQgbmV3Y291bnQgPSAwOwogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSw2LCJxdWVpbmJ1ZiIpOwogCWNvdW50ID0gKGluZGV4IDwgcXVldWUtPm5leHRfYnVmX3RvX2luaXQpPwpAQCAtMjY5Miw5ICsyNzkyLDI3IEBACiAJLyogb25seSByZXF1ZXVlIGF0IGEgY2VydGFpbiB0aHJlc2hvbGQgdG8gYXZvaWQgU0lHQXMgKi8KIAlpZiAoY291bnQgPj0gUUVUSF9JTl9CVUZfUkVRVUVVRV9USFJFU0hPTEQoY2FyZCkpewogCQlmb3IgKGkgPSBxdWV1ZS0+bmV4dF9idWZfdG9faW5pdDsKLQkJICAgICBpIDwgcXVldWUtPm5leHRfYnVmX3RvX2luaXQgKyBjb3VudDsgKytpKQotCQkJcWV0aF9pbml0X2lucHV0X2J1ZmZlcihjYXJkLAotCQkJCSZxdWV1ZS0+YnVmc1tpICUgUURJT19NQVhfQlVGRkVSU19QRVJfUV0pOworCQkgICAgIGkgPCBxdWV1ZS0+bmV4dF9idWZfdG9faW5pdCArIGNvdW50OyArK2kpIHsKKwkJCWlmIChxZXRoX2luaXRfaW5wdXRfYnVmZmVyKGNhcmQsCisJCQkJJnF1ZXVlLT5idWZzW2kgJSBRRElPX01BWF9CVUZGRVJTX1BFUl9RXSkpIHsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbmV3Y291bnQrKzsKKwkJCX0KKwkJfQorCisJCWlmIChuZXdjb3VudCA8IGNvdW50KSB7CisJCQkvKiB3ZSBhcmUgaW4gbWVtb3J5IHNob3J0YWdlIHNvIHdlIHN3aXRjaCBiYWNrIHRvCisJCQkgICB0cmFkaXRpb25hbCBza2IgYWxsb2NhdGlvbiBhbmQgZHJvcCBwYWNrYWdlcyAqLworCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZjYXJkLT5mb3JjZV9hbGxvY19za2IsIDAsIDEpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJInFldGg6IHN3aXRjaCB0byBhbGxvYyBza2JcbiIpOworCQkJY291bnQgPSBuZXdjb3VudDsKKwkJfSBlbHNlIHsKKwkJCWlmIChhdG9taWNfY21weGNoZygmY2FyZC0+Zm9yY2VfYWxsb2Nfc2tiLCAxLCAwKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJxZXRoOiBzd2l0Y2ggdG8gc2dcbiIpOworCQl9CisKIAkJLyoKIAkJICogYWNjb3JkaW5nIHRvIG9sZCBjb2RlIGl0IHNob3VsZCBiZSBhdm9pZGVkIHRvIHJlcXVldWUgYWxsCiAJCSAqIDEyOCBidWZmZXJzIGluIG9yZGVyIHRvIGJlbmVmaXQgZnJvbSBQQ0kgYXZvaWRhbmNlLgpAQCAtNjQ5NCw2ICs2NjEyLDcgQEAKIAogCVFFVEhfREJGX1RFWFQoc2V0dXAsIDIsICJocmRzZXR1cCIpOwogCisJYXRvbWljX3NldCgmY2FyZC0+Zm9yY2VfYWxsb2Nfc2tiLCAwKTsKIHJldHJ5OgogCWlmIChyZXRyaWVzIDwgMyl7CiAJCVBSSU5UX1dBUk4oIlJldHJ5aW5nIHRvIGRvIElEWCBhY3RpdmF0ZXMuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9wcm9jLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfcHJvYy5jCmluZGV4IDg5ZDU2YzguLmYxZmYxNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9wcm9jLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Byb2MuYwpAQCAtMjEyLDYgKzIxMiwxMiBAQAogCQkgICAgICAiICBTa2IgZnJhZ21lbnRzIHNlbnQgaW4gU0cgbW9kZSAgICAgICAgICA6ICV1XG5cbiIsCiAJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfc2tic19zZW50LAogCQkgICAgICBjYXJkLT5wZXJmX3N0YXRzLnNnX2ZyYWdzX3NlbnQpOworCXNlcV9wcmludGYocywgIiAgU2ticyByZWNlaXZlZCBpbiBTRyBtb2RlICAgICAgICAgICAgICAgOiAldVxuIgorCQkgICAgICAiICBTa2IgZnJhZ21lbnRzIHJlY2VpdmVkIGluIFNHIG1vZGUgICAgICA6ICV1XG4iCisJCSAgICAgICIgIFBhZ2UgYWxsb2NhdGlvbnMgZm9yIHJ4IFNHIG1vZGUgICAgICAgIDogJXVcblxuIiwKKwkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5zZ19za2JzX3J4LAorCQkgICAgICBjYXJkLT5wZXJmX3N0YXRzLnNnX2ZyYWdzX3J4LAorCQkgICAgICBjYXJkLT5wZXJmX3N0YXRzLnNnX2FsbG9jX3BhZ2VfcngpOwogCXNlcV9wcmludGYocywgIiAgbGFyZ2Vfc2VuZCB0eCAoaW4gS2J5dGVzKSAgICAgICAgICAgICAgOiAldVxuIgogCQkgICAgICAiICBsYXJnZV9zZW5kIGNvdW50ICAgICAgICAgICAgICAgICAgICAgICA6ICV1XG5cbiIsCiAJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMubGFyZ2Vfc2VuZF9ieXRlcyA+PiAxMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYwppbmRleCAwMjJlODY5Li43YjU3NzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMgYi9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKaW5kZXggNTEyODU3YS4uNTE1N2EyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYwpAQCAtNjE5LDggKzYxOSw3IEBACiAJanNmMC5idXN5ID0gMDsKIAogCW1pc2NfZGVyZWdpc3RlcigmanNmX2Rldik7Ci0JaWYgKHVucmVnaXN0ZXJfYmxrZGV2KEpTRkRfTUFKT1IsICJqc2ZkIikgIT0gMCkKLQkJcHJpbnRrKCJqc2ZkOiBjbGVhbnVwX21vZHVsZSBmYWlsZWRcbiIpOworCXVucmVnaXN0ZXJfYmxrZGV2KEpTRkRfTUFKT1IsICJqc2ZkIik7CiAJYmxrX2NsZWFudXBfcXVldWUoanNmX3F1ZXVlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCA5ZDIxMTliLi4zNzI3MjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtNTQ1LDcgKzU0NSw3IEBACiAKIGNvbmZpZyBTQ1NJX0JVU0xPR0lDCiAJdHJpc3RhdGUgIkJ1c0xvZ2ljIFNDU0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChQQ0kgfHwgSVNBIHx8IE1DQSkgJiYgU0NTSSAmJiBJU0FfRE1BX0FQSQorCWRlcGVuZHMgb24gKFBDSSB8fCBJU0EgfHwgTUNBKSAmJiBTQ1NJICYmIElTQV9ETUFfQVBJICYmIFZJUlRfVE9fQlVTCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBCdXNMb2dpYyBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludCBTQ1NJIEhvc3QKIAkgIEFkYXB0ZXJzLiBDb25zdWx0IHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwppbmRleCBkNzBkZGZkLi45YzUzNDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwpAQCAtNDAsNiArNDAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKIC8qIC0tLS0tLS0tLS0gU0NTSSBIb3N0IGdsdWUgLS0tLS0tLS0tLSAqLwpAQCAtODY4LDggKzg2OSw2IEBACiB7CiAJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IF9zYXNfaGE7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCXdoaWxlICgxKSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCXNjaGVkdWxlKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwppbmRleCA5YWRiNjRhLi44YTUyNWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CkBAIC0xNTE2LDggKzE1MTcsNiBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGF0YTsKIAotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJLyoKIAkgKiBXZSB1c2UgVEFTS19JTlRFUlJVUFRJQkxFIHNvIHRoYXQgdGhlIHRocmVhZCBpcyBub3QKIAkgKiBjb3VudGVkIGFnYWluc3QgdGhlIGxvYWQgYXZlcmFnZSBhcyBhIHJ1bm5pbmcgcHJvY2Vzcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggNDQ4ZDMxNi4uNDI0ZDU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTY4NCw3ICs2ODQsNyBAQAogCQljYXNlIFNDU0lfSU9DVExfR0VUX0JVU19OVU1CRVI6CiAJCQlyZXR1cm4gc2NzaV9pb2N0bChzZHAsIGNtZCwgcCk7CiAJCWRlZmF1bHQ6Ci0JCQllcnJvciA9IHNjc2lfY21kX2lvY3RsKGZpbHAsIGRpc2ssIGNtZCwgcCk7CisJCQllcnJvciA9IHNjc2lfY21kX2lvY3RsKGZpbHAsIGRpc2stPnF1ZXVlLCBkaXNrLCBjbWQsIHApOwogCQkJaWYgKGVycm9yICE9IC1FTk9UVFkpCiAJCQkJcmV0dXJuIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKaW5kZXggNTViZmVjYy4uYTRmN2I4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL3N0LmMKQEAgLTM1NDksNyArMzU0OSw4IEBACiAJCQkgICAgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCQkJaSA9IC1FUEVSTTsKIAkJCWVsc2UKLQkJCQlpID0gc2NzaV9jbWRfaW9jdGwoZmlsZSwgU1RwLT5kaXNrLCBjbWRfaW4sIHApOworCQkJCWkgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBTVHAtPmRpc2stPnF1ZXVlLAorCQkJCQkJICAgU1RwLT5kaXNrLCBjbWRfaW4sIHApOwogCQkJaWYgKGkgIT0gLUVOT1RUWSkKIAkJCQlyZXR1cm4gaTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKaW5kZXggNjg4MTdhNy4uMmFhNmJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCkBAIC05MzQsOCArOTM0LDYgQEAKIAkvKgogCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZwogCSAqLwotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCi0KIAlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gKEJEX1NDX0VNUFRZIHwgQkRfU0NfT1YpOwogCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCiAJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gQkRfU0NfRlIgfCBCRF9TQ19QUjsKQEAgLTE1MjcsMTEgKzE1MjUsNiBAQAogewogCXNlcl9pbmZvX3QgKmluZm8gPSAoc2VyX2luZm9fdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CiAKLQlpZiAoICAgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkgICAgJiYgKCAgIFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCi0JCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCi0JICByZXR1cm47Ci0KIAljaGFuZ2Vfc3BlZWQoaW5mbyk7CiAKICNpZmRlZiBtb2RlbV9jb250cm9sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggYzg0ZGFiMC4uMGIzZWMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMjUxNCwxMiArMjUxNCwxOCBAQAogCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKHBvcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBzZXJpYWw4MjUwX2NvbnNvbGVfZWFybHlfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gc2VyaWFsODI1MF9maW5kX3BvcnRfZm9yX2Vhcmx5Y29uKCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2VyaWFsODI1MF9yZWc7CiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyaWFsODI1MF9jb25zb2xlID0gewogCS5uYW1lCQk9ICJ0dHlTIiwKIAkud3JpdGUJCT0gc2VyaWFsODI1MF9jb25zb2xlX3dyaXRlLAogCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKIAkuc2V0dXAJCT0gc2VyaWFsODI1MF9jb25zb2xlX3NldHVwLAorCS5lYXJseV9zZXR1cAk9IHNlcmlhbDgyNTBfY29uc29sZV9lYXJseV9zZXR1cCwKIAkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAogCS5pbmRleAkJPSAtMSwKIAkuZGF0YQkJPSAmc2VyaWFsODI1MF9yZWcsCkBAIC0yNTMzLDcgKzI1MzksNyBAQAogfQogY29uc29sZV9pbml0Y2FsbChzZXJpYWw4MjUwX2NvbnNvbGVfaW5pdCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwKQoraW50IHNlcmlhbDgyNTBfZmluZF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnApCiB7CiAJaW50IGxpbmU7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKQEAgLTI1NDYsMjYgKzI1NTIsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1pbnQgX19pbml0IHNlcmlhbDgyNTBfc3RhcnRfY29uc29sZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBjaGFyICpvcHRpb25zKQotewotCWludCBsaW5lOwotCi0JbGluZSA9IGZpbmRfcG9ydChwb3J0KTsKLQlpZiAobGluZSA8IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0JYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlTIiwgbGluZSwgb3B0aW9ucyk7Ci0JcHJpbnRrKCJBZGRpbmcgY29uc29sZSBvbiB0dHlTJWQgYXQgJXMgMHglbHggKG9wdGlvbnMgJyVzJylcbiIsCi0JCWxpbmUsIHBvcnQtPmlvdHlwZSA9PSBVUElPX01FTSA/ICJNTUlPIiA6ICJJL08gcG9ydCIsCi0JCXBvcnQtPmlvdHlwZSA9PSBVUElPX01FTSA/ICh1bnNpZ25lZCBsb25nKSBwb3J0LT5tYXBiYXNlIDoKLQkJICAgICh1bnNpZ25lZCBsb25nKSBwb3J0LT5pb2Jhc2UsIG9wdGlvbnMpOwotCWlmICghKHNlcmlhbDgyNTBfY29uc29sZS5mbGFncyAmIENPTl9FTkFCTEVEKSkgewotCQlzZXJpYWw4MjUwX2NvbnNvbGUuZmxhZ3MgJj0gfkNPTl9QUklOVEJVRkZFUjsKLQkJcmVnaXN0ZXJfY29uc29sZSgmc2VyaWFsODI1MF9jb25zb2xlKTsKLQl9Ci0JcmV0dXJuIGxpbmU7Ci19Ci0KICNkZWZpbmUgU0VSSUFMODI1MF9DT05TT0xFCSZzZXJpYWw4MjUwX2NvbnNvbGUKICNlbHNlCiAjZGVmaW5lIFNFUklBTDgyNTBfQ09OU09MRQlOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2Vhcmx5LmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2Vhcmx5LmMKaW5kZXggN2U1MTExOS4uOTQ3YzIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYwpAQCAtMTcsMTMgKzE3LDExIEBACiAgKiB3ZSBsb2NhdGUgdGhlIGRldmljZSBkaXJlY3RseSBieSBpdHMgTU1JTyBvciBJL08gcG9ydCBhZGRyZXNzLgogICoKICAqIFRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSBkZXZpY2UgZGlyZWN0bHksIGUuZy4sCi0gKgljb25zb2xlPXVhcnQsaW8sMHgzZjgsOTYwMG44Ci0gKgljb25zb2xlPXVhcnQsbW1pbywweGZmNWUwMDAwLDExNTIwMG44Ci0gKiBvciBwbGF0Zm9ybSBjb2RlIGNhbiBjYWxsIGVhcmx5X3VhcnRfY29uc29sZV9pbml0KCkgdG8gc2V0Ci0gKiB0aGUgZWFybHkgVUFSVCBkZXZpY2UuCi0gKgotICogQWZ0ZXIgdGhlIG5vcm1hbCBzZXJpYWwgZHJpdmVyIHN0YXJ0cywgd2UgdHJ5IHRvIGxvY2F0ZSB0aGUKLSAqIG1hdGNoaW5nIHR0eVMgZGV2aWNlIGFuZCBzdGFydCBhIGNvbnNvbGUgdGhlcmUuCisgKgllYXJseWNvbj11YXJ0ODI1MCxpbywweDNmOCw5NjAwbjgKKyAqCWVhcmx5Y29uPXVhcnQ4MjUwLG1taW8sMHhmZjVlMDAwMCwxMTUyMDBuOAorICogb3IKKyAqCWNvbnNvbGU9dWFydDgyNTAsaW8sMHgzZjgsOTYwMG44CisgKgljb25zb2xlPXVhcnQ4MjUwLG1taW8sMHhmZjVlMDAwMCwxMTUyMDBuOAogICovCiAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KQEAgLTMyLDE3ICszMCwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgorI2lmZGVmIENPTkZJR19GSVhfRUFSTFlDT05fTUVNCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjZW5kaWYKIAotc3RydWN0IGVhcmx5X3VhcnRfZGV2aWNlIHsKK3N0cnVjdCBlYXJseV9zZXJpYWw4MjUwX2RldmljZSB7CiAJc3RydWN0IHVhcnRfcG9ydCBwb3J0OwogCWNoYXIgb3B0aW9uc1sxNl07CQkvKiBlLmcuLCAxMTUyMDBuOCAqLwogCXVuc2lnbmVkIGludCBiYXVkOwogfTsKIAotc3RhdGljIHN0cnVjdCBlYXJseV91YXJ0X2RldmljZSBlYXJseV9kZXZpY2UgX19pbml0ZGF0YTsKLXN0YXRpYyBpbnQgZWFybHlfdWFydF9yZWdpc3RlcmVkIF9faW5pdGRhdGE7CitzdGF0aWMgc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlIGVhcmx5X2RldmljZTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgc2VyaWFsX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBvZmZzZXQpCiB7CkBAIC04MCw3ICs4Miw3IEBACiAJc2VyaWFsX291dChwb3J0LCBVQVJUX1RYLCBjKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3VhcnRfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9zZXJpYWw4MjUwX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZlYXJseV9kZXZpY2UucG9ydDsKIAl1bnNpZ25lZCBpbnQgaWVyOwpAQCAtMTExLDcgKzExMyw3IEBACiAJcmV0dXJuIChwb3J0LT51YXJ0Y2xrIC8gMTYpIC8gcXVvdDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfcG9ydChzdHJ1Y3QgZWFybHlfdWFydF9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X3BvcnQoc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZkZXZpY2UtPnBvcnQ7CiAJdW5zaWduZWQgaW50IGRpdmlzb3I7CkBAIC0xMzAsMTAgKzEzMiw5IEBACiAJc2VyaWFsX291dChwb3J0LCBVQVJUX0xDUiwgYyAmIH5VQVJUX0xDUl9ETEFCKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgZWFybHlfdWFydF9kZXZpY2UgKmRldmljZSwgY2hhciAqb3B0aW9ucykKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX29wdGlvbnMoc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlICpkZXZpY2UsIGNoYXIgKm9wdGlvbnMpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZkZXZpY2UtPnBvcnQ7Ci0JaW50IG1hcHNpemUgPSA2NDsKIAlpbnQgbW1pbywgbGVuZ3RoOwogCiAJaWYgKCFvcHRpb25zKQpAQCAtMTQzLDEyICsxNDQsMTggQEAKIAlpZiAoIXN0cm5jbXAob3B0aW9ucywgIm1taW8sIiwgNSkpIHsKIAkJcG9ydC0+aW90eXBlID0gVVBJT19NRU07CiAJCXBvcnQtPm1hcGJhc2UgPSBzaW1wbGVfc3RydG91bChvcHRpb25zICsgNSwgJm9wdGlvbnMsIDApOwotCQlwb3J0LT5tZW1iYXNlID0gaW9yZW1hcChwb3J0LT5tYXBiYXNlLCBtYXBzaXplKTsKKyNpZmRlZiBDT05GSUdfRklYX0VBUkxZQ09OX01FTQorCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0VBUkxZQ09OX01FTV9CQVNFLCBwb3J0LT5tYXBiYXNlICYgUEFHRV9NQVNLKTsKKwkJcG9ydC0+bWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKilfX2ZpeF90b192aXJ0KEZJWF9FQVJMWUNPTl9NRU1fQkFTRSk7CisJCXBvcnQtPm1lbWJhc2UgKz0gcG9ydC0+bWFwYmFzZSAmIH5QQUdFX01BU0s7CisjZWxzZQorCQlwb3J0LT5tZW1iYXNlID0gaW9yZW1hcChwb3J0LT5tYXBiYXNlLCA2NCk7CiAJCWlmICghcG9ydC0+bWVtYmFzZSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGRuJ3QgaW9yZW1hcCAweCVseFxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sIHBvcnQtPm1hcGJhc2UpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KKyNlbmRpZgogCQltbWlvID0gMTsKIAl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdGlvbnMsICJpbywiLCAzKSkgewogCQlwb3J0LT5pb3R5cGUgPSBVUElPX1BPUlQ7CkBAIC0xNzUsOSArMTgyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3VhcnRfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgZWFybHlfc2VyaWFsODI1MF9jb25zb2xlIF9faW5pdGRhdGEgPSB7CisJLm5hbWUJPSAidWFydCIsCisJLndyaXRlCT0gZWFybHlfc2VyaWFsODI1MF93cml0ZSwKKwkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIgfCBDT05fQk9PVCwKKwkuaW5kZXgJPSAtMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X3NlcmlhbDgyNTBfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKLQlzdHJ1Y3QgZWFybHlfdWFydF9kZXZpY2UgKmRldmljZSA9ICZlYXJseV9kZXZpY2U7CisJc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlICpkZXZpY2UgPSAmZWFybHlfZGV2aWNlOwogCWludCBlcnI7CiAKIAlpZiAoZGV2aWNlLT5wb3J0Lm1lbWJhc2UgfHwgZGV2aWNlLT5wb3J0LmlvYmFzZSkKQEAgLTE5MCw2MSArMjA0LDQ4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBlYXJseV91YXJ0X2NvbnNvbGUgX19pbml0ZGF0YSA9IHsKLQkubmFtZQk9ICJ1YXJ0IiwKLQkud3JpdGUJPSBlYXJseV91YXJ0X3dyaXRlLAotCS5zZXR1cAk9IGVhcmx5X3VhcnRfc2V0dXAsCi0JLmZsYWdzCT0gQ09OX1BSSU5UQlVGRkVSLAotCS5pbmRleAk9IC0xLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZWFybHlfdWFydF9jb25zb2xlX2luaXQodm9pZCkKLXsKLQlpZiAoIWVhcmx5X3VhcnRfcmVnaXN0ZXJlZCkgewotCQlyZWdpc3Rlcl9jb25zb2xlKCZlYXJseV91YXJ0X2NvbnNvbGUpOwotCQllYXJseV91YXJ0X3JlZ2lzdGVyZWQgPSAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLWNvbnNvbGVfaW5pdGNhbGwoZWFybHlfdWFydF9jb25zb2xlX2luaXQpOwotCi1pbnQgX19pbml0IGVhcmx5X3NlcmlhbF9jb25zb2xlX2luaXQoY2hhciAqY21kbGluZSkKK2ludCBfX2luaXQgc2V0dXBfZWFybHlfc2VyaWFsODI1MF9jb25zb2xlKGNoYXIgKmNtZGxpbmUpCiB7CiAJY2hhciAqb3B0aW9uczsKIAlpbnQgZXJyOwogCi0Jb3B0aW9ucyA9IHN0cnN0cihjbWRsaW5lLCAiY29uc29sZT11YXJ0LCIpOwotCWlmICghb3B0aW9ucykKLQkJcmV0dXJuIC1FTk9ERVY7CisJb3B0aW9ucyA9IHN0cnN0cihjbWRsaW5lLCAidWFydDgyNTAsIik7CisJaWYgKCFvcHRpb25zKSB7CisJCW9wdGlvbnMgPSBzdHJzdHIoY21kbGluZSwgInVhcnQsIik7CisJCWlmICghb3B0aW9ucykKKwkJCXJldHVybiAwOworCX0KIAogCW9wdGlvbnMgPSBzdHJjaHIoY21kbGluZSwgJywnKSArIDE7Ci0JaWYgKChlcnIgPSBlYXJseV91YXJ0X3NldHVwKE5VTEwsIG9wdGlvbnMpKSA8IDApCisJaWYgKChlcnIgPSBlYXJseV9zZXJpYWw4MjUwX3NldHVwKG9wdGlvbnMpKSA8IDApCiAJCXJldHVybiBlcnI7Ci0JcmV0dXJuIGVhcmx5X3VhcnRfY29uc29sZV9pbml0KCk7Ci19CiAKLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3VhcnRfY29uc29sZV9zd2l0Y2godm9pZCkKLXsKLQlzdHJ1Y3QgZWFybHlfdWFydF9kZXZpY2UgKmRldmljZSA9ICZlYXJseV9kZXZpY2U7Ci0Jc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZkZXZpY2UtPnBvcnQ7Ci0JaW50IG1taW8sIGxpbmU7Ci0KLQlpZiAoIShlYXJseV91YXJ0X2NvbnNvbGUuZmxhZ3MgJiBDT05fRU5BQkxFRCkpCi0JCXJldHVybiAwOwotCi0JLyogVHJ5IHRvIHN0YXJ0IHRoZSBub3JtYWwgZHJpdmVyIG9uIGEgbWF0Y2hpbmcgbGluZS4gICovCi0JbW1pbyA9IChwb3J0LT5pb3R5cGUgPT0gVVBJT19NRU0pOwotCWxpbmUgPSBzZXJpYWw4MjUwX3N0YXJ0X2NvbnNvbGUocG9ydCwgZGV2aWNlLT5vcHRpb25zKTsKLQlpZiAobGluZSA8IDApCi0JCXByaW50aygiTm8gdHR5UyBkZXZpY2UgYXQgJXMgMHglbHggZm9yIGNvbnNvbGVcbiIsCi0JCQltbWlvID8gIk1NSU8iIDogIkkvTyBwb3J0IiwKLQkJCW1taW8gPyBwb3J0LT5tYXBiYXNlIDoKLQkJCSAgICAodW5zaWduZWQgbG9uZykgcG9ydC0+aW9iYXNlKTsKLQotCXVucmVnaXN0ZXJfY29uc29sZSgmZWFybHlfdWFydF9jb25zb2xlKTsKLQlpZiAobW1pbykKLQkJaW91bm1hcChwb3J0LT5tZW1iYXNlKTsKKwlyZWdpc3Rlcl9jb25zb2xlKCZlYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUpOwogCiAJcmV0dXJuIDA7CiB9Ci1sYXRlX2luaXRjYWxsKGVhcmx5X3VhcnRfY29uc29sZV9zd2l0Y2gpOworCitpbnQgX19pbml0IHNlcmlhbDgyNTBfZmluZF9wb3J0X2Zvcl9lYXJseWNvbih2b2lkKQoreworCXN0cnVjdCBlYXJseV9zZXJpYWw4MjUwX2RldmljZSAqZGV2aWNlID0gJmVhcmx5X2RldmljZTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKKwlpbnQgbGluZTsKKwlpbnQgcmV0OworCisJaWYgKCFkZXZpY2UtPnBvcnQubWVtYmFzZSAmJiAhZGV2aWNlLT5wb3J0LmlvYmFzZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlsaW5lID0gc2VyaWFsODI1MF9maW5kX3BvcnQocG9ydCk7CisJaWYgKGxpbmUgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IHVwZGF0ZV9jb25zb2xlX2NtZGxpbmUoInVhcnQiLCA4MjUwLAorCQkJICAgICAidHR5UyIsIGxpbmUsIGRldmljZS0+b3B0aW9ucyk7CisJaWYgKHJldCA8IDApCisJCXJldCA9IHVwZGF0ZV9jb25zb2xlX2NtZGxpbmUoInVhcnQiLCAwLAorCQkJCSAgICAgInR0eVMiLCBsaW5lLCBkZXZpY2UtPm9wdGlvbnMpOworCisJcmV0dXJuIHJldDsKK30KKworZWFybHlfcGFyYW0oImVhcmx5Y29uIiwgc2V0dXBfZWFybHlfc2VyaWFsODI1MF9jb25zb2xlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IDJhZGJlZDQuLjdmYTQxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtNjIsOCArNjIsMjIgQEAKIAkgIGtlcm5lbCB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBmaXJzdCBzZXJpYWwgbGluZSwgL2Rldi90dHlTMCwgYXMKIAkgIHN5c3RlbSBjb25zb2xlLgogCisJICB5b3UgY2FuIHNldCB0aGF0IHVzaW5nIGEga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gc3VjaCBhcworCSAgImNvbnNvbGU9dWFydDgyNTAsaW8sMHgzZjgsOTYwMG44IgorCSAgImNvbnNvbGU9dWFydDgyNTAsbW1pbywweGZmNWUwMDAwLDExNTIwMG44Ii4KKwkgIGFuZCBpdCB3aWxsIHN3aXRjaCB0byBub3JtYWwgc2VyaWFsIGNvbnNvbGUgd2hlbiBjb3JyZXBvbmRpbmcgcG9ydCBpcworCSAgcmVhZHkuCisJICAiZWFybHljb249dWFydDgyNTAsaW8sMHgzZjgsOTYwMG44IgorCSAgImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8sMHhmZjVlMDAwMCwxMTUyMDBuOCIuCisJICBpdCB3aWxsIG5vdCBvbmx5IHNldHVwIGVhcmx5IGNvbnNvbGUuCisKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBGSVhfRUFSTFlDT05fTUVNCisJYm9vbAorCWRlcGVuZHMgb24gWDg2CisJZGVmYXVsdCB5CisKIGNvbmZpZyBTRVJJQUxfODI1MF9HU0MKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgJiYgR1NDCkBAIC0zMjQsNiArMzM4LDM0IEBACiAJICB5b3VyIGJvb3QgbG9hZGVyIChsaWxvIG9yIGxvYWRsaW4pIGFib3V0IGhvdyB0byBwYXNzIG9wdGlvbnMgdG8gdGhlCiAJICBrZXJuZWwgYXQgYm9vdCB0aW1lLikKIAorY29uZmlnIFNFUklBTF9TQjEyNTBfRFVBUlQKKwl0cmlzdGF0ZSAiQkNNMXh4eCBvbi1jaGlwIERVQVJUIHNlcmlhbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0lCWVRFX1NCMXh4eF9TT0M9eQorCXNlbGVjdCBTRVJJQUxfQ09SRQorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBhc3luY2hyb25vdXMgc2VyaWFsIGludGVyZmFjZSAoRFVBUlQpIGluY2x1ZGVkIGluCisJICB0aGUgQkNNMTI1MCBhbmQgZGVyaXZlZCBTeXN0ZW0tT24tYS1DaGlwIChTT0MpIGRldmljZXMuICBOb3RlIHRoYXQKKwkgIHRoZSBsZXR0ZXIgRCBpbiBEVUFSVCBzdGFuZHMgZm9yICJkdWFsIiwgd2hpY2ggaXMgaG93IHRoZSBkZXZpY2UKKwkgIGlzIGltcGxlbWVudGVkLiAgRGVwZW5kaW5nIG9uIHRoZSBTT0MgY29uZmlndXJhdGlvbiB0aGVyZSBtYXkgYmUKKwkgIG9uZSBvciBtb3JlIERVQVJUcyBhdmFpbGFibGUgb2Ygd2hpY2ggYWxsIGFyZSBoYW5kbGVkLgorCisJICBJZiB1bnN1cmUsIHNheSBZLiAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZToKKwkgIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2IxMjUwLWR1YXJ0LgorCitjb25maWcgU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFCisJYm9vbCAiU3VwcG9ydCBmb3IgY29uc29sZSBvbiBhIEJDTTF4eHggRFVBUlQgc2VyaWFsIHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfU0IxMjUwX0RVQVJUPXkKKwlzZWxlY3QgU0VSSUFMX0NPUkVfQ09OU09MRQorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHVzZSBhIHNlcmlhbCBwb3J0IGFzIHRoZQorCSAgc3lzdGVtIGNvbnNvbGUgKHRoZSBzeXN0ZW0gY29uc29sZSBpcyB0aGUgZGV2aWNlIHdoaWNoIHJlY2VpdmVzIGFsbAorCSAga2VybmVsIG1lc3NhZ2VzIGFuZCB3YXJuaW5ncyBhbmQgd2hpY2ggYWxsb3dzIGxvZ2lucyBpbiBzaW5nbGUgdXNlcgorCSAgbW9kZSkuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKIGNvbmZpZyBTRVJJQUxfQVRNRUwKIAlib29sICJBVDkxIC8gQVQzMiBvbi1jaGlwIHNlcmlhbCBwb3J0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiAoQVJNICYmIEFSQ0hfQVQ5MSkgfHwgQVZSMzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggMDhhZDBkOS4uYzQ4Y2RkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTUxLDYgKzUxLDcgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfSUNPTSkgKz0gaWNvbS5vCiBvYmotJChDT05GSUdfU0VSSUFMX00zMlJfU0lPKSArPSBtMzJyX3Npby5vCiBvYmotJChDT05GSUdfU0VSSUFMX01QU0MpICs9IG1wc2Mubworb2JqLSQoQ09ORklHX1NFUklBTF9TQjEyNTBfRFVBUlQpICs9IHNiMTI1MC1kdWFydC5vCiBvYmotJChDT05GSUdfRVRSQVhfU0VSSUFMKSArPSBjcmlzdjEwLm8KIG9iai0kKENPTkZJR19TRVJJQUxfSlNNKSArPSBqc20vCiBvYmotJChDT05GSUdfU0VSSUFMX1RYWDkpICs9IHNlcmlhbF90eHg5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggMzMyMGJjZC4uNGQ2YjNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKQEAgLTExNCw2ICsxMTQsNyBAQAogCXN0cnVjdCB1YXJ0X3BvcnQJdWFydDsJCS8qIHVhcnQgKi8KIAlzdHJ1Y3QgY2xrCQkqY2xrOwkJLyogdWFydCBjbG9jayAqLwogCXVuc2lnbmVkIHNob3J0CQlzdXNwZW5kZWQ7CS8qIGlzIHBvcnQgc3VzcGVuZGVkPyAqLworCWludAkJCWJyZWFrX2FjdGl2ZTsJLyogYnJlYWsgYmVpbmcgcmVjZWl2ZWQgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0IGF0bWVsX3BvcnRzW0FUTUVMX01BWF9VQVJUXTsKQEAgLTI1Miw2ICsyNTMsNyBAQAogICovCiBzdGF0aWMgdm9pZCBhdG1lbF9yeF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSAoc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqKSBwb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT50dHk7CiAJdW5zaWduZWQgaW50IHN0YXR1cywgY2gsIGZsZzsKIApAQCAtMjY3LDEzICsyNjksMjkgQEAKIAkJICogbm90ZSB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBjb2RlIGlzCiAJCSAqIG91dCBvZiB0aGUgbWFpbiBleGVjdXRpb24gcGF0aAogCQkgKi8KLQkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChBVE1FTF9VU19QQVJFIHwgQVRNRUxfVVNfRlJBTUUgfCBBVE1FTF9VU19PVlJFIHwgQVRNRUxfVVNfUlhCUkspKSkgeworCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKEFUTUVMX1VTX1BBUkUgfCBBVE1FTF9VU19GUkFNRQorCQkJCSAgICAgICB8IEFUTUVMX1VTX09WUkUgfCBBVE1FTF9VU19SWEJSSykKKwkJCSAgICAgfHwgYXRtZWxfcG9ydC0+YnJlYWtfYWN0aXZlKSkgewogCQkJVUFSVF9QVVRfQ1IocG9ydCwgQVRNRUxfVVNfUlNUU1RBKTsJLyogY2xlYXIgZXJyb3IgKi8KLQkJCWlmIChzdGF0dXMgJiBBVE1FTF9VU19SWEJSSykgeworCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1JYQlJLCisJCQkgICAgJiYgIWF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSkgewogCQkJCXN0YXR1cyAmPSB+KEFUTUVMX1VTX1BBUkUgfCBBVE1FTF9VU19GUkFNRSk7CS8qIGlnbm9yZSBzaWRlLWVmZmVjdCAqLwogCQkJCXBvcnQtPmljb3VudC5icmsrKzsKKwkJCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAxOworCQkJCVVBUlRfUFVUX0lFUihwb3J0LCBBVE1FTF9VU19SWEJSSyk7CiAJCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQogCQkJCQlnb3RvIGlnbm9yZV9jaGFyOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgZWl0aGVyIHRoZSBlbmQtb2YtYnJlYWsKKwkJCQkgKiBjb25kaXRpb24gb3Igd2UndmUgcmVjZWl2ZWQgYXQKKwkJCQkgKiBsZWFzdCBvbmUgY2hhcmFjdGVyIHdpdGhvdXQgUlhCUksKKwkJCQkgKiBiZWluZyBzZXQuIEluIGJvdGggY2FzZXMsIHRoZSBuZXh0CisJCQkJICogUlhCUksgd2lsbCBpbmRpY2F0ZSBzdGFydC1vZi1icmVhay4KKwkJCQkgKi8KKwkJCQlVQVJUX1BVVF9JRFIocG9ydCwgQVRNRUxfVVNfUlhCUkspOworCQkJCXN0YXR1cyAmPSB+QVRNRUxfVVNfUlhCUks7CisJCQkJYXRtZWxfcG9ydC0+YnJlYWtfYWN0aXZlID0gMDsKIAkJCX0KIAkJCWlmIChzdGF0dXMgJiBBVE1FTF9VU19QQVJFKQogCQkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKQEAgLTM1Miw2ICszNzAsMTYgQEAKIAkJLyogSW50ZXJydXB0IHJlY2VpdmUgKi8KIAkJaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SWFJEWSkKIAkJCWF0bWVsX3J4X2NoYXJzKHBvcnQpOworCQllbHNlIGlmIChwZW5kaW5nICYgQVRNRUxfVVNfUlhCUkspIHsKKwkJCS8qCisJCQkgKiBFbmQgb2YgYnJlYWsgZGV0ZWN0ZWQuIElmIGl0IGNhbWUgYWxvbmcKKwkJCSAqIHdpdGggYSBjaGFyYWN0ZXIsIGF0bWVsX3J4X2NoYXJzIHdpbGwKKwkJCSAqIGhhbmRsZSBpdC4KKwkJCSAqLworCQkJVUFSVF9QVVRfQ1IocG9ydCwgQVRNRUxfVVNfUlNUU1RBKTsKKwkJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19SWEJSSyk7CisJCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAwOworCQl9CiAKIAkJLy8gVE9ETzogQWxsIHJlYWRzIHRvIENTUiB3aWxsIGNsZWFyIHRoZXNlIGludGVycnVwdHMhCiAJCWlmIChwZW5kaW5nICYgQVRNRUxfVVNfUklJQykgcG9ydC0+aWNvdW50LnJuZysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCmluZGV4IGI2M2ZmOGQuLmNlZmRlNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogCQl9CiAJCWJkcC0+Y2JkX2RhdGxlbiA9IGNvdW50OwogCQliZHAtPmNiZF9zYyB8PSBCRF9TQ19SRUFEWTsKLQkJX19hc21fXygiZWllaW8iKTsKKwkJZWllaW8oKTsKIAkJLyogR2V0IG5leHQgQkQuICovCiAJCWlmIChiZHAtPmNiZF9zYyAmIEJEX1NDX1dSQVApCiAJCQliZHAgPSBwaW5mby0+dHhfYmRfYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jIGIvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMKaW5kZXggYzNhYmZiMy4uZjMyNTdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMKQEAgLTg2Miw2ICs4NjIsNyBAQAogCXVwLT5jZmxhZyA9IHRlcm1pb3MtPmNfY2ZsYWc7CiAKIAlpcDIyemlsb2dfbWF5YmVfdXBkYXRlX3JlZ3ModXAsIFpJTE9HX0NIQU5ORUxfRlJPTV9QT1JUKHBvcnQpKTsKKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogfQpAQCAtMTAxNyw2ICsxMDE4LDggQEAKIAl9CiAKIAljb24tPmNmbGFnID0gY2ZsYWcgfCBDUzg7CQkJLyogOE4xICovCisKKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KCZpcDIyemlsb2dfcG9ydF90YWJsZVtjb24tPmluZGV4XS5wb3J0LCBjZmxhZywgYmF1ZCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGlwMjJ6aWxvZ19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjb24sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCmluZGV4IDdmZmRhZWEuLmE2NGQ4NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCkBAIC0xNyw2ICsxNywxMSBAQAogI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKK3N0cnVjdCBvZl9zZXJpYWxfaW5mbyB7CisJaW50IHR5cGU7CisJaW50IGxpbmU7Cit9OworCiAvKgogICogRmlsbCBhIHN0cnVjdCB1YXJ0X3BvcnQgZm9yIGEgZ2l2ZW4gZGV2aWNlIG5vZGUKICAqLwpAQCAtNjIsNiArNjcsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgb2ZfcGxhdGZvcm1fc2VyaWFsX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAogCQkJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQpCiB7CisJc3RydWN0IG9mX3NlcmlhbF9pbmZvICppbmZvOwogCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKIAlpbnQgcG9ydF90eXBlOwogCWludCByZXQ7CkBAIC02OSwzMCArNzUsMzUgQEAKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShvZmRldi0+bm9kZSwgInVzZWQtYnktcnRhcyIsIE5VTEwpKQogCQlyZXR1cm4gLUVCVVNZOwogCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlwb3J0X3R5cGUgPSAodW5zaWduZWQgbG9uZylpZC0+ZGF0YTsKIAlyZXQgPSBvZl9wbGF0Zm9ybV9zZXJpYWxfc2V0dXAob2ZkZXYsIHBvcnRfdHlwZSwgJnBvcnQpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCiAJc3dpdGNoIChwb3J0X3R5cGUpIHsKLQljYXNlIFBPUlRfVU5LTk9XTjoKLQkJZGV2X2luZm8oJm9mZGV2LT5kZXYsICJVbmtub3duIHNlcmlhbCBwb3J0IGZvdW5kLCAiCi0JCQkiYXR0ZW1wdGluZyB0byB1c2UgODI1MCBkcml2ZXJcbiIpOwotCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgUE9SVF84MjUwIC4uLiBQT1JUX01BWF84MjUwOgogCQlyZXQgPSBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoJnBvcnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBuZWVkIHRvIGFkZCBjb2RlIGZvciB0aGVzZSAqLworCWNhc2UgUE9SVF9VTktOT1dOOgorCQlkZXZfaW5mbygmb2ZkZXYtPmRldiwgIlVua25vd24gc2VyaWFsIHBvcnQgZm91bmQsIGlnbm9yZWRcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlicmVhazsKIAl9CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0Jb2ZkZXYtPmRldi5kcml2ZXJfZGF0YSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcmV0OworCWluZm8tPnR5cGUgPSBwb3J0X3R5cGU7CisJaW5mby0+bGluZSA9IHJldDsKKwlvZmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gaW5mbzsKIAlyZXR1cm4gMDsKIG91dDoKKwlrZnJlZShpbmZvKTsKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKHBvcnQuaXJxKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAyLDggKzExMywxNiBAQAogICovCiBzdGF0aWMgaW50IG9mX3BsYXRmb3JtX3NlcmlhbF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCiB7Ci0JaW50IGxpbmUgPSAodW5zaWduZWQgbG9uZylvZmRldi0+ZGV2LmRyaXZlcl9kYXRhOwotCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KGxpbmUpOworCXN0cnVjdCBvZl9zZXJpYWxfaW5mbyAqaW5mbyA9IG9mZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisJc3dpdGNoIChpbmZvLT50eXBlKSB7CisJY2FzZSBQT1JUXzgyNTAgLi4uIFBPUlRfTUFYXzgyNTA6CisJCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KGluZm8tPmxpbmUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBuZWVkIHRvIGFkZCBjb2RlIGZvciB0aGVzZSAqLworCQlicmVhazsKKwl9CisJa2ZyZWUoaW5mbyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NiMTI1MC1kdWFydC5jIGIvZHJpdmVycy9zZXJpYWwvc2IxMjUwLWR1YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5ZDcyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NiMTI1MC1kdWFydC5jCkBAIC0wLDAgKzEsOTcyIEBACisvKgorICoJZHJpdmVycy9zZXJpYWwvc2IxMjUwLWR1YXJ0LmMKKyAqCisgKglTdXBwb3J0IGZvciB0aGUgYXN5bmNocm9ub3VzIHNlcmlhbCBpbnRlcmZhY2UgKERVQVJUKSBpbmNsdWRlZAorICoJaW4gdGhlIEJDTTEyNTAgYW5kIGRlcml2ZWQgU3lzdGVtLU9uLWEtQ2hpcCAoU09DKSBkZXZpY2VzLgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwNyAgTWFjaWVqIFcuIFJvenlja2kKKyAqCisgKglEZXJpdmVkIGZyb20gZHJpdmVycy9jaGFyL3NiMTI1MF9kdWFydC5jIGZvciB3aGljaCB0aGUgZm9sbG93aW5nCisgKgljb3B5cmlnaHQgYXBwbGllczoKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglSZWZlcmVuY2VzOgorICoKKyAqCSJCQ00xMjUwL0JDTTExMjUvQkNNMTEyNUggVXNlciBNYW51YWwiLCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX01BR0lDX1NZU1JRKQorI2RlZmluZSBTVVBQT1JUX1NZU1JRCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vd2FyLmg+CisKKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MC5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3VhcnQuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3N3YXJtLmg+CisKKworI2lmIGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDU1KSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg4MCkKKyNpbmNsdWRlIDxhc20vc2lieXRlL2JjbTE0ODBfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvYmNtMTQ4MF9pbnQuaD4KKworI2RlZmluZSBTQkRfQ0hBTlJFR1MobGluZSkJQV9CQ00xNDgwX0RVQVJUX0NIQU5SRUcoKGxpbmUpLCAwKQorI2RlZmluZSBTQkRfQ1RSTFJFR1MobGluZSkJQV9CQ00xNDgwX0RVQVJUX0NUUkxSRUcoKGxpbmUpLCAwKQorI2RlZmluZSBTQkRfSU5UKGxpbmUpCQkoS19CQ00xNDgwX0lOVF9VQVJUXzAgKyAobGluZSkpCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NJQllURV9TQjEyNTApIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xMTJYKQorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9pbnQuaD4KKworI2RlZmluZSBTQkRfQ0hBTlJFR1MobGluZSkJQV9EVUFSVF9DSEFOUkVHKChsaW5lKSwgMCkKKyNkZWZpbmUgU0JEX0NUUkxSRUdTKGxpbmUpCUFfRFVBUlRfQ1RSTFJFRygwKQorI2RlZmluZSBTQkRfSU5UKGxpbmUpCQkoS19JTlRfVUFSVF8wICsgKGxpbmUpKQorCisjZWxzZQorI2Vycm9yIGludmFsaWQgU0IxMjUwIFVBUlQgY29uZmlndXJhdGlvbgorCisjZW5kaWYKKworCitNT0RVTEVfQVVUSE9SKCJNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AbGludXgtbWlwcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJDTTF4eHggb24tY2hpcCBEVUFSVCBzZXJpYWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworI2RlZmluZSBEVUFSVF9NQVhfQ0hJUCAyCisjZGVmaW5lIERVQVJUX01BWF9TSURFIDIKKworLyoKKyAqIFBlci1wb3J0IHN0YXRlLgorICovCitzdHJ1Y3Qgc2JkX3BvcnQgeworCXN0cnVjdCBzYmRfZHVhcnQJKmR1YXJ0OworCXN0cnVjdCB1YXJ0X3BvcnQJcG9ydDsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0JKm1lbWN0cmw7CisJaW50CQkJdHhfc3RvcHBlZDsKKwlpbnQJCQlpbml0aWFsaXNlZDsKK307CisKKy8qCisgKiBQZXItRFVBUlQgc3RhdGUgZm9yIHRoZSBzaGFyZWQgcmVnaXN0ZXIgc3BhY2UuCisgKi8KK3N0cnVjdCBzYmRfZHVhcnQgeworCXN0cnVjdCBzYmRfcG9ydAkJc3BvcnRbMl07CisJdW5zaWduZWQgbG9uZwkJbWFwY3RybDsKKwlhdG9taWNfdAkJbWFwX2d1YXJkOworfTsKKworI2RlZmluZSB0b19zcG9ydCh1cG9ydCkgY29udGFpbmVyX29mKHVwb3J0LCBzdHJ1Y3Qgc2JkX3BvcnQsIHBvcnQpCisKK3N0YXRpYyBzdHJ1Y3Qgc2JkX2R1YXJ0IHNiZF9kdWFydHNbRFVBUlRfTUFYX0NISVBdOworCisjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorCisKKy8qCisgKiBSZWFkaW5nIGFuZCB3cml0aW5nIFNCMTI1MCBEVUFSVCByZWdpc3RlcnMuCisgKgorICogVGhlcmUgYXJlIHRocmVlIHJlZ2lzdGVyIHNwYWNlczogdHdvIHBlci1jaGFubmVsIG9uZXMgYW5kCisgKiBhIHNoYXJlZCBvbmUuICBXZSBoYXZlIHRvIGRlZmluZSBhY2Nlc3NvcnMgYXBwcm9wcmlhdGVseS4KKyAqIEFsbCByZWdpc3RlcnMgYXJlIDY0LWJpdCBhbmQgYWxsIGJ1dCB0aGUgQmF1ZCBSYXRlIENsb2NrCisgKiByZWdpc3RlcnMgb25seSBkZWZpbmUgOCBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAgVGhlcmUgaXMKKyAqIGFsc28gYSB3b3JrYXJvdW5kIHRvIHRha2UgaW50byBhY2NvdW50LiAgUmF3IGFjY2Vzc29ycyB1c2UKKyAqIHRoZSBmdWxsIHJlZ2lzdGVyIHdpZHRoLCBidXQgY29va2VkIG9uZXMgdHJ1bmNhdGUgaXQKKyAqIGludGVudGlvbmFsbHkgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgZHJpdmVyIGRvZXMgbm90IGNhcmUuCisgKi8KK3N0YXRpYyB1NjQgX19yZWFkX3NiZGNobihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnKQoreworCXZvaWQgX19pb21lbSAqY3NyID0gc3BvcnQtPnBvcnQubWVtYmFzZSArIHJlZzsKKworCXJldHVybiBfX3Jhd19yZWFkcShjc3IpOworfQorCitzdGF0aWMgdTY0IF9fcmVhZF9zYmRzaHIoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZykKK3sKKwl2b2lkIF9faW9tZW0gKmNzciA9IHNwb3J0LT5tZW1jdHJsICsgcmVnOworCisJcmV0dXJuIF9fcmF3X3JlYWRxKGNzcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fd3JpdGVfc2JkY2huKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcsIHU2NCB2YWx1ZSkKK3sKKwl2b2lkIF9faW9tZW0gKmNzciA9IHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyByZWc7CisKKwlfX3Jhd193cml0ZXEodmFsdWUsIGNzcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fd3JpdGVfc2Jkc2hyKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcsIHU2NCB2YWx1ZSkKK3sKKwl2b2lkIF9faW9tZW0gKmNzciA9IHNwb3J0LT5tZW1jdHJsICsgcmVnOworCisJX19yYXdfd3JpdGVxKHZhbHVlLCBjc3IpOworfQorCisvKgorICogSW4gYnVnIDE5NTYsIHdlIGdldCBnbGl0Y2hlcyB0aGF0IGNhbiBtZXNzIHVwIHVhcnQgcmVnaXN0ZXJzLiAgVGhpcworICogInJlYWQtbW9kZS1yZWcgYWZ0ZXIgYW55IHJlZ2lzdGVyIGFjY2VzcyIgaXMgYW4gYWNjZXB0ZWQgd29ya2Fyb3VuZC4KKyAqLworc3RhdGljIHZvaWQgX193YXJfc2JkMTk1NihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCV9fcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMSk7CisJX19yZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18yKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9zYmRjaG4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHJldHZhbDsKKworCXJldHZhbCA9IF9fcmVhZF9zYmRjaG4oc3BvcnQsIHJlZyk7CisJaWYgKFNJQllURV8xOTU2X1dBUikKKwkJX193YXJfc2JkMTk1NihzcG9ydCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9zYmRzaHIoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHJldHZhbDsKKworCXJldHZhbCA9IF9fcmVhZF9zYmRzaHIoc3BvcnQsIHJlZyk7CisJaWYgKFNJQllURV8xOTU2X1dBUikKKwkJX193YXJfc2JkMTk1NihzcG9ydCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfc2JkY2huKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlfX3dyaXRlX3NiZGNobihzcG9ydCwgcmVnLCB2YWx1ZSk7CisJaWYgKFNJQllURV8xOTU2X1dBUikKKwkJX193YXJfc2JkMTk1NihzcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NiZHNocihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJX193cml0ZV9zYmRzaHIoc3BvcnQsIHJlZywgdmFsdWUpOworCWlmIChTSUJZVEVfMTk1Nl9XQVIpCisJCV9fd2FyX3NiZDE5NTYoc3BvcnQpOworfQorCisKK3N0YXRpYyBpbnQgc2JkX3JlY2VpdmVfcmVhZHkoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlyZXR1cm4gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfU1RBVFVTKSAmIE1fRFVBUlRfUlhfUkRZOworfQorCitzdGF0aWMgaW50IHNiZF9yZWNlaXZlX2RyYWluKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJaW50IGxvb3BzID0gMTAwMDA7CisKKwl3aGlsZSAoc2JkX3JlY2VpdmVfcmVhZHkoc3BvcnQpICYmIGxvb3BzLS0pCisJCXJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1JYX0hPTEQpOworCXJldHVybiBsb29wczsKK30KKworc3RhdGljIGludCBfX3VudXNlZCBzYmRfdHJhbnNtaXRfcmVhZHkoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlyZXR1cm4gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfU1RBVFVTKSAmIE1fRFVBUlRfVFhfUkRZOworfQorCitzdGF0aWMgaW50IF9fdW51c2VkIHNiZF90cmFuc21pdF9kcmFpbihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCWludCBsb29wcyA9IDEwMDAwOworCisJd2hpbGUgKCFzYmRfdHJhbnNtaXRfcmVhZHkoc3BvcnQpICYmIGxvb3BzLS0pCisJCXVkZWxheSgyKTsKKwlyZXR1cm4gbG9vcHM7Cit9CisKK3N0YXRpYyBpbnQgc2JkX3RyYW5zbWl0X2VtcHR5KHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJcmV0dXJuIHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1NUQVRVUykgJiBNX0RVQVJUX1RYX0VNVDsKK30KKworc3RhdGljIGludCBzYmRfbGluZV9kcmFpbihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCWludCBsb29wcyA9IDEwMDAwOworCisJd2hpbGUgKCFzYmRfdHJhbnNtaXRfZW1wdHkoc3BvcnQpICYmIGxvb3BzLS0pCisJCXVkZWxheSgyKTsKKwlyZXR1cm4gbG9vcHM7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBzYmRfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCXJldHVybiBzYmRfdHJhbnNtaXRfZW1wdHkoc3BvcnQpID8gVElPQ1NFUl9URU1UIDogMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzYmRfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJdW5zaWduZWQgaW50IG1jdHJsLCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTl9QT1JUKTsKKwlzdGF0dXMgPj49ICh1cG9ydC0+bGluZSkgJSAyOworCW1jdHJsID0gKCEoc3RhdHVzICYgTV9EVUFSVF9JTl9QSU4wX1ZBTCkgPyBUSU9DTV9DVFMgOiAwKSB8CisJCSghKHN0YXR1cyAmIE1fRFVBUlRfSU5fUElONF9WQUwpID8gVElPQ01fQ0FSIDogMCkgfAorCQkoIShzdGF0dXMgJiBNX0RVQVJUX1JJTjBfUElOKSA/IFRJT0NNX1JORyA6IDApIHwKKwkJKCEoc3RhdHVzICYgTV9EVUFSVF9JTl9QSU4yX1ZBTCkgPyBUSU9DTV9EU1IgOiAwKTsKKwlyZXR1cm4gbWN0cmw7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXVuc2lnbmVkIGludCBjbHIgPSAwLCBzZXQgPSAwLCBtb2RlMjsKKworCWlmIChtY3RybCAmIFRJT0NNX0RUUikKKwkJc2V0IHw9IE1fRFVBUlRfU0VUX09QUjI7CisJZWxzZQorCQljbHIgfD0gTV9EVUFSVF9DTFJfT1BSMjsKKwlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCisJCXNldCB8PSBNX0RVQVJUX1NFVF9PUFIwOworCWVsc2UKKwkJY2xyIHw9IE1fRFVBUlRfQ0xSX09QUjA7CisJY2xyIDw8PSAodXBvcnQtPmxpbmUpICUgMjsKKwlzZXQgPDw9ICh1cG9ydC0+bGluZSkgJSAyOworCisJbW9kZTIgPSByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18yKTsKKwltb2RlMiAmPSB+TV9EVUFSVF9DSEFOX01PREU7CisJaWYgKG1jdHJsICYgVElPQ01fTE9PUCkKKwkJbW9kZTIgfD0gVl9EVUFSVF9DSEFOX01PREVfTENMX0xPT1A7CisJZWxzZQorCQltb2RlMiB8PSBWX0RVQVJUX0NIQU5fTU9ERV9OT1JNQUw7CisKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfQ0xFQVJfT1BSLCBjbHIpOworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9TRVRfT1BSLCBzZXQpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18yLCBtb2RlMik7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0RJUyk7CisJc3BvcnQtPnR4X3N0b3BwZWQgPSAxOworfTsKKworc3RhdGljIHZvaWQgc2JkX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwkvKiBFbmFibGUgdHggaW50ZXJydXB0cy4gICovCisJbWFzayA9IHJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMikpOworCW1hc2sgfD0gTV9EVUFSVF9JTVJfVFg7CisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMiksIG1hc2spOworCisJLyogR28hLCBnbyEsIGdvIS4uLiAgKi8KKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0VOKTsKKwlzcG9ydC0+dHhfc3RvcHBlZCA9IDA7Cit9OworCitzdGF0aWMgdm9pZCBzYmRfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMiksIDApOworfTsKKworc3RhdGljIHZvaWQgc2JkX2VuYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0FVWENUTF9YLAorCQkgICAgIE1fRFVBUlRfQ0lOX0NITkdfRU5BIHwgTV9EVUFSVF9DVFNfQ0hOR19FTkEpOworfQorCitzdGF0aWMgdm9pZCBzYmRfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgVl9EVUFSVF9NSVNDX0NNRF9TVEFSVF9CUkVBSyk7CisJZWxzZQorCQl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBWX0RVQVJUX01JU0NfQ01EX1NUT1BfQlJFQUspOworfQorCisKK3N0YXRpYyB2b2lkIHNiZF9yZWNlaXZlX2NoYXJzKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJc3RydWN0IHVhcnRfaWNvdW50ICppY291bnQ7CisJdW5zaWduZWQgaW50IHN0YXR1cywgY2gsIGZsYWc7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudCA9IDE2OyBjb3VudDsgY291bnQtLSkgeworCQlzdGF0dXMgPSByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9TVEFUVVMpOworCQlpZiAoIShzdGF0dXMgJiBNX0RVQVJUX1JYX1JEWSkpCisJCQlicmVhazsKKworCQljaCA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1JYX0hPTEQpOworCisJCWZsYWcgPSBUVFlfTk9STUFMOworCisJCWljb3VudCA9ICZ1cG9ydC0+aWNvdW50OworCQlpY291bnQtPnJ4Kys7CisKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmCisJCQkgICAgIChNX0RVQVJUX1JDVkRfQlJLIHwgTV9EVUFSVF9GUk1fRVJSIHwKKwkJCSAgICAgIE1fRFVBUlRfUEFSSVRZX0VSUiB8IE1fRFVBUlRfT1ZSVU5fRVJSKSkpIHsKKwkJCWlmIChzdGF0dXMgJiBNX0RVQVJUX1JDVkRfQlJLKSB7CisJCQkJaWNvdW50LT5icmsrKzsKKwkJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsodXBvcnQpKQorCQkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzICYgTV9EVUFSVF9GUk1fRVJSKQorCQkJCWljb3VudC0+ZnJhbWUrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIE1fRFVBUlRfUEFSSVRZX0VSUikKKwkJCQlpY291bnQtPnBhcml0eSsrOworCQkJaWYgKHN0YXR1cyAmIE1fRFVBUlRfT1ZSVU5fRVJSKQorCQkJCWljb3VudC0+b3ZlcnJ1bisrOworCisJCQlzdGF0dXMgJj0gdXBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJCQlpZiAoc3RhdHVzICYgTV9EVUFSVF9SQ1ZEX0JSSykKKwkJCQlmbGFnID0gVFRZX0JSRUFLOworCQkJZWxzZSBpZiAoc3RhdHVzICYgTV9EVUFSVF9GUk1fRVJSKQorCQkJCWZsYWcgPSBUVFlfRlJBTUU7CisJCQllbHNlIGlmIChzdGF0dXMgJiBNX0RVQVJUX1BBUklUWV9FUlIpCisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CisJCX0KKworCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcih1cG9ydCwgY2gpKQorCQkJY29udGludWU7CisKKwkJdWFydF9pbnNlcnRfY2hhcih1cG9ydCwgc3RhdHVzLCBNX0RVQVJUX09WUlVOX0VSUiwgY2gsIGZsYWcpOworCX0KKworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHVwb3J0LT5pbmZvLT50dHkpOworfQorCitzdGF0aWMgdm9pZCBzYmRfdHJhbnNtaXRfY2hhcnMoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuaW5mby0+eG1pdDsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlpbnQgc3RvcF90eDsKKworCS8qIFhPTi9YT0ZGIGNoYXJzLiAgKi8KKwlpZiAoc3BvcnQtPnBvcnQueF9jaGFyKSB7CisJCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9UWF9IT0xELCBzcG9ydC0+cG9ydC54X2NoYXIpOworCQlzcG9ydC0+cG9ydC5pY291bnQudHgrKzsKKwkJc3BvcnQtPnBvcnQueF9jaGFyID0gMDsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIG5vdGhpbmcgdG8gZG8gb3Igc3RvcHBlZCBvciBoYXJkd2FyZSBzdG9wcGVkLiAgKi8KKwlzdG9wX3R4ID0gKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQoJnNwb3J0LT5wb3J0KSk7CisKKwkvKiBTZW5kIGNoYXIuICAqLworCWlmICghc3RvcF90eCkgeworCQl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfVFhfSE9MRCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LnR4Kys7CisKKwkJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCQkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKKwl9CisKKwkvKiBBcmUgd2UgYXJlIGRvbmU/ICAqLworCWlmIChzdG9wX3R4IHx8IHVhcnRfY2lyY19lbXB0eSh4bWl0KSkgeworCQkvKiBEaXNhYmxlIHR4IGludGVycnVwdHMuICAqLworCQltYXNrID0gcmVhZF9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJCW1hc2sgJj0gfk1fRFVBUlRfSU1SX1RYOworCQl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgbWFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzYmRfc3RhdHVzX2hhbmRsZShzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCXVuc2lnbmVkIGludCBkZWx0YTsKKworCWRlbHRhID0gcmVhZF9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU5DSFJFRygodXBvcnQtPmxpbmUpICUgMikpOworCWRlbHRhID4+PSAodXBvcnQtPmxpbmUpICUgMjsKKworCWlmIChkZWx0YSAmIChNX0RVQVJUX0lOX1BJTjBfVkFMIDw8IFNfRFVBUlRfSU5fUElOX0NITkcpKQorCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHVwb3J0LCAhKGRlbHRhICYgTV9EVUFSVF9JTl9QSU4wX1ZBTCkpOworCisJaWYgKGRlbHRhICYgKE1fRFVBUlRfSU5fUElOMl9WQUwgPDwgU19EVUFSVF9JTl9QSU5fQ0hORykpCisJCXVwb3J0LT5pY291bnQuZHNyKys7CisKKwlpZiAoZGVsdGEgJiAoKE1fRFVBUlRfSU5fUElOMl9WQUwgfCBNX0RVQVJUX0lOX1BJTjBfVkFMKSA8PAorCQkgICAgIFNfRFVBUlRfSU5fUElOX0NITkcpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVwb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYmRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gZGV2X2lkOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCWlycXJldHVybl90IHN0YXR1cyA9IElSUV9OT05FOworCXVuc2lnbmVkIGludCBpbnRzdGF0OworCWludCBjb3VudDsKKworCWZvciAoY291bnQgPSAxNjsgY291bnQ7IGNvdW50LS0pIHsKKwkJaW50c3RhdCA9IHJlYWRfc2Jkc2hyKHNwb3J0LAorCQkJCSAgICAgIFJfRFVBUlRfSVNSUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJCWludHN0YXQgJj0gcmVhZF9zYmRzaHIoc3BvcnQsCisJCQkJICAgICAgIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJCWludHN0YXQgJj0gTV9EVUFSVF9JU1JfQUxMOworCQlpZiAoIWludHN0YXQpCisJCQlicmVhazsKKworCQlpZiAoaW50c3RhdCAmIE1fRFVBUlRfSVNSX1JYKQorCQkJc2JkX3JlY2VpdmVfY2hhcnMoc3BvcnQpOworCQlpZiAoaW50c3RhdCAmIE1fRFVBUlRfSVNSX0lOKQorCQkJc2JkX3N0YXR1c19oYW5kbGUoc3BvcnQpOworCQlpZiAoaW50c3RhdCAmIE1fRFVBUlRfSVNSX1RYKQorCQkJc2JkX3RyYW5zbWl0X2NoYXJzKHNwb3J0KTsKKworCQlzdGF0dXMgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgc2JkX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgbW9kZTE7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKHNwb3J0LT5wb3J0LmlycSwgc2JkX2ludGVycnVwdCwKKwkJCSAgSVJRRl9TSEFSRUQsICJzYjEyNTAtZHVhcnQiLCBzcG9ydCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENsZWFyIHRoZSByZWNlaXZlIEZJRk8uICAqLworCXNiZF9yZWNlaXZlX2RyYWluKHNwb3J0KTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLiAgKi8KKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBWX0RVQVJUX01JU0NfQ01EX1JFU0VUX0JSRUFLX0lOVCk7CisJcmVhZF9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU5DSFJFRygodXBvcnQtPmxpbmUpICUgMikpOworCisJLyogU2V0IHJ4L3R4IGludGVycnVwdCB0byBGSUZPIGF2YWlsYWJsZS4gICovCisJbW9kZTEgPSByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xKTsKKwltb2RlMSAmPSB+KE1fRFVBUlRfUlhfSVJRX1NFTF9SWEZVTEwgfCBNX0RVQVJUX1RYX0lSUV9TRUxfVFhFTVBUKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMSwgbW9kZTEpOworCisJLyogRGlzYWJsZSB0eCwgZW5hYmxlIHJ4LiAgKi8KKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0RJUyB8IE1fRFVBUlRfUlhfRU4pOworCXNwb3J0LT50eF9zdG9wcGVkID0gMTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzLiAgKi8KKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwKKwkJICAgICBNX0RVQVJUX0lNUl9JTiB8IE1fRFVBUlRfSU1SX1JYKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYmRfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRElTIHwgTV9EVUFSVF9SWF9ESVMpOworCXNwb3J0LT50eF9zdG9wcGVkID0gMTsKKwlmcmVlX2lycShzcG9ydC0+cG9ydC5pcnEsIHNwb3J0KTsKK30KKworCitzdGF0aWMgdm9pZCBzYmRfaW5pdF9wb3J0KHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisKKwlpZiAoc3BvcnQtPmluaXRpYWxpc2VkKQorCQlyZXR1cm47CisKKwkvKiBUaGVyZSBpcyBubyBEVUFSVCByZXNldCBmZWF0dXJlLCBzbyBqdXN0IHNldCBzb21lIHNhbmUgZGVmYXVsdHMuICAqLworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIFZfRFVBUlRfTUlTQ19DTURfUkVTRVRfVFgpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIFZfRFVBUlRfTUlTQ19DTURfUkVTRVRfUlgpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xLCBWX0RVQVJUX0JJVFNfUEVSX0NIQVJfOCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIsIDApOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9GVUxMX0NUTCwKKwkJICAgICBWX0RVQVJUX0lOVF9USU1FKDApIHwgVl9EVUFSVF9TSUdfRlVMTCgxNSkpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9PUENSX1gsIDApOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9BVVhDVExfWCwgMCk7CisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMiksIDApOworCisJc3BvcnQtPmluaXRpYWxpc2VkID0gMTsKK30KKworc3RhdGljIHZvaWQgc2JkX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCQkgICAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXVuc2lnbmVkIGludCBtb2RlMSA9IDAsIG1vZGUyID0gMCwgYXV4ID0gMDsKKwl1bnNpZ25lZCBpbnQgbW9kZTFtYXNrID0gMCwgbW9kZTJtYXNrID0gMCwgYXV4bWFzayA9IDA7CisJdW5zaWduZWQgaW50IG9sZG1vZGUxLCBvbGRtb2RlMiwgb2xkYXV4OworCXVuc2lnbmVkIGludCBiYXVkLCBicmc7CisJdW5zaWduZWQgaW50IGNvbW1hbmQ7CisKKwltb2RlMW1hc2sgfD0gfihNX0RVQVJUX1BBUklUWV9NT0RFIHwgTV9EVUFSVF9QQVJJVFlfVFlQRV9PREQgfAorCQkgICAgICAgTV9EVUFSVF9CSVRTX1BFUl9DSEFSKTsKKwltb2RlMm1hc2sgfD0gfk1fRFVBUlRfU1RPUF9CSVRfTEVOXzI7CisJYXV4bWFzayB8PSB+TV9EVUFSVF9DVFNfQ0hOR19FTkE7CisKKwkvKiBCeXRlIHNpemUuICAqLworCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJY2FzZSBDUzY6CisJCS8qIFVuc3VwcG9ydGVkLCBsZWF2ZSB1bmNoYW5nZWQuICAqLworCQltb2RlMW1hc2sgfD0gTV9EVUFSVF9QQVJJVFlfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCW1vZGUxIHw9IFZfRFVBUlRfQklUU19QRVJfQ0hBUl83OworCQlicmVhazsKKwljYXNlIENTODoKKwlkZWZhdWx0OgorCQltb2RlMSB8PSBWX0RVQVJUX0JJVFNfUEVSX0NIQVJfODsKKwkJYnJlYWs7CisJfQorCisJLyogUGFyaXR5IGFuZCBzdG9wIGJpdHMuICAqLworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQorCQltb2RlMiB8PSBNX0RVQVJUX1NUT1BfQklUX0xFTl8yOworCWVsc2UKKwkJbW9kZTIgfD0gTV9EVUFSVF9TVE9QX0JJVF9MRU5fMTsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKKwkJbW9kZTEgfD0gVl9EVUFSVF9QQVJJVFlfTU9ERV9BREQ7CisJZWxzZQorCQltb2RlMSB8PSBWX0RVQVJUX1BBUklUWV9NT0RFX05PTkU7CisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpCisJCW1vZGUxIHw9IE1fRFVBUlRfUEFSSVRZX1RZUEVfT0REOworCWVsc2UKKwkJbW9kZTEgfD0gTV9EVUFSVF9QQVJJVFlfVFlQRV9FVkVOOworCisJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZSh1cG9ydCwgdGVybWlvcywgb2xkX3Rlcm1pb3MsIDEyMDAsIDUwMDAwMDApOworCWJyZyA9IFZfRFVBUlRfQkFVRF9SQVRFKGJhdWQpOworCS8qIFRoZSBhY3R1YWwgbG93ZXIgYm91bmQgaXMgMTIyMWJwcywgc28gY29tcGVuc2F0ZS4gICovCisJaWYgKGJyZyA+IE1fRFVBUlRfQ0xLX0NPVU5URVIpCisJCWJyZyA9IE1fRFVBUlRfQ0xLX0NPVU5URVI7CisKKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KHVwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKKworCXVwb3J0LT5yZWFkX3N0YXR1c19tYXNrID0gTV9EVUFSVF9PVlJVTl9FUlI7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJTlBDSykKKwkJdXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gTV9EVUFSVF9GUk1fRVJSIHwKKwkJCQkJICAgTV9EVUFSVF9QQVJJVFlfRVJSOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgKEJSS0lOVCB8IFBBUk1SSykpCisJCXVwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IE1fRFVBUlRfUkNWRF9CUks7CisKKwl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUikKKwkJdXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBNX0RVQVJUX0ZSTV9FUlIgfAorCQkJCQkgICAgIE1fRFVBUlRfUEFSSVRZX0VSUjsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTkJSSykgeworCQl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IE1fRFVBUlRfUkNWRF9CUks7CisJCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQkJdXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBNX0RVQVJUX09WUlVOX0VSUjsKKwl9CisKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKQorCQljb21tYW5kID0gTV9EVUFSVF9SWF9FTjsKKwllbHNlCisJCWNvbW1hbmQgPSBNX0RVQVJUX1JYX0RJUzsKKworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJYXV4IHw9IE1fRFVBUlRfQ1RTX0NITkdfRU5BOworCWVsc2UKKwkJYXV4ICY9IH5NX0RVQVJUX0NUU19DSE5HX0VOQTsKKworCXNwaW5fbG9jaygmdXBvcnQtPmxvY2spOworCisJaWYgKHNwb3J0LT50eF9zdG9wcGVkKQorCQljb21tYW5kIHw9IE1fRFVBUlRfVFhfRElTOworCWVsc2UKKwkJY29tbWFuZCB8PSBNX0RVQVJUX1RYX0VOOworCisJb2xkbW9kZTEgPSByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xKSAmIG1vZGUxbWFzazsKKwlvbGRtb2RlMiA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIpICYgbW9kZTJtYXNrOworCW9sZGF1eCA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0FVWENUTF9YKSAmIGF1eG1hc2s7CisKKwlpZiAoIXNwb3J0LT50eF9zdG9wcGVkKQorCQlzYmRfbGluZV9kcmFpbihzcG9ydCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9ESVMgfCBNX0RVQVJUX1JYX0RJUyk7CisKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMSwgbW9kZTEgfCBvbGRtb2RlMSk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIsIG1vZGUyIHwgb2xkbW9kZTIpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTEtfU0VMLCBicmcpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9BVVhDVExfWCwgYXV4IHwgb2xkYXV4KTsKKworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIGNvbW1hbmQpOworCisJc3Bpbl91bmxvY2soJnVwb3J0LT5sb2NrKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqc2JkX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJcmV0dXJuICJTQjEyNTAgRFVBUlQiOworfQorCitzdGF0aWMgdm9pZCBzYmRfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJc3RydWN0IHNiZF9kdWFydCAqZHVhcnQgPSBzcG9ydC0+ZHVhcnQ7CisJaW50IG1hcF9ndWFyZDsKKworCWlvdW5tYXAoc3BvcnQtPm1lbWN0cmwpOworCXNwb3J0LT5tZW1jdHJsID0gTlVMTDsKKwlpb3VubWFwKHVwb3J0LT5tZW1iYXNlKTsKKwl1cG9ydC0+bWVtYmFzZSA9IE5VTEw7CisKKwltYXBfZ3VhcmQgPSBhdG9taWNfYWRkX3JldHVybigtMSwgJmR1YXJ0LT5tYXBfZ3VhcmQpOworCWlmICghbWFwX2d1YXJkKQorCQlyZWxlYXNlX21lbV9yZWdpb24oZHVhcnQtPm1hcGN0cmwsIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHVwb3J0LT5tYXBiYXNlLCBEVUFSVF9DSEFOUkVHX1NQQUNJTkcpOworfQorCitzdGF0aWMgaW50IHNiZF9tYXBfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqZXJyID0gS0VSTl9FUlIgInNiZDogQ2Fubm90IG1hcCBNTUlPXG4iOworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJc3RydWN0IHNiZF9kdWFydCAqZHVhcnQgPSBzcG9ydC0+ZHVhcnQ7CisKKwlpZiAoIXVwb3J0LT5tZW1iYXNlKQorCQl1cG9ydC0+bWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZSh1cG9ydC0+bWFwYmFzZSwKKwkJCQkJCSBEVUFSVF9DSEFOUkVHX1NQQUNJTkcpOworCWlmICghdXBvcnQtPm1lbWJhc2UpIHsKKwkJcHJpbnRrKGVycik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICghc3BvcnQtPm1lbWN0cmwpCisJCXNwb3J0LT5tZW1jdHJsID0gaW9yZW1hcF9ub2NhY2hlKGR1YXJ0LT5tYXBjdHJsLAorCQkJCQkJIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7CisJaWYgKCFzcG9ydC0+bWVtY3RybCkgeworCQlwcmludGsoZXJyKTsKKwkJaW91bm1hcCh1cG9ydC0+bWVtYmFzZSk7CisJCXVwb3J0LT5tZW1iYXNlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JkX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqZXJyID0gS0VSTl9FUlIKKwkJCQkgInNiZDogVW5hYmxlIHRvIHJlc2VydmUgTU1JTyByZXNvdXJjZVxuIjsKKwlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9IHRvX3Nwb3J0KHVwb3J0KS0+ZHVhcnQ7CisJaW50IG1hcF9ndWFyZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHVwb3J0LT5tYXBiYXNlLCBEVUFSVF9DSEFOUkVHX1NQQUNJTkcsCisJCQkJInNiMTI1MC1kdWFydCIpKSB7CisJCXByaW50ayhlcnIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwltYXBfZ3VhcmQgPSBhdG9taWNfYWRkX3JldHVybigxLCAmZHVhcnQtPm1hcF9ndWFyZCk7CisJaWYgKG1hcF9ndWFyZCA9PSAxKSB7CisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGR1YXJ0LT5tYXBjdHJsLCBEVUFSVF9DSEFOUkVHX1NQQUNJTkcsCisJCQkJCSJzYjEyNTAtZHVhcnQiKSkgeworCQkJYXRvbWljX2FkZCgtMSwgJmR1YXJ0LT5tYXBfZ3VhcmQpOworCQkJcHJpbnRrKGVycik7CisJCQlyZXQgPSAtRUJVU1k7CisJCX0KKwl9CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gc2JkX21hcF9wb3J0KHVwb3J0KTsKKwkJaWYgKHJldCkgeworCQkJbWFwX2d1YXJkID0gYXRvbWljX2FkZF9yZXR1cm4oLTEsICZkdWFydC0+bWFwX2d1YXJkKTsKKwkJCWlmICghbWFwX2d1YXJkKQorCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihkdWFydC0+bWFwY3RybCwKKwkJCQkJCSAgIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7CisJCX0KKwl9CisJaWYgKHJldCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24odXBvcnQtPm1hcGJhc2UsIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYmRfY29uZmlnX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkgeworCQlpZiAoc2JkX3JlcXVlc3RfcG9ydCh1cG9ydCkpCisJCQlyZXR1cm47CisKKwkJdXBvcnQtPnR5cGUgPSBQT1JUX1NCMTI1MF9EVUFSVDsKKworCQlzYmRfaW5pdF9wb3J0KHNwb3J0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2JkX3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQoreworCWludCByZXQgPSAwOworCisJaWYgKHNlci0+dHlwZSAhPSBQT1JUX1VOS05PV04gJiYgc2VyLT50eXBlICE9IFBPUlRfU0IxMjUwX0RVQVJUKQorCQlyZXQgPSAtRUlOVkFMOworCWlmIChzZXItPmlycSAhPSB1cG9ydC0+aXJxKQorCQlyZXQgPSAtRUlOVkFMOworCWlmIChzZXItPmJhdWRfYmFzZSAhPSB1cG9ydC0+dWFydGNsayAvIDE2KQorCQlyZXQgPSAtRUlOVkFMOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBzYmRfb3BzID0geworCS50eF9lbXB0eQk9IHNiZF90eF9lbXB0eSwKKwkuc2V0X21jdHJsCT0gc2JkX3NldF9tY3RybCwKKwkuZ2V0X21jdHJsCT0gc2JkX2dldF9tY3RybCwKKwkuc3RvcF90eAk9IHNiZF9zdG9wX3R4LAorCS5zdGFydF90eAk9IHNiZF9zdGFydF90eCwKKwkuc3RvcF9yeAk9IHNiZF9zdG9wX3J4LAorCS5lbmFibGVfbXMJPSBzYmRfZW5hYmxlX21zLAorCS5icmVha19jdGwJPSBzYmRfYnJlYWtfY3RsLAorCS5zdGFydHVwCT0gc2JkX3N0YXJ0dXAsCisJLnNodXRkb3duCT0gc2JkX3NodXRkb3duLAorCS5zZXRfdGVybWlvcwk9IHNiZF9zZXRfdGVybWlvcywKKwkudHlwZQkJPSBzYmRfdHlwZSwKKwkucmVsZWFzZV9wb3J0CT0gc2JkX3JlbGVhc2VfcG9ydCwKKwkucmVxdWVzdF9wb3J0CT0gc2JkX3JlcXVlc3RfcG9ydCwKKwkuY29uZmlnX3BvcnQJPSBzYmRfY29uZmlnX3BvcnQsCisJLnZlcmlmeV9wb3J0CT0gc2JkX3ZlcmlmeV9wb3J0LAorfTsKKworLyogSW5pdGlhbGl6ZSBTQjEyNTAgRFVBUlQgcG9ydCBzdHJ1Y3R1cmVzLiAgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzYmRfcHJvYmVfZHVhcnRzKHZvaWQpCit7CisJc3RhdGljIGludCBwcm9iZWQ7CisJaW50IGNoaXAsIHNpZGU7CisJaW50IG1heF9saW5lcywgbGluZTsKKworCWlmIChwcm9iZWQpCisJCXJldHVybjsKKworCS8qIFNldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB1bml0cyBiYXNlZCBvbiB0aGUgU09DIHR5cGUuICAqLworCXN3aXRjaCAoc29jX3R5cGUpIHsKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTF4NTU6CisJY2FzZSBLX1NZU19TT0NfVFlQRV9CQ00xeDgwOgorCQltYXhfbGluZXMgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBc3N1bWUgYXQgbGVhc3QgdHdvIHNlcmlhbCBwb3J0cyBhdCB0aGUgbm9ybWFsIGFkZHJlc3MuICAqLworCQltYXhfbGluZXMgPSAyOworCQlicmVhazsKKwl9CisKKwlwcm9iZWQgPSAxOworCisJZm9yIChjaGlwID0gMCwgbGluZSA9IDA7IGNoaXAgPCBEVUFSVF9NQVhfQ0hJUCAmJiBsaW5lIDwgbWF4X2xpbmVzOworCSAgICAgY2hpcCsrKSB7CisJCXNiZF9kdWFydHNbY2hpcF0ubWFwY3RybCA9IFNCRF9DVFJMUkVHUyhsaW5lKTsKKworCQlmb3IgKHNpZGUgPSAwOyBzaWRlIDwgRFVBUlRfTUFYX1NJREUgJiYgbGluZSA8IG1heF9saW5lczsKKwkJICAgICBzaWRlKyssIGxpbmUrKykgeworCQkJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9ICZzYmRfZHVhcnRzW2NoaXBdLnNwb3J0W3NpZGVdOworCQkJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisKKwkJCXNwb3J0LT5kdWFydAk9ICZzYmRfZHVhcnRzW2NoaXBdOworCisJCQl1cG9ydC0+aXJxCT0gU0JEX0lOVChsaW5lKTsKKwkJCXVwb3J0LT51YXJ0Y2xrCT0gMTAwMDAwMDAwIC8gMjAgKiAxNjsKKwkJCXVwb3J0LT5maWZvc2l6ZQk9IDE2OworCQkJdXBvcnQtPmlvdHlwZQk9IFVQSU9fTUVNOworCQkJdXBvcnQtPmZsYWdzCT0gVVBGX0JPT1RfQVVUT0NPTkY7CisJCQl1cG9ydC0+b3BzCT0gJnNiZF9vcHM7CisJCQl1cG9ydC0+bGluZQk9IGxpbmU7CisJCQl1cG9ydC0+bWFwYmFzZQk9IFNCRF9DSEFOUkVHUyhsaW5lKTsKKwkJfQorCX0KK30KKworCisjaWZkZWYgQ09ORklHX1NFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRQorLyoKKyAqIFNlcmlhbCBjb25zb2xlIHN0dWZmLiAgVmVyeSBiYXNpYywgcG9sbGluZyBkcml2ZXIgZm9yIGRvaW5nIHNlcmlhbAorICogY29uc29sZSBvdXRwdXQuICBUaGUgY29uc29sZV9zZW0gaXMgaGVsZCBieSB0aGUgY2FsbGVyLCBzbyB3ZQorICogc2hvdWxkbid0IGJlIGludGVycnVwdGVkIGZvciBtb3JlIGNvbnNvbGUgYWN0aXZpdHkuCisgKi8KK3N0YXRpYyB2b2lkIHNiZF9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIGludCBjaCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJc2JkX3RyYW5zbWl0X2RyYWluKHNwb3J0KTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfVFhfSE9MRCwgY2gpOworfQorCitzdGF0aWMgdm9pZCBzYmRfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJaW50IGNoaXAgPSBjby0+aW5kZXggLyBEVUFSVF9NQVhfU0lERTsKKwlpbnQgc2lkZSA9IGNvLT5pbmRleCAlIERVQVJUX01BWF9TSURFOworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSAmc2JkX2R1YXJ0c1tjaGlwXS5zcG9ydFtzaWRlXTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrOworCisJLyogRGlzYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHRzIGFuZCBlbmFibGUgdGhlIHRyYW5zbWl0dGVyLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCW1hc2sgPSByZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwKKwkJICAgICBtYXNrICYgfk1fRFVBUlRfSU1SX1RYKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0VOKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCisJdWFydF9jb25zb2xlX3dyaXRlKCZzcG9ydC0+cG9ydCwgcywgY291bnQsIHNiZF9jb25zb2xlX3B1dGNoYXIpOworCisJLyogUmVzdG9yZSB0cmFuc21pdCBpbnRlcnJ1cHRzIGFuZCB0aGUgdHJhbnNtaXR0ZXIgZW5hYmxlLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCXNiZF9saW5lX2RyYWluKHNwb3J0KTsKKwlpZiAoc3BvcnQtPnR4X3N0b3BwZWQpCisJCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRElTKTsKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgbWFzayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2JkX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQoreworCWludCBjaGlwID0gY28tPmluZGV4IC8gRFVBUlRfTUFYX1NJREU7CisJaW50IHNpZGUgPSBjby0+aW5kZXggJSBEVUFSVF9NQVhfU0lERTsKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gJnNiZF9kdWFydHNbY2hpcF0uc3BvcnRbc2lkZV07CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJaW50IGJhdWQgPSAxMTUyMDA7CisJaW50IGJpdHMgPSA4OworCWludCBwYXJpdHkgPSAnbic7CisJaW50IGZsb3cgPSAnbic7CisJaW50IHJldDsKKworCWlmICghc3BvcnQtPmR1YXJ0KQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0ID0gc2JkX21hcF9wb3J0KHVwb3J0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2JkX2luaXRfcG9ydChzcG9ydCk7CisKKwlpZiAob3B0aW9ucykKKwkJdWFydF9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZiYXVkLCAmcGFyaXR5LCAmYml0cywgJmZsb3cpOworCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKHVwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzYmRfcmVnOworc3RhdGljIHN0cnVjdCBjb25zb2xlIHNiZF9jb25zb2xlID0geworCS5uYW1lCT0gImR1YXJ0IiwKKwkud3JpdGUJPSBzYmRfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlCT0gdWFydF9jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJPSBzYmRfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CT0gLTEsCisJLmRhdGEJPSAmc2JkX3JlZworfTsKKworc3RhdGljIGludCBfX2luaXQgc2JkX3NlcmlhbF9jb25zb2xlX2luaXQodm9pZCkKK3sKKwlzYmRfcHJvYmVfZHVhcnRzKCk7CisJcmVnaXN0ZXJfY29uc29sZSgmc2JkX2NvbnNvbGUpOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnNvbGVfaW5pdGNhbGwoc2JkX3NlcmlhbF9jb25zb2xlX2luaXQpOworCisjZGVmaW5lIFNFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRQkmc2JkX2NvbnNvbGUKKyNlbHNlCisjZGVmaW5lIFNFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRQlOVUxMCisjZW5kaWYgLyogQ09ORklHX1NFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRSAqLworCisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2JkX3JlZyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gInNlcmlhbCIsCisJLmRldl9uYW1lCT0gImR1YXJ0IiwKKwkubWFqb3IJCT0gVFRZX01BSk9SLAorCS5taW5vcgkJPSBTQjEyNTBfRFVBUlRfTUlOT1JfQkFTRSwKKwkubnIJCT0gRFVBUlRfTUFYX0NISVAgKiBEVUFSVF9NQVhfU0lERSwKKwkuY29ucwkJPSBTRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUsCit9OworCisvKiBTZXQgdXAgdGhlIGRyaXZlciBhbmQgcmVnaXN0ZXIgaXQuICAqLworc3RhdGljIGludCBfX2luaXQgc2JkX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCisJc2JkX3Byb2JlX2R1YXJ0cygpOworCisJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnNiZF9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFVBUlRfTUFYX0NISVAgKiBEVUFSVF9NQVhfU0lERTsgaSsrKSB7CisJCXN0cnVjdCBzYmRfZHVhcnQgKmR1YXJ0ID0gJnNiZF9kdWFydHNbaSAvIERVQVJUX01BWF9TSURFXTsKKwkJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9ICZkdWFydC0+c3BvcnRbaSAlIERVQVJUX01BWF9TSURFXTsKKwkJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisKKwkJaWYgKHNwb3J0LT5kdWFydCkKKwkJCXVhcnRfYWRkX29uZV9wb3J0KCZzYmRfcmVnLCB1cG9ydCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFVubG9hZCB0aGUgZHJpdmVyLiAgVW5yZWdpc3RlciBzdHVmZiwgZ2V0IHJlYWR5IHRvIGdvIGF3YXkuICAqLworc3RhdGljIHZvaWQgX19leGl0IHNiZF9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSBEVUFSVF9NQVhfQ0hJUCAqIERVQVJUX01BWF9TSURFIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJc3RydWN0IHNiZF9kdWFydCAqZHVhcnQgPSAmc2JkX2R1YXJ0c1tpIC8gRFVBUlRfTUFYX1NJREVdOworCQlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gJmR1YXJ0LT5zcG9ydFtpICUgRFVBUlRfTUFYX1NJREVdOworCQlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKworCQlpZiAoc3BvcnQtPmR1YXJ0KQorCQkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNiZF9yZWcsIHVwb3J0KTsKKwl9CisKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzYmRfcmVnKTsKK30KKworbW9kdWxlX2luaXQoc2JkX2luaXQpOworbW9kdWxlX2V4aXQoc2JkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggMzI2MDIwZi4uOWM1NzQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0xOTEwLDYgKzE5MTAsMTIgQEAKIAlpZiAoZmxvdyA9PSAncicpCiAJCXRlcm1pb3MuY19jZmxhZyB8PSBDUlRTQ1RTOwogCisJLyoKKwkgKiBzb21lIHVhcnRzIG9uIG90aGVyIHNpZGUgZG9uJ3Qgc3VwcG9ydCBubyBmbG93IGNvbnRyb2wuCisJICogU28gd2Ugc2V0ICogRFRSIGluIGhvc3QgdWFydCB0byBtYWtlIHRoZW0gaGFwcHkKKwkgKi8KKwlwb3J0LT5tY3RybCB8PSBUSU9DTV9EVFI7CisKIAlwb3J0LT5vcHMtPnNldF90ZXJtaW9zKHBvcnQsICZ0ZXJtaW9zLCBOVUxMKTsKIAljby0+Y2ZsYWcgPSB0ZXJtaW9zLmNfY2ZsYWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKaW5kZXggMWY4OTQ5Ni4uNjcyY2QxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKQEAgLTM2Nyw3ICszNjcsOSBAQAogCX0gZWxzZSB7CiAjaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MwogCQkvKiBOb3RoaW5nICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQogCQljdHJsX291dHcoMHgwMDgwLCBTQ1NQVFIwKTsgLyogU2V0IFJUUyA9IDEgKi8KICNlbHNlCiAJCWN0cmxfb3V0dygweDAwODAsIFNDU1BUUjIpOyAvKiBTZXQgUlRTID0gMSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmggYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaAppbmRleCBmYjA0ZmI1Li4yNDdmYjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaAorKysgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaApAQCAtNTMsNyArNTMsMTIgQEAKICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwogIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAweDNhIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KICMgZGVmaW5lIFNDSUZfT05MWQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApICB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEpICB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpICB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQogIyBkZWZpbmUgU0NTUFRSMSAweGZmZTAwMDFjIC8qIDggIGJpdCBTQ0kgKi8KICMgZGVmaW5lIFNDU1BUUjIgMHhGRkU4MDAyMCAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCkBAIC03Myw3ICs3OCw3IEBACiAjIGRlZmluZSBTQ1BEUiAgMHhBNDA1MDEzNiAgICAgICAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgIDB4MDAzMCAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEgKi8KICMgZGVmaW5lIFNDSUZfT05MWQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIpIAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIpCiAjIGRlZmluZSBTQ1NQVFIwIDB4QTQ0MDAwMDAJICAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NJX05QT1JUUyAyCiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KQEAgLTE2OCw2ICsxNzMsMTQgQEAKICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4MzggLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQorIyBkZWZpbmUgU0NTUFRSMCAweGZmYzMwMDIwCQkvKiAxNiBiaXQgU0NJRiAqLworIyBkZWZpbmUgU0NTUFRSMSAweGZmYzQwMDIwCQkvKiAxNiBiaXQgU0NJRiAqLworIyBkZWZpbmUgU0NTUFRSMiAweGZmYzUwMDIwCQkvKiAxNiBiaXQgU0NJRiAqLworIyBkZWZpbmUgU0NTUFRSMyAweGZmYzYwMDIwCQkvKiAxNiBiaXQgU0NJRiAqLworIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMQkJLyogT3ZlcnJ1biBlcnJvciBiaXQgKi8KKyMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgzOAkvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCisjIGRlZmluZSBTQ0lGX09OTFkKICNlbHNlCiAjIGVycm9yIENQVSBzdWJ0eXBlIG5vdCBkZWZpbmVkCiAjZW5kaWYKQEAgLTE3NywxMCArMTkwLDE1IEBACiAjZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1JJRSAgMHg0MCAvKiBhbGwgKi8KICNkZWZpbmUgU0NJX0NUUkxfRkxBR1NfVEUgICAweDIwIC8qIGFsbCAqLwogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRSAgIDB4MTAgLyogYWxsICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEpICB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpICB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpICB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKICNkZWZpbmUgU0NJX0NUUkxfRkxBR1NfUkVJRSAweDA4IC8qIDc3NTAgU0NJRiAqLwogI2Vsc2UKICNkZWZpbmUgU0NJX0NUUkxfRkxBR1NfUkVJRSAwCkBAIC01MTQsOCArNTMyLDEyIEBACiAJfQogfQogCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgfHwgXAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSAgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSAgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUikgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUikgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUykgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKSAgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMikKIHN0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKQEAgLTY1Myw2ICs2NzUsMTggQEAKIAkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjIpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KIAlyZXR1cm4gMTsKIH0KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCitzdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmMzMDAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjApICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmYzQwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMSkgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZjNTAwMDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIyKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmM2MDAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjMpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KK30KICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jIGIvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jCmluZGV4IGEyN2U5ZTkuLjQxZmM2MTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jCkBAIC03NTksNyArNzU5LDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZCBzbl9zYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkKTsKLXN0YXRpYyBpbnQgX19pbml0IHNuX3NhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICosIGNoYXIgKik7CitzdGF0aWMgaW50IHNuX3NhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICosIGNoYXIgKik7CiBzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHNhbF9jb25zb2xlX3VhcnQ7CiBleHRlcm4gc3RydWN0IHR0eV9kcml2ZXIgKnVhcnRfY29uc29sZV9kZXZpY2Uoc3RydWN0IGNvbnNvbGUgKiwgaW50ICopOwogCkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogICogaGVyZSBzbyBwcm92aWRpbmcgaXQgaXMgZWFzaWVyLgogICoKICAqLwotc3RhdGljIGludCBfX2luaXQgc25fc2FsX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBzbl9zYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5odi5jIGIvZHJpdmVycy9zZXJpYWwvc3VuaHYuYwppbmRleCA5NjU1N2U2Li5kODJiZTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKQEAgLTI1OCwxNyArMjU4LDcgQEAKIC8qIHBvcnQtPmxvY2sgaGVsZCBieSBjYWxsZXIuICAqLwogc3RhdGljIHZvaWQgc3VuaHZfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmcG9ydC0+aW5mby0+eG1pdDsKLQotCXdoaWxlICghdWFydF9jaXJjX2VtcHR5KHhtaXQpKSB7Ci0JCWxvbmcgc3RhdHVzID0gc3VuNHZfY29uX3B1dGNoYXIoeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKLQotCQlpZiAoc3RhdHVzICE9IEhWX0VPSykKLQkJCWJyZWFrOwotCi0JCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JCXBvcnQtPmljb3VudC50eCsrOwotCX0KKwl0cmFuc21pdF9jaGFycyhwb3J0KTsKIH0KIAogLyogcG9ydC0+bG9jayBpcyBub3QgaGVsZC4gICovCkBAIC00NDAsOCArNDMwLDE2IEBACiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHN1bmh2X3BvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbG9ja2VkID0gMTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChwb3J0LT5zeXNycSkgeworCQlsb2NrZWQgPSAwOworCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgeworCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnBvcnQtPmxvY2spOworCX0gZWxzZQorCQlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCiAJd2hpbGUgKG4gPiAwKSB7CiAJCXVuc2lnbmVkIGxvbmcgcmEgPSBfX3BhKGNvbl93cml0ZV9wYWdlKTsKIAkJdW5zaWduZWQgbG9uZyBwYWdlX2J5dGVzOwpAQCAtNDY5LDcgKzQ2NywxMCBAQAogCQkJcmEgKz0gd3JpdHRlbjsKIAkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3VuaHZfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGNoYXIgYykKQEAgLTQ4OCw3ICs0ODksMTUgQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gc3VuaHZfcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOworCWludCBpLCBsb2NrZWQgPSAxOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChwb3J0LT5zeXNycSkgeworCQlsb2NrZWQgPSAwOworCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgeworCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnBvcnQtPmxvY2spOworCX0gZWxzZQorCQlzcGluX2xvY2soJnBvcnQtPmxvY2spOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CkBAIC00OTYsNyArNTA1LDEwIEBACiAJCQlzdW5odl9jb25zb2xlX3B1dGNoYXIocG9ydCwgJ1xyJyk7CiAJCXN1bmh2X2NvbnNvbGVfcHV0Y2hhcihwb3J0LCAqcysrKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIHN1bmh2X2NvbnNvbGUgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jCmluZGV4IGRlYjlhYjQuLjhhMGY5ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jCkBAIC04NjAsMjIgKzg2MCwzMSBAQAogc3RhdGljIHZvaWQgc3Vuc2FiX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYykKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJc3Vuc2FiX3RlY193YWl0KHVwKTsKIAl3cml0ZWIoYywgJnVwLT5yZWdzLT53LnRpYyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1bnNhYl9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIG4pCiB7CiAJc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKnVwID0gJnN1bnNhYl9wb3J0c1tjb24tPmluZGV4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsb2NrZWQgPSAxOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICh1cC0+cG9ydC5zeXNycSkgeworCQlsb2NrZWQgPSAwOworCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgeworCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnVwLT5wb3J0LmxvY2spOworCX0gZWxzZQorCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOwogCiAJdWFydF9jb25zb2xlX3dyaXRlKCZ1cC0+cG9ydCwgcywgbiwgc3Vuc2FiX2NvbnNvbGVfcHV0Y2hhcik7CiAJc3Vuc2FiX3RlY193YWl0KHVwKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgc3Vuc2FiX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbiwgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCmluZGV4IDJhNjNjZGIuLjI2ZDcyMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwpAQCAtMTI4OCw3ICsxMjg4LDE3IEBACiAJCQkJdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCB1YXJ0X3N1bnN1X3BvcnQgKnVwID0gJnN1bnN1X3BvcnRzW2NvLT5pbmRleF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaWVyOworCWludCBsb2NrZWQgPSAxOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICh1cC0+cG9ydC5zeXNycSkgeworCQlsb2NrZWQgPSAwOworCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgeworCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnVwLT5wb3J0LmxvY2spOworCX0gZWxzZQorCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOwogCiAJLyoKIAkgKglGaXJzdCBzYXZlIHRoZSBVRVIgdGhlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzCkBAIC0xMzA0LDYgKzEzMTQsMTAgQEAKIAkgKi8KIAl3YWl0X2Zvcl94bWl0cih1cCk7CiAJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIGllcik7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmdXAtPnBvcnQubG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKaW5kZXggMTViNmUxYy4uMGEzZTEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCkBAIC05LDcgKzksNyBAQAogICogQy4gRG9zdCwgUGV0ZSBaYWl0Y2V2LCBUZWQgVHMnbyBhbmQgQWxleCBCdWVsbCBmb3IgdGhlaXIKICAqIHdvcmsgdGhlcmUuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTExNTEsMTEgKzExNTEsMjIgQEAKIHsKIAlzdHJ1Y3QgdWFydF9zdW56aWxvZ19wb3J0ICp1cCA9ICZzdW56aWxvZ19wb3J0X3RhYmxlW2Nvbi0+aW5kZXhdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxvY2tlZCA9IDE7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAodXAtPnBvcnQuc3lzcnEpIHsKKwkJbG9ja2VkID0gMDsKKwl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwl9IGVsc2UKKwkJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwogCXVhcnRfY29uc29sZV93cml0ZSgmdXAtPnBvcnQsIHMsIGNvdW50LCBzdW56aWxvZ19wdXRjaGFyKTsKIAl1ZGVsYXkoMik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc3Vuemlsb2dfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uLCBjaGFyICpvcHRpb25zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2RyaXZlcnMvc3BpL0tjb25maWcKaW5kZXggNWUzZjc0OC4uYjkxNTcxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3NwaS9LY29uZmlnCkBAIC0xMDcsNiArMTA3LDE1IEBACiAJICBUaGlzIGVuYWJsZXMgdXNpbmcgdGhlIEZyZWVzY2FsZSBpTVggU1BJIGNvbnRyb2xsZXIgaW4gbWFzdGVyCiAJICBtb2RlLgogCitjb25maWcgU1BJX0xNNzBfTExQCisJdHJpc3RhdGUgIlBhcmFsbGVsIHBvcnQgYWRhcHRlciBmb3IgTE03MCBldmFsIGJvYXJkIChERVZFTE9QTUVOVCkiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE5TIExNNzAgTExQIEV2YWx1YXRpb24gQm9hcmQsCisJICB3aGljaCBpbnRlcmZhY2VzIHRvIGFuIExNNzAgdGVtcGVyYXR1cmUgc2Vuc29yIHVzaW5nCisJICBhIHBhcmFsbGVsIHBvcnQuCisKIGNvbmZpZyBTUElfTVBDNTJ4eF9QU0MKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QQzUyeHggUFNDIFNQSSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBQUENfTVBDNTJ4eCAmJiBFWFBFUklNRU5UQUwKQEAgLTEzMyw2ICsxNDIsMTIgQEAKIAloZWxwCiAJICBUaGlzIGhvb2tzIHVwIHRvIHRoZSBNaWNyb1dpcmUgY29udHJvbGxlciBvbiBPTUFQMSBjaGlwcy4KIAorY29uZmlnIFNQSV9PTUFQMjRYWAorCXRyaXN0YXRlICJNY1NQSSBkcml2ZXIgZm9yIE9NQVAyNHh4IgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBBUkNIX09NQVAyNFhYCisJaGVscAorCSAgU1BJIG1hc3RlciBjb250cm9sbGVyIGZvciBPTUFQMjR4eCBNdWx0aWNoYW5uZWwgU1BJCisJICAoTWNTUEkpIG1vZHVsZXMuCiAKIGNvbmZpZyBTUElfUFhBMlhYCiAJdHJpc3RhdGUgIlBYQTJ4eCBTU1AgU1BJIG1hc3RlciIKQEAgLTE0NSwxNyArMTYwLDM2IEBACiBjb25maWcgU1BJX1MzQzI0WFgKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBTUEkiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEFSQ0hfUzNDMjQxMCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBTYW1zdW5nIFMzQzI0WFggc2VyaWVzIEFSTSBTb0NzCiAKIGNvbmZpZyBTUElfUzNDMjRYWF9HUElPCiAJdHJpc3RhdGUgIlNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgU1BJIGJ5IEdQSU8iCi0JZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEFSQ0hfUzNDMjQxMCAmJiBTUElfQklUQkFORyAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgQVJDSF9TM0MyNDEwICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORwogCWhlbHAKIAkgIFNQSSBkcml2ZXIgZm9yIFNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgQVJNIFNvQ3MgdXNpbmcKIAkgIEdQSU8gbGluZXMgdG8gcHJvdmlkZSB0aGUgU1BJIGJ1cy4gVGhpcyBjYW4gYmUgdXNlZCB3aGVyZQogCSAgdGhlIGluYnVpbHQgaGFyZHdhcmUgY2Fubm90IHByb3ZpZGUgdGhlIHRyYW5zZmVyIG1vZGUsIG9yCiAJICB3aGVyZSB0aGUgYm9hcmQgaXMgdXNpbmcgbm9uIGhhcmR3YXJlIGNvbm5lY3RlZCBwaW5zLgorCitjb25maWcgU1BJX1RYWDkKKwl0cmlzdGF0ZSAiVG9zaGliYSBUWHg5IFNQSSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBHRU5FUklDX0dQSU8gJiYgQ1BVX1RYNDlYWAorCWhlbHAKKwkgIFNQSSBkcml2ZXIgZm9yIFRvc2hpYmEgVFh4OSBNSVBTIFNvQ3MKKworY29uZmlnIFNQSV9YSUxJTlgKKwl0cmlzdGF0ZSAiWGlsaW54IFNQSSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBYSUxJTlhfVklSVEVYICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFRoaXMgZXhwb3NlcyB0aGUgU1BJIGNvbnRyb2xsZXIgSVAgZnJvbSB0aGUgWGlsaW54IEVESy4KKworCSAgU2VlIHRoZSAiT1BCIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSAodjEuMDBlKSIKKwkgIFByb2R1Y3QgU3BlY2lmaWNhdGlvbiBkb2N1bWVudCAoRFM0NjQpIGZvciBoYXJkd2FyZSBkZXRhaWxzLgorCiAjCiAjIEFkZCBuZXcgU1BJIG1hc3RlciBjb250cm9sbGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIgYWJvdmUgdGhpcyBsaW5lCiAjCkBAIC0xODcsNiArMjIxLDE1IEBACiAJICBOb3RlIHRoYXQgdGhpcyBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UgaXMgRVhQRVJJTUVOVEFMCiAJICBhbmQgaGVuY2UgU1VCSkVDVCBUTyBDSEFOR0UgV0lUSE9VVCBOT1RJQ0Ugd2hpbGUgaXQgc3RhYmlsaXplcy4KIAorY29uZmlnIFNQSV9UTEU2MlgwCisJdHJpc3RhdGUgIkluZmluZW9uIFRMRTYyWDAgKGZvciBwb3dlciBzd2l0Y2hpbmcpIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBTWVNGUworCWhlbHAKKwkgIFNQSSBkcml2ZXIgZm9yIEluZmluZW9uIFRMRTYyWDAgc2VyaWVzIGxpbmUgZHJpdmVyIGNoaXBzLAorCSAgc3VjaCBhcyB0aGUgVExFNjIyMCwgVExFNjIzMCBhbmQgVExFNjI0MC4gIFRoaXMgcHJvdmlkZXMgYQorCSAgc3lzZnMgaW50ZXJmYWNlLCB3aXRoIGVhY2ggbGluZSBwcmVzZW50ZWQgYXMgYSBraW5kIG9mIEdQSU8KKwkgIGV4cG9zaW5nIGJvdGggc3dpdGNoIGNvbnRyb2wgYW5kIGRpYWdub3N0aWMgZmVlZGJhY2suCisKICMKICMgQWRkIG5ldyBTUEkgcHJvdG9jb2wgbWFzdGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIgYWJvdmUgdGhpcyBsaW5lCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IDU3ODhkODYuLjQxZmJhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC0xNywxNyArMTcsMjIgQEAKIG9iai0kKENPTkZJR19TUElfQVUxNTUwKQkJKz0gYXUxNTUwX3NwaS5vCiBvYmotJChDT05GSUdfU1BJX0JVVFRFUkZMWSkJCSs9IHNwaV9idXR0ZXJmbHkubwogb2JqLSQoQ09ORklHX1NQSV9JTVgpCQkJKz0gc3BpX2lteC5vCitvYmotJChDT05GSUdfU1BJX0xNNzBfTExQKQkJKz0gc3BpX2xtNzBsbHAubwogb2JqLSQoQ09ORklHX1NQSV9QWEEyWFgpCQkrPSBweGEyeHhfc3BpLm8KIG9iai0kKENPTkZJR19TUElfT01BUF9VV0lSRSkJCSs9IG9tYXBfdXdpcmUubworb2JqLSQoQ09ORklHX1NQSV9PTUFQMjRYWCkJCSs9IG9tYXAyX21jc3BpLm8KIG9iai0kKENPTkZJR19TUElfTVBDNTJ4eF9QU0MpCQkrPSBtcGM1Mnh4X3BzY19zcGkubwogb2JqLSQoQ09ORklHX1NQSV9NUEM4M3h4KQkJKz0gc3BpX21wYzgzeHgubwogb2JqLSQoQ09ORklHX1NQSV9TM0MyNFhYX0dQSU8pCQkrPSBzcGlfczNjMjR4eF9ncGlvLm8KIG9iai0kKENPTkZJR19TUElfUzNDMjRYWCkJCSs9IHNwaV9zM2MyNHh4Lm8KK29iai0kKENPTkZJR19TUElfVFhYOSkJCQkrPSBzcGlfdHh4OS5vCitvYmotJChDT05GSUdfU1BJX1hJTElOWCkJCSs9IHhpbGlueF9zcGkubwogIyAJLi4uIGFkZCBhYm92ZSB0aGlzIGxpbmUgLi4uCiAKICMgU1BJIHByb3RvY29sIGRyaXZlcnMgKGRldmljZS9saW5rIG9uIGJ1cykKIG9iai0kKENPTkZJR19TUElfQVQyNSkJCSs9IGF0MjUubwogb2JqLSQoQ09ORklHX1NQSV9TUElERVYpCSs9IHNwaWRldi5vCitvYmotJChDT05GSUdfU1BJX1RMRTYyWDApCSs9IHRsZTYyeDAubwogIyAJLi4uIGFkZCBhYm92ZSB0aGlzIGxpbmUgLi4uCiAKICMgU1BJIHNsYXZlIGNvbnRyb2xsZXIgZHJpdmVycyAodXBzdHJlYW0gbGluaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jIGIvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKaW5kZXggOGIyNjAxZC4uYWQxNDQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CiAJdW5zaWduZWQJCW5ld18xOjE7CisJc3RydWN0IHNwaV9kZXZpY2UJKnN0YXk7CiAKIAl1OAkJCXN0b3BwaW5nOwogCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CkBAIC02MiwyOSArNjMsNjIgQEAKIC8qCiAgKiBFYXJsaWVyIFNQSSBjb250cm9sbGVycyAoZS5nLiBvbiBhdDkxcm05MjAwKSBoYXZlIGEgZGVzaWduIGJ1ZyB3aGVyZWJ5CiAgKiB0aGV5IGFzc3VtZSB0aGF0IHNwaSBzbGF2ZSBkZXZpY2Ugc3RhdGUgd2lsbCBub3QgY2hhbmdlIG9uIGRlc2VsZWN0LCBzbwotICogdGhhdCBhdXRvbWFnaWMgZGVzZWxlY3Rpb24gaXMgT0suICBOb3Qgc28hICBXb3JrYXJvdW5kIHVzZXMgbkNTeCBwaW5zCi0gKiBhcyBHUElPczsgb3IgbmV3ZXIgY29udHJvbGxlcnMgaGF2ZSBDU0FBVCBhbmQgZnJpZW5kcy4KKyAqIHRoYXQgYXV0b21hZ2ljIGRlc2VsZWN0aW9uIGlzIE9LLiAgKCJOUENTeCByaXNlcyBpZiBubyBkYXRhIGlzIHRvIGJlCisgKiB0cmFuc21pdHRlZCIpICBOb3Qgc28hICBXb3JrYXJvdW5kIHVzZXMgbkNTeCBwaW5zIGFzIEdQSU9zOyBvciBuZXdlcgorICogY29udHJvbGxlcnMgaGF2ZSBDU0FBVCBhbmQgZnJpZW5kcy4KICAqCi0gKiBTaW5jZSB0aGUgQ1NBQVQgZnVuY3Rpb25hbGl0eSBpcyBhIGJpdCB3ZWlyZCBvbiBuZXdlciBjb250cm9sbGVycwotICogYXMgd2VsbCwgd2UgdXNlIEdQSU8gdG8gY29udHJvbCBuQ1N4IHBpbnMgb24gYWxsIGNvbnRyb2xsZXJzLgorICogU2luY2UgdGhlIENTQUFUIGZ1bmN0aW9uYWxpdHkgaXMgYSBiaXQgd2VpcmQgb24gbmV3ZXIgY29udHJvbGxlcnMgYXMKKyAqIHdlbGwsIHdlIHVzZSBHUElPIHRvIGNvbnRyb2wgbkNTeCBwaW5zIG9uIGFsbCBjb250cm9sbGVycywgdXBkYXRpbmcKKyAqIE1SLlBDUyB0byBhdm9pZCBjb25mdXNpbmcgdGhlIGNvbnRyb2xsZXIuICBVc2luZyBHUElPcyBhbHNvIGxldHMgdXMKKyAqIHN1cHBvcnQgYWN0aXZlLWhpZ2ggY2hpcHNlbGVjdHMgZGVzcGl0ZSB0aGUgY29udHJvbGxlcidzIGJlbGllZiB0aGF0CisgKiBvbmx5IGFjdGl2ZS1sb3cgZGV2aWNlcy9zeXN0ZW1zIGV4aXN0cy4KKyAqCisgKiBIb3dldmVyLCBhdDkxcm05MjAwIGhhcyBhIHNlY29uZCBlcnJhdHVtIHdoZXJlYnkgbkNTMCBkb2Vzbid0IHdvcmsKKyAqIHJpZ2h0IHdoZW4gZHJpdmVuIHdpdGggR1BJTy4gICgiTW9kZSBGYXVsdCBkb2VzIG5vdCBhbGxvdyBtb3JlIHRoYW4gb25lCisgKiBNYXN0ZXIgb24gQ2hpcCBTZWxlY3QgMC4iKSAgTm8gd29ya2Fyb3VuZCBleGlzdHMgZm9yIHRoYXQgLi4uIHNvIGZvcgorICogbkNTMCBvbiB0aGF0IGNoaXAsIHdlIChhKSBkb24ndCB1c2UgdGhlIEdQSU8sIChiKSBjYW4ndCBzdXBwb3J0IENTX0hJR0gsCisgKiBhbmQgKGMpIHdpbGwgdHJpZ2dlciB0aGF0IGZpcnN0IGVycmF0dW0gaW4gc29tZSBjYXNlcy4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3NfYWN0aXZhdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3N0YXRpYyB2b2lkIGNzX2FjdGl2YXRlKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXVuc2lnbmVkIGdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCXVuc2lnbmVkIGFjdGl2ZSA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOworCXUzMiBtcjsKIAotCWRldl9kYmcoJnNwaS0+ZGV2LCAiYWN0aXZhdGUgJXUlc1xuIiwgZ3BpbywgYWN0aXZlID8gIiAoaGlnaCkiIDogIiIpOwotCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIGFjdGl2ZSk7CisJbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKKwltciA9IFNQSV9CRklOUyhQQ1MsIH4oMSA8PCBzcGktPmNoaXBfc2VsZWN0KSwgbXIpOworCisJZGV2X2RiZygmc3BpLT5kZXYsICJhY3RpdmF0ZSAldSVzLCBtciAlMDh4XG4iLAorCQkJZ3BpbywgYWN0aXZlID8gIiAoaGlnaCkiIDogIiIsCisJCQltcik7CisKKwlpZiAoIShjcHVfaXNfYXQ5MXJtOTIwMCgpICYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMCkpCisJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIGFjdGl2ZSk7CisJc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNzX2RlYWN0aXZhdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3N0YXRpYyB2b2lkIGNzX2RlYWN0aXZhdGUoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJdW5zaWduZWQgZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CiAJdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CisJdTMyIG1yOwogCi0JZGV2X2RiZygmc3BpLT5kZXYsICJERWFjdGl2YXRlICV1JXNcbiIsIGdwaW8sIGFjdGl2ZSA/ICIgKGxvdykiIDogIiIpOwotCWdwaW9fc2V0X3ZhbHVlKGdwaW8sICFhY3RpdmUpOworCS8qIG9ubHkgZGVhY3RpdmF0ZSAqdGhpcyogZGV2aWNlOyBzb21ldGltZXMgdHJhbnNmZXJzIHRvCisJICogYW5vdGhlciBkZXZpY2UgbWF5IGJlIGFjdGl2ZSB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuCisJICovCisJbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKKwlpZiAoflNQSV9CRkVYVChQQ1MsIG1yKSAmICgxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpKSB7CisJCW1yID0gU1BJX0JGSU5TKFBDUywgMHhmLCBtcik7CisJCXNwaV93cml0ZWwoYXMsIE1SLCBtcik7CisJfQorCisJZGV2X2RiZygmc3BpLT5kZXYsICJERWFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCisJCQlncGlvLCBhY3RpdmUgPyAiIChsb3cpIiA6ICIiLAorCQkJbXIpOworCisJaWYgKCEoY3B1X2lzX2F0OTFybTkyMDAoKSAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDApKQorCQlncGlvX3NldF92YWx1ZShncGlvLCAhYWN0aXZlKTsKIH0KIAogLyoKQEAgLTE0MCw2ICsxNzQsNyBAQAogCiAJLyogUkVWSVNJVDogd2hlbiB4ZmVyLT5kZWxheV91c2VjcyA9PSAwLCB0aGUgUERDICJuZXh0IHRyYW5zZmVyIgogCSAqIG1lY2hhbmlzbSBtaWdodCBoZWxwIGF2b2lkIHRoZSBJUlEgbGF0ZW5jeSBiZXR3ZWVuIHRyYW5zZmVycworCSAqIChhbmQgaW1wcm92ZSB0aGUgbkNTMCBlcnJhdGEgaGFuZGxpbmcgb24gYXQ5MXJtOTIwMCBjaGlwcykKIAkgKgogCSAqIFdlJ3JlIGFsc28gd2FpdGluZyBmb3IgRU5EUlggYmVmb3JlIHdlIHN0YXJ0IHRoZSBuZXh0CiAJICogdHJhbnNmZXIgYmVjYXVzZSB3ZSBuZWVkIHRvIGhhbmRsZSBzb21lIGRpZmZpY3VsdCB0aW1pbmcKQEAgLTE2OSwzMyArMjA0LDYyIEBACiB7CiAJc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJc3RydWN0IHNwaV9tZXNzYWdlCSptc2c7Ci0JdTMyCQkJbXI7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKIAogCUJVR19PTihhcy0+Y3VycmVudF90cmFuc2Zlcik7CiAKIAltc2cgPSBsaXN0X2VudHJ5KGFzLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKwlzcGkgPSBtc2ctPnNwaTsKIAotCS8qIFNlbGVjdCB0aGUgY2hpcCAqLwotCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7Ci0JbXIgPSBTUElfQkZJTlMoUENTLCB+KDEgPDwgbXNnLT5zcGktPmNoaXBfc2VsZWN0KSwgbXIpOwotCXNwaV93cml0ZWwoYXMsIE1SLCBtcik7Ci0JY3NfYWN0aXZhdGUobXNnLT5zcGkpOworCWRldl9kYmcobWFzdGVyLT5jZGV2LmRldiwgInN0YXJ0IG1lc3NhZ2UgJXAgZm9yICVzXG4iLAorCQkJbXNnLCBzcGktPmRldi5idXNfaWQpOworCisJLyogc2VsZWN0IGNoaXAgaWYgaXQncyBub3Qgc3RpbGwgYWN0aXZlICovCisJaWYgKGFzLT5zdGF5KSB7CisJCWlmIChhcy0+c3RheSAhPSBzcGkpIHsKKwkJCWNzX2RlYWN0aXZhdGUoYXMsIGFzLT5zdGF5KTsKKwkJCWNzX2FjdGl2YXRlKGFzLCBzcGkpOworCQl9CisJCWFzLT5zdGF5ID0gTlVMTDsKKwl9IGVsc2UKKwkJY3NfYWN0aXZhdGUoYXMsIHNwaSk7CiAKIAlhdG1lbF9zcGlfbmV4dF94ZmVyKG1hc3RlciwgbXNnKTsKIH0KIAotc3RhdGljIHZvaWQKKy8qCisgKiBGb3IgRE1BLCB0eF9idWYvdHhfZG1hIGhhdmUgdGhlIHNhbWUgcmVsYXRpb25zaGlwIGFzIHJ4X2J1Zi9yeF9kbWE6CisgKiAgLSBUaGUgYnVmZmVyIGlzIGVpdGhlciB2YWxpZCBmb3IgQ1BVIGFjY2VzcywgZWxzZSBOVUxMCisgKiAgLSBJZiB0aGUgYnVmZmVyIGlzIHZhbGlkLCBzbyBpcyBpdHMgRE1BIGFkZHJlc3NzCisgKgorICogVGhpcyBkcml2ZXIgbWFuYWdlcyB0aGUgZG1hIGFkZHJlc3NzIHVubGVzcyBtZXNzYWdlLT5pc19kbWFfbWFwcGVkLgorICovCitzdGF0aWMgaW50CiBhdG1lbF9zcGlfZG1hX21hcF94ZmVyKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogeworCXN0cnVjdCBkZXZpY2UJKmRldiA9ICZhcy0+cGRldi0+ZGV2OworCiAJeGZlci0+dHhfZG1hID0geGZlci0+cnhfZG1hID0gSU5WQUxJRF9ETUFfQUREUkVTUzsKLQlpZiAoeGZlci0+dHhfYnVmKQotCQl4ZmVyLT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmYXMtPnBkZXYtPmRldiwKKwlpZiAoeGZlci0+dHhfYnVmKSB7CisJCXhmZXItPnR4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKIAkJCQkodm9pZCAqKSB4ZmVyLT50eF9idWYsIHhmZXItPmxlbiwKIAkJCQlETUFfVE9fREVWSUNFKTsKLQlpZiAoeGZlci0+cnhfYnVmKQotCQl4ZmVyLT5yeF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmYXMtPnBkZXYtPmRldiwKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHhmZXItPnR4X2RtYSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKHhmZXItPnJ4X2J1ZikgeworCQl4ZmVyLT5yeF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsCiAJCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5sZW4sCiAJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHhmZXItPnR4X2RtYSkpIHsKKwkJCWlmICh4ZmVyLT50eF9idWYpCisJCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsCisJCQkJCQl4ZmVyLT50eF9kbWEsIHhmZXItPmxlbiwKKwkJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGF0bWVsX3NwaV9kbWFfdW5tYXBfeGZlcihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLApAQCAtMjExLDkgKzI3NSwxMyBAQAogCiBzdGF0aWMgdm9pZAogYXRtZWxfc3BpX21zZ19kb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBhdG1lbF9zcGkgKmFzLAotCQkgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZywgaW50IHN0YXR1cykKKwkJc3RydWN0IHNwaV9tZXNzYWdlICptc2csIGludCBzdGF0dXMsIGludCBzdGF5KQogewotCWNzX2RlYWN0aXZhdGUobXNnLT5zcGkpOworCWlmICghc3RheSB8fCBzdGF0dXMgPCAwKQorCQljc19kZWFjdGl2YXRlKGFzLCBtc2ctPnNwaSk7CisJZWxzZQorCQlhcy0+c3RheSA9IG1zZy0+c3BpOworCiAJbGlzdF9kZWwoJm1zZy0+cXVldWUpOwogCW1zZy0+c3RhdHVzID0gc3RhdHVzOwogCkBAIC0zMDMsNyArMzcxLDcgQEAKIAkJLyogQ2xlYXIgYW55IG92ZXJydW4gaGFwcGVuaW5nIHdoaWxlIGNsZWFuaW5nIHVwICovCiAJCXNwaV9yZWFkbChhcywgU1IpOwogCi0JCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIC1FSU8pOworCQlhdG1lbF9zcGlfbXNnX2RvbmUobWFzdGVyLCBhcywgbXNnLCAtRUlPLCAwKTsKIAl9IGVsc2UgaWYgKHBlbmRpbmcgJiBTUElfQklUKEVORFJYKSkgewogCQlyZXQgPSBJUlFfSEFORExFRDsKIApAQCAtMzIxLDEyICszODksMTMgQEAKIAogCQkJaWYgKG1zZy0+dHJhbnNmZXJzLnByZXYgPT0gJnhmZXItPnRyYW5zZmVyX2xpc3QpIHsKIAkJCQkvKiByZXBvcnQgY29tcGxldGVkIG1lc3NhZ2UgKi8KLQkJCQlhdG1lbF9zcGlfbXNnX2RvbmUobWFzdGVyLCBhcywgbXNnLCAwKTsKKwkJCQlhdG1lbF9zcGlfbXNnX2RvbmUobWFzdGVyLCBhcywgbXNnLCAwLAorCQkJCQkJeGZlci0+Y3NfY2hhbmdlKTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHhmZXItPmNzX2NoYW5nZSkgewotCQkJCQljc19kZWFjdGl2YXRlKG1zZy0+c3BpKTsKKwkJCQkJY3NfZGVhY3RpdmF0ZShhcywgbXNnLT5zcGkpOwogCQkJCQl1ZGVsYXkoMSk7Ci0JCQkJCWNzX2FjdGl2YXRlKG1zZy0+c3BpKTsKKwkJCQkJY3NfYWN0aXZhdGUoYXMsIG1zZy0+c3BpKTsKIAkJCQl9CiAKIAkJCQkvKgpAQCAtMzUwLDYgKzQxOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gpCiAKIHN0YXRpYyBpbnQgYXRtZWxfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCkBAIC0zODgsNiArNDU4LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIHNlZSBub3RlcyBhYm92ZSByZSBjaGlwc2VsZWN0ICovCisJaWYgKGNwdV9pc19hdDkxcm05MjAwKCkKKwkJCSYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMAorCQkJJiYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBjYW4ndCBiZSBhY3RpdmUtaGlnaFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIHNwZWVkIHplcm8gY29udmVudGlvbiBpcyB1c2VkIGJ5IHNvbWUgdXBwZXIgbGF5ZXJzICovCiAJYnVzX2h6ID0gY2xrX2dldF9yYXRlKGFzLT5jbGspOwogCWlmIChzcGktPm1heF9zcGVlZF9oeikgewpAQCAtMzk3LDggKzQ3NSw5IEBACiAJCXNjYnIgPSAoKGJ1c19oeiArIHNwaS0+bWF4X3NwZWVkX2h6IC0gMSkKIAkJCS8gc3BpLT5tYXhfc3BlZWRfaHopOwogCQlpZiAoc2NiciA+PSAoMSA8PCBTUElfU0NCUl9TSVpFKSkgewotCQkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogJWQgSHogdG9vIHNsb3csIHNjYnIgJXVcbiIsCi0JCQkJCXNwaS0+bWF4X3NwZWVkX2h6LCBzY2JyKTsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LAorCQkJCSJzZXR1cDogJWQgSHogdG9vIHNsb3csIHNjYnIgJXU7IG1pbiAlbGQgSHpcbiIsCisJCQkJc3BpLT5tYXhfc3BlZWRfaHosIHNjYnIsIGJ1c19oei8yNTUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UKQEAgLTQyMyw2ICs1MDIsMTQgQEAKIAkJCXJldHVybiByZXQ7CiAJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9ICh2b2lkICopbnBjc19waW47CiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChucGNzX3BpbiwgIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoYXMtPnN0YXkgPT0gc3BpKQorCQkJYXMtPnN0YXkgPSBOVUxMOworCQljc19kZWFjdGl2YXRlKGFzLCBzcGkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcy0+bG9jaywgZmxhZ3MpOwogCX0KIAogCWRldl9kYmcoJnNwaS0+ZGV2LApAQCAtNDY0LDE0ICs1NTEsMjIgQEAKIAkJCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gcHJvdG9jb2wgb3B0aW9ucyB5ZXRcbiIpOwogCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAkJfQorCisJCS8qCisJCSAqIERNQSBtYXAgZWFybHksIGZvciBwZXJmb3JtYW5jZSAoZW1wdGllcyBkY2FjaGUgQVNBUCkgYW5kCisJCSAqIGJldHRlciBmYXVsdCByZXBvcnRpbmcuICBUaGlzIGlzIGEgRE1BLW9ubHkgZHJpdmVyLgorCQkgKgorCQkgKiBOT1RFIHRoYXQgaWYgZG1hX3VubWFwX3NpbmdsZSgpIGV2ZXIgc3RhcnRzIHRvIGRvIHdvcmsgb24KKwkJICogcGxhdGZvcm1zIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgd2Ugd291bGQgbmVlZCB0byBjbGVhbgorCQkgKiB1cCBtYXBwaW5ncyBmb3IgcHJldmlvdXNseS1tYXBwZWQgdHJhbnNmZXJzLgorCQkgKi8KKwkJaWYgKCFtc2ctPmlzX2RtYV9tYXBwZWQpIHsKKwkJCWlmIChhdG1lbF9zcGlfZG1hX21hcF94ZmVyKGFzLCB4ZmVyKSA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAl9CiAKLQkvKiBzY3J1YiBkY2FjaGUgImVhcmx5IiAqLwotCWlmICghbXNnLT5pc19kbWFfbWFwcGVkKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KQotCQkJYXRtZWxfc3BpX2RtYV9tYXBfeGZlcihhcywgeGZlcik7Ci0JfQotCisjaWZkZWYgVkVSQk9TRQogCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CiAJCWRldl9kYmcoY29udHJvbGxlciwKIAkJCSIgIHhmZXIgJXA6IGxlbiAldSB0eCAlcC8lMDh4IHJ4ICVwLyUwOHhcbiIsCkBAIC00NzksNiArNTc0LDcgQEAKIAkJCXhmZXItPnR4X2J1ZiwgeGZlci0+dHhfZG1hLAogCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5yeF9kbWEpOwogCX0KKyNlbmRpZgogCiAJbXNnLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CiAJbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKQEAgLTQ5NCw4ICs1OTAsMjEgQEAKIAogc3RhdGljIHZvaWQgYXRtZWxfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpZiAoc3BpLT5jb250cm9sbGVyX3N0YXRlKQotCQlncGlvX2ZyZWUoKHVuc2lnbmVkIGludClzcGktPmNvbnRyb2xsZXJfZGF0YSk7CisJc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1bnNpZ25lZAkJZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwlpZiAoIXNwaS0+Y29udHJvbGxlcl9zdGF0ZSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFzLT5sb2NrLCBmbGFncyk7CisJaWYgKGFzLT5zdGF5ID09IHNwaSkgeworCQlhcy0+c3RheSA9IE5VTEw7CisJCWNzX2RlYWN0aXZhdGUoYXMsIHNwaSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CisKKwlncGlvX2ZyZWUoZ3Bpbyk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC01MzYsNiArNjQ1LDEwIEBACiAKIAlhcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAorCS8qCisJICogU2NyYXRjaCBidWZmZXIgaXMgdXNlZCBmb3IgdGhyb3dhd2F5IHJ4IGFuZCB0eCBkYXRhLgorCSAqIEl0J3MgY29oZXJlbnQgdG8gbWluaW1pemUgZGNhY2hlIHBvbGx1dGlvbi4KKwkgKi8KIAlhcy0+YnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIEJVRkZFUl9TSVpFLAogCQkJCQkmYXMtPmJ1ZmZlcl9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghYXMtPmJ1ZmZlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2F1MTU1MF9zcGkuYyBiL2RyaXZlcnMvc3BpL2F1MTU1MF9zcGkuYwppbmRleCBhZTJiMWFmLi5jNDdhNjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jCkBAIC0yODAsNiArMjgwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTFNCX0ZJUlNUKQorCiBzdGF0aWMgaW50IGF1MTU1MF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKQEAgLTI5Miw2ICsyOTUsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPT0gMCkKIAkJc3BpLT5tYXhfc3BlZWRfaHogPSBody0+ZnJlcV9tYXg7CiAJaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID4gaHctPmZyZXFfbWF4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYyBiL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCmluZGV4IDExZjM2YmUuLmQyYTRiMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCkBAIC0yNzAsNiArMjcwLDkgQEAKIAlzcGluX3VubG9ja19pcnEoJm1wcy0+bG9jayk7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIIHwgU1BJX0xTQl9GSVJTVCkKKwogc3RhdGljIGludCBtcGM1Mnh4X3BzY19zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgbXBjNTJ4eF9wc2Nfc3BpICptcHMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKQEAgLTI3OSw2ICsyODIsMTIgQEAKIAlpZiAoc3BpLT5iaXRzX3Blcl93b3JkJTgpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoIWNzKSB7CiAJCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMgYi9kcml2ZXJzL3NwaS9vbWFwMl9tY3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzU3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9vbWFwMl9tY3NwaS5jCkBAIC0wLDAgKzEsMTA4MSBAQAorLyoKKyAqIE9NQVAyIE1jU1BJIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6CVNhbXVlbCBPcnRpeiA8c2FtdWVsLm9ydGl6QG5va2lhLmNvbT4gYW5kCisgKgkJSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9jay5oPgorCisKKyNkZWZpbmUgT01BUDJfTUNTUElfTUFYX0ZSRVEJCTQ4MDAwMDAwCisKKyNkZWZpbmUgT01BUDJfTUNTUElfUkVWSVNJT04JCTB4MDAKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTQ09ORklHCQkweDEwCisjZGVmaW5lIE9NQVAyX01DU1BJX1NZU1NUQVRVUwkJMHgxNAorI2RlZmluZSBPTUFQMl9NQ1NQSV9JUlFTVEFUVVMJCTB4MTgKKyNkZWZpbmUgT01BUDJfTUNTUElfSVJRRU5BQkxFCQkweDFjCisjZGVmaW5lIE9NQVAyX01DU1BJX1dBS0VVUEVOQUJMRQkweDIwCisjZGVmaW5lIE9NQVAyX01DU1BJX1NZU1QJCTB4MjQKKyNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMCQkweDI4CisKKy8qIHBlci1jaGFubmVsIGJhbmtzLCAweDE0IGJ5dGVzIGVhY2gsIGZpcnN0IGlzOiAqLworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkYwCQkweDJjCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVDAJCTB4MzAKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDVFJMMAkJMHgzNAorI2RlZmluZSBPTUFQMl9NQ1NQSV9UWDAJCQkweDM4CisjZGVmaW5lIE9NQVAyX01DU1BJX1JYMAkJCTB4M2MKKworLyogcGVyLXJlZ2lzdGVyIGJpdG1hc2tzOiAqLworCisjZGVmaW5lIE9NQVAyX01DU1BJX1NZU0NPTkZJR19BVVRPSURMRQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNDT05GSUdfU09GVFJFU0VUCSgxIDw8IDEpCisKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTU1RBVFVTX1JFU0VURE9ORQkoMSA8PCAwKQorCisjZGVmaW5lIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9TSU5HTEUJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMX01TCSgxIDw8IDIpCisjZGVmaW5lIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9TVEVTVAkoMSA8PCAzKQorCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9QSEEJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9QT0wJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9DTEtEX01BU0sJKDB4MGYgPDwgMikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0VQT0wJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9XTF9NQVNLCSgweDFmIDw8IDcpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fUlhfT05MWQkoMHgwMSA8PCAxMikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RSTV9UWF9PTkxZCSgweDAyIDw8IDEyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX01BU0sJKDB4MDMgPDwgMTIpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9ETUFXCQkoMSA8PCAxNCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0RNQVIJCSgxIDw8IDE1KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRFBFMAkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9EUEUxCQkoMSA8PCAxNykKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0lTCQkoMSA8PCAxOCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RVUkJPCSgxIDw8IDE5KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UJKDEgPDwgMjApCisKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX1JYUwkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX1RYUwkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX0VPVAkJKDEgPDwgMikKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkxfRU4JCSgxIDw8IDApCisKKworLyogV2UgaGF2ZSAyIERNQSBjaGFubmVscyBwZXIgQ1MsIG9uZSBmb3IgUlggYW5kIG9uZSBmb3IgVFggKi8KK3N0cnVjdCBvbWFwMl9tY3NwaV9kbWEgeworCWludCBkbWFfdHhfY2hhbm5lbDsKKwlpbnQgZG1hX3J4X2NoYW5uZWw7CisKKwlpbnQgZG1hX3R4X3N5bmNfZGV2OworCWludCBkbWFfcnhfc3luY19kZXY7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiBkbWFfdHhfY29tcGxldGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkbWFfcnhfY29tcGxldGlvbjsKK307CisKKy8qIHVzZSBQSU8gZm9yIHNtYWxsIHRyYW5zZmVycywgYXZvaWRpbmcgRE1BIHNldHVwL3RlYXJkb3duIG92ZXJoZWFkIGFuZAorICogY2FjaGUgb3BlcmF0aW9uczsgYmV0dGVyIGhldXJpc3RpY3MgY29uc2lkZXIgd29yZHNpemUgYW5kIGJpdHJhdGUuCisgKi8KKyNkZWZpbmUgRE1BX01JTl9CWVRFUwkJCTgKKworCitzdHJ1Y3Qgb21hcDJfbWNzcGkgeworCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworCS8qIGxvY2sgcHJvdGVjdHMgcXVldWUgYW5kIHJlZ2lzdGVycyAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZAltc2dfcXVldWU7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3QgY2xrCQkqaWNrOworCXN0cnVjdCBjbGsJCSpmY2s7CisJLyogVmlydHVhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgKi8KKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCS8qIFNQSTEgaGFzIDQgY2hhbm5lbHMsIHdoaWxlIFNQSTIgaGFzIDIgKi8KKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSpkbWFfY2hhbm5lbHM7Cit9OworCitzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgeworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJaW50CQkJd29yZF9sZW47Cit9OworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm9tYXAyX21jc3BpX3dxOworCisjZGVmaW5lIE1PRF9SRUdfQklUKHZhbCwgbWFzaywgc2V0KSBkbyB7IFwKKwlpZiAoc2V0KSBcCisJCXZhbCB8PSBtYXNrOyBcCisJZWxzZSBcCisJCXZhbCAmPSB+bWFzazsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIG1jc3BpX3dyaXRlX3JlZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQlpbnQgaWR4LCB1MzIgdmFsKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlfX3Jhd193cml0ZWwodmFsLCBtY3NwaS0+YmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1jc3BpX3JlYWRfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIGludCBpZHgpCit7CisJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXJldHVybiBfX3Jhd19yZWFkbChtY3NwaS0+YmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY3NwaV93cml0ZV9jc19yZWcoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJaW50IGlkeCwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJX19yYXdfd3JpdGVsKHZhbCwgY3MtPmJhc2UgKyAgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbWNzcGlfcmVhZF9jc19yZWcoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKGNzLT5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJaW50IGlzX3JlYWQsIGludCBlbmFibGUpCit7CisJdTMyIGwsIHJ3OworCisJbCA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCk7CisKKwlpZiAoaXNfcmVhZCkgLyogMSBpcyByZWFkLCAwIHdyaXRlICovCisJCXJ3ID0gT01BUDJfTUNTUElfQ0hDT05GX0RNQVI7CisJZWxzZQorCQlydyA9IE9NQVAyX01DU1BJX0NIQ09ORl9ETUFXOworCisJTU9EX1JFR19CSVQobCwgcncsIGVuYWJsZSk7CisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3NldF9lbmFibGUoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGVuYWJsZSkKK3sKKwl1MzIgbDsKKworCWwgPSBlbmFibGUgPyBPTUFQMl9NQ1NQSV9DSENUUkxfRU4gOiAwOworCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ1RSTDAsIGwpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9mb3JjZV9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgY3NfYWN0aXZlKQoreworCXUzMiBsOworCisJbCA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCk7CisJTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFLCBjc19hY3RpdmUpOworCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjAsIGwpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfbWFzdGVyX21vZGUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwl1MzIgbDsKKworCS8qIHNldHVwIHdoZW4gc3dpdGNoaW5nIGZyb20gKHJlc2V0IGRlZmF1bHQpIHNsYXZlIG1vZGUKKwkgKiB0byBzaW5nbGUtY2hhbm5lbCBtYXN0ZXIgbW9kZQorCSAqLworCWwgPSBtY3NwaV9yZWFkX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX01PRFVMQ1RSTCk7CisJTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NURVNULCAwKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfTVMsIDApOworCU1PRF9SRUdfQklUKGwsIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9TSU5HTEUsIDEpOworCW1jc3BpX3dyaXRlX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX01PRFVMQ1RSTCwgbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorb21hcDJfbWNzcGlfdHhyeF9kbWEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYSAgKm1jc3BpX2RtYTsKKwl1bnNpZ25lZCBpbnQJCWNvdW50LCBjOworCXVuc2lnbmVkIGxvbmcJCWJhc2UsIHR4X3JlZywgcnhfcmVnOworCWludAkJCXdvcmRfbGVuLCBkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQ7CisJdTgJCQkqIHJ4OworCWNvbnN0IHU4CQkqIHR4OworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwltY3NwaV9kbWEgPSAmbWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XTsKKworCWNvdW50ID0geGZlci0+bGVuOworCWMgPSBjb3VudDsKKwl3b3JkX2xlbiA9IGNzLT53b3JkX2xlbjsKKworCWJhc2UgPSAodW5zaWduZWQgbG9uZykgaW9fdjJwKGNzLT5iYXNlKTsKKwl0eF9yZWcgPSBiYXNlICsgT01BUDJfTUNTUElfVFgwOworCXJ4X3JlZyA9IGJhc2UgKyBPTUFQMl9NQ1NQSV9SWDA7CisJcnggPSB4ZmVyLT5yeF9idWY7CisJdHggPSB4ZmVyLT50eF9idWY7CisKKwlpZiAod29yZF9sZW4gPD0gOCkgeworCQlkYXRhX3R5cGUgPSBPTUFQX0RNQV9EQVRBX1RZUEVfUzg7CisJCWVsZW1lbnRfY291bnQgPSBjb3VudDsKKwl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7CisJCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMTY7CisJCWVsZW1lbnRfY291bnQgPSBjb3VudCA+PiAxOworCX0gZWxzZSAvKiB3b3JkX2xlbiA8PSAzMiAqLyB7CisJCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzI7CisJCWVsZW1lbnRfY291bnQgPSBjb3VudCA+PiAyOworCX0KKworCWlmICh0eCAhPSBOVUxMKSB7CisJCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwKKwkJCQlkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQsIDEsCisJCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAorCQkJCW1jc3BpX2RtYS0+ZG1hX3R4X3N5bmNfZGV2LCAwKTsKKworCQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwgMCwKKwkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKKwkJCQl0eF9yZWcsIDAsIDApOworCisJCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwsIDAsCisJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJeGZlci0+dHhfZG1hLCAwLCAwKTsKKwl9CisKKwlpZiAocnggIT0gTlVMTCkgeworCQlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwsCisJCQkJZGF0YV90eXBlLCBlbGVtZW50X2NvdW50LCAxLAorCQkJCU9NQVBfRE1BX1NZTkNfRUxFTUVOVCwKKwkJCQltY3NwaV9kbWEtPmRtYV9yeF9zeW5jX2RldiwgMSk7CisKKwkJb21hcF9zZXRfZG1hX3NyY19wYXJhbXMobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCwgMCwKKwkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKKwkJCQlyeF9yZWcsIDAsIDApOworCisJCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLCAwLAorCQkJCU9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLAorCQkJCXhmZXItPnJ4X2RtYSwgMCwgMCk7CisJfQorCisJaWYgKHR4ICE9IE5VTEwpIHsKKwkJb21hcF9zdGFydF9kbWEobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCk7CisJCW9tYXAyX21jc3BpX3NldF9kbWFfcmVxKHNwaSwgMCwgMSk7CisJfQorCisJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJb21hcF9zdGFydF9kbWEobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCk7CisJCW9tYXAyX21jc3BpX3NldF9kbWFfcmVxKHNwaSwgMSwgMSk7CisJfQorCisJaWYgKHR4ICE9IE5VTEwpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfdHhfY29tcGxldGlvbik7CisJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgeGZlci0+dHhfZG1hLCBjb3VudCwgRE1BX1RPX0RFVklDRSk7CisJfQorCisJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgeGZlci0+cnhfZG1hLCBjb3VudCwgRE1BX0ZST01fREVWSUNFKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgYml0KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwl3aGlsZSAoIShfX3Jhd19yZWFkbChyZWcpICYgYml0KSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCXJldHVybiAtMTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQKK29tYXAyX21jc3BpX3R4cnhfcGlvKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXVuc2lnbmVkIGludAkJY291bnQsIGM7CisJdTMyCQkJbDsKKwl2b2lkIF9faW9tZW0JCSpiYXNlID0gY3MtPmJhc2U7CisJdm9pZCBfX2lvbWVtCQkqdHhfcmVnOworCXZvaWQgX19pb21lbQkJKnJ4X3JlZzsKKwl2b2lkIF9faW9tZW0JCSpjaHN0YXRfcmVnOworCWludAkJCXdvcmRfbGVuOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwljb3VudCA9IHhmZXItPmxlbjsKKwljID0gY291bnQ7CisJd29yZF9sZW4gPSBjcy0+d29yZF9sZW47CisKKwlsID0gbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKKwlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfVFJNX01BU0s7CisKKwkvKiBXZSBzdG9yZSB0aGUgcHJlLWNhbGN1bGF0ZWQgcmVnaXN0ZXIgYWRkcmVzc2VzIG9uIHN0YWNrIHRvIHNwZWVkCisJICogdXAgdGhlIHRyYW5zZmVyIGxvb3AuICovCisJdHhfcmVnCQk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9UWDA7CisJcnhfcmVnCQk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9SWDA7CisJY2hzdGF0X3JlZwk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9DSFNUQVQwOworCisJaWYgKHdvcmRfbGVuIDw9IDgpIHsKKwkJdTgJCSpyeDsKKwkJY29uc3QgdTgJKnR4OworCisJCXJ4ID0geGZlci0+cnhfYnVmOworCQl0eCA9IHhmZXItPnR4X2J1ZjsKKworCQlkbyB7CisJCQlpZiAodHggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorI2lmZGVmIFZFUkJPU0UKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgIndyaXRlLSVkICUwMnhcbiIsCisJCQkJCQl3b3JkX2xlbiwgKnR4KTsKKyNlbmRpZgorCQkJCV9fcmF3X3dyaXRlbCgqdHgrKywgdHhfcmVnKTsKKwkJCX0KKwkJCWlmIChyeCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9SWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlJYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyogcHJldmVudCBsYXN0IFJYX09OTFkgcmVhZCBmcm9tIHRyaWdnZXJpbmcKKwkJCQkgKiBtb3JlIHdvcmQgaS9vOiBzd2l0Y2ggdG8gcngrdHgKKwkJCQkgKi8KKwkJCQlpZiAoYyA9PSAwICYmIHR4ID09IE5VTEwpCisJCQkJCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksCisJCQkJCQkJT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7CisJCQkJKnJ4KysgPSBfX3Jhd19yZWFkbChyeF9yZWcpOworI2lmZGVmIFZFUkJPU0UKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTAyeFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqKHJ4IC0gMSkpOworI2VuZGlmCisJCQl9CisJCQljIC09IDE7CisJCX0gd2hpbGUgKGMpOworCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMTYpIHsKKwkJdTE2CQkqcng7CisJCWNvbnN0IHUxNgkqdHg7CisKKwkJcnggPSB4ZmVyLT5yeF9idWY7CisJCXR4ID0geGZlci0+dHhfYnVmOworCQlkbyB7CisJCQlpZiAodHggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorI2lmZGVmIFZFUkJPU0UKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgIndyaXRlLSVkICUwNHhcbiIsCisJCQkJCQl3b3JkX2xlbiwgKnR4KTsKKyNlbmRpZgorCQkJCV9fcmF3X3dyaXRlbCgqdHgrKywgdHhfcmVnKTsKKwkJCX0KKwkJCWlmIChyeCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9SWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlJYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyogcHJldmVudCBsYXN0IFJYX09OTFkgcmVhZCBmcm9tIHRyaWdnZXJpbmcKKwkJCQkgKiBtb3JlIHdvcmQgaS9vOiBzd2l0Y2ggdG8gcngrdHgKKwkJCQkgKi8KKwkJCQlpZiAoYyA9PSAwICYmIHR4ID09IE5VTEwpCisJCQkJCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksCisJCQkJCQkJT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7CisJCQkJKnJ4KysgPSBfX3Jhd19yZWFkbChyeF9yZWcpOworI2lmZGVmIFZFUkJPU0UKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTA0eFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqKHJ4IC0gMSkpOworI2VuZGlmCisJCQl9CisJCQljIC09IDI7CisJCX0gd2hpbGUgKGMpOworCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMzIpIHsKKwkJdTMyCQkqcng7CisJCWNvbnN0IHUzMgkqdHg7CisKKwkJcnggPSB4ZmVyLT5yeF9idWY7CisJCXR4ID0geGZlci0+dHhfYnVmOworCQlkbyB7CisJCQlpZiAodHggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorI2lmZGVmIFZFUkJPU0UKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgIndyaXRlLSVkICUwNHhcbiIsCisJCQkJCQl3b3JkX2xlbiwgKnR4KTsKKyNlbmRpZgorCQkJCV9fcmF3X3dyaXRlbCgqdHgrKywgdHhfcmVnKTsKKwkJCX0KKwkJCWlmIChyeCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9SWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlJYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyogcHJldmVudCBsYXN0IFJYX09OTFkgcmVhZCBmcm9tIHRyaWdnZXJpbmcKKwkJCQkgKiBtb3JlIHdvcmQgaS9vOiBzd2l0Y2ggdG8gcngrdHgKKwkJCQkgKi8KKwkJCQlpZiAoYyA9PSAwICYmIHR4ID09IE5VTEwpCisJCQkJCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksCisJCQkJCQkJT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7CisJCQkJKnJ4KysgPSBfX3Jhd19yZWFkbChyeF9yZWcpOworI2lmZGVmIFZFUkJPU0UKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTA0eFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqKHJ4IC0gMSkpOworI2VuZGlmCisJCQl9CisJCQljIC09IDQ7CisJCX0gd2hpbGUgKGMpOworCX0KKworCS8qIGZvciBUWF9PTkxZIG1vZGUsIGJlIHN1cmUgYWxsIHdvcmRzIGhhdmUgc2hpZnRlZCBvdXQgKi8KKwlpZiAoeGZlci0+cnhfYnVmID09IE5VTEwpIHsKKwkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCX0gZWxzZSBpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9FT1QpIDwgMCkKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRU9UIHRpbWVkIG91dFxuIik7CisJfQorb3V0OgorCXJldHVybiBjb3VudCAtIGM7Cit9CisKKy8qIGNhbGxlZCBvbmx5IHdoZW4gbm8gdHJhbnNmZXIgaXMgYWN0aXZlIHRvIHRoaXMgZGV2aWNlICovCitzdGF0aWMgaW50IG9tYXAyX21jc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpOworCXUzMiBsID0gMCwgZGl2ID0gMDsKKwl1OCB3b3JkX2xlbiA9IHNwaS0+Yml0c19wZXJfd29yZDsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlpZiAodCAhPSBOVUxMICYmIHQtPmJpdHNfcGVyX3dvcmQpCisJCXdvcmRfbGVuID0gdC0+Yml0c19wZXJfd29yZDsKKworCWNzLT53b3JkX2xlbiA9IHdvcmRfbGVuOworCisJaWYgKHNwaS0+bWF4X3NwZWVkX2h6KSB7CisJCXdoaWxlIChkaXYgPD0gMTUgJiYgKE9NQVAyX01DU1BJX01BWF9GUkVRIC8gKDEgPDwgZGl2KSkKKwkJCQkJPiBzcGktPm1heF9zcGVlZF9oeikKKwkJCWRpdisrOworCX0gZWxzZQorCQlkaXYgPSAxNTsKKworCWwgPSBtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjApOworCisJLyogc3RhbmRhcmQgNC13aXJlIG1hc3RlciBtb2RlOiAgU0NLLCBNT1NJL291dCwgTUlTTy9pbiwgbkNTCisJICogUkVWSVNJVDogdGhpcyBjb250cm9sbGVyIGNvdWxkIHN1cHBvcnQgU1BJXzNXSVJFIG1vZGUuCisJICovCisJbCAmPSB+KE9NQVAyX01DU1BJX0NIQ09ORl9JU3xPTUFQMl9NQ1NQSV9DSENPTkZfRFBFMSk7CisJbCB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfRFBFMDsKKworCS8qIHdvcmRsZW5ndGggKi8KKwlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfV0xfTUFTSzsKKwlsIHw9ICh3b3JkX2xlbiAtIDEpIDw8IDc7CisKKwkvKiBzZXQgY2hpcHNlbGVjdCBwb2xhcml0eTsgbWFuYWdlIHdpdGggRk9SQ0UgKi8KKwlpZiAoIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpCisJCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX0VQT0w7CS8qIGFjdGl2ZS1sb3c7IG5vcm1hbCAqLworCWVsc2UKKwkJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX0VQT0w7CisKKwkvKiBzZXQgY2xvY2sgZGl2aXNvciAqLworCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9DTEtEX01BU0s7CisJbCB8PSBkaXYgPDwgMjsKKworCS8qIHNldCBTUEkgbW9kZSAwLi4zICovCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9QT0w7CisJZWxzZQorCQlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfUE9MOworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJbCB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfUEhBOworCWVsc2UKKwkJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1BIQTsKKworCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjAsIGwpOworCisJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogc3BlZWQgJWQsIHNhbXBsZSAlcyBlZGdlLCBjbGsgJXNcbiIsCisJCQlPTUFQMl9NQ1NQSV9NQVhfRlJFUSAvICgxIDw8IGRpdiksCisJCQkoc3BpLT5tb2RlICYgU1BJX0NQSEEpID8gInRyYWlsaW5nIiA6ICJsZWFkaW5nIiwKKwkJCShzcGktPm1vZGUgJiBTUElfQ1BPTCkgPyAiaW52ZXJ0ZWQiIDogIm5vcm1hbCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2RtYV9yeF9jYWxsYmFjayhpbnQgbGNoLCB1MTYgY2hfc3RhdHVzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSBkYXRhOworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwltY3NwaV9kbWEgPSAmKG1jc3BpLT5kbWFfY2hhbm5lbHNbc3BpLT5jaGlwX3NlbGVjdF0pOworCisJY29tcGxldGUoJm1jc3BpX2RtYS0+ZG1hX3J4X2NvbXBsZXRpb24pOworCisJLyogV2UgbXVzdCBkaXNhYmxlIHRoZSBETUEgUlggcmVxdWVzdCAqLworCW9tYXAyX21jc3BpX3NldF9kbWFfcmVxKHNwaSwgMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2RtYV90eF9jYWxsYmFjayhpbnQgbGNoLCB1MTYgY2hfc3RhdHVzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSBkYXRhOworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwltY3NwaV9kbWEgPSAmKG1jc3BpLT5kbWFfY2hhbm5lbHNbc3BpLT5jaGlwX3NlbGVjdF0pOworCisJY29tcGxldGUoJm1jc3BpX2RtYS0+ZG1hX3R4X2NvbXBsZXRpb24pOworCisJLyogV2UgbXVzdCBkaXNhYmxlIHRoZSBETUEgVFggcmVxdWVzdCAqLworCW9tYXAyX21jc3BpX3NldF9kbWFfcmVxKHNwaSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgb21hcDJfbWNzcGlfcmVxdWVzdF9kbWEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyID0gc3BpLT5tYXN0ZXI7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwltY3NwaV9kbWEgPSBtY3NwaS0+ZG1hX2NoYW5uZWxzICsgc3BpLT5jaGlwX3NlbGVjdDsKKworCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jc3BpX2RtYS0+ZG1hX3J4X3N5bmNfZGV2LCAiTWNTUEkgUlgiLAorCQkJb21hcDJfbWNzcGlfZG1hX3J4X2NhbGxiYWNrLCBzcGksCisJCQkmbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCkpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBSWCBETUEgY2hhbm5lbCBmb3IgTWNTUElcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAob21hcF9yZXF1ZXN0X2RtYShtY3NwaV9kbWEtPmRtYV90eF9zeW5jX2RldiwgIk1jU1BJIFRYIiwKKwkJCW9tYXAyX21jc3BpX2RtYV90eF9jYWxsYmFjaywgc3BpLAorCQkJJm1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwpKSB7CisJCW9tYXBfZnJlZV9kbWEobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCk7CisJCW1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwgPSAtMTsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBUWCBETUEgY2hhbm5lbCBmb3IgTWNTUElcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJm1jc3BpX2RtYS0+ZG1hX3J4X2NvbXBsZXRpb24pOworCWluaXRfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfdHhfY29tcGxldGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gpCisKK3N0YXRpYyBpbnQgb21hcDJfbWNzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQJCQlyZXQ7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCA9PSAwKQorCQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCWVsc2UgaWYgKHNwaS0+Yml0c19wZXJfd29yZCA8IDQgfHwgc3BpLT5iaXRzX3Blcl93b3JkID4gMzIpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgJWQgYml0IHdvcmRzXG4iLAorCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwltY3NwaV9kbWEgPSAmbWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XTsKKworCWlmICghY3MpIHsKKwkJY3MgPSBremFsbG9jKHNpemVvZiAqY3MsIEdGUF9LRVJORUwpOworCQlpZiAoIWNzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWNzLT5iYXNlID0gbWNzcGktPmJhc2UgKyBzcGktPmNoaXBfc2VsZWN0ICogMHgxNDsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CisJfQorCisJaWYgKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwgPT0gLTEKKwkJCXx8IG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwgPT0gLTEpIHsKKwkJcmV0ID0gb21hcDJfbWNzcGlfcmVxdWVzdF9kbWEoc3BpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWNsa19lbmFibGUobWNzcGktPmljayk7CisJY2xrX2VuYWJsZShtY3NwaS0+ZmNrKTsKKwlyZXQgPSAgb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwljbGtfZGlzYWJsZShtY3NwaS0+ZmNrKTsKKwljbGtfZGlzYWJsZShtY3NwaS0+aWNrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJbWNzcGlfZG1hID0gJm1jc3BpLT5kbWFfY2hhbm5lbHNbc3BpLT5jaGlwX3NlbGVjdF07CisKKwlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOworCisJaWYgKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwgIT0gLTEpIHsKKwkJb21hcF9mcmVlX2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKKwkJbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9IC0xOworCX0KKwlpZiAobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCAhPSAtMSkgeworCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwpOworCQltY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCisJbWNzcGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9tYXAyX21jc3BpLCB3b3JrKTsKKwlzcGluX2xvY2tfaXJxKCZtY3NwaS0+bG9jayk7CisKKwljbGtfZW5hYmxlKG1jc3BpLT5pY2spOworCWNsa19lbmFibGUobWNzcGktPmZjayk7CisKKwkvKiBXZSBvbmx5IGVuYWJsZSBvbmUgY2hhbm5lbCBhdCBhIHRpbWUgLS0gdGhlIG9uZSB3aG9zZSBtZXNzYWdlIGlzCisJICogYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIC0tIGFsdGhvdWdoIHRoaXMgY29udHJvbGxlciB3b3VsZCBnbGFkbHkKKwkgKiBhcmJpdHJhdGUgYW1vbmcgbXVsdGlwbGUgY2hhbm5lbHMuICBUaGlzIGNvcnJlc3BvbmRzIHRvICJzaW5nbGUKKwkgKiBjaGFubmVsIiBtYXN0ZXIgbW9kZS4gIEFzIGEgc2lkZSBlZmZlY3QsIHdlIG5lZWQgdG8gbWFuYWdlIHRoZQorCSAqIGNoaXBzZWxlY3Qgd2l0aCB0aGUgRk9SQ0UgYml0IC4uLiBDUyAhPSBjaGFubmVsIGVuYWJsZS4KKwkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1jc3BpLT5tc2dfcXVldWUpKSB7CisJCXN0cnVjdCBzcGlfbWVzc2FnZQkJKm07CisJCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOworCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCQkqdCA9IE5VTEw7CisJCWludAkJCQljc19hY3RpdmUgPSAwOworCQlzdHJ1Y3Qgb21hcDJfbWNzcGlfZGV2aWNlX2NvbmZpZyAqY29uZjsKKwkJc3RydWN0IG9tYXAyX21jc3BpX2NzCQkqY3M7CisJCWludAkJCQlwYXJfb3ZlcnJpZGUgPSAwOworCQlpbnQJCQkJc3RhdHVzID0gMDsKKwkJdTMyCQkJCWNoY29uZjsKKworCQltID0gY29udGFpbmVyX29mKG1jc3BpLT5tc2dfcXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLAorCQkJCSBxdWV1ZSk7CisKKwkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOworCQlzcGluX3VubG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKworCQlzcGkgPSBtLT5zcGk7CisJCWNvbmYgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwkJY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwkJb21hcDJfbWNzcGlfc2V0X2VuYWJsZShzcGksIDEpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJCWlmICh0LT50eF9idWYgPT0gTlVMTCAmJiB0LT5yeF9idWYgPT0gTlVMTCAmJiB0LT5sZW4pIHsKKwkJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBhcl9vdmVycmlkZSB8fCB0LT5zcGVlZF9oeiB8fCB0LT5iaXRzX3Blcl93b3JkKSB7CisJCQkJcGFyX292ZXJyaWRlID0gMTsKKwkJCQlzdGF0dXMgPSBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIHQpOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIXQtPnNwZWVkX2h6ICYmICF0LT5iaXRzX3Blcl93b3JkKQorCQkJCQlwYXJfb3ZlcnJpZGUgPSAwOworCQkJfQorCisJCQlpZiAoIWNzX2FjdGl2ZSkgeworCQkJCW9tYXAyX21jc3BpX2ZvcmNlX2NzKHNwaSwgMSk7CisJCQkJY3NfYWN0aXZlID0gMTsKKwkJCX0KKworCQkJY2hjb25mID0gbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKKwkJCWNoY29uZiAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1RSTV9NQVNLOworCQkJaWYgKHQtPnR4X2J1ZiA9PSBOVUxMKQorCQkJCWNoY29uZiB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1JYX09OTFk7CisJCQllbHNlIGlmICh0LT5yeF9idWYgPT0gTlVMTCkKKwkJCQljaGNvbmYgfD0gT01BUDJfTUNTUElfQ0hDT05GX1RSTV9UWF9PTkxZOworCQkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCwgY2hjb25mKTsKKworCQkJaWYgKHQtPmxlbikgeworCQkJCXVuc2lnbmVkCWNvdW50OworCisJCQkJLyogUlhfT05MWSBtb2RlIG5lZWRzIGR1bW15IGRhdGEgaW4gVFggcmVnICovCisJCQkJaWYgKHQtPnR4X2J1ZiA9PSBOVUxMKQorCQkJCQlfX3Jhd193cml0ZWwoMCwgY3MtPmJhc2UKKwkJCQkJCQkrIE9NQVAyX01DU1BJX1RYMCk7CisKKwkJCQlpZiAobS0+aXNfZG1hX21hcHBlZCB8fCB0LT5sZW4gPj0gRE1BX01JTl9CWVRFUykKKwkJCQkJY291bnQgPSBvbWFwMl9tY3NwaV90eHJ4X2RtYShzcGksIHQpOworCQkJCWVsc2UKKwkJCQkJY291bnQgPSBvbWFwMl9tY3NwaV90eHJ4X3BpbyhzcGksIHQpOworCQkJCW0tPmFjdHVhbF9sZW5ndGggKz0gY291bnQ7CisKKwkJCQlpZiAoY291bnQgIT0gdC0+bGVuKSB7CisJCQkJCXN0YXR1cyA9IC1FSU87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHQtPmRlbGF5X3VzZWNzKQorCQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7CisKKwkJCS8qIGlnbm9yZSB0aGUgImxlYXZlIGl0IG9uIGFmdGVyIGxhc3QgeGZlciIgaGludCAqLworCQkJaWYgKHQtPmNzX2NoYW5nZSkgeworCQkJCW9tYXAyX21jc3BpX2ZvcmNlX2NzKHNwaSwgMCk7CisJCQkJY3NfYWN0aXZlID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIFJlc3RvcmUgZGVmYXVsdHMgaWYgdGhleSB3ZXJlIG92ZXJyaWRlbiAqLworCQlpZiAocGFyX292ZXJyaWRlKSB7CisJCQlwYXJfb3ZlcnJpZGUgPSAwOworCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwkJfQorCisJCWlmIChjc19hY3RpdmUpCisJCQlvbWFwMl9tY3NwaV9mb3JjZV9jcyhzcGksIDApOworCisJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAwKTsKKworCQltLT5zdGF0dXMgPSBzdGF0dXM7CisJCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOworCisJCXNwaW5fbG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKwl9CisKKwljbGtfZGlzYWJsZShtY3NwaS0+ZmNrKTsKKwljbGtfZGlzYWJsZShtY3NwaS0+aWNrKTsKKworCXNwaW5fdW5sb2NrX2lycSgmbWNzcGktPmxvY2spOworfQorCitzdGF0aWMgaW50IG9tYXAyX21jc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnQ7CisKKwltLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwltLT5zdGF0dXMgPSAwOworCisJLyogcmVqZWN0IGludmFsaWQgbWVzc2FnZXMgYW5kIHRyYW5zZmVycyAqLworCWlmIChsaXN0X2VtcHR5KCZtLT50cmFuc2ZlcnMpIHx8ICFtLT5jb21wbGV0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWNvbnN0IHZvaWQJKnR4X2J1ZiA9IHQtPnR4X2J1ZjsKKwkJdm9pZAkJKnJ4X2J1ZiA9IHQtPnJ4X2J1ZjsKKwkJdW5zaWduZWQJbGVuID0gdC0+bGVuOworCisJCWlmICh0LT5zcGVlZF9oeiA+IE9NQVAyX01DU1BJX01BWF9GUkVRCisJCQkJfHwgKGxlbiAmJiAhKHJ4X2J1ZiB8fCB0eF9idWYpKQorCQkJCXx8ICh0LT5iaXRzX3Blcl93b3JkICYmCisJCQkJCSggIHQtPmJpdHNfcGVyX3dvcmQgPCA0CisJCQkJCXx8IHQtPmJpdHNfcGVyX3dvcmQgPiAzMikpKSB7CisJCQlkZXZfZGJnKCZzcGktPmRldiwgInRyYW5zZmVyOiAlZCBIeiwgJWQgJXMlcywgJWQgYnB3XG4iLAorCQkJCQl0LT5zcGVlZF9oeiwKKwkJCQkJbGVuLAorCQkJCQl0eF9idWYgPyAidHgiIDogIiIsCisJCQkJCXJ4X2J1ZiA/ICJyeCIgOiAiIiwKKwkJCQkJdC0+Yml0c19wZXJfd29yZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAodC0+c3BlZWRfaHogJiYgdC0+c3BlZWRfaHogPCBPTUFQMl9NQ1NQSV9NQVhfRlJFUS8oMTw8MTYpKSB7CisJCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIEh6IG1heCBleGNlZWRzICVkXG4iLAorCQkJCQl0LT5zcGVlZF9oeiwKKwkJCQkJT01BUDJfTUNTUElfTUFYX0ZSRVEvKDE8PDE2KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChtLT5pc19kbWFfbWFwcGVkIHx8IGxlbiA8IERNQV9NSU5fQllURVMpCisJCQljb250aW51ZTsKKworCQkvKiBEbyBETUEgbWFwcGluZyAiZWFybHkiIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGFuZAorCQkgKiBkY2FjaGUgdXNlLiAgTm90ZSB0aGF0IGlmIGRtYV91bm1hcF9zaW5nbGUoKSBldmVyIHN0YXJ0cworCQkgKiB0byBkbyByZWFsIHdvcmsgb24gQVJNLCB3ZSdkIG5lZWQgdG8gY2xlYW4gdXAgbWFwcGluZ3MKKwkJICogZm9yIHByZXZpb3VzIHRyYW5zZmVycyBvbiAqQUxMKiBleGl0cyBvZiB0aGlzIGxvb3AuLi4KKwkJICovCisJCWlmICh0eF9idWYgIT0gTlVMTCkgeworCQkJdC0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoJnNwaS0+ZGV2LCAodm9pZCAqKSB0eF9idWYsCisJCQkJCWxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IodC0+dHhfZG1hKSkgeworCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZG1hICVjWCAlZCBieXRlcyBlcnJvclxuIiwKKwkJCQkJCSdUJywgbGVuKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQlpZiAocnhfYnVmICE9IE5VTEwpIHsKKwkJCXQtPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZzcGktPmRldiwgcnhfYnVmLCB0LT5sZW4sCisJCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IodC0+cnhfZG1hKSkgeworCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZG1hICVjWCAlZCBieXRlcyBlcnJvclxuIiwKKwkJCQkJCSdSJywgbGVuKTsKKwkJCQlpZiAodHhfYnVmICE9IE5VTEwpCisJCQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgdC0+dHhfZG1hLAorCQkJCQkJCWxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jc3BpLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZtY3NwaS0+bXNnX3F1ZXVlKTsKKwlxdWV1ZV93b3JrKG9tYXAyX21jc3BpX3dxLCAmbWNzcGktPndvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jc3BpLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgb21hcDJfbWNzcGlfcmVzZXQoc3RydWN0IG9tYXAyX21jc3BpICptY3NwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyID0gbWNzcGktPm1hc3RlcjsKKwl1MzIJCQl0bXA7CisKKwljbGtfZW5hYmxlKG1jc3BpLT5pY2spOworCWNsa19lbmFibGUobWNzcGktPmZjayk7CisKKwltY3NwaV93cml0ZV9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9TWVNDT05GSUcsCisJCQlPTUFQMl9NQ1NQSV9TWVNDT05GSUdfU09GVFJFU0VUKTsKKwlkbyB7CisJCXRtcCA9IG1jc3BpX3JlYWRfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfU1lTU1RBVFVTKTsKKwl9IHdoaWxlICghKHRtcCAmIE9NQVAyX01DU1BJX1NZU1NUQVRVU19SRVNFVERPTkUpKTsKKworCW1jc3BpX3dyaXRlX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX1NZU0NPTkZJRywKKwkJCS8qICgzIDw8IDgpIHwgKDIgPDwgMykgfCAqLworCQkJT01BUDJfTUNTUElfU1lTQ09ORklHX0FVVE9JRExFKTsKKworCW9tYXAyX21jc3BpX3NldF9tYXN0ZXJfbW9kZShtYXN0ZXIpOworCisJY2xrX2Rpc2FibGUobWNzcGktPmZjayk7CisJY2xrX2Rpc2FibGUobWNzcGktPmljayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBfX2luaXRkYXRhIHNwaTFfcnhkbWFfaWQgW10gPSB7CisJT01BUDI0WFhfRE1BX1NQSTFfUlgwLAorCU9NQVAyNFhYX0RNQV9TUEkxX1JYMSwKKwlPTUFQMjRYWF9ETUFfU1BJMV9SWDIsCisJT01BUDI0WFhfRE1BX1NQSTFfUlgzLAorfTsKKworc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMV90eGRtYV9pZCBbXSA9IHsKKwlPTUFQMjRYWF9ETUFfU1BJMV9UWDAsCisJT01BUDI0WFhfRE1BX1NQSTFfVFgxLAorCU9NQVAyNFhYX0RNQV9TUEkxX1RYMiwKKwlPTUFQMjRYWF9ETUFfU1BJMV9UWDMsCit9OworCitzdGF0aWMgdTggX19pbml0ZGF0YSBzcGkyX3J4ZG1hX2lkW10gPSB7CisJT01BUDI0WFhfRE1BX1NQSTJfUlgwLAorCU9NQVAyNFhYX0RNQV9TUEkyX1JYMSwKK307CisKK3N0YXRpYyB1OCBfX2luaXRkYXRhIHNwaTJfdHhkbWFfaWRbXSA9IHsKKwlPTUFQMjRYWF9ETUFfU1BJMl9UWDAsCisJT01BUDI0WFhfRE1BX1NQSTJfVFgxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcDJfbWNzcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IHJlc291cmNlCQkqcjsKKwlpbnQJCQlzdGF0dXMgPSAwLCBpOworCWNvbnN0IHU4CQkqcnhkbWFfaWQsICp0eGRtYV9pZDsKKwl1bnNpZ25lZAkJbnVtX2NoaXBzZWxlY3Q7CisKKwlzd2l0Y2ggKHBkZXYtPmlkKSB7CisJY2FzZSAxOgorCQlyeGRtYV9pZCA9IHNwaTFfcnhkbWFfaWQ7CisJCXR4ZG1hX2lkID0gc3BpMV90eGRtYV9pZDsKKwkJbnVtX2NoaXBzZWxlY3QgPSA0OworCQlicmVhazsKKwljYXNlIDI6CisJCXJ4ZG1hX2lkID0gc3BpMl9yeGRtYV9pZDsKKwkJdHhkbWFfaWQgPSBzcGkyX3R4ZG1hX2lkOworCQludW1fY2hpcHNlbGVjdCA9IDI7CisJCWJyZWFrOworCS8qIFJFVklTSVQgb21hcDI0MzAgaGFzIGEgdGhpcmQgTWNTUEkgLi4uICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKm1jc3BpKTsKKwlpZiAobWFzdGVyID09IE5VTEwpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAibWFzdGVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHBkZXYtPmlkICE9IC0xKQorCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKworCW1hc3Rlci0+c2V0dXAgPSBvbWFwMl9tY3NwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gb21hcDJfbWNzcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5jbGVhbnVwID0gb21hcDJfbWNzcGlfY2xlYW51cDsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gbnVtX2NoaXBzZWxlY3Q7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbWFzdGVyKTsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCW1jc3BpLT5tYXN0ZXIgPSBtYXN0ZXI7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMTsKKwl9CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxLAorCQkJcGRldi0+ZGV2LmJ1c19pZCkpIHsKKwkJc3RhdHVzID0gLUVCVVNZOworCQlnb3RvIGVycjE7CisJfQorCisJbWNzcGktPmJhc2UgPSAodm9pZCBfX2lvbWVtICopIGlvX3AydihyLT5zdGFydCk7CisKKwlJTklUX1dPUksoJm1jc3BpLT53b3JrLCBvbWFwMl9tY3NwaV93b3JrKTsKKworCXNwaW5fbG9ja19pbml0KCZtY3NwaS0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJm1jc3BpLT5tc2dfcXVldWUpOworCisJbWNzcGktPmljayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1jc3BpX2ljayIpOworCWlmIChJU19FUlIobWNzcGktPmljaykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IG1jc3BpX2lja1xuIik7CisJCXN0YXR1cyA9IFBUUl9FUlIobWNzcGktPmljayk7CisJCWdvdG8gZXJyMWE7CisJfQorCW1jc3BpLT5mY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJtY3NwaV9mY2siKTsKKwlpZiAoSVNfRVJSKG1jc3BpLT5mY2spKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGdldCBtY3NwaV9mY2tcbiIpOworCQlzdGF0dXMgPSBQVFJfRVJSKG1jc3BpLT5mY2spOworCQlnb3RvIGVycjI7CisJfQorCisJbWNzcGktPmRtYV9jaGFubmVscyA9IGtjYWxsb2MobWFzdGVyLT5udW1fY2hpcHNlbGVjdCwKKwkJCXNpemVvZihzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hKSwKKwkJCUdGUF9LRVJORUwpOworCisJaWYgKG1jc3BpLT5kbWFfY2hhbm5lbHMgPT0gTlVMTCkKKwkJZ290byBlcnIzOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGlwc2VsZWN0OyBpKyspIHsKKwkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfcnhfY2hhbm5lbCA9IC0xOworCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV9yeF9zeW5jX2RldiA9IHJ4ZG1hX2lkW2ldOworCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV90eF9jaGFubmVsID0gLTE7CisJCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3R4X3N5bmNfZGV2ID0gdHhkbWFfaWRbaV07CisJfQorCisJaWYgKG9tYXAyX21jc3BpX3Jlc2V0KG1jc3BpKSA8IDApCisJCWdvdG8gZXJyNDsKKworCXN0YXR1cyA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnI0OworCisJcmV0dXJuIHN0YXR1czsKKworZXJyNDoKKwlrZnJlZShtY3NwaS0+ZG1hX2NoYW5uZWxzKTsKK2VycjM6CisJY2xrX3B1dChtY3NwaS0+ZmNrKTsKK2VycjI6CisJY2xrX3B1dChtY3NwaS0+aWNrKTsKK2VycjFhOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEpOworZXJyMToKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IG9tYXAyX21jc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSpkbWFfY2hhbm5lbHM7CisJc3RydWN0IHJlc291cmNlCQkqcjsKKworCW1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlkbWFfY2hhbm5lbHMgPSBtY3NwaS0+ZG1hX2NoYW5uZWxzOworCisJY2xrX3B1dChtY3NwaS0+ZmNrKTsKKwljbGtfcHV0KG1jc3BpLT5pY2spOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCAoci0+ZW5kIC0gci0+c3RhcnQpICsgMSk7CisKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlrZnJlZShkbWFfY2hhbm5lbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXAyX21jc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9CQkib21hcDJfbWNzcGkiLAorCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUgPQlfX2V4aXRfcChvbWFwMl9tY3NwaV9yZW1vdmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9pbml0KHZvaWQpCit7CisJb21hcDJfbWNzcGlfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJCQlvbWFwMl9tY3NwaV9kcml2ZXIuZHJpdmVyLm5hbWUpOworCWlmIChvbWFwMl9tY3NwaV93cSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmb21hcDJfbWNzcGlfZHJpdmVyLCBvbWFwMl9tY3NwaV9wcm9iZSk7Cit9CitzdWJzeXNfaW5pdGNhbGwob21hcDJfbWNzcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwMl9tY3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXAyX21jc3BpX2RyaXZlcik7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShvbWFwMl9tY3NwaV93cSk7Cit9Cittb2R1bGVfZXhpdChvbWFwMl9tY3NwaV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvb21hcF91d2lyZS5jIGIvZHJpdmVycy9zcGkvb21hcF91d2lyZS5jCmluZGV4IDk1MTgzZTEuLmQyNzVjNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYworKysgYi9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMKQEAgLTQ0NSwxMCArNDQ1LDE5IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gpCisKIHN0YXRpYyBpbnQgdXdpcmVfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgdXdpcmVfc3RhdGUgKnVzdCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKHVzdCA9PSBOVUxMKSB7CiAJCXVzdCA9IGt6YWxsb2Moc2l6ZW9mKCp1c3QpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHVzdCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IDlmMmM4ODcuLmU1MTMxMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTEwNjcsNiArMTA2Nyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSkKKwogc3RhdGljIGludCBzZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBweGEyeHhfc3BpX2NoaXAgKmNoaXBfaW5mbyA9IE5VTEw7CkBAIC0xMDkzLDYgKzEwOTYsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBPbmx5IGFsbG9jIG9uIGZpcnN0IHNldHVwICovCiAJY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwogCWlmICghY2hpcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwppbmRleCA0ODMxZWRiLi4wMTg4ODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAKQEAgLTE4NSw3ICsxODYsNyBAQAogfTsKIAogc3RhdGljIExJU1RfSEVBRChib2FyZF9saXN0KTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGJvYXJkX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChib2FyZF9sb2NrKTsKIAogCiAvKioKQEAgLTI5Miw5ICsyOTMsOSBAQAogCWJpLT5uX2JvYXJkX2luZm8gPSBuOwogCW1lbWNweShiaS0+Ym9hcmRfaW5mbywgaW5mbywgbiAqIHNpemVvZiAqaW5mbyk7CiAKLQlkb3duKCZib2FyZF9sb2NrKTsKKwltdXRleF9sb2NrKCZib2FyZF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZiaS0+bGlzdCwgJmJvYXJkX2xpc3QpOwotCXVwKCZib2FyZF9sb2NrKTsKKwltdXRleF91bmxvY2soJmJvYXJkX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0zMDgsNyArMzA5LDcgQEAKIAlzdHJ1Y3QgYm9hcmRpbmZvCSpiaTsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gbWFzdGVyLT5jZGV2LmRldjsKIAotCWRvd24oJmJvYXJkX2xvY2spOworCW11dGV4X2xvY2soJmJvYXJkX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmksICZib2FyZF9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBzcGlfYm9hcmRfaW5mbwkqY2hpcCA9IGJpLT5ib2FyZF9pbmZvOwogCQl1bnNpZ25lZAkJbjsKQEAgLTMzMCw3ICszMzEsNyBAQAogCQkJKHZvaWQpIHNwaV9uZXdfZGV2aWNlKG1hc3RlciwgY2hpcCk7CiAJCX0KIAl9Ci0JdXAoJmJvYXJkX2xvY2spOworCW11dGV4X3VubG9jaygmYm9hcmRfbG9jayk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwppbmRleCA4ODQyNWUxLi4wYzg1Yzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKQEAgLTE4NywxMiArMTg3LDEwIEBACiAKIAliaXRiYW5nID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAKLQkvKiBSRVZJU0lUOiBzb21lIHN5c3RlbXMgd2lsbCB3YW50IHRvIHN1cHBvcnQgZGV2aWNlcyB1c2luZyBsc2ItZmlyc3QKLQkgKiBiaXQgZW5jb2RpbmdzIG9uIHRoZSB3aXJlLiAgSW4gcHVyZSBzb2Z0d2FyZSB0aGF0IHdvdWxkIGJlIHRyaXZpYWwsCi0JICoganVzdCBiaXRiYW5nX3R4cnhfbGVfY3BoYVgoKSByb3V0aW5lcyBzaGlmdGluZyB0aGUgb3RoZXIgd2F5LCBhbmQKLQkgKiBzb21lIGhhcmR3YXJlIGNvbnRyb2xsZXJzIGFsc28gaGF2ZSB0aGlzIHN1cHBvcnQuCisJLyogQml0YmFuZ2VycyBjYW4gc3VwcG9ydCBTUElfQ1NfSElHSCwgU1BJXzNXSVJFLCBhbmQgc28gb247CisJICogYWRkIHRob3NlIHRvIG1hc3Rlci0+ZmxhZ3MsIGFuZCBwcm92aWRlIHRoZSBvdGhlciBzdXBwb3J0LgogCSAqLwotCWlmICgoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgIT0gMCkKKwlpZiAoKHNwaS0+bW9kZSAmIH4oU1BJX0NQT0x8U1BJX0NQSEF8Yml0YmFuZy0+ZmxhZ3MpKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghY3MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9pbXguYyBiL2RyaXZlcnMvc3BpL3NwaV9pbXguYwppbmRleCA2NTZiZTRhLi5hZWU5YWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfaW14LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2lteC5jCkBAIC0xMTYzLDYgKzExNjMsOSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKwogLyogT24gZmlyc3Qgc2V0dXAgYmFkIHZhbHVlcyBtdXN0IGZyZWUgY2hpcF9kYXRhIG1lbW9yeSBzaW5jZSB3aWxsIGNhdXNlCiAgICBzcGlfbmV3X2RldmljZSB0byBmYWlsLiBCYWQgdmFsdWUgc2V0dXAgZnJvbSBwcm90b2NvbCBkcml2ZXIgYXJlIHNpbXBseSBub3QKICAgIGFwcGxpZWQgYW5kIG5vdGlmaWVkIHRvIHRoZSBjYWxsaW5nIGRyaXZlci4gKi8KQEAgLTExNzQsNiArMTE3NywxMiBAQAogCXUzMiB0bXA7CiAJaW50IHN0YXR1cyA9IDA7CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIEdldCBjb250cm9sbGVyIGRhdGEgKi8KIAljaGlwX2luZm8gPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKIApAQCAtMTI0NSwyMSArMTI1NCw2IEBACiAKIAkvKiBTUEkgbW9kZSAqLwogCXRtcCA9IHNwaS0+bW9kZTsKLQlpZiAodG1wICYgU1BJX0xTQl9GSVJTVCkgewotCQlzdGF0dXMgPSAtRUlOVkFMOwotCQlpZiAoZmlyc3Rfc2V0dXApIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSJzZXR1cCAtICIKLQkJCQkiSFcgZG9lc24ndCBzdXBwb3J0IExTQiBmaXJzdCB0cmFuc2ZlclxuIik7Ci0JCQlnb3RvIGVycl9maXJzdF9zZXR1cDsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSJzZXR1cCAtICIKLQkJCQkiSFcgZG9lc24ndCBzdXBwb3J0IExTQiBmaXJzdCB0cmFuc2ZlciwgIgotCQkJCSJkZWZhdWx0IHRvIE1TQiBmaXJzdFxuIik7Ci0JCQlzcGktPm1vZGUgJj0gflNQSV9MU0JfRklSU1Q7Ci0JCX0KLQl9CiAJaWYgKHRtcCAmIFNQSV9DU19ISUdIKSB7CiAJCXUzMl9FRElUKGNoaXAtPmNvbnRyb2wsCiAJCQkJU1BJX0NPTlRST0xfU1NQT0wsIFNQSV9DT05UUk9MX1NTUE9MX0FDVF9ISUdIKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMgYi9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTY4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogc3BpX2xtNzBsbHAuYyAtIGRyaXZlciBmb3IgbG03MGxscCBldmFsIGJvYXJkIGZvciB0aGUgTE03MCBzZW5zb3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKworLyoKKyAqIFRoZSBMTTcwIGNvbW11bmljYXRlcyB3aXRoIGEgaG9zdCBwcm9jZXNzb3IgdXNpbmcgYSAzLXdpcmUgdmFyaWFudCBvZgorICogdGhlIFNQSS9NaWNyb3dpcmUgYnVzIGludGVyZmFjZS4gVGhpcyBkcml2ZXIgc3BlY2lmaWNhbGx5IHN1cHBvcnRzIGFuCisgKiBOUyBMTTcwIExMUCBFdmFsdWF0aW9uIEJvYXJkLCBpbnRlcmZhY2luZyB0byBhIFBDIHVzaW5nIGl0cyBwYXJhbGxlbAorICogcG9ydCB0byBiaXRiYW5nIGFuIFNQSS1wYXJwb3J0IGJyaWRnZS4gIEFjY29yZGluZ2x5LCB0aGlzIGlzIGFuIFNQSQorICogbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiAgVGhlIGh3bW9uL2xtNzAgZHJpdmVyIGlzIGEgIlNQSSBwcm90b2NvbAorICogZHJpdmVyIiwgbGF5ZXJlZCBvbiB0b3Agb2YgdGhpcyBvbmUgYW5kIHVzYWJsZSB3aXRob3V0IHRoZSBsbTcwbGxwLgorICoKKyAqIFRoZSBMTTcwIGlzIGEgdGVtcGVyYXR1cmUgc2Vuc29yIGNoaXAgZnJvbSBOYXRpb25hbCBTZW1pY29uZHVjdG9yOyBpdHMKKyAqIGRhdGFzaGVldCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisgKgorICogQWxzbyBzZWUgRG9jdW1lbnRhdGlvbi9zcGkvc3BpLWxtNzBsbHAuICBUaGUgU1BJPC0+cGFycG9ydCBjb2RlIGhlcmUgaXMKKyAqIChoZWF2aWx5KSBiYXNlZCBvbiBzcGktYnV0dGVyZmx5IGJ5IERhdmlkIEJyb3duZWxsLgorICoKKyAqIFRoZSBMTTcwIExMUCBjb25uZWN0cyB0byB0aGUgUEMgcGFyYWxsZWwgcG9ydCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKKyAqCisgKiAgIFBhcmFsbGVsICAgICAgICAgICAgICAgICBMTTcwIExMUAorICogICAgIFBvcnQgICAgICBEaXJlY3Rpb24gICBKUDIgSGVhZGVyCisgKiAgLS0tLS0tLS0tLS0gIC0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tCisgKiAgICAgIEQwICAgIDIgICAgICAtICAgICAgICAgLQorICogICAgICBEMSAgICAzICAgICAtLT4gICAgICBWKyAgIDUKKyAqICAgICAgRDIgICAgNCAgICAgLS0+ICAgICAgVisgICA1CisgKiAgICAgIEQzICAgIDUgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBENCAgICA2ICAgICAtLT4gICAgICBWKyAgIDUKKyAqICAgICAgRDUgICAgNyAgICAgLS0+ICAgICAgbkNTICA4CisgKiAgICAgIEQ2ICAgIDggICAgIC0tPiAgICAgIFNDTEsgMworICogICAgICBENyAgICA5ICAgICAtLT4gICAgICBTSS9PIDUKKyAqICAgICBHTkQgICAyNSAgICAgIC0gICAgICAgR05EICA3CisgKiAgICBTZWxlY3QgMTMgICAgIDwtLSAgICAgIFNJL08gMQorICoKKyAqIE5vdGUgdGhhdCBwYXJwb3J0IHBpbiAxMyBhY3R1YWxseSBnZXRzIGludmVydGVkIGJ5IHRoZSB0cmFuc2lzdG9yCisgKiBhcnJhbmdlbWVudCB3aGljaCBsZXRzIGVpdGhlciB0aGUgcGFycG9ydCBvciB0aGUgTE03MCBkcml2ZSB0aGUKKyAqIFNJL1NPIHNpZ25hbC4KKyAqLworCisjZGVmaW5lIERSVk5BTUUJCSJzcGktbG03MGxscCIKKworI2RlZmluZSBsbTcwX0lOSVQJMHhCRQorI2RlZmluZSBTSU8JCTB4MTAKKyNkZWZpbmUgbkNTCQkweDIwCisjZGVmaW5lIFNDTEsJCTB4NDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IHNwaV9sbTcwbGxwIHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJYml0YmFuZzsKKwlzdHJ1Y3QgcGFycG9ydAkJKnBvcnQ7CisJc3RydWN0IHBhcmRldmljZQkqcGQ7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaWRldl9sbTcwOworCXN0cnVjdCBzcGlfYm9hcmRfaW5mbwlpbmZvOworCXN0cnVjdCBjbGFzc19kZXZpY2UJKmNkZXY7Cit9OworCisvKiBSRVZJU0lUIDogdWdseSBnbG9iYWwgOyBwcm92aWRlcyAiZXhjbHVzaXZlIG9wZW4iIGZhY2lsaXR5ICovCitzdGF0aWMgc3RydWN0IHNwaV9sbTcwbGxwICpsbTcwbGxwOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9sbTcwbGxwICpzcGlkZXZfdG9fcHAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gc3BpLT5jb250cm9sbGVyX2RhdGE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMTTcwIExMUCBldmFsIGJvYXJkLXNwZWNpZmljIGlubGluZXMgZm9sbG93ICovCisKKy8qIE5PVEU6ICB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIHJlcmVhZCB0aGUgb3V0cHV0IHZhbHVlcywgc2luY2UgdGhleSdsbAorICogc3RpbGwgYmUgd2hhdCB3ZSB3cm90ZSBiZWZvcmUuICBQbHVzLCBnb2luZyB0aHJvdWdoIHBhcnBvcnQgYnVpbGRzIGluCisgKiBhIH4xbXMvb3BlcmF0aW9uIGRlbGF5OyB0aGVzZSBTUEkgdHJhbnNmZXJzIGNvdWxkIGVhc2lseSBiZSBmYXN0ZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRlYXNzZXJ0Q1Moc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKK3sKKwl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSB8IG5DUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRDUyhzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQoreworCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhICYgfm5DUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGtIaWdoKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCit7CisJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgfCBTQ0xLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsa0xvdyhzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQoreworCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhICYgflNDTEspOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJLUxNNzAtc3BlY2lmaWMgaW5saW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNwaWRlbGF5KHVuc2lnbmVkIGQpCit7CisJdWRlbGF5KGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0c2NrKHN0cnVjdCBzcGlfZGV2aWNlICpzLCBpbnQgaXNfb24pCit7CisJc3RydWN0IHNwaV9sbTcwbGxwICpwcCA9IHNwaWRldl90b19wcChzKTsKKworCWlmIChpc19vbikKKwkJY2xrSGlnaChwcCk7CisJZWxzZQorCQljbGtMb3cocHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqcywgaW50IGlzX29uKQoreworCS8qIEZJWE1FIHVwZGF0ZSBENyAuLi4gdGhpcyB3YXkgd2UgY2FuIHB1dCB0aGUgY2hpcAorCSAqIGludG8gc2h1dGRvd24gbW9kZSBhbmQgcmVhZCB0aGUgbWFudWZhY3R1cmVyIElELAorCSAqIGJ1dCB3ZSBjYW4ndCBwdXQgaXQgYmFjayBpbnRvIG9wZXJhdGlvbmFsIG1vZGUuCisJICovCit9CisKKy8qCisgKiBnZXRtaXNvOgorICogV2h5IGRvIHdlIHJldHVybiAwIHdoZW4gdGhlIFNJTyBsaW5lIGlzIGhpZ2ggYW5kIHZpY2UtdmVyc2E/CisgKiBUaGUgZmFjdCBpcywgdGhlIGxtNzAgZXZhbCBib2FyZCBmcm9tIE5TICh3aGljaCB0aGlzIGRyaXZlciBkcml2ZXMpLAorICogaXMgd2lyZWQgaW4ganVzdCBzdWNoIGEgd2F5IDogd2hlbiB0aGUgbG03MCdzIFNJTyBnb2VzIGhpZ2gsIGEgdHJhbnNpc3RvcgorICogc3dpdGNoZXMgaXQgdG8gbG93IHJlZmxlY3RpbmcgdGhpcyBvbiB0aGUgcGFycG9ydCAocGluIDEzKSwgYW5kIHZpY2UtdmVyc2EuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldG1pc28oc3RydWN0IHNwaV9kZXZpY2UgKnMpCit7CisJc3RydWN0IHNwaV9sbTcwbGxwICpwcCA9IHNwaWRldl90b19wcChzKTsKKwlyZXR1cm4gKChTSU8gPT0gKHBhcnBvcnRfcmVhZF9zdGF0dXMocHAtPnBvcnQpICYgU0lPKSkgPyAwIDogMSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRVhQQU5EX0JJVEJBTkdfVFhSWCAxCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKK3N0YXRpYyB2b2lkIGxtNzBfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNwaV9sbTcwbGxwICpwcCA9IHNwaWRldl90b19wcChzcGkpOworCisJaWYgKHZhbHVlKQorCQlhc3NlcnRDUyhwcCk7CisJZWxzZQorCQlkZWFzc2VydENTKHBwKTsKK30KKworLyoKKyAqIE91ciBhY3R1YWwgYml0YmFuZ2VyIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB1MzIgbG03MF90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlzdGF0aWMgdTMyIHNpbz0wOworCXN0YXRpYyBpbnQgZmlyc3RfdGltZT0xOworCisJLyogRmlyc3QgdGltZTogcGVyZm9ybSBTUEkgYml0YmFuZyBhbmQgcmV0dXJuIHRoZSBMU0Igb2YKKwkgKiB0aGUgcmVzdWx0IG9mIHRoZSBTUEkgY2FsbC4KKwkgKi8KKwlpZiAoZmlyc3RfdGltZSkgeworCQlzaW8gPSBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgd29yZCwgYml0cyk7CisJCWZpcnN0X3RpbWU9MDsKKwkJcmV0dXJuIChzaW8gJiAweDAwZmYpOworCX0KKwkvKiBSZXR1cm4gdGhlIE1TQiBvZiB0aGUgcmVzdWx0IG9mIHRoZSBTUEkgY2FsbCAqLworCWVsc2UgeworCQlmaXJzdF90aW1lPTE7CisJCXJldHVybiAoc2lvID4+IDgpOworCX0KK30KKworc3RhdGljIHZvaWQgc3BpX2xtNzBsbHBfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBwYXJkZXZpY2UJKnBkOworCXN0cnVjdCBzcGlfbG03MGxscAkqcHA7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAobG03MGxscCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXM6IHNwaV9sbTcwbGxwIGluc3RhbmNlIGFscmVhZHkgbG9hZGVkLiBBYm9ydGluZy5cbiIsCisJCQlEUlZOQU1FKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRPRE86ICB0aGlzIGp1c3QgX2Fzc3VtZXNfIGEgbG03MCBpcyB0aGVyZSAuLi4gbm8gcHJvYmU7CisJICogdGhlIGxtNzAgZHJpdmVyIGNvdWxkIHZlcmlmeSBpdCwgcmVhZGluZyB0aGUgbWFuZiBJRC4KKwkgKi8KKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIocC0+cGh5c3BvcnQtPmRldiwgc2l6ZW9mICpwcCk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisJcHAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwltYXN0ZXItPmJ1c19udW0gPSAtMTsJLyogZHluYW1pYyBhbGxvYyBvZiBhIGJ1cyBudW1iZXIgKi8KKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMTsKKworCS8qCisJICogU1BJIGFuZCBiaXRiYW5nIGhvb2t1cC4KKwkgKi8KKwlwcC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCXBwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBsbTcwX2NoaXBzZWxlY3Q7CisJcHAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gbG03MF90eHJ4OworCXBwLT5iaXRiYW5nLmZsYWdzID0gU1BJXzNXSVJFOworCisJLyoKKwkgKiBQYXJwb3J0IGhvb2t1cAorCSAqLworCXBwLT5wb3J0ID0gcDsKKwlwZCA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHAsIERSVk5BTUUsCisJCQlOVUxMLCBOVUxMLCBOVUxMLAorCQkJUEFSUE9SVF9GTEFHX0VYQ0wsIHBwKTsKKwlpZiAoIXBkKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfbWFzdGVyOworCX0KKwlwcC0+cGQgPSBwZDsKKworCXN0YXR1cyA9IHBhcnBvcnRfY2xhaW0ocGQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dF9wYXJwb3J0X3VucmVnOworCisJLyoKKwkgKiBTdGFydCBTUEkgLi4uCisJICovCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnBwLT5iaXRiYW5nKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXM6IHNwaV9iaXRiYW5nX3N0YXJ0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwKKwkJCURSVk5BTUUsIHN0YXR1cyk7CisJCWdvdG8gb3V0X29mZl9hbmRfcmVsZWFzZTsKKwl9CisKKwkvKgorCSAqIFRoZSBtb2RhbGlhcyBuYW1lIE1VU1QgbWF0Y2ggdGhlIGRldmljZV9kcml2ZXIgbmFtZQorCSAqIGZvciB0aGUgYnVzIGdsdWUgY29kZSB0byBtYXRjaCBhbmQgc3Vic2VxdWVudGx5IGJpbmQgdGhlbS4KKwkgKiBXZSBhcmUgYmluZGluZyB0byB0aGUgZ2VuZXJpYyBkcml2ZXJzL2h3bW9uL2xtNzAuYyBkZXZpY2UKKwkgKiBkcml2ZXIuCisJICovCisJc3RyY3B5KHBwLT5pbmZvLm1vZGFsaWFzLCAibG03MCIpOworCXBwLT5pbmZvLm1heF9zcGVlZF9oeiA9IDYgKiAxMDAwICogMTAwMDsKKwlwcC0+aW5mby5jaGlwX3NlbGVjdCA9IDA7CisJcHAtPmluZm8ubW9kZSA9IFNQSV8zV0lSRSB8IFNQSV9NT0RFXzA7CisKKwkvKiBwb3dlciB1cCB0aGUgY2hpcCwgYW5kIGxldCB0aGUgTE03MCBjb250cm9sIFNJL1NPICovCisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBsbTcwX0lOSVQpOworCisJLyogRW5hYmxlIGFjY2VzcyB0byBvdXIgcHJpbWFyeSBkYXRhIHN0cnVjdHVyZSB2aWEKKwkgKiB0aGUgYm9hcmQgaW5mbydzICh2b2lkICopY29udHJvbGxlcl9kYXRhLgorCSAqLworCXBwLT5pbmZvLmNvbnRyb2xsZXJfZGF0YSA9IHBwOworCXBwLT5zcGlkZXZfbG03MCA9IHNwaV9uZXdfZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3RlciwgJnBwLT5pbmZvKTsKKwlpZiAocHAtPnNwaWRldl9sbTcwKQorCQlkZXZfZGJnKCZwcC0+c3BpZGV2X2xtNzAtPmRldiwgInNwaWRldl9sbTcwIGF0ICVzXG4iLAorCQkJCXBwLT5zcGlkZXZfbG03MC0+ZGV2LmJ1c19pZCk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzcGlfbmV3X2RldmljZSBmYWlsZWRcbiIsIERSVk5BTUUpOworCQlzdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIG91dF9iaXRiYW5nX3N0b3A7CisJfQorCXBwLT5zcGlkZXZfbG03MC0+Yml0c19wZXJfd29yZCA9IDE2OworCisJbG03MGxscCA9IHBwOworCisJcmV0dXJuOworCitvdXRfYml0YmFuZ19zdG9wOgorCXNwaV9iaXRiYW5nX3N0b3AoJnBwLT5iaXRiYW5nKTsKK291dF9vZmZfYW5kX3JlbGVhc2U6CisJLyogcG93ZXIgZG93biAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisJbWRlbGF5KDEwKTsKKwlwYXJwb3J0X3JlbGVhc2UocHAtPnBkKTsKK291dF9wYXJwb3J0X3VucmVnOgorCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGQpOworb3V0X2ZyZWVfbWFzdGVyOgorCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworb3V0X2ZhaWw6CisJcHJfaW5mbygiJXM6IHNwaV9sbTcwbGxwIHByb2JlIGZhaWwsIHN0YXR1cyAlZFxuIiwgRFJWTkFNRSwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc3BpX2xtNzBsbHBfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBzcGlfbG03MGxscAkJKnBwOworCisJaWYgKCFsbTcwbGxwIHx8IGxtNzBsbHAtPnBvcnQgIT0gcCkKKwkJcmV0dXJuOworCisJcHAgPSBsbTcwbGxwOworCXNwaV9iaXRiYW5nX3N0b3AoJnBwLT5iaXRiYW5nKTsKKworCS8qIHBvd2VyIGRvd24gKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIDApOworCW1zbGVlcCgxMCk7CisKKwlwYXJwb3J0X3JlbGVhc2UocHAtPnBkKTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwLT5wZCk7CisKKwkodm9pZCkgc3BpX21hc3Rlcl9wdXQocHAtPmJpdGJhbmcubWFzdGVyKTsKKworCWxtNzBsbHAgPSBOVUxMOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgc3BpX2xtNzBsbHBfZHJ2ID0geworCS5uYW1lID0JCURSVk5BTUUsCisJLmF0dGFjaCA9CXNwaV9sbTcwbGxwX2F0dGFjaCwKKwkuZGV0YWNoID0Jc3BpX2xtNzBsbHBfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zcGlfbG03MGxscCh2b2lkKQoreworCXJldHVybiBwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmc3BpX2xtNzBsbHBfZHJ2KTsKK30KK21vZHVsZV9pbml0KGluaXRfc3BpX2xtNzBsbHApOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zcGlfbG03MGxscCh2b2lkKQoreworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNwaV9sbTcwbGxwX2Rydik7Cit9Cittb2R1bGVfZXhpdChjbGVhbnVwX3NwaV9sbTcwbGxwKTsKKworTU9EVUxFX0FVVEhPUigiS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oCisJIlBhcnBvcnQgYWRhcHRlciBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAgZXZhbCBib2FyZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX21wYzgzeHguYyBiL2RyaXZlcnMvc3BpL3NwaV9tcGM4M3h4LmMKaW5kZXggZTk3OThiZi4uMzI5NWNmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9tcGM4M3h4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX21wYzgzeHguYwpAQCAtNDcsNiArNDcsNyBAQAogI2RlZmluZQlTUE1PREVfRU5BQkxFCQkoMSA8PCAyNCkKICNkZWZpbmUJU1BNT0RFX0xFTih4KQkJKCh4KSA8PCAyMCkKICNkZWZpbmUJU1BNT0RFX1BNKHgpCQkoKHgpIDw8IDE2KQorI2RlZmluZQlTUE1PREVfT1AJCSgxIDw8IDE0KQogCiAvKgogICogRGVmYXVsdCBmb3IgU1BJIE1vZGU6CkBAIC04NSw2ICs4NiwxMSBAQAogCXVuc2lnbmVkIG5zZWNzOwkJLyogKGNsb2NrIGN5Y2xlIHRpbWUpLzIgKi8KIAogCXUzMiBzeXNjbGs7CisJdTMyIHJ4X3NoaWZ0OwkJLyogUlggZGF0YSByZWcgc2hpZnQgd2hlbiBpbiBxZSBtb2RlICovCisJdTMyIHR4X3NoaWZ0OwkJLyogVFggZGF0YSByZWcgc2hpZnQgd2hlbiBpbiBxZSBtb2RlICovCisKKwlib29sIHFlX21vZGU7CisKIAl2b2lkICgqYWN0aXZhdGVfY3MpICh1OCBjcywgdTggcG9sYXJpdHkpOwogCXZvaWQgKCpkZWFjdGl2YXRlX2NzKSAodTggY3MsIHU4IHBvbGFyaXR5KTsKIH07CkBAIC0xMDMsNyArMTA5LDcgQEAKIHZvaWQgbXBjODN4eF9zcGlfcnhfYnVmXyMjdHlwZSh1MzIgZGF0YSwgc3RydWN0IG1wYzgzeHhfc3BpICptcGM4M3h4X3NwaSkgXAogewkJCQkJCQkJCSAgXAogCXR5cGUgKiByeCA9IG1wYzgzeHhfc3BpLT5yeDsJCQkJCSAgXAotCSpyeCsrID0gKHR5cGUpZGF0YTsJCQkJCQkgIFwKKwkqcngrKyA9ICh0eXBlKShkYXRhID4+IG1wYzgzeHhfc3BpLT5yeF9zaGlmdCk7CQkJICBcCiAJbXBjODN4eF9zcGktPnJ4ID0gcng7CQkJCQkJICBcCiB9CiAKQEAgLTExNCw3ICsxMjAsNyBAQAogCWNvbnN0IHR5cGUgKiB0eCA9IG1wYzgzeHhfc3BpLT50eDsJCQlcCiAJaWYgKCF0eCkJCQkJCQlcCiAJCXJldHVybiAwOwkJCQkJXAotCWRhdGEgPSAqdHgrKzsJCQkJCQlcCisJZGF0YSA9ICp0eCsrIDw8IG1wYzgzeHhfc3BpLT50eF9zaGlmdDsJCQlcCiAJbXBjODN4eF9zcGktPnR4ID0gdHg7CQkJCQlcCiAJcmV0dXJuIGRhdGE7CQkJCQkJXAogfQpAQCAtMTU4LDYgKzE2NCwxMiBAQAogCiAJCWlmICgobXBjODN4eF9zcGktPnN5c2NsayAvIHNwaS0+bWF4X3NwZWVkX2h6KSA+PSA2NCkgewogCQkJdTggcG0gPSBtcGM4M3h4X3NwaS0+c3lzY2xrIC8gKHNwaS0+bWF4X3NwZWVkX2h6ICogNjQpOworCQkJaWYgKHBtID4gMHgwZikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1QQzgzeHggU1BJOiBTUElDTEsgY2FuJ3QgYmUgbGVzcyB0aGVuIGEgU1lTQ0xLLzEwMjQhXG4iCisJCQkJCQkiUmVxdWVzdGVkIFNQSUNMSyBpcyAlZCBIei4gV2lsbCB1c2UgJWQgSHogaW5zdGVhZC5cbiIsCisJCQkJCQlzcGktPm1heF9zcGVlZF9oeiwgbXBjODN4eF9zcGktPnN5c2NsayAvIDEwMjQpOworCQkJCXBtID0gMHgwZjsKKwkJCX0KIAkJCXJlZ3ZhbCB8PSBTUE1PREVfUE0ocG0pIHwgU1BNT0RFX0RJVjE2OwogCQl9IGVsc2UgewogCQkJdTggcG0gPSBtcGM4M3h4X3NwaS0+c3lzY2xrIC8gKHNwaS0+bWF4X3NwZWVkX2h6ICogNCk7CkBAIC0xOTcsMTIgKzIwOSwyMiBAQAogCSAgICB8fCAoKGJpdHNfcGVyX3dvcmQgPiAxNikgJiYgKGJpdHNfcGVyX3dvcmQgIT0gMzIpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltcGM4M3h4X3NwaS0+cnhfc2hpZnQgPSAwOworCW1wYzgzeHhfc3BpLT50eF9zaGlmdCA9IDA7CiAJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkgewogCQltcGM4M3h4X3NwaS0+Z2V0X3J4ID0gbXBjODN4eF9zcGlfcnhfYnVmX3U4OwogCQltcGM4M3h4X3NwaS0+Z2V0X3R4ID0gbXBjODN4eF9zcGlfdHhfYnVmX3U4OworCQlpZiAobXBjODN4eF9zcGktPnFlX21vZGUpIHsKKwkJCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDE2OworCQkJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMjQ7CisJCX0KIAl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMTYpIHsKIAkJbXBjODN4eF9zcGktPmdldF9yeCA9IG1wYzgzeHhfc3BpX3J4X2J1Zl91MTY7CiAJCW1wYzgzeHhfc3BpLT5nZXRfdHggPSBtcGM4M3h4X3NwaV90eF9idWZfdTE2OworCQlpZiAobXBjODN4eF9zcGktPnFlX21vZGUpIHsKKwkJCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDE2OworCQkJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMTY7CisJCX0KIAl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMzIpIHsKIAkJbXBjODN4eF9zcGktPmdldF9yeCA9IG1wYzgzeHhfc3BpX3J4X2J1Zl91MzI7CiAJCW1wYzgzeHhfc3BpLT5nZXRfdHggPSBtcGM4M3h4X3NwaV90eF9idWZfdTMyOwpAQCAtMjMyLDEyICsyNTQsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gpCisKIHN0YXRpYyBpbnQgbXBjODN4eF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmc7CiAJc3RydWN0IG1wYzgzeHhfc3BpICptcGM4M3h4X3NwaTsKIAlpbnQgcmV0dmFsOwogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzcxLDcgKzQwMiw2IEBACiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZnJlZV9tYXN0ZXI7CiAJfQotCiAJbXBjODN4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJbXBjODN4eF9zcGktPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKIAltcGM4M3h4X3NwaS0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gbXBjODN4eF9zcGlfY2hpcHNlbGVjdDsKQEAgLTM4MCw5ICs0MTAsMTcgQEAKIAltcGM4M3h4X3NwaS0+c3lzY2xrID0gcGRhdGEtPnN5c2NsazsKIAltcGM4M3h4X3NwaS0+YWN0aXZhdGVfY3MgPSBwZGF0YS0+YWN0aXZhdGVfY3M7CiAJbXBjODN4eF9zcGktPmRlYWN0aXZhdGVfY3MgPSBwZGF0YS0+ZGVhY3RpdmF0ZV9jczsKKwltcGM4M3h4X3NwaS0+cWVfbW9kZSA9IHBkYXRhLT5xZV9tb2RlOwogCW1wYzgzeHhfc3BpLT5nZXRfcnggPSBtcGM4M3h4X3NwaV9yeF9idWZfdTg7CiAJbXBjODN4eF9zcGktPmdldF90eCA9IG1wYzgzeHhfc3BpX3R4X2J1Zl91ODsKIAorCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDA7CisJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMDsKKwlpZiAobXBjODN4eF9zcGktPnFlX21vZGUpIHsKKwkJbXBjODN4eF9zcGktPnJ4X3NoaWZ0ID0gMTY7CisJCW1wYzgzeHhfc3BpLT50eF9zaGlmdCA9IDI0OworCX0KKwogCW1wYzgzeHhfc3BpLT5iaXRiYW5nLm1hc3Rlci0+c2V0dXAgPSBtcGM4M3h4X3NwaV9zZXR1cDsKIAlpbml0X2NvbXBsZXRpb24oJm1wYzgzeHhfc3BpLT5kb25lKTsKIApAQCAtNDE3LDYgKzQ1NSw5IEBACiAKIAkvKiBFbmFibGUgU1BJIGludGVyZmFjZSAqLwogCXJlZ3ZhbCA9IHBkYXRhLT5pbml0aWFsX3NwbW9kZSB8IFNQTU9ERV9JTklUX1ZBTCB8IFNQTU9ERV9FTkFCTEU7CisJaWYgKHBkYXRhLT5xZV9tb2RlKQorCQlyZWd2YWwgfD0gU1BNT0RFX09QOworCiAJbXBjODN4eF9zcGlfd3JpdGVfcmVnKCZtcGM4M3h4X3NwaS0+YmFzZS0+bW9kZSwgcmVndmFsKTsKIAogCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZtcGM4M3h4X3NwaS0+Yml0YmFuZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwppbmRleCBkNWE3MTBmLi43MDcxZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKQEAgLTE0Niw2ICsxNDYsOSBAQAogCXJldHVybiAwOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKwogc3RhdGljIGludCBzM2MyNHh4X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCWludCByZXQ7CkBAIC0xNTMsOCArMTU2LDExIEBACiAJaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCiAJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CiAKLQlpZiAoKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpICE9IDApCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXQgPSBzM2MyNHh4X3NwaV9zZXR1cHhmZXIoc3BpLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3R4eDkuYyBiL2RyaXZlcnMvc3BpL3NwaV90eHg5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlOTgxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV90eHg5LmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKiBzcGlfdHh4OS5jIC0gVFh4OSBTUEkgY29udHJvbGxlciBkcml2ZXIuCisgKgorICogQmFzZWQgb24gbGludXgvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L3NwaV90eHg5LmMKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqCisgKiAyMDAzLTIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzCisgKiBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICogU3VwcG9ydCBmb3IgVFg0OTM4IGluIDIuNiAtIE1hbmlzaCBMYWNod2FuaSAobWxhY2h3YW5pQG12aXN0YS5jb20pCisgKgorICogQ29udmVydCB0byBnZW5lcmljIFNQSSBmcmFtZXdvcmsgLSBBdHN1c2hpIE5lbW90byAoYW5lbW9AbWJhLm9jbi5uZS5qcCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorCisKKyNkZWZpbmUgU1BJX0ZJRk9fU0laRSA0CisKKyNkZWZpbmUgVFh4OV9TUE1DUgkJMHgwMAorI2RlZmluZSBUWHg5X1NQQ1IwCQkweDA0CisjZGVmaW5lIFRYeDlfU1BDUjEJCTB4MDgKKyNkZWZpbmUgVFh4OV9TUEZTCQkweDBjCisjZGVmaW5lIFRYeDlfU1BTUgkJMHgxNAorI2RlZmluZSBUWHg5X1NQRFIJCTB4MTgKKworLyogU1BNQ1IgOiBTUEkgTWFzdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgVFh4OV9TUE1DUl9PUE1PREUJMHhjMAorI2RlZmluZSBUWHg5X1NQTUNSX0NPTkZJRwkweDQwCisjZGVmaW5lIFRYeDlfU1BNQ1JfQUNUSVZFCTB4ODAKKyNkZWZpbmUgVFh4OV9TUE1DUl9TUFNUUAkweDAyCisjZGVmaW5lIFRYeDlfU1BNQ1JfQkNMUgkJMHgwMQorCisvKiBTUENSMCA6IFNQSSBDb250cm9sIDAgKi8KKyNkZWZpbmUgVFh4OV9TUENSMF9UWElGTF9NQVNLCTB4YzAwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1JYSUZMX01BU0sJMHgzMDAwCisjZGVmaW5lIFRYeDlfU1BDUjBfU0lESUUJMHgwODAwCisjZGVmaW5lIFRYeDlfU1BDUjBfU09FSUUJMHgwNDAwCisjZGVmaW5lIFRYeDlfU1BDUjBfUkJTSUUJMHgwMjAwCisjZGVmaW5lIFRYeDlfU1BDUjBfVEJTSUUJMHgwMTAwCisjZGVmaW5lIFRYeDlfU1BDUjBfSUZTUFNFCTB4MDAxMAorI2RlZmluZSBUWHg5X1NQQ1IwX1NCT1MJCTB4MDAwNAorI2RlZmluZSBUWHg5X1NQQ1IwX1NQSEEJCTB4MDAwMgorI2RlZmluZSBUWHg5X1NQQ1IwX1NQT0wJCTB4MDAwMQorCisvKiBTUFNSIDogU1BJIFN0YXR1cyAqLworI2RlZmluZSBUWHg5X1NQU1JfVEJTSQkJMHg4MDAwCisjZGVmaW5lIFRYeDlfU1BTUl9SQlNJCQkweDQwMDAKKyNkZWZpbmUgVFh4OV9TUFNSX1RCU19NQVNLCTB4MzgwMAorI2RlZmluZSBUWHg5X1NQU1JfUkJTX01BU0sJMHgwNzAwCisjZGVmaW5lIFRYeDlfU1BTUl9TUE9FCQkweDAwODAKKyNkZWZpbmUgVFh4OV9TUFNSX0lGU0QJCTB4MDAwOAorI2RlZmluZSBUWHg5X1NQU1JfU0lETEUJCTB4MDAwNAorI2RlZmluZSBUWHg5X1NQU1JfU1RSRFkJCTB4MDAwMgorI2RlZmluZSBUWHg5X1NQU1JfU1JSRFkJCTB4MDAwMQorCisKK3N0cnVjdCB0eHg5c3BpIHsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdCAncXVldWUnICovCisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKwl2b2lkIF9faW9tZW0gKm1lbWJhc2U7CisJaW50IGlycTsKKwlpbnQgYmFzZWNsazsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdTMyIG1heF9zcGVlZF9oeiwgbWluX3NwZWVkX2h6OworCWludCBsYXN0X2NoaXBzZWxlY3Q7CisJaW50IGxhc3RfY2hpcHNlbGVjdF92YWw7Cit9OworCitzdGF0aWMgdTMyIHR4eDlzcGlfcmQoc3RydWN0IHR4eDlzcGkgKmMsIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGMtPm1lbWJhc2UgKyByZWcpOworfQorc3RhdGljIHZvaWQgdHh4OXNwaV93cihzdHJ1Y3QgdHh4OXNwaSAqYywgdTMyIHZhbCwgaW50IHJlZykKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBjLT5tZW1iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgdHh4OXNwaV9jc19mdW5jKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCB0eHg5c3BpICpjLAorCQlpbnQgb24sIHVuc2lnbmVkIGludCBjc19kZWxheSkKK3sKKwlpbnQgdmFsID0gKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IG9uIDogIW9uOworCWlmIChvbikgeworCQkvKiBkZXNlbGVjdCB0aGUgY2hpcCB3aXRoIGNzX2NoYW5nZSBoaW50IGluIGxhc3QgdHJhbnNmZXIgKi8KKwkJaWYgKGMtPmxhc3RfY2hpcHNlbGVjdCA+PSAwKQorCQkJZ3Bpb19zZXRfdmFsdWUoYy0+bGFzdF9jaGlwc2VsZWN0LAorCQkJCQkhYy0+bGFzdF9jaGlwc2VsZWN0X3ZhbCk7CisJCWMtPmxhc3RfY2hpcHNlbGVjdCA9IHNwaS0+Y2hpcF9zZWxlY3Q7CisJCWMtPmxhc3RfY2hpcHNlbGVjdF92YWwgPSB2YWw7CisJfSBlbHNlIHsKKwkJYy0+bGFzdF9jaGlwc2VsZWN0ID0gLTE7CisJCW5kZWxheShjc19kZWxheSk7CS8qIENTIEhvbGQgVGltZSAqLworCX0KKwlncGlvX3NldF92YWx1ZShzcGktPmNoaXBfc2VsZWN0LCB2YWwpOworCW5kZWxheShjc19kZWxheSk7CS8qIENTIFNldHVwIFRpbWUgLyBDUyBSZWNvdmVyeSBUaW1lICovCit9CisKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUwkoU1BJX0NTX0hJR0h8U1BJX0NQT0x8U1BJX0NQSEEpCisKK3N0YXRpYyBpbnQgdHh4OXNwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0eHg5c3BpICpjID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTggYml0c19wZXJfd29yZDsKKworCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzcGktPm1heF9zcGVlZF9oegorCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHoKKwkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQgPyA6IDg7CisJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCAmJiBiaXRzX3Blcl93b3JkICE9IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jaGlwX3NlbGVjdCwKKwkJCSEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIkNhbm5vdCBzZXR1cCBHUElPIGZvciBjaGlwc2VsZWN0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRlc2VsZWN0IGNoaXAgKi8KKwlzcGluX2xvY2soJmMtPmxvY2spOworCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIChOU0VDX1BFUl9TRUMgLyAyKSAvIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwlzcGluX3VubG9jaygmYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHR4eDlzcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IGRldl9pZDsKKworCS8qIGRpc2FibGUgcnggaW50ciAqLworCXR4eDlzcGlfd3IoYywgdHh4OXNwaV9yZChjLCBUWHg5X1NQQ1IwKSAmIH5UWHg5X1NQQ1IwX1JCU0lFLAorCQkJVFh4OV9TUENSMCk7CisJd2FrZV91cCgmYy0+d2FpdHEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdHh4OXNwaV93b3JrX29uZShzdHJ1Y3QgdHh4OXNwaSAqYywgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtLT5zcGk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwl1bnNpZ25lZCBpbnQgY3NfZGVsYXk7CisJdW5zaWduZWQgaW50IGNzX2NoYW5nZSA9IDE7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIG1jcjsKKwl1MzIgcHJldl9zcGVlZF9oeiA9IDA7CisJdTggcHJldl9iaXRzX3Blcl93b3JkID0gMDsKKworCS8qIENTIHNldHVwL2hvbGQvcmVjb3ZlcnkgdGltZSBpbiBuc2VjICovCisJY3NfZGVsYXkgPSAxMDAgKyAoTlNFQ19QRVJfU0VDIC8gMikgLyBzcGktPm1heF9zcGVlZF9oejsKKworCW1jciA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUE1DUik7CisJaWYgKHVubGlrZWx5KChtY3IgJiBUWHg5X1NQTUNSX09QTU9ERSkgPT0gVFh4OV9TUE1DUl9BQ1RJVkUpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiQmFkIG1vZGUuXG4iKTsKKwkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBleGl0OworCX0KKwltY3IgJj0gfihUWHg5X1NQTUNSX09QTU9ERSB8IFRYeDlfU1BNQ1JfU1BTVFAgfCBUWHg5X1NQTUNSX0JDTFIpOworCisJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLCBUWHg5X1NQTUNSKTsKKwl0eHg5c3BpX3dyKGMsIFRYeDlfU1BDUjBfU0JPUworCQkJfCAoKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/IFRYeDlfU1BDUjBfU1BPTCA6IDApCisJCQl8ICgoc3BpLT5tb2RlICYgU1BJX0NQSEEpID8gVFh4OV9TUENSMF9TUEhBIDogMCkKKwkJCXwgMHgwOCwKKwkJCVRYeDlfU1BDUjApOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQljb25zdCB2b2lkICp0eGJ1ZiA9IHQtPnR4X2J1ZjsKKwkJdm9pZCAqcnhidWYgPSB0LT5yeF9idWY7CisJCXUzMiBkYXRhOworCQl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOworCQl1bnNpZ25lZCBpbnQgd3NpemU7CisJCXUzMiBzcGVlZF9oeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKKwkJdTggYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKworCQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCA/IDogODsKKwkJd3NpemUgPSBiaXRzX3Blcl93b3JkID4+IDM7IC8qIGluIGJ5dGVzICovCisKKwkJaWYgKHByZXZfc3BlZWRfaHogIT0gc3BlZWRfaHoKKwkJCQl8fCBwcmV2X2JpdHNfcGVyX3dvcmQgIT0gYml0c19wZXJfd29yZCkgeworCQkJdTMyIG4gPSAoYy0+YmFzZWNsayArIHNwZWVkX2h6IC0gMSkgLyBzcGVlZF9oejsKKwkJCWlmIChuIDwgMSkKKwkJCQluID0gMTsKKwkJCWVsc2UgaWYgKG4gPiAweGZmKQorCQkJCW4gPSAweGZmOworCQkJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwkJCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9DT05GSUcgfCBUWHg5X1NQTUNSX0JDTFIsCisJCQkJCVRYeDlfU1BNQ1IpOworCQkJdHh4OXNwaV93cihjLCAobiA8PCA4KSB8IGJpdHNfcGVyX3dvcmQsIFRYeDlfU1BDUjEpOworCQkJLyogZW50ZXIgYWN0aXZlIG1vZGUgKi8KKwkJCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9BQ1RJVkUsIFRYeDlfU1BNQ1IpOworCisJCQlwcmV2X3NwZWVkX2h6ID0gc3BlZWRfaHo7CisJCQlwcmV2X2JpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkOworCQl9CisKKwkJaWYgKGNzX2NoYW5nZSkKKwkJCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDEsIGNzX2RlbGF5KTsKKwkJY3NfY2hhbmdlID0gdC0+Y3NfY2hhbmdlOworCQl3aGlsZSAobGVuKSB7CisJCQl1bnNpZ25lZCBpbnQgY291bnQgPSBTUElfRklGT19TSVpFOworCQkJaW50IGk7CisJCQl1MzIgY3IwOworCisJCQlpZiAobGVuIDwgY291bnQgKiB3c2l6ZSkKKwkJCQljb3VudCA9IGxlbiAvIHdzaXplOworCQkJLyogbm93IHR4IG11c3QgYmUgaWRsZS4uLiAqLworCQkJd2hpbGUgKCEodHh4OXNwaV9yZChjLCBUWHg5X1NQU1IpICYgVFh4OV9TUFNSX1NJRExFKSkKKwkJCQljcHVfcmVsYXgoKTsKKwkJCWNyMCA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUENSMCk7CisJCQljcjAgJj0gflRYeDlfU1BDUjBfUlhJRkxfTUFTSzsKKwkJCWNyMCB8PSAoY291bnQgLSAxKSA8PCAxMjsKKwkJCS8qIGVuYWJsZSByeCBpbnRyICovCisJCQljcjAgfD0gVFh4OV9TUENSMF9SQlNJRTsKKwkJCXR4eDlzcGlfd3IoYywgY3IwLCBUWHg5X1NQQ1IwKTsKKwkJCS8qIHNlbmQgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJaWYgKHR4YnVmKSB7CisJCQkJCWRhdGEgPSAod3NpemUgPT0gMSkKKwkJCQkJCT8gKihjb25zdCB1OCAqKXR4YnVmCisJCQkJCQk6ICooY29uc3QgdTE2ICopdHhidWY7CisJCQkJCXR4eDlzcGlfd3IoYywgZGF0YSwgVFh4OV9TUERSKTsKKwkJCQkJdHhidWYgKz0gd3NpemU7CisJCQkJfSBlbHNlCisJCQkJCXR4eDlzcGlfd3IoYywgMCwgVFh4OV9TUERSKTsKKwkJCX0KKwkJCS8qIHdhaXQgYWxsIHJ4IGRhdGEgKi8KKwkJCXdhaXRfZXZlbnQoYy0+d2FpdHEsCisJCQkJdHh4OXNwaV9yZChjLCBUWHg5X1NQU1IpICYgVFh4OV9TUFNSX1JCU0kpOworCQkJLyogcmVjZWl2ZSAqLworCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlkYXRhID0gdHh4OXNwaV9yZChjLCBUWHg5X1NQRFIpOworCQkJCWlmIChyeGJ1ZikgeworCQkJCQlpZiAod3NpemUgPT0gMSkKKwkJCQkJCSoodTggKilyeGJ1ZiA9IGRhdGE7CisJCQkJCWVsc2UKKwkJCQkJCSoodTE2ICopcnhidWYgPSBkYXRhOworCQkJCQlyeGJ1ZiArPSB3c2l6ZTsKKwkJCQl9CisJCQl9CisJCQlsZW4gLT0gY291bnQgKiB3c2l6ZTsKKwkJfQorCQltLT5hY3R1YWxfbGVuZ3RoICs9IHQtPmxlbjsKKwkJaWYgKHQtPmRlbGF5X3VzZWNzKQorCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQlpZiAoIWNzX2NoYW5nZSkKKwkJCWNvbnRpbnVlOworCQlpZiAodC0+dHJhbnNmZXJfbGlzdC5uZXh0ID09ICZtLT50cmFuc2ZlcnMpCisJCQlicmVhazsKKwkJLyogc29tZXRpbWVzIGEgc2hvcnQgbWlkLW1lc3NhZ2UgZGVzZWxlY3Qgb2YgdGhlIGNoaXAKKwkJICogbWF5IGJlIG5lZWRlZCB0byB0ZXJtaW5hdGUgYSBtb2RlIG9yIGNvbW1hbmQKKwkJICovCisJCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIGNzX2RlbGF5KTsKKwl9CisKK2V4aXQ6CisJbS0+c3RhdHVzID0gc3RhdHVzOworCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOworCisJLyogbm9ybWFsbHkgZGVhY3RpdmF0ZSBjaGlwc2VsZWN0IC4uLiB1bmxlc3Mgbm8gZXJyb3IgYW5kCisJICogY3NfY2hhbmdlIGhhcyBoaW50ZWQgdGhhdCB0aGUgbmV4dCBtZXNzYWdlIHdpbGwgcHJvYmFibHkKKwkgKiBiZSBmb3IgdGhpcyBjaGlwIHRvby4KKwkgKi8KKwlpZiAoIShzdGF0dXMgPT0gMCAmJiBjc19jaGFuZ2UpKQorCQl0eHg5c3BpX2NzX2Z1bmMoc3BpLCBjLCAwLCBjc19kZWxheSk7CisKKwkvKiBlbnRlciBjb25maWcgbW9kZSAqLworCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9DT05GSUcgfCBUWHg5X1NQTUNSX0JDTFIsIFRYeDlfU1BNQ1IpOworfQorCitzdGF0aWMgdm9pZCB0eHg5c3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0eHg5c3BpICpjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0eHg5c3BpLCB3b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmMtPnF1ZXVlKSkgeworCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07CisKKwkJbSA9IGNvbnRhaW5lcl9vZihjLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKwkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7CisKKwkJdHh4OXNwaV93b3JrX29uZShjLCBtKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdHh4OXNwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaS0+bWFzdGVyOworCXN0cnVjdCB0eHg5c3BpICpjID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW0tPmFjdHVhbF9sZW5ndGggPSAwOworCisJLyogY2hlY2sgZWFjaCB0cmFuc2ZlcidzIHBhcmFtZXRlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCXUzMiBzcGVlZF9oeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKKwkJdTggYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKworCQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCA/IDogODsKKwkJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZiAmJiB0LT5sZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCAmJiBiaXRzX3Blcl93b3JkICE9IDE2KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh0LT5sZW4gJiAoKGJpdHNfcGVyX3dvcmQgPj4gMykgLSAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc3BlZWRfaHogPCBjLT5taW5fc3BlZWRfaHogfHwgc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHopCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm0tPnF1ZXVlLCAmYy0+cXVldWUpOworCXF1ZXVlX3dvcmsoYy0+d29ya3F1ZXVlLCAmYy0+d29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHR4eDlzcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHR4eDlzcGkgKmM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IC1FTk9ERVY7CisJdTMyIG1jcjsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2YoKmMpKTsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIHJldDsKKwljID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWMtPmlycSA9IC0xOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgbWFzdGVyKTsKKworCUlOSVRfV09SSygmYy0+d29yaywgdHh4OXNwaV93b3JrKTsKKwlzcGluX2xvY2tfaW5pdCgmYy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPnF1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT53YWl0cSk7CisKKwljLT5jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgInNwaS1iYXNlY2xrIik7CisJaWYgKElTX0VSUihjLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoYy0+Y2xrKTsKKwkJYy0+Y2xrID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKwlyZXQgPSBjbGtfZW5hYmxlKGMtPmNsayk7CisJaWYgKHJldCkgeworCQljbGtfcHV0KGMtPmNsayk7CisJCWMtPmNsayA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisJYy0+YmFzZWNsayA9IGNsa19nZXRfcmF0ZShjLT5jbGspOworCWMtPm1pbl9zcGVlZF9oeiA9IChjLT5iYXNlY2xrICsgMHhmZiAtIDEpIC8gMHhmZjsKKwljLT5tYXhfc3BlZWRfaHogPSBjLT5iYXNlY2xrOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlnb3RvIGV4aXQ7CisJYy0+bWVtYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJaWYgKCFjLT5tZW1iYXNlKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBlbnRlciBjb25maWcgbW9kZSAqLworCW1jciA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUE1DUik7CisJbWNyICY9IH4oVFh4OV9TUE1DUl9PUE1PREUgfCBUWHg5X1NQTUNSX1NQU1RQIHwgVFh4OV9TUE1DUl9CQ0xSKTsKKwl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLCBUWHg5X1NQTUNSKTsKKworCWMtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKKwlpZiAoYy0+aXJxIDwgMCkKKwkJZ290byBleGl0OworCXJldCA9IHJlcXVlc3RfaXJxKGMtPmlycSwgdHh4OXNwaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgYyk7CisJaWYgKHJldCkgeworCQljLT5pcnEgPSAtMTsKKwkJZ290byBleGl0OworCX0KKworCWMtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKG1hc3Rlci0+Y2Rldi5kZXYtPmJ1c19pZCk7CisJaWYgKCFjLT53b3JrcXVldWUpCisJCWdvdG8gZXhpdDsKKwljLT5sYXN0X2NoaXBzZWxlY3QgPSAtMTsKKworCWRldl9pbmZvKCZkZXYtPmRldiwgImF0ICUjbGx4LCBpcnEgJWQsICVkTUh6XG4iLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LCBjLT5pcnEsCisJCSAoYy0+YmFzZWNsayArIDUwMDAwMCkgLyAxMDAwMDAwKTsKKworCW1hc3Rlci0+YnVzX251bSA9IGRldi0+aWQ7CisJbWFzdGVyLT5zZXR1cCA9IHR4eDlzcGlfc2V0dXA7CisJbWFzdGVyLT50cmFuc2ZlciA9IHR4eDlzcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9ICh1MTYpVUlOVF9NQVg7IC8qIGFueSBHUElPIG51bWJlcnMgKi8KKworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXQ7CisJcmV0dXJuIDA7CitleGl0OgorCWlmIChjLT53b3JrcXVldWUpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGMtPndvcmtxdWV1ZSk7CisJaWYgKGMtPmlycSA+PSAwKQorCQlmcmVlX2lycShjLT5pcnEsIGMpOworCWlmIChjLT5tZW1iYXNlKQorCQlpb3VubWFwKGMtPm1lbWJhc2UpOworCWlmIChjLT5jbGspIHsKKwkJY2xrX2Rpc2FibGUoYy0+Y2xrKTsKKwkJY2xrX3B1dChjLT5jbGspOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgdHh4OXNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJZGVzdHJveV93b3JrcXVldWUoYy0+d29ya3F1ZXVlKTsKKwlmcmVlX2lycShjLT5pcnEsIGMpOworCWlvdW5tYXAoYy0+bWVtYmFzZSk7CisJY2xrX2Rpc2FibGUoYy0+Y2xrKTsKKwljbGtfcHV0KGMtPmNsayk7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHh4OXNwaV9kcml2ZXIgPSB7CisJLnJlbW92ZSA9IF9fZXhpdF9wKHR4eDlzcGlfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0eHg5c3BpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4eDlzcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnR4eDlzcGlfZHJpdmVyLCB0eHg5c3BpX3Byb2JlKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0eHg5c3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHh4OXNwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnR4eDlzcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHR4eDlzcGlfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVFh4OSBTUEkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlkZXYuYyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCmluZGV4IGQwNDI0MmEuLjM4YjYwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaWRldi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCkBAIC0xODEsNyArMTgxLDggQEAKIAkJfQogCQlpZiAodV90bXAtPnR4X2J1ZikgewogCQkJa190bXAtPnR4X2J1ZiA9IGJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIChjb25zdCB1OCBfX3VzZXIgKil1X3RtcC0+dHhfYnVmLAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgKGNvbnN0IHU4IF9fdXNlciAqKQorCQkJCQkJKHB0cmRpZmZfdCkgdV90bXAtPnR4X2J1ZiwKIAkJCQkJdV90bXAtPmxlbikpCiAJCQkJZ290byBkb25lOwogCQl9CkBAIC0yMTMsNyArMjE0LDggQEAKIAlidWYgPSBzcGlkZXYtPmJ1ZmZlcjsKIAlmb3IgKG4gPSBuX3hmZXJzLCB1X3RtcCA9IHVfeGZlcnM7IG47IG4tLSwgdV90bXArKykgewogCQlpZiAodV90bXAtPnJ4X2J1ZikgewotCQkJaWYgKF9fY29weV90b191c2VyKCh1OCBfX3VzZXIgKil1X3RtcC0+cnhfYnVmLCBidWYsCisJCQlpZiAoX19jb3B5X3RvX3VzZXIoKHU4IF9fdXNlciAqKQorCQkJCQkocHRyZGlmZl90KSB1X3RtcC0+cnhfYnVmLCBidWYsCiAJCQkJCXVfdG1wLT5sZW4pKSB7CiAJCQkJc3RhdHVzID0gLUVGQVVMVDsKIAkJCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS90bGU2MngwLmMgYi9kcml2ZXJzL3NwaS90bGU2MngwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhNThjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3RsZTYyeDAuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIHRsZTYyeDAuYyAtLSBzdXBwb3J0IEluZmluZW9uIFRMRTYyeDAgZHJpdmVyIGNoaXBzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvdGxlNjJ4MC5oPgorCisKKyNkZWZpbmUgQ01EX1JFQUQJMHgwMAorI2RlZmluZSBDTURfU0VUCQkweGZmCisKKyNkZWZpbmUgRElBR19OT1JNQUwJMHgwMworI2RlZmluZSBESUFHX09WRVJMT0FECTB4MDIKKyNkZWZpbmUgRElBR19PUEVOCTB4MDEKKyNkZWZpbmUgRElBR19TSE9SVEdORAkweDAwCisKK3N0cnVjdCB0bGU2MngwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqdXM7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXVuc2lnbmVkIGludAkJbnJfZ3BpbzsKKwl1bnNpZ25lZCBpbnQJCWdwaW9fc3RhdGU7CisKKwl1bnNpZ25lZCBjaGFyCQl0eF9idWZmWzRdOworCXVuc2lnbmVkIGNoYXIJCXJ4X2J1ZmZbNF07Cit9OworCitzdGF0aWMgaW50IHRvX2dwaW9fbnVtKHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKTsKKworc3RhdGljIGlubGluZSBpbnQgdGxlNjJ4MF93cml0ZShzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciAqYnVmZiA9IHN0LT50eF9idWZmOworCXVuc2lnbmVkIGludCBncGlvX3N0YXRlID0gc3QtPmdwaW9fc3RhdGU7CisKKwlidWZmWzBdID0gQ01EX1NFVDsKKworCWlmIChzdC0+bnJfZ3BpbyA9PSAxNikgeworCQlidWZmWzFdID0gZ3Bpb19zdGF0ZSA+PiA4OworCQlidWZmWzJdID0gZ3Bpb19zdGF0ZTsKKwl9IGVsc2UgeworCQlidWZmWzFdID0gZ3Bpb19zdGF0ZTsKKwl9CisKKwlkZXZfZGJnKCZzdC0+dXMtPmRldiwgImJ1ZmYgJTAyeCwlMDJ4LCUwMnhcbiIsCisJCWJ1ZmZbMF0sIGJ1ZmZbMV0sIGJ1ZmZbMl0pOworCisJcmV0dXJuIHNwaV93cml0ZShzdC0+dXMsIGJ1ZmYsIChzdC0+bnJfZ3BpbyA9PSAxNikgPyAzIDogMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRsZTYyeDBfcmVhZChzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciAqdHhidWZmID0gc3QtPnR4X2J1ZmY7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyID0geworCQkudHhfYnVmCQk9IHR4YnVmZiwKKwkJLnJ4X2J1ZgkJPSBzdC0+cnhfYnVmZiwKKwkJLmxlbgkJPSAoc3QtPm5yX2dwaW8gKiAyKSAvIDgsCisJfTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCisJdHhidWZmWzBdID0gQ01EX1JFQUQ7CisJdHhidWZmWzFdID0gMHgwMDsKKwl0eGJ1ZmZbMl0gPSAweDAwOworCXR4YnVmZlszXSA9IDB4MDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKworCXJldHVybiBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZGVjb2RlX2ZhdWx0KHVuc2lnbmVkIGludCBmYXVsdF9jb2RlKQoreworCWZhdWx0X2NvZGUgJj0gMzsKKworCXN3aXRjaCAoZmF1bHRfY29kZSkgeworCWNhc2UgRElBR19OT1JNQUw6CisJCXJldHVybiAiTiI7CisJY2FzZSBESUFHX09WRVJMT0FEOgorCQlyZXR1cm4gIlYiOworCWNhc2UgRElBR19PUEVOOgorCQlyZXR1cm4gIk8iOworCWNhc2UgRElBR19TSE9SVEdORDoKKwkJcmV0dXJuICJHIjsKKwl9CisKKwlyZXR1cm4gIj8iOworfQorCitzdGF0aWMgc3NpemVfdCB0bGU2MngwX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljaGFyICpicCA9IGJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpidWZmID0gc3QtPnJ4X2J1ZmY7CisJdW5zaWduZWQgbG9uZyBmYXVsdCA9IDA7CisJaW50IHB0cjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXJldCA9IHRsZTYyeDBfcmVhZChzdCk7CisKKwlkZXZfZGJnKGRldiwgInRsZTYyeDBfcmVhZCgpIHJldHVybmVkICVkXG4iLCByZXQpOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCAoc3QtPm5yX2dwaW8gKiAyKS84OyBwdHIgKz0gMSkgeworCQlmYXVsdCA8PD0gODsKKwkJZmF1bHQgIHw9ICgodW5zaWduZWQgbG9uZylidWZmW3B0cl0pOworCisJCWRldl9kYmcoZGV2LCAiYnl0ZSAlZCBpcyAlMDJ4XG4iLCBwdHIsIGJ1ZmZbcHRyXSk7CisJfQorCisJZm9yIChwdHIgPSAwOyBwdHIgPCBzdC0+bnJfZ3BpbzsgcHRyKyspIHsKKwkJYnAgKz0gc3ByaW50ZihicCwgIiVzICIsIGRlY29kZV9mYXVsdChmYXVsdCA+PiAocHRyICogMikpKTsKKwl9CisKKwkqYnArKyA9ICdcbic7CisKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gYnAgLSBidWY7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXNfc2hvdywgU19JUlVHTywgdGxlNjJ4MF9zdGF0dXNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHRsZTYyeDBfZ3Bpb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZ3Bpb19udW0gPSB0b19ncGlvX251bShhdHRyKTsKKwlpbnQgdmFsdWU7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJdmFsdWUgPSAoc3QtPmdwaW9fc3RhdGUgPj4gZ3Bpb19udW0pICYgMTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCB0bGU2MngwX2dwaW9fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBncGlvX251bSA9IHRvX2dwaW9fbnVtKGF0dHIpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWNoYXIgKmVuZHA7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwlpZiAoYnVmID09IGVuZHApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZyhkZXYsICJzZXR0aW5nIGdwaW8gJWQgdG8gJWxkXG4iLCBncGlvX251bSwgdmFsKTsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCWlmICh2YWwpCisJCXN0LT5ncGlvX3N0YXRlIHw9IDEgPDwgZ3Bpb19udW07CisJZWxzZQorCQlzdC0+Z3Bpb19zdGF0ZSAmPSB+KDEgPDwgZ3Bpb19udW0pOworCisJdGxlNjJ4MF93cml0ZShzdCk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzIsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzMsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzQsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzUsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzYsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzcsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzgsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzksIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEwLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMSwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTIsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEzLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xNCwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTUsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzE2LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmdwaW9fYXR0cnNbXSA9IHsKKwlbMF0JCT0gJmRldl9hdHRyX2dwaW8xLAorCVsxXQkJPSAmZGV2X2F0dHJfZ3BpbzIsCisJWzJdCQk9ICZkZXZfYXR0cl9ncGlvMywKKwlbM10JCT0gJmRldl9hdHRyX2dwaW80LAorCVs0XQkJPSAmZGV2X2F0dHJfZ3BpbzUsCisJWzVdCQk9ICZkZXZfYXR0cl9ncGlvNiwKKwlbNl0JCT0gJmRldl9hdHRyX2dwaW83LAorCVs3XQkJPSAmZGV2X2F0dHJfZ3BpbzgsCisJWzhdCQk9ICZkZXZfYXR0cl9ncGlvOSwKKwlbOV0JCT0gJmRldl9hdHRyX2dwaW8xMCwKKwlbMTBdCQk9ICZkZXZfYXR0cl9ncGlvMTEsCisJWzExXQkJPSAmZGV2X2F0dHJfZ3BpbzEyLAorCVsxMl0JCT0gJmRldl9hdHRyX2dwaW8xMywKKwlbMTNdCQk9ICZkZXZfYXR0cl9ncGlvMTQsCisJWzE0XQkJPSAmZGV2X2F0dHJfZ3BpbzE1LAorCVsxNV0JCT0gJmRldl9hdHRyX2dwaW8xNgorfTsKKworc3RhdGljIGludCB0b19ncGlvX251bShzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKK3sKKwlpbnQgcHRyOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGdwaW9fYXR0cnMpOyBwdHIrKykgeworCQlpZiAoZ3Bpb19hdHRyc1twdHJdID09IGF0dHIpCisJCQlyZXR1cm4gcHRyOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdGxlNjJ4MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdDsKKwlzdHJ1Y3QgdGxlNjJ4MF9wZGF0YSAqcGRhdGE7CisJaW50IHB0cjsKKwlpbnQgcmV0OworCisJcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gZGV2aWNlIGRhdGEgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gbWVtb3J5IGZvciBkZXZpY2Ugc3RhdGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzdC0+dXMgPSBzcGk7CisJc3QtPm5yX2dwaW8gPSBwZGF0YS0+Z3Bpb19jb3VudDsKKwlzdC0+Z3Bpb19zdGF0ZSA9IHBkYXRhLT5pbml0X3N0YXRlOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3N0YXR1c19zaG93KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBzdGF0dXMgYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJfc3RhdHVzOworCX0KKworCWZvciAocHRyID0gMDsgcHRyIDwgcGRhdGEtPmdwaW9fY291bnQ7IHB0cisrKSB7CisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBncGlvIGF0dHJpYnV0ZVxuIik7CisJCQlnb3RvIGVycl9ncGlvczsKKwkJfQorCX0KKworCS8qIHRsZTYyeDBfd3JpdGUoc3QpOyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKwlyZXR1cm4gMDsKKworIGVycl9ncGlvczoKKwlmb3IgKDsgcHRyID4gMDsgcHRyLS0pCisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzX3Nob3cpOworCisgZXJyX3N0YXR1czoKKwlrZnJlZShzdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdGxlNjJ4MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlpbnQgcHRyOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBzdC0+bnJfZ3BpbzsgcHRyKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisKKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB0bGU2MngwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJ0bGU2MngwIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gdGxlNjJ4MF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRsZTYyeDBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHRsZTYyeDBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZ0bGU2MngwX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCB0bGU2MngwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnRsZTYyeDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGxlNjJ4MF9pbml0KTsKK21vZHVsZV9leGl0KHRsZTYyeDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVExFNjJ4MCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMgYi9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiZjlhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYwpAQCAtMCwwICsxLDQzNCBAQAorLyoKKyAqIHhpbGlueF9zcGkuYworICoKKyAqIFhpbGlueCBTUEkgY29udHJvbGxlciBkcml2ZXIgKG1hc3RlciBtb2RlIG9ubHkpCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKglzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIDIwMDItMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZAorICogImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPHN5c2xpYi92aXJ0ZXhfZGV2aWNlcy5oPgorCisjZGVmaW5lIFhJTElOWF9TUElfTkFNRSAieHNwaSIKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgYXMgcGVyICJPUEIgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpICh2MS4wMGUpCisgKiBQcm9kdWN0IFNwZWNpZmljYXRpb24iLCBEUzQ2NAorICovCisjZGVmaW5lIFhTUElfQ1JfT0ZGU0VUCQkweDYyCS8qIDE2LWJpdCBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgWFNQSV9DUl9FTkFCTEUJCTB4MDIKKyNkZWZpbmUgWFNQSV9DUl9NQVNURVJfTU9ERQkweDA0CisjZGVmaW5lIFhTUElfQ1JfQ1BPTAkJMHgwOAorI2RlZmluZSBYU1BJX0NSX0NQSEEJCTB4MTAKKyNkZWZpbmUgWFNQSV9DUl9NT0RFX01BU0sJKFhTUElfQ1JfQ1BIQSB8IFhTUElfQ1JfQ1BPTCkKKyNkZWZpbmUgWFNQSV9DUl9UWEZJRk9fUkVTRVQJMHgyMAorI2RlZmluZSBYU1BJX0NSX1JYRklGT19SRVNFVAkweDQwCisjZGVmaW5lIFhTUElfQ1JfTUFOVUFMX1NTRUxFQ1QJMHg4MAorI2RlZmluZSBYU1BJX0NSX1RSQU5TX0lOSElCSVQJMHgxMDAKKworI2RlZmluZSBYU1BJX1NSX09GRlNFVAkJMHg2NwkvKiA4LWJpdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBYU1BJX1NSX1JYX0VNUFRZX01BU0sJMHgwMQkvKiBSZWNlaXZlIEZJRk8gaXMgZW1wdHkgKi8KKyNkZWZpbmUgWFNQSV9TUl9SWF9GVUxMX01BU0sJMHgwMgkvKiBSZWNlaXZlIEZJRk8gaXMgZnVsbCAqLworI2RlZmluZSBYU1BJX1NSX1RYX0VNUFRZX01BU0sJMHgwNAkvKiBUcmFuc21pdCBGSUZPIGlzIGVtcHR5ICovCisjZGVmaW5lIFhTUElfU1JfVFhfRlVMTF9NQVNLCTB4MDgJLyogVHJhbnNtaXQgRklGTyBpcyBmdWxsICovCisjZGVmaW5lIFhTUElfU1JfTU9ERV9GQVVMVF9NQVNLCTB4MTAJLyogTW9kZSBmYXVsdCBlcnJvciAqLworCisjZGVmaW5lIFhTUElfVFhEX09GRlNFVAkJMHg2YgkvKiA4LWJpdCBEYXRhIFRyYW5zbWl0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhTUElfUlhEX09GRlNFVAkJMHg2ZgkvKiA4LWJpdCBEYXRhIFJlY2VpdmUgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBYU1BJX1NTUl9PRkZTRVQJCTB4NzAJLyogMzItYml0IFNsYXZlIFNlbGVjdCBSZWdpc3RlciAqLworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyBhcyBwZXIgIk9QQiBJUElGICh2My4wMWMpIFByb2R1Y3QgU3BlY2lmaWNhdGlvbiIsIERTNDE0CisgKiBJUElGIHJlZ2lzdGVycyBhcmUgMzIgYml0CisgKi8KKyNkZWZpbmUgWElQSUZfVjEyM0JfREdJRVJfT0ZGU0VUCTB4MWMJLyogSVBJRiBnbG9iYWwgaW50IGVuYWJsZSByZWcgKi8KKyNkZWZpbmUgWElQSUZfVjEyM0JfR0lOVFJfRU5BQkxFCTB4ODAwMDAwMDAKKworI2RlZmluZSBYSVBJRl9WMTIzQl9JSVNSX09GRlNFVAkJMHgyMAkvKiBJUElGIGludGVycnVwdCBzdGF0dXMgcmVnICovCisjZGVmaW5lIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VUCQkweDI4CS8qIElQSUYgaW50ZXJydXB0IGVuYWJsZSByZWcgKi8KKworI2RlZmluZSBYU1BJX0lOVFJfTU9ERV9GQVVMVAkJMHgwMQkvKiBNb2RlIGZhdWx0IGVycm9yICovCisjZGVmaW5lIFhTUElfSU5UUl9TTEFWRV9NT0RFX0ZBVUxUCTB4MDIJLyogU2VsZWN0ZWQgYXMgc2xhdmUgd2hpbGUKKwkJCQkJCSAqIGRpc2FibGVkICovCisjZGVmaW5lIFhTUElfSU5UUl9UWF9FTVBUWQkJMHgwNAkvKiBUeEZJRk8gaXMgZW1wdHkgKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1RYX1VOREVSUlVOCQkweDA4CS8qIFR4RklGTyB3YXMgdW5kZXJydW4gKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1JYX0ZVTEwJCTB4MTAJLyogUnhGSUZPIGlzIGZ1bGwgKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1JYX09WRVJSVU4JCTB4MjAJLyogUnhGSUZPIHdhcyBvdmVycnVuICovCisKKyNkZWZpbmUgWElQSUZfVjEyM0JfUkVTRVRSX09GRlNFVAkweDQwCS8qIElQSUYgcmVzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElQSUZfVjEyM0JfUkVTRVRfTUFTSwkJMHgwYQkvKiB0aGUgdmFsdWUgdG8gd3JpdGUgKi8KKworc3RydWN0IHhpbGlueF9zcGkgeworCS8qIGJpdGJhbmcgaGFzIHRvIGJlIGZpcnN0ICovCisJc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKworCXZvaWQgX19pb21lbQkqcmVnczsJLyogdmlydC4gYWRkcmVzcyBvZiB0aGUgY29udHJvbCByZWdpc3RlcnMgKi8KKworCXUzMgkJaXJxOworCisJdTMyCQlzcGVlZF9oejsgLyogU0NLIGhhcyBhIGZpeGVkIGZyZXF1ZW5jeSBvZiBzcGVlZF9oeiBIeiAqLworCisJdTggKnJ4X3B0cjsJCS8qIHBvaW50ZXIgaW4gdGhlIFR4IGJ1ZmZlciAqLworCWNvbnN0IHU4ICp0eF9wdHI7CS8qIHBvaW50ZXIgaW4gdGhlIFJ4IGJ1ZmZlciAqLworCWludCByZW1haW5pbmdfYnl0ZXM7CS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byB0cmFuc2ZlciAqLworfTsKKworc3RhdGljIHZvaWQgeHNwaV9pbml0X2h3KHZvaWQgX19pb21lbSAqcmVnc19iYXNlKQoreworCS8qIFJlc2V0IHRoZSBTUEkgZGV2aWNlICovCisJb3V0X2JlMzIocmVnc19iYXNlICsgWElQSUZfVjEyM0JfUkVTRVRSX09GRlNFVCwKKwkJIFhJUElGX1YxMjNCX1JFU0VUX01BU0spOworCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzIGp1c3QgaW4gY2FzZSAqLworCW91dF9iZTMyKHJlZ3NfYmFzZSArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VULCAwKTsKKwkvKiBFbmFibGUgdGhlIGdsb2JhbCBJUElGIGludGVycnVwdCAqLworCW91dF9iZTMyKHJlZ3NfYmFzZSArIFhJUElGX1YxMjNCX0RHSUVSX09GRlNFVCwKKwkJIFhJUElGX1YxMjNCX0dJTlRSX0VOQUJMRSk7CisJLyogRGVzZWxlY3QgdGhlIHNsYXZlIG9uIHRoZSBTUEkgYnVzICovCisJb3V0X2JlMzIocmVnc19iYXNlICsgWFNQSV9TU1JfT0ZGU0VULCAweGZmZmYpOworCS8qIERpc2FibGUgdGhlIHRyYW5zbWl0dGVyLCBlbmFibGUgTWFudWFsIFNsYXZlIFNlbGVjdCBBc3NlcnRpb24sCisJICogcHV0IFNQSSBjb250cm9sbGVyIGludG8gbWFzdGVyIG1vZGUsIGFuZCBlbmFibGUgaXQgKi8KKwlvdXRfYmUxNihyZWdzX2Jhc2UgKyBYU1BJX0NSX09GRlNFVCwKKwkJIFhTUElfQ1JfVFJBTlNfSU5ISUJJVCB8IFhTUElfQ1JfTUFOVUFMX1NTRUxFQ1QKKwkJIHwgWFNQSV9DUl9NQVNURVJfTU9ERSB8IFhTUElfQ1JfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgeGlsaW54X3NwaV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKGlzX29uID09IEJJVEJBTkdfQ1NfSU5BQ1RJVkUpIHsKKwkJLyogRGVzZWxlY3QgdGhlIHNsYXZlIG9uIHRoZSBTUEkgYnVzICovCisJCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYU1BJX1NTUl9PRkZTRVQsIDB4ZmZmZik7CisJfSBlbHNlIGlmIChpc19vbiA9PSBCSVRCQU5HX0NTX0FDVElWRSkgeworCQkvKiBTZXQgdGhlIFNQSSBjbG9jayBwaGFzZSBhbmQgcG9sYXJpdHkgKi8KKwkJdTE2IGNyID0gaW5fYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQpCisJCQkgJiB+WFNQSV9DUl9NT0RFX01BU0s7CisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJCWNyIHw9IFhTUElfQ1JfQ1BIQTsKKwkJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQkJY3IgfD0gWFNQSV9DUl9DUE9MOworCQlvdXRfYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQsIGNyKTsKKworCQkvKiBXZSBkbyBub3QgY2hlY2sgc3BpLT5tYXhfc3BlZWRfaHogaGVyZSBhcyB0aGUgU1BJIGNsb2NrCisJCSAqIGZyZXF1ZW5jeSBpcyBub3Qgc29mdHdhcmUgcHJvZ3JhbW1hYmxlICh0aGUgSVAgYmxvY2sgZGVzaWduCisJCSAqIHBhcmFtZXRlcikKKwkJICovCisKKwkJLyogQWN0aXZhdGUgdGhlIGNoaXAgc2VsZWN0ICovCisJCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYU1BJX1NTUl9PRkZTRVQsCisJCQkgfigweDAwMDEgPDwgc3BpLT5jaGlwX3NlbGVjdCkpOworCX0KK30KKworLyogc3BpX2JpdGJhbmcgcmVxdWlyZXMgY3VzdG9tIHNldHVwX3RyYW5zZmVyKCkgdG8gYmUgZGVmaW5lZCBpZiB0aGVyZSBpcyBhCisgKiBjdXN0b20gdHhyeF9idWZzKCkuIFdlIGhhdmUgbm90aGluZyB0byBzZXR1cCBoZXJlIGFzIHRoZSBTUEkgSVAgYmxvY2sKKyAqIHN1cHBvcnRzIGp1c3QgOCBiaXRzIHBlciB3b3JkLCBhbmQgU1BJIGNsb2NrIGNhbid0IGJlIGNoYW5nZWQgaW4gc29mdHdhcmUuCisgKiBDaGVjayBmb3IgOCBiaXRzIHBlciB3b3JkLiBDaGlwIHNlbGVjdCBkZWxheSBjYWxjdWxhdGlvbnMgY291bGQgYmUKKyAqIGFkZGVkIGhlcmUgYXMgc29vbiBhcyBiaXRiYW5nX3dvcmsoKSBjYW4gYmUgbWFkZSBhd2FyZSBvZiB0aGUgZGVsYXkgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgeGlsaW54X3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXU4IGJpdHNfcGVyX3dvcmQ7CisJdTMyIGh6OworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwliaXRzX3Blcl93b3JkID0gKHQpID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKKwloeiA9ICh0KSA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7CisJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzLCB1bnN1cHBvcnRlZCBiaXRzX3Blcl93b3JkPSVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBiaXRzX3Blcl93b3JkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGh6ICYmIHhzcGktPnNwZWVkX2h6ID4gaHopIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgY2xvY2sgcmF0ZSAldUh6XG4iLAorCQkJX19GVU5DVElPTl9fLCBoeik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEpCisKK3N0YXRpYyBpbnQgeGlsaW54X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfYml0YmFuZyAqYml0YmFuZzsKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaTsKKwlpbnQgcmV0dmFsOworCisJeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWJpdGJhbmcgPSAmeHNwaS0+Yml0YmFuZzsKKworCWlmICghc3BpLT5iaXRzX3Blcl93b3JkKQorCQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzLCB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHZhbCA9IHhpbGlueF9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXMsIG1vZGUgJWQsICV1IGJpdHMvdywgJXUgbnNlYy9iaXRcbiIsCisJCV9fRlVOQ1RJT05fXywgc3BpLT5tb2RlICYgTU9ERUJJVFMsIHNwaS0+Yml0c19wZXJfd29yZCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGlsaW54X3NwaV9maWxsX3R4X2ZpZm8oc3RydWN0IHhpbGlueF9zcGkgKnhzcGkpCit7CisJdTggc3I7CisKKwkvKiBGaWxsIHRoZSBUeCBGSUZPIHdpdGggYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZSAqLworCXNyID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOworCXdoaWxlICgoc3IgJiBYU1BJX1NSX1RYX0ZVTExfTUFTSykgPT0gMCAmJiB4c3BpLT5yZW1haW5pbmdfYnl0ZXMgPiAwKSB7CisJCWlmICh4c3BpLT50eF9wdHIpIHsKKwkJCW91dF84KHhzcGktPnJlZ3MgKyBYU1BJX1RYRF9PRkZTRVQsICp4c3BpLT50eF9wdHIrKyk7CisJCX0gZWxzZSB7CisJCQlvdXRfOCh4c3BpLT5yZWdzICsgWFNQSV9UWERfT0ZGU0VULCAwKTsKKwkJfQorCQl4c3BpLT5yZW1haW5pbmdfYnl0ZXMtLTsKKwkJc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJfQorfQorCitzdGF0aWMgaW50IHhpbGlueF9zcGlfdHhyeF9idWZzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgaXBpZl9pZXI7CisJdTE2IGNyOworCisJLyogV2UgZ2V0IGhlcmUgd2l0aCB0cmFuc21pdHRlciBpbmhpYml0ZWQgKi8KKworCXhzcGktPnR4X3B0ciA9IHQtPnR4X2J1ZjsKKwl4c3BpLT5yeF9wdHIgPSB0LT5yeF9idWY7CisJeHNwaS0+cmVtYWluaW5nX2J5dGVzID0gdC0+bGVuOworCUlOSVRfQ09NUExFVElPTih4c3BpLT5kb25lKTsKKworCXhpbGlueF9zcGlfZmlsbF90eF9maWZvKHhzcGkpOworCisJLyogRW5hYmxlIHRoZSB0cmFuc21pdCBlbXB0eSBpbnRlcnJ1cHQsIHdoaWNoIHdlIHVzZSB0byBkZXRlcm1pbmUKKwkgKiBwcm9ncmVzcyBvbiB0aGUgdHJhbnNtaXNzaW9uLgorCSAqLworCWlwaWZfaWVyID0gaW5fYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQpOworCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCwKKwkJIGlwaWZfaWVyIHwgWFNQSV9JTlRSX1RYX0VNUFRZKTsKKworCS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSBub3QgaW5oaWJpdGluZyB0aGUgdHJhbnNtaXR0ZXIgYW55IGxvbmdlciAqLworCWNyID0gaW5fYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQpICYgflhTUElfQ1JfVFJBTlNfSU5ISUJJVDsKKwlvdXRfYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQsIGNyKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnhzcGktPmRvbmUpOworCisJLyogRGlzYWJsZSB0aGUgdHJhbnNtaXQgZW1wdHkgaW50ZXJydXB0ICovCisJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VULCBpcGlmX2llcik7CisKKwlyZXR1cm4gdC0+bGVuIC0geHNwaS0+cmVtYWluaW5nX2J5dGVzOworfQorCisKKy8qIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHNpbmdsZSBtYXN0ZXIgbW9kZSBvbmx5LiBIZW5jZSBUeCBGSUZPIEVtcHR5CisgKiBpcyB0aGUgb25seSBpbnRlcnJ1cHQgd2UgY2FyZSBhYm91dC4KKyAqIFJlY2VpdmUgRklGTyBPdmVycnVuLCBUcmFuc21pdCBGSUZPIFVuZGVycnVuLCBNb2RlIEZhdWx0LCBhbmQgU2xhdmUgTW9kZQorICogRmF1bHQgYXJlIG5vdCB0byBoYXBwZW4uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB4aWxpbnhfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGkgPSBkZXZfaWQ7CisJdTMyIGlwaWZfaXNyOworCisJLyogR2V0IHRoZSBJUElGIGludGVycnVwdHMsIGFuZCBjbGVhciB0aGVtIGltbWVkaWF0ZWx5ICovCisJaXBpZl9pc3IgPSBpbl9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSVNSX09GRlNFVCk7CisJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJU1JfT0ZGU0VULCBpcGlmX2lzcik7CisKKwlpZiAoaXBpZl9pc3IgJiBYU1BJX0lOVFJfVFhfRU1QVFkpIHsJLyogVHJhbnNtaXNzaW9uIGNvbXBsZXRlZCAqLworCQl1MTYgY3I7CisJCXU4IHNyOworCisJCS8qIEEgdHJhbnNtaXQgaGFzIGp1c3QgY29tcGxldGVkLiBQcm9jZXNzIHJlY2VpdmVkIGRhdGEgYW5kCisJCSAqIGNoZWNrIGZvciBtb3JlIGRhdGEgdG8gdHJhbnNtaXQuIEFsd2F5cyBpbmhpYml0IHRoZQorCQkgKiB0cmFuc21pdHRlciB3aGlsZSB0aGUgSXNyIHJlZmlsbHMgdGhlIHRyYW5zbWl0IHJlZ2lzdGVyL0ZJRk8sCisJCSAqIG9yIG1ha2Ugc3VyZSBpdCBpcyBzdG9wcGVkIGlmIHdlJ3JlIGRvbmUuCisJCSAqLworCQljciA9IGluX2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKTsKKwkJb3V0X2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VULAorCQkJIGNyIHwgWFNQSV9DUl9UUkFOU19JTkhJQklUKTsKKworCQkvKiBSZWFkIG91dCBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgUnggRklGTyAqLworCQlzciA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfU1JfT0ZGU0VUKTsKKwkJd2hpbGUgKChzciAmIFhTUElfU1JfUlhfRU1QVFlfTUFTSykgPT0gMCkgeworCQkJdTggZGF0YTsKKworCQkJZGF0YSA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfUlhEX09GRlNFVCk7CisJCQlpZiAoeHNwaS0+cnhfcHRyKSB7CisJCQkJKnhzcGktPnJ4X3B0cisrID0gZGF0YTsKKwkJCX0KKwkJCXNyID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOworCQl9CisKKwkJLyogU2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBzZW5kICovCisJCWlmICh4c3BpLT5yZW1haW5pbmdfYnl0ZXMgPiAwKSB7CisJCQl4aWxpbnhfc3BpX2ZpbGxfdHhfZmlmbyh4c3BpKTsKKwkJCS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSBub3QgaW5oaWJpdGluZyB0aGUKKwkJCSAqIHRyYW5zbWl0dGVyIGFueSBsb25nZXIKKwkJCSAqLworCQkJb3V0X2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VULCBjcik7CisJCX0gZWxzZSB7CisJCQkvKiBObyBtb3JlIGRhdGEgdG8gc2VuZC4KKwkJCSAqIEluZGljYXRlIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuCisJCQkgKi8KKwkJCWNvbXBsZXRlKCZ4c3BpLT5kb25lKTsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgeGlsaW54X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaTsKKwlzdHJ1Y3QgeHNwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisKKwkvKiBHZXQgcmVzb3VyY2VzKG1lbW9yeSwgSVJRKSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSAqLworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHhpbGlueF9zcGkpKTsKKworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CisJcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBwdXRfbWFzdGVyOworCX0KKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHIgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl4c3BpLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJeHNwaS0+Yml0YmFuZy5jaGlwc2VsZWN0ID0geGlsaW54X3NwaV9jaGlwc2VsZWN0OworCXhzcGktPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSB4aWxpbnhfc3BpX3NldHVwX3RyYW5zZmVyOworCXhzcGktPmJpdGJhbmcudHhyeF9idWZzID0geGlsaW54X3NwaV90eHJ4X2J1ZnM7CisJeHNwaS0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0geGlsaW54X3NwaV9zZXR1cDsKKwlpbml0X2NvbXBsZXRpb24oJnhzcGktPmRvbmUpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsCisJCQlyLT5lbmQgLSByLT5zdGFydCArIDEsIFhJTElOWF9TUElfTkFNRSkpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJeHNwaS0+cmVncyA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKHhzcGktPnJlZ3MgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJeHNwaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCWlmICh4c3BpLT5pcnEgPCAwKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byB1bm1hcF9pbzsKKwl9CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm51bV9jaGlwc2VsZWN0OworCXhzcGktPnNwZWVkX2h6ID0gcGRhdGEtPnNwZWVkX2h6OworCisJLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCisJeHNwaV9pbml0X2h3KHhzcGktPnJlZ3MpOworCisJLyogUmVnaXN0ZXIgZm9yIFNQSSBJbnRlcnJ1cHQgKi8KKwlyZXQgPSByZXF1ZXN0X2lycSh4c3BpLT5pcnEsIHhpbGlueF9zcGlfaXJxLCAwLCBYSUxJTlhfU1BJX05BTUUsIHhzcGkpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byB1bm1hcF9pbzsKKworCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZ4c3BpLT5iaXRiYW5nKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJzcGlfYml0YmFuZ19zdGFydCBGQUlMRURcbiIpOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCWRldl9pbmZvKCZkZXYtPmRldiwgImF0IDB4JTA4WCBtYXBwZWQgdG8gMHglMDhYLCBpcnE9JWRcbiIsCisJCQlyLT5zdGFydCwgKHUzMil4c3BpLT5yZWdzLCB4c3BpLT5pcnEpOworCisJcmV0dXJuIHJldDsKKworZnJlZV9pcnE6CisJZnJlZV9pcnEoeHNwaS0+aXJxLCB4c3BpKTsKK3VubWFwX2lvOgorCWlvdW5tYXAoeHNwaS0+cmVncyk7CitwdXRfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgeGlsaW54X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisKKwltYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlzcGlfYml0YmFuZ19zdG9wKCZ4c3BpLT5iaXRiYW5nKTsKKwlmcmVlX2lycSh4c3BpLT5pcnEsIHhzcGkpOworCWlvdW5tYXAoeHNwaS0+cmVncyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCAwKTsKKwlzcGlfbWFzdGVyX3B1dCh4c3BpLT5iaXRiYW5nLm1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGlsaW54X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCT0geGlsaW54X3NwaV9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoeGlsaW54X3NwaV9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gWElMSU5YX1NQSV9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGlsaW54X3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmeGlsaW54X3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoeGlsaW54X3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHhpbGlueF9zcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ4aWxpbnhfc3BpX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh4aWxpbnhfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L0tjb25maWcgYi9kcml2ZXJzL3RlbGVwaG9ueS9LY29uZmlnCmluZGV4IGRkMWQ2YTUuLjVmOThmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L0tjb25maWcKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvS2NvbmZpZwpAQCAtMiwxMSArMiw5IEBACiAjIFRlbGVwaG9ueSBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJUZWxlcGhvbnkgU3VwcG9ydCIKK21lbnVjb25maWcgUEhPTkUKKwl0cmlzdGF0ZSAiVGVsZXBob255IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBIT05FCi0JdHJpc3RhdGUgIkxpbnV4IHRlbGVwaG9ueSBzdXBwb3J0IgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSB0ZWxlcGhvbnkgY2FyZCwgd2hpY2ggZm9yIGV4YW1wbGUgYWxsb3dzCiAJICB5b3UgdG8gdXNlIGEgcmVndWxhciBwaG9uZSBmb3Igdm9pY2Utb3Zlci1JUCBhcHBsaWNhdGlvbnMuCkBAIC0xNyw5ICsxNSwxMSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGhvbmVkZXYuCiAKK2lmIFBIT05FCisKIGNvbmZpZyBQSE9ORV9JWEoKIAl0cmlzdGF0ZSAiUXVpY2tOZXQgSW50ZXJuZXQgTGluZUphY2svUGhvbmVKYWNrIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQSE9ORQorCWRlcGVuZHMgSVNBIHx8IFBDSQogCS0tLWhlbHAtLS0KIAkgIFNheSBNIGlmIHlvdSBoYXZlIGEgdGVsZXBob255IGNhcmQgbWFudWZhY3R1cmVkIGJ5IFF1aWNrbmV0CiAJICBUZWNobm9sb2dpZXMsIEluYy4gIFRoZXNlIGluY2x1ZGUgdGhlIEludGVybmV0IFBob25lSkFDSyBhbmQKQEAgLTQ0LDUgKzQ0LDQgQEAKIAkgIGNhcmRzIG1hbnVmYWN0dXJlZCBieSBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4gIFRoaXMgY2hhbmdlcyB0aGUKIAkgIGNhcmQgaW5pdGlhbGl6YXRpb24gY29kZSB0byB3b3JrIHdpdGggdGhlIGNhcmQgbWFuYWdlciBkYWVtb24uCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBQSE9ORQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggMDcxYjk2Ny4uN2RkNzM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC0xNiw3ICsxNiw3IEBACiAJYm9vbGVhbgogCWRlZmF1bHQgeSBpZiBVU0JfQVJDSF9IQVNfT0hDSQogCWRlZmF1bHQgeSBpZiBVU0JfQVJDSF9IQVNfRUhDSQotCWRlZmF1bHQgeSBpZiBQQ01DSUEJCQkJIyBzbDgxMV9jcworCWRlZmF1bHQgeSBpZiBQQ01DSUEgJiYgIU0zMlIJCQkjIHNsODExX2NzCiAJZGVmYXVsdCB5IGlmIEFSTQkJCQkjIFNMLTgxMQogCWRlZmF1bHQgUENJCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IDQ5NzNlMTQuLjhmMDQ2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtMTE2OCw2ICsxMTY4LDcgQEAKIAlzdHJ1Y3QgdWVhX3NvZnRjICpzYyA9IGRhdGE7CiAJaW50IHJldCA9IC1FQUdBSU47CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJdWVhX2VudGVycyhJTlNfVE9fVVNCREVWKHNjKSk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJaWYgKHJldCA8IDAgfHwgc2MtPnJlc2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9odWIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKaW5kZXggNTBlNzkwMS4uZmQ3NGM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9odWIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCkBAIC0yNzI4LDYgKzI3MjgsNyBAQAogCiBzdGF0aWMgaW50IGh1Yl90aHJlYWQodm9pZCAqX191bnVzZWQpCiB7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWRvIHsKIAkJaHViX2V2ZW50cygpOwogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoa2h1YmRfd2FpdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCA4NzEyZWY5Li5iZTdhMWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC0zNDM0LDYgKzM0MzQsOSBAQAogCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKIAlhbGxvd19zaWduYWwoU0lHVVNSMSk7CiAKKwkvKiBBbGxvdyB0aGUgdGhyZWFkIHRvIGJlIGZyb3plbiAqLworCXNldF9mcmVlemFibGUoKTsKKwogCS8qIEFycmFuZ2UgZm9yIHVzZXJzcGFjZSByZWZlcmVuY2VzIHRvIGJlIGludGVycHJldGVkIGFzIGtlcm5lbAogCSAqIHBvaW50ZXJzLiAgVGhhdCB3YXkgd2UgY2FuIHBhc3MgYSBrZXJuZWwgcG9pbnRlciB0byBhIHJvdXRpbmUKIAkgKiB0aGF0IGV4cGVjdHMgYSBfX3VzZXIgcG9pbnRlciBhbmQgaXQgd2lsbCB3b3JrIG9rYXkuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCBiZWY4YmNkLi4yODg0MmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTMxMSw4ICszMTEsNiBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSB1c190b19ob3N0KHVzKTsKIAlpbnQgYXV0b3BtX3JjOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAlmb3IoOzspIHsKIAkJVVNfREVCVUdQKCIqKiogdGhyZWFkIHNsZWVwaW5nLlxuIik7CiAJCWlmKGRvd25faW50ZXJydXB0aWJsZSgmdXMtPnNlbWEpKQpAQCAtOTIwLDYgKzkxOCw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcKIAkJInVzYi1zdG9yYWdlOiBkZXZpY2UgZm91bmQgYXQgJWRcbiIsIHVzLT5wdXNiX2Rldi0+ZGV2bnVtKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAkvKiBXYWl0IGZvciB0aGUgdGltZW91dCB0byBleHBpcmUgb3IgZm9yIGEgZGlzY29ubmVjdCAqLwogCWlmIChkZWxheV91c2UgPiAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJ1c2Itc3RvcmFnZTogd2FpdGluZyBmb3IgZGV2aWNlICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKaW5kZXggMGRkYTczZC4uN2Y5MDdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby82ODMyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyB1X2xvbmcgdmlkZW9tZW1vcnlzaXplOwogCiBzdGF0aWMgc3RydWN0IGZiX2luZm8gZmJfaW5mbzsKLXN0YXRpYyB1MzIgbWM2OHgzMjhmYl9wc2V1ZG9fcGFsZXR0ZVsxN107CitzdGF0aWMgdTMyIG1jNjh4MzI4ZmJfcHNldWRvX3BhbGV0dGVbMTZdOwogCiBzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIG1jNjh4MzI4ZmJfZGVmYXVsdCBfX2luaXRkYXRhID0gewogCS5yZWQgPQkJeyAwLCA4LCAwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggNDAzZGFjNy4uMGM1NjQ0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKQEAgLTgxMiw3ICs4MTIsNyBAQAogCiBjb25maWcgRkJfRVBTT04xMzU1CiAJYm9vbCAiRXBzb24gMTM1NSBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gKEZCID0geSkgJiYgKFNVUEVSSCB8fCBBUkNIX0NFSVZBKQorCWRlcGVuZHMgb24gKEZCID0geSkgJiYgQVJDSF9DRUlWQQogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKQEAgLTE3OTAsOCArMTc5MCw4IEBACiAJICBhZGFwdG9yLCBmb3VuZCBvbiBzb21lIElCTSBTeXN0ZW0gUCAocFNlcmllcykgbWFjaGluZXMuCiAKIGNvbmZpZyBGQl9QUzMKLQlib29sICJQUzMgR1BVIGZyYW1lYnVmZmVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIFBTM19QUzNBVgorCXRyaXN0YXRlICJQUzMgR1BVIGZyYW1lYnVmZmVyIGRyaXZlciIKKwlkZXBlbmRzIG9uIEZCICYmIFBTM19QUzNBVgogCXNlbGVjdCBGQl9TWVNfRklMTFJFQ1QKIAlzZWxlY3QgRkJfU1lTX0NPUFlBUkVBCiAJc2VsZWN0IEZCX1NZU19JTUFHRUJMSVQKQEAgLTE4MjAsNiArMTgyMCwxMCBAQAogCSAgZnJhbWVidWZmZXIuIE1MMzAwIGNhcnJpZXMgYSA2NDAqNDgwIExDRCBkaXNwbGF5IG9uIHRoZSBib2FyZCwKIAkgIE1MNDAzIHVzZXMgYSBzdGFuZGFyZCBEQjE1IFZHQSBjb25uZWN0b3IuCiAKK2lmIEFSQ0hfT01BUAorCXNvdXJjZSAiZHJpdmVycy92aWRlby9vbWFwL0tjb25maWciCitlbmRpZgorCiBjb25maWcgRkJfVklSVFVBTAogCXRyaXN0YXRlICJWaXJ0dWFsIEZyYW1lIEJ1ZmZlciBzdXBwb3J0IChPTkxZIEZPUiBURVNUSU5HISkiCiAJZGVwZW5kcyBvbiBGQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKaW5kZXggYmQ4YjA1Mi4uYTU2MmY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCkBAIC0xMTMsNiArMTEzLDcgQEAKIG9iai0kKENPTkZJR19GQl9QUzMpCQkgICs9IHBzM2ZiLm8KIG9iai0kKENPTkZJR19GQl9TTTUwMSkgICAgICAgICAgICArPSBzbTUwMWZiLm8KIG9iai0kKENPTkZJR19GQl9YSUxJTlgpICAgICAgICAgICArPSB4aWxpbnhmYi5vCitvYmotJChDT05GSUdfRkJfT01BUCkgICAgICAgICAgICAgKz0gb21hcC8KIAogIyBQbGF0Zm9ybSBvciBmYWxsYmFjayBkcml2ZXJzIGdvIGhlcmUKIG9iai0kKENPTkZJR19GQl9WRVNBKSAgICAgICAgICAgICArPSB2ZXNhZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXRpX2lkcy5oIGIvZHJpdmVycy92aWRlby9hdHkvYXRpX2lkcy5oCmluZGV4IDkwZTdkZjIuLjY4NWE3NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0aV9pZHMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdGlfaWRzLmgKQEAgLTIwNCw2ICsyMDQsNyBAQAogI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYxCQkweDU5NjEKICNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MgkJMHg1OTYyCiAjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjQJCTB4NTk2NAorI2RlZmluZSBQQ0lfQ0hJUF9SUzQ4NV81OTc1CQkweDU5NzUKICNkZWZpbmUgUENJX0NISVBfUlYyODBfNUM2MQkJMHg1QzYxCiAjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzVDNjMJCTB4NUM2MwogI2RlZmluZSBQQ0lfQ0hJUF9SNDIzXzVENTcgICAgICAgICAgICAgIDB4NUQ1NwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IDJmYmZmNjMuLmVmMzMwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKQEAgLTU0MSw3ICs1NDEsNyBAQAogI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KIAogCi1zdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKK3N0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogCiAjaWZkZWYgQ09ORklHX0ZCX0FUWV9HWAogc3RhdGljIGNoYXIgKmF0eV9neF9yYW1bOF0gX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCmluZGV4IDIzNDllNzEuLjQ3Y2E2MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwpAQCAtMTUzLDYgKzE1Myw4IEBACiAJLyogTW9iaWxpdHkgOTIwMCAoTTkrKSAqLwogCUNISVBfREVGKFBDSV9DSElQX1JWMjgwXzVDNjEsCVJWMjgwLAlDSElQX0hBU19DUlRDMiB8IENISVBfSVNfTU9CSUxJVFkpLAogCUNISVBfREVGKFBDSV9DSElQX1JWMjgwXzVDNjMsCVJWMjgwLAlDSElQX0hBU19DUlRDMiB8IENISVBfSVNfTU9CSUxJVFkpLAorCS8qTW9iaWxpdHkgWHByZXNzIDIwMCAqLworCUNISVBfREVGKFBDSV9DSElQX1JTNDg1XzU5NzUsCVIzMDAsCUNISVBfSEFTX0NSVEMyIHwgQ0hJUF9JU19JR1AgfCBDSElQX0lTX01PQklMSVRZKSwKIAkvKiA5MjAwICovCiAJQ0hJUF9ERUYoUENJX0NISVBfUlYyODBfNTk2MCwJUlYyODAsCUNISVBfSEFTX0NSVEMyKSwKIAlDSElQX0RFRihQQ0lfQ0hJUF9SVjI4MF81OTYxLAlSVjI4MCwJQ0hJUF9IQVNfQ1JUQzIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaCBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKaW5kZXggN2ViZmZjZC4uN2M5MjJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCkBAIC0zMDEsNyArMzAxLDcgQEAKIAl2b2lkIF9faW9tZW0JCSpiaW9zX3NlZzsKIAlpbnQJCQlmcF9iaW9zX3N0YXJ0OwogCi0JdTMyCQkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJCXBzZXVkb19wYWxldHRlWzE2XTsKIAlzdHJ1Y3QgeyB1OCByZWQsIGdyZWVuLCBibHVlLCBwYWQ7IH0KIAkJCQlwYWxldHRlWzI1Nl07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKaW5kZXggZDNiOGE2Yi4uNDk2NDM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKQEAgLTExOCw2ICsxMTgsMjIgQEAKIAloZWxwCiAJICBMb3ctbGV2ZWwgZnJhbWVidWZmZXItYmFzZWQgY29uc29sZSBkcml2ZXIuCiAKK2NvbmZpZyBGUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZCisgICAgICAgYm9vbCAiTWFwIHRoZSBjb25zb2xlIHRvIHRoZSBwcmltYXJ5IGRpc3BsYXkgZGV2aWNlIgorICAgICAgIGRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQorICAgICAgIGRlZmF1bHQgbgorICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkLCB0aGUgZnJhbWVidWZmZXIgY29uc29sZSB3aWxsCisgICAgICAgICBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgcHJpbWFyeSBkaXNwbGF5IGRldmljZSAoaWYgdGhlIGFyY2hpdGVjdHVyZQorCSBzdXBwb3J0cyB0aGlzIGZlYXR1cmUpLiAgT3RoZXJ3aXNlLCB0aGUgZnJhbWVidWZmZXIgY29uc29sZSB3aWxsCisgICAgICAgICBhbHdheXMgc2VsZWN0IHRoZSBmaXJzdCBmcmFtZWJ1ZmZlciBkcml2ZXIgdGhhdCBpcyBsb2FkZWQuIFRoZSBsYXR0ZXIKKyAgICAgICAgIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgorCisJIFlvdSBjYW4gYWx3YXlzIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIHRoZSBwcmltYXJ5IGRldmljZQorCSBieSB1c2luZyB0aGUgZmJjb249bWFwOiBib290IG9wdGlvbi4KKworCSBJZiB1bnN1cmUsIHNlbGVjdCBuLgorCiBjb25maWcgRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTgogICAgICAgIGJvb2wgIkZyYW1lYnVmZmVyIENvbnNvbGUgUm90YXRpb24iCiAgICAgICAgZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCmluZGV4IDczODEzYzYuLmRlY2ZkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCkBAIC03NSw2ICs3NSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+IC8qIEZvciBjb3VudGluZyBmb250IGNoZWNrc3VtcyAqLworI2luY2x1ZGUgPGFzbS9mYi5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTEyNSw2ICsxMjYsOCBAQAogc3RhdGljIGludCBsYXN0X2ZiX3ZjID0gTUFYX05SX0NPTlNPTEVTIC0gMTsKIHN0YXRpYyBpbnQgZmJjb25faXNfZGVmYXVsdCA9IDE7IAogc3RhdGljIGludCBmYmNvbl9oYXNfZXhpdGVkOworc3RhdGljIGludCBwcmltYXJ5X2RldmljZSA9IC0xOworc3RhdGljIGludCBtYXBfb3ZlcnJpZGU7CiAKIC8qIGZvbnQgZGF0YSAqLwogc3RhdGljIGNoYXIgZm9udG5hbWVbNDBdOwpAQCAtMTUyLDYgKzE1NSw3IEBACiAjZGVmaW5lIERFRkFVTFRfQ1VSU09SX0JMSU5LX1JBVEUJKDIwKQogCiBzdGF0aWMgaW50IHZibF9jdXJzb3JfY250Oworc3RhdGljIGludCBmYmNvbl9jdXJzb3Jfbm9ibGluazsKIAogI2RlZmluZSBkaXZpZGVzKGEsIGIpCSgoIShhKSB8fCAoYiklKGEpKSA/IDAgOiAxKQogCkBAIC0xODgsMTYgKzE5MiwxNCBAQAogc3RhdGljIHZvaWQgZmJjb25fYm1vdmVfcmVjKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGRpc3BsYXkgKnAsIGludCBzeSwgaW50IHN4LAogCQkJICAgIGludCBkeSwgaW50IGR4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIHVfaW50IHlfYnJlYWspOwogc3RhdGljIHZvaWQgZmJjb25fc2V0X2Rpc3Aoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgc3RydWN0IHZjX2RhdGEgKnZjKTsKLXN0YXRpYyB2b2lkIGZiY29uX3ByZXNldF9kaXNwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCSAgICAgIGludCB1bml0KTsKKwkJCSAgIGludCB1bml0KTsKIHN0YXRpYyB2b2lkIGZiY29uX3JlZHJhd19tb3ZlKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGRpc3BsYXkgKnAsCiAJCQkgICAgICBpbnQgbGluZSwgaW50IGNvdW50LCBpbnQgZHkpOwogc3RhdGljIHZvaWQgZmJjb25fbW9kZWNoYW5nZWQoc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIHZvaWQgZmJjb25fc2V0X2FsbF92Y3Moc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIHZvaWQgZmJjb25fc3RhcnQodm9pZCk7CiBzdGF0aWMgdm9pZCBmYmNvbl9leGl0KHZvaWQpOwotc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2UgKmZiY29uX2NsYXNzX2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpmYmNvbl9kZXZpY2U7CiAKICNpZmRlZiBDT05GSUdfTUFDCiAvKgpAQCAtNDQxLDcgKzQ0Myw4IEBACiAJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCiAJaWYgKCghaW5mby0+cXVldWUuZnVuYyB8fCBpbmZvLT5xdWV1ZS5mdW5jID09IGZiX2ZsYXNoY3Vyc29yKSAmJgotCSAgICAhKG9wcy0+ZmxhZ3MgJiBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVIpKSB7CisJICAgICEob3BzLT5mbGFncyAmIEZCQ09OX0ZMQUdTX0NVUlNPUl9USU1FUikgJiYKKwkgICAgIWZiY29uX2N1cnNvcl9ub2JsaW5rKSB7CiAJCWlmICghaW5mby0+cXVldWUuZnVuYykKIAkJCUlOSVRfV09SSygmaW5mby0+cXVldWUsIGZiX2ZsYXNoY3Vyc29yKTsKIApAQCAtNDk1LDEzICs0OTgsMTcgQEAKIAkJCiAJCWlmICghc3RybmNtcChvcHRpb25zLCAibWFwOiIsIDQpKSB7CiAJCQlvcHRpb25zICs9IDQ7Ci0JCQlpZiAoKm9wdGlvbnMpCisJCQlpZiAoKm9wdGlvbnMpIHsKIAkJCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CiAJCQkJCWlmICghb3B0aW9uc1tqXSkKIAkJCQkJCWogPSAwOwogCQkJCQljb24yZmJfbWFwX2Jvb3RbaV0gPQogCQkJCQkJKG9wdGlvbnNbaisrXS0nMCcpICUgRkJfTUFYOwogCQkJCX0KKworCQkJCW1hcF9vdmVycmlkZSA9IDE7CisJCQl9CisKIAkJCXJldHVybiAxOwogCQl9CiAKQEAgLTczNiw3ICs3NDMsOSBAQAogCiAJaWYgKCFlcnIpIHsKIAkJaW5mby0+ZmJjb25fcGFyID0gb3BzOwotCQlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CisKKwkJaWYgKHZjKQorCQkJc2V0X2JsaXR0aW5nX3R5cGUodmMsIGluZm8pOwogCX0KIAogCWlmIChlcnIpIHsKQEAgLTc5OCwxMSArODA3LDcgQEAKIAogCW9wcy0+ZmxhZ3MgfD0gRkJDT05fRkxBR1NfSU5JVDsKIAlvcHMtPmdyYXBoaWNzID0gMDsKLQotCWlmICh2YykKLQkJZmJjb25fc2V0X2Rpc3AoaW5mbywgJmluZm8tPnZhciwgdmMpOwotCWVsc2UKLQkJZmJjb25fcHJlc2V0X2Rpc3AoaW5mbywgJmluZm8tPnZhciwgdW5pdCk7CisJZmJjb25fc2V0X2Rpc3AoaW5mbywgJmluZm8tPnZhciwgdW5pdCk7CiAKIAlpZiAoc2hvd19sb2dvKSB7CiAJCXN0cnVjdCB2Y19kYXRhICpmZ192YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKQEAgLTExMDcsNiArMTExMiw5IEBACiAJaWYgKHZhcl90b19kaXNwbGF5KHAsICZpbmZvLT52YXIsIGluZm8pKQogCQlyZXR1cm47CiAKKwlpZiAoIWluZm8tPmZiY29uX3BhcikKKwkJY29uMmZiX2FjcXVpcmVfbmV3aW5mbyh2YywgaW5mbywgdmMtPnZjX251bSwgLTEpOworCiAJLyogSWYgd2UgYXJlIG5vdCB0aGUgZmlyc3QgY29uc29sZSBvbiB0aGlzCiAJICAgZmIsIGNvcHkgdGhlIGZvbnQgZnJvbSB0aGF0IGNvbnNvbGUgKi8KIAl0ID0gJmZiX2Rpc3BsYXlbZmdfY29uc29sZV07CkBAIC0xMzQ5LDYgKzEzNTcsMTEgQEAKIAlpZiAoZmJjb25faXNfaW5hY3RpdmUodmMsIGluZm8pIHx8IHZjLT52Y19kZWNjbSAhPSAxKQogCQlyZXR1cm47CiAKKwlpZiAodmMtPnZjX2N1cnNvcl90eXBlICYgMHgxMCkKKwkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihpbmZvKTsKKwllbHNlCisJCWZiY29uX2FkZF9jdXJzb3JfdGltZXIoaW5mbyk7CisKIAlvcHMtPmN1cnNvcl9mbGFzaCA9IChtb2RlID09IENNX0VSQVNFKSA/IDAgOiAxOwogCWlmIChtb2RlICYgQ01fU09GVEJBQ0spIHsKIAkJbW9kZSAmPSB+Q01fU09GVEJBQ0s7CkBAIC0xMzY4LDM2ICsxMzgxLDI5IEBACiBzdGF0aWMgaW50IHNjcm9sbGJhY2tfbWF4ID0gMDsKIHN0YXRpYyBpbnQgc2Nyb2xsYmFja19jdXJyZW50ID0gMDsKIAotLyoKLSAqIElmIG5vIHZjIGlzIGV4aXN0ZW50IHlldCwganVzdCBzZXQgc3RydWN0IGRpc3BsYXkKLSAqLwotc3RhdGljIHZvaWQgZmJjb25fcHJlc2V0X2Rpc3Aoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgICAgaW50IHVuaXQpCi17Ci0Jc3RydWN0IGRpc3BsYXkgKnAgPSAmZmJfZGlzcGxheVt1bml0XTsKLQlzdHJ1Y3QgZGlzcGxheSAqdCA9ICZmYl9kaXNwbGF5W2ZnX2NvbnNvbGVdOwotCi0JaWYgKHZhcl90b19kaXNwbGF5KHAsIHZhciwgaW5mbykpCi0JCXJldHVybjsKLQotCXAtPmZvbnRkYXRhID0gdC0+Zm9udGRhdGE7Ci0JcC0+dXNlcmZvbnQgPSB0LT51c2VyZm9udDsKLQlpZiAocC0+dXNlcmZvbnQpCi0JCVJFRkNPVU5UKHAtPmZvbnRkYXRhKSsrOwotfQotCiBzdGF0aWMgdm9pZCBmYmNvbl9zZXRfZGlzcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICBzdHJ1Y3QgdmNfZGF0YSAqdmMpCisJCQkgICBpbnQgdW5pdCkKIHsKLQlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dLCAqdDsKLQlzdHJ1Y3QgdmNfZGF0YSAqKmRlZmF1bHRfbW9kZSA9IHZjLT52Y19kaXNwbGF5X2ZnOwotCXN0cnVjdCB2Y19kYXRhICpzdmMgPSAqZGVmYXVsdF9tb2RlOworCXN0cnVjdCBkaXNwbGF5ICpwLCAqdDsKKwlzdHJ1Y3QgdmNfZGF0YSAqKmRlZmF1bHRfbW9kZSwgKnZjOworCXN0cnVjdCB2Y19kYXRhICpzdmM7CiAJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCWludCByb3dzLCBjb2xzLCBjaGFyY250ID0gMjU2OwogCisJcCA9ICZmYl9kaXNwbGF5W3VuaXRdOworCiAJaWYgKHZhcl90b19kaXNwbGF5KHAsIHZhciwgaW5mbykpCiAJCXJldHVybjsKKworCXZjID0gdmNfY29uc1t1bml0XS5kOworCisJaWYgKCF2YykKKwkJcmV0dXJuOworCisJZGVmYXVsdF9tb2RlID0gdmMtPnZjX2Rpc3BsYXlfZmc7CisJc3ZjID0gKmRlZmF1bHRfbW9kZTsKIAl0ID0gJmZiX2Rpc3BsYXlbc3ZjLT52Y19udW1dOworCiAJaWYgKCF2Yy0+dmNfZm9udC5kYXRhKSB7CiAJCXZjLT52Y19mb250LmRhdGEgPSAodm9pZCAqKShwLT5mb250ZGF0YSA9IHQtPmZvbnRkYXRhKTsKIAkJdmMtPnZjX2ZvbnQud2lkdGggPSAoKmRlZmF1bHRfbW9kZSktPnZjX2ZvbnQud2lkdGg7CkBAIC0xNzA0LDYgKzE3MTAsNTYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGZiY29uX3JlZHJhd19ibGl0KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IGxpbmUsIGludCBjb3VudCwgaW50IHljb3VudCkKK3sKKwlpbnQgb2Zmc2V0ID0geWNvdW50ICogdmMtPnZjX2NvbHM7CisJdW5zaWduZWQgc2hvcnQgKmQgPSAodW5zaWduZWQgc2hvcnQgKikKKwkgICAgKHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfc2l6ZV9yb3cgKiBsaW5lKTsKKwl1bnNpZ25lZCBzaG9ydCAqcyA9IGQgKyBvZmZzZXQ7CisJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJdW5zaWduZWQgc2hvcnQgKnN0YXJ0ID0gczsKKwkJdW5zaWduZWQgc2hvcnQgKmxlID0gYWR2YW5jZV9yb3cocywgMSk7CisJCXVuc2lnbmVkIHNob3J0IGM7CisJCWludCB4ID0gMDsKKworCQlkbyB7CisJCQljID0gc2NyX3JlYWR3KHMpOworCisJCQlpZiAoYyA9PSBzY3JfcmVhZHcoZCkpIHsKKwkJCQlpZiAocyA+IHN0YXJ0KSB7CisJCQkJCW9wcy0+Ym1vdmUodmMsIGluZm8sIGxpbmUgKyB5Y291bnQsIHgsCisJCQkJCQkgICBsaW5lLCB4LCAxLCBzLXN0YXJ0KTsKKwkJCQkJeCArPSBzIC0gc3RhcnQgKyAxOworCQkJCQlzdGFydCA9IHMgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCXgrKzsKKwkJCQkJc3RhcnQrKzsKKwkJCQl9CisJCQl9CisKKwkJCXNjcl93cml0ZXcoYywgZCk7CisJCQljb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKCk7CisJCQlzKys7CisJCQlkKys7CisJCX0gd2hpbGUgKHMgPCBsZSk7CisJCWlmIChzID4gc3RhcnQpCisJCQlvcHMtPmJtb3ZlKHZjLCBpbmZvLCBsaW5lICsgeWNvdW50LCB4LCBsaW5lLCB4LCAxLAorCQkJCSAgIHMtc3RhcnQpOworCQljb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKCk7CisJCWlmICh5Y291bnQgPiAwKQorCQkJbGluZSsrOworCQllbHNlIHsKKwkJCWxpbmUtLTsKKwkJCS8qIE5PVEU6IFdlIHN1YnRyYWN0IHR3byBsaW5lcyBmcm9tIHRoZXNlIHBvaW50ZXJzICovCisJCQlzIC09IHZjLT52Y19zaXplX3JvdzsKKwkJCWQgLT0gdmMtPnZjX3NpemVfcm93OworCQl9CisJfQorfQorCiBzdGF0aWMgdm9pZCBmYmNvbl9yZWRyYXcoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZGlzcGxheSAqcCwKIAkJCSBpbnQgbGluZSwgaW50IGNvdW50LCBpbnQgb2Zmc2V0KQogewpAQCAtMTc4OSw3ICsxODQ1LDYgQEAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHJlZ2lzdGVyZWRfZmJbY29uMmZiX21hcFt2Yy0+dmNfbnVtXV07CiAJc3RydWN0IGRpc3BsYXkgKnAgPSAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXTsKLQlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAJaW50IHNjcm9sbF9wYXJ0aWFsID0gaW5mby0+ZmxhZ3MgJiBGQklORk9fUEFSVElBTF9QQU5fT0s7CiAKIAlpZiAoZmJjb25faXNfaW5hY3RpdmUodmMsIGluZm8pKQpAQCAtMTgxMywxMCArMTg2OCwxNSBAQAogCQkJZ290byByZWRyYXdfdXA7CiAJCXN3aXRjaCAocC0+c2Nyb2xsbW9kZSkgewogCQljYXNlIFNDUk9MTF9NT1ZFOgotCQkJb3BzLT5ibW92ZSh2YywgaW5mbywgdCArIGNvdW50LCAwLCB0LCAwLAotCQkJCSAgICBiIC0gdCAtIGNvdW50LCB2Yy0+dmNfY29scyk7Ci0JCQlvcHMtPmNsZWFyKHZjLCBpbmZvLCBiIC0gY291bnQsIDAsIGNvdW50LAotCQkJCSAgdmMtPnZjX2NvbHMpOworCQkJZmJjb25fcmVkcmF3X2JsaXQodmMsIGluZm8sIHAsIHQsIGIgLSB0IC0gY291bnQsCisJCQkJICAgICBjb3VudCk7CisJCQlmYmNvbl9jbGVhcih2YywgYiAtIGNvdW50LCAwLCBjb3VudCwgdmMtPnZjX2NvbHMpOworCQkJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopICh2Yy0+dmNfb3JpZ2luICsKKwkJCQkJCQl2Yy0+dmNfc2l6ZV9yb3cgKgorCQkJCQkJCShiIC0gY291bnQpKSwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCisJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKKwkJCXJldHVybiAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1JPTExfV1JBUF9NT1ZFOgpAQCAtMTg5OSw5ICsxOTU5LDE1IEBACiAJCQlnb3RvIHJlZHJhd19kb3duOwogCQlzd2l0Y2ggKHAtPnNjcm9sbG1vZGUpIHsKIAkJY2FzZSBTQ1JPTExfTU9WRToKLQkJCW9wcy0+Ym1vdmUodmMsIGluZm8sIHQsIDAsIHQgKyBjb3VudCwgMCwKLQkJCQkgICAgYiAtIHQgLSBjb3VudCwgdmMtPnZjX2NvbHMpOwotCQkJb3BzLT5jbGVhcih2YywgaW5mbywgdCwgMCwgY291bnQsIHZjLT52Y19jb2xzKTsKKwkJCWZiY29uX3JlZHJhd19ibGl0KHZjLCBpbmZvLCBwLCBiIC0gMSwgYiAtIHQgLSBjb3VudCwKKwkJCQkgICAgIC1jb3VudCk7CisJCQlmYmNvbl9jbGVhcih2YywgdCwgMCwgY291bnQsIHZjLT52Y19jb2xzKTsKKwkJCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKSAodmMtPnZjX29yaWdpbiArCisJCQkJCQkJdmMtPnZjX3NpemVfcm93ICoKKwkJCQkJCQl0KSwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCisJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKKwkJCXJldHVybiAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1JPTExfV1JBUF9NT1ZFOgpAQCAtMjkzNyw5ICszMDAzLDQ4IEBACiAJcmV0dXJuIGZvdW5kOwogfQogCi1zdGF0aWMgaW50IGZiY29uX2ZiX3VucmVnaXN0ZXJlZChpbnQgaWR4KQorI2lmZGVmIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcKK3N0YXRpYyBpbnQgZmJjb25fdW5iaW5kKHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IHJldDsKKworCXJldCA9IHVuYmluZF9jb25fZHJpdmVyKCZmYl9jb24sIGZpcnN0X2ZiX3ZjLCBsYXN0X2ZiX3ZjLAorCQkJCWZiY29uX2lzX2RlZmF1bHQpOworCXJldHVybiByZXQ7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZmJjb25fdW5iaW5kKHZvaWQpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYgLyogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyAqLworCitzdGF0aWMgaW50IGZiY29uX2ZiX3VuYmluZChpbnQgaWR4KQoreworCWludCBpLCBuZXdfaWR4ID0gLTEsIHJldCA9IDA7CisKKwlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKKwkJaWYgKGNvbjJmYl9tYXBbaV0gIT0gaWR4ICYmCisJCSAgICBjb24yZmJfbWFwW2ldICE9IC0xKSB7CisJCQluZXdfaWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG5ld19pZHggIT0gLTEpIHsKKwkJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CisJCQlpZiAoY29uMmZiX21hcFtpXSA9PSBpZHgpCisJCQkJc2V0X2NvbjJmYl9tYXAoaSwgbmV3X2lkeCwgMCk7CisJCX0KKwl9IGVsc2UKKwkJcmV0ID0gZmJjb25fdW5iaW5kKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZiY29uX2ZiX3VucmVnaXN0ZXJlZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgaSwgaWR4ID0gaW5mby0+bm9kZTsKIAogCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgewogCQlpZiAoY29uMmZiX21hcFtpXSA9PSBpZHgpCkBAIC0yOTY3LDEyICszMDcyLDQ4IEBACiAJaWYgKCFudW1fcmVnaXN0ZXJlZF9mYikKIAkJdW5yZWdpc3Rlcl9jb25fZHJpdmVyKCZmYl9jb24pOwogCisKKwlpZiAocHJpbWFyeV9kZXZpY2UgPT0gaWR4KQorCQlwcmltYXJ5X2RldmljZSA9IC0xOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmJjb25fZmJfcmVnaXN0ZXJlZChpbnQgaWR4KQorI2lmZGVmIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZCitzdGF0aWMgdm9pZCBmYmNvbl9zZWxlY3RfcHJpbWFyeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlpbnQgcmV0ID0gMCwgaTsKKwlpZiAoIW1hcF9vdmVycmlkZSAmJiBwcmltYXJ5X2RldmljZSA9PSAtMSAmJgorCSAgICBmYl9pc19wcmltYXJ5X2RldmljZShpbmZvKSkgeworCQlpbnQgaTsKKworCQlwcmludGsoS0VSTl9JTkZPICJmYmNvbjogJXMgKGZiJWkpIGlzIHByaW1hcnkgZGV2aWNlXG4iLAorCQkgICAgICAgaW5mby0+Zml4LmlkLCBpbmZvLT5ub2RlKTsKKwkJcHJpbWFyeV9kZXZpY2UgPSBpbmZvLT5ub2RlOworCisJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykKKwkJCWNvbjJmYl9tYXBfYm9vdFtpXSA9IHByaW1hcnlfZGV2aWNlOworCisJCWlmIChjb25faXNfYm91bmQoJmZiX2NvbikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImZiY29uOiBSZW1hcHBpbmcgcHJpbWFyeSBkZXZpY2UsICIKKwkJCSAgICAgICAiZmIlaSwgdG8gdHR5ICVpLSVpXG4iLCBpbmZvLT5ub2RlLAorCQkJICAgICAgIGZpcnN0X2ZiX3ZjICsgMSwgbGFzdF9mYl92YyArIDEpOworCQkJaW5mb19pZHggPSBwcmltYXJ5X2RldmljZTsKKwkJfQorCX0KKworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYmNvbl9zZWxlY3RfcHJpbWFyeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX0ZSQU1FQlVGRkVSX0RFVEVDVF9QUklNQVJZICovCisKK3N0YXRpYyBpbnQgZmJjb25fZmJfcmVnaXN0ZXJlZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMCwgaSwgaWR4ID0gaW5mby0+bm9kZTsKKworCWZiY29uX3NlbGVjdF9wcmltYXJ5KGluZm8pOwogCiAJaWYgKGluZm9faWR4ID09IC0xKSB7CiAJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgewpAQCAtMjk4Niw4ICszMTI3LDcgQEAKIAkJCXJldCA9IGZiY29uX3Rha2VvdmVyKDEpOwogCX0gZWxzZSB7CiAJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgewotCQkJaWYgKGNvbjJmYl9tYXBfYm9vdFtpXSA9PSBpZHggJiYKLQkJCSAgICBjb24yZmJfbWFwW2ldID09IC0xKQorCQkJaWYgKGNvbjJmYl9tYXBfYm9vdFtpXSA9PSBpZHgpCiAJCQkJc2V0X2NvbjJmYl9tYXAoaSwgaWR4LCAwKTsKIAkJfQogCX0KQEAgLTMwMzQsMTIgKzMxNzQsNyBAQAogCQltb2RlID0gZmJfZmluZF9uZWFyZXN0X21vZGUoZmJfZGlzcGxheVtpXS5tb2RlLAogCQkJCQkgICAgJmluZm8tPm1vZGVsaXN0KTsKIAkJZmJfdmlkZW9tb2RlX3RvX3ZhcigmdmFyLCBtb2RlKTsKLQotCQlpZiAodmMpCi0JCQlmYmNvbl9zZXRfZGlzcChpbmZvLCAmdmFyLCB2Yyk7Ci0JCWVsc2UKLQkJCWZiY29uX3ByZXNldF9kaXNwKGluZm8sICZ2YXIsIGkpOwotCisJCWZiY29uX3NldF9kaXNwKGluZm8sICZ2YXIsIHZjLT52Y19udW0pOwogCX0KIH0KIApAQCAtMzExNCwxMSArMzI0OSwxNCBAQAogCQltb2RlID0gZXZlbnQtPmRhdGE7CiAJCXJldCA9IGZiY29uX21vZGVfZGVsZXRlZChpbmZvLCBtb2RlKTsKIAkJYnJlYWs7CisJY2FzZSBGQl9FVkVOVF9GQl9VTkJJTkQ6CisJCXJldCA9IGZiY29uX2ZiX3VuYmluZChpbmZvLT5ub2RlKTsKKwkJYnJlYWs7CiAJY2FzZSBGQl9FVkVOVF9GQl9SRUdJU1RFUkVEOgotCQlyZXQgPSBmYmNvbl9mYl9yZWdpc3RlcmVkKGluZm8tPm5vZGUpOworCQlyZXQgPSBmYmNvbl9mYl9yZWdpc3RlcmVkKGluZm8pOwogCQlicmVhazsKIAljYXNlIEZCX0VWRU5UX0ZCX1VOUkVHSVNURVJFRDoKLQkJcmV0ID0gZmJjb25fZmJfdW5yZWdpc3RlcmVkKGluZm8tPm5vZGUpOworCQlyZXQgPSBmYmNvbl9mYl91bnJlZ2lzdGVyZWQoaW5mbyk7CiAJCWJyZWFrOwogCWNhc2UgRkJfRVZFTlRfU0VUX0NPTlNPTEVfTUFQOgogCQljb24yZmIgPSBldmVudC0+ZGF0YTsKQEAgLTMxNzksOCArMzMxNyw5IEBACiAJLm5vdGlmaWVyX2NhbGwJPSBmYmNvbl9ldmVudF9ub3RpZnksCiB9OwogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfcm90YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgcm90YXRlLCBpZHg7CkBAIC0zMjAzLDggKzMzNDIsOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfcm90YXRlX2FsbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGVfYWxsKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCByb3RhdGUsIGlkeDsKQEAgLTMyMjcsNyArMzM2Nyw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfcm90YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgcm90YXRlID0gMCwgaWR4OwpAQCAtMzI0OCwyMCArMzM4OSw4NiBAQAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCByb3RhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJzW10gPSB7CitzdGF0aWMgc3NpemVfdCBzaG93X2N1cnNvcl9ibGluayhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGZiY29uX29wcyAqb3BzOworCWludCBpZHgsIGJsaW5rID0gLTE7CisKKwlpZiAoZmJjb25faGFzX2V4aXRlZCkKKwkJcmV0dXJuIDA7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWR4ID0gY29uMmZiX21hcFtmZ19jb25zb2xlXTsKKworCWlmIChpZHggPT0gLTEgfHwgcmVnaXN0ZXJlZF9mYltpZHhdID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbaWR4XTsKKwlvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CisKKwlpZiAoIW9wcykKKwkJZ290byBlcnI7CisKKwlibGluayA9IChvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSKSA/IDEgOiAwOworZXJyOgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgYmxpbmspOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9jdXJzb3JfYmxpbmsoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlpbnQgYmxpbmssIGlkeDsKKwljaGFyICoqbGFzdCA9IE5VTEw7CisKKwlpZiAoZmJjb25faGFzX2V4aXRlZCkKKwkJcmV0dXJuIGNvdW50OworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWlkeCA9IGNvbjJmYl9tYXBbZmdfY29uc29sZV07CisKKwlpZiAoaWR4ID09IC0xIHx8IHJlZ2lzdGVyZWRfZmJbaWR4XSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCWluZm8gPSByZWdpc3RlcmVkX2ZiW2lkeF07CisKKwlpZiAoIWluZm8tPmZiY29uX3BhcikKKwkJZ290byBlcnI7CisKKwlibGluayA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgbGFzdCwgMCk7CisKKwlpZiAoYmxpbmspIHsKKwkJZmJjb25fY3Vyc29yX25vYmxpbmsgPSAwOworCQlmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKGluZm8pOworCX0gZWxzZSB7CisJCWZiY29uX2N1cnNvcl9ub2JsaW5rID0gMTsKKwkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihpbmZvKTsKKwl9CisKK2VycjoKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2aWNlX2F0dHJzW10gPSB7CiAJX19BVFRSKHJvdGF0ZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3JvdGF0ZSwgc3RvcmVfcm90YXRlKSwKIAlfX0FUVFIocm90YXRlX2FsbCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfcm90YXRlX2FsbCksCisJX19BVFRSKGN1cnNvcl9ibGluaywgU19JUlVHT3xTX0lXVVNSLCBzaG93X2N1cnNvcl9ibGluaywKKwkgICAgICAgc3RvcmVfY3Vyc29yX2JsaW5rKSwKIH07CiAKLXN0YXRpYyBpbnQgZmJjb25faW5pdF9jbGFzc19kZXZpY2Uodm9pZCkKK3N0YXRpYyBpbnQgZmJjb25faW5pdF9kZXZpY2Uodm9pZCkKIHsKIAlpbnQgaSwgZXJyb3IgPSAwOwogCiAJZmJjb25faGFzX3N5c2ZzID0gMTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykgewotCQllcnJvciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShmYmNvbl9jbGFzc19kZXZpY2UsCi0JCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlX2F0dHJzKTsgaSsrKSB7CisJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiY29uX2RldmljZSwgJmRldmljZV9hdHRyc1tpXSk7CiAKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CkBAIC0zMjY5LDggKzM0NzYsNyBAQAogCiAJaWYgKGVycm9yKSB7CiAJCXdoaWxlICgtLWkgPj0gMCkKLQkJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShmYmNvbl9jbGFzc19kZXZpY2UsCi0JCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJjb25fZGV2aWNlLCAmZGV2aWNlX2F0dHJzW2ldKTsKIAogCQlmYmNvbl9oYXNfc3lzZnMgPSAwOwogCX0KQEAgLTMzNTYsMTYgKzM1NjIsMTUgQEAKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKIAlmYl9yZWdpc3Rlcl9jbGllbnQoJmZiY29uX2V2ZW50X25vdGlmaWVyKTsKLQlmYmNvbl9jbGFzc19kZXZpY2UgPQotCSAgICBjbGFzc19kZXZpY2VfY3JlYXRlKGZiX2NsYXNzLCBOVUxMLCBNS0RFVigwLCAwKSwgTlVMTCwgImZiY29uIik7CisJZmJjb25fZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShmYl9jbGFzcywgTlVMTCwgTUtERVYoMCwgMCksICJmYmNvbiIpOwogCi0JaWYgKElTX0VSUihmYmNvbl9jbGFzc19kZXZpY2UpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgY2xhc3NfZGV2aWNlICIKKwlpZiAoSVNfRVJSKGZiY29uX2RldmljZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBkZXZpY2UgIgogCQkgICAgICAgImZvciBmYmNvbjsgZXJybm8gPSAlbGRcbiIsCi0JCSAgICAgICBQVFJfRVJSKGZiY29uX2NsYXNzX2RldmljZSkpOwotCQlmYmNvbl9jbGFzc19kZXZpY2UgPSBOVUxMOworCQkgICAgICAgUFRSX0VSUihmYmNvbl9kZXZpY2UpKTsKKwkJZmJjb25fZGV2aWNlID0gTlVMTDsKIAl9IGVsc2UKLQkJZmJjb25faW5pdF9jbGFzc19kZXZpY2UoKTsKKwkJZmJjb25faW5pdF9kZXZpY2UoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykKIAkJY29uMmZiX21hcFtpXSA9IC0xOwpAQCAtMzM3OSwxNCArMzU4NCwxMyBAQAogCiAjaWZkZWYgTU9EVUxFCiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBmYmNvbl9kZWluaXRfY2xhc3NfZGV2aWNlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZmJjb25fZGVpbml0X2RldmljZSh2b2lkKQogewogCWludCBpOwogCiAJaWYgKGZiY29uX2hhc19zeXNmcykgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspCi0JCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoZmJjb25fY2xhc3NfZGV2aWNlLAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJjb25fZGV2aWNlLCAmZGV2aWNlX2F0dHJzW2ldKTsKIAogCQlmYmNvbl9oYXNfc3lzZnMgPSAwOwogCX0KQEAgLTMzOTYsOCArMzYwMCw4IEBACiB7CiAJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCWZiX3VucmVnaXN0ZXJfY2xpZW50KCZmYmNvbl9ldmVudF9ub3RpZmllcik7Ci0JZmJjb25fZGVpbml0X2NsYXNzX2RldmljZSgpOwotCWNsYXNzX2RldmljZV9kZXN0cm95KGZiX2NsYXNzLCBNS0RFVigwLCAwKSk7CisJZmJjb25fZGVpbml0X2RldmljZSgpOworCWRldmljZV9kZXN0cm95KGZiX2NsYXNzLCBNS0RFVigwLCAwKSk7CiAJZmJjb25fZXhpdCgpOwogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIAl1bnJlZ2lzdGVyX2Nvbl9kcml2ZXIoJmZiX2Nvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwppbmRleCA4Yjc2MjczLi5iMGJlN2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKQEAgLTk0LDcgKzk0LDcgQEAKIHN0cnVjdCBmYl9pbmZvX2NvbnRyb2wgewogCXN0cnVjdCBmYl9pbmZvCQlpbmZvOwogCXN0cnVjdCBmYl9wYXJfY29udHJvbAlwYXI7Ci0JdTMyCQkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJCXBzZXVkb19wYWxldHRlWzE2XTsKIAkJCiAJc3RydWN0IGNtYXBfcmVncwlfX2lvbWVtICpjbWFwX3JlZ3M7CiAJdW5zaWduZWQgbG9uZwkJY21hcF9yZWdzX3BoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2N5YmxhZmIuYyBiL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCmluZGV4IDk0YTY2YzIuLmUyMzMyNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCkBAIC0xMDY4LDE1ICsxMDY4LDE4IEBACiAJCW91dDgoMHgzQzksIGdyZWVuID4+IDEwKTsKIAkJb3V0OCgweDNDOSwgYmx1ZSA+PiAxMCk7CiAKLQl9IGVsc2UgaWYgKGJwcCA9PSAxNikJLy8gUkdCIDU2NQotCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KLQkJICAgIChyZWQgJiAweEY4MDApIHwKLQkJICAgICgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwgKChibHVlICYgMHhGODAwKSA+PiAxMSk7Ci0JZWxzZSBpZiAoYnBwID09IDMyKQkvLyBBUkdCIDg4ODgKLQkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9Ci0JCSAgICAoKHRyYW5zcCAmIDB4RkYwMCkgPDwgMTYpIHwKLQkJICAgICgocmVkICYgMHhGRjAwKSA8PCA4KSB8Ci0JCSAgICAoKGdyZWVuICYgMHhGRjAwKSkgfCAoKGJsdWUgJiAweEZGMDApID4+IDgpOworCX0gZWxzZSBpZiAocmVnbm8gPCAxNikgeworCQlpZiAoYnBwID09IDE2KQkvLyBSR0IgNTY1CisJCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJCQkocmVkICYgMHhGODAwKSB8CisJCQkJKChncmVlbiAmIDB4RkMwMCkgPj4gNSkgfAorCQkJCSgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOworCQllbHNlIGlmIChicHAgPT0gMzIpCS8vIEFSR0IgODg4OAorCQkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9CisJCQkJKCh0cmFuc3AgJiAweEZGMDApIDw8IDE2KSB8CisJCQkJKChyZWQgJiAweEZGMDApIDw8IDgpIHwKKwkJCQkoKGdyZWVuICYgMHhGRjAwKSkgfCAoKGJsdWUgJiAweEZGMDApID4+IDgpOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jIGIvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jCmluZGV4IGNhMmM1NGMuLjMzYmU0NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZXBzb24xMzU1ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMKQEAgLTYzLDIzICs2MywxMiBAQAogCiBzdHJ1Y3QgZXBzb24xMzU1X3BhciB7CiAJdW5zaWduZWQgbG9uZyByZWdfYWRkcjsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZkZWYgQ09ORklHX1NVUEVSSAotCi1zdGF0aWMgaW5saW5lIHU4IGVwc29uMTM1NV9yZWFkX3JlZyhpbnQgaW5kZXgpCi17Ci0JcmV0dXJuIGN0cmxfaW5iKHBhci5yZWdfYWRkciArIGluZGV4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVwc29uMTM1NV93cml0ZV9yZWcodTggZGF0YSwgaW50IGluZGV4KQotewotCWN0cmxfb3V0YihkYXRhLCBwYXIucmVnX2FkZHIgKyBpbmRleCk7Ci19Ci0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSTSkKKyNpZiBkZWZpbmVkKENPTkZJR19BUk0pCiAKICMgaWZkZWYgQ09ORklHX0FSQ0hfQ0VJVkEKICMgIGluY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CkBAIC0yODksNyArMjc4LDcgQEAKIAlzdHJ1Y3QgZXBzb24xMzU1X3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJc3dpdGNoIChibGFua19tb2RlKSB7Ci0JY2FzZSBGQl9CTEFOS19VTkJMQU5LSU5HOgorCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKIAljYXNlIEZCX0JMQU5LX05PUk1BTDoKIAkJbGNkX2VuYWJsZShwYXIsIDEpOwogCQliYWNrbGlnaHRfZW5hYmxlKDEpOwpAQCAtNjM1LDcgKzYyNCw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBlcHNvbjEzNTVfcGFyKSArIHNpemVvZih1MzIpICogMjU2LCAmZGV2LT5kZXYpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGVwc29uMTM1NV9wYXIpLCAmZGV2LT5kZXYpOwogCWlmICghaW5mbykgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYmFpbDsKQEAgLTY0OCw3ICs2MzcsNyBAQAogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYmFpbDsKIAl9Ci0JaW5mby0+cHNldWRvX3BhbGV0dGUgPSAodm9pZCAqKShkZWZhdWx0X3BhciArIDEpOworCWluZm8tPnBzZXVkb19wYWxldHRlID0gZGVmYXVsdF9wYXItPnBzZXVkb19wYWxldHRlOwogCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKEVQU09OMTM1NUZCX0ZCX1BIWVMsIEVQU09OMTM1NUZCX0ZCX0xFTik7CiAJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCmluZGV4IDM4YzJlMjUuLjIxNWFjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKQEAgLTMzLDE4ICszMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgotCi0jaWYgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChDT05GSUdfQVBVUykKLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogCisjaW5jbHVkZSA8YXNtL2ZiLmg+CisKKwogICAgIC8qCiAgICAgICogIEZyYW1lIGJ1ZmZlciBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIHNldHVwIHJvdXRpbmVzCiAgICAgICovCkBAIC00MTEsMTAgKzQwNCwxNDYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgZmJfc2hvd19sb2dvX2xpbmUoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCByb3RhdGUsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLCBpbnQgeSwKKwkJCSAgICAgdW5zaWduZWQgaW50IG4pCit7CisJdTMyICpwYWxldHRlID0gTlVMTCwgKnNhdmVkX3BzZXVkb19wYWxldHRlID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpsb2dvX25ldyA9IE5VTEwsICpsb2dvX3JvdGF0ZSA9IE5VTEw7CisJc3RydWN0IGZiX2ltYWdlIGltYWdlOworCisJLyogUmV0dXJuIGlmIHRoZSBmcmFtZSBidWZmZXIgaXMgbm90IG1hcHBlZCBvciBzdXNwZW5kZWQgKi8KKwlpZiAobG9nbyA9PSBOVUxMIHx8IGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8CisJICAgIGluZm8tPmZsYWdzICYgRkJJTkZPX01PRFVMRSkKKwkJcmV0dXJuIDA7CisKKwlpbWFnZS5kZXB0aCA9IDg7CisJaW1hZ2UuZGF0YSA9IGxvZ28tPmRhdGE7CisKKwlpZiAoZmJfbG9nby5uZWVkc19jbWFwcmVzZXQpCisJCWZiX3NldF9sb2dvY21hcChpbmZvLCBsb2dvKTsKKworCWlmIChmYl9sb2dvLm5lZWRzX3RydWVwYWxldHRlIHx8CisJICAgIGZiX2xvZ28ubmVlZHNfZGlyZWN0cGFsZXR0ZSkgeworCQlwYWxldHRlID0ga21hbGxvYygyNTYgKiA0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBhbGV0dGUgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCisJCWlmIChmYl9sb2dvLm5lZWRzX3RydWVwYWxldHRlKQorCQkJZmJfc2V0X2xvZ29fdHJ1ZXBhbGV0dGUoaW5mbywgbG9nbywgcGFsZXR0ZSk7CisJCWVsc2UKKwkJCWZiX3NldF9sb2dvX2RpcmVjdHBhbGV0dGUoaW5mbywgbG9nbywgcGFsZXR0ZSk7CisKKwkJc2F2ZWRfcHNldWRvX3BhbGV0dGUgPSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKKwkJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYWxldHRlOworCX0KKworCWlmIChmYl9sb2dvLmRlcHRoIDw9IDQpIHsKKwkJbG9nb19uZXcgPSBrbWFsbG9jKGxvZ28tPndpZHRoICogbG9nby0+aGVpZ2h0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGxvZ29fbmV3ID09IE5VTEwpIHsKKwkJCWtmcmVlKHBhbGV0dGUpOworCQkJaWYgKHNhdmVkX3BzZXVkb19wYWxldHRlKQorCQkJCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2F2ZWRfcHNldWRvX3BhbGV0dGU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpbWFnZS5kYXRhID0gbG9nb19uZXc7CisJCWZiX3NldF9sb2dvKGluZm8sIGxvZ28sIGxvZ29fbmV3LCBmYl9sb2dvLmRlcHRoKTsKKwl9CisKKwlpbWFnZS5keCA9IDA7CisJaW1hZ2UuZHkgPSB5OworCWltYWdlLndpZHRoID0gbG9nby0+d2lkdGg7CisJaW1hZ2UuaGVpZ2h0ID0gbG9nby0+aGVpZ2h0OworCisJaWYgKHJvdGF0ZSkgeworCQlsb2dvX3JvdGF0ZSA9IGttYWxsb2MobG9nby0+d2lkdGggKgorCQkJCSAgICAgIGxvZ28tPmhlaWdodCwgR0ZQX0tFUk5FTCk7CisJCWlmIChsb2dvX3JvdGF0ZSkKKwkJCWZiX3JvdGF0ZV9sb2dvKGluZm8sIGxvZ29fcm90YXRlLCAmaW1hZ2UsIHJvdGF0ZSk7CisJfQorCisJZmJfZG9fc2hvd19sb2dvKGluZm8sICZpbWFnZSwgcm90YXRlLCBuKTsKKworCWtmcmVlKHBhbGV0dGUpOworCWlmIChzYXZlZF9wc2V1ZG9fcGFsZXR0ZSAhPSBOVUxMKQorCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHNhdmVkX3BzZXVkb19wYWxldHRlOworCWtmcmVlKGxvZ29fbmV3KTsKKwlrZnJlZShsb2dvX3JvdGF0ZSk7CisJcmV0dXJuIGxvZ28tPmhlaWdodDsKK30KKworCisjaWZkZWYgQ09ORklHX0ZCX0xPR09fRVhUUkEKKworI2RlZmluZSBGQl9MT0dPX0VYX05VTV9NQVggMTAKK3N0YXRpYyBzdHJ1Y3QgbG9nb19kYXRhX2V4dHJhIHsKKwljb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbzsKKwl1bnNpZ25lZCBpbnQgbjsKK30gZmJfbG9nb19leFtGQl9MT0dPX0VYX05VTV9NQVhdOworc3RhdGljIHVuc2lnbmVkIGludCBmYl9sb2dvX2V4X251bTsKKwordm9pZCBmYl9hcHBlbmRfZXh0cmFfbG9nbyhjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywgdW5zaWduZWQgaW50IG4pCit7CisJaWYgKCFuIHx8IGZiX2xvZ29fZXhfbnVtID09IEZCX0xPR09fRVhfTlVNX01BWCkKKwkJcmV0dXJuOworCisJZmJfbG9nb19leFtmYl9sb2dvX2V4X251bV0ubG9nbyA9IGxvZ287CisJZmJfbG9nb19leFtmYl9sb2dvX2V4X251bV0ubiA9IG47CisJZmJfbG9nb19leF9udW0rKzsKK30KKworc3RhdGljIGludCBmYl9wcmVwYXJlX2V4dHJhX2xvZ29zKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJCSAgdW5zaWduZWQgaW50IHlyZXMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBGSVhNRTogbG9nb19leCBzdXBwb3J0cyBvbmx5IHRydWVjb2xvciBmYi4gKi8KKwlpZiAoaW5mby0+Zml4LnZpc3VhbCAhPSBGQl9WSVNVQUxfVFJVRUNPTE9SKQorCQlmYl9sb2dvX2V4X251bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJfbG9nb19leF9udW07IGkrKykgeworCQloZWlnaHQgKz0gZmJfbG9nb19leFtpXS5sb2dvLT5oZWlnaHQ7CisJCWlmIChoZWlnaHQgPiB5cmVzKSB7CisJCQloZWlnaHQgLT0gZmJfbG9nb19leFtpXS5sb2dvLT5oZWlnaHQ7CisJCQlmYl9sb2dvX2V4X251bSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaGVpZ2h0OworfQorCitzdGF0aWMgaW50IGZiX3Nob3dfZXh0cmFfbG9nb3Moc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB5LCBpbnQgcm90YXRlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZiX2xvZ29fZXhfbnVtOyBpKyspCisJCXkgKz0gZmJfc2hvd19sb2dvX2xpbmUoaW5mbywgcm90YXRlLAorCQkJCSAgICAgICBmYl9sb2dvX2V4W2ldLmxvZ28sIHksIGZiX2xvZ29fZXhbaV0ubik7CisKKwlyZXR1cm4geTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19GQl9MT0dPX0VYVFJBICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX3ByZXBhcmVfZXh0cmFfbG9nb3Moc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJCSB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJCQkgdW5zaWduZWQgaW50IHlyZXMpCit7CisJcmV0dXJuIGhlaWdodDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfc2hvd19leHRyYV9sb2dvcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHksIGludCByb3RhdGUpCit7CisJcmV0dXJuIHk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRkJfTE9HT19FWFRSQSAqLworCisKIGludCBmYl9wcmVwYXJlX2xvZ28oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCByb3RhdGUpCiB7CiAJaW50IGRlcHRoID0gZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpOwotCWludCB5cmVzOworCXVuc2lnbmVkIGludCB5cmVzOwogCiAJbWVtc2V0KCZmYl9sb2dvLCAwLCBzaXplb2Yoc3RydWN0IGxvZ29fZGF0YSkpOwogCkBAIC00NTYsNyArNTg1LDcgQEAKIAlpZiAoIWZiX2xvZ28ubG9nbykgewogCQlyZXR1cm4gMDsKIAl9Ci0JCisKIAlpZiAocm90YXRlID09IEZCX1JPVEFURV9VUiB8fCByb3RhdGUgPT0gRkJfUk9UQVRFX1VEKQogCQl5cmVzID0gaW5mby0+dmFyLnlyZXM7CiAJZWxzZQpAQCAtNDczLDc1ICs2MDIsMjAgQEAKIAllbHNlIGlmIChmYl9sb2dvLmxvZ28tPnR5cGUgPT0gTElOVVhfTE9HT19WR0ExNikKIAkJZmJfbG9nby5kZXB0aCA9IDQ7CiAJZWxzZQotCQlmYl9sb2dvLmRlcHRoID0gMTsJCQotCXJldHVybiBmYl9sb2dvLmxvZ28tPmhlaWdodDsKKwkJZmJfbG9nby5kZXB0aCA9IDE7CisKKwlyZXR1cm4gZmJfcHJlcGFyZV9leHRyYV9sb2dvcyhpbmZvLCBmYl9sb2dvLmxvZ28tPmhlaWdodCwgeXJlcyk7CiB9CiAKIGludCBmYl9zaG93X2xvZ28oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCByb3RhdGUpCiB7Ci0JdTMyICpwYWxldHRlID0gTlVMTCwgKnNhdmVkX3BzZXVkb19wYWxldHRlID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpsb2dvX25ldyA9IE5VTEwsICpsb2dvX3JvdGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IGZiX2ltYWdlIGltYWdlOworCWludCB5OwogCi0JLyogUmV0dXJuIGlmIHRoZSBmcmFtZSBidWZmZXIgaXMgbm90IG1hcHBlZCBvciBzdXNwZW5kZWQgKi8KLQlpZiAoZmJfbG9nby5sb2dvID09IE5VTEwgfHwgaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcgfHwKLQkgICAgaW5mby0+ZmxhZ3MgJiBGQklORk9fTU9EVUxFKQotCQlyZXR1cm4gMDsKKwl5ID0gZmJfc2hvd19sb2dvX2xpbmUoaW5mbywgcm90YXRlLCBmYl9sb2dvLmxvZ28sIDAsCisJCQkgICAgICBudW1fb25saW5lX2NwdXMoKSk7CisJeSA9IGZiX3Nob3dfZXh0cmFfbG9nb3MoaW5mbywgeSwgcm90YXRlKTsKIAotCWltYWdlLmRlcHRoID0gODsKLQlpbWFnZS5kYXRhID0gZmJfbG9nby5sb2dvLT5kYXRhOwotCi0JaWYgKGZiX2xvZ28ubmVlZHNfY21hcHJlc2V0KQotCQlmYl9zZXRfbG9nb2NtYXAoaW5mbywgZmJfbG9nby5sb2dvKTsKLQotCWlmIChmYl9sb2dvLm5lZWRzX3RydWVwYWxldHRlIHx8IAotCSAgICBmYl9sb2dvLm5lZWRzX2RpcmVjdHBhbGV0dGUpIHsKLQkJcGFsZXR0ZSA9IGttYWxsb2MoMjU2ICogNCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwYWxldHRlID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoZmJfbG9nby5uZWVkc190cnVlcGFsZXR0ZSkKLQkJCWZiX3NldF9sb2dvX3RydWVwYWxldHRlKGluZm8sIGZiX2xvZ28ubG9nbywgcGFsZXR0ZSk7Ci0JCWVsc2UKLQkJCWZiX3NldF9sb2dvX2RpcmVjdHBhbGV0dGUoaW5mbywgZmJfbG9nby5sb2dvLCBwYWxldHRlKTsKLQotCQlzYXZlZF9wc2V1ZG9fcGFsZXR0ZSA9IGluZm8tPnBzZXVkb19wYWxldHRlOwotCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhbGV0dGU7Ci0JfQotCi0JaWYgKGZiX2xvZ28uZGVwdGggPD0gNCkgewotCQlsb2dvX25ldyA9IGttYWxsb2MoZmJfbG9nby5sb2dvLT53aWR0aCAqIGZiX2xvZ28ubG9nby0+aGVpZ2h0LCAKLQkJCQkgICBHRlBfS0VSTkVMKTsKLQkJaWYgKGxvZ29fbmV3ID09IE5VTEwpIHsKLQkJCWtmcmVlKHBhbGV0dGUpOwotCQkJaWYgKHNhdmVkX3BzZXVkb19wYWxldHRlKQotCQkJCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2F2ZWRfcHNldWRvX3BhbGV0dGU7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbWFnZS5kYXRhID0gbG9nb19uZXc7Ci0JCWZiX3NldF9sb2dvKGluZm8sIGZiX2xvZ28ubG9nbywgbG9nb19uZXcsIGZiX2xvZ28uZGVwdGgpOwotCX0KLQotCWltYWdlLmR4ID0gMDsKLQlpbWFnZS5keSA9IDA7Ci0JaW1hZ2Uud2lkdGggPSBmYl9sb2dvLmxvZ28tPndpZHRoOwotCWltYWdlLmhlaWdodCA9IGZiX2xvZ28ubG9nby0+aGVpZ2h0OwotCi0JaWYgKHJvdGF0ZSkgewotCQlsb2dvX3JvdGF0ZSA9IGttYWxsb2MoZmJfbG9nby5sb2dvLT53aWR0aCAqCi0JCQkJICAgICAgZmJfbG9nby5sb2dvLT5oZWlnaHQsIEdGUF9LRVJORUwpOwotCQlpZiAobG9nb19yb3RhdGUpCi0JCQlmYl9yb3RhdGVfbG9nbyhpbmZvLCBsb2dvX3JvdGF0ZSwgJmltYWdlLCByb3RhdGUpOwotCX0KLQotCWZiX2RvX3Nob3dfbG9nbyhpbmZvLCAmaW1hZ2UsIHJvdGF0ZSwgbnVtX29ubGluZV9jcHVzKCkpOwotCi0Ja2ZyZWUocGFsZXR0ZSk7Ci0JaWYgKHNhdmVkX3BzZXVkb19wYWxldHRlICE9IE5VTEwpCi0JCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2F2ZWRfcHNldWRvX3BhbGV0dGU7Ci0Ja2ZyZWUobG9nb19uZXcpOwotCWtmcmVlKGxvZ29fcm90YXRlKTsKLQlyZXR1cm4gZmJfbG9nby5sb2dvLT5oZWlnaHQ7CisJcmV0dXJuIHk7CiB9CiAjZWxzZQogaW50IGZiX3ByZXBhcmVfbG9nbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHJvdGF0ZSkgeyByZXR1cm4gMDsgfQpAQCAtMTE1NSwxNyArMTIyOSwxNSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBmYl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCiB7CiAJaW50IGZiaWR4ID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcmVnaXN0ZXJlZF9mYltmYmlkeF07CiAJc3RydWN0IGZiX29wcyAqZmIgPSBpbmZvLT5mYm9wczsKIAl1bnNpZ25lZCBsb25nIG9mZjsKLSNpZiAhZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19zcGFyY192OV9fKQogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAJdTMyIGxlbjsKLSNlbmRpZgogCiAJaWYgKHZtYS0+dm1fcGdvZmYgPiAofjBVTCA+PiBQQUdFX1NISUZUKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTgwLDEyICsxMjUyLDYgQEAKIAkJcmV0dXJuIHJlczsKIAl9CiAKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKQotCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSwgYWxsIGZiIGRyaXZlcnMgc2hvdWxkIGhhdmUgdGhlaXIgb3duCi0JICAgbW1hcCByb3V0aW5lcyAqLwotCXJldHVybiAtRUlOVkFMOwotI2Vsc2UKLQkvKiAhc3BhcmMzMi4uLiAqLwogCWxvY2tfa2VybmVsKCk7CiAKIAkvKiBmcmFtZSBidWZmZXIgbWVtb3J5ICovCkBAIC0xMjA5LDUwICsxMjc1LDExIEBACiAJdm1hLT52bV9wZ29mZiA9IG9mZiA+PiBQQUdFX1NISUZUOwogCS8qIFRoaXMgaXMgYW4gSU8gbWFwIC0gdGVsbCBtYXlkdW1wIHRvIHNraXAgdGhpcyBWTUEgKi8KIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fUkVTRVJWRUQ7Ci0jaWYgZGVmaW5lZChfX21jNjgwMDBfXykKLSNpZiBkZWZpbmVkKENPTkZJR19TVU4zKQotCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IFNVTjNfUEFHRV9OT0NBQ0hFOwotI2VsaWYgZGVmaW5lZChDT05GSUdfTU1VKQotCWlmIChDUFVfSVNfMDIwX09SXzAzMCkKLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9DQUNIRTAzMDsKLQlpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgJj0gX0NBQ0hFTUFTSzA0MDsKLQkJLyogVXNlIG5vLWNhY2hlIG1vZGUsIHNlcmlhbGl6ZWQgKi8KLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9DQUNIRV9TOwotCX0KLSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBoeXNfbWVtX2FjY2Vzc19wcm90KGZpbGUsIG9mZiA+PiBQQUdFX1NISUZULAotCQkJCQkJIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKLQkJCQkJCSB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKLQkvKiBDYWNoaW5nIGlzIG9mZiBpbiB0aGUgSS9PIHNwYWNlIHF1YWRyYW50IGJ5IGRlc2lnbi4gICovCi0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOwotI2VsaWYgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChfX3NwYXJjX3Y5X18pCi0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKLSNlbGlmIGRlZmluZWQoX19ocHBhX18pCi0JcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9fQ0FDSEU7Ci0jZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fbTMycl9fKQotCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZWxpZiBkZWZpbmVkKF9fYXZyMzJfXykKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQotCQkJCSAgICAgICYgfl9QQUdFX0NBQ0hBQkxFKQotCQkJCSAgICAgfCAoX1BBR0VfQlVGRkVSIHwgX1BBR0VfRElSVFkpKTsKLSNlbGlmIGRlZmluZWQoX19pYTY0X18pCi0JaWYgKGVmaV9yYW5nZV9pc193Yyh2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpKQotCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOwotCWVsc2UKLQkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKLSNlbHNlCi0jd2FybmluZyBXaGF0IGRvIHdlIGhhdmUgdG8gZG8gaGVyZT8/Ci0jZW5kaWYKKwlmYl9wZ3Byb3RlY3QoZmlsZSwgdm1hLCBvZmYpOwogCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBvZmYgPj4gUEFHRV9TSElGVCwKIAkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpCiAJCXJldHVybiAtRUFHQUlOOwogCXJldHVybiAwOwotI2VuZGlmIC8qICFzcGFyYzMyICovCiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEzODgsMTcgKzE0MTUsMzQgQEAKICAqCiAgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIGZvciBzdWNjZXNzLgogICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gbm90aWZ5IHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlCisgKiAgICAgIHRvIHJlbGVhc2UgdGhlIGRyaXZlci4KKyAqCisgKiAgICAgIFRoaXMgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdpdGhpbiBhIGRyaXZlcidzIG1vZHVsZV9leGl0KCkKKyAqICAgICAgZnVuY3Rpb24uIElmIHRoaXMgaXMgY2FsbGVkIG91dHNpZGUgbW9kdWxlX2V4aXQoKSwgZW5zdXJlCisgKiAgICAgIHRoYXQgdGhlIGRyaXZlciBpbXBsZW1lbnRzIGZiX29wZW4oKSBhbmQgZmJfcmVsZWFzZSgpIHRvCisgKiAgICAgIGNoZWNrIHRoYXQgbm8gcHJvY2Vzc2VzIGFyZSB1c2luZyB0aGUgZGV2aWNlLgogICovCiAKIGludAogdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykKIHsKIAlzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7Ci0JaW50IGk7CisJaW50IGksIHJldCA9IDA7CiAKIAlpID0gZmJfaW5mby0+bm9kZTsKLQlpZiAoIXJlZ2lzdGVyZWRfZmJbaV0pCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghcmVnaXN0ZXJlZF9mYltpXSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJZXZlbnQuaW5mbyA9IGZiX2luZm87CisJcmV0ID0gZmJfbm90aWZpZXJfY2FsbF9jaGFpbihGQl9FVkVOVF9GQl9VTkJJTkQsICZldmVudCk7CisKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CiAKIAlpZiAoZmJfaW5mby0+cGl4bWFwLmFkZHIgJiYKIAkgICAgKGZiX2luZm8tPnBpeG1hcC5mbGFncyAmIEZCX1BJWE1BUF9ERUZBVUxUKSkKQEAgLTE0MTAsNyArMTQ1NCw4IEBACiAJZGV2aWNlX2Rlc3Ryb3koZmJfY2xhc3MsIE1LREVWKEZCX01BSk9SLCBpKSk7CiAJZXZlbnQuaW5mbyA9IGZiX2luZm87CiAJZmJfbm90aWZpZXJfY2FsbF9jaGFpbihGQl9FVkVOVF9GQl9VTlJFR0lTVEVSRUQsICZldmVudCk7Ci0JcmV0dXJuIDA7Citkb25lOgorCXJldHVybiByZXQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mbTJmYi5jIGIvZHJpdmVycy92aWRlby9mbTJmYi5jCmluZGV4IDcwZmY1NWIuLjZjOTFjNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZm0yZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZtMmZiLmMKQEAgLTE5NSwxMyArMTk1LDE1IEBACiBzdGF0aWMgaW50IGZtMmZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCWlmIChyZWdubyA+IGluZm8tPmNtYXAubGVuKQotCQlyZXR1cm4gMTsKLQlyZWQgPj49IDg7Ci0JZ3JlZW4gPj49IDg7Ci0JYmx1ZSA+Pj0gODsKKwlpZiAocmVnbm8gPCAxNikgeworCQlyZWQgPj49IDg7CisJCWdyZWVuID4+PSA4OworCQlibHVlID4+PSA4OwogCi0JKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKKwkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IChyZWQgPDwgMTYpIHwKKwkJCShncmVlbiA8PCA4KSB8IGJsdWU7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzNyw3ICsyMzksNyBAQAogCWlmICghem9ycm9fcmVxdWVzdF9kZXZpY2UoeiwiZm0yZmIiKSkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygyNTYgKiBzaXplb2YodTMyKSwgJnotPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDE2ICogc2l6ZW9mKHUzMiksICZ6LT5kZXYpOwogCWlmICghaW5mbykgewogCQl6b3Jyb19yZWxlYXNlX2RldmljZSh6KTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKaW5kZXggYmYwZTYwYi4uYjliNTcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nYmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwpAQCAtODYsNyArODYsNyBAQAogCiBzdGF0aWMgaW50IHlwYW4sIHl3cmFwOwogCi1zdGF0aWMgdWludDMyX3QgcHNldWRvX3BhbGV0dGVbMjU2XTsKK3N0YXRpYyB1aW50MzJfdCBwc2V1ZG9fcGFsZXR0ZVsxNl07CiAKIHN0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2luaXRkYXRhID0gTlVMTDsKIApAQCAtODU0LDggKzg1NCw3IEBACiAJZ3JlZW4gPj49IDg7CiAJYmx1ZSA+Pj0gODsKIAotCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JY2FzZSA4OgorCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gOCkgewogCQkvKiB3YWl0IGZvciB0aGUgY29sb3IgbWFwIEZJRk8gdG8gaGF2ZSBhIGZyZWUgZW50cnkgKi8KIAkJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYgZ2JlLT5jbV9maWZvID49IDYzOyBpKyspCiAJCQl1ZGVsYXkoMTApOwpAQCAtODY0LDIzICs4NjMsMjUgQEAKIAkJCXJldHVybiAxOwogCQl9CiAJCWdiZS0+Y21hcFtyZWdub10gPSAocmVkIDw8IDI0KSB8IChncmVlbiA8PCAxNikgfCAoYmx1ZSA8PCA4KTsKLQkJYnJlYWs7Ci0JY2FzZSAxNToKLQljYXNlIDE2OgotCQlyZWQgPj49IDM7Ci0JCWdyZWVuID4+PSAzOwotCQlibHVlID4+PSAzOwotCQlwc2V1ZG9fcGFsZXR0ZVtyZWdub10gPQotCQkJKHJlZCA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgfAotCQkJKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCXBzZXVkb19wYWxldHRlW3JlZ25vXSA9Ci0JCQkocmVkIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSB8Ci0JCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAotCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKLQkJYnJlYWs7CisJfSBlbHNlIGlmIChyZWdubyA8IDE2KSB7CisJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMTU6CisJCWNhc2UgMTY6CisJCQlyZWQgPj49IDM7CisJCQlncmVlbiA+Pj0gMzsKKwkJCWJsdWUgPj49IDM7CisJCQlwc2V1ZG9fcGFsZXR0ZVtyZWdub10gPQorCQkJCShyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkJCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJCShibHVlIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCXBzZXVkb19wYWxldHRlW3JlZ25vXSA9CisJCQkJKHJlZCA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgfAorCQkJCShncmVlbiA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKwkJCWJyZWFrOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaAppbmRleCA4ODllNGVhLi4zMjhhZTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmgKQEAgLTI2Niw3ICsyNjYsNyBAQAogCXN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICBjaGFuWzNdOwogCXN0cnVjdCBtdXRleAkJIG9wZW5fbG9jazsKIAl1bnNpZ25lZCBpbnQJCSB1c2VfY291bnQ7Ci0JdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydF9waHlzOwogCXU4IF9faW9tZW0gKm1taW9fc3RhcnRfdmlydHVhbDsKIAl1OCAqZWRpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmggYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCmluZGV4IDgwYjk0YzEuLjYxNDgzMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaApAQCAtMzAyLDcgKzMwMiw3IEBACiAJdTMyIHJpbmdfbG9ja3VwOwogCiAJLyogcGFsZXR0ZSAqLwotCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyIHBzZXVkb19wYWxldHRlWzE2XTsKIAogCS8qIGNoaXAgaW5mbyAqLwogCWludCBwY2lfY2hpcHNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKaW5kZXggOTM5N2JjZS4uZGEyMTljMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKQEAgLTEwLDYgKzEwLDExIEBACiAKIGlmIExPR08KIAorY29uZmlnIEZCX0xPR09fRVhUUkEKKwlib29sCisJZGVwZW5kcyBvbiBGQgorCWRlZmF1bHQgeSBpZiBTUFVfQkFTRQorCiBjb25maWcgTE9HT19MSU5VWF9NT05PCiAJYm9vbCAiU3RhbmRhcmQgYmxhY2sgYW5kIHdoaXRlIExpbnV4IGxvZ28iCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKaW5kZXggYjk4NWRmYS4uYTVmYzRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9sb2dvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQpAQCAtMTQsNiArMTQsOCBAQAogb2JqLSQoQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQpCSs9IGxvZ29fc3VwZXJoX2NsdXQyMjQubwogb2JqLSQoQ09ORklHX0xPR09fTTMyUl9DTFVUMjI0KQkJKz0gbG9nb19tMzJyX2NsdXQyMjQubwogCitvYmotJChDT05GSUdfU1BVX0JBU0UpCQkJKz0gbG9nb19zcGVfY2x1dDIyNC5vCisKICMgSG93IHRvIGdlbmVyYXRlIGxvZ28ncwogCiAjIFVzZSBsb2dvLWNmaWxlcyB0byByZXRyaWV2ZSBsaXN0IG9mIC5jIGZpbGVzIHRvIGJlIGJ1aWx0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19zcGVfY2x1dDIyNC5wcG0gYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19zcGVfY2x1dDIyNC5wcG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2YWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvX3NwZV9jbHV0MjI0LnBwbQpAQCAtMCwwICsxLDI4MyBAQAorUDMKKzQwIDQwCisyNTUKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgNiA2IDYKKzE1IDE1IDE1ICAyMSAyMSAyMSAgMTkgMTkgMTkgIDE0IDE0IDE0ICA2IDYgNiAgMiAyIDIKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgMjEgMjEgMjEgIDU1IDU1IDU1Cis1NiA1NiA1NiAgNTQgNTQgNTQgIDUzIDUzIDUzICA2MCA2MCA2MCAgNTYgNTYgNTYgIDI1IDI1IDI1Cis2IDYgNiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAyIDIgMiAgMjcgMjcgMjcgIDYyIDYyIDYyICAxNyAxNyAxOQorMiAyIDYgIDIgMiA2ICAyIDIgNiAgMiAyIDYgIDE2IDE2IDE4ICA1NyA1NyA1NworNDUgNDUgNDUgIDggOCA4ICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDEgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMTYgMTYgMTYgIDYyIDYyIDYyICA4IDggMTAgIDIgMiA2CisyIDIgNiAgMiAyIDYgIDIgMiA2ICAxMiAxMiAxNCAgNjcgNjcgNjcgIDE2IDE2IDE3Cis0NSA0NSA0NSAgNDEgNDEgNDEgIDQgNCA0ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDIgMiAyICAzNSAzNSAzNSAgNDAgNDAgNDAgIDIgMiA2ICAyIDIgNgorMiAyIDYgIDIgMiA2ICAyIDIgNiAgMTUgMTUgMTcgIDcwIDcwIDcwICAyNyAyNyAyNworMyAzIDYgIDYyIDYyIDYyICAyMCAyMCAyMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA0IDQgNCAgNTggNTggNTggIDEyIDEyIDE0ICAyIDIgNiAgMiAyIDYKKzIgMiA2ICAyIDIgNiAgMiAyIDYgIDQgNCA3ICA0IDQgNyAgMiAyIDYKKzIgMiA2ICAzNCAzNCAzNiAgNDAgNDAgNDAgIDMgMyAzICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNyA3IDcgIDY0IDY0IDY0ICAyIDIgNiAgNSA1IDUgIDE3IDE3IDE3CiszIDMgNiAgMiAyIDYgIDIgMiA2ICAxNSAxNSAxNSAgMjEgMjEgMjEgIDcgNyAxMAorMiAyIDYgIDggOCAxMCAgNjIgNjIgNjIgIDYgNiA2ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNyA3IDcgIDY2IDY2IDY2ICA1IDUgOCAgMTIyIDEyMiAxMjIgIDEyMiAxMjIgMTIyCis5IDkgMTEgIDMgMyA2ICAxMDQgOTYgODEgIDE3OSAxNzkgMTc5ICAxMjIgMTIyIDEyMiAgMTMgMTMgMTMKKzIgMiA2ICAyIDIgNiAgNjcgNjcgNjcgIDEwIDEwIDEwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNyA3IDcgIDY1IDY1IDY1ICA0MSA0MSA0MyAgMTUyIDE0OSAxNDIgIDE5MiAxOTEgMTg5Cis0OCA0OCA0OSAgMjMgMjMgMjQgIDIyOCAyMTAgMjEwICA4NiA4NiA4NiAgMTkyIDE5MSAxODkgIDU5IDU5IDYxCisyIDIgNiAgMiAyIDYgIDY0IDY0IDY0ICAxNCAxNCAxNCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMSAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDcgNyA3ICA2NiA2NiA2NiAgNTkgNTkgNTkgIDU5IDU5IDYxICA4NiA4NiA4NgorOTkgODQgNTAgIDc4IDY2IDI4ICAxNTIgMTQ5IDE0MiAgNSA1IDggIDEyMiAxMjIgMTIyICAxMDQgOTYgODEKKzIgMiA2ICAyIDIgNiAgNjcgNjcgNjcgIDE0IDE0IDE0ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNSA1IDUgIDYzIDYzIDYzICAyNCAyNCAyNCAgMTUyIDE0OSAxNDIgIDE3NSAxMjIgMTMKKzIzOCAxODQgMTIgIDIyMCAxNzAgMTMgIDIyNiAxODEgNTIgIDExMiA4NiAzMiAgMTk0IDE2NSAxNTEgIDQ2IDQ2IDQ3CisyIDIgNiAgMiAyIDYgIDY1IDY1IDY1ICAxNyAxNyAxNyAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDUgNSA1ICA1OSA1OSA1OSAgMjEgMjEgMjEgIDE3NSAxMjIgMTMgIDIzMSAxNzQgMTEKKzI0MCAxOTIgMTMgIDIzNyAxODMgNjEgIDI0MCAxOTIgMTMgIDI0MCAxOTIgMTMgIDIzNCAxNzkgMTYgIDgxIDY0IDkKKzIgMiA2ICAyIDIgNiAgNjMgNjMgNjMgIDI1IDI1IDI1ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNSA1IDUgIDU0IDU0IDU0ICA1MSA0OCAzOSAgMTg5IDEzOCA5ICAyMzggMTg0IDEyCisyNDAgMTkyIDEzICAyNDAgMTkyIDEzICAyNDAgMTkyIDEzICAyMTUgMTYxIDExICAyMDcgMTUyIDE5ICA4MSA2NCA5CisxNiAxNiAxOCAgNSA1IDggIDQwIDQwIDQwICA0NCA0NCA0NCAgNCA0IDQgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDUgNSA1ICA1OSA1OSA1OSAgMjcgMjcgMjcgIDEyNiAxMDcgNjQgIDE4NyAxMzYgMTIKKzIyMCAxNzAgMTMgIDIwMSAxNDcgMjAgIDE4OSAxMzggOSAgMTk4IDE1NCA0NiAgMTk5IDE4MiAxMjUgIDcwIDcwIDcwCisyNyAyNyAyNyAgMTA0IDk2IDgxICAxMiAxMiAxNCAgNzAgNzAgNzAgIDE2IDE2IDE2ICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAxNyAxNyAxNyAgNzAgNzAgNzAgIDEyIDEyIDEyICAxNjggMTY4IDE2OCAgMTc0IDEzNSAxMzUKKzE3NSAxMjIgMTMgIDE3NSAxMjIgMTMgIDE3OCAxNTEgODMgIDE5MiAxOTEgMTg5ICAyMzMgMjMzIDIzMyAgMTc5IDE3OSAxNzkKKzMgMyA2ICAyOSAyOSAzMSAgMyAzIDYgIDQxIDQxIDQxICA0NCA0NCA0NCAgNSA1IDUKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCis4IDggOCAgNTMgNTMgNTMgIDQ0IDQ0IDQ0ICA1OSA1OSA1OSAgMjM4IDIzOCAyMzggIDE5MiAxOTEgMTg5CisxOTIgMTkxIDE4OSAgMTkyIDE5MSAxODkgIDIyMSAyMDUgMjA1ICAyNDAgMjQwIDI0MCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCis3MCA3MCA3MCAgMiAyIDYgIDIgMiA2ICA1IDUgOCAgNjcgNjcgNjcgIDIyIDIyIDIyCisyIDIgMiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICA1IDUgNQorMzggMzggMzggIDU2IDU2IDU2ICA3IDcgOSAgMjIxIDIwNSAyMDUgIDI1MyAyNTMgMjUzICAyMzMgMjMzIDIzMworMjIxIDIwNSAyMDUgIDIzMyAyMzMgMjMzICAyNTEgMjUxIDI1MSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMTkyIDE5MSAxODkgIDIgMiA2ICAyIDIgNiAgMiAyIDYgIDI1IDI1IDI1ICA2NCA2NCA2NAorMTUgMTUgMTUgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgMjcgMjcgMjcKKzY2IDY2IDY2ICA3IDcgOSAgODYgODYgODYgIDI1MiAyNTIgMjUyICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MiAyNTIgMjUyICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI0NCAyNDQgMjQ0ICAxOSAxOSAyMSAgMiAyIDYgIDIgMiA2ICAyIDIgNiAgMzggMzggMzgKKzU0IDU0IDU0ICAxMCAxMCAxMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMTQgMTQgMTQgIDYyIDYyIDYyCisxMCAxMCAxMiAgMyAzIDYgIDEyMiAxMjIgMTIyICAyMzUgMjM1IDIzNSAgMjUxIDI1MSAyNTEgIDI0OCAyNDggMjQ4CisyMzUgMjM1IDIzNSAgMjQ4IDI0OCAyNDggIDI1MiAyNTIgMjUyICAyNDYgMjQ2IDI0NiAgMjMzIDIzMyAyMzMgIDIzNyAyMjggMjI4CisyMjMgMjA3IDIwNyAgNzAgNzAgNzAgIDIgMiA2ICAyIDIgNiAgMiAyIDYgIDIgMiA2Cis0NiA0NiA0NyAgMzggMzggMzggIDQgNCA0ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMiAyIDIgIDMzIDMzIDMzICA0NCA0NCA0NAorNCA0IDcgIDkgOSAxMSAgMTY4IDE2OCAxNjggIDI0MCAyNDAgMjQwICAyNTIgMjUyIDI1MiAgMjUyIDI1MiAyNTIKKzI0NiAyNDYgMjQ2ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MSAyNTEgMjUxICAyNDUgMjQxIDI0MSAgMjMzIDIzMyAyMzMKKzIyMSAyMDUgMjA1ICAxOTIgMTkxIDE4OSAgMjkgMjkgMzEgIDI3IDI3IDI3ICA5IDkgMTIgIDIgMiA2CiszIDMgNiAgNjUgNjUgNjUgIDE1IDE1IDE1ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNiA2IDYgIDU5IDU5IDU5ICAxOSAxOSAyMQorMjQgMjQgMjQgIDg2IDg2IDg2ICAyNDkgMjQ5IDI0OSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDIyOCAyMTAgMjEwICAyNDEgMjMwIDIzMCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUxIDI1MSAyNTEgIDIyOCAyMTAgMjEwICAxNTIgMTQ5IDE0MiAgNSA1IDggIDI3IDI3IDI3ICA0IDQgNworMiAyIDYgIDQ2IDQ2IDQ3ICAzNCAzNCAzNCAgMiAyIDIgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDE2IDE2IDE2ICA2NyA2NyA2NyAgMTkgMTkgMjEKKzEyIDEyIDE0ICAyMjMgMjA3IDIwNyAgMjU0IDIwIDIwICAyNTQgMjAgMjAgIDI1MyAxMjcgMTI3ICAyNDIgMjIzIDIyMworMjU0IDIwIDIwICAyNTMgMTI3IDEyNyAgMjU0IDQ4IDQ4ICAyNDIgMjIzIDIyMyAgMjU0IDg2IDg2ICAyNTQgMjAgMjAKKzI1NCAyMCAyMCAgMjUzIDEzNyAxMzcgIDIzMyAyMzMgMjMzICAzMiAzMiAzMiAgMzUgMzUgMzUgIDIzIDIzIDI0CisyIDIgNiAgMTUgMTUgMTUgIDYwIDYwIDYwICA2IDYgNiAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICA0IDQgNCAgMzggMzggMzggIDQ4IDQ4IDQ5ICAyMiAyMiAyMgorODYgODYgODYgIDI1MyAyNTMgMjUzICAyNTQgMjAgMjAgIDI0MSAyMzAgMjMwICAyMjcgMjE2IDE4NiAgMjUzIDEzNyAxMzcKKzI1MyAxMzcgMTM3ICAyNTMgMjUzIDI1MyAgMjUzIDEzNyAxMzcgIDI1MyAxMzcgMTM3ICAyNTQgNDggNDggIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICA2MiA2MiA2MiAgMiAyIDYgIDIzIDIzIDI0CisyIDIgNiAgMiAyIDYgIDYyIDYyIDYyICAxNyAxNyAxNyAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAxNCAxNCAxNCAgNzAgNzAgNzAgIDE0IDE0IDE0ICAxNiAxNiAxOAorMTc5IDE3OSAxNzkgIDI1MyAyNTMgMjUzICAyMjcgMjE2IDE4NiAgMjU0IDQ4IDQ4ICAyNDAgMjE5IDE2MCAgMjUzIDEyNyAxMjcKKzI1NCAyMCAyMCAgMjUzIDEzNyAxMzcgIDI1NCA4NiA4NiAgMjMxIDIwMyAxNDEgIDI1NCAyMCAyMCAgMjU0IDIwIDIwCisyNTMgMTM3IDEzNyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAxMDQgOTYgODEgIDIgMiA2ICAyMyAyMyAyNAorMiAyIDYgIDIgMiA2ICA0NiA0NiA0NyAgMjcgMjcgMjcgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA0IDQgNCAgMzkgMzkgMzkgIDQyIDQyIDQzICAxOSAxOSAyMSAgMTMgMTMgMTMKKzIyOCAyMTAgMjEwICAyNDIgMjIzIDIyMyAgMjUzIDI1MyAyNTMgIDI0MiAyMjMgMjIzICAyNTMgMTI3IDEyNyAgMjUzIDEyNyAxMjcKKzI1MyAxMjcgMTI3ICAyNTMgMTI3IDEyNyAgMjUzIDEzNyAxMzcgIDI1MyAyNTMgMjUzICAyNTQgNDggNDggIDI1MyAyNTMgMjUzCisyMjggMjEwIDIxMCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAxMjIgMTIyIDEyMiAgMiAyIDYgIDE5IDE5IDE5CisyIDIgNiAgMiAyIDYgIDM5IDM5IDM5ICAzOCAzOCAzOCAgMyAzIDMgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDggOCA4ICA2MCA2MCA2MCAgMyAzIDYgIDMzIDMzIDMzICAzOCAzOCAzOAorMjUzIDEzNyAxMzcgIDI1NCA4NiA4NiAgMjUzIDEzNyAxMzcgIDI1NCA4NiA4NiAgMjUzIDEzNyAxMzcgIDIwOSAxOTcgMTY4CisyNTMgMTI3IDEyNyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDEyNyAxMjcgIDI1NCA4NiA4NgorMjU0IDg2IDg2ICAyNTMgMTM3IDEzNyAgMjUzIDI1MyAyNTMgIDEyMiAxMjIgMTIyICAyIDIgNiAgMTcgMTcgMTcKKzIgMiA2ICAyIDIgNiAgMzQgMzQgMzYgIDQyIDQyIDQzICAzIDMgMyAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMTMgMTMgMTMgIDU5IDU5IDU5ICAyIDIgNiAgOSA5IDEyICA1NiA1NiA1NgorMjUyIDI1MiAyNTIgIDI0MCAyMTkgMTYwICAyNTMgMTM3IDEzNyAgMjQwIDIxOSAxNjAgIDI1MyAyNTMgMjUzICAyMzcgMjI4IDIyOAorMjU0IDg2IDg2ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjQyIDIyMyAyMjMKKzIyNyAyMTYgMTg2ICAyNDkgMjQ5IDI0OSAgMjUzIDI1MyAyNTMgIDEyMiAxMjIgMTIyICAxNiAxNiAxNyAgMTcgMTcgMTcKKzEyIDEyIDE0ICAzIDMgNiAgMzkgMzkgMzkgIDM4IDM4IDM4ICAzIDMgMyAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyCis1IDUgNSAgMjIgMjIgMjIgIDEwNCA5NiA4MSAgMTg3IDEzNiAxMiAgMjA3IDE1MiAxOSAgNTEgNDggMzkKKzIyMSAyMDUgMjA1ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjQwIDI0MCAyNDAKKzI1MCAyNDcgMjQzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTAgMjQ3IDI0MyAgMjQwIDIxOSAxNjAgIDk5IDg0IDUwICA1IDUgOCAgMiAyIDYKKzcgNyA5ICA0NiA0NiA0NyAgNTggNTggNTggIDM1IDM1IDM1ICAzIDMgMyAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgOCA4IDggIDMzIDMzIDMzCis1OCA1OCA1OCAgODYgODYgODYgIDE3MCAxMzYgNTMgIDIzOSAxODIgMTMgIDI0NiAxOTAgMTQgIDIyMCAxNzAgMTMKKzQ0IDM4IDI5ICAxNzkgMTc5IDE3OSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjQwIDI0MCAyNDAKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNDAgMjE5IDE2MCAgMjQwIDE5MiAxMyAgMTEyIDg2IDMyICAyIDIgNiAgMiAyIDYKKzMgMyA2ICA0MSAzMyAyMCAgMjIwIDE3MCAxMyAgNTMgNTMgNTMgIDQgNCA0ICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyICAzMiAzMiAzMiAgMTUwIDExNiA0NAorMjE1IDE2MSAxMSAgMjE1IDE2MSAxMSAgMjI4IDE3MCAxMSAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMTg3IDEzNiAxMiAgOSA5IDExICAxMjIgMTIyIDEyMiAgMjUxIDI1MSAyNTEgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjQ4IDI0OCAyNDggIDIxMSAxOTYgMTM1ICAyMzkgMTgyIDEzICAxNzUgMTIyIDEzICA2IDUgNiAgMiAyIDYKKzE2IDE0IDEyICAxODcgMTM2IDEyICAyMzggMTg0IDEyICA4NCA3OCA2NSAgMTAgMTAgMTAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNCA0IDQgIDUzIDUzIDUzICAyMDcgMTUyIDE5CisyNDIgMTg1IDEzICAyNDUgMTg4IDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDAgMTkyIDEzICA4MSA2NCA5ICAyIDIgNiAgODYgODYgODYgIDI0NCAyNDQgMjQ0ICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjMzIDIzMyAyMzMgIDE5OSAxODIgMTI1ICAyMzEgMTc0IDExICAyMDcgMTUyIDE5ICAxNzUgMTIyIDEzICAxNzUgMTIyIDEzCisyMDEgMTQ3IDIwICAyMzkgMTgyIDEzICAyNDQgMTg3IDE0ICAxNTAgMTE2IDQ0ICAzNSAzNSAzNSAgNiA2IDYKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICA1IDUgNSAgNTMgNTMgNTMgIDIwMSAxNDcgMjAKKzI0MiAxODUgMTMgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDIyMCAxNzAgMTMgIDEzIDExIDEwICAyIDIgNiAgMTUyIDE0OSAxNDIgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyMzUgMjM1IDIzNSAgMTk5IDE4MiAxMjUgIDIyOCAxNzAgMTEgIDIzNCAxNzcgMTIgIDIyNiAxNjggMTEgIDIyNiAxNjggMTEKKzIzNCAxNzcgMTIgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDIzNCAxNzkgMTYgIDEyNiAxMDcgNjQgIDM2IDM2IDM2Cis2IDYgNiAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMyAzIDMgIDQ4IDQ4IDQ5ICAxODkgMTQyIDM1CisyNDIgMTg1IDEzICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAxNDAgMTEyIDM5ICAzNiAzNiAzNiAgMTkyIDE5MSAxODkgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisxOTIgMTkxIDE4OSAgMTEyIDg2IDMyICAyMjYgMTY4IDExICAyNDQgMTg3IDE0ICAyNDQgMTg3IDE0ICAyNDQgMTg3IDE0CisyNDUgMTg4IDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDIgMTg1IDEzICAxNTAgMTE2IDQ0CisyNyAyNyAyNyAgMiAyIDIgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNiA2IDYgIDU4IDU4IDU4ICAxODkgMTQyIDM1CisyMzkgMTgyIDEzICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyMzkgMTg4IDE0ICAyMDkgMTk3IDE2OCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUyIDI1MiAyNTIgIDE2OCAxNjggMTY4CisxNiAxNiAxOCAgOTcgNjcgOCAgMjI4IDE3MCAxMSAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ0IDE4NyAxNCAgMTk4IDE1NCA0NgorMzUgMzUgMzUgIDMgMyAzICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDEzIDEzIDEzICA4NCA3OCA2NSAgMjE1IDE2MSAxMQorMjQ0IDE4NyAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjM4IDE4NCAxMiAgMTg3IDEzNiAxMiAgMTY4IDE2OCAxNjggIDI0NCAyNDQgMjQ0CisyNTMgMjUzIDI1MyAgMjUyIDI1MiAyNTIgIDI0MCAyNDAgMjQwICAxNzkgMTc5IDE3OSAgNjcgNjcgNjcgIDIgMiA2CisyIDIgNiAgOTcgNjcgOCAgMjI4IDE3MCAxMSAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ1IDE4OCAxNCAgMjM0IDE3NyAxMiAgMTg5IDE0MiAzNSAgODYgNzcgNjEKKzE2IDE2IDE2ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAxMyAxMyAxMyAgMTAzIDkyIDU2ICAyMDcgMTUyIDE5CisyMjggMTcwIDExICAyMzQgMTc3IDEyICAyMzkgMTgyIDEzICAyNDIgMTg2IDE0ICAyNDUgMTg4IDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyMzkgMTgyIDEzICAxODkgMTM4IDkgIDQxIDMzIDIwICAxMCAxMCAxMgorMzAgMzAgMzEgIDIzIDIzIDI0ICA1IDUgOCAgMiAyIDYgIDIgMiA2ICAyIDIgNgorNCA0IDYgIDExMiA4NiAzMiAgMjE1IDE2MSAxMSAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ1IDE4OCAxNAorMjM5IDE4MiAxMyAgMjI4IDE3MCAxMSAgMTg5IDE0MiAzNSAgMTA0IDk2IDgxICA0OCA0OCA0OSAgMTcgMTcgMTcKKzIgMiAyICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICA1IDUgNSAgMzkgMzkgMzkgIDEwMyA5MiA1NgorMTQxIDEwOSA0NCAgMTc1IDEyMiAxMyAgMTg3IDEzNiAxMiAgMTg5IDEzOCA5ICAyMDcgMTUyIDE5ICAyMjggMTcwIDExCisyMzkgMTgyIDEzICAyMzkgMTgyIDEzICAyMTUgMTYxIDExICAxNzUgMTIyIDEzICA0MSAzMyAyMCAgMiAyIDYKKzE1IDE1IDE3ICAyMCAyMCAyMiAgMjAgMjAgMjIgIDIwIDIwIDIyICAyMCAyMCAyMiAgOCA4IDEwCis0IDQgNiAgOTcgNjcgOCAgMTg5IDEzOCA5ICAyMzEgMTc0IDExICAyMzkgMTgyIDEzICAyMjYgMTY4IDExCisxODkgMTM4IDkgIDEyNiAxMDcgNjQgIDU5IDU5IDU5ICAyMSAyMSAyMSAgNSA1IDUgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDUgNSA1ICAxNyAxNyAxNworMzQgMzQgMzQgIDU3IDU3IDU3ICA4NCA3OCA2NSAgMTAzIDkyIDU2ICAxMjUgMTAxIDQxICAxNDAgMTEyIDM5CisxNzUgMTIyIDEzICAxNzUgMTIyIDEzICAxNzUgMTIyIDEzICA5NyA2NyA4ICA3MiA2NyA1OCAgODQgNzggNjUKKzYwIDYwIDYwICA1NiA1NiA1NiAgNTYgNTYgNTYgIDU2IDU2IDU2ICA1NyA1NyA1NyAgNjUgNjUgNjUKKzg2IDg2IDg2ICA5NSA3MyAzNCAgMTc1IDEyMiAxMyAgMTg3IDEzNiAxMiAgMTg3IDEzNiAxMiAgMTc1IDEyMiAxMworMTAzIDkyIDU2ICA0MSA0MSA0MSAgMTAgMTAgMTAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCisyIDIgMiAgNCA0IDQgIDEyIDEyIDEyICAyNCAyNCAyNCAgNDAgNDAgNDAgIDcwIDcwIDcwCis4NiA3NyA2MSAgOTUgNzMgMzQgIDg4IDcyIDQxICA3MiA2NyA1OCAgMzYgMzYgMzYgIDEwIDEwIDEwCis1IDUgNSAgNSA1IDUgIDUgNSA1ICA0IDQgNCAgNSA1IDUgIDYgNiA2CisyMiAyMiAyMiAgNjEgNjEgNTkgIDg4IDcyIDQxICAxMTIgODYgMzIgIDExMiA4NiAzMiAgODQgNzggNjUKKzMyIDMyIDMyICA2IDYgNiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMyAzIDMgIDEwIDEwIDEwCisyMSAyMSAyMSAgMzMgMzMgMzMgIDMxIDMxIDMxICAxNiAxNiAxNiAgMiAyIDIgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCisyIDIgMiAgMTIgMTIgMTIgIDMwIDMwIDMxICA0MCA0MCA0MCAgMzIgMzIgMzIgIDE2IDE2IDE2CisyIDIgMiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNmYi5jIGIvZHJpdmVycy92aWRlby9tYWNmYi5jCmluZGV4IGY3ZDY0N2QuLmFhOGM3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBmYl9pbmZvIGZiX2luZm87Ci1zdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKK3N0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogc3RhdGljIGludCBpbnZlcnNlICAgPSAwOwogc3RhdGljIGludCB2aWR0ZXN0ICAgPSAwOwogCkBAIC01MjksNTYgKzUyOSw2MyBAQAogCWlmIChyZWdubyA+PSBmYl9pbmZvLT5jbWFwLmxlbikKIAkJcmV0dXJuIDE7CiAKLQlzd2l0Y2ggKGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgMToKLQkJLyogV2Ugc2hvdWxkbid0IGdldCBoZXJlICovCi0JCWJyZWFrOwotCWNhc2UgMjoKLQljYXNlIDQ6Ci0JY2FzZSA4OgotCQlpZiAobWFjZmJfc2V0cGFsZXR0ZSkKLQkJCW1hY2ZiX3NldHBhbGV0dGUocmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUsIGZiX2luZm8pOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJaWYgKGZiX2luZm8tPnZhci5yZWQub2Zmc2V0ID09IDEwKSB7Ci0JCQkvKiAxOjU6NTo1ICovCi0JCQkoKHUzMiopIChmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJaWYgKGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCA8PSA4KSB7CisJCXN3aXRjaCAoZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMToKKwkJCS8qIFdlIHNob3VsZG4ndCBnZXQgaGVyZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSA0OgorCQljYXNlIDg6CisJCQlpZiAobWFjZmJfc2V0cGFsZXR0ZSkKKwkJCQltYWNmYl9zZXRwYWxldHRlKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAorCQkJCQkJIGZiX2luZm8pOworCQkJZWxzZQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHJlZ25vIDwgMTYpIHsKKwkJc3dpdGNoIChmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSAxNjoKKwkJCWlmIChmYl9pbmZvLT52YXIucmVkLm9mZnNldCA9PSAxMCkgeworCQkJCS8qIDE6NTo1OjUgKi8KKwkJCQkoKHUzMiopIChmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CiAJCQkJCSgocmVkICAgJiAweGY4MDApID4+ICAxKSB8CiAJCQkJCSgoZ3JlZW4gJiAweGY4MDApID4+ICA2KSB8CiAJCQkJCSgoYmx1ZSAgJiAweGY4MDApID4+IDExKSB8CiAJCQkJCSgodHJhbnNwICE9IDApIDw8IDE1KTsKLQkJfSBlbHNlIHsKLQkJCS8qIDA6NTo2OjUgKi8KLQkJCSgodTMyKikgKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KKwkJCX0gZWxzZSB7CisJCQkJLyogMDo1OjY6NSAqLworCQkJCSgodTMyKikgKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KIAkJCQkJKChyZWQgICAmIDB4ZjgwMCkgICAgICApIHwKIAkJCQkJKChncmVlbiAmIDB4ZmMwMCkgPj4gIDUpIHwKIAkJCQkJKChibHVlICAmIDB4ZjgwMCkgPj4gMTEpOworCQkJfQorCQkJYnJlYWs7CisJCQkvKiBJJ20gcHJldHR5IHN1cmUgdGhhdCBvbmUgb3IgdGhlIG90aGVyIG9mIHRoZXNlCisJCQkgICBkb2Vzbid0IGV4aXN0IG9uIDY4ayBNYWNzICovCisJCWNhc2UgMjQ6CisJCQlyZWQgICA+Pj0gODsKKwkJCWdyZWVuID4+PSA4OworCQkJYmx1ZSAgPj49IDg7CisJCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQkJKHJlZCAgIDw8IGZiX2luZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKKwkJCQkoZ3JlZW4gPDwgZmJfaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlyZWQgICA+Pj0gODsKKwkJCWdyZWVuID4+PSA4OworCQkJYmx1ZSAgPj49IDg7CisJCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQkJKHJlZCAgIDw8IGZiX2luZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKKwkJCQkoZ3JlZW4gPDwgZmJfaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOworCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7CQotCQkvKiBJJ20gcHJldHR5IHN1cmUgdGhhdCBvbmUgb3IgdGhlIG90aGVyIG9mIHRoZXNlCi0JCSAgIGRvZXNuJ3QgZXhpc3Qgb24gNjhrIE1hY3MgKi8KLQljYXNlIDI0OgotCQlyZWQgICA+Pj0gODsKLQkJZ3JlZW4gPj49IDg7Ci0JCWJsdWUgID4+PSA4OwotCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9Ci0JCQkocmVkICAgPDwgZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQpICAgfAotCQkJKGdyZWVuIDw8IGZiX2luZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlyZWQgICA+Pj0gODsKLQkJZ3JlZW4gPj49IDg7Ci0JCWJsdWUgID4+PSA4OwotCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9Ci0JCQkocmVkICAgPDwgZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQpICAgfAotCQkJKGdyZWVuIDw8IGZiX2luZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIG1hY2ZiX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuYyBiL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuYwppbmRleCBhYjIxNDk1Li4wODNmNjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmMKKysrIGIvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5jCkBAIC0zNjksOSArMzY5LDggQEAKICAqCiAgKi8KIAotaW50IF9fZGV2aW5pdCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyICptb2RlX29wdGlvbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApCitpbnQgbWFjX2ZpbmRfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCSAgY29uc3QgY2hhciAqbW9kZV9vcHRpb24sIHVuc2lnbmVkIGludCBkZWZhdWx0X2JwcCkKIHsKICAgICBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICpkYiA9IE5VTEw7CiAgICAgdW5zaWduZWQgaW50IGRic2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmggYi9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmgKaW5kZXggYmFiZWI4MS4uYjg2YmEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuaApAQCAtNTUsMTAgKzU1LDEwIEBACiBleHRlcm4gaW50IG1hY192YXJfdG9fdm1vZGUoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCAqdm1vZGUsCiAJCQkgICAgaW50ICpjbW9kZSk7CiBleHRlcm4gaW50IG1hY19tYXBfbW9uaXRvcl9zZW5zZShpbnQgc2Vuc2UpOwotZXh0ZXJuIGludCBfX2RldmluaXQgbWFjX2ZpbmRfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCQkgICBjb25zdCBjaGFyICptb2RlX29wdGlvbiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApOworZXh0ZXJuIGludCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJIGNvbnN0IGNoYXIgKm1vZGVfb3B0aW9uLAorCQkJIHVuc2lnbmVkIGludCBkZWZhdWx0X2JwcCk7CiAKIAogICAgIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYWNjZWwuYwppbmRleCBjNTdhYWFkLi4zNjYwZDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2FjY2VsLmMKQEAgLTkxLDcgKzkxLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlwYWxbaV0gPSBpICogMHgxMTExMTExMVU7CiAJfQotCXBhbFtpXSA9IDB4RkZGRkZGRkY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyb3hfY2ZiOF9wYWwodV9pbnQzMl90KiBwYWwpIHsKQEAgLTEwMCw3ICs5OSw2IEBACiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJcGFsW2ldID0gaSAqIDB4MDEwMTAxMDFVOwogCX0KLQlwYWxbaV0gPSAweDBGMEYwRjBGOwogfQogCiBzdGF0aWMgdm9pZCBtYXRyb3hmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyogaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhKiBhcmVhKTsKQEAgLTE0NSwxMyArMTQzLDEwIEBACiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2ltYWdlYmxpdCA9IG1hdHJveGZiX2ltYWdlYmxpdDsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCWNhc2UgMTY6CWlmIChBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIuZ3JlZW4ubGVuZ3RoID09IDUpIHsKKwkJY2FzZSAxNjoJaWYgKEFDQ0VTU19GQklORk8oZmJjb24pLnZhci5ncmVlbi5sZW5ndGggPT0gNSkKIAkJCQkJbWFjY2VzcyA9IDB4QzAwMDAwMDE7Ci0JCQkJCUFDQ0VTU19GQklORk8oY21hcFsxNl0pID0gMHg3RkZGN0ZGRjsKLQkJCQl9IGVsc2UgeworCQkJCWVsc2UKIAkJCQkJbWFjY2VzcyA9IDB4NDAwMDAwMDE7Ci0JCQkJCUFDQ0VTU19GQklORk8oY21hcFsxNl0pID0gMHhGRkZGRkZGRjsKLQkJCQl9CiAJCQkJbW9wbW9kZSA9IE1fT1BNT0RFXzE2QlBQOwogCQkJCWlmIChhY2NlbCkgewogCQkJCQlBQ0NFU1NfRkJJTkZPKGZib3BzKS5mYl9jb3B5YXJlYSA9IG1hdHJveGZiX2NvcHlhcmVhOwpAQCAtMTYxLDcgKzE1Niw2IEBACiAJCQkJYnJlYWs7CiAJCWNhc2UgMjQ6CW1hY2Nlc3MgPSAweDAwMDAwMDAzOwogCQkJCW1vcG1vZGUgPSBNX09QTU9ERV8yNEJQUDsKLQkJCQlBQ0NFU1NfRkJJTkZPKGNtYXBbMTZdKSA9IDB4RkZGRkZGRkY7CiAJCQkJaWYgKGFjY2VsKSB7CiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2NvcHlhcmVhID0gbWF0cm94ZmJfY29weWFyZWE7CiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2ZpbGxyZWN0ID0gbWF0cm94ZmJfZmlsbHJlY3Q7CkBAIC0xNzAsNyArMTY0LDYgQEAKIAkJCQlicmVhazsKIAkJY2FzZSAzMjoJbWFjY2VzcyA9IDB4MDAwMDAwMDI7CiAJCQkJbW9wbW9kZSA9IE1fT1BNT0RFXzMyQlBQOwotCQkJCUFDQ0VTU19GQklORk8oY21hcFsxNl0pID0gMHhGRkZGRkZGRjsKIAkJCQlpZiAoYWNjZWwpIHsKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfY29weWFyZWEgPSBtYXRyb3hmYl9jb3B5YXJlYTsKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfZmlsbHJlY3QgPSBtYXRyb3hmYl9maWxscmVjdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwppbmRleCA4ODZlNDc1Li44NmNhN2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCkBAIC02NzksNiArNjc5LDggQEAKIAkJbWdhX291dGIoTV9EQUNfVkFMLCBibHVlKTsKIAkJYnJlYWs7CiAJY2FzZSAxNjoKKwkJaWYgKHJlZ25vID49IDE2KQorCQkJYnJlYWs7CiAJCXsKIAkJCXVfaW50MTZfdCBjb2wgPQogCQkJCShyZWQgPDwgQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLnJlZC5vZmZzZXQpICAgICB8CkBAIC02OTAsNiArNjkyLDggQEAKIAkJYnJlYWs7CiAJY2FzZSAyNDoKIAljYXNlIDMyOgorCQlpZiAocmVnbm8gPj0gMTYpCisJCQlicmVhazsKIAkJQUNDRVNTX0ZCSU5GTyhjbWFwW3JlZ25vXSkgPQogCQkJKHJlZCAgIDw8IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci5yZWQub2Zmc2V0KSAgIHwKIAkJCShncmVlbiA8PCBBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIuZ3JlZW4ub2Zmc2V0KSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmggYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmgKaW5kZXggOWMyNWMyZi4uZDU5NTc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuaApAQCAtNTE4LDcgKzUxOCw3IEBACiAJCQkJCWRsbDoxOwogCQkJCSAgICAgIH0gbWVtb3J5OwogCQkJICAgICAgfSB2YWx1ZXM7Ci0JdV9pbnQzMl90IGNtYXBbMTddOworCXVfaW50MzJfdCBjbWFwWzE2XTsKIH07CiAKICNkZWZpbmUgaW5mbzJtaW5mbyhpbmZvKSBjb250YWluZXJfb2YoaW5mbywgc3RydWN0IG1hdHJveF9mYl9pbmZvLCBmYmNvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jCmluZGV4IDAzYWU1NWIuLjRiMzM0NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYwpAQCAtMTYzLDExICsxNjMsNiBAQAogCUFDQ0VTU19GQklORk8oaHcpLmNydGMyLmN0bCA9IDB4MDAwMDAwMDQ7CiB9CiAKLXN0YXRpYyB2b2lkIG1hdHJveGZiX2RoX2NmYlhfaW5pdChzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5mbyogbTJpbmZvKSB7Ci0JLyogbm8gYWNjZWxlcmF0aW9uIGZvciBzZWNvbmRhcnkgaGVhZC4uLiAqLwotCW0yaW5mby0+Y21hcFsxNl0gPSAweEZGRkZGRkZGOwotfQotCiBzdGF0aWMgdm9pZCBtYXRyb3hmYl9kaF9wYW5fdmFyKHN0cnVjdCBtYXRyb3hmYl9kaF9mYl9pbmZvKiBtMmluZm8sCiAJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyogdmFyKSB7CiAJdW5zaWduZWQgaW50IHBvczsKQEAgLTM4NSw3ICszODAsNiBAQAogCQkJfQogCQl9CiAJCXVwX3JlYWQoJkFDQ0VTU19GQklORk8oYWx0b3V0KS5sb2NrKTsKLQkJbWF0cm94ZmJfZGhfY2ZiWF9pbml0KG0yaW5mbyk7CiAJfQogCW0yaW5mby0+aW5pdGlhbGl6ZWQgPSAxOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuaCBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmgKaW5kZXggMTc3MTc3Ni4uMTAwNTU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIAl1bnNpZ25lZCBpbnQJCWludGVybGFjZWQ6MTsKIAotCXVfaW50MzJfdCBjbWFwWzE3XTsKKwl1X2ludDMyX3QgY21hcFsxNl07CiB9OwogCiAjZW5kaWYgLyogX19NQVRST1hGQl9DUlRDMl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCmluZGV4IGFmZjExYmIuLmQxYTEwNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYwpAQCAtMTUwLDggKzE1MCw3IEBACiAJCU0gPSBwbGwgJiAweEZGOwogCQlOID0gKHBsbCA+PiA4KSAmIDB4RkY7CiAJCWlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB8fAotCQkJKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkgfHwKLQkJCSgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyRTApKSB7CisJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSkgewogCQkJTUIgPSAxOwogCQkJTkIgPSAxOwogCQl9IGVsc2UgewpAQCAtMTYxLDcgKzE2MCw3IEBACiAJCSpNQ2xrID0gKChOICogTkIgKiBwYXItPkNyeXN0YWxGcmVxS0h6KSAvIChNICogTUIpKSA+PiBQOwogCiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAwMCk7Ci0JCVAgPSAocGxsID4+IDE2KSAmIDB4MDM7CisJCVAgPSAocGxsID4+IDE2KSAmIDB4MDc7CiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAwNCk7CiAJCU0gPSBwbGwgJiAweEZGOwogCQlOID0gKHBsbCA+PiA4KSAmIDB4RkY7CkBAIC04OTIsMTEgKzg5MSwxNyBAQAogCQlzdGF0ZS0+Z2VuZXJhbCA9IGJwcCA9PSAxNiA/IDB4MDAxMDExMDAgOiAweDAwMTAwMTAwOwogCQlzdGF0ZS0+cmVwYWludDEgPSBoRGlzcGxheVNpemUgPCAxMjgwID8gMHgwNCA6IDB4MDA7CiAJCWJyZWFrOworCWNhc2UgTlZfQVJDSF80MDoKKwkJaWYgKCFwYXItPkZsYXRQYW5lbCkKKwkJCXN0YXRlLT5jb250cm9sID0gTlZfUkQzMihwYXItPlBSQU1EQUMwLCAweDA1ODApICYKKwkJCQkweGVmZmZmZWZmOworCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgTlZfQVJDSF8xMDoKIAljYXNlIE5WX0FSQ0hfMjA6CiAJY2FzZSBOVl9BUkNIXzMwOgogCWRlZmF1bHQ6Ci0JCWlmICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyNDApIHsKKwkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI0MCB8fAorCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwM2QwKSB7CiAJCQlzdGF0ZS0+YXJiaXRyYXRpb24wID0gMjU2OwogCQkJc3RhdGUtPmFyYml0cmF0aW9uMSA9IDB4MDQ4MDsKIAkJfSBlbHNlIGlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmZikgPT0gMHgwMUEwKSB8fApAQCAtOTM5LDcgKzk0NCw3IEBACiAKIHZvaWQgTlZMb2FkU3RhdGVFeHQoc3RydWN0IG52aWRpYV9wYXIgKnBhciwgUklWQV9IV19TVEFURSAqIHN0YXRlKQogewotCWludCBpOworCWludCBpLCBqOwogCiAJTlZfV1IzMihwYXItPlBNQywgMHgwMTQwLCAweDAwMDAwMDAwKTsKIAlOVl9XUjMyKHBhci0+UE1DLCAweDAyMDAsIDB4RkZGRjAwRkYpOwpAQCAtOTUxLDcgKzk1Niw4IEBACiAJTlZfV1IzMihwYXItPlBUSU1FUiwgMHgwMTAwICogNCwgMHhGRkZGRkZGRik7CiAKIAlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPT0gTlZfQVJDSF8wNCkgewotCQlOVl9XUjMyKHBhci0+UEZCLCAweDAyMDAsIHN0YXRlLT5jb25maWcpOworCQlpZiAoc3RhdGUpCisJCQlOVl9XUjMyKHBhci0+UEZCLCAweDAyMDAsIHN0YXRlLT5jb25maWcpOwogCX0gZWxzZSBpZiAoKHBhci0+QXJjaGl0ZWN0dXJlIDwgTlZfQVJDSF80MCkgfHwKIAkJICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDQwKSB7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKQEAgLTk2NCw4ICs5NzAsOSBAQAogCiAJCWlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDkwKSB8fAogCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDFEMCkgfHwKLQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyRTApIHx8Ci0JCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSkKKwkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApIHx8CisJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSB8fAorCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDNEMCkpCiAJCQlyZWdpb25zID0gMTU7CiAJCWZvcihpID0gMDsgaSA8IHJlZ2lvbnM7IGkrKykgewogCQkJTlZfV1IzMihwYXItPlBGQiwgMHgwNjAwICsgKGkgKiAweDEwKSwgMCk7CkBAIC0xMjA2LDE2ICsxMjEzLDIwIEBACiAJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA2MDgsIDB4RkZGRkZGRkYpOwogCQl9IGVsc2UgewogCQkJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfNDApIHsKLQkJCQl1MzIgdG1wOwotCiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwMDg0LCAweDQwMTI4N2MwKTsKIAkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDAwOEMsIDB4NjBkZTgwNTEpOwogCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDA5MCwgMHgwMDAwODAwMCk7CiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwNjEwLCAweDAwYmUzYzVmKTsKKwkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDBiYzQsCisJCQkJCU5WX1JEMzIocGFyLT5QR1JBUEgsIDB4MGJjNCkgfAorCQkJCQkweDAwMDA4MDAwKTsKIAotCQkJCXRtcCA9IE5WX1JEMzIocGFyLT5SRUdTLCAweDE1NDApICYgMHhmZjsKLQkJCQlmb3IoaSA9IDA7IHRtcCAmJiAhKHRtcCAmIDEpOyB0bXAgPj49IDEsIGkrKyk7Ci0JCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHg1MDAwLCBpKTsKKwkJCQlqID0gTlZfUkQzMihwYXItPlJFR1MsIDB4MTU0MCkgJiAweGZmOworCisJCQkJaWYgKGopIHsKKwkJCQkJZm9yIChpID0gMDsgIShqICYgMSk7IGogPj49IDEsIGkrKyk7CisJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4NTAwMCwgaSk7CisJCQkJfQogCiAJCQkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA0MCkgewogCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA5YjAsCkBAIC0xMjUwLDYgKzEyNjEsNyBAQAogCQkJCWNhc2UgMHgwMTYwOgogCQkJCWNhc2UgMHgwMUQwOgogCQkJCWNhc2UgMHgwMjQwOgorCQkJCWNhc2UgMHgwM0QwOgogCQkJCQlOVl9XUjMyKHBhci0+UE1DLCAweDE3MDAsCiAJCQkJCQlOVl9SRDMyKHBhci0+UEZCLCAweDAyMEMpKTsKIAkJCQkJTlZfV1IzMihwYXItPlBNQywgMHgxNzA0LCAwKTsKQEAgLTEyNjksNyArMTI4MSw2IEBACiAJCQkJCQkweDAwMDAwMTA4KTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAweDAyMjA6Ci0JCQkJY2FzZSAweDAyMzA6CiAJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDg2MCwgMCk7CiAJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDg2NCwgMCk7CiAJCQkJCU5WX1dSMzIocGFyLT5QUkFNREFDLCAweDA2MDgsCkBAIC0xMjc3LDggKzEyODgsOCBAQAogCQkJCQkJMHgwMDEwMDAwMCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMHgwMDkwOgotCQkJCWNhc2UgMHgwMkUwOgogCQkJCWNhc2UgMHgwMjkwOgorCQkJCWNhc2UgMHgwMzkwOgogCQkJCQlOVl9XUjMyKHBhci0+UFJBTURBQywgMHgwNjA4LAogCQkJCQkJTlZfUkQzMihwYXItPlBSQU1EQUMsIDB4MDYwOCkgfAogCQkJCQkJMHgwMDEwMDAwMCk7CkBAIC0xMzU1LDggKzEzNjYsOSBAQAogCQkJfSBlbHNlIHsKIAkJCQlpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA5MCkgfHwKIAkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDFEMCkgfHwKLQkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDJFMCkgfHwKLQkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkpIHsKKwkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkgfHwKKwkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkgfHwKKwkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDNEMCkpIHsKIAkJCQkJZm9yIChpID0gMDsgaSA8IDYwOyBpKyspIHsKIAkJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsCiAJCQkJCQkJMHgwRDAwICsgaSo0LApAQCAtMTQwNyw4ICsxNDE5LDggQEAKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDkwIHx8CiAJCQkJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAxRDAgfHwKLQkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDJFMCB8fAotCQkJCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB7CisJCQkJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTAgfHwKKwkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkgewogCQkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwREYwLAogCQkJCQkJCU5WX1JEMzIocGFyLT5QRkIsIDB4MDIwMCkpOwogCQkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwREY0LApAQCAtMTQ5NSw2ICsxNTA3LDEyIEBACiAJTlZfV1IzMihwYXItPlBGSUZPLCAweDA0OTQgKiA0LCAweDAwMDAwMDAxKTsKIAlOVl9XUjMyKHBhci0+UEZJRk8sIDB4MDQ5NSAqIDQsIDB4MDAwMDAwMDEpOwogCU5WX1dSMzIocGFyLT5QRklGTywgMHgwMTQwICogNCwgMHgwMDAwMDAwMSk7CisKKyAgICBpZiAoIXN0YXRlKSB7CisJICAgIHBhci0+Q3VycmVudFN0YXRlID0gTlVMTDsKKwkgICAgcmV0dXJuOworICAgIH0KKwogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzEwKSB7CiAJCWlmIChwYXItPnR3b0hlYWRzKSB7CiAJCQlOVl9XUjMyKHBhci0+UENSVEMwLCAweDA4NjAsIHN0YXRlLT5oZWFkKTsKQEAgLTE1NjYsNiArMTU4NCw5IEBACiAJVkdBX1dSMDgocGFyLT5QQ0lPLCAweDAzRDUsIHN0YXRlLT5pbnRlcmxhY2UpOwogCiAJaWYgKCFwYXItPkZsYXRQYW5lbCkgeworCQlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPj0gTlZfQVJDSF80MCkKKwkJCU5WX1dSMzIocGFyLT5QUkFNREFDMCwgMHgwNTgwLCBzdGF0ZS0+Y29udHJvbCk7CisKIAkJTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA1MEMsIHN0YXRlLT5wbGxzZWwpOwogCQlOVl9XUjMyKHBhci0+UFJBTURBQzAsIDB4MDUwOCwgc3RhdGUtPnZwbGwpOwogCQlpZiAocGFyLT50d29IZWFkcykKQEAgLTE2MzEsNiArMTY1Miw5IEBACiAJc3RhdGUtPnNjYWxlID0gTlZfUkQzMihwYXItPlBSQU1EQUMsIDB4MDg0OCk7CiAJc3RhdGUtPmNvbmZpZyA9IE5WX1JEMzIocGFyLT5QRkIsIDB4MDIwMCk7CiAKKwlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPj0gTlZfQVJDSF80MCAmJiAhcGFyLT5GbGF0UGFuZWwpCisJCXN0YXRlLT5jb250cm9sICA9IE5WX1JEMzIocGFyLT5QUkFNREFDMCwgMHgwNTgwKTsKKwogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzEwKSB7CiAJCWlmIChwYXItPnR3b0hlYWRzKSB7CiAJCQlzdGF0ZS0+aGVhZCA9IE5WX1JEMzIocGFyLT5QQ1JUQzAsIDB4MDg2MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYwppbmRleCA3MDdlMmM4Li44MjU3OWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKQEAgLTE2NiwxMSArMTY2LDEzIEBACiBzdGF0aWMgaW50IE5WSXNDb25uZWN0ZWQoc3RydWN0IG52aWRpYV9wYXIgKnBhciwgaW50IG91dHB1dCkKIHsKIAl2b2xhdGlsZSB1MzIgX19pb21lbSAqUFJBTURBQyA9IHBhci0+UFJBTURBQzA7Ci0JdTMyIHJlZzUyQywgcmVnNjA4OworCXUzMiByZWc1MkMsIHJlZzYwOCwgZGFjMF9yZWc2MDggPSAwOwogCWludCBwcmVzZW50OwogCi0JaWYgKG91dHB1dCkKLQkJUFJBTURBQyArPSAweDgwMDsKKwlpZiAob3V0cHV0KSB7CisJICAgIGRhYzBfcmVnNjA4ID0gTlZfUkQzMihQUkFNREFDLCAweDA2MDgpOworCSAgICBQUkFNREFDICs9IDB4ODAwOworCX0KIAogCXJlZzUyQyA9IE5WX1JEMzIoUFJBTURBQywgMHgwNTJDKTsKIAlyZWc2MDggPSBOVl9SRDMyKFBSQU1EQUMsIDB4MDYwOCk7CkBAIC0xOTQsOCArMTk2LDggQEAKIAllbHNlCiAJCXByaW50aygibnZpZGlhZmI6IENSVEMlaSBhbmFsb2cgbm90IGZvdW5kXG4iLCBvdXRwdXQpOwogCi0JTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA2MDgsIE5WX1JEMzIocGFyLT5QUkFNREFDMCwgMHgwNjA4KSAmCi0JCTB4MDAwMEVGRkYpOworCWlmIChvdXRwdXQpCisJICAgIE5WX1dSMzIocGFyLT5QUkFNREFDMCwgMHgwNjA4LCBkYWMwX3JlZzYwOCk7CiAKIAlOVl9XUjMyKFBSQU1EQUMsIDB4MDUyQywgcmVnNTJDKTsKIAlOVl9XUjMyKFBSQU1EQUMsIDB4MDYwOCwgcmVnNjA4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaCBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaAppbmRleCAzOGY3Y2MwLi4yZmRmNzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oCkBAIC04Niw2ICs4Niw3IEBACiAJdTMyIHRpbWluZ1Y7CiAJdTMyIGRpc3BsYXlWOwogCXUzMiBjcnRjU3luYzsKKwl1MzIgY29udHJvbDsKIH0gUklWQV9IV19TVEFURTsKIAogc3RydWN0IHJpdmFfcmVncyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCmluZGV4IDQxZjYzNjUuLmE3ZmUyMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCkBAIC02NzQsNiArNjc0LDcgQEAKIAkJaW5mby0+ZmJvcHMtPmZiX3N5bmMgPSBudmlkaWFmYl9zeW5jOwogCQlpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiA9IDQ7CiAJCWluZm8tPmZsYWdzICY9IH5GQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX1JFQURTX0ZBU1Q7CiAJCU5WUmVzZXRHcmFwaGljcyhpbmZvKTsKIAl9IGVsc2UgewogCQlpbmZvLT5mYm9wcy0+ZmJfaW1hZ2VibGl0ID0gY2ZiX2ltYWdlYmxpdDsKQEAgLTY4Miw2ICs2ODMsNyBAQAogCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IE5VTEw7CiAJCWluZm8tPnBpeG1hcC5zY2FuX2FsaWduID0gMTsKIAkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJCWluZm8tPmZsYWdzICY9IH5GQklORk9fUkVBRFNfRkFTVDsKIAl9CiAKIAlwYXItPmN1cnNvcl9yZXNldCA9IDE7CkBAIC0xMTkzLDcgKzExOTUsOCBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldmljZSBJRDogJXggXG4iLCBpZCk7CiAKLQlpZiAoKGlkICYgMHhmZmYwKSA9PSAweDAwZjApIHsKKwlpZiAoKGlkICYgMHhmZmYwKSA9PSAweDAwZjAgfHwKKwkgICAgKGlkICYgMHhmZmYwKSA9PSAweDAyZTApIHsKIAkJLyogcGNpLWUgKi8KIAkJaWQgPSBOVl9SRDMyKHBhci0+UkVHUywgMHgxODAwKTsKIApAQCAtMTIzOCwxOCArMTI0MSwxNiBAQAogCWNhc2UgMHgwMDQwOgkJLyogR2VGb3JjZSA2ODAwICovCiAJY2FzZSAweDAwQzA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KIAljYXNlIDB4MDEyMDoJCS8qIEdlRm9yY2UgNjgwMCAqLwotCWNhc2UgMHgwMTMwOgogCWNhc2UgMHgwMTQwOgkJLyogR2VGb3JjZSA2NjAwICovCiAJY2FzZSAweDAxNjA6CQkvKiBHZUZvcmNlIDYyMDAgKi8KIAljYXNlIDB4MDFEMDoJCS8qIEdlRm9yY2UgNzIwMCwgNzMwMCwgNzQwMCAqLwotCWNhc2UgMHgwMkUwOgkJLyogR2VGb3JjZSA3MzAwIEdUICovCiAJY2FzZSAweDAwOTA6CQkvKiBHZUZvcmNlIDc4MDAgKi8KIAljYXNlIDB4MDIxMDoJCS8qIEdlRm9yY2UgNjgwMCAqLwogCWNhc2UgMHgwMjIwOgkJLyogR2VGb3JjZSA2MjAwICovCi0JY2FzZSAweDAyMzA6CiAJY2FzZSAweDAyNDA6CQkvKiBHZUZvcmNlIDYxMDAgKi8KIAljYXNlIDB4MDI5MDoJCS8qIEdlRm9yY2UgNzkwMCAqLwogCWNhc2UgMHgwMzkwOgkJLyogR2VGb3JjZSA3NjAwICovCisJY2FzZSAweDAzRDA6CiAJCWFyY2ggPSBOVl9BUkNIXzQwOwogCQlicmVhazsKIAljYXNlIDB4MDAyMDoJCS8qIFROVCwgVE5UMiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vZmZiLmMgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwppbmRleCA4ODViNDI4Li40NTI0MzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29mZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSArIHNpemVvZih1MzIpICogMTc7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmJfaW5mbykgKyBzaXplb2YodTMyKSAqIDE2OwogCiAJaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNGQyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZwpAQCAtMCwwICsxLDU4IEBACitjb25maWcgRkJfT01BUAorCXRyaXN0YXRlICJPTUFQIGZyYW1lIGJ1ZmZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRkIKKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJaGVscAorICAgICAgICAgIEZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIE9NQVAgYmFzZWQgYm9hcmRzLgorCitjb25maWcgRkJfT01BUF9CT09UTE9BREVSX0lOSVQKKwlib29sICJDaGVjayBib290bG9hZGVyIGluaXRpYWxpemFpb24iCisJZGVwZW5kcyBvbiBGQl9PTUFQCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgY2hlY2tpbmcgaWYgdGhlIGJvb3Rsb2FkZXIgaGFzCisJICBhbHJlYWR5IGluaXRpYWxpemVkIHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIuIEluIHRoaXMgY2FzZSB0aGUKKwkgIGRyaXZlciB3aWxsIHNraXAgdGhlIGluaXRpYWxpemF0aW9uLgorCitjb25maWcgRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFCisJaW50ICJDb25zaXN0ZW50IERNQSBtZW1vcnkgc2l6ZSAoTUIpIgorCWRlcGVuZHMgb24gRkJfT01BUAorCXJhbmdlIDEgMTQKKwlkZWZhdWx0IDIKKwloZWxwCisJICBJbmNyZWFzZSB0aGUgRE1BIGNvbnNpc3RlbnQgbWVtb3J5IHNpemUgYWNjb3JkaW5nIHRvIHlvdXIgdmlkZW8KKwkgIG1lbW9yeSBuZWVkcywgZm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gdXNlIG11bHRpcGxlIHBsYW5lcy4KKwkgIFRoZSBzaXplIG11c3QgYmUgMk1CIGFsaWduZWQuCisJICBJZiB1bnN1cmUgc2F5IDEuCisKK2NvbmZpZyBGQl9PTUFQX0RNQV9UVU5FCisgICAgICAgIGJvb2wgIlNldCBETUEgU0RSQU0gYWNjZXNzIHByaW9yaXR5IGhpZ2giCisgICAgICAgIGRlcGVuZHMgb24gRkJfT01BUCAmJiBBUkNIX09NQVAxCisgICAgICAgIGhlbHAKKyAgICAgICAgICBPbiBzeXN0ZW1zIGluIHdoaWNoIHZpZGVvIG1lbW9yeSBpcyBpbiBzeXN0ZW0gbWVtb3J5CisgICAgICAgICAgKFNEUkFNKSB0aGlzIHdpbGwgc3BlZWQgdXAgZ3JhcGhpY3MgRE1BIG9wZXJhdGlvbnMuCisgICAgICAgICAgSWYgeW91IGhhdmUgc3VjaCBhIHN5c3RlbSBhbmQgd2FudCB0byB1c2Ugcm90YXRpb24KKyAgICAgICAgICBhbnN3ZXIgeWVzLiBBbnN3ZXIgbm8gaWYgeW91IGhhdmUgYSBkZWRpY2F0ZWQgdmlkZW8KKyAgICAgICAgICBtZW1vcnksIG9yIGRvbid0IHVzZSBhbnkgb2YgdGhlIGFjY2VsZXJhdGVkIGZlYXR1cmVzLgorCitjb25maWcgRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJYm9vbCAiRXh0ZXJuYWwgTENEIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCX09NQVAKKwloZWxwCisJICBTYXkgWSBoZXJlLCBpZiB5b3Ugd2FudCB0byBoYXZlIHN1cHBvcnQgZm9yIGJvYXJkcyB3aXRoIGFuCisJICBleHRlcm5hbCBMQ0QgY29udHJvbGxlciBjb25uZWN0ZWQgdG8gdGhlIFNvU1NJL1JGQkkgaW50ZXJmYWNlLgorCitjb25maWcgRkJfT01BUF9MQ0RDX0hXQTc0MgorCWJvb2wgIkVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkJfT01BUCAmJiBGQl9PTUFQX0xDRENfRVhURVJOQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydCBmb3IgdGhlIGV4dGVybmFsCisJICBFcHNvbiBIV0E3NDIgTENEIGNvbnRyb2xsZXIuCisKK2NvbmZpZyBGQl9PTUFQX0xDRENfQkxJWlpBUkQKKwlib29sICJFcHNvbiBCbGl6emFyZCBMQ0QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkJfT01BUCAmJiBGQl9PTUFQX0xDRENfRVhURVJOQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydCBmb3IgdGhlIGV4dGVybmFsCisJICBFcHNvbiBCbGl6emFyZCBMQ0QgY29udHJvbGxlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRhOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBuZXcgT01BUCBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19GQl9PTUFQKSArPSBvbWFwZmIubworCitvYmpzLXl5IDo9IG9tYXBmYl9tYWluLm8KKworb2Jqcy15JChDT05GSUdfQVJDSF9PTUFQMSkgKz0gbGNkYy5vCitvYmpzLXkkKENPTkZJR19BUkNIX09NQVAyKSArPSBkaXNwYy5vCisKK29ianMtJChDT05GSUdfQVJDSF9PTUFQMSkkKENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJOQUwpICs9IHNvc3NpLm8KK29ianMtJChDT05GSUdfQVJDSF9PTUFQMikkKENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJOQUwpICs9IHJmYmkubworCitvYmpzLXkkKENPTkZJR19GQl9PTUFQX0xDRENfSFdBNzQyKSArPSBod2E3NDIubworb2Jqcy15JChDT05GSUdfRkJfT01BUF9MQ0RDX0JMSVpaQVJEKSArPSBibGl6emFyZC5vCisKK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9INCkgKz0gbGNkX2g0Lm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9IMykgKz0gbGNkX2gzLm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9QQUxNVEUpICs9IGxjZF9wYWxtdGUubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX1BBTE1UVCkgKz0gbGNkX3BhbG10dC5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfUEFMTVo3MSkgKz0gbGNkX3BhbG16NzEubworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAxNlhYKSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICs9IGxjZF9pbm4xNjEwLm8KK29ianMtJChDT05GSUdfQVJDSF9PTUFQMTVYWCkkKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKSArPSBsY2RfaW5uMTUxMC5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfT1NLKSArPSBsY2Rfb3NrLm8KK29ianMteSQoQ09ORklHX01BQ0hfU1gxKSArPSBsY2Rfc3gxLm8KKworb21hcGZiLW9ianMgOj0gJChvYmpzLXl5KQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvYmxpenphcmQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODI5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvYmxpenphcmQuYwpAQCAtMCwwICsxLDE1NjggQEAKKy8qCisgKiBFcHNvbiBCbGl6emFyZCBMQ0QgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogICAgIEp1aGEgWXJqb2xhICAgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgICAgICAgSW1yZSBEZWFrICAgICA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIFlVViBzdXBwb3J0OiBKdXNzaSBMYWFrbyAgIDxqdXNzaS5sYWFrb0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JsaXp6YXJkLmg+CisKKyNpbmNsdWRlICJkaXNwYy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkJCSJibGl6emFyZCIKKworI2RlZmluZSBCTElaWkFSRF9SRVZfQ09ERQkJCTB4MDAKKyNkZWZpbmUgQkxJWlpBUkRfQ09ORklHCQkJCTB4MDIKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0RJVgkJCTB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0xPQ0tfUkFOR0UJCQkweDA2CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8wCQkweDA4CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8xCQkweDBhCisjZGVmaW5lIEJMSVpaQVJEX1BMTF9NT0RFCQkJMHgwYworI2RlZmluZSBCTElaWkFSRF9DTEtfU1JDCQkJMHgwZQorI2RlZmluZSBCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUJCTB4MTAKKyNkZWZpbmUgQkxJWlpBUkRfTUVNX0JBTkswX1NUQVRVUwkJMHgxNAorI2RlZmluZSBCTElaWkFSRF9IRElTUAkJCQkweDJhCisjZGVmaW5lIEJMSVpaQVJEX0hORFAJCQkJMHgyYworI2RlZmluZSBCTElaWkFSRF9WRElTUDAJCQkJMHgyZQorI2RlZmluZSBCTElaWkFSRF9WRElTUDEJCQkJMHgzMAorI2RlZmluZSBCTElaWkFSRF9WTkRQCQkJCTB4MzIKKyNkZWZpbmUgQkxJWlpBUkRfSFNXCQkJCTB4MzQKKyNkZWZpbmUgQkxJWlpBUkRfVlNXCQkJCTB4MzgKKyNkZWZpbmUgQkxJWlpBUkRfRElTUExBWV9NT0RFCQkJMHg2OAorI2RlZmluZSBCTElaWkFSRF9JTlBVVF9XSU5fWF9TVEFSVF8wCQkweDZjCisjZGVmaW5lIEJMSVpaQVJEX0RBVEFfU09VUkNFX1NFTEVDVAkJMHg4ZQorI2RlZmluZSBCTElaWkFSRF9ESVNQX01FTV9EQVRBX1BPUlQJCTB4OTAKKyNkZWZpbmUgQkxJWlpBUkRfRElTUF9NRU1fUkVBRF9BRERSMAkJMHg5MgorI2RlZmluZSBCTElaWkFSRF9QT1dFUl9TQVZFCQkJMHhFNgorI2RlZmluZSBCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUwkJMHhFOAorCisvKiBEYXRhIHNvdXJjZSBzZWxlY3QgKi8KKy8qIEZvciBTMUQxMzc0NSAqLworI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0JBQ0tHUk9VTkQJMHgwMAorI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0RFU1RSVUNUSVZFCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX09WRVJMQVlfRU5BQkxFCTB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX0RJU0FCTEVfT1ZFUkxBWQkJMHgwNQorLyogRm9yIFMxRDEzNzQ0ICovCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0QJCQkweDAwCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19CTFRfTENECQkJMHgwNgorCisjZGVmaW5lIEJMSVpaQVJEX0NPTE9SX1JHQjU2NQkJCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfQ09MT1JfWVVWNDIwCQkJMHgwOQorCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDUJCTB4MDEJLyogSGFpbHN0b3JtICovCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQJCTB4MDIJLyogQmxpenphcmQgKi8KKworI2RlZmluZSBCTElaWkFSRF9BVVRPX1VQREFURV9USU1FCQkoSFogLyAyMCkKKworLyogUmVzZXJ2ZSA0IHJlcXVlc3Qgc2xvdHMgZm9yIHJlcXVlc3RzIGluIGlycSBjb250ZXh0ICovCisjZGVmaW5lIFJFUV9QT09MX1NJWkUJCQkyNAorI2RlZmluZSBJUlFfUkVRX1BPT0xfU0laRQkJNAorCisjZGVmaW5lIFJFUV9GUk9NX0lSUV9QT09MIDB4MDEKKworI2RlZmluZSBSRVFfQ09NUExFVEUJMAorI2RlZmluZSBSRVFfUEVORElORwkxCisKK3N0cnVjdCBibGl6emFyZF9yZWdfbGlzdCB7CisJaW50CXN0YXJ0OworCWludAllbmQ7Cit9OworCisvKiBUaGVzZSBuZWVkIHRvIGJlIHNhdmVkIC8gcmVzdG9yZWQgc2VwYXJhdGVseSBmcm9tIHRoZSByZXN0LiAqLworc3RhdGljIHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBibGl6emFyZF9wbGxfcmVnc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgwNCwJCS8qIERvbid0IHNhdmUgUExMIGN0cmwgKDB4MEMpICovCisJCS5lbmQJPSAweDBhLAorCX0sCisJeworCQkuc3RhcnQJPSAweDBlLAkJLyogQ2xvY2sgY29uZmlndXJhdGlvbiAqLworCQkuZW5kCT0gMHgwZSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBibGl6emFyZF9nZW5fcmVnc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgxOCwJCS8qIFNEUkFNIGNvbnRyb2wgKi8KKwkJLmVuZAk9IDB4MjAsCisJfSwKKwl7CisJCS5zdGFydAk9IDB4MjgsCQkvKiBMQ0QgUGFuZWwgY29uZmlndXJhdGlvbiAqLworCQkuZW5kCT0gMHg1YSwJCS8qIEhTU0kgaW50ZXJmYWNlLCBUViBjb25maWd1cmF0aW9uICovCisJfSwKK307CisKK3N0YXRpYyB1OCBibGl6emFyZF9yZWdfY2FjaGVbMHg1YSAvIDJdOworCitzdHJ1Y3QgdXBkYXRlX3BhcmFtIHsKKwlpbnQJcGxhbmU7CisJaW50CXgsIHksIHdpZHRoLCBoZWlnaHQ7CisJaW50CW91dF94LCBvdXRfeTsKKwlpbnQJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OworCWludAljb2xvcl9tb2RlOworCWludAlicHA7CisJaW50CWZsYWdzOworfTsKKworc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdW5zaWduZWQgaW50CSBmbGFnczsKKworCWludAkJICgqaGFuZGxlcikoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSk7CisJdm9pZAkJICgqY29tcGxldGUpKHZvaWQgKmRhdGEpOworCXZvaWQJCSAqY29tcGxldGVfZGF0YTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHVwZGF0ZV9wYXJhbQl1cGRhdGU7CisJCXN0cnVjdCBjb21wbGV0aW9uCSpzeW5jOworCX0gcGFyOworfTsKKworc3RydWN0IHBsYW5lX2luZm8geworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBwb3NfeCwgcG9zX3k7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IG91dF93aWR0aCwgb3V0X2hlaWdodDsKKwlpbnQgc2NyX3dpZHRoOworCWludCBjb2xvcl9tb2RlOworCWludCBicHA7Cit9OworCitzdHJ1Y3QgYmxpenphcmRfc3RydWN0IHsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZDsKKworCXN0cnVjdCB0aW1lcl9saXN0CWF1dG9fdXBkYXRlX3RpbWVyOworCWludAkJCXN0b3BfYXV0b191cGRhdGU7CisJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93CWF1dG9fdXBkYXRlX3dpbmRvdzsKKwlpbnQJCQllbmFibGVkX3BsYW5lczsKKwlpbnQJCQl2aWRfbm9uc3RkX2NvbG9yOworCWludAkJCXZpZF9zY2FsZWQ7CisJaW50CQkJbGFzdF9jb2xvcl9tb2RlOworCWludAkJCXpvb21fb247CisJaW50CQkJc2NyZWVuX3dpZHRoOworCWludAkJCXNjcmVlbl9oZWlnaHQ7CisJdW5zaWduZWQJCXRlX2Nvbm5lY3RlZDoxOworCXVuc2lnbmVkCQl2c3luY19vbmx5OjE7CisKKwlzdHJ1Y3QgcGxhbmVfaW5mbwlwbGFuZVtPTUFQRkJfUExBTkVfTlVNXTsKKworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0CXJlcV9wb29sW1JFUV9QT09MX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQJcGVuZGluZ19yZXFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfcmVxX2xpc3Q7CisJc3RydWN0IHNlbWFwaG9yZQlyZXFfc2VtYTsKKwlzcGlubG9ja190CQlyZXFfbG9jazsKKworCXVuc2lnbmVkIGxvbmcJCXN5c19ja19yYXRlOworCXN0cnVjdCBleHRpZl90aW1pbmdzCXJlZ190aW1pbmdzLCBsdXRfdGltaW5nczsKKworCXUzMgkJCW1heF90cmFuc21pdF9zaXplOworCXUzMgkJCWV4dGlmX2Nsa19wZXJpb2Q7CisJaW50CQkJZXh0aWZfY2xrX2RpdjsKKwl1bnNpZ25lZCBsb25nCQlwaXhfdHhfdGltZTsKKwl1bnNpZ25lZCBsb25nCQlsaW5lX3VwZF90aW1lOworCisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCXN0cnVjdCBsY2RfY3RybF9leHRpZgkqZXh0aWY7CisJc3RydWN0IGxjZF9jdHJsCQkqaW50X2N0cmw7CisKKwl2b2lkCQkJKCpwb3dlcl91cCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkCQkJKCpwb3dlcl9kb3duKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisJaW50CQkJdmVyc2lvbjsKK30gYmxpenphcmQ7CisKK3N0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJsOworCitzdGF0aWMgdTggYmxpenphcmRfcmVhZF9yZWcodTggcmVnKQoreworCXU4IGRhdGE7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWJsaXp6YXJkLmV4dGlmLT5yZWFkX2RhdGEoJmRhdGEsIDEpOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3dyaXRlX3JlZyh1OCByZWcsIHU4IHZhbCkKK3sKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9kYXRhKCZ2YWwsIDEpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN0YXJ0X3NkcmFtKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bW87CisKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTUVNX0JBTkswX0FDVElWQVRFLCAwKTsKKwl1ZGVsYXkoNTApOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUsIDEpOworCXRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMCk7CisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTUVNX0JBTkswX1NUQVRVUykgJiAweDAxKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJCSJzMWQxMzc0eDogU0RSQU0gbm90IHJlYWR5Iik7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zdG9wX3NkcmFtKHZvaWQpCit7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSwgMCk7Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIGxhc3Qgd2luZG93IHdhcyBjb21wbGV0ZWx5IHdyaXR0ZW4gaW50byB0aGUgY29udHJvbGxlcnMKKyAqIFNEUkFNIGFuZCB3ZSBjYW4gc3RhcnQgdHJhbnNmZXJyaW5nIHRoZSBuZXh0IHdpbmRvdy4KKyAqLworc3RhdGljIHZvaWQgYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzApOworCisJd2hpbGUgKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKSAmICgxIDw8IDcpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJCQkiczFkMTM3NHg6IGxpbmUgYnVmZmVyIG5vdCByZWFkeVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogV2FpdCB1bnRpbCB0aGUgWVlDIGNvbG9yIHNwYWNlIGNvbnZlcnRlciBpcyBpZGxlLiAqLworc3RhdGljIHZvaWQgYmxpenphcmRfd2FpdF95eWModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDMwKTsKKworCXdoaWxlIChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUykgJiAoMSA8PCA0KSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkJInMxZDEzNzR4OiBZWUMgbm90IHJlYWR5XG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX292ZXJsYXkodm9pZCkKK3sKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfREFUQV9TT1VSQ0VfU0VMRUNULAorCQkJCUJMSVpaQVJEX1NSQ19ESVNBQkxFX09WRVJMQVkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfd2luZG93X3JlZ3MoaW50IHhfc3RhcnQsIGludCB5X3N0YXJ0LCBpbnQgeF9lbmQsIGludCB5X2VuZCwKKwkJCSAgICBpbnQgeF9vdXRfc3RhcnQsIGludCB5X291dF9zdGFydCwKKwkJCSAgICBpbnQgeF9vdXRfZW5kLCBpbnQgeV9vdXRfZW5kLCBpbnQgY29sb3JfbW9kZSwKKwkJCSAgICBpbnQgem9vbV9vZmYsIGludCBmbGFncykKK3sKKwl1OCB0bXBbMThdOworCXU4IGNtZDsKKworCXhfZW5kLS07CisJeV9lbmQtLTsKKwl0bXBbMF0gPSB4X3N0YXJ0OworCXRtcFsxXSA9IHhfc3RhcnQgPj4gODsKKwl0bXBbMl0gPSB5X3N0YXJ0OworCXRtcFszXSA9IHlfc3RhcnQgPj4gODsKKwl0bXBbNF0gPSB4X2VuZDsKKwl0bXBbNV0gPSB4X2VuZCA+PiA4OworCXRtcFs2XSA9IHlfZW5kOworCXRtcFs3XSA9IHlfZW5kID4+IDg7CisKKwl4X291dF9lbmQtLTsKKwl5X291dF9lbmQtLTsKKwl0bXBbOF0gID0geF9vdXRfc3RhcnQ7CisJdG1wWzldICA9IHhfb3V0X3N0YXJ0ID4+IDg7CisJdG1wWzEwXSA9IHlfb3V0X3N0YXJ0OworCXRtcFsxMV0gPSB5X291dF9zdGFydCA+PiA4OworCXRtcFsxMl0gPSB4X291dF9lbmQ7CisJdG1wWzEzXSA9IHhfb3V0X2VuZCA+PiA4OworCXRtcFsxNF0gPSB5X291dF9lbmQ7CisJdG1wWzE1XSA9IHlfb3V0X2VuZCA+PiA4OworCisJdG1wWzE2XSA9IGNvbG9yX21vZGU7CisJaWYgKHpvb21fb2ZmICYmIGJsaXp6YXJkLnZlcnNpb24gPT0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NSkKKwkJdG1wWzE3XSA9IEJMSVpaQVJEX1NSQ19XUklURV9MQ0RfQkFDS0dST1VORDsKKwllbHNlIGlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19FTkFCTEVfT1ZFUkxBWSkKKwkJdG1wWzE3XSA9IEJMSVpaQVJEX1NSQ19XUklURV9PVkVSTEFZX0VOQUJMRTsKKwllbHNlCisJCXRtcFsxN10gPSBibGl6emFyZC52ZXJzaW9uID09IEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQgPworCQkJCUJMSVpaQVJEX1NSQ19XUklURV9MQ0QgOgorCQkJCUJMSVpaQVJEX1NSQ19XUklURV9MQ0RfREVTVFJVQ1RJVkU7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWNtZCA9IEJMSVpaQVJEX0lOUFVUX1dJTl9YX1NUQVJUXzA7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2NvbW1hbmQoJmNtZCwgMSk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2RhdGEodG1wLCAxOCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV90ZWFyc3luYyhpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuX2hlaWdodCwKKwkJCSAgICBpbnQgb3V0X2hlaWdodCwgaW50IGZvcmNlX3ZzeW5jKQoreworCXU4IGI7CisKKwliID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpOworCWIgfD0gMSA8PCAzOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUywgYik7CisKKwlpZiAobGlrZWx5KGJsaXp6YXJkLnZzeW5jX29ubHkgfHwgZm9yY2VfdnN5bmMpKSB7CisJCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod2lkdGggKiBibGl6emFyZC5waXhfdHhfdGltZSA8IGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUpIHsKKwkJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgod2lkdGggKiBibGl6emFyZC5waXhfdHhfdGltZSAvIDEwMDApICogaGVpZ2h0IDwKKwkgICAgKHkgKyBvdXRfaGVpZ2h0KSAqIChibGl6emFyZC5saW5lX3VwZF90aW1lIC8gMTAwMCkpIHsKKwkJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgeSArIDEpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3RlYXJzeW5jKHZvaWQpCit7CisJdTggYjsKKworCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMCwgMCk7CisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKKwliICY9IH4oMSA8PCAzKTsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMsIGIpOworCWIgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZXh0aWZfdGltaW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmFsbG9jX3JlcSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcTsKKwlpbnQgcmVxX2ZsYWdzID0gMDsKKworCWlmICghaW5faW50ZXJydXB0KCkpCisJCWRvd24oJmJsaXp6YXJkLnJlcV9zZW1hKTsKKwllbHNlCisJCXJlcV9mbGFncyA9IFJFUV9GUk9NX0lSUV9QT09MOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisJQlVHX09OKGxpc3RfZW1wdHkoJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpKTsKKwlyZXEgPSBsaXN0X2VudHJ5KGJsaXp6YXJkLmZyZWVfcmVxX2xpc3QubmV4dCwKKwkJCSBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+ZW50cnkpOworCXJlcS0+ZmxhZ3MgPSByZXFfZmxhZ3M7CisKKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9yZXEoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJbGlzdF9hZGQoJnJlcS0+ZW50cnksICZibGl6emFyZC5mcmVlX3JlcV9saXN0KTsKKwlpZiAoIShyZXEtPmZsYWdzICYgUkVRX0ZST01fSVJRX1BPT0wpKQorCQl1cCgmYmxpenphcmQucmVxX3NlbWEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0KSkgeworCQlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCQl2b2lkICgqY29tcGxldGUpKHZvaWQgKik7CisJCXZvaWQgKmNvbXBsZXRlX2RhdGE7CisKKwkJcmVxID0gbGlzdF9lbnRyeShibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0Lm5leHQsCisJCQkJIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBlbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJlcS0+aGFuZGxlcihyZXEpID09IFJFUV9QRU5ESU5HKQorCQkJcmV0dXJuOworCisJCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwkJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKwkJZnJlZV9yZXEocmVxKTsKKworCQlpZiAoY29tcGxldGUpCisJCQljb21wbGV0ZShjb21wbGV0ZV9kYXRhKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfcmVxX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcm9jZXNzID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QpKSkKKwkJcHJvY2VzcyA9IDA7CisJbGlzdF9zcGxpY2VfaW5pdChoZWFkLCBibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0LnByZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwlpZiAocHJvY2VzcykKKwkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdAkqcmVxID0gKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICopZGF0YTsKKwl2b2lkCQkJKCpjb21wbGV0ZSkodm9pZCAqKTsKKwl2b2lkCQkJKmNvbXBsZXRlX2RhdGE7CisKKwljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKworCWZyZWVfcmVxKHJlcSk7CisKKwlpZiAoY29tcGxldGUpCisJCWNvbXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKKworc3RhdGljIGludCBkb19mdWxsX3NjcmVlbl91cGRhdGUoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgaTsKKwlpbnQgZmxhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW2ldOworCQlpZiAoIShibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmICgxIDw8IGkpKSkgeworCQkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInB3ICVkIHBoICVkXG4iLAorCQkJcC0+d2lkdGgsIHAtPmhlaWdodCk7CisJCWJsaXp6YXJkLmludF9jdHJsLT5zZXR1cF9wbGFuZShpLAorCQkJCU9NQVBGQl9DSEFOTkVMX09VVF9MQ0QsIHAtPm9mZnNldCwKKwkJCQlwLT5zY3Jfd2lkdGgsIHAtPnBvc194LCBwLT5wb3NfeSwKKwkJCQlwLT53aWR0aCwgcC0+aGVpZ2h0LAorCQkJCXAtPmNvbG9yX21vZGUpOworCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDEpOworCX0KKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInN3ICVkIHNoICVkXG4iLAorCQlibGl6emFyZC5zY3JlZW5fd2lkdGgsIGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQpOworCWJsaXp6YXJkX3dhaXRfbGluZV9idWZmZXIoKTsKKwlmbGFncyA9IHJlcS0+cGFyLnVwZGF0ZS5mbGFnczsKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMpCisJCWVuYWJsZV90ZWFyc3luYygwLCBibGl6emFyZC5zY3JlZW5fd2lkdGgsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQlibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpOworCWVsc2UKKwkJZGlzYWJsZV90ZWFyc3luYygpOworCisJc2V0X3dpbmRvd19yZWdzKDAsIDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCTAsIDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCUJMSVpaQVJEX0NPTE9SX1JHQjU2NSwgYmxpenphcmQuem9vbV9vbiwgZmxhZ3MpOworCWJsaXp6YXJkLnpvb21fb24gPSAwOworCisJYmxpenphcmQuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSgxNik7CisJLyogc2V0X3dpbmRvd19yZWdzIGhhcyBsZWZ0IHRoZSByZWdpc3RlciBpbmRleCBhdCB0aGUgcmlnaHQKKwkgKiBwbGFjZSwgc28gbm8gbmVlZCB0byBzZXQgaXQgaGVyZS4KKwkgKi8KKwlibGl6emFyZC5leHRpZi0+dHJhbnNmZXJfYXJlYShibGl6emFyZC5zY3JlZW5fd2lkdGgsCisJCQkJICAgICAgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQkgICAgICByZXF1ZXN0X2NvbXBsZXRlLCByZXEpOworCXJldHVybiBSRVFfUEVORElORzsKK30KKworLyogU2V0dXAgYWxsIHBsYW5lcyB3aXRoIGFuIG92ZXJsYXBwaW5nIGFyZWEgd2l0aCB0aGUgdXBkYXRlIHdpbmRvdy4gKi8KK3N0YXRpYyBpbnQgZG9fcGFydGlhbF91cGRhdGUoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSwgaW50IHBsYW5lLAorCQkJICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKwkJCSAgICAgaW50IHhfb3V0LCBpbnQgeV9vdXQsIGludCB3X291dCwgaW50IGhfb3V0LAorCQkJICAgICBpbnQgd25kX2NvbG9yX21vZGUsIGludCBicHApCit7CisJaW50IGk7CisJaW50IGd4MSwgZ3kxLCBneDIsIGd5MjsKKwlpbnQgZ3gxX291dCwgZ3kxX291dCwgZ3gyX291dCwgZ3kyX291dDsKKwlpbnQgY29sb3JfbW9kZTsKKwlpbnQgZmxhZ3M7CisJaW50IHpvb21fb2ZmOworCisJLyogR2xvYmFsIGNvb3JkaW5hdGVzLCByZWxhdGl2ZSB0byBwaXhlbCAwLDAgb2YgdGhlIExDRCAqLworCWd4MSA9IHggKyBibGl6emFyZC5wbGFuZVtwbGFuZV0ucG9zX3g7CisJZ3kxID0geSArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeTsKKwlneDIgPSBneDEgKyB3OworCWd5MiA9IGd5MSArIGg7CisKKwlmbGFncyA9IHJlcS0+cGFyLnVwZGF0ZS5mbGFnczsKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRE9VQkxFKSB7CisJCWd4MV9vdXQgPSBneDE7CisJCWd5MV9vdXQgPSBneTE7CisJCWd4Ml9vdXQgPSBneDEgKyB3ICogMjsKKwkJZ3kyX291dCA9IGd5MSArIGggKiAyOworCX0gZWxzZSB7CisJCWd4MV9vdXQgPSB4X291dCArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeDsKKwkJZ3kxX291dCA9IHlfb3V0ICsgYmxpenphcmQucGxhbmVbcGxhbmVdLnBvc195OworCQlneDJfb3V0ID0gZ3gxX291dCArIHdfb3V0OworCQlneTJfb3V0ID0gZ3kxX291dCArIGhfb3V0OworCX0KKwl6b29tX29mZiA9IGJsaXp6YXJkLnpvb21fb24gJiYgZ3gxID09IDAgJiYgZ3kxID09IDAgJiYKKwkJdyA9PSBibGl6emFyZC5zY3JlZW5fd2lkdGggJiYgaCA9PSBibGl6emFyZC5zY3JlZW5faGVpZ2h0OworCWJsaXp6YXJkLnpvb21fb24gPSAoIXpvb21fb2ZmICYmIGJsaXp6YXJkLnpvb21fb24pIHx8CisJCQkgICAodyA8IHdfb3V0IHx8IGggPCBoX291dCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT01BUEZCX1BMQU5FX05VTTsgaSsrKSB7CisJCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW2ldOworCQlpbnQgcHgxLCBweTE7CisJCWludCBweDIsIHB5MjsKKwkJaW50IHB3LCBwaDsKKwkJaW50IHBwb3N4LCBwcG9zeTsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwkJaWYgKCEoYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJiAoMSA8PCBpKSkgIHx8CisJCSAgICAod25kX2NvbG9yX21vZGUgJiYgaSAhPSBwbGFuZSkpIHsKKwkJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBQbGFuZSBjb29yZGluYXRlcyAqLworCQlpZiAoaSA9PSBwbGFuZSkgeworCQkJLyogUGxhbmUgaW4gd2hpY2ggd2UgYXJlIGRvaW5nIHRoZSB1cGRhdGUuCisJCQkgKiBMb2NhbCBjb29yZGluYXRlcyBhcmUgdGhlIG9uZSBpbiB0aGUgdXBkYXRlCisJCQkgKiByZXF1ZXN0LgorCQkJICovCisJCQlweDEgPSB4OworCQkJcHkxID0geTsKKwkJCXB4MiA9IHggKyB3OworCQkJcHkyID0geSArIGg7CisJCQlwcG9zeCA9IDA7CisJCQlwcG9zeSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayBpZiB0aGlzIHBsYW5lIGhhcyBhbiBvdmVybGFwcGluZyBwYXJ0ICovCisJCQlweDEgPSBneDEgLSBwLT5wb3NfeDsKKwkJCXB5MSA9IGd5MSAtIHAtPnBvc195OworCQkJcHgyID0gZ3gyIC0gcC0+cG9zX3g7CisJCQlweTIgPSBneTIgLSBwLT5wb3NfeTsKKwkJCWlmIChweDEgPj0gcC0+d2lkdGggfHwgcHkxID49IHAtPmhlaWdodCB8fAorCQkJICAgIHB4MiA8PSAwIHx8IHB5MiA8PSAwKSB7CisJCQkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIENhbGN1bGF0ZSB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBvdmVybGFwcGluZworCQkJICogcGFydCBpbiB0aGUgcGxhbmUncyBsb2NhbCBjb29yZGluYXRlcy4KKwkJCSAqLworCQkJcHBvc3ggPSAtcHgxOworCQkJcHBvc3kgPSAtcHkxOworCQkJaWYgKHB4MSA8IDApCisJCQkJcHgxID0gMDsKKwkJCWlmIChweTEgPCAwKQorCQkJCXB5MSA9IDA7CisJCQlpZiAocHgyID4gcC0+d2lkdGgpCisJCQkJcHgyID0gcC0+d2lkdGg7CisJCQlpZiAocHkyID4gcC0+aGVpZ2h0KQorCQkJCXB5MiA9IHAtPmhlaWdodDsKKwkJCWlmIChwcG9zeCA8IDApCisJCQkJcHBvc3ggPSAwOworCQkJaWYgKHBwb3N5IDwgMCkKKwkJCQlwcG9zeSA9IDA7CisJCX0KKwkJcHcgPSBweDIgLSBweDE7CisJCXBoID0gcHkyIC0gcHkxOworCQlvZmZzZXQgPSBwLT5vZmZzZXQgKyAocC0+c2NyX3dpZHRoICogcHkxICsgcHgxKSAqIHAtPmJwcCAvIDg7CisJCWlmICh3bmRfY29sb3JfbW9kZSkKKwkJCS8qIFdpbmRvdyBlbWJlZGRlZCBpbiB0aGUgcGxhbmUgd2l0aCBhIGRpZmZlcmluZworCQkJICogY29sb3IgbW9kZSAvIGJwcC4gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgRE1BCisJCQkgKiB0cmFuc2ZlciBlbGVtZW50cyBpbiB0ZXJtcyBvZiB0aGUgcGxhbmUncyBicHAuCisJCQkgKi8KKwkJCXB3ID0gKHB3ICsgMSkgKiBicHAgLyBwLT5icHA7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkicGxhbmUgJWQgb2Zmc2V0ICUjMDhseCBwcG9zeCAlZCBwcG9zeSAlZCAiCisJCQkicHgxICVkIHB5MSAlZCBwdyAlZCBwaCAlZFxuIiwKKwkJCWksIG9mZnNldCwgcHBvc3gsIHBwb3N5LCBweDEsIHB5MSwgcHcsIHBoKTsKKyNlbmRpZgorCQlibGl6emFyZC5pbnRfY3RybC0+c2V0dXBfcGxhbmUoaSwKKwkJCQlPTUFQRkJfQ0hBTk5FTF9PVVRfTENELCBvZmZzZXQsCisJCQkJcC0+c2NyX3dpZHRoLAorCQkJCXBwb3N4LCBwcG9zeSwgcHcsIHBoLAorCQkJCXAtPmNvbG9yX21vZGUpOworCisJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMSk7CisJfQorCisJc3dpdGNoICh3bmRfY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJY29sb3JfbW9kZSA9IEJMSVpaQVJEX0NPTE9SX1lVVjQyMDsKKwkJLyogQ3VycmVudGx5IG9ubHkgdGhlIDE2IGJpdHMvcGl4ZWwgY3ljbGUgZm9ybWF0IGlzCisJCSAqIHN1cHBvcnRlZCBvbiB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiBBZGp1c3QgdGhlIG51bWJlcgorCQkgKiBvZiB0cmFuc2ZlciBlbGVtZW50cyBwZXIgbGluZSBmb3IgMTJicHAgZm9ybWF0LgorCQkgKi8KKwkJdyA9ICh3ICsgMSkgKiAzIC8gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29sb3JfbW9kZSA9IEJMSVpaQVJEX0NPTE9SX1JHQjU2NTsKKwkJYnJlYWs7CisJfQorCisJYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcigpOworCWlmIChibGl6emFyZC5sYXN0X2NvbG9yX21vZGUgPT0gQkxJWlpBUkRfQ09MT1JfWVVWNDIwKQorCQlibGl6emFyZF93YWl0X3l5YygpOworCWJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKQorCQllbmFibGVfdGVhcnN5bmMoZ3kxLCB3LCBoLAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJaF9vdXQsCisJCQkJZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpOworCWVsc2UKKwkJZGlzYWJsZV90ZWFyc3luYygpOworCisJc2V0X3dpbmRvd19yZWdzKGd4MSwgZ3kxLCBneDIsIGd5MiwgZ3gxX291dCwgZ3kxX291dCwgZ3gyX291dCwgZ3kyX291dCwKKwkJCWNvbG9yX21vZGUsIHpvb21fb2ZmLCBmbGFncyk7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDE2KTsKKwkvKiBzZXRfd2luZG93X3JlZ3MgaGFzIGxlZnQgdGhlIHJlZ2lzdGVyIGluZGV4IGF0IHRoZSByaWdodAorCSAqIHBsYWNlLCBzbyBubyBuZWVkIHRvIHNldCBpdCBoZXJlLgorCSAqLworCWJsaXp6YXJkLmV4dGlmLT50cmFuc2Zlcl9hcmVhKHcsIGgsIHJlcXVlc3RfY29tcGxldGUsIHJlcSk7CisKKwlyZXR1cm4gUkVRX1BFTkRJTkc7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHVwZGF0ZV9wYXJhbSAqcGFyID0gJnJlcS0+cGFyLnVwZGF0ZTsKKwlpbnQgcGxhbmUgPSBwYXItPnBsYW5lOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJInNlbmRfZnJhbWU6IHggJWQgeSAlZCB3ICVkIGggJWQgIgorCQkieF9vdXQgJWQgeV9vdXQgJWQgd19vdXQgJWQgaF9vdXQgJWQgIgorCQkiY29sb3JfbW9kZSAlMDR4IGZsYWdzICUwNHggcGxhbmVzICUwMXhcbiIsCisJCXBhci0+eCwgcGFyLT55LCBwYXItPndpZHRoLCBwYXItPmhlaWdodCwKKwkJcGFyLT5vdXRfeCwgcGFyLT5vdXRfeSwgcGFyLT5vdXRfd2lkdGgsIHBhci0+b3V0X2hlaWdodCwKKwkJcGFyLT5jb2xvcl9tb2RlLCBwYXItPmZsYWdzLCBibGl6emFyZC5lbmFibGVkX3BsYW5lcyk7CisjZW5kaWYKKwlpZiAocGFyLT5mbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19ESVNBQkxFX09WRVJMQVkpCisJCWRpc2FibGVfb3ZlcmxheSgpOworCisJaWYgKChibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmIGJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IpIHx8CisJICAgICAoYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJiBibGl6emFyZC52aWRfc2NhbGVkKSkKKwkJcmV0dXJuIGRvX2Z1bGxfc2NyZWVuX3VwZGF0ZShyZXEpOworCisJcmV0dXJuIGRvX3BhcnRpYWxfdXBkYXRlKHJlcSwgcGxhbmUsIHBhci0+eCwgcGFyLT55LAorCQkJCSBwYXItPndpZHRoLCBwYXItPmhlaWdodCwKKwkJCQkgcGFyLT5vdXRfeCwgcGFyLT5vdXRfeSwKKwkJCQkgcGFyLT5vdXRfd2lkdGgsIHBhci0+b3V0X2hlaWdodCwKKwkJCQkgcGFyLT5jb2xvcl9tb2RlLCBwYXItPmJwcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZnJhbWVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKK30KKworI2RlZmluZSBBRERfUFJFUShfeCwgX3ksIF93LCBfaCwgX3hfb3V0LCBfeV9vdXQsIF93X291dCwgX2hfb3V0KSBkbyB7CVwKKwlyZXEgPSBhbGxvY19yZXEoKTsJCQlcCisJcmVxLT5oYW5kbGVyCT0gc2VuZF9mcmFtZV9oYW5kbGVyOwlcCisJcmVxLT5jb21wbGV0ZQk9IHNlbmRfZnJhbWVfY29tcGxldGU7CVwKKwlyZXEtPnBhci51cGRhdGUucGxhbmUgPSBwbGFuZV9pZHg7CVwKKwlyZXEtPnBhci51cGRhdGUueCA9IF94OwkJCVwKKwlyZXEtPnBhci51cGRhdGUueSA9IF95OwkJCVwKKwlyZXEtPnBhci51cGRhdGUud2lkdGggID0gX3c7CQlcCisJcmVxLT5wYXIudXBkYXRlLmhlaWdodCA9IF9oOwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRfeCA9IF94X291dDsJCVwKKwlyZXEtPnBhci51cGRhdGUub3V0X3kgPSBfeV9vdXQ7CQlcCisJcmVxLT5wYXIudXBkYXRlLm91dF93aWR0aCA9IF93X291dDsJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRfaGVpZ2h0ID0gX2hfb3V0OwlcCisJcmVxLT5wYXIudXBkYXRlLmJwcCA9IGJwcDsJCVwKKwlyZXEtPnBhci51cGRhdGUuY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7XAorCXJlcS0+cGFyLnVwZGF0ZS5mbGFncwkgID0gZmxhZ3M7CVwKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCByZXFfaGVhZCk7CVwKK30gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgY3JlYXRlX3JlcV9saXN0KGludCBwbGFuZV9pZHgsCisJCQkgICAgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqcmVxX2hlYWQpCit7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcTsKKwlpbnQgeCA9IHdpbi0+eDsKKwlpbnQgeSA9IHdpbi0+eTsKKwlpbnQgd2lkdGggPSB3aW4tPndpZHRoOworCWludCBoZWlnaHQgPSB3aW4tPmhlaWdodDsKKwlpbnQgeF9vdXQgPSB3aW4tPm91dF94OworCWludCB5X291dCA9IHdpbi0+b3V0X3k7CisJaW50IHdpZHRoX291dCA9IHdpbi0+b3V0X3dpZHRoOworCWludCBoZWlnaHRfb3V0ID0gd2luLT5vdXRfaGVpZ2h0OworCWludCBjb2xvcl9tb2RlOworCWludCBicHA7CisJaW50IGZsYWdzOworCXVuc2lnbmVkIGludCB5c3RhcnQgPSB5OworCXVuc2lnbmVkIGludCB5c3BhbiA9IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgeXN0YXJ0X291dCA9IHlfb3V0OworCXVuc2lnbmVkIGludCB5c3Bhbl9vdXQgPSBoZWlnaHRfb3V0OworCisJZmxhZ3MgPSB3aW4tPmZvcm1hdCAmIH5PTUFQRkJfRk9STUFUX01BU0s7CisJY29sb3JfbW9kZSA9IHdpbi0+Zm9ybWF0ICYgT01BUEZCX0ZPUk1BVF9NQVNLOworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJLyogRW1iZWRkZWQgd2luZG93IHdpdGggZGlmZmVyZW50IGNvbG9yIG1vZGUgKi8KKwkJYnBwID0gMTI7CisJCS8qIFgsIFksIGhlaWdodCBtdXN0IGJlIGFsaWduZWQgYXQgMiwgd2lkdGggYXQgNCBwaXhlbHMgKi8KKwkJeCAmPSB+MTsKKwkJeSAmPSB+MTsKKwkJaGVpZ2h0ID0geXNwYW4gPSBoZWlnaHQgJiB+MTsKKwkJd2lkdGggPSB3aWR0aCAmIH4zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTYW1lIGFzIHRoZSBwbGFuZSBjb2xvciBtb2RlICovCisJCWJwcCA9IGJsaXp6YXJkLnBsYW5lW3BsYW5lX2lkeF0uYnBwOworCQlicmVhazsKKwl9CisJaWYgKHdpZHRoICogaGVpZ2h0ICogYnBwIC8gOCA+IGJsaXp6YXJkLm1heF90cmFuc21pdF9zaXplKSB7CisJCXlzcGFuID0gYmxpenphcmQubWF4X3RyYW5zbWl0X3NpemUgLyAod2lkdGggKiBicHAgLyA4KTsKKwkJeXNwYW5fb3V0ID0geXNwYW4gKiBoZWlnaHRfb3V0IC8gaGVpZ2h0OworCQlBRERfUFJFUSh4LCB5c3RhcnQsIHdpZHRoLCB5c3BhbiwgeF9vdXQsIHlzdGFydF9vdXQsCisJCQkgd2lkdGhfb3V0LCB5c3Bhbl9vdXQpOworCQl5c3RhcnQgKz0geXNwYW47CisJCXlzdGFydF9vdXQgKz0geXNwYW5fb3V0OworCQl5c3BhbiA9IGhlaWdodCAtIHlzcGFuOworCQl5c3Bhbl9vdXQgPSBoZWlnaHRfb3V0IC0geXNwYW5fb3V0OworCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DOworCX0KKworCUFERF9QUkVRKHgsIHlzdGFydCwgd2lkdGgsIHlzcGFuLCB4X291dCwgeXN0YXJ0X291dCwKKwkJIHdpZHRoX291dCwgeXNwYW5fb3V0KTsKK30KKworc3RhdGljIHZvaWQgYXV0b191cGRhdGVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlpZiAoIWJsaXp6YXJkLnN0b3BfYXV0b191cGRhdGUpCisJCW1vZF90aW1lcigmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIsCisJCQkgIGppZmZpZXMgKyBCTElaWkFSRF9BVVRPX1VQREFURV9USU1FKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfdXBkYXRlX3dpbmRvd19hdXRvKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmxhc3Q7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lOworCisJcGxhbmUgPSBibGl6emFyZC5mYmRldi0+ZmJfaW5mb1swXS0+cGFyOworCWNyZWF0ZV9yZXFfbGlzdChwbGFuZS0+aWR4LAorCQkJJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdywgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCisJbGFzdC0+Y29tcGxldGUgPSBhdXRvX3VwZGF0ZV9jb21wbGV0ZTsKKwlsYXN0LT5jb21wbGV0ZV9kYXRhID0gTlVMTDsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworfQorCitpbnQgYmxpenphcmRfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCSBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQkgdm9pZCAoKmNvbXBsZXRlX2NhbGxiYWNrKSh2b2lkICphcmcpLAorCQkJCSB2b2lkICpjb21wbGV0ZV9jYWxsYmFja19kYXRhKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmxhc3Q7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisKKwlpZiAodW5saWtlbHkoYmxpenphcmQudXBkYXRlX21vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoIWJsaXp6YXJkLnRlX2Nvbm5lY3RlZCAmJgorCQkgICAgICh3aW4tPmZvcm1hdCAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyZWF0ZV9yZXFfbGlzdChwbGFuZS0+aWR4LCB3aW4sICZyZXFfbGlzdCk7CisJbGFzdCA9IGxpc3RfZW50cnkocmVxX2xpc3QucHJldiwgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gY29tcGxldGVfY2FsbGJhY2s7CisJbGFzdC0+Y29tcGxldGVfZGF0YSA9ICh2b2lkICopY29tcGxldGVfY2FsbGJhY2tfZGF0YTsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMpOworCitzdGF0aWMgaW50IHVwZGF0ZV9mdWxsX3NjcmVlbih2b2lkKQoreworCXJldHVybiBibGl6emFyZF91cGRhdGVfd2luZG93X2FzeW5jKGJsaXp6YXJkLmZiZGV2LT5mYl9pbmZvWzBdLAorCQkJCSAgICAgJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdywgTlVMTCwgTlVMTCk7CisKK30KKworc3RhdGljIGludCBibGl6emFyZF9zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSAgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgIGludCBjb2xvcl9tb2RlKQoreworCXN0cnVjdCBwbGFuZV9pbmZvICpwOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJICAgICJwbGFuZSAlZCBjaF9vdXQgJWQgb2Zmc2V0ICUjMDhseCBzY3Jfd2lkdGggJWQgIgorCQkgICAgInBvc194ICVkIHBvc195ICVkIHdpZHRoICVkIGhlaWdodCAlZCBjb2xvcl9tb2RlICVkXG4iLAorCQkgICAgcGxhbmUsIGNoYW5uZWxfb3V0LCBvZmZzZXQsIHNjcmVlbl93aWR0aCwKKwkJICAgIHBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCwgY29sb3JfbW9kZSk7CisjZW5kaWYKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcCA9ICZibGl6emFyZC5wbGFuZVtwbGFuZV07CisKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlwLT5icHAgPSAxNjsKKwkJYmxpenphcmQudmlkX25vbnN0ZF9jb2xvciAmPSB+KDEgPDwgcGxhbmUpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCXAtPmJwcCA9IDEyOworCQlibGl6emFyZC52aWRfbm9uc3RkX2NvbG9yIHw9IDEgPDwgcGxhbmU7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJcC0+YnBwID0gMTY7CisJCWJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IgJj0gfigxIDw8IHBsYW5lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcC0+b2Zmc2V0ID0gb2Zmc2V0OworCXAtPnBvc194ID0gcG9zX3g7CisJcC0+cG9zX3kgPSBwb3NfeTsKKwlwLT53aWR0aCA9IHdpZHRoOworCXAtPmhlaWdodCA9IGhlaWdodDsKKwlwLT5zY3Jfd2lkdGggPSBzY3JlZW5fd2lkdGg7CisJaWYgKCFwLT5vdXRfd2lkdGgpCisJCXAtPm91dF93aWR0aCA9IHdpZHRoOworCWlmICghcC0+b3V0X2hlaWdodCkKKwkJcC0+b3V0X2hlaWdodCA9IGhlaWdodDsKKworCXAtPmNvbG9yX21vZGUgPSBjb2xvcl9tb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfc2V0X3NjYWxlKGludCBwbGFuZSwgaW50IG9yaWdfdywgaW50IG9yaWdfaCwKKwkJCSAgICAgIGludCBvdXRfdywgaW50IG91dF9oKQoreworCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW3BsYW5lXTsKKwlpbnQgcjsKKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJInBsYW5lICVkIG9yaWdfdyAlZCBvcmlnX2ggJWQgb3V0X3cgJWQgb3V0X2ggJWRcbiIsCisJCXBsYW5lLCBvcmlnX3csIG9yaWdfaCwgb3V0X3csIG91dF9oKTsKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyID0gYmxpenphcmQuaW50X2N0cmwtPnNldF9zY2FsZShwbGFuZSwgb3JpZ193LCBvcmlnX2gsIG91dF93LCBvdXRfaCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXAtPndpZHRoID0gb3JpZ193OworCXAtPmhlaWdodCA9IG9yaWdfaDsKKwlwLT5vdXRfd2lkdGggPSBvdXRfdzsKKwlwLT5vdXRfaGVpZ2h0ID0gb3V0X2g7CisJaWYgKG9yaWdfdyA9PSBvdXRfdyAmJiBvcmlnX2ggPT0gb3V0X2gpCisJCWJsaXp6YXJkLnZpZF9zY2FsZWQgJj0gfigxIDw8IHBsYW5lKTsKKwllbHNlCisJCWJsaXp6YXJkLnZpZF9zY2FsZWQgfD0gMSA8PCBwbGFuZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX2VuYWJsZV9wbGFuZShpbnQgcGxhbmUsIGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgfD0gMSA8PCBwbGFuZTsKKwllbHNlCisJCWJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICY9IH4oMSA8PCBwbGFuZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeW5jX2hhbmRsZXIoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwljb21wbGV0ZShyZXEtPnBhci5zeW5jKTsKKwlyZXR1cm4gUkVRX0NPTVBMRVRFOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zeW5jKHZvaWQpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisKKwlyZXEgPSBhbGxvY19yZXEoKTsKKworCXJlcS0+aGFuZGxlciA9IHN5bmNfaGFuZGxlcjsKKwlyZXEtPmNvbXBsZXRlID0gTlVMTDsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXApOworCXJlcS0+cGFyLnN5bmMgPSAmY29tcDsKKworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmcmVxX2xpc3QpOworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcCk7Cit9CisKKworc3RhdGljIHZvaWQgYmxpenphcmRfYmluZF9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqbmIpCit7CisJaWYgKGJsaXp6YXJkLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9NQU5VQUxfVVBEQVRFKSB7CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFyZC5mYmRldiwgT01BUEZCX0VWRU5UX1JFQURZKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaWYgKHVubGlrZWx5KG1vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUgJiYKKwkJICAgICBtb2RlICE9IE9NQVBGQl9BVVRPX1VQREFURSAmJgorCQkgICAgIG1vZGUgIT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1vZGUgPT0gYmxpenphcmQudXBkYXRlX21vZGUpCisJCXJldHVybiAwOworCisJZGV2X2luZm8oYmxpenphcmQuZmJkZXYtPmRldiwgInMxZDEzNzR4OiBzZXR0aW5nIHVwZGF0ZSBtb2RlIHRvICVzXG4iLAorCQkJbW9kZSA9PSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEID8gImRpc2FibGVkIiA6CisJCQkobW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUgPyAiYXV0byIgOiAibWFudWFsIikpOworCisJc3dpdGNoIChibGl6emFyZC51cGRhdGVfbW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFyZC5mYmRldiwgT01BUEZCX0VWRU5UX0RJU0FCTEVEKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWJsaXp6YXJkLnN0b3BfYXV0b191cGRhdGUgPSAxOworCQlkZWxfdGltZXJfc3luYygmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCWJsaXp6YXJkLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwlibGl6emFyZF9zeW5jKCk7CisJYmxpenphcmQuc3RvcF9hdXRvX3VwZGF0ZSA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgorCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoYmxpenphcmQuZmJkZXYsIE9NQVBGQl9FVkVOVF9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlibGl6emFyZF91cGRhdGVfd2luZG93X2F1dG8oMCk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBibGl6emFyZF9nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gYmxpenphcmQudXBkYXRlX21vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZXh0aWZfdGltaW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwlibGl6emFyZC5leHRpZi0+c2V0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByb3VuZF90b19leHRpZl90aWNrcyh1bnNpZ25lZCBsb25nIHBzLCBpbnQgZGl2KQoreworCWludCBidXNfdGljayA9IGJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QgKiBkaXY7CisJcmV0dXJuIChwcyArIGJ1c190aWNrIC0gMSkgLyBidXNfdGljayAqIGJ1c190aWNrOworfQorCitzdGF0aWMgaW50IGNhbGNfcmVnX3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgMTIuMiBucyAocmVncyksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGltZSA9IFJFT25UaW1lICsgMTIgbnMgKHJlZ3MpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSArIDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyAyKlNZU0NMSyAgKHJlZ3MpLAorCSAqIFdyaXRlQ3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMgKi8KKworCXN5c3RpbSA9IDEwMDAwMDAwMDAgLyAoc3lzY2xrIC8gMTAwMCk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkgICJCbGl6emFyZCBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgZGl2ICVkXG4iLAorCQkgIHN5c3RpbSwgYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCwgZGl2KTsKKworCXQgPSAmYmxpenphcmQucmVnX3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgMTIyMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxMzAwMCwgZGl2KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW3JlZ11jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltyZWddd2VvbiAlZCB3ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW3JlZ11yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBibGl6emFyZC5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfbHV0X3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgNCAqIFNZU0NMSyArIDI2IChsdXQpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9mZlRpbWUgPSBSRU9uVGltZSArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogQ1NPZmZUaW1lID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNlV2lkdGggPSAxMCBucyAqLworCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAwKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJCbGl6emFyZCBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgZGl2ICVkXG4iLAorCQlzeXN0aW0sIGJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QsIGRpdik7CisKKwl0ID0gJmJsaXp6YXJkLmx1dF90aW1pbmdzOworCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKworCXQtPmNsa19kaXYgPSBkaXY7CisKKwl0LT5jc19vbl90aW1lID0gMDsKKwl0LT53ZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+cmVfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPmFjY2Vzc190aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAyNjAwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAyNjAwMCwgZGl2KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyMDAwICsgNCAqIHN5c3RpbSArIDI2MDAwLCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJlX2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSAiW2x1dF1jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJICJbbHV0XXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJCSB0LT53ZV9vbl90aW1lLCB0LT53ZV9vZmZfdGltZSwgdC0+cmVfY3ljbGVfdGltZSwKKwkJIHQtPndlX2N5Y2xlX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltsdXRdcmRhY2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkJIHQtPmFjY2Vzc190aW1lLCB0LT5jc19wdWxzZV93aWR0aCk7CisKKwlyZXR1cm4gYmxpenphcmQuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2V4dGlmX3RpbWluZ3ModW5zaWduZWQgbG9uZyBzeXNjbGssIGludCAqZXh0aWZfbWVtX2RpdikKK3sKKwlpbnQgbWF4X2Nsa19kaXY7CisJaW50IGRpdjsKKworCWJsaXp6YXJkLmV4dGlmLT5nZXRfY2xrX2luZm8oJmJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QsICZtYXhfY2xrX2Rpdik7CisJZm9yIChkaXYgPSAxOyBkaXYgPD0gbWF4X2Nsa19kaXY7IGRpdisrKSB7CisJCWlmIChjYWxjX3JlZ190aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGRpdiA+IG1heF9jbGtfZGl2KSB7CisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInJlZyB0aW1pbmcgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCSpleHRpZl9tZW1fZGl2ID0gZGl2OworCisJZm9yIChkaXYgPSAxOyBkaXYgPD0gbWF4X2Nsa19kaXY7IGRpdisrKSB7CisJCWlmIChjYWxjX2x1dF90aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpCisJCWdvdG8gZXJyOworCisJYmxpenphcmQuZXh0aWZfY2xrX2RpdiA9IGRpdjsKKworCXJldHVybiAwOworZXJyOgorCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwgImNhbid0IHNldHVwIHRpbWluZ3NcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2FsY19ibGl6emFyZF9jbGtfcmF0ZXModW5zaWduZWQgbG9uZyBleHRfY2xrLAorCQkJCXVuc2lnbmVkIGxvbmcgKnN5c19jbGssIHVuc2lnbmVkIGxvbmcgKnBpeF9jbGspCit7CisJaW50IHBpeF9jbGtfc3JjOworCWludCBzeXNfZGl2ID0gMCwgc3lzX211bCA9IDA7CisJaW50IHBpeF9kaXY7CisKKwlwaXhfY2xrX3NyYyA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0NMS19TUkMpOworCXBpeF9kaXYgPSAoKHBpeF9jbGtfc3JjID4+IDMpICYgMHgxZikgKyAxOworCWlmICgocGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpKSA9PSAwKSB7CisJCS8qIFNvdXJjZSBpcyB0aGUgUExMICovCisJCXN5c19kaXYgPSAoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikgJiAweDNmKSArIDE7CisJCXN5c19tdWwgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMCk7CisJCXN5c19tdWwgfD0gKChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMSkKKwkJCQkmIDB4MGYpCTw8IDExKTsKKwkJKnN5c19jbGsgPSBleHRfY2xrICogc3lzX211bCAvIHN5c19kaXY7CisJfSBlbHNlCS8qIGVsc2Ugc291cmNlIGlzIGV4dCBjbGssIG9yIG9zY2lsbGF0b3IgKi8KKwkJKnN5c19jbGsgPSBleHRfY2xrOworCisJKnBpeF9jbGsgPSAqc3lzX2NsayAvIHBpeF9kaXY7CQkJLyogSFogKi8KKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJleHRfY2xrICVsZCBwaXhfc3JjICVkIHBpeF9kaXYgJWQgc3lzX2RpdiAlZCBzeXNfbXVsICVkXG4iLAorCQlleHRfY2xrLCBwaXhfY2xrX3NyYyAmICgweDMgPDwgMSksIHBpeF9kaXYsIHN5c19kaXYsIHN5c19tdWwpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInN5c19jbGsgJWxkIHBpeF9jbGsgJWxkXG4iLAorCQkqc3lzX2NsaywgKnBpeF9jbGspOworfQorCitzdGF0aWMgaW50IHNldHVwX3RlYXJzeW5jKHVuc2lnbmVkIGxvbmcgcGl4X2NsaywgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaGRpc3AsIHZkaXNwOworCWludCBobmRwLCB2bmRwOworCWludCBoc3csIHZzdzsKKwlpbnQgaHMsIHZzOworCWludCBoc19wb2xfaW52LCB2c19wb2xfaW52OworCWludCB1c2VfaHN2cywgdXNlX25kcDsKKwl1OCAgYjsKKworCWhzdyA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0hTVyk7CisJdnN3ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfVlNXKTsKKwloc19wb2xfaW52ID0gIShoc3cgJiAweDgwKTsKKwl2c19wb2xfaW52ID0gISh2c3cgJiAweDgwKTsKKwloc3cgPSBoc3cgJiAweDdmOworCXZzdyA9IHZzdyAmIDB4M2Y7CisKKwloZGlzcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0hESVNQKSAqIDg7CisJdmRpc3AgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9WRElTUDApICsKKwkJKChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9WRElTUDEpICYgMHgzKSA8PCA4KTsKKworCWhuZHAgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ITkRQKSAmIDB4M2Y7CisJdm5kcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZORFApOworCisJLyogdGltZSB0byB0cmFuc2ZlciBvbmUgcGl4ZWwgKDE2YnBwKSBpbiBwcyAqLworCWJsaXp6YXJkLnBpeF90eF90aW1lID0gYmxpenphcmQucmVnX3RpbWluZ3Mud2VfY3ljbGVfdGltZTsKKwlpZiAoYmxpenphcmQuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSAhPSBOVUxMKSB7CisJCS8qIFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgbWlnaHQgaGF2ZSBhIHJhdGUgbGltaXRhdGlvbiwKKwkJICogaWYgc28sIHdlIGhhdmUgdG8gbWF4aW1pemUgb3VyIHRyYW5zZmVyIHJhdGUuCisJCSAqLworCQl1bnNpZ25lZCBsb25nIG1pbl90eF90aW1lOworCQl1bnNpZ25lZCBsb25nIG1heF90eF9yYXRlID0gYmxpenphcmQuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSgpOworCisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIm1heF90eF9yYXRlICVsZCBIWlxuIiwKKwkJCW1heF90eF9yYXRlKTsKKwkJbWluX3R4X3RpbWUgPSAxMDAwMDAwMDAwIC8gKG1heF90eF9yYXRlIC8gMTAwMCk7ICAvKiBwcyAqLworCQlpZiAoYmxpenphcmQucGl4X3R4X3RpbWUgPCBtaW5fdHhfdGltZSkKKwkJCWJsaXp6YXJkLnBpeF90eF90aW1lID0gbWluX3R4X3RpbWU7CisJfQorCisJLyogdGltZSB0byB1cGRhdGUgb25lIGxpbmUgaW4gcHMgKi8KKwlibGl6emFyZC5saW5lX3VwZF90aW1lID0gKGhkaXNwICsgaG5kcCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsKKwlibGl6emFyZC5saW5lX3VwZF90aW1lICo9IDEwMDA7CisJaWYgKGhkaXNwICogYmxpenphcmQucGl4X3R4X3RpbWUgPiBibGl6emFyZC5saW5lX3VwZF90aW1lKQorCQkvKiB0cmFuc2ZlciBzcGVlZCB0b28gbG93LCB3ZSBtaWdodCBoYXZlIHRvIHVzZSBib3RoCisJCSAqIEhTIGFuZCBWUyAqLworCQl1c2VfaHN2cyA9IDE7CisJZWxzZQorCQkvKiBkZWNlbnQgdHJhbnNmZXIgc3BlZWQsIHdlJ2xsIGFsd2F5cyB1c2Ugb25seSBWUyAqLworCQl1c2VfaHN2cyA9IDA7CisKKwlpZiAodXNlX2hzdnMgJiYgKGhzX3BvbF9pbnYgfHwgdnNfcG9sX2ludikpIHsKKwkJLyogSFMgb3InZWQgd2l0aCBWUyBkb2Vzbid0IHdvcmssIHVzZSB0aGUgYWN0aXZlIGhpZ2gKKwkJICogVEUgc2lnbmFsIGJhc2VkIG9uIEhORFAgLyBWTkRQICovCisJCXVzZV9uZHAgPSAxOworCQloc19wb2xfaW52ID0gMDsKKwkJdnNfcG9sX2ludiA9IDA7CisJCWhzID0gaG5kcDsKKwkJdnMgPSB2bmRwOworCX0gZWxzZSB7CisJCS8qIFVzZSBIUyBvcidlZCB3aXRoIFZTIGFzIGEgVEUgc2lnbmFsIGlmIGJvdGggYXJlIG5lZWRlZAorCQkgKiBvciBWTkRQIGlmIG9ubHkgdnN5bmMgaXMgbmVlZGVkLiAqLworCQl1c2VfbmRwID0gMDsKKwkJaHMgPSBoc3c7CisJCXZzID0gdnN3OworCQlpZiAoIXVzZV9oc3ZzKSB7CisJCQloc19wb2xfaW52ID0gMDsKKwkJCXZzX3BvbF9pbnYgPSAwOworCQl9CisJfQorCisJaHMgPSBocyAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOwkJICAvKiBwcyAqLworCWhzICo9IDEwMDA7CisKKwl2cyA9IHZzICogKGhkaXNwICsgaG5kcCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsgLyogcHMgKi8KKwl2cyAqPSAxMDAwOworCisJaWYgKHZzIDw9IGhzKQorCQlyZXR1cm4gLUVET007CisJLyogc2V0IFZTIHRvIDEyMCUgb2YgSFMgdG8gbWluaW1pemUgVlMgZGV0ZWN0aW9uIHRpbWUgKi8KKwl2cyA9IGhzICogMTIgLyAxMDsKKwkvKiBtaW5pbWl6ZSBIUyB0b28gKi8KKwlpZiAoaHMgPiAxMDAwMCkKKwkJaHMgPSAxMDAwMDsKKworCWIgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7CisJYiAmPSB+MHgzOworCWIgfD0gdXNlX2hzdnMgPyAxIDogMDsKKwliIHw9ICh1c2VfbmRwICYmIHVzZV9oc3ZzKSA/IDAgOiAyOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUywgYik7CisKKwlibGl6emFyZC52c3luY19vbmx5ID0gIXVzZV9oc3ZzOworCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkicGl4X2NsayAlbGQgSFogcGl4X3R4X3RpbWUgJWxkIHBzIGxpbmVfdXBkX3RpbWUgJWxkIHBzXG4iLAorCQlwaXhfY2xrLCBibGl6emFyZC5waXhfdHhfdGltZSwgYmxpenphcmQubGluZV91cGRfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkiaHMgJWQgcHMgdnMgJWQgcHMgbW9kZSAlZCB2c3luY19vbmx5ICVkXG4iLAorCQlocywgdnMsIGIgJiAweDMsICF1c2VfaHN2cyk7CisKKwlyZXR1cm4gYmxpenphcmQuZXh0aWYtPnNldHVwX3RlYXJzeW5jKDEsIGhzLCB2cywKKwkJCQkJICAgICAgaHNfcG9sX2ludiwgdnNfcG9sX2ludiwKKwkJCQkJICAgICAgZXh0aWZfZGl2KTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfZ2V0X2NhcHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJYmxpenphcmQuaW50X2N0cmwtPmdldF9jYXBzKHBsYW5lLCBjYXBzKTsKKwljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX01BTlVBTF9VUERBVEUgfAorCQlPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFIHwKKwkJT01BUEZCX0NBUFNfV0lORE9XX1NDQUxFIHwKKwkJT01BUEZCX0NBUFNfV0lORE9XX09WRVJMQVk7CisJaWYgKGJsaXp6YXJkLnRlX2Nvbm5lY3RlZCkKKwkJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19URUFSU1lOQzsKKwljYXBzLT53bmRfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2NSkgfAorCQkJICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9zYXZlX3JlZ3Moc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0ICpsaXN0LCBpbnQgY250KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBsaXN0KyspIHsKKwkJaW50IHJlZzsKKwkJZm9yIChyZWcgPSBsaXN0LT5zdGFydDsgcmVnIDw9IGxpc3QtPmVuZDsgcmVnICs9IDIpCisJCQlibGl6emFyZF9yZWdfY2FjaGVbcmVnIC8gMl0gPSBibGl6emFyZF9yZWFkX3JlZyhyZWcpOworCX0KK30KKworc3RhdGljIHZvaWQgX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgKmxpc3QsIGludCBjbnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGxpc3QrKykgeworCQlpbnQgcmVnOworCQlmb3IgKHJlZyA9IGxpc3QtPnN0YXJ0OyByZWcgPD0gbGlzdC0+ZW5kOyByZWcgKz0gMikKKwkJCWJsaXp6YXJkX3dyaXRlX3JlZyhyZWcsIGJsaXp6YXJkX3JlZ19jYWNoZVtyZWcgLyAyXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zYXZlX2FsbF9yZWdzKHZvaWQpCit7CisJX3NhdmVfcmVncyhibGl6emFyZF9wbGxfcmVncywgQVJSQVlfU0laRShibGl6emFyZF9wbGxfcmVncykpOworCV9zYXZlX3JlZ3MoYmxpenphcmRfZ2VuX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfZ2VuX3JlZ3MpKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfcmVzdG9yZV9wbGxfcmVncyh2b2lkKQoreworCV9yZXN0b3JlX3JlZ3MoYmxpenphcmRfcGxsX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfcGxsX3JlZ3MpKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfcmVzdG9yZV9nZW5fcmVncyh2b2lkKQoreworCV9yZXN0b3JlX3JlZ3MoYmxpenphcmRfZ2VuX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfZ2VuX3JlZ3MpKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfc3VzcGVuZCh2b2lkKQoreworCXUzMiBsOworCXVuc2lnbmVkIGxvbmcgdG1vOworCisJaWYgKGJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSkgeworCQl1cGRhdGVfZnVsbF9zY3JlZW4oKTsKKwkJYmxpenphcmRfc3luYygpOworCX0KKwlibGl6emFyZC51cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZCA9IGJsaXp6YXJkLnVwZGF0ZV9tb2RlOworCS8qIHRoZSBmb2xsb3dpbmcgd2lsbCBkaXNhYmxlIGNsb2NrcyBhcyB3ZWxsICovCisJYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCisJYmxpenphcmRfc2F2ZV9hbGxfcmVncygpOworCisJYmxpenphcmRfc3RvcF9zZHJhbSgpOworCisJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BPV0VSX1NBVkUpOworCS8qIFN0YW5kYnksIFNsZWVwLiBXZSBhc3N1bWUgd2UgdXNlIGFuIGV4dGVybmFsIGNsb2NrLiAqLworCWwgfD0gMHgwMzsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSwgbCk7CisKKwl0bW8gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXdoaWxlICghKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9NT0RFKSAmICgxIDw8IDEpKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJInMxZDEzNzR4OiBzbGVlcCB0aW1lb3V0LCBzdG9wcGluZyBQTEwgbWFudWFsbHlcbiIpOworCQkJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9NT0RFKTsKKwkJCWwgJj0gfjB4MDM7CisJCQkvKiBEaXNhYmxlIFBMTCwgY291bnRlciBmdW5jdGlvbiAqLworCQkJbCB8PSAweDI7CisJCQlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUExMX01PREUsIGwpOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDEpOworCX0KKworCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rvd24oYmxpenphcmQuZmJkZXYtPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3Jlc3VtZSh2b2lkKQoreworCXUzMiBsOworCisJaWYgKGJsaXp6YXJkLnBvd2VyX3VwICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX3VwKGJsaXp6YXJkLmZiZGV2LT5kZXYpOworCisJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BPV0VSX1NBVkUpOworCS8qIFN0YW5kYnksIFNsZWVwICovCisJbCAmPSB+MHgwMzsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSwgbCk7CisKKwlibGl6emFyZF9yZXN0b3JlX3BsbF9yZWdzKCk7CisJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9NT0RFKTsKKwlsICY9IH4weDAzOworCS8qIEVuYWJsZSBQTEwsIGNvdW50ZXIgZnVuY3Rpb24gKi8KKwlsIHw9IDB4MTsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUExMX01PREUsIGwpOworCisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikgJiAoMSA8PCA3KSkpCisJCW1zbGVlcCgxKTsKKworCWJsaXp6YXJkX3Jlc3RhcnRfc2RyYW0oKTsKKworCWJsaXp6YXJkX3Jlc3RvcmVfZ2VuX3JlZ3MoKTsKKworCS8qIEVuYWJsZSBkaXNwbGF5ICovCisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX0RJU1BMQVlfTU9ERSwgMHgwMSk7CisKKwkvKiB0aGUgZm9sbG93aW5nIHdpbGwgZW5hYmxlIGNsb2NrcyBhcyBuZWNlc3NhcnkgKi8KKwlibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoYmxpenphcmQudXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQpOworCisJLyogRm9yY2UgYSBiYWNrZ3JvdW5kIHVwZGF0ZSAqLworCWJsaXp6YXJkLnpvb21fb24gPSAxOworCXVwZGF0ZV9mdWxsX3NjcmVlbigpOworCWJsaXp6YXJkX3N5bmMoKTsKK30KKworc3RhdGljIGludCBibGl6emFyZF9pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IGV4dF9tb2RlLAorCQkJIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQoreworCWludCByID0gMCwgaTsKKwl1OCByZXYsIGNvbmY7CisJdW5zaWduZWQgbG9uZyBleHRfY2xrOworCWludCBleHRpZl9kaXY7CisJdW5zaWduZWQgbG9uZyBzeXNfY2xrLCBwaXhfY2xrOworCXN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqb21hcGZiX2NvbmY7CisJc3RydWN0IGJsaXp6YXJkX3BsYXRmb3JtX2RhdGEgKmN0cmxfY29uZjsKKworCWJsaXp6YXJkLmZiZGV2ID0gZmJkZXY7CisKKwlCVUdfT04oIWZiZGV2LT5leHRfaWYgfHwgIWZiZGV2LT5pbnRfY3RybCk7CisKKwlibGl6emFyZC5mYmRldiA9IGZiZGV2OworCWJsaXp6YXJkLmV4dGlmID0gZmJkZXYtPmV4dF9pZjsKKwlibGl6emFyZC5pbnRfY3RybCA9IGZiZGV2LT5pbnRfY3RybDsKKworCW9tYXBmYl9jb25mID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwljdHJsX2NvbmYgPSBvbWFwZmJfY29uZi0+Y3RybF9wbGF0Zm9ybV9kYXRhOworCWlmIChjdHJsX2NvbmYgPT0gTlVMTCB8fCBjdHJsX2NvbmYtPmdldF9jbG9ja19yYXRlID09IE5VTEwpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiczFkMTM3NHg6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGVycjE7CisJfQorCisJYmxpenphcmQucG93ZXJfZG93biA9IGN0cmxfY29uZi0+cG93ZXJfZG93bjsKKwlibGl6emFyZC5wb3dlcl91cCA9IGN0cmxfY29uZi0+cG93ZXJfdXA7CisKKwlzcGluX2xvY2tfaW5pdCgmYmxpenphcmQucmVxX2xvY2spOworCisJaWYgKChyID0gYmxpenphcmQuaW50X2N0cmwtPmluaXQoZmJkZXYsIDEsIHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGVycjE7CisKKwlpZiAoKHIgPSBibGl6emFyZC5leHRpZi0+aW5pdChmYmRldikpIDwgMCkKKwkJZ290byBlcnIyOworCisJYmxpenphcmRfY3RybC5zZXRfY29sb3Jfa2V5ID0gYmxpenphcmQuaW50X2N0cmwtPnNldF9jb2xvcl9rZXk7CisJYmxpenphcmRfY3RybC5nZXRfY29sb3Jfa2V5ID0gYmxpenphcmQuaW50X2N0cmwtPmdldF9jb2xvcl9rZXk7CisJYmxpenphcmRfY3RybC5zZXR1cF9tZW0gPSBibGl6emFyZC5pbnRfY3RybC0+c2V0dXBfbWVtOworCWJsaXp6YXJkX2N0cmwubW1hcCA9IGJsaXp6YXJkLmludF9jdHJsLT5tbWFwOworCisJZXh0X2NsayA9IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUoZmJkZXYtPmRldik7CisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKGV4dF9jbGssICZleHRpZl9kaXYpKSA8IDApCisJCWdvdG8gZXJyMzsKKworCXNldF9leHRpZl90aW1pbmdzKCZibGl6emFyZC5yZWdfdGltaW5ncyk7CisKKwlpZiAoYmxpenphcmQucG93ZXJfdXAgIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfdXAoZmJkZXYtPmRldik7CisKKwljYWxjX2JsaXp6YXJkX2Nsa19yYXRlcyhleHRfY2xrLCAmc3lzX2NsaywgJnBpeF9jbGspOworCisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKHN5c19jbGssICZleHRpZl9kaXYpKSA8IDApCisJCWdvdG8gZXJyMzsKKwlzZXRfZXh0aWZfdGltaW5ncygmYmxpenphcmQucmVnX3RpbWluZ3MpOworCisJaWYgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikgJiAweDgwKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkiY29udHJvbGxlciBub3QgaW5pdGlhbGl6ZWQgYnkgdGhlIGJvb3Rsb2FkZXJcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIzOworCX0KKworCWlmIChjdHJsX2NvbmYtPnRlX2Nvbm5lY3RlZCkgeworCQlpZiAoKHIgPSBzZXR1cF90ZWFyc3luYyhwaXhfY2xrLCBleHRpZl9kaXYpKSA8IDApCisJCQlnb3RvIGVycjM7CisJCWJsaXp6YXJkLnRlX2Nvbm5lY3RlZCA9IDE7CisJfQorCisJcmV2ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUkVWX0NPREUpOworCWNvbmYgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9DT05GSUcpOworCisJc3dpdGNoIChyZXYgJiAweGZjKSB7CisJY2FzZSAweDljOgorCQlibGl6emFyZC52ZXJzaW9uID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NDsKKwkJcHJfaW5mbygib21hcGZiOiBzMWQxMzc0NCBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImluaXRpYWxpemVkIChDTkYgcGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKwkJYnJlYWs7CisJY2FzZSAweGE0OgorCQlibGl6emFyZC52ZXJzaW9uID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NTsKKwkJcHJfaW5mbygib21hcGZiOiBzMWQxMzc0NSBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImluaXRpYWxpemVkIChDTkYgcGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiaW52YWxpZCBzMWQxMzc0eCByZXZpc2lvbiAlMDJ4XG4iLAorCQkJcmV2KTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMzsKKwl9CisKKwlibGl6emFyZC5tYXhfdHJhbnNtaXRfc2l6ZSA9IGJsaXp6YXJkLmV4dGlmLT5tYXhfdHJhbnNtaXRfc2l6ZTsKKworCWJsaXp6YXJkLnVwZGF0ZV9tb2RlID0gT01BUEZCX1VQREFURV9ESVNBQkxFRDsKKworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy54ID0gMDsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cueSA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LndpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cuaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cub3V0X3ggPSAwOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5vdXRfeCA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF93aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF9oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5mb3JtYXQgPSAwOworCisJYmxpenphcmQuc2NyZWVuX3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6emFyZC5zY3JlZW5faGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKworCWluaXRfdGltZXIoJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyKTsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lci5mdW5jdGlvbiA9IGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXV0bzsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lci5kYXRhID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZibGl6emFyZC5mcmVlX3JlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYmxpenphcmQucGVuZGluZ19yZXFfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmxpenphcmQucmVxX3Bvb2wpOyBpKyspCisJCWxpc3RfYWRkKCZibGl6emFyZC5yZXFfcG9vbFtpXS5lbnRyeSwgJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpOworCUJVR19PTihpIDw9IElSUV9SRVFfUE9PTF9TSVpFKTsKKwlzZW1hX2luaXQoJmJsaXp6YXJkLnJlcV9zZW1hLCBpIC0gSVJRX1JFUV9QT09MX1NJWkUpOworCisJcmV0dXJuIDA7CitlcnIzOgorCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rvd24oZmJkZXYtPmRldik7CisJYmxpenphcmQuZXh0aWYtPmNsZWFudXAoKTsKK2VycjI6CisJYmxpenphcmQuaW50X2N0cmwtPmNsZWFudXAoKTsKK2VycjE6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX2NsZWFudXAodm9pZCkKK3sKKwlibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJYmxpenphcmQuZXh0aWYtPmNsZWFudXAoKTsKKwlibGl6emFyZC5pbnRfY3RybC0+Y2xlYW51cCgpOworCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rvd24oYmxpenphcmQuZmJkZXYtPmRldik7Cit9CisKK3N0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJsID0geworCS5uYW1lCQkJPSAiYmxpenphcmQiLAorCS5pbml0CQkJPSBibGl6emFyZF9pbml0LAorCS5jbGVhbnVwCQk9IGJsaXp6YXJkX2NsZWFudXAsCisJLmJpbmRfY2xpZW50CQk9IGJsaXp6YXJkX2JpbmRfY2xpZW50LAorCS5nZXRfY2FwcwkJPSBibGl6emFyZF9nZXRfY2FwcywKKwkuc2V0X3VwZGF0ZV9tb2RlCT0gYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBibGl6emFyZF9nZXRfdXBkYXRlX21vZGUsCisJLnNldHVwX3BsYW5lCQk9IGJsaXp6YXJkX3NldHVwX3BsYW5lLAorCS5zZXRfc2NhbGUJCT0gYmxpenphcmRfc2V0X3NjYWxlLAorCS5lbmFibGVfcGxhbmUJCT0gYmxpenphcmRfZW5hYmxlX3BsYW5lLAorCS51cGRhdGVfd2luZG93CQk9IGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMsCisJLnN5bmMJCQk9IGJsaXp6YXJkX3N5bmMsCisJLnN1c3BlbmQJCT0gYmxpenphcmRfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBibGl6emFyZF9yZXN1bWUsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzIzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYwpAQCAtMCwwICsxLDE1MDIgQEAKKy8qCisgKiBPTUFQMiBkaXNwbGF5IGNvbnRyb2xsZXIgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvc3JhbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisKKyNpbmNsdWRlICJkaXNwYy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkJImRpc3BjIgorCisjZGVmaW5lIERTU19CQVNFCQkJMHg0ODA1MDAwMAorI2RlZmluZSBEU1NfU1lTQ09ORklHCQkJMHgwMDEwCisKKyNkZWZpbmUgRElTUENfQkFTRQkJCTB4NDgwNTA0MDAKKworLyogRElTUEMgY29tbW9uICovCisjZGVmaW5lIERJU1BDX1JFVklTSU9OCQkJMHgwMDAwCisjZGVmaW5lIERJU1BDX1NZU0NPTkZJRwkJCTB4MDAxMAorI2RlZmluZSBESVNQQ19TWVNTVEFUVVMJCQkweDAwMTQKKyNkZWZpbmUgRElTUENfSVJRU1RBVFVTCQkJMHgwMDE4CisjZGVmaW5lIERJU1BDX0lSUUVOQUJMRQkJCTB4MDAxQworI2RlZmluZSBESVNQQ19DT05UUk9MCQkJMHgwMDQwCisjZGVmaW5lIERJU1BDX0NPTkZJRwkJCTB4MDA0NAorI2RlZmluZSBESVNQQ19DQVBBQkxFCQkJMHgwMDQ4CisjZGVmaW5lIERJU1BDX0RFRkFVTFRfQ09MT1IwCQkweDAwNEMKKyNkZWZpbmUgRElTUENfREVGQVVMVF9DT0xPUjEJCTB4MDA1MAorI2RlZmluZSBESVNQQ19UUkFOU19DT0xPUjAJCTB4MDA1NAorI2RlZmluZSBESVNQQ19UUkFOU19DT0xPUjEJCTB4MDA1OAorI2RlZmluZSBESVNQQ19MSU5FX1NUQVRVUwkJMHgwMDVDCisjZGVmaW5lIERJU1BDX0xJTkVfTlVNQkVSCQkweDAwNjAKKyNkZWZpbmUgRElTUENfVElNSU5HX0gJCQkweDAwNjQKKyNkZWZpbmUgRElTUENfVElNSU5HX1YJCQkweDAwNjgKKyNkZWZpbmUgRElTUENfUE9MX0ZSRVEJCQkweDAwNkMKKyNkZWZpbmUgRElTUENfRElWSVNPUgkJCTB4MDA3MAorI2RlZmluZSBESVNQQ19TSVpFX0RJRwkJCTB4MDA3OAorI2RlZmluZSBESVNQQ19TSVpFX0xDRAkJCTB4MDA3QworCisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUxCQkweDAxRDQKKyNkZWZpbmUgRElTUENfREFUQV9DWUNMRTIJCTB4MDFEOAorI2RlZmluZSBESVNQQ19EQVRBX0NZQ0xFMwkJMHgwMURDCisKKy8qIERJU1BDIEdGWCBwbGFuZSAqLworI2RlZmluZSBESVNQQ19HRlhfQkEwCQkJMHgwMDgwCisjZGVmaW5lIERJU1BDX0dGWF9CQTEJCQkweDAwODQKKyNkZWZpbmUgRElTUENfR0ZYX1BPU0lUSU9OCQkweDAwODgKKyNkZWZpbmUgRElTUENfR0ZYX1NJWkUJCQkweDAwOEMKKyNkZWZpbmUgRElTUENfR0ZYX0FUVFJJQlVURVMJCTB4MDBBMAorI2RlZmluZSBESVNQQ19HRlhfRklGT19USFJFU0hPTEQJMHgwMEE0CisjZGVmaW5lIERJU1BDX0dGWF9GSUZPX1NJWkVfU1RBVFVTCTB4MDBBOAorI2RlZmluZSBESVNQQ19HRlhfUk9XX0lOQwkJMHgwMEFDCisjZGVmaW5lIERJU1BDX0dGWF9QSVhFTF9JTkMJCTB4MDBCMAorI2RlZmluZSBESVNQQ19HRlhfV0lORE9XX1NLSVAJCTB4MDBCNAorI2RlZmluZSBESVNQQ19HRlhfVEFCTEVfQkEJCTB4MDBCOAorCisvKiBESVNQQyBWaWRlbyBwbGFuZSAxLzIgKi8KKyNkZWZpbmUgRElTUENfVklEMV9CQVNFCQkJMHgwMEJDCisjZGVmaW5lIERJU1BDX1ZJRDJfQkFTRQkJCTB4MDE0QworCisvKiBPZmZzZXRzIGludG8gRElTUENfVklEMS8yX0JBU0UgKi8KKyNkZWZpbmUgRElTUENfVklEX0JBMAkJCTB4MDAwMAorI2RlZmluZSBESVNQQ19WSURfQkExCQkJMHgwMDA0CisjZGVmaW5lIERJU1BDX1ZJRF9QT1NJVElPTgkJMHgwMDA4CisjZGVmaW5lIERJU1BDX1ZJRF9TSVpFCQkJMHgwMDBDCisjZGVmaW5lIERJU1BDX1ZJRF9BVFRSSUJVVEVTCQkweDAwMTAKKyNkZWZpbmUgRElTUENfVklEX0ZJRk9fVEhSRVNIT0xECTB4MDAxNAorI2RlZmluZSBESVNQQ19WSURfRklGT19TSVpFX1NUQVRVUwkweDAwMTgKKyNkZWZpbmUgRElTUENfVklEX1JPV19JTkMJCTB4MDAxQworI2RlZmluZSBESVNQQ19WSURfUElYRUxfSU5DCQkweDAwMjAKKyNkZWZpbmUgRElTUENfVklEX0ZJUgkJCTB4MDAyNAorI2RlZmluZSBESVNQQ19WSURfUElDVFVSRV9TSVpFCQkweDAwMjgKKyNkZWZpbmUgRElTUENfVklEX0FDQ1UwCQkJMHgwMDJDCisjZGVmaW5lIERJU1BDX1ZJRF9BQ0NVMQkJCTB4MDAzMAorCisvKiA4IGVsZW1lbnRzIGluIDggYnl0ZSBpbmNyZW1lbnRzICovCisjZGVmaW5lIERJU1BDX1ZJRF9GSVJfQ09FRl9IMAkJMHgwMDM0CisvKiA4IGVsZW1lbnRzIGluIDggYnl0ZSBpbmNyZW1lbnRzICovCisjZGVmaW5lIERJU1BDX1ZJRF9GSVJfQ09FRl9IVjAJCTB4MDAzOAorLyogNSBlbGVtZW50cyBpbiA0IGJ5dGUgaW5jcmVtZW50cyAqLworI2RlZmluZSBESVNQQ19WSURfQ09OVl9DT0VGMAkJMHgwMDc0CisKKyNkZWZpbmUgRElTUENfSVJRX0ZSQU1FTUFTSwkJMHgwMDAxCisjZGVmaW5lIERJU1BDX0lSUV9WU1lOQwkJCTB4MDAwMgorI2RlZmluZSBESVNQQ19JUlFfRVZTWU5DX0VWRU4JCTB4MDAwNAorI2RlZmluZSBESVNQQ19JUlFfRVZTWU5DX09ERAkJMHgwMDA4CisjZGVmaW5lIERJU1BDX0lSUV9BQ0JJQVNfQ09VTlRfU1RBVAkweDAwMTAKKyNkZWZpbmUgRElTUENfSVJRX1BST0dfTElORV9OVU0JCTB4MDAyMAorI2RlZmluZSBESVNQQ19JUlFfR0ZYX0ZJRk9fVU5ERVJGTE9XCTB4MDA0MAorI2RlZmluZSBESVNQQ19JUlFfR0ZYX0VORF9XSU4JCTB4MDA4MAorI2RlZmluZSBESVNQQ19JUlFfUEFMX0dBTU1BX01BU0sJMHgwMTAwCisjZGVmaW5lIERJU1BDX0lSUV9PQ1BfRVJSCQkweDAyMDAKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDFfRklGT19VTkRFUkZMT1cJMHgwNDAwCisjZGVmaW5lIERJU1BDX0lSUV9WSUQxX0VORF9XSU4JCTB4MDgwMAorI2RlZmluZSBESVNQQ19JUlFfVklEMl9GSUZPX1VOREVSRkxPVwkweDEwMDAKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDJfRU5EX1dJTgkJMHgyMDAwCisjZGVmaW5lIERJU1BDX0lSUV9TWU5DX0xPU1QJCTB4NDAwMAorCisjZGVmaW5lIERJU1BDX0lSUV9NQVNLX0FMTAkJMHg3ZmZmCisKKyNkZWZpbmUgRElTUENfSVJRX01BU0tfRVJST1IJCShESVNQQ19JUlFfR0ZYX0ZJRk9fVU5ERVJGTE9XIHwJXAorCQkJCQkgICAgIERJU1BDX0lSUV9WSUQxX0ZJRk9fVU5ERVJGTE9XIHwgXAorCQkJCQkgICAgIERJU1BDX0lSUV9WSUQyX0ZJRk9fVU5ERVJGTE9XIHwgXAorCQkJCQkgICAgIERJU1BDX0lSUV9TWU5DX0xPU1QpCisKKyNkZWZpbmUgUkZCSV9DT05UUk9MCQkJMHg0ODA1MDA0MAorCisjZGVmaW5lIE1BWF9QQUxFVFRFX1NJWkUJCSgyNTYgKiAxNikKKworI2RlZmluZSBGTERfTUFTSyhwb3MsIGxlbikJKCgoMSA8PCBsZW4pIC0gMSkgPDwgcG9zKQorCisjZGVmaW5lIE1PRF9SRUdfRkxEKHJlZywgbWFzaywgdmFsKSBcCisJZGlzcGNfd3JpdGVfcmVnKChyZWcpLCAoZGlzcGNfcmVhZF9yZWcocmVnKSAmIH4obWFzaykpIHwgKHZhbCkpOworCisjZGVmaW5lIE9NQVAyX1NSQU1fU1RBUlQJCTB4NDAyMDAwMDAKKy8qIE1heGltdW0gc2l6ZSwgaW4gcmVhbGl0eSB0aGlzIGlzIHNtYWxsZXIgaWYgU1JBTSBpcyBwYXJ0aWFsbHkgbG9ja2VkLiAqLworI2RlZmluZSBPTUFQMl9TUkFNX1NJWkUJCQkweGEwMDAwCQkvKiA2NDBrICovCisKKy8qIFdlIHN1cHBvcnQgdGhlIFNEUkFNIC8gU1JBTSB0eXBlcy4gU2VlIE9NQVBGQl9QTEFORV9NRU1UWVBFXyogaW4gb21hcGZiLmggKi8KKyNkZWZpbmUgRElTUENfTUVNVFlQRV9OVU0JCTIKKworI2RlZmluZSBSRVNNQVBfU0laRShfcGFnZV9jbnQpCQkJCQkJXAorCSgoX3BhZ2VfY250ICsgKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpIC0gMSkgLyA4KQorI2RlZmluZSBSRVNNQVBfUFRSKF9yZXNfbWFwLCBfcGFnZV9ucikJCQkJCVwKKwkoKChfcmVzX21hcCktPm1hcCkgKyAoX3BhZ2VfbnIpIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpKQorI2RlZmluZSBSRVNNQVBfTUFTSyhfcGFnZV9ucikJCQkJCQlcCisJKDEgPDwgKChfcGFnZV9ucikgJiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCAtIDEpKSkKKworc3RydWN0IHJlc21hcCB7CisJdW5zaWduZWQgbG9uZwlzdGFydDsKKwl1bnNpZ25lZAlwYWdlX2NudDsKKwl1bnNpZ25lZCBsb25nCSptYXA7Cit9OworCitzdGF0aWMgc3RydWN0IHsKKwl1MzIJCWJhc2U7CisKKwlzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjCW1lbV9kZXNjOworCXN0cnVjdCByZXNtYXAJCSpyZXNfbWFwW0RJU1BDX01FTVRZUEVfTlVNXTsKKwlhdG9taWNfdAkJbWFwX2NvdW50W09NQVBGQl9QTEFORV9OVU1dOworCisJZG1hX2FkZHJfdAlwYWxldHRlX3BhZGRyOworCXZvaWQJCSpwYWxldHRlX3ZhZGRyOworCisJaW50CQlleHRfbW9kZTsKKworCXVuc2lnbmVkIGxvbmcJZW5hYmxlZF9pcnFzOworCXZvaWQJCSgqaXJxX2NhbGxiYWNrKSh2b2lkICopOworCXZvaWQJCSppcnFfY2FsbGJhY2tfZGF0YTsKKwlzdHJ1Y3QgY29tcGxldGlvbglmcmFtZV9kb25lOworCisJaW50CQlmaXJfaGluY1tPTUFQRkJfUExBTkVfTlVNXTsKKwlpbnQJCWZpcl92aW5jW09NQVBGQl9QTEFORV9OVU1dOworCisJc3RydWN0IGNsawkqZHNzX2ljaywgKmRzczFfZmNrOworCXN0cnVjdCBjbGsJKmRzc181NG1fZmNrOworCisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGU7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCisJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkJY29sb3Jfa2V5OworfSBkaXNwYzsKKworc3RhdGljIHZvaWQgZW5hYmxlX2xjZF9jbG9ja3MoaW50IGVuYWJsZSk7CisKK3N0YXRpYyB2b2lkIGlubGluZSBkaXNwY193cml0ZV9yZWcoaW50IGlkeCwgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBkaXNwYy5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIHUzMiBpbmxpbmUgZGlzcGNfcmVhZF9yZWcoaW50IGlkeCkKK3sKKwl1MzIgbCA9IF9fcmF3X3JlYWRsKGRpc3BjLmJhc2UgKyBpZHgpOworCXJldHVybiBsOworfQorCisvKiBTZWxlY3QgUkZCSSBvciBieXBhc3MgbW9kZSAqLworc3RhdGljIHZvaWQgZW5hYmxlX3JmYmlfbW9kZShpbnQgZW5hYmxlKQoreworCXUzMiBsOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCS8qIEVuYWJsZSBSRkJJLCBHUElPMC8xICovCisJbCAmPSB+KCgxIDw8IDExKSB8ICgxIDw8IDE1KSB8ICgxIDw8IDE2KSk7CisJbCB8PSBlbmFibGUgPyAoMSA8PCAxMSkgOiAwOworCS8qIFJGQkkgRW46IEdQSU8wLzE9MTAgIFJGQkkgRGlzOiBHUElPMC8xPTExICovCisJbCB8PSAxIDw8IDE1OworCWwgfD0gZW5hYmxlID8gMCA6ICgxIDw8IDE2KTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfQ09OVFJPTCwgbCk7CisKKwkvKiBTZXQgYnlwYXNzIG1vZGUgaW4gUkZCSSBtb2R1bGUgKi8KKwlsID0gX19yYXdfcmVhZGwoaW9fcDJ2KFJGQklfQ09OVFJPTCkpOworCWwgfD0gZW5hYmxlID8gMCA6ICgxIDw8IDEpOworCV9fcmF3X3dyaXRlbChsLCBpb19wMnYoUkZCSV9DT05UUk9MKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sY2RfZGF0YV9saW5lcyhpbnQgZGF0YV9saW5lcykKK3sKKwl1MzIgbDsKKwlpbnQgY29kZSA9IDA7CisKKwlzd2l0Y2ggKGRhdGFfbGluZXMpIHsKKwljYXNlIDEyOgorCQljb2RlID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJY29kZSA9IDE7CisJCWJyZWFrOworCWNhc2UgMTg6CisJCWNvZGUgPSAyOworCQlicmVhazsKKwljYXNlIDI0OgorCQljb2RlID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCWwgJj0gfigweDAzIDw8IDgpOworCWwgfD0gY29kZSA8PCA4OworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MLCBsKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2xvYWRfbW9kZShpbnQgbW9kZSkKK3sKKwlCVUdfT04obW9kZSAmIH4oRElTUENfTE9BRF9DTFVUX09OTFkgfCBESVNQQ19MT0FEX0ZSQU1FX09OTFkgfAorCQkJRElTUENfTE9BRF9DTFVUX09OQ0VfRlJBTUUpKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05GSUcsIDB4MDMgPDwgMSwgbW9kZSA8PCAxKTsKK30KKwordm9pZCBvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZShpbnQgeCwgaW50IHkpCit7CisJQlVHX09OKCh4ID4gKDEgPDwgMTEpKSB8fCAoeSA+ICgxIDw8IDExKSkpOworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX1NJWkVfTENELCBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLAorCQkJKCh5IC0gMSkgPDwgMTYpIHwgKHggLSAxKSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKTsKKwordm9pZCBvbWFwX2Rpc3BjX3NldF9kaWdpdF9zaXplKGludCB4LCBpbnQgeSkKK3sKKwlCVUdfT04oKHggPiAoMSA8PCAxMSkpIHx8ICh5ID4gKDEgPDwgMTEpKSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfU0laRV9ESUcsIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksCisJCQkoKHkgLSAxKSA8PCAxNikgfCAoeCAtIDEpKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19zZXRfZGlnaXRfc2l6ZSk7CisKK3N0YXRpYyB2b2lkIHNldHVwX3BsYW5lX2ZpZm8oaW50IHBsYW5lLCBpbnQgZXh0X21vZGUpCit7CisJY29uc3QgdTMyIGZ0cnNfcmVnW10gPSB7IERJU1BDX0dGWF9GSUZPX1RIUkVTSE9MRCwKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklGT19USFJFU0hPTEQsCisJCQkgICAgICAgIERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1RIUkVTSE9MRCB9OworCWNvbnN0IHUzMiBmc3pfcmVnW10gPSB7IERJU1BDX0dGWF9GSUZPX1NJWkVfU1RBVFVTLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1NJWkVfU1RBVFVTLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1NJWkVfU1RBVFVTIH07CisJaW50IGxvdywgaGlnaDsKKwl1MzIgbDsKKworCUJVR19PTihwbGFuZSA+IDIpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKGZzel9yZWdbcGxhbmVdKTsKKwlsICY9IEZMRF9NQVNLKDAsIDkpOworCWlmIChleHRfbW9kZSkgeworCQlsb3cgPSBsICogMyAvIDQ7CisJCWhpZ2ggPSBsOworCX0gZWxzZSB7CisJCWxvdyA9IGwgLyA0OworCQloaWdoID0gbCAqIDMgLyA0OworCX0KKwlNT0RfUkVHX0ZMRChmdHJzX3JlZ1twbGFuZV0sIEZMRF9NQVNLKDE2LCA5KSB8IEZMRF9NQVNLKDAsIDkpLAorCQkJKGhpZ2ggPDwgMTYpIHwgbG93KTsKK30KKwordm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KGludCBlbmFibGUpCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfQ09OVFJPTCwgMSwgZW5hYmxlID8gMSA6IDApOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KTsKKwordm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9kaWdpdF9vdXQoaW50IGVuYWJsZSkKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05UUk9MLCAxIDw8IDEsIGVuYWJsZSA/IDEgPDwgMSA6IDApOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2VuYWJsZV9kaWdpdF9vdXQpOworCitzdGF0aWMgaW5saW5lIGludCBfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJICB1MzIgcGFkZHIsIGludCBzY3JlZW5fd2lkdGgsCisJCQkJICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgaW50IGNvbG9yX21vZGUpCit7CisJY29uc3QgdTMyIGF0X3JlZ1tdID0geyBESVNQQ19HRlhfQVRUUklCVVRFUywKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUywKKwkJCSAgICAgICAgRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMgfTsKKwljb25zdCB1MzIgYmFfcmVnW10gPSB7IERJU1BDX0dGWF9CQTAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9CQTAsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0JBMCB9OworCWNvbnN0IHUzMiBwc19yZWdbXSA9IHsgRElTUENfR0ZYX1BPU0lUSU9OLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9QT1NJVElPTiwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfUE9TSVRJT04gfTsKKwljb25zdCB1MzIgc3pfcmVnW10gPSB7IERJU1BDX0dGWF9TSVpFLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9QSUNUVVJFX1NJWkUsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1BJQ1RVUkVfU0laRSB9OworCWNvbnN0IHUzMiByaV9yZWdbXSA9IHsgRElTUENfR0ZYX1JPV19JTkMsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1JPV19JTkMsCisJCQkgICAgICAgIERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9ST1dfSU5DIH07CisJY29uc3QgdTMyIHZzX3JlZ1tdID0geyAwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfU0laRSwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfU0laRSB9OworCisJaW50IGNob3V0X3NoaWZ0LCBidXJzdF9zaGlmdDsKKwlpbnQgY2hvdXRfdmFsOworCWludCBjb2xvcl9jb2RlOworCWludCBicHA7CisJaW50IGNjb252X2VuOworCWludCBzZXRfdnNpemU7CisJdTMyIGw7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhkaXNwYy5mYmRldi0+ZGV2LCAicGxhbmUgJWQgY2hhbm5lbCAlZCBwYWRkciAlIzA4eCBzY3Jfd2lkdGggJWQiCisJCSAgICAiIHBvc194ICVkIHBvc195ICVkIHdpZHRoICVkIGhlaWdodCAlZCBjb2xvcl9tb2RlICVkXG4iLAorCQkgICAgcGxhbmUsIGNoYW5uZWxfb3V0LCBwYWRkciwgc2NyZWVuX3dpZHRoLCBwb3NfeCwgcG9zX3ksCisJCSAgICB3aWR0aCwgaGVpZ2h0LCBjb2xvcl9tb2RlKTsKKyNlbmRpZgorCisJc2V0X3ZzaXplID0gMDsKKwlzd2l0Y2ggKHBsYW5lKSB7CisJY2FzZSBPTUFQRkJfUExBTkVfR0ZYOgorCQlidXJzdF9zaGlmdCA9IDY7CisJCWNob3V0X3NoaWZ0ID0gODsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfUExBTkVfVklEMToKKwljYXNlIE9NQVBGQl9QTEFORV9WSUQyOgorCQlidXJzdF9zaGlmdCA9IDE0OworCQljaG91dF9zaGlmdCA9IDE2OworCQlzZXRfdnNpemUgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGNoYW5uZWxfb3V0KSB7CisJY2FzZSBPTUFQRkJfQ0hBTk5FTF9PVVRfTENEOgorCQljaG91dF92YWwgPSAwOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DSEFOTkVMX09VVF9ESUdJVDoKKwkJY2hvdXRfdmFsID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2NvbnZfZW4gPSAwOworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJY29sb3JfY29kZSA9IERJU1BDX1JHQl8xNl9CUFA7CisJCWJwcCA9IDE2OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJCWlmIChwbGFuZSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNvbG9yX2NvZGUgPSBESVNQQ19VWVZZXzQyMjsKKwkJY2NvbnZfZW4gPSAxOworCQlicHAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlpZiAocGxhbmUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQljb2xvcl9jb2RlID0gRElTUENfWVVWMl80MjI7CisJCWNjb252X2VuID0gMTsKKwkJYnBwID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWwgPSBkaXNwY19yZWFkX3JlZyhhdF9yZWdbcGxhbmVdKTsKKworCWwgJj0gfigweDBmIDw8IDEpOworCWwgfD0gY29sb3JfY29kZSA8PCAxOworCWwgJj0gfigxIDw8IDkpOworCWwgfD0gY2NvbnZfZW4gPDwgOTsKKworCWwgJj0gfigweDAzIDw8IGJ1cnN0X3NoaWZ0KTsKKwlsIHw9IERJU1BDX0JVUlNUXzh4MzIgPDwgYnVyc3Rfc2hpZnQ7CisKKwlsICY9IH4oMSA8PCBjaG91dF9zaGlmdCk7CisJbCB8PSBjaG91dF92YWwgPDwgY2hvdXRfc2hpZnQ7CisKKwlkaXNwY193cml0ZV9yZWcoYXRfcmVnW3BsYW5lXSwgbCk7CisKKwlkaXNwY193cml0ZV9yZWcoYmFfcmVnW3BsYW5lXSwgcGFkZHIpOworCU1PRF9SRUdfRkxEKHBzX3JlZ1twbGFuZV0sCisJCSAgICBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLCAocG9zX3kgPDwgMTYpIHwgcG9zX3gpOworCisJTU9EX1JFR19GTEQoc3pfcmVnW3BsYW5lXSwgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwKKwkJCSgoaGVpZ2h0IC0gMSkgPDwgMTYpIHwgKHdpZHRoIC0gMSkpOworCisJaWYgKHNldF92c2l6ZSkgeworCQkvKiBTZXQgdmlkZW8gc2l6ZSBpZiBzZXRfc2NhbGUgaGFzbid0IHNldCBpdCAqLworCQlpZiAoIWRpc3BjLmZpcl92aW5jW3BsYW5lXSkKKwkJCU1PRF9SRUdfRkxEKHZzX3JlZ1twbGFuZV0sCisJCQkJRkxEX01BU0soMTYsIDExKSwgKGhlaWdodCAtIDEpIDw8IDE2KTsKKwkJaWYgKCFkaXNwYy5maXJfaGluY1twbGFuZV0pCisJCQlNT0RfUkVHX0ZMRCh2c19yZWdbcGxhbmVdLAorCQkJCUZMRF9NQVNLKDAsIDExKSwgd2lkdGggLSAxKTsKKwl9CisKKwlkaXNwY193cml0ZV9yZWcocmlfcmVnW3BsYW5lXSwgKHNjcmVlbl93aWR0aCAtIHdpZHRoKSAqIGJwcCAvIDggKyAxKTsKKworCXJldHVybiBoZWlnaHQgKiBzY3JlZW5fd2lkdGggKiBicHAgLyA4OworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgIGludCBzY3JlZW5fd2lkdGgsCisJCQkJICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgaW50IGNvbG9yX21vZGUpCit7CisJdTMyIHBhZGRyOworCWludCByOworCisJaWYgKCh1bnNpZ25lZClwbGFuZSA+IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCXBhZGRyID0gZGlzcGMubWVtX2Rlc2MucmVnaW9uW3BsYW5lXS5wYWRkciArIG9mZnNldDsKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlyID0gX3NldHVwX3BsYW5lKHBsYW5lLCBjaGFubmVsX291dCwgcGFkZHIsCisJCQlzY3JlZW5fd2lkdGgsCisJCQlwb3NfeCwgcG9zX3ksIHdpZHRoLCBoZWlnaHQsIGNvbG9yX21vZGUpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9maXJoX3JlZyhpbnQgcGxhbmUsIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgYmFzZTsKKworCWlmIChwbGFuZSA9PSAxKQorCQliYXNlID0gRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0ZJUl9DT0VGX0gwOworCWVsc2UKKwkJYmFzZSA9IERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSVJfQ09FRl9IMDsKKwlkaXNwY193cml0ZV9yZWcoYmFzZSArIHJlZyAqIDgsCXZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZmlyaHZfcmVnKGludCBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCXUzMiBiYXNlOworCisJaWYgKHBsYW5lID09IDEpCisJCWJhc2UgPSBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklSX0NPRUZfSFYwOworCWVsc2UKKwkJYmFzZSA9IERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSVJfQ09FRl9IVjA7CisJZGlzcGNfd3JpdGVfcmVnKGJhc2UgKyByZWcgKiA4LAl2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF91cHNhbXBsaW5nX2NvZWZfdGFibGUoaW50IHBsYW5lKQoreworCWNvbnN0IHUzMiBjb2VmW11bMl0gPSB7CisJCXsgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCB9LAorCQl7IDB4MEQ3Q0Y4MDAsIDB4MDM3QjAyRkYgfSwKKwkJeyAweDFFNzBGNUZGLCAweDBDNkYwNUZFIH0sCisJCXsgMHgzMzVGRjVGRSwgMHgyMDU5MDdGQiB9LAorCQl7IDB4Rjc0OTQ5RjcsIDB4MDA0MDQwMDAgfSwKKwkJeyAweEY1NUYzM0ZCLCAweDA3NTkyMEZFIH0sCisJCXsgMHhGNTcwMUVGRSwgMHgwNTZGMENGRiB9LAorCQl7IDB4Rjg3QzBERkYsIDB4MDI3QjAzMDAgfSwKKwl9OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl3cml0ZV9maXJoX3JlZyhwbGFuZSwgaSwgY29lZltpXVswXSk7CisJCXdyaXRlX2Zpcmh2X3JlZyhwbGFuZSwgaSwgY29lZltpXVsxXSk7CisJfQorfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0X3NjYWxlKGludCBwbGFuZSwKKwkJCQlpbnQgb3JpZ193aWR0aCwgaW50IG9yaWdfaGVpZ2h0LAorCQkJCWludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0KQoreworCWNvbnN0IHUzMiBhdF9yZWdbXSAgPSB7IDAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTIH07CisJY29uc3QgdTMyIHZzX3JlZ1tdICA9IHsgMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1NJWkUsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1NJWkUgfTsKKwljb25zdCB1MzIgZmlyX3JlZ1tdID0geyAwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklSLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSVIgfTsKKworCXUzMiBsOworCWludCBmaXJfaGluYzsKKwlpbnQgZmlyX3ZpbmM7CisKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGxhbmUgPT0gT01BUEZCX1BMQU5FX0dGWCAmJgorCSAgICAob3V0X3dpZHRoICE9IG9yaWdfd2lkdGggfHwgb3V0X2hlaWdodCAhPSBvcmlnX2hlaWdodCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJaWYgKG9yaWdfd2lkdGggPCBvdXRfd2lkdGgpIHsKKwkJLyoKKwkJICogVXBzYW1wbGluZy4KKwkJICogQ3VycmVudGx5IHlvdSBjYW4gb25seSBzY2FsZSBib3RoIGRpbWVuc2lvbnMgaW4gb25lIHdheS4KKwkJICovCisJCWlmIChvcmlnX2hlaWdodCA+IG91dF9oZWlnaHQgfHwKKwkJICAgIG9yaWdfd2lkdGggKiA4IDwgb3V0X3dpZHRoIHx8CisJCSAgICBvcmlnX2hlaWdodCAqIDggPCBvdXRfaGVpZ2h0KSB7CisJCQllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNldF91cHNhbXBsaW5nX2NvZWZfdGFibGUocGxhbmUpOworCX0gZWxzZSBpZiAob3JpZ193aWR0aCA+IG91dF93aWR0aCkgeworCQkvKiBEb3duc2FtcGxpbmcgbm90IHlldCBzdXBwb3J0ZWQKKwkJKi8KKworCQllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghb3JpZ193aWR0aCB8fCBvcmlnX3dpZHRoID09IG91dF93aWR0aCkKKwkJZmlyX2hpbmMgPSAwOworCWVsc2UKKwkJZmlyX2hpbmMgPSAxMDI0ICogb3JpZ193aWR0aCAvIG91dF93aWR0aDsKKwlpZiAoIW9yaWdfaGVpZ2h0IHx8IG9yaWdfaGVpZ2h0ID09IG91dF9oZWlnaHQpCisJCWZpcl92aW5jID0gMDsKKwllbHNlCisJCWZpcl92aW5jID0gMTAyNCAqIG9yaWdfaGVpZ2h0IC8gb3V0X2hlaWdodDsKKwlkaXNwYy5maXJfaGluY1twbGFuZV0gPSBmaXJfaGluYzsKKwlkaXNwYy5maXJfdmluY1twbGFuZV0gPSBmaXJfdmluYzsKKworCU1PRF9SRUdfRkxEKGZpcl9yZWdbcGxhbmVdLAorCQkgICAgRkxEX01BU0soMTYsIDEyKSB8IEZMRF9NQVNLKDAsIDEyKSwKKwkJICAgICgoZmlyX3ZpbmMgJiA0MDk1KSA8PCAxNikgfAorCQkgICAgKGZpcl9oaW5jICYgNDA5NSkpOworCisJZGV2X2RiZyhkaXNwYy5mYmRldi0+ZGV2LCAib3V0X3dpZHRoICVkIG91dF9oZWlnaHQgJWQgb3JpZ193aWR0aCAlZCAiCisJCSJvcmlnX2hlaWdodCAlZCBmaXJfaGluYyAgJWQgZmlyX3ZpbmMgJWRcbiIsCisJCW91dF93aWR0aCwgb3V0X2hlaWdodCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsCisJCWZpcl9oaW5jLCBmaXJfdmluYyk7CisKKwlNT0RfUkVHX0ZMRCh2c19yZWdbcGxhbmVdLAorCQkgICAgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwKKwkJICAgICgob3V0X2hlaWdodCAtIDEpIDw8IDE2KSB8IChvdXRfd2lkdGggLSAxKSk7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoYXRfcmVnW3BsYW5lXSk7CisJbCAmPSB+KDB4MDMgPDwgNSk7CisJbCB8PSBmaXJfaGluYyA/ICgxIDw8IDUpIDogMDsKKwlsIHw9IGZpcl92aW5jID8gKDEgPDwgNikgOiAwOworCWRpc3BjX3dyaXRlX3JlZyhhdF9yZWdbcGxhbmVdLCBsKTsKKworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfZW5hYmxlX3BsYW5lKGludCBwbGFuZSwgaW50IGVuYWJsZSkKK3sKKwljb25zdCB1MzIgYXRfcmVnW10gPSB7IERJU1BDX0dGWF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTIH07CisJaWYgKCh1bnNpZ25lZCBpbnQpcGxhbmUgPiBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKGF0X3JlZ1twbGFuZV0sIDEsIGVuYWJsZSA/IDEgOiAwKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0X2NvbG9yX2tleShzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJdTMyIGRmX3JlZywgdHJfcmVnOworCWludCBzaGlmdCwgdmFsOworCisJc3dpdGNoIChjay0+Y2hhbm5lbF9vdXQpIHsKKwljYXNlIE9NQVBGQl9DSEFOTkVMX09VVF9MQ0Q6CisJCWRmX3JlZyA9IERJU1BDX0RFRkFVTFRfQ09MT1IwOworCQl0cl9yZWcgPSBESVNQQ19UUkFOU19DT0xPUjA7CisJCXNoaWZ0ID0gMTA7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NIQU5ORUxfT1VUX0RJR0lUOgorCQlkZl9yZWcgPSBESVNQQ19ERUZBVUxUX0NPTE9SMTsKKwkJdHJfcmVnID0gRElTUENfVFJBTlNfQ09MT1IxOworCQlzaGlmdCA9IDEyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3dpdGNoIChjay0+a2V5X3R5cGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9LRVlfRElTQUJMRUQ6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0tFWV9HRlhfRFNUOgorCQl2YWwgPSAxOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9LRVlfVklEX1NSQzoKKwkJdmFsID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTkZJRywgRkxEX01BU0soc2hpZnQsIDIpLCB2YWwgPDwgc2hpZnQpOworCisJaWYgKHZhbCAhPSAwKQorCQlkaXNwY193cml0ZV9yZWcodHJfcmVnLCBjay0+dHJhbnNfa2V5KTsKKwlkaXNwY193cml0ZV9yZWcoZGZfcmVnLCBjay0+YmFja2dyb3VuZCk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisKKwlkaXNwYy5jb2xvcl9rZXkgPSAqY2s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX2dldF9jb2xvcl9rZXkoc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKQoreworCSpjayA9IGRpc3BjLmNvbG9yX2tleTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbG9hZF9wYWxldHRlKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXRfdXBkYXRlX21vZGUoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgciA9IDA7CisKKwlpZiAobW9kZSAhPSBkaXNwYy51cGRhdGVfbW9kZSkgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCQllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwkJCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMSk7CisJCQlkaXNwYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQlicmVhazsKKwkJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQkJaW5pdF9jb21wbGV0aW9uKCZkaXNwYy5mcmFtZV9kb25lKTsKKwkJCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMCk7CisJCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGlzcGMuZnJhbWVfZG9uZSwKKwkJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKSkgeworCQkJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwKKwkJCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOworCQkJfQorCQkJZGlzcGMudXBkYXRlX21vZGUgPSBtb2RlOworCQkJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXIgPSAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZGlzcGNfZ2V0X2NhcHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19QTEFORV9SRUxPQ0FURV9NRU07CisJaWYgKHBsYW5lID4gMCkKKwkJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19QTEFORV9TQ0FMRTsKKwljYXBzLT5wbGFuZV9jb2xvciB8PSAoMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1KSB8CisJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjIpIHwKKwkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVWTQyMik7CisJaWYgKHBsYW5lID09IDApCisJCWNhcHMtPnBsYW5lX2NvbG9yIHw9ICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzhCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzRCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzJCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzFCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9SR0I0NDQpOworfQorCitzdGF0aWMgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgb21hcF9kaXNwY19nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gZGlzcGMudXBkYXRlX21vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2NvbG9yX2NvbnZfY29lZih2b2lkKQoreworCXUzMiBtYXNrID0gRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKTsKKwlpbnQgY2YxX3JlZyA9IERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9DT05WX0NPRUYwOworCWludCBjZjJfcmVnID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0NPTlZfQ09FRjA7CisJaW50IGF0MV9yZWcgPSBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUzsKKwlpbnQgYXQyX3JlZyA9IERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTOworCWNvbnN0IHN0cnVjdCBjb2xvcl9jb252X2NvZWYgeworCQlpbnQgIHJ5LCAgcmNyLCAgcmNiLCAgIGd5LCAgZ2NyLCAgZ2NiLCAgIGJ5LCAgYmNyLCAgYmNiOworCQlpbnQgIGZ1bGxfcmFuZ2U7CisJfSAgY3RibF9idDYwMV81ID0geworCQkgICAgMjk4LCAgNDA5LCAgICAwLCAgMjk4LCAtMjA4LCAtMTAwLCAgMjk4LCAgICAwLCAgNTE3LCAwLAorCX07CisJY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZfY29lZiAqY3Q7CisjZGVmaW5lIENWQUwoeCwgeSkJKCgoeCAmIDIwNDcpIDw8IDE2KSB8ICh5ICYgMjA0NykpCisKKwljdCA9ICZjdGJsX2J0NjAxXzU7CisKKwlNT0RfUkVHX0ZMRChjZjFfcmVnLAkJbWFzaywJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKKwlNT0RfUkVHX0ZMRChjZjFfcmVnICsgNCwJbWFzaywJQ1ZBTChjdC0+Z3ksICBjdC0+cmNiKSk7CisJTU9EX1JFR19GTEQoY2YxX3JlZyArIDgsCW1hc2ssCUNWQUwoY3QtPmdjYiwgY3QtPmdjcikpOworCU1PRF9SRUdfRkxEKGNmMV9yZWcgKyAxMiwJbWFzaywJQ1ZBTChjdC0+YmNyLCBjdC0+YnkpKTsKKwlNT0RfUkVHX0ZMRChjZjFfcmVnICsgMTYsCW1hc2ssCUNWQUwoMCwJICAgICAgY3QtPmJjYikpOworCisJTU9EX1JFR19GTEQoY2YyX3JlZywJCW1hc2ssCUNWQUwoY3QtPnJjciwgY3QtPnJ5KSk7CisJTU9EX1JFR19GTEQoY2YyX3JlZyArIDQsCW1hc2ssCUNWQUwoY3QtPmd5LCAgY3QtPnJjYikpOworCU1PRF9SRUdfRkxEKGNmMl9yZWcgKyA4LAltYXNrLAlDVkFMKGN0LT5nY2IsIGN0LT5nY3IpKTsKKwlNT0RfUkVHX0ZMRChjZjJfcmVnICsgMTIsCW1hc2ssCUNWQUwoY3QtPmJjciwgY3QtPmJ5KSk7CisJTU9EX1JFR19GTEQoY2YyX3JlZyArIDE2LAltYXNrLAlDVkFMKDAsCSAgICAgIGN0LT5iY2IpKTsKKyN1bmRlZiBDVkFMCisKKwlNT0RfUkVHX0ZMRChhdDFfcmVnLCAoMSA8PCAxMSksIGN0LT5mdWxsX3JhbmdlKTsKKwlNT0RfUkVHX0ZMRChhdDJfcmVnLCAoMSA8PCAxMSksIGN0LT5mdWxsX3JhbmdlKTsKK30KKworc3RhdGljIHZvaWQgY2FsY19ja19kaXYoaW50IGlzX3RmdCwgaW50IHBjaywgaW50ICpsY2tfZGl2LCBpbnQgKnBja19kaXYpCit7CisJdW5zaWduZWQgbG9uZyBmY2ssIGxjazsKKworCSpsY2tfZGl2ID0gMTsKKwlwY2sgPSBtYXgoMSwgcGNrKTsKKwlmY2sgPSBjbGtfZ2V0X3JhdGUoZGlzcGMuZHNzMV9mY2spOworCWxjayA9IGZjazsKKwkqcGNrX2RpdiA9IChsY2sgKyBwY2sgLSAxKSAvIHBjazsKKwlpZiAoaXNfdGZ0KQorCQkqcGNrX2RpdiA9IG1heCgyLCAqcGNrX2Rpdik7CisJZWxzZQorCQkqcGNrX2RpdiA9IG1heCgzLCAqcGNrX2Rpdik7CisJaWYgKCpwY2tfZGl2ID4gMjU1KSB7CisJCSpwY2tfZGl2ID0gMjU1OworCQlsY2sgPSBwY2sgKiAqcGNrX2RpdjsKKwkJKmxja19kaXYgPSBmY2sgLyBsY2s7CisJCUJVR19PTigqbGNrX2RpdiA8IDEpOworCQlpZiAoKmxja19kaXYgPiAyNTUpIHsKKwkJCSpsY2tfZGl2ID0gMjU1OworCQkJZGV2X3dhcm4oZGlzcGMuZmJkZXYtPmRldiwgInBpeGNsb2NrICVkIGtIeiB0b28gbG93LlxuIiwKKwkJCQkgcGNrIC8gMTAwMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sY2RfdGZ0X21vZGUoaW50IGVuYWJsZSkKK3sKKwl1MzIgbWFzazsKKworCW1hc2sgPSAxIDw8IDM7CisJTU9EX1JFR19GTEQoRElTUENfQ09OVFJPTCwgbWFzaywgZW5hYmxlID8gbWFzayA6IDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfbGNkX3RpbWluZ3Modm9pZCkKK3sKKwl1MzIgbDsKKwlpbnQgbGNrX2RpdiwgcGNrX2RpdjsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGRpc3BjLmZiZGV2LT5wYW5lbDsKKwlpbnQgaXNfdGZ0ID0gcGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19QQU5FTF9URlQ7CisJdW5zaWduZWQgbG9uZyBmY2s7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfVElNSU5HX0gpOworCWwgJj0gfihGTERfTUFTSygwLCA2KSB8IEZMRF9NQVNLKDgsIDgpIHwgRkxEX01BU0soMjAsIDgpKTsKKwlsIHw9ICggbWF4KDEsIChtaW4oNjQsICBwYW5lbC0+aHN3KSkpIC0gMSApIDw8IDA7CisJbCB8PSAoIG1heCgxLCAobWluKDI1NiwgcGFuZWwtPmhmcCkpKSAtIDEgKSA8PCA4OworCWwgfD0gKCBtYXgoMSwgKG1pbigyNTYsIHBhbmVsLT5oYnApKSkgLSAxICkgPDwgMjA7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1RJTUlOR19ILCBsKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19USU1JTkdfVik7CisJbCAmPSB+KEZMRF9NQVNLKDAsIDYpIHwgRkxEX01BU0soOCwgOCkgfCBGTERfTUFTSygyMCwgOCkpOworCWwgfD0gKCBtYXgoMSwgKG1pbig2NCwgIHBhbmVsLT52c3cpKSkgLSAxICkgPDwgMDsKKwlsIHw9ICggbWF4KDAsIChtaW4oMjU1LCBwYW5lbC0+dmZwKSkpIC0gMCApIDw8IDg7CisJbCB8PSAoIG1heCgwLCAobWluKDI1NSwgcGFuZWwtPnZicCkpKSAtIDAgKSA8PCAyMDsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVElNSU5HX1YsIGwpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1BPTF9GUkVRKTsKKwlsICY9IH5GTERfTUFTSygxMiwgNik7CisJbCB8PSAocGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19TSUdOQUxfTUFTSykgPDwgMTI7CisJbCB8PSBwYW5lbC0+YWNiICYgMHhmZjsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfUE9MX0ZSRVEsIGwpOworCisJY2FsY19ja19kaXYoaXNfdGZ0LCBwYW5lbC0+cGl4ZWxfY2xvY2sgKiAxMDAwLCAmbGNrX2RpdiwgJnBja19kaXYpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1IpOworCWwgJj0gfihGTERfTUFTSygxNiwgOCkgfCBGTERfTUFTSygwLCA4KSk7CisJbCB8PSAobGNrX2RpdiA8PCAxNikgfCAocGNrX2RpdiA8PCAwKTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfRElWSVNPUiwgbCk7CisKKwkvKiB1cGRhdGUgcGFuZWwgaW5mbyB3aXRoIHRoZSBleGFjdCBjbG9jayAqLworCWZjayA9IGNsa19nZXRfcmF0ZShkaXNwYy5kc3MxX2Zjayk7CisJcGFuZWwtPnBpeGVsX2Nsb2NrID0gZmNrIC8gbGNrX2RpdiAvIHBja19kaXYgLyAxMDAwOworfQorCitpbnQgb21hcF9kaXNwY19yZXF1ZXN0X2lycSh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCWludCByID0gMDsKKworCUJVR19PTihjYWxsYmFjayA9PSBOVUxMKTsKKworCWlmIChkaXNwYy5pcnFfY2FsbGJhY2spCisJCXIgPSAtRUJVU1k7CisJZWxzZSB7CisJCWRpc3BjLmlycV9jYWxsYmFjayA9IGNhbGxiYWNrOworCQlkaXNwYy5pcnFfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisJfQorCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfcmVxdWVzdF9pcnEpOworCit2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2lycXMoaW50IGlycV9tYXNrKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCWRpc3BjLmVuYWJsZWRfaXJxcyA9IGlycV9tYXNrOworCWlycV9tYXNrIHw9IERJU1BDX0lSUV9NQVNLX0VSUk9SOworCU1PRF9SRUdfRkxEKERJU1BDX0lSUUVOQUJMRSwgMHg3ZmZmLCBpcnFfbWFzayk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZW5hYmxlX2lycXMpOworCit2b2lkIG9tYXBfZGlzcGNfZGlzYWJsZV9pcnFzKGludCBpcnFfbWFzaykKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlkaXNwYy5lbmFibGVkX2lycXMgJj0gfmlycV9tYXNrOworCWlycV9tYXNrICY9IH5ESVNQQ19JUlFfTUFTS19FUlJPUjsKKwlNT0RfUkVHX0ZMRChESVNQQ19JUlFFTkFCTEUsIDB4N2ZmZiwgaXJxX21hc2spOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2Rpc2FibGVfaXJxcyk7CisKK3ZvaWQgb21hcF9kaXNwY19mcmVlX2lycSh2b2lkKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCW9tYXBfZGlzcGNfZGlzYWJsZV9pcnFzKERJU1BDX0lSUV9NQVNLX0FMTCk7CisJZGlzcGMuaXJxX2NhbGxiYWNrID0gTlVMTDsKKwlkaXNwYy5pcnFfY2FsbGJhY2tfZGF0YSA9IE5VTEw7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZnJlZV9pcnEpOworCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9kaXNwY19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJdTMyIHN0YXQgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19JUlFTVEFUVVMpOworCisJaWYgKHN0YXQgJiBESVNQQ19JUlFfRlJBTUVNQVNLKQorCQljb21wbGV0ZSgmZGlzcGMuZnJhbWVfZG9uZSk7CisKKwlpZiAoc3RhdCAmIERJU1BDX0lSUV9NQVNLX0VSUk9SKSB7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImlycSBlcnJvciBzdGF0dXMgJTA0eFxuIiwKKwkJCQlzdGF0ICYgMHg3ZmZmKTsKKwkJfQorCX0KKworCWlmICgoc3RhdCAmIGRpc3BjLmVuYWJsZWRfaXJxcykgJiYgZGlzcGMuaXJxX2NhbGxiYWNrKQorCQlkaXNwYy5pcnFfY2FsbGJhY2soZGlzcGMuaXJxX2NhbGxiYWNrX2RhdGEpOworCisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0lSUVNUQVRVUywgc3RhdCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Rzc19jbG9ja3Modm9pZCkKK3sKKwlpZiAoSVNfRVJSKChkaXNwYy5kc3NfaWNrID0gY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAiZHNzX2ljayIpKSkpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzc19pY2siKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcGMuZHNzX2ljayk7CisJfQorCisJaWYgKElTX0VSUigoZGlzcGMuZHNzMV9mY2sgPSBjbGtfZ2V0KGRpc3BjLmZiZGV2LT5kZXYsICJkc3MxX2ZjayIpKSkpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzczFfZmNrIik7CisJCWNsa19wdXQoZGlzcGMuZHNzX2ljayk7CisJCXJldHVybiBQVFJfRVJSKGRpc3BjLmRzczFfZmNrKTsKKwl9CisKKwlpZiAoSVNfRVJSKChkaXNwYy5kc3NfNTRtX2ZjayA9CisJCQkJY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAiZHNzXzU0bV9mY2siKSkpKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBkc3NfNTRtX2ZjayIpOworCQljbGtfcHV0KGRpc3BjLmRzc19pY2spOworCQljbGtfcHV0KGRpc3BjLmRzczFfZmNrKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcGMuZHNzXzU0bV9mY2spOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfZHNzX2Nsb2Nrcyh2b2lkKQoreworCWNsa19wdXQoZGlzcGMuZHNzXzU0bV9mY2spOworCWNsa19wdXQoZGlzcGMuZHNzMV9mY2spOworCWNsa19wdXQoZGlzcGMuZHNzX2ljayk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9sY2RfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJY2xrX2VuYWJsZShkaXNwYy5kc3MxX2Zjayk7CisJZWxzZQorCQljbGtfZGlzYWJsZShkaXNwYy5kc3MxX2Zjayk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJY2xrX2VuYWJsZShkaXNwYy5kc3NfaWNrKTsKKwllbHNlCisJCWNsa19kaXNhYmxlKGRpc3BjLmRzc19pY2spOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfZGlnaXRfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJY2xrX2VuYWJsZShkaXNwYy5kc3NfNTRtX2Zjayk7CisJZWxzZQorCQljbGtfZGlzYWJsZShkaXNwYy5kc3NfNTRtX2Zjayk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZGlzcGNfc3VzcGVuZCh2b2lkKQoreworCWlmIChkaXNwYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJaW5pdF9jb21wbGV0aW9uKCZkaXNwYy5mcmFtZV9kb25lKTsKKwkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgwKTsKKwkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRpc3BjLmZyYW1lX2RvbmUsCisJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKSkgeworCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LAorCQkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOworCQl9CisJCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9kaXNwY19yZXN1bWUodm9pZCkKK3sKKwlpZiAoZGlzcGMudXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFKSB7CisJCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCQlpZiAoIWRpc3BjLmV4dF9tb2RlKSB7CisJCQlzZXRfbGNkX3RpbWluZ3MoKTsKKwkJCWxvYWRfcGFsZXR0ZSgpOworCQl9CisJCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMSk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY191cGRhdGVfd2luZG93KHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCSB2b2lkICgqY29tcGxldGVfY2FsbGJhY2spKHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmNvbXBsZXRlX2NhbGxiYWNrX2RhdGEpCit7CisJcmV0dXJuIGRpc3BjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9VUERBVEVfRElTQUJMRUQgPyAtRU5PREVWIDogMDsKK30KKworc3RhdGljIGludCBtbWFwX2tlcm4oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJc3RydWN0IHZtX3N0cnVjdAkqa3ZtYTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QJdm1hOworCXBncHJvdF90CQlwZ3Byb3Q7CisJdW5zaWduZWQgbG9uZwkJdmFkZHI7CisKKwlrdm1hID0gZ2V0X3ZtX2FyZWEocmVnaW9uLT5zaXplLCBWTV9JT1JFTUFQKTsKKwlpZiAoa3ZtYSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBrZXJuZWwgdm0gYXJlYVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2bWEudm1fbW0gPSAmaW5pdF9tbTsKKworCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpa3ZtYS0+YWRkcjsKKworCXBncHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUocGdwcm90X2tlcm5lbCk7CisJdm1hLnZtX3N0YXJ0ID0gdmFkZHI7CisJdm1hLnZtX2VuZCA9IHZhZGRyICsgcmVnaW9uLT5zaXplOworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2UoJnZtYSwgdmFkZHIsIHJlZ2lvbi0+cGFkZHIgPj4gUEFHRV9TSElGVCwKKwkJCSAgIHJlZ2lvbi0+c2l6ZSwgcGdwcm90KSA8IDApIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAia2VybmVsIG1tYXAgZm9yIEZCTUVNIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlyZWdpb24tPnZhZGRyID0gKHZvaWQgKil2YWRkcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtbWFwX3VzZXJfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcGxhbmUgPSAoaW50KXZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJYXRvbWljX2luYygmZGlzcGMubWFwX2NvdW50W3BsYW5lXSk7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfdXNlcl9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcGxhbmUgPSAoaW50KXZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJYXRvbWljX2RlYygmZGlzcGMubWFwX2NvdW50W3BsYW5lXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbW1hcF91c2VyX29wcyA9IHsKKwkub3BlbiA9IG1tYXBfdXNlcl9vcGVuLAorCS5jbG9zZSA9IG1tYXBfdXNlcl9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19tbWFwX3VzZXIoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXVuc2lnbmVkIGxvbmcgb2ZmOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdTMyIGxlbjsKKworCWlmICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHZtYS0+dm1fcGdvZmYgPiAofjBVTCA+PiBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJb2ZmID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCisJc3RhcnQgPSBpbmZvLT5maXguc21lbV9zdGFydDsKKwlsZW4gPSBpbmZvLT5maXguc21lbV9sZW47CisJaWYgKG9mZiA+PSBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ICsgb2ZmKSA+IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJb2ZmICs9IHN0YXJ0OworCXZtYS0+dm1fcGdvZmYgPSBvZmYgPj4gUEFHRV9TSElGVDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKwl2bWEtPnZtX29wcyA9ICZtbWFwX3VzZXJfb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gKHZvaWQgKilwbGFuZS0+aWR4OworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBvZmYgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCXJldHVybiAtRUFHQUlOOworCS8qIHZtX29wcy5vcGVuIHdvbid0IGJlIGNhbGxlZCBmb3IgbW1hcCBpdHNlbGYuICovCisJYXRvbWljX2luYygmZGlzcGMubWFwX2NvdW50W3BsYW5lLT5pZHhdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5tYXBfa2VybihzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwl2dW5tYXAocmVnaW9uLT52YWRkcik7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcGFsZXR0ZV9yYW0odm9pZCkKK3sKKwlkaXNwYy5wYWxldHRlX3ZhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LAorCQlNQVhfUEFMRVRURV9TSVpFLCAmZGlzcGMucGFsZXR0ZV9wYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGRpc3BjLnBhbGV0dGVfdmFkZHIgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgcGFsZXR0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYWxldHRlX3JhbSh2b2lkKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LCBNQVhfUEFMRVRURV9TSVpFLAorCQkJZGlzcGMucGFsZXR0ZV92YWRkciwgZGlzcGMucGFsZXR0ZV9wYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJcmVnaW9uLT52YWRkciA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoZGlzcGMuZmJkZXYtPmRldiwKKwkJCXJlZ2lvbi0+c2l6ZSwgJnJlZ2lvbi0+cGFkZHIsIEdGUF9LRVJORUwpOworCisJaWYgKHJlZ2lvbi0+dmFkZHIgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgRkIgRE1BIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2ZibWVtKHN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmVnaW9uKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LCByZWdpb24tPnNpemUsCisJCQkgICAgICByZWdpb24tPnZhZGRyLCByZWdpb24tPnBhZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCByZXNtYXAgKmluaXRfcmVzbWFwKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIHBhZ2VfY250OworCXN0cnVjdCByZXNtYXAgKnJlc19tYXA7CisKKwlwYWdlX2NudCA9IFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CisJcmVzX21hcCA9CisJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNtYXApICsgUkVTTUFQX1NJWkUocGFnZV9jbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzX21hcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXNfbWFwLT5zdGFydCA9IHN0YXJ0OworCXJlc19tYXAtPnBhZ2VfY250ID0gcGFnZV9jbnQ7CisJcmVzX21hcC0+bWFwID0gKHVuc2lnbmVkIGxvbmcgKikocmVzX21hcCArIDEpOworCXJldHVybiByZXNfbWFwOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX3Jlc21hcChzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwKQoreworCWtmcmVlKHJlc19tYXApOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNtYXBfbWVtX3R5cGUodW5zaWduZWQgbG9uZyBzdGFydCkKK3sKKwlpZiAoc3RhcnQgPj0gT01BUDJfU1JBTV9TVEFSVCAmJgorCSAgICBzdGFydCA8IE9NQVAyX1NSQU1fU1RBUlQgKyBPTUFQMl9TUkFNX1NJWkUpCisJCXJldHVybiBPTUFQRkJfTUVNVFlQRV9TUkFNOworCWVsc2UKKwkJcmV0dXJuIE9NQVBGQl9NRU1UWVBFX1NEUkFNOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNtYXBfcGFnZV9yZXNlcnZlZChzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwLCB1bnNpZ25lZCBwYWdlX25yKQoreworCXJldHVybiAqUkVTTUFQX1BUUihyZXNfbWFwLCBwYWdlX25yKSAmIFJFU01BUF9NQVNLKHBhZ2VfbnIpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNtYXBfcmVzZXJ2ZV9wYWdlKHN0cnVjdCByZXNtYXAgKnJlc19tYXAsIHVuc2lnbmVkIHBhZ2VfbnIpCit7CisJQlVHX09OKHJlc21hcF9wYWdlX3Jlc2VydmVkKHJlc19tYXAsIHBhZ2VfbnIpKTsKKwkqUkVTTUFQX1BUUihyZXNfbWFwLCBwYWdlX25yKSB8PSBSRVNNQVBfTUFTSyhwYWdlX25yKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc21hcF9mcmVlX3BhZ2Uoc3RydWN0IHJlc21hcCAqcmVzX21hcCwgdW5zaWduZWQgcGFnZV9ucikKK3sKKwlCVUdfT04oIXJlc21hcF9wYWdlX3Jlc2VydmVkKHJlc19tYXAsIHBhZ2VfbnIpKTsKKwkqUkVTTUFQX1BUUihyZXNfbWFwLCBwYWdlX25yKSAmPSB+UkVTTUFQX01BU0socGFnZV9ucik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc21hcF9yZXNlcnZlX3JlZ2lvbih1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3Qgc2l6ZSkKK3sKKworCXN0cnVjdCByZXNtYXAJKnJlc19tYXA7CisJdW5zaWduZWQJc3RhcnRfcGFnZTsKKwl1bnNpZ25lZAllbmRfcGFnZTsKKwlpbnQJCW10eXBlOworCXVuc2lnbmVkCWk7CisKKwltdHlwZSA9IHJlc21hcF9tZW1fdHlwZShzdGFydCk7CisJcmVzX21hcCA9IGRpc3BjLnJlc19tYXBbbXR5cGVdOworCWRldl9kYmcoZGlzcGMuZmJkZXYtPmRldiwgInJlc2VydmUgbWVtIHR5cGUgJWQgc3RhcnQgJTA4bHggc2l6ZSAlZFxuIiwKKwkJbXR5cGUsIHN0YXJ0LCBzaXplKTsKKwlzdGFydF9wYWdlID0gKHN0YXJ0IC0gcmVzX21hcC0+c3RhcnQpIC8gUEFHRV9TSVpFOworCWVuZF9wYWdlID0gc3RhcnRfcGFnZSArIFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspCisJCXJlc21hcF9yZXNlcnZlX3BhZ2UocmVzX21hcCwgaSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc21hcF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcmVzbWFwCSpyZXNfbWFwOworCXVuc2lnbmVkCXN0YXJ0X3BhZ2U7CisJdW5zaWduZWQJZW5kX3BhZ2U7CisJdW5zaWduZWQJaTsKKwlpbnQJCW10eXBlOworCisJbXR5cGUgPSByZXNtYXBfbWVtX3R5cGUoc3RhcnQpOworCXJlc19tYXAgPSBkaXNwYy5yZXNfbWFwW210eXBlXTsKKwlkZXZfZGJnKGRpc3BjLmZiZGV2LT5kZXYsICJmcmVlIG1lbSB0eXBlICVkIHN0YXJ0ICUwOGx4IHNpemUgJWRcbiIsCisJCW10eXBlLCBzdGFydCwgc2l6ZSk7CisJc3RhcnRfcGFnZSA9IChzdGFydCAtIHJlc19tYXAtPnN0YXJ0KSAvIFBBR0VfU0laRTsKKwllbmRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCWZvciAoaSA9IHN0YXJ0X3BhZ2U7IGkgPCBlbmRfcGFnZTsgaSsrKQorCQlyZXNtYXBfZnJlZV9wYWdlKHJlc19tYXAsIGkpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNtYXBfYWxsb2NfcmVnaW9uKGludCBtdHlwZSwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCB0b3RhbDsKKwl1bnNpZ25lZCBzdGFydF9wYWdlOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJc3RydWN0IHJlc21hcCAqcmVzX21hcCA9IGRpc3BjLnJlc19tYXBbbXR5cGVdOworCisJQlVHX09OKG10eXBlID49IERJU1BDX01FTVRZUEVfTlVNIHx8IHJlc19tYXAgPT0gTlVMTCB8fCAhc2l6ZSk7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKKwlzdGFydF9wYWdlID0gMDsKKwl0b3RhbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJlc19tYXAtPnBhZ2VfY250OyBpKyspIHsKKwkJaWYgKHJlc21hcF9wYWdlX3Jlc2VydmVkKHJlc19tYXAsIGkpKSB7CisJCQlzdGFydF9wYWdlID0gaSArIDE7CisJCQl0b3RhbCA9IDA7CisJCX0gZWxzZSBpZiAoKyt0b3RhbCA9PSBzaXplKQorCQkJYnJlYWs7CisJfQorCWlmICh0b3RhbCA8IHNpemUpCisJCXJldHVybiAwOworCisJc3RhcnQgPSByZXNfbWFwLT5zdGFydCArIHN0YXJ0X3BhZ2UgKiBQQUdFX1NJWkU7CisJcmVzbWFwX3Jlc2VydmVfcmVnaW9uKHN0YXJ0LCBzaXplICogUEFHRV9TSVpFKTsKKworCXJldHVybiBzdGFydDsKK30KKworLyogTm90ZSB0aGF0IHRoaXMgd2lsbCBvbmx5IHdvcmsgZm9yIHVzZXIgbWFwcGluZ3MsIHdlIGRvbid0IGRlYWwgd2l0aAorICoga2VybmVsIG1hcHBpbmdzIGhlcmUsIHNvIGZiY29uIHdpbGwga2VlcCB1c2luZyB0aGUgb2xkIHJlZ2lvbi4KKyAqLworc3RhdGljIGludCBvbWFwX2Rpc3BjX3NldHVwX21lbShpbnQgcGxhbmUsIHNpemVfdCBzaXplLCBpbnQgbWVtX3R5cGUsCisJCQkJdW5zaWduZWQgbG9uZyAqcGFkZHIpCit7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKwl1bnNpZ25lZCBsb25nIG5ld19hZGRyID0gMDsKKworCWlmICgodW5zaWduZWQpcGxhbmUgPiBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobWVtX3R5cGUgPj0gRElTUENfTUVNVFlQRV9OVU0pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkaXNwYy5yZXNfbWFwW21lbV90eXBlXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZyA9ICZkaXNwYy5tZW1fZGVzYy5yZWdpb25bcGxhbmVdOworCWlmIChzaXplID09IHJnLT5zaXplICYmIG1lbV90eXBlID09IHJnLT50eXBlKQorCQlyZXR1cm4gMDsKKwlpZiAoYXRvbWljX3JlYWQoJmRpc3BjLm1hcF9jb3VudFtwbGFuZV0pKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChyZy0+c2l6ZSAhPSAwKQorCQlyZXNtYXBfZnJlZV9yZWdpb24ocmctPnBhZGRyLCByZy0+c2l6ZSk7CisJaWYgKHNpemUgIT0gMCkgeworCQluZXdfYWRkciA9IHJlc21hcF9hbGxvY19yZWdpb24obWVtX3R5cGUsIHNpemUpOworCQlpZiAoIW5ld19hZGRyKSB7CisJCQkvKiBSZWFsbG9jYXRlIG9sZCByZWdpb24uICovCisJCQlyZXNtYXBfcmVzZXJ2ZV9yZWdpb24ocmctPnBhZGRyLCByZy0+c2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZy0+cGFkZHIgPSBuZXdfYWRkcjsKKwlyZy0+c2l6ZSA9IHNpemU7CisJcmctPnR5cGUgPSBtZW1fdHlwZTsKKworCSpwYWRkciA9IG5ld19hZGRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX21kKQoreworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbgkqcmc7CisJaW50IGk7CisJaW50IHI7CisJdW5zaWduZWQgbG9uZwkJCW1lbV9zdGFydFtESVNQQ19NRU1UWVBFX05VTV07CisJdW5zaWduZWQgbG9uZwkJCW1lbV9lbmRbRElTUENfTUVNVFlQRV9OVU1dOworCisJaWYgKCFyZXFfbWQtPnJlZ2lvbl9jbnQpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAibm8gbWVtb3J5IHJlZ2lvbnMgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJnID0gJnJlcV9tZC0+cmVnaW9uWzBdOworCW1lbXNldChtZW1fc3RhcnQsIDB4ZmYsIHNpemVvZihtZW1fc3RhcnQpKTsKKwltZW1zZXQobWVtX2VuZCwgMCwgc2l6ZW9mKG1lbV9lbmQpKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXFfbWQtPnJlZ2lvbl9jbnQ7IGkrKywgcmcrKykgeworCQlpbnQgbXR5cGU7CisJCWlmIChyZy0+cGFkZHIpIHsKKwkJCXJnLT5hbGxvYyA9IDA7CisJCQlpZiAocmctPnZhZGRyID09IE5VTEwpIHsKKwkJCQlyZy0+bWFwID0gMTsKKwkJCQlpZiAoKHIgPSBtbWFwX2tlcm4ocmcpKSA8IDApCisJCQkJCXJldHVybiByOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJnLT50eXBlICE9IE9NQVBGQl9NRU1UWVBFX1NEUkFNKSB7CisJCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LAorCQkJCQkidW5zdXBwb3J0ZWQgbWVtb3J5IHR5cGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmctPmFsbG9jID0gcmctPm1hcCA9IDE7CisJCQlpZiAoKHIgPSBhbGxvY19mYm1lbShyZykpIDwgMCkKKwkJCQlyZXR1cm4gcjsKKwkJfQorCQltdHlwZSA9IHJnLT50eXBlOworCisJCWlmIChyZy0+cGFkZHIgPCBtZW1fc3RhcnRbbXR5cGVdKQorCQkJbWVtX3N0YXJ0W210eXBlXSA9IHJnLT5wYWRkcjsKKwkJaWYgKHJnLT5wYWRkciArIHJnLT5zaXplID4gbWVtX2VuZFttdHlwZV0pCisJCQltZW1fZW5kW210eXBlXSA9IHJnLT5wYWRkciArIHJnLT5zaXplOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBESVNQQ19NRU1UWVBFX05VTTsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJCXNpemVfdCBzaXplOworCQlpZiAobWVtX2VuZFtpXSA9PSAwKQorCQkJY29udGludWU7CisJCXN0YXJ0ID0gbWVtX3N0YXJ0W2ldOworCQlzaXplID0gbWVtX2VuZFtpXSAtIHN0YXJ0OworCQlkaXNwYy5yZXNfbWFwW2ldID0gaW5pdF9yZXNtYXAoc3RhcnQsIHNpemUpOworCQlyID0gLUVOT01FTTsKKwkJaWYgKGRpc3BjLnJlc19tYXBbaV0gPT0gTlVMTCkKKwkJCWdvdG8gZmFpbDsKKwkJLyogSW5pdGlhbCBzdGF0ZSBpcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgcmVzZXJ2ZWQuIFRoaXMKKwkJICogaW5jbHVkZXMgcG9zc2libGUgaG9sZXMgYXMgd2VsbCwgd2hpY2ggd2lsbCBuZXZlciBiZQorCQkgKiBmcmVlZC4KKwkJICovCisJCXJlc21hcF9yZXNlcnZlX3JlZ2lvbihzdGFydCwgc2l6ZSk7CisJfQorCisJZGlzcGMubWVtX2Rlc2MgPSAqcmVxX21kOworCisJcmV0dXJuIDA7CitmYWlsOgorCWZvciAoaSA9IDA7IGkgPCBESVNQQ19NRU1UWVBFX05VTTsgaSsrKSB7CisJCWlmIChkaXNwYy5yZXNfbWFwW2ldICE9IE5VTEwpCisJCQljbGVhbnVwX3Jlc21hcChkaXNwYy5yZXNfbWFwW2ldKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZmJtZW0odm9pZCkKK3sKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERJU1BDX01FTVRZUEVfTlVNOyBpKyspIHsKKwkJaWYgKGRpc3BjLnJlc19tYXBbaV0gIT0gTlVMTCkKKwkJCWNsZWFudXBfcmVzbWFwKGRpc3BjLnJlc19tYXBbaV0pOworCX0KKwlyZyA9ICZkaXNwYy5tZW1fZGVzYy5yZWdpb25bMF07CisJZm9yIChpID0gMDsgaSA8IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKywgcmcrKykgeworCQlpZiAocmctPmFsbG9jKQorCQkJZnJlZV9mYm1lbShyZyk7CisJCWVsc2UgeworCQkJaWYgKHJnLT5tYXApCisJCQkJdW5tYXBfa2VybihyZyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IGV4dF9tb2RlLAorCQkJICAgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX3ZyYW0pCit7CisJaW50IHI7CisJdTMyIGw7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJaW50IHRtbyA9IDEwMDAwOworCWludCBza2lwX2luaXQgPSAwOworCWludCBpOworCisJbWVtc2V0KCZkaXNwYywgMCwgc2l6ZW9mKGRpc3BjKSk7CisKKwlkaXNwYy5iYXNlID0gaW9fcDJ2KERJU1BDX0JBU0UpOworCWRpc3BjLmZiZGV2ID0gZmJkZXY7CisJZGlzcGMuZXh0X21vZGUgPSBleHRfbW9kZTsKKworCWluaXRfY29tcGxldGlvbigmZGlzcGMuZnJhbWVfZG9uZSk7CisKKwlpZiAoKHIgPSBnZXRfZHNzX2Nsb2NrcygpKSA8IDApCisJCXJldHVybiByOworCisJZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoMSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9CT09UTE9BREVSX0lOSVQKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJLyogTENEIGVuYWJsZWQgPyAqLworCWlmIChsICYgMSkgeworCQlwcl9pbmZvKCJvbWFwZmI6IHNraXBwaW5nIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uXG4iKTsKKwkJc2tpcF9pbml0ID0gMTsKKwl9CisjZW5kaWYKKworCWlmICghc2tpcF9pbml0KSB7CisJCS8qIFJlc2V0IG1vbml0b3Jpbmcgd29ya3Mgb25seSB3LyB0aGUgNTRNIGNsayAqLworCQllbmFibGVfZGlnaXRfY2xvY2tzKDEpOworCisJCS8qIFNvZnQgcmVzZXQgKi8KKwkJTU9EX1JFR19GTEQoRElTUENfU1lTQ09ORklHLCAxIDw8IDEsIDEgPDwgMSk7CisKKwkJd2hpbGUgKCEoZGlzcGNfcmVhZF9yZWcoRElTUENfU1lTU1RBVFVTKSAmIDEpKSB7CisJCQlpZiAoIS0tdG1vKSB7CisJCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAic29mdCByZXNldCBmYWlsZWRcbiIpOworCQkJCXIgPSAtRU5PREVWOworCQkJCWVuYWJsZV9kaWdpdF9jbG9ja3MoMCk7CisJCQkJZ290byBmYWlsMTsKKwkJCX0KKwkJfQorCisJCWVuYWJsZV9kaWdpdF9jbG9ja3MoMCk7CisJfQorCisJLyogRW5hYmxlIHNtYXJ0IGlkbGUgYW5kIGF1dG9pZGxlICovCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCWwgJj0gfigoMyA8PCAxMikgfCAoMyA8PCAzKSk7CisJbCB8PSAoMiA8PCAxMikgfCAoMiA8PCAzKSB8ICgxIDw8IDApOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19TWVNDT05GSUcsIGwpOworCW9tYXBfd3JpdGVsKDEgPDwgMCwgRFNTX0JBU0UgKyBEU1NfU1lTQ09ORklHKTsKKworCS8qIFNldCBmdW5jdGlvbmFsIGNsb2NrIGF1dG9nYXRpbmcgKi8KKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09ORklHKTsKKwlsIHw9IDEgPDwgOTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfQ09ORklHLCBsKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19JUlFTVEFUVVMpOworCWRpc3BjX3dyaXRlX3JlZyhsLCBESVNQQ19JUlFTVEFUVVMpOworCisJLyogRW5hYmxlIHRob3NlIHRoYXQgd2UgaGFuZGxlIGFsd2F5cyAqLworCW9tYXBfZGlzcGNfZW5hYmxlX2lycXMoRElTUENfSVJRX0ZSQU1FTUFTSyk7CisKKwlpZiAoKHIgPSByZXF1ZXN0X2lycShJTlRfMjRYWF9EU1NfSVJRLCBvbWFwX2Rpc3BjX2lycV9oYW5kbGVyLAorCQkJICAgMCwgTU9EVUxFX05BTUUsIGZiZGV2KSkgPCAwKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBEU1MgSVJRXG4iKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwkvKiBMMyBmaXJld2FsbCBzZXR0aW5nOiBlbmFibGUgYWNjZXNzIHRvIE9DTSBSQU0gKi8KKwlfX3Jhd193cml0ZWwoMHg0MDIwMDBiMCwgaW9fcDJ2KDB4NjgwMDUwYTApKTsKKworCWlmICgociA9IGFsbG9jX3BhbGV0dGVfcmFtKCkpIDwgMCkKKwkJZ290byBmYWlsMjsKKworCWlmICgociA9IHNldHVwX2ZibWVtKHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGZhaWwzOworCisJaWYgKCFza2lwX2luaXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQkJbWVtc2V0KGRpc3BjLm1lbV9kZXNjLnJlZ2lvbltpXS52YWRkciwgMCwKKwkJCQlkaXNwYy5tZW1fZGVzYy5yZWdpb25baV0uc2l6ZSk7CisJCX0KKworCQkvKiBTZXQgbG9naWMgY2xvY2sgdG8gZmNrLCBwaXhlbCBjbG9jayB0byBmY2svMiBmb3Igbm93ICovCisJCU1PRF9SRUdfRkxEKERJU1BDX0RJVklTT1IsIEZMRF9NQVNLKDE2LCA4KSwgMSA8PCAxNik7CisJCU1PRF9SRUdfRkxEKERJU1BDX0RJVklTT1IsIEZMRF9NQVNLKDAsIDgpLCAyIDw8IDApOworCisJCXNldHVwX3BsYW5lX2ZpZm8oMCwgZXh0X21vZGUpOworCQlzZXR1cF9wbGFuZV9maWZvKDEsIGV4dF9tb2RlKTsKKwkJc2V0dXBfcGxhbmVfZmlmbygyLCBleHRfbW9kZSk7CisKKwkJc2V0dXBfY29sb3JfY29udl9jb2VmKCk7CisKKwkJc2V0X2xjZF90ZnRfbW9kZShwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1BBTkVMX1RGVCk7CisJCXNldF9sb2FkX21vZGUoRElTUENfTE9BRF9GUkFNRV9PTkxZKTsKKworCQlpZiAoIWV4dF9tb2RlKSB7CisJCQlzZXRfbGNkX2RhdGFfbGluZXMocGFuZWwtPmRhdGFfbGluZXMpOworCQkJb21hcF9kaXNwY19zZXRfbGNkX3NpemUocGFuZWwtPnhfcmVzLCBwYW5lbC0+eV9yZXMpOworCQkJc2V0X2xjZF90aW1pbmdzKCk7CisJCX0gZWxzZQorCQkJc2V0X2xjZF9kYXRhX2xpbmVzKHBhbmVsLT5icHApOworCQllbmFibGVfcmZiaV9tb2RlKGV4dF9tb2RlKTsKKwl9CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfUkVWSVNJT04pOworCXByX2luZm8oIm9tYXBmYjogRElTUEMgdmVyc2lvbiAlZC4lZCBpbml0aWFsaXplZFxuIiwKKwkJIGwgPj4gNCAmIDB4MGYsIGwgJiAweDBmKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworZmFpbDM6CisJZnJlZV9wYWxldHRlX3JhbSgpOworZmFpbDI6CisJZnJlZV9pcnEoSU5UXzI0WFhfRFNTX0lSUSwgZmJkZXYpOworZmFpbDE6CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoMCk7CisJcHV0X2Rzc19jbG9ja3MoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rpc3BjX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCW9tYXBfZGlzcGNfc2V0X3VwZGF0ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCS8qIFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgY2xvY2tzIHRoYXQgYXJlIG9uICovCisJZm9yIChpID0gMDsgaSA8IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykKKwkJb21hcF9kaXNwY19lbmFibGVfcGxhbmUoaSwgMCk7CisJY2xlYW51cF9mYm1lbSgpOworCWZyZWVfcGFsZXR0ZV9yYW0oKTsKKwlmcmVlX2lycShJTlRfMjRYWF9EU1NfSVJRLCBkaXNwYy5mYmRldik7CisJZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoMCk7CisJcHV0X2Rzc19jbG9ja3MoKTsKK30KKworY29uc3Qgc3RydWN0IGxjZF9jdHJsIG9tYXAyX2ludF9jdHJsID0geworCS5uYW1lCQkJPSAiaW50ZXJuYWwiLAorCS5pbml0CQkJPSBvbWFwX2Rpc3BjX2luaXQsCisJLmNsZWFudXAJCT0gb21hcF9kaXNwY19jbGVhbnVwLAorCS5nZXRfY2FwcwkJPSBvbWFwX2Rpc3BjX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBvbWFwX2Rpc3BjX3NldF91cGRhdGVfbW9kZSwKKwkuZ2V0X3VwZGF0ZV9tb2RlCT0gb21hcF9kaXNwY19nZXRfdXBkYXRlX21vZGUsCisJLnVwZGF0ZV93aW5kb3cJCT0gb21hcF9kaXNwY191cGRhdGVfd2luZG93LAorCS5zdXNwZW5kCQk9IG9tYXBfZGlzcGNfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBvbWFwX2Rpc3BjX3Jlc3VtZSwKKwkuc2V0dXBfcGxhbmUJCT0gb21hcF9kaXNwY19zZXR1cF9wbGFuZSwKKwkuc2V0dXBfbWVtCQk9IG9tYXBfZGlzcGNfc2V0dXBfbWVtLAorCS5zZXRfc2NhbGUJCT0gb21hcF9kaXNwY19zZXRfc2NhbGUsCisJLmVuYWJsZV9wbGFuZQkJPSBvbWFwX2Rpc3BjX2VuYWJsZV9wbGFuZSwKKwkuc2V0X2NvbG9yX2tleQkJPSBvbWFwX2Rpc3BjX3NldF9jb2xvcl9rZXksCisJLmdldF9jb2xvcl9rZXkJCT0gb21hcF9kaXNwY19nZXRfY29sb3Jfa2V5LAorCS5tbWFwCQkJPSBvbWFwX2Rpc3BjX21tYXBfdXNlciwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaCBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTUxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIF9ESVNQQ19ICisjZGVmaW5lIF9ESVNQQ19ICisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2RlZmluZSBESVNQQ19QTEFORV9HRlgJCQkwCisjZGVmaW5lIERJU1BDX1BMQU5FX1ZJRDEJCTEKKyNkZWZpbmUgRElTUENfUExBTkVfVklEMgkJMgorCisjZGVmaW5lIERJU1BDX1JHQl8xX0JQUAkJCTB4MDAKKyNkZWZpbmUgRElTUENfUkdCXzJfQlBQCQkJMHgwMQorI2RlZmluZSBESVNQQ19SR0JfNF9CUFAJCQkweDAyCisjZGVmaW5lIERJU1BDX1JHQl84X0JQUAkJCTB4MDMKKyNkZWZpbmUgRElTUENfUkdCXzEyX0JQUAkJMHgwNAorI2RlZmluZSBESVNQQ19SR0JfMTZfQlBQCQkweDA2CisjZGVmaW5lIERJU1BDX1JHQl8yNF9CUFAJCTB4MDgKKyNkZWZpbmUgRElTUENfUkdCXzI0X0JQUF9VTlBBQ0tfMzIJMHgwOQorI2RlZmluZSBESVNQQ19ZVVYyXzQyMgkJCTB4MGEKKyNkZWZpbmUgRElTUENfVVlWWV80MjIJCQkweDBiCisKKyNkZWZpbmUgRElTUENfQlVSU1RfNHgzMgkJMAorI2RlZmluZSBESVNQQ19CVVJTVF84eDMyCQkxCisjZGVmaW5lIERJU1BDX0JVUlNUXzE2eDMyCQkyCisKKyNkZWZpbmUgRElTUENfTE9BRF9DTFVUX0FORF9GUkFNRQkweDAwCisjZGVmaW5lIERJU1BDX0xPQURfQ0xVVF9PTkxZCQkweDAxCisjZGVmaW5lIERJU1BDX0xPQURfRlJBTUVfT05MWQkJMHgwMgorI2RlZmluZSBESVNQQ19MT0FEX0NMVVRfT05DRV9GUkFNRQkweDAzCisKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMTIJCTAKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMTYJCTEKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMTgJCTIKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMjQJCTMKKworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19zZXRfbGNkX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19lbmFibGVfbGNkX291dChpbnQgZW5hYmxlKTsKK2V4dGVybiB2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2RpZ2l0X291dChpbnQgZW5hYmxlKTsKKworZXh0ZXJuIGludCAgb21hcF9kaXNwY19yZXF1ZXN0X2lycSh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIG9tYXBfZGlzcGNfZnJlZV9pcnEodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2h3YTc0Mi5jIGIvZHJpdmVycy92aWRlby9vbWFwL2h3YTc0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDhlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvaHdhNzQyLmMKQEAgLTAsMCArMSwxMDc3IEBACisvKgorICogRXBzb24gSFdBNzQyIExDRCBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3JzOiAgICAgSnVoYSBZcmrDtmzDpCAgIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgkgICAgICAgIEltcmUgRGVhayAgICAgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKiBZVVYgc3VwcG9ydDogSnVzc2kgTGFha28gICA8anVzc2kubGFha29Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9od2E3NDIuaD4KKworI2RlZmluZSBIV0E3NDJfUkVWX0NPREVfUkVHICAgICAgIDB4MAorI2RlZmluZSBIV0E3NDJfQ09ORklHX1JFRyAgICAgICAgIDB4MgorI2RlZmluZSBIV0E3NDJfUExMX0RJVl9SRUcgICAgICAgIDB4NAorI2RlZmluZSBIV0E3NDJfUExMXzBfUkVHICAgICAgICAgIDB4NgorI2RlZmluZSBIV0E3NDJfUExMXzFfUkVHICAgICAgICAgIDB4OAorI2RlZmluZSBIV0E3NDJfUExMXzJfUkVHICAgICAgICAgIDB4YQorI2RlZmluZSBIV0E3NDJfUExMXzNfUkVHICAgICAgICAgIDB4YworI2RlZmluZSBIV0E3NDJfUExMXzRfUkVHICAgICAgICAgIDB4ZQorI2RlZmluZSBIV0E3NDJfQ0xLX1NSQ19SRUcgICAgICAgIDB4MTIKKyNkZWZpbmUgSFdBNzQyX1BBTkVMX1RZUEVfUkVHICAgICAweDE0CisjZGVmaW5lIEhXQTc0Ml9IX0RJU1BfUkVHICAgICAgICAgMHgxNgorI2RlZmluZSBIV0E3NDJfSF9ORFBfUkVHICAgICAgICAgIDB4MTgKKyNkZWZpbmUgSFdBNzQyX1ZfRElTUF8xX1JFRyAgICAgICAweDFhCisjZGVmaW5lIEhXQTc0Ml9WX0RJU1BfMl9SRUcgICAgICAgMHgxYworI2RlZmluZSBIV0E3NDJfVl9ORFBfUkVHICAgICAgICAgIDB4MWUKKyNkZWZpbmUgSFdBNzQyX0hTX1dfUkVHICAgICAgICAgICAweDIwCisjZGVmaW5lIEhXQTc0Ml9IUF9TX1JFRyAgICAgICAgICAgMHgyMgorI2RlZmluZSBIV0E3NDJfVlNfV19SRUcgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgSFdBNzQyX1ZQX1NfUkVHICAgICAgICAgICAweDI2CisjZGVmaW5lIEhXQTc0Ml9QQ0xLX1BPTF9SRUcgICAgICAgMHgyOAorI2RlZmluZSBIV0E3NDJfSU5QVVRfTU9ERV9SRUcgICAgIDB4MmEKKyNkZWZpbmUgSFdBNzQyX1RSQU5TTF9NT0RFX1JFRzEgICAweDJlCisjZGVmaW5lIEhXQTc0Ml9ESVNQX01PREVfUkVHICAgICAgMHgzNAorI2RlZmluZSBIV0E3NDJfV0lORE9XX1RZUEUgICAgICAgIDB4MzYKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19YX1NUQVJUXzAgICAweDM4CisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWF9TVEFSVF8xICAgMHgzYQorI2RlZmluZSBIV0E3NDJfV0lORE9XX1lfU1RBUlRfMCAgIDB4M2MKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19ZX1NUQVJUXzEgICAweDNlCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWF9FTkRfMCAgICAgMHg0MAorI2RlZmluZSBIV0E3NDJfV0lORE9XX1hfRU5EXzEgICAgIDB4NDIKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19ZX0VORF8wICAgICAweDQ0CisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWV9FTkRfMSAgICAgMHg0NgorI2RlZmluZSBIV0E3NDJfTUVNT1JZX1dSSVRFX0xTQiAgIDB4NDgKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9XUklURV9NU0IgICAweDQ5CisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfUkVBRF8wICAgICAgMHg0YQorI2RlZmluZSBIV0E3NDJfTUVNT1JZX1JFQURfMSAgICAgIDB4NGMKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9SRUFEXzIgICAgICAweDRlCisjZGVmaW5lIEhXQTc0Ml9QT1dFUl9TQVZFICAgICAgICAgMHg1NgorI2RlZmluZSBIV0E3NDJfTkRQX0NUUkwgICAgICAgICAgIDB4NTgKKworI2RlZmluZSBIV0E3NDJfQVVUT19VUERBVEVfVElNRQkJKEhaIC8gMjApCisKKy8qIFJlc2VydmUgNCByZXF1ZXN0IHNsb3RzIGZvciByZXF1ZXN0cyBpbiBpcnEgY29udGV4dCAqLworI2RlZmluZSBSRVFfUE9PTF9TSVpFCQkJMjQKKyNkZWZpbmUgSVJRX1JFUV9QT09MX1NJWkUJCTQKKworI2RlZmluZSBSRVFfRlJPTV9JUlFfUE9PTCAweDAxCisKKyNkZWZpbmUgUkVRX0NPTVBMRVRFCTAKKyNkZWZpbmUgUkVRX1BFTkRJTkcJMQorCitzdHJ1Y3QgdXBkYXRlX3BhcmFtIHsKKwlpbnQJeCwgeSwgd2lkdGgsIGhlaWdodDsKKwlpbnQJY29sb3JfbW9kZTsKKwlpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdW5zaWduZWQgaW50CSBmbGFnczsKKworCWludAkJICgqaGFuZGxlcikoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXEpOworCXZvaWQJCSAoKmNvbXBsZXRlKSh2b2lkICpkYXRhKTsKKwl2b2lkCQkgKmNvbXBsZXRlX2RhdGE7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB1cGRhdGVfcGFyYW0JdXBkYXRlOworCQlzdHJ1Y3QgY29tcGxldGlvbgkqc3luYzsKKwl9IHBhcjsKK307CisKK3N0cnVjdCB7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGU7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAlhdXRvX3VwZGF0ZV90aW1lcjsKKwlpbnQJCQlzdG9wX2F1dG9fdXBkYXRlOworCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdwlhdXRvX3VwZGF0ZV93aW5kb3c7CisJdW5zaWduZWQJCXRlX2Nvbm5lY3RlZDoxOworCXVuc2lnbmVkCQl2c3luY19vbmx5OjE7CisKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QJcmVxX3Bvb2xbUkVRX1BPT0xfU0laRV07CisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nX3JlcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9yZXFfbGlzdDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXJlcV9zZW1hOworCXNwaW5sb2NrX3QJCXJlcV9sb2NrOworCisJc3RydWN0IGV4dGlmX3RpbWluZ3MJcmVnX3RpbWluZ3MsIGx1dF90aW1pbmdzOworCisJaW50CQkJcHJldl9jb2xvcl9tb2RlOworCWludAkJCXByZXZfZmxhZ3M7CisJaW50CQkJd2luZG93X3R5cGU7CisKKwl1MzIJCQltYXhfdHJhbnNtaXRfc2l6ZTsKKwl1MzIJCQlleHRpZl9jbGtfcGVyaW9kOworCXVuc2lnbmVkIGxvbmcJCXBpeF90eF90aW1lOworCXVuc2lnbmVkIGxvbmcJCWxpbmVfdXBkX3RpbWU7CisKKworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKKwlzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYJKmV4dGlmOworCXN0cnVjdCBsY2RfY3RybAkJKmludF9jdHJsOworCisJdm9pZAkJCSgqcG93ZXJfdXApKHN0cnVjdCBkZXZpY2UgKmRldik7CisJdm9pZAkJCSgqcG93ZXJfZG93bikoc3RydWN0IGRldmljZSAqZGV2KTsKK30gaHdhNzQyOworCitzdHJ1Y3QgbGNkX2N0cmwgaHdhNzQyX2N0cmw7CisKK3N0YXRpYyB1OCBod2E3NDJfcmVhZF9yZWcodTggcmVnKQoreworCXU4IGRhdGE7CisKKwlod2E3NDIuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSg4KTsKKwlod2E3NDIuZXh0aWYtPndyaXRlX2NvbW1hbmQoJnJlZywgMSk7CisJaHdhNzQyLmV4dGlmLT5yZWFkX2RhdGEoJmRhdGEsIDEpOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml93cml0ZV9yZWcodTggcmVnLCB1OCBkYXRhKQoreworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWh3YTc0Mi5leHRpZi0+d3JpdGVfY29tbWFuZCgmcmVnLCAxKTsKKwlod2E3NDIuZXh0aWYtPndyaXRlX2RhdGEoJmRhdGEsIDEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfd2luZG93X3JlZ3MoaW50IHhfc3RhcnQsIGludCB5X3N0YXJ0LCBpbnQgeF9lbmQsIGludCB5X2VuZCkKK3sKKwl1OCB0bXBbOF07CisJdTggY21kOworCisJeF9lbmQtLTsKKwl5X2VuZC0tOworCXRtcFswXSA9IHhfc3RhcnQ7CisJdG1wWzFdID0geF9zdGFydCA+PiA4OworCXRtcFsyXSA9IHlfc3RhcnQ7CisJdG1wWzNdID0geV9zdGFydCA+PiA4OworCXRtcFs0XSA9IHhfZW5kOworCXRtcFs1XSA9IHhfZW5kID4+IDg7CisJdG1wWzZdID0geV9lbmQ7CisJdG1wWzddID0geV9lbmQgPj4gODsKKworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWNtZCA9IEhXQTc0Ml9XSU5ET1dfWF9TVEFSVF8wOworCisJaHdhNzQyLmV4dGlmLT53cml0ZV9jb21tYW5kKCZjbWQsIDEpOworCisJaHdhNzQyLmV4dGlmLT53cml0ZV9kYXRhKHRtcCwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mb3JtYXRfcmVncyhpbnQgY29udiwgaW50IHRyYW5zbCwgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19ET1VCTEUpIHsKKwkJaHdhNzQyLndpbmRvd190eXBlID0gKChod2E3NDIud2luZG93X3R5cGUgJiAweGZjKSB8IDB4MDEpOworI2lmZGVmIFZFUkJPU0UKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgImh3YTc0MjogZW5hYmxlZCBwaXhlbCBkb3VibGluZ1xuIik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlod2E3NDIud2luZG93X3R5cGUgPSAoaHdhNzQyLndpbmRvd190eXBlICYgMHhmYyk7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaHdhNzQyOiBkaXNhYmxlZCBwaXhlbCBkb3VibGluZ1xuIik7CisjZW5kaWYKKwl9CisKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9JTlBVVF9NT0RFX1JFRywgY29udik7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfVFJBTlNMX01PREVfUkVHMSwgdHJhbnNsKTsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9XSU5ET1dfVFlQRSwgaHdhNzQyLndpbmRvd190eXBlKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3RlYXJzeW5jKGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzY3JlZW5faGVpZ2h0LAorCQkJICAgIGludCBmb3JjZV92c3luYykKK3sKKwl1OCBiOworCisJYiA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfTkRQX0NUUkwpOworCWIgfD0gMSA8PCAyOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX05EUF9DVFJMLCBiKTsKKworCWlmIChsaWtlbHkoaHdhNzQyLnZzeW5jX29ubHkgfHwgZm9yY2VfdnN5bmMpKSB7CisJCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHdpZHRoICogaHdhNzQyLnBpeF90eF90aW1lIDwgaHdhNzQyLmxpbmVfdXBkX3RpbWUpIHsKKwkJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHdpZHRoICogaHdhNzQyLnBpeF90eF90aW1lIC8gMTAwMCkgKiBoZWlnaHQgPAorCSAgICAoeSArIGhlaWdodCkgKiAoaHdhNzQyLmxpbmVfdXBkX3RpbWUgLyAxMDAwKSkgeworCQlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIHkgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV90ZWFyc3luYyh2b2lkKQoreworCXU4IGI7CisKKwlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygwLCAwKTsKKworCWIgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX05EUF9DVFJMKTsKKwliICY9IH4oMSA8PCAyKTsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9ORFBfQ1RSTCwgYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICphbGxvY19yZXEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxOworCWludCByZXFfZmxhZ3MgPSAwOworCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJZG93bigmaHdhNzQyLnJlcV9zZW1hKTsKKwllbHNlCisJCXJlcV9mbGFncyA9IFJFUV9GUk9NX0lSUV9QT09MOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCUJVR19PTihsaXN0X2VtcHR5KCZod2E3NDIuZnJlZV9yZXFfbGlzdCkpOworCXJlcSA9IGxpc3RfZW50cnkoaHdhNzQyLmZyZWVfcmVxX2xpc3QubmV4dCwKKwkJCSBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5lbnRyeSk7CisJcmVxLT5mbGFncyA9IHJlcV9mbGFnczsKKworCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3JlcShzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJbGlzdF9kZWwoJnJlcS0+ZW50cnkpOworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmaHdhNzQyLmZyZWVfcmVxX2xpc3QpOworCWlmICghKHJlcS0+ZmxhZ3MgJiBSRVFfRlJPTV9JUlFfUE9PTCkpCisJCXVwKCZod2E3NDIucmVxX3NlbWEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0KSkgeworCQlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcTsKKwkJdm9pZCAoKmNvbXBsZXRlKSh2b2lkICopOworCQl2b2lkICpjb21wbGV0ZV9kYXRhOworCisJCXJlcSA9IGxpc3RfZW50cnkoaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QubmV4dCwKKwkJCQkgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0LCBlbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJCWlmIChyZXEtPmhhbmRsZXIocmVxKSA9PSBSRVFfUEVORElORykKKwkJCXJldHVybjsKKworCQljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJCWNvbXBsZXRlX2RhdGEgPSByZXEtPmNvbXBsZXRlX2RhdGE7CisJCWZyZWVfcmVxKHJlcSk7CisKKwkJaWYgKGNvbXBsZXRlKQorCQkJY29tcGxldGUoY29tcGxldGVfZGF0YSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfcmVxX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcm9jZXNzID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZod2E3NDIucGVuZGluZ19yZXFfbGlzdCkpKQorCQlwcm9jZXNzID0gMDsKKwlsaXN0X3NwbGljZV9pbml0KGhlYWQsIGh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0LnByZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJaWYgKHByb2Nlc3MpCisJCXByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cygpOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0CSpyZXEgPSAoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICopZGF0YTsKKwl2b2lkCQkJKCpjb21wbGV0ZSkodm9pZCAqKTsKKwl2b2lkCQkJKmNvbXBsZXRlX2RhdGE7CisKKwljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKworCWZyZWVfcmVxKHJlcSk7CisKKwlpZiAoY29tcGxldGUpCisJCWNvbXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB1cGRhdGVfcGFyYW0gKnBhciA9ICZyZXEtPnBhci51cGRhdGU7CisJaW50IHggPSBwYXItPng7CisJaW50IHkgPSBwYXItPnk7CisJaW50IHcgPSBwYXItPndpZHRoOworCWludCBoID0gcGFyLT5oZWlnaHQ7CisJaW50IGJwcDsKKwlpbnQgY29udiwgdHJhbnNsOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBjb2xvcl9tb2RlID0gcGFyLT5jb2xvcl9tb2RlOworCWludCBmbGFncyA9IHBhci0+ZmxhZ3M7CisJaW50IHNjcl93aWR0aCA9IGh3YTc0Mi5mYmRldi0+cGFuZWwtPnhfcmVzOworCWludCBzY3JfaGVpZ2h0ID0gaHdhNzQyLmZiZGV2LT5wYW5lbC0+eV9yZXM7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgInggJWQgeSAlZCB3ICVkIGggJWQgc2NyX3dpZHRoICVkICIKKwkJImNvbG9yX21vZGUgJWQgZmxhZ3MgJWRcbiIsCisJCXgsIHksIHcsIGgsIHNjcl93aWR0aCwgY29sb3JfbW9kZSwgZmxhZ3MpOworI2VuZGlmCisKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJCWJwcCA9IDE2OworCQljb252ID0gMHgwODsKKwkJdHJhbnNsID0gMHgyNTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQlicHAgPSAxMjsKKwkJY29udiA9IDB4MDk7CisJCXRyYW5zbCA9IDB4MjU7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJYnBwID0gMTY7CisJCWNvbnYgPSAweDAxOworCQl0cmFuc2wgPSAweDA1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaHdhNzQyLnByZXZfZmxhZ3MgIT0gZmxhZ3MgfHwKKwkgICAgaHdhNzQyLnByZXZfY29sb3JfbW9kZSAhPSBjb2xvcl9tb2RlKSB7CisJCXNldF9mb3JtYXRfcmVncyhjb252LCB0cmFuc2wsIGZsYWdzKTsKKwkJaHdhNzQyLnByZXZfY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisJCWh3YTc0Mi5wcmV2X2ZsYWdzID0gZmxhZ3M7CisJfQorCWZsYWdzID0gcmVxLT5wYXIudXBkYXRlLmZsYWdzOworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykKKwkJZW5hYmxlX3RlYXJzeW5jKHksIHNjcl93aWR0aCwgaCwgc2NyX2hlaWdodCwKKwkJCQlmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQyk7CisJZWxzZQorCQlkaXNhYmxlX3RlYXJzeW5jKCk7CisKKwlzZXRfd2luZG93X3JlZ3MoeCwgeSwgeCArIHcsIHkgKyBoKTsKKworCW9mZnNldCA9IChzY3Jfd2lkdGggKiB5ICsgeCkgKiBicHAgLyA4OworCisJaHdhNzQyLmludF9jdHJsLT5zZXR1cF9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLAorCQkJT01BUEZCX0NIQU5ORUxfT1VUX0xDRCwgb2Zmc2V0LCBzY3Jfd2lkdGgsIDAsIDAsIHcsIGgsCisJCQljb2xvcl9tb2RlKTsKKworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDE2KTsKKworCWh3YTc0Mi5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKE9NQVBGQl9QTEFORV9HRlgsIDEpOworCWh3YTc0Mi5leHRpZi0+dHJhbnNmZXJfYXJlYSh3LCBoLCByZXF1ZXN0X2NvbXBsZXRlLCByZXEpOworCisJcmV0dXJuIFJFUV9QRU5ESU5HOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2ZyYW1lX2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJaHdhNzQyLmludF9jdHJsLT5lbmFibGVfcGxhbmUoT01BUEZCX1BMQU5FX0dGWCwgMCk7Cit9CisKKyNkZWZpbmUgQUREX1BSRVEoX3gsIF95LCBfdywgX2gpIGRvIHsJCVwKKwlyZXEgPSBhbGxvY19yZXEoKTsJCQlcCisJcmVxLT5oYW5kbGVyCT0gc2VuZF9mcmFtZV9oYW5kbGVyOwlcCisJcmVxLT5jb21wbGV0ZQk9IHNlbmRfZnJhbWVfY29tcGxldGU7CVwKKwlyZXEtPnBhci51cGRhdGUueCA9IF94OwkJCVwKKwlyZXEtPnBhci51cGRhdGUueSA9IF95OwkJCVwKKwlyZXEtPnBhci51cGRhdGUud2lkdGggID0gX3c7CQlcCisJcmVxLT5wYXIudXBkYXRlLmhlaWdodCA9IF9oOwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5jb2xvcl9tb2RlID0gY29sb3JfbW9kZTtcCisJcmVxLT5wYXIudXBkYXRlLmZsYWdzCSAgPSBmbGFnczsJXAorCWxpc3RfYWRkX3RhaWwoJnJlcS0+ZW50cnksIHJlcV9oZWFkKTsJXAorfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcmVxX2xpc3Qoc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqcmVxX2hlYWQpCit7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXE7CisJaW50IHggPSB3aW4tPng7CisJaW50IHkgPSB3aW4tPnk7CisJaW50IHdpZHRoID0gd2luLT53aWR0aDsKKwlpbnQgaGVpZ2h0ID0gd2luLT5oZWlnaHQ7CisJaW50IGNvbG9yX21vZGU7CisJaW50IGZsYWdzOworCisJZmxhZ3MgPSB3aW4tPmZvcm1hdCAmIH5PTUFQRkJfRk9STUFUX01BU0s7CisJY29sb3JfbW9kZSA9IHdpbi0+Zm9ybWF0ICYgT01BUEZCX0ZPUk1BVF9NQVNLOworCisJaWYgKHggJiAxKSB7CisJCUFERF9QUkVRKHgsIHksIDEsIGhlaWdodCk7CisJCXdpZHRoLS07CisJCXgrKzsKKwkJZmxhZ3MgJj0gfk9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQzsKKwl9CisJaWYgKHdpZHRoICYgfjEpIHsKKwkJdW5zaWduZWQgaW50IHhzcGFuID0gd2lkdGggJiB+MTsKKwkJdW5zaWduZWQgaW50IHlzdGFydCA9IHk7CisJCXVuc2lnbmVkIGludCB5c3BhbiA9IGhlaWdodDsKKworCQlpZiAoeHNwYW4gKiBoZWlnaHQgKiAyID4gaHdhNzQyLm1heF90cmFuc21pdF9zaXplKSB7CisJCQl5c3BhbiA9IGh3YTc0Mi5tYXhfdHJhbnNtaXRfc2l6ZSAvICh4c3BhbiAqIDIpOworCQkJQUREX1BSRVEoeCwgeXN0YXJ0LCB4c3BhbiwgeXNwYW4pOworCQkJeXN0YXJ0ICs9IHlzcGFuOworCQkJeXNwYW4gPSBoZWlnaHQgLSB5c3BhbjsKKwkJCWZsYWdzICY9IH5PTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkM7CisJCX0KKworCQlBRERfUFJFUSh4LCB5c3RhcnQsIHhzcGFuLCB5c3Bhbik7CisJCXggKz0geHNwYW47CisJCXdpZHRoIC09IHhzcGFuOworCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DOworCX0KKwlpZiAod2lkdGgpCisJCUFERF9QUkVRKHgsIHksIDEsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGF1dG9fdXBkYXRlX2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJaWYgKCFod2E3NDIuc3RvcF9hdXRvX3VwZGF0ZSkKKwkJbW9kX3RpbWVyKCZod2E3NDIuYXV0b191cGRhdGVfdGltZXIsCisJCQkgIGppZmZpZXMgKyBIV0E3NDJfQVVUT19VUERBVEVfVElNRSk7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml91cGRhdGVfd2luZG93X2F1dG8odW5zaWduZWQgbG9uZyBhcmcpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKmxhc3Q7CisKKwljcmVhdGVfcmVxX2xpc3QoJmh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3csICZyZXFfbGlzdCk7CisJbGFzdCA9IGxpc3RfZW50cnkocmVxX2xpc3QucHJldiwgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0LCBlbnRyeSk7CisKKwlsYXN0LT5jb21wbGV0ZSA9IGF1dG9fdXBkYXRlX2NvbXBsZXRlOworCWxhc3QtPmNvbXBsZXRlX2RhdGEgPSBOVUxMOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7Cit9CisKK2ludCBod2E3NDJfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCSBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQkgdm9pZCAoKmNvbXBsZXRlX2NhbGxiYWNrKSh2b2lkICphcmcpLAorCQkJCSB2b2lkICpjb21wbGV0ZV9jYWxsYmFja19kYXRhKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpsYXN0OworCWludCByID0gMDsKKworCWlmIChod2E3NDIudXBkYXRlX21vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgImludmFsaWQgdXBkYXRlIG1vZGVcbiIpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmICh1bmxpa2VseSh3aW4tPmZvcm1hdCAmCisJICAgIH4oMHgwMyB8IE9NQVBGQl9GT1JNQVRfRkxBR19ET1VCTEUgfAorCSAgICBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMgfCBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpKSkgeworCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaW52YWxpZCB3aW5kb3cgZmxhZyIpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJY3JlYXRlX3JlcV9saXN0KHdpbiwgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gY29tcGxldGVfY2FsbGJhY2s7CisJbGFzdC0+Y29tcGxldGVfZGF0YSA9ICh2b2lkICopY29tcGxldGVfY2FsbGJhY2tfZGF0YTsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCitvdXQ6CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGh3YTc0Ml91cGRhdGVfd2luZG93X2FzeW5jKTsKKworc3RhdGljIGludCBod2E3NDJfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJICBpbnQgY29sb3JfbW9kZSkKK3sKKwlpZiAocGxhbmUgIT0gT01BUEZCX1BMQU5FX0dGWCB8fAorCSAgICBjaGFubmVsX291dCAhPSBPTUFQRkJfQ0hBTk5FTF9PVVRfTENEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh3YTc0Ml9lbmFibGVfcGxhbmUoaW50IHBsYW5lLCBpbnQgZW5hYmxlKQoreworCWlmIChwbGFuZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3YTc0Mi5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKHBsYW5lLCBlbmFibGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3luY19oYW5kbGVyKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxKQoreworCWNvbXBsZXRlKHJlcS0+cGFyLnN5bmMpOworCXJldHVybiBSRVFfQ09NUExFVEU7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9zeW5jKHZvaWQpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworCisJcmVxID0gYWxsb2NfcmVxKCk7CisKKwlyZXEtPmhhbmRsZXIgPSBzeW5jX2hhbmRsZXI7CisJcmVxLT5jb21wbGV0ZSA9IE5VTEw7CisJaW5pdF9jb21wbGV0aW9uKCZjb21wKTsKKwlyZXEtPnBhci5zeW5jID0gJmNvbXA7CisKKwlsaXN0X2FkZCgmcmVxLT5lbnRyeSwgJnJlcV9saXN0KTsKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXApOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfYmluZF9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqbmIpCit7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgInVwZGF0ZV9tb2RlICVkXG4iLCBod2E3NDIudXBkYXRlX21vZGUpOworCWlmIChod2E3NDIudXBkYXRlX21vZGUgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGh3YTc0Mi5mYmRldiwgT01BUEZCX0VWRU5UX1JFQURZKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHdhNzQyX3NldF91cGRhdGVfbW9kZShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWlmIChtb2RlICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFICYmIG1vZGUgIT0gT01BUEZCX0FVVE9fVVBEQVRFICYmCisJICAgIG1vZGUgIT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobW9kZSA9PSBod2E3NDIudXBkYXRlX21vZGUpCisJCXJldHVybiAwOworCisJZGV2X2luZm8oaHdhNzQyLmZiZGV2LT5kZXYsICJIV0E3NDI6IHNldHRpbmcgdXBkYXRlIG1vZGUgdG8gJXNcbiIsCisJCQltb2RlID09IE9NQVBGQl9VUERBVEVfRElTQUJMRUQgPyAiZGlzYWJsZWQiIDoKKwkJCShtb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSA/ICJhdXRvIiA6ICJtYW51YWwiKSk7CisKKwlzd2l0Y2ggKGh3YTc0Mi51cGRhdGVfbW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhod2E3NDIuZmJkZXYsIE9NQVBGQl9FVkVOVF9ESVNBQkxFRCk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlod2E3NDIuc3RvcF9hdXRvX3VwZGF0ZSA9IDE7CisJCWRlbF90aW1lcl9zeW5jKCZod2E3NDIuYXV0b191cGRhdGVfdGltZXIpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCWh3YTc0Mi51cGRhdGVfbW9kZSA9IG1vZGU7CisJaHdhNzQyX3N5bmMoKTsKKwlod2E3NDIuc3RvcF9hdXRvX3VwZGF0ZSA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgorCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoaHdhNzQyLmZiZGV2LCBPTUFQRkJfRVZFTlRfUkVBRFkpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXV0bygwKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIGh3YTc0Ml9nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gaHdhNzQyLnVwZGF0ZV9tb2RlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByb3VuZF90b19leHRpZl90aWNrcyh1bnNpZ25lZCBsb25nIHBzLCBpbnQgZGl2KQoreworCWludCBidXNfdGljayA9IGh3YTc0Mi5leHRpZl9jbGtfcGVyaW9kICogZGl2OworCXJldHVybiAocHMgKyBidXNfdGljayAtIDEpIC8gYnVzX3RpY2sgKiBidXNfdGljazsKK30KKworc3RhdGljIGludCBjYWxjX3JlZ190aW1pbmcodW5zaWduZWQgbG9uZyBzeXNjbGssIGludCBkaXYpCit7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQ7CisJdW5zaWduZWQgbG9uZyBzeXN0aW07CisKKwkvKiBDU09uVGltZSAwLCBXRU9uVGltZSAyIG5zLCBSRU9uVGltZSAyIG5zLAorCSAqIEFjY2Vzc1RpbWUgMiBucyArIDEyLjIgbnMgKHJlZ3MpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9mZlRpbWUgPSBSRU9uVGltZSArIDE2IG5zIChyZWdzKSwKKwkgKiBDU09mZlRpbWUgPSBSRU9mZlRpbWUgKyAxIG5zCisJICogUmVhZEN5Y2xlID0gMm5zICsgMipTWVNDTEsgIChyZWdzKSwKKwkgKiBXcml0ZUN5Y2xlID0gMipTWVNDTEsgKyAyIG5zLAorCSAqIENTUHVsc2VXaWR0aCA9IDEwIG5zICovCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAwKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiSFdBNzQyIHN5c3RpbSAlbHUgcHMgZXh0aWZfY2xrX3BlcmlvZCAldSBwcyIKKwkJICAiZXh0aWZfY2xrX2RpdiAlZFxuIiwgc3lzdGltLCBod2E3NDIuZXh0aWZfY2xrX3BlcmlvZCwgZGl2KTsKKworCXQgPSAmaHdhNzQyLnJlZ190aW1pbmdzOworCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKwl0LT5jbGtfZGl2ID0gZGl2OworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgMTIyMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxNjAwMCwgZGl2KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltyZWddY3NvbiAlZCBjc29mZiAlZCByZW9uICVkIHJlb2ZmICVkXG4iLAorCQkgdC0+Y3Nfb25fdGltZSwgdC0+Y3Nfb2ZmX3RpbWUsIHQtPnJlX29uX3RpbWUsIHQtPnJlX29mZl90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW3JlZ113ZW9uICVkIHdlb2ZmICVkIHJlY3ljICVkIHdlY3ljICVkXG4iLAorCQkgdC0+d2Vfb25fdGltZSwgdC0+d2Vfb2ZmX3RpbWUsIHQtPnJlX2N5Y2xlX3RpbWUsCisJCSB0LT53ZV9jeWNsZV90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW3JlZ11yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBod2E3NDIuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2x1dF90aW1pbmcodW5zaWduZWQgbG9uZyBzeXNjbGssIGludCBkaXYpCit7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQ7CisJdW5zaWduZWQgbG9uZyBzeXN0aW07CisKKwkvKiBDU09uVGltZSAwLCBXRU9uVGltZSAyIG5zLCBSRU9uVGltZSAyIG5zLAorCSAqIEFjY2Vzc1RpbWUgMiBucyArIDQgKiBTWVNDTEsgKyAyNiAobHV0KSwKKwkgKiBXRU9mZlRpbWUgPSBXRU9uVGltZSArIDEgbnMsCisJICogUkVPZmZUaW1lID0gUkVPblRpbWUgKyA0KlNZU0NMSyArIDI2IG5zIChsdXQpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSArIDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyA0KlNZU0NMSyArIDI2IG5zIChsdXQpLAorCSAqIFdyaXRlQ3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMKKwkgKi8KKwlzeXN0aW0gPSAxMDAwMDAwMDAwIC8gKHN5c2NsayAvIDEwMDApOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJIV0E3NDIgc3lzdGltICVsdSBwcyBleHRpZl9jbGtfcGVyaW9kICV1IHBzIgorCQkgICJleHRpZl9jbGtfZGl2ICVkXG4iLCBzeXN0aW0sIGh3YTc0Mi5leHRpZl9jbGtfcGVyaW9kLCBkaXYpOworCisJdCA9ICZod2E3NDIubHV0X3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPndlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+d2Vfb25fdGltZSArIDEwMDAsIGRpdik7CisJdC0+cmVfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIwMDAgKyA0ICogc3lzdGltICsgMjYwMDAsIGRpdik7CisJaWYgKHQtPnJlX2N5Y2xlX3RpbWUgPCB0LT5yZV9vZmZfdGltZSkKKwkJdC0+cmVfY3ljbGVfdGltZSA9IHQtPnJlX29mZl90aW1lOworCXQtPmNzX3B1bHNlX3dpZHRoID0gMDsKKworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbbHV0XWNzb24gJWQgY3NvZmYgJWQgcmVvbiAlZCByZW9mZiAlZFxuIiwKKwkJIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltsdXRdd2VvbiAlZCB3ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltsdXRdcmRhY2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkJIHQtPmFjY2Vzc190aW1lLCB0LT5jc19wdWxzZV93aWR0aCk7CisKKwlyZXR1cm4gaHdhNzQyLmV4dGlmLT5jb252ZXJ0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19leHRpZl90aW1pbmdzKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgKmV4dGlmX21lbV9kaXYpCit7CisJaW50IG1heF9jbGtfZGl2OworCWludCBkaXY7CisKKwlod2E3NDIuZXh0aWYtPmdldF9jbGtfaW5mbygmaHdhNzQyLmV4dGlmX2Nsa19wZXJpb2QsICZtYXhfY2xrX2Rpdik7CisJZm9yIChkaXYgPSAxOyBkaXYgPCBtYXhfY2xrX2RpdjsgZGl2KyspIHsKKwkJaWYgKGNhbGNfcmVnX3RpbWluZyhzeXNjbGssIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpCisJCWdvdG8gZXJyOworCisJKmV4dGlmX21lbV9kaXYgPSBkaXY7CisKKwlmb3IgKGRpdiA9IDE7IGRpdiA8IG1heF9jbGtfZGl2OyBkaXYrKykgeworCQlpZiAoY2FsY19sdXRfdGltaW5nKHN5c2NsaywgZGl2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGRpdiA+IG1heF9jbGtfZGl2KQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCitlcnI6CisJZGV2X2Vycihod2E3NDIuZmJkZXYtPmRldiwgImNhbid0IHNldHVwIHRpbWluZ3NcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2FsY19od2E3NDJfY2xrX3JhdGVzKHVuc2lnbmVkIGxvbmcgZXh0X2NsaywKKwkJCQl1bnNpZ25lZCBsb25nICpzeXNfY2xrLCB1bnNpZ25lZCBsb25nICpwaXhfY2xrKQoreworCWludCBwaXhfY2xrX3NyYzsKKwlpbnQgc3lzX2RpdiA9IDAsIHN5c19tdWwgPSAwOworCWludCBwaXhfZGl2OworCisJcGl4X2Nsa19zcmMgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0NMS19TUkNfUkVHKTsKKwlwaXhfZGl2ID0gKChwaXhfY2xrX3NyYyA+PiAzKSAmIDB4MWYpICsgMTsKKwlpZiAoKHBpeF9jbGtfc3JjICYgKDB4MyA8PCAxKSkgPT0gMCkgeworCQkvKiBTb3VyY2UgaXMgdGhlIFBMTCAqLworCQlzeXNfZGl2ID0gKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMX0RJVl9SRUcpICYgMHgzZikgKyAxOworCQlzeXNfbXVsID0gKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMXzRfUkVHKSAmIDB4N2YpICsgMTsKKwkJKnN5c19jbGsgPSBleHRfY2xrICogc3lzX211bCAvIHN5c19kaXY7CisJfSBlbHNlCS8qIGVsc2Ugc291cmNlIGlzIGV4dCBjbGssIG9yIG9zY2lsbGF0b3IgKi8KKwkJKnN5c19jbGsgPSBleHRfY2xrOworCisJKnBpeF9jbGsgPSAqc3lzX2NsayAvIHBpeF9kaXY7CQkJLyogSFogKi8KKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LAorCQkiZXh0X2NsayAlbGQgcGl4X3NyYyAlZCBwaXhfZGl2ICVkIHN5c19kaXYgJWQgc3lzX211bCAlZFxuIiwKKwkJZXh0X2NsaywgcGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpLCBwaXhfZGl2LCBzeXNfZGl2LCBzeXNfbXVsKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAic3lzX2NsayAlbGQgcGl4X2NsayAlbGRcbiIsCisJCSpzeXNfY2xrLCAqcGl4X2Nsayk7Cit9CisKKworc3RhdGljIGludCBzZXR1cF90ZWFyc3luYyh1bnNpZ25lZCBsb25nIHBpeF9jbGssIGludCBleHRpZl9kaXYpCit7CisJaW50IGhkaXNwLCB2ZGlzcDsKKwlpbnQgaG5kcCwgdm5kcDsKKwlpbnQgaHN3LCB2c3c7CisJaW50IGhzLCB2czsKKwlpbnQgaHNfcG9sX2ludiwgdnNfcG9sX2ludjsKKwlpbnQgdXNlX2hzdnMsIHVzZV9uZHA7CisJdTggIGI7CisKKwloc3cgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0hTX1dfUkVHKTsKKwl2c3cgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1ZTX1dfUkVHKTsKKwloc19wb2xfaW52ID0gIShoc3cgJiAweDgwKTsKKwl2c19wb2xfaW52ID0gISh2c3cgJiAweDgwKTsKKwloc3cgPSBoc3cgJiAweDdmOworCXZzdyA9IHZzdyAmIDB4M2Y7CisKKwloZGlzcCA9IChod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0hfRElTUF9SRUcpICYgMHg3ZikgKiA4OworCXZkaXNwID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9WX0RJU1BfMV9SRUcpICsKKwkJKChod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1ZfRElTUF8yX1JFRykgJiAweDMpIDw8IDgpOworCisJaG5kcCA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfSF9ORFBfUkVHKSAmIDB4N2Y7CisJdm5kcCA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfVl9ORFBfUkVHKTsKKworCS8qIHRpbWUgdG8gdHJhbnNmZXIgb25lIHBpeGVsICgxNmJwcCkgaW4gcHMgKi8KKwlod2E3NDIucGl4X3R4X3RpbWUgPSBod2E3NDIucmVnX3RpbWluZ3Mud2VfY3ljbGVfdGltZTsKKwlpZiAoaHdhNzQyLmV4dGlmLT5nZXRfbWF4X3R4X3JhdGUgIT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGUgZXh0ZXJuYWwgaW50ZXJmYWNlIG1pZ2h0IGhhdmUgYSByYXRlIGxpbWl0YXRpb24sCisJCSAqIGlmIHNvLCB3ZSBoYXZlIHRvIG1heGltaXplIG91ciB0cmFuc2ZlciByYXRlLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBtaW5fdHhfdGltZTsKKwkJdW5zaWduZWQgbG9uZyBtYXhfdHhfcmF0ZSA9IGh3YTc0Mi5leHRpZi0+Z2V0X21heF90eF9yYXRlKCk7CisKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIm1heF90eF9yYXRlICVsZCBIWlxuIiwKKwkJCW1heF90eF9yYXRlKTsKKwkJbWluX3R4X3RpbWUgPSAxMDAwMDAwMDAwIC8gKG1heF90eF9yYXRlIC8gMTAwMCk7ICAvKiBwcyAqLworCQlpZiAoaHdhNzQyLnBpeF90eF90aW1lIDwgbWluX3R4X3RpbWUpCisJCQlod2E3NDIucGl4X3R4X3RpbWUgPSBtaW5fdHhfdGltZTsKKwl9CisKKwkvKiB0aW1lIHRvIHVwZGF0ZSBvbmUgbGluZSBpbiBwcyAqLworCWh3YTc0Mi5saW5lX3VwZF90aW1lID0gKGhkaXNwICsgaG5kcCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsKKwlod2E3NDIubGluZV91cGRfdGltZSAqPSAxMDAwOworCWlmIChoZGlzcCAqIGh3YTc0Mi5waXhfdHhfdGltZSA+IGh3YTc0Mi5saW5lX3VwZF90aW1lKQorCQkvKgorCQkgKiB0cmFuc2ZlciBzcGVlZCB0b28gbG93LCB3ZSBtaWdodCBoYXZlIHRvIHVzZSBib3RoCisJCSAqIEhTIGFuZCBWUworCQkgKi8KKwkJdXNlX2hzdnMgPSAxOworCWVsc2UKKwkJLyogZGVjZW50IHRyYW5zZmVyIHNwZWVkLCB3ZSdsbCBhbHdheXMgdXNlIG9ubHkgVlMgKi8KKwkJdXNlX2hzdnMgPSAwOworCisJaWYgKHVzZV9oc3ZzICYmIChoc19wb2xfaW52IHx8IHZzX3BvbF9pbnYpKSB7CisJCS8qCisJCSAqIEhTIG9yJ2VkIHdpdGggVlMgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGFjdGl2ZSBoaWdoCisJCSAqIFRFIHNpZ25hbCBiYXNlZCBvbiBITkRQIC8gVk5EUAorCQkgKi8KKwkJdXNlX25kcCA9IDE7CisJCWhzX3BvbF9pbnYgPSAwOworCQl2c19wb2xfaW52ID0gMDsKKwkJaHMgPSBobmRwOworCQl2cyA9IHZuZHA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVXNlIEhTIG9yJ2VkIHdpdGggVlMgYXMgYSBURSBzaWduYWwgaWYgYm90aCBhcmUgbmVlZGVkCisJCSAqIG9yIFZORFAgaWYgb25seSB2c3luYyBpcyBuZWVkZWQuCisJCSAqLworCQl1c2VfbmRwID0gMDsKKwkJaHMgPSBoc3c7CisJCXZzID0gdnN3OworCQlpZiAoIXVzZV9oc3ZzKSB7CisJCQloc19wb2xfaW52ID0gMDsKKwkJCXZzX3BvbF9pbnYgPSAwOworCQl9CisJfQorCisJaHMgPSBocyAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOwkJCS8qIHBzICovCisJaHMgKj0gMTAwMDsKKworCXZzID0gdnMgKiAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOwkvKiBwcyAqLworCXZzICo9IDEwMDA7CisKKwlpZiAodnMgPD0gaHMpCisJCXJldHVybiAtRURPTTsKKwkvKiBzZXQgVlMgdG8gMTIwJSBvZiBIUyB0byBtaW5pbWl6ZSBWUyBkZXRlY3Rpb24gdGltZSAqLworCXZzID0gaHMgKiAxMiAvIDEwOworCS8qIG1pbmltaXplIEhTIHRvbyAqLworCWhzID0gMTAwMDA7CisKKwliID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9ORFBfQ1RSTCk7CisJYiAmPSB+MHgzOworCWIgfD0gdXNlX2hzdnMgPyAxIDogMDsKKwliIHw9ICh1c2VfbmRwICYmIHVzZV9oc3ZzKSA/IDAgOiAyOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX05EUF9DVFJMLCBiKTsKKworCWh3YTc0Mi52c3luY19vbmx5ID0gIXVzZV9oc3ZzOworCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwKKwkJInBpeF9jbGsgJWxkIEhaIHBpeF90eF90aW1lICVsZCBwcyBsaW5lX3VwZF90aW1lICVsZCBwc1xuIiwKKwkJcGl4X2NsaywgaHdhNzQyLnBpeF90eF90aW1lLCBod2E3NDIubGluZV91cGRfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwKKwkJImhzICVkIHBzIHZzICVkIHBzIG1vZGUgJWQgdnN5bmNfb25seSAlZFxuIiwKKwkJaHMsIHZzLCAoYiAmIDB4MyksICF1c2VfaHN2cyk7CisKKwlyZXR1cm4gaHdhNzQyLmV4dGlmLT5zZXR1cF90ZWFyc3luYygxLCBocywgdnMsCisJCQkJCSAgICBoc19wb2xfaW52LCB2c19wb2xfaW52LCBleHRpZl9kaXYpOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfZ2V0X2NhcHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJaHdhNzQyLmludF9jdHJsLT5nZXRfY2FwcyhwbGFuZSwgY2Fwcyk7CisJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFIHwKKwkJICAgICAgT01BUEZCX0NBUFNfV0lORE9XX1BJWEVMX0RPVUJMRTsKKwlpZiAoaHdhNzQyLnRlX2Nvbm5lY3RlZCkKKwkJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19URUFSU1lOQzsKKwljYXBzLT53bmRfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2NSkgfAorCQkJICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMCk7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9zdXNwZW5kKHZvaWQpCit7CisJaHdhNzQyLnVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kID0gaHdhNzQyLnVwZGF0ZV9tb2RlOworCWh3YTc0Ml9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJLyogRW5hYmxlIHNsZWVwIG1vZGUgKi8KKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9QT1dFUl9TQVZFLCAxIDw8IDEpOworCWlmIChod2E3NDIucG93ZXJfZG93biAhPSBOVUxMKQorCQlod2E3NDIucG93ZXJfZG93bihod2E3NDIuZmJkZXYtPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9yZXN1bWUodm9pZCkKK3sKKwlpZiAoaHdhNzQyLnBvd2VyX3VwICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl91cChod2E3NDIuZmJkZXYtPmRldik7CisJLyogRGlzYWJsZSBzbGVlcCBtb2RlICovCisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfUE9XRVJfU0FWRSwgMCk7CisJd2hpbGUgKDEpIHsKKwkJLyogTG9vcCB1bnRpbCBQTEwgb3V0cHV0IGlzIHN0YWJpbGl6ZWQgKi8KKwkJaWYgKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMX0RJVl9SRUcpICYgKDEgPDwgNykpCisJCQlicmVhazsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoNSkpOworCX0KKwlod2E3NDJfc2V0X3VwZGF0ZV9tb2RlKGh3YTc0Mi51cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZCk7Cit9CisKK3N0YXRpYyBpbnQgaHdhNzQyX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCSAgICAgICBzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfdnJhbSkKK3sKKwlpbnQgciA9IDAsIGk7CisJdTggcmV2LCBjb25mOworCXVuc2lnbmVkIGxvbmcgZXh0X2NsazsKKwl1bnNpZ25lZCBsb25nIHN5c19jbGssIHBpeF9jbGs7CisJaW50IGV4dGlmX21lbV9kaXY7CisJc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhICpvbWFwZmJfY29uZjsKKwlzdHJ1Y3QgaHdhNzQyX3BsYXRmb3JtX2RhdGEgKmN0cmxfY29uZjsKKworCUJVR19PTighZmJkZXYtPmV4dF9pZiB8fCAhZmJkZXYtPmludF9jdHJsKTsKKworCWh3YTc0Mi5mYmRldiA9IGZiZGV2OworCWh3YTc0Mi5leHRpZiA9IGZiZGV2LT5leHRfaWY7CisJaHdhNzQyLmludF9jdHJsID0gZmJkZXYtPmludF9jdHJsOworCisJb21hcGZiX2NvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWN0cmxfY29uZiA9IG9tYXBmYl9jb25mLT5jdHJsX3BsYXRmb3JtX2RhdGE7CisKKwlpZiAoY3RybF9jb25mID09IE5VTEwgfHwgY3RybF9jb25mLT5nZXRfY2xvY2tfcmF0ZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgIkhXQTc0MjogbWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlod2E3NDIucG93ZXJfZG93biA9IGN0cmxfY29uZi0+cG93ZXJfZG93bjsKKwlod2E3NDIucG93ZXJfdXAgPSBjdHJsX2NvbmYtPnBvd2VyX3VwOworCisJc3Bpbl9sb2NrX2luaXQoJmh3YTc0Mi5yZXFfbG9jayk7CisKKwlpZiAoKHIgPSBod2E3NDIuaW50X2N0cmwtPmluaXQoZmJkZXYsIDEsIHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGVycjE7CisKKwlpZiAoKHIgPSBod2E3NDIuZXh0aWYtPmluaXQoZmJkZXYpKSA8IDApCisJCWdvdG8gZXJyMjsKKworCWV4dF9jbGsgPSBjdHJsX2NvbmYtPmdldF9jbG9ja19yYXRlKGZiZGV2LT5kZXYpOworCWlmICgociA9IGNhbGNfZXh0aWZfdGltaW5ncyhleHRfY2xrLCAmZXh0aWZfbWVtX2RpdikpIDwgMCkKKwkJZ290byBlcnIzOworCWh3YTc0Mi5leHRpZi0+c2V0X3RpbWluZ3MoJmh3YTc0Mi5yZWdfdGltaW5ncyk7CisJaWYgKGh3YTc0Mi5wb3dlcl91cCAhPSBOVUxMKQorCQlod2E3NDIucG93ZXJfdXAoZmJkZXYtPmRldik7CisKKwljYWxjX2h3YTc0Ml9jbGtfcmF0ZXMoZXh0X2NsaywgJnN5c19jbGssICZwaXhfY2xrKTsKKwlpZiAoKHIgPSBjYWxjX2V4dGlmX3RpbWluZ3Moc3lzX2NsaywgJmV4dGlmX21lbV9kaXYpKSA8IDApCisJCWdvdG8gZXJyNDsKKwlod2E3NDIuZXh0aWYtPnNldF90aW1pbmdzKCZod2E3NDIucmVnX3RpbWluZ3MpOworCisJcmV2ID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9SRVZfQ09ERV9SRUcpOworCWlmICgocmV2ICYgMHhmYykgIT0gMHg4MCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJIV0E3NDI6IGludmFsaWQgcmV2aXNpb24gJTAyeFxuIiwgcmV2KTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyNDsKKwl9CisKKworCWlmICghKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMX0RJVl9SRUcpICYgMHg4MCkpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkgICAgICAiSFdBNzQyOiBjb250cm9sbGVyIG5vdCBpbml0aWFsaXplZCBieSB0aGUgYm9vdGxvYWRlclxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjQ7CisJfQorCisJaWYgKGN0cmxfY29uZi0+dGVfY29ubmVjdGVkKSB7CisJCWlmICgociA9IHNldHVwX3RlYXJzeW5jKHBpeF9jbGssIGV4dGlmX21lbV9kaXYpKSA8IDApIHsKKwkJCWRldl9lcnIoaHdhNzQyLmZiZGV2LT5kZXYsCisJCQkgICAgICAgIkhXQTc0MjogY2FuJ3Qgc2V0dXAgdGVhcmluZyBzeW5jaHJvbml6YXRpb25cbiIpOworCQkJZ290byBlcnI0OworCQl9CisJCWh3YTc0Mi50ZV9jb25uZWN0ZWQgPSAxOworCX0KKworCWh3YTc0Mi5tYXhfdHJhbnNtaXRfc2l6ZSA9IGh3YTc0Mi5leHRpZi0+bWF4X3RyYW5zbWl0X3NpemU7CisKKwlod2E3NDIudXBkYXRlX21vZGUgPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOworCisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy54ID0gMDsKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LnkgPSAwOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cud2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cuaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LmZvcm1hdCA9IDA7CisKKwlpbml0X3RpbWVyKCZod2E3NDIuYXV0b191cGRhdGVfdGltZXIpOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lci5mdW5jdGlvbiA9IGh3YTc0Ml91cGRhdGVfd2luZG93X2F1dG87CisJaHdhNzQyLmF1dG9fdXBkYXRlX3RpbWVyLmRhdGEgPSAwOworCisJaHdhNzQyLnByZXZfY29sb3JfbW9kZSA9IC0xOworCWh3YTc0Mi5wcmV2X2ZsYWdzID0gMDsKKworCWh3YTc0Mi5mYmRldiA9IGZiZGV2OworCisJSU5JVF9MSVNUX0hFQUQoJmh3YTc0Mi5mcmVlX3JlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh3YTc0Mi5yZXFfcG9vbCk7IGkrKykKKwkJbGlzdF9hZGQoJmh3YTc0Mi5yZXFfcG9vbFtpXS5lbnRyeSwgJmh3YTc0Mi5mcmVlX3JlcV9saXN0KTsKKwlCVUdfT04oaSA8PSBJUlFfUkVRX1BPT0xfU0laRSk7CisJc2VtYV9pbml0KCZod2E3NDIucmVxX3NlbWEsIGkgLSBJUlFfUkVRX1BPT0xfU0laRSk7CisKKwljb25mID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9DT05GSUdfUkVHKTsKKwlkZXZfaW5mbyhmYmRldi0+ZGV2LCAiOiBFcHNvbiBIV0E3NDIgTENEIGNvbnRyb2xsZXIgcmV2ICVkICIKKwkJCSJpbml0aWFsaXplZCAoQ05GIHBpbnMgJXgpXG4iLCByZXYgJiAweDAzLCBjb25mICYgMHgwNyk7CisKKwlyZXR1cm4gMDsKK2VycjQ6CisJaWYgKGh3YTc0Mi5wb3dlcl9kb3duICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl9kb3duKGZiZGV2LT5kZXYpOworZXJyMzoKKwlod2E3NDIuZXh0aWYtPmNsZWFudXAoKTsKK2VycjI6CisJaHdhNzQyLmludF9jdHJsLT5jbGVhbnVwKCk7CitlcnIxOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfY2xlYW51cCh2b2lkKQoreworCWh3YTc0Ml9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJaHdhNzQyLmV4dGlmLT5jbGVhbnVwKCk7CisJaHdhNzQyLmludF9jdHJsLT5jbGVhbnVwKCk7CisJaWYgKGh3YTc0Mi5wb3dlcl9kb3duICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl9kb3duKGh3YTc0Mi5mYmRldi0+ZGV2KTsKK30KKworc3RydWN0IGxjZF9jdHJsIGh3YTc0Ml9jdHJsID0geworCS5uYW1lCQkJPSAiaHdhNzQyIiwKKwkuaW5pdAkJCT0gaHdhNzQyX2luaXQsCisJLmNsZWFudXAJCT0gaHdhNzQyX2NsZWFudXAsCisJLmJpbmRfY2xpZW50CQk9IGh3YTc0Ml9iaW5kX2NsaWVudCwKKwkuZ2V0X2NhcHMJCT0gaHdhNzQyX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBod2E3NDJfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBod2E3NDJfZ2V0X3VwZGF0ZV9tb2RlLAorCS5zZXR1cF9wbGFuZQkJPSBod2E3NDJfc2V0dXBfcGxhbmUsCisJLmVuYWJsZV9wbGFuZQkJPSBod2E3NDJfZW5hYmxlX3BsYW5lLAorCS51cGRhdGVfd2luZG93CQk9IGh3YTc0Ml91cGRhdGVfd2luZG93X2FzeW5jLAorCS5zeW5jCQkJPSBod2E3NDJfc3luYywKKwkuc3VzcGVuZAkJPSBod2E3NDJfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBod2E3NDJfcmVzdW1lLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODA3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAgSDMgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90cHM2NTAxMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmItbGNkX2gzIgorCisjZGVmaW5lIHByX2VycihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBNT0RVTEVfTkFNRSAiOiAiIGZtdCwgIyMgYXJncykKKworc3RhdGljIGludCBoM19wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGgzX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCWludCByID0gMDsKKworCS8qIEdQSU8xIGFuZCBHUElPMiBvZiBUUFM2NTAxMCBzZW5kIExDRF9FTkJLTCBhbmQgTENEX0VOVkREIHNpZ25hbHMgKi8KKwlyID0gdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8xLCBISUdIKTsKKwlpZiAoIXIpCisJCXIgPSB0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzIsIEhJR0gpOworCWlmIChyKQorCQlwcl9lcnIoIlVuYWJsZSB0byB0dXJuIG9uIExDRCBwYW5lbFxuIik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgaDNfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlpbnQgciA9IDA7CisKKwkvKiBHUElPMSBhbmQgR1BJTzIgb2YgVFBTNjUwMTAgc2VuZCBMQ0RfRU5CS0wgYW5kIExDRF9FTlZERCBzaWduYWxzICovCisJciA9IHRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMSwgTE9XKTsKKwlpZiAoIXIpCisJCXRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMiwgTE9XKTsKKwlpZiAocikKKwkJcHJfZXJyKCJVbmFibGUgdG8gdHVybiBvZmYgTENEIHBhbmVsXG4iKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaDNfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgaDNfcGFuZWwgPSB7CisJLm5hbWUJCT0gImgzIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuZGF0YV9saW5lcwk9IDE2LAorCS5icHAJCT0gMTYsCisJLnhfcmVzCQk9IDI0MCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDEyMDAwLAorCS5oc3cJCT0gMTIsCisJLmhmcAkJPSAxNCwKKwkuaGJwCQk9IDcyIC0gMTIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gaDNfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IGgzX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBoM19wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBoM19wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IGgzX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBoM19wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaDNfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgzX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgzX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaDNfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBoM19wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IGgzX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGgzX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBoM19wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9oMyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGgzX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaDNfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgaDNfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaDNfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaDNfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoaDNfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2ZjBlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBINCBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoNF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IGg0X3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaDRfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaDRfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgaDRfcGFuZWwgPSB7CisJLm5hbWUJCT0gImg0IiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDI0MCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDYyNTAsCisJLmhzdwkJPSAxNSwKKwkuaGZwCQk9IDE1LAorCS5oYnAJCT0gNjAsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDEsCisKKwkuaW5pdAkJPSBoNF9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gaDRfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGg0X3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGg0X3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gaDRfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGg0X3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZoNF9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoNF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoNF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGg0X3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gaDRfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaDRfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGg0X3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX2g0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoNF9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBoNF9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoNF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChoNF9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChoNF9wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTUxMC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxZjM4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTUxMC5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQMTUxMCBJbm5vdmF0b3IgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCQkgICAgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNTEwX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJZnBnYV93cml0ZSgweDcsIE9NQVAxNTEwX0ZQR0FfTENEX1BBTkVMX0NPTlRST0wpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNTEwX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJZnBnYV93cml0ZSgweDAsIE9NQVAxNTEwX0ZQR0FfTENEX1BBTkVMX0NPTlRST0wpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbm5vdmF0b3IxNTEwX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIGlubm92YXRvcjE1MTBfcGFuZWwgPSB7CisJLm5hbWUJCT0gImlubjE1MTAiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTI1MDAsCisJLmhzdwkJPSA0MCwKKwkuaGZwCQk9IDQwLAorCS5oYnAJCT0gNzIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAxMiwKKworCS5pbml0CQk9IGlubm92YXRvcjE1MTBfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IGlubm92YXRvcjE1MTBfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IGlubm92YXRvcjE1MTBfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmlubm92YXRvcjE1MTBfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlubm92YXRvcjE1MTBfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfaW5uMTUxMCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpbm5vdmF0b3IxNTEwX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbm5vdmF0b3IxNTEwX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjA0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUDE2MTAgSW5ub3ZhdG9yIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNkZWZpbmUgTU9EVUxFX05BTUUJIm9tYXBmYi1sY2RfaDMiCisKKyNkZWZpbmUgcHJfZXJyKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIE1PRFVMRV9OQU1FICI6ICIgZm10LCAjIyBhcmdzKQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCQkgICAgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByID0gMDsKKworCWlmIChvbWFwX3JlcXVlc3RfZ3BpbygxNCkpIHsKKwkJcHJfZXJyKCJjYW4ndCByZXF1ZXN0IEdQSU8gMTRcbiIpOworCQlyID0gLTE7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKDE1KSkgeworCQlwcl9lcnIoImNhbid0IHJlcXVlc3QgR1BJTyAxNVxuIik7CisJCW9tYXBfZnJlZV9ncGlvKDE0KTsKKwkJciA9IC0xOworCQlnb3RvIGV4aXQ7CisJfQorCS8qIGNvbmZpZ3VyZSBHUElPKDE0LCAxNSkgYXMgb3V0cHV0cyAqLworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDE0LCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigxNSwgMCk7CitleGl0OgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNjEwX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJb21hcF9mcmVlX2dwaW8oMTUpOworCW9tYXBfZnJlZV9ncGlvKDE0KTsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwkvKiBzZXQgR1BJTzE0IGFuZCBHUElPMTUgaGlnaCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNCwgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE1LCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCS8qIHNldCBHUElPMTMsIEdQSU8xNCBhbmQgR1BJTzE1IGxvdyAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE1LCAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5ub3ZhdG9yMTYxMF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBpbm5vdmF0b3IxNjEwX3BhbmVsID0geworCS5uYW1lCQk9ICJpbm4xNjEwIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDMyMCwKKwkueV9yZXMJCT0gMjQwLAorCS5waXhlbF9jbG9jawk9IDEyNTAwLAorCS5oc3cJCT0gNDAsCisJLmhmcAkJPSA0MCwKKwkuaGJwCQk9IDcyLAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAwLAorCS5wY2QJCT0gMTIsCisKKwkuaW5pdAkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGlubm92YXRvcjE2MTBfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZpbm5vdmF0b3IxNjEwX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgICBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlubm92YXRvcjE2MTBfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX2lubjE2MTAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlubm92YXRvcjE2MTBfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4MDM4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAgT1NLIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIEFkYXB0ZWQgZm9yIE9TSyBieSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IG9za19wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9za19wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJLyogY29uZmlndXJlIFBXTCBwaW4gKi8KKwlvbWFwX2NmZ19yZWcoUFdMKTsKKworCS8qIEVuYWJsZSBQV0wgdW5pdCAqLworCW9tYXBfd3JpdGViKDB4MDEsIE9NQVBfUFdMX0NMS19FTkFCTEUpOworCisJLyogU2V0IFBXTCBsZXZlbCAqLworCW9tYXBfd3JpdGViKDB4RkYsIE9NQVBfUFdMX0VOQUJMRSk7CisKKwkvKiBjb25maWd1cmUgR1BJTzIgYXMgb3V0cHV0ICovCisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMiwgMCk7CisKKwkvKiBzZXQgR1BJTzIgaGlnaCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgyLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvc2tfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwkvKiBTZXQgUFdMIGxldmVsIHRvIHplcm8gKi8KKwlvbWFwX3dyaXRlYigweDAwLCBPTUFQX1BXTF9FTkFCTEUpOworCisJLyogRGlzYWJsZSBQV0wgdW5pdCAqLworCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfUFdMX0NMS19FTkFCTEUpOworCisJLyogc2V0IEdQSU8yIGxvdyAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgyLCAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb3NrX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIG9za19wYW5lbCA9IHsKKwkubmFtZQkJPSAib3NrIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDI0MCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDEyNTAwLAorCS5oc3cJCT0gNDAsCisJLmhmcAkJPSA0MCwKKwkuaGJwCQk9IDcyLAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAwLAorCS5wY2QJCT0gMTIsCisKKwkuaW5pdAkJPSBvc2tfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IG9za19wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gb3NrX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IG9za19wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IG9za19wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZvc2tfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvc2tfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvc2tfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3NrX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb3NrX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gb3NrX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IG9za19wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gb3NrX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX29zayIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IG9za19wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9za19wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBvc2tfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3NrX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG9za19wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChvc2tfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmJkZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdGUuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgUGFsbSBUdW5nc3RlbiBFCisgKgorICogT3JpZ2luYWwgdmVyc2lvbiA6IFJvbWFpbiBHb3lldCA8ci5nb3lldEBnbWFpbC5jb20+CisgKiBDdXJyZW50IHZlcnNpb24gOiBMYXVyZW50IEdvbnphbGV6IDxwYWxtdGUubGludXhAZnJlZS5mcj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCQlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10ZV9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10ZV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtdGVfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgcGFsbXRlX3BhbmVsID0geworCS5uYW1lCQk9ICJwYWxtdGUiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCB8IE9NQVBfTENEQ19JTlZfVlNZTkMgfAorCQkJICBPTUFQX0xDRENfSU5WX0hTWU5DIHwgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgfAorCQkJICBPTUFQX0xDRENfSFNWU19PUFBPU0lURSwKKworCS5kYXRhX2xpbmVzCT0gMTYsCisJLmJwcAkJPSA4LAorCS5waXhlbF9jbG9jawk9IDEyMDAwLAorCS54X3JlcwkJPSAzMjAsCisJLnlfcmVzCQk9IDMyMCwKKwkuaHN3CQk9IDQsCisJLmhmcAkJPSA4LAorCS5oYnAJCT0gMjgsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gOCwKKwkudmJwCQk9IDcsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gcGFsbXRlX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBwYWxtdGVfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IHBhbG10ZV9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwYWxtdGVfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBwYWxtdGVfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmcGFsbXRlX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBhbG10ZV9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBhbG10ZV9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHBhbG10ZV9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBwYWxtdGVfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHBhbG10ZV9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9wYWxtdGUiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwYWxtdGVfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgcGFsbXRlX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBhbG10ZV9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwYWxtdGVfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQocGFsbXRlX3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgUGFsbSBUdW5nc3RlbnxUCisgKiBDdXJyZW50IHZlcnNpb24gOiBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIE1vZGlmaWVkIGZyb20gbGNkX2lubjE1MTAuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qCitHUElPMTEgLSBiYWNrbGlnaHQKK0dQSU8xMiAtIHNjcmVlbiBibGFua2luZworR1BJTzEzIC0gc2NyZWVuIGJsYW5raW5nCisqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10dF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10dF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtdHRfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIE9NQVBGQl9DQVBTX1NFVF9CQUNLTElHSFQ7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgcGFsbXR0X3BhbmVsID0geworCS5uYW1lCQk9ICJwYWxtdHQiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCB8IE9NQVBfTENEQ19JTlZfVlNZTkMgfAorCQkJT01BUF9MQ0RDX0lOVl9IU1lOQyB8IE9NQVBfTENEQ19IU1ZTX1JJU0lOR19FREdFIHwKKwkJCU9NQVBfTENEQ19IU1ZTX09QUE9TSVRFLAorCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMzIwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTAwMDAsCisJLmhzdwkJPSA0LAorCS5oZnAJCT0gOCwKKwkuaGJwCQk9IDI4LAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDgsCisJLnZicAkJPSA3LAorCS5wY2QJCT0gMCwKKworCS5pbml0CQk9IHBhbG10dF9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gcGFsbXR0X3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBwYWxtdHRfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gcGFsbXR0X3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gcGFsbXR0X3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJnBhbG10dF9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYWxtdHRfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBwYWxtdHRfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBwYWxtdHRfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcGFsbXR0X3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYWxtdHRfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfcGFsbXR0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGFsbXR0X3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10dF9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwYWxtdHRfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFsbXR0X3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KHBhbG10dF9wYW5lbF9kcnZfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG16NzEuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjE3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG16NzEuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgUGFsbSBaaXJlNzEKKyAqCisgKiBPcmlnaW5hbCB2ZXJzaW9uIDogUm9tYWluIEdveWV0CisgKiBDdXJyZW50IHZlcnNpb24gOiBMYXVyZW50IEdvbnphbGV6CisgKiBNb2RpZmllZCBmb3IgemlyZTcxIDogTWFyZWsgVmFzdXQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCSAgICAgIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXo3MV9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCit9CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG16NzFfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFsbXo3MV9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBwYWxtejcxX3BhbmVsID0geworCS5uYW1lCQk9ICJwYWxtejcxIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKKwkJCSAgT01BUF9MQ0RDX0lOVl9IU1lOQyB8IE9NQVBfTENEQ19IU1ZTX1JJU0lOR19FREdFIHwKKwkJCSAgT01BUF9MQ0RDX0hTVlNfT1BQT1NJVEUsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkuYnBwCQk9IDE2LAorCS5waXhlbF9jbG9jawk9IDI0MDAwLAorCS54X3JlcwkJPSAzMjAsCisJLnlfcmVzCQk9IDMyMCwKKwkuaHN3CQk9IDQsCisJLmhmcAkJPSA4LAorCS5oYnAJCT0gMjgsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gOCwKKwkudmJwCQk9IDcsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gcGFsbXo3MV9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gcGFsbXo3MV9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gcGFsbXo3MV9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwYWxtejcxX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gcGFsbXo3MV9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmcGFsbXo3MV9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYWxtejcxX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGFsbXo3MV9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHBhbG16NzFfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcGFsbXo3MV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGFsbXo3MV9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9wYWxtejcxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBhbG16NzFfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgcGFsbXo3MV9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwYWxtejcxX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhbG16NzFfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQocGFsbXo3MV9wYW5lbF9kcnZfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9zeDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGYzMDZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9zeDEuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgU2llbWVucyBTWDEgbW9iaWxlIHBob25lCisgKgorICogQ3VycmVudCB2ZXJzaW9uIDogVm92YW44ODhAZ21haWwuY29tLCBncmVhdCBoZWxwIGZyb20gRkNBMDAwMDAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21jYnNwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisKKy8qCisgKiBPTUFQMzEwIEdQSU8gcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgR1BJT19EQVRBX0lOUFVUCQkweGZmZmNlMDAwCisjZGVmaW5lIEdQSU9fREFUQV9PVVRQVVQJMHhmZmZjZTAwNAorI2RlZmluZSBHUElPX0RJUl9DT05UUk9MCTB4ZmZmY2UwMDgKKyNkZWZpbmUgR1BJT19JTlRfQ09OVFJPTAkweGZmZmNlMDBjCisjZGVmaW5lIEdQSU9fSU5UX01BU0sJCTB4ZmZmY2UwMTAKKyNkZWZpbmUgR1BJT19JTlRfU1RBVFVTCQkweGZmZmNlMDE0CisjZGVmaW5lIEdQSU9fUElOX0NPTlRST0wJMHhmZmZjZTAxOAorCisKKyNkZWZpbmUgQV9MQ0RfU1NDX1JECTMKKyNkZWZpbmUgQV9MQ0RfU1NDX1NECTcKKyNkZWZpbmUgX0FfTENEX1JFU0VUCTkKKyNkZWZpbmUgX0FfTENEX1NTQ19DUwkxMgorI2RlZmluZSBfQV9MQ0RfU1NDX0EwCTEzCisKKyNkZWZpbmUgRFNQX1JFRwkJMHhFMTAxNzAyNAorCitjb25zdCB1bnNpZ25lZCBjaGFyIElOSVRfMVsxMl0gPSB7CisJMHgxQywgMHgwMiwgMHg4OCwgMHgwMCwgMHgxRSwgMHhFMCwgMHgwMCwgMHhEQywgMHgwMCwgMHgwMiwgMHgwMAorfTsKKworY29uc3QgdW5zaWduZWQgY2hhciBJTklUXzJbMTI3XSA9IHsKKwkweDE1LCAweDAwLCAweDI5LCAweDAwLCAweDNFLCAweDAwLCAweDUxLCAweDAwLAorCTB4NjUsIDB4MDAsIDB4N0EsIDB4MDAsIDB4OEQsIDB4MDAsIDB4QTEsIDB4MDAsCisJMHhCNiwgMHgwMCwgMHhDNywgMHgwMCwgMHhEOCwgMHgwMCwgMHhFQiwgMHgwMCwKKwkweEZCLCAweDAwLCAweDBCLCAweDAxLCAweDFCLCAweDAxLCAweDI3LCAweDAxLAorCTB4MzQsIDB4MDEsIDB4NDEsIDB4MDEsIDB4NEMsIDB4MDEsIDB4NTUsIDB4MDEsCisJMHg1RiwgMHgwMSwgMHg2OCwgMHgwMSwgMHg3MCwgMHgwMSwgMHg3OCwgMHgwMSwKKwkweDdFLCAweDAxLCAweDg2LCAweDAxLCAweDhDLCAweDAxLCAweDk0LCAweDAxLAorCTB4OUIsIDB4MDEsIDB4QTEsIDB4MDEsIDB4QTQsIDB4MDEsIDB4QTksIDB4MDEsCisJMHhBRCwgMHgwMSwgMHhCMiwgMHgwMSwgMHhCNywgMHgwMSwgMHhCQywgMHgwMSwKKwkweEMwLCAweDAxLCAweEM0LCAweDAxLCAweEM4LCAweDAxLCAweENCLCAweDAxLAorCTB4Q0YsIDB4MDEsIDB4RDIsIDB4MDEsIDB4RDUsIDB4MDEsIDB4RDgsIDB4MDEsCisJMHhEQiwgMHgwMSwgMHhFMCwgMHgwMSwgMHhFMywgMHgwMSwgMHhFNiwgMHgwMSwKKwkweEU4LCAweDAxLCAweEVCLCAweDAxLCAweEVFLCAweDAxLCAweEYxLCAweDAxLAorCTB4RjMsIDB4MDEsIDB4RjgsIDB4MDEsIDB4RjksIDB4MDEsIDB4RkMsIDB4MDEsCisJMHgwMCwgMHgwMiwgMHgwMywgMHgwMiwgMHgwNywgMHgwMiwgMHgwOSwgMHgwMiwKKwkweDBFLCAweDAyLCAweDEzLCAweDAyLCAweDFDLCAweDAyLCAweDAwCit9OworCitjb25zdCB1bnNpZ25lZCBjaGFyIElOSVRfM1sxNV0gPSB7CisJMHgxNCwgMHgyNiwgMHgzMywgMHgzRCwgMHg0NSwgMHg0RCwgMHg1MywgMHg1OSwKKwkweDVFLCAweDYzLCAweDY3LCAweDZELCAweDcxLCAweDc4LCAweEZGCit9OworCitzdGF0aWMgdm9pZCBlcHNvbl9zZW5kYnl0ZShpbnQgZmxhZywgdW5zaWduZWQgY2hhciBieXRlKQoreworCWludCBpLCBzaGlmdGVyID0gMHg4MDsKKworCWlmICghZmxhZykKKwkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQTAsIDApOworCW1kZWxheSgyKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1JELCAxKTsKKworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfU0QsIGZsYWcpOworCisJT01BUF9NQ0JTUF9XUklURShPTUFQMTUxMF9NQ0JTUDNfQkFTRSwgUENSMCwgMHgyMjAwKTsKKwlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJT01BUF9NQ0JTUF9XUklURShPTUFQMTUxMF9NQ0JTUDNfQkFTRSwgUENSMCwgMHgyMjAwKTsKKwkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgc2hpZnRlciAmIGJ5dGUpOworCQlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDIpOworCQlzaGlmdGVyID4+PSAxOworCX0KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19BMCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc3lzdGVtKHZvaWQpCit7CisJb21hcF9tY2JzcF9yZXF1ZXN0KE9NQVBfTUNCU1AzKTsKKwlvbWFwX21jYnNwX3N0b3AoT01BUF9NQ0JTUDMpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9HUElPKHZvaWQpCit7CisJLyogbmV3IHdhdmUgKi8KKwlvbWFwX3JlcXVlc3RfZ3BpbyhBX0xDRF9TU0NfUkQpOworCW9tYXBfcmVxdWVzdF9ncGlvKEFfTENEX1NTQ19TRCk7CisJb21hcF9yZXF1ZXN0X2dwaW8oX0FfTENEX1JFU0VUKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbyhfQV9MQ0RfU1NDX0NTKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbyhfQV9MQ0RfU1NDX0EwKTsKKworCS8qIHNldCBhbGwgR1BJT3MgdG8gb3V0cHV0ICovCisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oQV9MQ0RfU1NDX1JELCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihBX0xDRF9TU0NfU0QsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKF9BX0xDRF9SRVNFVCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1NTQ19DUywgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1NTQ19BMCwgMCk7CisKKwkvKiBzZXQgR1BJTyBkYXRhICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19SRCwgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0EwLCAxKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlvbWFwX2NmZ19yZWcoTUNCU1AzX0NMS1gpOworCisJbWRlbGF5KDIpOworCXNldHVwX0dQSU8oKTsKKwltZGVsYXkoMik7CisKKwkvKiByZXNldCBMQ0QgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCAxKTsKKwllcHNvbl9zZW5kYnl0ZSgwLCAweDI1KTsKKworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfUkVTRVQsIDApOworCW1kZWxheSgxMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMSk7CisKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJbWRlbGF5KDIpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENELCBwaGFzZSAxICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhDQSk7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfMVtpXSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDIgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweENCKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI1OyBpKyspCisJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfMltpXSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDJhICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhDQyk7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfM1tpXSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDMgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweEJDKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDA4KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgNCAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4MDcpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDUpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA1ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHg5NCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDYgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweEM2KTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDgwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJbWRlbGF5KDEwMCk7IC8qIHVzZWQgdG8gYmUgMTAwMCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDcgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweDE2KTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAyKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAwKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweEIxKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgOCAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4NzYpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCWVwc29uX3NlbmRieXRlKDEsIDB4REIpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA5ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhBRik7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN4MV9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdm9pZCBzeDFfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJTWDE6IExDRCBwYW5lbCBkaXNhYmxlXG4iKTsKKwlzeDFfc2V0bW1pcG93ZXIoMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCisJZXBzb25fc2VuZGJ5dGUoMCwgMHgyNSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhBRSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW1kZWxheSgxMDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCWVwc29uX3NlbmRieXRlKDAsIDB4OTUpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXByaW50ayhLRVJOX0lORk8gImxjZF9zeDE6IExDRCBwYW5lbCBlbmFibGVcbiIpOworCWluaXRfc3lzdGVtKCk7CisJZGlzcGxheV9pbml0KCk7CisKKwlzeDFfc2V0bW1pcG93ZXIoMSk7CisJc3gxX3NldGJhY2tsaWdodCgweDE4KTsKKwlzeDFfc2V0a2V5bGlnaHQgKDB4MDYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN4MV9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBzeDFfcGFuZWwgPSB7CisJLm5hbWUJCT0gInN4MSIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8CisJCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMgfCBPTUFQX0xDRENfSU5WX1BJWF9DTE9DSyB8CisJCQkgIE9NQVBfTENEQ19JTlZfT1VUUFVUX0VOLAorCisJLnhfcmVzCQk9IDE3NiwKKwkueV9yZXMJCT0gMjIwLAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLmJwcAkJPSAxNiwKKwkuaHN3CQk9IDUsCisJLmhmcAkJPSA1LAorCS5oYnAJCT0gNSwKKwkudnN3CQk9IDIsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMSwKKwkucGl4ZWxfY2xvY2sJPSAxNTAwLAorCisJLmluaXQJCT0gc3gxX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBzeDFfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IHN4MV9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBzeDFfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBzeDFfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IHN4MV9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmc3gxX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN4MV9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHN4MV9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHN4MV9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBzeDFfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHN4MV9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAibGNkX3N4MSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IHN4MV9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnN4MV9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBzeDFfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3gxX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHN4MV9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChzeDFfcGFuZWxfZHJ2X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4NTE4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKQEAgLTAsMCArMSw4OTMgQEAKKy8qCisgKiBPTUFQMSBpbnRlcm5hbCBMQ0QgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2RlZmluZSBNT0RVTEVfTkFNRQkJCSJsY2RjIgorCisjZGVmaW5lIE9NQVBfTENEQ19CQVNFCQkJMHhmZmZlYzAwMAorI2RlZmluZSBPTUFQX0xDRENfU0laRQkJCTI1NgorI2RlZmluZSBPTUFQX0xDRENfSVJRCQkJSU5UX0xDRF9DVFJMCisKKyNkZWZpbmUgT01BUF9MQ0RDX0NPTlRST0wJCShPTUFQX0xDRENfQkFTRSArIDB4MDApCisjZGVmaW5lIE9NQVBfTENEQ19USU1JTkcwCQkoT01BUF9MQ0RDX0JBU0UgKyAweDA0KQorI2RlZmluZSBPTUFQX0xDRENfVElNSU5HMQkJKE9NQVBfTENEQ19CQVNFICsgMHgwOCkKKyNkZWZpbmUgT01BUF9MQ0RDX1RJTUlORzIJCShPTUFQX0xDRENfQkFTRSArIDB4MGMpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUVVMJCShPTUFQX0xDRENfQkFTRSArIDB4MTApCisjZGVmaW5lIE9NQVBfTENEQ19TVUJQQU5FTAkJKE9NQVBfTENEQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUgT01BUF9MQ0RDX0xJTkVfSU5UCQkoT01BUF9MQ0RDX0JBU0UgKyAweDE4KQorI2RlZmluZSBPTUFQX0xDRENfRElTUExBWV9TVEFUVVMJKE9NQVBfTENEQ19CQVNFICsgMHgxYykKKworI2RlZmluZSBPTUFQX0xDRENfU1RBVF9ET05FCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9WU1lOQwkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfU1lOQ19MT1NUCSgxIDw8IDIpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0FCQwkJKDEgPDwgMykKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfTElORV9JTlQJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0ZVRgkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfTE9BREVEX1BBTEVUVEUJKDEgPDwgNikKKworI2RlZmluZSBPTUFQX0xDRENfQ1RSTF9MQ0RfRU4JCSgxIDw8IDApCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xDRF9URlQJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xJTkVfSVJRX0NMUl9TRUwJKDEgPDwgMTApCisKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9WU1lOQwkJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9ET05FCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0xPQURFRF9QQUxFVFRFCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTElORV9OSVJRCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0xJTkUJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTUFTSwkJKCgoMSA8PCA1KSAtIDEpIDw8IDIpCisKKyNkZWZpbmUgTUFYX1BBTEVUVEVfU0laRQkJUEFHRV9TSVpFCisKK2VudW0gbGNkY19sb2FkX21vZGUgeworCU9NQVBfTENEQ19MT0FEX1BBTEVUVEUsCisJT01BUF9MQ0RDX0xPQURfRlJBTUUsCisJT01BUF9MQ0RDX0xPQURfUEFMRVRURV9BTkRfRlJBTUUKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29udHJvbGxlciB7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGU7CisJaW50CQkJZXh0X21vZGU7CisKKwl1bnNpZ25lZCBsb25nCQlmcmFtZV9vZmZzZXQ7CisJaW50CQkJc2NyZWVuX3dpZHRoOworCWludAkJCXhyZXM7CisJaW50CQkJeXJlczsKKworCWVudW0gb21hcGZiX2NvbG9yX2Zvcm1hdAljb2xvcl9tb2RlOworCWludAkJCWJwcDsKKwl2b2lkCQkJKnBhbGV0dGVfdmlydDsKKwlkbWFfYWRkcl90CQlwYWxldHRlX3BoeXM7CisJaW50CQkJcGFsZXR0ZV9jb2RlOworCWludAkJCXBhbGV0dGVfc2l6ZTsKKworCXVuc2lnbmVkIGludAkJaXJxX21hc2s7CisJc3RydWN0IGNvbXBsZXRpb24JbGFzdF9mcmFtZV9jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbglwYWxldHRlX2xvYWRfY29tcGxldGU7CisJc3RydWN0IGNsawkJKmxjZF9jazsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7CisKKwl2b2lkCQkJKCpkbWFfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCQkqZG1hX2NhbGxiYWNrX2RhdGE7CisKKwlpbnQJCQlmYm1lbV9hbGxvY2F0ZWQ7CisJZG1hX2FkZHJfdAkJdnJhbV9waHlzOworCXZvaWQJCQkqdnJhbV92aXJ0OworCXVuc2lnbmVkIGxvbmcJCXZyYW1fc2l6ZTsKK30gbGNkYzsKKworc3RhdGljIHZvaWQgaW5saW5lIGVuYWJsZV9pcnFzKGludCBtYXNrKQoreworCWxjZGMuaXJxX21hc2sgfD0gbWFzazsKK30KKworc3RhdGljIHZvaWQgaW5saW5lIGRpc2FibGVfaXJxcyhpbnQgbWFzaykKK3sKKwlsY2RjLmlycV9tYXNrICY9IH5tYXNrOworfQorCitzdGF0aWMgdm9pZCBzZXRfbG9hZF9tb2RlKGVudW0gbGNkY19sb2FkX21vZGUgbW9kZSkKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwlsICY9IH4oMyA8PCAyMCk7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBPTUFQX0xDRENfTE9BRF9QQUxFVFRFOgorCQlsIHw9IDEgPDwgMjA7CisJCWJyZWFrOworCWNhc2UgT01BUF9MQ0RDX0xPQURfRlJBTUU6CisJCWwgfD0gMiA8PCAyMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0xDRENfTE9BRF9QQUxFVFRFX0FORF9GUkFNRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2NvbnRyb2xsZXIodm9pZCkKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwlsIHw9IE9NQVBfTENEQ19DVFJMX0xDRF9FTjsKKwlsICY9IH5PTUFQX0xDRENfSVJRX01BU0s7CisJbCB8PSBsY2RjLmlycV9tYXNrIHwgT01BUF9MQ0RDX0lSUV9ET05FOwkvKiBlbmFibGVkIElSUXMgKi8KKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29udHJvbGxlcl9hc3luYyh2b2lkKQoreworCXUzMiBsOworCXUzMiBtYXNrOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCW1hc2sgPSBPTUFQX0xDRENfQ1RSTF9MQ0RfRU4gfCBPTUFQX0xDRENfSVJRX01BU0s7CisJLyoKKwkgKiBQcmVzZXJ2ZSB0aGUgRE9ORSBtYXNrLCBzaW5jZSB3ZSBzdGlsbCB3YW50IHRvIGdldCB0aGUKKwkgKiBmaW5hbCBET05FIGlycS4gSXQgd2lsbCBiZSBkaXNhYmxlZCBpbiB0aGUgSVJRIGhhbmRsZXIuCisJICovCisJbWFzayAmPSB+T01BUF9MQ0RDX0lSUV9ET05FOworCWwgJj0gfm1hc2s7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbnRyb2xsZXIodm9pZCkKK3sKKwlpbml0X2NvbXBsZXRpb24oJmxjZGMubGFzdF9mcmFtZV9jb21wbGV0ZSk7CisJZGlzYWJsZV9jb250cm9sbGVyX2FzeW5jKCk7CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmxjZGMubGFzdF9mcmFtZV9jb21wbGV0ZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKQorCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2NvbnRyb2xsZXIodTMyIHN0YXR1cykKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisKKwlkaXNhYmxlX2NvbnRyb2xsZXJfYXN5bmMoKTsKKwlyZXNldF9jb3VudCsrOworCWlmIChyZXNldF9jb3VudCA9PSAxIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF9qaWZmaWVzICsgSFopKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LAorCQkJICAicmVzZXR0aW5nIChzdGF0dXMgJSMwMTB4LHJlc2V0IGNvdW50ICVsdSlcbiIsCisJCQkgIHN0YXR1cywgcmVzZXRfY291bnQpOworCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCX0KKwlpZiAocmVzZXRfY291bnQgPCAxMDApIHsKKwkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwl9IGVsc2UgeworCQlyZXNldF9jb3VudCA9IDA7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LAorCQkJInRvbyBtYW55IHJlc2V0IGF0dGVtcHRzLCBnaXZpbmcgdXAuXG4iKTsKKwl9Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIExDRCBETUEgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IG1vZGUgc3BlY2lmaWVkIGJ5IHBhcmFtZXRlcnMKKyAqIGluIGxjZGMuZmJkZXYgYW5kIGZiZGV2LT52YXIuCisgKi8KK3N0YXRpYyB2b2lkIHNldHVwX2xjZF9kbWEodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IGRtYV9lbGVtX3R5cGVbXSA9IHsKKwkJMCwKKwkJT01BUF9ETUFfREFUQV9UWVBFX1M4LAorCQlPTUFQX0RNQV9EQVRBX1RZUEVfUzE2LAorCQkwLAorCQlPTUFQX0RNQV9EQVRBX1RZUEVfUzMyLAorCX07CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gbGNkYy5mYmRldi0+ZmJfaW5mb1swXS0+cGFyOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmxjZGMuZmJkZXYtPmZiX2luZm9bMF0tPnZhcjsKKwl1bnNpZ25lZCBsb25nCXNyYzsKKwlpbnQJCWVzaXplLCB4ZWxlbSwgeWVsZW07CisKKwlzcmMgPSBsY2RjLnZyYW1fcGh5cyArIGxjZGMuZnJhbWVfb2Zmc2V0OworCisJc3dpdGNoICh2YXItPnJvdGF0ZSkgeworCWNhc2UgMDoKKwkJaWYgKHBsYW5lLT5pbmZvLm1pcnJvciB8fCAoc3JjICYgMykgfHwKKwkJICAgIGxjZGMuY29sb3JfbW9kZSA9PSBPTUFQRkJfQ09MT1JfWVVWNDIwIHx8CisJCSAgICAobGNkYy54cmVzICYgMSkpCisJCQllc2l6ZSA9IDI7CisJCWVsc2UKKwkJCWVzaXplID0gNDsKKwkJeGVsZW0gPSBsY2RjLnhyZXMgKiBsY2RjLmJwcCAvIDggLyBlc2l6ZTsKKwkJeWVsZW0gPSBsY2RjLnlyZXM7CisJCWJyZWFrOworCWNhc2UgOTA6CisJY2FzZSAxODA6CisJY2FzZSAyNzA6CisJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQkJQlVHKCk7CisJCX0KKwkJZXNpemUgPSAyOworCQl4ZWxlbSA9IGxjZGMueXJlcyAqIGxjZGMuYnBwIC8gMTY7CisJCXllbGVtID0gbGNkYy54cmVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsCisJCSAic2V0dXBfZG1hOiBzcmMgJSMwMTBseCBlc2l6ZSAlZCB4ZWxlbSAlZCB5ZWxlbSAlZFxuIiwKKwkJIHNyYywgZXNpemUsIHhlbGVtLCB5ZWxlbSk7CisjZW5kaWYKKwlvbWFwX3NldF9sY2RfZG1hX2IxKHNyYywgeGVsZW0sIHllbGVtLCBkbWFfZWxlbV90eXBlW2VzaXplXSk7CisJaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkgeworCQlpbnQgYnBwID0gbGNkYy5icHA7CisKKwkJLyoKKwkJICogWVVWIHN1cHBvcnQgaXMgb25seSBmb3IgZXh0ZXJuYWwgbW9kZSB3aGVuIHdlIGhhdmUgdGhlCisJCSAqIFlVViB3aW5kb3cgZW1iZWRkZWQgaW4gYSAxNmJwcCBmcmFtZSBidWZmZXIuCisJCSAqLworCQlpZiAobGNkYy5jb2xvcl9tb2RlID09IE9NQVBGQl9DT0xPUl9ZVVY0MjApCisJCQlicHAgPSAxNjsKKwkJLyogU2V0IHZpcnR1YWwgeHJlcyBlbGVtIHNpemUgKi8KKwkJb21hcF9zZXRfbGNkX2RtYV9iMV92eHJlcygKKwkJCWxjZGMuc2NyZWVuX3dpZHRoICogYnBwIC8gOCAvIGVzaXplKTsKKwkJLyogU2V0dXAgdHJhbnNmb3JtYXRpb25zICovCisJCW9tYXBfc2V0X2xjZF9kbWFfYjFfcm90YXRpb24odmFyLT5yb3RhdGUpOworCQlvbWFwX3NldF9sY2RfZG1hX2IxX21pcnJvcihwbGFuZS0+aW5mby5taXJyb3IpOworCX0KKwlvbWFwX3NldHVwX2xjZF9kbWEoKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxjZGNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIChPTUFQX0xDRENfU1RBVF9GVUYgfCBPTUFQX0xDRENfU1RBVF9TWU5DX0xPU1QpKQorCQlyZXNldF9jb250cm9sbGVyKHN0YXR1cyk7CisJZWxzZSB7CisJCWlmIChzdGF0dXMgJiBPTUFQX0xDRENfU1RBVF9ET05FKSB7CisJCQl1MzIgbDsKKworCQkJLyoKKwkJCSAqIERpc2FibGUgSVJRX0RPTkUuIFRoZSBzdGF0dXMgYml0IHdpbGwgYmUgY2xlYXJlZAorCQkJICogb25seSB3aGVuIHRoZSBjb250cm9sbGVyIGlzIHJlZW5hYmxlZCBhbmQgd2UgZG9uJ3QKKwkJCSAqIHdhbnQgdG8gZ2V0IG1vcmUgaW50ZXJydXB0cy4KKwkJCSAqLworCQkJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCQkJbCAmPSB+T01BUF9MQ0RDX0lSUV9ET05FOworCQkJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworCQkJY29tcGxldGUoJmxjZGMubGFzdF9mcmFtZV9jb21wbGV0ZSk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIE9NQVBfTENEQ19TVEFUX0xPQURFRF9QQUxFVFRFKSB7CisJCQlkaXNhYmxlX2NvbnRyb2xsZXJfYXN5bmMoKTsKKwkJCWNvbXBsZXRlKCZsY2RjLnBhbGV0dGVfbG9hZF9jb21wbGV0ZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZXNlIGludGVycnVwdCBzdGF0dXMgYml0cy4KKwkgKiBTeW5jX2xvc3QsIEZVRiBiaXRzIHdlcmUgY2xlYXJlZCBieSBkaXNhYmxpbmcgdGhlIExDRCBjb250cm9sbGVyCisJICogTE9BREVEX1BBTEVUVEUgY2FuIGJlIGNsZWFyZWQgdGhpcyB3YXkgb25seSBpbiBwYWxldHRlIG9ubHkKKwkgKiBsb2FkIG1vZGUuIEluIG90aGVyIGxvYWQgbW9kZXMgaXQncyBjbGVhcmVkIGJ5IGRpc2FibGluZyB0aGUKKwkgKiBjb250cm9sbGVyLgorCSAqLworCXN0YXR1cyAmPSB+KE9NQVBfTENEQ19TVEFUX1ZTWU5DIHwKKwkJICAgIE9NQVBfTENEQ19TVEFUX0xPQURFRF9QQUxFVFRFIHwKKwkJICAgIE9NQVBfTENEQ19TVEFUX0FCQyB8CisJCSAgICBPTUFQX0xDRENfU1RBVF9MSU5FX0lOVCk7CisJb21hcF93cml0ZWwoc3RhdHVzLCBPTUFQX0xDRENfU1RBVFVTKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBDaGFuZ2UgdG8gYSBuZXcgdmlkZW8gbW9kZS4gV2UgZGVmZXIgdGhpcyB0byBhIGxhdGVyIHRpbWUgdG8gYXZvaWQgYW55CisgKiBmbGlja2VyIGFuZCBub3QgdG8gbWVzcyB1cCB0aGUgY3VycmVudCBMQ0QgRE1BIGNvbnRleHQuIEZvciB0aGlzIHdlIGRpc2FibGUKKyAqIHRoZSBMQ0QgY29udHJvbGVyLCB3aGljaCB3aWxsIGdlbmVyYXRlIGEgRE9ORSBpcnEgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgaGFzCisgKiBiZWVuIHRyYW5zZmVycmVkLiBUaGVuIGl0J2xsIGJlIHNhZmUgdG8gcmVjb25maWd1cmUgYm90aCB0aGUgTENEIGNvbnRyb2xsZXIKKyAqIGFzIHdlbGwgYXMgdGhlIExDRCBETUEuCisgKi8KK3N0YXRpYyBpbnQgb21hcF9sY2RjX3NldHVwX3BsYW5lKGludCBwbGFuZSwgaW50IGNoYW5uZWxfb3V0LAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgaW50IGNvbG9yX21vZGUpCit7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmbGNkYy5mYmRldi0+ZmJfaW5mb1swXS0+dmFyOworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gbGNkYy5mYmRldi0+cGFuZWw7CisJaW50IHJvdF94LCByb3RfeTsKKworCWlmICh2YXItPnJvdGF0ZSA9PSAwKSB7CisJCXJvdF94ID0gcGFuZWwtPnhfcmVzOworCQlyb3RfeSA9IHBhbmVsLT55X3JlczsKKwl9IGVsc2UgeworCQlyb3RfeCA9IHBhbmVsLT55X3JlczsKKwkJcm90X3kgPSBwYW5lbC0+eF9yZXM7CisJfQorCWlmIChwbGFuZSAhPSAwIHx8IGNoYW5uZWxfb3V0ICE9IDAgfHwgcG9zX3ggIT0gMCB8fCBwb3NfeSAhPSAwIHx8CisJICAgIHdpZHRoID4gcm90X3ggfHwgaGVpZ2h0ID4gcm90X3kpIHsKKyNpZmRlZiBWRVJCT1NFCisJCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LAorCQkJImludmFsaWQgcGxhbmUgcGFyYW1zIHBsYW5lICVkIHBvc194ICVkIHBvc195ICVkICIKKwkJCSJ3ICVkIGggJWRcbiIsIHBsYW5lLCBwb3NfeCwgcG9zX3ksIHdpZHRoLCBoZWlnaHQpOworI2VuZGlmCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxjZGMuZnJhbWVfb2Zmc2V0ID0gb2Zmc2V0OworCWxjZGMueHJlcyA9IHdpZHRoOworCWxjZGMueXJlcyA9IGhlaWdodDsKKwlsY2RjLnNjcmVlbl93aWR0aCA9IHNjcmVlbl93aWR0aDsKKwlsY2RjLmNvbG9yX21vZGUgPSBjb2xvcl9tb2RlOworCisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOgorCQlsY2RjLmJwcCA9IDg7CisJCWxjZGMucGFsZXR0ZV9jb2RlID0gMHgzMDAwOworCQlsY2RjLnBhbGV0dGVfc2l6ZSA9IDUxMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQlsY2RjLmJwcCA9IDE2OworCQlsY2RjLnBhbGV0dGVfY29kZSA9IDB4NDAwMDsKKwkJbGNkYy5wYWxldHRlX3NpemUgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNDQ0OgorCQlsY2RjLmJwcCA9IDE2OworCQlsY2RjLnBhbGV0dGVfY29kZSA9IDB4NDAwMDsKKwkJbGNkYy5wYWxldHRlX3NpemUgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQlpZiAobGNkYy5leHRfbW9kZSkgeworCQkJbGNkYy5icHAgPSAxMjsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQlpZiAobGNkYy5leHRfbW9kZSkgeworCQkJbGNkYy5icHAgPSAxNjsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJLyogRklYTUU6IG90aGVyIEJQUHMuCisJCSAqIGJwcDE6IGNvZGUgIDAsICAgICBzaXplIDI1NgorCQkgKiBicHAyOiBjb2RlICAweDEwMDAgc2l6ZSAyNTYKKwkJICogYnBwNDogY29kZSAgMHgyMDAwIHNpemUgMjU2CisJCSAqIGJwcDEyOiBjb2RlIDB4NDAwMCBzaXplIDMyCisJCSAqLworCQlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwgImludmFsaWQgY29sb3IgbW9kZSAlZFxuIiwgY29sb3JfbW9kZSk7CisJCUJVRygpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGxjZGMuZXh0X21vZGUpIHsKKwkJc2V0dXBfbGNkX2RtYSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGNkYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJZGlzYWJsZV9jb250cm9sbGVyKCk7CisJCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJCXNldHVwX2xjZF9kbWEoKTsKKwkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2xjZGNfZW5hYmxlX3BsYW5lKGludCBwbGFuZSwgaW50IGVuYWJsZSkKK3sKKwlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwKKwkJInBsYW5lICVkIGVuYWJsZSAlZCB1cGRhdGVfbW9kZSAlZCBleHRfbW9kZSAlZFxuIiwKKwkJcGxhbmUsIGVuYWJsZSwgbGNkYy51cGRhdGVfbW9kZSwgbGNkYy5leHRfbW9kZSk7CisJaWYgKHBsYW5lICE9IE9NQVBGQl9QTEFORV9HRlgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIExDRCBETUEgZm9yIGEgcGFsZXR0ZSBsb2FkIG9wZXJhdGlvbiBhbmQgZG8gdGhlIHBhbGV0dGUKKyAqIGRvd25sb2FkaW5nIHN5bmNocm9ub3VzbHkuIFdlIGRvbid0IHVzZSB0aGUgZnJhbWUrcGFsZXR0ZSBsb2FkIG1vZGUgb2YKKyAqIHRoZSBjb250cm9sbGVyLCBzaW5jZSB0aGUgcGFsZXR0ZSBjYW4gYWx3YXlzIGJlIGRvd25sb2FkZWQgc2VwZXJhdGVseS4KKyAqLworc3RhdGljIHZvaWQgbG9hZF9wYWxldHRlKHZvaWQpCit7CisJdTE2CSpwYWxldHRlOworCisJcGFsZXR0ZSA9ICh1MTYgKilsY2RjLnBhbGV0dGVfdmlydDsKKworCSoodTE2ICopcGFsZXR0ZSAmPSAweDBmZmY7CisJKih1MTYgKilwYWxldHRlIHw9IGxjZGMucGFsZXR0ZV9jb2RlOworCisJb21hcF9zZXRfbGNkX2RtYV9iMShsY2RjLnBhbGV0dGVfcGh5cywKKwkJbGNkYy5wYWxldHRlX3NpemUgLyA0ICsgMSwgMSwgT01BUF9ETUFfREFUQV9UWVBFX1MzMik7CisKKwlvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcigxKTsKKwlvbWFwX3NldHVwX2xjZF9kbWEoKTsKKworCWluaXRfY29tcGxldGlvbigmbGNkYy5wYWxldHRlX2xvYWRfY29tcGxldGUpOworCWVuYWJsZV9pcnFzKE9NQVBfTENEQ19JUlFfTE9BREVEX1BBTEVUVEUpOworCXNldF9sb2FkX21vZGUoT01BUF9MQ0RDX0xPQURfUEFMRVRURSk7CisJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbGNkYy5wYWxldHRlX2xvYWRfY29tcGxldGUsCisJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKSkKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOworCS8qIFRoZSBjb250cm9sbGVyIGdldHMgZGlzYWJsZWQgaW4gdGhlIGlycSBoYW5kbGVyICovCisJZGlzYWJsZV9pcnFzKE9NQVBfTENEQ19JUlFfTE9BREVEX1BBTEVUVEUpOworCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisKKwlvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihsY2RjLmV4dF9tb2RlKTsKK30KKworLyogVXNlZCBvbmx5IGluIGludGVybmFsIGNvbnRyb2xsZXIgbW9kZSAqLworc3RhdGljIGludCBvbWFwX2xjZGNfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1MTYgcmVkLCB1MTYgZ3JlZW4sIHUxNiBibHVlLAorCQkJICAgICAgIHUxNiB0cmFuc3AsIGludCB1cGRhdGVfaHdfcGFsKQoreworCXUxNiAqcGFsZXR0ZTsKKworCWlmIChsY2RjLmNvbG9yX21vZGUgIT0gT01BUEZCX0NPTE9SX0NMVVRfOEJQUCB8fCByZWdubyA+IDI1NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYWxldHRlID0gKHUxNiAqKWxjZGMucGFsZXR0ZV92aXJ0OworCisJcGFsZXR0ZVtyZWdub10gJj0gfjB4MGZmZjsKKwlwYWxldHRlW3JlZ25vXSB8PSAoKHJlZCA+PiAxMikgPDwgOCkgfCAoKGdyZWVuID4+IDEyKSA8PCA0ICkgfAorCQkJICAgKGJsdWUgPj4gMTIpOworCisJaWYgKHVwZGF0ZV9od19wYWwpIHsKKwkJZGlzYWJsZV9jb250cm9sbGVyKCk7CisJCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJCWxvYWRfcGFsZXR0ZSgpOworCQlzZXR1cF9sY2RfZG1hKCk7CisJCXNldF9sb2FkX21vZGUoT01BUF9MQ0RDX0xPQURfRlJBTUUpOworCQllbmFibGVfY29udHJvbGxlcigpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2NrX2RpdihpbnQgaXNfdGZ0LCBpbnQgcGNrLCBpbnQgKnBja19kaXYpCit7CisJdW5zaWduZWQgbG9uZyBsY2s7CisKKwlwY2sgPSBtYXgoMSwgcGNrKTsKKwlsY2sgPSBjbGtfZ2V0X3JhdGUobGNkYy5sY2RfY2spOworCSpwY2tfZGl2ID0gKGxjayArIHBjayAtIDEpIC8gcGNrOworCWlmIChpc190ZnQpCisJCSpwY2tfZGl2ID0gbWF4KDIsICpwY2tfZGl2KTsKKwllbHNlCisJCSpwY2tfZGl2ID0gbWF4KDMsICpwY2tfZGl2KTsKKwlpZiAoKnBja19kaXYgPiAyNTUpIHsKKwkJLyogRklYTUU6IHRyeSB0byBhZGp1c3QgbG9naWMgY2xvY2sgZGl2aWRlciBhcyB3ZWxsICovCisJCSpwY2tfZGl2ID0gMjU1OworCQlkZXZfd2FybihsY2RjLmZiZGV2LT5kZXYsICJwaXhjbG9jayAlZCBrSHogdG9vIGxvdy5cbiIsCisJCQkgcGNrIC8gMTAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgc2V0dXBfcmVncyh2b2lkKQoreworCXUzMiBsOworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gbGNkYy5mYmRldi0+cGFuZWw7CisJaW50IGlzX3RmdCA9IHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfUEFORUxfVEZUOworCXVuc2lnbmVkIGxvbmcgbGNrOworCWludCBwY2Q7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJbCAmPSB+T01BUF9MQ0RDX0NUUkxfTENEX1RGVDsKKwlsIHw9IGlzX3RmdCA/IE9NQVBfTENEQ19DVFJMX0xDRF9URlQgOiAwOworI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEFMTVRFCisvKiBGSVhNRTppZiAobWFjaGluZV9pc19vbWFwX3BhbG10ZSgpKSB7ICovCisJCS8qIFBhbG1URSB1c2VzIGFsdGVybmF0ZSBURlQgc2V0dGluZyBpbiA4QlBQIG1vZGUgKi8KKwkJbCB8PSAoaXNfdGZ0ICYmIHBhbmVsLT5icHAgPT0gOCkgPyAweDgxMDAwMCA6IDA7CisvKgl9ICovCisjZW5kaWYKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfVElNSU5HMik7CisJbCAmPSB+KCgoMSA8PCA2KSAtIDEpIDw8IDIwKTsKKwlsIHw9IChwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1NJR05BTF9NQVNLKSA8PCAyMDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMik7CisKKwlsID0gcGFuZWwtPnhfcmVzIC0gMTsKKwlsIHw9IChwYW5lbC0+aHN3IC0gMSkgPDwgMTA7CisJbCB8PSAocGFuZWwtPmhmcCAtIDEpIDw8IDE2OworCWwgfD0gKHBhbmVsLT5oYnAgLSAxKSA8PCAyNDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMCk7CisKKwlsID0gcGFuZWwtPnlfcmVzIC0gMTsKKwlsIHw9IChwYW5lbC0+dnN3IC0gMSkgPDwgMTA7CisJbCB8PSBwYW5lbC0+dmZwIDw8IDE2OworCWwgfD0gcGFuZWwtPnZicCA8PCAyNDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMSk7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfVElNSU5HMik7CisJbCAmPSB+MHhmZjsKKworCWxjayA9IGNsa19nZXRfcmF0ZShsY2RjLmxjZF9jayk7CisKKwlpZiAoIXBhbmVsLT5wY2QpCisJCWNhbGNfY2tfZGl2KGlzX3RmdCwgcGFuZWwtPnBpeGVsX2Nsb2NrICogMTAwMCwgJnBjZCk7CisJZWxzZSB7CisJCWRldl93YXJuKGxjZGMuZmJkZXYtPmRldiwKKwkJICAgICJQaXhlbCBjbG9jayBkaXZpZGVyIHZhbHVlIGlzIG9ic29sZXRlLlxuIgorCQkgICAgIlRyeSB0byBzZXQgcGl4ZWxfY2xvY2sgdG8gJWx1IGFuZCBwY2QgdG8gMCAiCisJCSAgICAiaW4gZHJpdmVycy92aWRlby9vbWFwL2xjZF8lcy5jIGFuZCBzdWJtaXQgYSBwYXRjaC5cbiIsCisJCQlsY2sgLyBwYW5lbC0+cGNkIC8gMTAwMCwgcGFuZWwtPm5hbWUpOworCisJCXBjZCA9IHBhbmVsLT5wY2Q7CisJfQorCWwgfD0gcGNkICYgMHhmZjsKKwlsIHw9IHBhbmVsLT5hY2IgPDwgODsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMik7CisKKwkvKiB1cGRhdGUgcGFuZWwgaW5mbyB3aXRoIHRoZSBleGFjdCBjbG9jayAqLworCXBhbmVsLT5waXhlbF9jbG9jayA9IGxjayAvIHBjZCAvIDEwMDA7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIExDRCBjb250cm9sbGVyLCBkb3dubG9hZCB0aGUgY29sb3IgcGFsZXR0ZSBhbmQgc3RhcnQgYSBsb29wZWQKKyAqIERNQSB0cmFuc2ZlciBvZiB0aGUgZnJhbWUgaW1hZ2UgZGF0YS4gQ2FsbGVkIG9ubHkgaW4gaW50ZXJuYWwKKyAqIGNvbnRyb2xsZXIgbW9kZS4KKyAqLworc3RhdGljIGludCBvbWFwX2xjZGNfc2V0X3VwZGF0ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaW50IHIgPSAwOworCisJaWYgKG1vZGUgIT0gbGNkYy51cGRhdGVfbW9kZSkgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCQlzZXR1cF9yZWdzKCk7CisJCQlsb2FkX3BhbGV0dGUoKTsKKworCQkJLyogU2V0dXAgYW5kIHN0YXJ0IExDRCBETUEgKi8KKwkJCXNldHVwX2xjZF9kbWEoKTsKKworCQkJc2V0X2xvYWRfbW9kZShPTUFQX0xDRENfTE9BRF9GUkFNRSk7CisJCQllbmFibGVfaXJxcyhPTUFQX0xDRENfSVJRX0RPTkUpOworCQkJLyogVGhpcyB3aWxsIHN0YXJ0IHRoZSBhY3R1YWwgRE1BIHRyYW5zZmVyICovCisJCQllbmFibGVfY29udHJvbGxlcigpOworCQkJbGNkYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQlicmVhazsKKwkJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQkJZGlzYWJsZV9jb250cm9sbGVyKCk7CisJCQlvbWFwX3N0b3BfbGNkX2RtYSgpOworCQkJbGNkYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXIgPSAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBvbWFwX2xjZGNfZ2V0X3VwZGF0ZV9tb2RlKHZvaWQpCit7CisJcmV0dXJuIGxjZGMudXBkYXRlX21vZGU7Cit9CisKKy8qIFBNIGNvZGUgY2FsbGVkIG9ubHkgaW4gaW50ZXJuYWwgY29udHJvbGxlciBtb2RlICovCitzdGF0aWMgdm9pZCBvbWFwX2xjZGNfc3VzcGVuZCh2b2lkKQoreworCWlmIChsY2RjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19yZXN1bWUodm9pZCkKK3sKKwlpZiAobGNkYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJc2V0dXBfcmVncygpOworCQlsb2FkX3BhbGV0dGUoKTsKKwkJc2V0dXBfbGNkX2RtYSgpOworCQlzZXRfbG9hZF9tb2RlKE9NQVBfTENEQ19MT0FEX0ZSQU1FKTsKKwkJZW5hYmxlX2lycXMoT01BUF9MQ0RDX0lSUV9ET05FKTsKKwkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwlyZXR1cm47Cit9CisKK2ludCBvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCUJVR19PTihjYWxsYmFjayA9PSBOVUxMKTsKKworCWlmIChsY2RjLmRtYV9jYWxsYmFjaykKKwkJcmV0dXJuIC1FQlVTWTsKKwllbHNlIHsKKwkJbGNkYy5kbWFfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJbGNkYy5kbWFfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayk7CisKK3ZvaWQgb21hcF9sY2RjX2ZyZWVfZG1hX2NhbGxiYWNrKHZvaWQpCit7CisJbGNkYy5kbWFfY2FsbGJhY2sgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2spOworCitzdGF0aWMgdm9pZCBsY2RjX2RtYV9oYW5kbGVyKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJaWYgKGxjZGMuZG1hX2NhbGxiYWNrKQorCQlsY2RjLmRtYV9jYWxsYmFjayhsY2RjLmRtYV9jYWxsYmFja19kYXRhKTsKK30KKworc3RhdGljIGludCBtbWFwX2tlcm4odm9pZCkKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0CSprdm1hOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAl2bWE7CisJcGdwcm90X3QJCXBncHJvdDsKKwl1bnNpZ25lZCBsb25nCQl2YWRkcjsKKworCWt2bWEgPSBnZXRfdm1fYXJlYShsY2RjLnZyYW1fc2l6ZSwgVk1fSU9SRU1BUCk7CisJaWYgKGt2bWEgPT0gTlVMTCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBrZXJuZWwgdm0gYXJlYVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2bWEudm1fbW0gPSAmaW5pdF9tbTsKKworCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpa3ZtYS0+YWRkcjsKKwl2bWEudm1fc3RhcnQgPSB2YWRkcjsKKwl2bWEudm1fZW5kID0gdmFkZHIgKyBsY2RjLnZyYW1fc2l6ZTsKKworCXBncHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUocGdwcm90X2tlcm5lbCk7CisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSgmdm1hLCB2YWRkciwKKwkJCSAgIGxjZGMudnJhbV9waHlzID4+IFBBR0VfU0hJRlQsCisJCQkgICBsY2RjLnZyYW1fc2l6ZSwgcGdwcm90KSA8IDApIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJrZXJuZWwgbW1hcCBmb3IgRkIgbWVtb3J5IGZhaWxlZFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWxjZGMudnJhbV92aXJ0ID0gKHZvaWQgKil2YWRkcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9rZXJuKHZvaWQpCit7CisJdnVubWFwKGxjZGMudnJhbV92aXJ0KTsKK30KKworc3RhdGljIGludCBhbGxvY19wYWxldHRlX3JhbSh2b2lkKQoreworCWxjZGMucGFsZXR0ZV92aXJ0ID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShsY2RjLmZiZGV2LT5kZXYsCisJCU1BWF9QQUxFVFRFX1NJWkUsICZsY2RjLnBhbGV0dGVfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKGxjZGMucGFsZXR0ZV92aXJ0ID09IE5VTEwpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgcGFsZXR0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGxjZGMucGFsZXR0ZV92aXJ0LCAwLCBNQVhfUEFMRVRURV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BhbGV0dGVfcmFtKHZvaWQpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwgTUFYX1BBTEVUVEVfU0laRSwKKwkJCWxjZGMucGFsZXR0ZV92aXJ0LCBsY2RjLnBhbGV0dGVfcGh5cyk7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJaW50IGJwcDsKKwlpbnQgZnJhbWVfc2l6ZTsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGxjZGMuZmJkZXYtPnBhbmVsOworCisJYnBwID0gcGFuZWwtPmJwcDsKKwlpZiAoYnBwID09IDEyKQorCQlicHAgPSAxNjsKKwlmcmFtZV9zaXplID0gUEFHRV9BTElHTihwYW5lbC0+eF9yZXMgKiBicHAgLyA4ICogcGFuZWwtPnlfcmVzKTsKKwlpZiAocmVnaW9uLT5zaXplID4gZnJhbWVfc2l6ZSkKKwkJZnJhbWVfc2l6ZSA9IHJlZ2lvbi0+c2l6ZTsKKwlsY2RjLnZyYW1fc2l6ZSA9IGZyYW1lX3NpemU7CisJbGNkYy52cmFtX3ZpcnQgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwKKwkJCWxjZGMudnJhbV9zaXplLCAmbGNkYy52cmFtX3BoeXMsIEdGUF9LRVJORUwpOworCWlmIChsY2RjLnZyYW1fdmlydCA9PSBOVUxMKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIEZCIERNQSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVnaW9uLT5zaXplID0gZnJhbWVfc2l6ZTsKKwlyZWdpb24tPnBhZGRyID0gbGNkYy52cmFtX3BoeXM7CisJcmVnaW9uLT52YWRkciA9IGxjZGMudnJhbV92aXJ0OworCXJlZ2lvbi0+YWxsb2MgPSAxOworCisJbWVtc2V0KGxjZGMudnJhbV92aXJ0LCAwLCBsY2RjLnZyYW1fc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9mYm1lbSh2b2lkKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZShsY2RjLmZiZGV2LT5kZXYsIGxjZGMudnJhbV9zaXplLAorCQkJICAgICAgbGNkYy52cmFtX3ZpcnQsIGxjZGMudnJhbV9waHlzKTsKK30KKworc3RhdGljIGludCBzZXR1cF9mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfbWQpCit7CisJaW50IHI7CisKKwlpZiAoIXJlcV9tZC0+cmVnaW9uX2NudCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgIm5vIG1lbW9yeSByZWdpb25zIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVxX21kLT5yZWdpb25fY250ID4gMSkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgIm9ubHkgb25lIHBsYW5lIGlzIHN1cHBvcnRlZFxuIik7CisJCXJlcV9tZC0+cmVnaW9uX2NudCA9IDE7CisJfQorCisJaWYgKHJlcV9tZC0+cmVnaW9uWzBdLnBhZGRyID09IDApIHsKKwkJbGNkYy5mYm1lbV9hbGxvY2F0ZWQgPSAxOworCQlpZiAoKHIgPSBhbGxvY19mYm1lbSgmcmVxX21kLT5yZWdpb25bMF0pKSA8IDApCisJCQlyZXR1cm4gcjsKKwkJcmV0dXJuIDA7CisJfQorCisJbGNkYy52cmFtX3BoeXMgPSByZXFfbWQtPnJlZ2lvblswXS5wYWRkcjsKKwlsY2RjLnZyYW1fc2l6ZSA9IHJlcV9tZC0+cmVnaW9uWzBdLnNpemU7CisKKwlpZiAoKHIgPSBtbWFwX2tlcm4oKSkgPCAwKQorCQlyZXR1cm4gcjsKKworCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LCAidnJhbSBhdCAlMDh4IHNpemUgJTA4bHggbWFwcGVkIHRvIDB4JXBcbiIsCisJCSBsY2RjLnZyYW1fcGh5cywgbGNkYy52cmFtX3NpemUsIGxjZGMudnJhbV92aXJ0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2ZibWVtKHZvaWQpCit7CisJaWYgKGxjZGMuZmJtZW1fYWxsb2NhdGVkKQorCQlmcmVlX2ZibWVtKCk7CisJZWxzZQorCQl1bm1hcF9rZXJuKCk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9sY2RjX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCQkgIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQoreworCWludCByOworCXUzMiBsOworCWludCByYXRlOworCXN0cnVjdCBjbGsgKnRjX2NrOworCisJbGNkYy5pcnFfbWFzayA9IDA7CisKKwlsY2RjLmZiZGV2ID0gZmJkZXY7CisJbGNkYy5leHRfbW9kZSA9IGV4dF9tb2RlOworCisJbCA9IDA7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworCisJLyogRklYTUU6CisJICogQWNjb3JkaW5nIHRvIGVycmF0YSBzb21lIHBsYXRmb3JtcyBoYXZlIGEgY2xvY2sgcmF0ZSBsaW1pdGlhdGlvbgorCSAqLworCWxjZGMubGNkX2NrID0gY2xrX2dldChOVUxMLCAibGNkX2NrIik7CisJaWYgKElTX0VSUihsY2RjLmxjZF9jaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFjY2VzcyBMQ0QgY2xvY2tcbiIpOworCQlyID0gUFRSX0VSUihsY2RjLmxjZF9jayk7CisJCWdvdG8gZmFpbDA7CisJfQorCisJdGNfY2sgPSBjbGtfZ2V0KE5VTEwsICJ0Y19jayIpOworCWlmIChJU19FUlIodGNfY2spKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBhY2Nlc3MgVEMgY2xvY2tcbiIpOworCQlyID0gUFRSX0VSUih0Y19jayk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJcmF0ZSA9IGNsa19nZXRfcmF0ZSh0Y19jayk7CisJY2xrX3B1dCh0Y19jayk7CisKKwlpZiAobWFjaGluZV9pc19hbXNfZGVsdGEoKSkKKwkJcmF0ZSAvPSA0OworCWlmIChtYWNoaW5lX2lzX29tYXBfaDMoKSkKKwkJcmF0ZSAvPSAzOworCXIgPSBjbGtfc2V0X3JhdGUobGNkYy5sY2RfY2ssIHJhdGUpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImZhaWxlZCB0byBhZGp1c3QgTENEIHJhdGVcbiIpOworCQlnb3RvIGZhaWwxOworCX0KKwljbGtfZW5hYmxlKGxjZGMubGNkX2NrKTsKKworCXIgPSByZXF1ZXN0X2lycShPTUFQX0xDRENfSVJRLCBsY2RjX2lycV9oYW5kbGVyLCAwLCBNT0RVTEVfTkFNRSwgZmJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgSVJRXG4iKTsKKwkJZ290byBmYWlsMjsKKwl9CisKKwlyID0gb21hcF9yZXF1ZXN0X2xjZF9kbWEobGNkY19kbWFfaGFuZGxlciwgTlVMTCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBMQ0QgRE1BXG4iKTsKKwkJZ290byBmYWlsMzsKKwl9CisKKwlvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihleHRfbW9kZSk7CisJb21hcF9zZXRfbGNkX2RtYV9leHRfY29udHJvbGxlcihleHRfbW9kZSk7CisKKwlpZiAoIWV4dF9tb2RlKQorCQlpZiAoKHIgPSBhbGxvY19wYWxldHRlX3JhbSgpKSA8IDApCisJCQlnb3RvIGZhaWw0OworCisJaWYgKChyID0gc2V0dXBfZmJtZW0ocmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZmFpbDU7CisKKwlwcl9pbmZvKCJvbWFwZmI6IExDREMgaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7CitmYWlsNToKKwlpZiAoIWV4dF9tb2RlKQorCQlmcmVlX3BhbGV0dGVfcmFtKCk7CitmYWlsNDoKKwlvbWFwX2ZyZWVfbGNkX2RtYSgpOworZmFpbDM6CisJZnJlZV9pcnEoT01BUF9MQ0RDX0lSUSwgbGNkYy5mYmRldik7CitmYWlsMjoKKwljbGtfZGlzYWJsZShsY2RjLmxjZF9jayk7CitmYWlsMToKKwljbGtfcHV0KGxjZGMubGNkX2NrKTsKK2ZhaWwwOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2xjZGNfY2xlYW51cCh2b2lkKQoreworCWlmICghbGNkYy5leHRfbW9kZSkKKwkJZnJlZV9wYWxldHRlX3JhbSgpOworCWNsZWFudXBfZmJtZW0oKTsKKwlvbWFwX2ZyZWVfbGNkX2RtYSgpOworCWZyZWVfaXJxKE9NQVBfTENEQ19JUlEsIGxjZGMuZmJkZXYpOworCWNsa19kaXNhYmxlKGxjZGMubGNkX2NrKTsKKwljbGtfcHV0KGxjZGMubGNkX2NrKTsKK30KKworY29uc3Qgc3RydWN0IGxjZF9jdHJsIG9tYXAxX2ludF9jdHJsID0geworCS5uYW1lCQkJPSAiaW50ZXJuYWwiLAorCS5pbml0CQkJPSBvbWFwX2xjZGNfaW5pdCwKKwkuY2xlYW51cAkJPSBvbWFwX2xjZGNfY2xlYW51cCwKKwkuZ2V0X2NhcHMJCT0gb21hcF9sY2RjX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBvbWFwX2xjZGNfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBvbWFwX2xjZGNfZ2V0X3VwZGF0ZV9tb2RlLAorCS51cGRhdGVfd2luZG93CQk9IE5VTEwsCisJLnN1c3BlbmQJCT0gb21hcF9sY2RjX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gb21hcF9sY2RjX3Jlc3VtZSwKKwkuc2V0dXBfcGxhbmUJCT0gb21hcF9sY2RjX3NldHVwX3BsYW5lLAorCS5lbmFibGVfcGxhbmUJCT0gb21hcF9sY2RjX2VuYWJsZV9wbGFuZSwKKwkuc2V0Y29scmVnCQk9IG9tYXBfbGNkY19zZXRjb2xyZWcsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuaCBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiNzMxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIExDRENfSAorI2RlZmluZSBMQ0RDX0gKKworaW50IG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOwordm9pZCBvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2sodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQwZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKQEAgLTAsMCArMSwxOTQxIEBACisvKgorICogRnJhbWVidWZmZXIgZHJpdmVyIGZvciBUSSBPTUFQIGJvYXJkcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogQWNrbm93bGVkZ2VtZW50czoKKyAqICAgQWxleCBNY01haW5zIDxhYW1AcmlkZ2VydW4uY29tPiAgICAgICAtIE9yaWdpbmFsIGRyaXZlcgorICogICBKdWhhIFlyam9sYSA8anVoYS55cmpvbGFAbm9raWEuY29tPiAgIC0gT3JpZ2luYWwgZHJpdmVyIGFuZCBpbXByb3ZlbWVudHMKKyAqICAgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+ICAtIGNoYW5nZXMgZm9yIDIuNiBrZXJuZWwgQVBJCisgKiAgIFRleGFzIEluc3RydW1lbnRzICAgICAgICAgICAgICAgICAgICAgLSBIMyBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmIiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQJZGVmX2FjY2VsOworc3RhdGljIHVuc2lnbmVkIGxvbmcJZGVmX3ZyYW1bT01BUEZCX1BMQU5FX05VTV07CitzdGF0aWMgaW50CQlkZWZfdnJhbV9jbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnhyZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnlyZXM7CitzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9yb3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9taXJyb3I7CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9NQU5VQUxfVVBEQVRFCitzdGF0aWMgaW50CQltYW51YWxfdXBkYXRlID0gMTsKKyNlbHNlCitzdGF0aWMgaW50CQltYW51YWxfdXBkYXRlOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpmYmRldl9wZGV2Oworc3RhdGljIHN0cnVjdCBsY2RfcGFuZWwJCSpmYmRldl9wYW5lbDsKK3N0YXRpYyBzdHJ1Y3Qgb21hcGZiX2RldmljZQkqb21hcGZiX2RldjsKKworc3RydWN0IGNhcHNfdGFibGVfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2Fwc190YWJsZV9zdHJ1Y3QgY3RybF9jYXBzW10gPSB7CisJeyBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFLCAgIm1hbnVhbCB1cGRhdGUiIH0sCisJeyBPTUFQRkJfQ0FQU19URUFSU1lOQywgICAgICAgInRlYXJpbmcgc3luY2hyb25pemF0aW9uIiB9LAorCXsgT01BUEZCX0NBUFNfUExBTkVfUkVMT0NBVEVfTUVNLCAicmVsb2NhdGUgcGxhbmUgbWVtb3J5IiB9LAorCXsgT01BUEZCX0NBUFNfUExBTkVfU0NBTEUsICAgICJzY2FsZSBwbGFuZSIgfSwKKwl7IE9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEUsICJwaXhlbCBkb3VibGUgd2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfV0lORE9XX1NDQUxFLCAgICJzY2FsZSB3aW5kb3ciIH0sCisJeyBPTUFQRkJfQ0FQU19XSU5ET1dfT1ZFUkxBWSwgIm92ZXJsYXkgd2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVCwgICJiYWNrbGlnaHQgc2V0dGluZyIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2Fwc190YWJsZV9zdHJ1Y3QgY29sb3JfY2Fwc1tdID0geworCXsgMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1LAkiUkdCNTY1IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMiwJIllVVjQyMiIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjAsCSJZVVY0MjAiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQLAkiQ0xVVDgiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF80QlBQLAkiQ0xVVDQiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQLAkiQ0xVVDIiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQLAkiQ0xVVDEiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfUkdCNDQ0LAkiUkdCNDQ0IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1lVWTQyMiwJIllVWTQyMiIsIH0sCit9OworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMQ0QgcGFuZWwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitleHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAxX2ludF9jdHJsOworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBvbWFwMl9pbnRfY3RybDsKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgaHdhNzQyX2N0cmw7CitleHRlcm4gc3RydWN0IGxjZF9jdHJsIGJsaXp6YXJkX2N0cmw7CisKK3N0YXRpYyBzdHJ1Y3QgbGNkX2N0cmwgKmN0cmxzW10gPSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKwkmb21hcDFfaW50X2N0cmwsCisjZWxzZQorCSZvbWFwMl9pbnRfY3RybCwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19IV0E3NDIKKwkmaHdhNzQyX2N0cmwsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0JMSVpaQVJECisJJmJsaXp6YXJkX2N0cmwsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDFfZXh0X2lmOworI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDJfZXh0X2lmOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIHZvaWQgb21hcGZiX3JxdWV1ZV9sb2NrKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwltdXRleF9sb2NrKCZmYmRldi0+cnF1ZXVlX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgb21hcGZiX3JxdWV1ZV91bmxvY2soc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCW11dGV4X3VubG9jaygmZmJkZXYtPnJxdWV1ZV9tdXRleCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExDRCBjb250cm9sbGVyIGFuZCBMQ0QgRE1BCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogTG9va3VwIHRhYmxlIHRvIG1hcCBlbGVtIHNpemUgdG8gZWxlbSB0eXBlLiAqLworc3RhdGljIGNvbnN0IGludCBkbWFfZWxlbV90eXBlW10gPSB7CisJMCwKKwlPTUFQX0RNQV9EQVRBX1RZUEVfUzgsCisJT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKKwkwLAorCU9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCit9OworCisvKgorICogQWxsb2NhdGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgTENEIGNvbnRyb2xsZXIgYW5kIExDRCBETUEgb3BlcmF0aW9ucy4gVmlkZW8KKyAqIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZnJvbSBzeXN0ZW0gbWVtb3J5IGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBkaXNwbGF5CisgKiBzaXplLCBleGNlcHQgaWYgYSBiaWdnZXIgbWVtb3J5IHNpemUgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgYXMgYSBrZXJuZWwKKyAqIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCBjdHJsX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCWludCBpOworCisJLyoga2VybmVsL21vZHVsZSB2cmFtIHBhcmFtZXRlcnMgb3ZlcnJpZGUgYm9vdCB0YWdzL2JvYXJkIGNvbmZpZyAqLworCWlmIChkZWZfdnJhbV9jbnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlZl92cmFtX2NudDsgaSsrKQorCQkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplID0KKwkJCQlQQUdFX0FMSUdOKGRlZl92cmFtW2ldKTsKKwkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQgPSBpOworCX0gZWxzZSB7CisJCXN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqY29uZjsKKworCQljb25mID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwkJZmJkZXYtPm1lbV9kZXNjID0gY29uZi0+bWVtX2Rlc2M7CisJfQorCisJaWYgKCFmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCkgeworCQlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKwkJaW50IGRlZl9zaXplOworCQlpbnQgYnBwID0gcGFuZWwtPmJwcDsKKworCQkvKiAxMiBicHAgaXMgcGFja2VkIGluIDE2IGJpdHMgKi8KKwkJaWYgKGJwcCA9PSAxMikKKwkJCWJwcCA9IDE2OworCQlkZWZfc2l6ZSA9IGRlZl92eHJlcyAqIGRlZl92eXJlcyAqIGJwcCAvIDg7CisJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250ID0gMTsKKwkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvblswXS5zaXplID0gUEFHRV9BTElHTihkZWZfc2l6ZSk7CisJfQorCXIgPSBmYmRldi0+Y3RybC0+aW5pdChmYmRldiwgMCwgJmZiZGV2LT5tZW1fZGVzYyk7CisJaWYgKHIgPCAwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICglZClcbiIsCisJCQlyKTsKKwkJcmV0dXJuIHI7CisJfQorCisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlkZXZfZGJnKGZiZGV2LT5kZXYsICJyZWdpb24lZCBwaHlzICUwOHggdmlydCAlcCBzaXplPSVsdVxuIiwKKwkJCSBpLAorCQkJIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0ucGFkZHIsCisJCQkgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS52YWRkciwKKwkJCSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnNpemUpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjdHJsX2NsZWFudXAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWZiZGV2LT5jdHJsLT5jbGVhbnVwKCk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggZmJkZXYtPnJxdWV1ZV9tdXRleCBoZWxkLiAqLworc3RhdGljIGludCBjdHJsX2NoYW5nZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJaW50IHI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmZiaS0+dmFyOworCisJb2Zmc2V0ID0gdmFyLT55b2Zmc2V0ICogZmJpLT5maXgubGluZV9sZW5ndGggKworCQkgdmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CisKKwlpZiAoZmJkZXYtPmN0cmwtPnN5bmMpCisJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJciA9IGZiZGV2LT5jdHJsLT5zZXR1cF9wbGFuZShwbGFuZS0+aWR4LCBwbGFuZS0+aW5mby5jaGFubmVsX291dCwKKwkJCQkgb2Zmc2V0LCB2YXItPnhyZXNfdmlydHVhbCwKKwkJCQkgcGxhbmUtPmluZm8ucG9zX3gsIHBsYW5lLT5pbmZvLnBvc195LAorCQkJCSB2YXItPnhyZXMsIHZhci0+eXJlcywgcGxhbmUtPmNvbG9yX21vZGUpOworCWlmIChmYmRldi0+Y3RybC0+c2V0X3NjYWxlICE9IE5VTEwpCisJCXIgPSBmYmRldi0+Y3RybC0+c2V0X3NjYWxlKHBsYW5lLT5pZHgsCisJCQkJICAgdmFyLT54cmVzLCB2YXItPnlyZXMsCisJCQkJICAgcGxhbmUtPmluZm8ub3V0X3dpZHRoLAorCQkJCSAgIHBsYW5lLT5pbmZvLm91dF9oZWlnaHQpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZiZGV2IGZyYW1ld29yayBjYWxsYmFja3MgYW5kIHRoZSBpb2N0bCBpbnRlcmZhY2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBDYWxsZWQgZWFjaCB0aW1lIHRoZSBvbWFwZmIgZGV2aWNlIGlzIG9wZW5lZCAqLworc3RhdGljIGludCBvbWFwZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworLyogQ2FsbGVkIHdoZW4gdGhlIG9tYXBmYiBkZXZpY2UgaXMgY2xvc2VkLiBXZSBtYWtlIHN1cmUgdGhhdCBhbnkgcGVuZGluZworICogZ2Z4IERNQSBvcGVyYXRpb25zIGFyZSBlbmRlZCwgYmVmb3JlIHdlIHJldHVybi4gKi8KK3N0YXRpYyBpbnQgb21hcGZiX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCW9tYXBmYl9zeW5jKGluZm8pOworCXJldHVybiAwOworfQorCisvKiBTdG9yZSBhIHNpbmdsZSBjb2xvciBwYWxldHRlIGVudHJ5IGludG8gYSBwc2V1ZG8gcGFsZXR0ZSBvciB0aGUgaGFyZHdhcmUKKyAqIHBhbGV0dGUgaWYgb25lIGlzIGF2YWlsYWJsZS4gRm9yIG5vdyB3ZSBzdXBwb3J0IG9ubHkgMTZicHAgYW5kIHRodXMgc3RvcmUKKyAqIHRoZSBlbnRyeSBvbmx5IHRvIHRoZSBwc2V1ZG8gcGFsZXR0ZS4KKyAqLworc3RhdGljIGludCBfc2V0Y29scmVnKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwKKwkJCXVfaW50IGJsdWUsIHVfaW50IHRyYW5zcCwgaW50IHVwZGF0ZV9od19wYWwpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CisJaW50IHIgPSAwOworCisJc3dpdGNoIChwbGFuZS0+Y29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOgorCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfNEJQUDoKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzJCUFA6CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQOgorCQlpZiAoZmJkZXYtPmN0cmwtPnNldGNvbHJlZykKKwkJCXIgPSBmYmRldi0+Y3RybC0+c2V0Y29scmVnKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAorCQkJCQkJCXRyYW5zcCwgdXBkYXRlX2h3X3BhbCk7CisJCS8qIEZhbGx0aHJvdWdoICovCisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCWNhc2UgT01BUEZCX0NPTE9SX1JHQjQ0NDoKKwkJaWYgKHIgIT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChyZWdubyA8IDApIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVnbm8gPCAxNikgeworCQkJdTE2IHBhbDsKKwkJCXBhbCA9ICgocmVkID4+ICgxNiAtIHZhci0+cmVkLmxlbmd0aCkpIDw8CisJCQkJCXZhci0+cmVkLm9mZnNldCkgfAorCQkJICAgICAgKChncmVlbiA+PiAoMTYgLSB2YXItPmdyZWVuLmxlbmd0aCkpIDw8CisJCQkJCXZhci0+Z3JlZW4ub2Zmc2V0KSB8CisJCQkgICAgICAoYmx1ZSA+PiAoMTYgLSB2YXItPmJsdWUubGVuZ3RoKSk7CisJCQkoKHUzMiAqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHBhbDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKKwkJCSAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiBfc2V0Y29scmVnKGluZm8sIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCB0cmFuc3AsIDEpOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRjbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgY291bnQsIGluZGV4LCByOworCXUxNiAqcmVkLCAqZ3JlZW4sICpibHVlLCAqdHJhbnNwOworCXUxNiB0cmFucyA9IDB4ZmZmZjsKKworCXJlZCAgICAgPSBjbWFwLT5yZWQ7CisJZ3JlZW4gICA9IGNtYXAtPmdyZWVuOworCWJsdWUgICAgPSBjbWFwLT5ibHVlOworCXRyYW5zcCAgPSBjbWFwLT50cmFuc3A7CisJaW5kZXggICA9IGNtYXAtPnN0YXJ0OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgY21hcC0+bGVuOyBjb3VudCsrKSB7CisJCWlmICh0cmFuc3ApCisJCQl0cmFucyA9ICp0cmFuc3ArKzsKKwkJciA9IF9zZXRjb2xyZWcoaW5mbywgaW5kZXgrKywgKnJlZCsrLCAqZ3JlZW4rKywgKmJsdWUrKywgdHJhbnMsCisJCQkJY291bnQgPT0gY21hcC0+bGVuIC0gMSk7CisJCWlmIChyICE9IDApCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfdXBkYXRlX2Z1bGxfc2NyZWVuKHN0cnVjdCBmYl9pbmZvICpmYmkpOworCitzdGF0aWMgaW50IG9tYXBmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCBkb191cGRhdGUgPSAwOworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJc3dpdGNoIChibGFuaykgeworCWNhc2UgVkVTQV9OT19CTEFOS0lORzoKKwkJaWYgKGZiZGV2LT5zdGF0ZSA9PSBPTUFQRkJfU1VTUEVOREVEKSB7CisJCQlpZiAoZmJkZXYtPmN0cmwtPnJlc3VtZSkKKwkJCQlmYmRldi0+Y3RybC0+cmVzdW1lKCk7CisJCQlmYmRldi0+cGFuZWwtPmVuYWJsZShmYmRldi0+cGFuZWwpOworCQkJZmJkZXYtPnN0YXRlID0gT01BUEZCX0FDVElWRTsKKwkJCWlmIChmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgPT0KKwkJCQkJT01BUEZCX01BTlVBTF9VUERBVEUpCisJCQkJZG9fdXBkYXRlID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZFU0FfUE9XRVJET1dOOgorCQlpZiAoZmJkZXYtPnN0YXRlID09IE9NQVBGQl9BQ1RJVkUpIHsKKwkJCWZiZGV2LT5wYW5lbC0+ZGlzYWJsZShmYmRldi0+cGFuZWwpOworCQkJaWYgKGZiZGV2LT5jdHJsLT5zdXNwZW5kKQorCQkJCWZiZGV2LT5jdHJsLT5zdXNwZW5kKCk7CisJCQlmYmRldi0+c3RhdGUgPSBPTUFQRkJfU1VTUEVOREVEOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXIgPSAtRUlOVkFMOworCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlpZiAociA9PSAwICYmIGRvX3VwZGF0ZSkKKwkJciA9IG9tYXBmYl91cGRhdGVfZnVsbF9zY3JlZW4oZmJpKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKGZiZGV2LT5jdHJsLT5zeW5jKQorCQlmYmRldi0+Y3RybC0+c3luYygpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKK30KKworLyoKKyAqIFNldCBmYl9pbmZvLmZpeCBmaWVsZHMgYW5kIGFsc28gdXBkYXRlcyBmYmRldi4KKyAqIFdoZW4gY2FsbGluZyB0aGlzIGZiX2luZm8udmFyIG11c3QgYmUgc2V0IHVwIGFscmVhZHkuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9mYl9maXgoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCA9ICZmYmktPmZpeDsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPnZhcjsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCWludCBicHA7CisKKwlyZyA9ICZwbGFuZS0+ZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XTsKKwlmYmktPnNjcmVlbl9iYXNlCT0gKGNoYXIgX19pb21lbSAqKXJnLT52YWRkcjsKKwlmaXgtPnNtZW1fc3RhcnQJCT0gcmctPnBhZGRyOworCWZpeC0+c21lbV9sZW4JCT0gcmctPnNpemU7CisKKwlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwlpZiAodmFyLT5ub25zdGQpCisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCWVsc2Ugc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxNjoKKwljYXNlIDEyOgorCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCS8qIDEyYnBwIGlzIHN0b3JlZCBpbiAxNiBiaXRzICovCisJCWJwcCA9IDE2OworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgNDoKKwljYXNlIDg6CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQlicmVhazsKKwl9CisJZml4LT5hY2NlbAkJPSBGQl9BQ0NFTF9PTUFQMTYxMDsKKwlmaXgtPmxpbmVfbGVuZ3RoCT0gdmFyLT54cmVzX3ZpcnR1YWwgKiBicHAgLyA4OworfQorCitzdGF0aWMgaW50IHNldF9jb2xvcl9tb2RlKHN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSwKKwkJCSAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisJc3dpdGNoICh2YXItPm5vbnN0ZCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gdmFyLT5ub25zdGQ7CisJCXJldHVybiAwOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDEyOworCQlwbGFuZS0+Y29sb3JfbW9kZSA9IHZhci0+bm9uc3RkOworCQlyZXR1cm4gMDsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSB2YXItPm5vbnN0ZDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxOgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzFCUFA7CisJCXJldHVybiAwOworCWNhc2UgMjoKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQOworCQlyZXR1cm4gMDsKKwljYXNlIDQ6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX0NMVVRfNEJQUDsKKwkJcmV0dXJuIDA7CisJY2FzZSA4OgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzhCUFA7CisJCXJldHVybiAwOworCWNhc2UgMTI6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfUkdCNDQ0OworCQlyZXR1cm4gMDsKKwljYXNlIDE2OgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9SR0I1NjU7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoKKyAqIENoZWNrIHRoZSB2YWx1ZXMgaW4gdmFyIGFnYWluc3Qgb3VyIGNhcGFiaWxpdGllcyBhbmQgaW4gY2FzZSBvZiBvdXQgb2YKKyAqIGJvdW5kIHZhbHVlcyB0cnkgdG8gYWRqdXN0IHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgc2V0X2ZiX3ZhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlpbnQJCWJwcDsKKwl1bnNpZ25lZCBsb25nCW1heF9mcmFtZV9zaXplOworCXVuc2lnbmVkIGxvbmcJbGluZV9zaXplOworCWludAkJeHJlc19taW4sIHhyZXNfbWF4OworCWludAkJeXJlc19taW4sIHlyZXNfbWF4OworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKworCWlmIChzZXRfY29sb3JfbW9kZShwbGFuZSwgdmFyKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwlpZiAocGxhbmUtPmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1JHQjQ0NCkKKwkJYnBwID0gMTY7CisKKwlzd2l0Y2ggKHZhci0+cm90YXRlKSB7CisJY2FzZSAwOgorCWNhc2UgMTgwOgorCQl4cmVzX21pbiA9IE9NQVBGQl9QTEFORV9YUkVTX01JTjsKKwkJeHJlc19tYXggPSBwYW5lbC0+eF9yZXM7CisJCXlyZXNfbWluID0gT01BUEZCX1BMQU5FX1lSRVNfTUlOOworCQl5cmVzX21heCA9IHBhbmVsLT55X3JlczsKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQl2YXItPnhyZXMgPSBwYW5lbC0+eF9yZXM7CisJCQl2YXItPnlyZXMgPSBwYW5lbC0+eV9yZXM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA5MDoKKwljYXNlIDI3MDoKKwkJeHJlc19taW4gPSBPTUFQRkJfUExBTkVfWVJFU19NSU47CisJCXhyZXNfbWF4ID0gcGFuZWwtPnlfcmVzOworCQl5cmVzX21pbiA9IE9NQVBGQl9QTEFORV9YUkVTX01JTjsKKwkJeXJlc19tYXggPSBwYW5lbC0+eF9yZXM7CisJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQkJdmFyLT54cmVzID0gcGFuZWwtPnlfcmVzOworCQkJdmFyLT55cmVzID0gcGFuZWwtPnhfcmVzOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2YXItPnhyZXMgPCB4cmVzX21pbikKKwkJdmFyLT54cmVzID0geHJlc19taW47CisJaWYgKHZhci0+eXJlcyA8IHlyZXNfbWluKQorCQl2YXItPnlyZXMgPSB5cmVzX21pbjsKKwlpZiAodmFyLT54cmVzID4geHJlc19tYXgpCisJCXZhci0+eHJlcyA9IHhyZXNfbWF4OworCWlmICh2YXItPnlyZXMgPiB5cmVzX21heCkKKwkJdmFyLT55cmVzID0geXJlc19tYXg7CisKKwlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CisJbWF4X2ZyYW1lX3NpemUgPSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdLnNpemU7CisJbGluZV9zaXplID0gdmFyLT54cmVzX3ZpcnR1YWwgKiBicHAgLyA4OworCWlmIChsaW5lX3NpemUgKiB2YXItPnlyZXNfdmlydHVhbCA+IG1heF9mcmFtZV9zaXplKSB7CisJCS8qIFRyeSB0byBrZWVwIHlyZXNfdmlydHVhbCBmaXJzdCAqLworCQlsaW5lX3NpemUgPSBtYXhfZnJhbWVfc2l6ZSAvIHZhci0+eXJlc192aXJ0dWFsOworCQl2YXItPnhyZXNfdmlydHVhbCA9IGxpbmVfc2l6ZSAqIDggLyBicHA7CisJCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykgeworCQkJLyogU3RpbGwgZG9lc24ndCBmaXQuIFNocmluayB5cmVzX3ZpcnR1YWwgdG9vICovCisJCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKKwkJCWxpbmVfc2l6ZSA9IHZhci0+eHJlcyAqIGJwcCAvIDg7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heF9mcmFtZV9zaXplIC8gbGluZV9zaXplOworCQl9CisJCS8qIFJlY2hlY2sgdGhpcywgYXMgdGhlIHZpcnR1YWwgc2l6ZSBjaGFuZ2VkLiAqLworCQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKKwkJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQorCQkJdmFyLT55cmVzID0gdmFyLT55cmVzX3ZpcnR1YWw7CisJCWlmICh2YXItPnhyZXMgPCB4cmVzX21pbiB8fCB2YXItPnlyZXMgPCB5cmVzX21pbikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodmFyLT54cmVzICsgdmFyLT54b2Zmc2V0ID4gdmFyLT54cmVzX3ZpcnR1YWwpCisJCXZhci0+eG9mZnNldCA9IHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXMgKyB2YXItPnlvZmZzZXQgPiB2YXItPnlyZXNfdmlydHVhbCkKKwkJdmFyLT55b2Zmc2V0ID0gdmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXM7CisJbGluZV9zaXplID0gdmFyLT54cmVzICogYnBwIC8gODsKKworCWlmIChwbGFuZS0+Y29sb3JfbW9kZSA9PSBPTUFQRkJfQ09MT1JfUkdCNDQ0KSB7CisJCXZhci0+cmVkLm9mZnNldAkgID0gODsgdmFyLT5yZWQubGVuZ3RoCSA9IDQ7CisJCQkJCQl2YXItPnJlZC5tc2JfcmlnaHQgICA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNDsgdmFyLT5ncmVlbi5sZW5ndGggPSA0OworCQkJCQkJdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOworCQl2YXItPmJsdWUub2Zmc2V0ICA9IDA7IHZhci0+Ymx1ZS5sZW5ndGggID0gNDsKKwkJCQkJCXZhci0+Ymx1ZS5tc2JfcmlnaHQgID0gMDsKKwl9IGVsc2UgeworCQl2YXItPnJlZC5vZmZzZXQJID0gMTE7IHZhci0+cmVkLmxlbmd0aAkgPSA1OworCQkJCQkJdmFyLT5yZWQubXNiX3JpZ2h0ICAgPSAwOworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7ICB2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCQkJCQl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOyAgdmFyLT5ibHVlLmxlbmd0aCAgPSA1OworCQkJCQkJdmFyLT5ibHVlLm1zYl9yaWdodCAgPSAwOworCX0KKworCXZhci0+aGVpZ2h0CQk9IC0xOworCXZhci0+d2lkdGgJCT0gLTE7CisJdmFyLT5ncmF5c2NhbGUJCT0gMDsKKworCS8qIHBpeGNsb2NrIGluIHBzLCB0aGUgcmVzdCBpbiBwaXhjbG9jayAqLworCXZhci0+cGl4Y2xvY2sJCT0gMTAwMDAwMDAgLyAocGFuZWwtPnBpeGVsX2Nsb2NrIC8gMTAwKTsKKwl2YXItPmxlZnRfbWFyZ2luCT0gcGFuZWwtPmhmcDsKKwl2YXItPnJpZ2h0X21hcmdpbgk9IHBhbmVsLT5oYnA7CisJdmFyLT51cHBlcl9tYXJnaW4JPSBwYW5lbC0+dmZwOworCXZhci0+bG93ZXJfbWFyZ2luCT0gcGFuZWwtPnZicDsKKwl2YXItPmhzeW5jX2xlbgkJPSBwYW5lbC0+aHN3OworCXZhci0+dnN5bmNfbGVuCQk9IHBhbmVsLT52c3c7CisKKwkvKiBUT0RPOiBnZXQgdGhlc2UgZnJvbSBwYW5lbC0+Y29uZmlnICovCisJdmFyLT52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCXZhci0+c3luYwkJPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworLyogU2V0IHJvdGF0aW9uICgwLCA5MCwgMTgwLCAyNzAgZGVncmVlKSwgYW5kIHN3aXRjaCB0byB0aGUgbmV3IG1vZGUuICovCitzdGF0aWMgdm9pZCBvbWFwZmJfcm90YXRlKHN0cnVjdCBmYl9pbmZvICpmYmksIGludCByb3RhdGUpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAoY3B1X2lzX29tYXAxNXh4KCkgJiYgcm90YXRlICE9IGZiaS0+dmFyLnJvdGF0ZSkgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKm5ld192YXIgPSAmZmJkZXYtPm5ld192YXI7CisKKwkJbWVtY3B5KG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCW5ld192YXItPnJvdGF0ZSA9IHJvdGF0ZTsKKwkJaWYgKHNldF9mYl92YXIoZmJpLCBuZXdfdmFyKSA9PSAwICYmCisJCSAgICBtZW1jbXAobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKSkgeworCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCQljdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJCX0KKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworfQorCisvKgorICogU2V0IG5ldyB4LHkgb2Zmc2V0cyBpbiB0aGUgdmlydHVhbCBkaXNwbGF5IGZvciB0aGUgdmlzaWJsZSBhcmVhIGFuZCBzd2l0Y2gKKyAqIHRvIHRoZSBuZXcgbW9kZS4KKyAqLworc3RhdGljIGludCBvbWFwZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHIgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAodmFyLT54b2Zmc2V0ICE9IGZiaS0+dmFyLnhvZmZzZXQgfHwKKwkgICAgdmFyLT55b2Zmc2V0ICE9IGZiaS0+dmFyLnlvZmZzZXQpIHsKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpuZXdfdmFyID0gJmZiZGV2LT5uZXdfdmFyOworCisJCW1lbWNweShuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQluZXdfdmFyLT54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCQluZXdfdmFyLT55b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OworCQlpZiAoc2V0X2ZiX3ZhcihmYmksIG5ld192YXIpKQorCQkJciA9IC1FSU5WQUw7CisJCWVsc2UgeworCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCQljdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJCX0KKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIFNldCBtaXJyb3IgdG8gdmVydGljYWwgYXhpcyBhbmQgc3dpdGNoIHRvIHRoZSBuZXcgbW9kZS4gKi8KK3N0YXRpYyBpbnQgb21hcGZiX21pcnJvcihzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgbWlycm9yKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCW1pcnJvciA9IG1pcnJvciA/IDEgOiAwOworCWlmIChjcHVfaXNfb21hcDE1eHgoKSkKKwkJciA9IC1FSU5WQUw7CisJZWxzZSBpZiAobWlycm9yICE9IHBsYW5lLT5pbmZvLm1pcnJvcikgeworCQlwbGFuZS0+aW5mby5taXJyb3IgPSBtaXJyb3I7CisJCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogQ2hlY2sgdmFsdWVzIGluIHZhciwgdHJ5IHRvIGFkanVzdCB0aGVtIGluIGNhc2Ugb2Ygb3V0IG9mIGJvdW5kIHZhbHVlcyBpZgorICogcG9zc2libGUsIG9yIHJldHVybiBlcnJvci4KKyAqLworc3RhdGljIGludCBvbWFwZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKGZiZGV2LT5jdHJsLT5zeW5jICE9IE5VTEwpCisJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJciA9IHNldF9mYl92YXIoZmJpLCB2YXIpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogU3dpdGNoIHRvIGEgbmV3IG1vZGUuIFRoZSBwYXJhbWV0ZXJzIGZvciBpdCBoYXMgYmVlbiBjaGVjayBhbHJlYWR5IGJ5CisgKiBvbWFwZmJfY2hlY2tfdmFyLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJc2V0X2ZiX2ZpeChmYmkpOworCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwKKwkJCQl2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKKworCXZhciA9ICZmYmktPnZhcjsKKwlpZiAod2luLT54ID49IHZhci0+eHJlcyB8fCB3aW4tPnkgPj0gdmFyLT55cmVzIHx8CisJICAgIHdpbi0+b3V0X3ggPiB2YXItPnhyZXMgfHwgd2luLT5vdXRfeSA+PSB2YXItPnlyZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyB8fAorCSAgICBmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHdpbi0+eCArIHdpbi0+d2lkdGggPj0gdmFyLT54cmVzKQorCQl3aW4tPndpZHRoID0gdmFyLT54cmVzIC0gd2luLT54OworCWlmICh3aW4tPnkgKyB3aW4tPmhlaWdodCA+PSB2YXItPnlyZXMpCisJCXdpbi0+aGVpZ2h0ID0gdmFyLT55cmVzIC0gd2luLT55OworCS8qIFRoZSBvdXQgc2l6ZXMgc2hvdWxkIGJlIGNyb3BwZWQgdG8gdGhlIExDRCBzaXplICovCisJaWYgKHdpbi0+b3V0X3ggKyB3aW4tPm91dF93aWR0aCA+IGZiZGV2LT5wYW5lbC0+eF9yZXMpCisJCXdpbi0+b3V0X3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlcyAtIHdpbi0+b3V0X3g7CisJaWYgKHdpbi0+b3V0X3kgKyB3aW4tPm91dF9oZWlnaHQgPiBmYmRldi0+cGFuZWwtPnlfcmVzKQorCQl3aW4tPm91dF9oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzIC0gd2luLT5vdXRfeTsKKwlpZiAoIXdpbi0+d2lkdGggfHwgIXdpbi0+aGVpZ2h0IHx8ICF3aW4tPm91dF93aWR0aCB8fCAhd2luLT5vdXRfaGVpZ2h0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyhmYmksIHdpbiwgY2FsbGJhY2ssIGNhbGxiYWNrX2RhdGEpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyk7CisKK3N0YXRpYyBpbnQgb21hcGZiX3VwZGF0ZV93aW4oc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlpbnQgcmV0OworCisJb21hcGZiX3JxdWV1ZV9sb2NrKHBsYW5lLT5mYmRldik7CisJcmV0ID0gb21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMoZmJpLCB3aW4sIE5VTEwsIDApOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKHBsYW5lLT5mYmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9tYXBmYl91cGRhdGVfZnVsbF9zY3JlZW4oc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHdpbjsKKwlpbnQgcjsKKworCWlmICghZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3cgfHwKKwkgICAgZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdpbi54ID0gMDsKKwl3aW4ueSA9IDA7CisJd2luLndpZHRoID0gZmJpLT52YXIueHJlczsKKwl3aW4uaGVpZ2h0ID0gZmJpLT52YXIueXJlczsKKwl3aW4ub3V0X3ggPSAwOworCXdpbi5vdXRfeSA9IDA7CisJd2luLm91dF93aWR0aCA9IGZiaS0+dmFyLnhyZXM7CisJd2luLm91dF9oZWlnaHQgPSBmYmktPnZhci55cmVzOworCXdpbi5mb3JtYXQgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJpLCAmd2luLCBOVUxMLCAwKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfcGxhbmUoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvICpwaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvIG9sZF9pbmZvOworCWludCByID0gMDsKKworCWlmIChwaS0+cG9zX3ggKyBwaS0+b3V0X3dpZHRoID4gcGFuZWwtPnhfcmVzIHx8CisJICAgIHBpLT5wb3NfeSArIHBpLT5vdXRfaGVpZ2h0ID4gcGFuZWwtPnlfcmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKHBpLT5lbmFibGVkICYmICFmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdLnNpemUpIHsKKwkJLyoKKwkJICogVGhpcyBwbGFuZSdzIG1lbW9yeSB3YXMgZnJlZWQsIGNhbid0IGVuYWJsZSBpdAorCQkgKiB1bnRpbCBpdCdzIHJlYWxsb2NhdGVkLgorCQkgKi8KKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlvbGRfaW5mbyA9IHBsYW5lLT5pbmZvOworCXBsYW5lLT5pbmZvID0gKnBpOworCWlmIChwaS0+ZW5hYmxlZCkgeworCQlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCQlpZiAociA8IDApIHsKKwkJCXBsYW5lLT5pbmZvID0gb2xkX2luZm87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlyID0gZmJkZXYtPmN0cmwtPmVuYWJsZV9wbGFuZShwbGFuZS0+aWR4LCBwaS0+ZW5hYmxlZCk7CisJaWYgKHIgPCAwKSB7CisJCXBsYW5lLT5pbmZvID0gb2xkX2luZm87CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X3BsYW5lKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyAqcGkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisKKwkqcGkgPSBwbGFuZS0+aW5mbzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfbWVtKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfbWVtX2luZm8gKm1pKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnID0gJmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJc2l6ZV90IHNpemU7CisJaW50IHIgPSAwOworCisJaWYgKGZiZGV2LT5jdHJsLT5zZXR1cF9tZW0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKG1pLT50eXBlID4gT01BUEZCX01FTVRZUEVfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSBQQUdFX0FMSUdOKG1pLT5zaXplKTsKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChwbGFuZS0+aW5mby5lbmFibGVkKSB7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocmctPnNpemUgIT0gc2l6ZSB8fCByZy0+dHlwZSAhPSBtaS0+dHlwZSkgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKm5ld192YXIgPSAmZmJkZXYtPm5ld192YXI7CisJCXVuc2lnbmVkIGxvbmcgb2xkX3NpemUgPSByZy0+c2l6ZTsKKwkJdTgJICAgICAgb2xkX3R5cGUgPSByZy0+dHlwZTsKKwkJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCQlyZy0+c2l6ZSA9IHNpemU7CisJCXJnLT50eXBlID0gbWktPnR5cGU7CisJCS8qCisJCSAqIHNpemUgPT0gMCBpcyBhIHNwZWNpYWwgY2FzZSwgZm9yIHdoaWNoIHdlCisJCSAqIGRvbid0IGNoZWNrIC8gYWRqdXN0IHRoZSBzY3JlZW4gcGFyYW1ldGVycy4KKwkJICogVGhpcyBpc24ndCBhIHByb2JsZW0gc2luY2UgdGhlIHBsYW5lIGNhbid0CisJCSAqIGJlIHJlZW5hYmxlZCB1bmxlc3MgaXRzIHNpemUgaXMgPiAwLgorCQkgKi8KKwkJaWYgKG9sZF9zaXplICE9IHNpemUgJiYgc2l6ZSkgeworCQkJaWYgKHNpemUpIHsKKwkJCQltZW1jcHkobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJCQlyID0gc2V0X2ZiX3ZhcihmYmksIG5ld192YXIpOworCQkJCWlmIChyIDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlpZiAoZmJkZXYtPmN0cmwtPnN5bmMpCisJCQlmYmRldi0+Y3RybC0+c3luYygpOworCQlyID0gZmJkZXYtPmN0cmwtPnNldHVwX21lbShwbGFuZS0+aWR4LCBzaXplLCBtaS0+dHlwZSwgJnBhZGRyKTsKKwkJaWYgKHIgPCAwKSB7CisJCQkvKiBSZXZlcnQgY2hhbmdlcy4gKi8KKwkJCXJnLT5zaXplID0gb2xkX3NpemU7CisJCQlyZy0+dHlwZSA9IG9sZF90eXBlOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmctPnBhZGRyID0gcGFkZHI7CisKKwkJaWYgKG9sZF9zaXplICE9IHNpemUpIHsKKwkJCWlmIChzaXplKSB7CisJCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKGZiaS0+dmFyKSk7CisJCQkJc2V0X2ZiX2ZpeChmYmkpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNldCB0aGVzZSBleHBsaWNpdGx5IHRvIGluZGljYXRlIHRoYXQgdGhlCisJCQkJICogcGxhbmUgbWVtb3J5IGlzIGRlYWxsb2NlJ2QsIHRoZSBvdGhlcgorCQkJCSAqIHNjcmVlbiBwYXJhbWV0ZXJzIGluIHZhciAvIGZpeCBhcmUgaW52YWxpZC4KKwkJCQkgKi8KKwkJCQlmYmktPmZpeC5zbWVtX3N0YXJ0ID0gMDsKKwkJCQlmYmktPmZpeC5zbWVtX2xlbiA9IDA7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X21lbShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvICptaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKworCXJnID0gJmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJbWVtc2V0KG1pLCAwLCBzaXplb2YoKm1pKSk7CisJbWktPnNpemUgPSByZy0+c2l6ZTsKKwltaS0+dHlwZSA9IHJnLT50eXBlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldF9jb2xvcl9rZXkoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LAorCQkJCXN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwlpbnQgcjsKKworCWlmICghZmJkZXYtPmN0cmwtPnNldF9jb2xvcl9rZXkpCisJCXJldHVybiAtRU5PREVWOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnNldF9jb2xvcl9rZXkoY2spOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9nZXRfY29sb3Jfa2V5KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJaW50IHI7CisKKwlpZiAoIWZiZGV2LT5jdHJsLT5nZXRfY29sb3Jfa2V5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5nZXRfY29sb3Jfa2V5KGNrKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG9tYXBmYl9jbGllbnRfbGlzdFtPTUFQRkJfUExBTkVfTlVNXTsKK3N0YXRpYyBpbnQgbm90aWZpZXJfaW5pdGVkOworCitzdGF0aWMgdm9pZCBvbWFwZmJfaW5pdF9ub3RpZmllcih2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE9NQVBGQl9QTEFORV9OVU07IGkrKykKKwkJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZvbWFwZmJfY2xpZW50X2xpc3RbaV0pOworfQorCitpbnQgb21hcGZiX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpvbWFwZmJfbmIsCisJCQkJb21hcGZiX25vdGlmaWVyX2NhbGxiYWNrX3QgY2FsbGJhY2ssCisJCQkJdm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlpbnQgcjsKKworCWlmICgodW5zaWduZWQpb21hcGZiX25iLT5wbGFuZV9pZHggPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbm90aWZpZXJfaW5pdGVkKSB7CisJCW9tYXBmYl9pbml0X25vdGlmaWVyKCk7CisJCW5vdGlmaWVyX2luaXRlZCA9IDE7CisJfQorCisJb21hcGZiX25iLT5uYi5ub3RpZmllcl9jYWxsID0gKGludCAoKikoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosCisJCQkJCXVuc2lnbmVkIGxvbmcsIHZvaWQgKikpY2FsbGJhY2s7CisJb21hcGZiX25iLT5kYXRhID0gY2FsbGJhY2tfZGF0YTsKKwlyID0gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoCisJCQkJJm9tYXBmYl9jbGllbnRfbGlzdFtvbWFwZmJfbmItPnBsYW5lX2lkeF0sCisJCQkJJm9tYXBmYl9uYi0+bmIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlpZiAob21hcGZiX2RldiAhPSBOVUxMICYmCisJICAgIG9tYXBmYl9kZXYtPmN0cmwgJiYgb21hcGZiX2Rldi0+Y3RybC0+YmluZF9jbGllbnQpIHsKKwkJb21hcGZiX2Rldi0+Y3RybC0+YmluZF9jbGllbnQob21hcGZiX25iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3JlZ2lzdGVyX2NsaWVudCk7CisKK2ludCBvbWFwZmJfdW5yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqb21hcGZiX25iKQoreworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKAorCQkmb21hcGZiX2NsaWVudF9saXN0W29tYXBmYl9uYi0+cGxhbmVfaWR4XSwgJm9tYXBmYl9uYi0+bmIpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfdW5yZWdpc3Rlcl9jbGllbnQpOworCit2b2lkIG9tYXBmYl9ub3RpZnlfY2xpZW50cyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCit7CisJaW50IGk7CisKKwlpZiAoIW5vdGlmaWVyX2luaXRlZCkKKwkJLyogbm8gY2xpZW50IHJlZ2lzdGVyZWQgeWV0ICovCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQRkJfUExBTkVfTlVNOyBpKyspCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJm9tYXBmYl9jbGllbnRfbGlzdFtpXSwgZXZlbnQsCisJCQkJICAgIGZiZGV2LT5mYl9pbmZvW2ldKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX25vdGlmeV9jbGllbnRzKTsKKworc3RhdGljIGludCBvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQkgICBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnNldF91cGRhdGVfbW9kZShtb2RlKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfZ2V0X2NhcHMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgcGxhbmUsCisJCQkJICAgICBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJbWVtc2V0KGNhcHMsIDAsIHNpemVvZigqY2FwcykpOworCWZiZGV2LT5jdHJsLT5nZXRfY2FwcyhwbGFuZSwgY2Fwcyk7CisJY2Fwcy0+Y3RybCB8PSBmYmRldi0+cGFuZWwtPmdldF9jYXBzKGZiZGV2LT5wYW5lbCk7Cit9CisKKy8qIEZvciBsY2QgdGVzdGluZyAqLwordm9pZCBvbWFwZmJfd3JpdGVfZmlyc3RfcGl4ZWwoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCB1MTYgcGl4dmFsKQoreworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJKih1MTYgKilmYmRldi0+bWVtX2Rlc2MucmVnaW9uWzBdLnZhZGRyID0gcGl4dmFsOworCWlmIChmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHdpbjsKKworCQltZW1zZXQoJndpbiwgMCwgc2l6ZW9mKHdpbikpOworCQl3aW4ud2lkdGggPSAyOworCQl3aW4uaGVpZ2h0ID0gMjsKKwkJd2luLm91dF93aWR0aCA9IDI7CisJCXdpbi5vdXRfaGVpZ2h0ID0gMjsKKwkJZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJkZXYtPmZiX2luZm9bMF0sICZ3aW4sIE5VTEwsIDApOworCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBmYl93cml0ZV9maXJzdF9waXhlbCk7CisKKy8qCisgKiBJb2N0bCBpbnRlcmZhY2UuIFBhcnQgb2YgdGhlIGtlcm5lbCBtb2RlIGZyYW1lIGJ1ZmZlciBBUEkgaXMgZHVwbGljYXRlZAorICogaGVyZSB0byBiZSBhY2Nlc3NpYmxlIGJ5IHVzZXIgbW9kZSBjb2RlLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqZmJpLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl9vcHMJCSpvcHMgPSBmYmktPmZib3BzOworCXVuaW9uIHsKKwkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93CXVwZGF0ZV93aW5kb3c7CisJCXN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbwlwbGFuZV9pbmZvOworCQlzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvCQltZW1faW5mbzsKKwkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkJCWNvbG9yX2tleTsKKwkJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJCXVwZGF0ZV9tb2RlOworCQlzdHJ1Y3Qgb21hcGZiX2NhcHMJCWNhcHM7CisJCXVuc2lnbmVkIGludAkJbWlycm9yOworCQlpbnQJCQlwbGFuZV9vdXQ7CisJCWludAkJCWVuYWJsZV9wbGFuZTsKKwl9IHA7CisJaW50IHIgPSAwOworCisJQlVHX09OKCFvcHMpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPTUFQRkJfTUlSUk9SOgorCQlpZiAoZ2V0X3VzZXIocC5taXJyb3IsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlvbWFwZmJfbWlycm9yKGZiaSwgcC5taXJyb3IpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TWU5DX0dGWDoKKwkJb21hcGZiX3N5bmMoZmJpKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVlNZTkM6CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVF9VUERBVEVfTU9ERToKKwkJaWYgKGdldF91c2VyKHAudXBkYXRlX21vZGUsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgcC51cGRhdGVfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9VUERBVEVfTU9ERToKKwkJcC51cGRhdGVfbW9kZSA9IG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoZmJkZXYpOworCQlpZiAocHV0X3VzZXIocC51cGRhdGVfbW9kZSwKKwkJCQkJKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIF9fdXNlciAqKWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX1dJTkRPV19PTEQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC51cGRhdGVfd2luZG93LCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvd19vbGQpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlIHsKKwkJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqdSA9ICZwLnVwZGF0ZV93aW5kb3c7CisJCQl1LT5vdXRfeCA9IHUtPng7CisJCQl1LT5vdXRfeSA9IHUtPnk7CisJCQl1LT5vdXRfd2lkdGggPSB1LT53aWR0aDsKKwkJCXUtPm91dF9oZWlnaHQgPSB1LT5oZWlnaHQ7CisJCQltZW1zZXQodS0+cmVzZXJ2ZWQsIDAsIHNpemVvZih1LT5yZXNlcnZlZCkpOworCQkJciA9IG9tYXBmYl91cGRhdGVfd2luKGZiaSwgdSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX1dJTkRPVzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnVwZGF0ZV93aW5kb3csICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC51cGRhdGVfd2luZG93KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl91cGRhdGVfd2luKGZiaSwgJnAudXBkYXRlX3dpbmRvdyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVFVQX1BMQU5FOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAucGxhbmVfaW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLnBsYW5lX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldHVwX3BsYW5lKGZiaSwgJnAucGxhbmVfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1FVRVJZX1BMQU5FOgorCQlpZiAoKHIgPSBvbWFwZmJfcXVlcnlfcGxhbmUoZmJpLCAmcC5wbGFuZV9pbmZvKSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5wbGFuZV9pbmZvLAorCQkJCSAgIHNpemVvZihwLnBsYW5lX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TRVRVUF9NRU06CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5tZW1faW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLm1lbV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXR1cF9tZW0oZmJpLCAmcC5tZW1faW5mbyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1FVRVJZX01FTToKKwkJaWYgKChyID0gb21hcGZiX3F1ZXJ5X21lbShmYmksICZwLm1lbV9pbmZvKSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5tZW1faW5mbywKKwkJCQkgICBzaXplb2YocC5tZW1faW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVF9DT0xPUl9LRVk6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5jb2xvcl9rZXksICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5jb2xvcl9rZXkpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldF9jb2xvcl9rZXkoZmJkZXYsICZwLmNvbG9yX2tleSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9DT0xPUl9LRVk6CisJCWlmICgociA9IG9tYXBmYl9nZXRfY29sb3Jfa2V5KGZiZGV2LCAmcC5jb2xvcl9rZXkpKSA8IDApCisJCQlicmVhazsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLmNvbG9yX2tleSwKKwkJCQkgc2l6ZW9mKHAuY29sb3Jfa2V5KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfR0VUX0NBUFM6CisJCW9tYXBmYl9nZXRfY2FwcyhmYmRldiwgcGxhbmUtPmlkeCwgJnAuY2Fwcyk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5jYXBzLCBzaXplb2YocC5jYXBzKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfTENEX1RFU1Q6CisJCXsKKwkJCWludCB0ZXN0X251bTsKKworCQkJaWYgKGdldF91c2VyKHRlc3RfbnVtLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghZmJkZXYtPnBhbmVsLT5ydW5fdGVzdCkgeworCQkJCXIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJciA9IGZiZGV2LT5wYW5lbC0+cnVuX3Rlc3QoZmJkZXYtPnBhbmVsLCB0ZXN0X251bSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT01BUEZCX0NUUkxfVEVTVDoKKwkJeworCQkJaW50IHRlc3RfbnVtOworCisJCQlpZiAoZ2V0X3VzZXIodGVzdF9udW0sIChpbnQgX191c2VyICopYXJnKSkgeworCQkJCXIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFmYmRldi0+Y3RybC0+cnVuX3Rlc3QpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXIgPSBmYmRldi0+Y3RybC0+cnVuX3Rlc3QodGVzdF9udW0pOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5tbWFwKGluZm8sIHZtYSk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDYWxsYmFjayB0YWJsZSBmb3IgdGhlIGZyYW1lIGJ1ZmZlciBmcmFtZXdvcmsuIFNvbWUgb2YgdGhlc2UgcG9pbnRlcnMKKyAqIHdpbGwgYmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZiBmYl9pbmZvLT5hY2NlbF9mbGFncy4KKyAqLworc3RhdGljIHN0cnVjdCBmYl9vcHMgb21hcGZiX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX29wZW4gICAgICAgID0gb21hcGZiX29wZW4sCisJLmZiX3JlbGVhc2UgICAgID0gb21hcGZiX3JlbGVhc2UsCisJLmZiX3NldGNvbHJlZwk9IG9tYXBmYl9zZXRjb2xyZWcsCisJLmZiX3NldGNtYXAJPSBvbWFwZmJfc2V0Y21hcCwKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAorCS5mYl9ibGFuayAgICAgICA9IG9tYXBmYl9ibGFuaywKKwkuZmJfaW9jdGwJPSBvbWFwZmJfaW9jdGwsCisJLmZiX2NoZWNrX3Zhcgk9IG9tYXBmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBvbWFwZmJfc2V0X3BhciwKKwkuZmJfcm90YXRlCT0gb21hcGZiX3JvdGF0ZSwKKwkuZmJfcGFuX2Rpc3BsYXkgPSBvbWFwZmJfcGFuX2Rpc3BsYXksCit9OworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTeXNmcyBpbnRlcmZhY2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBvbWFwZmJYIHN5c2ZzIGVudHJpZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2NhcHNfbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCBwbGFuZTsKKwlzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3Qgb21hcGZiX2NhcHMgY2FwczsKKworCXBsYW5lID0gMDsKKwlzaXplID0gMDsKKwl3aGlsZSAoc2l6ZSA8IFBBR0VfU0laRSAmJiBwbGFuZSA8IE9NQVBGQl9QTEFORV9OVU0pIHsKKwkJb21hcGZiX2dldF9jYXBzKGZiZGV2LCBwbGFuZSwgJmNhcHMpOworCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkicGxhbmUjJWQgJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIsCisJCQlwbGFuZSwgY2Fwcy5jdHJsLCBjYXBzLnBsYW5lX2NvbG9yLCBjYXBzLnduZF9jb2xvcik7CisJCXBsYW5lKys7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jYXBzX3RleHQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCBpOworCXN0cnVjdCBvbWFwZmJfY2FwcyBjYXBzOworCWludCBwbGFuZTsKKwlzaXplX3Qgc2l6ZTsKKworCXBsYW5lID0gMDsKKwlzaXplID0gMDsKKwl3aGlsZSAoc2l6ZSA8IFBBR0VfU0laRSAmJiBwbGFuZSA8IE9NQVBGQl9QTEFORV9OVU0pIHsKKwkJb21hcGZiX2dldF9jYXBzKGZiZGV2LCBwbGFuZSwgJmNhcHMpOworCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJICJwbGFuZSMlZDpcbiIsIHBsYW5lKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3RybF9jYXBzKSAmJgorCQkgICAgIHNpemUgPCBQQUdFX1NJWkU7IGkrKykgeworCQkJaWYgKGN0cmxfY2Fwc1tpXS5mbGFnICYgY2Fwcy5jdHJsKQorCQkJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkJIiAlc1xuIiwgY3RybF9jYXBzW2ldLm5hbWUpOworCQl9CisJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkgIiBwbGFuZSBjb2xvcnM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChjb2xvcl9jYXBzW2ldLmZsYWcgJiBjYXBzLnBsYW5lX2NvbG9yKQorCQkJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkJIiAgJXNcbiIsIGNvbG9yX2NhcHNbaV0ubmFtZSk7CisJCX0KKwkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCSAiIHdpbmRvdyBjb2xvcnM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChjb2xvcl9jYXBzW2ldLmZsYWcgJiBjYXBzLnduZF9jb2xvcikKKwkJCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJCSIgICVzXG4iLCBjb2xvcl9jYXBzW2ldLm5hbWUpOworCQl9CisKKwkJcGxhbmUrKzsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXBzX251bSwgMDQ0NCwgb21hcGZiX3Nob3dfY2Fwc19udW0sIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhcHNfdGV4dCwgMDQ0NCwgb21hcGZiX3Nob3dfY2Fwc190ZXh0LCBOVUxMKTsKKworLyogcGFuZWwgc3lzZnMgZW50cmllcyAqLworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfcGFuZWxfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZiZGV2LT5wYW5lbC0+bmFtZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2JrbGlnaHRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKSB7CisJCXIgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJICAgICBmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKGZiZGV2LT5wYW5lbCkpOworCX0gZWxzZQorCQlyID0gLUVOT0RFVjsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3Qgb21hcGZiX3N0b3JlX2JrbGlnaHRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPnNldF9ia2xpZ2h0X2xldmVsKSB7CisJCXVuc2lnbmVkIGludCBsZXZlbDsKKworCQlpZiAoc3NjYW5mKGJ1ZiwgIiUxMGQiLCAmbGV2ZWwpID09IDEpIHsKKwkJCXIgPSBmYmRldi0+cGFuZWwtPnNldF9ia2xpZ2h0X2xldmVsKGZiZGV2LT5wYW5lbCwKKwkJCQkJCQkgICAgbGV2ZWwpOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCX0gZWxzZQorCQlyID0gLUVOT0RFVjsKKwlyZXR1cm4gciA/IHIgOiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19ia2xpZ2h0X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKSB7CisJCXIgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJICAgICBmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X21heChmYmRldi0+cGFuZWwpKTsKKwl9IGVsc2UKKwkJciA9IC1FTk9ERVY7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9wYW5lbF9uYW1lID0KKwlfX0FUVFIobmFtZSwgMDQ0NCwgb21hcGZiX3Nob3dfcGFuZWxfbmFtZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFja2xpZ2h0X2xldmVsLCAwNjY0LAorCQkgICBvbWFwZmJfc2hvd19ia2xpZ2h0X2xldmVsLCBvbWFwZmJfc3RvcmVfYmtsaWdodF9sZXZlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFja2xpZ2h0X21heCwgMDQ0NCwgb21hcGZiX3Nob3dfYmtsaWdodF9tYXgsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGFuZWxfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGFuZWxfbmFtZS5hdHRyLAorCSZkZXZfYXR0cl9iYWNrbGlnaHRfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfYmFja2xpZ2h0X21heC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwYW5lbF9hdHRyX2dycCA9IHsKKwkubmFtZSAgPSAicGFuZWwiLAorCS5hdHRycyA9IHBhbmVsX2F0dHJzLAorfTsKKworLyogY3RybCBzeXNmcyBlbnRyaWVzICovCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jdHJsX25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZiZGV2LT5jdHJsLT5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2N0cmxfbmFtZSA9CisJX19BVFRSKG5hbWUsIDA0NDQsIG9tYXBmYl9zaG93X2N0cmxfbmFtZSwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjdHJsX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2N0cmxfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjdHJsX2F0dHJfZ3JwID0geworCS5uYW1lICA9ICJjdHJsIiwKKwkuYXR0cnMgPSBjdHJsX2F0dHJzLAorfTsKKworc3RhdGljIGludCBvbWFwZmJfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCisJaWYgKChyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX251bSkpKQorCQlnb3RvIGZhaWwwOworCisJaWYgKChyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX3RleHQpKSkKKwkJZ290byBmYWlsMTsKKworCWlmICgociA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJnBhbmVsX2F0dHJfZ3JwKSkpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoKHIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZjdHJsX2F0dHJfZ3JwKSkpCisJCWdvdG8gZmFpbDM7CisKKwlyZXR1cm4gMDsKK2ZhaWwzOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJnBhbmVsX2F0dHJfZ3JwKTsKK2ZhaWwyOgorCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc190ZXh0KTsKK2ZhaWwxOgorCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc19udW0pOworZmFpbDA6CisJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHN5c2ZzIGludGVyZmFjZVxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZjdHJsX2F0dHJfZ3JwKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZwYW5lbF9hdHRyX2dycCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX251bSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX3RleHQpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMRE0gY2FsbGJhY2tzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogSW5pdGlhbGl6ZSBzeXN0ZW0gZmJfaW5mbyBvYmplY3QgYW5kIHNldCB0aGUgZGVmYXVsdCB2aWRlbyBtb2RlLgorICogVGhlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgYnkgbGNkZG1hX2luaXQKKyAqLworc3RhdGljIGludCBmYmluZm9faW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbwkqdmFyID0gJmluZm8tPnZhcjsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8JKmZpeCA9ICZpbmZvLT5maXg7CisJaW50CQkJCXIgPSAwOworCisJaW5mby0+ZmJvcHMgPSAmb21hcGZiX29wczsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisKKwlzdHJuY3B5KGZpeC0+aWQsIE1PRFVMRV9OQU1FLCBzaXplb2YoZml4LT5pZCkpOworCisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBmYmRldi0+cHNldWRvX3BhbGV0dGU7CisKKwl2YXItPmFjY2VsX2ZsYWdzICA9IGRlZl9hY2NlbCA/IEZCX0FDQ0VMRl9URVhUIDogMDsKKwl2YXItPnhyZXMgPSBkZWZfdnhyZXM7CisJdmFyLT55cmVzID0gZGVmX3Z5cmVzOworCXZhci0+eHJlc192aXJ0dWFsID0gZGVmX3Z4cmVzOworCXZhci0+eXJlc192aXJ0dWFsID0gZGVmX3Z5cmVzOworCXZhci0+cm90YXRlCSAgPSBkZWZfcm90YXRlOworCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmRldi0+cGFuZWwtPmJwcDsKKworCXNldF9mYl92YXIoaW5mbywgdmFyKTsKKwlzZXRfZmJfZml4KGluZm8pOworCisJciA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDE2LCAwKTsKKwlpZiAociAhPSAwKQorCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgY29sb3IgbWFwIG1lbW9yeVxuIik7CisKKwlyZXR1cm4gcjsKK30KKworLyogUmVsZWFzZSB0aGUgZmJfaW5mbyBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGZiaW5mb19jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlmYl9kZWFsbG9jX2NtYXAoJmZiaS0+Y21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIHBsYW5lc19jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCWlmIChmYmRldi0+ZmJfaW5mb1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWZiaW5mb19jbGVhbnVwKGZiZGV2LCBmYmRldi0+ZmJfaW5mb1tpXSk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoZmJkZXYtPmZiX2luZm9baV0pOworCX0KK30KKworc3RhdGljIGludCBwbGFuZXNfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmZiaTsKKwlpbnQgaTsKKwlpbnQgcjsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZTsKKwkJZmJpID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0KSwKKwkJCQkJZmJkZXYtPmRldik7CisJCWlmIChmYmkgPT0gTlVMTCkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwbGFuZSBpbmZvXG4iKTsKKwkJCXBsYW5lc19jbGVhbnVwKGZiZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXBsYW5lID0gZmJpLT5wYXI7CisJCXBsYW5lLT5pZHggPSBpOworCQlwbGFuZS0+ZmJkZXYgPSBmYmRldjsKKwkJcGxhbmUtPmluZm8ubWlycm9yID0gZGVmX21pcnJvcjsKKwkJZmJkZXYtPmZiX2luZm9baV0gPSBmYmk7CisKKwkJaWYgKChyID0gZmJpbmZvX2luaXQoZmJkZXYsIGZiaSkpIDwgMCkgeworCQkJZnJhbWVidWZmZXJfcmVsZWFzZShmYmkpOworCQkJcGxhbmVzX2NsZWFudXAoZmJkZXYpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJcGxhbmUtPmluZm8ub3V0X3dpZHRoID0gZmJpLT52YXIueHJlczsKKwkJcGxhbmUtPmluZm8ub3V0X2hlaWdodCA9IGZiaS0+dmFyLnlyZXM7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBkcml2ZXIgcmVzb3VyY2VzLiBDYW4gYmUgY2FsbGVkIHRvIHJvbGxiYWNrIGFuIGFib3J0ZWQgaW5pdGlhbGl6YXRpb24KKyAqIHNlcXVlbmNlLgorICovCitzdGF0aWMgdm9pZCBvbWFwZmJfZnJlZV9yZXNvdXJjZXMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgc3RhdGUpCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPTUFQRkJfQUNUSVZFOgorCQlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykKKwkJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJkZXYtPmZiX2luZm9baV0pOworCWNhc2UgNzoKKwkJb21hcGZiX3VucmVnaXN0ZXJfc3lzZnMoZmJkZXYpOworCWNhc2UgNjoKKwkJZmJkZXYtPnBhbmVsLT5kaXNhYmxlKGZiZGV2LT5wYW5lbCk7CisJY2FzZSA1OgorCQlvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKGZiZGV2LCBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwljYXNlIDQ6CisJCXBsYW5lc19jbGVhbnVwKGZiZGV2KTsKKwljYXNlIDM6CisJCWN0cmxfY2xlYW51cChmYmRldik7CisJY2FzZSAyOgorCQlmYmRldi0+cGFuZWwtPmNsZWFudXAoZmJkZXYtPnBhbmVsKTsKKwljYXNlIDE6CisJCWRldl9zZXRfZHJ2ZGF0YShmYmRldi0+ZGV2LCBOVUxMKTsKKwkJa2ZyZWUoZmJkZXYpOworCWNhc2UgMDoKKwkJLyogbm90aGluZyB0byBmcmVlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworc3RhdGljIGludCBvbWFwZmJfZmluZF9jdHJsKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKmNvbmY7CisJY2hhciBuYW1lWzE3XTsKKwlpbnQgaTsKKworCWNvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJZmJkZXYtPmN0cmwgPSBOVUxMOworCisJc3RybmNweShuYW1lLCBjb25mLT5sY2QuY3RybF9uYW1lLCBzaXplb2YobmFtZSkgLSAxKTsKKwluYW1lW3NpemVvZihuYW1lKSAtIDFdID0gJ1wwJzsKKworCWlmIChzdHJjbXAobmFtZSwgImludGVybmFsIikgPT0gMCkgeworCQlmYmRldi0+Y3RybCA9IGZiZGV2LT5pbnRfY3RybDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3RybHMpOyBpKyspIHsKKwkJZGV2X2RiZyhmYmRldi0+ZGV2LCAiY3RybCAlc1xuIiwgY3RybHNbaV0tPm5hbWUpOworCQlpZiAoc3RyY21wKGN0cmxzW2ldLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlmYmRldi0+Y3RybCA9IGN0cmxzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZmJkZXYtPmN0cmwgPT0gTlVMTCkgeworCQlkZXZfZGJnKGZiZGV2LT5kZXYsICJjdHJsICVzIG5vdCBzdXBwb3J0ZWRcbiIsIG5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3JlcXVpcmVkX2NhbGxiYWNrcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisjZGVmaW5lIF9DKHgpIChmYmRldi0+Y3RybC0+eCAhPSBOVUxMKQorI2RlZmluZSBfUCh4KSAoZmJkZXYtPnBhbmVsLT54ICE9IE5VTEwpCisJQlVHX09OKGZiZGV2LT5jdHJsID09IE5VTEwgfHwgZmJkZXYtPnBhbmVsID09IE5VTEwpOworCUJVR19PTighKF9DKGluaXQpICYmIF9DKGNsZWFudXApICYmIF9DKGdldF9jYXBzKSAmJgorCQkgX0Moc2V0X3VwZGF0ZV9tb2RlKSAmJiBfQyhzZXR1cF9wbGFuZSkgJiYgX0MoZW5hYmxlX3BsYW5lKSAmJgorCQkgX1AoaW5pdCkgJiYgX1AoY2xlYW51cCkgJiYgX1AoZW5hYmxlKSAmJiBfUChkaXNhYmxlKSAmJgorCQkgX1AoZ2V0X2NhcHMpKSk7CisjdW5kZWYgX1AKKyN1bmRlZiBfQworfQorCisvKgorICogQ2FsbGVkIGJ5IExETSBiaW5kaW5nIHRvIHByb2JlIGFuZCBhdHRhY2ggYSBuZXcgZGV2aWNlLgorICogSW5pdGlhbGl6YXRpb24gc2VxdWVuY2U6CisgKiAgIDEuIGFsbG9jYXRlIHN5c3RlbSBvbWFwZmJfZGV2aWNlIHN0cnVjdHVyZQorICogICAyLiBzZWxlY3QgY29udHJvbGxlciB0eXBlIGFjY29yZGluZyB0byBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCisgKiAgICAgIGluaXQgTENEIHBhbmVsCisgKiAgIDMuIGluaXQgTENEIGNvbnRyb2xsZXIgYW5kIExDRCBETUEKKyAqICAgNC4gaW5pdCBzeXN0ZW0gZmJfaW5mbyBzdHJ1Y3R1cmUgZm9yIGFsbCBwbGFuZXMKKyAqICAgNS4gc2V0dXAgdmlkZW8gbW9kZSBmb3IgZmlyc3QgcGxhbmUgYW5kIGVuYWJsZSBpdAorICogICA2LiBlbmFibGUgTENEIHBhbmVsCisgKiAgIDcuIHJlZ2lzdGVyIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqICAgT01BUEZCX0FDVElWRTogcmVnaXN0ZXIgc3lzdGVtIGZiX2luZm8gc3RydWN0dXJlIGZvciBhbGwgcGxhbmVzCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX2RvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2ID0gTlVMTDsKKwlpbnQJCQlpbml0X3N0YXRlOworCXVuc2lnbmVkIGxvbmcJCXBoeiwgaGh6LCB2aHo7CisJdW5zaWduZWQgbG9uZwkJdnJhbTsKKwlpbnQJCQlpOworCWludAkJCXIgPSAwOworCisJaW5pdF9zdGF0ZSA9IDA7CisKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInByb2JlZCBmb3IgYW4gdW5rbm93biBkZXZpY2VcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJZmJkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcGZiX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChmYmRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgaW5mb1xuIik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCWluaXRfc3RhdGUrKzsKKworCWZiZGV2LT5kZXYgPSAmcGRldi0+ZGV2OworCWZiZGV2LT5wYW5lbCA9IHBhbmVsOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZiZGV2KTsKKworCW11dGV4X2luaXQoJmZiZGV2LT5ycXVldWVfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKwlmYmRldi0+aW50X2N0cmwgPSAmb21hcDFfaW50X2N0cmw7CisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTAorCWZiZGV2LT5leHRfaWYgPSAmb21hcDFfZXh0X2lmOworI2VuZGlmCisjZWxzZQkvKiBPTUFQMiAqLworCWZiZGV2LT5pbnRfY3RybCA9ICZvbWFwMl9pbnRfY3RybDsKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJZmJkZXYtPmV4dF9pZiA9ICZvbWFwMl9leHRfaWY7CisjZW5kaWYKKyNlbmRpZgorCWlmIChvbWFwZmJfZmluZF9jdHJsKGZiZGV2KSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJIkxDRCBjb250cm9sbGVyIG5vdCBmb3VuZCwgYm9hcmQgbm90IHN1cHBvcnRlZFxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJciA9IGZiZGV2LT5wYW5lbC0+aW5pdChmYmRldi0+cGFuZWwsIGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCisJcHJfaW5mbygib21hcGZiOiBjb25maWd1cmVkIGZvciBwYW5lbCAlc1xuIiwgZmJkZXYtPnBhbmVsLT5uYW1lKTsKKworCWRlZl92eHJlcyA9IGRlZl92eHJlcyA/IDogZmJkZXYtPnBhbmVsLT54X3JlczsKKwlkZWZfdnlyZXMgPSBkZWZfdnlyZXMgPyA6IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisKKwlpbml0X3N0YXRlKys7CisKKwlyID0gY3RybF9pbml0KGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWlmIChmYmRldi0+Y3RybC0+bW1hcCAhPSBOVUxMKQorCQlvbWFwZmJfb3BzLmZiX21tYXAgPSBvbWFwZmJfbW1hcDsKKwlpbml0X3N0YXRlKys7CisKKwljaGVja19yZXF1aXJlZF9jYWxsYmFja3MoZmJkZXYpOworCisJciA9IHBsYW5lc19pbml0KGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWluaXRfc3RhdGUrKzsKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0RNQV9UVU5FCisJLyogU2V0IERNQSBwcmlvcml0eSBmb3IgRU1JRkYgYWNjZXNzIHRvIGhpZ2hlc3QgKi8KKwlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpCisJCW9tYXBfc2V0X2RtYV9wcmlvcml0eSgwLCBPTUFQX0RNQV9QT1JUX0VNSUZGLCAxNSk7CisjZW5kaWYKKworCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiZGV2LT5mYl9pbmZvWzBdKTsKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJtb2RlIHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEdGWCBwbGFuZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKwlyID0gZmJkZXYtPmN0cmwtPmVuYWJsZV9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLCAxKTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCisJb21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgbWFudWFsX3VwZGF0ZSA/CisJCQkJICAgT01BUEZCX01BTlVBTF9VUERBVEUgOiBPTUFQRkJfQVVUT19VUERBVEUpOworCWluaXRfc3RhdGUrKzsKKworCXIgPSBmYmRldi0+cGFuZWwtPmVuYWJsZShmYmRldi0+cGFuZWwpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisJaW5pdF9zdGF0ZSsrOworCisJciA9IG9tYXBmYl9yZWdpc3Rlcl9zeXNmcyhmYmRldik7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpbml0X3N0YXRlKys7CisKKwl2cmFtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJkZXYtPmZiX2luZm9baV0pOworCQlpZiAociAhPSAwKSB7CisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkJInJlZ2lzdGVyaW5nIGZyYW1lYnVmZmVyICVkIGZhaWxlZFxuIiwgaSk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJdnJhbSArPSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnNpemU7CisJfQorCisJZmJkZXYtPnN0YXRlID0gT01BUEZCX0FDVElWRTsKKworCXBhbmVsID0gZmJkZXYtPnBhbmVsOworCXBoeiA9IHBhbmVsLT5waXhlbF9jbG9jayAqIDEwMDA7CisJaGh6ID0gcGh6ICogMTAgLyAocGFuZWwtPmhmcCArIHBhbmVsLT54X3JlcyArIHBhbmVsLT5oYnAgKyBwYW5lbC0+aHN3KTsKKwl2aHogPSBoaHogLyAocGFuZWwtPnZmcCArIHBhbmVsLT55X3JlcyArIHBhbmVsLT52YnAgKyBwYW5lbC0+dnN3KTsKKworCW9tYXBmYl9kZXYgPSBmYmRldjsKKworCXByX2luZm8oIm9tYXBmYjogRnJhbWVidWZmZXIgaW5pdGlhbGl6ZWQuIFRvdGFsIHZyYW0gJWx1IHBsYW5lcyAlZFxuIiwKKwkJCXZyYW0sIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250KTsKKwlwcl9pbmZvKCJvbWFwZmI6IFBpeGNsb2NrICVsdSBrSHogaGZyZXEgJWx1LiVsdSBrSHogIgorCQkJInZmcmVxICVsdS4lbHUgSHpcbiIsCisJCQlwaHogLyAxMDAwLCBoaHogLyAxMDAwMCwgaGh6ICUgMTAsIHZoeiAvIDEwLCB2aHogJSAxMCk7CisKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlvbWFwZmJfZnJlZV9yZXNvdXJjZXMoZmJkZXYsIGluaXRfc3RhdGUpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJQlVHX09OKGZiZGV2X3BkZXYgIT0gTlVMTCk7CisKKwkvKiBEZWxheSBhY3R1YWwgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhlIExDRCBpcyByZWdpc3RlcmVkICovCisJZmJkZXZfcGRldiA9IHBkZXY7CisJaWYgKGZiZGV2X3BhbmVsICE9IE5VTEwpCisJCW9tYXBmYl9kb19wcm9iZShmYmRldl9wZGV2LCBmYmRldl9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21hcGZiX3JlZ2lzdGVyX3BhbmVsKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCUJVR19PTihmYmRldl9wYW5lbCAhPSBOVUxMKTsKKworCWZiZGV2X3BhbmVsID0gcGFuZWw7CisJaWYgKGZiZGV2X3BkZXYgIT0gTlVMTCkKKwkJb21hcGZiX2RvX3Byb2JlKGZiZGV2X3BkZXYsIGZiZGV2X3BhbmVsKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgb21hcGZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWVudW0gb21hcGZiX3N0YXRlIHNhdmVkX3N0YXRlID0gZmJkZXYtPnN0YXRlOworCisJLyogRklYTUU6IHdhaXQgdGlsbCBjb21wbGV0aW9uIG9mIHBlbmRpbmcgZXZlbnRzICovCisKKwlmYmRldi0+c3RhdGUgPSBPTUFQRkJfRElTQUJMRUQ7CisJb21hcGZiX2ZyZWVfcmVzb3VyY2VzKGZiZGV2LCBzYXZlZF9zdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUE0gc3VzcGVuZCAqLworc3RhdGljIGludCBvbWFwZmJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9tYXBmYl9ibGFuayhWRVNBX1BPV0VSRE9XTiwgZmJkZXYtPmZiX2luZm9bMF0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBNIHJlc3VtZSAqLworc3RhdGljIGludCBvbWFwZmJfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvbWFwZmJfYmxhbmsoVkVTQV9OT19CTEFOS0lORywgZmJkZXYtPmZiX2luZm9bMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwZmJfZHJpdmVyID0geworCS5wcm9iZQkJPSBvbWFwZmJfcHJvYmUsCisJLnJlbW92ZQkJPSBvbWFwZmJfcmVtb3ZlLAorCS5zdXNwZW5kCT0gb21hcGZiX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvbWFwZmJfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IE1PRFVMRV9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworI2lmbmRlZiBNT0RVTEUKKworLyogUHJvY2VzcyBrZXJuZWwgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmYl9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnRoaXNfb3B0ID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwlwcl9kZWJ1Zygib21hcGZiOiBvcHRpb25zICVzXG4iLCBvcHRpb25zKTsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCFyICYmICh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJhY2NlbCIsIDUpKQorCQkJZGVmX2FjY2VsID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2cmFtOiIsIDUpKSB7CisJCQljaGFyICpzdWZmaXg7CisJCQl1bnNpZ25lZCBsb25nIHZyYW07CisJCQl2cmFtID0gKHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgJnN1ZmZpeCwgMCkpOworCQkJc3dpdGNoIChzdWZmaXhbMF0pIHsKKwkJCWNhc2UgJ1wwJzoKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJY2FzZSAnTSc6CisJCQkJdnJhbSAqPSAxMDI0OworCQkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSAnayc6CisJCQljYXNlICdLJzoKKwkJCQl2cmFtICo9IDEwMjQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByX2RlYnVnKCJvbWFwZmI6IGludmFsaWQgdnJhbSBzdWZmaXggJWNcbiIsCisJCQkJCSBzdWZmaXhbMF0pOworCQkJCXIgPSAtMTsKKwkJCX0KKwkJCWRlZl92cmFtW2RlZl92cmFtX2NudCsrXSA9IHZyYW07CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2eHJlczoiLCA2KSkKKwkJCWRlZl92eHJlcyA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNiwgTlVMTCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnlyZXM6IiwgNikpCisJCQlkZWZfdnlyZXMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInJvdGF0ZToiLCA3KSkKKwkJCWRlZl9yb3RhdGUgPSAoc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWlycm9yOiIsIDcpKQorCQkJZGVmX21pcnJvciA9IChzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtYW51YWxfdXBkYXRlIiwgMTMpKQorCQkJbWFudWFsX3VwZGF0ZSA9IDE7CisJCWVsc2UgeworCQkJcHJfZGVidWcoIm9tYXBmYjogaW52YWxpZCBvcHRpb25cbiIpOworCQkJciA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKKyNlbmRpZgorCisvKiBSZWdpc3RlciBib3RoIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmYl9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWNoYXIgKm9wdGlvbjsKKworCWlmIChmYl9nZXRfb3B0aW9ucygib21hcGZiIiwgJm9wdGlvbikpCisJCXJldHVybiAtRU5PREVWOworCW9tYXBmYl9zZXR1cChvcHRpb24pOworI2VuZGlmCisJLyogUmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIExETSAqLworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBmYl9kcml2ZXIpKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gcmVnaXN0ZXIgb21hcGZiIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcGZiX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcGZiX2RyaXZlcik7Cit9CisKK21vZHVsZV9wYXJhbV9uYW1lZChhY2NlbCwgZGVmX2FjY2VsLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZCh2cmFtLCBkZWZfdnJhbSwgdWxvbmcsICZkZWZfdnJhbV9jbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHZ4cmVzLCBkZWZfdnhyZXMsIGxvbmcsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHZ5cmVzLCBkZWZfdnlyZXMsIGxvbmcsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHJvdGF0ZSwgZGVmX3JvdGF0ZSwgdWludCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobWlycm9yLCBkZWZfbWlycm9yLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYW51YWxfdXBkYXRlLCBtYW51YWxfdXBkYXRlLCBib29sLCAwNjY0KTsKKworbW9kdWxlX2luaXQob21hcGZiX2luaXQpOworbW9kdWxlX2V4aXQob21hcGZiX2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIE9NQVAgZnJhbWVidWZmZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvcmZiaS5jIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQyNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpAQCAtMCwwICsxLDU4OCBAQAorLyoKKyAqIE9NQVAyIFJlbW90ZSBGcmFtZSBCdWZmZXIgSW50ZXJmYWNlIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgIEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjaW5jbHVkZSAiZGlzcGMuaCIKKworLyogVG8gd29yayBhcm91bmQgYW4gUkZCSSB0cmFuc2ZlciByYXRlIGxpbWl0YXRpb24gKi8KKyNkZWZpbmUgT01BUF9SRkJJX1JBVEVfTElNSVQJMQorCisjZGVmaW5lIFJGQklfQkFTRQkJMHg0ODA1MDgwMAorI2RlZmluZSBSRkJJX1JFVklTSU9OCQkweDAwMDAKKyNkZWZpbmUgUkZCSV9TWVNDT05GSUcJCTB4MDAxMAorI2RlZmluZSBSRkJJX1NZU1NUQVRVUwkJMHgwMDE0CisjZGVmaW5lIFJGQklfQ09OVFJPTAkJMHgwMDQwCisjZGVmaW5lIFJGQklfUElYRUxfQ05UCQkweDAwNDQKKyNkZWZpbmUgUkZCSV9MSU5FX05VTUJFUgkweDAwNDgKKyNkZWZpbmUgUkZCSV9DTUQJCTB4MDA0YworI2RlZmluZSBSRkJJX1BBUkFNCQkweDAwNTAKKyNkZWZpbmUgUkZCSV9EQVRBCQkweDAwNTQKKyNkZWZpbmUgUkZCSV9SRUFECQkweDAwNTgKKyNkZWZpbmUgUkZCSV9TVEFUVVMJCTB4MDA1YworI2RlZmluZSBSRkJJX0NPTkZJRzAJCTB4MDA2MAorI2RlZmluZSBSRkJJX09OT0ZGX1RJTUUwCTB4MDA2NAorI2RlZmluZSBSRkJJX0NZQ0xFX1RJTUUwCTB4MDA2OAorI2RlZmluZSBSRkJJX0RBVEFfQ1lDTEUxXzAJMHgwMDZjCisjZGVmaW5lIFJGQklfREFUQV9DWUNMRTJfMAkweDAwNzAKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFM18wCTB4MDA3NAorI2RlZmluZSBSRkJJX1ZTWU5DX1dJRFRICTB4MDA5MAorI2RlZmluZSBSRkJJX0hTWU5DX1dJRFRICTB4MDA5NAorCisjZGVmaW5lIERJU1BDX0JBU0UJCTB4NDgwNTA0MDAKKyNkZWZpbmUgRElTUENfQ09OVFJPTAkJMHgwMDQwCisKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMgkJYmFzZTsKKwl2b2lkCQkoKmxjZGNfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCSpsY2RjX2NhbGxiYWNrX2RhdGE7CisJdW5zaWduZWQgbG9uZwlsNF9raHo7CisJaW50CQliaXRzX3Blcl9jeWNsZTsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXY7CisJc3RydWN0IGNsawkqZHNzX2ljazsKKwlzdHJ1Y3QgY2xrCSpkc3MxX2ZjazsKKwl1bnNpZ25lZAl0ZWFyc3luY19waW5fY250OworCXVuc2lnbmVkCXRlYXJzeW5jX21vZGU7Cit9IHJmYmk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmJpX3dyaXRlX3JlZyhpbnQgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIHJmYmkuYmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJmYmlfcmVhZF9yZWcoaW50IGlkeCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwocmZiaS5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGludCByZmJpX2dldF9jbG9ja3Modm9pZCkKK3sKKwlpZiAoSVNfRVJSKChyZmJpLmRzc19pY2sgPSBjbGtfZ2V0KHJmYmkuZmJkZXYtPmRldiwgImRzc19pY2siKSkpKSB7CisJCWRldl9lcnIocmZiaS5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzc19pY2siKTsKKwkJcmV0dXJuIFBUUl9FUlIocmZiaS5kc3NfaWNrKTsKKwl9CisKKwlpZiAoSVNfRVJSKChyZmJpLmRzczFfZmNrID0gY2xrX2dldChyZmJpLmZiZGV2LT5kZXYsICJkc3MxX2ZjayIpKSkpIHsKKwkJZGV2X2VycihyZmJpLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzMV9mY2siKTsKKwkJY2xrX3B1dChyZmJpLmRzc19pY2spOworCQlyZXR1cm4gUFRSX0VSUihyZmJpLmRzczFfZmNrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZiaV9wdXRfY2xvY2tzKHZvaWQpCit7CisJY2xrX3B1dChyZmJpLmRzczFfZmNrKTsKKwljbGtfcHV0KHJmYmkuZHNzX2ljayk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZW5hYmxlX2Nsb2NrcyhpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJY2xrX2VuYWJsZShyZmJpLmRzc19pY2spOworCQljbGtfZW5hYmxlKHJmYmkuZHNzMV9mY2spOworCX0gZWxzZSB7CisJCWNsa19kaXNhYmxlKHJmYmkuZHNzMV9mY2spOworCQljbGtfZGlzYWJsZShyZmJpLmRzc19pY2spOworCX0KK30KKworCisjaWZkZWYgVkVSQk9TRQorc3RhdGljIHZvaWQgcmZiaV9wcmludF90aW1pbmdzKHZvaWQpCit7CisJdTMyIGw7CisJdTMyIHRpbWU7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCXRpbWUgPSAxMDAwMDAwMDAwIC8gcmZiaS5sNF9raHo7CisJaWYgKGwgJiAoMSA8PCA0KSkKKwkJdGltZSAqPSAyOworCisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsICJUaWNrIHRpbWUgJXUgcHNcbiIsIHRpbWUpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfT05PRkZfVElNRTApOworCWRldl9kYmcocmZiaS5mYmRldi0+ZGV2LAorCQkiQ1NPTlRJTUUgJWQsIENTT0ZGVElNRSAlZCwgV0VPTlRJTUUgJWQsIFdFT0ZGVElNRSAlZCwgIgorCQkiUkVPTlRJTUUgJWQsIFJFT0ZGVElNRSAlZFxuIiwKKwkJbCAmIDB4MGYsIChsID4+IDQpICYgMHgzZiwgKGwgPj4gMTApICYgMHgwZiwgKGwgPj4gMTQpICYgMHgzZiwKKwkJKGwgPj4gMjApICYgMHgwZiwgKGwgPj4gMjQpICYgMHgzZik7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NZQ0xFX1RJTUUwKTsKKwlkZXZfZGJnKHJmYmkuZmJkZXYtPmRldiwKKwkJIldFQ1lDTEVUSU1FICVkLCBSRUNZQ0xFVElNRSAlZCwgQ1NQVUxTRVdJRFRIICVkLCAiCisJCSJBQ0NFU1NUSU1FICVkXG4iLAorCQkobCAmIDB4M2YpLCAobCA+PiA2KSAmIDB4M2YsIChsID4+IDEyKSAmIDB4M2YsCisJCShsID4+IDIyKSAmIDB4M2YpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHJmYmlfcHJpbnRfdGltaW5ncyh2b2lkKSB7fQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJmYmlfc2V0X3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIGw7CisKKwlCVUdfT04oIXQtPmNvbnZlcnRlZCk7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9PTk9GRl9USU1FMCwgdC0+dGltWzBdKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NZQ0xFX1RJTUUwLCB0LT50aW1bMV0pOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcwKTsKKwlsICY9IH4oMSA8PCA0KTsKKwlsIHw9ICh0LT50aW1bMl0gPyAxIDogMCkgPDwgNDsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCisJcmZiaV9wcmludF90aW1pbmdzKCk7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX2dldF9jbGtfaW5mbyh1MzIgKmNsa19wZXJpb2QsIHUzMiAqbWF4X2Nsa19kaXYpCit7CisJKmNsa19wZXJpb2QgPSAxMDAwMDAwMDAwIC8gcmZiaS5sNF9raHo7CisJKm1heF9jbGtfZGl2ID0gMjsKK30KKworc3RhdGljIGludCBwc190b19yZmJpX3RpY2tzKGludCB0aW1lLCBpbnQgZGl2KQoreworCXVuc2lnbmVkIGxvbmcgdGlja19wczsKKwlpbnQgcmV0OworCisJLyogQ2FsY3VsYXRlIGluIHBpY29zZWNzIHRvIHlpZWxkIG1vcmUgZXhhY3QgcmVzdWx0cyAqLworCXRpY2tfcHMgPSAxMDAwMDAwMDAwIC8gKHJmYmkubDRfa2h6KSAqIGRpdjsKKworCXJldCA9ICh0aW1lICsgdGlja19wcyAtIDEpIC8gdGlja19wczsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBPTUFQX1JGQklfUkFURV9MSU1JVAorc3RhdGljIHVuc2lnbmVkIGxvbmcgcmZiaV9nZXRfbWF4X3R4X3JhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCWw0X3JhdGUsIGRzczFfcmF0ZTsKKwlpbnQJCW1pbl9sNF90aWNrcyA9IDA7CisJaW50CQlpOworCisJLyogQWNjb3JkaW5nIHRvIFRJIHRoaXMgY2FuJ3QgYmUgY2FsY3VsYXRlZCBzbyBtYWtlIHRoZQorCSAqIGFkanVzdG1lbnRzIGZvciBhIGNvdXBsZSBvZiBrbm93biBmcmVxdWVuY2llcyBhbmQgd2FybiBmb3IKKwkgKiBvdGhlcnMuCisJICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgbDRfY2xrOwkJLyogSFogKi8KKwkJdW5zaWduZWQgbG9uZyBkc3MxX2NsazsJCS8qIEhaICovCisJCXVuc2lnbmVkIGxvbmcgbWluX2w0X3RpY2tzOworCX0gZnRhYltdID0geworCQl7IDU1LAkxMzIsCTcsIH0sCQkvKiA3Ljg2IE1QaXgvcyAqLworCQl7IDExMCwJMTEwLAkxMiwgfSwJCS8qIDkuMTYgTVBpeC9zICovCisJCXsgMTEwLAkxMzIsCTEwLCB9LAkJLyogMTEgICBNcGl4L3MgKi8KKwkJeyAxMjAsCTEyMCwJMTAsIH0sCQkvKiAxMiAgIE1waXgvcyAqLworCQl7IDEzMywJMTMzLAkxMCwgfSwJCS8qIDEzLjMgTXBpeC9zICovCisJfTsKKworCWw0X3JhdGUgPSByZmJpLmw0X2toeiAvIDEwMDA7CisJZHNzMV9yYXRlID0gY2xrX2dldF9yYXRlKHJmYmkuZHNzMV9mY2spIC8gMTAwMDAwMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ0YWIpOyBpKyspIHsKKwkJLyogVXNlIGEgd2luZG93IGluc3RlYWQgb2YgYW4gZXhhY3QgbWF0Y2gsIHRvIGFjY291bnQKKwkJICogZm9yIGRpZmZlcmVudCBEUExMIG11bHRpcGxpZXIgLyBkaXZpZGVyIHBhaXJzLgorCQkgKi8KKwkJaWYgKGFicyhmdGFiW2ldLmw0X2NsayAtIGw0X3JhdGUpIDwgMyAmJgorCQkgICAgYWJzKGZ0YWJbaV0uZHNzMV9jbGsgLSBkc3MxX3JhdGUpIDwgMykgeworCQkJbWluX2w0X3RpY2tzID0gZnRhYltpXS5taW5fbDRfdGlja3M7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGZ0YWIpKSB7CisJCS8qIENhbid0IGJlIHN1cmUsIHJldHVybiBhbnl3YXkgdGhlIG1heGltdW0gbm90CisJCSAqIHJhdGUtbGltaXRlZC4gVGhpcyBtaWdodCBjYXVzZSBhIHByb2JsZW0gb25seSBmb3IgdGhlCisJCSAqIHRlYXJpbmcgc3luY2hyb25pc2F0aW9uLgorCQkgKi8KKwkJZGV2X2VycihyZmJpLmZiZGV2LT5kZXYsCisJCQkiY2FuJ3QgZGV0ZXJtaW5lIG1heGltdW0gUkZCSSB0cmFuc2ZlciByYXRlXG4iKTsKKwkJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMDsKKwl9CisJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMCAvIG1pbl9sNF90aWNrczsKK30KKyNlbHNlCitzdGF0aWMgaW50IHJmYmlfZ2V0X21heF90eF9yYXRlKHZvaWQpCit7CisJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgcmZiaV9jb252ZXJ0X3RpbWluZ3Moc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIGw7CisJaW50IHJlb24sIHJlb2ZmLCB3ZW9uLCB3ZW9mZiwgY3NvbiwgY3NvZmYsIGNzX3B1bHNlOworCWludCBhY3RpbSwgcmVjeWMsIHdlY3ljOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJaWYgKGRpdiA8PSAwIHx8IGRpdiA+IDIpCisJCXJldHVybiAtMTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGFmdGVyIGNvbnZlcnNpb24gaXQgc3RpbGwgaG9sZHMgdGhhdDoKKwkgKiB3ZW9mZiA+IHdlb24sIHJlb2ZmID4gcmVvbiwgcmVjeWMgPj0gcmVvZmYsIHdlY3ljID49IHdlb2ZmLAorCSAqIGNzb2ZmID4gY3NvbiwgY3NvZmYgPj0gbWF4KHdlb2ZmLCByZW9mZiksIGFjdGltID4gcmVvbgorCSAqLworCXdlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29uX3RpbWUsIGRpdik7CisJd2VvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29mZl90aW1lLCBkaXYpOworCWlmICh3ZW9mZiA8PSB3ZW9uKQorCQl3ZW9mZiA9IHdlb24gKyAxOworCWlmICh3ZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmICh3ZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCXJlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29uX3RpbWUsIGRpdik7CisJcmVvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29mZl90aW1lLCBkaXYpOworCWlmIChyZW9mZiA8PSByZW9uKQorCQlyZW9mZiA9IHJlb24gKyAxOworCWlmIChyZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChyZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWNzb24gPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29uX3RpbWUsIGRpdik7CisJY3NvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29mZl90aW1lLCBkaXYpOworCWlmIChjc29mZiA8PSBjc29uKQorCQljc29mZiA9IGNzb24gKyAxOworCWlmIChjc29mZiA8IG1heCh3ZW9mZiwgcmVvZmYpKQorCQljc29mZiA9IG1heCh3ZW9mZiwgcmVvZmYpOworCWlmIChjc29uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChjc29mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgY3NvbjsKKwlsIHw9IGNzb2ZmIDw8IDQ7CisJbCB8PSB3ZW9uICA8PCAxMDsKKwlsIHw9IHdlb2ZmIDw8IDE0OworCWwgfD0gcmVvbiAgPDwgMjA7CisJbCB8PSByZW9mZiA8PCAyNDsKKworCXQtPnRpbVswXSA9IGw7CisKKwlhY3RpbSA9IHBzX3RvX3JmYmlfdGlja3ModC0+YWNjZXNzX3RpbWUsIGRpdik7CisJaWYgKGFjdGltIDw9IHJlb24pCisJCWFjdGltID0gcmVvbiArIDE7CisJaWYgKGFjdGltID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJd2VjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHdlY3ljIDwgd2VvZmYpCisJCXdlY3ljID0gd2VvZmY7CisJaWYgKHdlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJcmVjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHJlY3ljIDwgcmVvZmYpCisJCXJlY3ljID0gcmVvZmY7CisJaWYgKHJlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJY3NfcHVsc2UgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX3B1bHNlX3dpZHRoLCBkaXYpOworCWlmIChjc19wdWxzZSA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgd2VjeWM7CisJbCB8PSByZWN5YyAgICA8PCA2OworCWwgfD0gY3NfcHVsc2UgPDwgMTI7CisJbCB8PSBhY3RpbSAgICA8PCAyMjsKKworCXQtPnRpbVsxXSA9IGw7CisKKwl0LT50aW1bMl0gPSBkaXYgLSAxOworCisJdC0+Y29udmVydGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmYmlfc2V0dXBfdGVhcnN5bmModW5zaWduZWQgcGluX2NudCwKKwkJCSAgICAgICB1bnNpZ25lZCBoc19wdWxzZV90aW1lLCB1bnNpZ25lZCB2c19wdWxzZV90aW1lLAorCQkJICAgICAgIGludCBoc19wb2xfaW52LCBpbnQgdnNfcG9sX2ludiwgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaHMsIHZzOworCWludCBtaW47CisJdTMyIGw7CisKKwlpZiAocGluX2NudCAhPSAxICYmIHBpbl9jbnQgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlocyA9IHBzX3RvX3JmYmlfdGlja3MoaHNfcHVsc2VfdGltZSwgMSk7CisJdnMgPSBwc190b19yZmJpX3RpY2tzKHZzX3B1bHNlX3RpbWUsIDEpOworCWlmIChocyA8IDIpCisJCXJldHVybiAtRURPTTsKKwlpZiAocGluX2NudCA9PSAyKQorCQltaW4gPSAyOworCWVsc2UKKwkJbWluID0gNDsKKwlpZiAodnMgPCBtaW4pCisJCXJldHVybiAtRURPTTsKKwlpZiAodnMgPT0gaHMpCisJCXJldHVybiAtRUlOVkFMOworCXJmYmkudGVhcnN5bmNfcGluX2NudCA9IHBpbl9jbnQ7CisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsCisJCSJzZXR1cF90ZWFyc3luYzogcGlucyAlZCBocyAlZCB2cyAlZCBoc19pbnYgJWQgdnNfaW52ICVkXG4iLAorCQlwaW5fY250LCBocywgdnMsIGhzX3BvbF9pbnYsIHZzX3BvbF9pbnYpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfSFNZTkNfV0lEVEgsIGhzKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX1ZTWU5DX1dJRFRILCB2cyk7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCWlmIChoc19wb2xfaW52KQorCQlsICY9IH4oMSA8PCAyMSk7CisJZWxzZQorCQlsIHw9IDEgPDwgMjE7CisJaWYgKHZzX3BvbF9pbnYpCisJCWwgJj0gfigxIDw8IDIwKTsKKwllbHNlCisJCWwgfD0gMSA8PCAyMDsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmJpX2VuYWJsZV90ZWFyc3luYyhpbnQgZW5hYmxlLCB1bnNpZ25lZCBsaW5lKQoreworCXUzMiBsOworCisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsICJ0ZWFyc3luYyAlZCBsaW5lICVkIG1vZGUgJWRcbiIsCisJCWVuYWJsZSwgbGluZSwgcmZiaS50ZWFyc3luY19tb2RlKTsKKwlpZiAobGluZSA+ICgxIDw8IDExKSAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJbCAmPSB+KDB4MyA8PCAyKTsKKwlpZiAoZW5hYmxlKSB7CisJCXJmYmkudGVhcnN5bmNfbW9kZSA9IHJmYmkudGVhcnN5bmNfcGluX2NudDsKKwkJbCB8PSByZmJpLnRlYXJzeW5jX21vZGUgPDwgMjsKKwl9IGVsc2UKKwkJcmZiaS50ZWFyc3luY19tb2RlID0gMDsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfTElORV9OVU1CRVIsIGxpbmUpOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZmJpX3dyaXRlX2NvbW1hbmQoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAocmZiaS5iaXRzX3Blcl9jeWNsZSA9PSAxNikgeworCQljb25zdCB1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiAxKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX0NNRCwgKncrKyk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTggKmIgPSBidWY7CisJCUJVR19PTihyZmJpLmJpdHNfcGVyX2N5Y2xlICE9IDgpOworCQlmb3IgKDsgbGVuOyBsZW4tLSkKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfQ01ELCAqYisrKTsKKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX3JlYWRfZGF0YSh2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWlmIChyZmJpLmJpdHNfcGVyX2N5Y2xlID09IDE2KSB7CisJCXUxNiAqdyA9IGJ1ZjsKKwkJQlVHX09OKGxlbiAmIH4xKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpIHsKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUkVBRCwgMCk7CisJCQkqdysrID0gcmZiaV9yZWFkX3JlZyhSRkJJX1JFQUQpOworCQl9CisJfSBlbHNlIHsKKwkJdTggKmIgPSBidWY7CisJCUJVR19PTihyZmJpLmJpdHNfcGVyX2N5Y2xlICE9IDgpOworCQlmb3IgKDsgbGVuOyBsZW4tLSkgeworCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9SRUFELCAwKTsKKwkJCSpiKysgPSByZmJpX3JlYWRfcmVnKFJGQklfUkVBRCk7CisJCX0KKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAocmZiaS5iaXRzX3Blcl9jeWNsZSA9PSAxNikgeworCQljb25zdCB1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiAxKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1BBUkFNLCAqdysrKTsKKwl9IGVsc2UgeworCQljb25zdCB1OCAqYiA9IGJ1ZjsKKwkJQlVHX09OKHJmYmkuYml0c19wZXJfY3ljbGUgIT0gOCk7CisJCWZvciAoOyBsZW47IGxlbi0tKQorCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9QQVJBTSwgKmIrKyk7CisJfQorCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV90cmFuc2Zlcl9hcmVhKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl2b2lkIChjYWxsYmFjaykodm9pZCAqIGRhdGEpLCB2b2lkICpkYXRhKQoreworCXUzMiB3OworCisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCW9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKHdpZHRoLCBoZWlnaHQpOworCisJcmZiaS5sY2RjX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcmZiaS5sY2RjX2NhbGxiYWNrX2RhdGEgPSBkYXRhOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9QSVhFTF9DTlQsIHdpZHRoICogaGVpZ2h0KTsKKworCXcgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJdyB8PSAxOwkJCQkvKiBlbmFibGUgKi8KKwlpZiAoIXJmYmkudGVhcnN5bmNfbW9kZSkKKwkJdyB8PSAxIDw8IDQ7CQkvKiBpbnRlcm5hbCB0cmlnZ2VyLCByZXNldCBieSBIVyAqLworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09OVFJPTCwgdyk7CisKKwlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3N0b3BfdHJhbnNmZXIodm9pZCkKK3sKKwl1MzIgdzsKKworCXcgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCB3ICYgfigxIDw8IDApKTsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZG1hX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJX3N0b3BfdHJhbnNmZXIoKTsKKwlyZmJpLmxjZGNfY2FsbGJhY2socmZiaS5sY2RjX2NhbGxiYWNrX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCByZmJpX3NldF9iaXRzX3Blcl9jeWNsZShpbnQgYnBjKQoreworCXUzMiBsOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJbCAmPSB+KDB4MDMgPDwgMCk7CisKKwlzd2l0Y2ggKGJwYykgeworCWNhc2UgODoKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJbCB8PSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05GSUcwLCBsKTsKKwlyZmJpLmJpdHNfcGVyX2N5Y2xlID0gYnBjOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIGludCByZmJpX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXUzMiBsOworCWludCByOworCisJcmZiaS5mYmRldiA9IGZiZGV2OworCXJmYmkuYmFzZSA9IGlvX3AydihSRkJJX0JBU0UpOworCisJaWYgKChyID0gcmZiaV9nZXRfY2xvY2tzKCkpIDwgMCkKKwkJcmV0dXJuIHI7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCisJcmZiaS5sNF9raHogPSBjbGtfZ2V0X3JhdGUocmZiaS5kc3NfaWNrKSAvIDEwMDA7CisKKwkvKiBSZXNldCAqLworCXJmYmlfd3JpdGVfcmVnKFJGQklfU1lTQ09ORklHLCAxIDw8IDEpOworCXdoaWxlICghKHJmYmlfcmVhZF9yZWcoUkZCSV9TWVNTVEFUVVMpICYgKDEgPDwgMCkpKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfU1lTQ09ORklHKTsKKwkvKiBFbmFibGUgYXV0b2lkbGUgYW5kIHNtYXJ0LWlkbGUgKi8KKwlsIHw9ICgxIDw8IDApIHwgKDIgPDwgMyk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9TWVNDT05GSUcsIGwpOworCisJLyogMTYtYml0IGludGVyZmFjZSwgSVRFIHRyaWdnZXIgbW9kZSwgMTYtYml0IGRhdGEgKi8KKwlsID0gKDB4MDMgPDwgMCkgfCAoMHgwMCA8PCAyKSB8ICgweDAxIDw8IDUpIHwgKDB4MDIgPDwgNyk7CisJbCB8PSAoMCA8PCA5KSB8ICgxIDw8IDIwKSB8ICgxIDw8IDIxKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9EQVRBX0NZQ0xFMV8wLCAweDAwMDAwMDEwKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJLyogU2VsZWN0IENTMCwgY2xlYXIgYnlwYXNzIG1vZGUgKi8KKwlsID0gKDB4MDEgPDwgMik7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCBsKTsKKworCWlmICgociA9IG9tYXBfZGlzcGNfcmVxdWVzdF9pcnEocmZiaV9kbWFfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IERJU1BDIGlycVxuIik7CisJCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKwkJcmV0dXJuIHI7CisJfQorCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9SRVZJU0lPTik7CisJcHJfaW5mbygib21hcGZiOiBSRkJJIHZlcnNpb24gJWQuJWQgaW5pdGlhbGl6ZWRcbiIsCisJCShsID4+IDQpICYgMHgwZiwgbCAmIDB4MGYpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfY2xlYW51cCh2b2lkKQoreworCW9tYXBfZGlzcGNfZnJlZV9pcnEoKTsKKwlyZmJpX3B1dF9jbG9ja3MoKTsKK30KKworY29uc3Qgc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAyX2V4dF9pZiA9IHsKKwkuaW5pdAkJCT0gcmZiaV9pbml0LAorCS5jbGVhbnVwCQk9IHJmYmlfY2xlYW51cCwKKwkuZ2V0X2Nsa19pbmZvCQk9IHJmYmlfZ2V0X2Nsa19pbmZvLAorCS5nZXRfbWF4X3R4X3JhdGUJPSByZmJpX2dldF9tYXhfdHhfcmF0ZSwKKwkuc2V0X2JpdHNfcGVyX2N5Y2xlCT0gcmZiaV9zZXRfYml0c19wZXJfY3ljbGUsCisJLmNvbnZlcnRfdGltaW5ncwk9IHJmYmlfY29udmVydF90aW1pbmdzLAorCS5zZXRfdGltaW5ncwkJPSByZmJpX3NldF90aW1pbmdzLAorCS53cml0ZV9jb21tYW5kCQk9IHJmYmlfd3JpdGVfY29tbWFuZCwKKwkucmVhZF9kYXRhCQk9IHJmYmlfcmVhZF9kYXRhLAorCS53cml0ZV9kYXRhCQk9IHJmYmlfd3JpdGVfZGF0YSwKKwkudHJhbnNmZXJfYXJlYQkJPSByZmJpX3RyYW5zZmVyX2FyZWEsCisJLnNldHVwX3RlYXJzeW5jCQk9IHJmYmlfc2V0dXBfdGVhcnN5bmMsCisJLmVuYWJsZV90ZWFyc3luYwk9IHJmYmlfZW5hYmxlX3RlYXJzeW5jLAorCisJLm1heF90cmFuc21pdF9zaXplCT0gKHUzMikgfjAsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGJjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYwpAQCAtMCwwICsxLDY4NiBAQAorLyoKKyAqIE9NQVAxIFNwZWNpYWwgT3B0aW1pU2VkIFNjcmVlbiBJbnRlcmZhY2Ugc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2luY2x1ZGUgImxjZGMuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQkJIm9tYXBmYi1zb3NzaSIKKworI2RlZmluZSBPTUFQX1NPU1NJX0JBU0UgICAgICAgICAweGZmZmJhYzAwCisjZGVmaW5lIFNPU1NJX0lEX1JFRwkJMHgwMAorI2RlZmluZSBTT1NTSV9JTklUMV9SRUcJCTB4MDQKKyNkZWZpbmUgU09TU0lfSU5JVDJfUkVHCQkweDA4CisjZGVmaW5lIFNPU1NJX0lOSVQzX1JFRwkJMHgwYworI2RlZmluZSBTT1NTSV9GSUZPX1JFRwkJMHgxMAorI2RlZmluZSBTT1NTSV9SRU9UQUJMRV9SRUcJMHgxNAorI2RlZmluZSBTT1NTSV9URUFSSU5HX1JFRwkweDE4CisjZGVmaW5lIFNPU1NJX0lOSVQxQl9SRUcJMHgxYworI2RlZmluZSBTT1NTSV9GSUZPQl9SRUcJCTB4MjAKKworI2RlZmluZSBETUFfR1NDUiAgICAgICAgICAweGZmZmVkYzA0CisjZGVmaW5lIERNQV9MQ0RfQ0NSICAgICAgIDB4ZmZmZWUzYzIKKyNkZWZpbmUgRE1BX0xDRF9DVFJMICAgICAgMHhmZmZlZTNjNAorI2RlZmluZSBETUFfTENEX0xDSF9DVFJMICAweGZmZmVlM2VhCisKKyNkZWZpbmUgQ09ORl9TT1NTSV9SRVNFVF9SICAgICAgKDEgPDwgMjMpCisKKyNkZWZpbmUgUkRfQUNDRVNTCQkwCisjZGVmaW5lIFdSX0FDQ0VTUwkJMQorCisjZGVmaW5lIFNPU1NJX01BWF9YTUlUX0JZVEVTCSg1MTIgKiAxMDI0KQorCitzdGF0aWMgc3RydWN0IHsKKwl2b2lkIF9faW9tZW0JKmJhc2U7CisJc3RydWN0IGNsawkqZmNrOworCXVuc2lnbmVkIGxvbmcJZmNrX2h6OworCXNwaW5sb2NrX3QJbG9jazsKKwlpbnQJCWJ1c19waWNrX2NvdW50OworCWludAkJYnVzX3BpY2tfd2lkdGg7CisJaW50CQl0ZWFyc3luY19tb2RlOworCWludAkJdGVhcnN5bmNfbGluZTsKKwl2b2lkCQkoKmxjZGNfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCSpsY2RjX2NhbGxiYWNrX2RhdGE7CisJaW50CQl2c3luY19kbWFfcGVuZGluZzsKKwkvKiB0aW1pbmcgZm9yIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyAqLworCWludAkJY2xrX2RpdjsKKwl1OAkJY2xrX3R3MFsyXTsKKwl1OAkJY2xrX3R3MVsyXTsKKwkvKgorCSAqIGlmIGxhc3RfYWNjZXNzIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgd2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgKiB0aGUgdGltaW5ncworCSAqLworCWludAkJbGFzdF9hY2Nlc3M7CisKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7Cit9IHNvc3NpOworCitzdGF0aWMgaW5saW5lIHUzMiBzb3NzaV9yZWFkX3JlZyhpbnQgcmVnKQoreworCXJldHVybiByZWFkbChzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgc29zc2lfcmVhZF9yZWcxNihpbnQgcmVnKQoreworCXJldHVybiByZWFkdyhzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1OCBzb3NzaV9yZWFkX3JlZzgoaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZGIoc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3NzaV93cml0ZV9yZWcoaW50IHJlZywgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3NzaV93cml0ZV9yZWcxNihpbnQgcmVnLCB1MTYgdmFsdWUpCit7CisJd3JpdGV3KHZhbHVlLCBzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNvc3NpX3dyaXRlX3JlZzgoaW50IHJlZywgdTggdmFsdWUpCit7CisJd3JpdGViKHZhbHVlLCBzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc2V0X2JpdHMoaW50IHJlZywgdTMyIGJpdHMpCit7CisJc29zc2lfd3JpdGVfcmVnKHJlZywgc29zc2lfcmVhZF9yZWcocmVnKSB8IGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9jbGVhcl9iaXRzKGludCByZWcsIHUzMiBiaXRzKQoreworCXNvc3NpX3dyaXRlX3JlZyhyZWcsIHNvc3NpX3JlYWRfcmVnKHJlZykgJiB+Yml0cyk7Cit9CisKKyNkZWZpbmUgSFpfVE9fUFMoeCkJKDEwMDAwMDAwMDAgLyAoeCAvIDEwMDApKQorCitzdGF0aWMgdTMyIHBzX3RvX3Nvc3NpX3RpY2tzKHUzMiBwcywgaW50IGRpdikKK3sKKwl1MzIgY2xrX3BlcmlvZCA9IEhaX1RPX1BTKHNvc3NpLmZja19oeikgKiBkaXY7CisJcmV0dXJuIChjbGtfcGVyaW9kICsgcHMgLSAxKSAvIGNsa19wZXJpb2Q7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19yZF90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiB0dzAsIHR3MTsKKwlpbnQgcmVvbiwgcmVvZmYsIHJlY3ljLCBhY3RpbTsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgYWZ0ZXIgY29udmVyc2lvbiBpdCBzdGlsbCBob2xkcyB0aGF0OgorCSAqIHJlb2ZmID4gcmVvbiwgcmVjeWMgPj0gcmVvZmYsIGFjdGltID4gcmVvbgorCSAqLworCXJlb24gPSBwc190b19zb3NzaV90aWNrcyh0LT5yZV9vbl90aW1lLCBkaXYpOworCS8qIHJlb24gd2lsbCBiZSBleGFjdGx5IG9uZSBzb3NzaSB0aWNrICovCisJaWYgKHJlb24gPiAxKQorCQlyZXR1cm4gLTE7CisKKwlyZW9mZiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPnJlX29mZl90aW1lLCBkaXYpOworCisJaWYgKHJlb2ZmIDw9IHJlb24pCisJCXJlb2ZmID0gcmVvbiArIDE7CisKKwl0dzAgPSByZW9mZiAtIHJlb247CisJaWYgKHR3MCA+IDB4MTApCisJCXJldHVybiAtMTsKKworCXJlY3ljID0gcHNfdG9fc29zc2lfdGlja3ModC0+cmVfY3ljbGVfdGltZSwgZGl2KTsKKwlpZiAocmVjeWMgPD0gcmVvZmYpCisJCXJlY3ljID0gcmVvZmYgKyAxOworCisJdHcxID0gcmVjeWMgLSB0dzA7CisJLyogdmFsdWVzIGxlc3MgdGhlbiAzIHJlc3VsdCBpbiB0aGUgU09TU0kgYmxvY2sgcmVzZXR0aW5nIGl0c2VsZiAqLworCWlmICh0dzEgPCAzKQorCQl0dzEgPSAzOworCWlmICh0dzEgPiAweDQwKQorCQlyZXR1cm4gLTE7CisKKwlhY3RpbSA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPmFjY2Vzc190aW1lLCBkaXYpOworCWlmIChhY3RpbSA8IHJlb2ZmKQorCQlhY3RpbSsrOworCS8qCisJICogYWNjZXNzIHRpbWUgKGRhdGEgaG9sZCB0aW1lKSB3aWxsIGJlIGV4YWN0bHkgb25lIHNvc3NpCisJICogdGljaworCSAqLworCWlmIChhY3RpbSAtIHJlb2ZmID4gMSkKKwkJcmV0dXJuIC0xOworCisJdC0+dGltWzBdID0gdHcwIC0gMTsKKwl0LT50aW1bMV0gPSB0dzEgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FsY193cl90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiB0dzAsIHR3MTsKKwlpbnQgd2Vvbiwgd2VvZmYsIHdlY3ljOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBhZnRlciBjb252ZXJzaW9uIGl0IHN0aWxsIGhvbGRzIHRoYXQ6CisJICogd2VvZmYgPiB3ZW9uLCB3ZWN5YyA+PSB3ZW9mZgorCSAqLworCXdlb24gPSBwc190b19zb3NzaV90aWNrcyh0LT53ZV9vbl90aW1lLCBkaXYpOworCS8qIHdlb24gd2lsbCBiZSBleGFjdGx5IG9uZSBzb3NzaSB0aWNrICovCisJaWYgKHdlb24gPiAxKQorCQlyZXR1cm4gLTE7CisKKwl3ZW9mZiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPndlX29mZl90aW1lLCBkaXYpOworCWlmICh3ZW9mZiA8PSB3ZW9uKQorCQl3ZW9mZiA9IHdlb24gKyAxOworCXR3MCA9IHdlb2ZmIC0gd2VvbjsKKwlpZiAodHcwID4gMHgxMCkKKwkJcmV0dXJuIC0xOworCisJd2VjeWMgPSBwc190b19zb3NzaV90aWNrcyh0LT53ZV9jeWNsZV90aW1lLCBkaXYpOworCWlmICh3ZWN5YyA8PSB3ZW9mZikKKwkJd2VjeWMgPSB3ZW9mZiArIDE7CisKKwl0dzEgPSB3ZWN5YyAtIHR3MDsKKwkvKiB2YWx1ZXMgbGVzcyB0aGVuIDMgcmVzdWx0IGluIHRoZSBTT1NTSSBibG9jayByZXNldHRpbmcgaXRzZWxmICovCisJaWYgKHR3MSA8IDMpCisJCXR3MSA9IDM7CisJaWYgKHR3MSA+IDB4NDApCisJCXJldHVybiAtMTsKKworCXQtPnRpbVsyXSA9IHR3MCAtIDE7CisJdC0+dGltWzNdID0gdHcxIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfc2V0X3RpbWluZyhpbnQgZGl2LCBpbnQgdHcwLCBpbnQgdHcxKQoreworCXUzMiBsOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoc29zc2kuZmJkZXYtPmRldiwgIlVzaW5nIFRXMCA9ICVkLCBUVzEgPSAlZCwgZGl2ID0gJWRcbiIsCisJCSB0dzAgKyAxLCB0dzEgKyAxLCBkaXYpOworI2VuZGlmCisKKwljbGtfc2V0X3JhdGUoc29zc2kuZmNrLCBzb3NzaS5mY2tfaHogLyBkaXYpOworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSU5JVDFfUkVHKTsKKwlsICY9IH4oKDB4MGYgPDwgMjApIHwgKDB4M2YgPDwgMjQpKTsKKwlsIHw9ICh0dzAgPDwgMjApIHwgKHR3MSA8PCAyNCk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQxX1JFRywgbCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKK30KKworc3RhdGljIHZvaWQgX3NldF9iaXRzX3Blcl9jeWNsZShpbnQgYnVzX3BpY2tfY291bnQsIGludCBidXNfcGlja193aWR0aCkKK3sKKwl1MzIgbDsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUM19SRUcpOworCWwgJj0gfjB4M2ZmOworCWwgfD0gKChidXNfcGlja19jb3VudCAtIDEpIDw8IDUpIHwgKChidXNfcGlja193aWR0aCAtIDEpICYgMHgxZik7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQzX1JFRywgbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfdGVhcnN5bmNfbW9kZShpbnQgbW9kZSwgdW5zaWduZWQgbGluZSkKK3sKKwl1MzIgbDsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9URUFSSU5HX1JFRyk7CisJbCAmPSB+KCgoMSA8PCAxMSkgLSAxKSA8PCAxNSk7CisJbCB8PSBsaW5lIDw8IDE1OworCWwgJj0gfigweDMgPDwgMjYpOworCWwgfD0gbW9kZSA8PCAyNjsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfVEVBUklOR19SRUcsIGwpOworCWlmIChtb2RlKQorCQlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNik7CS8qIFRFIGxvZ2ljICovCisJZWxzZQorCQlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF90aW1pbmcoaW50IGFjY2VzcykKK3sKKwlpZiAoYWNjZXNzICE9IHNvc3NpLmxhc3RfYWNjZXNzKSB7CisJCXNvc3NpLmxhc3RfYWNjZXNzID0gYWNjZXNzOworCQlfc2V0X3RpbWluZyhzb3NzaS5jbGtfZGl2LAorCQkJICAgIHNvc3NpLmNsa190dzBbYWNjZXNzXSwgc29zc2kuY2xrX3R3MVthY2Nlc3NdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3N0YXJ0X3RyYW5zZmVyKHZvaWQpCit7CisJLyogV0UgKi8KKwlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA0KTsKKwkvKiBDUyBhY3RpdmUgbG93ICovCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMzApOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zdG9wX3RyYW5zZmVyKHZvaWQpCit7CisJLyogV0UgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNCk7CisJLyogQ1MgYWN0aXZlIGxvdyAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAzMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfZW5kX29mX3dyaXRlKHZvaWQpCit7CisJLyogQmVmb3JlIHJlYWRpbmcgd2UgbXVzdCBjaGVjayBpZiBzb21lIHdyaXRpbmdzIGFyZSBnb2luZyBvbiAqLworCXdoaWxlICghKHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lOSVQyX1JFRykgJiAoMSA8PCAzKSkpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuID49IDQpIHsKKwkJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHUzMiAqKSBkYXRhKTsKKwkJbGVuIC09IDQ7CisJCWRhdGEgKz0gNDsKKwl9CisJd2hpbGUgKGxlbiA+PSAyKSB7CisJCXNvc3NpX3dyaXRlX3JlZzE2KFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHUxNiAqKSBkYXRhKTsKKwkJbGVuIC09IDI7CisJCWRhdGEgKz0gMjsKKwl9CisJd2hpbGUgKGxlbikgeworCQlzb3NzaV93cml0ZV9yZWc4KFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHU4ICopIGRhdGEpOworCQlsZW4tLTsKKwkJZGF0YSsrOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2N5Y2xlcyh1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgbnJfY3ljbGVzID0gbGVuIC8gKHNvc3NpLmJ1c19waWNrX3dpZHRoIC8gOCk7CisKKwlCVUdfT04oKG5yX2N5Y2xlcyAtIDEpICYgfjB4M2ZmZmYpOworCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDB4M2ZmZmYpOworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgKG5yX2N5Y2xlcyAtIDEpICYgMHgzZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfY29udmVydF90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCWludCByID0gMDsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCXQtPmNvbnZlcnRlZCA9IDA7CisKKwlpZiAoZGl2IDw9IDAgfHwgZGl2ID4gOCkKKwkJcmV0dXJuIC0xOworCisJLyogbm8gQ1Mgb24gU09TU0ksIHNvIGlnbm9yZSBjc29uLCBjc29mZiwgY3NfcHVsc2V3aWR0aCAqLworCWlmICgociA9IGNhbGNfcmRfdGltaW5ncyh0KSkgPCAwKQorCQlyZXR1cm4gcjsKKworCWlmICgociA9IGNhbGNfd3JfdGltaW5ncyh0KSkgPCAwKQorCQlyZXR1cm4gcjsKKworCXQtPnRpbVs0XSA9IGRpdjsKKworCXQtPmNvbnZlcnRlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc2V0X3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJQlVHX09OKCF0LT5jb252ZXJ0ZWQpOworCisJc29zc2kuY2xrX3R3MFtSRF9BQ0NFU1NdID0gdC0+dGltWzBdOworCXNvc3NpLmNsa190dzFbUkRfQUNDRVNTXSA9IHQtPnRpbVsxXTsKKworCXNvc3NpLmNsa190dzBbV1JfQUNDRVNTXSA9IHQtPnRpbVsyXTsKKwlzb3NzaS5jbGtfdHcxW1dSX0FDQ0VTU10gPSB0LT50aW1bM107CisKKwlzb3NzaS5jbGtfZGl2ID0gdC0+dGltWzRdOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9nZXRfY2xrX2luZm8odTMyICpjbGtfcGVyaW9kLCB1MzIgKm1heF9jbGtfZGl2KQoreworCSpjbGtfcGVyaW9kID0gSFpfVE9fUFMoc29zc2kuZmNrX2h6KTsKKwkqbWF4X2Nsa19kaXYgPSA4OworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zZXRfYml0c19wZXJfY3ljbGUoaW50IGJwYykKK3sKKwlpbnQgYnVzX3BpY2tfY291bnQsIGJ1c19waWNrX3dpZHRoOworCisJLyoKKwkgKiBXZSBzZXQgZXhwbGljaXRseSB0aGUgdGhlIGJ1c19waWNrX2NvdW50IGFzIHdlbGwsIGFsdGhvdWdoCisJICogd2l0aCByZW1hcHBpbmcvcmVvcmRlcmluZyBkaXNhYmxlZCBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgSFcKKwkgKiBhcyAoMzIgLyBidXNfcGlja193aWR0aCkuCisJICovCisJc3dpdGNoIChicGMpIHsKKwljYXNlIDg6CisJCWJ1c19waWNrX2NvdW50ID0gNDsKKwkJYnVzX3BpY2tfd2lkdGggPSA4OworCQlicmVhazsKKwljYXNlIDE2OgorCQlidXNfcGlja19jb3VudCA9IDI7CisJCWJ1c19waWNrX3dpZHRoID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCXNvc3NpLmJ1c19waWNrX3dpZHRoID0gYnVzX3BpY2tfd2lkdGg7CisJc29zc2kuYnVzX3BpY2tfY291bnQgPSBidXNfcGlja19jb3VudDsKK30KKworc3RhdGljIGludCBzb3NzaV9zZXR1cF90ZWFyc3luYyh1bnNpZ25lZCBwaW5fY250LAorCQkJCXVuc2lnbmVkIGhzX3B1bHNlX3RpbWUsIHVuc2lnbmVkIHZzX3B1bHNlX3RpbWUsCisJCQkJaW50IGhzX3BvbF9pbnYsIGludCB2c19wb2xfaW52LCBpbnQgZGl2KQoreworCWludCBocywgdnM7CisJdTMyIGw7CisKKwlpZiAocGluX2NudCAhPSAxIHx8IGRpdiA8IDEgfHwgZGl2ID4gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlocyA9IHBzX3RvX3Nvc3NpX3RpY2tzKGhzX3B1bHNlX3RpbWUsIGRpdik7CisJdnMgPSBwc190b19zb3NzaV90aWNrcyh2c19wdWxzZV90aW1lLCBkaXYpOworCWlmICh2cyA8IDggfHwgdnMgPD0gaHMgfHwgdnMgPj0gKDEgPDwgMTIpKQorCQlyZXR1cm4gLUVET007CisJdnMgLz0gODsKKwl2cy0tOworCWlmIChocyA+IDgpCisJCWhzID0gODsKKwlpZiAoaHMpCisJCWhzLS07CisKKwlkZXZfZGJnKHNvc3NpLmZiZGV2LT5kZXYsCisJCSJzZXR1cF90ZWFyc3luYzogaHMgJWQgdnMgJWQgaHNfaW52ICVkIHZzX2ludiAlZFxuIiwKKwkJaHMsIHZzLCBoc19wb2xfaW52LCB2c19wb2xfaW52KTsKKworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfVEVBUklOR19SRUcpOworCWwgJj0gfigoMSA8PCAxNSkgLSAxKTsKKwlsIHw9IHZzIDw8IDM7CisJbCB8PSBoczsKKwlpZiAoaHNfcG9sX2ludikKKwkJbCB8PSAxIDw8IDI5OworCWVsc2UKKwkJbCAmPSB+KDEgPDwgMjkpOworCWlmICh2c19wb2xfaW52KQorCQlsIHw9IDEgPDwgMjg7CisJZWxzZQorCQlsICY9IH4oMSA8PCAyOCk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX1RFQVJJTkdfUkVHLCBsKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfZW5hYmxlX3RlYXJzeW5jKGludCBlbmFibGUsIHVuc2lnbmVkIGxpbmUpCit7CisJaW50IG1vZGU7CisKKwlkZXZfZGJnKHNvc3NpLmZiZGV2LT5kZXYsICJ0ZWFyc3luYyAlZCBsaW5lICVkXG4iLCBlbmFibGUsIGxpbmUpOworCWlmIChsaW5lID49IDEgPDwgMTEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlbmFibGUpIHsKKwkJaWYgKGxpbmUpCisJCQltb2RlID0gMjsJCS8qIEhTIG9yIFZTICovCisJCWVsc2UKKwkJCW1vZGUgPSAzOwkJLyogVlMgb25seSAqLworCX0gZWxzZQorCQltb2RlID0gMDsKKwlzb3NzaS50ZWFyc3luY19saW5lID0gbGluZTsKKwlzb3NzaS50ZWFyc3luY19tb2RlID0gbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV93cml0ZV9jb21tYW5kKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCXNldF90aW1pbmcoV1JfQUNDRVNTKTsKKwlfc2V0X2JpdHNfcGVyX2N5Y2xlKHNvc3NpLmJ1c19waWNrX2NvdW50LCBzb3NzaS5idXNfcGlja193aWR0aCk7CisJLyogQ01EIy9EQVRBICovCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMobGVuKTsKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCXNlbmRfZGF0YShkYXRhLCBsZW4pOworCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwl3YWl0X2VuZF9vZl93cml0ZSgpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJc2V0X3RpbWluZyhXUl9BQ0NFU1MpOworCV9zZXRfYml0c19wZXJfY3ljbGUoc29zc2kuYnVzX3BpY2tfY291bnQsIHNvc3NpLmJ1c19waWNrX3dpZHRoKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMobGVuKTsKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCXNlbmRfZGF0YShkYXRhLCBsZW4pOworCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwl3YWl0X2VuZF9vZl93cml0ZSgpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3RyYW5zZmVyX2FyZWEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXZvaWQgKGNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlCVUdfT04oY2FsbGJhY2sgPT0gTlVMTCk7CisKKwlzb3NzaS5sY2RjX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJc29zc2kubGNkY19jYWxsYmFja19kYXRhID0gZGF0YTsKKworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFdSX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCV9zZXRfdGVhcnN5bmNfbW9kZShzb3NzaS50ZWFyc3luY19tb2RlLCBzb3NzaS50ZWFyc3luY19saW5lKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMod2lkdGggKiBoZWlnaHQgKiBzb3NzaS5idXNfcGlja193aWR0aCAvIDgpOworCisJc29zc2lfc3RhcnRfdHJhbnNmZXIoKTsKKwlpZiAoc29zc2kudGVhcnN5bmNfbW9kZSkgeworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgc3luYyBzaWduYWwgYW5kIHN0YXJ0IHRoZSB0cmFuc2ZlciBvbmx5CisJCSAqIHRoZW4uIFdlIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byB1c2UgSFcgc3luYyBETUEgZm9yCisJCSAqIHRoaXMgc2luY2UgTENEIERNQSBzaG93cyBodWdlIGxhdGVuY2llcywgYXMgaWYgaXQKKwkJICogd291bGQgaWdub3JlIHNvbWUgb2YgdGhlIERNQSByZXF1ZXN0cyBmcm9tIFNvU1NJLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc29zc2kubG9jaywgZmxhZ3MpOworCQlzb3NzaS52c3luY19kbWFfcGVuZGluZysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCS8qIEp1c3Qgc3RhcnQgdGhlIHRyYW5zZmVyIHJpZ2h0IGF3YXkuICovCisJCW9tYXBfZW5hYmxlX2xjZF9kbWEoKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfZG1hX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwlzb3NzaV9zdG9wX3RyYW5zZmVyKCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKwlzb3NzaS5sY2RjX2NhbGxiYWNrKHNvc3NpLmxjZGNfY2FsbGJhY2tfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3JlYWRfZGF0YSh2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFJEX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCS8qIENNRCMvREFUQSAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAxOCk7CisJc2V0X2N5Y2xlcyhsZW4pOworCXNvc3NpX3N0YXJ0X3RyYW5zZmVyKCk7CisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCSoodTMyICopIGRhdGEgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9GSUZPX1JFRyk7CisJCWxlbiAtPSA0OworCQlkYXRhICs9IDQ7CisJfQorCXdoaWxlIChsZW4gPj0gMikgeworCQkqKHUxNiAqKSBkYXRhID0gc29zc2lfcmVhZF9yZWcxNihTT1NTSV9GSUZPX1JFRyk7CisJCWxlbiAtPSAyOworCQlkYXRhICs9IDI7CisJfQorCXdoaWxlIChsZW4pIHsKKwkJKih1OCAqKSBkYXRhID0gc29zc2lfcmVhZF9yZWc4KFNPU1NJX0ZJRk9fUkVHKTsKKwkJbGVuLS07CisJCWRhdGErKzsKKwl9CisJc29zc2lfc3RvcF90cmFuc2ZlcigpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzb3NzaV9tYXRjaF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNvc3NpLmxvY2ssIGZsYWdzKTsKKwlpZiAoc29zc2kudnN5bmNfZG1hX3BlbmRpbmcpIHsKKwkJc29zc2kudnN5bmNfZG1hX3BlbmRpbmctLTsKKwkJb21hcF9lbmFibGVfbGNkX2RtYSgpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHNvc3NpX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXUzMiBsLCBrOworCXN0cnVjdCBjbGsgKmZjazsKKwlzdHJ1Y3QgY2xrICpkcGxsMW91dF9jazsKKwlpbnQgcjsKKworCXNvc3NpLmJhc2UgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhPTUFQX1NPU1NJX0JBU0UpOworCXNvc3NpLmZiZGV2ID0gZmJkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNvc3NpLmxvY2spOworCisJZHBsbDFvdXRfY2sgPSBjbGtfZ2V0KGZiZGV2LT5kZXYsICJja19kcGxsMW91dCIpOworCWlmIChJU19FUlIoZHBsbDFvdXRfY2spKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IGdldCBEUExMMU9VVCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRwbGwxb3V0X2NrKTsKKwl9CisJLyoKKwkgKiBXZSBuZWVkIHRoZSBwYXJlbnQgY2xvY2sgcmF0ZSwgd2hpY2ggd2UgbWlnaHQgZGl2aWRlIGZ1cnRoZXIKKwkgKiBkZXBlbmRpbmcgb24gdGhlIHRpbWluZyByZXF1aXJlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIuIFNlZQorCSAqIF9zZXRfdGltaW5ncy4KKwkgKi8KKwlzb3NzaS5mY2tfaHogPSBjbGtfZ2V0X3JhdGUoZHBsbDFvdXRfY2spOworCWNsa19wdXQoZHBsbDFvdXRfY2spOworCisJZmNrID0gY2xrX2dldChmYmRldi0+ZGV2LCAiY2tfc29zc2kiKTsKKwlpZiAoSVNfRVJSKGZjaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IFNvU1NJIGZ1bmN0aW9uYWwgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihmY2spOworCX0KKwlzb3NzaS5mY2sgPSBmY2s7CisKKwkvKiBSZXNldCBhbmQgZW5hYmxlIHRoZSBTb1NTSSBtb2R1bGUgKi8KKwlsID0gb21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzEpOworCWwgfD0gQ09ORl9TT1NTSV9SRVNFVF9SOworCW9tYXBfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisJbCAmPSB+Q09ORl9TT1NTSV9SRVNFVF9SOworCW9tYXBfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJbCA9IG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpOworCWwgJj0gfigxIDw8IDgpOwkJCS8qIERNQUNLX1JFUSAqLworCW9tYXBfd3JpdGVsKGwsIEFSTV9JRExFQ1QyKTsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMl9SRUcpOworCS8qIEVuYWJsZSBhbmQgcmVzZXQgdGhlIFNvU1NJIGJsb2NrICovCisJbCB8PSAoMSA8PCAwKSB8ICgxIDw8IDEpOworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMl9SRUcsIGwpOworCS8qIFRha2UgU29TU0kgb3V0IG9mIHJlc2V0ICovCisJbCAmPSB+KDEgPDwgMSk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQyX1JFRywgbCk7CisKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSURfUkVHLCAwKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsKKwlrID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsKKworCWlmIChsICE9IDB4NTU1NTU1NTUgfHwgayAhPSAweGFhYWFhYWFhKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCSJpbnZhbGlkIFNvU1NJIHN5bmMgcGF0dGVybjogJTA4eCwgJTA4eFxuIiwgbCwgayk7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoKHIgPSBvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayhzb3NzaV9kbWFfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IExDREMgSVJRXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOyAvKiBDb21wb25lbnQgY29kZSAqLworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOworCWRldl9pbmZvKGZiZGV2LT5kZXYsICJTb1NTSSB2ZXJzaW9uICVkLiVkIGluaXRpYWxpemVkXG4iLAorCQlsID4+IDE2LCBsICYgMHhmZmZmKTsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMV9SRUcpOworCWwgfD0gKDEgPDwgMTkpOyAvKiBETUFfTU9ERSAqLworCWwgJj0gfigxIDw8IDMxKTsgLyogUkVPUkRFUklORyAqLworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMV9SRUcsIGwpOworCisJaWYgKChyID0gcmVxdWVzdF9pcnEoSU5UXzE2MTBfU29TU0lfTUFUQ0gsIHNvc3NpX21hdGNoX2lycSwKKwkJCSAgICAgSVJRVF9GQUxMSU5HLAorCSAgICAgInNvc3NpX21hdGNoIiwgc29zc2kuZmJkZXYtPmRldikpIDwgMCkgeworCQlkZXZfZXJyKHNvc3NpLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgU29TU0kgbWF0Y2ggSVJRXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7CisJY2xrX3B1dChzb3NzaS5mY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9jbGVhbnVwKHZvaWQpCit7CisJb21hcF9sY2RjX2ZyZWVfZG1hX2NhbGxiYWNrKCk7CisJY2xrX3B1dChzb3NzaS5mY2spOworfQorCitzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDFfZXh0X2lmID0geworCS5pbml0CQkJPSBzb3NzaV9pbml0LAorCS5jbGVhbnVwCQk9IHNvc3NpX2NsZWFudXAsCisJLmdldF9jbGtfaW5mbwkJPSBzb3NzaV9nZXRfY2xrX2luZm8sCisJLmNvbnZlcnRfdGltaW5ncwk9IHNvc3NpX2NvbnZlcnRfdGltaW5ncywKKwkuc2V0X3RpbWluZ3MJCT0gc29zc2lfc2V0X3RpbWluZ3MsCisJLnNldF9iaXRzX3Blcl9jeWNsZQk9IHNvc3NpX3NldF9iaXRzX3Blcl9jeWNsZSwKKwkuc2V0dXBfdGVhcnN5bmMJCT0gc29zc2lfc2V0dXBfdGVhcnN5bmMsCisJLmVuYWJsZV90ZWFyc3luYwk9IHNvc3NpX2VuYWJsZV90ZWFyc3luYywKKwkud3JpdGVfY29tbWFuZAkJPSBzb3NzaV93cml0ZV9jb21tYW5kLAorCS5yZWFkX2RhdGEJCT0gc29zc2lfcmVhZF9kYXRhLAorCS53cml0ZV9kYXRhCQk9IHNvc3NpX3dyaXRlX2RhdGEsCisJLnRyYW5zZmVyX2FyZWEJCT0gc29zc2lfdHJhbnNmZXJfYXJlYSwKKworCS5tYXhfdHJhbnNtaXRfc2l6ZQk9IFNPU1NJX01BWF9YTUlUX0JZVEVTLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCBlNjRmOGI1Li44NTAzZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtNTIsNyArNTIsNyBAQAogCXN0cnVjdCB7CiAJCV9fdTggcmVkLCBncmVlbiwgYmx1ZTsKIAl9CQkJCXBhbGV0dGVbMjU2XTsKLQl1MzIJCQkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiAJCiAJdm9sYXRpbGUgc3RydWN0IGNtYXBfcmVncwlfX2lvbWVtICpjbWFwX3JlZ3M7CiAJdW5zaWduZWQgbG9uZwkJCWNtYXBfcmVnc19waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbTJmYi5jIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCmluZGV4IDBhMDQ0ODMuLjEwYzBjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG0yZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgotICogCisgKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTU4LDcgKzU4LDcgQEAKICNlbmRpZgogCiAvKgotICogRHJpdmVyIGRhdGEgCisgKiBEcml2ZXIgZGF0YQogICovCiBzdGF0aWMgY2hhciAqbW9kZSBfX2RldmluaXRkYXRhID0gTlVMTDsKIApAQCAtODIsMTIgKzgyLDEyIEBACiB7CiAJcG0ydHlwZV90CXR5cGU7CQkvKiBCb2FyZCB0eXBlICovCiAJdW5zaWduZWQgY2hhcglfX2lvbWVtICp2X3JlZ3M7LyogdmlydHVhbCBhZGRyZXNzIG9mIHBfcmVncyAqLwotCXUzMiAJICAgCW1lbWNsb2NrOwkvKiBtZW1jbG9jayAqLworCXUzMgkJbWVtY2xvY2s7CS8qIG1lbWNsb2NrICovCiAJdTMyCQl2aWRlbzsJCS8qIHZpZGVvIGZsYWdzIGJlZm9yZSBibGFua2luZyAqLwogCXUzMgkJbWVtX2NvbmZpZzsJLyogTWVtQ29uZmlnIHJlZyBhdCBwcm9iZSAqLwogCXUzMgkJbWVtX2NvbnRyb2w7CS8qIE1lbUNvbnRyb2wgcmVnIGF0IHByb2JlICovCiAJdTMyCQlib290X2FkZHJlc3M7CS8qIEJvb3RBZGRyZXNzIHJlZyBhdCBwcm9iZSAqLwotCXUzMiAgICAgICAgICAgICBwYWxldHRlWzE2XTsKKwl1MzIJCXBhbGV0dGVbMTZdOwogfTsKIAogLyoKQEAgLTk1LDEyICs5NSwxMiBAQAogICogaWYgd2UgZG9uJ3QgdXNlIG1vZGVkYi4KICAqLwogc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBwbTJmYl9maXggX19kZXZpbml0ZGF0YSA9IHsKLQkuaWQgPQkJIiIsIAorCS5pZCA9CQkiIiwKIAkudHlwZSA9CQlGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCiAJLnZpc3VhbCA9CUZCX1ZJU1VBTF9QU0VVRE9DT0xPUiwKIAkueHBhbnN0ZXAgPQkxLAogCS55cGFuc3RlcCA9CTEsCi0JLnl3cmFwc3RlcCA9CTAsIAorCS55d3JhcHN0ZXAgPQkwLAogCS5hY2NlbCA9CUZCX0FDQ0VMXzNETEFCU19QRVJNRURJQTIsCiB9OwogCkBAIC0xMDksMjYgKzEwOSwyNiBAQAogICovCiBzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHBtMmZiX3ZhciBfX2RldmluaXRkYXRhID0gewogCS8qICI2NDB4NDgwLCA4IGJwcCBAIDYwIEh6ICovCi0JLnhyZXMgPQkJNjQwLAotCS55cmVzID0JCTQ4MCwKLQkueHJlc192aXJ0dWFsID0JNjQwLAotCS55cmVzX3ZpcnR1YWwgPQk0ODAsCi0JLmJpdHNfcGVyX3BpeGVsID04LAotCS5yZWQgPQkJezAsIDgsIDB9LAotCS5ibHVlID0JCXswLCA4LCAwfSwKLQkuZ3JlZW4gPQl7MCwgOCwgMH0sCi0JLmFjdGl2YXRlID0JRkJfQUNUSVZBVEVfTk9XLAotCS5oZWlnaHQgPQktMSwKLQkud2lkdGggPQktMSwKLQkuYWNjZWxfZmxhZ3MgPQkwLAotCS5waXhjbG9jayA9CTM5NzIxLAotCS5sZWZ0X21hcmdpbiA9CTQwLAotCS5yaWdodF9tYXJnaW4gPQkyNCwKLQkudXBwZXJfbWFyZ2luID0JMzIsCi0JLmxvd2VyX21hcmdpbiA9CTExLAotCS5oc3luY19sZW4gPQk5NiwKLQkudnN5bmNfbGVuID0JMiwKLQkudm1vZGUgPQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJLnhyZXMgPQkJCTY0MCwKKwkueXJlcyA9CQkJNDgwLAorCS54cmVzX3ZpcnR1YWwgPQkJNjQwLAorCS55cmVzX3ZpcnR1YWwgPQkJNDgwLAorCS5iaXRzX3Blcl9waXhlbCA9CTgsCisJLnJlZCA9CQkJezAsIDgsIDB9LAorCS5ibHVlID0JCQl7MCwgOCwgMH0sCisJLmdyZWVuID0JCXswLCA4LCAwfSwKKwkuYWN0aXZhdGUgPQkJRkJfQUNUSVZBVEVfTk9XLAorCS5oZWlnaHQgPQkJLTEsCisJLndpZHRoID0JCS0xLAorCS5hY2NlbF9mbGFncyA9CQkwLAorCS5waXhjbG9jayA9CQkzOTcyMSwKKwkubGVmdF9tYXJnaW4gPQkJNDAsCisJLnJpZ2h0X21hcmdpbiA9CQkyNCwKKwkudXBwZXJfbWFyZ2luID0JCTMyLAorCS5sb3dlcl9tYXJnaW4gPQkJMTEsCisJLmhzeW5jX2xlbiA9CQk5NiwKKwkudnN5bmNfbGVuID0JCTIsCisJLnZtb2RlID0JCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIH07CiAKIC8qCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJcG0yX1dSKHAsIFBNMlZSX1JEX0lOREVYX0xPVywgaWR4ICYgMHhmZik7CiAJCWluZGV4ID0gUE0yVlJfUkRfSU5ERVhFRF9EQVRBOwogCQlicmVhazsKLQl9CQorCX0KIAltYigpOwogCXJldHVybiBwbTJfUkQocCwgaW5kZXgpOwogfQpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCXBtMl9XUihwLCBQTTJWUl9SRF9JTkRFWF9MT1csIGlkeCAmIDB4ZmYpOwogCQlpbmRleCA9IFBNMlZSX1JEX0lOREVYRURfREFUQTsKIAkJYnJlYWs7Ci0JfQkKKwl9CiAJd21iKCk7CiAJcG0yX1dSKHAsIGluZGV4LCB2KTsKIAl3bWIoKTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0ZCX1BNMl9GSUZPX0RJU0NPTk5FQ1QKLSNkZWZpbmUgV0FJVF9GSUZPKHAsYSkKKyNkZWZpbmUgV0FJVF9GSUZPKHAsIGEpCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIFdBSVRfRklGTyhzdHJ1Y3QgcG0yZmJfcGFyKiBwLCB1MzIgYSkKIHsKQEAgLTIwOSw3ICsyMDksNyBAQAogLyoKICAqIHBhcnRpYWwgcHJvZHVjdHMgZm9yIHRoZSBzdXBwb3J0ZWQgaG9yaXpvbnRhbCByZXNvbHV0aW9ucy4KICAqLwotI2RlZmluZSBQQUNLUFAocDAscDEscDIpCSgoKHAyKSA8PCA2KSB8ICgocDEpIDw8IDMpIHwgKHAwKSkKKyNkZWZpbmUgUEFDS1BQKHAwLCBwMSwgcDIpCSgoKHAyKSA8PCA2KSB8ICgocDEpIDw8IDMpIHwgKHAwKSkKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCXUxNiB3aWR0aDsKIAl1MTYgcHA7CkBAIC0zNTcsNyArMzU3LDcgQEAKIHN0YXRpYyB2b2lkIHJlc2V0X2NvbmZpZyhzdHJ1Y3QgcG0yZmJfcGFyKiBwKQogewogCVdBSVRfRklGTyhwLCA1Mik7Ci0JcG0yX1dSKHAsIFBNMlJfQ0hJUF9DT05GSUcsIHBtMl9SRChwLCBQTTJSX0NISVBfQ09ORklHKSYKKwlwbTJfV1IocCwgUE0yUl9DSElQX0NPTkZJRywgcG0yX1JEKHAsIFBNMlJfQ0hJUF9DT05GSUcpICYKIAkgICAgICAgfihQTTJGX1ZHQV9FTkFCTEV8UE0yRl9WR0FfRklYRUQpKTsKIAlwbTJfV1IocCwgUE0yUl9CWVBBU1NfV1JJVEVfTUFTSywgfigwTCkpOwogCXBtMl9XUihwLCBQTTJSX0ZSQU1FQlVGRkVSX1dSSVRFX01BU0ssIH4oMEwpKTsKQEAgLTM2Nyw3ICszNjcsNyBAQAogCXBtMl9XUihwLCBQTTJSX1JBU1RFUklaRVJfTU9ERSwgMCk7CiAJcG0yX1dSKHAsIFBNMlJfREVMVEFfTU9ERSwgUE0yRl9ERUxUQV9PUkRFUl9SR0IpOwogCXBtMl9XUihwLCBQTTJSX0xCX1JFQURfRk9STUFULCAwKTsKLQlwbTJfV1IocCwgUE0yUl9MQl9XUklURV9GT1JNQVQsIDApOyAKKwlwbTJfV1IocCwgUE0yUl9MQl9XUklURV9GT1JNQVQsIDApOwogCXBtMl9XUihwLCBQTTJSX0xCX1JFQURfTU9ERSwgMCk7CiAJcG0yX1dSKHAsIFBNMlJfTEJfU09VUkNFX09GRlNFVCwgMCk7CiAJcG0yX1dSKHAsIFBNMlJfRkJfU09VUkNFX09GRlNFVCwgMCk7CkBAIC01MzUsNyArNTM1LDcgQEAKIAl2c3luYyA9IHZpZGVvOwogCiAJRFBSSU5USygidmlkZW8gPSAweCV4XG4iLCB2aWRlbyk7Ci0JCisKIAkvKgogCSAqIFRoZSBoYXJkd2FyZSBjdXJzb3IgbmVlZHMgK3ZzeW5jIHRvIHJlY29nbmlzZSB2ZXJ0IHJldHJhY2UuCiAJICogV2UgbWF5IG5vdCBiZSB1c2luZyB0aGUgaGFyZHdhcmUgY3Vyc29yLCBidXQgdGhlIFggR2xpbnQKQEAgLTU3NCw5ICs1NzQsOSBAQAogICovCiAKIC8qKgotICogICAgICBwbTJmYl9jaGVja192YXIgLSBPcHRpb25hbCBmdW5jdGlvbi4gVmFsaWRhdGVzIGEgdmFyIHBhc3NlZCBpbi4gCi0gKiAgICAgIEB2YXI6IGZyYW1lIGJ1ZmZlciB2YXJpYWJsZSBzY3JlZW4gc3RydWN0dXJlCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIgCisgKglwbTJmYl9jaGVja192YXIgLSBPcHRpb25hbCBmdW5jdGlvbi4gVmFsaWRhdGVzIGEgdmFyIHBhc3NlZCBpbi4KKyAqCUB2YXI6IGZyYW1lIGJ1ZmZlciB2YXJpYWJsZSBzY3JlZW4gc3RydWN0dXJlCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCiAgKgogICoJQ2hlY2tzIHRvIHNlZSBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgdGhlIHN0YXRlIHJlcXVlc3RlZCBieQogICoJdmFyIHBhc3NlZCBpbi4KQEAgLTYxNSwyMyArNjE1LDIzIEBACiAKIAl2YXItPnhyZXMgPSAodmFyLT54cmVzICsgMTUpICYgfjE1OyAvKiBjb3VsZCBzb21ldGltZXMgYmUgOCAqLwogCWxwaXRjaCA9IHZhci0+eHJlcyAqICgodmFyLT5iaXRzX3Blcl9waXhlbCArIDcpPj4zKTsKLSAgCisKIAlpZiAodmFyLT54cmVzIDwgMzIwIHx8IHZhci0+eHJlcyA+IDE2MDApIHsKIAkJRFBSSU5USygid2lkdGggbm90IHN1cHBvcnRlZDogJXVcbiIsIHZhci0+eHJlcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLSAgCisKIAlpZiAodmFyLT55cmVzIDwgMjAwIHx8IHZhci0+eXJlcyA+IDEyMDApIHsKIAkJRFBSSU5USygiaGVpZ2h0IG5vdCBzdXBwb3J0ZWQ6ICV1XG4iLCB2YXItPnlyZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0gIAorCiAJaWYgKGxwaXRjaCAqIHZhci0+eXJlc192aXJ0dWFsID4gaW5mby0+Zml4LnNtZW1fbGVuKSB7CiAJCURQUklOVEsoIm5vIG1lbW9yeSBmb3Igc2NyZWVuICgldXgldXgldSlcbiIsCiAJCQl2YXItPnhyZXMsIHZhci0+eXJlc192aXJ0dWFsLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotICAKKwogCWlmIChQSUNPUzJLSFoodmFyLT5waXhjbG9jaykgPiBQTTJfTUFYX1BJWENMT0NLKSB7CiAJCURQUklOVEsoInBpeGNsb2NrIHRvbyBoaWdoICglbGRLSHopXG4iLCBQSUNPUzJLSFoodmFyLT5waXhjbG9jaykpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY3MiwxNyArNjcyLDE3IEBACiAJCWJyZWFrOwogCX0KIAl2YXItPmhlaWdodCA9IHZhci0+d2lkdGggPSAtMTsKLSAgCisKIAl2YXItPmFjY2VsX2ZsYWdzID0gMDsJLyogQ2FuJ3QgbW1hcCBpZiB0aGlzIGlzIG9uICovCi0JCisKIAlEUFJJTlRLKCJDaGVja2luZyBncmFwaGljcyBtb2RlIGF0ICVkeCVkIGRlcHRoICVkXG4iLAogCQl2YXItPnhyZXMsIHZhci0+eXJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogICAgICBwbTJmYl9zZXRfcGFyIC0gQWx0ZXJzIHRoZSBoYXJkd2FyZSBzdGF0ZS4KLSAqICAgICAgQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgorICoJcG0yZmJfc2V0X3BhciAtIEFsdGVycyB0aGUgaGFyZHdhcmUgc3RhdGUuCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCiAgKgogICoJVXNpbmcgdGhlIGZiX3Zhcl9zY3JlZW5pbmZvIGluIGZiX2luZm8gd2Ugc2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZQogICoJdGhpcyBwYXJ0aWN1bGFyIGZyYW1lYnVmZmVyLgpAQCAtNzA5LDcgKzcwOSw3IEBACiAJY2xlYXJfcGFsZXR0ZShwYXIpOwogCWlmICggcGFyLT5tZW1jbG9jayApCiAJCXNldF9tZW1jbG9jayhwYXIsIHBhci0+bWVtY2xvY2spOwotICAgIAorCiAJd2lkdGggPSAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIDcpICYgfjc7CiAJaGVpZ2h0ID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKIAlkZXB0aCA9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgKyA3KSAmIH43OwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJCURQUklOVEsoInBpeGNsb2NrIHRvbyBoaWdoICgldUtIeilcbiIsIHBpeGNsb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotICAgIAorCiAJaHNzdGFydCA9IHRvMzI2NChpbmZvLT52YXIucmlnaHRfbWFyZ2luLCBkZXB0aCwgZGF0YTY0KTsKIAloc2VuZCA9IGhzc3RhcnQgKyB0bzMyNjQoaW5mby0+dmFyLmhzeW5jX2xlbiwgZGVwdGgsIGRhdGE2NCk7CiAJaGJlbmQgPSBoc2VuZCArIHRvMzI2NChpbmZvLT52YXIubGVmdF9tYXJnaW4sIGRlcHRoLCBkYXRhNjQpOwpAQCAtNzM3LDcgKzczNyw3IEBACiAJYmFzZSA9IHRvMzI2NChpbmZvLT52YXIueW9mZnNldCAqIHhyZXMgKyBpbmZvLT52YXIueG9mZnNldCwgZGVwdGgsIDEpOwogCWlmIChkYXRhNjQpCiAJCXZpZGVvIHw9IFBNMkZfREFUQV82NF9FTkFCTEU7Ci0gICAgCisKIAlpZiAoaW5mby0+dmFyLnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgewogCQlpZiAobG93aHN5bmMpIHsKIAkJCURQUklOVEsoImlnbm9yaW5nICtoc3luYywgdXNpbmcgLWhzeW5jLlxuIik7CkBAIC03NzgsOSArNzc4LDkgQEAKIAkJV0FJVF9GSUZPKHBhciwgMSk7CiAJCXBtMl9XUihwYXIsIFBNMlZSX1JEX0lOREVYX0hJR0gsIDApOwogCX0KLSAgICAKKwogCXNldF9hcGVydHVyZShwYXIsIGRlcHRoKTsKLSAgICAKKwogCW1iKCk7CiAJV0FJVF9GSUZPKHBhciwgMTkpOwogCXBtMl9SREFDX1dSKHBhciwgUE0ySV9SRF9DT0xPUl9LRVlfQ09OVFJPTCwKQEAgLTg0NywyMiArODQ3LDIyIEBACiAJc2V0X3BpeGNsb2NrKHBhciwgcGl4Y2xvY2spOwogCURQUklOVEsoIlNldHRpbmcgZ3JhcGhpY3MgbW9kZSBhdCAlZHglZCBkZXB0aCAlZFxuIiwKIAkJaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwotCXJldHVybiAwOwkKKwlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiAgCXBtMmZiX3NldGNvbHJlZyAtIFNldHMgYSBjb2xvciByZWdpc3Rlci4KLSAqICAgICAgQHJlZ25vOiBib29sZWFuLCAwIGNvcHkgbG9jYWwsIDEgZ2V0X3VzZXIoKSBmdW5jdGlvbgotICogICAgICBAcmVkOiBmcmFtZSBidWZmZXIgY29sb3JtYXAgc3RydWN0dXJlCi0gKglAZ3JlZW46IFRoZSBncmVlbiB2YWx1ZSB3aGljaCBjYW4gYmUgdXAgdG8gMTYgYml0cyB3aWRlIAorICoJcG0yZmJfc2V0Y29scmVnIC0gU2V0cyBhIGNvbG9yIHJlZ2lzdGVyLgorICoJQHJlZ25vOiBib29sZWFuLCAwIGNvcHkgbG9jYWwsIDEgZ2V0X3VzZXIoKSBmdW5jdGlvbgorICoJQHJlZDogZnJhbWUgYnVmZmVyIGNvbG9ybWFwIHN0cnVjdHVyZQorICoJQGdyZWVuOiBUaGUgZ3JlZW4gdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZQogICoJQGJsdWU6ICBUaGUgYmx1ZSB2YWx1ZSB3aGljaCBjYW4gYmUgdXAgdG8gMTYgYml0cyB3aWRlLgotICoJQHRyYW5zcDogSWYgc3VwcG9ydGVkIHRoZSBhbHBoYSB2YWx1ZSB3aGljaCBjYW4gYmUgdXAgdG8gMTYgYml0cyB3aWRlLgkKLSAqICAgICAgQGluZm86IGZyYW1lIGJ1ZmZlciBpbmZvIHN0cnVjdHVyZQotICogCi0gKiAgCVNldCBhIHNpbmdsZSBjb2xvciByZWdpc3Rlci4gVGhlIHZhbHVlcyBzdXBwbGllZCBoYXZlIGEgMTYgYml0Ci0gKiAgCW1hZ25pdHVkZSB3aGljaCBuZWVkcyB0byBiZSBzY2FsZWQgaW4gdGhpcyBmdW5jdGlvbiBmb3IgdGhlIGhhcmR3YXJlLgorICoJQHRyYW5zcDogSWYgc3VwcG9ydGVkIHRoZSBhbHBoYSB2YWx1ZSB3aGljaCBjYW4gYmUgdXAgdG8gMTYgYml0cyB3aWRlLgorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBpbmZvIHN0cnVjdHVyZQorICoKKyAqCVNldCBhIHNpbmdsZSBjb2xvciByZWdpc3Rlci4gVGhlIHZhbHVlcyBzdXBwbGllZCBoYXZlIGEgMTYgYml0CisgKgltYWduaXR1ZGUgd2hpY2ggbmVlZHMgdG8gYmUgc2NhbGVkIGluIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBoYXJkd2FyZS4KICAqCVByZXR0eSBtdWNoIGEgZGlyZWN0IGxpZnQgZnJvbSB0ZGZ4ZmIuYy4KLSAqIAorICoKICAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KICAqLwogc3RhdGljIGludCBwbTJmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCkBAIC05MDYsNyArOTA2LDcgQEAKIAkgKiAgICAoYmx1ZSA8PCBibHVlLm9mZnNldCkgfCAodHJhbnNwIDw8IHRyYW5zcC5vZmZzZXQpCiAJICogICAgUkFNREFDIGRvZXMgbm90IGV4aXN0CiAJICovCi0jZGVmaW5lIENOVlRfVE9IVyh2YWwsd2lkdGgpICgoKCh2YWwpPDwod2lkdGgpKSsweDdGRkYtKHZhbCkpPj4xNikKKyNkZWZpbmUgQ05WVF9UT0hXKHZhbCwgd2lkdGgpICgoKCh2YWwpIDw8ICh3aWR0aCkpICsgMHg3RkZGIC0odmFsKSkgPj4gMTYpCiAJc3dpdGNoIChpbmZvLT5maXgudmlzdWFsKSB7CiAJY2FzZSBGQl9WSVNVQUxfVFJVRUNPTE9SOgogCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgpAQCAtOTE2LDkgKzkxNiw5IEBACiAJCXRyYW5zcCA9IENOVlRfVE9IVyh0cmFuc3AsIGluZm8tPnZhci50cmFuc3AubGVuZ3RoKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9WSVNVQUxfRElSRUNUQ09MT1I6Ci0JCS8qIGV4YW1wbGUgaGVyZSBhc3N1bWVzIDggYml0IERBQy4gTWlnaHQgYmUgZGlmZmVyZW50IAotCQkgKiBmb3IgeW91ciBoYXJkd2FyZSAqLwkKLQkJcmVkID0gQ05WVF9UT0hXKHJlZCwgOCk7ICAgICAgIAorCQkvKiBleGFtcGxlIGhlcmUgYXNzdW1lcyA4IGJpdCBEQUMuIE1pZ2h0IGJlIGRpZmZlcmVudAorCQkgKiBmb3IgeW91ciBoYXJkd2FyZSAqLworCQlyZWQgPSBDTlZUX1RPSFcocmVkLCA4KTsKIAkJZ3JlZW4gPSBDTlZUX1RPSFcoZ3JlZW4sIDgpOwogCQlibHVlID0gQ05WVF9UT0hXKGJsdWUsIDgpOwogCQkvKiBoZXksIHRoZXJlIGlzIGJ1ZyBpbiB0cmFuc3AgaGFuZGxpbmcuLi4gKi8KQEAgLTk0MCwxMSArOTQwLDExIEBACiAKIAkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAkJY2FzZSA4OgotCQkJYnJlYWs7CQotICAgCQljYXNlIDE2OgorCQkJYnJlYWs7CisJCWNhc2UgMTY6CiAJCWNhc2UgMjQ6Ci0JCWNhc2UgMzI6CQotICAgICAgICAgICAJCXBhci0+cGFsZXR0ZVtyZWdub10gPSB2OworCQljYXNlIDMyOgorCQkJcGFyLT5wYWxldHRlW3JlZ25vXSA9IHY7CiAJCQlicmVhazsKIAkJfQogCQlyZXR1cm4gMDsKQEAgLTk1NiwxNSArOTU2LDE1IEBACiB9CiAKIC8qKgotICogICAgICBwbTJmYl9wYW5fZGlzcGxheSAtIFBhbnMgdGhlIGRpc3BsYXkuCi0gKiAgICAgIEB2YXI6IGZyYW1lIGJ1ZmZlciB2YXJpYWJsZSBzY3JlZW4gc3RydWN0dXJlCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCXBtMmZiX3Bhbl9kaXNwbGF5IC0gUGFucyB0aGUgZGlzcGxheS4KKyAqCUB2YXI6IGZyYW1lIGJ1ZmZlciB2YXJpYWJsZSBzY3JlZW4gc3RydWN0dXJlCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCiAgKgogICoJUGFuIChvciB3cmFwLCBkZXBlbmRpbmcgb24gdGhlIGB2bW9kZScgZmllbGQpIHRoZSBkaXNwbGF5IHVzaW5nIHRoZQotICogIAlgeG9mZnNldCcgYW5kIGB5b2Zmc2V0JyBmaWVsZHMgb2YgdGhlIGB2YXInIHN0cnVjdHVyZS4KLSAqICAJSWYgdGhlIHZhbHVlcyBkb24ndCBmaXQsIHJldHVybiAtRUlOVkFMLgorICoJYHhvZmZzZXQnIGFuZCBgeW9mZnNldCcgZmllbGRzIG9mIHRoZSBgdmFyJyBzdHJ1Y3R1cmUuCisgKglJZiB0aGUgdmFsdWVzIGRvbid0IGZpdCwgcmV0dXJuIC1FSU5WQUwuCiAgKgotICogICAgICBSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCisgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKgogICovCiBzdGF0aWMgaW50IHBtMmZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLApAQCAtOTgwLDI0ICs5ODAsMjQgQEAKIAlkZXB0aCA9IChkZXB0aCA+IDMyKSA/IDMyIDogZGVwdGg7CiAJYmFzZSA9IHRvMzI2NCh2YXItPnlvZmZzZXQgKiB4cmVzICsgdmFyLT54b2Zmc2V0LCBkZXB0aCwgMSk7CiAJV0FJVF9GSUZPKHAsIDEpOwotCXBtMl9XUihwLCBQTTJSX1NDUkVFTl9CQVNFLCBiYXNlKTsgICAgCisJcG0yX1dSKHAsIFBNMlJfU0NSRUVOX0JBU0UsIGJhc2UpOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqICAgICAgcG0yZmJfYmxhbmsgLSBCbGFua3MgdGhlIGRpc3BsYXkuCi0gKiAgICAgIEBibGFua19tb2RlOiB0aGUgYmxhbmsgbW9kZSB3ZSB3YW50LiAKLSAqICAgICAgQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgorICoJcG0yZmJfYmxhbmsgLSBCbGFua3MgdGhlIGRpc3BsYXkuCisgKglAYmxhbmtfbW9kZTogdGhlIGJsYW5rIG1vZGUgd2Ugd2FudC4KKyAqCUBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKICAqCi0gKiAgICAgIEJsYW5rIHRoZSBzY3JlZW4gaWYgYmxhbmtfbW9kZSAhPSAwLCBlbHNlIHVuYmxhbmsuIFJldHVybiAwIGlmCi0gKiAgICAgIGJsYW5raW5nIHN1Y2NlZWRlZCwgIT0gMCBpZiB1bi0vYmxhbmtpbmcgZmFpbGVkIGR1ZSB0byBlLmcuIGEgCi0gKiAgICAgIHZpZGVvIG1vZGUgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGl0LiBJbXBsZW1lbnRzIFZFU0Egc3VzcGVuZAotICogICAgICBhbmQgcG93ZXJkb3duIG1vZGVzIG9uIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgZGlzYWJsaW5nIGhzeW5jL3ZzeW5jOgotICogICAgICBibGFua19tb2RlID09IDI6IHN1c3BlbmQgdnN5bmMKLSAqICAgICAgYmxhbmtfbW9kZSA9PSAzOiBzdXNwZW5kIGhzeW5jCi0gKiAgICAgIGJsYW5rX21vZGUgPT0gNDogcG93ZXJkb3duCisgKglCbGFuayB0aGUgc2NyZWVuIGlmIGJsYW5rX21vZGUgIT0gMCwgZWxzZSB1bmJsYW5rLiBSZXR1cm4gMCBpZgorICoJYmxhbmtpbmcgc3VjY2VlZGVkLCAhPSAwIGlmIHVuLS9ibGFua2luZyBmYWlsZWQgZHVlIHRvIGUuZy4gYQorICoJdmlkZW8gbW9kZSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgaXQuIEltcGxlbWVudHMgVkVTQSBzdXNwZW5kCisgKglhbmQgcG93ZXJkb3duIG1vZGVzIG9uIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgZGlzYWJsaW5nIGhzeW5jL3ZzeW5jOgorICoJYmxhbmtfbW9kZSA9PSAyOiBzdXNwZW5kIHZzeW5jCisgKglibGFua19tb2RlID09IDM6IHN1c3BlbmQgaHN5bmMKKyAqCWJsYW5rX21vZGUgPT0gNDogcG93ZXJkb3duCiAgKgotICogICAgICBSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCisgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKgogICovCiBzdGF0aWMgaW50IHBtMmZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKQEAgLTEwNzEsNyArMTA3MSw3IEBACiAJcG0yX1dSKHBhciwgUE0yUl9SRUNUQU5HTEVfT1JJR0lOLCAoeSA8PCAxNikgfCB4KTsKIAlwbTJfV1IocGFyLCBQTTJSX1JFQ1RBTkdMRV9TSVpFLCAoaCA8PCAxNikgfCB3KTsKIAl3bWIoKTsKLQlwbTJfV1IocGFyLCBQTTJSX1JFTkRFUixQTTJGX1JFTkRFUl9SRUNUQU5HTEUgfAorCXBtMl9XUihwYXIsIFBNMlJfUkVOREVSLCBQTTJGX1JFTkRFUl9SRUNUQU5HTEUgfAogCQkJCSh4PHhzcmMgPyBQTTJGX0lOQ1JFQVNFX1ggOiAwKSB8CiAJCQkJKHk8eXNyYyA/IFBNMkZfSU5DUkVBU0VfWSA6IDApIHwKIAkJCQkoY29weSA/IDAgOiBQTTJGX1JFTkRFUl9GQVNURklMTCkpOwpAQCAtMTIzNCw3ICsxMjM0LDcgQEAKIAlEUFJJTlRLKCJBZGp1c3RpbmcgcmVnaXN0ZXIgYmFzZSBmb3IgYmlnLWVuZGlhbi5cbiIpOwogI2VuZGlmCiAJRFBSSU5USygiUmVnaXN0ZXIgYmFzZSBhdCAweCVseFxuIiwgcG0yZmJfZml4Lm1taW9fc3RhcnQpOwotICAgIAorCiAJLyogUmVnaXN0ZXJzIC0gcmVxdWVzdCByZWdpb24gYW5kIG1hcCBpdC4gKi8KIAlpZiAoICFyZXF1ZXN0X21lbV9yZWdpb24ocG0yZmJfZml4Lm1taW9fc3RhcnQsIHBtMmZiX2ZpeC5tbWlvX2xlbiwKIAkJCQkgInBtMmZiIHJlZ2Jhc2UiKSApIHsKQEAgLTEzMTcsMTcgKzEzMTcsMTcgQEAKIAl9CiAKIAlpbmZvLT5mYm9wcwkJPSAmcG0yZmJfb3BzOwotCWluZm8tPmZpeAkJPSBwbTJmYl9maXg7IAkKKwlpbmZvLT5maXgJCT0gcG0yZmJfZml4OwogCWluZm8tPnBzZXVkb19wYWxldHRlCT0gZGVmYXVsdF9wYXItPnBhbGV0dGU7CiAJaW5mby0+ZmxhZ3MJCT0gRkJJTkZPX0RFRkFVTFQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX1lQQU4gfAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1Q7CisJCQkJICBGQklORk9fSFdBQ0NFTF9ZUEFOIHwKKwkJCQkgIEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwKKwkJCQkgIEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUOwogCiAJaWYgKCFtb2RlKQogCQltb2RlID0gIjY0MHg0ODBANjAiOwotCSAKLQllcnIgPSBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZSwgTlVMTCwgMCwgTlVMTCwgOCk7IAorCisJZXJyID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGUsIE5VTEwsIDAsIE5VTEwsIDgpOwogCWlmICghZXJyIHx8IGVyciA9PSA0KQogCQlpbmZvLT52YXIgPSBwbTJmYl92YXI7CiAKQEAgLTEzNDgsOCArMTM0OCw4IEBACiAJcmV0dXJuIDA7CiAKICBlcnJfZXhpdF9hbGw6Ci0JZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsJCi0gZXJyX2V4aXRfYm90aDogICAgCisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKyBlcnJfZXhpdF9ib3RoOgogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihwbTJmYl9maXguc21lbV9zdGFydCwgcG0yZmJfZml4LnNtZW1fbGVuKTsKICBlcnJfZXhpdF9tbWlvOgpAQCAtMTM3NCw3ICsxMzc0LDcgQEAKIAlzdHJ1Y3QgcG0yZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwotICAgIAorCiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGZpeC0+c21lbV9zdGFydCwgZml4LT5zbWVtX2xlbik7CiAJaW91bm1hcChwYXItPnZfcmVncyk7CkBAIC0xNDAyLDkgKzE0MDIsOSBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcG0yZmJfZHJpdmVyID0gewogCS5uYW1lCQk9ICJwbTJmYiIsCi0JLmlkX3RhYmxlIAk9IHBtMmZiX2lkX3RhYmxlLAotCS5wcm9iZSAJCT0gcG0yZmJfcHJvYmUsCi0JLnJlbW92ZSAJPSBfX2RldmV4aXRfcChwbTJmYl9yZW1vdmUpLAorCS5pZF90YWJsZQk9IHBtMmZiX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBwbTJmYl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBtMmZiX3JlbW92ZSksCiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcG0yZmJfaWRfdGFibGUpOwpAQCAtMTQyMyw3ICsxNDIzLDcgQEAKIAlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQogCQlyZXR1cm4gMDsKIAotCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsJCisJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewogCQlpZiAoISp0aGlzX29wdCkKIAkJCWNvbnRpbnVlOwogCQlpZighc3RyY21wKHRoaXNfb3B0LCAibG93aHN5bmMiKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbTNmYi5jIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCmluZGV4IGI1MmU4ODMuLjViM2Y1NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkueHBhbnN0ZXAgPQkxLAogCS55cGFuc3RlcCA9CTEsCiAJLnl3cmFwc3RlcCA9CTAsCi0JLmFjY2VsID0JRkJfQUNDRUxfTk9ORSwKKwkuYWNjZWwgPQlGQl9BQ0NFTF8zRExBQlNfUEVSTUVESUEzLAogfTsKIAogLyoKQEAgLTE4NSw2ICsxODUsMjM4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGFjY2VsZXJhdGlvbiAqLworc3RhdGljIGludCBwbTNmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBwbTNfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlQTTNfV0FJVChwYXIsIDIpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGaWx0ZXJNb2RlLCBQTTNGaWx0ZXJNb2RlU3luYyk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N5bmMsIDApOworCW1iKCk7CisJZG8geworCQl3aGlsZSAoKFBNM19SRUFEX1JFRyhwYXIsIFBNM091dEZJRk9Xb3JkcykpID09IDApOworCQlybWIoKTsKKwl9IHdoaWxlICgoUE0zX1JFQURfUkVHKHBhciwgUE0zT3V0cHV0RmlmbykpICE9IFBNM1N5bmNfVGFnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbTNmYl9pbml0X2VuZ2luZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcG0zX3BhciAqcGFyID0gaW5mby0+cGFyOworCWNvbnN0IHUzMiB3aWR0aCA9IChpbmZvLT52YXIueHJlc192aXJ0dWFsICsgNykgJiB+NzsKKworCVBNM19XQUlUKHBhciwgNTApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGaWx0ZXJNb2RlLCBQTTNGaWx0ZXJNb2RlU3luYyk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0YXRpc3RpY01vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RlbHRhTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUmFzdGVyaXplck1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1NjaXNzb3JNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNMaW5lU3RpcHBsZU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0FyZWFTdGlwcGxlTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zR0lETW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGVwdGhNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGVuY2lsTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RlbmNpbERhdGEsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0NvbG9yRERBTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvb3JkTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUluZGV4TW9kZTAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVJbmRleE1vZGUxLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlUmVhZE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xVVE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVGaWx0ZXJNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQ29tcG9zaXRlTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUFwcGxpY2F0aW9uTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvbXBvc2l0ZUNvbG9yTW9kZTEsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb21wb3NpdGVBbHBoYU1vZGUxLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQ29tcG9zaXRlQ29sb3JNb2RlMCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvbXBvc2l0ZUFscGhhTW9kZTAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZvZ01vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0Nocm9tYVRlc3RNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNBbHBoYVRlc3RNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNBbnRpYWxpYXNNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNZVVZNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNBbHBoYUJsZW5kQ29sb3JNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNBbHBoYUJsZW5kQWxwaGFNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNEaXRoZXJNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNMb2dpY2FsT3BNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNSb3V0ZXJNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNXaW5kb3csIDB4MCk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQ29uZmlnMkQsIDB4MCk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3BhbkNvbG9yTWFzaywgMHhmZmZmZmZmZik7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zWEJpYXMsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1lCaWFzLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNEZWx0YUNvbnRyb2wsIDB4MCk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQml0TWFza1BhdHRlcm4sIDB4ZmZmZmZmZmYpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCRGVzdFJlYWRFbmFibGVzLAorCQkJICAgUE0zRkJEZXN0UmVhZEVuYWJsZXNfRSgweGZmKSB8CisJCQkgICBQTTNGQkRlc3RSZWFkRW5hYmxlc19SKDB4ZmYpIHwKKwkJCSAgIFBNM0ZCRGVzdFJlYWRFbmFibGVzX1JlZmVyZW5jZUFscGhhKDB4ZmYpKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJEZXN0UmVhZEJ1ZmZlckFkZHIwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkRlc3RSZWFkQnVmZmVyT2Zmc2V0MCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJEZXN0UmVhZEJ1ZmZlcldpZHRoMCwKKwkJCSAgIFBNM0ZCRGVzdFJlYWRCdWZmZXJXaWR0aF9XaWR0aCh3aWR0aCkpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCRGVzdFJlYWRNb2RlLAorCQkJICAgUE0zRkJEZXN0UmVhZE1vZGVfUmVhZEVuYWJsZSB8CisJCQkgICBQTTNGQkRlc3RSZWFkTW9kZV9FbmFibGUwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJTb3VyY2VSZWFkQnVmZmVyQWRkciwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJTb3VyY2VSZWFkQnVmZmVyT2Zmc2V0LCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQlNvdXJjZVJlYWRCdWZmZXJXaWR0aCwKKwkJCSAgIFBNM0ZCU291cmNlUmVhZEJ1ZmZlcldpZHRoX1dpZHRoKHdpZHRoKSk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCU291cmNlUmVhZE1vZGUsCisJCQkgICBQTTNGQlNvdXJjZVJlYWRNb2RlX0Jsb2NraW5nIHwKKwkJCSAgIFBNM0ZCU291cmNlUmVhZE1vZGVfUmVhZEVuYWJsZSk7CisKKwlQTTNfV0FJVChwYXIsIDIpOworCXsKKwkJdW5zaWduZWQgbG9uZyBybSA9IDE7CisJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgODoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNQaXhlbFNpemUsCisJCQkJCSAgIFBNM1BpeGVsU2l6ZV9HTE9CQUxfOEJJVCk7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNQaXhlbFNpemUsCisJCQkJCSAgIFBNM1BpeGVsU2l6ZV9HTE9CQUxfMTZCSVQpOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUGl4ZWxTaXplLAorCQkJCQkgICBQTTNQaXhlbFNpemVfR0xPQkFMXzMyQklUKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygxLCAiVW5zdXBwb3J0ZWQgZGVwdGggJWRcbiIsCisJCQkJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKwkJCWJyZWFrOworCQl9CisJCVBNM19XUklURV9SRUcocGFyLCBQTTNSYXN0ZXJpemVyTW9kZSwgcm0pOworCX0KKworCVBNM19XQUlUKHBhciwgMjApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQlNvZnR3YXJlV3JpdGVNYXNrLCAweGZmZmZmZmZmKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJIYXJkd2FyZVdyaXRlTWFzaywgMHhmZmZmZmZmZik7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCV3JpdGVNb2RlLAorCQkJICAgUE0zRkJXcml0ZU1vZGVfV3JpdGVFbmFibGUgfAorCQkJICAgUE0zRkJXcml0ZU1vZGVfT3BhcXVlU3BhbiB8CisJCQkgICBQTTNGQldyaXRlTW9kZV9FbmFibGUwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJXcml0ZUJ1ZmZlckFkZHIwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQldyaXRlQnVmZmVyT2Zmc2V0MCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJXcml0ZUJ1ZmZlcldpZHRoMCwKKwkJCSAgIFBNM0ZCV3JpdGVCdWZmZXJXaWR0aF9XaWR0aCh3aWR0aCkpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1NpemVPZkZyYW1lYnVmZmVyLCAweDApOworCXsKKwkJLyogc2l6ZSBpbiBsaW5lcyBvZiBGQiAqLworCQl1bnNpZ25lZCBsb25nIHNvZmIgPSBpbmZvLT5zY3JlZW5fc2l6ZSAvCisJCQlpbmZvLT5maXgubGluZV9sZW5ndGg7CisJCWlmIChzb2ZiID4gNDA5NSkKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNTaXplT2ZGcmFtZWJ1ZmZlciwgNDA5NSk7CisJCWVsc2UKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNTaXplT2ZGcmFtZWJ1ZmZlciwgc29mYik7CisKKwkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSA4OgorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RpdGhlck1vZGUsCisJCQkJCSAgICgxIDw8IDEwKSB8ICgyIDw8IDMpKTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RpdGhlck1vZGUsCisJCQkJCSAgICgxIDw8IDEwKSB8ICgxIDw8IDMpKTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RpdGhlck1vZGUsCisJCQkJCSAgICgxIDw8IDEwKSB8ICgwIDw8IDMpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygxLCAiVW5zdXBwb3J0ZWQgZGVwdGggJWRcbiIsCisJCQkJaW5mby0+Y3VycmVudF9wYXItPmRlcHRoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM2RYRG9tLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNkWFN1YiwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zZFksICgxIDw8IDE2KSk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0YXJ0WERvbSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RhcnRYU3ViLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGFydFksIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0NvdW50LCAweDApOworCisvKiBEaXNhYmxlIExvY2FsQnVmZmVyLiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xCRGVzdFJlYWRNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNMQkRlc3RSZWFkRW5hYmxlcywgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTEJTb3VyY2VSZWFkTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTEJXcml0ZU1vZGUsIDB4MCk7CisKKwlwbTNmYl9zeW5jKGluZm8pOworfQorCitzdGF0aWMgdm9pZCBwbTNmYl9maWxscmVjdCAoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWdpb24pCit7CisJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZmJfZmlsbHJlY3QgbW9kZGVkOworCWludCB2eHJlcywgdnlyZXM7CisJdTMyIGNvbG9yID0gKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUikgPworCQkoKHUzMiopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ2lvbi0+Y29sb3JdIDogcmVnaW9uLT5jb2xvcjsKKworCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwkJcmV0dXJuOworCWlmICgoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgfHwKKwkJcmVnaW9uLT5yb3AgIT0gUk9QX0NPUFkgKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWdpb24pOworCQlyZXR1cm47CisJfQorCisJdnhyZXMgPSBpbmZvLT52YXIueHJlc192aXJ0dWFsOworCXZ5cmVzID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKKworCW1lbWNweSgmbW9kZGVkLCByZWdpb24sIHNpemVvZihzdHJ1Y3QgZmJfZmlsbHJlY3QpKTsKKworCWlmKCFtb2RkZWQud2lkdGggfHwgIW1vZGRlZC5oZWlnaHQgfHwKKwkgICBtb2RkZWQuZHggPj0gdnhyZXMgfHwgbW9kZGVkLmR5ID49IHZ5cmVzKQorCQlyZXR1cm47CisKKwlpZihtb2RkZWQuZHggKyBtb2RkZWQud2lkdGggID4gdnhyZXMpCisJCW1vZGRlZC53aWR0aCAgPSB2eHJlcyAtIG1vZGRlZC5keDsKKwlpZihtb2RkZWQuZHkgKyBtb2RkZWQuaGVpZ2h0ID4gdnlyZXMpCisJCW1vZGRlZC5oZWlnaHQgPSB2eXJlcyAtIG1vZGRlZC5keTsKKworCWlmKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSA4KQorCQljb2xvciB8PSBjb2xvciA8PCA4OworCWlmKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA8PSAxNikKKwkJY29sb3IgfD0gY29sb3IgPDwgMTY7CisKKwlQTTNfV0FJVChwYXIsIDQpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0NvbmZpZzJELAorCQkJCSAgUE0zQ29uZmlnMkRfVXNlQ29uc3RhbnRTb3VyY2UgfAorCQkJCSAgUE0zQ29uZmlnMkRfRm9yZWdyb3VuZFJPUEVuYWJsZSB8CisJCQkJICAoUE0zQ29uZmlnMkRfRm9yZWdyb3VuZFJPUCgweDMpKSB8CS8qIE94MyBpcyBHWGNvcHkgKi8KKwkJCQkgIFBNM0NvbmZpZzJEX0ZCV3JpdGVFbmFibGUpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZvcmVncm91bmRDb2xvciwgY29sb3IpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1JlY3RhbmdsZVBvc2l0aW9uLAorCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldChtb2RkZWQuZHgpKSB8CisJCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9ZT2Zmc2V0KG1vZGRlZC5keSkpKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNSZW5kZXIyRCwKKwkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKKwkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKKwkJICAgICAgUE0zUmVuZGVyMkRfT3BlcmF0aW9uX05vcm1hbCB8CisJCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAorCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgobW9kZGVkLndpZHRoKSkgfAorCQkgICAgICAoUE0zUmVuZGVyMkRfSGVpZ2h0KG1vZGRlZC5oZWlnaHQpKSk7Cit9CisvKiBlbmQgb2YgYWNjZWxlcmF0aW9uIGZ1bmN0aW9ucyAqLworCiAvKiB3cml0ZSB0aGUgbW9kZSB0byByZWdpc3RlcnMgKi8KIHN0YXRpYyB2b2lkIHBtM2ZiX3dyaXRlX21vZGUoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CkBAIC0zODAsOCArNjEyLDYgQEAKIC8qCiAgKiBoYXJkd2FyZSBpbmRlcGVuZGVudCBmdW5jdGlvbnMKICAqLwotaW50IHBtM2ZiX2luaXQodm9pZCk7Ci0KIHN0YXRpYyBpbnQgcG0zZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAl1MzIgbHBpdGNoOwpAQCAtNTI4LDYgKzc1OCw3IEBACiAJcG0zZmJfY2xlYXJfY29sb3JtYXAocGFyLCAwLCAwLCAwKTsKIAlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX0N1cnNvck1vZGUsCiAJCQkgIFBNM1JEX0N1cnNvck1vZGVfQ1VSU09SX0RJU0FCTEUpOworCXBtM2ZiX2luaXRfZW5naW5lKGluZm8pOwogCXBtM2ZiX3dyaXRlX21vZGUoaW5mbyk7CiAJcmV0dXJuIDA7CiB9CkBAIC02NzUsMTAgKzkwNiwxMSBAQAogCS5mYl9zZXRfcGFyCT0gcG0zZmJfc2V0X3BhciwKIAkuZmJfc2V0Y29scmVnCT0gcG0zZmJfc2V0Y29scmVnLAogCS5mYl9wYW5fZGlzcGxheQk9IHBtM2ZiX3Bhbl9kaXNwbGF5LAotCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKKwkuZmJfZmlsbHJlY3QJPSBwbTNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCiAJLmZiX2JsYW5rCT0gcG0zZmJfYmxhbmssCisJLmZiX3N5bmMJPSBwbTNmYl9zeW5jLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODQ3LDcgKzEwNzksOCBAQAogCiAJaW5mby0+Zml4ID0gcG0zZmJfZml4OwogCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wYWxldHRlOwotCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7LyogfCBGQklORk9fSFdBQ0NFTF9ZUEFOOyovCisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8CisJCQlGQklORk9fSFdBQ0NFTF9GSUxMUkVDVDsvKiB8IEZCSU5GT19IV0FDQ0VMX1lQQU47Ki8KIAogCS8qCiAJICogVGhpcyBzaG91bGQgZ2l2ZSBhIHJlYXNvbmFibGUgZGVmYXVsdCB2aWRlbyBtb2RlLiBUaGUgZm9sbG93aW5nIGlzCkBAIC05MzUsMzUgKzExNjgsMTIgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBtM2ZiX2lkX3RhYmxlKTsKIAotI2lmbmRlZiBNT0RVTEUKLQkvKgotCSAqICBTZXR1cAotCSAqLwotCi0vKgotICogT25seSBuZWNlc3NhcnkgaWYgeW91ciBkcml2ZXIgdGFrZXMgc3BlY2lhbCBvcHRpb25zLAotICogb3RoZXJ3aXNlIHdlIGZhbGwgYmFjayBvbiB0aGUgZ2VuZXJpYyBmYl9zZXR1cCgpLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBwbTNmYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgcG0zZmJfaW5pdCh2b2lkKQogewotCS8qIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz1wbTNmYjonKSAqLwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIE1PRFVMRSAqLwotCi1pbnQgX19pbml0IHBtM2ZiX2luaXQodm9pZCkKLXsKLQkvKgotCSAqICBGb3Iga2VybmVsIGJvb3Qgb3B0aW9ucyAoaW4gJ3ZpZGVvPXBtM2ZiOjxvcHRpb25zPicgZm9ybWF0KQotCSAqLwogI2lmbmRlZiBNT0RVTEUKLQljaGFyICpvcHRpb24gPSBOVUxMOwotCi0JaWYgKGZiX2dldF9vcHRpb25zKCJwbTNmYiIsICZvcHRpb24pKQorCWlmIChmYl9nZXRfb3B0aW9ucygicG0zZmIiLCBOVUxMKSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JcG0zZmJfc2V0dXAob3B0aW9uKTsKICNlbmRpZgotCiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBtM2ZiX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHMzZmIuYyBiL2RyaXZlcnMvdmlkZW8vcHMzZmIuYwppbmRleCA5Y2Y5MmJhLi4zOTcyYWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wczNmYi5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KQEAgLTQ2LDYgKzQ1LDkgQEAKICNpbmNsdWRlIDxhc20vcHMzZmIuaD4KICNpbmNsdWRlIDxhc20vcHMzLmg+CiAKKworI2RlZmluZSBERVZJQ0VfTkFNRQkJInBzM2ZiIgorCiAjaWZkZWYgUFMzRkJfREVCVUcKICNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pIHByaW50aygiJXM6ICIgZm10LCBfX2Z1bmNfXyAsICMjYXJncykKICNlbHNlCkBAIC0xMjYsNyArMTI4LDYgQEAKIAogc3RydWN0IHBzM2ZiX3ByaXYgewogCXVuc2lnbmVkIGludCBpcnFfbm87Ci0Jdm9pZCAqZGV2OwogCiAJdTY0IGNvbnRleHRfaGFuZGxlLCBtZW1vcnlfaGFuZGxlOwogCXZvaWQgKnhkcl9lYTsKQEAgLTE3MSw3ICsxNzIsNyBAQAogCXsgICAgMCwgICAgMCwgICAwLCAgIDAgLCAwfSB9OwogCiAvKiBkZWZhdWx0IHJlc29sdXRpb24gKi8KLSNkZWZpbmUgR1BVX1JFU19JTkRFWCAwCQkvKiA3MjAgeCA0ODAgKi8KKyNkZWZpbmUgR1BVX1JFU19JTkRFWAkwCQkvKiA3MjAgeCA0ODAgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgcHMzZmJfbW9kZWRiW10gPSB7CiAgICAgLyogNjAgSHogYnJvYWRjYXN0IG1vZGVzIChtb2RlcyAiMSIgdG8gIjUiKSAqLwpAQCAtMjk4LDEwICsyOTksOSBAQAogI2RlZmluZSBGQl9PRkYoaSkJKEdQVV9PRkZTRVQgLSBWUF9PRkYoaSkgJSBHUFVfT0ZGU0VUKQogCiBzdGF0aWMgaW50IHBzM2ZiX21vZGU7Ci1tb2R1bGVfcGFyYW0ocHMzZmJfbW9kZSwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0ocHMzZmJfbW9kZSwgaW50LCAwKTsKIAotc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9faW5pdGRhdGE7Ci0KK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2RldmluaXRkYXRhOwogCiBzdGF0aWMgaW50IHBzM2ZiX2dldF9yZXNfdGFibGUodTMyIHhyZXMsIHUzMiB5cmVzKQogewpAQCAtNjgxLDE1ICs2ODEsMTUgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwocHMzZmJfd2FpdF9mb3JfdnN5bmMpOwogCi12b2lkIHBzM2ZiX2ZsaXBfY3RsKGludCBvbikKK3ZvaWQgcHMzZmJfZmxpcF9jdGwoaW50IG9uLCB2b2lkICpkYXRhKQogeworCXN0cnVjdCBwczNmYl9wcml2ICpwcml2ID0gZGF0YTsKIAlpZiAob24pCi0JCWF0b21pY19kZWNfaWZfcG9zaXRpdmUoJnBzM2ZiLmV4dF9mbGlwKTsKKwkJYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmcHJpdi0+ZXh0X2ZsaXApOwogCWVsc2UKLQkJYXRvbWljX2luYygmcHMzZmIuZXh0X2ZsaXApOworCQlhdG9taWNfaW5jKCZwcml2LT5leHRfZmxpcCk7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHBzM2ZiX2ZsaXBfY3RsKTsKIAogICAgIC8qCiAgICAgICogaW9jdGwKQEAgLTgxMiw2ICs4MTIsNyBAQAogCiBzdGF0aWMgaW50IHBzM2ZiZCh2b2lkICphcmcpCiB7CisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXRyeV90b19mcmVlemUoKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTg1MSwzNyArODUyLDkgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLSNpZm5kZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdCBwczNmYl9zZXR1cChjaGFyICpvcHRpb25zKQotewotCWNoYXIgKnRoaXNfb3B0OwotCWludCBtb2RlID0gMDsKIAotCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCi0JCXJldHVybiAwOwkvKiBubyBvcHRpb25zICovCi0KLQl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghKnRoaXNfb3B0KQotCQkJY29udGludWU7Ci0JCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm1vZGU6IiwgNSkpCi0JCQltb2RlID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA1LCBOVUxMLCAwKTsKLQkJZWxzZQotCQkJbW9kZV9vcHRpb24gPSB0aGlzX29wdDsKLQl9Ci0JcmV0dXJuIG1vZGU7Ci19Ci0jZW5kaWYJLyogTU9EVUxFICovCi0KLSAgICAvKgotICAgICAqICBJbml0aWFsaXNhdGlvbgotICAgICAqLwotCi1zdGF0aWMgdm9pZCBwczNmYl9wbGF0Zm9ybV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKLXsKLQkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvLiAqLwotfQotCi1zdGF0aWMgaW50IHBzM2ZiX3ZzeW5jX3NldHRpbmdzKHN0cnVjdCBncHVfZHJpdmVyX2luZm8gKmRpbmZvLCB2b2lkICpkZXYpCitzdGF0aWMgaW50IHBzM2ZiX3ZzeW5jX3NldHRpbmdzKHN0cnVjdCBncHVfZHJpdmVyX2luZm8gKmRpbmZvLAorCQkJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTg5Nyw3ICs4NzAsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwczNmYi5kZXYgPSBkZXY7CiAJZXJyb3IgPSBwczNfaXJxX3BsdWdfc2V0dXAoUFMzX0JJTkRJTkdfQ1BVX0FOWSwgZGluZm8tPmlycS5pcnFfb3V0bGV0LAogCQkJCSAgICZwczNmYi5pcnFfbm8pOwogCWlmIChlcnJvcikgewpAQCAtOTA3LDcgKzg3OSw3IEBACiAJfQogCiAJZXJyb3IgPSByZXF1ZXN0X2lycShwczNmYi5pcnFfbm8sIHBzM2ZiX3ZzeW5jX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKLQkJCSAgICAicHMzZmIgdnN5bmMiLCBwczNmYi5kZXYpOworCQkJICAgIERFVklDRV9OQU1FLCBkZXYpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXF1ZXN0X2lycSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAogCQkgICAgICAgZXJyb3IpOwpAQCAtOTY2LDE2ICs5MzgsNDUgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gcHMzZmJfZml4IF9faW5pdGRhdGEgPSB7Ci0JLmlkID0JCSJQUzMgRkIiLAorCS5pZCA9CQlERVZJQ0VfTkFNRSwKIAkudHlwZSA9CQlGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCiAJLnZpc3VhbCA9CUZCX1ZJU1VBTF9UUlVFQ09MT1IsCiAJLmFjY2VsID0JRkJfQUNDRUxfTk9ORSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBzM2ZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzZmJfc2V0X3N5bmModm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisjaWZkZWYgSEVBRF9BCisJc3RhdHVzID0gbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSgweDAsCisJCQkJCSAgIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0RJU1BMQVlfU1lOQywKKwkJCQkJICAgMCwgTDFHUFVfRElTUExBWV9TWU5DX1ZTWU5DLCAwLCAwKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUgRElTUExBWV9TWU5DICIKKwkJICAgICAgICJmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorI2lmZGVmIEhFQURfQgorCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUoMHgwLAorCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9ESVNQTEFZX1NZTkMsCisJCQkJCSAgIDEsIEwxR1BVX0RJU1BMQVlfU1lOQ19WU1lOQywgMCwgMCk7CisKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUgRElTUExBWV9NT0RFICIKKwkJICAgICAgICJmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwczNmYl9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJaW50IHJldHZhbCA9IC1FTk9NRU07CisJdTMyIHhyZXMsIHlyZXM7CiAJdTY0IGRkcl9scGFyID0gMDsKIAl1NjQgbHBhcl9kbWFfY29udHJvbCA9IDA7CiAJdTY0IGxwYXJfZHJpdmVyX2luZm8gPSAwOwpAQCAtOTg2LDYgKzk4NywzMCBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAorCXN0YXR1cyA9IHBzM19vcGVuX2h2X2RldmljZShkZXYpOworCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcHMzX29wZW5faHZfZGV2aWNlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIXBzM2ZiX21vZGUpCisJCXBzM2ZiX21vZGUgPSBwczNhdl9nZXRfbW9kZSgpOworCURQUklOVEsoInBzM2F2X21vZGU6JWRcbiIsIHBzM2ZiX21vZGUpOworCisJaWYgKHBzM2ZiX21vZGUgPiAwICYmCisJICAgICFwczNhdl92aWRlb19tb2RlMnJlcyhwczNmYl9tb2RlLCAmeHJlcywgJnlyZXMpKSB7CisJCXBzM2ZiLnJlc19pbmRleCA9IHBzM2ZiX2dldF9yZXNfdGFibGUoeHJlcywgeXJlcyk7CisJCURQUklOVEsoInJlc19pbmRleDolZFxuIiwgcHMzZmIucmVzX2luZGV4KTsKKwl9IGVsc2UKKwkJcHMzZmIucmVzX2luZGV4ID0gR1BVX1JFU19JTkRFWDsKKworCWF0b21pY19zZXQoJnBzM2ZiLmZfY291bnQsIC0xKTsJLyogZmJjb24gb3BlbnMgcHMzZmIgKi8KKwlhdG9taWNfc2V0KCZwczNmYi5leHRfZmxpcCwgMCk7CS8qIGZvciBmbGlwIHdpdGggdnN5bmMgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwczNmYi53YWl0X3ZzeW5jKTsKKwlwczNmYi5udW1fZnJhbWVzID0gMTsKKworCXBzM2ZiX3NldF9zeW5jKCk7CisKIAkvKiBnZXQgZ3B1IGNvbnRleHQgaGFuZGxlICovCiAJc3RhdHVzID0gbHYxX2dwdV9tZW1vcnlfYWxsb2NhdGUoRERSX1NJWkUsIDAsIDAsIDAsIDAsCiAJCQkJCSAmcHMzZmIubWVtb3J5X2hhbmRsZSwgJmRkcl9scGFyKTsKQEAgLTEwMjksNyArMTA1NCw3IEBACiAJICogbGVha2FnZSBpbnRvIHVzZXJzcGFjZQogCSAqLwogCW1lbXNldChwczNmYi54ZHJfZWEsIDAsIHBzM2ZiX3ZpZGVvbWVtb3J5LnNpemUpOwotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2YodTMyKSAqIDE2LCAmZGV2LT5kZXYpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2YodTMyKSAqIDE2LCAmZGV2LT5jb3JlKTsKIAlpZiAoIWluZm8pCiAJCWdvdG8gZXJyX2ZyZWVfaXJxOwogCkBAIC0xMDYxLDE5ICsxMDg2LDIwIEBACiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZXJyX2ZiX2RlYWxsb2M7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIGluZm8pOworCWRldi0+Y29yZS5kcml2ZXJfZGF0YSA9IGluZm87CiAKIAlwcmludGsoS0VSTl9JTkZPCiAJICAgICAgICJmYiVkOiBQUzMgZnJhbWUgYnVmZmVyIGRldmljZSwgdXNpbmcgJWxkIEtpQiBvZiB2aWRlbyBtZW1vcnlcbiIsCiAJICAgICAgIGluZm8tPm5vZGUsIHBzM2ZiX3ZpZGVvbWVtb3J5LnNpemUgPj4gMTApOwogCi0JdGFzayA9IGt0aHJlYWRfcnVuKHBzM2ZiZCwgaW5mbywgInBzM2ZiZCIpOworCXRhc2sgPSBrdGhyZWFkX3J1bihwczNmYmQsIGluZm8sIERFVklDRV9OQU1FKTsKIAlpZiAoSVNfRVJSKHRhc2spKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIodGFzayk7CiAJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZnJhbWVidWZmZXI7CiAJfQogCiAJcHMzZmIudGFzayA9IHRhc2s7CisJcHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwocHMzZmJfZmxpcF9jdGwsICZwczNmYik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTA4NCw3ICsxMTEwLDcgQEAKIGVycl9mcmFtZWJ1ZmZlcl9yZWxlYXNlOgogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiBlcnJfZnJlZV9pcnE6Ci0JZnJlZV9pcnEocHMzZmIuaXJxX25vLCBwczNmYi5kZXYpOworCWZyZWVfaXJxKHBzM2ZiLmlycV9ubywgZGV2KTsKIAlwczNfaXJxX3BsdWdfZGVzdHJveShwczNmYi5pcnFfbm8pOwogZXJyX2lvdW5tYXBfZGluZm86CiAJaW91bm1hcCgodTggX19pb21lbSAqKXBzM2ZiLmRpbmZvKTsKQEAgLTEwOTYsMjYgKzExMjIsMzAgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBwczNmYl9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JcHMzZmJfZmxpcF9jdGwoMCk7CS8qIGZsaXAgb2ZmICovCi0JcHMzZmIuZGluZm8tPmlycS5tYXNrID0gMDsKLQlmcmVlX2lycShwczNmYi5pcnFfbm8sIHBzM2ZiLmRldik7Ci0JcHMzX2lycV9wbHVnX2Rlc3Ryb3kocHMzZmIuaXJxX25vKTsKLQlpb3VubWFwKCh1OCBfX2lvbWVtICopcHMzZmIuZGluZm8pOwotfQotCi12b2lkIHBzM2ZiX2NsZWFudXAodm9pZCkKK3N0YXRpYyBpbnQgcHMzZmJfc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCBzdGF0dXM7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXYtPmNvcmUuZHJpdmVyX2RhdGE7CiAKKwlEUFJJTlRLKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwczNmYl9mbGlwX2N0bCgwLCAmcHMzZmIpOwkvKiBmbGlwIG9mZiAqLworCXBzM2ZiLmRpbmZvLT5pcnEubWFzayA9IDA7CisKKwlpZiAoaW5mbykgeworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCX0KKworCXBzM2F2X3JlZ2lzdGVyX2ZsaXBfY3RsKE5VTEwsIE5VTEwpOwogCWlmIChwczNmYi50YXNrKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHBzM2ZiLnRhc2s7CiAJCXBzM2ZiLnRhc2sgPSBOVUxMOwogCQlrdGhyZWFkX3N0b3AodGFzayk7CiAJfQogCWlmIChwczNmYi5pcnFfbm8pIHsKLQkJZnJlZV9pcnEocHMzZmIuaXJxX25vLCBwczNmYi5kZXYpOworCQlmcmVlX2lycShwczNmYi5pcnFfbm8sIGRldik7CiAJCXBzM19pcnFfcGx1Z19kZXN0cm95KHBzM2ZiLmlycV9ubyk7CiAJfQogCWlvdW5tYXAoKHU4IF9faW9tZW0gKilwczNmYi5kaW5mbyk7CkBAIC0xMTI4LDEzNCArMTE1OCw2OSBAQAogCWlmIChzdGF0dXMpCiAJCURQUklOVEsoImx2MV9ncHVfbWVtb3J5X2ZyZWUgZmFpbGVkOiAlZFxuIiwgc3RhdHVzKTsKIAotCXBzM2F2X2Rldl9jbG9zZSgpOwotfQorCXBzM19jbG9zZV9odl9kZXZpY2UoZGV2KTsKKwlEUFJJTlRLKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHBzM2ZiX2NsZWFudXApOwotCi1zdGF0aWMgaW50IHBzM2ZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZiX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKGluZm8pIHsKLQkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKLQkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKLQkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLQl9Ci0JcHMzZmJfY2xlYW51cCgpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwczNmYl9kcml2ZXIgPSB7Ci0JLnByb2JlCT0gcHMzZmJfcHJvYmUsCi0JLnJlbW92ZSA9IHBzM2ZiX3JlbW92ZSwKLQkuc2h1dGRvd24gPSBwczNmYl9zaHV0ZG93biwKLQkuZHJpdmVyID0geyAubmFtZSA9ICJwczNmYiIgfQorc3RhdGljIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgcHMzZmJfZHJpdmVyID0geworCS5tYXRjaF9pZAk9IFBTM19NQVRDSF9JRF9HUkFQSElDUywKKwkuY29yZS5uYW1lCT0gREVWSUNFX05BTUUsCisJLmNvcmUub3duZXIJPSBUSElTX01PRFVMRSwKKwkucHJvYmUJCT0gcHMzZmJfcHJvYmUsCisJLnJlbW92ZQkJPSBwczNmYl9zaHV0ZG93biwKKwkuc2h1dGRvd24JPSBwczNmYl9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBzM2ZiX2RldmljZSA9IHsKLQkubmFtZQk9ICJwczNmYiIsCi0JLmlkCT0gMCwKLQkuZGV2CT0geyAucmVsZWFzZSA9IHBzM2ZiX3BsYXRmb3JtX3JlbGVhc2UgfQotfTsKLQotaW50IHBzM2ZiX3NldF9zeW5jKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwczNmYl9zZXR1cCh2b2lkKQogewotCWludCBzdGF0dXM7CisJY2hhciAqb3B0aW9uczsKIAotI2lmZGVmIEhFQURfQQotCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUoMHgwLAotCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9ESVNQTEFZX1NZTkMsCi0JCQkJCSAgIDAsIEwxR1BVX0RJU1BMQVlfU1lOQ19WU1lOQywgMCwgMCk7Ci0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlczogbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSBESVNQTEFZX1NZTkMgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotCQlyZXR1cm4gLTE7Ci0JfQorI2lmZGVmIE1PRFVMRQorCXJldHVybiAwOwogI2VuZGlmCi0jaWZkZWYgSEVBRF9CCi0Jc3RhdHVzID0gbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSgweDAsCi0JCQkJCSAgIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0RJU1BMQVlfU1lOQywKLQkJCQkJICAgMSwgTDFHUFVfRElTUExBWV9TWU5DX1ZTWU5DLCAwLCAwKTsKIAotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUgRElTUExBWV9NT0RFIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcmV0dXJuIC0xOworCWlmIChmYl9nZXRfb3B0aW9ucyhERVZJQ0VfTkFNRSwgJm9wdGlvbnMpKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoMSkgeworCQljaGFyICp0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKTsKKworCQlpZiAoIXRoaXNfb3B0KQorCQkJYnJlYWs7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm1vZGU6IiwgNSkpCisJCQlwczNmYl9tb2RlID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA1LCBOVUxMLCAwKTsKKwkJZWxzZQorCQkJbW9kZV9vcHRpb24gPSB0aGlzX29wdDsKIAl9Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwocHMzZmJfc2V0X3N5bmMpOwotCiBzdGF0aWMgaW50IF9faW5pdCBwczNmYl9pbml0KHZvaWQpCiB7Ci0JaW50IGVycm9yOwotI2lmbmRlZiBNT0RVTEUKLQlpbnQgbW9kZTsKLQljaGFyICpvcHRpb24gPSBOVUxMOworCWlmICghcHMzZmJfdmlkZW9tZW1vcnkuYWRkcmVzcyB8fCAgcHMzZmJfc2V0dXAoKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAotCWlmIChmYl9nZXRfb3B0aW9ucygicHMzZmIiLCAmb3B0aW9uKSkKLQkJZ290byBlcnI7Ci0jZW5kaWYKKwlyZXR1cm4gcHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKCZwczNmYl9kcml2ZXIpOworfQogCi0JaWYgKCFwczNmYl92aWRlb21lbW9yeS5hZGRyZXNzKQotCQlnb3RvIGVycjsKLQotCWVycm9yID0gcHMzYXZfZGV2X29wZW4oKTsKLQlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogcHMzYXZfZGV2X29wZW4gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXBzM2ZiX21vZGUgPSBwczNhdl9nZXRfbW9kZSgpOwotCURQUklOVEsoInBzM2F2X21vZGU6JWRcbiIsIHBzM2ZiX21vZGUpOwotI2lmbmRlZiBNT0RVTEUKLQltb2RlID0gcHMzZmJfc2V0dXAob3B0aW9uKTsJLyogY2hlY2sgYm9vdCBvcHRpb24gKi8KLQlpZiAobW9kZSkKLQkJcHMzZmJfbW9kZSA9IG1vZGU7Ci0jZW5kaWYKLQlpZiAocHMzZmJfbW9kZSA+IDApIHsKLQkJdTMyIHhyZXMsIHlyZXM7Ci0JCXBzM2F2X3ZpZGVvX21vZGUycmVzKHBzM2ZiX21vZGUsICZ4cmVzLCAmeXJlcyk7Ci0JCXBzM2ZiLnJlc19pbmRleCA9IHBzM2ZiX2dldF9yZXNfdGFibGUoeHJlcywgeXJlcyk7Ci0JCURQUklOVEsoInJlc19pbmRleDolZFxuIiwgcHMzZmIucmVzX2luZGV4KTsKLQl9IGVsc2UKLQkJcHMzZmIucmVzX2luZGV4ID0gR1BVX1JFU19JTkRFWDsKLQotCWF0b21pY19zZXQoJnBzM2ZiLmZfY291bnQsIC0xKTsJLyogZmJjb24gb3BlbnMgcHMzZmIgKi8KLQlhdG9taWNfc2V0KCZwczNmYi5leHRfZmxpcCwgMCk7CS8qIGZvciBmbGlwIHdpdGggdnN5bmMgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwczNmYi53YWl0X3ZzeW5jKTsKLQlwczNmYi5udW1fZnJhbWVzID0gMTsKLQotCWVycm9yID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwczNmYl9kcml2ZXIpOwotCWlmICghZXJyb3IpIHsKLQkJZXJyb3IgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBzM2ZiX2RldmljZSk7Ci0JCWlmIChlcnJvcikKLQkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwczNmYl9kcml2ZXIpOwotCX0KLQotCXBzM2ZiX3NldF9zeW5jKCk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci0KLWVycjoKLQlyZXR1cm4gLUVOWElPOworc3RhdGljIHZvaWQgX19leGl0IHBzM2ZiX2V4aXQodm9pZCkKK3sKKwlEUFJJTlRLKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIoJnBzM2ZiX2RyaXZlcik7CisJRFBSSU5USygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQogCiBtb2R1bGVfaW5pdChwczNmYl9pbml0KTsKLQotI2lmZGVmIE1PRFVMRQotc3RhdGljIHZvaWQgX19leGl0IHBzM2ZiX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmcHMzZmJfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKLX0KLQogbW9kdWxlX2V4aXQocHMzZmJfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLSNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KK01PRFVMRV9ERVNDUklQVElPTigiUFMzIEdQVSBGcmFtZSBCdWZmZXIgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLiIpOworTU9EVUxFX0FMSUFTKFBTM19NT0RVTEVfQUxJQVNfR1JBUEhJQ1MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wdnIyZmIuYyBiL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMKaW5kZXggZGYyOTA5YS4uMGY4OGMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wdnIyZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jCkBAIC0xMTUsMTEgKzExNSwxMSBAQAogZW51bSB7IFBBTF9BUkdCMTU1NSwgUEFMX1JHQjU2NSwgUEFMX0FSR0I0NDQ0LCBQQUxfQVJHQjg4ODggfTsKIAogc3RydWN0IHB2cjJfcGFyYW1zIHsgdW5zaWduZWQgaW50IHZhbDsgY2hhciAqbmFtZTsgfTsKLXN0YXRpYyBzdHJ1Y3QgcHZyMl9wYXJhbXMgY2FibGVzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcHZyMl9wYXJhbXMgY2FibGVzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7IENUX1ZHQSwgIlZHQSIgfSwgeyBDVF9SR0IsICJSR0IiIH0sIHsgQ1RfQ09NUE9TSVRFLCAiQ09NUE9TSVRFIiB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwdnIyX3BhcmFtcyBvdXRwdXRzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcHZyMl9wYXJhbXMgb3V0cHV0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBWT19QQUwsICJQQUwiIH0sIHsgVk9fTlRTQywgIk5UU0MiIH0sIHsgVk9fVkdBLCAiVkdBIiB9LAogfTsKIApAQCAtMTQ3LDE2ICsxNDcsMTYgQEAKIAogc3RhdGljIHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvOwogCi1zdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHB2cjJfZml4IF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHB2cjJfZml4IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlkID0JCSJORUMgUG93ZXJWUjIiLAotCS50eXBlID0gCUZCX1RZUEVfUEFDS0VEX1BJWEVMUywKLQkudmlzdWFsID0gCUZCX1ZJU1VBTF9UUlVFQ09MT1IsCisJLnR5cGUgPQkJRkJfVFlQRV9QQUNLRURfUElYRUxTLAorCS52aXN1YWwgPQlGQl9WSVNVQUxfVFJVRUNPTE9SLAogCS55cGFuc3RlcCA9CTEsCiAJLnl3cmFwc3RlcCA9CTEsCi0JLmFjY2VsID0gCUZCX0FDQ0VMX05PTkUsCisJLmFjY2VsID0JRkJfQUNDRUxfTk9ORSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gcHZyMl92YXIgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gcHZyMl92YXIgX19kZXZpbml0ZGF0YSA9IHsKIAkueHJlcyA9CQk2NDAsCiAJLnlyZXMgPQkJNDgwLAogCS54cmVzX3ZpcnR1YWwgPQk2NDAsCkBAIC0xOTUsMTAgKzE5NSw2IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHB2cjJkbWEgPSBPTkNISVBfTlJfRE1BX0NIQU5ORUxTOwogI2VuZGlmCiAKLS8qIEludGVyZmFjZSB1c2VkIGJ5IHRoZSB3b3JsZCAqLwotCi1pbnQgcHZyMmZiX3NldHVwKGNoYXIqKTsKLQogc3RhdGljIGludCBwdnIyZmJfc2V0Y29scmVnKHVuc2lnbmVkIGludCByZWdubywgdW5zaWduZWQgaW50IHJlZCwgdW5zaWduZWQgaW50IGdyZWVuLCB1bnNpZ25lZCBpbnQgYmx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgaW50IHB2cjJmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKQEAgLTIyNywxMiArMjIzLDEyIEBACiAjaWZkZWYgQ09ORklHX1NIX0RNQQogCS5mYl93cml0ZQk9IHB2cjJmYl93cml0ZSwKICNlbmRpZgotCS5mYl9maWxscmVjdCAJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKIAkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIHB2cjJfbW9kZWRiW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIHB2cjJfbW9kZWRiW10gX19kZXZpbml0ZGF0YSA9IHsKICAgICAvKgogICAgICAqIEJyb2FkY2FzdCB2aWRlbyBtb2RlcyAoUEFMIGFuZCBOVFNDKS4gIEknbSB1bmZhbWlsaWFyIHdpdGgKICAgICAgKiBQQUwtTSBhbmQgUEFMLU4sIGJ1dCBmcm9tIHdoYXQgSSd2ZSByZWFkIGJvdGggbW9kZXMgcGFyYWxsZWwgUEFMIGFuZApAQCAtMjUyLDcgKzI0OCw3IEBACiAJLyogNjQweDQ4MCBAIDYwaHogKFZHQSkgKi8KIAkidmdhXzY0MHg0ODAiLCA2MCwgNjQwLCA0ODAsIFZHQV9DTEssIDM4LCAzMywgMCwgMTgsIDE0NiwgMjYsCiAJMCwgRkJfVk1PREVfWVdSQVAKLSAgICB9LCAKKyAgICB9LAogfTsKIAogI2RlZmluZSBOVU1fVE9UQUxfTU9ERVMgIEFSUkFZX1NJWkUocHZyMl9tb2RlZGIpCkBAIC0yNjIsNyArMjU4LDcgQEAKICNkZWZpbmUgREVGTU9ERV9WR0EJMgogCiBzdGF0aWMgaW50IGRlZm1vZGUgPSBERUZNT0RFX05UU0M7Ci1zdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19pbml0ZGF0YSA9IE5VTEw7CitzdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19kZXZpbml0ZGF0YSA9IE5VTEw7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdnIyZmJfc2V0X3BhbF90eXBlKHVuc2lnbmVkIGludCB0eXBlKQogewpAQCAtMjkzLDcgKzI4OSw3IEBACiB7CiAJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CiAJICAgIGNhc2UgMTY6ICAgICAgICAvKiBSR0IgNTY1ICovCi0JICAgIAlwdnIyZmJfc2V0X3BhbF90eXBlKFBBTF9SR0I1NjUpOworCQlwdnIyZmJfc2V0X3BhbF90eXBlKFBBTF9SR0I1NjUpOwogCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsgICAgdmFyLT5yZWQubGVuZ3RoID0gNTsKIAkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OyAgIHZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKIAkJdmFyLT5ibHVlLm9mZnNldCA9IDA7ICAgIHZhci0+Ymx1ZS5sZW5ndGggPSA1OwpAQCAtMzA2LDcgKzMwMiw3IEBACiAJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7ICB2YXItPnRyYW5zcC5sZW5ndGggPSAwOwogCQlicmVhazsKIAkgICAgY2FzZSAzMjogICAgICAgIC8qIEFSR0IgODg4OCAqLwotCSAgICAJcHZyMmZiX3NldF9wYWxfdHlwZShQQUxfQVJHQjg4ODgpOworCQlwdnIyZmJfc2V0X3BhbF90eXBlKFBBTF9BUkdCODg4OCk7CiAJCXZhci0+cmVkLm9mZnNldCA9IDE2OyAgICB2YXItPnJlZC5sZW5ndGggPSA4OwogCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7ICAgdmFyLT5ncmVlbi5sZW5ndGggPSA4OwogCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsgICAgdmFyLT5ibHVlLmxlbmd0aCA9IDg7CkBAIC0zMzcsMjQgKzMzMywyNSBAQAogCQkgICAgICAoKGJsdWUgICYgMHhmODAwKSA+PiAxMSk7CiAKIAkJcHZyMmZiX3NldF9wYWxfZW50cnkocGFyLCByZWdubywgdG1wKTsKLQkJKCh1MTYqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHRtcDsKIAkJYnJlYWs7CiAJICAgIGNhc2UgMjQ6IC8qIFJHQiA4ODggKi8KIAkJcmVkID4+PSA4OyBncmVlbiA+Pj0gODsgYmx1ZSA+Pj0gODsKLQkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKKwkJdG1wID0gKHJlZCA8PCAxNikgfCAoZ3JlZW4gPDwgOCkgfCBibHVlOwogCQlicmVhazsKIAkgICAgY2FzZSAzMjogLyogQVJHQiA4ODg4ICovCiAJCXJlZCA+Pj0gODsgZ3JlZW4gPj49IDg7IGJsdWUgPj49IDg7CiAJCXRtcCA9ICh0cmFuc3AgPDwgMjQpIHwgKHJlZCA8PCAxNikgfCAoZ3JlZW4gPDwgOCkgfCBibHVlOwogCiAJCXB2cjJmYl9zZXRfcGFsX2VudHJ5KHBhciwgcmVnbm8sIHRtcCk7Ci0JCSgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSB0bXA7CiAJCWJyZWFrOwogCSAgICBkZWZhdWx0OgogCQlwcl9kZWJ1ZygiSW52YWxpZCBiaXQgZGVwdGggJWQ/IT9cbiIsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CiAJCXJldHVybiAxOwogCX0KIAorCWlmIChyZWdubyA8IDE2KQorCQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdG1wOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3OSwxMyArMzc2LDEzIEBACiAJdmFyLT52bW9kZSAmPSBGQl9WTU9ERV9NQVNLOwogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCAmJiB2aWRlb19vdXRwdXQgIT0gVk9fVkdBKQogCQlwYXItPmlzX2ludGVybGFjZWQgPSAxOwotCS8qIAorCS8qCiAJICogWFhYOiBOZWVkIHRvIGJlIG1vcmUgY3JlYXRpdmUgd2l0aCB0aGlzIChpLmUuIGFsbG93IGRvdWJsZWNhbiBmb3IKIAkgKiBQQUwvTlRTQyBvdXRwdXQpLgogCSAqLwogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFICYmIHZpZGVvX291dHB1dCA9PSBWT19WR0EpCiAJCXBhci0+aXNfZG91Ymxlc2NhbiA9IDE7Ci0JCisKIAlwYXItPmhzeW5jX3RvdGFsID0gdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luICsKIAkgICAgICAgICAgICAgICAgICAgdmFyLT5oc3luY19sZW47CiAJcGFyLT52c3luY190b3RhbCA9IHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKwpAQCAtNDA4LDcgKzQwNSw3IEBACiAJfSBlbHNlIHsKIAkJLyogVkdBIG1vZGUgKi8KIAkJLyogWFhYOiBXaGF0IGVsc2UgbmVlZHMgdG8gYmUgY2hlY2tlZD8gKi8KLQkJLyogCisJCS8qCiAJCSAqIFhYWDogV2UgaGF2ZSBhIGxpdHRsZSBmcmVlZG9tIGluIFZHQSBtb2Rlcywgd2hhdCByYW5nZXMKIAkJICogc2hvdWxkIGJlIGhlcmUgKGkuZS4gaHN5bmMvdnN5bmMgdG90YWxzLCBldGMuKT8KIAkJICovCkBAIC00MTksOCArNDE2LDggQEAKIAkvKiBDYWxjdWxhdGUgdGhlIHJlbWFpbmRpbmcgb2Zmc2V0cyAqLwogCXBhci0+ZGl3c3RhcnRfaCA9IHBhci0+Ym9yZGVyc3RhcnRfaCArIHZhci0+bGVmdF9tYXJnaW47CiAJcGFyLT5kaXdzdGFydF92ID0gcGFyLT5ib3JkZXJzdGFydF92ICsgdmFyLT51cHBlcl9tYXJnaW47Ci0JcGFyLT5ib3JkZXJzdG9wX2ggPSBwYXItPmRpd3N0YXJ0X2ggKyB2YXItPnhyZXMgKyAKLQkJCSAgICB2YXItPnJpZ2h0X21hcmdpbjsgICAgCisJcGFyLT5ib3JkZXJzdG9wX2ggPSBwYXItPmRpd3N0YXJ0X2ggKyB2YXItPnhyZXMgKworCQkJICAgIHZhci0+cmlnaHRfbWFyZ2luOwogCXBhci0+Ym9yZGVyc3RvcF92ID0gcGFyLT5kaXdzdGFydF92ICsgdmFyLT55cmVzICsKIAkJCSAgICB2YXItPmxvd2VyX21hcmdpbjsKIApAQCAtNDY1LDEyICs0NjIsMTIgQEAKIAlzZXRfY29sb3JfYml0ZmllbGRzKHZhcik7CiAKIAlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSB7Ci0JCWlmICh2YXItPnhvZmZzZXQgfHwgdmFyLT55b2Zmc2V0IDwgMCB8fCAKKwkJaWYgKHZhci0+eG9mZnNldCB8fCB2YXItPnlvZmZzZXQgPCAwIHx8CiAJCSAgICB2YXItPnlvZmZzZXQgPj0gdmFyLT55cmVzX3ZpcnR1YWwpIHsKIAkJCXZhci0+eG9mZnNldCA9IHZhci0+eW9mZnNldCA9IDA7CiAJCX0gZWxzZSB7CiAJCQlpZiAodmFyLT54b2Zmc2V0ID4gdmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMgfHwKLQkJICAgIAkgICAgdmFyLT55b2Zmc2V0ID4gdmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXMgfHwgCisJCQkgICAgdmFyLT55b2Zmc2V0ID4gdmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXMgfHwKIAkJCSAgICB2YXItPnhvZmZzZXQgPCAwIHx8IHZhci0+eW9mZnNldCA8IDApCiAJCQkJdmFyLT54b2Zmc2V0ID0gdmFyLT55b2Zmc2V0ID0gMDsKIAkJfQpAQCAtNDc4LDcgKzQ3NSw3IEBACiAJCXZhci0+eG9mZnNldCA9IHZhci0+eW9mZnNldCA9IDA7CiAJfQogCi0JLyogCisJLyoKIAkgKiBYWFg6IE5lZWQgdG8gYmUgbW9yZSBjcmVhdGl2ZSB3aXRoIHRoaXMgKGkuZS4gYWxsb3cgZG91YmxlY2FuIGZvcgogCSAqIFBBTC9OVFNDIG91dHB1dCkuCiAJICovCkBAIC01MDcsNyArNTA0LDcgQEAKIAkJdmFyLT52c3luY19sZW4gICAgPSBwYXItPmJvcmRlcnN0b3BfdiArCiAJCQkJICAgKHBhci0+dnN5bmNfdG90YWwgLSBwYXItPmJvcmRlcnN0b3Bfdik7CiAJfQotCQkKKwogCWhzeW5jX3RvdGFsID0gdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luICsKIAkJICAgICAgdmFyLT5oc3luY19sZW47CiAJdnRvdGFsID0gdmFyLT51cHBlcl9tYXJnaW4gKyB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArCkBAIC01MzEsNyArNTI4LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8qIENoZWNrIG1lbW9yeSBzaXplcyAqLwogCWxpbmVfbGVuZ3RoID0gZ2V0X2xpbmVfbGVuZ3RoKHZhci0+eHJlc192aXJ0dWFsLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKIAlpZiAobGluZV9sZW5ndGggKiB2YXItPnlyZXNfdmlydHVhbCA+IGluZm8tPmZpeC5zbWVtX2xlbikKQEAgLTU1Miw3ICs1NDksNyBAQAogCSAgICAgICAgICBESVNQX0RJV0FERFJTKTsKIH0KIAotLyogCisvKgogICogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gbW9kZS4gIEN1cnJlbnRseSwgdGhlIDE2YnBwIGFuZCAyNGJwcCBtb2RlcyBhcmVuJ3QKICAqIHZlcnkgc3RhYmxlLiAgSXQncyBwcm9iYWJseSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhIGxvdCBvZiB0aGUgMkQgdmlkZW8KICAqIHJlZ2lzdGVycyBhcmUgc3RpbGwgdW5kb2N1bWVudGVkLgpAQCAtNTkyLDE4ICs1ODksMTggQEAKIAkvKiBkaXNwbGF5IHdpbmRvdyBzdGFydCBwb3NpdGlvbiAqLwogCWZiX3dyaXRlbChwYXItPmRpd3N0YXJ0X2gsIERJU1BfRElXSFNUUlQpOwogCWZiX3dyaXRlbCgocGFyLT5kaXdzdGFydF92IDw8IDE2KSB8IHBhci0+ZGl3c3RhcnRfdiwgRElTUF9ESVdWU1RSVCk7Ci0JCisKIAkvKiBtaXNjLiBzZXR0aW5ncyAqLwogCWZiX3dyaXRlbCgoMHgxNiA8PCAxNikgfCBwYXItPmlzX2xvd3JlcywgRElTUF9ESVdDT05GKTsKIAogCS8qIGNsb2NrIGRvdWJsZXIgKGZvciBWR0EpLCBzY2FuIGRvdWJsZXIsIGRpc3BsYXkgZW5hYmxlICovCi0JZmJfd3JpdGVsKCgodmlkZW9fb3V0cHV0ID09IFZPX1ZHQSkgPDwgMjMpIHwgCisJZmJfd3JpdGVsKCgodmlkZW9fb3V0cHV0ID09IFZPX1ZHQSkgPDwgMjMpIHwKIAkgICAgICAgICAgKHBhci0+aXNfZG91Ymxlc2NhbiA8PCAxKSB8IDEsIERJU1BfRElXTU9ERSk7CiAKIAkvKiBiaXRzIHBlciBwaXhlbCAqLwogCWZiX3dyaXRlbChmYl9yZWFkbChESVNQX0RJV01PREUpIHwgKC0tYnl0ZXNwZXJwaXhlbCA8PCAyKSwgRElTUF9ESVdNT0RFKTsKIAotCS8qIHZpZGVvIGVuYWJsZSwgY29sb3Igc3luYywgaW50ZXJsYWNlLCAKKwkvKiB2aWRlbyBlbmFibGUsIGNvbG9yIHN5bmMsIGludGVybGFjZSwKIAkgKiBoc3luYyBhbmQgdnN5bmMgcG9sYXJpdHkgKGN1cnJlbnRseSB1bnVzZWQpICovCiAJZmJfd3JpdGVsKDB4MTAwIHwgKChwYXItPmlzX2ludGVybGFjZWQgLyp8NCovKSA8PCA0KSwgRElTUF9TWU5DQ09ORik7CiB9CkBAIC02NTcsNyArNjU0LDcgQEAKIHN0YXRpYyBpbnQgcHZyMl9pbml0X2NhYmxlKHZvaWQpCiB7CiAJaWYgKGNhYmxlX3R5cGUgPCAwKSB7Ci0JCWZiX3dyaXRlbCgoZmJfcmVhZGwoUENUUkEpICYgMHhmZmYwZmZmZikgfCAweDAwMGEwMDAwLCAKKwkJZmJfd3JpdGVsKChmYl9yZWFkbChQQ1RSQSkgJiAweGZmZjBmZmZmKSB8IDB4MDAwYTAwMDAsCiAJICAgICAgICAgICAgICAgICAgUENUUkEpOwogCQljYWJsZV90eXBlID0gKGZiX3JlYWR3KFBEVFJBKSA+PiA4KSAmIDM7CiAJfQpAQCAtNjg3LDcgKzY4NCw3IEBACiAJcGFnZXMgPSBrbWFsbG9jKG5yX3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2VzKQogCQlyZXR1cm4gLUVOT01FTTsKLQkKKwogCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgKHVuc2lnbmVkIGxvbmcpYnVmLAogCQkJICAgICBucl9wYWdlcywgV1JJVEUsIDAsIHBhZ2VzLCBOVUxMKTsKQEAgLTcwMCw3ICs2OTcsNyBAQAogCX0KIAogCWRtYV9jb25maWd1cmVfY2hhbm5lbChzaGRtYSwgMHgxMmMxKTsKLQkKKwogCWRzdCAgID0gKHVuc2lnbmVkIGxvbmcpZmJfaW5mby0+c2NyZWVuX2Jhc2UgKyAqcHBvczsKIAlzdGFydCA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlc1swXSk7CiAJZW5kICAgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZXNbbnJfcGFnZXNdKTsKQEAgLTc0NCw3ICs3NDEsNyBAQAogCWtmcmVlKHBhZ2VzKTsKIAogCXJldHVybiByZXQ7Ci19IAorfQogI2VuZGlmIC8qIENPTkZJR19TSF9ETUEgKi8KIAogLyoqCkBAIC03NjUsMjEgKzc2MiwyMSBAQAogICogaW4gZm9yIGZsZXhpYmlsaXR5IGFueXdheXMuIFdobyBrbm93cywgbWF5YmUgc29tZW9uZSBoYXMgdHYtb3V0IG9uIGEKICAqIFBDSS1iYXNlZCB2ZXJzaW9uIG9mIHRoZXNlIHRoaW5ncyA7LSkKICAqLwotc3RhdGljIGludCBfX2luaXQgcHZyMmZiX2NvbW1vbl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnIyZmJfY29tbW9uX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcHZyMmZiX3BhciAqcGFyID0gY3VycmVudHBhcjsKIAl1bnNpZ25lZCBsb25nIG1vZGVtZW11c2VkLCByZXY7CiAKIAlmYl9pbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShwdnIyX2ZpeC5zbWVtX3N0YXJ0LAogCQkJCQkgICAgICAgcHZyMl9maXguc21lbV9sZW4pOwotCQorCiAJaWYgKCFmYl9pbmZvLT5zY3JlZW5fYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgInB2cjJmYjogRmFpbGVkIHRvIHJlbWFwIHNtZW0gc3BhY2VcbiIpOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCiAJcGFyLT5tbWlvX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUocHZyMl9maXgubW1pb19zdGFydCwKLQkJCQkJIAkJcHZyMl9maXgubW1pb19sZW4pOworCQkJCQkJCXB2cjJfZml4Lm1taW9fbGVuKTsKIAlpZiAoIXBhci0+bW1pb19iYXNlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicHZyMmZiOiBGYWlsZWQgdG8gcmVtYXAgbW1pbyBzcGFjZVxuIik7CiAJCWdvdG8gb3V0X2VycjsKQEAgLTgyMCw3ICs4MTcsNyBAQAogCXByaW50aygiZmIlZDogJXMgKHJldiAlbGQuJWxkKSBmcmFtZSBidWZmZXIgZGV2aWNlLCB1c2luZyAlbGRrLyVsZGsgb2YgdmlkZW8gbWVtb3J5XG4iLAogCSAgICAgICBmYl9pbmZvLT5ub2RlLCBmYl9pbmZvLT5maXguaWQsIChyZXYgPj4gNCkgJiAweDBmLCByZXYgJiAweDBmLAogCSAgICAgICBtb2RlbWVtdXNlZCA+PiAxMCwgKHVuc2lnbmVkIGxvbmcpKGZiX2luZm8tPmZpeC5zbWVtX2xlbiA+PiAxMCkpOwotCXByaW50aygiZmIlZDogTW9kZSAlZHglZC0lZCBwaXRjaCA9ICVsZCBjYWJsZTogJXMgdmlkZW8gb3V0cHV0OiAlc1xuIiwgCisJcHJpbnRrKCJmYiVkOiBNb2RlICVkeCVkLSVkIHBpdGNoID0gJWxkIGNhYmxlOiAlcyB2aWRlbyBvdXRwdXQ6ICVzXG4iLAogCSAgICAgICBmYl9pbmZvLT5ub2RlLCBmYl9pbmZvLT52YXIueHJlcywgZmJfaW5mby0+dmFyLnlyZXMsCiAJICAgICAgIGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKIAkgICAgICAgZ2V0X2xpbmVfbGVuZ3RoKGZiX2luZm8tPnZhci54cmVzLCBmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpLApAQCAtODc4LDggKzg3NSw4IEBACiAJCQl2aWRlb19vdXRwdXQgPSBWT19OVFNDOwogCQl9CiAJfQotCQotCS8qIAorCisJLyoKIAkgKiBOb3RoaW5nIGV4Y2l0aW5nIGFib3V0IHRoZSBEQyBQVlIyIC4uIG9ubHkgYSBtZWFzbHkgOE1pQi4KIAkgKi8KIAlwdnIyX2ZpeC5zbWVtX3N0YXJ0CT0gMHhhNTAwMDAwMDsJLyogUkFNIHN0YXJ0cyBoZXJlICovCkBAIC05MDMsNyArOTAwLDcgQEAKIAlyZXR1cm4gcHZyMmZiX2NvbW1vbl9pbml0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIHB2cjJmYl9kY19leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcHZyMmZiX2RjX2V4aXQodm9pZCkKIHsKIAlpZiAoZmJfaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJaW91bm1hcChmYl9pbmZvLT5zY3JlZW5fYmFzZSk7CkBAIC05ODcsMTMgKzk4NCwxMyBAQAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwdnIyZmJfcGNpX2RyaXZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIHB2cjJmYl9wY2lfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHB2cjJmYl9wY2lfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHZyMmZiX3BjaV9kcml2ZXIpOwogfQogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAotc3RhdGljIGludCBfX2luaXQgcHZyMl9nZXRfcGFyYW0oY29uc3Qgc3RydWN0IHB2cjJfcGFyYW1zICpwLCBjb25zdCBjaGFyICpzLAorc3RhdGljIGludCBfX2RldmluaXQgcHZyMl9nZXRfcGFyYW0oY29uc3Qgc3RydWN0IHB2cjJfcGFyYW1zICpwLCBjb25zdCBjaGFyICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsLCBpbnQgc2l6ZSkKIHsKIAlpbnQgaTsKQEAgLTEwMjEsNyArMTAxOCw3IEBACiAgKi8KIAogI2lmbmRlZiBNT0RVTEUKLWludCBfX2luaXQgcHZyMmZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IF9faW5pdCBwdnIyZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKIAljaGFyICp0aGlzX29wdDsKIAljaGFyIGNhYmxlX2FyZ1s4MF07CkBAIC0xMDYxLDcgKzEwNTgsNyBAQAogCWludCAoKmluaXQpKHZvaWQpOwogCXZvaWQgKCpleGl0KSh2b2lkKTsKIAljaGFyIG5hbWVbMTZdOwotfSBib2FyZF9saXN0W10gPSB7Cit9IGJvYXJkX2RyaXZlcltdID0gewogI2lmZGVmIENPTkZJR19TSF9EUkVBTUNBU1QKIAl7IHB2cjJmYl9kY19pbml0LCBwdnIyZmJfZGNfZXhpdCwgIlNlZ2EgREMgUFZSMiIgfSwKICNlbmRpZgpAQCAtMTA3MSw3ICsxMDY4LDcgQEAKIAl7IDAsIH0sCiB9OwogCi1pbnQgX19pbml0IHB2cjJmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwdnIyZmJfaW5pdCh2b2lkKQogewogCWludCBpLCByZXQgPSAtRU5PREVWOwogCWludCBzaXplOwpAQCAtMTA5NSw4ICsxMDkyLDggQEAKIAogCWN1cnJlbnRwYXIgPSAoc3RydWN0IHB2cjJmYl9wYXIgKikoZmJfaW5mbyArIDEpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmRfbGlzdCk7IGkrKykgewotCQlzdHJ1Y3QgcHZyMl9ib2FyZCAqcHZyX2JvYXJkID0gYm9hcmRfbGlzdCArIGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmRfZHJpdmVyKTsgaSsrKSB7CisJCXN0cnVjdCBwdnIyX2JvYXJkICpwdnJfYm9hcmQgPSBib2FyZF9kcml2ZXIgKyBpOwogCiAJCWlmICghcHZyX2JvYXJkLT5pbml0KQogCQkJY29udGludWU7CkBAIC0xMTE4LDEzICsxMTE1LDEzIEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib2FyZF9saXN0KTsgaSsrKSB7Ci0JCXN0cnVjdCBwdnIyX2JvYXJkICpwdnJfYm9hcmQgPSBib2FyZF9saXN0ICsgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib2FyZF9kcml2ZXIpOyBpKyspIHsKKwkJc3RydWN0IHB2cjJfYm9hcmQgKnB2cl9ib2FyZCA9IGJvYXJkX2RyaXZlciArIGk7CiAKIAkJaWYgKHB2cl9ib2FyZC0+ZXhpdCkKIAkJCXB2cl9ib2FyZC0+ZXhpdCgpOwogCX0KLQkJCisKICNpZmRlZiBDT05GSUdfU0hfU1RPUkVfUVVFVUVTCiAJc3FfdW5tYXAocHZyMmZiX21hcCk7CiAjZW5kaWYKQEAgLTExMzksNCArMTEzNiwzIEBACiBNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiwgTS4gUi4gQnJvd24gPG1yYnJvd25AMHhkNi5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lYnVmZmVyIGRyaXZlciBmb3IgTkVDIFBvd2VyVlIgMiBiYXNlZCBncmFwaGljcyBib2FyZHMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9xNDBmYi5jIGIvZHJpdmVycy92aWRlby9xNDBmYi5jCmluZGV4IDQ4NTM2YzMuLjRiZWFjMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcTQwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3E0MGZiLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAkvKiBtYXBwZWQgaW4gcTQwL2NvbmZpZy5jICovCiAJcTQwZmJfZml4LnNtZW1fc3RhcnQgPSBRNDBfUEhZU19TQ1JFRU5fQUREUjsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2YodTMyKSAqIDI1NiwgJmRldi0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCmluZGV4IGViYjY3NTYuLjRmYjE2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCkBAIC03NTIsNyArNzUyLDcgQEAKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAljaGFyICptb25pdG9yOwogCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3Qgc2dpdndfcGFyKSArIHNpemVvZih1MzIpICogMjU2LCAmZGV2LT5kZXYpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHNnaXZ3X3BhcikgKyBzaXplb2YodTMyKSAqIDE2LCAmZGV2LT5kZXYpOwogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAJcGFyID0gaW5mby0+cGFyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvc2lzLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXMuaAppbmRleCBkNWUyZDljLi5kNTNiZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXMuaApAQCAtNDc5LDcgKzQ3OSw3IEBACiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlZmF1bHRfdmFyOwogCiAJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHNpc2ZiX2ZpeDsKLQl1MzIJCXBzZXVkb19wYWxldHRlWzE3XTsKKwl1MzIJCXBzZXVkb19wYWxldHRlWzE2XTsKIAogCXN0cnVjdCBzaXNmYl9tb25pdG9yIHsKIAkJdTE2IGhtaW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYwppbmRleCA5M2QwN2VmLi5lOGNjYWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKQEAgLTE0MDUsMTIgKzE0MDUsMTggQEAKIAkJfQogCQlicmVhazsKIAljYXNlIDE2OgorCQlpZiAocmVnbm8gPj0gMTYpCisJCQlicmVhazsKKwogCQkoKHUzMiAqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CiAJCQkJKHJlZCAmIDB4ZjgwMCkgICAgICAgICAgfAogCQkJCSgoZ3JlZW4gJiAweGZjMDApID4+IDUpIHwKIAkJCQkoKGJsdWUgJiAweGY4MDApID4+IDExKTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKKwkJaWYgKHJlZ25vID49IDE2KQorCQkJYnJlYWs7CisKIAkJcmVkID4+PSA4OwogCQlncmVlbiA+Pj0gODsKIAkJYmx1ZSA+Pj0gODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdGdhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdGdhZmIuYwppbmRleCA1YzBkYWI2Li44OWZhY2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby90Z2FmYi5jCkBAIC0xNjM0LDcgKzE2MzQsNyBAQAogCQkgICAgICBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQgfCBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVDsKIAlpbmZvLT5mYm9wcyA9ICZ0Z2FmYl9vcHM7CiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBwYXItPnRnYV9mYl9iYXNlOwotCWluZm8tPnBzZXVkb19wYWxldHRlID0gKHZvaWQgKikocGFyICsgMSk7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBhbGV0dGU7CiAKIAkvKiBUaGlzIHNob3VsZCBnaXZlIGEgcmVhc29uYWJsZSBkZWZhdWx0IHZpZGVvIG1vZGUuICAqLwogCWlmICh0Z2FfYnVzX3BjaSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKaW5kZXggNTVlOGFhNC4uYzY5OTg2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCkBAIC05NzYsNyArOTc2LDcgQEAKIAkJcmV0dXJuIDE7CiAKIAotCWlmIChicHA9PTgpIHsKKwlpZiAoYnBwID09IDgpIHsKIAkJdF9vdXRiKDB4RkYsMHgzQzYpOwogCQl0X291dGIocmVnbm8sMHgzQzgpOwogCkBAIC05ODQsMTkgKzk4NCwyMSBAQAogCQl0X291dGIoZ3JlZW4+PjEwLDB4M0M5KTsKIAkJdF9vdXRiKGJsdWU+PjEwLDB4M0M5KTsKIAotCX0gZWxzZSBpZiAoYnBwID09IDE2KSB7CS8qIFJHQiA1NjUgKi8KLQkJdTMyIGNvbDsKKwl9IGVsc2UgaWYgKHJlZ25vIDwgMTYpIHsKKwkJaWYgKGJwcCA9PSAxNikgewkvKiBSR0IgNTY1ICovCisJCQl1MzIgY29sOwogCi0JCWNvbCA9IChyZWQgJiAweEY4MDApIHwgKChncmVlbiAmIDB4RkMwMCkgPj4gNSkgfAotCQkJKChibHVlICYgMHhGODAwKSA+PiAxMSk7Ci0JCWNvbCB8PSBjb2wgPDwgMTY7CQotCQkoKHUzMiAqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IGNvbDsKLQl9IGVsc2UgaWYgKGJwcCA9PSAzMikJCS8qIEFSR0IgODg4OCAqLwotCQkoKHUzMiopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9Ci0JCQkoKHRyYW5zcCAmIDB4RkYwMCkgPDwxNikgCXwKLQkJCSgocmVkICYgMHhGRjAwKSA8PCA4KSAJCXwKLQkJCSgoZ3JlZW4gJiAweEZGMDApKQkJfAotCQkJKChibHVlICYgMHhGRjAwKT4+OCk7CisJCQljb2wgPSAocmVkICYgMHhGODAwKSB8ICgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwKKwkJCQkoKGJsdWUgJiAweEY4MDApID4+IDExKTsKKwkJCWNvbCB8PSBjb2wgPDwgMTY7CisJCQkoKHUzMiAqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IGNvbDsKKwkJfSBlbHNlIGlmIChicHAgPT0gMzIpCQkvKiBBUkdCIDg4ODggKi8KKwkJCSgodTMyKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJCQkoKHRyYW5zcCAmIDB4RkYwMCkgPDwxNikgCXwKKwkJCQkoKHJlZCAmIDB4RkYwMCkgPDwgOCkgCQl8CisJCQkJKChncmVlbiAmIDB4RkYwMCkpCQl8CisJCQkJKChibHVlICYgMHhGRjAwKT4+OCk7CisJfQogCiAvLwlkZWJ1ZygiZXhpdFxuIik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3R4MzkxMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3R4MzkxMmZiLmMKaW5kZXggMDczODliYS4uZTZmN2M3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90eDM5MTJmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdHgzOTEyZmIuYwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJZmJfaW5mby5mYm9wcyA9ICZ0eDM5MTJmYl9vcHM7CiAJZmJfaW5mby52YXIgPSB0eDM5MTJmYl92YXI7CiAJZmJfaW5mby5maXggPSB0eDM5MTJmYl9maXg7Ci0JZmJfaW5mby5wc2V1ZG9fcGFsZXR0ZSA9IHBzZXVkb19wYWxldHRlOworCWZiX2luZm8ucHNldWRvX3BhbGV0dGUgPSBjZmI4OwogCWZiX2luZm8uZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKIAogCS8qIENsZWFyIHRoZSBmcmFtZWJ1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92dDg2MjNmYi5jIGIvZHJpdmVycy92aWRlby92dDg2MjNmYi5jCmluZGV4IDMwYzBiOTQuLjRjM2E2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMKQEAgLTY4LDI2ICs2OCwyNiBAQAogCiAvKiBDUlQgdGltaW5nIHJlZ2lzdGVyIHNldHMgKi8KIAotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfdG90YWxfcmVnc1tdICAgICAgID0ge3sweDAwLCAwLCA3fSwgezB4MzYsIDMsIDN9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9kaXNwbGF5X3JlZ3NbXSAgICAgPSB7ezB4MDEsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9ibGFua19zdGFydF9yZWdzW10gPSB7ezB4MDIsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9ibGFua19lbmRfcmVnc1tdICAgPSB7ezB4MDMsIDAsIDR9LCB7MHgwNSwgNywgN30sIHsweDMzLCA1LCA1fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfc3luY19zdGFydF9yZWdzW10gID0ge3sweDA0LCAwLCA3fSwgezB4MzMsIDQsIDR9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9zeW5jX2VuZF9yZWdzW10gICAgPSB7ezB4MDUsIDAsIDR9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfdG90YWxfcmVnc1tdICAgICAgID0ge3sweDAwLCAwLCA3fSwgezB4MzYsIDMsIDN9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfZGlzcGxheV9yZWdzW10gICAgID0ge3sweDAxLCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX2JsYW5rX3N0YXJ0X3JlZ3NbXSA9IHt7MHgwMiwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9ibGFua19lbmRfcmVnc1tdICAgPSB7ezB4MDMsIDAsIDR9LCB7MHgwNSwgNywgN30sIHsweDMzLCA1LCA1fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3N5bmNfc3RhcnRfcmVnc1tdICA9IHt7MHgwNCwgMCwgN30sIHsweDMzLCA0LCA0fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3N5bmNfZW5kX3JlZ3NbXSAgICA9IHt7MHgwNSwgMCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKIAotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfdG90YWxfcmVnc1tdICAgICAgID0ge3sweDA2LCAwLCA3fSwgezB4MDcsIDAsIDB9LCB7MHgwNywgNSwgNX0sIHsweDM1LCAwLCAwfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfZGlzcGxheV9yZWdzW10gICAgID0ge3sweDEyLCAwLCA3fSwgezB4MDcsIDEsIDF9LCB7MHgwNywgNiwgNn0sIHsweDM1LCAyLCAyfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfYmxhbmtfc3RhcnRfcmVnc1tdID0ge3sweDE1LCAwLCA3fSwgezB4MDcsIDMsIDN9LCB7MHgwOSwgNSwgNX0sIHsweDM1LCAzLCAzfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfYmxhbmtfZW5kX3JlZ3NbXSAgID0ge3sweDE2LCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3Zfc3luY19zdGFydF9yZWdzW10gID0ge3sweDEwLCAwLCA3fSwgezB4MDcsIDIsIDJ9LCB7MHgwNywgNywgN30sIHsweDM1LCAxLCAxfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3Zfc3luY19lbmRfcmVnc1tdICAgID0ge3sweDExLCAwLCAzfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3RvdGFsX3JlZ3NbXSAgICAgICA9IHt7MHgwNiwgMCwgN30sIHsweDA3LCAwLCAwfSwgezB4MDcsIDUsIDV9LCB7MHgzNSwgMCwgMH0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9kaXNwbGF5X3JlZ3NbXSAgICAgPSB7ezB4MTIsIDAsIDd9LCB7MHgwNywgMSwgMX0sIHsweDA3LCA2LCA2fSwgezB4MzUsIDIsIDJ9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfYmxhbmtfc3RhcnRfcmVnc1tdID0ge3sweDE1LCAwLCA3fSwgezB4MDcsIDMsIDN9LCB7MHgwOSwgNSwgNX0sIHsweDM1LCAzLCAzfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2JsYW5rX2VuZF9yZWdzW10gICA9IHt7MHgxNiwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9zeW5jX3N0YXJ0X3JlZ3NbXSAgPSB7ezB4MTAsIDAsIDd9LCB7MHgwNywgMiwgMn0sIHsweDA3LCA3LCA3fSwgezB4MzUsIDEsIDF9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3Zfc3luY19lbmRfcmVnc1tdICAgID0ge3sweDExLCAwLCAzfSwgVkdBX1JFR1NFVF9FTkR9OwogCi1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfb2Zmc2V0X3JlZ3NbXSAgICAgICAgPSB7ezB4MTMsIDAsIDd9LCB7MHgzNSwgNSwgN30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19saW5lX2NvbXBhcmVfcmVnc1tdICA9IHt7MHgxOCwgMCwgN30sIHsweDA3LCA0LCA0fSwgezB4MDksIDYsIDZ9LCB7MHgzMywgMCwgMn0sIHsweDM1LCA0LCA0fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2ZldGNoX2NvdW50X3JlZ3NbXSAgID0ge3sweDFDLCAwLCA3fSwgezB4MUQsIDAsIDF9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfc3RhcnRfYWRkcmVzc19yZWdzW10gPSB7ezB4MGQsIDAsIDd9LCB7MHgwYywgMCwgN30sIHsweDM0LCAwLCA3fSwgezB4NDgsIDAsIDF9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX29mZnNldF9yZWdzW10gICAgICAgID0ge3sweDEzLCAwLCA3fSwgezB4MzUsIDUsIDd9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2xpbmVfY29tcGFyZV9yZWdzW10gID0ge3sweDE4LCAwLCA3fSwgezB4MDcsIDQsIDR9LCB7MHgwOSwgNiwgNn0sIHsweDMzLCAwLCAyfSwgezB4MzUsIDQsIDR9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2ZldGNoX2NvdW50X3JlZ3NbXSAgID0ge3sweDFDLCAwLCA3fSwgezB4MUQsIDAsIDF9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3N0YXJ0X2FkZHJlc3NfcmVnc1tdID0ge3sweDBkLCAwLCA3fSwgezB4MGMsIDAsIDd9LCB7MHgzNCwgMCwgN30sIHsweDQ4LCAwLCAxfSwgVkdBX1JFR1NFVF9FTkR9OwogCi1zdHJ1Y3Qgc3ZnYV90aW1pbmdfcmVncyB2dDg2MjNfdGltaW5nX3JlZ3MgICAgID0geworc3RhdGljIHN0cnVjdCBzdmdhX3RpbWluZ19yZWdzIHZ0ODYyM190aW1pbmdfcmVncyAgICAgPSB7CiAJdnQ4NjIzX2hfdG90YWxfcmVncywgdnQ4NjIzX2hfZGlzcGxheV9yZWdzLCB2dDg2MjNfaF9ibGFua19zdGFydF9yZWdzLAogCXZ0ODYyM19oX2JsYW5rX2VuZF9yZWdzLCB2dDg2MjNfaF9zeW5jX3N0YXJ0X3JlZ3MsIHZ0ODYyM19oX3N5bmNfZW5kX3JlZ3MsCiAJdnQ4NjIzX3ZfdG90YWxfcmVncywgdnQ4NjIzX3ZfZGlzcGxheV9yZWdzLCB2dDg2MjNfdl9ibGFua19zdGFydF9yZWdzLApAQCAtOTAzLDcgKzkwMyw3IEBACiAKIC8qIERyaXZlciBJbml0aWFsaXNhdGlvbiAqLwogCi1pbnQgX19pbml0IHZ0ODYyM2ZiX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHZ0ODYyM2ZiX2luaXQodm9pZCkKIHsKIAogI2lmbmRlZiBNT0RVTEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvS2NvbmZpZyBiL2RyaXZlcnMvdzEvS2NvbmZpZwppbmRleCBjYTc1YjNhLi42ODU0ZmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9LY29uZmlnCkBAIC0xLDggKzEsNiBAQAotbWVudSAiRGFsbGFzJ3MgMS13aXJlIGJ1cyIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCi1jb25maWcgVzEKK21lbnVjb25maWcgVzEKIAl0cmlzdGF0ZSAiRGFsbGFzJ3MgMS13aXJlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAktLS1oZWxwLS0tCiAJICBEYWxsYXMnIDEtd2lyZSBidXMgaXMgdXNlZnVsIHRvIGNvbm5lY3Qgc2xvdyAxLXBpbiBkZXZpY2VzCiAJICBzdWNoIGFzIGlCdXR0b25zIGFuZCB0aGVybWFsIHNlbnNvcnMuCkBAIC0xMiw4ICsxMCwxMCBAQAogCSAgVGhpcyBXMSBzdXBwb3J0IGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHdpcmUua28uCiAKK2lmIFcxCisKIGNvbmZpZyBXMV9DT04KLQlkZXBlbmRzIG9uIENPTk5FQ1RPUiAmJiBXMQorCWRlcGVuZHMgb24gQ09OTkVDVE9SCiAJYm9vbCAiVXNlcnNwYWNlIGNvbW11bmljYXRpb24gb3ZlciBjb25uZWN0b3IiCiAJZGVmYXVsdCB5CiAJLS0tIGhlbHAgLS0tCkBAIC0yNyw0ICsyNyw0IEBACiBzb3VyY2UgZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKIHNvdXJjZSBkcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCiAKLWVuZG1lbnUKK2VuZGlmICMgVzEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKaW5kZXggOGY3NzkzMy4uODIzNmQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKQEAgLTMsMTEgKzMsMTAgQEAKICMKIAogbWVudSAiMS13aXJlIEJ1cyBNYXN0ZXJzIgotCWRlcGVuZHMgb24gVzEKIAogY29uZmlnIFcxX01BU1RFUl9NQVRST1gKIAl0cmlzdGF0ZSAiTWF0cm94IEc0MDAgdHJhbnNwb3J0IGxheWVyIGZvciAxLXdpcmUiCi0JZGVwZW5kcyBvbiBXMSAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29tbXVuaWNhdGUgd2l0aCB5b3VyIDEtd2lyZSBkZXZpY2VzCiAJICB1c2luZyBNYXRyb3gncyBHNDAwIEdQSU8gcGlucy4KQEAgLTE3LDcgKzE2LDcgQEAKIAogY29uZmlnIFcxX01BU1RFUl9EUzI0OTAKIAl0cmlzdGF0ZSAiRFMyNDkwIFVTQiA8LT4gVzEgdHJhbnNwb3J0IGxheWVyIGZvciAxLXdpcmUiCi0gIAlkZXBlbmRzIG9uIFcxICYmIFVTQgorICAJZGVwZW5kcyBvbiBVU0IKICAgCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRyaXZlciBmb3IgRFMyNDkwIGJhc2VkIFVTQiA8LT4gVzEgYnJpZGdlcywKIAkgIGZvciBleGFtcGxlIERTOTQ5MCouCkBAIC0yNyw3ICsyNiw3IEBACiAKIGNvbmZpZyBXMV9NQVNURVJfRFMyNDgyCiAJdHJpc3RhdGUgIk1heGltIERTMjQ4MiBJMkMgdG8gMS1XaXJlIGJyaWRnZSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBXMSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1heGltIERTMjQ4MgogCSAgSTJDIHRvIDEtV2lyZSBicmlkZ2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnIGIvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwppbmRleCBkZjk1ZDZjLi4zZGYyOWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKQEAgLTMsMjUgKzMsMjEgQEAKICMKIAogbWVudSAiMS13aXJlIFNsYXZlcyIKLQlkZXBlbmRzIG9uIFcxCiAKIGNvbmZpZyBXMV9TTEFWRV9USEVSTQogCXRyaXN0YXRlICJUaGVybWFsIGZhbWlseSBpbXBsZW1lbnRhdGlvbiIKLQlkZXBlbmRzIG9uIFcxCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IDEtd2lyZSB0aGVybWFsIHNlbnNvcnMgdG8geW91cgogCSAgd2lyZS4KIAogY29uZmlnIFcxX1NMQVZFX1NNRU0KIAl0cmlzdGF0ZSAiU2ltcGxlIDY0Yml0IG1lbW9yeSBmYW1pbHkgaW1wbGVtZW50YXRpb24iCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCAxLXdpcmUKIAkgIHNpbXBsZSA2NGJpdCBtZW1vcnkgcm9tKGRzMjQwMS9kczI0MTEvZHMxOTkwKikgdG8geW91ciB3aXJlLgogCiBjb25maWcgVzFfU0xBVkVfRFMyNDMzCiAJdHJpc3RhdGUgIjRrYiBFRVBST00gZmFtaWx5IHN1cHBvcnQgKERTMjQzMykiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgMS13aXJlCiAJICA0a2IgRUVQUk9NIGZhbWlseSBkZXZpY2UgKERTMjQzMykuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxLmMgYi9kcml2ZXJzL3cxL3cxLmMKaW5kZXggZjVjNWI3Ni4uYzYzMzIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MS5jCisrKyBiL2RyaXZlcnMvdzEvdzEuYwpAQCAtODA1LDYgKzgwNSw3IEBACiAJc3RydWN0IHcxX21hc3RlciAqZGV2LCAqbjsKIAlpbnQgaGF2ZV90b193YWl0ID0gMDsKIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBoYXZlX3RvX3dhaXQpIHsKIAkJaGF2ZV90b193YWl0ID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggOTRiOWQ4Ni4uNjEzZGY1NSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC05OTEsNyArOTkxLDcgQEAKIAogY29uZmlnIEhVR0VUTEJGUwogCWJvb2wgIkh1Z2VUTEIgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFg4NiB8fCBJQTY0IHx8IFBQQzY0IHx8IFNQQVJDNjQgfHwgU1VQRVJIIHx8IEJST0tFTgorCWRlcGVuZHMgb24gWDg2IHx8IElBNjQgfHwgUFBDNjQgfHwgU1BBUkM2NCB8fCAoU1VQRVJIICYmIE1NVSkgfHwgQlJPS0VOCiAJaGVscAogCSAgaHVnZXRsYmZzIGlzIGEgZmlsZXN5c3RlbSBiYWNraW5nIGZvciBIdWdlVExCIHBhZ2VzLCBiYXNlZCBvbgogCSAgcmFtZnMuIEZvciBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCBpdCwgc2F5IFkgaGVyZSBhbmQgcmVhZApAQCAtMTY3NSw2ICsxNjc1LDcgQEAKIGNvbmZpZyBORlNEX1Y0CiAJYm9vbCAiUHJvdmlkZSBORlN2NCBzZXJ2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIE5GU0RfVjMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFJQQ1NFQ19HU1NfS1JCNQogCWhlbHAKIAkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgdGhlIE5GU3Y0IHNlcnZlciBhcyB3ZWxsIGFzIHRoZSBORlN2MgogCSAgYW5kIE5GU3YzIHNlcnZlcnMsIHNheSBZIGhlcmUuICBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLCBhbmQKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9NYWtlZmlsZSBiL2ZzL2Fmcy9NYWtlZmlsZQppbmRleCA3M2NlNTYxLi5hNjY2NzEwIDEwMDY0NAotLS0gYS9mcy9hZnMvTWFrZWZpbGUKKysrIGIvZnMvYWZzL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogCWNtc2VydmljZS5vIFwKIAlkaXIubyBcCiAJZmlsZS5vIFwKKwlmbG9jay5vIFwKIAlmc2NsaWVudC5vIFwKIAlpbm9kZS5vIFwKIAltYWluLm8gXApkaWZmIC0tZ2l0IGEvZnMvYWZzL2Fmcy5oIGIvZnMvYWZzL2Fmcy5oCmluZGV4IDI0NTI1NzkuLmM1NDhhYTMgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9hZnMuaAorKysgYi9mcy9hZnMvYWZzLmgKQEAgLTM3LDYgKzM3LDEzIEBACiAJQUZTX0ZUWVBFX1NZTUxJTksJPSAzLAogfSBhZnNfZmlsZV90eXBlX3Q7CiAKK3R5cGVkZWYgZW51bSB7CisJQUZTX0xPQ0tfUkVBRAkJPSAwLAkvKiByZWFkIGxvY2sgcmVxdWVzdCAqLworCUFGU19MT0NLX1dSSVRFCQk9IDEsCS8qIHdyaXRlIGxvY2sgcmVxdWVzdCAqLworfSBhZnNfbG9ja190eXBlX3Q7CisKKyNkZWZpbmUgQUZTX0xPQ0tXQUlUCQkoNSAqIDYwKSAvKiB0aW1lIHVudGlsIGEgbG9jayB0aW1lcyBvdXQgKHNlY29uZHMpICovCisKIC8qCiAgKiBBRlMgZmlsZSBpZGVudGlmaWVyCiAgKi8KQEAgLTEyMCw2ICsxMjcsNyBAQAogCXN0cnVjdCBhZnNfZmlkCQlwYXJlbnQ7CQkvKiBwYXJlbnQgZGlyIElEIGZvciBub24tZGlycyBvbmx5ICovCiAJdGltZV90CQkJbXRpbWVfY2xpZW50OwkvKiBsYXN0IHRpbWUgY2xpZW50IGNoYW5nZWQgZGF0YSAqLwogCXRpbWVfdAkJCW10aW1lX3NlcnZlcjsJLyogbGFzdCB0aW1lIHNlcnZlciBjaGFuZ2VkIGRhdGEgKi8KKwlzMzIJCQlsb2NrX2NvdW50OwkvKiBmaWxlIGxvY2sgY291bnQgKDA9VU5MSyAtMT1XUkxDSyArdmU9I1JETENLICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Fmc19mcy5oIGIvZnMvYWZzL2Fmc19mcy5oCmluZGV4IGExOGMzNzQuLmViNjQ3MzIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9hZnNfZnMuaAorKysgYi9mcy9hZnMvYWZzX2ZzLmgKQEAgLTMxLDYgKzMxLDkgQEAKIAlGU0dFVFZPTFVNRUlORk8JCT0gMTQ4LAkvKiBBRlMgR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdm9sdW1lICovCiAJRlNHRVRWT0xVTUVTVEFUVVMJPSAxNDksCS8qIEFGUyBHZXQgdm9sdW1lIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwogCUZTR0VUUk9PVFZPTFVNRQkJPSAxNTEsCS8qIEFGUyBHZXQgcm9vdCB2b2x1bWUgbmFtZSAqLworCUZTU0VUTE9DSwkJPSAxNTYsCS8qIEFGUyBSZXF1ZXN0IGEgZmlsZSBsb2NrICovCisJRlNFWFRFTkRMT0NLCQk9IDE1NywJLyogQUZTIEV4dGVuZCBhIGZpbGUgbG9jayAqLworCUZTUkVMRUFTRUxPQ0sJCT0gMTU4LAkvKiBBRlMgUmVsZWFzZSBhIGZpbGUgbG9jayAqLwogCUZTTE9PS1VQCQk9IDE2MSwJLyogQUZTIGxvb2t1cCBmaWxlIGluIGRpcmVjdG9yeSAqLwogCUZTRkVUQ0hEQVRBNjQJCT0gNjU1MzcsIC8qIEFGUyBGZXRjaCBmaWxlIGRhdGEgKi8KIAlGU1NUT1JFREFUQTY0CQk9IDY1NTM4LCAvKiBBRlMgU3RvcmUgZmlsZSBkYXRhICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FsbGJhY2suYyBiL2ZzL2Fmcy9jYWxsYmFjay5jCmluZGV4IGJhY2Y1MTguLmI4MjQzOTQgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jYWxsYmFjay5jCisrKyBiL2ZzL2Fmcy9jYWxsYmFjay5jCkBAIC0xMjUsNiArMTI1LDkgQEAKIAkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CiAKIAkJcXVldWVfd29yayhhZnNfY2FsbGJhY2tfdXBkYXRlX3dvcmtlciwgJnZub2RlLT5jYl9icm9rZW5fd29yayk7CisJCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykgJiYKKwkJICAgICFsaXN0X2VtcHR5KCZ2bm9kZS0+cGVuZGluZ19sb2NrcykpCisJCQlhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHZub2RlKTsKIAkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9mcy9hZnMvZGlyLmMgYi9mcy9hZnMvZGlyLmMKaW5kZXggNTQ2YzU5NS4uMzNmZTM5YSAxMDA2NDQKLS0tIGEvZnMvYWZzL2Rpci5jCisrKyBiL2ZzL2Fmcy9kaXIuYwpAQCAtNDQsNiArNDQsNyBAQAogCS5vcGVuCQk9IGFmc19kaXJfb3BlbiwKIAkucmVsZWFzZQk9IGFmc19yZWxlYXNlLAogCS5yZWFkZGlyCT0gYWZzX3JlYWRkaXIsCisJLmxvY2sJCT0gYWZzX2xvY2ssCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy9hZnMvZmlsZS5jIGIvZnMvYWZzL2ZpbGUuYwppbmRleCBhZWRlN2ViLi41MjVmN2M1IDEwMDY0NAotLS0gYS9mcy9hZnMvZmlsZS5jCisrKyBiL2ZzL2Fmcy9maWxlLmMKQEAgLTM0LDYgKzM0LDggQEAKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLmZzeW5jCQk9IGFmc19mc3luYywKKwkubG9jawkJPSBhZnNfbG9jaywKKwkuZmxvY2sJCT0gYWZzX2Zsb2NrLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mbG9jay5jIGIvZnMvYWZzL2Zsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwN2Y4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9mbG9jay5jCkBAIC0wLDAgKzEsNTU4IEBACisvKiBBRlMgZmlsZSBsb2NraW5nIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBRlNfTE9DS19HUkFOVEVECTAKKyNkZWZpbmUgQUZTX0xPQ0tfUEVORElORwkxCisKK3N0YXRpYyB2b2lkIGFmc19mbF9jb3B5X2xvY2soc3RydWN0IGZpbGVfbG9jayAqbmV3LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CitzdGF0aWMgdm9pZCBhZnNfZmxfcmVsZWFzZV9wcml2YXRlKHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfbG9ja19tYW5hZ2VyOworCitzdGF0aWMgc3RydWN0IGZpbGVfbG9ja19vcGVyYXRpb25zIGFmc19sb2NrX29wcyA9IHsKKwkuZmxfY29weV9sb2NrCQk9IGFmc19mbF9jb3B5X2xvY2ssCisJLmZsX3JlbGVhc2VfcHJpdmF0ZQk9IGFmc19mbF9yZWxlYXNlX3ByaXZhdGUsCit9OworCisvKgorICogaW5pdGlhbGlzZSB0aGUgbG9jayBtYW5hZ2VyIHRocmVhZCBpZiBpdCBpc24ndCBhbHJlYWR5IHJ1bm5pbmcKKyAqLworc3RhdGljIGludCBhZnNfaW5pdF9sb2NrX21hbmFnZXIodm9pZCkKK3sKKwlpZiAoIWFmc19sb2NrX21hbmFnZXIpIHsKKwkJYWZzX2xvY2tfbWFuYWdlciA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrYWZzX2xvY2tkIik7CisJCWlmICghYWZzX2xvY2tfbWFuYWdlcikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRlc3Ryb3kgdGhlIGxvY2sgbWFuYWdlciB0aHJlYWQgaWYgaXQncyBydW5uaW5nCisgKi8KK3ZvaWQgX19leGl0IGFmc19raWxsX2xvY2tfbWFuYWdlcih2b2lkKQoreworCWlmIChhZnNfbG9ja19tYW5hZ2VyKQorCQlkZXN0cm95X3dvcmtxdWV1ZShhZnNfbG9ja19tYW5hZ2VyKTsKK30KKworLyoKKyAqIGlmIHRoZSBjYWxsYmFjayBpcyBicm9rZW4gb24gdGhpcyB2bm9kZSwgdGhlbiB0aGUgbG9jayBtYXkgbm93IGJlIGF2YWlsYWJsZQorICovCit2b2lkIGFmc19sb2NrX21heV9iZV9hdmFpbGFibGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJX2VudGVyKCJ7JXg6JXV9Iiwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUpOworCisJcXVldWVfZGVsYXllZF93b3JrKGFmc19sb2NrX21hbmFnZXIsICZ2bm9kZS0+bG9ja193b3JrLCAwKTsKK30KKworLyoKKyAqIHRoZSBsb2NrIHdpbGwgdGltZSBvdXQgaW4gNSBtaW51dGVzIHVubGVzcyB3ZSBleHRlbmQgaXQsIHNvIHNjaGVkdWxlCisgKiBleHRlbnNpb24gaW4gYSBiaXQgbGVzcyB0aGFuIHRoYXQgdGltZQorICovCitzdGF0aWMgdm9pZCBhZnNfc2NoZWR1bGVfbG9ja19leHRlbnNpb24oc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGFmc19sb2NrX21hbmFnZXIsICZ2bm9kZS0+bG9ja193b3JrLAorCQkJICAgQUZTX0xPQ0tXQUlUICogSFogLyAyKTsKK30KKworLyoKKyAqIGRvIHdvcmsgZm9yIGEgbG9jaywgaW5jbHVkaW5nOgorICogLSBwcm9iaW5nIGZvciBhIGxvY2sgd2UncmUgd2FpdGluZyBvbiBidXQgZGlkbid0IGdldCBpbW1lZGlhdGVseQorICogLSBleHRlbmRpbmcgYSBsb2NrIHRoYXQncyBjbG9zZSB0byB0aW1pbmcgb3V0CisgKi8KK3ZvaWQgYWZzX2xvY2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc192bm9kZSwgbG9ja193b3JrLndvcmspOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWFmc19sb2NrX3R5cGVfdCB0eXBlOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JXg6JXV9Iiwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUpOworCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX1VOTE9DS0lORywgJnZub2RlLT5mbGFncykpIHsKKwkJX2RlYnVnKCJ1bmxvY2siKTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCQkvKiBhdHRlbXB0IHRvIHJlbGVhc2UgdGhlIHNlcnZlciBsb2NrOyBpZiBpdCBmYWlscywgd2UganVzdAorCQkgKiB3YWl0IDUgbWludXRlcyBhbmQgaXQnbGwgdGltZSBvdXQgYW55d2F5ICovCisJCXJldCA9IGFmc192bm9kZV9yZWxlYXNlX2xvY2sodm5vZGUsIHZub2RlLT51bmxvY2tfa2V5KTsKKwkJaWYgKHJldCA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBRlM6IgorCQkJICAgICAgICIgRmFpbGVkIHRvIHJlbGVhc2UgbG9jayBvbiB7JXg6JXh9IGVycm9yICVkXG4iLAorCQkJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCByZXQpOworCisJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQlrZXlfcHV0KHZub2RlLT51bmxvY2tfa2V5KTsKKwkJdm5vZGUtPnVubG9ja19rZXkgPSBOVUxMOworCQljbGVhcl9iaXQoQUZTX1ZOT0RFX1VOTE9DS0lORywgJnZub2RlLT5mbGFncyk7CisJfQorCisJLyogaWYgd2UndmUgZ290IGEgbG9jaywgdGhlbiBpdCBtdXN0IGJlIHRpbWUgdG8gZXh0ZW5kIHRoYXQgbG9jayBhcyBBRlMKKwkgKiBsb2NrcyB0aW1lIG91dCBhZnRlciA1IG1pbnV0ZXMgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSkgeworCQlfZGVidWcoImV4dGVuZCIpOworCisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKSkKKwkJCUJVRygpOworCQlmbCA9IGxpc3RfZW50cnkodm5vZGUtPmdyYW50ZWRfbG9ja3MubmV4dCwKKwkJCQlzdHJ1Y3QgZmlsZV9sb2NrLCBmbF91LmFmcy5saW5rKTsKKwkJa2V5ID0ga2V5X2dldChmbC0+ZmxfZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCQlyZXQgPSBhZnNfdm5vZGVfZXh0ZW5kX2xvY2sodm5vZGUsIGtleSk7CisJCWNsZWFyX2JpdChBRlNfVk5PREVfTE9DS0lORywgJnZub2RlLT5mbGFncyk7CisJCWtleV9wdXQoa2V5KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYWZzX3NjaGVkdWxlX2xvY2tfZXh0ZW5zaW9uKHZub2RlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdW1tbS4uLiB3ZSBmYWlsZWQgdG8gZXh0ZW5kIHRoZSBsb2NrIC0gcmV0cnkKKwkJCSAqIGV4dGVuc2lvbiBzaG9ydGx5ICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBRlM6IgorCQkJICAgICAgICIgRmFpbGVkIHRvIGV4dGVuZCBsb2NrIG9uIHsleDoleH0gZXJyb3IgJWRcbiIsCisJCQkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHJldCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX2xvY2tfbWFuYWdlciwgJnZub2RlLT5sb2NrX3dvcmssCisJCQkJCSAgIEhaICogMTApOworCQkJYnJlYWs7CisJCX0KKwkJX2xlYXZlKCIgW2V4dGVuZF0iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIHdlIGRvbid0IGhhdmUgYSBncmFudGVkIGxvY2ssIHRoZW4gd2UgbXVzdCd2ZSBiZWVuIGNhbGxlZCBiYWNrIGJ5CisJICogdGhlIHNlcnZlciwgYW5kIHNvIGlmIG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGdldCBhIGxvY2sgd2UncmUKKwkgKiBjdXJyZW50bHkgd2FpdGluZyBmb3IgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJnZub2RlLT5wZW5kaW5nX2xvY2tzKSkgeworCQlfZGVidWcoImdldCIpOworCisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKSkKKwkJCUJVRygpOworCQlmbCA9IGxpc3RfZW50cnkodm5vZGUtPnBlbmRpbmdfbG9ja3MubmV4dCwKKwkJCQlzdHJ1Y3QgZmlsZV9sb2NrLCBmbF91LmFmcy5saW5rKTsKKwkJa2V5ID0ga2V5X2dldChmbC0+ZmxfZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJdHlwZSA9IChmbC0+ZmxfdHlwZSA9PSBGX1JETENLKSA/CisJCQlBRlNfTE9DS19SRUFEIDogQUZTX0xPQ0tfV1JJVEU7CisJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkJcmV0ID0gYWZzX3Zub2RlX3NldF9sb2NrKHZub2RlLCBrZXksIHR5cGUpOworCQljbGVhcl9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIC1FV09VTERCTE9DSzoKKwkJCV9kZWJ1ZygiYmxvY2tlZCIpOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCV9kZWJ1ZygiYWNxdWlyZWQiKTsKKwkJCWlmICh0eXBlID09IEFGU19MT0NLX1JFQUQpCisJCQkJc2V0X2JpdChBRlNfVk5PREVfUkVBRExPQ0tFRCwgJnZub2RlLT5mbGFncyk7CisJCQllbHNlCisJCQkJc2V0X2JpdChBRlNfVk5PREVfV1JJVEVMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpOworCQkJcmV0ID0gQUZTX0xPQ0tfR1JBTlRFRDsKKwkJZGVmYXVsdDoKKwkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQkJLyogdGhlIHBlbmRpbmcgbG9jayBtYXkgaGF2ZSBiZWVuIHdpdGhkcmF3biBkdWUgdG8gYQorCQkJICogc2lnbmFsICovCisJCQlpZiAobGlzdF9lbnRyeSh2bm9kZS0+cGVuZGluZ19sb2Nrcy5uZXh0LAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZV9sb2NrLCBmbF91LmFmcy5saW5rKSA9PSBmbCkgeworCQkJCWZsLT5mbF91LmFmcy5zdGF0ZSA9IHJldDsKKwkJCQlpZiAocmV0ID09IEFGU19MT0NLX0dSQU5URUQpCisJCQkJCWxpc3RfbW92ZV90YWlsKCZmbC0+ZmxfdS5hZnMubGluaywKKwkJCQkJCSAgICAgICAmdm5vZGUtPmdyYW50ZWRfbG9ja3MpOworCQkJCWVsc2UKKwkJCQkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCQkJCXdha2VfdXAoJmZsLT5mbF93YWl0KTsKKwkJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQkJfSBlbHNlIHsKKwkJCQlfZGVidWcoIndpdGhkcmF3biIpOworCQkJCWNsZWFyX2JpdChBRlNfVk5PREVfUkVBRExPQ0tFRCwgJnZub2RlLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KEFGU19WTk9ERV9XUklURUxPQ0tFRCwgJnZub2RlLT5mbGFncyk7CisJCQkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJCQlhZnNfdm5vZGVfcmVsZWFzZV9sb2NrKHZub2RlLCBrZXkpOworCQkJCWlmICghbGlzdF9lbXB0eSgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpKQorCQkJCQlhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHZub2RlKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWtleV9wdXQoa2V5KTsKKwkJX2xlYXZlKCIgW3BlbmRdIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBsb29rcyBsaWtlIHRoZSBsb2NrIHJlcXVlc3Qgd2FzIHdpdGhkcmF3biBvbiBhIHNpZ25hbCAqLworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJX2xlYXZlKCIgW25vIGxvY2tzXSIpOworfQorCisvKgorICogcGFzcyByZXNwb25zaWJpbGl0eSBmb3IgdGhlIHVubG9ja2luZyBvZiBhIHZub2RlIG9uIHRoZSBzZXJ2ZXIgdG8gdGhlCisgKiBtYW5hZ2VyIHRocmVhZCwgbGVzdCBhIHBlbmRpbmcgc2lnbmFsIGluIHRoZSBjYWxsaW5nIHRocmVhZCBpbnRlcnJ1cHQKKyAqIEFGX1JYUlBDCisgKiAtIHRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSB2bm9kZSBsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kZWZlcl91bmxvY2soc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSkKK3sKKwljYW5jZWxfZGVsYXllZF93b3JrKCZ2bm9kZS0+bG9ja193b3JrKTsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChBRlNfVk5PREVfUkVBRExPQ0tFRCwgJnZub2RlLT5mbGFncykgJiYKKwkgICAgIXRlc3RfYW5kX2NsZWFyX2JpdChBRlNfVk5PREVfV1JJVEVMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpKQorCQlCVUcoKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChBRlNfVk5PREVfVU5MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKSkKKwkJQlVHKCk7CisJdm5vZGUtPnVubG9ja19rZXkgPSBrZXlfZ2V0KGtleSk7CisJYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZSh2bm9kZSk7Cit9CisKKy8qCisgKiByZXF1ZXN0IGEgbG9jayBvbiBhIGZpbGUgb24gdGhlIHNlcnZlcgorICovCitzdGF0aWMgaW50IGFmc19kb19zZXRsayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCWFmc19sb2NrX3R5cGVfdCB0eXBlOworCXN0cnVjdCBrZXkgKmtleSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JXg6JXV9LCV1Iiwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIGZsLT5mbF90eXBlKTsKKworCS8qIG9ubHkgd2hvbGUtZmlsZSBsb2NrcyBhcmUgc3VwcG9ydGVkICovCisJaWYgKGZsLT5mbF9zdGFydCAhPSAwIHx8IGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZnNfaW5pdF9sb2NrX21hbmFnZXIoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZsLT5mbF9vcHMgPSAmYWZzX2xvY2tfb3BzOworCUlOSVRfTElTVF9IRUFEKCZmbC0+ZmxfdS5hZnMubGluayk7CisJZmwtPmZsX3UuYWZzLnN0YXRlID0gQUZTX0xPQ0tfUEVORElORzsKKworCXR5cGUgPSAoZmwtPmZsX3R5cGUgPT0gRl9SRExDSykgPyBBRlNfTE9DS19SRUFEIDogQUZTX0xPQ0tfV1JJVEU7CisKKwlsb2NrX2tlcm5lbCgpOworCisJLyogbWFrZSBzdXJlIHdlJ3ZlIGdvdCBhIGNhbGxiYWNrIG9uIHRoaXMgZmlsZSBhbmQgdGhhdCBvdXIgdmlldyBvZiB0aGUKKwkgKiBkYXRhIHZlcnNpb24gaXMgdXAgdG8gZGF0ZSAqLworCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUsIE5VTEwsIGtleSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAodm5vZGUtPnN0YXR1cy5sb2NrX2NvdW50ICE9IDAgJiYgIShmbC0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+cGVuZGluZ19sb2NrcykpIHsKKwkJLyogaWYgdGhlcmUncyBuby1vbmUgZWxzZSB3aXRoIGEgbG9jayBvbiB0aGlzIHZub2RlLCB0aGVuIHdlCisJCSAqIG5lZWQgdG8gYXNrIHRoZSBzZXJ2ZXIgZm9yIGEgbG9jayAqLworCQlpZiAobGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKSB7CisJCQlfZGVidWcoIm5vdCBsb2NrZWQiKTsKKwkJCUFTU0VSVENNUCh2bm9kZS0+ZmxhZ3MgJgorCQkJCSAgKCgxIDw8IEFGU19WTk9ERV9MT0NLSU5HKSB8CisJCQkJICAgKDEgPDwgQUZTX1ZOT0RFX1JFQURMT0NLRUQpIHwKKwkJCQkgICAoMSA8PCBBRlNfVk5PREVfV1JJVEVMT0NLRUQpKSwgPT0sIDApOworCQkJbGlzdF9hZGRfdGFpbCgmZmwtPmZsX3UuYWZzLmxpbmssICZ2bm9kZS0+cGVuZGluZ19sb2Nrcyk7CisJCQlzZXRfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkJCXJldCA9IGFmc192bm9kZV9zZXRfbG9jayh2bm9kZSwga2V5LCB0eXBlKTsKKwkJCWNsZWFyX2JpdChBRlNfVk5PREVfTE9DS0lORywgJnZub2RlLT5mbGFncyk7CisJCQlzd2l0Y2ggKHJldCkgeworCQkJY2FzZSAwOgorCQkJCWdvdG8gYWNxdWlyZWRfc2VydmVyX2xvY2s7CisJCQljYXNlIC1FV09VTERCTE9DSzoKKwkJCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJCQlBU1NFUlQobGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKTsKKwkJCQlBU1NFUlRDTVAodm5vZGUtPnBlbmRpbmdfbG9ja3MubmV4dCwgPT0sCisJCQkJCSAgJmZsLT5mbF91LmFmcy5saW5rKTsKKwkJCQlnb3RvIHdhaXQ7CisJCQlkZWZhdWx0OgorCQkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQkJCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwkJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKworCQkvKiBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhIHJlYWRsb2NrIG9uIHRoZSBzZXJ2ZXIgYW5kIG5vIHdhaXRpbmcKKwkJICogd3JpdGVsb2NrcywgdGhlbiB3ZSBtaWdodCBiZSBhYmxlIHRvIGluc3RhbnRseSBncmFudCBhbm90aGVyCisJCSAqIHJlYWRsb2NrICovCisJCWlmICh0eXBlID09IEFGU19MT0NLX1JFQUQgJiYKKwkJICAgIHZub2RlLT5mbGFncyAmICgxIDw8IEFGU19WTk9ERV9SRUFETE9DS0VEKSkgeworCQkJX2RlYnVnKCJpbnN0YW50IHJlYWRsb2NrIik7CisJCQlBU1NFUlRDTVAodm5vZGUtPmZsYWdzICYKKwkJCQkgICgoMSA8PCBBRlNfVk5PREVfTE9DS0lORykgfAorCQkJCSAgICgxIDw8IEFGU19WTk9ERV9XUklURUxPQ0tFRCkpLCA9PSwgMCk7CisJCQlBU1NFUlQoIWxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSk7CisJCQlnb3RvIHNoYXJpbmdfZXhpc3RpbmdfbG9jazsKKwkJfQorCX0KKworCS8qIG90aGVyd2lzZSwgd2UgbmVlZCB0byB3YWl0IGZvciBhIGxvY2FsIGxvY2sgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCV9kZWJ1Zygid2FpdCBsb2NhbCIpOworCWxpc3RfYWRkX3RhaWwoJmZsLT5mbF91LmFmcy5saW5rLCAmdm5vZGUtPnBlbmRpbmdfbG9ja3MpOword2FpdDoKKwlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkpIHsKKwkJX2RlYnVnKCJub2Jsb2NrIik7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gYWJvcnRfYXR0ZW1wdDsKKwl9CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCS8qIG5vdyB3ZSBuZWVkIHRvIHNsZWVwIGFuZCB3YWl0IGZvciB0aGUgbG9jayBtYW5hZ2VyIHRocmVhZCB0byBnZXQgdGhlCisJICogbG9jayBmcm9tIHRoZSBzZXJ2ZXIgKi8KKwlfZGVidWcoInNsZWVwIik7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZsLT5mbF93YWl0LAorCQkJCSAgICAgICBmbC0+ZmxfdS5hZnMuc3RhdGUgPD0gQUZTX0xPQ0tfR1JBTlRFRCk7CisJaWYgKGZsLT5mbF91LmFmcy5zdGF0ZSA8PSBBRlNfTE9DS19HUkFOVEVEKSB7CisJCXJldCA9IGZsLT5mbF91LmFmcy5zdGF0ZTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJZ290byBnaXZlbl9sb2NrOworCX0KKworCS8qIHdlIHdlcmUgaW50ZXJydXB0ZWQsIGJ1dCBzb21lb25lIG1heSBzdGlsbCBiZSBpbiB0aGUgdGhyb2VzIG9mCisJICogZ2l2aW5nIHVzIHRoZSBsb2NrICovCisJX2RlYnVnKCJpbnRyIik7CisJQVNTRVJUQ01QKHJldCwgPT0sIC1FUkVTVEFSVFNZUyk7CisKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwlpZiAoZmwtPmZsX3UuYWZzLnN0YXRlIDw9IEFGU19MT0NLX0dSQU5URUQpIHsKKwkJcmV0ID0gZmwtPmZsX3UuYWZzLnN0YXRlOworCQlpZiAocmV0IDwgMCkgeworCQkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZ290byBnaXZlbl9sb2NrOworCX0KKworYWJvcnRfYXR0ZW1wdDoKKwkvKiB3ZSBhcmVuJ3QgZ29pbmcgdG8gZ2V0IHRoZSBsb2NrLCBlaXRoZXIgYmVjYXVzZSB3ZSdyZSB1bndpbGxpbmcgdG8KKwkgKiB3YWl0LCBvciBiZWNhdXNlIHNvbWUgc2lnbmFsIGhhcHBlbmVkICovCisJX2RlYnVnKCJhYm9ydCIpOworCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykgJiYKKwkgICAgdm5vZGUtPnBlbmRpbmdfbG9ja3MubmV4dCA9PSAmZmwtPmZsX3UuYWZzLmxpbmspIHsKKwkJaWYgKHZub2RlLT5wZW5kaW5nX2xvY2tzLnByZXYgIT0gJmZsLT5mbF91LmFmcy5saW5rKSB7CisJCQkvKiBraWNrIHRoZSBuZXh0IHBlbmRpbmcgbG9jayBpbnRvIGhhdmluZyBhIGdvICovCisJCQlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfdS5hZnMubGluayk7CisJCQlhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHZub2RlKTsKKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwl9CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlnb3RvIGVycm9yOworCithY3F1aXJlZF9zZXJ2ZXJfbG9jazoKKwkvKiB3ZSd2ZSBhY3F1aXJlZCBhIHNlcnZlciBsb2NrLCBidXQgaXQgbmVlZHMgdG8gYmUgcmVuZXdlZCBhZnRlciA1CisJICogbWlucyAqLworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCWFmc19zY2hlZHVsZV9sb2NrX2V4dGVuc2lvbih2bm9kZSk7CisJaWYgKHR5cGUgPT0gQUZTX0xPQ0tfUkVBRCkKKwkJc2V0X2JpdChBRlNfVk5PREVfUkVBRExPQ0tFRCwgJnZub2RlLT5mbGFncyk7CisJZWxzZQorCQlzZXRfYml0KEFGU19WTk9ERV9XUklURUxPQ0tFRCwgJnZub2RlLT5mbGFncyk7CitzaGFyaW5nX2V4aXN0aW5nX2xvY2s6CisJLyogdGhlIGxvY2sgaGFzIGJlZW4gZ3JhbnRlZCBhcyBmYXIgYXMgd2UncmUgY29uY2VybmVkLi4uICovCisJZmwtPmZsX3UuYWZzLnN0YXRlID0gQUZTX0xPQ0tfR1JBTlRFRDsKKwlsaXN0X21vdmVfdGFpbCgmZmwtPmZsX3UuYWZzLmxpbmssICZ2bm9kZS0+Z3JhbnRlZF9sb2Nrcyk7CitnaXZlbl9sb2NrOgorCS8qIC4uLiBidXQgd2UgZG8gc3RpbGwgbmVlZCB0byBnZXQgdGhlIFZGUydzIGJsZXNzaW5nICovCisJQVNTRVJUKCEodm5vZGUtPmZsYWdzICYgKDEgPDwgQUZTX1ZOT0RFX0xPQ0tJTkcpKSk7CisJQVNTRVJUKCh2bm9kZS0+ZmxhZ3MgJiAoKDEgPDwgQUZTX1ZOT0RFX1JFQURMT0NLRUQpIHwKKwkJCQkoMSA8PCBBRlNfVk5PREVfV1JJVEVMT0NLRUQpKSkgIT0gMCk7CisJcmV0ID0gcG9zaXhfbG9ja19maWxlKGZpbGUsIGZsLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB2ZnNfcmVqZWN0ZWRfbG9jazsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJLyogYWdhaW4sIG1ha2Ugc3VyZSB3ZSd2ZSBnb3QgYSBjYWxsYmFjayBvbiB0aGlzIGZpbGUgYW5kLCBhZ2FpbiwgbWFrZQorCSAqIHN1cmUgdGhhdCBvdXIgdmlldyBvZiB0aGUgZGF0YSB2ZXJzaW9uIGlzIHVwIHRvIGRhdGUgKHdlIGlnbm9yZQorCSAqIGVycm9ycyBpbmN1cnJlZCBoZXJlIGFuZCBkZWFsIHdpdGggdGhlIGNvbnNlcXVlbmNlcyBlbHNld2hlcmUpICovCisJYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSwgTlVMTCwga2V5KTsKKworZXJyb3I6CisJdW5sb2NrX2tlcm5lbCgpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK3Zmc19yZWplY3RlZF9sb2NrOgorCS8qIHRoZSBWRlMgcmVqZWN0ZWQgdGhlIGxvY2sgd2UganVzdCBvYnRhaW5lZCwgc28gd2UgaGF2ZSB0byBkaXNjYXJkCisJICogd2hhdCB3ZSBqdXN0IGdvdCAqLworCV9kZWJ1ZygidmZzIHJlZnVzZWQgJWQiLCByZXQpOworCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwlpZiAobGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKQorCQlhZnNfZGVmZXJfdW5sb2NrKHZub2RlLCBrZXkpOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJZ290byBhYm9ydF9hdHRlbXB0OworfQorCisvKgorICogdW5sb2NrIG9uIGEgZmlsZSBvbiB0aGUgc2VydmVyCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RvX3VubGsoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KTsKKwlzdHJ1Y3Qga2V5ICprZXkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCV9lbnRlcigieyV4OiV1fSwldSIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBmbC0+ZmxfdHlwZSk7CisKKwkvKiBvbmx5IHdob2xlLWZpbGUgdW5sb2NrcyBhcmUgc3VwcG9ydGVkICovCisJaWYgKGZsLT5mbF9zdGFydCAhPSAwIHx8IGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmbC0+Zmxfb3BzID0gJmFmc19sb2NrX29wczsKKwlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX3UuYWZzLmxpbmspOworCWZsLT5mbF91LmFmcy5zdGF0ZSA9IEFGU19MT0NLX1BFTkRJTkc7CisKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwlyZXQgPSBwb3NpeF9sb2NrX2ZpbGUoZmlsZSwgZmwsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCV9sZWF2ZSgiID0gJWQgW3Zmc10iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGRpc2NhcmQgdGhlIHNlcnZlciBsb2NrIG9ubHkgaWYgYWxsIGdyYW50ZWQgbG9ja3MgYXJlIGdvbmUgKi8KKwlpZiAobGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKQorCQlhZnNfZGVmZXJfdW5sb2NrKHZub2RlLCBrZXkpOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NrIHdlIGN1cnJlbnRseSBob2xkLCBpZiBpbmRlZWQgd2UgaG9sZCBvbmUKKyAqLworc3RhdGljIGludCBhZnNfZG9fZ2V0bGsoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KTsKKwlzdHJ1Y3Qga2V5ICprZXkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCwgbG9ja19jb3VudDsKKworCV9lbnRlcigiIik7CisKKwlmbC0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisKKwltdXRleF9sb2NrKCZ2bm9kZS0+dmZzX2lub2RlLmlfbXV0ZXgpOworCisJLyogY2hlY2sgbG9jYWwgbG9jayByZWNvcmRzIGZpcnN0ICovCisJcmV0ID0gMDsKKwlpZiAocG9zaXhfdGVzdF9sb2NrKGZpbGUsIGZsKSA9PSAwKSB7CisJCS8qIG5vIGxvY2FsIGxvY2tzOyBjb25zdWx0IHRoZSBzZXJ2ZXIgKi8KKwkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSwgTlVMTCwga2V5KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCQlsb2NrX2NvdW50ID0gdm5vZGUtPnN0YXR1cy5sb2NrX2NvdW50OworCQlpZiAobG9ja19jb3VudCkgeworCQkJaWYgKGxvY2tfY291bnQgPiAwKQorCQkJCWZsLT5mbF90eXBlID0gRl9SRExDSzsKKwkJCWVsc2UKKwkJCQlmbC0+ZmxfdHlwZSA9IEZfV1JMQ0s7CisJCQlmbC0+Zmxfc3RhcnQgPSAwOworCQkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJCX0KKwl9CisKK2Vycm9yOgorCW11dGV4X3VubG9jaygmdm5vZGUtPnZmc19pbm9kZS5pX211dGV4KTsKKwlfbGVhdmUoIiA9ICVkIFslaGRdIiwgcmV0LCBmbC0+ZmxfdHlwZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1hbmFnZSBQT1NJWCBsb2NrcyBvbiBhIGZpbGUKKyAqLworaW50IGFmc19sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKworCV9lbnRlcigieyV4OiV1fSwlZCx7dD0leCxmbD0leCxyPSVMZDolTGR9IiwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIGNtZCwKKwkgICAgICAgZmwtPmZsX3R5cGUsIGZsLT5mbF9mbGFncywKKwkgICAgICAgKGxvbmcgbG9uZykgZmwtPmZsX3N0YXJ0LCAobG9uZyBsb25nKSBmbC0+ZmxfZW5kKTsKKworCS8qIEFGUyBkb2Vzbid0IHN1cHBvcnQgbWFuZGF0b3J5IGxvY2tzICovCisJaWYgKCh2bm9kZS0+dmZzX2lub2RlLmlfbW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IFNfSVNHSUQgJiYKKwkgICAgZmwtPmZsX3R5cGUgIT0gRl9VTkxDSykKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwlpZiAoSVNfR0VUTEsoY21kKSkKKwkJcmV0dXJuIGFmc19kb19nZXRsayhmaWxlLCBmbCk7CisJaWYgKGZsLT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiBhZnNfZG9fdW5sayhmaWxlLCBmbCk7CisJcmV0dXJuIGFmc19kb19zZXRsayhmaWxlLCBmbCk7Cit9CisKKy8qCisgKiBtYW5hZ2UgRkxPQ0sgbG9ja3Mgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfZmxvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJX2VudGVyKCJ7JXg6JXV9LCVkLHt0PSV4LGZsPSV4fSIsCisJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBjbWQsCisJICAgICAgIGZsLT5mbF90eXBlLCBmbC0+ZmxfZmxhZ3MpOworCisJLyoKKwkgKiBObyBCU0QgZmxvY2tzIG92ZXIgTkZTIGFsbG93ZWQuCisJICogTm90ZTogd2UgY291bGQgdHJ5IHRvIGZha2UgYSBQT1NJWCBsb2NrIHJlcXVlc3QgaGVyZSBieQorCSAqIHVzaW5nICgodTMyKSBmaWxwIHwgMHg4MDAwMDAwMCkgb3Igc29tZSBzdWNoIGFzIHRoZSBwaWQuCisJICogTm90IHN1cmUgd2hldGhlciB0aGF0IHdvdWxkIGJlIHVuaXF1ZSwgdGhvdWdoLCBvciB3aGV0aGVyCisJICogdGhhdCB3b3VsZCBicmVhayBpbiBvdGhlciBwbGFjZXMuCisJICovCisJaWYgKCEoZmwtPmZsX2ZsYWdzICYgRkxfRkxPQ0spKQorCQlyZXR1cm4gLUVOT0xDSzsKKworCS8qIHdlJ3JlIHNpbXVsYXRpbmcgZmxvY2soKSBsb2NrcyB1c2luZyBwb3NpeCBsb2NrcyBvbiB0aGUgc2VydmVyICovCisJZmwtPmZsX293bmVyID0gKGZsX293bmVyX3QpIGZpbGU7CisJZmwtPmZsX3N0YXJ0ID0gMDsKKwlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKworCWlmIChmbC0+ZmxfdHlwZSA9PSBGX1VOTENLKQorCQlyZXR1cm4gYWZzX2RvX3VubGsoZmlsZSwgZmwpOworCXJldHVybiBhZnNfZG9fc2V0bGsoZmlsZSwgZmwpOworfQorCisvKgorICogdGhlIFBPU0lYIGxvY2sgbWFuYWdlbWVudCBjb3JlIFZGUyBjb2RlIGNvcGllcyB0aGUgbG9jayByZWNvcmQgYW5kIGFkZHMgdGhlCisgKiBjb3B5IGludG8gaXRzIG93biBsaXN0LCBzbyB3ZSBuZWVkIHRvIGFkZCB0aGF0IGNvcHkgdG8gdGhlIHZub2RlJ3MgbG9jaworICogcXVldWUgaW4gdGhlIHNhbWUgcGxhY2UgYXMgdGhlIG9yaWdpbmFsICh3aGljaCB3aWxsIGJlIGRlbGV0ZWQgc2hvcnRseQorICogYWZ0ZXIpCisgKi8KK3N0YXRpYyB2b2lkIGFmc19mbF9jb3B5X2xvY2soc3RydWN0IGZpbGVfbG9jayAqbmV3LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlfZW50ZXIoIiIpOworCisJbGlzdF9hZGQoJm5ldy0+ZmxfdS5hZnMubGluaywgJmZsLT5mbF91LmFmcy5saW5rKTsKK30KKworLyoKKyAqIG5lZWQgdG8gcmVtb3ZlIHRoaXMgbG9jayBmcm9tIHRoZSB2bm9kZSBxdWV1ZSB3aGVuIGl0J3MgcmVtb3ZlZCBmcm9tIHRoZQorICogVkZTJ3MgbGlzdAorICovCitzdGF0aWMgdm9pZCBhZnNfZmxfcmVsZWFzZV9wcml2YXRlKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCV9lbnRlcigiIik7CisKKwlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfdS5hZnMubGluayk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuYyBiL2ZzL2Fmcy9mc2NsaWVudC5jCmluZGV4IDVkZmYxMzAuLjAyM2I5NWIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9mc2NsaWVudC5jCisrKyBiL2ZzL2Fmcy9mc2NsaWVudC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJRVhUUkFDVChzdGF0dXMtPmdyb3VwKTsKIAlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KIAlkYXRhX3ZlcnNpb24gfD0gKHU2NCkgbnRvaGwoKmJwKyspIDw8IDMyOwotCWJwKys7IC8qIGxvY2sgY291bnQgKi8KKwlFWFRSQUNUKHN0YXR1cy0+bG9ja19jb3VudCk7CiAJc2l6ZSB8PSAodTY0KSBudG9obCgqYnArKykgPDwgMzI7CiAJYnArKzsgLyogc3BhcmUgNCAqLwogCSpfYnAgPSBicDsKQEAgLTE3NDgsMyArMTc0OCwxNTYgQEAKIAogCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOwogfQorCisvKgorICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlNldExvY2ssIEZTLkV4dGVuZExvY2sgb3IgRlMuUmVsZWFzZUxvY2sKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc194eHh4X2xvY2soc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCit7CisJY29uc3QgX19iZTMyICpicDsKKworCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCisJYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKKworCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKKwkJcmV0dXJuIC1FQkFETVNHOworCisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KKwlicCA9IGNhbGwtPmJ1ZmZlcjsKKwkvKiB4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseVgpOyAqLworCisJX2xlYXZlKCIgPSAwIFtkb25lXSIpOworCXJldHVybiAwOworfQorCisvKgorICogRlMuU2V0TG9jayBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNTZXRMb2NrID0geworCS5uYW1lCQk9ICJGUy5TZXRMb2NrIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jaywKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogRlMuRXh0ZW5kTG9jayBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNFeHRlbmRMb2NrID0geworCS5uYW1lCQk9ICJGUy5FeHRlbmRMb2NrIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jaywKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogRlMuUmVsZWFzZUxvY2sgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTUmVsZWFzZUxvY2sgPSB7CisJLm5hbWUJCT0gIkZTLlJlbGVhc2VMb2NrIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jaywKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogZ2V0IGEgbG9jayBvbiBhIGZpbGUKKyAqLworaW50IGFmc19mc19zZXRfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgICAgc3RydWN0IGtleSAqa2V5LAorCQkgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCSAgICBhZnNfbG9ja190eXBlX3QgdHlwZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTU2V0TG9jaywgNSAqIDQsIDYgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gdm5vZGU7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoRlNTRVRMT0NLKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCSpicCsrID0gaHRvbmwodHlwZSk7CisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KKworLyoKKyAqIGV4dGVuZCBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfZnNfZXh0ZW5kX2xvY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJICAgICAgIHN0cnVjdCBrZXkgKmtleSwKKwkJICAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJX19iZTMyICpicDsKKworCV9lbnRlcigiIik7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNFeHRlbmRMb2NrLCA0ICogNCwgNiAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJKmJwKysgPSBodG9ubChGU0VYVEVORExPQ0spOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KKworLyoKKyAqIHJlbGVhc2UgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX2ZzX3JlbGVhc2VfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJc3RydWN0IGtleSAqa2V5LAorCQkJc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQljb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU1JlbGVhc2VMb2NrLCA0ICogNCwgNiAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJKmJwKysgPSBodG9ubChGU1JFTEVBU0VMT0NLKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvaW50ZXJuYWwuaCBiL2ZzL2Fmcy9pbnRlcm5hbC5oCmluZGV4IDJjNTVkZDkuLjYzMDY0MzggMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbnRlcm5hbC5oCisrKyBiL2ZzL2Fmcy9pbnRlcm5hbC5oCkBAIC0zNTEsMTAgKzM1MSwxOCBAQAogI2RlZmluZSBBRlNfVk5PREVfWkFQX0RBVEEJMwkJLyogc2V0IGlmIHZub2RlJ3MgZGF0YSBzaG91bGQgYmUgaW52YWxpZGF0ZWQgKi8KICNkZWZpbmUgQUZTX1ZOT0RFX0RFTEVURUQJNAkJLyogc2V0IGlmIHZub2RlIGRlbGV0ZWQgb24gc2VydmVyICovCiAjZGVmaW5lIEFGU19WTk9ERV9NT1VOVFBPSU5UCTUJCS8qIHNldCBpZiB2bm9kZSBpcyBhIG1vdW50cG9pbnQgc3ltbGluayAqLworI2RlZmluZSBBRlNfVk5PREVfTE9DS0lORwk2CQkvKiBzZXQgaWYgd2FpdGluZyBmb3IgbG9jayBvbiB2bm9kZSAqLworI2RlZmluZSBBRlNfVk5PREVfUkVBRExPQ0tFRAk3CQkvKiBzZXQgaWYgdm5vZGUgaXMgcmVhZC1sb2NrZWQgb24gdGhlIHNlcnZlciAqLworI2RlZmluZSBBRlNfVk5PREVfV1JJVEVMT0NLRUQJOAkJLyogc2V0IGlmIHZub2RlIGlzIHdyaXRlLWxvY2tlZCBvbiB0aGUgc2VydmVyICovCisjZGVmaW5lIEFGU19WTk9ERV9VTkxPQ0tJTkcJOQkJLyogc2V0IGlmIHZub2RlIGlzIGJlaW5nIHVubG9ja2VkIG9uIHRoZSBzZXJ2ZXIgKi8KIAogCWxvbmcJCQlhY2xfb3JkZXI7CS8qIEFDTCBjaGVjayBjb3VudCAoY2FsbGJhY2sgYnJlYWsgY291bnQpICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXdyaXRlYmFja3M7CS8qIGFsdGVyYXRpb25zIGluIHBhZ2VjYWNoZSB0aGF0IG5lZWQgd3JpdGluZyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcGVuZGluZ19sb2NrczsJLyogbG9ja3Mgd2FpdGluZyB0byBiZSBncmFudGVkICovCisJc3RydWN0IGxpc3RfaGVhZAlncmFudGVkX2xvY2tzOwkvKiBsb2NrcyBncmFudGVkIG9uIHRoaXMgZmlsZSAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsJbG9ja193b3JrOwkvKiB3b3JrIHRvIGJlIGRvbmUgaW4gbG9ja2luZyAqLworCXN0cnVjdCBrZXkJCSp1bmxvY2tfa2V5OwkvKiBrZXkgdG8gYmUgdXNlZCBpbiB1bmxvY2tpbmcgKi8KIAogCS8qIG91dHN0YW5kaW5nIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBvbiB0aGlzIGZpbGUgKi8KIAlzdHJ1Y3QgcmJfbm9kZQkJc2VydmVyX3JiOwkvKiBsaW5rIGluIHNlcnZlci0+ZnNfdm5vZGVzICovCkBAIC00NzQsNiArNDgyLDE1IEBACiBleHRlcm4gaW50IGFmc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIAogLyoKKyAqIGZsb2NrLmMKKyAqLworZXh0ZXJuIHZvaWQgX19leGl0IGFmc19raWxsX2xvY2tfbWFuYWdlcih2b2lkKTsKK2V4dGVybiB2b2lkIGFmc19sb2NrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZShzdHJ1Y3QgYWZzX3Zub2RlICopOworZXh0ZXJuIGludCBhZnNfbG9jayhzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7CitleHRlcm4gaW50IGFmc19mbG9jayhzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7CisKKy8qCiAgKiBmc2NsaWVudC5jCiAgKi8KIGV4dGVybiBpbnQgYWZzX2ZzX2ZldGNoX2ZpbGVfc3RhdHVzKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKQEAgLTUxMyw2ICs1MzAsMTUgQEAKIAkJCQkgICAgc3RydWN0IGFmc192bm9kZSAqLAogCQkJCSAgICBzdHJ1Y3QgYWZzX3ZvbHVtZV9zdGF0dXMgKiwKIAkJCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19zZXRfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgICBzdHJ1Y3QgYWZzX3Zub2RlICosIGFmc19sb2NrX3R5cGVfdCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIGludCBhZnNfZnNfZXh0ZW5kX2xvY2soc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLAorCQkJICAgICAgc3RydWN0IGFmc192bm9kZSAqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19yZWxlYXNlX2xvY2soc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLAorCQkJICAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKIAogLyoKICAqIGlub2RlLmMKQEAgLTY4MSw2ICs3MDcsMTAgQEAKIGV4dGVybiBpbnQgYWZzX3Zub2RlX3NldGF0dHIoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICosIHN0cnVjdCBpYXR0ciAqKTsKIGV4dGVybiBpbnQgYWZzX3Zub2RlX2dldF92b2x1bWVfc3RhdHVzKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLAogCQkJCSAgICAgICBzdHJ1Y3QgYWZzX3ZvbHVtZV9zdGF0dXMgKik7CitleHRlcm4gaW50IGFmc192bm9kZV9zZXRfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgICAgIGFmc19sb2NrX3R5cGVfdCk7CitleHRlcm4gaW50IGFmc192bm9kZV9leHRlbmRfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKik7CitleHRlcm4gaW50IGFmc192bm9kZV9yZWxlYXNlX2xvY2soc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICopOwogCiAvKgogICogdm9sdW1lLmMKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tYWluLmMgYi9mcy9hZnMvbWFpbi5jCmluZGV4IGNkMjExOTUuLjBmNjBmNmIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9tYWluLmMKKysrIGIvZnMvYWZzL21haW4uYwpAQCAtMTY4LDYgKzE2OCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAia0FGUzogUmVkIEhhdCBBRlMgY2xpZW50IHYwLjEgdW5yZWdpc3RlcmluZy5cbiIpOwogCiAJYWZzX2ZzX2V4aXQoKTsKKwlhZnNfa2lsbF9sb2NrX21hbmFnZXIoKTsKIAlhZnNfY2xvc2Vfc29ja2V0KCk7CiAJYWZzX3B1cmdlX3NlcnZlcnMoKTsKIAlhZnNfY2FsbGJhY2tfdXBkYXRlX2tpbGwoKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9taXNjLmMgYi9mcy9hZnMvbWlzYy5jCmluZGV4IGQxYTg4OWMuLjJkMzNhNWYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9taXNjLmMKKysrIGIvZnMvYWZzL21pc2MuYwpAQCAtMzUsNiArMzUsNyBAQAogCWNhc2UgVk9WRVJRVU9UQToJcmV0dXJuIC1FRFFVT1Q7CiAJY2FzZSBWQlVTWToJCXJldHVybiAtRUJVU1k7CiAJY2FzZSBWTU9WRUQ6CQlyZXR1cm4gLUVOWElPOworCWNhc2UgMHgyZjZkZjBhOgkJcmV0dXJuIC1FV09VTERCTE9DSzsKIAljYXNlIDB4MmY2ZGYwYzoJCXJldHVybiAtRUFDQ0VTOwogCWNhc2UgMHgyZjZkZjBmOgkJcmV0dXJuIC1FQlVTWTsKIAljYXNlIDB4MmY2ZGYxMDoJCXJldHVybiAtRUVYSVNUOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3Byb2MuYyBiL2ZzL2Fmcy9wcm9jLmMKaW5kZXggMTNkZjUxMi4uNmVkYjU2NiAxMDA2NDQKLS0tIGEvZnMvYWZzL3Byb2MuYworKysgYi9mcy9hZnMvcHJvYy5jCkBAIC0yMDEsMjMgKzIwMSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCiAJZG93bl9yZWFkKCZhZnNfcHJvY19jZWxsc19zZW0pOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gKHZvaWQgKikgMTsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZhZnNfcHJvY19jZWxscykKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZhZnNfcHJvY19jZWxscyA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnRfaGVhZCgmYWZzX3Byb2NfY2VsbHMsICpfcG9zKTsKIH0KIAogLyoKQEAgLTIyNSwxNCArMjExLDcgQEAKICAqLwogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gdiA9PSAodm9pZCAqKSAxID8gYWZzX3Byb2NfY2VsbHMubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIF9wICE9ICZhZnNfcHJvY19jZWxscyA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmYWZzX3Byb2NfY2VsbHMsIHBvcyk7CiB9CiAKIC8qCkBAIC0yNTAsNyArMjI5LDcgQEAKIHsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBhZnNfY2VsbCwgcHJvY19saW5rKTsKIAotCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwlpZiAodiA9PSAmYWZzX3Byb2NfY2VsbHMpIHsKIAkJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCiAJCXNlcV9wdXRzKG0sICJVU0UgTkFNRVxuIik7CiAJCXJldHVybiAwOwpAQCAtNTAzLDI2ICs0ODIsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfdm9sdW1lc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKIAogCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOwogCiAJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwogCWRvd25fcmVhZCgmY2VsbC0+dmxfc2VtKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuICh2b2lkICopIDE7Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmY2VsbC0+dmxfbGlzdCkKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZjZWxsLT52bF9saXN0ID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZjZWxsLT52bF9saXN0LCAqX3Bvcyk7CiB9CiAKIC8qCkBAIC01MzEsMTcgKzQ5NywxMCBAQAogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfdm9sdW1lc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKIAkJCQkJbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CiAKIAlfZW50ZXIoImNlbGw9JXAgcG9zPSVMZCIsIGNlbGwsICpfcG9zKTsKLQotCSgqX3BvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9ICh2ID09ICh2b2lkICopIDEpID8gY2VsbC0+dmxfbGlzdC5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gKF9wICE9ICZjZWxsLT52bF9saXN0KSA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmY2VsbC0+dmxfbGlzdCwgX3Bvcyk7CiB9CiAKIC8qCkBAIC01NjksMTEgKzUyOCwxMiBAQAogICovCiBzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdm9sdW1lc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPQogCQlsaXN0X2VudHJ5KHYsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCBsaW5rKTsKIAogCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwlpZiAodiA9PSAmY2VsbC0+dmxfbGlzdCkgewogCQlzZXFfcHV0cyhtLCAiVVNFIFNUVCBWTElEWzBdICBWTElEWzFdICBWTElEWzJdICBOQU1FXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNzM0LDI2ICs2OTQsMTMgQEAKIHN0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3NlcnZlcnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCiAJX19hY3F1aXJlcyhtLT5wcml2YXRlLT5zZXJ2ZXJzX2xvY2spCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gbS0+cHJpdmF0ZTsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7CiAKIAlfZW50ZXIoImNlbGw9JXAgcG9zPSVMZCIsIGNlbGwsICpfcG9zKTsKIAogCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KIAlyZWFkX2xvY2soJmNlbGwtPnNlcnZlcnNfbG9jayk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiAodm9pZCAqKSAxOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnNlcnZlcnMpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmY2VsbC0+c2VydmVycyA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnRfaGVhZCgmY2VsbC0+c2VydmVycywgKl9wb3MpOwogfQogCiAvKgpAQCAtNzYyLDE3ICs3MDksMTAgQEAKIHN0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3NlcnZlcnNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsCiAJCQkJCWxvZmZfdCAqX3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBwLT5wcml2YXRlOwogCiAJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7Ci0KLQkoKl9wb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSB2ID09ICh2b2lkICopIDEgPyBjZWxsLT5zZXJ2ZXJzLm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiBfcCAhPSAmY2VsbC0+c2VydmVycyA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmY2VsbC0+c2VydmVycywgX3Bvcyk7CiB9CiAKIC8qCkBAIC03OTEsMTEgKzczMSwxMiBAQAogICovCiBzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfc2VydmVyc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBhZnNfc2VydmVyLCBsaW5rKTsKIAljaGFyIGlwYWRkclsyMF07CiAKIAkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KLQlpZiAodiA9PSAodm9pZCAqKSAxKSB7CisJaWYgKHYgPT0gJmNlbGwtPnNlcnZlcnMpIHsKIAkJc2VxX3B1dHMobSwgIlVTRSBBRERSICAgICAgICAgICAgU1RBVEVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IDJlODQ5NmIuLjk5M2NkZjEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC00NjAsNiArNDYwLDkgQEAKIAlzcGluX2xvY2tfaW5pdCgmdm5vZGUtPndyaXRlYmFja19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmdm5vZGUtPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZ2bm9kZS0+d3JpdGViYWNrcyk7CisJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT5wZW5kaW5nX2xvY2tzKTsKKwlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpOworCUlOSVRfREVMQVlFRF9XT1JLKCZ2bm9kZS0+bG9ja193b3JrLCBhZnNfbG9ja193b3JrKTsKIAlJTklUX1dPUksoJnZub2RlLT5jYl9icm9rZW5fd29yaywgYWZzX2Jyb2tlbl9jYWxsYmFja193b3JrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYWZzL3Zub2RlLmMgYi9mcy9hZnMvdm5vZGUuYwppbmRleCAyMzJjNTVkLi4yZjA1YzRmIDEwMDY0NAotLS0gYS9mcy9hZnMvdm5vZGUuYworKysgYi9mcy9hZnMvdm5vZGUuYwpAQCAtNTYxLDcgKzU2MSw3IEBACiAvKgogICogY3JlYXRlIGEgaGFyZCBsaW5rCiAgKi8KLWV4dGVybiBpbnQgYWZzX3Zub2RlX2xpbmsoc3RydWN0IGFmc192bm9kZSAqZHZub2RlLCBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKK2ludCBhZnNfdm5vZGVfbGluayhzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUsIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAogCQkJICBzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKQEAgLTg4NywxMSArODg3LDYgQEAKIAkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCiAJICAgICAgIGtleV9zZXJpYWwoa2V5KSk7CiAKLQkvKiB0aGlzIG9wIHdpbGwgZmV0Y2ggdGhlIHN0YXR1cyAqLwotCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCXZub2RlLT51cGRhdGVfY250Kys7Ci0Jc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKLQogCWRvIHsKIAkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLwogCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CkBAIC05MDUsMjAgKzkwMCwxMjcgQEAKIAl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUsIHNlcnZlciwgcmV0KSk7CiAKIAkvKiBhZGp1c3QgdGhlIGZsYWdzICovCi0JaWYgKHJldCA9PSAwKSB7Ci0JCWFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKHZub2RlLCBzZXJ2ZXIpOworCWlmIChyZXQgPT0gMCkKIAkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKLQl9IGVsc2UgewotCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQodm5vZGUsIHJldCk7Ci0JfQogCiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIAogbm9fc2VydmVyOgotCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCXZub2RlLT51cGRhdGVfY250LS07Ci0JQVNTRVJUQ01QKHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7Ci0Jc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQorCisvKgorICogZ2V0IGEgbG9jayBvbiBhIGZpbGUKKyAqLworaW50IGFmc192bm9kZV9zZXRfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5LAorCQkgICAgICAgYWZzX2xvY2tfdHlwZV90IHR5cGUpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlc3sleDoldS4ldX0sJXgsJXUiLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSksIHR5cGUpOworCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CisKKwkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKworCQlyZXQgPSBhZnNfZnNfc2V0X2xvY2soc2VydmVyLCBrZXksIHZub2RlLCB0eXBlLCAmYWZzX3N5bmNfY2FsbCk7CisKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUsIHNlcnZlciwgcmV0KSk7CisKKwkvKiBhZGp1c3QgdGhlIGZsYWdzICovCisJaWYgKHJldCA9PSAwKQorCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworbm9fc2VydmVyOgorCXJldHVybiBQVFJfRVJSKHNlcnZlcik7Cit9CisKKy8qCisgKiBleHRlbmQgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX3Zub2RlX2V4dGVuZF9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlc3sleDoldS4ldX0sJXgiLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSkpOworCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CisKKwkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKworCQlyZXQgPSBhZnNfZnNfZXh0ZW5kX2xvY2soc2VydmVyLCBrZXksIHZub2RlLCAmYWZzX3N5bmNfY2FsbCk7CisKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUsIHNlcnZlciwgcmV0KSk7CisKKwkvKiBhZGp1c3QgdGhlIGZsYWdzICovCisJaWYgKHJldCA9PSAwKQorCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworbm9fc2VydmVyOgorCXJldHVybiBQVFJfRVJSKHNlcnZlcik7Cit9CisKKy8qCisgKiByZWxlYXNlIGEgbG9jayBvbiBhIGZpbGUKKyAqLworaW50IGFmc192bm9kZV9yZWxlYXNlX2xvY2soc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzeyV4OiV1LiV1fSwleCIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSk7CisKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19yZWxlYXNlX2xvY2soc2VydmVyLCBrZXksIHZub2RlLCAmYWZzX3N5bmNfY2FsbCk7CisKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUsIHNlcnZlciwgcmV0KSk7CisKKwkvKiBhZGp1c3QgdGhlIGZsYWdzICovCisJaWYgKHJldCA9PSAwKQorCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworbm9fc2VydmVyOgogCXJldHVybiBQVFJfRVJSKHNlcnZlcik7CiB9CmRpZmYgLS1naXQgYS9mcy9hbm9uX2lub2Rlcy5jIGIvZnMvYW5vbl9pbm9kZXMuYwppbmRleCBlZGM2NzQ4Li5iNGE3NTg4IDEwMDY0NAotLS0gYS9mcy9hbm9uX2lub2Rlcy5jCisrKyBiL2ZzL2Fub25faW5vZGVzLmMKQEAgLTUzLDcgKzUzLDcgQEAKIH07CiAKIC8qKgotICogYW5vbl9pbm9kZV9nZXRmZCAtIGNyZWF0ZXMgYSBuZXcgZmlsZSBpbnN0YW5jZSBieSBob29raW5nIGl0IHVwIHRvIGFuZAorICogYW5vbl9pbm9kZV9nZXRmZCAtIGNyZWF0ZXMgYSBuZXcgZmlsZSBpbnN0YW5jZSBieSBob29raW5nIGl0IHVwIHRvIGFuCiAgKiAgICAgICAgICAgICAgICAgICAgYW5vbnltb3VzIGlub2RlLCBhbmQgYSBkZW50cnkgdGhhdCBkZXNjcmliZSB0aGUgImNsYXNzIgogICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlCiAgKgpAQCAtNjYsNyArNjYsNyBAQAogICoKICAqIENyZWF0ZXMgYSBuZXcgZmlsZSBieSBob29raW5nIGl0IG9uIGEgc2luZ2xlIGlub2RlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZmlsZXMKICAqIHRoYXQgZG8gbm90IG5lZWQgdG8gaGF2ZSBhIGZ1bGwtZmxlZGdlZCBpbm9kZSBpbiBvcmRlciB0byBvcGVyYXRlIGNvcnJlY3RseS4KLSAqIEFsbCB0aGUgZmlsZXMgY3JlYXRlZCB3aXRoIGFub25faW5vZGVfZ2V0ZmQoKSB3aWxsIHNoYXJlIGEgc2luZ2xlIGlub2RlLCBieQorICogQWxsIHRoZSBmaWxlcyBjcmVhdGVkIHdpdGggYW5vbl9pbm9kZV9nZXRmZCgpIHdpbGwgc2hhcmUgYSBzaW5nbGUgaW5vZGUsCiAgKiBoZW5jZSBzYXZpbmcgbWVtb3J5IGFuZCBhdm9pZGluZyBjb2RlIGR1cGxpY2F0aW9uIGZvciB0aGUgZmlsZS9pbm9kZS9kZW50cnkKICAqIHNldHVwLgogICovCkBAIC0xNDIsOSArMTQyLDkgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGFub25faW5vZGVfZ2V0ZmQpOwogCiAvKgotICogQSBzaW5nbGUgaW5vZGUgZXhpc3QgZm9yIGFsbCBhbm9uX2lub2RlIGZpbGVzLiBDb250cmFyeSB0byBwaXBlcywKLSAqIGFub25faW5vZGUgaW5vZGVzIGhhcyBubyBwZXItaW5zdGFuY2UgZGF0YSBhc3NvY2lhdGVkLCBzbyB3ZSBjYW4gYXZvaWQKLSAqIHRoZSBhbGxvY2F0aW9uIG9mIG11bHRpcGxlIG9mIHRoZW0uCisgKiBBIHNpbmdsZSBpbm9kZSBleGlzdHMgZm9yIGFsbCBhbm9uX2lub2RlIGZpbGVzLiBDb250cmFyeSB0byBwaXBlcywKKyAqIGFub25faW5vZGUgaW5vZGVzIGhhdmUgbm8gYXNzb2NpYXRlZCBwZXItaW5zdGFuY2UgZGF0YSwgc28gd2UgbmVlZAorICogb25seSBhbGxvY2F0ZSBvbmUgb2YgdGhlbS4KICAqLwogc3RhdGljIHN0cnVjdCBpbm9kZSAqYW5vbl9pbm9kZV9ta2lub2RlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggMDhlNDQxNC4uYTI3ZTQyYiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtNDUsNyArNDUsNyBAQAogCiBzdGF0aWMgaW50IGxvYWRfZWxmX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgaW50IGxvYWRfZWxmX2xpYnJhcnkoc3RydWN0IGZpbGUgKik7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfbWFwIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZWxmX3BoZHIgKiwgaW50LCBpbnQpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWxmX21hcCAoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGVsZl9waGRyICosIGludCwgaW50LCB1bnNpZ25lZCBsb25nKTsKIAogLyoKICAqIElmIHdlIGRvbid0IHN1cHBvcnQgY29yZSBkdW1waW5nLCB0aGVuIHN1cHBseSBhIE5VTEwgc28gd2UKQEAgLTgwLDcgKzgwLDcgQEAKIAkJLmhhc3Zkc28JPSAxCiB9OwogCi0jZGVmaW5lIEJBRF9BRERSKHgpICgodW5zaWduZWQgbG9uZykoeCkgPj0gVEFTS19TSVpFKQorI2RlZmluZSBCQURfQUREUih4KSBJU19FUlJfVkFMVUUoeCkKIAogc3RhdGljIGludCBzZXRfYnJrKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewpAQCAtMjg1LDMzICsyODUsNzAgQEAKICNpZm5kZWYgZWxmX21hcAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfbWFwKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQlzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50LCBpbnQgcHJvdCwgaW50IHR5cGUpCisJCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSwKKwkJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplKQogewogCXVuc2lnbmVkIGxvbmcgbWFwX2FkZHI7Ci0JdW5zaWduZWQgbG9uZyBwYWdlb2Zmc2V0ID0gRUxGX1BBR0VPRkZTRVQoZXBwbnQtPnBfdmFkZHIpOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGVwcG50LT5wX2ZpbGVzeiArIEVMRl9QQUdFT0ZGU0VUKGVwcG50LT5wX3ZhZGRyKTsKKwl1bnNpZ25lZCBsb25nIG9mZiA9IGVwcG50LT5wX29mZnNldCAtIEVMRl9QQUdFT0ZGU0VUKGVwcG50LT5wX3ZhZGRyKTsKKwlhZGRyID0gRUxGX1BBR0VTVEFSVChhZGRyKTsKKwlzaXplID0gRUxGX1BBR0VBTElHTihzaXplKTsKIAotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJLyogbW1hcCgpIHdpbGwgcmV0dXJuIC1FSU5WQUwgaWYgZ2l2ZW4gYSB6ZXJvIHNpemUsIGJ1dCBhCiAJICogc2VnbWVudCB3aXRoIHplcm8gZmlsZXNpemUgaXMgcGVyZmVjdGx5IHZhbGlkICovCi0JaWYgKGVwcG50LT5wX2ZpbGVzeiArIHBhZ2VvZmZzZXQpCi0JCW1hcF9hZGRyID0gZG9fbW1hcChmaWxlcCwgRUxGX1BBR0VTVEFSVChhZGRyKSwKLQkJCQkgICBlcHBudC0+cF9maWxlc3ogKyBwYWdlb2Zmc2V0LCBwcm90LCB0eXBlLAotCQkJCSAgIGVwcG50LT5wX29mZnNldCAtIHBhZ2VvZmZzZXQpOwotCWVsc2UKLQkJbWFwX2FkZHIgPSBFTEZfUEFHRVNUQVJUKGFkZHIpOworCWlmICghc2l6ZSkKKwkJcmV0dXJuIGFkZHI7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCS8qCisJKiB0b3RhbF9zaXplIGlzIHRoZSBzaXplIG9mIHRoZSBFTEYgKGludGVycHJldGVyKSBpbWFnZS4KKwkqIFRoZSBfZmlyc3RfIG1tYXAgbmVlZHMgdG8ga25vdyB0aGUgZnVsbCBzaXplLCBvdGhlcndpc2UKKwkqIHJhbmRvbWl6YXRpb24gbWlnaHQgcHV0IHRoaXMgaW1hZ2UgaW50byBhbiBvdmVybGFwcGluZworCSogcG9zaXRpb24gd2l0aCB0aGUgRUxGIGJpbmFyeSBpbWFnZS4gKHNpbmNlIHNpemUgPCB0b3RhbF9zaXplKQorCSogU28gd2UgZmlyc3QgbWFwIHRoZSAnYmlnJyBpbWFnZSAtIGFuZCB1bm1hcCB0aGUgcmVtYWluZGVyIGF0CisJKiB0aGUgZW5kLiAod2hpY2ggdW5tYXAgaXMgbmVlZGVkIGZvciBFTEYgaW1hZ2VzIHdpdGggaG9sZXMuKQorCSovCisJaWYgKHRvdGFsX3NpemUpIHsKKwkJdG90YWxfc2l6ZSA9IEVMRl9QQUdFQUxJR04odG90YWxfc2l6ZSk7CisJCW1hcF9hZGRyID0gZG9fbW1hcChmaWxlcCwgYWRkciwgdG90YWxfc2l6ZSwgcHJvdCwgdHlwZSwgb2ZmKTsKKwkJaWYgKCFCQURfQUREUihtYXBfYWRkcikpCisJCQlkb19tdW5tYXAoY3VycmVudC0+bW0sIG1hcF9hZGRyK3NpemUsIHRvdGFsX3NpemUtc2l6ZSk7CisJfSBlbHNlCisJCW1hcF9hZGRyID0gZG9fbW1hcChmaWxlcCwgYWRkciwgc2l6ZSwgcHJvdCwgdHlwZSwgb2ZmKTsKKwogCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCXJldHVybihtYXBfYWRkcik7CiB9CiAKICNlbmRpZiAvKiAhZWxmX21hcCAqLwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9tYXBwaW5nX3NpemUoc3RydWN0IGVsZl9waGRyICpjbWRzLCBpbnQgbnIpCit7CisJaW50IGksIGZpcnN0X2lkeCA9IC0xLCBsYXN0X2lkeCA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJaWYgKGNtZHNbaV0ucF90eXBlID09IFBUX0xPQUQpIHsKKwkJCWxhc3RfaWR4ID0gaTsKKwkJCWlmIChmaXJzdF9pZHggPT0gLTEpCisJCQkJZmlyc3RfaWR4ID0gaTsKKwkJfQorCX0KKwlpZiAoZmlyc3RfaWR4ID09IC0xKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBjbWRzW2xhc3RfaWR4XS5wX3ZhZGRyICsgY21kc1tsYXN0X2lkeF0ucF9tZW1zeiAtCisJCQkJRUxGX1BBR0VTVEFSVChjbWRzW2ZpcnN0X2lkeF0ucF92YWRkcik7Cit9CisKKwogLyogVGhpcyBpcyBtdWNoIG1vcmUgZ2VuZXJhbGl6ZWQgdGhhbiB0aGUgbGlicmFyeSByb3V0aW5lIHJlYWQgZnVuY3Rpb24sCiAgICBzbyB3ZSBrZWVwIHRoaXMgc2VwYXJhdGUuICBUZWNobmljYWxseSB0aGUgbGlicmFyeSByZWFkIGZ1bmN0aW9uCiAgICBpcyBvbmx5IHByb3ZpZGVkIHNvIHRoYXQgd2UgY2FuIHJlYWQgYS5vdXQgbGlicmFyaWVzIHRoYXQgaGF2ZQogICAgYW4gRUxGIGhlYWRlciAqLwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb2FkX2VsZl9pbnRlcnAoc3RydWN0IGVsZmhkciAqaW50ZXJwX2VsZl9leCwKLQkJc3RydWN0IGZpbGUgKmludGVycHJldGVyLCB1bnNpZ25lZCBsb25nICppbnRlcnBfbG9hZF9hZGRyKQorCQlzdHJ1Y3QgZmlsZSAqaW50ZXJwcmV0ZXIsIHVuc2lnbmVkIGxvbmcgKmludGVycF9tYXBfYWRkciwKKwkJdW5zaWduZWQgbG9uZyBub19iYXNlKQogewogCXN0cnVjdCBlbGZfcGhkciAqZWxmX3BoZGF0YTsKIAlzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50OwpAQCAtMzE5LDYgKzM1Niw3IEBACiAJaW50IGxvYWRfYWRkcl9zZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9ic3MgPSAwLCBlbGZfYnNzID0gMDsKIAl1bnNpZ25lZCBsb25nIGVycm9yID0gfjBVTDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7CiAJaW50IHJldHZhbCwgaSwgc2l6ZTsKIAogCS8qIEZpcnN0IG9mIGFsbCwgc29tZSBzaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tzICovCkBAIC0zNTcsNiArMzk1LDEyIEBACiAJCWdvdG8gb3V0X2Nsb3NlOwogCX0KIAorCXRvdGFsX3NpemUgPSB0b3RhbF9tYXBwaW5nX3NpemUoZWxmX3BoZGF0YSwgaW50ZXJwX2VsZl9leC0+ZV9waG51bSk7CisJaWYgKCF0b3RhbF9zaXplKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCiAJZXBwbnQgPSBlbGZfcGhkYXRhOwogCWZvciAoaSA9IDA7IGkgPCBpbnRlcnBfZWxmX2V4LT5lX3BobnVtOyBpKyssIGVwcG50KyspIHsKIAkJaWYgKGVwcG50LT5wX3R5cGUgPT0gUFRfTE9BRCkgewpAQCAtMzc0LDkgKzQxOCwxNCBAQAogCQkJdmFkZHIgPSBlcHBudC0+cF92YWRkcjsKIAkJCWlmIChpbnRlcnBfZWxmX2V4LT5lX3R5cGUgPT0gRVRfRVhFQyB8fCBsb2FkX2FkZHJfc2V0KQogCQkJCWVsZl90eXBlIHw9IE1BUF9GSVhFRDsKKwkJCWVsc2UgaWYgKG5vX2Jhc2UgJiYgaW50ZXJwX2VsZl9leC0+ZV90eXBlID09IEVUX0RZTikKKwkJCQlsb2FkX2FkZHIgPSAtdmFkZHI7CiAKIAkJCW1hcF9hZGRyID0gZWxmX21hcChpbnRlcnByZXRlciwgbG9hZF9hZGRyICsgdmFkZHIsCi0JCQkJCSAgIGVwcG50LCBlbGZfcHJvdCwgZWxmX3R5cGUpOworCQkJCQkgICBlcHBudCwgZWxmX3Byb3QsIGVsZl90eXBlLCB0b3RhbF9zaXplKTsKKwkJCXRvdGFsX3NpemUgPSAwOworCQkJaWYgKCEqaW50ZXJwX21hcF9hZGRyKQorCQkJCSppbnRlcnBfbWFwX2FkZHIgPSBtYXBfYWRkcjsKIAkJCWVycm9yID0gbWFwX2FkZHI7CiAJCQlpZiAoQkFEX0FERFIobWFwX2FkZHIpKQogCQkJCWdvdG8gb3V0X2Nsb3NlOwpAQCAtNDQyLDggKzQ5MSw3IEBACiAJCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKLQkqaW50ZXJwX2xvYWRfYWRkciA9IGxvYWRfYWRkcjsKLQllcnJvciA9ICgodW5zaWduZWQgbG9uZylpbnRlcnBfZWxmX2V4LT5lX2VudHJ5KSArIGxvYWRfYWRkcjsKKwllcnJvciA9IGxvYWRfYWRkcjsKIAogb3V0X2Nsb3NlOgogCWtmcmVlKGVsZl9waGRhdGEpOwpAQCAtNTQwLDcgKzU4OCw4IEBACiAJaW50IGVsZl9leGVjX2ZpbGVubzsKIAlpbnQgcmV0dmFsLCBpOwogCXVuc2lnbmVkIGludCBzaXplOwotCXVuc2lnbmVkIGxvbmcgZWxmX2VudHJ5LCBpbnRlcnBfbG9hZF9hZGRyID0gMDsKKwl1bnNpZ25lZCBsb25nIGVsZl9lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGludGVycF9sb2FkX2FkZHIgPSAwOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZSwgZW5kX2NvZGUsIHN0YXJ0X2RhdGEsIGVuZF9kYXRhOwogCXVuc2lnbmVkIGxvbmcgcmVsb2NfZnVuY19kZXNjID0gMDsKIAljaGFyIHBhc3NlZF9maWxlbm9bNl07CkBAIC04MDgsOSArODU3LDcgQEAKIAljdXJyZW50LT5tbS0+c3RhcnRfc3RhY2sgPSBicHJtLT5wOwogCiAJLyogTm93IHdlIGRvIGEgbGl0dGxlIGdydW5neSB3b3JrIGJ5IG1tYXBpbmcgdGhlIEVMRiBpbWFnZSBpbnRvCi0JICAgdGhlIGNvcnJlY3QgbG9jYXRpb24gaW4gbWVtb3J5LiAgQXQgdGhpcyBwb2ludCwgd2UgYXNzdW1lIHRoYXQKLQkgICB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGxvYWRlZCBhdCBmaXhlZCBhZGRyZXNzLCBub3QgYXQgYSB2YXJpYWJsZQotCSAgIGFkZHJlc3MuICovCisJICAgdGhlIGNvcnJlY3QgbG9jYXRpb24gaW4gbWVtb3J5LiAqLwogCWZvcihpID0gMCwgZWxmX3BwbnQgPSBlbGZfcGhkYXRhOwogCSAgICBpIDwgbG9jLT5lbGZfZXguZV9waG51bTsgaSsrLCBlbGZfcHBudCsrKSB7CiAJCWludCBlbGZfcHJvdCA9IDAsIGVsZl9mbGFnczsKQEAgLTg2NCwxMSArOTExLDE1IEBACiAJCQkgKiBkZWZhdWx0IG1tYXAgYmFzZSwgYXMgd2VsbCBhcyB3aGF0ZXZlciBwcm9ncmFtIHRoZXkKIAkJCSAqIG1pZ2h0IHRyeSB0byBleGVjLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBicmsgd2lsbAogCQkJICogZm9sbG93IHRoZSBsb2FkZXIsIGFuZCBpcyBub3QgbW92YWJsZS4gICovCisjaWZkZWYgQ09ORklHX1g4NgorCQkJbG9hZF9iaWFzID0gMDsKKyNlbHNlCiAJCQlsb2FkX2JpYXMgPSBFTEZfUEFHRVNUQVJUKEVMRl9FVF9EWU5fQkFTRSAtIHZhZGRyKTsKKyNlbmRpZgogCQl9CiAKIAkJZXJyb3IgPSBlbGZfbWFwKGJwcm0tPmZpbGUsIGxvYWRfYmlhcyArIHZhZGRyLCBlbGZfcHBudCwKLQkJCQllbGZfcHJvdCwgZWxmX2ZsYWdzKTsKKwkJCQllbGZfcHJvdCwgZWxmX2ZsYWdzLDApOwogCQlpZiAoQkFEX0FERFIoZXJyb3IpKSB7CiAJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKIAkJCXJldHZhbCA9IElTX0VSUigodm9pZCAqKWVycm9yKSA/CkBAIC05NDQsMTMgKzk5NSwyNSBAQAogCX0KIAogCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKLQkJaWYgKGludGVycHJldGVyX3R5cGUgPT0gSU5URVJQUkVURVJfQU9VVCkKKwkJaWYgKGludGVycHJldGVyX3R5cGUgPT0gSU5URVJQUkVURVJfQU9VVCkgewogCQkJZWxmX2VudHJ5ID0gbG9hZF9hb3V0X2ludGVycCgmbG9jLT5pbnRlcnBfZXgsCiAJCQkJCQkgICAgIGludGVycHJldGVyKTsKLQkJZWxzZQorCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3ZhcihpbnRlcnBfbWFwX2FkZHIpOworCiAJCQllbGZfZW50cnkgPSBsb2FkX2VsZl9pbnRlcnAoJmxvYy0+aW50ZXJwX2VsZl9leCwKIAkJCQkJCSAgICBpbnRlcnByZXRlciwKLQkJCQkJCSAgICAmaW50ZXJwX2xvYWRfYWRkcik7CisJCQkJCQkgICAgJmludGVycF9tYXBfYWRkciwKKwkJCQkJCSAgICBsb2FkX2JpYXMpOworCQkJaWYgKCFCQURfQUREUihlbGZfZW50cnkpKSB7CisJCQkJLyoKKwkJCQkgKiBsb2FkX2VsZl9pbnRlcnAoKSByZXR1cm5zIHJlbG9jYXRpb24KKwkJCQkgKiBhZGp1c3RtZW50CisJCQkJICovCisJCQkJaW50ZXJwX2xvYWRfYWRkciA9IGVsZl9lbnRyeTsKKwkJCQllbGZfZW50cnkgKz0gbG9jLT5pbnRlcnBfZWxmX2V4LmVfZW50cnk7CisJCQl9CisJCX0KIAkJaWYgKEJBRF9BRERSKGVsZl9lbnRyeSkpIHsKIAkJCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAkJCXJldHZhbCA9IElTX0VSUigodm9pZCAqKWVsZl9lbnRyeSkgPwpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCBiM2U5YmZhLi4zNjM1MzE1IDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtNTg4LDEyICs1ODgsMTAgQEAKIAogbG9uZyBucl9ibG9ja2Rldl9wYWdlcyh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAlsb25nIHJldCA9IDA7CiAJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOwotCWxpc3RfZm9yX2VhY2gocCwgJmFsbF9iZGV2cykgewotCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwotCQliZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlLCBiZF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJkZXYsICZhbGxfYmRldnMsIGJkX2xpc3QpIHsKIAkJcmV0ICs9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPm5ycGFnZXM7CiAJfQogCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOwpAQCAtODc0LDcgKzg3Miw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYWRkX2JkX2hvbGRlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgYmRfaG9sZGVyICpibykKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKIAlpZiAoIWJvKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg4MiwxNSArODgwLDE4IEBACiAJaWYgKCFiZF9ob2xkZXJfZ3JhYl9kaXJzKGJkZXYsIGJvKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCXJldCA9IGFkZF9zeW1saW5rKGJvLT5zZGlyLCBiby0+c2Rldik7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IGFkZF9zeW1saW5rKGJvLT5oZGlyLCBiby0+aGRldik7Ci0JCWlmIChyZXQpCi0JCQlkZWxfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOworCWVyciA9IGFkZF9zeW1saW5rKGJvLT5zZGlyLCBiby0+c2Rldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGFkZF9zeW1saW5rKGJvLT5oZGlyLCBiby0+aGRldik7CisJaWYgKGVycikgeworCQlkZWxfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOworCQlyZXR1cm4gZXJyOwogCX0KLQlpZiAocmV0ID09IDApCi0JCWxpc3RfYWRkX3RhaWwoJmJvLT5saXN0LCAmYmRldi0+YmRfaG9sZGVyX2xpc3QpOwotCXJldHVybiByZXQ7CisKKwlsaXN0X2FkZF90YWlsKCZiby0+bGlzdCwgJmJkZXYtPmJkX2hvbGRlcl9saXN0KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC05NDgsNyArOTQ5LDcgQEAKIHN0YXRpYyBpbnQgYmRfY2xhaW1fYnlfa29iamVjdChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB2b2lkICpob2xkZXIsCiAJCQkJc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0JaW50IHJlczsKKwlpbnQgZXJyOwogCXN0cnVjdCBiZF9ob2xkZXIgKmJvLCAqZm91bmQ7CiAKIAlpZiAoIWtvYmopCkBAIC05NTksMjEgKzk2MCwyNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKLQlyZXMgPSBiZF9jbGFpbShiZGV2LCBob2xkZXIpOwotCWlmIChyZXMgPT0gMCkgewotCQlmb3VuZCA9IGZpbmRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKLQkJaWYgKGZvdW5kID09IE5VTEwpIHsKLQkJCXJlcyA9IGFkZF9iZF9ob2xkZXIoYmRldiwgYm8pOwotCQkJaWYgKHJlcykKLQkJCQliZF9yZWxlYXNlKGJkZXYpOwotCQl9Ci0JfQogCi0JaWYgKHJlcyB8fCBmb3VuZCkKLQkJZnJlZV9iZF9ob2xkZXIoYm8pOworCWVyciA9IGJkX2NsYWltKGJkZXYsIGhvbGRlcik7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJZm91bmQgPSBmaW5kX2JkX2hvbGRlcihiZGV2LCBibyk7CisJaWYgKGZvdW5kKQorCQlnb3RvIGZhaWw7CisKKwllcnIgPSBhZGRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKKwlpZiAoZXJyKQorCQliZF9yZWxlYXNlKGJkZXYpOworCWVsc2UKKwkJYm8gPSBOVUxMOworZmFpbDoKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKLQotCXJldHVybiByZXM7CisJZnJlZV9iZF9ob2xkZXIoYm8pOworCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtOTg3LDE1ICs5OTEsMTIgQEAKIHN0YXRpYyB2b2lkIGJkX3JlbGVhc2VfZnJvbV9rb2JqZWN0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqKQogewotCXN0cnVjdCBiZF9ob2xkZXIgKmJvOwotCiAJaWYgKCFrb2JqKQogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiAJYmRfcmVsZWFzZShiZGV2KTsKLQlpZiAoKGJvID0gZGVsX2JkX2hvbGRlcihiZGV2LCBrb2JqKSkpCi0JCWZyZWVfYmRfaG9sZGVyKGJvKTsKKwlmcmVlX2JkX2hvbGRlcihkZWxfYmRfaG9sZGVyKGJkZXYsIGtvYmopKTsKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYnVmZmVyLmMgYi9mcy9idWZmZXIuYwppbmRleCBhYTY4MjA2Li4wZjkwMDY3IDEwMDY0NAotLS0gYS9mcy9idWZmZXIuYworKysgYi9mcy9idWZmZXIuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7CiAJCXpvbmVzID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzW2dmcF96b25lKEdGUF9OT0ZTKV0uem9uZXM7CiAJCWlmICgqem9uZXMpCi0JCQl0cnlfdG9fZnJlZV9wYWdlcyh6b25lcywgR0ZQX05PRlMpOworCQkJdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZXMsIDAsIEdGUF9OT0ZTKTsKIAl9CiB9CiAKQEAgLTY3Niw2ICs2NzYsMzkgQEAKIEVYUE9SVF9TWU1CT0wobWFya19idWZmZXJfZGlydHlfaW5vZGUpOwogCiAvKgorICogTWFyayB0aGUgcGFnZSBkaXJ0eSwgYW5kIHNldCBpdCBkaXJ0eSBpbiB0aGUgcmFkaXggdHJlZSwgYW5kIG1hcmsgdGhlIGlub2RlCisgKiBkaXJ0eS4KKyAqCisgKiBJZiB3YXJuIGlzIHRydWUsIHRoZW4gZW1pdCBhIHdhcm5pbmcgaWYgdGhlIHBhZ2UgaXMgbm90IHVwdG9kYXRlIGFuZCBoYXMKKyAqIG5vdCBiZWVuIHRydW5jYXRlZC4KKyAqLworc3RhdGljIGludCBfX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgaW50IHdhcm4pCit7CisJaWYgKHVubGlrZWx5KCFtYXBwaW5nKSkKKwkJcmV0dXJuICFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpOworCisJaWYgKFRlc3RTZXRQYWdlRGlydHkocGFnZSkpCisJCXJldHVybiAwOworCisJd3JpdGVfbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJaWYgKHBhZ2UtPm1hcHBpbmcpIHsJLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLworCQlXQVJOX09OX09OQ0Uod2FybiAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKworCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgeworCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOworCQkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7CisJCX0KKwkJcmFkaXhfdHJlZV90YWdfc2V0KCZtYXBwaW5nLT5wYWdlX3RyZWUsCisJCQkJcGFnZV9pbmRleChwYWdlKSwgUEFHRUNBQ0hFX1RBR19ESVJUWSk7CisJfQorCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJX19tYXJrX2lub2RlX2RpcnR5KG1hcHBpbmctPmhvc3QsIElfRElSVFlfUEFHRVMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCiAgKiBBZGQgYSBwYWdlIHRvIHRoZSBkaXJ0eSBwYWdlIGxpc3QuCiAgKgogICogSXQgaXMgYSBzYWQgZmFjdCBvZiBsaWZlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBzZXZlcmFsIHBsYWNlcwpAQCAtNzAyLDcgKzczNSw3IEBACiAgKi8KIGludCBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiBjb25zdCBtYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCiAJaWYgKHVubGlrZWx5KCFtYXBwaW5nKSkKIAkJcmV0dXJuICFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpOwpAQCAtNzE5LDIxICs3NTIsNyBAQAogCX0KIAlzcGluX3VubG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAotCWlmIChUZXN0U2V0UGFnZURpcnR5KHBhZ2UpKQotCQlyZXR1cm4gMDsKLQotCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCWlmIChwYWdlLT5tYXBwaW5nKSB7CS8qIFJhY2Ugd2l0aCB0cnVuY2F0ZT8gKi8KLQkJaWYgKG1hcHBpbmdfY2FwX2FjY291bnRfZGlydHkobWFwcGluZykpIHsKLQkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKLQkJCXRhc2tfaW9fYWNjb3VudF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOwotCQl9Ci0JCXJhZGl4X3RyZWVfdGFnX3NldCgmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCXBhZ2VfaW5kZXgocGFnZSksIFBBR0VDQUNIRV9UQUdfRElSVFkpOwotCX0KLQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCV9fbWFya19pbm9kZV9kaXJ0eShtYXBwaW5nLT5ob3N0LCBJX0RJUlRZX1BBR0VTKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eShwYWdlLCBtYXBwaW5nLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0woX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKTsKIApAQCAtOTgyLDcgKzEwMDEsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCwKLQkJbWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKSAmIH5fX0dGUF9GUyk7CisJCShtYXBwaW5nX2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcpICYgfl9fR0ZQX0ZTKXxfX0dGUF9NT1ZBQkxFKTsKIAlpZiAoIXBhZ2UpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDI2LDExICsxMDQ1LDYgQEAKIC8qCiAgKiBDcmVhdGUgYnVmZmVycyBmb3IgdGhlIHNwZWNpZmllZCBibG9jayBkZXZpY2UgYmxvY2sncyBwYWdlLiAgSWYKICAqIHRoYXQgcGFnZSB3YXMgZGlydHksIHRoZSBidWZmZXJzIGFyZSBzZXQgZGlydHkgYWxzby4KLSAqCi0gKiBFeGNlcHQgdGhhdCdzIGEgYnVnLiAgQXR0YWNoaW5nIGRpcnR5IGJ1ZmZlcnMgdG8gYSBkaXJ0eQotICogYmxvY2tkZXYncyBwYWdlIGNhbiByZXN1bHQgaW4gZmlsZXN5c3RlbSBjb3JydXB0aW9uLCBiZWNhdXNlCi0gKiBzb21lIG9mIHRob3NlIGJ1ZmZlcnMgbWF5IGJlIGFsaWFzZXMgb2YgZmlsZXN5c3RlbSBkYXRhLgotICogZ3Jvd19kZXZfcGFnZSgpIHdpbGwgZ28gQlVHKCkgaWYgdGhpcyBoYXBwZW5zLgogICovCiBzdGF0aWMgaW50CiBncm93X2J1ZmZlcnMoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssIGludCBzaXplKQpAQCAtMTEzNyw4ICsxMTUxLDkgQEAKICAqLwogdm9pZCBmYXN0Y2FsbCBtYXJrX2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogeworCVdBUk5fT05fT05DRSghYnVmZmVyX3VwdG9kYXRlKGJoKSk7CiAJaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICF0ZXN0X3NldF9idWZmZXJfZGlydHkoYmgpKQotCQlfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhiaC0+Yl9wYWdlKTsKKwkJX19zZXRfcGFnZV9kaXJ0eShiaC0+Yl9wYWdlLCBwYWdlX21hcHBpbmcoYmgtPmJfcGFnZSksIDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggOGIwY2JmNC4uYmQwZjJmMiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC04NDksNiArODQ5LDcgQEAKIAlfX3UxNiAgbmV0ZmlkOwogCWludCByYzsKIAorCXNldF9mcmVlemFibGUoKTsKIAlkbyB7CiAJCWlmICh0cnlfdG9fZnJlZXplKCkpIAogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGY0ZTkyNjYuLjBhMWI4YmQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0zNjMsNiArMzYzLDcgQEAKIAkJCUdGUF9LRVJORUwpOwogCX0KIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2V4cG9ydC5jIGIvZnMvY2lmcy9leHBvcnQuYwppbmRleCAxZDcxNjM5Li45NmRmMWQ1IDEwMDY0NAotLS0gYS9mcy9jaWZzL2V4cG9ydC5jCisrKyBiL2ZzL2NpZnMvZXhwb3J0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICAKICNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKICAKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggNmI0NGNkYy4uZTQ0MGE3YiAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTYzLDYgKzYzLDcgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+CisjaW5jbHVkZSA8bGludXgvbG9vcC5oPgogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaS5oPgpAQCAtMzQ4OSw2ICszNDkwLDkgQEAKIAogSUdOT1JFX0lPQ1RMKFZGQVRfSU9DVExfUkVBRERJUl9CT1RIMzIpCiBJR05PUkVfSU9DVEwoVkZBVF9JT0NUTF9SRUFERElSX1NIT1JUMzIpCisKKy8qIGxvb3AgKi8KK0lHTk9SRV9JT0NUTChMT09QX0NMUl9GRCkKIH07CiAKICNkZWZpbmUgSU9DVExfSEFTSFNJWkUgMjU2CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oIGIvZnMvY29uZmlnZnMvY29uZmlnZnNfaW50ZXJuYWwuaAppbmRleCA3YjQ4YzAzLi4zYjAxODVmIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oCisrKyBiL2ZzL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2ludGVybmFsLmgKQEAgLTI5LDEwICsyOSwxMSBAQAogCiBzdHJ1Y3QgY29uZmlnZnNfZGlyZW50IHsKIAlhdG9taWNfdAkJc19jb3VudDsKKwlpbnQJCQlzX2RlcGVuZGVudF9jb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNfc2libGluZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNfY2hpbGRyZW47CiAJc3RydWN0IGxpc3RfaGVhZAlzX2xpbmtzOwotCXZvaWQgCQkJKiBzX2VsZW1lbnQ7CisJdm9pZAkJCSogc19lbGVtZW50OwogCWludAkJCXNfdHlwZTsKIAl1bW9kZV90CQkJc19tb2RlOwogCXN0cnVjdCBkZW50cnkJCSogc19kZW50cnk7CkBAIC00MSw4ICs0Miw4IEBACiAKICNkZWZpbmUgQ09ORklHRlNfUk9PVAkJMHgwMDAxCiAjZGVmaW5lIENPTkZJR0ZTX0RJUgkJMHgwMDAyCi0jZGVmaW5lIENPTkZJR0ZTX0lURU1fQVRUUiAJMHgwMDA0Ci0jZGVmaW5lIENPTkZJR0ZTX0lURU1fTElOSyAJMHgwMDIwCisjZGVmaW5lIENPTkZJR0ZTX0lURU1fQVRUUgkweDAwMDQKKyNkZWZpbmUgQ09ORklHRlNfSVRFTV9MSU5LCTB4MDAyMAogI2RlZmluZSBDT05GSUdGU19VU0VUX0RJUgkweDAwNDAKICNkZWZpbmUgQ09ORklHRlNfVVNFVF9ERUZBVUxUCTB4MDA4MAogI2RlZmluZSBDT05GSUdGU19VU0VUX0RST1BQSU5HCTB4MDEwMApkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvZGlyLmMgYi9mcy9jb25maWdmcy9kaXIuYwppbmRleCA1ZTZlMzdlLi4yZjQzNmQ0IDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9kaXIuYworKysgYi9mcy9jb25maWdmcy9kaXIuYwpAQCAtMzU1LDYgKzM1NSwxMCBAQAogCQkJLyogTWFyayB0aGF0IHdlJ3ZlIHRha2VuIGlfbXV0ZXggKi8KIAkJCXNkLT5zX3R5cGUgfD0gQ09ORklHRlNfVVNFVF9EUk9QUElORzsKIAorCQkJLyoKKwkJCSAqIFl1cCwgcmVjdXJzaXZlLiAgSWYgdGhlcmUncyBhIHByb2JsZW0sIGJsYW1lCisJCQkgKiBkZWVwIG5lc3Rpbmcgb2YgZGVmYXVsdF9ncm91cHMKKwkJCSAqLwogCQkJcmV0ID0gY29uZmlnZnNfZGV0YWNoX3ByZXAoc2QtPnNfZGVudHJ5KTsKIAkJCWlmICghcmV0KQogCQkJCWNvbnRpbnVlOwpAQCAtNTYyLDcgKzU2Niw3IEBACiAKIC8qCiAgKiBBbGwgb2YgbGlua19vYmovdW5saW5rX29iai9saW5rX2dyb3VwL3VubGlua19ncm91cCByZXF1aXJlIHRoYXQKLSAqIHN1YnN5cy0+c3Vfc2VtIGlzIGhlbGQuCisgKiBzdWJzeXMtPnN1X211dGV4IGlzIGhlbGQuCiAgKi8KIAogc3RhdGljIHZvaWQgdW5saW5rX29iaihzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCkBAIC03MTQsNiArNzE4LDI4IEBACiB9CiAKIC8qCisgKiBBZnRlciB0aGUgaXRlbSBoYXMgYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBmaWxlc3lzdGVtIHZpZXcsIHdlIGFyZQorICogcmVhZHkgdG8gdGVhciBpdCBvdXQgb2YgdGhlIGhpZXJhcmNoeS4gIE5vdGlmeSB0aGUgY2xpZW50IGJlZm9yZQorICogd2UgZG8gdGhhdCBzbyB0aGV5IGNhbiBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgcmVxdWlyZXMKKyAqIG5hdmlnYXRpbmcgdGhlIGhpZXJhcmNoeS4gIEEgY2xpZW50IGRvZXMgbm90IG5lZWQgdG8gcHJvdmlkZSB0aGlzCisgKiBjYWxsYmFjay4gIFRoZSBzdWJzeXN0ZW0gc2VtYXBob3JlIE1VU1QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLCBhbmQKKyAqIHJlZmVyZW5jZXMgbXVzdCBiZSB2YWxpZCBmb3IgYm90aCBpdGVtcy4gIEl0IGFsc28gYXNzdW1lcyB0aGUKKyAqIGNhbGxlciBoYXMgdmFsaWRhdGVkIGNpX3R5cGUuCisgKi8KK3N0YXRpYyB2b2lkIGNsaWVudF9kaXNjb25uZWN0X25vdGlmeShzdHJ1Y3QgY29uZmlnX2l0ZW0gKnBhcmVudF9pdGVtLAorCQkJCSAgICAgc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQoreworCXN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlOworCisJdHlwZSA9IHBhcmVudF9pdGVtLT5jaV90eXBlOworCUJVR19PTighdHlwZSk7CisKKwlpZiAodHlwZS0+Y3RfZ3JvdXBfb3BzICYmIHR5cGUtPmN0X2dyb3VwX29wcy0+ZGlzY29ubmVjdF9ub3RpZnkpCisJCXR5cGUtPmN0X2dyb3VwX29wcy0+ZGlzY29ubmVjdF9ub3RpZnkodG9fY29uZmlnX2dyb3VwKHBhcmVudF9pdGVtKSwKKwkJCQkJCSAgICAgIGl0ZW0pOworfQorCisvKgogICogRHJvcCB0aGUgaW5pdGlhbCByZWZlcmVuY2UgZnJvbSBtYWtlX2l0ZW0oKS9tYWtlX2dyb3VwKCkKICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHJlZmVyZW5jZSBpcyBoZWxkIG9uIGl0ZW0KICAqIGFuZCB0aGF0IGl0ZW0gaG9sZHMgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHBhcmVudC4gIEFsc28sIGl0CkBAIC03MzMsMTEgKzc1OSwyNDQgQEAKIAkgKi8KIAlpZiAodHlwZS0+Y3RfZ3JvdXBfb3BzICYmIHR5cGUtPmN0X2dyb3VwX29wcy0+ZHJvcF9pdGVtKQogCQl0eXBlLT5jdF9ncm91cF9vcHMtPmRyb3BfaXRlbSh0b19jb25maWdfZ3JvdXAocGFyZW50X2l0ZW0pLAotCQkJCQkJaXRlbSk7CisJCQkJCSAgICAgIGl0ZW0pOwogCWVsc2UKIAkJY29uZmlnX2l0ZW1fcHV0KGl0ZW0pOwogfQogCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGNvbmZpZ2ZzX2R1bXBfb25lKHN0cnVjdCBjb25maWdmc19kaXJlbnQgKnNkLCBpbnQgbGV2ZWwpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJSpzXCIlc1wiOlxuIiwgbGV2ZWwsICIgIiwgY29uZmlnZnNfZ2V0X25hbWUoc2QpKTsKKworI2RlZmluZSB0eXBlX3ByaW50KF90eXBlKSBpZiAoc2QtPnNfdHlwZSAmIF90eXBlKSBwcmludGsoS0VSTl9JTkZPICIlKnMgJXNcbiIsIGxldmVsLCAiICIsICNfdHlwZSk7CisJdHlwZV9wcmludChDT05GSUdGU19ST09UKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX0RJUik7CisJdHlwZV9wcmludChDT05GSUdGU19JVEVNX0FUVFIpOworCXR5cGVfcHJpbnQoQ09ORklHRlNfSVRFTV9MSU5LKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX1VTRVRfRElSKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX1VTRVRfREVGQVVMVCk7CisJdHlwZV9wcmludChDT05GSUdGU19VU0VUX0RST1BQSU5HKTsKKyN1bmRlZiB0eXBlX3ByaW50Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnZnNfZHVtcChzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpzZCwgaW50IGxldmVsKQoreworCXN0cnVjdCBjb25maWdmc19kaXJlbnQgKmNoaWxkX3NkOworCWludCByZXQgPSAwOworCisJY29uZmlnZnNfZHVtcF9vbmUoc2QsIGxldmVsKTsKKworCWlmICghKHNkLT5zX3R5cGUgJiAoQ09ORklHRlNfRElSfENPTkZJR0ZTX1JPT1QpKSkKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkX3NkLCAmc2QtPnNfY2hpbGRyZW4sIHNfc2libGluZykgeworCQlyZXQgPSBjb25maWdmc19kdW1wKGNoaWxkX3NkLCBsZXZlbCArIDIpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKKy8qCisgKiBjb25maWdmc19kZXBlbmRfaXRlbSgpIGFuZCBjb25maWdmc191bmRlcGVuZF9pdGVtKCkKKyAqCisgKiBXQVJOSU5HOiBEbyBub3QgY2FsbCB0aGVzZSBmcm9tIGEgY29uZmlnZnMgY2FsbGJhY2shCisgKgorICogVGhpcyBkZXNjcmliZXMgdGhlc2UgZnVuY3Rpb25zIGFuZCB0aGVpciBoZWxwZXJzLgorICoKKyAqIEFsbG93IGFub3RoZXIga2VybmVsIHN5c3RlbSB0byBkZXBlbmQgb24gYSBjb25maWdfaXRlbS4gIElmIHRoaXMKKyAqIGhhcHBlbnMsIHRoZSBpdGVtIGNhbm5vdCBnbyBhd2F5IHVudGlsIHRoZSBkZXBlbmRhbnQgY2FuIGxpdmUgd2l0aG91dAorICogaXQuICBUaGUgaWRlYSBpcyB0byBnaXZlIGNsaWVudCBtb2R1bGVzIGFzIHNpbXBsZSBhbiBpbnRlcmZhY2UgYXMKKyAqIHBvc3NpYmxlLiAgV2hlbiBhIHN5c3RlbSBhc2tzIHRoZW0gdG8gZGVwZW5kIG9uIGFuIGl0ZW0sIHRoZXkganVzdAorICogY2FsbCBjb25maWdmc19kZXBlbmRfaXRlbSgpLiAgSWYgdGhlIGl0ZW0gaXMgbGl2ZSBhbmQgdGhlIGNsaWVudAorICogZHJpdmVyIGlzIGluIGdvb2Qgc2hhcGUsIHdlJ2xsIGhhcHBpbHkgZG8gdGhlIHdvcmsgZm9yIHRoZW0uCisgKgorICogV2h5IGlzIHRoZSBsb2NraW5nIGNvbXBsZXg/ICBCZWNhdXNlIGNvbmZpZ2ZzIHVzZXMgdGhlIFZGUyB0byBoYW5kbGUKKyAqIGFsbCBsb2NraW5nLCBidXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb3V0c2lkZSB0aGUgbm9ybWFsCisgKiBWRlMtPmNvbmZpZ2ZzIHBhdGguICBTbyBpdCBtdXN0IHRha2UgVkZTIGxvY2tzIHRvIHByZXZlbnQgdGhlCisgKiBWRlMtPmNvbmZpZ2ZzIHN0dWZmIChjb25maWdmc19ta2RpcigpLCBjb25maWdmc19ybWRpcigpLCBldGMpLiAgVGhpcyBpcworICogd2h5IHlvdSBjYW4ndCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyB1bmRlcm5lYXRoIGNvbmZpZ2ZzIGNhbGxiYWNrcy4KKyAqCisgKiBOb3RlLCBidHcsIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGF0ICphbnkqIHRpbWUsIGV2ZW4gd2hlbiBhIGNvbmZpZ2ZzCisgKiBzdWJzeXN0ZW0gaXNuJ3QgcmVnaXN0ZXJlZCwgb3Igd2hlbiBjb25maWdmcyBpcyBsb2FkaW5nIG9yIHVubG9hZGluZy4KKyAqIEp1c3QgbGlrZSBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oKS4gIFNvIHdlIHRha2UgdGhlIHNhbWUKKyAqIHByZWNhdXRpb25zLiAgV2UgcGluIHRoZSBmaWxlc3lzdGVtLiAgV2UgbG9jayBlYWNoIGlfbXV0ZXggX2luX29yZGVyXworICogb24gb3VyIHdheSBkb3duIHRoZSB0cmVlLiAgSWYgd2UgY2FuIGZpbmQgdGhlIHRhcmdldCBpdGVtIGluIHRoZQorICogY29uZmlnZnMgdHJlZSwgaXQgbXVzdCBiZSBwYXJ0IG9mIHRoZSBzdWJzeXN0ZW0gdHJlZSBhcyB3ZWxsLCBzbyB3ZQorICogZG8gbm90IG5lZWQgdGhlIHN1YnN5c3RlbSBzZW1hcGhvcmUuICBIb2xkaW5nIHRoZSBpX211dGV4IGNoYWluIGxvY2tzCisgKiBvdXQgbWtkaXIoKSBhbmQgcm1kaXIoKSwgd2hvIG1pZ2h0IGJlIHJhY2luZyB1cy4KKyAqLworCisvKgorICogY29uZmlnZnNfZGVwZW5kX3ByZXAoKQorICoKKyAqIE9ubHkgc3ViZGlyZWN0b3JpZXMgY291bnQgaGVyZS4gIEZpbGVzIChDT05GSUdGU19OT1RfUElOTkVEKSBhcmUKKyAqIGF0dHJpYnV0ZXMuICBUaGlzIGlzIHNpbWlsYXIgYnV0IG5vdCB0aGUgc2FtZSB0byBjb25maWdmc19kZXRhY2hfcHJlcCgpLgorICogTm90ZSB0aGF0IGNvbmZpZ2ZzX2RldGFjaF9wcmVwKCkgZXhwZWN0cyB0aGUgcGFyZW50IHRvIGJlIGxvY2tlZCB3aGVuIGl0CisgKiBpcyBjYWxsZWQsIGJ1dCB3ZSBsb2NrIHRoZSBwYXJlbnQgKmluc2lkZSogY29uZmlnZnNfZGVwZW5kX3ByZXAoKS4gIFdlCisgKiBkbyB0aGF0IHNvIHdlIGNhbiB1bmxvY2sgaXQgaWYgd2UgZmluZCBub3RoaW5nLgorICoKKyAqIEhlcmUgd2UgZG8gYSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlIGRlbnRyeSBoaWVyYXJjaHkgbG9va2luZyBmb3IKKyAqIG91ciBvYmplY3QuICBXZSB0YWtlIGlfbXV0ZXggb24gZWFjaCBzdGVwIG9mIHRoZSB3YXkgZG93bi4gIElUIElTCisgKiBFU1NFTlRJQUwgVEhBVCBpX211dGV4IExPQ0tJTkcgSVMgT1JERVJFRC4gIElmIHdlIGNvbWUgYmFjayB1cCBhIGJyYW5jaCwKKyAqIHdlJ2xsIGRyb3AgdGhlIGlfbXV0ZXguCisgKgorICogSWYgdGhlIHRhcmdldCBpcyBub3QgZm91bmQsIC1FTk9FTlQgaXMgYnViYmxlZCB1cCBhbmQgd2UgaGF2ZSByZWxlYXNlZAorICogYWxsIGxvY2tzLiAgSWYgdGhlIHRhcmdldCB3YXMgZm91bmQsIHRoZSBsb2NrcyB3aWxsIGJlIGNsZWFyZWQgYnkKKyAqIGNvbmZpZ2ZzX2RlcGVuZF9yb2xsYmFjaygpLgorICoKKyAqIFRoaXMgYWRkcyBhIHJlcXVpcmVtZW50IHRoYXQgYWxsIGNvbmZpZ19pdGVtcyBiZSB1bmlxdWUhCisgKgorICogVGhpcyBpcyByZWN1cnNpdmUgYmVjYXVzZSB0aGUgbG9ja2luZyB0cmF2ZXJzYWwgaXMgdHJpY2t5LiAgVGhlcmUgaXNuJ3QKKyAqIG11Y2ggb24gdGhlIHN0YWNrLCB0aG91Z2gsIHNvIGZvbGtzIHRoYXQgbmVlZCB0aGlzIGZ1bmN0aW9uIC0gYmUgY2FyZWZ1bAorICogYWJvdXQgeW91ciBzdGFjayEgIFBhdGNoZXMgd2lsbCBiZSBhY2NlcHRlZCB0byBtYWtlIGl0IGl0ZXJhdGl2ZS4KKyAqLworc3RhdGljIGludCBjb25maWdmc19kZXBlbmRfcHJlcChzdHJ1Y3QgZGVudHJ5ICpvcmlnaW4sCisJCQkJc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpCit7CisJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqY2hpbGRfc2QsICpzZCA9IG9yaWdpbi0+ZF9mc2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlCVUdfT04oIW9yaWdpbiB8fCAhc2QpOworCisJLyogTG9jayB0aGlzIGd1eSBvbiB0aGUgd2F5IGRvd24gKi8KKwltdXRleF9sb2NrKCZzZC0+c19kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCWlmIChzZC0+c19lbGVtZW50ID09IHRhcmdldCkgIC8qIEJvby15YWggKi8KKwkJZ290byBvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkX3NkLCAmc2QtPnNfY2hpbGRyZW4sIHNfc2libGluZykgeworCQlpZiAoY2hpbGRfc2QtPnNfdHlwZSAmIENPTkZJR0ZTX0RJUikgeworCQkJcmV0ID0gY29uZmlnZnNfZGVwZW5kX3ByZXAoY2hpbGRfc2QtPnNfZGVudHJ5LAorCQkJCQkJICAgdGFyZ2V0KTsKKwkJCWlmICghcmV0KQorCQkJCWdvdG8gb3V0OyAgLyogQ2hpbGQgcGF0aCBib28teWFoICovCisJCX0KKwl9CisKKwkvKiBXZSBsb29wZWQgYWxsIG91ciBjaGlsZHJlbiBhbmQgZGlkbid0IGZpbmQgdGFyZ2V0ICovCisJbXV0ZXhfdW5sb2NrKCZzZC0+c19kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCXJldCA9IC1FTk9FTlQ7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBpcyBPTkxZIGNhbGxlZCBpZiBjb25maWdmc19kZXBlbmRfcHJlcCgpIGRpZCBpdHMgam9iLiAgU28gd2UgY2FuCisgKiB0cnVzdCB0aGUgZW50aXJlIHBhdGggZnJvbSBpdGVtIGJhY2sgdXAgdG8gb3JpZ2luLgorICoKKyAqIFdlIHdhbGsgYmFja3dhcmRzIGZyb20gaXRlbSwgdW5sb2NraW5nIGVhY2ggaV9tdXRleC4gIFdlIGZpbmlzaCBieQorICogdW5sb2NraW5nIG9yaWdpbi4KKyAqLworc3RhdGljIHZvaWQgY29uZmlnZnNfZGVwZW5kX3JvbGxiYWNrKHN0cnVjdCBkZW50cnkgKm9yaWdpbiwKKwkJCQkgICAgIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBpdGVtLT5jaV9kZW50cnk7CisKKwl3aGlsZSAoZGVudHJ5ICE9IG9yaWdpbikgeworCQltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCWRlbnRyeSA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZvcmlnaW4tPmRfaW5vZGUtPmlfbXV0ZXgpOworfQorCitpbnQgY29uZmlnZnNfZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3Vic3lzLAorCQkJIHN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KQoreworCWludCByZXQ7CisJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqcCwgKnJvb3Rfc2QsICpzdWJzeXNfc2QgPSBOVUxMOworCXN0cnVjdCBjb25maWdfaXRlbSAqc19pdGVtID0gJnN1YnN5cy0+c3VfZ3JvdXAuY2dfaXRlbTsKKworCS8qCisJICogUGluIHRoZSBjb25maWdmcyBmaWxlc3lzdGVtLiAgVGhpcyBtZWFucyB3ZSBjYW4gc2FmZWx5IGFjY2VzcworCSAqIHRoZSByb290IG9mIHRoZSBjb25maWdmcyBmaWxlc3lzdGVtLgorCSAqLworCXJldCA9IGNvbmZpZ2ZzX3Bpbl9mcygpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIE5leHQsIGxvY2sgdGhlIHJvb3QgZGlyZWN0b3J5LiAgV2UncmUgZ29pbmcgdG8gY2hlY2sgdGhhdCB0aGUKKwkgKiBzdWJzeXN0ZW0gaXMgcmVhbGx5IHJlZ2lzdGVyZWQsIGFuZCBzbyB3ZSBuZWVkIHRvIGxvY2sgb3V0CisJICogY29uZmlnZnNfW3VuXXJlZ2lzdGVyX3N1YnN5c3RlbSgpLgorCSAqLworCW11dGV4X2xvY2soJmNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJcm9vdF9zZCA9IGNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfZnNkYXRhOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmcm9vdF9zZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CisJCWlmIChwLT5zX3R5cGUgJiBDT05GSUdGU19ESVIpIHsKKwkJCWlmIChwLT5zX2VsZW1lbnQgPT0gc19pdGVtKSB7CisJCQkJc3Vic3lzX3NkID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghc3Vic3lzX3NkKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X3VubG9ja19mczsKKwl9CisKKwkvKiBPaywgbm93IHdlIGNhbiB0cnVzdCBzdWJzeXMvc19pdGVtICovCisKKwkvKiBTY2FuIHRoZSB0cmVlLCBsb2NraW5nIGlfbXV0ZXggcmVjdXJzaXZlbHksIHJldHVybiAwIGlmIGZvdW5kICovCisJcmV0ID0gY29uZmlnZnNfZGVwZW5kX3ByZXAoc3Vic3lzX3NkLT5zX2RlbnRyeSwgdGFyZ2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bmxvY2tfZnM7CisKKwkvKiBXZSBob2xkIGFsbCBpX211dGV4ZXMgZnJvbSB0aGUgc3Vic3lzdGVtIGRvd24gdG8gdGhlIHRhcmdldCAqLworCXAgPSB0YXJnZXQtPmNpX2RlbnRyeS0+ZF9mc2RhdGE7CisJcC0+c19kZXBlbmRlbnRfY291bnQgKz0gMTsKKworCWNvbmZpZ2ZzX2RlcGVuZF9yb2xsYmFjayhzdWJzeXNfc2QtPnNfZGVudHJ5LCB0YXJnZXQpOworCitvdXRfdW5sb2NrX2ZzOgorCW11dGV4X3VubG9jaygmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwkvKgorCSAqIElmIHdlIHN1Y2NlZWRlZCwgdGhlIGZzIGlzIHBpbm5lZCB2aWEgb3RoZXIgbWV0aG9kcy4gIElmIG5vdCwKKwkgKiB3ZSdyZSBkb25lIHdpdGggaXQgYW55d2F5LiAgU28gcmVsZWFzZV9mcygpIGlzIGFsd2F5cyByaWdodC4KKwkgKi8KKwljb25maWdmc19yZWxlYXNlX2ZzKCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjb25maWdmc19kZXBlbmRfaXRlbSk7CisKKy8qCisgKiBSZWxlYXNlIHRoZSBkZXBlbmRlbnQgbGlua2FnZS4gIFRoaXMgaXMgbXVjaCBzaW1wbGVyIHRoYW4KKyAqIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKCkgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhhdCB0aGUgY2xpZW50IGRyaXZlciBpcworICogcGlubmVkLCB0aHVzIHRoZSBzdWJzeXN0ZW0gaXMgcGlubmVkLCBhbmQgdGhlcmVmb3JlIGNvbmZpZ2ZzIGlzIHBpbm5lZC4KKyAqLwordm9pZCBjb25maWdmc191bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cywKKwkJCSAgICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKnRhcmdldCkKK3sKKwlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpzZDsKKworCS8qCisJICogU2luY2Ugd2UgY2FuIHRydXN0IGV2ZXJ5dGhpbmcgaXMgcGlubmVkLCB3ZSBqdXN0IG5lZWQgaV9tdXRleAorCSAqIG9uIHRoZSBpdGVtLgorCSAqLworCW11dGV4X2xvY2soJnRhcmdldC0+Y2lfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKworCXNkID0gdGFyZ2V0LT5jaV9kZW50cnktPmRfZnNkYXRhOworCUJVR19PTihzZC0+c19kZXBlbmRlbnRfY291bnQgPCAxKTsKKworCXNkLT5zX2RlcGVuZGVudF9jb3VudCAtPSAxOworCisJLyoKKwkgKiBBZnRlciB0aGlzIHVubG9jaywgd2UgY2Fubm90IHRydXN0IHRoZSBpdGVtIHRvIHN0YXkgYWxpdmUhCisJICogRE8gTk9UIFJFRkVSRU5DRSBpdGVtIGFmdGVyIHRoaXMgdW5sb2NrLgorCSAqLworCW11dGV4X3VubG9jaygmdGFyZ2V0LT5jaV9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChjb25maWdmc191bmRlcGVuZF9pdGVtKTsKIAogc3RhdGljIGludCBjb25maWdmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKIHsKQEAgLTc4Myw3ICsxMDQyLDcgQEAKIAogCXNucHJpbnRmKG5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiArIDEsICIlcyIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCi0JZG93bigmc3Vic3lzLT5zdV9zZW0pOworCW11dGV4X2xvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOwogCWdyb3VwID0gTlVMTDsKIAlpdGVtID0gTlVMTDsKIAlpZiAodHlwZS0+Y3RfZ3JvdXBfb3BzLT5tYWtlX2dyb3VwKSB7CkBAIC03OTcsNyArMTA1Niw3IEBACiAJCWlmIChpdGVtKQogCQkJbGlua19vYmoocGFyZW50X2l0ZW0sIGl0ZW0pOwogCX0KLQl1cCgmc3Vic3lzLT5zdV9zZW0pOworCW11dGV4X3VubG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CiAKIAlrZnJlZShuYW1lKTsKIAlpZiAoIWl0ZW0pIHsKQEAgLTg0MSwxMyArMTEwMCwxNiBAQAogb3V0X3VubGluazoKIAlpZiAocmV0KSB7CiAJCS8qIFRlYXIgZG93biBldmVyeXRoaW5nIHdlIGJ1aWx0IHVwICovCi0JCWRvd24oJnN1YnN5cy0+c3Vfc2VtKTsKKwkJbXV0ZXhfbG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CisKKwkJY2xpZW50X2Rpc2Nvbm5lY3Rfbm90aWZ5KHBhcmVudF9pdGVtLCBpdGVtKTsKIAkJaWYgKGdyb3VwKQogCQkJdW5saW5rX2dyb3VwKGdyb3VwKTsKIAkJZWxzZQogCQkJdW5saW5rX29iaihpdGVtKTsKIAkJY2xpZW50X2Ryb3BfaXRlbShwYXJlbnRfaXRlbSwgaXRlbSk7Ci0JCXVwKCZzdWJzeXMtPnN1X3NlbSk7CisKKwkJbXV0ZXhfdW5sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKIAogCQlpZiAobW9kdWxlX2dvdCkKIAkJCW1vZHVsZV9wdXQob3duZXIpOwpAQCAtODgxLDYgKzExNDMsMTMgQEAKIAlpZiAoc2QtPnNfdHlwZSAmIENPTkZJR0ZTX1VTRVRfREVGQVVMVCkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCS8qCisJICogSGVyZSdzIHdoZXJlIHdlIGNoZWNrIGZvciBkZXBlbmRlbnRzLiAgV2UncmUgcHJvdGVjdGVkIGJ5CisJICogaV9tdXRleC4KKwkgKi8KKwlpZiAoc2QtPnNfZGVwZW5kZW50X2NvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCiAJLyogR2V0IGEgd29ya2luZyByZWYgdW50aWwgd2UgaGF2ZSB0aGUgY2hpbGQgKi8KIAlwYXJlbnRfaXRlbSA9IGNvbmZpZ2ZzX2dldF9jb25maWdfaXRlbShkZW50cnktPmRfcGFyZW50KTsKIAlzdWJzeXMgPSB0b19jb25maWdfZ3JvdXAocGFyZW50X2l0ZW0pLT5jZ19zdWJzeXM7CkBAIC05MTAsMTcgKzExNzksMTkgQEAKIAlpZiAoc2QtPnNfdHlwZSAmIENPTkZJR0ZTX1VTRVRfRElSKSB7CiAJCWNvbmZpZ2ZzX2RldGFjaF9ncm91cChpdGVtKTsKIAotCQlkb3duKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2xvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOworCQljbGllbnRfZGlzY29ubmVjdF9ub3RpZnkocGFyZW50X2l0ZW0sIGl0ZW0pOwogCQl1bmxpbmtfZ3JvdXAodG9fY29uZmlnX2dyb3VwKGl0ZW0pKTsKIAl9IGVsc2UgewogCQljb25maWdmc19kZXRhY2hfaXRlbShpdGVtKTsKIAotCQlkb3duKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2xvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOworCQljbGllbnRfZGlzY29ubmVjdF9ub3RpZnkocGFyZW50X2l0ZW0sIGl0ZW0pOwogCQl1bmxpbmtfb2JqKGl0ZW0pOwogCX0KIAogCWNsaWVudF9kcm9wX2l0ZW0ocGFyZW50X2l0ZW0sIGl0ZW0pOwotCXVwKCZzdWJzeXMtPnN1X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKIAogCS8qIERyb3Agb3VyIHJlZmVyZW5jZSBmcm9tIGFib3ZlICovCiAJY29uZmlnX2l0ZW1fcHV0KGl0ZW0pOwpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvZmlsZS5jIGIvZnMvY29uZmlnZnMvZmlsZS5jCmluZGV4IDM1MjdjN2MuLmEzNjU4ZjkgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYworKysgYi9mcy9jb25maWdmcy9maWxlLmMKQEAgLTI3LDE5ICsyNywyNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgogI2luY2x1ZGUgImNvbmZpZ2ZzX2ludGVybmFsLmgiCiAKKy8qCisgKiBBIHNpbXBsZSBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgNDA5NiBjaGFyYWN0ZXJzLiAgV2h5IDRrPyAgQmVjYXVzZSB0aGUKKyAqIG9yaWdpbmFsIGNvZGUgbGltaXRlZCBpdCB0byBQQUdFX1NJWkUuICBUaGF0J3MgYSBiYWQgaWRlYSwgdGhvdWdoLAorICogYmVjYXVzZSBhbiBhdHRyaWJ1dGUgb2YgMTZrIG9uIGlhNjQgd29uJ3Qgd29yayBvbiB4ODYuICBTbyB3ZSBsaW1pdCB0bworICogNGssIG91ciBtaW5pbXVtIGNvbW1vbiBwYWdlIHNpemUuCisgKi8KKyNkZWZpbmUgU0lNUExFX0FUVFJfU0laRSA0MDk2CiAKIHN0cnVjdCBjb25maWdmc19idWZmZXIgewogCXNpemVfdAkJCWNvdW50OwogCWxvZmZfdAkJCXBvczsKIAljaGFyCQkJKiBwYWdlOwogCXN0cnVjdCBjb25maWdmc19pdGVtX29wZXJhdGlvbnMJKiBvcHM7Ci0Jc3RydWN0IHNlbWFwaG9yZQlzZW07CisJc3RydWN0IG11dGV4CQltdXRleDsKIAlpbnQJCQluZWVkc19yZWFkX2ZpbGw7CiB9OwogCkBAIC02OSw3ICs3Niw3IEBACiAKIAljb3VudCA9IG9wcy0+c2hvd19hdHRyaWJ1dGUoaXRlbSxhdHRyLGJ1ZmZlci0+cGFnZSk7CiAJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAwOwotCUJVR19PTihjb3VudCA+IChzc2l6ZV90KVBBR0VfU0laRSk7CisJQlVHX09OKGNvdW50ID4gKHNzaXplX3QpU0lNUExFX0FUVFJfU0laRSk7CiAJaWYgKGNvdW50ID49IDApCiAJCWJ1ZmZlci0+Y291bnQgPSBjb3VudDsKIAllbHNlCkBAIC0xMDIsNyArMTA5LDcgQEAKIAlzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyICogYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3QgcmV0dmFsID0gMDsKIAotCWRvd24oJmJ1ZmZlci0+c2VtKTsKKwltdXRleF9sb2NrKCZidWZmZXItPm11dGV4KTsKIAlpZiAoYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwpIHsKIAkJaWYgKChyZXR2YWwgPSBmaWxsX3JlYWRfYnVmZmVyKGZpbGUtPmZfcGF0aC5kZW50cnksYnVmZmVyKSkpCiAJCQlnb3RvIG91dDsKQEAgLTExMiw3ICsxMTksNyBAQAogCXJldHZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlci0+cGFnZSwKIAkJCQkJIGJ1ZmZlci0+Y291bnQpOwogb3V0OgotCXVwKCZidWZmZXItPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZidWZmZXItPm11dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xMzcsOCArMTQ0LDggQEAKIAlpZiAoIWJ1ZmZlci0+cGFnZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQotCQljb3VudCA9IFBBR0VfU0laRSAtIDE7CisJaWYgKGNvdW50ID49IFNJTVBMRV9BVFRSX1NJWkUpCisJCWNvdW50ID0gU0lNUExFX0FUVFJfU0laRSAtIDE7CiAJZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihidWZmZXItPnBhZ2UsYnVmLGNvdW50KTsKIAlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDE7CiAJLyogaWYgYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiBhIHN0cmluZywgdGVybWluYXRlIGl0IGJ5IFwwLApAQCAtMTkzLDEzICsyMDAsMTMgQEAKIAlzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyICogYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3QgbGVuOwogCi0JZG93bigmYnVmZmVyLT5zZW0pOworCW11dGV4X2xvY2soJmJ1ZmZlci0+bXV0ZXgpOwogCWxlbiA9IGZpbGxfd3JpdGVfYnVmZmVyKGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAJaWYgKGxlbiA+IDApCiAJCWxlbiA9IGZsdXNoX3dyaXRlX2J1ZmZlcihmaWxlLT5mX3BhdGguZGVudHJ5LCBidWZmZXIsIGNvdW50KTsKIAlpZiAobGVuID4gMCkKIAkJKnBwb3MgKz0gbGVuOwotCXVwKCZidWZmZXItPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZidWZmZXItPm11dGV4KTsKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0yNTMsNyArMjYwLDcgQEAKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIEVub21lbTsKIAl9Ci0JaW5pdF9NVVRFWCgmYnVmZmVyLT5zZW0pOworCW11dGV4X2luaXQoJmJ1ZmZlci0+bXV0ZXgpOwogCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMTsKIAlidWZmZXItPm9wcyA9IG9wczsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBidWZmZXI7CkBAIC0yOTIsNiArMjk5LDcgQEAKIAlpZiAoYnVmZmVyKSB7CiAJCWlmIChidWZmZXItPnBhZ2UpCiAJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLT5wYWdlKTsKKwkJbXV0ZXhfZGVzdHJveSgmYnVmZmVyLT5tdXRleCk7CiAJCWtmcmVlKGJ1ZmZlcik7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvaXRlbS5jIGIvZnMvY29uZmlnZnMvaXRlbS5jCmluZGV4IDI0NDIxMjAuLjc2ZGM0YzMgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2l0ZW0uYworKysgYi9mcy9jb25maWdmcy9pdGVtLmMKQEAgLTYyLDcgKzYyLDYgQEAKICAqCWR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcgdGhhdCBAaXRlbS0+Y2lfbmFtZSBwb2ludHMgdG8uCiAgKglPdGhlcndpc2UsIHVzZSB0aGUgc3RhdGljIEBpdGVtLT5jaV9uYW1lYnVmIGFycmF5LgogICovCi0KIGludCBjb25maWdfaXRlbV9zZXRfbmFtZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKiBpdGVtLCBjb25zdCBjaGFyICogZm10LCAuLi4pCiB7CiAJaW50IGVycm9yID0gMDsKQEAgLTEzOSwxMiArMTM4LDcgQEAKIAlyZXR1cm4gaXRlbTsKIH0KIAotLyoqCi0gKgljb25maWdfaXRlbV9jbGVhbnVwIC0gZnJlZSBjb25maWdfaXRlbSByZXNvdXJjZXMuCi0gKglAaXRlbToJaXRlbS4KLSAqLwotCi12b2lkIGNvbmZpZ19pdGVtX2NsZWFudXAoc3RydWN0IGNvbmZpZ19pdGVtICogaXRlbSkKK3N0YXRpYyB2b2lkIGNvbmZpZ19pdGVtX2NsZWFudXAoc3RydWN0IGNvbmZpZ19pdGVtICogaXRlbSkKIHsKIAlzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSAqIHQgPSBpdGVtLT5jaV90eXBlOwogCXN0cnVjdCBjb25maWdfZ3JvdXAgKiBzID0gaXRlbS0+Y2lfZ3JvdXA7CkBAIC0xNzksMzkgKzE3MywzNSBAQAogCQlrcmVmX3B1dCgmaXRlbS0+Y2lfa3JlZiwgY29uZmlnX2l0ZW1fcmVsZWFzZSk7CiB9CiAKLQogLyoqCiAgKgljb25maWdfZ3JvdXBfaW5pdCAtIGluaXRpYWxpemUgYSBncm91cCBmb3IgdXNlCiAgKglAazoJZ3JvdXAKICAqLwotCiB2b2lkIGNvbmZpZ19ncm91cF9pbml0KHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwKQogewogCWNvbmZpZ19pdGVtX2luaXQoJmdyb3VwLT5jZ19pdGVtKTsKIAlJTklUX0xJU1RfSEVBRCgmZ3JvdXAtPmNnX2NoaWxkcmVuKTsKIH0KIAotCiAvKioKLSAqCWNvbmZpZ19ncm91cF9maW5kX29iaiAtIHNlYXJjaCBmb3IgaXRlbSBpbiBncm91cC4KKyAqCWNvbmZpZ19ncm91cF9maW5kX2l0ZW0gLSBzZWFyY2ggZm9yIGl0ZW0gaW4gZ3JvdXAuCiAgKglAZ3JvdXA6CWdyb3VwIHdlJ3JlIGxvb2tpbmcgaW4uCiAgKglAbmFtZToJaXRlbSdzIG5hbWUuCiAgKgotICoJTG9jayBncm91cCB2aWEgQGdyb3VwLT5jZ19zdWJzeXMsIGFuZCBpdGVyYXRlIG92ZXIgQGdyb3VwLT5jZ19saXN0LAotICoJbG9va2luZyBmb3IgYSBtYXRjaGluZyBjb25maWdfaXRlbS4gSWYgbWF0Y2hpbmcgaXRlbSBpcyBmb3VuZAotICoJdGFrZSBhIHJlZmVyZW5jZSBhbmQgcmV0dXJuIHRoZSBpdGVtLgorICoJSXRlcmF0ZSBvdmVyIEBncm91cC0+Y2dfbGlzdCwgbG9va2luZyBmb3IgYSBtYXRjaGluZyBjb25maWdfaXRlbS4KKyAqCUlmIG1hdGNoaW5nIGl0ZW0gaXMgZm91bmQgdGFrZSBhIHJlZmVyZW5jZSBhbmQgcmV0dXJuIHRoZSBpdGVtLgorICoJQ2FsbGVyIG11c3QgaGF2ZSBsb2NrZWQgZ3JvdXAgdmlhIEBncm91cC0+Y2dfc3Vic3lzLT5zdV9tdHguCiAgKi8KLQotc3RydWN0IGNvbmZpZ19pdGVtICogY29uZmlnX2dyb3VwX2ZpbmRfb2JqKHN0cnVjdCBjb25maWdfZ3JvdXAgKiBncm91cCwgY29uc3QgY2hhciAqIG5hbWUpCitzdHJ1Y3QgY29uZmlnX2l0ZW0gKmNvbmZpZ19ncm91cF9maW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OwogCXN0cnVjdCBjb25maWdfaXRlbSAqIHJldCA9IE5VTEw7CiAKLSAgICAgICAgLyogWFhYIExPQ0tJTkchICovCiAJbGlzdF9mb3JfZWFjaChlbnRyeSwmZ3JvdXAtPmNnX2NoaWxkcmVuKSB7CiAJCXN0cnVjdCBjb25maWdfaXRlbSAqIGl0ZW0gPSB0b19pdGVtKGVudHJ5KTsKIAkJaWYgKGNvbmZpZ19pdGVtX25hbWUoaXRlbSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjb25maWdfaXRlbV9uYW1lKGl0ZW0pLCBuYW1lKSkgeworCQkgICAgIXN0cmNtcChjb25maWdfaXRlbV9uYW1lKGl0ZW0pLCBuYW1lKSkgewogCQkJcmV0ID0gY29uZmlnX2l0ZW1fZ2V0KGl0ZW0pOwogCQkJYnJlYWs7CiAJCX0KQEAgLTIxOSw5ICsyMDksOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLQogRVhQT1JUX1NZTUJPTChjb25maWdfaXRlbV9pbml0KTsKIEVYUE9SVF9TWU1CT0woY29uZmlnX2dyb3VwX2luaXQpOwogRVhQT1JUX1NZTUJPTChjb25maWdfaXRlbV9nZXQpOwogRVhQT1JUX1NZTUJPTChjb25maWdfaXRlbV9wdXQpOwotRVhQT1JUX1NZTUJPTChjb25maWdfZ3JvdXBfZmluZF9vYmopOworRVhQT1JUX1NZTUJPTChjb25maWdfZ3JvdXBfZmluZF9pdGVtKTsKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggMGU3M2FhMC4uY2I5ZDA1MCAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTg4Myw2ICs4ODMsMTEgQEAKIAlyZXR1cm4gKGRlbnRyeV9zdGF0Lm5yX3VudXNlZCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwogfQogCitzdGF0aWMgc3RydWN0IHNocmlua2VyIGRjYWNoZV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gc2hyaW5rX2RjYWNoZV9tZW1vcnksCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKIC8qKgogICogZF9hbGxvYwktCWFsbG9jYXRlIGEgZGNhY2hlIGVudHJ5CiAgKiBAcGFyZW50OiBwYXJlbnQgb2YgZW50cnkgdG8gYWxsb2NhdGUKQEAgLTIxMTUsNyArMjEyMCw3IEBACiAJZGVudHJ5X2NhY2hlID0gS01FTV9DQUNIRShkZW50cnksCiAJCVNMQUJfUkVDTEFJTV9BQ0NPVU5UfFNMQUJfUEFOSUN8U0xBQl9NRU1fU1BSRUFEKTsKIAkKLQlzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgc2hyaW5rX2RjYWNoZV9tZW1vcnkpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZkY2FjaGVfc2hyaW5rZXIpOwogCiAJLyogSGFzaCBtYXkgaGF2ZSBiZWVuIHNldCB1cCBpbiBkY2FjaGVfaW5pdF9lYXJseSAqLwogCWlmICghaGFzaGRpc3QpCmRpZmYgLS1naXQgYS9mcy9kbG0vY29uZmlnLmMgYi9mcy9kbG0vY29uZmlnLmMKaW5kZXggNTA2OWIyYy4uMmY4ZTNjOCAxMDA2NDQKLS0tIGEvZnMvZGxtL2NvbmZpZy5jCisrKyBiL2ZzL2RsbS9jb25maWcuYwpAQCAtMTMzLDE0ICsxMzMsNiBAQAogCXJldHVybiBsZW47CiB9CiAKLSNkZWZpbmUgX19DT05GSUdGU19BVFRSKF9uYW1lLF9tb2RlLF9yZWFkLF93cml0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkuYXR0ciAgID0geyAuY2FfbmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgLmNhX21vZGUgPSBfbW9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIC5jYV9vd25lciA9IFRISVNfTU9EVUxFIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JLnNob3cgICA9IF9yZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkuc3RvcmUgID0gX3dyaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCiAjZGVmaW5lIENMVVNURVJfQVRUUihuYW1lLCBjaGVja196ZXJvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBzdGF0aWMgc3NpemVfdCBuYW1lIyNfd3JpdGUoc3RydWN0IGNsdXN0ZXIgKmNsLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02MTUsNyArNjA3LDcgQEAKIGludCBkbG1fY29uZmlnX2luaXQodm9pZCkKIHsKIAljb25maWdfZ3JvdXBfaW5pdCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfZ3JvdXApOwotCWluaXRfTVVURVgoJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfaW5pdCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfbXV0ZXgpOwogCXJldHVybiBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzKTsKIH0KIApAQCAtNzU5LDkgKzc1MSw5IEBACiAJaWYgKCFzcGFjZV9saXN0KQogCQlyZXR1cm4gTlVMTDsKIAotCWRvd24oJnNwYWNlX2xpc3QtPmNnX3N1YnN5cy0+c3Vfc2VtKTsKLQlpID0gY29uZmlnX2dyb3VwX2ZpbmRfb2JqKHNwYWNlX2xpc3QsIG5hbWUpOwotCXVwKCZzcGFjZV9saXN0LT5jZ19zdWJzeXMtPnN1X3NlbSk7CisJbXV0ZXhfbG9jaygmc3BhY2VfbGlzdC0+Y2dfc3Vic3lzLT5zdV9tdXRleCk7CisJaSA9IGNvbmZpZ19ncm91cF9maW5kX2l0ZW0oc3BhY2VfbGlzdCwgbmFtZSk7CisJbXV0ZXhfdW5sb2NrKCZzcGFjZV9saXN0LT5jZ19zdWJzeXMtPnN1X211dGV4KTsKIAogCXJldHVybiB0b19zcGFjZShpKTsKIH0KQEAgLTc4MCw3ICs3NzIsNyBAQAogCWlmICghY29tbV9saXN0KQogCQlyZXR1cm4gTlVMTDsKIAotCWRvd24oJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfbG9jaygmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfbXV0ZXgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmY29tbV9saXN0LT5jZ19jaGlsZHJlbiwgY2lfZW50cnkpIHsKIAkJY20gPSB0b19jb21tKGkpOwpAQCAtODAwLDcgKzc5Miw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3Vfc2VtKTsKKwltdXRleF91bmxvY2soJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X211dGV4KTsKIAogCWlmICghZm91bmQpCiAJCWNtID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IDg4MTlkMjguLjdlMjczMTUgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtNTM4LDYgKzUzOCwxMSBAQAogCXJldHVybiAoZHFzdGF0cy5mcmVlX2RxdW90cyAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwogfQogCitzdGF0aWMgc3RydWN0IHNocmlua2VyIGRxY2FjaGVfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IHNocmlua19kcWNhY2hlX21lbW9yeSwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKKwogLyoKICAqIFB1dCByZWZlcmVuY2UgdG8gZHF1b3QKICAqIE5PVEU6IElmIHlvdSBjaGFuZ2UgdGhpcyBmdW5jdGlvbiBwbGVhc2UgY2hlY2sgd2hldGhlciBkcXB1dF9ibG9ja3MoKSB3b3JrcyByaWdodC4uLgpAQCAtMTg3MCw3ICsxODc1LDcgQEAKIAlwcmludGsoIkRxdW90LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogJWxkIChvcmRlciAlbGQsICVsZCBieXRlcylcbiIsCiAJCQlucl9oYXNoLCBvcmRlciwgKFBBR0VfU0laRSA8PCBvcmRlcikpOwogCi0Jc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHNocmlua19kcWNhY2hlX21lbW9yeSk7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmRxY2FjaGVfc2hyaW5rZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9kcm9wX2NhY2hlcy5jIGIvZnMvZHJvcF9jYWNoZXMuYwppbmRleCAwM2VhNzY5Li41OTM3NWVmIDEwMDY0NAotLS0gYS9mcy9kcm9wX2NhY2hlcy5jCisrKyBiL2ZzL2Ryb3BfY2FjaGVzLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmc2ItPnNfaW5vZGVzLCBpX3NiX2xpc3QpIHsKIAkJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlOR3xJX1dJTExfRlJFRSkpCiAJCQljb250aW51ZTsKLQkJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDAsIC0xKTsKKwkJX19pbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCwgLTEsIHRydWUpOwogCX0KIAlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9pbm9kZS5jIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwppbmRleCA4M2U5NGZlLi5lNzdhMmVjIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9pbm9kZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKIAlzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udDsKIAljaGFyICplbmNvZGVkX25hbWU7Ci0JdW5zaWduZWQgaW50IGVuY29kZWRfbmFtZWxlbjsKKwlpbnQgZW5jb2RlZF9uYW1lbGVuOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdDsKIAljaGFyICpwYWdlX3ZpcnQgPSBOVUxMOwpAQCAtNDczLDcgKzQ3Myw3IEBACiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeTsKIAl1bW9kZV90IG1vZGU7CiAJY2hhciAqZW5jb2RlZF9zeW1uYW1lOwotCXVuc2lnbmVkIGludCBlbmNvZGVkX3N5bWxlbjsKKwlpbnQgZW5jb2RlZF9zeW1sZW47CiAJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOwogCiAJbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7CmRpZmYgLS1naXQgYS9mcy9lZnMvbmFtZWkuYyBiL2ZzL2Vmcy9uYW1laS5jCmluZGV4IGVkNGEyMDcuLjUyNzZiMTkgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9uYW1laS5jCisrKyBiL2ZzL2Vmcy9uYW1laS5jCkBAIC03NSw2ICs3NSwzOCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdHJ1Y3QgZGVudHJ5ICplZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKK3sKKwlfX3UzMiAqb2JqcCA9IHZvYmpwOworCXVuc2lnbmVkIGxvbmcgaW5vID0gb2JqcFswXTsKKwlfX3UzMiBnZW5lcmF0aW9uID0gb2JqcFsxXTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKKworCWlmIChpbm8gPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisJaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8CisJICAgIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikpIHsKKwkgICAgCXJlc3VsdCA9IEVSUl9QVFIoLUVTVEFMRSk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCisJcmVzdWx0ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKKwlpZiAoIXJlc3VsdCkgeworCQlyZXN1bHQgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dF9pcHV0OworCX0KKwlyZXR1cm4gcmVzdWx0OworCisgb3V0X2lwdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogc3RydWN0IGRlbnRyeSAqZWZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCiB7CiAJc3RydWN0IGRlbnRyeSAqcGFyZW50OwpkaWZmIC0tZ2l0IGEvZnMvZWZzL3N1cGVyLmMgYi9mcy9lZnMvc3VwZXIuYwppbmRleCBlMGE2ODM5Li5kMzYwYzgxIDEwMDY0NAotLS0gYS9mcy9lZnMvc3VwZXIuYworKysgYi9mcy9lZnMvc3VwZXIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vmc192aC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CkBAIC0xMTMsNiArMTE0LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZWZzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9kZW50cnkJPSBlZnNfZ2V0X2RlbnRyeSwKIAkuZ2V0X3BhcmVudAk9IGVmc19nZXRfcGFyZW50LAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZXhwb3J0ZnMvZXhwZnMuYyBiL2ZzL2V4cG9ydGZzL2V4cGZzLmMKaW5kZXggZTk4ZjZjZC4uOGFkYjMyYSAxMDA2NDQKLS0tIGEvZnMvZXhwb3J0ZnMvZXhwZnMuYworKysgYi9mcy9leHBvcnRmcy9leHBmcy5jCkBAIC0xLDE1ICsxLDQ1IEBACiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KIAotc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4cG9ydF9vcF9kZWZhdWx0OwotCi0jZGVmaW5lCUNBTEwob3BzLGZ1bikgKChvcHMtPmZ1bik/KG9wcy0+ZnVuKTpleHBvcnRfb3BfZGVmYXVsdC5mdW4pCi0KICNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pIGRve313aGlsZSgwKQogCisKK3N0YXRpYyBpbnQgZ2V0X25hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpuYW1lLAorCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7CisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4cG9ydGZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqKQoreworCXN0cnVjdCBkZW50cnkgKnJlc3VsdCA9IEVSUl9QVFIoLUVTVEFMRSk7CisKKwlpZiAoc2ItPnNfZXhwb3J0X29wLT5nZXRfZGVudHJ5KSB7CisJCXJlc3VsdCA9IHNiLT5zX2V4cG9ydF9vcC0+Z2V0X2RlbnRyeShzYiwgb2JqKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXN1bHQgPSBFUlJfUFRSKC1FU1RBTEUpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZXhwb3J0ZnNfZ2V0X25hbWUoc3RydWN0IGRlbnRyeSAqZGlyLCBjaGFyICpuYW1lLAorCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKK3sKKwlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcCA9IGRpci0+ZF9zYi0+c19leHBvcnRfb3A7CisKKwlpZiAobm9wLT5nZXRfbmFtZSkKKwkJcmV0dXJuIG5vcC0+Z2V0X25hbWUoZGlyLCBuYW1lLCBjaGlsZCk7CisJZWxzZQorCQlyZXR1cm4gZ2V0X25hbWUoZGlyLCBuYW1lLCBjaGlsZCk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZGVudHJ5IG9yIGFueSBvZiBpdCdzIGFsaWFzZXMgaXMgYWNjZXB0YWJsZS4KKyAqLwogc3RhdGljIHN0cnVjdCBkZW50cnkgKgogZmluZF9hY2NlcHRhYmxlX2FsaWFzKHN0cnVjdCBkZW50cnkgKnJlc3VsdCwKIAkJaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KSwKQEAgLTE3LDYgKzQ3LDkgQEAKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICp0b3B1dCA9IE5VTEw7CiAKKwlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZW50cnksICZyZXN1bHQtPmRfaW5vZGUtPmlfZGVudHJ5LCBkX2FsaWFzKSB7CiAJCWRnZXRfbG9ja2VkKGRlbnRyeSk7CkBAIC0zNyw2ICs3MCwxNTAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyoKKyAqIEZpbmQgcm9vdCBvZiBhIGRpc2Nvbm5lY3RlZCBzdWJ0cmVlIGFuZCByZXR1cm4gYSByZWZlcmVuY2UgdG8gaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2ZpbmRfZGlzY29ubmVjdGVkX3Jvb3Qoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRnZXQoZGVudHJ5KTsKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwl3aGlsZSAoIUlTX1JPT1QoZGVudHJ5KSAmJgorCSAgICAgICAoZGVudHJ5LT5kX3BhcmVudC0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7CisJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJCWRnZXQocGFyZW50KTsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBwYXJlbnQ7CisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCXJldHVybiBkZW50cnk7Cit9CisKKworLyoKKyAqIE1ha2Ugc3VyZSB0YXJnZXRfZGlyIGlzIGZ1bGx5IGNvbm5lY3RlZCB0byB0aGUgZGVudHJ5IHRyZWUuCisgKgorICogSXQgbWF5IGFscmVhZHkgYmUsIGFzIHRoZSBmbGFnIGlzbid0IGFsd2F5cyB1cGRhdGVkIHdoZW4gY29ubmVjdGlvbiBoYXBwZW5zLgorICovCitzdGF0aWMgaW50CityZWNvbm5lY3RfcGF0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICp0YXJnZXRfZGlyKQoreworCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKKwlpbnQgbm9wcm9ncmVzcyA9IDA7CisJaW50IGVyciA9IC1FU1RBTEU7CisKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjb25mdXNlZCBmaWxlIHN5c3RlbSBtaWdodCBub3QgbGV0IHVzIGNvbXBsZXRlCisJICogdGhlIHBhdGggdG8gdGhlIHJvb3QuICBGb3IgZXhhbXBsZSwgaWYgZ2V0X3BhcmVudCByZXR1cm5zIGEgZGlyZWN0b3J5CisJICogaW4gd2hpY2ggd2UgY2Fubm90IGZpbmQgYSBuYW1lIGZvciB0aGUgY2hpbGQuICBXaGlsZSB0aGlzIGltcGxpZXMgYQorCSAqIHZlcnkgc2ljayBmaWxlc3lzdGVtIHdlIGRvbid0IHdhbnQgaXQgdG8gY2F1c2Uga25mc2QgdG8gc3Bpbi4gIEhlbmNlCisJICogdGhlIG5vcHJvZ3Jlc3MgY291bnRlci4gIElmIHdlIGdvIHRocm91Z2ggdGhlIGxvb3AgMTAgdGltZXMgKDIgaXMKKwkgKiBwcm9iYWJseSBlbm91Z2gpIHdpdGhvdXQgZ2V0dGluZyBhbnl3aGVyZSwgd2UganVzdCBnaXZlIHVwCisJICovCisJd2hpbGUgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEICYmIG5vcHJvZ3Jlc3MrKyA8IDEwKSB7CisJCXN0cnVjdCBkZW50cnkgKnBkID0gZmluZF9kaXNjb25uZWN0ZWRfcm9vdCh0YXJnZXRfZGlyKTsKKworCQlpZiAoIUlTX1JPT1QocGQpKSB7CisJCQkvKiBtdXN0IGhhdmUgZm91bmQgYSBjb25uZWN0ZWQgcGFyZW50IC0gZ3JlYXQgKi8KKwkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CisJCQlwZC0+ZF9mbGFncyAmPSB+RENBQ0hFX0RJU0NPTk5FQ1RFRDsKKwkJCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCW5vcHJvZ3Jlc3MgPSAwOworCQl9IGVsc2UgaWYgKHBkID09IHNiLT5zX3Jvb3QpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZXhwb3J0OiBFZWVrIGZpbGVzeXN0ZW0gcm9vdCBpcyBub3QgY29ubmVjdGVkLCBpbXBvc3NpYmxlXG4iKTsKKwkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CisJCQlwZC0+ZF9mbGFncyAmPSB+RENBQ0hFX0RJU0NPTk5FQ1RFRDsKKwkJCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCW5vcHJvZ3Jlc3MgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgaGl0IHRoZSB0b3Agb2YgYSBkaXNjb25uZWN0ZWQgcGF0aCwgdHJ5IHRvCisJCQkgKiBmaW5kIHBhcmVudCBhbmQgY29ubmVjdC4KKwkJCSAqCisJCQkgKiBSYWNpbmcgd2l0aCBzb21lIG90aGVyIHByb2Nlc3MgcmVuYW1pbmcgYSBkaXJlY3RvcnkKKwkJCSAqIGlzbid0IG11Y2ggb2YgYSBwcm9ibGVtIGhlcmUuICBJZiBzb21lb25lIHJlbmFtZXMKKwkJCSAqIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgZW5kIHVwIHByb3Blcmx5IGNvbm5lY3RlZCwKKwkJCSAqIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAorCQkJICoKKwkJCSAqIEdldHRpbmcgdGhlIHBhcmVudCBjYW4ndCBiZSBzdXBwb3J0ZWQgZ2VuZXJpY2FsbHksCisJCQkgKiB0aGUgbG9ja2luZyBpcyB0b28gaWNreS4KKwkJCSAqCisJCQkgKiBJbnN0ZWFkIHdlIGp1c3QgcmV0dXJuIEVBQ0NFUy4gIElmIHNlcnZlciByZWJvb3RzCisJCQkgKiBvciBpbm9kZXMgZ2V0IGZsdXNoZWQsIHlvdSBsb3NlCisJCQkgKi8KKwkJCXN0cnVjdCBkZW50cnkgKnBwZCA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCQlzdHJ1Y3QgZGVudHJ5ICpucGQ7CisKKwkJCW11dGV4X2xvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKKwkJCWlmIChzYi0+c19leHBvcnRfb3AtPmdldF9wYXJlbnQpCisJCQkJcHBkID0gc2ItPnNfZXhwb3J0X29wLT5nZXRfcGFyZW50KHBkKTsKKwkJCW11dGV4X3VubG9jaygmcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJCQlpZiAoSVNfRVJSKHBwZCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHBwZCk7CisJCQkJZHByaW50aygiJXM6IGdldF9wYXJlbnQgb2YgJWxkIGZhaWxlZCwgZXJyICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIHBkLT5kX2lub2RlLT5pX2lubywgZXJyKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZHByaW50aygiJXM6IGZpbmQgbmFtZSBvZiAlbHUgaW4gJWx1XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJcGQtPmRfaW5vZGUtPmlfaW5vLCBwcGQtPmRfaW5vZGUtPmlfaW5vKTsKKwkJCWVyciA9IGV4cG9ydGZzX2dldF9uYW1lKHBwZCwgbmJ1ZiwgcGQpOworCQkJaWYgKGVycikgeworCQkJCWRwdXQocHBkKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQkJCS8qIHNvbWUgcmFjZSBiZXR3ZWVuIGdldF9wYXJlbnQgYW5kCisJCQkJCSAqIGdldF9uYW1lPyAganVzdCB0cnkgYWdhaW4KKwkJCQkJICovCisJCQkJCWNvbnRpbnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJZHByaW50aygiJXM6IGZvdW5kIG5hbWU6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5idWYpOworCQkJbXV0ZXhfbG9jaygmcHBkLT5kX2lub2RlLT5pX211dGV4KTsKKwkJCW5wZCA9IGxvb2t1cF9vbmVfbGVuKG5idWYsIHBwZCwgc3RybGVuKG5idWYpKTsKKwkJCW11dGV4X3VubG9jaygmcHBkLT5kX2lub2RlLT5pX211dGV4KTsKKwkJCWlmIChJU19FUlIobnBkKSkgeworCQkJCWVyciA9IFBUUl9FUlIobnBkKTsKKwkJCQlkcHJpbnRrKCIlczogbG9va3VwIGZhaWxlZDogJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQlkcHV0KHBwZCk7CisJCQkJZHB1dChwZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiB3ZSBkaWRuJ3QgcmVhbGx5IHdhbnQgbnBkLCB3ZSByZWFsbHkgd2FudGVkCisJCQkgKiBhIHNpZGUtZWZmZWN0IG9mIHRoZSBsb29rdXAuCisJCQkgKiBob3BlZnVsbHksIG5wZCA9PSBwZCwgdGhvdWdoIGl0IGlzbid0IHJlYWxseQorCQkJICogYSBwcm9ibGVtIGlmIGl0IGlzbid0CisJCQkgKi8KKwkJCWlmIChucGQgPT0gcGQpCisJCQkJbm9wcm9ncmVzcyA9IDA7CisJCQllbHNlCisJCQkJcHJpbnRrKCIlczogbnBkICE9IHBkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHB1dChucGQpOworCQkJZHB1dChwcGQpOworCQkJaWYgKElTX1JPT1QocGQpKSB7CisJCQkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdlIGhhdmUgdG8gZ2l2ZSB1cCAqLworCQkJCWRwdXQocGQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWRwdXQocGQpOworCX0KKworCWlmICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkgeworCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAtIG9oLXdlbGwgKi8KKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRVNUQUxFOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCiAvKioKICAqIGZpbmRfZXhwb3J0ZWRfZGVudHJ5IC0gaGVscGVyIHJvdXRpbmUgdG8gaW1wbGVtZW50IGV4cG9ydF9vcGVyYXRpb25zLT5kZWNvZGVfZmgKICAqIEBzYjoJCVRoZSAmc3VwZXJfYmxvY2sgaWRlbnRpZnlpbmcgdGhlIGZpbGVzeXN0ZW0KQEAgLTc0LDE4NCArMjUxLDU4IEBACiAJCSAgICAgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAogCQkgICAgIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqcmVzdWx0ID0gTlVMTDsKLQlzdHJ1Y3QgZGVudHJ5ICp0YXJnZXRfZGlyOwotCWludCBlcnI7Ci0Jc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3BzID0gc2ItPnNfZXhwb3J0X29wOwotCXN0cnVjdCBkZW50cnkgKmFsaWFzOwotCWludCBub3Byb2dyZXNzOwotCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQsICphbGlhczsKKwlpbnQgZXJyID0gLUVTVEFMRTsKIAogCS8qCiAJICogQXR0ZW1wdCB0byBmaW5kIHRoZSBpbm9kZS4KIAkgKi8KLQlyZXN1bHQgPSBDQUxMKHNiLT5zX2V4cG9ydF9vcCxnZXRfZGVudHJ5KShzYixvYmopOwotCWVyciA9IC1FU1RBTEU7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlnb3RvIGVycl9vdXQ7Ci0JaWYgKElTX0VSUihyZXN1bHQpKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVzdWx0KTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkgJiYKLQkgICAgKHJlc3VsdC0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7Ci0JCS8qIGl0IGlzIGFuIHVuY29ubmVjdGVkIGRpcmVjdG9yeSwgd2UgbXVzdCBjb25uZWN0IGl0ICovCi0JCTsKLQl9IGVsc2UgewotCQlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpKSB7CisJcmVzdWx0ID0gZXhwb3J0ZnNfZ2V0X2RlbnRyeShzYiwgb2JqKTsKKwlpZiAoSVNfRVJSKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKKwlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKCEocmVzdWx0LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKKwkJCWlmIChhY2NlcHRhYmxlKGNvbnRleHQsIHJlc3VsdCkpCisJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCWVyciA9IC1FQUNDRVM7CiAJCQlnb3RvIGVycl9yZXN1bHQ7CiAJCX0KIAorCQllcnIgPSByZWNvbm5lY3RfcGF0aChzYiwgcmVzdWx0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3Jlc3VsdDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGVudHJ5ICp0YXJnZXRfZGlyLCAqbnJlc3VsdDsKKwkJY2hhciBuYnVmW05BTUVfTUFYKzFdOworCiAJCWFsaWFzID0gZmluZF9hY2NlcHRhYmxlX2FsaWFzKHJlc3VsdCwgYWNjZXB0YWJsZSwgY29udGV4dCk7CiAJCWlmIChhbGlhcykKIAkJCXJldHVybiBhbGlhczsKLQl9CQkJCiAKLQkvKiBJdCdzIGEgZGlyZWN0b3J5LCBvciB3ZSBhcmUgcmVxdWlyZWQgdG8gY29uZmlybSB0aGUgZmlsZSdzCi0JICogbG9jYXRpb24gaW4gdGhlIHRyZWUgYmFzZWQgb24gdGhlIHBhcmVudCBpbmZvcm1hdGlvbgotIAkgKi8KLQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogbmVlZCB0byBsb29rIGhhcmRlciBmb3IgJXMvJWRcbiIsc2ItPnNfaWQsKihpbnQqKW9iaik7Ci0JaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpKQotCQl0YXJnZXRfZGlyID0gZGdldChyZXN1bHQpOwotCWVsc2UgewogCQlpZiAocGFyZW50ID09IE5VTEwpCiAJCQlnb3RvIGVycl9yZXN1bHQ7CiAKLQkJdGFyZ2V0X2RpciA9IENBTEwoc2ItPnNfZXhwb3J0X29wLGdldF9kZW50cnkpKHNiLHBhcmVudCk7Ci0JCWlmIChJU19FUlIodGFyZ2V0X2RpcikpCisJCXRhcmdldF9kaXIgPSBleHBvcnRmc19nZXRfZGVudHJ5KHNiLHBhcmVudCk7CisJCWlmIChJU19FUlIodGFyZ2V0X2RpcikpIHsKIAkJCWVyciA9IFBUUl9FUlIodGFyZ2V0X2Rpcik7Ci0JCWlmICh0YXJnZXRfZGlyID09IE5VTEwgfHwgSVNfRVJSKHRhcmdldF9kaXIpKQogCQkJZ290byBlcnJfcmVzdWx0OwotCX0KLQkvKgotCSAqIE5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRhcmdldF9kaXIgaXMgcHJvcGVybHkgY29ubmVjdGVkLgotCSAqIEl0IG1heSBhbHJlYWR5IGJlLCBhcyB0aGUgZmxhZyBpc24ndCBhbHdheXMgdXBkYXRlZCB3aGVuIGNvbm5lY3Rpb24KLQkgKiBoYXBwZW5zLgotCSAqIFNvLCB3ZSB3YWxrIHVwIHBhcmVudCBsaW5rcyB1bnRpbCB3ZSBmaW5kIGEgY29ubmVjdGVkIGRpcmVjdG9yeSwKLQkgKiBvciB3ZSBydW4gb3V0IG9mIGRpcmVjdG9yaWVzLiAgVGhlbiB3ZSBmaW5kIHRoZSBwYXJlbnQsIGZpbmQKLQkgKiB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgaW4gdGhhdCBwYXJlbnQsIGFuZCBkbyBhIGxvb2t1cC4KLQkgKiBUaGlzIHNob3VsZCBjb25uZWN0IHRoZSBjaGlsZCBpbnRvIHRoZSBwYXJlbnQKLQkgKiBXZSB0aGVuIHJlcGVhdC4KLQkgKi8KLQotCS8qIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjb25mdXNlZCBmaWxlIHN5c3RlbSBtaWdodCBub3QgbGV0IHVzIGNvbXBsZXRlIAotCSAqIHRoZSBwYXRoIHRvIHRoZSByb290LiAgRm9yIGV4YW1wbGUsIGlmIGdldF9wYXJlbnQgcmV0dXJucyBhIGRpcmVjdG9yeQotCSAqIGluIHdoaWNoIHdlIGNhbm5vdCBmaW5kIGEgbmFtZSBmb3IgdGhlIGNoaWxkLiAgV2hpbGUgdGhpcyBpbXBsaWVzIGEKLQkgKiB2ZXJ5IHNpY2sgZmlsZXN5c3RlbSB3ZSBkb24ndCB3YW50IGl0IHRvIGNhdXNlIGtuZnNkIHRvIHNwaW4uICBIZW5jZQotCSAqIHRoZSBub3Byb2dyZXNzIGNvdW50ZXIuICBJZiB3ZSBnbyB0aHJvdWdoIHRoZSBsb29wIDEwIHRpbWVzICgyIGlzCi0JICogcHJvYmFibHkgZW5vdWdoKSB3aXRob3V0IGdldHRpbmcgYW55d2hlcmUsIHdlIGp1c3QgZ2l2ZSB1cAotCSAqLwotCW5vcHJvZ3Jlc3M9IDA7Ci0Jd2hpbGUgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEICYmIG5vcHJvZ3Jlc3MrKyA8IDEwKSB7Ci0JCXN0cnVjdCBkZW50cnkgKnBkID0gdGFyZ2V0X2RpcjsKLQotCQlkZ2V0KHBkKTsKLQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJd2hpbGUgKCFJU19ST09UKHBkKSAmJgotCQkJCShwZC0+ZF9wYXJlbnQtPmRfZmxhZ3MmRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKLQkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IHBkLT5kX3BhcmVudDsKLQotCQkJZGdldChwYXJlbnQpOwotCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwotCQkJZHB1dChwZCk7Ci0JCQlwZCA9IHBhcmVudDsKLQkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwogCi0JCWlmICghSVNfUk9PVChwZCkpIHsKLQkJCS8qIG11c3QgaGF2ZSBmb3VuZCBhIGNvbm5lY3RlZCBwYXJlbnQgLSBncmVhdCAqLwotCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOwotCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwotCQkJbm9wcm9ncmVzcyA9IDA7Ci0JCX0gZWxzZSBpZiAocGQgPT0gc2ItPnNfcm9vdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJleHBvcnQ6IEVlZWsgZmlsZXN5c3RlbSByb290IGlzIG5vdCBjb25uZWN0ZWQsIGltcG9zc2libGVcbiIpOwotCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOwotCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwotCQkJbm9wcm9ncmVzcyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB3ZSBoYXZlIGhpdCB0aGUgdG9wIG9mIGEgZGlzY29ubmVjdGVkIHBhdGguICBUcnkKLQkJCSAqIHRvIGZpbmQgcGFyZW50IGFuZCBjb25uZWN0Ci0JCQkgKiBub3RlOiByYWNpbmcgd2l0aCBzb21lIG90aGVyIHByb2Nlc3MgcmVuYW1pbmcgYQotCQkJICogZGlyZWN0b3J5IGlzbid0IG11Y2ggb2YgYSBwcm9ibGVtIGhlcmUuICBJZiBzb21lb25lCi0JCQkgKiByZW5hbWVzIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgZW5kIHVwIHByb3Blcmx5Ci0JCQkgKiBjb25uZWN0ZWQsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAotCQkJICovCi0JCQlzdHJ1Y3QgZGVudHJ5ICpwcGQ7Ci0JCQlzdHJ1Y3QgZGVudHJ5ICpucGQ7Ci0KLQkJCW11dGV4X2xvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKLQkJCXBwZCA9IENBTEwobm9wcyxnZXRfcGFyZW50KShwZCk7Ci0JCQltdXRleF91bmxvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKLQotCQkJaWYgKElTX0VSUihwcGQpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUihwcGQpOwotCQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBnZXRfcGFyZW50IG9mICVsZCBmYWlsZWQsIGVyciAlZFxuIiwKLQkJCQkJcGQtPmRfaW5vZGUtPmlfaW5vLCBlcnIpOwotCQkJCWRwdXQocGQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IGZpbmQgbmFtZSBvZiAlbHUgaW4gJWx1XG4iLCBwZC0+ZF9pbm9kZS0+aV9pbm8sIHBwZC0+ZF9pbm9kZS0+aV9pbm8pOwotCQkJZXJyID0gQ0FMTChub3BzLGdldF9uYW1lKShwcGQsIG5idWYsIHBkKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlkcHV0KHBwZCk7Ci0JCQkJZHB1dChwZCk7Ci0JCQkJaWYgKGVyciA9PSAtRU5PRU5UKQotCQkJCQkvKiBzb21lIHJhY2UgYmV0d2VlbiBnZXRfcGFyZW50IGFuZAotCQkJCQkgKiBnZXRfbmFtZT8gIGp1c3QgdHJ5IGFnYWluCi0JCQkJCSAqLwotCQkJCQljb250aW51ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBmb3VuZCBuYW1lOiAlc1xuIiwgbmJ1Zik7Ci0JCQltdXRleF9sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQkJbnBkID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgcHBkLCBzdHJsZW4obmJ1ZikpOwotCQkJbXV0ZXhfdW5sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQkJaWYgKElTX0VSUihucGQpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUihucGQpOwotCQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBsb29rdXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKLQkJCQlkcHV0KHBwZCk7Ci0JCQkJZHB1dChwZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiB3ZSBkaWRuJ3QgcmVhbGx5IHdhbnQgbnBkLCB3ZSByZWFsbHkgd2FudGVkCi0JCQkgKiBhIHNpZGUtZWZmZWN0IG9mIHRoZSBsb29rdXAuCi0JCQkgKiBob3BlZnVsbHksIG5wZCA9PSBwZCwgdGhvdWdoIGl0IGlzbid0IHJlYWxseQotCQkJICogYSBwcm9ibGVtIGlmIGl0IGlzbid0Ci0JCQkgKi8KLQkJCWlmIChucGQgPT0gcGQpCi0JCQkJbm9wcm9ncmVzcyA9IDA7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogbnBkICE9IHBkXG4iKTsKLQkJCWRwdXQobnBkKTsKLQkJCWRwdXQocHBkKTsKLQkJCWlmIChJU19ST09UKHBkKSkgewotCQkJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nLCB3ZSBoYXZlIHRvIGdpdmUgdXAgKi8KLQkJCQlkcHV0KHBkKTsKLQkJCQlicmVhazsKLQkJCX0KKwkJZXJyID0gcmVjb25uZWN0X3BhdGgoc2IsIHRhcmdldF9kaXIpOworCQlpZiAoZXJyKSB7CisJCQlkcHV0KHRhcmdldF9kaXIpOworCQkJZ290byBlcnJfcmVzdWx0OwogCQl9Ci0JCWRwdXQocGQpOwotCX0KIAotCWlmICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkgewotCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAtIG9oLXdlbGwgKi8KLQkJaWYgKCFlcnIpCi0JCQllcnIgPSAtRVNUQUxFOwotCQlnb3RvIGVycl90YXJnZXQ7Ci0JfQotCS8qIGlmIHdlIHdlcmVuJ3QgYWZ0ZXIgYSBkaXJlY3RvcnksIGhhdmUgb25lIG1vcmUgc3RlcCB0byBnbyAqLwotCWlmIChyZXN1bHQgIT0gdGFyZ2V0X2RpcikgewotCQlzdHJ1Y3QgZGVudHJ5ICpucmVzdWx0OwotCQllcnIgPSBDQUxMKG5vcHMsZ2V0X25hbWUpKHRhcmdldF9kaXIsIG5idWYsIHJlc3VsdCk7CisJCS8qCisJCSAqIEFzIHdlIHdlcmVuJ3QgYWZ0ZXIgYSBkaXJlY3RvcnksIGhhdmUgb25lIG1vcmUgc3RlcCB0byBnby4KKwkJICovCisJCWVyciA9IGV4cG9ydGZzX2dldF9uYW1lKHRhcmdldF9kaXIsIG5idWYsIHJlc3VsdCk7CiAJCWlmICghZXJyKSB7CiAJCQltdXRleF9sb2NrKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX211dGV4KTsKLQkJCW5yZXN1bHQgPSBsb29rdXBfb25lX2xlbihuYnVmLCB0YXJnZXRfZGlyLCBzdHJsZW4obmJ1ZikpOworCQkJbnJlc3VsdCA9IGxvb2t1cF9vbmVfbGVuKG5idWYsIHRhcmdldF9kaXIsCisJCQkJCQkgc3RybGVuKG5idWYpKTsKIAkJCW11dGV4X3VubG9jaygmdGFyZ2V0X2Rpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlpZiAoIUlTX0VSUihucmVzdWx0KSkgewogCQkJCWlmIChucmVzdWx0LT5kX2lub2RlKSB7CkBAIC0yNjEsMTEgKzMxMiw4IEBACiAJCQkJCWRwdXQobnJlc3VsdCk7CiAJCQl9CiAJCX0KKwkJZHB1dCh0YXJnZXRfZGlyKTsKIAl9Ci0JZHB1dCh0YXJnZXRfZGlyKTsKLQkvKiBub3cgcmVzdWx0IGlzIHByb3Blcmx5IGNvbm5lY3RlZCwgaXQgaXMgb3VyIGJlc3QgYmV0ICovCi0JaWYgKGFjY2VwdGFibGUoY29udGV4dCwgcmVzdWx0KSkKLQkJcmV0dXJuIHJlc3VsdDsKIAogCWFsaWFzID0gZmluZF9hY2NlcHRhYmxlX2FsaWFzKHJlc3VsdCwgYWNjZXB0YWJsZSwgY29udGV4dCk7CiAJaWYgKGFsaWFzKQpAQCAtMjc1LDMyICszMjMsMTYgQEAKIAlkcHV0KHJlc3VsdCk7CiAJLyogSXQgbWlnaHQgYmUganVzdGlmaWFibGUgdG8gcmV0dXJuIEVTVEFMRSBoZXJlLAogCSAqIGJ1dCB0aGUgZmlsZWhhbmRsZSBhdC1sZWFzdCBsb29rcyByZWFzb25hYmxlIGdvb2QKLQkgKiBhbmQgaXQganVzdCBiZSBhIHBlcm1pc3Npb24gcHJvYmxlbSwgc28gcmV0dXJuaW5nCisJICogYW5kIGl0IG1heSBqdXN0IGJlIGEgcGVybWlzc2lvbiBwcm9ibGVtLCBzbyByZXR1cm5pbmcKIAkgKiAtRUFDQ0VTUyBpcyBzYWZlcgogCSAqLwogCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCi0gZXJyX3RhcmdldDoKLQlkcHV0KHRhcmdldF9kaXIpOwogIGVycl9yZXN1bHQ6CiAJZHB1dChyZXN1bHQpOwotIGVycl9vdXQ6CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAotCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQotewotCS8qIGdldF9wYXJlbnQgY2Fubm90IGJlIHN1cHBvcnRlZCBnZW5lcmljYWxseSwgdGhlIGxvY2tpbmcKLQkgKiBpcyB0b28gaWNreS4KLQkgKiBpbnN0ZWFkLCB3ZSBqdXN0IHJldHVybiBFQUNDRVMuICBJZiBzZXJ2ZXIgcmVib290cyBvciBpbm9kZXMKLQkgKiBnZXQgZmx1c2hlZCwgeW91IGxvc2UKLQkgKi8KLQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKLX0KLQotCiBzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2sgewogCWNoYXIgKm5hbWU7CQkvKiBuYW1lIHRoYXQgd2FzIGZvdW5kLiBJdCBhbHJlYWR5IHBvaW50cyB0byBhCiAJCQkJICAgYnVmZmVyIE5BTUVfTUFYKzEgaXMgc2l6ZSAqLwpAQCAtMzkwLDYxICs0MjIsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZXhwb3J0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8sIF9fdTMyIGdlbmVyYXRpb24pCi17Ci0KLQkvKiBpZ2V0IGlzbid0IHJlYWxseSByaWdodCBpZiB0aGUgaW5vZGUgaXMgY3VycmVudGx5IHVuYWxsb2NhdGVkISEKLQkgKiBUaGlzIHNob3VsZCByZWFsbHkgYWxsIGJlIGRvbmUgaW5zaWRlIGVhY2ggZmlsZXN5c3RlbQotCSAqCi0JICogZXh0MmZzJyByZWFkX2lub2RlIGhhcyBiZWVuIHN0cmVuZ3RoZWQgdG8gcmV0dXJuIGEgYmFkX2lub2RlIGlmCi0JICogdGhlIGlub2RlIGhhZCBiZWVuIGRlbGV0ZWQuCi0JICoKLQkgKiBDdXJyZW50bHkgd2UgZG9uJ3Qga25vdyB0aGUgZ2VuZXJhdGlvbiBmb3IgcGFyZW50IGRpcmVjdG9yeSwgc28KLQkgKiBhIGdlbmVyYXRpb24gb2YgMCBtZWFucyAiYWNjZXB0IGFueSIKLQkgKi8KLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKLQlpZiAoaW5vID09IDApCi0JCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwotCWlub2RlID0gaWdldChzYiwgaW5vKTsKLQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkKLQkgICAgfHwgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKQotCQkpIHsKLQkJLyogd2UgZGlkbid0IGZpbmQgdGhlIHJpZ2h0IGlub2RlLi4gKi8KLQkJZHByaW50aygiZmhfdmVyaWZ5OiBJbm9kZSAlbHUsIEJhZCBjb3VudDogJWQgJWQgb3IgdmVyc2lvbiAgJXUgJXVcbiIsCi0JCQlpbm9kZS0+aV9pbm8sCi0JCQlpbm9kZS0+aV9ubGluaywgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSwKLQkJCWlub2RlLT5pX2dlbmVyYXRpb24sCi0JCQlnZW5lcmF0aW9uKTsKLQotCQlpcHV0KGlub2RlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7Ci0JfQotCS8qIG5vdyB0byBmaW5kIGEgZGVudHJ5LgotCSAqIElmIHBvc3NpYmxlLCBnZXQgYSB3ZWxsLWNvbm5lY3RlZCBvbmUKLQkgKi8KLQlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwotCWlmICghcmVzdWx0KSB7Ci0JCWlwdXQoaW5vZGUpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2V0X29iamVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKLXsKLQlfX3UzMiAqb2JqcCA9IHZvYmpwOwotCXVuc2lnbmVkIGxvbmcgaW5vID0gb2JqcFswXTsKLQlfX3UzMiBnZW5lcmF0aW9uID0gb2JqcFsxXTsKLQotCXJldHVybiBleHBvcnRfaWdldChzYiwgaW5vLCBnZW5lcmF0aW9uKTsKLX0KLQotCiAvKioKICAqIGV4cG9ydF9lbmNvZGVfZmggLSBkZWZhdWx0IGV4cG9ydF9vcGVyYXRpb25zLT5lbmNvZGVfZmggZnVuY3Rpb24KICAqIEBkZW50cnk6ICB0aGUgZGVudHJ5IHRvIGVuY29kZQpAQCAtNTE3LDE2ICs0OTQsNDAgQEAKIAkJCQkgICBhY2NlcHRhYmxlLCBjb250ZXh0KTsKIH0KIAotc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4cG9ydF9vcF9kZWZhdWx0ID0gewotCS5kZWNvZGVfZmgJPSBleHBvcnRfZGVjb2RlX2ZoLAotCS5lbmNvZGVfZmgJPSBleHBvcnRfZW5jb2RlX2ZoLAoraW50IGV4cG9ydGZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpmaCwgaW50ICptYXhfbGVuLAorCQlpbnQgY29ubmVjdGFibGUpCit7CisgCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gZGVudHJ5LT5kX3NiLT5zX2V4cG9ydF9vcDsKKwlpbnQgZXJyb3I7CiAKLQkuZ2V0X25hbWUJPSBnZXRfbmFtZSwKLQkuZ2V0X3BhcmVudAk9IGdldF9wYXJlbnQsCi0JLmdldF9kZW50cnkJPSBnZXRfb2JqZWN0LAotfTsKKwlpZiAobm9wLT5lbmNvZGVfZmgpCisJCWVycm9yID0gbm9wLT5lbmNvZGVfZmgoZGVudHJ5LCBmaCwgbWF4X2xlbiwgY29ubmVjdGFibGUpOworCWVsc2UKKwkJZXJyb3IgPSBleHBvcnRfZW5jb2RlX2ZoKGRlbnRyeSwgZmgsIG1heF9sZW4sIGNvbm5lY3RhYmxlKTsKIAotRVhQT1JUX1NZTUJPTChleHBvcnRfb3BfZGVmYXVsdCk7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXhwb3J0ZnNfZW5jb2RlX2ZoKTsKKworc3RydWN0IGRlbnRyeSAqZXhwb3J0ZnNfZGVjb2RlX2ZoKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBfX3UzMiAqZmgsIGludCBmaF9sZW4sCisJCWludCBmaWxlaWRfdHlwZSwgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqLCBzdHJ1Y3QgZGVudHJ5ICopLAorCQl2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gbW50LT5tbnRfc2ItPnNfZXhwb3J0X29wOworCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKKworCWlmIChub3AtPmRlY29kZV9maCkgeworCQlyZXN1bHQgPSBub3AtPmRlY29kZV9maChtbnQtPm1udF9zYiwgZmgsIGZoX2xlbiwgZmlsZWlkX3R5cGUsCisJCQlhY2NlcHRhYmxlLCBjb250ZXh0KTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBleHBvcnRfZGVjb2RlX2ZoKG1udC0+bW50X3NiLCBmaCwgZmhfbGVuLCBmaWxlaWRfdHlwZSwKKwkJCWFjY2VwdGFibGUsIGNvbnRleHQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHBvcnRmc19kZWNvZGVfZmgpOworCiBFWFBPUlRfU1lNQk9MKGZpbmRfZXhwb3J0ZWRfZGVudHJ5KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9maWxlLmMgYi9mcy9leHQyL2ZpbGUuYwppbmRleCAwNGFmZWVjLi5hYjc5NjEyIDEwMDY0NAotLS0gYS9mcy9leHQyL2ZpbGUuYworKysgYi9mcy9leHQyL2ZpbGUuYwpAQCAtMjQsOSArMjQsOSBAQAogI2luY2x1ZGUgImFjbC5oIgogCiAvKgotICogQ2FsbGVkIHdoZW4gYW4gaW5vZGUgaXMgcmVsZWFzZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudAotICogZnJvbSBleHQyX29wZW5fZmlsZTogb3BlbiBnZXRzIGNhbGxlZCBhdCBldmVyeSBvcGVuLCBidXQgcmVsZWFzZQotICogZ2V0cyBjYWxsZWQgb25seSB3aGVuIC9hbGwvIHRoZSBmaWxlcyBhcmUgY2xvc2VkLgorICogQ2FsbGVkIHdoZW4gZmlscCBpcyByZWxlYXNlZC4gVGhpcyBoYXBwZW5zIHdoZW4gYWxsIGZpbGUgZGVzY3JpcHRvcnMKKyAqIGZvciBhIHNpbmdsZSBzdHJ1Y3QgZmlsZSBhcmUgY2xvc2VkLiBOb3RlIHRoYXQgZGlmZmVyZW50IG9wZW4oKSBjYWxscworICogZm9yIHRoZSBzYW1lIGZpbGUgeWllbGQgZGlmZmVyZW50IHN0cnVjdCBmaWxlIHN0cnVjdHVyZXMuCiAgKi8KIHN0YXRpYyBpbnQgZXh0Ml9yZWxlYXNlX2ZpbGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKaW5kZXggNWRlNTA2MS4uM2VlZmE5NyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0xMDk5LDE1ICsxMTAwLDE4IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKIAlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7Ci0JdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKLQlpbnQgaTsKIAl1NjQgZnNpZDsKIAogCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKLQkJb3ZlcmhlYWQgPSAwOwotCWVsc2UgeworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IDA7CisJZWxzZSBpZiAoc2JpLT5zX2Jsb2Nrc19sYXN0ICE9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJdW5zaWduZWQgbG9uZyBpLCBvdmVyaGVhZCA9IDA7CisJCXNtcF9ybWIoKTsKKwogCQkvKgotCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpLiBUaGlzIGlzIGNvbnN0YW50CisJCSAqIGZvciBhIGdpdmVuIGZpbGVzeXN0ZW0gdW5sZXNzIHRoZSBudW1iZXIgb2YgYmxvY2sgZ3JvdXBzCisJCSAqIGNoYW5nZXMgc28gd2UgY2FjaGUgdGhlIHByZXZpb3VzIHZhbHVlIHVudGlsIGl0IGRvZXMuCiAJCSAqLwogCiAJCS8qCkBAIC0xMTMxLDE3ICsxMTM1LDIyIEBACiAJCSAqLwogCQlvdmVyaGVhZCArPSAoc2JpLT5zX2dyb3Vwc19jb3VudCAqCiAJCQkgICAgICgyICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKTsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSBvdmVyaGVhZDsKKwkJc21wX3dtYigpOworCQlzYmktPnNfYmxvY2tzX2xhc3QgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOwogCX0KIAogCWJ1Zi0+Zl90eXBlID0gRVhUMl9TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7Ci0JYnVmLT5mX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBvdmVyaGVhZDsKKwlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIHNiaS0+c19vdmVyaGVhZF9sYXN0OwogCWJ1Zi0+Zl9iZnJlZSA9IGV4dDJfY291bnRfZnJlZV9ibG9ja3Moc2IpOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOwogCWlmIChidWYtPmZfYmZyZWUgPCBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCkpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gZXh0Ml9jb3VudF9mcmVlX2lub2RlcyhzYik7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfZmZyZWUpOwogCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUMl9OQU1FX0xFTjsKIAlmc2lkID0gbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCkgXgogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDJhODVkZGUuLmRlNGUzMTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTMxOTUsNyArMzE5NSw3IEBACiAJICovCiAKIAlqb3VybmFsID0gRVhUM19KT1VSTkFMKGlub2RlKTsKLQlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpIHx8IElTX1JET05MWShpbm9kZSkpCisJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKIAkJcmV0dXJuIC1FUk9GUzsKIAogCWpvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IDliYjA0NmQuLjE1ODY4MDcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTEwMTksNiArMTAxOSwxMSBAQAogCiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKworCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQogCX0KIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CkBAIC0xMDU0LDYgKzEwNTksMTEgQEAKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAorCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwl9CisKIAlwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwogCWlmICghcGFyZW50KSB7CiAJCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDZlMzA2MjkuLjRmODRkYzggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTI5LDEyICsyOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtNDU5LDYgKzQ2MSwxNCBAQAogCiBzdGF0aWMgdm9pZCBleHQzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlpZiAoIWxpc3RfZW1wdHkoJihFWFQzX0koaW5vZGUpLT5pX29ycGhhbikpKSB7CisJCXByaW50aygiRVhUMyBJbm9kZSAlcDogb3JwaGFuIGxpc3QgY2hlY2sgZmFpbGVkIVxuIiwKKwkJCUVYVDNfSShpbm9kZSkpOworCQlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLCBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwKKwkJCQlFWFQzX0koaW5vZGUpLCBzaXplb2Yoc3RydWN0IGV4dDNfaW5vZGVfaW5mbyksCisJCQkJZmFsc2UpOworCQlkdW1wX3N0YWNrKCk7CisJfQogCWttZW1fY2FjaGVfZnJlZShleHQzX2lub2RlX2NhY2hlcCwgRVhUM19JKGlub2RlKSk7CiB9CiAKQEAgLTE1NjYsNyArMTU3Niw3IEBACiAJCXNiaS0+c19pbm9kZV9zaXplID0gbGUxNl90b19jcHUoZXMtPnNfaW5vZGVfc2l6ZSk7CiAJCXNiaS0+c19maXJzdF9pbm8gPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9pbm8pOwogCQlpZiAoKHNiaS0+c19pbm9kZV9zaXplIDwgRVhUM19HT09EX09MRF9JTk9ERV9TSVpFKSB8fAotCQkgICAgKHNiaS0+c19pbm9kZV9zaXplICYgKHNiaS0+c19pbm9kZV9zaXplIC0gMSkpIHx8CisJCSAgICAoIWlzX3Bvd2VyX29mXzIoc2JpLT5zX2lub2RlX3NpemUpKSB8fAogCQkgICAgKHNiaS0+c19pbm9kZV9zaXplID4gYmxvY2tzaXplKSkgewogCQkJcHJpbnRrIChLRVJOX0VSUgogCQkJCSJFWFQzLWZzOiB1bnN1cHBvcnRlZCBpbm9kZSBzaXplOiAlZFxuIiwKQEAgLTIwNzUsNiArMjA4NSw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSkKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycjsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgpAQCAtMjA4MiwxMyArMjA5MywxNSBAQAogCQlyZXR1cm4gLUVST0ZTOwogCX0KIAotCWlmICghKGpvdXJuYWwgPSBleHQzX2dldF9qb3VybmFsKHNiLCBqb3VybmFsX2ludW0pKSkKKwlqb3VybmFsID0gZXh0M19nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKTsKKwlpZiAoIWpvdXJuYWwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogY3JlYXRpbmcgbmV3IGpvdXJuYWwgb24gaW5vZGUgJXVcbiIsCiAJICAgICAgIGpvdXJuYWxfaW51bSk7CiAKLQlpZiAoam91cm5hbF9jcmVhdGUoam91cm5hbCkpIHsKKwllcnIgPSBqb3VybmFsX2NyZWF0ZShqb3VybmFsKTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZXJyb3IgY3JlYXRpbmcgam91cm5hbC5cbiIpOwogCQlqb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMjEzOSwxMiArMjE1MiwxNCBAQAogCiAJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiAJam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwlsb2NrX3N1cGVyKHNiKTsKIAlpZiAoRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpICYmCiAJICAgIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CiAJCUVYVDNfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwogCQlzYi0+c19kaXJ0ID0gMDsKIAkJZXh0M19jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKIAl9CisJdW5sb2NrX3N1cGVyKHNiKTsKIAlqb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOwogfQogCkBAIC0yMzMzLDcgKzIzNDgsMTMgQEAKIAkJCSAgICAoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19WQUxJRF9GUykpCiAJCQkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOwogCisJCQkvKgorCQkJICogV2UgaGF2ZSB0byB1bmxvY2sgc3VwZXIgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IKKwkJCSAqIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJdW5sb2NrX3N1cGVyKHNiKTsKIAkJCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCQkJbG9ja19zdXBlcihzYik7CiAJCX0gZWxzZSB7CiAJCQlfX2xlMzIgcmV0OwogCQkJaWYgKChyZXQgPSBFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKQEAgLTI0MDYsMTkgKzI0MjcsMTkgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKLQlleHQzX2ZzYmxrX3Qgb3ZlcmhlYWQ7Ci0JaW50IGk7CiAJdTY0IGZzaWQ7CiAKLQlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCi0JCW92ZXJoZWFkID0gMDsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBuZ3JvdXBzOwotCQluZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWlmICh0ZXN0X29wdChzYiwgTUlOSVhfREYpKSB7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gMDsKKwl9IGVsc2UgaWYgKHNiaS0+c19ibG9ja3NfbGFzdCAhPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCXVuc2lnbmVkIGxvbmcgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQsIGk7CisJCWV4dDNfZnNibGtfdCBvdmVyaGVhZCA9IDA7CiAJCXNtcF9ybWIoKTsKIAogCQkvKgotCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpLiAgVGhpcyBpcyBjb25zdGFudAorCQkgKiBmb3IgYSBnaXZlbiBmaWxlc3lzdGVtIHVubGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrIGdyb3VwcworCQkgKiBjaGFuZ2VzIHNvIHdlIGNhY2hlIHRoZSBwcmV2aW91cyB2YWx1ZSB1bnRpbCBpdCBkb2VzLgogCQkgKi8KIAogCQkvKgpAQCAtMjQ0MiwxOCArMjQ2MywyMyBAQAogCQkgKiBFdmVyeSBibG9jayBncm91cCBoYXMgYW4gaW5vZGUgYml0bWFwLCBhIGJsb2NrCiAJCSAqIGJpdG1hcCwgYW5kIGFuIGlub2RlIHRhYmxlLgogCQkgKi8KLQkJb3ZlcmhlYWQgKz0gKG5ncm91cHMgKiAoMiArIEVYVDNfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKTsKKwkJb3ZlcmhlYWQgKz0gbmdyb3VwcyAqICgyICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApOworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IG92ZXJoZWFkOworCQlzbXBfd21iKCk7CisJCXNiaS0+c19ibG9ja3NfbGFzdCA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CiAJfQogCiAJYnVmLT5mX3R5cGUgPSBFWFQzX1NVUEVSX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKLQlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9ibG9ja3MgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0gc2JpLT5zX292ZXJoZWFkX2xhc3Q7CiAJYnVmLT5mX2JmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwllcy0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9iZnJlZSk7CiAJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSAtIGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KTsKIAlpZiAoYnVmLT5mX2JmcmVlIDwgbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpKQogCQlidWYtPmZfYmF2YWlsID0gMDsKIAlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpOwogCWJ1Zi0+Zl9mZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfZmZyZWUpOwogCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUM19OQU1FX0xFTjsKIAlmc2lkID0gbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCkgXgogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggM2I2NGJiMS4uOWRlNTRhZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC0xNTg1LDcgKzE1ODUsNyBAQAogCXJldF9ibG9jayA9IGdycF9hbGxvY19ibGsgKyBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cF9ubyk7CiAKIAlpZiAoaW5fcmFuZ2UoZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCksIHJldF9ibG9jaywgbnVtKSB8fAotCSAgICBpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgcmV0X2Jsb2NrLCBudW0pIHx8CisJICAgIGluX3JhbmdlKGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApLCByZXRfYmxvY2ssIG51bSkgfHwKIAkgICAgaW5fcmFuZ2UocmV0X2Jsb2NrLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApLAogCQkgICAgIEVYVDRfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApIHx8CiAJICAgIGluX3JhbmdlKHJldF9ibG9jayArIG51bSAtIDEsIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggMjgxMWU1Ny4uMmRlMzM5ZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMTAxNyw2ICsxMDE3LDExIEBACiAKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCisJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQl9CiAJfQogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KQEAgLTEwNTIsNiArMTA1NywxMSBAQAogCWlmICghaW5vZGUpCiAJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKwogCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CiAJaWYgKCFwYXJlbnQpIHsKIAkJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggMTc1YjY4Yy4uYjgwNmU2OCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CkBAIC01MTAsNiArNTExLDE0IEBACiAKIHN0YXRpYyB2b2lkIGV4dDRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCWlmICghbGlzdF9lbXB0eSgmKEVYVDRfSShpbm9kZSktPmlfb3JwaGFuKSkpIHsKKwkJcHJpbnRrKCJFWFQ0IElub2RlICVwOiBvcnBoYW4gbGlzdCBjaGVjayBmYWlsZWQhXG4iLAorCQkJRVhUNF9JKGlub2RlKSk7CisJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LAorCQkJCUVYVDRfSShpbm9kZSksIHNpemVvZihzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvKSwKKwkJCQl0cnVlKTsKKwkJZHVtcF9zdGFjaygpOworCX0KIAlrbWVtX2NhY2hlX2ZyZWUoZXh0NF9pbm9kZV9jYWNoZXAsIEVYVDRfSShpbm9kZSkpOwogfQogCkBAIC0yMTUwLDYgKzIxNTksNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGludCBqb3VybmFsX2ludW0pCiB7CiAJam91cm5hbF90ICpqb3VybmFsOworCWludCBlcnI7CiAKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiByZWFkb25seSBmaWxlc3lzdGVtIHdoZW4gdHJ5aW5nIHRvICIKQEAgLTIxNTcsMTMgKzIxNjcsMTUgQEAKIAkJcmV0dXJuIC1FUk9GUzsKIAl9CiAKLQlpZiAoIShqb3VybmFsID0gZXh0NF9nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKSkpCisJam91cm5hbCA9IGV4dDRfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSk7CisJaWYgKCFqb3VybmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICV1XG4iLAogCSAgICAgICBqb3VybmFsX2ludW0pOwogCi0JaWYgKGpiZDJfam91cm5hbF9jcmVhdGUoam91cm5hbCkpIHsKKwllcnIgPSBqYmQyX2pvdXJuYWxfY3JlYXRlKGpvdXJuYWwpOworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBlcnJvciBjcmVhdGluZyBqb3VybmFsLlxuIik7CiAJCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTIyMTQsMTIgKzIyMjYsMTQgQEAKIAogCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiAJamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCWxvY2tfc3VwZXIoc2IpOwogCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikgJiYKIAkgICAgc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKIAkJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CiAJCXNiLT5zX2RpcnQgPSAwOwogCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOwogCX0KKwl1bmxvY2tfc3VwZXIoc2IpOwogCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKIH0KIApAQCAtMjQwOCw3ICsyNDIyLDEzIEBACiAJCQkgICAgKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfVkFMSURfRlMpKQogCQkJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYoc2JpLT5zX21vdW50X3N0YXRlKTsKIAorCQkJLyoKKwkJCSAqIFdlIGhhdmUgdG8gdW5sb2NrIHN1cGVyIHNvIHRoYXQgd2UgY2FuIHdhaXQgZm9yCisJCQkgKiB0cmFuc2FjdGlvbnMuCisJCQkgKi8KKwkJCXVubG9ja19zdXBlcihzYik7CiAJCQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKKwkJCWxvY2tfc3VwZXIoc2IpOwogCQl9IGVsc2UgewogCQkJX19sZTMyIHJldDsKIAkJCWlmICgocmV0ID0gRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCkBAIC0yNDgxLDE5ICsyNTAxLDE5IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7Ci0JZXh0NF9mc2Jsa190IG92ZXJoZWFkOwotCWludCBpOwogCXU2NCBmc2lkOwogCi0JaWYgKHRlc3Rfb3B0IChzYiwgTUlOSVhfREYpKQotCQlvdmVyaGVhZCA9IDA7Ci0JZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgbmdyb3VwczsKLQkJbmdyb3VwcyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKKwlpZiAodGVzdF9vcHQoc2IsIE1JTklYX0RGKSkgeworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IDA7CisJfSBlbHNlIGlmIChzYmktPnNfYmxvY2tzX2xhc3QgIT0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQl1bnNpZ25lZCBsb25nIG5ncm91cHMgPSBzYmktPnNfZ3JvdXBzX2NvdW50LCBpOworCQlleHQ0X2ZzYmxrX3Qgb3ZlcmhlYWQgPSAwOwogCQlzbXBfcm1iKCk7CiAKIAkJLyoKLQkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpCisJCSAqIENvbXB1dGUgdGhlIG92ZXJoZWFkIChGUyBzdHJ1Y3R1cmVzKS4gIFRoaXMgaXMgY29uc3RhbnQKKwkJICogZm9yIGEgZ2l2ZW4gZmlsZXN5c3RlbSB1bmxlc3MgdGhlIG51bWJlciBvZiBibG9jayBncm91cHMKKwkJICogY2hhbmdlcyBzbyB3ZSBjYWNoZSB0aGUgcHJldmlvdXMgdmFsdWUgdW50aWwgaXQgZG9lcy4KIAkJICovCiAKIAkJLyoKQEAgLTI1MTcsMTggKzI1MzcsMjMgQEAKIAkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jawogCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KIAkJICovCi0JCW92ZXJoZWFkICs9IChuZ3JvdXBzICogKDIgKyBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSk7CisJCW92ZXJoZWFkICs9IG5ncm91cHMgKiAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKTsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSBvdmVyaGVhZDsKKwkJc21wX3dtYigpOworCQlzYmktPnNfYmxvY2tzX2xhc3QgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOwogCX0KIAogCWJ1Zi0+Zl90eXBlID0gRVhUNF9TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7Ci0JYnVmLT5mX2Jsb2NrcyA9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9ibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChlcykgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKIAlidWYtPmZfYmZyZWUgPSBwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gZXh0NF9yX2Jsb2Nrc19jb3VudChlcyk7CiAJaWYgKGJ1Zi0+Zl9iZnJlZSA8IGV4dDRfcl9ibG9ja3NfY291bnQoZXMpKQogCQlidWYtPmZfYmF2YWlsID0gMDsKIAlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpOwogCWJ1Zi0+Zl9mZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfZmZyZWUpOwogCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUNF9OQU1FX0xFTjsKIAlmc2lkID0gbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCkgXgogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2Rpci5jIGIvZnMvZmF0L2Rpci5jCmluZGV4IGNjZjE2MWQuLjcyY2JjZDYgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9kaXIuYworKysgYi9mcy9mYXQvZGlyLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCXdjaGFyX3QgYnVmdW5hbWVbMTRdOwogCXVuc2lnbmVkIGNoYXIgeGxhdGVfbGVuLCBucl9zbG90czsKIAl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIHdvcmtbOF0sIGJ1Zm5hbWVbMjYwXTsJLyogMjU2ICsgNCAqLworCXVuc2lnbmVkIGNoYXIgd29ya1tNU0RPU19OQU1FXSwgYnVmbmFtZVsyNjBdOwkvKiAyNTYgKyA0ICovCiAJaW50IHVuaV94bGF0ZSA9IHNiaS0+b3B0aW9ucy51bmljb2RlX3hsYXRlOwogCWludCB1dGY4ID0gc2JpLT5vcHRpb25zLnV0Zjg7CiAJaW50IGFueWNhc2UgPSAoc2JpLT5vcHRpb25zLm5hbWVfY2hlY2sgIT0gJ3MnKTsKQEAgLTM1MSw3ICszNTEsOCBAQAogCQlpZiAod29ya1swXSA9PSAweDA1KQogCQkJd29ya1swXSA9IDB4RTU7CiAJCWZvciAoaSA9IDAsIGogPSAwLCBsYXN0X3UgPSAwOyBpIDwgODspIHsKLQkJCWlmICghd29ya1tpXSkgYnJlYWs7CisJCQlpZiAoIXdvcmtbaV0pCisJCQkJYnJlYWs7CiAJCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaV0sIDggLSBpLAogCQkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCiAJCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0JBU0UpOwpAQCAtMzY1LDEzICszNjYsMTUgQEAKIAkJfQogCQlqID0gbGFzdF91OwogCQlmYXRfc2hvcnQydW5pKG5sc19kaXNrLCAiLiIsIDEsICZidWZ1bmFtZVtqKytdKTsKLQkJZm9yIChpID0gMDsgaSA8IDM7KSB7Ci0JCQlpZiAoIWRlLT5leHRbaV0pIGJyZWFrOwotCQkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZkZS0+ZXh0W2ldLCAzIC0gaSwKKwkJZm9yIChpID0gODsgaSA8IE1TRE9TX05BTUU7KSB7CisJCQlpZiAoIXdvcmtbaV0pCisJCQkJYnJlYWs7CisJCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaV0sCisJCQkJCQlNU0RPU19OQU1FIC0gaSwKIAkJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAogCQkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9FWFQpOwogCQkJaWYgKGNobCA8PSAxKSB7Ci0JCQkJaWYgKGRlLT5leHRbaV0gIT0gJyAnKQorCQkJCWlmICh3b3JrW2ldICE9ICcgJykKIAkJCQkJbGFzdF91ID0gajsKIAkJCX0gZWxzZSB7CiAJCQkJbGFzdF91ID0gajsKQEAgLTQ0NSw3ICs0NDgsNyBAQAogCWludCBmaWxsX2xlbjsKIAl3Y2hhcl90IGJ1ZnVuYW1lWzE0XTsKIAl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIGMsIHdvcmtbOF0sIGJ1Zm5hbWVbNTZdLCAqcHRuYW1lID0gYnVmbmFtZTsKKwl1bnNpZ25lZCBjaGFyIGMsIHdvcmtbTVNET1NfTkFNRV0sIGJ1Zm5hbWVbNTZdLCAqcHRuYW1lID0gYnVmbmFtZTsKIAl1bnNpZ25lZCBsb25nIGxwb3MsIGR1bW15LCAqZnVycmZ1ID0gJmxwb3M7CiAJaW50IHVuaV94bGF0ZSA9IHNiaS0+b3B0aW9ucy51bmljb2RlX3hsYXRlOwogCWludCBpc3ZmYXQgPSBzYmktPm9wdGlvbnMuaXN2ZmF0OwpAQCAtNTI3LDcgKzUzMCw4IEBACiAJaWYgKHdvcmtbMF0gPT0gMHgwNSkKIAkJd29ya1swXSA9IDB4RTU7CiAJZm9yIChpID0gMCwgaiA9IDAsIGxhc3QgPSAwLCBsYXN0X3UgPSAwOyBpIDwgODspIHsKLQkJaWYgKCEoYyA9IHdvcmtbaV0pKSBicmVhazsKKwkJaWYgKCEoYyA9IHdvcmtbaV0pKQorCQkJYnJlYWs7CiAJCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmd29ya1tpXSwgOCAtIGksCiAJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAogCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0JBU0UpOwpAQCAtNTQ5LDkgKzU1MywxMCBAQAogCWogPSBsYXN0X3U7CiAJZmF0X3Nob3J0MnVuaShubHNfZGlzaywgIi4iLCAxLCAmYnVmdW5hbWVbaisrXSk7CiAJcHRuYW1lW2krK10gPSAnLic7Ci0JZm9yIChpMiA9IDA7IGkyIDwgMzspIHsKLQkJaWYgKCEoYyA9IGRlLT5leHRbaTJdKSkgYnJlYWs7Ci0JCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmZGUtPmV4dFtpMl0sIDMgLSBpMiwKKwlmb3IgKGkyID0gODsgaTIgPCBNU0RPU19OQU1FOykgeworCQlpZiAoIShjID0gd29ya1tpMl0pKQorCQkJYnJlYWs7CisJCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmd29ya1tpMl0sIE1TRE9TX05BTUUgLSBpMiwKIAkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCiAJCQkJCWRlLT5sY2FzZSAmIENBU0VfTE9XRVJfRVhUKTsKIAkJaWYgKGNobCA8PSAxKSB7CkBAIC01NjMsOCArNTY4LDggQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWxhc3RfdSA9IGo7Ci0JCQlmb3IgKGNoaSA9IDA7IGNoaSA8IGNobCAmJiBpMiA8IDM7IGNoaSsrKSB7Ci0JCQkJcHRuYW1lW2krK10gPSBkZS0+ZXh0W2kyKytdOworCQkJZm9yIChjaGkgPSAwOyBjaGkgPCBjaGwgJiYgaTIgPCBNU0RPU19OQU1FOyBjaGkrKykgeworCQkJCXB0bmFtZVtpKytdID0gd29ya1tpMisrXTsKIAkJCQlsYXN0ID0gaTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdGVudC5jIGIvZnMvZmF0L2ZhdGVudC5jCmluZGV4IGFiMTcxZWEuLjJjMWI3M2YgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9mYXRlbnQuYworKysgYi9mcy9mYXQvZmF0ZW50LmMKQEAgLTE3LDYgKzE3LDggQEAKIAlpbnQgKCplbnRfbmV4dCkoc3RydWN0IGZhdF9lbnRyeSAqKTsKIH07CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZmF0MTJfZW50cnlfbG9jayk7CisKIHN0YXRpYyB2b2lkIGZhdDEyX2VudF9ibG9ja25yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlbnRyeSwKIAkJCSAgICAgIGludCAqb2Zmc2V0LCBzZWN0b3JfdCAqYmxvY2tucikKIHsKQEAgLTExNiwxMCArMTE4LDEzIEBACiAJdTggKiplbnQxMl9wID0gZmF0ZW50LT51LmVudDEyX3A7CiAJaW50IG5leHQ7CiAKKwlzcGluX2xvY2soJmZhdDEyX2VudHJ5X2xvY2spOwogCWlmIChmYXRlbnQtPmVudHJ5ICYgMSkKIAkJbmV4dCA9ICgqZW50MTJfcFswXSA+PiA0KSB8ICgqZW50MTJfcFsxXSA8PCA0KTsKIAllbHNlCiAJCW5leHQgPSAoKmVudDEyX3BbMV0gPDwgOCkgfCAqZW50MTJfcFswXTsKKwlzcGluX3VubG9jaygmZmF0MTJfZW50cnlfbG9jayk7CisKIAluZXh0ICY9IDB4MGZmZjsKIAlpZiAobmV4dCA+PSBCQURfRkFUMTIpCiAJCW5leHQgPSBGQVRfRU5UX0VPRjsKQEAgLTE1MSw2ICsxNTYsNyBAQAogCWlmIChuZXcgPT0gRkFUX0VOVF9FT0YpCiAJCW5ldyA9IEVPRl9GQVQxMjsKIAorCXNwaW5fbG9jaygmZmF0MTJfZW50cnlfbG9jayk7CiAJaWYgKGZhdGVudC0+ZW50cnkgJiAxKSB7CiAJCSplbnQxMl9wWzBdID0gKG5ldyA8PCA0KSB8ICgqZW50MTJfcFswXSAmIDB4MGYpOwogCQkqZW50MTJfcFsxXSA9IG5ldyA+PiA0OwpAQCAtMTU4LDYgKzE2NCw3IEBACiAJCSplbnQxMl9wWzBdID0gbmV3ICYgMHhmZjsKIAkJKmVudDEyX3BbMV0gPSAoKmVudDEyX3BbMV0gJiAweGYwKSB8IChuZXcgPj4gOCk7CiAJfQorCXNwaW5fdW5sb2NrKCZmYXQxMl9lbnRyeV9sb2NrKTsKIAogCW1hcmtfYnVmZmVyX2RpcnR5KGZhdGVudC0+YmhzWzBdKTsKIAlpZiAoZmF0ZW50LT5ucl9iaHMgPT0gMikKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggNDc5NzIyZC4uMGE3ZGRiMyAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KQEAgLTM1NCw4ICszNTUsNyBAQAogCX0gZWxzZSB7IC8qIG5vdCBhIGRpcmVjdG9yeSAqLwogCQlpbm9kZS0+aV9nZW5lcmF0aW9uIHw9IDE7CiAJCWlub2RlLT5pX21vZGUgPSBNU0RPU19NS01PREUoZGUtPmF0dHIsCi0JCSAgICAoKHNiaS0+b3B0aW9ucy5zaG93ZXhlYyAmJgotCQkJIWlzX2V4ZWMoZGUtPmV4dCkpCisJCSAgICAoKHNiaS0+b3B0aW9ucy5zaG93ZXhlYyAmJiAhaXNfZXhlYyhkZS0+bmFtZSArIDgpKQogCQkJPyBTX0lSVUdPfFNfSVdVR08gOiBTX0lSV1hVR08pCiAJCSAgICAmIH5zYmktPm9wdGlvbnMuZnNfZm1hc2spIHwgU19JRlJFRzsKIAkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSBsZTE2X3RvX2NwdShkZS0+c3RhcnQpOwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmgKaW5kZXggOGE0ZGZlZi4uM2M5NmQ2ZSAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaAorKysgYi9mcy9mcmVldnhmcy92eGZzX2Rpci5oCkBAIC04MCw3ICs4MCw3IEBACiAgKglhIGRfbmFtZSB3aXRoIHNpemUgbGVuLgogICovCiAjZGVmaW5lIFZYRlNfRElSUEFECQk0Ci0jZGVmaW5lIFZYRlNfTkFNRU1JTgkJKChpbnQpKChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikwKS0+ZF9uYW1lKQorI2RlZmluZSBWWEZTX05BTUVNSU4JCW9mZnNldG9mKHN0cnVjdCB2eGZzX2RpcmVjdCwgZF9uYW1lKQogI2RlZmluZSBWWEZTX0RJUlJPVU5EKGxlbikJKChWWEZTX0RJUlBBRCArIChsZW4pIC0gMSkgJiB+KFZYRlNfRElSUEFEIC0xKSkKICNkZWZpbmUgVlhGU19ESVJMRU4obGVuKQkoVlhGU19ESVJST1VORChWWEZTX05BTUVNSU4gKyAobGVuKSkpCiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZWFvcHMuYyBiL2ZzL2dmczIvZWFvcHMuYwppbmRleCBjMWY0NDAwLi4xYWIzZTlkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2Vhb3BzLmMKKysrIGIvZnMvZ2ZzMi9lYW9wcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L2xtX2ludGVyZmFjZS5oPgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMgYi9mcy9nZnMyL29wc19leHBvcnQuYwppbmRleCA5OWVhNTY1Li5iODMxMmVkIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19leHBvcnQuYworKysgYi9mcy9nZnMyL29wc19leHBvcnQuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2J0cmVlLmMgYi9mcy9oZnNwbHVzL2J0cmVlLmMKaW5kZXggOTBlYmFiNy4uMDUwZDI5YyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9idHJlZS5jCisrKyBiL2ZzL2hmc3BsdXMvYnRyZWUuYwpAQCAtNjIsOCArNjIsMTAgQEAKIAkJaWYgKChIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfSEZTWCkgJiYKIAkJICAgIChoZWFkLT5rZXlfdHlwZSA9PSBIRlNQTFVTX0tFWV9CSU5BUlkpKQogCQkJdHJlZS0+a2V5Y21wID0gaGZzcGx1c19jYXRfYmluX2NtcF9rZXk7Ci0JCWVsc2UKKwkJZWxzZSB7CiAJCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2NhdF9jYXNlX2NtcF9rZXk7CisJCQlIRlNQTFVTX1NCKHNiKS5mbGFncyB8PSBIRlNQTFVTX1NCX0NBU0VGT0xEOworCQl9CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVua25vd24gQipUcmVlIHJlcXVlc3RlZFxuIik7CiAJCWdvdG8gZmFpbF9wYWdlOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9kaXIuYyBiL2ZzL2hmc3BsdXMvZGlyLmMKaW5kZXggODBiNTY4Mi4uMTk1NWVlNiAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9kaXIuYworKysgYi9mcy9oZnNwbHVzL2Rpci5jCkBAIC0zNiw2ICszNiw4IEBACiAJdTE2IHR5cGU7CiAKIAlzYiA9IGRpci0+aV9zYjsKKworCWRlbnRyeS0+ZF9vcCA9ICZoZnNwbHVzX2RlbnRyeV9vcGVyYXRpb25zOwogCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOwogCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYikuY2F0X3RyZWUsICZmZCk7CiAJaGZzcGx1c19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBkaXItPmlfaW5vLCAmZGVudHJ5LT5kX25hbWUpOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmggYi9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaAppbmRleCAzOTE1NjM1Li5kOWY1ZWRhIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaAorKysgYi9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaApAQCAtMTUwLDYgKzE1MCw3IEBACiAjZGVmaW5lIEhGU1BMVVNfU0JfTk9ERUNPTVBPU0UJMHgwMDAyCiAjZGVmaW5lIEhGU1BMVVNfU0JfRk9SQ0UJMHgwMDA0CiAjZGVmaW5lIEhGU1BMVVNfU0JfSEZTWAkJMHgwMDA4CisjZGVmaW5lIEhGU1BMVVNfU0JfQ0FTRUZPTEQJMHgwMDEwCiAKIAogc3RydWN0IGhmc3BsdXNfaW5vZGVfaW5mbyB7CkBAIC0zMjEsNiArMzIyLDcgQEAKIC8qIGlub2RlLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc3BsdXNfYW9wczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc3BsdXNfYnRyZWVfYW9wczsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaGZzcGx1c19kZW50cnlfb3BlcmF0aW9uczsKIAogdm9pZCBoZnNwbHVzX2lub2RlX3JlYWRfZm9yayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKik7CiB2b2lkIGhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKik7CkBAIC0zNTMsNiArMzU1LDggQEAKIGludCBoZnNwbHVzX3N0cmNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKiwgY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICopOwogaW50IGhmc3BsdXNfdW5pMmFzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICosIGNoYXIgKiwgaW50ICopOwogaW50IGhmc3BsdXNfYXNjMnVuaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGhmc3BsdXNfdW5pc3RyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBoZnNwbHVzX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnN0cik7CitpbnQgaGZzcGx1c19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpzMSwgc3RydWN0IHFzdHIgKnMyKTsKIAogLyogd3JhcHBlci5jICovCiBpbnQgaGZzcGx1c19yZWFkX3dyYXBwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9pbm9kZS5jIGIvZnMvaGZzcGx1cy9pbm9kZS5jCmluZGV4IDQwOWNlNTQuLjZmN2M2NjIgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvaW5vZGUuYworKysgYi9mcy9oZnNwbHVzL2lub2RlLmMKQEAgLTEzMSw2ICsxMzEsMTEgQEAKIAkud3JpdGVwYWdlcwk9IGhmc3BsdXNfd3JpdGVwYWdlcywKIH07CiAKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBoZnNwbHVzX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2hhc2ggICAgICAgPSBoZnNwbHVzX2hhc2hfZGVudHJ5LAorCS5kX2NvbXBhcmUgICAgPSBoZnNwbHVzX2NvbXBhcmVfZGVudHJ5LAorfTsKKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmhmc3BsdXNfZmlsZV9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvc3VwZXIuYyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwppbmRleCBlYmQxYjM4Li42ZDg3YTJhIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3N1cGVyLmMKKysrIGIvZnMvaGZzcGx1cy9zdXBlci5jCkBAIC0yODMsMTEgKzI4MywxMCBAQAogCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IE5VTEw7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChzYmksIDAsIHNpemVvZihIRlNQTFVTX1NCKHNiKSkpOwogCXNiLT5zX2ZzX2luZm8gPSBzYmk7CiAJSU5JVF9ITElTVF9IRUFEKCZzYmktPnJzcmNfaW5vZGVzKTsKIAloZnNwbHVzX2ZpbGxfZGVmYXVsdHMoc2JpKTsKQEAgLTM4MSw2ICszODAsNyBAQAogCQlpcHV0KHJvb3QpOwogCQlnb3RvIGNsZWFudXA7CiAJfQorCXNiLT5zX3Jvb3QtPmRfb3AgPSAmaGZzcGx1c19kZW50cnlfb3BlcmF0aW9uczsKIAogCXN0ci5sZW4gPSBzaXplb2YoSEZTUF9ISURERU5ESVJfTkFNRSkgLSAxOwogCXN0ci5uYW1lID0gSEZTUF9ISURERU5ESVJfTkFNRTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvdW5pY29kZS5jIGIvZnMvaGZzcGx1cy91bmljb2RlLmMKaW5kZXggNjg5YzhiZC4uOWUxMGY5NCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy91bmljb2RlLmMKKysrIGIvZnMvaGZzcGx1cy91bmljb2RlLmMKQEAgLTIzOSw2MSArMjM5LDIwMSBAQAogCXJldHVybiByZXM7CiB9CiAKLWludCBoZnNwbHVzX2FzYzJ1bmkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGhmc3BsdXNfdW5pc3RyICp1c3RyLCBjb25zdCBjaGFyICphc3RyLCBpbnQgbGVuKQorLyoKKyAqIENvbnZlcnQgb25lIG9yIG1vcmUgQVNDSUkgY2hhcmFjdGVycyBpbnRvIGEgc2luZ2xlIHVuaWNvZGUgY2hhcmFjdGVyLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIEFTQ0lJIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgdW5pY29kZSBjaGFyLgorICovCitzdGF0aWMgaW5saW5lIGludCBhc2MydW5pY2hhcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICphc3RyLCBpbnQgbGVuLAorCQkJICAgICAgd2NoYXJfdCAqdWMpCiB7Ci0Jc3RydWN0IG5sc190YWJsZSAqbmxzID0gSEZTUExVU19TQihzYikubmxzOwotCWludCBzaXplLCBvZmYsIGRlY29tcG9zZTsKKwlpbnQgc2l6ZSA9IEhGU1BMVVNfU0Ioc2IpLm5scy0+Y2hhcjJ1bmkoYXN0ciwgbGVuLCB1Yyk7CisJaWYgKHNpemUgPD0gMCkgeworCQkqdWMgPSAnPyc7CisJCXNpemUgPSAxOworCX0KKwlzd2l0Y2ggKCp1YykgeworCWNhc2UgMHgyNDAwOgorCQkqdWMgPSAwOworCQlicmVhazsKKwljYXNlICc6JzoKKwkJKnVjID0gJy8nOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKKy8qIERlY29tcG9zZXMgYSBzaW5nbGUgdW5pY29kZSBjaGFyYWN0ZXIuICovCitzdGF0aWMgaW5saW5lIHUxNiAqZGVjb21wb3NlX3VuaWNoYXIod2NoYXJfdCB1YywgaW50ICpzaXplKQoreworCWludCBvZmY7CisKKwlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVsodWMgPj4gMTIpICYgMHhmXTsKKwlpZiAob2ZmID09IDAgfHwgb2ZmID09IDB4ZmZmZikKKwkJcmV0dXJuIE5VTEw7CisKKwlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoKHVjID4+IDgpICYgMHhmKV07CisJaWYgKCFvZmYpCisJCXJldHVybiBOVUxMOworCisJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKCh1YyA+PiA0KSAmIDB4ZildOworCWlmICghb2ZmKQorCQlyZXR1cm4gTlVMTDsKKworCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArICh1YyAmIDB4ZildOworCSpzaXplID0gb2ZmICYgMzsKKwlpZiAoKnNpemUgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlICsgKG9mZiAvIDQpOworfQorCitpbnQgaGZzcGx1c19hc2MydW5pKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqdXN0ciwKKwkJICAgIGNvbnN0IGNoYXIgKmFzdHIsIGludCBsZW4pCit7CisJaW50IHNpemUsIGRzaXplLCBkZWNvbXBvc2U7CisJdTE2ICpkc3RyLCBvdXRsZW4gPSAwOwogCXdjaGFyX3QgYzsKLQl1MTYgb3V0bGVuID0gMDsKIAogCWRlY29tcG9zZSA9ICEoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX05PREVDT01QT1NFKTsKLQogCXdoaWxlIChvdXRsZW4gPCBIRlNQTFVTX01BWF9TVFJMRU4gJiYgbGVuID4gMCkgewotCQlzaXplID0gbmxzLT5jaGFyMnVuaShhc3RyLCBsZW4sICZjKTsKLQkJaWYgKHNpemUgPD0gMCkgewotCQkJYyA9ICc/JzsKLQkJCXNpemUgPSAxOwotCQl9Ci0JCWFzdHIgKz0gc2l6ZTsKLQkJbGVuIC09IHNpemU7Ci0JCXN3aXRjaCAoYykgewotCQljYXNlIDB4MjQwMDoKLQkJCWMgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzonOgotCQkJYyA9ICcvJzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjID49IDB4YzAgJiYgZGVjb21wb3NlKSB7Ci0JCQlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVsoYyA+PiAxMikgJiAweGZdOwotCQkJaWYgKCFvZmYpCi0JCQkJZ290byBkb25lOwotCQkJaWYgKG9mZiA9PSAweGZmZmYpIHsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCQlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoKGMgPj4gOCkgJiAweGYpXTsKLQkJCWlmICghb2ZmKQotCQkJCWdvdG8gZG9uZTsKLQkJCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArICgoYyA+PiA0KSAmIDB4ZildOwotCQkJaWYgKCFvZmYpCi0JCQkJZ290byBkb25lOwotCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKGMgJiAweGYpXTsKLQkJCXNpemUgPSBvZmYgJiAzOwotCQkJaWYgKCFzaXplKQotCQkJCWdvdG8gZG9uZTsKLQkJCW9mZiAvPSA0OwotCQkJaWYgKG91dGxlbiArIHNpemUgPiBIRlNQTFVTX01BWF9TVFJMRU4pCisJCXNpemUgPSBhc2MydW5pY2hhcihzYiwgYXN0ciwgbGVuLCAmYyk7CisKKwkJaWYgKGRlY29tcG9zZSAmJiAoZHN0ciA9IGRlY29tcG9zZV91bmljaGFyKGMsICZkc2l6ZSkpKSB7CisJCQlpZiAob3V0bGVuICsgZHNpemUgPiBIRlNQTFVTX01BWF9TVFJMRU4pCiAJCQkJYnJlYWs7CiAJCQlkbyB7Ci0JCQkJdXN0ci0+dW5pY29kZVtvdXRsZW4rK10gPSBjcHVfdG9fYmUxNihoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYrK10pOwotCQkJfSB3aGlsZSAoLS1zaXplID4gMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCWRvbmU6Ci0JCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoYyk7CisJCQkJdXN0ci0+dW5pY29kZVtvdXRsZW4rK10gPSBjcHVfdG9fYmUxNigqZHN0cisrKTsKKwkJCX0gd2hpbGUgKC0tZHNpemUgPiAwKTsKKwkJfSBlbHNlCisJCQl1c3RyLT51bmljb2RlW291dGxlbisrXSA9IGNwdV90b19iZTE2KGMpOworCisJCWFzdHIgKz0gc2l6ZTsKKwkJbGVuIC09IHNpemU7CiAJfQogCXVzdHItPmxlbmd0aCA9IGNwdV90b19iZTE2KG91dGxlbik7CiAJaWYgKGxlbiA+IDApCiAJCXJldHVybiAtRU5BTUVUT09MT05HOwogCXJldHVybiAwOwogfQorCisvKgorICogSGFzaCBhIHN0cmluZyB0byBhbiBpbnRlZ2VyIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgSEZTKyBmaWxlc3lzdGVtLgorICogQ29tcG9zZWQgdW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBkZWNvbXBvc2VkIGFuZCBjYXNlLWZvbGRpbmcgaXMgcGVyZm9ybWVkCisgKiBpZiB0aGUgYXBwcm9wcmlhdGUgYml0cyBhcmUgKHVuKXNldCBvbiB0aGUgc3VwZXJibG9jay4KKyAqLworaW50IGhmc3BsdXNfaGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqc3RyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisJY29uc3QgY2hhciAqYXN0cjsKKwljb25zdCB1MTYgKmRzdHI7CisJaW50IGNhc2Vmb2xkLCBkZWNvbXBvc2UsIHNpemUsIGRzaXplLCBsZW47CisJdW5zaWduZWQgbG9uZyBoYXNoOworCXdjaGFyX3QgYzsKKwl1MTYgYzI7CisKKwljYXNlZm9sZCA9IChIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfQ0FTRUZPTEQpOworCWRlY29tcG9zZSA9ICEoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX05PREVDT01QT1NFKTsKKwloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwlhc3RyID0gc3RyLT5uYW1lOworCWxlbiA9IHN0ci0+bGVuOworCXdoaWxlIChsZW4gPiAwKSB7CisJCXNpemUgPSBhc2MydW5pY2hhcihzYiwgYXN0ciwgbGVuLCAmYyk7CisJCWFzdHIgKz0gc2l6ZTsKKwkJbGVuIC09IHNpemU7CisKKwkJaWYgKGRlY29tcG9zZSAmJiAoZHN0ciA9IGRlY29tcG9zZV91bmljaGFyKGMsICZkc2l6ZSkpKSB7CisJCQlkbyB7CisJCQkJYzIgPSAqZHN0cisrOworCQkJCWlmICghY2FzZWZvbGQgfHwgKGMyID0gY2FzZV9mb2xkKGMyKSkpCisJCQkJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaChjMiwgaGFzaCk7CisJCQl9IHdoaWxlICgtLWRzaXplID4gMCk7CisJCX0gZWxzZSB7CisJCQljMiA9IGM7CisJCQlpZiAoIWNhc2Vmb2xkIHx8IChjMiA9IGNhc2VfZm9sZChjMikpKQorCQkJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaChjMiwgaGFzaCk7CisJCX0KKwl9CisJc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29tcGFyZSBzdHJpbmdzIHdpdGggSEZTKyBmaWxlbmFtZSBvcmRlcmluZy4KKyAqIENvbXBvc2VkIHVuaWNvZGUgY2hhcmFjdGVycyBhcmUgZGVjb21wb3NlZCBhbmQgY2FzZS1mb2xkaW5nIGlzIHBlcmZvcm1lZAorICogaWYgdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlICh1bilzZXQgb24gdGhlIHN1cGVyYmxvY2suCisgKi8KK2ludCBoZnNwbHVzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnMxLCBzdHJ1Y3QgcXN0ciAqczIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwlpbnQgY2FzZWZvbGQsIGRlY29tcG9zZSwgc2l6ZTsKKwlpbnQgZHNpemUxLCBkc2l6ZTIsIGxlbjEsIGxlbjI7CisJY29uc3QgdTE2ICpkc3RyMSwgKmRzdHIyOworCWNvbnN0IGNoYXIgKmFzdHIxLCAqYXN0cjI7CisJdTE2IGMxLCBjMjsKKwl3Y2hhcl90IGM7CisKKwljYXNlZm9sZCA9IChIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfQ0FTRUZPTEQpOworCWRlY29tcG9zZSA9ICEoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX05PREVDT01QT1NFKTsKKwlhc3RyMSA9IHMxLT5uYW1lOworCWxlbjEgPSBzMS0+bGVuOworCWFzdHIyID0gczItPm5hbWU7CisJbGVuMiA9IHMyLT5sZW47CisJZHNpemUxID0gZHNpemUyID0gMDsKKwlkc3RyMSA9IGRzdHIyID0gTlVMTDsKKworCXdoaWxlIChsZW4xID4gMCAmJiBsZW4yID4gMCkgeworCQlpZiAoIWRzaXplMSkgeworCQkJc2l6ZSA9IGFzYzJ1bmljaGFyKHNiLCBhc3RyMSwgbGVuMSwgJmMpOworCQkJYXN0cjEgKz0gc2l6ZTsKKwkJCWxlbjEgLT0gc2l6ZTsKKworCQkJaWYgKCFkZWNvbXBvc2UgfHwgIShkc3RyMSA9IGRlY29tcG9zZV91bmljaGFyKGMsICZkc2l6ZTEpKSkgeworCQkJCWMxID0gYzsKKwkJCQlkc3RyMSA9ICZjMTsKKwkJCQlkc2l6ZTEgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKCFkc2l6ZTIpIHsKKwkJCXNpemUgPSBhc2MydW5pY2hhcihzYiwgYXN0cjIsIGxlbjIsICZjKTsKKwkJCWFzdHIyICs9IHNpemU7CisJCQlsZW4yIC09IHNpemU7CisKKwkJCWlmICghZGVjb21wb3NlIHx8ICEoZHN0cjIgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUyKSkpIHsKKwkJCQljMiA9IGM7CisJCQkJZHN0cjIgPSAmYzI7CisJCQkJZHNpemUyID0gMTsKKwkJCX0KKwkJfQorCisJCWMxID0gKmRzdHIxOworCQljMiA9ICpkc3RyMjsKKwkJaWYgKGNhc2Vmb2xkKSB7CisJCQlpZiAgKCEoYzEgPSBjYXNlX2ZvbGQoYzEpKSkgeworCQkJCWRzdHIxKys7CisJCQkJZHNpemUxLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIShjMiA9IGNhc2VfZm9sZChjMikpKSB7CisJCQkJZHN0cjIrKzsKKwkJCQlkc2l6ZTItLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoYzEgPCBjMikKKwkJCXJldHVybiAtMTsKKwkJZWxzZSBpZiAoYzEgPiBjMikKKwkJCXJldHVybiAxOworCisJCWRzdHIxKys7CisJCWRzaXplMS0tOworCQlkc3RyMisrOworCQlkc2l6ZTItLTsKKwl9CisKKwlpZiAobGVuMSA8IGxlbjIpCisJCXJldHVybiAtMTsKKwlpZiAobGVuMSA+IGxlbjIpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaHVnZXRsYmZzL2lub2RlLmMgYi9mcy9odWdldGxiZnMvaW5vZGUuYwppbmRleCBlNmI0NmIzLi5kMTQ1Y2I3IDEwMDY0NAotLS0gYS9mcy9odWdldGxiZnMvaW5vZGUuYworKysgYi9mcy9odWdldGxiZnMvaW5vZGUuYwpAQCAtMTMsMTUgKzEzLDE4IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDcsNiArNTAsMjEgQEAKIAogaW50IHN5c2N0bF9odWdldGxiX3NobV9ncm91cDsKIAorZW51bSB7CisJT3B0X3NpemUsIE9wdF9ucl9pbm9kZXMsCisJT3B0X21vZGUsIE9wdF91aWQsIE9wdF9naWQsCisJT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X3NpemUsCSJzaXplPSVzIn0sCisJe09wdF9ucl9pbm9kZXMsCSJucl9pbm9kZXM9JXMifSwKKwl7T3B0X21vZGUsCSJtb2RlPSVvIn0sCisJe09wdF91aWQsCSJ1aWQ9JXUifSwKKwl7T3B0X2dpZCwJImdpZD0ldSJ9LAorCXtPcHRfZXJyLAlOVUxMfSwKK307CisKIHN0YXRpYyB2b2lkIGh1Z2VfcGFnZXZlY19yZWxlYXNlKHN0cnVjdCBwYWdldmVjICpwdmVjKQogewogCWludCBpOwpAQCAtNTk0LDQ2ICs2MTIsNzMgQEAKIHN0YXRpYyBpbnQKIGh1Z2V0bGJmc19wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBodWdldGxiZnNfY29uZmlnICpwY29uZmlnKQogewotCWNoYXIgKm9wdCwgKnZhbHVlLCAqcmVzdDsKKwljaGFyICpwLCAqcmVzdDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IG9wdGlvbjsKIAogCWlmICghb3B0aW9ucykKIAkJcmV0dXJuIDA7Ci0Jd2hpbGUgKChvcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKLQkJaWYgKCEqb3B0KQorCisJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbjsKKwkJaWYgKCEqcCkKIAkJCWNvbnRpbnVlOwogCi0JCXZhbHVlID0gc3RyY2hyKG9wdCwgJz0nKTsKLQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UKLQkJCSp2YWx1ZSsrID0gJ1wwJzsKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorIAkJCQlnb3RvIGJhZF92YWw7CisJCQlwY29uZmlnLT51aWQgPSBvcHRpb247CisJCQlicmVhazsKIAotCQlpZiAoIXN0cmNtcChvcHQsICJ1aWQiKSkKLQkJCXBjb25maWctPnVpZCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOwotCQllbHNlIGlmICghc3RyY21wKG9wdCwgImdpZCIpKQotCQkJcGNvbmZpZy0+Z2lkID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7Ci0JCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAibW9kZSIpKQotCQkJcGNvbmZpZy0+bW9kZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCZ2YWx1ZSwwKSAmIDA3NzdVOwotCQllbHNlIGlmICghc3RyY21wKG9wdCwgInNpemUiKSkgewotCQkJdW5zaWduZWQgbG9uZyBsb25nIHNpemUgPSBtZW1wYXJzZSh2YWx1ZSwgJnJlc3QpOworCQljYXNlIE9wdF9naWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKyAJCQkJZ290byBiYWRfdmFsOworCQkJcGNvbmZpZy0+Z2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisKKwkJY2FzZSBPcHRfbW9kZToKKwkJCWlmIChtYXRjaF9vY3RhbCgmYXJnc1swXSwgJm9wdGlvbikpCisgCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXBjb25maWctPm1vZGUgPSBvcHRpb24gJiAwNzc3VTsKKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X3NpemU6IHsKKyAJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKwkJCS8qIG1lbXBhcnNlKCkgd2lsbCBhY2NlcHQgYSBLL00vRyB3aXRob3V0IGEgZGlnaXQgKi8KKwkJCWlmICghaXNkaWdpdCgqYXJnc1swXS5mcm9tKSkKKwkJCQlnb3RvIGJhZF92YWw7CisJCQlzaXplID0gbWVtcGFyc2UoYXJnc1swXS5mcm9tLCAmcmVzdCk7CiAJCQlpZiAoKnJlc3QgPT0gJyUnKSB7CiAJCQkJc2l6ZSA8PD0gSFBBR0VfU0hJRlQ7CiAJCQkJc2l6ZSAqPSBtYXhfaHVnZV9wYWdlczsKIAkJCQlkb19kaXYoc2l6ZSwgMTAwKTsKLQkJCQlyZXN0Kys7CiAJCQl9CiAJCQlwY29uZmlnLT5ucl9ibG9ja3MgPSAoc2l6ZSA+PiBIUEFHRV9TSElGVCk7Ci0JCQl2YWx1ZSA9IHJlc3Q7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsIm5yX2lub2RlcyIpKSB7Ci0JCQlwY29uZmlnLT5ucl9pbm9kZXMgPSBtZW1wYXJzZSh2YWx1ZSwgJnJlc3QpOwotCQkJdmFsdWUgPSByZXN0OwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KIAotCQlpZiAoKnZhbHVlKQorCQljYXNlIE9wdF9ucl9pbm9kZXM6CisJCQkvKiBtZW1wYXJzZSgpIHdpbGwgYWNjZXB0IGEgSy9NL0cgd2l0aG91dCBhIGRpZ2l0ICovCisJCQlpZiAoIWlzZGlnaXQoKmFyZ3NbMF0uZnJvbSkpCisJCQkJZ290byBiYWRfdmFsOworCQkJcGNvbmZpZy0+bnJfaW5vZGVzID0gbWVtcGFyc2UoYXJnc1swXS5mcm9tLCAmcmVzdCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJodWdldGxiZnM6IEJhZCBtb3VudCBvcHRpb246IFwiJXNcIlxuIiwKKwkJCQkgcCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAJfQogCXJldHVybiAwOworCitiYWRfdmFsOgorIAlwcmludGsoS0VSTl9FUlIgImh1Z2V0bGJmczogQmFkIHZhbHVlICclcycgZm9yIG1vdW50IG9wdGlvbiAnJXMnXG4iLAorCSAgICAgICBhcmdzWzBdLmZyb20sIHApOworIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludApAQCAtNjUxLDcgKzY5Niw2IEBACiAJY29uZmlnLmdpZCA9IGN1cnJlbnQtPmZzZ2lkOwogCWNvbmZpZy5tb2RlID0gMDc1NTsKIAlyZXQgPSBodWdldGxiZnNfcGFyc2Vfb3B0aW9ucyhkYXRhLCAmY29uZmlnKTsKLQogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IDlhMDEyY2MuLjMyMGUwODggMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCW1hcHBpbmctPmFfb3BzID0gJmVtcHR5X2FvcHM7CiAgCQltYXBwaW5nLT5ob3N0ID0gaW5vZGU7CiAJCW1hcHBpbmctPmZsYWdzID0gMDsKLQkJbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgR0ZQX0hJR0hVU0VSKTsKKwkJbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRSk7CiAJCW1hcHBpbmctPmFzc29jX21hcHBpbmcgPSBOVUxMOwogCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKIApAQCAtNDYyLDYgKzQ2MiwxMSBAQAogCXJldHVybiAoaW5vZGVzX3N0YXQubnJfdW51c2VkIC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgaWNhY2hlX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBzaHJpbmtfaWNhY2hlX21lbW9yeSwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKKwogc3RhdGljIHZvaWQgX193YWl0X29uX2ZyZWVpbmdfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAvKgogICogQ2FsbGVkIHdpdGggdGhlIGlub2RlIGxvY2sgaGVsZC4KQEAgLTUxOSw3ICs1MjQsMTMgQEAKICAqCW5ld19pbm9kZSAJLSBvYnRhaW4gYW4gaW5vZGUKICAqCUBzYjogc3VwZXJibG9jawogICoKLSAqCUFsbG9jYXRlcyBhIG5ldyBpbm9kZSBmb3IgZ2l2ZW4gc3VwZXJibG9jay4KKyAqCUFsbG9jYXRlcyBhIG5ldyBpbm9kZSBmb3IgZ2l2ZW4gc3VwZXJibG9jay4gVGhlIGRlZmF1bHQgZ2ZwX21hc2sKKyAqCWZvciBhbGxvY2F0aW9ucyByZWxhdGVkIHRvIGlub2RlLT5pX21hcHBpbmcgaXMgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRS4KKyAqCUlmIEhJR0hNRU0gcGFnZXMgYXJlIHVuc3VpdGFibGUgb3IgaXQgaXMga25vd24gdGhhdCBwYWdlcyBhbGxvY2F0ZWQKKyAqCWZvciB0aGUgcGFnZSBjYWNoZSBhcmUgbm90IHJlY2xhaW1hYmxlIG9yIG1pZ3JhdGFibGUsCisgKgltYXBwaW5nX3NldF9nZnBfbWFzaygpIG11c3QgYmUgY2FsbGVkIHdpdGggc3VpdGFibGUgZmxhZ3Mgb24gdGhlCisgKgluZXdseSBjcmVhdGVkIGlub2RlJ3MgbWFwcGluZworICoKICAqLwogc3RydWN0IGlub2RlICpuZXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKQEAgLTEzNzksNyArMTM5MCw3IEBACiAJCQkJCSBTTEFCX01FTV9TUFJFQUQpLAogCQkJCQkgaW5pdF9vbmNlLAogCQkJCQkgTlVMTCk7Ci0Jc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHNocmlua19pY2FjaGVfbWVtb3J5KTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmaWNhY2hlX3Nocmlua2VyKTsKIAogCS8qIEhhc2ggbWF5IGhhdmUgYmVlbiBzZXQgdXAgaW4gaW5vZGVfaW5pdF9lYXJseSAqLwogCWlmICghaGFzaGRpc3QpCmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCA4YzkwY2JjLi5jMmE3NzNlIDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgpAQCAtMjEsNyArMjAsNiBAQAogCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgZXJyb3IgPSAtRU5PVFRZOwotCXZvaWQgKmY7CiAKIAlpZiAoIWZpbHAtPmZfb3ApCiAJCWdvdG8gb3V0OwpAQCAtMzEsMTYgKzI5LDEwIEBACiAJCWlmIChlcnJvciA9PSAtRU5PSU9DVExDTUQpCiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoKGYgPSBmaWxwLT5mX29wLT5pb2N0bCkpIHsKKwl9IGVsc2UgaWYgKGZpbHAtPmZfb3AtPmlvY3RsKSB7CiAJCWxvY2tfa2VybmVsKCk7Ci0JCWlmICghZmlscC0+Zl9vcC0+aW9jdGwpIHsKLQkJCXByaW50aygiJXM6IGlvY3RsICVwIGRpc2FwcGVhcmVkXG4iLCBfX0ZVTkNUSU9OX18sIGYpOwotCQkJcHJpbnRfc3ltYm9sKCJzeW1ib2w6ICVzXG4iLCAodW5zaWduZWQgbG9uZylmKTsKLQkJCWR1bXBfc3RhY2soKTsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0gZmlscC0+Zl9vcC0+aW9jdGwoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKLQkJCQkJCSAgZmlscCwgY21kLCBhcmcpOwotCQl9CisJCWVycm9yID0gZmlscC0+Zl9vcC0+aW9jdGwoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJICBmaWxwLCBjbWQsIGFyZyk7CiAJCXVubG9ja19rZXJuZWwoKTsKIAl9CiAKQEAgLTE4MiwxMSArMTc0LDMgQEAKICBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQotCi0vKgotICogUGxhdGZvcm1zIGltcGxlbWVudGluZyAzMiBiaXQgY29tcGF0aWJpbGl0eSBpb2N0bCBoYW5kbGVycyBpbgotICogbW9kdWxlcyBuZWVkIHRoaXMgZXhwb3J0ZWQKLSAqLwotI2lmZGVmIENPTkZJR19DT01QQVQKLUVYUE9SVF9TWU1CT0woc3lzX2lvY3RsKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvZGlyLmMgYi9mcy9pc29mcy9kaXIuYwppbmRleCAwZTk0YzMxLi4xYmE0MDdjIDEwMDY0NAotLS0gYS9mcy9pc29mcy9kaXIuYworKysgYi9mcy9pc29mcy9kaXIuYwpAQCAtNywzNCArNywxOCBAQAogICoKICAqICBTdGV2ZSBCZXlub24JCSAgICAgICA6IE1pc3NpbmcgbGFzdCBkaXJlY3RvcnkgZW50cmllcyBmaXhlZAogICogIChzdGVwaGVuQGFza29uZS5kZW1vbi5jby51aykgICAgICA6IDIxc3QgSnVuZSAxOTk2Ci0gKiAKKyAqCiAgKiAgaXNvZnMgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucwogICovCiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlICJpc29mcy5oIgogCi1zdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwotCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9vcGVyYXRpb25zID0KLXsKLQkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAotCS5yZWFkZGlyCT0gaXNvZnNfcmVhZGRpciwKLX07Ci0KLS8qCi0gKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLgotICovCi1jb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBpc29mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Ci17Ci0JLmxvb2t1cAkJPSBpc29mc19sb29rdXAsCi19OwotCiBpbnQgaXNvZnNfbmFtZV90cmFuc2xhdGUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSwgY2hhciAqbmV3LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWNoYXIgKiBvbGQgPSBkZS0+bmFtZTsKIAlpbnQgbGVuID0gZGUtPm5hbWVfbGVuWzBdOwogCWludCBpOwotCQkJCisKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKIAkJdW5zaWduZWQgY2hhciBjID0gb2xkW2ldOwogCQlpZiAoIWMpCkBAIC02MiwyMiArNDYsMjcgQEAKIH0KIAogLyogQWNvcm4gZXh0ZW5zaW9ucyB3cml0dGVuIGJ5IE1hdHRoZXcgV2lsY294IDx3aWxseUBib2ZoLmFpPiAxOTk4ICovCi1pbnQgZ2V0X2Fjb3JuX2ZpbGVuYW1lKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIGRlLAotCQkJICAgIGNoYXIgKiByZXRuYW1lLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK2ludCBnZXRfYWNvcm5fZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSwKKwkJCSAgICBjaGFyICpyZXRuYW1lLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWludCBzdGQ7Ci0JdW5zaWduZWQgY2hhciAqIGNocjsKKwl1bnNpZ25lZCBjaGFyICpjaHI7CiAJaW50IHJldG5hbWxlbiA9IGlzb2ZzX25hbWVfdHJhbnNsYXRlKGRlLCByZXRuYW1lLCBpbm9kZSk7Ci0JaWYgKHJldG5hbWxlbiA9PSAwKSByZXR1cm4gMDsKKworCWlmIChyZXRuYW1sZW4gPT0gMCkKKwkJcmV0dXJuIDA7CiAJc3RkID0gc2l6ZW9mKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCkgKyBkZS0+bmFtZV9sZW5bMF07Ci0JaWYgKHN0ZCAmIDEpIHN0ZCsrOwotCWlmICgoKigodW5zaWduZWQgY2hhciAqKSBkZSkgLSBzdGQpICE9IDMyKSByZXR1cm4gcmV0bmFtbGVuOworCWlmIChzdGQgJiAxKQorCQlzdGQrKzsKKwlpZiAoKCooKHVuc2lnbmVkIGNoYXIgKikgZGUpIC0gc3RkKSAhPSAzMikKKwkJcmV0dXJuIHJldG5hbWxlbjsKIAljaHIgPSAoKHVuc2lnbmVkIGNoYXIgKikgZGUpICsgc3RkOwotCWlmIChzdHJuY21wKGNociwgIkFSQ0hJTUVERVMiLCAxMCkpIHJldHVybiByZXRuYW1sZW47Ci0JaWYgKCgqcmV0bmFtZSA9PSAnXycpICYmICgoY2hyWzE5XSAmIDEpID09IDEpKSAqcmV0bmFtZSA9ICchJzsKKwlpZiAoc3RybmNtcChjaHIsICJBUkNISU1FREVTIiwgMTApKQorCQlyZXR1cm4gcmV0bmFtbGVuOworCWlmICgoKnJldG5hbWUgPT0gJ18nKSAmJiAoKGNoclsxOV0gJiAxKSA9PSAxKSkKKwkJKnJldG5hbWUgPSAnISc7CiAJaWYgKCgoZGUtPmZsYWdzWzBdICYgMikgPT0gMCkgJiYgKGNoclsxM10gPT0gMHhmZikKLQkJJiYgKChjaHJbMTJdICYgMHhmMCkgPT0gMHhmMCkpCi0JeworCQkmJiAoKGNoclsxMl0gJiAweGYwKSA9PSAweGYwKSkgewogCQlyZXRuYW1lW3JldG5hbWxlbl0gPSAnLCc7CiAJCXNwcmludGYocmV0bmFtZStyZXRuYW1sZW4rMSwgIiUzLjN4IiwKIAkJCSgoY2hyWzEyXSAmIDB4ZikgPDwgOCkgfCBjaHJbMTFdKTsKQEAgLTkxLDcgKzgwLDcgQEAKICAqLwogc3RhdGljIGludCBkb19pc29mc19yZWFkZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAotCQljaGFyICogdG1wbmFtZSwgc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUpCisJCWNoYXIgKnRtcG5hbWUsIHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOwogCXVuc2lnbmVkIGNoYXIgYnVmYml0cyA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKQEAgLTEyMSw5ICsxMTAsMTEgQEAKIAogCQlkZV9sZW4gPSAqKHVuc2lnbmVkIGNoYXIgKikgZGU7CiAKLQkJLyogSWYgdGhlIGxlbmd0aCBieXRlIGlzIHplcm8sIHdlIHNob3VsZCBtb3ZlIG9uIHRvIHRoZSBuZXh0Ci0JCSAgIENEUk9NIHNlY3Rvci4gIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnksIHdlCi0JCSAgIGtpY2sgb3V0IG9mIHRoZSB3aGlsZSBsb29wLiAqLworCQkvKgorCQkgKiBJZiB0aGUgbGVuZ3RoIGJ5dGUgaXMgemVybywgd2Ugc2hvdWxkIG1vdmUgb24gdG8gdGhlIG5leHQKKwkJICogQ0RST00gc2VjdG9yLiAgSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeSwgd2UKKwkJICoga2ljayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AuCisJCSAqLwogCiAJCWlmIChkZV9sZW4gPT0gMCkgewogCQkJYnJlbHNlKGJoKTsKQEAgLTE1NywxMSArMTQ4LDEwIEBACiAKIAkJaWYgKGZpcnN0X2RlKSB7CiAJCQlpc29mc19ub3JtYWxpemVfYmxvY2tfYW5kX29mZnNldChkZSwKLQkJCQkJCQkgJmJsb2NrX3NhdmVkLAotCQkJCQkJCSAmb2Zmc2V0X3NhdmVkKTsKKwkJCQkJCQkmYmxvY2tfc2F2ZWQsCisJCQkJCQkJJm9mZnNldF9zYXZlZCk7CiAJCQlpbm9kZV9udW1iZXIgPSBpc29mc19nZXRfaW5vKGJsb2NrX3NhdmVkLAotCQkJCQkJICAgICBvZmZzZXRfc2F2ZWQsCi0JCQkJCQkgICAgIGJ1ZmJpdHMpOworCQkJCQkJCW9mZnNldF9zYXZlZCwgYnVmYml0cyk7CiAJCX0KIAogCQlpZiAoZGUtPmZsYWdzWy1zYmktPnNfaGlnaF9zaWVycmFdICYgMHg4MCkgewpAQCAtMTk5LDcgKzE4OSw3IEBACiAJCSAqLwogCQlpZiAoKHNiaS0+c19oaWRlID09ICd5JyAmJgogCQkJCShkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiAxKSkgfHwKLQkJICAgICAgKHNiaS0+c19zaG93YXNzb2MgPT0nbicgJiYKKwkJCQkoc2JpLT5zX3Nob3dhc3NvYyA9PSduJyAmJgogCQkJCShkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiA0KSkpIHsKIAkJCWZpbHAtPmZfcG9zICs9IGRlX2xlbjsKIAkJCWNvbnRpbnVlOwpAQCAtMjQwLDcgKzIzMCw4IEBACiAKIAkJY29udGludWU7CiAJfQotCWlmIChiaCkgYnJlbHNlKGJoKTsKKwlpZiAoYmgpCisJCWJyZWxzZShiaCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1Myw4ICsyNDQsOCBAQAogCQl2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewogCWludCByZXN1bHQ7Ci0JY2hhciAqIHRtcG5hbWU7Ci0Jc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGU7CisJY2hhciAqdG1wbmFtZTsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKnRtcGRlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJdG1wbmFtZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwpAQCAtMjcwLDMgKzI2MSwxOSBAQAogCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmVzdWx0OwogfQorCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPSBpc29mc19yZWFkZGlyLAorfTsKKworLyoKKyAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCisgKi8KK2NvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KK3sKKwkubG9va3VwID0gaXNvZnNfbG9va3VwLAorfTsKKworCmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCA1YzNlZWNmLi40ZjU0MThiIDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTczLDIwICs3MywyMCBAQAogCWttZW1fY2FjaGVfZnJlZShpc29mc19pbm9kZV9jYWNoZXAsIElTT0ZTX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBmb287CiAKIAlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOwogfQotIAorCiBzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQogewogCWlzb2ZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpc29mc19pbm9kZV9jYWNoZSIsCi0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpc29faW5vZGVfaW5mbyksCi0JCQkJCSAgICAgMCwgKFNMQUJfUkVDTEFJTV9BQ0NPVU5UfAotCQkJCQkJU0xBQl9NRU1fU1BSRUFEKSwKLQkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCQkJCQlzaXplb2Yoc3RydWN0IGlzb19pbm9kZV9pbmZvKSwKKwkJCQkJMCwgKFNMQUJfUkVDTEFJTV9BQ0NPVU5UfAorCQkJCQlTTEFCX01FTV9TUFJFQUQpLAorCQkJCQlpbml0X29uY2UsIE5VTEwpOwogCWlmIChpc29mc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CkBAIC0xNTAsOSArMTUwLDkgQEAKIAl1aWRfdCB1aWQ7CiAJY2hhciAqaW9jaGFyc2V0OwogCXVuc2lnbmVkIGNoYXIgdXRmODsKLSAgICAgICAgLyogTFZFICovCi0gICAgICAgIHMzMiBzZXNzaW9uOwotICAgICAgICBzMzIgc2JzZWN0b3I7CisJLyogTFZFICovCisJczMyIHNlc3Npb247CisJczMyIHNic2VjdG9yOwogfTsKIAogLyoKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOwogCXdoaWxlIChsZW4tLSkgewogCQljID0gdG9sb3dlcigqbmFtZSsrKTsKLQkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKHRvbG93ZXIoYyksIGhhc2gpOworCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYywgaGFzaCk7CiAJfQogCXFzdHItPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOwogCkBAIC0zNjAsMTAgKzM2MCwxMiBAQAogCXBvcHQtPmNoZWNrID0gJ3UnOwkJLyogdW5zZXQgKi8KIAlwb3B0LT5ub2NvbXByZXNzID0gMDsKIAlwb3B0LT5ibG9ja3NpemUgPSAxMDI0OwotCXBvcHQtPm1vZGUgPSBTX0lSVUdPIHwgU19JWFVHTzsgLyogci14IGZvciBhbGwuICBUaGUgZGlzYyBjb3VsZAotCQkJCQkgICBiZSBzaGFyZWQgd2l0aCBET1MgbWFjaGluZXMgc28KLQkJCQkJICAgdmlydHVhbGx5IGFueXRoaW5nIGNvdWxkIGJlCi0JCQkJCSAgIGEgdmFsaWQgZXhlY3V0YWJsZS4gKi8KKwlwb3B0LT5tb2RlID0gU19JUlVHTyB8IFNfSVhVR087IC8qCisJCQkJCSAqIHIteCBmb3IgYWxsLiAgVGhlIGRpc2MgY291bGQKKwkJCQkJICogYmUgc2hhcmVkIHdpdGggRE9TIG1hY2hpbmVzIHNvCisJCQkJCSAqIHZpcnR1YWxseSBhbnl0aGluZyBjb3VsZCBiZQorCQkJCQkgKiBhIHZhbGlkIGV4ZWN1dGFibGUuCisJCQkJCSAqLwogCXBvcHQtPmdpZCA9IDA7CiAJcG9wdC0+dWlkID0gMDsKIAlwb3B0LT5pb2NoYXJzZXQgPSBOVUxMOwpAQCAtNTAzLDMwICs1MDUsMzAgQEAKIAkJVGUuY2R0ZV9mb3JtYXQ9Q0RST01fTEJBOwogCQlpID0gaW9jdGxfYnlfYmRldihiZGV2LCBDRFJPTVJFQURUT0NFTlRSWSwgKHVuc2lnbmVkIGxvbmcpICZUZSk7CiAJCWlmICghaSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlNlc3Npb24gJWQgc3RhcnQgJWQgdHlwZSAlZFxuIiwKLQkJCSAgICAgICBzZXNzaW9uLCBUZS5jZHRlX2FkZHIubGJhLAotCQkJICAgICAgIFRlLmNkdGVfY3RybCZDRFJPTV9EQVRBX1RSQUNLKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogU2Vzc2lvbiAlZCBzdGFydCAlZCB0eXBlICVkXG4iLAorCQkJCXNlc3Npb24sIFRlLmNkdGVfYWRkci5sYmEsCisJCQkJVGUuY2R0ZV9jdHJsJkNEUk9NX0RBVEFfVFJBQ0spOwogCQkJaWYgKChUZS5jZHRlX2N0cmwmQ0RST01fREFUQV9UUkFDSykgPT0gNCkKIAkJCQlyZXR1cm4gVGUuY2R0ZV9hZGRyLmxiYTsKIAkJfQotCQkJCi0JCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBzZXNzaW9uIG51bWJlciBvciB0eXBlIG9mIHRyYWNrXG4iKTsKKworCQlwcmludGsoS0VSTl9FUlIgIklTT0ZTOiBJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOwogCX0KIAlpID0gaW9jdGxfYnlfYmRldihiZGV2LCBDRFJPTU1VTFRJU0VTU0lPTiwgKHVuc2lnbmVkIGxvbmcpICZtc19pbmZvKTsKIAlpZiAoc2Vzc2lvbiA+IDApCi0JCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBzZXNzaW9uIG51bWJlclxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSVNPRlM6IEludmFsaWQgc2Vzc2lvbiBudW1iZXJcbiIpOwogI2lmIDAKLQlwcmludGsoImlzb2ZzLmlub2RlOiBDRFJPTU1VTFRJU0VTU0lPTjogcmM9JWRcbiIsaSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImlzb2ZzLmlub2RlOiBDRFJPTU1VTFRJU0VTU0lPTjogcmM9JWRcbiIsaSk7CiAJaWYgKGk9PTApIHsKLQkJcHJpbnRrKCJpc29mcy5pbm9kZTogWEEgZGlzazogJXNcbiIsbXNfaW5mby54YV9mbGFnPyJ5ZXMiOiJubyIpOwotCQlwcmludGsoImlzb2ZzLmlub2RlOiB2b2xfZGVzY19zdGFydCA9ICVkXG4iLCBtc19pbmZvLmFkZHIubGJhKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlzb2ZzLmlub2RlOiBYQSBkaXNrOiAlc1xuIixtc19pbmZvLnhhX2ZsYWc/InllcyI6Im5vIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJpc29mcy5pbm9kZTogdm9sX2Rlc2Nfc3RhcnQgPSAlZFxuIiwgbXNfaW5mby5hZGRyLmxiYSk7CiAJfQogI2VuZGlmCiAJaWYgKGk9PTApCiAjaWYgV0VfT0JFWV9USEVfV1JJVFRFTl9TVEFOREFSRFMKLSAgICAgICAgaWYgKG1zX2luZm8ueGFfZmxhZykgLyogbmVjZXNzYXJ5IGZvciBhIHZhbGlkIG1zX2luZm8uYWRkciAqLworCQlpZiAobXNfaW5mby54YV9mbGFnKSAvKiBuZWNlc3NhcnkgZm9yIGEgdmFsaWQgbXNfaW5mby5hZGRyICovCiAjZW5kaWYKLQkJdm9sX2Rlc2Nfc3RhcnQ9bXNfaW5mby5hZGRyLmxiYTsKKwkJCXZvbF9kZXNjX3N0YXJ0PW1zX2luZm8uYWRkci5sYmE7CiAJcmV0dXJuIHZvbF9kZXNjX3N0YXJ0OwogfQogCkBAIC01MzgsMjAgKzU0MCwyMCBAQAogICovCiBzdGF0aWMgaW50IGlzb2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewotCXN0cnVjdCBidWZmZXJfaGVhZAkgICAgICAqIGJoID0gTlVMTCwgKnByaV9iaCA9IE5VTEw7Ci0Jc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciAgKiBoX3ByaSA9IE5VTEw7Ci0Jc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKiBwcmkgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMLCAqcHJpX2JoID0gTlVMTDsKKwlzdHJ1Y3QgaHNfcHJpbWFyeV9kZXNjcmlwdG9yICpoX3ByaSA9IE5VTEw7CisJc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKnByaSA9IE5VTEw7CiAJc3RydWN0IGlzb19zdXBwbGVtZW50YXJ5X2Rlc2NyaXB0b3IgKnNlYyA9IE5VTEw7Ci0Jc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICAgKiByb290cDsKLQlpbnQJCQkJam9saWV0X2xldmVsID0gMDsKLQlpbnQJCQkJaXNvX2Jsa251bSwgYmxvY2s7Ci0JaW50CQkJCW9yaWdfem9uZXNpemU7Ci0JaW50CQkJCXRhYmxlOwotCXVuc2lnbmVkIGludAkJCXZvbF9kZXNjX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcJCQlmaXJzdF9kYXRhX3pvbmU7Ci0Jc3RydWN0IGlub2RlCQkgICAgICAqIGlub2RlOwotCXN0cnVjdCBpc285NjYwX29wdGlvbnMJCW9wdDsKLQlzdHJ1Y3QgaXNvZnNfc2JfaW5mbwkgICAgICAqIHNiaTsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKnJvb3RwOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGlzbzk2NjBfb3B0aW9ucyBvcHQ7CisJc3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaTsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X2RhdGFfem9uZTsKKwlpbnQgam9saWV0X2xldmVsID0gMDsKKwlpbnQgaXNvX2Jsa251bSwgYmxvY2s7CisJaW50IG9yaWdfem9uZXNpemU7CisJaW50IHRhYmxlOworCXVuc2lnbmVkIGludCB2b2xfZGVzY19zdGFydDsKIAogCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKQEAgLTU3Nyw3MiArNTc5LDczIEBACiAJdm9sX2Rlc2Nfc3RhcnQgPSAob3B0LnNic2VjdG9yICE9IC0xKSA/CiAJCW9wdC5zYnNlY3RvciA6IGlzb2ZzX2dldF9sYXN0X3Nlc3Npb24ocyxvcHQuc2Vzc2lvbik7CiAKLSAgCWZvciAoaXNvX2Jsa251bSA9IHZvbF9kZXNjX3N0YXJ0KzE2OwotICAgICAgICAgICAgIGlzb19ibGtudW0gPCB2b2xfZGVzY19zdGFydCsxMDA7IGlzb19ibGtudW0rKykKLQl7Ci0JICAgIHN0cnVjdCBoc192b2x1bWVfZGVzY3JpcHRvciAgICogaGRwOwotCSAgICBzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICAqIHZkcDsKKwlmb3IgKGlzb19ibGtudW0gPSB2b2xfZGVzY19zdGFydCsxNjsKKwkJaXNvX2Jsa251bSA8IHZvbF9kZXNjX3N0YXJ0KzEwMDsgaXNvX2Jsa251bSsrKSB7CisJCXN0cnVjdCBoc192b2x1bWVfZGVzY3JpcHRvciAqaGRwOworCQlzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICAqdmRwOwogCi0JICAgIGJsb2NrID0gaXNvX2Jsa251bSA8PCAoSVNPRlNfQkxPQ0tfQklUUyAtIHMtPnNfYmxvY2tzaXplX2JpdHMpOwotCSAgICBpZiAoIShiaCA9IHNiX2JyZWFkKHMsIGJsb2NrKSkpCi0JCWdvdG8gb3V0X25vX3JlYWQ7CisJCWJsb2NrID0gaXNvX2Jsa251bSA8PCAoSVNPRlNfQkxPQ0tfQklUUyAtIHMtPnNfYmxvY2tzaXplX2JpdHMpOworCQlpZiAoIShiaCA9IHNiX2JyZWFkKHMsIGJsb2NrKSkpCisJCQlnb3RvIG91dF9ub19yZWFkOwogCi0JICAgIHZkcCA9IChzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKLQkgICAgaGRwID0gKHN0cnVjdCBoc192b2x1bWVfZGVzY3JpcHRvciAqKWJoLT5iX2RhdGE7Ci0JICAgIAotCSAgICAvKiBEdWUgdG8gdGhlIG92ZXJsYXBwaW5nIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSBkZXNjcmlwdG9ycywgCi0JICAgICAqIElTTyBDRHMgY2FuIG1hdGNoIGhkcC0+aWQ9PUhTX1NUQU5EQVJEX0lEIGFzIHdlbGwuIFRvIGVuc3VyZSAKLQkgICAgICogcHJvcGVyIGlkZW50aWZpY2F0aW9uIGluIHRoaXMgY2FzZSwgd2UgZmlyc3QgY2hlY2sgZm9yIElTTy4KLQkgICAgICovCi0JICAgIGlmIChzdHJuY21wICh2ZHAtPmlkLCBJU09fU1RBTkRBUkRfSUQsIHNpemVvZiB2ZHAtPmlkKSA9PSAwKSB7Ci0JCWlmIChpc29udW1fNzExICh2ZHAtPnR5cGUpID09IElTT19WRF9FTkQpCi0JCSAgICBicmVhazsKLQkJaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX1BSSU1BUlkpIHsKLQkJICAgIGlmIChwcmkgPT0gTlVMTCkgewotCQkJcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopdmRwOwotCQkJLyogU2F2ZSB0aGUgYnVmZmVyIGluIGNhc2Ugd2UgbmVlZCBpdCAuLi4gKi8KLQkJCXByaV9iaCA9IGJoOwotCQkJYmggPSBOVUxMOwotCQkgICAgfQotCQl9Ci0jaWZkZWYgQ09ORklHX0pPTElFVAotCQllbHNlIGlmIChpc29udW1fNzExICh2ZHAtPnR5cGUpID09IElTT19WRF9TVVBQTEVNRU5UQVJZKSB7Ci0JCSAgICBzZWMgPSAoc3RydWN0IGlzb19zdXBwbGVtZW50YXJ5X2Rlc2NyaXB0b3IgKil2ZHA7Ci0JCSAgICBpZiAoc2VjLT5lc2NhcGVbMF0gPT0gMHgyNSAmJiBzZWMtPmVzY2FwZVsxXSA9PSAweDJmKSB7Ci0JCQlpZiAob3B0LmpvbGlldCA9PSAneScpIHsKLQkJCSAgICBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0MCkgewotCQkJCWpvbGlldF9sZXZlbCA9IDE7Ci0JCQkgICAgfSBlbHNlIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQzKSB7Ci0JCQkJam9saWV0X2xldmVsID0gMjsKLQkJCSAgICB9IGVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDUpIHsKLQkJCQlqb2xpZXRfbGV2ZWwgPSAzOwotCQkJICAgIH0KLQkJCSAgICBwcmludGsoS0VSTl9ERUJVRyJJU08gOTY2MCBFeHRlbnNpb25zOiBNaWNyb3NvZnQgSm9saWV0IExldmVsICVkXG4iLAotCQkJCSAgIGpvbGlldF9sZXZlbCk7CisJCXZkcCA9IChzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKKwkJaGRwID0gKHN0cnVjdCBoc192b2x1bWVfZGVzY3JpcHRvciAqKWJoLT5iX2RhdGE7CisKKwkJLyoKKwkJICogRHVlIHRvIHRoZSBvdmVybGFwcGluZyBwaHlzaWNhbCBsb2NhdGlvbiBvZiB0aGUgZGVzY3JpcHRvcnMsCisJCSAqIElTTyBDRHMgY2FuIG1hdGNoIGhkcC0+aWQ9PUhTX1NUQU5EQVJEX0lEIGFzIHdlbGwuIFRvIGVuc3VyZQorCQkgKiBwcm9wZXIgaWRlbnRpZmljYXRpb24gaW4gdGhpcyBjYXNlLCB3ZSBmaXJzdCBjaGVjayBmb3IgSVNPLgorCQkgKi8KKwkJaWYgKHN0cm5jbXAgKHZkcC0+aWQsIElTT19TVEFOREFSRF9JRCwgc2l6ZW9mIHZkcC0+aWQpID09IDApIHsKKwkJCWlmIChpc29udW1fNzExKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX0VORCkKKwkJCQlicmVhazsKKwkJCWlmIChpc29udW1fNzExKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX1BSSU1BUlkpIHsKKwkJCQlpZiAocHJpID09IE5VTEwpIHsKKwkJCQkJcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopdmRwOworCQkJCQkvKiBTYXZlIHRoZSBidWZmZXIgaW4gY2FzZSB3ZSBuZWVkIGl0IC4uLiAqLworCQkJCQlwcmlfYmggPSBiaDsKKwkJCQkJYmggPSBOVUxMOworCQkJCX0KIAkJCX0KLQkJCWdvdG8gcm9vdF9mb3VuZDsKLQkJICAgIH0gZWxzZSB7Ci0JCQkvKiBVbmtub3duIHN1cHBsZW1lbnRhcnkgdm9sdW1lIGRlc2NyaXB0b3IgKi8KLQkJCXNlYyA9IE5VTEw7Ci0JCSAgICB9Ci0JCX0KKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJCQllbHNlIGlmIChpc29udW1fNzExKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX1NVUFBMRU1FTlRBUlkpIHsKKwkJCQlzZWMgPSAoc3RydWN0IGlzb19zdXBwbGVtZW50YXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCQkJaWYgKHNlYy0+ZXNjYXBlWzBdID09IDB4MjUgJiYgc2VjLT5lc2NhcGVbMV0gPT0gMHgyZikgeworCQkJCQlpZiAob3B0LmpvbGlldCA9PSAneScpIHsKKwkJCQkJCWlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQwKQorCQkJCQkJCWpvbGlldF9sZXZlbCA9IDE7CisJCQkJCQllbHNlIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQzKQorCQkJCQkJCWpvbGlldF9sZXZlbCA9IDI7CisJCQkJCQllbHNlIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQ1KQorCQkJCQkJCWpvbGlldF9sZXZlbCA9IDM7CisKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU08gOTY2MCBFeHRlbnNpb25zOiAiCisJCQkJCQkJIk1pY3Jvc29mdCBKb2xpZXQgTGV2ZWwgJWRcbiIsCisJCQkJCQkJam9saWV0X2xldmVsKTsKKwkJCQkJfQorCQkJCQlnb3RvIHJvb3RfZm91bmQ7CisJCQkJfSBlbHNlIHsKKwkJCQkvKiBVbmtub3duIHN1cHBsZW1lbnRhcnkgdm9sdW1lIGRlc2NyaXB0b3IgKi8KKwkJCQlzZWMgPSBOVUxMOworCQkJCX0KKwkJCX0KICNlbmRpZgotCSAgICB9IGVsc2UgewotCSAgICAgICAgaWYgKHN0cm5jbXAgKGhkcC0+aWQsIEhTX1NUQU5EQVJEX0lELCBzaXplb2YgaGRwLT5pZCkgPT0gMCkgewotCQkgICAgaWYgKGlzb251bV83MTEgKGhkcC0+dHlwZSkgIT0gSVNPX1ZEX1BSSU1BUlkpCi0JCSAgICAgICAgZ290byBvdXRfZnJlZWJoOwotCQkKLQkJICAgIHNiaS0+c19oaWdoX3NpZXJyYSA9IDE7Ci0JCSAgICBvcHQucm9jayA9ICduJzsKLQkJICAgIGhfcHJpID0gKHN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7Ci0JCSAgICBnb3RvIHJvb3RfZm91bmQ7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RybmNtcCAoaGRwLT5pZCwgSFNfU1RBTkRBUkRfSUQsIHNpemVvZiBoZHAtPmlkKSA9PSAwKSB7CisJCQkJaWYgKGlzb251bV83MTEoaGRwLT50eXBlKSAhPSBJU09fVkRfUFJJTUFSWSkKKwkJCQkJZ290byBvdXRfZnJlZWJoOworCisJCQkJc2JpLT5zX2hpZ2hfc2llcnJhID0gMTsKKwkJCQlvcHQucm9jayA9ICduJzsKKwkJCQloX3ByaSA9IChzdHJ1Y3QgaHNfcHJpbWFyeV9kZXNjcmlwdG9yICopdmRwOworCQkJCWdvdG8gcm9vdF9mb3VuZDsKKwkJCX0KIAkJfQotCSAgICB9CiAKLSAgICAgICAgICAgIC8qIEp1c3Qgc2tpcCBhbnkgdm9sdW1lIGRlc2NyaXB0b3JzIHdlIGRvbid0IHJlY29nbml6ZSAqLworCQkvKiBKdXN0IHNraXAgYW55IHZvbHVtZSBkZXNjcmlwdG9ycyB3ZSBkb24ndCByZWNvZ25pemUgKi8KIAotCSAgICBicmVsc2UoYmgpOwotCSAgICBiaCA9IE5VTEw7CisJCWJyZWxzZShiaCk7CisJCWJoID0gTlVMTDsKIAl9CiAJLyoKIAkgKiBJZiB3ZSBmYWxsIHRocm91Z2gsIGVpdGhlciBubyB2b2x1bWUgZGVzY3JpcHRvciB3YXMgZm91bmQsCkBAIC02NTcsMjQgKzY2MCwyNCBAQAogcm9vdF9mb3VuZDoKIAogCWlmIChqb2xpZXRfbGV2ZWwgJiYgKHByaSA9PSBOVUxMIHx8IG9wdC5yb2NrID09ICduJykpIHsKLQkgICAgLyogVGhpcyBpcyB0aGUgY2FzZSBvZiBKb2xpZXQgd2l0aCB0aGUgbm9yb2NrIG1vdW50IGZsYWcuCi0JICAgICAqIEEgZGlzYyB3aXRoIGJvdGggSm9saWV0IGFuZCBSb2NrIFJpZGdlIGlzIGhhbmRsZWQgbGF0ZXIKLQkgICAgICovCi0JICAgIHByaSA9IChzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqKSBzZWM7CisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugb2YgSm9saWV0IHdpdGggdGhlIG5vcm9jayBtb3VudCBmbGFnLgorCQkgKiBBIGRpc2Mgd2l0aCBib3RoIEpvbGlldCBhbmQgUm9jayBSaWRnZSBpcyBoYW5kbGVkIGxhdGVyCisJCSAqLworCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKikgc2VjOwogCX0KIAogCWlmKHNiaS0+c19oaWdoX3NpZXJyYSl7Ci0JICByb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgaF9wcmktPnJvb3RfZGlyZWN0b3J5X3JlY29yZDsKLQkgIHNiaS0+c19uem9uZXMgPSBpc29udW1fNzMzIChoX3ByaS0+dm9sdW1lX3NwYWNlX3NpemUpOwotCSAgc2JpLT5zX2xvZ196b25lX3NpemUgPSBpc29udW1fNzIzIChoX3ByaS0+bG9naWNhbF9ibG9ja19zaXplKTsKLQkgIHNiaS0+c19tYXhfc2l6ZSA9IGlzb251bV83MzMoaF9wcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKKwkJcm9vdHAgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIGhfcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisJCXNiaS0+c19uem9uZXMgPSBpc29udW1fNzMzKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJCXNiaS0+c19sb2dfem9uZV9zaXplID0gaXNvbnVtXzcyMyhoX3ByaS0+bG9naWNhbF9ibG9ja19zaXplKTsKKwkJc2JpLT5zX21heF9zaXplID0gaXNvbnVtXzczMyhoX3ByaS0+dm9sdW1lX3NwYWNlX3NpemUpOwogCX0gZWxzZSB7Ci0JICBpZiAoIXByaSkKLQkgICAgZ290byBvdXRfZnJlZWJoOwotCSAgcm9vdHAgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIHByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOwotCSAgc2JpLT5zX256b25lcyA9IGlzb251bV83MzMgKHByaS0+dm9sdW1lX3NwYWNlX3NpemUpOwotCSAgc2JpLT5zX2xvZ196b25lX3NpemUgPSBpc29udW1fNzIzIChwcmktPmxvZ2ljYWxfYmxvY2tfc2l6ZSk7Ci0JICBzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKHByaS0+dm9sdW1lX3NwYWNlX3NpemUpOworCQlpZiAoIXByaSkKKwkJCWdvdG8gb3V0X2ZyZWViaDsKKwkJcm9vdHAgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIHByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOworCQlzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyhwcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKKwkJc2JpLT5zX2xvZ196b25lX3NpemUgPSBpc29udW1fNzIzKHByaS0+bG9naWNhbF9ibG9ja19zaXplKTsKKwkJc2JpLT5zX21heF9zaXplID0gaXNvbnVtXzczMyhwcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKIAl9CiAKIAlzYmktPnNfbmlub2RlcyA9IDA7IC8qIE5vIHdheSB0byBmaWd1cmUgdGhpcyBvdXQgZWFzaWx5ICovCkBAIC02ODcsNDIgKzY5MCw0MyBAQAogCSAqIGJsb2NrcyB0aGF0IHdlcmUgNTEyIGJ5dGVzICh3aGljaCBzaG91bGQgb25seSB2ZXJ5IHJhcmVseQogCSAqIGhhcHBlbi4pCiAJICovCi0JaWYob3JpZ196b25lc2l6ZSA8IG9wdC5ibG9ja3NpemUpCisJaWYgKG9yaWdfem9uZXNpemUgPCBvcHQuYmxvY2tzaXplKQogCQlnb3RvIG91dF9iYWRfc2l6ZTsKIAogCS8qIFJERTogY29udmVydCBsb2cgem9uZSBzaXplIHRvIGJpdCBzaGlmdCAqLwotCXN3aXRjaCAoc2JpLT5zX2xvZ196b25lX3NpemUpCi0JICB7IGNhc2UgIDUxMjogc2JpLT5zX2xvZ196b25lX3NpemUgPSAgOTsgYnJlYWs7Ci0JICAgIGNhc2UgMTAyNDogc2JpLT5zX2xvZ196b25lX3NpemUgPSAxMDsgYnJlYWs7Ci0JICAgIGNhc2UgMjA0ODogc2JpLT5zX2xvZ196b25lX3NpemUgPSAxMTsgYnJlYWs7CisJc3dpdGNoIChzYmktPnNfbG9nX3pvbmVfc2l6ZSkgeworCWNhc2UgIDUxMjogc2JpLT5zX2xvZ196b25lX3NpemUgPSAgOTsgYnJlYWs7CisJY2FzZSAxMDI0OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDEwOyBicmVhazsKKwljYXNlIDIwNDg6IHNiaS0+c19sb2dfem9uZV9zaXplID0gMTE7IGJyZWFrOwogCi0JICAgIGRlZmF1bHQ6CisJZGVmYXVsdDoKIAkJZ290byBvdXRfYmFkX3pvbmVfc2l6ZTsKLQkgIH0KKwl9CiAKIAlzLT5zX21hZ2ljID0gSVNPRlNfU1VQRVJfTUFHSUM7CiAJcy0+c19tYXhieXRlcyA9IDB4ZmZmZmZmZmY7IC8qIFdlIGNhbiBoYW5kbGUgZmlsZXMgdXAgdG8gNCBHQiAqLwogCi0JLyogVGhlIENEUk9NIGlzIHJlYWQtb25seSwgaGFzIG5vIG5vZGVzIChkZXZpY2VzKSBvbiBpdCwgYW5kIHNpbmNlCi0JICAgYWxsIG9mIHRoZSBmaWxlcyBhcHBlYXIgdG8gYmUgb3duZWQgYnkgcm9vdCwgd2UgcmVhbGx5IGRvIG5vdCB3YW50Ci0JICAgdG8gYWxsb3cgc3VpZC4gIChzdWlkIG9yIGRldmljZXMgd2lsbCBub3Qgc2hvdyB1cCB1bmxlc3Mgd2UgaGF2ZQotCSAgIFJvY2sgUmlkZ2UgZXh0ZW5zaW9ucykgKi8KKwkvKgorCSAqIFRoZSBDRFJPTSBpcyByZWFkLW9ubHksIGhhcyBubyBub2RlcyAoZGV2aWNlcykgb24gaXQsIGFuZCBzaW5jZQorCSAqIGFsbCBvZiB0aGUgZmlsZXMgYXBwZWFyIHRvIGJlIG93bmVkIGJ5IHJvb3QsIHdlIHJlYWxseSBkbyBub3Qgd2FudAorCSAqIHRvIGFsbG93IHN1aWQuICAoc3VpZCBvciBkZXZpY2VzIHdpbGwgbm90IHNob3cgdXAgdW5sZXNzIHdlIGhhdmUKKwkgKiBSb2NrIFJpZGdlIGV4dGVuc2lvbnMpCisJICovCiAKIAlzLT5zX2ZsYWdzIHw9IE1TX1JET05MWSAvKiB8IE1TX05PREVWIHwgTVNfTk9TVUlEICovOwogCiAJLyogU2V0IHRoaXMgZm9yIHJlZmVyZW5jZS4gSXRzIG5vdCBjdXJyZW50bHkgdXNlZCBleGNlcHQgb24gd3JpdGUKIAkgICB3aGljaCB3ZSBkb24ndCBoYXZlIC4uICovCi0JICAgCi0JZmlyc3RfZGF0YV96b25lID0gaXNvbnVtXzczMyAocm9vdHAtPmV4dGVudCkgKwotCQkJICBpc29udW1fNzExIChyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKKworCWZpcnN0X2RhdGFfem9uZSA9IGlzb251bV83MzMocm9vdHAtPmV4dGVudCkgKworCQkJICBpc29udW1fNzExKHJvb3RwLT5leHRfYXR0cl9sZW5ndGgpOwogCXNiaS0+c19maXJzdGRhdGF6b25lID0gZmlyc3RfZGF0YV96b25lOwogI2lmbmRlZiBCRVFVSUVUCi0JcHJpbnRrKEtFUk5fREVCVUcgIk1heCBzaXplOiVsZCAgIExvZyB6b25lIHNpemU6JWxkXG4iLAotCSAgICAgICBzYmktPnNfbWF4X3NpemUsCi0JICAgICAgIDFVTCA8PCBzYmktPnNfbG9nX3pvbmVfc2l6ZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkZpcnN0IGRhdGF6b25lOiVsZFxuIiwgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUpOworCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogTWF4IHNpemU6JWxkICAgTG9nIHpvbmUgc2l6ZTolbGRcbiIsCisJCXNiaS0+c19tYXhfc2l6ZSwgMVVMIDw8IHNiaS0+c19sb2dfem9uZV9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IEZpcnN0IGRhdGF6b25lOiVsZFxuIiwgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUpOwogCWlmKHNiaS0+c19oaWdoX3NpZXJyYSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkRpc2MgaW4gSGlnaCBTaWVycmEgZm9ybWF0LlxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogRGlzYyBpbiBIaWdoIFNpZXJyYSBmb3JtYXQuXG4iKTsKICNlbmRpZgogCiAJLyoKQEAgLTczNyw4ICs3NDEsOCBAQAogCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKikgc2VjOwogCQlyb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikKIAkJCXByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOwotCQlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzIChyb290cC0+ZXh0ZW50KSArCi0JCQkgIAlpc29udW1fNzExIChyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKKwkJZmlyc3RfZGF0YV96b25lID0gaXNvbnVtXzczMyhyb290cC0+ZXh0ZW50KSArCisJCQkJaXNvbnVtXzcxMShyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKIAl9CiAKIAkvKgpAQCAtNzcxLDcgKzc3NSw3IEBACiAKICNpZmRlZiBDT05GSUdfSk9MSUVUCiAJaWYgKGpvbGlldF9sZXZlbCAmJiBvcHQudXRmOCA9PSAwKSB7Ci0JCWNoYXIgKiBwID0gb3B0LmlvY2hhcnNldCA/IG9wdC5pb2NoYXJzZXQgOiBDT05GSUdfTkxTX0RFRkFVTFQ7CisJCWNoYXIgKnAgPSBvcHQuaW9jaGFyc2V0ID8gb3B0LmlvY2hhcnNldCA6IENPTkZJR19OTFNfREVGQVVMVDsKIAkJc2JpLT5zX25sc19pb2NoYXJzZXQgPSBsb2FkX25scyhwKTsKIAkJaWYgKCEgc2JpLT5zX25sc19pb2NoYXJzZXQpIHsKIAkJCS8qIEZhaWwgb25seSBpZiBleHBsaWNpdCBjaGFyc2V0IHNwZWNpZmllZCAqLwpAQCAtODIxLDcgKzgyNSw3IEBACiAJCXNiaS0+c19yb2NrID0gMDsKIAkJaWYgKHNiaS0+c19maXJzdGRhdGF6b25lICE9IGZpcnN0X2RhdGFfem9uZSkgewogCQkJc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgPSBmaXJzdF9kYXRhX3pvbmU7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAKKwkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkJIklTT0ZTOiBjaGFuZ2luZyB0byBzZWNvbmRhcnkgcm9vdFxuIik7CiAJCQlpcHV0KGlub2RlKTsKIAkJCWlub2RlID0gaXNvZnNfaWdldChzLCBzYmktPnNfZmlyc3RkYXRhem9uZSwgMCk7CkBAIC04MzAsOCArODM0LDEwIEBACiAKIAlpZiAob3B0LmNoZWNrID09ICd1JykgewogCQkvKiBPbmx5IEpvbGlldCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ5IGRlZmF1bHQgKi8KLQkJaWYgKGpvbGlldF9sZXZlbCkgb3B0LmNoZWNrID0gJ3InOwotCQllbHNlIG9wdC5jaGVjayA9ICdzJzsKKwkJaWYgKGpvbGlldF9sZXZlbCkKKwkJCW9wdC5jaGVjayA9ICdyJzsKKwkJZWxzZQorCQkJb3B0LmNoZWNrID0gJ3MnOwogCX0KIAlzYmktPnNfam9saWV0X2xldmVsID0gam9saWV0X2xldmVsOwogCkBAIC04NDYsOCArODUyLDEwIEBACiAJCWdvdG8gb3V0X25vX3Jvb3Q7CiAKIAl0YWJsZSA9IDA7Ci0JaWYgKGpvbGlldF9sZXZlbCkgdGFibGUgKz0gMjsKLQlpZiAob3B0LmNoZWNrID09ICdyJykgdGFibGUrKzsKKwlpZiAoam9saWV0X2xldmVsKQorCQl0YWJsZSArPSAyOworCWlmIChvcHQuY2hlY2sgPT0gJ3InKQorCQl0YWJsZSsrOwogCXMtPnNfcm9vdC0+ZF9vcCA9ICZpc29mc19kZW50cnlfb3BzW3RhYmxlXTsKIAogCWtmcmVlKG9wdC5pb2NoYXJzZXQpOwpAQCAtODU4LDEwICs4NjYsMTAgQEAKIAkgKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2VzIGFuZCBmcmVlIHJlc291cmNlcy4KIAkgKi8KIG91dF9iYWRfcm9vdDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICJpc29mc19maWxsX3N1cGVyOiByb290IGlub2RlIG5vdCBpbml0aWFsaXplZFxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJvb3QgaW5vZGUgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CiAJZ290byBvdXRfaXB1dDsKIG91dF9ub19yb290OgotCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdldCByb290IGlub2RlIGZhaWxlZFxuIiwgX19mdW5jX18pOwogb3V0X2lwdXQ6CiAJaXB1dChpbm9kZSk7CiAjaWZkZWYgQ09ORklHX0pPTElFVApAQCAtODcwLDIxICs4NzgsMjAgQEAKICNlbmRpZgogCWdvdG8gb3V0X2ZyZWVzYmk7CiBvdXRfbm9fcmVhZDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICJpc29mc19maWxsX3N1cGVyOiAiCi0JCSJicmVhZCBmYWlsZWQsIGRldj0lcywgaXNvX2Jsa251bT0lZCwgYmxvY2s9JWRcbiIsCi0JCXMtPnNfaWQsIGlzb19ibGtudW0sIGJsb2NrKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYnJlYWQgZmFpbGVkLCBkZXY9JXMsIGlzb19ibGtudW09JWQsIGJsb2NrPSVkXG4iLAorCQlfX2Z1bmNfXywgcy0+c19pZCwgaXNvX2Jsa251bSwgYmxvY2spOwogCWdvdG8gb3V0X2ZyZWVzYmk7CiBvdXRfYmFkX3pvbmVfc2l6ZToKLQlwcmludGsoS0VSTl9XQVJOSU5HICJCYWQgbG9naWNhbCB6b25lIHNpemUgJWxkXG4iLAorCXByaW50ayhLRVJOX1dBUk5JTkcgIklTT0ZTOiBCYWQgbG9naWNhbCB6b25lIHNpemUgJWxkXG4iLAogCQlzYmktPnNfbG9nX3pvbmVfc2l6ZSk7CiAJZ290byBvdXRfZnJlZWJoOwogb3V0X2JhZF9zaXplOgotCXByaW50ayhLRVJOX1dBUk5JTkcgIkxvZ2ljYWwgem9uZSBzaXplKCVkKSA8IGhhcmR3YXJlIGJsb2Nrc2l6ZSgldSlcbiIsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNPRlM6IExvZ2ljYWwgem9uZSBzaXplKCVkKSA8IGhhcmR3YXJlIGJsb2Nrc2l6ZSgldSlcbiIsCiAJCW9yaWdfem9uZXNpemUsIG9wdC5ibG9ja3NpemUpOwogCWdvdG8gb3V0X2ZyZWViaDsKIG91dF91bmtub3duX2Zvcm1hdDoKIAlpZiAoIXNpbGVudCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGlkZW50aWZ5IENELVJPTSBmb3JtYXQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNPRlM6IFVuYWJsZSB0byBpZGVudGlmeSBDRC1ST00gZm9ybWF0LlxuIik7CiAKIG91dF9mcmVlYmg6CiAJYnJlbHNlKGJoKTsKQEAgLTkwMiw3ICs5MDksNyBAQAogCWJ1Zi0+Zl90eXBlID0gSVNPRlNfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwogCWJ1Zi0+Zl9ibG9ja3MgPSAoSVNPRlNfU0Ioc2IpLT5zX256b25lcwotICAgICAgICAgICAgICAgICAgPDwgKElTT0ZTX1NCKHNiKS0+c19sb2dfem9uZV9zaXplIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpKTsKKwkJPDwgKElTT0ZTX1NCKHNiKS0+c19sb2dfem9uZV9zaXplIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpKTsKIAlidWYtPmZfYmZyZWUgPSAwOwogCWJ1Zi0+Zl9iYXZhaWwgPSAwOwogCWJ1Zi0+Zl9maWxlcyA9IElTT0ZTX1NCKHNiKS0+c19uaW5vZGVzOwpAQCAtOTMxLDIwICs5MzgsMjAgQEAKIAogCXJ2ID0gMDsKIAlpZiAoaWJsb2NrIDwgMCB8fCBpYmxvY2sgIT0gaWJsb2NrX3MpIHsKLQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBibG9jayBudW1iZXIgdG9vIGxhcmdlXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBibG9jayBudW1iZXIgdG9vIGxhcmdlXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gYWJvcnQ7CiAJfQogCiAJYl9vZmYgPSBpYmxvY2s7Ci0JCi0Jb2Zmc2V0ICAgID0gMDsKLQlmaXJzdGV4dCAgPSBlaS0+aV9maXJzdF9leHRlbnQ7Ci0Jc2VjdF9zaXplID0gZWktPmlfc2VjdGlvbl9zaXplID4+IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKLQluZXh0YmxrICAgPSBlaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7Ci0JbmV4dG9mZiAgID0gZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldDsKLQlzZWN0aW9uICAgPSAwOwogCi0Jd2hpbGUgKCBuYmxvY2tzICkgeworCW9mZnNldCA9IDA7CisJZmlyc3RleHQgPSBlaS0+aV9maXJzdF9leHRlbnQ7CisJc2VjdF9zaXplID0gZWktPmlfc2VjdGlvbl9zaXplID4+IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKKwluZXh0YmxrID0gZWktPmlfbmV4dF9zZWN0aW9uX2Jsb2NrOworCW5leHRvZmYgPSBlaS0+aV9uZXh0X3NlY3Rpb25fb2Zmc2V0OworCXNlY3Rpb24gPSAwOworCisJd2hpbGUgKG5ibG9ja3MpIHsKIAkJLyogSWYgd2UgYXJlICp3YXkqIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBwcmludCBhIG1lc3NhZ2UuCiAJCSAqIEFjY2VzcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSB1cCB0byB0aGUgbmV4dCBwYWdlIGJvdW5kYXJ5CiAJCSAqIGlzIG5vcm1hbCwgaG93ZXZlciBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIHBhZ2UgY2FjaGUgd29ya3MuCkBAIC05NTMsMTEgKzk2MCwxMSBAQAogCQkgKiBJL08gZXJyb3JzLgogCQkgKi8KIAkJaWYgKGJfb2ZmID4gKChpbm9kZS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpKSkgewotCQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBibG9jayA+PSBFT0YgKCVsZCwgJWxkKVxuIiwKLQkJCSAgICAgICBpYmxvY2ssICh1bnNpZ25lZCBsb25nKSBpbm9kZS0+aV9zaXplKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmxvY2sgPj0gRU9GICglbGQsICVsZClcbiIsCisJCQkJX19mdW5jX18sIGlibG9jaywgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX3NpemUpOwogCQkJZ290byBhYm9ydDsKIAkJfQotCQkKKwogCQkvKiBPbiB0aGUgbGFzdCBzZWN0aW9uLCBuZXh0YmxrID09IDAsIHNlY3Rpb24gc2l6ZSBpcyBsaWtlbHkgdG8KIAkJICogZXhjZWVkIHNlY3Rfc2l6ZSBieSBhIHBhcnRpYWwgYmxvY2ssIGFuZCBhY2Nlc3MgYmV5b25kIHRoZQogCQkgKiBlbmQgb2YgdGhlIGZpbGUgd2lsbCByZWFjaCBiZXlvbmQgdGhlIHNlY3Rpb24gc2l6ZSwgdG9vLgpAQCAtOTc2LDIwICs5ODMsMjEgQEAKIAkJCWlwdXQobmlub2RlKTsKIAogCQkJaWYgKCsrc2VjdGlvbiA+IDEwMCkgewotCQkJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogTW9yZSB0aGFuIDEwMCBmaWxlIHNlY3Rpb25zID8hPywgYWJvcnRpbmcuLi5cbiIpOwotCQkJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2s9JWxkIGZpcnN0ZXh0PSV1IHNlY3Rfc2l6ZT0ldSAiCi0JCQkJICAgICAgICJuZXh0YmxrPSVsdSBuZXh0b2ZmPSVsdVxuIiwKLQkJCQkgICAgICAgaWJsb2NrLCBmaXJzdGV4dCwgKHVuc2lnbmVkKSBzZWN0X3NpemUsCi0JCQkJICAgICAgIG5leHRibGssIG5leHRvZmYpOworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTW9yZSB0aGFuIDEwMCBmaWxlIHNlY3Rpb25zID8hPyIKKwkJCQkJIiBhYm9ydGluZy4uLlxuIiwgX19mdW5jX18pOworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmxvY2s9JWxkIGZpcnN0ZXh0PSV1IHNlY3Rfc2l6ZT0ldSAiCisJCQkJCSJuZXh0YmxrPSVsdSBuZXh0b2ZmPSVsdVxuIiwgX19mdW5jX18sCisJCQkJCWlibG9jaywgZmlyc3RleHQsICh1bnNpZ25lZCkgc2VjdF9zaXplLAorCQkJCQluZXh0YmxrLCBuZXh0b2ZmKTsKIAkJCQlnb3RvIGFib3J0OwogCQkJfQogCQl9Ci0JCQotCQlpZiAoICpiaCApIHsKKworCQlpZiAoKmJoKSB7CiAJCQltYXBfYmgoKmJoLCBpbm9kZS0+aV9zYiwgZmlyc3RleHQgKyBiX29mZiAtIG9mZnNldCk7CiAJCX0gZWxzZSB7CiAJCQkqYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGZpcnN0ZXh0K2Jfb2ZmLW9mZnNldCk7Ci0JCQlpZiAoICEqYmggKQorCQkJaWYgKCEqYmgpCiAJCQkJZ290byBhYm9ydDsKIAkJfQogCQliaCsrOwkvKiBOZXh0IGJ1ZmZlciBoZWFkICovCkBAIC0xMDEwLDcgKzEwMTgsNyBAQAogCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7CiAJaWYgKGNyZWF0ZSkgewotCQlwcmludGsoImlzb2ZzX2dldF9ibG9jazogS2VybmVsIHRyaWVzIHRvIGFsbG9jYXRlIGEgYmxvY2tcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEtlcm5lbCB0cmllcyB0byBhbGxvY2F0ZSBhIGJsb2NrXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVJPRlM7CiAJfQogCkBAIC0xMDcwLDExICsxMDc4LDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOwogCWludCBoaWdoX3NpZXJyYSA9IElTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19oaWdoX3NpZXJyYTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBibG9jaywgb2Zmc2V0LCBibG9ja19zYXZlZCwgb2Zmc2V0X3NhdmVkOwogCWludCBpID0gMDsKIAlpbnQgbW9yZV9lbnRyaWVzID0gMDsKLQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSA9IE5VTEw7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICp0bXBkZSA9IE5VTEw7CiAJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IElTT0ZTX0koaW5vZGUpOwogCiAJaW5vZGUtPmlfc2l6ZSA9IDA7CkBAIC0xMDg5LDcgKzEwOTcsNyBAQAogCW9mZnNldCA9IGVpLT5pX2lnZXQ1X29mZnNldDsKIAogCWRvIHsKLQkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGU7CisJCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqZGU7CiAJCXVuc2lnbmVkIGludCBkZV9sZW47CiAKIAkJaWYgKCFiaCkgewpAQCAtMTE2MywxMCArMTE3MSw5IEBACiAJcmV0dXJuIC1FSU87CiAKIG91dF90b29tYW55OgotCXByaW50ayhLRVJOX0lORk8gImlzb2ZzX3JlYWRfbGV2ZWwzX3NpemU6ICIKLQkJIk1vcmUgdGhhbiAxMDAgZmlsZSBzZWN0aW9ucyA/IT8sIGFib3J0aW5nLi4uXG4iCi0JICAJImlzb2ZzX3JlYWRfbGV2ZWwzX3NpemU6IGlub2RlPSVsdVxuIiwKLQkJaW5vZGUtPmlfaW5vKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogTW9yZSB0aGFuIDEwMCBmaWxlIHNlY3Rpb25zID8hPywgYWJvcnRpbmcuLi5cbiIKKwkJImlzb2ZzX3JlYWRfbGV2ZWwzX3NpemU6IGlub2RlPSVsdVxuIiwKKwkJX19mdW5jX18sIGlub2RlLT5pX2lubyk7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTExNzcsOSArMTE4NCw5IEBACiAJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOwogCXVuc2lnbmVkIGxvbmcgYmxvY2s7CiAJaW50IGhpZ2hfc2llcnJhID0gc2JpLT5zX2hpZ2hfc2llcnJhOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTDsKLQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZTsKLQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKnRtcGRlID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgZGVfbGVuOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBJU09GU19JKGlub2RlKTsKQEAgLTExOTksNyArMTIwNiw3IEBACiAKIAkJdG1wZGUgPSBrbWFsbG9jKGRlX2xlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICh0bXBkZSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJpc29mc19yZWFkX2lub2RlOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJbWVtY3B5KHRtcGRlLCBiaC0+Yl9kYXRhICsgb2Zmc2V0LCBmcmFnMSk7CkBAIC0xMjEyLDI0ICsxMjE5LDI2IEBACiAJfQogCiAJaW5vZGUtPmlfaW5vID0gaXNvZnNfZ2V0X2lubyhlaS0+aV9pZ2V0NV9ibG9jaywKLQkJCQkgICAgIGVpLT5pX2lnZXQ1X29mZnNldCwKLQkJCQkgICAgIElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKSk7CisJCQkJCWVpLT5pX2lnZXQ1X29mZnNldCwKKwkJCQkJSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpKTsKIAogCS8qIEFzc3VtZSBpdCBpcyBhIG5vcm1hbC1mb3JtYXQgZmlsZSB1bmxlc3MgdG9sZCBvdGhlcndpc2UgKi8KIAllaS0+aV9maWxlX2Zvcm1hdCA9IGlzb2ZzX2ZpbGVfbm9ybWFsOwogCiAJaWYgKGRlLT5mbGFnc1staGlnaF9zaWVycmFdICYgMikgewogCQlpbm9kZS0+aV9tb2RlID0gU19JUlVHTyB8IFNfSVhVR08gfCBTX0lGRElSOwotCQlpbm9kZS0+aV9ubGluayA9IDE7IC8qIFNldCB0byAxLiAgV2Uga25vdyB0aGVyZSBhcmUgMiwgYnV0Ci0JCQkJICAgICAgIHRoZSBmaW5kIHV0aWxpdHkgdHJpZXMgdG8gb3B0aW1pemUKLQkJCQkgICAgICAgaWYgaXQgaXMgMiwgYW5kIGl0IHNjcmV3cyB1cC4gIEl0IGlzCi0JCQkJICAgICAgIGVhc2llciB0byBnaXZlIDEgd2hpY2ggdGVsbHMgZmluZCB0bwotCQkJCSAgICAgICBkbyBpdCB0aGUgaGFyZCB3YXkuICovCisJCWlub2RlLT5pX25saW5rID0gMTsJLyoKKwkJCQkJICogU2V0IHRvIDEuICBXZSBrbm93IHRoZXJlIGFyZSAyLCBidXQKKwkJCQkJICogdGhlIGZpbmQgdXRpbGl0eSB0cmllcyB0byBvcHRpbWl6ZQorCQkJCQkgKiBpZiBpdCBpcyAyLCBhbmQgaXQgc2NyZXdzIHVwLiAgSXQgaXMKKwkJCQkJICogZWFzaWVyIHRvIGdpdmUgMSB3aGljaCB0ZWxscyBmaW5kIHRvCisJCQkJCSAqIGRvIGl0IHRoZSBoYXJkIHdheS4KKwkJCQkJICovCiAJfSBlbHNlIHsKLSAJCS8qIEV2ZXJ5Ym9keSBnZXRzIHRvIHJlYWQgdGhlIGZpbGUuICovCisJCS8qIEV2ZXJ5Ym9keSBnZXRzIHRvIHJlYWQgdGhlIGZpbGUuICovCiAJCWlub2RlLT5pX21vZGUgPSBzYmktPnNfbW9kZTsKIAkJaW5vZGUtPmlfbmxpbmsgPSAxOwotCSAgICAgICAgaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CiAJfQogCWlub2RlLT5pX3VpZCA9IHNiaS0+c191aWQ7CiAJaW5vZGUtPmlfZ2lkID0gc2JpLT5zX2dpZDsKQEAgLTEyMzksMTMgKzEyNDgsMTQgQEAKIAllaS0+aV9mb3JtYXRfcGFybVsxXSA9IDA7CiAJZWktPmlfZm9ybWF0X3Bhcm1bMl0gPSAwOwogCi0JZWktPmlfc2VjdGlvbl9zaXplID0gaXNvbnVtXzczMyAoZGUtPnNpemUpOworCWVpLT5pX3NlY3Rpb25fc2l6ZSA9IGlzb251bV83MzMoZGUtPnNpemUpOwogCWlmIChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIDB4ODApIHsKLQkJaWYoaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZShpbm9kZSkpIGdvdG8gZmFpbDsKKwkJaWYoaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZShpbm9kZSkpCisJCQlnb3RvIGZhaWw7CiAJfSBlbHNlIHsKIAkJZWktPmlfbmV4dF9zZWN0aW9uX2Jsb2NrID0gMDsKIAkJZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldCA9IDA7Ci0JCWlub2RlLT5pX3NpemUgPSBpc29udW1fNzMzIChkZS0+c2l6ZSk7CisJCWlub2RlLT5pX3NpemUgPSBpc29udW1fNzMzKGRlLT5zaXplKTsKIAl9CiAKIAkvKgpAQCAtMTI1OCwyMyArMTI2OCwyNCBAQAogCQlpbm9kZS0+aV9zaXplICY9IDB4MDBmZmZmZmY7CiAKIAlpZiAoZGUtPmludGVybGVhdmVbMF0pIHsKLQkJcHJpbnRrKCJJbnRlcmxlYXZlZCBmaWxlcyBub3QgKHlldCkgc3VwcG9ydGVkLlxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogSW50ZXJsZWF2ZWQgZmlsZXMgbm90ICh5ZXQpIHN1cHBvcnRlZC5cbiIpOwogCQlpbm9kZS0+aV9zaXplID0gMDsKIAl9CiAKIAkvKiBJIGhhdmUgbm8gaWRlYSB3aGF0IGZpbGVfdW5pdF9zaXplIGlzIHVzZWQgZm9yLCBzbwogCSAgIHdlIHdpbGwgZmxhZyBpdCBmb3Igbm93ICovCiAJaWYgKGRlLT5maWxlX3VuaXRfc2l6ZVswXSAhPSAwKSB7Ci0JCXByaW50aygiRmlsZSB1bml0IHNpemUgIT0gMCBmb3IgSVNPIGZpbGUgKCVsZCkuXG4iLAotCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBGaWxlIHVuaXQgc2l6ZSAhPSAwIGZvciBJU08gZmlsZSAoJWxkKS5cbiIsCisJCQlpbm9kZS0+aV9pbm8pOwogCX0KIAogCS8qIEkgaGF2ZSBubyBpZGVhIHdoYXQgb3RoZXIgZmxhZyBiaXRzIGFyZSB1c2VkIGZvciwgc28KIAkgICB3ZSB3aWxsIGZsYWcgaXQgZm9yIG5vdyAqLwogI2lmZGVmIERFQlVHCiAJaWYoKGRlLT5mbGFnc1staGlnaF9zaWVycmFdICYgfjIpIT0gMCl7Ci0JCXByaW50aygiVW51c3VhbCBmbGFnIHNldHRpbmdzIGZvciBJU08gZmlsZSAoJWxkICV4KS5cbiIsCi0JCSAgICAgICBpbm9kZS0+aV9pbm8sIGRlLT5mbGFnc1staGlnaF9zaWVycmFdKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBVbnVzdWFsIGZsYWcgc2V0dGluZ3MgZm9yIElTTyBmaWxlICIKKwkJCQkiKCVsZCAleCkuXG4iLAorCQkJaW5vZGUtPmlfaW5vLCBkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSk7CiAJfQogI2VuZGlmCiAKQEAgLTEyODUsMTEgKzEyOTYsMTEgQEAKIAlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0KIAlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKIAotCWVpLT5pX2ZpcnN0X2V4dGVudCA9IChpc29udW1fNzMzIChkZS0+ZXh0ZW50KSArCi0JCQkgICAgICBpc29udW1fNzExIChkZS0+ZXh0X2F0dHJfbGVuZ3RoKSk7CisJZWktPmlfZmlyc3RfZXh0ZW50ID0gKGlzb251bV83MzMoZGUtPmV4dGVudCkgKworCQkJaXNvbnVtXzcxMShkZS0+ZXh0X2F0dHJfbGVuZ3RoKSk7CiAKIAkvKiBTZXQgdGhlIG51bWJlciBvZiBibG9ja3MgZm9yIHN0YXQoKSAtIHNob3VsZCBiZSBkb25lIGJlZm9yZSBSUiAqLwotCWlub2RlLT5pX2Jsb2NrcyAgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKIAogCS8qCiAJICogTm93IHRlc3QgZm9yIHBvc3NpYmxlIFJvY2sgUmlkZ2UgZXh0ZW5zaW9ucyB3aGljaCB3aWxsIG92ZXJyaWRlCkBAIC0xMzA2LDcgKzEzMTcsNyBAQAogCS8qIEluc3RhbGwgdGhlIGlub2RlIG9wZXJhdGlvbnMgdmVjdG9yICovCiAJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKIAkJaW5vZGUtPmlfZm9wID0gJmdlbmVyaWNfcm9fZm9wczsKLQkJc3dpdGNoICggZWktPmlfZmlsZV9mb3JtYXQgKSB7CisJCXN3aXRjaCAoZWktPmlfZmlsZV9mb3JtYXQpIHsKICNpZmRlZiBDT05GSUdfWklTT0ZTCiAJCWNhc2UgaXNvZnNfZmlsZV9jb21wcmVzc2VkOgogCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ6aXNvZnNfYW9wczsKQEAgLTEzNTAsNyArMTM2MSw3IEBACiAJc3RydWN0IGlzb2ZzX2lnZXQ1X2NhbGxiYWNrX2RhdGEgKmQgPQogCQkoc3RydWN0IGlzb2ZzX2lnZXQ1X2NhbGxiYWNrX2RhdGEqKWRhdGE7CiAJcmV0dXJuIChpLT5pX2lnZXQ1X2Jsb2NrID09IGQtPmJsb2NrKQotCSAgICAgICAmJiAoaS0+aV9pZ2V0NV9vZmZzZXQgPT0gZC0+b2Zmc2V0KTsKKwkJJiYgKGktPmlfaWdldDVfb2Zmc2V0ID09IGQtPm9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbnQgaXNvZnNfaWdldDVfc2V0KHN0cnVjdCBpbm9kZSAqaW5vLCB2b2lkICpkYXRhKQpAQCAtMTM4NCw3ICsxMzk1LDcgQEAKIAloYXNodmFsID0gKGJsb2NrIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSB8IG9mZnNldDsKIAogCWlub2RlID0gaWdldDVfbG9ja2VkKHNiLCBoYXNodmFsLCAmaXNvZnNfaWdldDVfdGVzdCwKLQkJCSAgICAgJmlzb2ZzX2lnZXQ1X3NldCwgJmRhdGEpOworCQkJCSZpc29mc19pZ2V0NV9zZXQsICZkYXRhKTsKIAogCWlmIChpbm9kZSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKIAkJc2ItPnNfb3AtPnJlYWRfaW5vZGUoaW5vZGUpOwpAQCAtMTM5OCw3ICsxNDA5LDcgQEAKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKIAlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBpc29mc19maWxsX3N1cGVyLAotCQkJICAgbW50KTsKKwkJCQltbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaXNvOTY2MF9mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaXNvZnMuaCBiL2ZzL2lzb2ZzL2lzb2ZzLmgKaW5kZXggZWZlMjg3Mi4uYTA3ZTY3YiAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvaXNvZnMuaAorKysgYi9mcy9pc29mcy9pc29mcy5oCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lzb19mcy5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvam9saWV0LmMgYi9mcy9pc29mcy9qb2xpZXQuYwppbmRleCBmYjhmZTdhLi45MmMxNGI4IDEwMDY0NAotLS0gYS9mcy9pc29mcy9qb2xpZXQuYworKysgYi9mcy9pc29mcy9qb2xpZXQuYwpAQCAtODAsMjIgKzgwLDIwIEBACiAKIAlpZiAodXRmOCkgewogCQlsZW4gPSB3Y3NudG9tYnNfYmUob3V0bmFtZSwgZGUtPm5hbWUsCi0JCQkJICAgZGUtPm5hbWVfbGVuWzBdID4+IDEsIFBBR0VfU0laRSk7CisJCQkJZGUtPm5hbWVfbGVuWzBdID4+IDEsIFBBR0VfU0laRSk7CiAJfSBlbHNlIHsKIAkJbGVuID0gdW5pMTZfdG9feDgob3V0bmFtZSwgKF9fYmUxNiAqKSBkZS0+bmFtZSwKLQkJCQkgIGRlLT5uYW1lX2xlblswXSA+PiAxLCBubHMpOworCQkJCWRlLT5uYW1lX2xlblswXSA+PiAxLCBubHMpOwogCX0KLQlpZiAoKGxlbiA+IDIpICYmIChvdXRuYW1lW2xlbi0yXSA9PSAnOycpICYmIChvdXRuYW1lW2xlbi0xXSA9PSAnMScpKSB7CisJaWYgKChsZW4gPiAyKSAmJiAob3V0bmFtZVtsZW4tMl0gPT0gJzsnKSAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJzEnKSkKIAkJbGVuIC09IDI7Ci0JfQogCiAJLyoKIAkgKiBXaW5kb3dzIGRvZXNuJ3QgbGlrZSBwZXJpb2RzIGF0IHRoZSBlbmQgb2YgYSBuYW1lLAogCSAqIHNvIG5laXRoZXIgZG8gd2UKIAkgKi8KLQl3aGlsZSAobGVuID49IDIgJiYgKG91dG5hbWVbbGVuLTFdID09ICcuJykpIHsKKwl3aGlsZSAobGVuID49IDIgJiYgKG91dG5hbWVbbGVuLTFdID09ICcuJykpCiAJCWxlbi0tOwotCX0KIAogCXJldHVybiBsZW47CiB9CmRpZmYgLS1naXQgYS9mcy9pc29mcy9uYW1laS5jIGIvZnMvaXNvZnMvbmFtZWkuYwppbmRleCBjMDRiM2ExLi5jOGM3ZTUxIDEwMDY0NAotLS0gYS9mcy9pc29mcy9uYW1laS5jCisrKyBiL2ZzL2lzb2ZzL25hbWVpLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAqIHNvbWUgc2FuaXR5IHRlc3RzLgogICovCiBzdGF0aWMgaW50Ci1pc29mc19jbXAoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY29uc3QgY2hhciAqIGNvbXBhcmUsIGludCBkbGVuKQoraXNvZnNfY21wKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqY29tcGFyZSwgaW50IGRsZW4pCiB7CiAJc3RydWN0IHFzdHIgcXN0cjsKIApAQCAtNDgsMjQgKzQ4LDI0IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpc29mc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JdW5zaWduZWQgbG9uZyAqYmxvY2tfcnYsIHVuc2lnbmVkIGxvbmcqIG9mZnNldF9ydiwKLQljaGFyICogdG1wbmFtZSwgc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUpCisJdW5zaWduZWQgbG9uZyAqYmxvY2tfcnYsIHVuc2lnbmVkIGxvbmcgKm9mZnNldF9ydiwKKwljaGFyICp0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKnRtcGRlKQogewogCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGRpcik7CiAJdW5zaWduZWQgY2hhciBidWZiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoZGlyKTsKIAl1bnNpZ25lZCBsb25nIGJsb2NrLCBmX3Bvcywgb2Zmc2V0LCBibG9ja19zYXZlZCwgb2Zmc2V0X3NhdmVkOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpID0gSVNPRlNfU0IoZGlyLT5pX3NiKTsKIAogCWlmICghSVNPRlNfSShkaXIpLT5pX2ZpcnN0X2V4dGVudCkKIAkJcmV0dXJuIDA7Ci0gIAorCiAJZl9wb3MgPSAwOwogCW9mZnNldCA9IDA7CiAJYmxvY2sgPSAwOwogCiAJd2hpbGUgKGZfcG9zIDwgZGlyLT5pX3NpemUpIHsKLQkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGU7CisJCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqZGU7CiAJCWludCBkZV9sZW4sIG1hdGNoLCBpLCBkbGVuOwogCQljaGFyICpkcG50OwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogCQlpZiAoc2JpLT5zX3JvY2sgJiYKIAkJICAgICgoaSA9IGdldF9yb2NrX3JpZGdlX2ZpbGVuYW1lKGRlLCB0bXBuYW1lLCBkaXIpKSkpIHsKLQkJCWRsZW4gPSBpOyAJLyogcG9zc2libHkgLTEgKi8KKwkJCWRsZW4gPSBpOwkvKiBwb3NzaWJseSAtMSAqLwogCQkJZHBudCA9IHRtcG5hbWU7CiAjaWZkZWYgQ09ORklHX0pPTElFVAogCQl9IGVsc2UgaWYgKHNiaS0+c19qb2xpZXRfbGV2ZWwpIHsKQEAgLTE0NSw4ICsxNDUsOCBAQAogCQkJaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoZGUsCiAJCQkJCQkJICZibG9ja19zYXZlZCwKIAkJCQkJCQkgJm9mZnNldF9zYXZlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYmxvY2tfcnYgPSBibG9ja19zYXZlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXRfcnYgPSBvZmZzZXRfc2F2ZWQ7CisJCQkqYmxvY2tfcnYgPSBibG9ja19zYXZlZDsKKwkJCSpvZmZzZXRfcnYgPSBvZmZzZXRfc2F2ZWQ7CiAJCQlicmVsc2UoYmgpOwogCQkJcmV0dXJuIDE7CiAJCX0KQEAgLTE1NSw3ICsxNTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgZGVudHJ5ICppc29mc19sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0cnVjdCBkZW50cnkgKmlzb2ZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlpbnQgZm91bmQ7CiAJdW5zaWduZWQgbG9uZyBibG9jaywgb2Zmc2V0OwpAQCAtMTcwLDkgKzE3MCw5IEBACiAKIAlsb2NrX2tlcm5lbCgpOwogCWZvdW5kID0gaXNvZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeSwKLQkJCQkgJmJsb2NrLCAmb2Zmc2V0LAotCQkJCSBwYWdlX2FkZHJlc3MocGFnZSksCi0JCQkJIDEwMjQgKyBwYWdlX2FkZHJlc3MocGFnZSkpOworCQkJCSZibG9jaywgJm9mZnNldCwKKwkJCQlwYWdlX2FkZHJlc3MocGFnZSksCisJCQkJMTAyNCArIHBhZ2VfYWRkcmVzcyhwYWdlKSk7CiAJX19mcmVlX3BhZ2UocGFnZSk7CiAKIAlpbm9kZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9qYmQvY29tbWl0LmMgYi9mcy9qYmQvY29tbWl0LmMKaW5kZXggMWZhY2ZhZi4uYTAwM2Q1MCAxMDA2NDQKLS0tIGEvZnMvamJkL2NvbW1pdC5jCisrKyBiL2ZzL2piZC9jb21taXQuYwpAQCAtODg3LDcgKzg4Nyw4IEBACiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAotCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwpIHsKKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMICYmCisJICAgIGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gTlVMTCkgewogCQlfX2pvdXJuYWxfZHJvcF90cmFuc2FjdGlvbihqb3VybmFsLCBjb21taXRfdHJhbnNhY3Rpb24pOwogCX0gZWxzZSB7CiAJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2ZzL2piZC9yZXZva2UuYyBiL2ZzL2piZC9yZXZva2UuYwppbmRleCA4MjRlM2I3Li44ZGIyZmEyIDEwMDY0NAotLS0gYS9mcy9qYmQvcmV2b2tlLmMKKysrIGIvZnMvamJkL3Jldm9rZS5jCkBAIC02OCw2ICs2OCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpyZXZva2VfcmVjb3JkX2NhY2hlOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpyZXZva2VfdGFibGVfY2FjaGU7CkBAIC0yMTEsNyArMjEyLDcgQEAKIAlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOwogCiAJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCi0JSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKwlKX0FTU0VSVChpc19wb3dlcl9vZl8yKGhhc2hfc2l6ZSkpOwogCiAJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2l6ZSA9IGhhc2hfc2l6ZTsKIApAQCAtMjM4LDcgKzIzOSw3IEBACiAJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXTsKIAogCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLwotCUpfQVNTRVJUICgoaGFzaF9zaXplICYgKGhhc2hfc2l6ZS0xKSkgPT0gMCk7CisJSl9BU1NFUlQoaXNfcG93ZXJfb2ZfMihoYXNoX3NpemUpKTsKIAogCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CiAKZGlmZiAtLWdpdCBhL2ZzL2piZDIvY29tbWl0LmMgYi9mcy9qYmQyL2NvbW1pdC5jCmluZGV4IDI4NTZlMTEuLmMwZjU5ZDEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY29tbWl0LmMKKysrIGIvZnMvamJkMi9jb21taXQuYwpAQCAtODk2LDcgKzg5Niw4IEBACiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAotCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwpIHsKKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMICYmCisJICAgIGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gTlVMTCkgewogCQlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CiAJfSBlbHNlIHsKIAkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZnMvamJkMi9yZXZva2UuYyBiL2ZzL2piZDIvcmV2b2tlLmMKaW5kZXggOTI0NmU3Ni4uMjhjYWMwNCAxMDA2NDQKLS0tIGEvZnMvamJkMi9yZXZva2UuYworKysgYi9mcy9qYmQyL3Jldm9rZS5jCkBAIC02OCw2ICs2OCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpqYmQyX3Jldm9rZV9yZWNvcmRfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmpiZDJfcmV2b2tlX3RhYmxlX2NhY2hlOwpAQCAtMjEyLDcgKzIxMyw3IEBACiAJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKIAogCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLwotCUpfQVNTRVJUICgoaGFzaF9zaXplICYgKGhhc2hfc2l6ZS0xKSkgPT0gMCk7CisJSl9BU1NFUlQoaXNfcG93ZXJfb2ZfMihoYXNoX3NpemUpKTsKIAogCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CiAKQEAgLTIzOSw3ICsyNDAsNyBAQAogCWpvdXJuYWwtPmpfcmV2b2tlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMV07CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBoYXNoX3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KLQlKX0FTU0VSVCAoKGhhc2hfc2l6ZSAmIChoYXNoX3NpemUtMSkpID09IDApOworCUpfQVNTRVJUKGlzX3Bvd2VyX29mXzIoaGFzaF9zaXplKSk7CiAKIAlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOwogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKaW5kZXggMGM4MmRmYy4uMTQzYzU1MyAxMDA2NDQKLS0tIGEvZnMvamZmczIvYmFja2dyb3VuZC5jCisrKyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwpAQCAtODEsNiArODEsNyBAQAogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxMCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQlhbGxvd19zaWduYWwoU0lHSFVQKTsKIApkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbm9kZS5oIGIvZnMvamZzL2pmc19pbm9kZS5oCmluZGV4IDIzNzRiNTkuLmYwZWM3MmIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfaW5vZGUuaAorKysgYi9mcy9qZnMvamZzX2lub2RlLmgKQEAgLTMyLDYgKzMyLDcgQEAKIGV4dGVybiB2b2lkIGpmc19mcmVlX3plcm9fbGluayhzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqamZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGV4dGVybiB2b2lkIGpmc19nZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGpmc19pbm9kZV9pbmZvICopOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmpmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKTsKIGV4dGVybiB2b2lkIGpmc19zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBqZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKaW5kZXggMjUxNjFjNC4uOTMyNzk3YiAxMDA2NDQKLS0tIGEvZnMvamZzL25hbWVpLmMKKysrIGIvZnMvamZzL25hbWVpLmMKQEAgLTE0NzcsNiArMTQ3NywzOCBAQAogCXJldHVybiBkZW50cnk7CiB9CiAKK3N0cnVjdCBkZW50cnkgKmpmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQoreworCV9fdTMyICpvYmpwID0gdm9ianA7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBvYmpwWzBdOworCV9fdTMyIGdlbmVyYXRpb24gPSBvYmpwWzFdOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCisJaWYgKGlubyA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwlpbm9kZSA9IGlnZXQoc2IsIGlubyk7CisJaWYgKGlub2RlID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKKwkgICAgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKSkgeworCSAgICAJcmVzdWx0ID0gRVJSX1BUUigtRVNUQUxFKTsKKwkJZ290byBvdXRfaXB1dDsKKwl9CisKKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcmVzdWx0KSB7CisJCXJlc3VsdCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCXJldHVybiByZXN1bHQ7CisKKyBvdXRfaXB1dDoKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiBzdHJ1Y3QgZGVudHJ5ICpqZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9zdXBlci5jIGIvZnMvamZzL3N1cGVyLmMKaW5kZXggMjBlNGFjMS4uOTI5ZmNlYyAxMDA2NDQKLS0tIGEvZnMvamZzL3N1cGVyLmMKKysrIGIvZnMvamZzL3N1cGVyLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIApAQCAtNzM3LDYgKzczOCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGpmc19leHBvcnRfb3BlcmF0aW9ucyA9IHsKKwkuZ2V0X2RlbnRyeQk9IGpmc19nZXRfZGVudHJ5LAogCS5nZXRfcGFyZW50CT0gamZzX2dldF9wYXJlbnQsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmMuYyBiL2ZzL2xvY2tkL3N2Yy5jCmluZGV4IDI2ODA5MzIuLjgyZTIxOTIgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Yy5jCisrKyBiL2ZzL2xvY2tkL3N2Yy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgpAQCAtNzUsMTggKzc2LDMxIEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIG5sbV9zeXNjdGxfdGFibGU7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9ncmFjZV9wZXJpb2Qodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9sb2NrZF9ncmFjZV9wZXJpb2Qodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGdyYWNlX3BlcmlvZDsKLQogCS8qIE5vdGU6IG5sbV90aW1lb3V0IHNob3VsZCBhbHdheXMgYmUgbm9uemVybyAqLwogCWlmIChubG1fZ3JhY2VfcGVyaW9kKQotCQlncmFjZV9wZXJpb2QgPSAoKG5sbV9ncmFjZV9wZXJpb2QgKyBubG1fdGltZW91dCAtIDEpCi0JCQkJLyBubG1fdGltZW91dCkgKiBubG1fdGltZW91dCAqIEhaOworCQlyZXR1cm4gcm91bmR1cChubG1fZ3JhY2VfcGVyaW9kLCBubG1fdGltZW91dCkgKiBIWjsKIAllbHNlCi0JCWdyYWNlX3BlcmlvZCA9IG5sbV90aW1lb3V0ICogNSAqIEhaOworCQlyZXR1cm4gbmxtX3RpbWVvdXQgKiA1ICogSFo7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X25mc19ncmFjZV9wZXJpb2Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvY2tkZ3JhY2UgPSBnZXRfbG9ja2RfZ3JhY2VfcGVyaW9kKCk7CisJdW5zaWduZWQgbG9uZyBuZnNkZ3JhY2UgPSAwOworCisJaWYgKG5sbXN2Y19vcHMpCisJCW5mc2RncmFjZSA9IG5sbXN2Y19vcHMtPmdldF9ncmFjZV9wZXJpb2QoKTsKKworCXJldHVybiBtYXgobG9ja2RncmFjZSwgbmZzZGdyYWNlKTsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X25mc19ncmFjZV9wZXJpb2QpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfZ3JhY2VfcGVyaW9kKHZvaWQpCit7CiAJbmxtc3ZjX2dyYWNlX3BlcmlvZCA9IDE7Ci0JcmV0dXJuIGdyYWNlX3BlcmlvZCArIGppZmZpZXM7CisJcmV0dXJuIGdldF9uZnNfZ3JhY2VfcGVyaW9kKCkgKyBqaWZmaWVzOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfZ3JhY2VfcGVyaW9kKHZvaWQpCkBAIC0xMTksNiArMTMzLDcgQEAKIAljb21wbGV0ZSgmbG9ja2Rfc3RhcnRfZG9uZSk7CiAKIAlkYWVtb25pemUoImxvY2tkIik7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJLyogUHJvY2VzcyByZXF1ZXN0IHdpdGggc2lnbmFscyBibG9ja2VkLCBidXQgYWxsb3cgU0lHS0lMTC4gICovCiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwpkaWZmIC0tZ2l0IGEvZnMvbWJjYWNoZS5jIGIvZnMvbWJjYWNoZS5jCmluZGV4IGRlZWI5ZGMuLmZiYjFkMDIgMTAwNjQ0Ci0tLSBhL2ZzL21iY2FjaGUuYworKysgYi9mcy9tYmNhY2hlLmMKQEAgLTEwMCw3ICsxMDAsNiBAQAogc3RhdGljIExJU1RfSEVBRChtYl9jYWNoZV9saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQobWJfY2FjaGVfbHJ1X2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhtYl9jYWNoZV9zcGlubG9jayk7Ci1zdGF0aWMgc3RydWN0IHNocmlua2VyICptYl9zaHJpbmtlcjsKIAogc3RhdGljIGlubGluZSBpbnQKIG1iX2NhY2hlX2luZGV4ZXMoc3RydWN0IG1iX2NhY2hlICpjYWNoZSkKQEAgLTExOCw2ICsxMTcsMTAgQEAKIAogc3RhdGljIGludCBtYl9jYWNoZV9zaHJpbmtfZm4oaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKTsKIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciBtYl9jYWNoZV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gbWJfY2FjaGVfc2hyaW5rX2ZuLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OwogCiBzdGF0aWMgaW5saW5lIGludAogX19tYl9jYWNoZV9lbnRyeV9pc19oYXNoZWQoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSkKQEAgLTY2MiwxMyArNjY1LDEzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbWJjYWNoZSh2b2lkKQogewotCW1iX3Nocmlua2VyID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIG1iX2NhY2hlX3Nocmlua19mbik7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJm1iX2NhY2hlX3Nocmlua2VyKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWJjYWNoZSh2b2lkKQogewotCXJlbW92ZV9zaHJpbmtlcihtYl9zaHJpbmtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmbWJfY2FjaGVfc2hyaW5rZXIpOwogfQogCiBtb2R1bGVfaW5pdChpbml0X21iY2FjaGUpCmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGI2OTZlM2EuLjQxOTgwMDMgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAicG5vZGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAvKiBzcGlubG9jayBmb3IgdmZzbW91bnQgcmVsYXRlZCBvcGVyYXRpb25zLCBpbnBsYWNlIG9mIGRjYWNoZV9sb2NrICovCiBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0sodmZzbW91bnRfbG9jayk7CkBAIC0zMjAsMjIgKzMyMSwxNiBAQAogc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKLQlsb2ZmX3QgbCA9ICpwb3M7CiAKIAlkb3duX3JlYWQoJm5hbWVzcGFjZV9zZW0pOwotCWxpc3RfZm9yX2VhY2gocCwgJm4tPmxpc3QpCi0JCWlmICghbC0tKQotCQkJcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZuLT5saXN0LCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKm1fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuID0gbS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwID0gKChzdHJ1Y3QgdmZzbW91bnQgKil2KS0+bW50X2xpc3QubmV4dDsKLQkoKnBvcykrKzsKLQlyZXR1cm4gcCA9PSAmbi0+bGlzdCA/IE5VTEwgOiBsaXN0X2VudHJ5KHAsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOworCisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJm4tPmxpc3QsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCkBAIC0zNTAsNyArMzQ1LDcgQEAKIAogc3RhdGljIGludCBzaG93X3Zmc21udChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IHZmc21vdW50ICptbnQgPSB2OworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9saXN0KTsKIAlpbnQgZXJyID0gMDsKIAlzdGF0aWMgc3RydWN0IHByb2NfZnNfaW5mbyB7CiAJCWludCBmbGFnOwpAQCAtNDA1LDcgKzQwMCw3IEBACiAKIHN0YXRpYyBpbnQgc2hvd192ZnNzdGF0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHY7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOwogCWludCBlcnIgPSAwOwogCiAJLyogZGV2aWNlICovCkBAIC0xNDU3LDcgKzE0NTIsNyBAQAogCiAJbmV3X25zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1udF9uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19ucykKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJYXRvbWljX3NldCgmbmV3X25zLT5jb3VudCwgMSk7CiAJSU5JVF9MSVNUX0hFQUQoJm5ld19ucy0+bGlzdCk7CkBAIC0xNDcxLDcgKzE0NjYsNyBAQAogCWlmICghbmV3X25zLT5yb290KSB7CiAJCXVwX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKIAkJa2ZyZWUobmV3X25zKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOzsKIAl9CiAJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZuZXdfbnMtPmxpc3QsICZuZXdfbnMtPnJvb3QtPm1udF9saXN0KTsKQEAgLTE1MTUsNyArMTUxMCw3IEBACiAJcmV0dXJuIG5ld19uczsKIH0KIAotc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKGludCBmbGFncywgc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zLAorc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucywKIAkJc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKQogewogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuZXdfbnM7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9maWxlLmMgYi9mcy9uY3Bmcy9maWxlLmMKaW5kZXggZDMxNTJmOC4uMmIxNDVkZSAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZmlsZS5jCisrKyBiL2ZzL25jcGZzL2ZpbGUuYwpAQCAtMjAzLDcgKzIwMyw2IEBACiAKIAlpZiAocG9zICsgY291bnQgPiBNQVhfTk9OX0xGUyAmJiAhKGZpbGUtPmZfZmxhZ3MmT19MQVJHRUZJTEUpKSB7CiAJCWlmIChwb3MgPj0gTUFYX05PTl9MRlMpIHsKLQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwogCQkJcmV0dXJuIC1FRkJJRzsKIAkJfQogCQlpZiAoY291bnQgPiBNQVhfTk9OX0xGUyAtICh1MzIpcG9zKSB7CkBAIC0yMTIsNyArMjExLDYgQEAKIAl9CiAJaWYgKHBvcyA+PSBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewogCQlpZiAoY291bnQgfHwgcG9zID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKLQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwogCQkJcmV0dXJuIC1FRkJJRzsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5jIGIvZnMvbmZzL2NhbGxiYWNrLmMKaW5kZXggNzVmMzA5Yy4uYTc5NmJlNSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogCkBAIC02Nyw2ICs2OCw3IEBACiAJZGFlbW9uaXplKCJuZnN2NC1zdmMiKTsKIAkvKiBQcm9jZXNzIHJlcXVlc3Qgd2l0aCBzaWduYWxzIGJsb2NrZWQsIGJ1dCBhbGxvdyBTSUdLSUxMLiAgKi8KIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJY29tcGxldGUoJm5mc19jYWxsYmFja19pbmZvLnN0YXJ0ZWQpOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvY2xpZW50LmMgYi9mcy9uZnMvY2xpZW50LmMKaW5kZXggY2NiNDU1MC4uYTQ5ZjlmZSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NsaWVudC5jCisrKyBiL2ZzL25mcy9jbGllbnQuYwpAQCAtMTIwNiwyMyArMTIwNiw5IEBACiAgKi8KIHN0YXRpYyB2b2lkICpuZnNfc2VydmVyX2xpc3Rfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwotCiAJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwogCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZuZnNfY2xpZW50X2xpc3QpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmbmZzX2NsaWVudF9saXN0ID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZuZnNfY2xpZW50X2xpc3QsICpfcG9zKTsKIH0KIAogLyoKQEAgLTEyMzAsMTQgKzEyMTYsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqbmZzX3NlcnZlcl9saXN0X25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IG5mc19jbGllbnRfbGlzdC5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJm5mc19jbGllbnRfbGlzdCA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmbmZzX2NsaWVudF9saXN0LCBwb3MpOwogfQogCiAvKgpAQCAtMTI1Niw3ICsxMjM1LDcgQEAKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJaWYgKHYgPT0gJm5mc19jbGllbnRfbGlzdCkgewogCQlzZXFfcHV0cyhtLCAiTlYgU0VSVkVSICAgUE9SVCBVU0UgSE9TVE5BTUVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMjk3LDIzICsxMjc2LDkgQEAKICAqLwogc3RhdGljIHZvaWQgKm5mc192b2x1bWVfbGlzdF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCiAJc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJm5mc192b2x1bWVfbGlzdCkKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZuZnNfdm9sdW1lX2xpc3QgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJm5mc192b2x1bWVfbGlzdCwgKl9wb3MpOwogfQogCiAvKgpAQCAtMTMyMSwxNCArMTI4Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICpuZnNfdm9sdW1lX2xpc3RfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JKCpwb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gbmZzX3ZvbHVtZV9saXN0Lm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiBfcCAhPSAmbmZzX3ZvbHVtZV9saXN0ID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZuZnNfdm9sdW1lX2xpc3QsIHBvcyk7CiB9CiAKIC8qCkBAIC0xMzQ5LDcgKzEzMDcsNyBAQAogCWNoYXIgZGV2WzhdLCBmc2lkWzE3XTsKIAogCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCWlmICh2ID09ICZuZnNfdm9sdW1lX2xpc3QpIHsKIAkJc2VxX3B1dHMobSwgIk5WIFNFUlZFUiAgIFBPUlQgREVWICAgICBGU0lEXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3N1cGVyLmMgYi9mcy9uZnMvc3VwZXIuYwppbmRleCBhMmIxYWY4Li5hZGZmZTE2IDEwMDY0NAotLS0gYS9mcy9uZnMvc3VwZXIuYworKysgYi9mcy9uZnMvc3VwZXIuYwpAQCAtMzAwLDcgKzMwMCwxMCBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHNocmlua2VyICphY2xfc2hyaW5rZXI7CitzdGF0aWMgc3RydWN0IHNocmlua2VyIGFjbF9zaHJpbmtlciA9IHsKKwkuc2hyaW5rCQk9IG5mc19hY2Nlc3NfY2FjaGVfc2hyaW5rZXIsCisJLnNlZWtzCQk9IERFRkFVTFRfU0VFS1MsCit9OwogCiAvKgogICogUmVnaXN0ZXIgdGhlIE5GUyBmaWxlc3lzdGVtcwpAQCAtMzIxLDcgKzMyNCw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfMjsKICNlbmRpZgotCWFjbF9zaHJpbmtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBuZnNfYWNjZXNzX2NhY2hlX3Nocmlua2VyKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmYWNsX3Nocmlua2VyKTsKIAlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19ORlNfVjQKQEAgLTMzOSw4ICszNDIsNyBAQAogICovCiB2b2lkIF9fZXhpdCB1bnJlZ2lzdGVyX25mc19mcyh2b2lkKQogewotCWlmIChhY2xfc2hyaW5rZXIgIT0gTlVMTCkKLQkJcmVtb3ZlX3Nocmlua2VyKGFjbF9zaHJpbmtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmYWNsX3Nocmlua2VyKTsKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpOwogCW5mc191bnJlZ2lzdGVyX3N5c2N0bCgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9hdXRoLmMgYi9mcy9uZnNkL2F1dGguYwppbmRleCA2ZTkyYjBmLi5jZjYxZGM4IDEwMDY0NAotLS0gYS9mcy9uZnNkL2F1dGguYworKysgYi9mcy9uZnNkL2F1dGguYwpAQCAtMTIsMTcgKzEyLDMxIEBACiAKICNkZWZpbmUJQ0FQX05GU0RfTUFTSyAoQ0FQX0ZTX01BU0t8Q0FQX1RPX01BU0soQ0FQX1NZU19SRVNPVVJDRSkpCiAKK3N0YXRpYyBpbnQgbmZzZXhwX2ZsYWdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZjsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICplbmQgPSBleHAtPmV4X2ZsYXZvcnMgKyBleHAtPmV4X25mbGF2b3JzOworCisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZW5kOyBmKyspIHsKKwkJaWYgKGYtPnBzZXVkb2ZsYXZvciA9PSBycXN0cC0+cnFfZmxhdm9yKQorCQkJcmV0dXJuIGYtPmZsYWdzOworCX0KKwlyZXR1cm4gZXhwLT5leF9mbGFnczsKKworfQorCiBpbnQgbmZzZF9zZXR1c2VyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCiB7CiAJc3RydWN0IHN2Y19jcmVkCWNyZWQgPSBycXN0cC0+cnFfY3JlZDsKIAlpbnQgaTsKKwlpbnQgZmxhZ3MgPSBuZnNleHBfZmxhZ3MocnFzdHAsIGV4cCk7CiAJaW50IHJldDsKIAotCWlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX0FMTFNRVUFTSCkgeworCWlmIChmbGFncyAmIE5GU0VYUF9BTExTUVVBU0gpIHsKIAkJY3JlZC5jcl91aWQgPSBleHAtPmV4X2Fub25fdWlkOwogCQljcmVkLmNyX2dpZCA9IGV4cC0+ZXhfYW5vbl9naWQ7CiAJCWNyZWQuY3JfZ3JvdXBfaW5mbyA9IGdyb3Vwc19hbGxvYygwKTsKLQl9IGVsc2UgaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfUk9PVFNRVUFTSCkgeworCX0gZWxzZSBpZiAoZmxhZ3MgJiBORlNFWFBfUk9PVFNRVUFTSCkgewogCQlzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ2k7CiAJCWlmICghY3JlZC5jcl91aWQpCiAJCQljcmVkLmNyX3VpZCA9IGV4cC0+ZXhfYW5vbl91aWQ7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2V4cG9ydC5jIGIvZnMvbmZzZC9leHBvcnQuYwppbmRleCA3OWJkMDNiLi5jN2JiZjQ2IDEwMDY0NAotLS0gYS9mcy9uZnNkL2V4cG9ydC5jCisrKyBiL2ZzL25mc2QvZXhwb3J0LmMKQEAgLTI2LDEyICsyNiwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNmaC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvbXNnX3Byb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJTkZTRERCR19FWFBPUlQKIApAQCAtNDUxLDggKzQ1NCw0OCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgc2VjaW5mb19wYXJzZShjaGFyICoqbWVzZywgY2hhciAqYnVmLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCWludCBsaXN0c2l6ZSwgZXJyOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmY7CisKKwllcnIgPSBnZXRfaW50KG1lc2csICZsaXN0c2l6ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAobGlzdHNpemUgPCAwIHx8IGxpc3RzaXplID4gTUFYX1NFQ0lORk9fTElTVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBleHAtPmV4X2ZsYXZvcnMgKyBsaXN0c2l6ZTsgZisrKSB7CisJCWVyciA9IGdldF9pbnQobWVzZywgJmYtPnBzZXVkb2ZsYXZvcik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkvKgorCQkgKiBKdXN0IGEgcXVpY2sgc2FuaXR5IGNoZWNrOyB3ZSBjb3VsZCBhbHNvIHRyeSB0byBjaGVjaworCQkgKiB3aGV0aGVyIHRoaXMgcHNldWRvZmxhdm9yIGlzIHN1cHBvcnRlZCwgYnV0IGF0IHdvcnN0CisJCSAqIGFuIHVuc3VwcG9ydGVkIHBzZXVkb2ZsYXZvciBvbiB0aGUgZXhwb3J0IHdvdWxkIGp1c3QKKwkJICogYmUgYSBwc2V1ZG9mbGF2b3IgdGhhdCB3b24ndCBtYXRjaCB0aGUgZmxhdm9yIG9mIGFueQorCQkgKiBhdXRoZW50aWNhdGVkIHJlcXVlc3QuICBUaGUgYWRtaW5pc3RyYXRvciB3aWxsCisJCSAqIHByb2JhYmx5IGRpc2NvdmVyIHRoZSBwcm9ibGVtIHdoZW4gc29tZW9uZSBmYWlscyB0bworCQkgKiBhdXRoZW50aWNhdGUuCisJCSAqLworCQlpZiAoZi0+cHNldWRvZmxhdm9yIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQllcnIgPSBnZXRfaW50KG1lc2csICZmLT5mbGFncyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkvKiBPbmx5IHNvbWUgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gZGlmZmVyIGJldHdlZW4gZmxhdm9yczogKi8KKwkJaWYgKH5ORlNFWFBfU0VDSU5GT19GTEFHUyAmIChmLT5mbGFncyBeIGV4cC0+ZXhfZmxhZ3MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWV4cC0+ZXhfbmZsYXZvcnMgPSBsaXN0c2l6ZTsKKwlyZXR1cm4gMDsKK30KKwogI2Vsc2UgLyogQ09ORklHX05GU0RfVjQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZzbG9jX3BhcnNlKGNoYXIgKiptZXNnLCBjaGFyICpidWYsIHN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgKmZzbG9jKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludAorZnNsb2NfcGFyc2UoY2hhciAqKm1lc2csIGNoYXIgKmJ1Ziwgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2Mpe3JldHVybiAwO30KK3N0YXRpYyBpbmxpbmUgaW50CitzZWNpbmZvX3BhcnNlKGNoYXIgKiptZXNnLCBjaGFyICpidWYsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCiBzdGF0aWMgaW50IHN2Y19leHBvcnRfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIGNoYXIgKm1lc2csIGludCBtbGVuKQpAQCAtNDc2LDYgKzUxOSw5IEBACiAKIAlleHAuZXhfdXVpZCA9IE5VTEw7CiAKKwkvKiBzZWNpbmZvICovCisJZXhwLmV4X25mbGF2b3JzID0gMDsKKwogCWlmIChtZXNnW21sZW4tMV0gIT0gJ1xuJykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJbWVzZ1ttbGVuLTFdID0gMDsKQEAgLTU1Myw3ICs1OTksOSBAQAogCQkJCQlpZiAoZXhwLmV4X3V1aWQgPT0gTlVMTCkKIAkJCQkJCWVyciA9IC1FTk9NRU07CiAJCQkJfQotCQkJfSBlbHNlCisJCQl9IGVsc2UgaWYgKHN0cmNtcChidWYsICJzZWNpbmZvIikgPT0gMCkKKwkJCQllcnIgPSBzZWNpbmZvX3BhcnNlKCZtZXNnLCBidWYsICZleHApOworCQkJZWxzZQogCQkJCS8qIHF1aWV0bHkgaWdub3JlIHVua25vd24gd29yZHMgYW5kIGFueXRoaW5nCiAJCQkJICogZm9sbG93aW5nLiBOZXdlciB1c2VyLXNwYWNlIGNhbiB0cnkgdG8gc2V0CiAJCQkJICogbmV3IHZhbHVlcywgdGhlbiBzZWUgd2hhdCB0aGUgcmVzdWx0IHdhcy4KQEAgLTU5Myw2ICs2NDEsNyBAQAogCiBzdGF0aWMgdm9pZCBleHBfZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZywgaW50IGZzaWQsCiAJCXVpZF90IGFub251LCB1aWRfdCBhbm9uZywgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2NzKTsKK3N0YXRpYyB2b2lkIHNob3dfc2VjaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApOwogCiBzdGF0aWMgaW50IHN2Y19leHBvcnRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCiAJCQkgICBzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKQEAgLTYyMiw2ICs2NzEsNyBAQAogCQkJCXNlcV9wcmludGYobSwgIiUwMngiLCBleHAtPmV4X3V1aWRbaV0pOwogCQkJfQogCQl9CisJCXNob3dfc2VjaW5mbyhtLCBleHApOwogCX0KIAlzZXFfcHV0cyhtLCAiKVxuIik7CiAJcmV0dXJuIDA7CkBAIC02NTQsNiArNzA0LDcgQEAKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqbmV3ID0gY29udGFpbmVyX29mKGNuZXcsIHN0cnVjdCBzdmNfZXhwb3J0LCBoKTsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqaXRlbSA9IGNvbnRhaW5lcl9vZihjaXRlbSwgc3RydWN0IHN2Y19leHBvcnQsIGgpOworCWludCBpOwogCiAJbmV3LT5leF9mbGFncyA9IGl0ZW0tPmV4X2ZsYWdzOwogCW5ldy0+ZXhfYW5vbl91aWQgPSBpdGVtLT5leF9hbm9uX3VpZDsKQEAgLTY2OSw2ICs3MjAsMTAgQEAKIAlpdGVtLT5leF9mc2xvY3MubG9jYXRpb25zX2NvdW50ID0gMDsKIAluZXctPmV4X2ZzbG9jcy5taWdyYXRlZCA9IGl0ZW0tPmV4X2ZzbG9jcy5taWdyYXRlZDsKIAlpdGVtLT5leF9mc2xvY3MubWlncmF0ZWQgPSAwOworCW5ldy0+ZXhfbmZsYXZvcnMgPSBpdGVtLT5leF9uZmxhdm9yczsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFQ0lORk9fTElTVDsgaSsrKSB7CisJCW5ldy0+ZXhfZmxhdm9yc1tpXSA9IGl0ZW0tPmV4X2ZsYXZvcnNbaV07CisJfQogfQogCiBzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKnN2Y19leHBvcnRfYWxsb2Modm9pZCkKQEAgLTczOCwxNiArNzkzLDE4IEBACiAJaW50IGVycjsKIAkKIAlpZiAoIWNscCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCiAJa2V5LmVrX2NsaWVudCA9IGNscDsKIAlrZXkuZWtfZnNpZHR5cGUgPSBmc2lkX3R5cGU7CiAJbWVtY3B5KGtleS5la19mc2lkLCBmc2lkdiwga2V5X2xlbihmc2lkX3R5cGUpKTsKIAogCWVrID0gc3ZjX2V4cGtleV9sb29rdXAoJmtleSk7Ci0JaWYgKGVrICE9IE5VTEwpCi0JCWlmICgoZXJyID0gY2FjaGVfY2hlY2soJnN2Y19leHBrZXlfY2FjaGUsICZlay0+aCwgcmVxcCkpKQotCQkJZWsgPSBFUlJfUFRSKGVycik7CisJaWYgKGVrID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWVyciA9IGNhY2hlX2NoZWNrKCZzdmNfZXhwa2V5X2NhY2hlLCAmZWstPmgsIHJlcXApOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CiAJcmV0dXJuIGVrOwogfQogCkBAIC04MDgsMzAgKzg2NSwyMSBAQAogCQlzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKQogewogCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIGtleTsKKwlpbnQgZXJyOwogCQogCWlmICghY2xwKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAKIAlrZXkuZXhfY2xpZW50ID0gY2xwOwogCWtleS5leF9tbnQgPSBtbnQ7CiAJa2V5LmV4X2RlbnRyeSA9IGRlbnRyeTsKIAogCWV4cCA9IHN2Y19leHBvcnRfbG9va3VwKCZrZXkpOwotCWlmIChleHAgIT0gTlVMTCkgIHsKLQkJaW50IGVycjsKLQotCQllcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cG9ydF9jYWNoZSwgJmV4cC0+aCwgcmVxcCk7Ci0JCXN3aXRjaCAoZXJyKSB7Ci0JCWNhc2UgMDogYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoKLQkJY2FzZSAtRVRJTUVET1VUOgotCQkJZXhwID0gRVJSX1BUUihlcnIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlleHAgPSBOVUxMOwotCQl9Ci0JfQotCisJaWYgKGV4cCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwllcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cG9ydF9jYWNoZSwgJmV4cC0+aCwgcmVxcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAlyZXR1cm4gZXhwOwogfQogCkBAIC04NDcsNyArODk1LDcgQEAKIAlkZ2V0KGRlbnRyeSk7CiAJZXhwID0gZXhwX2dldF9ieV9uYW1lKGNscCwgbW50LCBkZW50cnksIHJlcXApOwogCi0Jd2hpbGUgKGV4cCA9PSBOVUxMICYmICFJU19ST09UKGRlbnRyeSkpIHsKKwl3aGlsZSAoUFRSX0VSUihleHApID09IC1FTk9FTlQgJiYgIUlTX1JPT1QoZGVudHJ5KSkgewogCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CiAKIAkJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKQEAgLTkwMCw3ICs5NDgsNyBAQAogCQlyZXR1cm47CiAKIAllayA9IGV4cF9nZXRfZnNpZF9rZXkoZXhwLT5leF9jbGllbnQsIGV4cC0+ZXhfZnNpZCk7Ci0JaWYgKGVrICYmICFJU19FUlIoZWspKSB7CisJaWYgKCFJU19FUlIoZWspKSB7CiAJCWVrLT5oLmV4cGlyeV90aW1lID0gZ2V0X3NlY29uZHMoKS0xOwogCQljYWNoZV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CiAJfQpAQCAtOTM4LDcgKzk4Niw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGV4cC0+ZXhfZGVudHJ5LT5kX2lub2RlOwogCiAJZWsgPSBleHBfZ2V0X2tleShleHAtPmV4X2NsaWVudCwgaW5vZGUtPmlfc2ItPnNfZGV2LCBpbm9kZS0+aV9pbm8pOwotCWlmIChlayAmJiAhSVNfRVJSKGVrKSkgeworCWlmICghSVNfRVJSKGVrKSkgewogCQllay0+aC5leHBpcnlfdGltZSA9IGdldF9zZWNvbmRzKCktMTsKIAkJY2FjaGVfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOwogCX0KQEAgLTk4OSwxMyArMTAzNywxMiBAQAogCiAJLyogbXVzdCBtYWtlIHN1cmUgdGhlcmUgd29uJ3QgYmUgYW4gZXhfZnNpZCBjbGFzaCAqLwogCWlmICgobnhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSAmJgotCSAgICAoZnNpZF9rZXkgPSBleHBfZ2V0X2ZzaWRfa2V5KGNscCwgbnhwLT5leF9kZXYpKSAmJgotCSAgICAhSVNfRVJSKGZzaWRfa2V5KSAmJgorCSAgICAoIUlTX0VSUihmc2lkX2tleSA9IGV4cF9nZXRfZnNpZF9rZXkoY2xwLCBueHAtPmV4X2RldikpKSAmJgogCSAgICBmc2lkX2tleS0+ZWtfbW50ICYmCiAJICAgIChmc2lkX2tleS0+ZWtfbW50ICE9IG5kLm1udCB8fCBmc2lkX2tleS0+ZWtfZGVudHJ5ICE9IG5kLmRlbnRyeSkgKQogCQlnb3RvIGZpbmlzaDsKIAotCWlmIChleHApIHsKKwlpZiAoIUlTX0VSUihleHApKSB7CiAJCS8qIGp1c3QgYSBmbGFncy9pZC9mc2lkIHVwZGF0ZSAqLwogCiAJCWV4cF9mc2lkX3VuaGFzaChleHApOwpAQCAtMTEwNCw3ICsxMTUxLDcgQEAKIAllcnIgPSAtRUlOVkFMOwogCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShkb20sIG5kLm1udCwgbmQuZGVudHJ5LCBOVUxMKTsKIAlwYXRoX3JlbGVhc2UoJm5kKTsKLQlpZiAoIWV4cCkKKwlpZiAoSVNfRVJSKGV4cCkpCiAJCWdvdG8gb3V0X2RvbWFpbjsKIAogCWV4cF9kb191bmV4cG9ydChleHApOwpAQCAtMTE0OSwxMCArMTE5Niw2IEBACiAJCWVyciA9IFBUUl9FUlIoZXhwKTsKIAkJZ290byBvdXQ7CiAJfQotCWlmICghZXhwKSB7Ci0JCWRwcmludGsoIm5mc2Q6IGV4cF9yb290ZmggZXhwb3J0IG5vdCBmb3VuZC5cbiIpOwotCQlnb3RvIG91dDsKLQl9CiAKIAkvKgogCSAqIGZoIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgZmhfY29tcG9zZQpAQCAtMTE3NiwxNyArMTIxOSwxMzAgQEAKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOwogCXN0cnVjdCBzdmNfZXhwa2V5ICplayA9IGV4cF9maW5kX2tleShjbHAsIGZzaWRfdHlwZSwgZnNpZHYsIHJlcXApOwotCWlmICghZWsgfHwgSVNfRVJSKGVrKSkKKwlpZiAoSVNfRVJSKGVrKSkKIAkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihlaykpOwogCiAJZXhwID0gZXhwX2dldF9ieV9uYW1lKGNscCwgZWstPmVrX21udCwgZWstPmVrX2RlbnRyeSwgcmVxcCk7CiAJY2FjaGVfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOwogCi0JaWYgKCFleHAgfHwgSVNfRVJSKGV4cCkpCisJaWYgKElTX0VSUihleHApKQogCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGV4cCkpOwogCXJldHVybiBleHA7CiB9CiAKK19fYmUzMiBjaGVja19uZnNkX2FjY2VzcyhzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmY7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZW5kID0gZXhwLT5leF9mbGF2b3JzICsgZXhwLT5leF9uZmxhdm9yczsKKworCS8qIGxlZ2FjeSBnc3Mtb25seSBjbGllbnRzIGFyZSBhbHdheXMgT0s6ICovCisJaWYgKGV4cC0+ZXhfY2xpZW50ID09IHJxc3RwLT5ycV9nc3NjbGllbnQpCisJCXJldHVybiAwOworCS8qIGlwLWFkZHJlc3MgYmFzZWQgY2xpZW50OyBjaGVjayBzZWM9IGV4cG9ydCBvcHRpb246ICovCisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZW5kOyBmKyspIHsKKwkJaWYgKGYtPnBzZXVkb2ZsYXZvciA9PSBycXN0cC0+cnFfZmxhdm9yKQorCQkJcmV0dXJuIDA7CisJfQorCS8qIGRlZmF1bHRzIGluIGFic2VuY2Ugb2Ygc2VjPSBvcHRpb25zOiAqLworCWlmIChleHAtPmV4X25mbGF2b3JzID09IDApIHsKKwkJaWYgKHJxc3RwLT5ycV9mbGF2b3IgPT0gUlBDX0FVVEhfTlVMTCB8fAorCQkgICAgcnFzdHAtPnJxX2ZsYXZvciA9PSBSUENfQVVUSF9VTklYKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiBuZnNlcnJfd3JvbmdzZWM7Cit9CisKKy8qCisgKiBVc2VzIHJxX2NsaWVudCBhbmQgcnFfZ3NzY2xpZW50IHRvIGZpbmQgYW4gZXhwb3J0OyB1c2VzIHJxX2NsaWVudCAoYW4KKyAqIGF1dGhfdW5peCBjbGllbnQpIGlmIGl0J3MgYXZhaWxhYmxlIGFuZCBoYXMgc2VjaW5mbyBpbmZvcm1hdGlvbjsKKyAqIG90aGVyd2lzZSwgd2lsbCB0cnkgdG8gdXNlIHJxX2dzc2NsaWVudC4KKyAqCisgKiBDYWxsZWQgZnJvbSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgcmVxdWVzdHM7IGZ1bmN0aW9ucyB0aGF0IGRvIHdvcmsgb24KKyAqIGJlaGFsZiBvZiBtb3VudGQgYXJlIHBhc3NlZCBhIHNpbmdsZSBjbGllbnQgbmFtZSB0byB1c2UsIGFuZCBzaG91bGQKKyAqIHVzZSBleHBfZ2V0X2J5X25hbWUoKSBvciBleHBfZmluZCgpLgorICovCitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCitycXN0X2V4cF9nZXRfYnlfbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpnc3NleHAsICpleHAgPSBOVUxMOworCisJaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKKwkJZ290byBnc3M7CisKKwkvKiBGaXJzdCB0cnkgdGhlIGF1dGhfdW5peCBjbGllbnQ6ICovCisJZXhwID0gZXhwX2dldF9ieV9uYW1lKHJxc3RwLT5ycV9jbGllbnQsIG1udCwgZGVudHJ5LAorCQkJCQkJJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlpZiAoUFRSX0VSUihleHApID09IC1FTk9FTlQpCisJCWdvdG8gZ3NzOworCWlmIChJU19FUlIoZXhwKSkKKwkJcmV0dXJuIGV4cDsKKwkvKiBJZiBpdCBoYXMgc2VjaW5mbywgYXNzdW1lIHRoZXJlIGFyZSBubyBnc3MvLi4uIGNsaWVudHMgKi8KKwlpZiAoZXhwLT5leF9uZmxhdm9ycyA+IDApCisJCXJldHVybiBleHA7Citnc3M6CisJLyogT3RoZXJ3aXNlLCB0cnkgZmFsbGluZyBiYWNrIG9uIGdzcyBjbGllbnQgKi8KKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gZXhwOworCWdzc2V4cCA9IGV4cF9nZXRfYnlfbmFtZShycXN0cC0+cnFfZ3NzY2xpZW50LCBtbnQsIGRlbnRyeSwKKwkJCQkJCSZycXN0cC0+cnFfY2hhbmRsZSk7CisJaWYgKFBUUl9FUlIoZ3NzZXhwKSA9PSAtRU5PRU5UKQorCQlyZXR1cm4gZXhwOworCWlmIChleHAgJiYgIUlTX0VSUihleHApKQorCQlleHBfcHV0KGV4cCk7CisJcmV0dXJuIGdzc2V4cDsKK30KKworc3RydWN0IHN2Y19leHBvcnQgKgorcnFzdF9leHBfZmluZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgZnNpZF90eXBlLCB1MzIgKmZzaWR2KQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpnc3NleHAsICpleHAgPSBOVUxMOworCisJaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKKwkJZ290byBnc3M7CisKKwkvKiBGaXJzdCB0cnkgdGhlIGF1dGhfdW5peCBjbGllbnQ6ICovCisJZXhwID0gZXhwX2ZpbmQocnFzdHAtPnJxX2NsaWVudCwgZnNpZF90eXBlLCBmc2lkdiwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlpZiAoUFRSX0VSUihleHApID09IC1FTk9FTlQpCisJCWdvdG8gZ3NzOworCWlmIChJU19FUlIoZXhwKSkKKwkJcmV0dXJuIGV4cDsKKwkvKiBJZiBpdCBoYXMgc2VjaW5mbywgYXNzdW1lIHRoZXJlIGFyZSBubyBnc3MvLi4uIGNsaWVudHMgKi8KKwlpZiAoZXhwLT5leF9uZmxhdm9ycyA+IDApCisJCXJldHVybiBleHA7Citnc3M6CisJLyogT3RoZXJ3aXNlLCB0cnkgZmFsbGluZyBiYWNrIG9uIGdzcyBjbGllbnQgKi8KKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gZXhwOworCWdzc2V4cCA9IGV4cF9maW5kKHJxc3RwLT5ycV9nc3NjbGllbnQsIGZzaWRfdHlwZSwgZnNpZHYsCisJCQkJCQkmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmIChQVFJfRVJSKGdzc2V4cCkgPT0gLUVOT0VOVCkKKwkJcmV0dXJuIGV4cDsKKwlpZiAoZXhwICYmICFJU19FUlIoZXhwKSkKKwkJZXhwX3B1dChleHApOworCXJldHVybiBnc3NleHA7Cit9CisKK3N0cnVjdCBzdmNfZXhwb3J0ICoKK3Jxc3RfZXhwX3BhcmVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHA7CisKKwlkZ2V0KGRlbnRyeSk7CisJZXhwID0gcnFzdF9leHBfZ2V0X2J5X25hbWUocnFzdHAsIG1udCwgZGVudHJ5KTsKKworCXdoaWxlIChQVFJfRVJSKGV4cCkgPT0gLUVOT0VOVCAmJiAhSVNfUk9PVChkZW50cnkpKSB7CisJCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJCWRlbnRyeSA9IHBhcmVudDsKKwkJZXhwID0gcnFzdF9leHBfZ2V0X2J5X25hbWUocnFzdHAsIG1udCwgZGVudHJ5KTsKKwl9CisJZHB1dChkZW50cnkpOworCXJldHVybiBleHA7Cit9CiAKIC8qCiAgKiBDYWxsZWQgd2hlbiB3ZSBuZWVkIHRoZSBmaWxlaGFuZGxlIGZvciB0aGUgcm9vdCBvZiB0aGUgcHNldWRvZnMsCkBAIC0xMTk0LDggKzEzNTAsNyBAQAogICogZXhwb3J0IHBvaW50IHdpdGggZnNpZD09MAogICovCiBfX2JlMzIKLWV4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCi0JICAgICAgIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpCitleHBfcHNldWRvcm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cDsKIAlfX2JlMzIgcnY7CkBAIC0xMjAzLDEyICsxMzU4LDE2IEBACiAKIAlta19mc2lkKEZTSURfTlVNLCBmc2lkdiwgMCwgMCwgMCwgTlVMTCk7CiAKLQlleHAgPSBleHBfZmluZChjbHAsIEZTSURfTlVNLCBmc2lkdiwgY3JlcSk7CisJZXhwID0gcnFzdF9leHBfZmluZChycXN0cCwgRlNJRF9OVU0sIGZzaWR2KTsKKwlpZiAoUFRSX0VSUihleHApID09IC1FTk9FTlQpCisJCXJldHVybiBuZnNlcnJfcGVybTsKIAlpZiAoSVNfRVJSKGV4cCkpCiAJCXJldHVybiBuZnNlcnJubyhQVFJfRVJSKGV4cCkpOwotCWlmIChleHAgPT0gTlVMTCkKLQkJcmV0dXJuIG5mc2Vycl9wZXJtOwogCXJ2ID0gZmhfY29tcG9zZShmaHAsIGV4cCwgZXhwLT5leF9kZW50cnksIE5VTEwpOworCWlmIChydikKKwkJZ290byBvdXQ7CisJcnYgPSBjaGVja19uZnNkX2FjY2VzcyhleHAsIHJxc3RwKTsKK291dDoKIAlleHBfcHV0KGV4cCk7CiAJcmV0dXJuIHJ2OwogfQpAQCAtMTI5NiwyOCArMTQ1NSw2MiBAQAogCXsgMCwgeyIiLCAiIn19CiB9OwogCi1zdGF0aWMgdm9pZCBleHBfZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZywgaW50IGZzaWQsCi0JCXVpZF90IGFub251LCB1aWRfdCBhbm9uZywgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2MpCitzdGF0aWMgdm9pZCBzaG93X2V4cGZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWdzLCBpbnQgbWFzaykKIHsKLQlpbnQgZmlyc3QgPSAwOwogCXN0cnVjdCBmbGFncyAqZmxnOworCWludCBzdGF0ZSwgZmlyc3QgPSAwOwogCiAJZm9yIChmbGcgPSBleHBmbGFnczsgZmxnLT5mbGFnOyBmbGcrKykgewotCQlpbnQgc3RhdGUgPSAoZmxnLT5mbGFnICYgZmxhZyk/MDoxOworCQlpZiAoZmxnLT5mbGFnICYgfm1hc2spCisJCQljb250aW51ZTsKKwkJc3RhdGUgPSAoZmxnLT5mbGFnICYgZmxhZ3MpID8gMCA6IDE7CiAJCWlmICgqZmxnLT5uYW1lW3N0YXRlXSkKIAkJCXNlcV9wcmludGYobSwgIiVzJXMiLCBmaXJzdCsrPyIsIjoiIiwgZmxnLT5uYW1lW3N0YXRlXSk7CiAJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X3NlY2luZm9fZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZ3MpCit7CisJc2VxX3ByaW50ZihtLCAiLCIpOworCXNob3dfZXhwZmxhZ3MobSwgZmxhZ3MsIE5GU0VYUF9TRUNJTkZPX0ZMQUdTKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19zZWNpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmVuZCA9IGV4cC0+ZXhfZmxhdm9ycyArIGV4cC0+ZXhfbmZsYXZvcnM7CisJaW50IGxhc3RmbGFncyA9IDAsIGZpcnN0ID0gMDsKKworCWlmIChleHAtPmV4X25mbGF2b3JzID09IDApCisJCXJldHVybjsKKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBlbmQ7IGYrKykgeworCQlpZiAoZmlyc3QgfHwgZi0+ZmxhZ3MgIT0gbGFzdGZsYWdzKSB7CisJCQlpZiAoIWZpcnN0KQorCQkJCXNob3dfc2VjaW5mb19mbGFncyhtLCBsYXN0ZmxhZ3MpOworCQkJc2VxX3ByaW50ZihtLCAiLHNlYz0lZCIsIGYtPnBzZXVkb2ZsYXZvcik7CisJCQlsYXN0ZmxhZ3MgPSBmLT5mbGFnczsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYobSwgIjolZCIsIGYtPnBzZXVkb2ZsYXZvcik7CisJCX0KKwl9CisJc2hvd19zZWNpbmZvX2ZsYWdzKG0sIGxhc3RmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cF9mbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBmbGFnLCBpbnQgZnNpZCwKKwkJdWlkX3QgYW5vbnUsIHVpZF90IGFub25nLCBzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zICpmc2xvYykKK3sKKwlzaG93X2V4cGZsYWdzKG0sIGZsYWcsIE5GU0VYUF9BTExGTEFHUyk7CiAJaWYgKGZsYWcgJiBORlNFWFBfRlNJRCkKLQkJc2VxX3ByaW50ZihtLCAiJXNmc2lkPSVkIiwgZmlyc3QrKz8iLCI6IiIsIGZzaWQpOworCQlzZXFfcHJpbnRmKG0sICIsZnNpZD0lZCIsIGZzaWQpOwogCWlmIChhbm9udSAhPSAodWlkX3QpLTIgJiYgYW5vbnUgIT0gKDB4MTAwMDAtMikpCi0JCXNlcV9wcmludGYobSwgIiVzYW5vbnVpZD0lZCIsIGZpcnN0Kys/IiwiOiIiLCBhbm9udSk7CisJCXNlcV9wcmludGYobSwgIixzYW5vbnVpZD0lZCIsIGFub251KTsKIAlpZiAoYW5vbmcgIT0gKGdpZF90KS0yICYmIGFub25nICE9ICgweDEwMDAwLTIpKQotCQlzZXFfcHJpbnRmKG0sICIlc2Fub25naWQ9JWQiLCBmaXJzdCsrPyIsIjoiIiwgYW5vbmcpOworCQlzZXFfcHJpbnRmKG0sICIsc2Fub25naWQ9JWQiLCBhbm9uZyk7CiAJaWYgKGZzbG9jICYmIGZzbG9jLT5sb2NhdGlvbnNfY291bnQgPiAwKSB7CiAJCWNoYXIgKmxvY3R5cGUgPSAoZnNsb2MtPm1pZ3JhdGVkKSA/ICJyZWZlciIgOiAicmVwbGljYXMiOwogCQlpbnQgaTsKIAotCQlzZXFfcHJpbnRmKG0sICIlcyVzPSIsIGZpcnN0Kys/IiwiOiIiLCBsb2N0eXBlKTsKKwkJc2VxX3ByaW50ZihtLCAiLCVzPSIsIGxvY3R5cGUpOwogCQlzZXFfZXNjYXBlKG0sIGZzbG9jLT5sb2NhdGlvbnNbMF0ucGF0aCwgIiw7QCBcdFxuXFwiKTsKIAkJc2VxX3B1dGMobSwgJ0AnKTsKIAkJc2VxX2VzY2FwZShtLCBmc2xvYy0+bG9jYXRpb25zWzBdLmhvc3RzLCAiLDtAIFx0XG5cXCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9sb2NrZC5jIGIvZnMvbmZzZC9sb2NrZC5jCmluZGV4IDIyMWFjZDEuLjllNGE1NjggMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbG9ja2QuYworKysgYi9mcy9uZnNkL2xvY2tkLmMKQEAgLTY1LDYgKzY1LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgbmxtc3ZjX2JpbmRpbmcJbmZzZF9ubG1fb3BzID0gewogCS5mb3BlbgkJPSBubG1fZm9wZW4sCQkvKiBvcGVuIGZpbGUgZm9yIGxvY2tpbmcgKi8KIAkuZmNsb3NlCQk9IG5sbV9mY2xvc2UsCQkvKiBjbG9zZSBmaWxlICovCisJLmdldF9ncmFjZV9wZXJpb2QgPSBnZXRfbmZzNF9ncmFjZV9wZXJpb2QsCiB9OwogCiB2b2lkCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRhY2wuYyBiL2ZzL25mc2QvbmZzNGFjbC5jCmluZGV4IGNjM2I3YmEuLmI2ZWQzODMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGFjbC5jCisrKyBiL2ZzL25mc2QvbmZzNGFjbC5jCkBAIC0xODMsOCArMTgzLDEzIEBACiBzdW1tYXJpemVfcG9zaXhfYWNsKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc3RydWN0IHBvc2l4X2FjbF9zdW1tYXJ5ICpwYXMpCiB7CiAJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKLQlwYXMtPnVzZXJzID0gMDsKLQlwYXMtPmdyb3VwcyA9IDA7CisKKwkvKgorCSAqIE9ubHkgcGFzLnVzZXJzIGFuZCBwYXMuZ3JvdXBzIG5lZWQgaW5pdGlhbGl6YXRpb247IHByZXZpb3VzCisJICogcG9zaXhfYWNsX3ZhbGlkKCkgY2FsbHMgZW5zdXJlIHRoYXQgdGhlIG90aGVyIGZpZWxkcyB3aWxsIGJlCisJICogaW5pdGlhbGl6ZWQgaW4gdGhlIGZvbGxvd2luZyBsb29wLiAgQnV0LCBqdXN0IHRvIHBsYWNhdGUgZ2NjOgorCSAqLworCW1lbXNldChwYXMsIDAsIHNpemVvZigqcGFzKSk7CiAJcGFzLT5tYXNrID0gMDc7CiAKIAlwZSA9IGFjbC0+YV9lbnRyaWVzICsgYWNsLT5hX2NvdW50OwpAQCAtNzMyLDEzICs3MzcsMTYgQEAKIAkqcGFjbCA9IHBvc2l4X3N0YXRlX3RvX2FjbCgmZWZmZWN0aXZlX2FjbF9zdGF0ZSwgZmxhZ3MpOwogCWlmIChJU19FUlIoKnBhY2wpKSB7CiAJCXJldCA9IFBUUl9FUlIoKnBhY2wpOworCQkqcGFjbCA9IE5VTEw7CiAJCWdvdG8gb3V0X2RzdGF0ZTsKIAl9CiAJKmRwYWNsID0gcG9zaXhfc3RhdGVfdG9fYWNsKCZkZWZhdWx0X2FjbF9zdGF0ZSwKIAkJCQkJCWZsYWdzIHwgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKIAlpZiAoSVNfRVJSKCpkcGFjbCkpIHsKIAkJcmV0ID0gUFRSX0VSUigqZHBhY2wpOworCQkqZHBhY2wgPSBOVUxMOwogCQlwb3NpeF9hY2xfcmVsZWFzZSgqcGFjbCk7CisJCSpwYWNsID0gTlVMTDsKIAkJZ290byBvdXRfZHN0YXRlOwogCX0KIAlzb3J0X3BhY2woKnBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKaW5kZXggNTQ0M2M1Mi4uMzFkNjYzMyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYworKysgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCkBAIC03NSw3ICs3NSw3IEBACiAjZGVmaW5lIG9wX2VuY19zegkJCTEKICNkZWZpbmUgb3BfZGVjX3N6CQkJMgogI2RlZmluZSBlbmNfbmZzNF9maF9zegkJCSgxICsgKE5GUzRfRkhTSVpFID4+IDIpKQotI2RlZmluZSBlbmNfc3RhdGVpZF9zegkJCTE2CisjZGVmaW5lIGVuY19zdGF0ZWlkX3N6CQkJKE5GUzRfU1RBVEVJRF9TSVpFID4+IDIpCiAjZGVmaW5lIE5GUzRfZW5jX2NiX3JlY2FsbF9zegkJKGNiX2NvbXBvdW5kX2VuY19oZHJfc3ogKyAgICAgICBcCiAJCQkJCTEgKyBlbmNfc3RhdGVpZF9zeiArICAgICAgICAgICAgXAogCQkJCQllbmNfbmZzNF9maF9zeikKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGlkbWFwLmMgYi9mcy9uZnNkL25mczRpZG1hcC5jCmluZGV4IDQ1YWEyMWMuLjJjZjlhOWEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGlkbWFwLmMKKysrIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwpAQCAtNTg3LDYgKzU4NywxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjaGFyICoKK3Jxc3RfYXV0aG5hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgYXV0aF9kb21haW4gKmNscDsKKworCWNscCA9IHJxc3RwLT5ycV9nc3NjbGllbnQgPyBycXN0cC0+cnFfZ3NzY2xpZW50IDogcnFzdHAtPnJxX2NsaWVudDsKKwlyZXR1cm4gY2xwLT5uYW1lOworfQorCiBzdGF0aWMgaW50CiBpZG1hcF9uYW1lX3RvX2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLCB1MzIgbmFtZWxlbiwKIAkJdWlkX3QgKmlkKQpAQCAtNjAwLDcgKzYwOSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCW1lbWNweShrZXkubmFtZSwgbmFtZSwgbmFtZWxlbik7CiAJa2V5Lm5hbWVbbmFtZWxlbl0gPSAnXDAnOwotCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0cC0+cnFfY2xpZW50LT5uYW1lLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CisJc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RfYXV0aG5hbWUocnFzdHApLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CiAJcmV0ID0gaWRtYXBfbG9va3VwKHJxc3RwLCBuYW1ldG9pZF9sb29rdXAsICZrZXksICZuYW1ldG9pZF9jYWNoZSwgJml0ZW0pOwogCWlmIChyZXQgPT0gLUVOT0VOVCkKIAkJcmV0ID0gLUVTUkNIOyAvKiBuZnNlcnJfYmFkbmFtZSAqLwpAQCAtNjIwLDcgKzYyOSw3IEBACiAJfTsKIAlpbnQgcmV0OwogCi0Jc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RwLT5ycV9jbGllbnQtPm5hbWUsIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKKwlzdHJsY3B5KGtleS5hdXRobmFtZSwgcnFzdF9hdXRobmFtZShycXN0cCksIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKIAlyZXQgPSBpZG1hcF9sb29rdXAocnFzdHAsIGlkdG9uYW1lX2xvb2t1cCwgJmtleSwgJmlkdG9uYW1lX2NhY2hlLCAmaXRlbSk7CiAJaWYgKHJldCA9PSAtRU5PRU5UKQogCQlyZXR1cm4gc3ByaW50ZihuYW1lLCAiJXUiLCBpZCk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKaW5kZXggODUyMjcyOS4uM2M2MjcxMiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3hkcjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19QUk9DCiAKQEAgLTI4Niw4ICsyODcsNyBAQAogCV9fYmUzMiBzdGF0dXM7CiAKIAlmaF9wdXQoJmNzdGF0ZS0+Y3VycmVudF9maCk7Ci0Jc3RhdHVzID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKLQkJCSAgICAgICZycXN0cC0+cnFfY2hhbmRsZSk7CisJc3RhdHVzID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ3NCw4ICs0NzQsOCBAQAogCV9fYmUzMiByZXQ7CiAKIAlmaF9pbml0KCZ0bXBfZmgsIE5GUzRfRkhTSVpFKTsKLQlpZigocmV0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJnRtcF9maCwKLQkJCSAgICAgICZycXN0cC0+cnFfY2hhbmRsZSkpICE9IDApCisJcmV0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAsICZ0bXBfZmgpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKHRtcF9maC5maF9kZW50cnkgPT0gY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSkgewogCQlmaF9wdXQoJnRtcF9maCk7CkBAIC02MTEsNiArNjExLDMwIEBACiB9CiAKIHN0YXRpYyBfX2JlMzIKK25mc2Q0X3NlY2luZm8oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJICAgICAgc3RydWN0IG5mc2Q0X3NlY2luZm8gKnNlY2luZm8pCit7CisJc3RydWN0IHN2Y19maCByZXNmaDsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlfX2JlMzIgZXJyOworCisJZmhfaW5pdCgmcmVzZmgsIE5GUzRfRkhTSVpFKTsKKwllcnIgPSBuZnNkX2xvb2t1cF9kZW50cnkocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsCisJCQkJICAgIHNlY2luZm8tPnNpX25hbWUsIHNlY2luZm8tPnNpX25hbWVsZW4sCisJCQkJICAgICZleHAsICZkZW50cnkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKSB7CisJCWV4cF9wdXQoZXhwKTsKKwkJZXJyID0gbmZzZXJyX25vZW50OworCX0gZWxzZQorCQlzZWNpbmZvLT5zaV9leHAgPSBleHA7CisJZHB1dChkZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCiAJICAgICAgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCiB7CkBAIC0xMDA5LDYgKzEwMzMsOSBAQAogCVtPUF9TQVZFRkhdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2F2ZWZoLAogCX0sCisJW09QX1NFQ0lORk9dID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2VjaW5mbywKKwl9LAogCVtPUF9TRVRBVFRSXSA9IHsKIAkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3NldGF0dHIsCiAJfSwKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCmluZGV4IDhjNTI5MTMuLmU0YTRjODcgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtNDksOCArNDksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC94ZHI0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9iaW5kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWSAgICAgICAgICAgICAgICBORlNEREJHX1BST0MKIApAQCAtMTQ5LDYgKzE1MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbnVtX2RlbGVnYXRpb25zOwordW5zaWduZWQgaW50IG1heF9kZWxlZ2F0aW9uczsKIAogLyoKICAqIE9wZW4gb3duZXIgc3RhdGUgKHNoYXJlIGxvY2tzKQpAQCAtMTkyLDcgKzE5NSw5IEBACiAJc3RydWN0IG5mczRfY2FsbGJhY2sgKmNiID0gJnN0cC0+c3Rfc3RhdGVvd25lci0+c29fY2xpZW50LT5jbF9jYWxsYmFjazsKIAogCWRwcmludGsoIk5GU0QgYWxsb2NfaW5pdF9kZWxlZ1xuIik7Ci0JaWYgKG51bV9kZWxlZ2F0aW9ucyA+IFNUQVRFSURfSEFTSF9TSVpFICogNCkKKwlpZiAoZnAtPmZpX2hhZF9jb25mbGljdCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG51bV9kZWxlZ2F0aW9ucyA+IG1heF9kZWxlZ2F0aW9ucykKIAkJcmV0dXJuIE5VTEw7CiAJZHAgPSBrbWVtX2NhY2hlX2FsbG9jKGRlbGVnX3NsYWIsIEdGUF9LRVJORUwpOwogCWlmIChkcCA9PSBOVUxMKQpAQCAtOTk5LDYgKzEwMDQsNyBAQAogCQlsaXN0X2FkZCgmZnAtPmZpX2hhc2gsICZmaWxlX2hhc2h0YmxbaGFzaHZhbF0pOwogCQlmcC0+ZmlfaW5vZGUgPSBpZ3JhYihpbm8pOwogCQlmcC0+ZmlfaWQgPSBjdXJyZW50X2ZpbGVpZCsrOworCQlmcC0+ZmlfaGFkX2NvbmZsaWN0ID0gZmFsc2U7CiAJCXJldHVybiBmcDsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC0xMzI1LDYgKzEzMzEsNyBAQAogewogCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gX19kcDsKIAorCWRwLT5kbF9maWxlLT5maV9oYWRfY29uZmxpY3QgPSB0cnVlOwogCW5mc2Q0X2NiX3JlY2FsbChkcCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTkwLDIwICszMTk3LDQ5IEBACiAJCXByaW50aygiTkZTRDogRmFpbHVyZSByZWFkaW5nIHJlYm9vdCByZWNvdmVyeSBkYXRhXG4iKTsKIH0KIAordW5zaWduZWQgbG9uZworZ2V0X25mczRfZ3JhY2VfcGVyaW9kKHZvaWQpCit7CisJcmV0dXJuIG1heCh1c2VyX2xlYXNlX3RpbWUsIGxlYXNlX3RpbWUpICogSFo7Cit9CisKKy8qCisgKiBTaW5jZSB0aGUgbGlmZXRpbWUgb2YgYSBkZWxlZ2F0aW9uIGlzbid0IGxpbWl0ZWQgdG8gdGhhdCBvZiBhbiBvcGVuLCBhCisgKiBjbGllbnQgbWF5IHF1aXRlIHJlYXNvbmFibHkgaGFuZyBvbiB0byBhIGRlbGVnYXRpb24gYXMgbG9uZyBhcyBpdCBoYXMKKyAqIHRoZSBpbm9kZSBjYWNoZWQuICBUaGlzIGJlY29tZXMgYW4gb2J2aW91cyBwcm9ibGVtIHRoZSBmaXJzdCB0aW1lIGEKKyAqIGNsaWVudCdzIGlub2RlIGNhY2hlIGFwcHJvYWNoZXMgdGhlIHNpemUgb2YgdGhlIHNlcnZlcidzIHRvdGFsIG1lbW9yeS4KKyAqCisgKiBGb3Igbm93IHdlIGF2b2lkIHRoaXMgcHJvYmxlbSBieSBpbXBvc2luZyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlcgorICogb2YgZGVsZWdhdGlvbnMsIHdoaWNoIHZhcmllcyBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlcidzIG1lbW9yeSBzaXplLgorICovCitzdGF0aWMgdm9pZAorc2V0X21heF9kZWxlZ2F0aW9ucyh2b2lkKQoreworCS8qCisJICogQWxsb3cgYXQgbW9zdCA0IGRlbGVnYXRpb25zIHBlciBtZWdhYnl0ZSBvZiBSQU0uICBRdWljaworCSAqIGVzdGltYXRlcyBzdWdnZXN0IHRoYXQgaW4gdGhlIHdvcnN0IGNhc2UgKHdoZXJlIGV2ZXJ5IGRlbGVnYXRpb24KKwkgKiBpcyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUpLCBhIGRlbGVnYXRpb24gY291bGQgdGFrZSBhYm91dCAxLjVLLAorCSAqIGdpdmluZyBhIHdvcnN0IGNhc2UgdXNhZ2Ugb2YgYWJvdXQgNiUgb2YgbWVtb3J5LgorCSAqLworCW1heF9kZWxlZ2F0aW9ucyA9IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgPj4gKDIwIC0gMiAtIFBBR0VfU0hJRlQpOworfQorCiAvKiBpbml0aWFsaXphdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIG5mc2Qgc2VydmljZSBpcyBzdGFydGVkOiAqLwogCiBzdGF0aWMgdm9pZAogX19uZnM0X3N0YXRlX3N0YXJ0KHZvaWQpCiB7Ci0JdGltZV90IGdyYWNlX3RpbWU7CisJdW5zaWduZWQgbG9uZyBncmFjZV90aW1lOwogCiAJYm9vdF90aW1lID0gZ2V0X3NlY29uZHMoKTsKLQlncmFjZV90aW1lID0gbWF4KHVzZXJfbGVhc2VfdGltZSwgbGVhc2VfdGltZSk7CisJZ3JhY2VfdGltZSA9IGdldF9uZnNfZ3JhY2VfcGVyaW9kKCk7CiAJbGVhc2VfdGltZSA9IHVzZXJfbGVhc2VfdGltZTsKIAlpbl9ncmFjZSA9IDE7Ci0JcHJpbnRrKCJORlNEOiBzdGFydGluZyAlbGQtc2Vjb25kIGdyYWNlIHBlcmlvZFxuIiwgZ3JhY2VfdGltZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTkZTRDogc3RhcnRpbmcgJWxkLXNlY29uZCBncmFjZSBwZXJpb2RcbiIsCisJICAgICAgIGdyYWNlX3RpbWUvSFopOwogCWxhdW5kcnlfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibmZzZDQiKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsobGF1bmRyeV93cSwgJmxhdW5kcm9tYXRfd29yaywgZ3JhY2VfdGltZSpIWik7CisJcXVldWVfZGVsYXllZF93b3JrKGxhdW5kcnlfd3EsICZsYXVuZHJvbWF0X3dvcmssIGdyYWNlX3RpbWUpOworCXNldF9tYXhfZGVsZWdhdGlvbnMoKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczR4ZHIuYyBiL2ZzL25mc2QvbmZzNHhkci5jCmluZGV4IDE1ODA5ZGYuLmIzZDU1YzYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHhkci5jCisrKyBiL2ZzL25mc2QvbmZzNHhkci5jCkBAIC01Niw2ICs1Niw4IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZF9pZG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19YRFIKIApAQCAtODE5LDYgKzgyMSwyMyBAQAogfQogCiBzdGF0aWMgX19iZTMyCituZnNkNF9kZWNvZGVfc2VjaW5mbyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLAorCQkgICAgIHN0cnVjdCBuZnNkNF9zZWNpbmZvICpzZWNpbmZvKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKHNlY2luZm8tPnNpX25hbWVsZW4pOworCVJFQURfQlVGKHNlY2luZm8tPnNpX25hbWVsZW4pOworCVNBVkVNRU0oc2VjaW5mby0+c2lfbmFtZSwgc2VjaW5mby0+c2lfbmFtZWxlbik7CisJc3RhdHVzID0gY2hlY2tfZmlsZW5hbWUoc2VjaW5mby0+c2lfbmFtZSwgc2VjaW5mby0+c2lfbmFtZWxlbiwKKwkJCQkJCQkJbmZzZXJyX25vZW50KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfc2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKIHsKIAlERUNPREVfSEVBRDsKQEAgLTExMzEsNiArMTE1MCw5IEBACiAJCWNhc2UgT1BfU0FWRUZIOgogCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKIAkJCWJyZWFrOworCQljYXNlIE9QX1NFQ0lORk86CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3NlY2luZm8oYXJncCwgJm9wLT51LnNlY2luZm8pOworCQkJYnJlYWs7CiAJCWNhc2UgT1BfU0VUQVRUUjoKIAkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfc2V0YXR0cihhcmdwLCAmb3AtPnUuc2V0YXR0cik7CiAJCQlicmVhazsKQEAgLTEyOTYsNyArMTMxOCw3IEBACiAJY2hhciAqcGF0aCwgKnJvb3RwYXRoOwogCiAJZmhfaW5pdCgmdG1wX2ZoLCBORlM0X0ZIU0laRSk7Ci0JKnN0YXQgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmdG1wX2ZoLCAmcnFzdHAtPnJxX2NoYW5kbGUpOworCSpzdGF0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAsICZ0bXBfZmgpOwogCWlmICgqc3RhdCkKIAkJcmV0dXJuIE5VTEw7CiAJcm9vdHBhdGggPSB0bXBfZmguZmhfZXhwb3J0LT5leF9wYXRoOwpAQCAtMTg0NywxMSArMTg2OSwxOSBAQAogCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgewogCQlpbnQgZXJyOwogCisJCS8qCisJCSAqIFdoeSB0aGUgaGVjayBhcmVuJ3Qgd2UganVzdCB1c2luZyBuZnNkX2xvb2t1cD8/CisJCSAqIERpZmZlcmVudCAiLiIvIi4uIiBoYW5kbGluZz8gIFNvbWV0aGluZyBlbHNlPworCQkgKiBBdCBsZWFzdCwgYWRkIGEgY29tbWVudCBoZXJlIHRvIGV4cGxhaW4uLi4uCisJCSAqLwogCQllcnIgPSBuZnNkX2Nyb3NzX21udChjZC0+cmRfcnFzdHAsICZkZW50cnksICZleHApOwogCQlpZiAoZXJyKSB7CiAJCQluZnNlcnIgPSBuZnNlcnJubyhlcnIpOwogCQkJZ290byBvdXRfcHV0OwogCQl9CisJCW5mc2VyciA9IGNoZWNrX25mc2RfYWNjZXNzKGV4cCwgY2QtPnJkX3Jxc3RwKTsKKwkJaWYgKG5mc2VycikKKwkJCWdvdG8gb3V0X3B1dDsKIAogCX0KIAluZnNlcnIgPSBuZnNkNF9lbmNvZGVfZmF0dHIoTlVMTCwgZXhwLCBkZW50cnksIHAsIGJ1ZmxlbiwgY2QtPnJkX2JtdmFsLApAQCAtMjQxOSw2ICsyNDQ5LDcyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX3NlY2luZm8oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLAorCQkgICAgIHN0cnVjdCBuZnNkNF9zZWNpbmZvICpzZWNpbmZvKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gc2VjaW5mby0+c2lfZXhwOworCXUzMiBuZmxhdnM7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZmxhdnM7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyBkZWZfZmxhdnNbMl07CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAobmZzZXJyKQorCQlnb3RvIG91dDsKKwlpZiAoZXhwLT5leF9uZmxhdm9ycykgeworCQlmbGF2cyA9IGV4cC0+ZXhfZmxhdm9yczsKKwkJbmZsYXZzID0gZXhwLT5leF9uZmxhdm9yczsKKwl9IGVsc2UgeyAvKiBIYW5kbGluZyBvZiBzb21lIGRlZmF1bHRzIGluIGFic2VuY2Ugb2YgcmVhbCBzZWNpbmZvOiAqLworCQlmbGF2cyA9IGRlZl9mbGF2czsKKwkJaWYgKGV4cC0+ZXhfY2xpZW50LT5mbGF2b3VyLT5mbGF2b3VyID09IFJQQ19BVVRIX1VOSVgpIHsKKwkJCW5mbGF2cyA9IDI7CisJCQlmbGF2c1swXS5wc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9VTklYOworCQkJZmxhdnNbMV0ucHNldWRvZmxhdm9yID0gUlBDX0FVVEhfTlVMTDsKKwkJfSBlbHNlIGlmIChleHAtPmV4X2NsaWVudC0+Zmxhdm91ci0+Zmxhdm91ciA9PSBSUENfQVVUSF9HU1MpIHsKKwkJCW5mbGF2cyA9IDE7CisJCQlmbGF2c1swXS5wc2V1ZG9mbGF2b3IKKwkJCQkJPSBzdmNhdXRoX2dzc19mbGF2b3IoZXhwLT5leF9jbGllbnQpOworCQl9IGVsc2UgeworCQkJbmZsYXZzID0gMTsKKwkJCWZsYXZzWzBdLnBzZXVkb2ZsYXZvcgorCQkJCQk9IGV4cC0+ZXhfY2xpZW50LT5mbGF2b3VyLT5mbGF2b3VyOworCQl9CisJfQorCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKG5mbGF2cyk7CisJQURKVVNUX0FSR1MoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmZsYXZzOyBpKyspIHsKKwkJdTMyIGZsYXYgPSBmbGF2c1tpXS5wc2V1ZG9mbGF2b3I7CisJCXN0cnVjdCBnc3NfYXBpX21lY2ggKmdtID0gZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcihmbGF2KTsKKworCQlpZiAoZ20pIHsKKwkJCVJFU0VSVkVfU1BBQ0UoNCk7CisJCQlXUklURTMyKFJQQ19BVVRIX0dTUyk7CisJCQlBREpVU1RfQVJHUygpOworCQkJUkVTRVJWRV9TUEFDRSg0ICsgZ20tPmdtX29pZC5sZW4pOworCQkJV1JJVEUzMihnbS0+Z21fb2lkLmxlbik7CisJCQlXUklURU1FTShnbS0+Z21fb2lkLmRhdGEsIGdtLT5nbV9vaWQubGVuKTsKKwkJCUFESlVTVF9BUkdTKCk7CisJCQlSRVNFUlZFX1NQQUNFKDQpOworCQkJV1JJVEUzMigwKTsgLyogcW9wICovCisJCQlBREpVU1RfQVJHUygpOworCQkJUkVTRVJWRV9TUEFDRSg0KTsKKwkJCVdSSVRFMzIoZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKGdtLCBmbGF2KSk7CisJCQlBREpVU1RfQVJHUygpOworCQkJZ3NzX21lY2hfcHV0KGdtKTsKKwkJfSBlbHNlIHsKKwkJCVJFU0VSVkVfU1BBQ0UoNCk7CisJCQlXUklURTMyKGZsYXYpOworCQkJQURKVVNUX0FSR1MoKTsKKwkJfQorCX0KK291dDoKKwlpZiAoZXhwKQorCQlleHBfcHV0KGV4cCk7Cit9CisKIC8qCiAgKiBUaGUgU0VUQVRUUiBlbmNvZGUgcm91dGluZSBpcyBzcGVjaWFsIC0tIGl0IGFsd2F5cyBlbmNvZGVzIGEgYml0bWFwLAogICogcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3Igc3RhdHVzLgpAQCAtMjU1OSw2ICsyNjU1LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBPUF9TQVZFRkg6CiAJCWJyZWFrOworCWNhc2UgT1BfU0VDSU5GTzoKKwkJbmZzZDRfZW5jb2RlX3NlY2luZm8ocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnNlY2luZm8pOworCQlicmVhazsKIAljYXNlIE9QX1NFVEFUVFI6CiAJCW5mc2Q0X2VuY29kZV9zZXRhdHRyKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5zZXRhdHRyKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuYwppbmRleCA3MWM2ODZkLi5iYWFjODlkIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2N0bC5jCisrKyBiL2ZzL25mc2QvbmZzY3RsLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC94ZHIuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL2ludGVyZmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtMjQ1LDcgKzI0NCw3IEBACiAJfQogCWV4cF9yZWFkdW5sb2NrKCk7CiAJaWYgKGVyciA9PSAwKQotCQllcnIgPSByZXMtPmZoX3NpemUgKyAoaW50KSYoKHN0cnVjdCBrbmZzZF9maCopMCktPmZoX2Jhc2U7CisJCWVyciA9IHJlcy0+Zmhfc2l6ZSArIG9mZnNldG9mKHN0cnVjdCBrbmZzZF9maCwgZmhfYmFzZSk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2ZoLmMgYi9mcy9uZnNkL25mc2ZoLmMKaW5kZXggNmNhMmQyNC4uMGViNDY0YSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNmaC5jCisrKyBiL2ZzL25mc2QvbmZzZmguYwpAQCAtMTUsMTAgKzE1LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfRkgKQEAgLTI3LDEwICsyOSw2IEBACiBzdGF0aWMgaW50IG5mc2RfbnJfdmVyaWZpZWQ7CiBzdGF0aWMgaW50IG5mc2RfbnJfcHV0OwogCi1leHRlcm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4cG9ydF9vcF9kZWZhdWx0OwotCi0jZGVmaW5lCUNBTEwob3BzLGZ1bikgKChvcHMtPmZ1bik/KG9wcy0+ZnVuKTpleHBvcnRfb3BfZGVmYXVsdC5mdW4pCi0KIC8qCiAgKiBvdXIgYWNjZXB0YWJpbGl0eSBmdW5jdGlvbi4KICAqIGlmIE5PU1VCVFJFRUNIRUNLLCBhY2NlcHQgYW55dGhpbmcKQEAgLTEyMyw4ICsxMjEsNiBAQAogCQlpbnQgZGF0YV9sZWZ0ID0gZmgtPmZoX3NpemUvNDsKIAogCQllcnJvciA9IG5mc2Vycl9zdGFsZTsKLQkJaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OwogCQlpZiAocnFzdHAtPnJxX3ZlcnMgPiAyKQogCQkJZXJyb3IgPSBuZnNlcnJfYmFkaGFuZGxlOwogCQlpZiAocnFzdHAtPnJxX3ZlcnMgPT0gNCAmJiBmaC0+Zmhfc2l6ZSA9PSAwKQpAQCAtMTQ4LDcgKzE0NCw3IEBACiAJCQkJZmgtPmZoX2ZzaWRbMV0gPSBmaC0+ZmhfZnNpZFsyXTsKIAkJCX0KIAkJCWlmICgoZGF0YV9sZWZ0IC09IGxlbik8MCkgZ290byBvdXQ7Ci0JCQlleHAgPSBleHBfZmluZChycXN0cC0+cnFfY2xpZW50LCBmaC0+ZmhfZnNpZF90eXBlLCBkYXRhcCwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkJCWV4cCA9IHJxc3RfZXhwX2ZpbmQocnFzdHAsIGZoLT5maF9mc2lkX3R5cGUsIGRhdGFwKTsKIAkJCWRhdGFwICs9IGxlbjsKIAkJfSBlbHNlIHsKIAkJCWRldl90IHhkZXY7CkBAIC0xNTksMjAgKzE1NSwxOCBAQAogCQkJeGRldiA9IG9sZF9kZWNvZGVfZGV2KGZoLT5vZmhfeGRldik7CiAJCQl4aW5vID0gdTMyX3RvX2lub190KGZoLT5vZmhfeGlubyk7CiAJCQlta19mc2lkKEZTSURfREVWLCB0ZmgsIHhkZXYsIHhpbm8sIDAsIE5VTEwpOwotCQkJZXhwID0gZXhwX2ZpbmQocnFzdHAtPnJxX2NsaWVudCwgRlNJRF9ERVYsIHRmaCwKLQkJCQkgICAgICAgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkJCWV4cCA9IHJxc3RfZXhwX2ZpbmQocnFzdHAsIEZTSURfREVWLCB0ZmgpOwogCQl9CiAKLQkJaWYgKElTX0VSUihleHApICYmIChQVFJfRVJSKGV4cCkgPT0gLUVBR0FJTgotCQkJCXx8IFBUUl9FUlIoZXhwKSA9PSAtRVRJTUVET1VUKSkgeworCQllcnJvciA9IG5mc2Vycl9zdGFsZTsKKwkJaWYgKFBUUl9FUlIoZXhwKSA9PSAtRU5PRU5UKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKElTX0VSUihleHApKSB7CiAJCQllcnJvciA9IG5mc2Vycm5vKFBUUl9FUlIoZXhwKSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWVycm9yID0gbmZzZXJyX3N0YWxlOyAKLQkJaWYgKCFleHAgfHwgSVNfRVJSKGV4cCkpCi0JCQlnb3RvIG91dDsKLQogCQkvKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gYSBzZWN1cmUgcG9ydC4gKi8KIAkJZXJyb3IgPSBuZnNlcnJfcGVybTsKIAkJaWYgKCFycXN0cC0+cnFfc2VjdXJlICYmIEVYX1NFQ1VSRShleHApKSB7CkBAIC0yMTEsMTEgKzIwNSw5IEBACiAJCWlmIChmaWxlaWRfdHlwZSA9PSAwKQogCQkJZGVudHJ5ID0gZGdldChleHAtPmV4X2RlbnRyeSk7CiAJCWVsc2UgewotCQkJc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBleHAtPmV4X21udC0+bW50X3NiLT5zX2V4cG9ydF9vcDsKLQkJCWRlbnRyeSA9IENBTEwobm9wLGRlY29kZV9maCkoZXhwLT5leF9tbnQtPm1udF9zYiwKLQkJCQkJCSAgICAgZGF0YXAsIGRhdGFfbGVmdCwKLQkJCQkJCSAgICAgZmlsZWlkX3R5cGUsCi0JCQkJCQkgICAgIG5mc2RfYWNjZXB0YWJsZSwgZXhwKTsKKwkJCWRlbnRyeSA9IGV4cG9ydGZzX2RlY29kZV9maChleHAtPmV4X21udCwgZGF0YXAsCisJCQkJCWRhdGFfbGVmdCwgZmlsZWlkX3R5cGUsCisJCQkJCW5mc2RfYWNjZXB0YWJsZSwgZXhwKTsKIAkJfQogCQlpZiAoZGVudHJ5ID09IE5VTEwpCiAJCQlnb3RvIG91dDsKQEAgLTI1Nyw4ICsyNDksMTkgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCisJaWYgKCEoYWNjZXNzICYgTUFZX0xPQ0spKSB7CisJCS8qCisJCSAqIHBzZXVkb2ZsYXZvciByZXN0cmljdGlvbnMgYXJlIG5vdCBlbmZvcmNlZCBvbiBOTE0sCisJCSAqIHdoaWNoIGNsaWVudHMgdmlydHVhbGx5IGFsd2F5cyB1c2UgYXV0aF9zeXMgZm9yLAorCQkgKiBldmVuIHdoaWxlIHVzaW5nIFJQQ1NFQ19HU1MgZm9yIE5GUy4KKwkJICovCisJCWVycm9yID0gY2hlY2tfbmZzZF9hY2Nlc3MoZXhwLCBycXN0cCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCX0KKwogCS8qIEZpbmFsbHksIGNoZWNrIGFjY2VzcyBwZXJtaXNzaW9ucy4gKi8KLQllcnJvciA9IG5mc2RfcGVybWlzc2lvbihleHAsIGRlbnRyeSwgYWNjZXNzKTsKKwllcnJvciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZXhwLCBkZW50cnksIGFjY2Vzcyk7CiAKIAlpZiAoZXJyb3IpIHsKIAkJZHByaW50aygiZmhfdmVyaWZ5OiAlcy8lcyBwZXJtaXNzaW9uIGZhaWx1cmUsICIKQEAgLTI4NiwxNSArMjg5LDEzIEBACiBzdGF0aWMgaW5saW5lIGludCBfZmhfdXBkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKIAkJCSAgICAgX191MzIgKmRhdGFwLCBpbnQgKm1heHNpemUpCiB7Ci0Jc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBleHAtPmV4X21udC0+bW50X3NiLT5zX2V4cG9ydF9vcDsKLQogCWlmIChkZW50cnkgPT0gZXhwLT5leF9kZW50cnkpIHsKIAkJKm1heHNpemUgPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gQ0FMTChub3AsZW5jb2RlX2ZoKShkZW50cnksIGRhdGFwLCBtYXhzaXplLAotCQkJICAhKGV4cC0+ZXhfZmxhZ3MmTkZTRVhQX05PU1VCVFJFRUNIRUNLKSk7CisJcmV0dXJuIGV4cG9ydGZzX2VuY29kZV9maChkZW50cnksIGRhdGFwLCBtYXhzaXplLAorCQkJICAhKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9TVUJUUkVFQ0hFQ0spKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzcHJvYy5jIGIvZnMvbmZzZC9uZnNwcm9jLmMKaW5kZXggYjJjNzE0Ny4uOTc3YTcxZiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnNwcm9jLmMKQEAgLTI3OCw3ICsyNzgsOCBAQAogCQkJCQkgKiAgIGVjaG8gdGhpbmcgPiBkZXZpY2Utc3BlY2lhbC1maWxlLW9yLXBpcGUKIAkJCQkJICogYnkgZG9pbmcgYSBDUkVBVEUgd2l0aCB0eXBlPT0wCiAJCQkJCSAqLwotCQkJCQluZnNlcnIgPSBuZnNkX3Blcm1pc3Npb24obmV3ZmhwLT5maF9leHBvcnQsCisJCQkJCW5mc2VyciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwKKwkJCQkJCQkJIG5ld2ZocC0+ZmhfZXhwb3J0LAogCQkJCQkJCQkgbmV3ZmhwLT5maF9kZW50cnksCiAJCQkJCQkJCSBNQVlfV1JJVEV8TUFZX0xPQ0FMX0FDQ0VTUyk7CiAJCQkJCWlmIChuZnNlcnIgJiYgbmZzZXJyICE9IG5mc2Vycl9yb2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggZmY1NTk1MC4uYThjODlhZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3N0cnVjdC5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CkBAIC00MzIsNiArNDMzLDcgQEAKIAkgKiBkaXJ0eSBwYWdlcy4KIAkgKi8KIAljdXJyZW50LT5mbGFncyB8PSBQRl9MRVNTX1RIUk9UVExFOworCXNldF9mcmVlemFibGUoKTsKIAogCS8qCiAJICogVGhlIG1haW4gcmVxdWVzdCBsb29wCkBAIC00OTIsNiArNDk0LDE1IEBACiAJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKIH0KIAorc3RhdGljIF9fYmUzMiBtYXBfbmV3X2Vycm9ycyh1MzIgdmVycywgX19iZTMyIG5mc2VycikKK3sKKwlpZiAobmZzZXJyID09IG5mc2Vycl9qdWtlYm94ICYmIHZlcnMgPT0gMikKKwkJcmV0dXJuIG5mc2Vycl9kcm9waXQ7CisJaWYgKG5mc2VyciA9PSBuZnNlcnJfd3JvbmdzZWMgJiYgdmVycyA8IDQpCisJCXJldHVybiBuZnNlcnJfYWNjZXM7CisJcmV0dXJuIG5mc2VycjsKK30KKwogaW50CiBuZnNkX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqc3RhdHApCiB7CkBAIC01MzQsNiArNTQ1LDcgQEAKIAogCS8qIE5vdyBjYWxsIHRoZSBwcm9jZWR1cmUgaGFuZGxlciwgYW5kIGVuY29kZSBORlMgc3RhdHVzLiAqLwogCW5mc2VyciA9IHByb2MtPnBjX2Z1bmMocnFzdHAsIHJxc3RwLT5ycV9hcmdwLCBycXN0cC0+cnFfcmVzcCk7CisJbmZzZXJyID0gbWFwX25ld19lcnJvcnMocnFzdHAtPnJxX3ZlcnMsIG5mc2Vycik7CiAJaWYgKG5mc2VyciA9PSBuZnNlcnJfanVrZWJveCAmJiBycXN0cC0+cnFfdmVycyA9PSAyKQogCQluZnNlcnIgPSBuZnNlcnJfZHJvcGl0OwogCWlmIChuZnNlcnIgPT0gbmZzZXJyX2Ryb3BpdCkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggOTQ1YjFjZS4uZTkwZjRhOCAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogCXdoaWxlIChmb2xsb3dfZG93bigmbW50LCZtb3VudHMpJiZkX21vdW50cG9pbnQobW91bnRzKSk7CiAKLQlleHAyID0gZXhwX2dldF9ieV9uYW1lKGV4cC0+ZXhfY2xpZW50LCBtbnQsIG1vdW50cywgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlleHAyID0gcnFzdF9leHBfZ2V0X2J5X25hbWUocnFzdHAsIG1udCwgbW91bnRzKTsKIAlpZiAoSVNfRVJSKGV4cDIpKSB7CiAJCWVyciA9IFBUUl9FUlIoZXhwMik7CiAJCWRwdXQobW91bnRzKTsKQEAgLTEzNSwyMSArMTM1LDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoKLSAqIExvb2sgdXAgb25lIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lLgotICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGZocCBhbmQgcmVzZmggbmVlZCBhbiBmaF9wdXQKLSAqCi0gKiBJZiB0aGUgbG9va3VwIHdvdWxkIGNyb3NzIGEgbW91bnRwb2ludCwgYW5kIHRoZSBtb3VudGVkIGZpbGVzeXN0ZW0KLSAqIGlzIGV4cG9ydGVkIHRvIHRoZSBjbGllbnQgd2l0aCBORlNFWFBfTk9ISURFLCB0aGVuIHRoZSBsb29rdXAgaXMKLSAqIGFjY2VwdGVkIGFzIGl0IHN0YW5kcyBhbmQgdGhlIG1vdW50ZWQgZGlyZWN0b3J5IGlzCi0gKiByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBjb3ZlcmVkIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KLSAqIE5PVEU6IHRoaXMgbW91bnRwb2ludCBjcm9zc2luZyBpcyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGJ5IGFsbAotICogICBjbGllbnRzIGFuZCBpcyBleHBsaWNpdGx5IGRpc2FsbG93ZWQgZm9yIE5GU3YzCi0gKiAgICAgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgotICovCiBfX2JlMzIKLW5mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJaW50IGxlbiwgc3RydWN0IHN2Y19maCAqcmVzZmgpCituZnNkX2xvb2t1cF9kZW50cnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAorCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLAorCQkgICBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqKmV4cF9yZXQsIHN0cnVjdCBkZW50cnkgKipkZW50cnlfcmV0KQogewogCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CiAJc3RydWN0IGRlbnRyeQkJKmRwYXJlbnQ7CkBAIC0xNjgsOCArMTU3LDYgQEAKIAlleHAgID0gZmhwLT5maF9leHBvcnQ7CiAJZXhwX2dldChleHApOwogCi0JZXJyID0gbmZzZXJyX2FjY2VzOwotCiAJLyogTG9va3VwIHRoZSBuYW1lLCBidXQgZG9uJ3QgZm9sbG93IGxpbmtzICovCiAJaWYgKGlzZG90ZW50KG5hbWUsIGxlbikpIHsKIAkJaWYgKGxlbj09MSkKQEAgLTE5MCwxNyArMTc3LDE1IEBACiAJCQlkcHV0KGRlbnRyeSk7CiAJCQlkZW50cnkgPSBkcDsKIAotCQkJZXhwMiA9IGV4cF9wYXJlbnQoZXhwLT5leF9jbGllbnQsIG1udCwgZGVudHJ5LAotCQkJCQkgICZycXN0cC0+cnFfY2hhbmRsZSk7Ci0JCQlpZiAoSVNfRVJSKGV4cDIpKSB7CisJCQlleHAyID0gcnFzdF9leHBfcGFyZW50KHJxc3RwLCBtbnQsIGRlbnRyeSk7CisJCQlpZiAoUFRSX0VSUihleHAyKSA9PSAtRU5PRU5UKSB7CisJCQkJZHB1dChkZW50cnkpOworCQkJCWRlbnRyeSA9IGRnZXQoZHBhcmVudCk7CisJCQl9IGVsc2UgaWYgKElTX0VSUihleHAyKSkgewogCQkJCWhvc3RfZXJyID0gUFRSX0VSUihleHAyKTsKIAkJCQlkcHV0KGRlbnRyeSk7CiAJCQkJbW50cHV0KG1udCk7CiAJCQkJZ290byBvdXRfbmZzZXJyOwotCQkJfQotCQkJaWYgKCFleHAyKSB7Ci0JCQkJZHB1dChkZW50cnkpOwotCQkJCWRlbnRyeSA9IGRnZXQoZHBhcmVudCk7CiAJCQl9IGVsc2UgewogCQkJCWV4cF9wdXQoZXhwKTsKIAkJCQlleHAgPSBleHAyOwpAQCAtMjIzLDYgKzIwOCw0MSBAQAogCQkJfQogCQl9CiAJfQorCSpkZW50cnlfcmV0ID0gZGVudHJ5OworCSpleHBfcmV0ID0gZXhwOworCXJldHVybiAwOworCitvdXRfbmZzZXJyOgorCWV4cF9wdXQoZXhwKTsKKwlyZXR1cm4gbmZzZXJybm8oaG9zdF9lcnIpOworfQorCisvKgorICogTG9vayB1cCBvbmUgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUuCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gZmhwIGFuZCByZXNmaCBuZWVkIGFuIGZoX3B1dAorICoKKyAqIElmIHRoZSBsb29rdXAgd291bGQgY3Jvc3MgYSBtb3VudHBvaW50LCBhbmQgdGhlIG1vdW50ZWQgZmlsZXN5c3RlbQorICogaXMgZXhwb3J0ZWQgdG8gdGhlIGNsaWVudCB3aXRoIE5GU0VYUF9OT0hJREUsIHRoZW4gdGhlIGxvb2t1cCBpcworICogYWNjZXB0ZWQgYXMgaXQgc3RhbmRzIGFuZCB0aGUgbW91bnRlZCBkaXJlY3RvcnkgaXMKKyAqIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGNvdmVyZWQgZGlyZWN0b3J5IGlzIHJldHVybmVkLgorICogTk9URTogdGhpcyBtb3VudHBvaW50IGNyb3NzaW5nIGlzIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgYnkgYWxsCisgKiAgIGNsaWVudHMgYW5kIGlzIGV4cGxpY2l0bHkgZGlzYWxsb3dlZCBmb3IgTkZTdjMKKyAqICAgICAgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisgKi8KK19fYmUzMgorbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQlpbnQgbGVuLCBzdHJ1Y3Qgc3ZjX2ZoICpyZXNmaCkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydAkqZXhwOworCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CisJX19iZTMyIGVycjsKKworCWVyciA9IG5mc2RfbG9va3VwX2RlbnRyeShycXN0cCwgZmhwLCBuYW1lLCBsZW4sICZleHAsICZkZW50cnkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gY2hlY2tfbmZzZF9hY2Nlc3MoZXhwLCBycXN0cCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAJLyoKIAkgKiBOb3RlOiB3ZSBjb21wb3NlIHRoZSBmaWxlIGhhbmRsZSBub3csIGJ1dCBhcyB0aGUKIAkgKiBkZW50cnkgbWF5IGJlIG5lZ2F0aXZlLCBpdCBtYXkgbmVlZCB0byBiZSB1cGRhdGVkLgpAQCAtMjMwLDE2ICsyNTAsMTMgQEAKIAllcnIgPSBmaF9jb21wb3NlKHJlc2ZoLCBleHAsIGRlbnRyeSwgZmhwKTsKIAlpZiAoIWVyciAmJiAhZGVudHJ5LT5kX2lub2RlKQogCQllcnIgPSBuZnNlcnJfbm9lbnQ7Ci0JZHB1dChkZW50cnkpOwogb3V0OgorCWRwdXQoZGVudHJ5KTsKIAlleHBfcHV0KGV4cCk7CiAJcmV0dXJuIGVycjsKLQotb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7Ci0JZ290byBvdXQ7CiB9CiAKKwogLyoKICAqIFNldCB2YXJpb3VzIGZpbGUgYXR0cmlidXRlcy4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKQEAgLTMxMSw3ICszMjgsNyBAQAogCS8qIFRoZSBzaXplIGNhc2UgaXMgc3BlY2lhbC4gSXQgY2hhbmdlcyB0aGUgZmlsZSBhcyB3ZWxsIGFzIHRoZSBhdHRyaWJ1dGVzLiAgKi8KIAlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgewogCQlpZiAoaWFwLT5pYV9zaXplIDwgaW5vZGUtPmlfc2l6ZSkgewotCQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+ZmhfZXhwb3J0LCBkZW50cnksIE1BWV9UUlVOQ3xNQVlfT1dORVJfT1ZFUlJJREUpOworCQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLCBmaHAtPmZoX2V4cG9ydCwgZGVudHJ5LCBNQVlfVFJVTkN8TUFZX09XTkVSX09WRVJSSURFKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBvdXQ7CiAJCX0KQEAgLTQzNSw3ICs0NTIsNyBAQAogCS8qIEdldCBpbm9kZSAqLwogCWVycm9yID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAgLyogU19JRlJFRyAqLywgTUFZX1NBVFRSKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyb3I7CiAKIAlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKIAlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKQEAgLTQ0NCwzMyArNDYxLDI1IEBACiAKIAlob3N0X2Vycm9yID0gbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoYWNsLCAmcGFjbCwgJmRwYWNsLCBmbGFncyk7CiAJaWYgKGhvc3RfZXJyb3IgPT0gLUVJTlZBTCkgewotCQllcnJvciA9IG5mc2Vycl9hdHRybm90c3VwcDsKLQkJZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJfYXR0cm5vdHN1cHA7CiAJfSBlbHNlIGlmIChob3N0X2Vycm9yIDwgMCkKIAkJZ290byBvdXRfbmZzZXJyOwogCiAJaG9zdF9lcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgcGFjbCwgUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUyk7CiAJaWYgKGhvc3RfZXJyb3IgPCAwKQotCQlnb3RvIG91dF9uZnNlcnI7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAKLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlob3N0X2Vycm9yID0gc2V0X25mc3Y0X2FjbF9vbmUoZGVudHJ5LCBkcGFjbCwgUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQpOwotCQlpZiAoaG9zdF9lcnJvciA8IDApCi0JCQlnb3RvIG91dF9uZnNlcnI7Ci0JfQogCi0JZXJyb3IgPSBuZnNfb2s7Ci0KLW91dDoKK291dF9yZWxlYXNlOgogCXBvc2l4X2FjbF9yZWxlYXNlKHBhY2wpOwogCXBvc2l4X2FjbF9yZWxlYXNlKGRwYWNsKTsKLQlyZXR1cm4gKGVycm9yKTsKIG91dF9uZnNlcnI6CiAJaWYgKGhvc3RfZXJyb3IgPT0gLUVPUE5PVFNVUFApCi0JCWVycm9yID0gbmZzZXJyX2F0dHJub3RzdXBwOworCQlyZXR1cm4gbmZzZXJyX2F0dHJub3RzdXBwOwogCWVsc2UKLQkJZXJyb3IgPSBuZnNlcnJubyhob3N0X2Vycm9yKTsKLQlnb3RvIG91dDsKKwkJcmV0dXJuIG5mc2Vycm5vKGhvc3RfZXJyb3IpOwogfQogCiBzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCkBAIC02MDcsNyArNjE2LDcgQEAKIAogCQkJc3Jlc3VsdCB8PSBtYXAtPmFjY2VzczsKIAotCQkJZXJyMiA9IG5mc2RfcGVybWlzc2lvbihleHBvcnQsIGRlbnRyeSwgbWFwLT5ob3cpOworCQkJZXJyMiA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZXhwb3J0LCBkZW50cnksIG1hcC0+aG93KTsKIAkJCXN3aXRjaCAoZXJyMikgewogCQkJY2FzZSBuZnNfb2s6CiAJCQkJcmVzdWx0IHw9IG1hcC0+YWNjZXNzOwpAQCAtMTAzNCw3ICsxMDQzLDcgQEAKIAlfX2JlMzIJCWVycjsKIAogCWlmIChmaWxlKSB7Ci0JCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCisJCWVyciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAogCQkJCU1BWV9SRUFEfE1BWV9PV05FUl9PVkVSUklERSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTEwNjMsNyArMTA3Miw3IEBACiAJX19iZTMyCQkJZXJyID0gMDsKIAogCWlmIChmaWxlKSB7Ci0JCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCisJCWVyciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAogCQkJCU1BWV9XUklURXxNQVlfT1dORVJfT1ZFUlJJREUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CkBAIC0xNzkyLDcgKzE4MDEsOCBAQAogICogQ2hlY2sgZm9yIGEgdXNlcidzIGFjY2VzcyBwZXJtaXNzaW9ucyB0byB0aGlzIGlub2RlLgogICovCiBfX2JlMzIKLW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBhY2MpCituZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKKwkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgYWNjKQogewogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJaW50CQllcnI7CkBAIC0xODIzLDcgKzE4MzMsNyBAQAogCSAqLwogCWlmICghKGFjYyAmIE1BWV9MT0NBTF9BQ0NFU1MpKQogCQlpZiAoYWNjICYgKE1BWV9XUklURSB8IE1BWV9TQVRUUiB8IE1BWV9UUlVOQykpIHsKLQkJCWlmIChFWF9SRE9OTFkoZXhwKSB8fCBJU19SRE9OTFkoaW5vZGUpKQorCQkJaWYgKEVYX1JET05MWShleHAsIHJxc3RwKSB8fCBJU19SRE9OTFkoaW5vZGUpKQogCQkJCXJldHVybiBuZnNlcnJfcm9mczsKIAkJCWlmICgvKiAoYWNjICYgTUFZX1dSSVRFKSAmJiAqLyBJU19JTU1VVEFCTEUoaW5vZGUpKQogCQkJCXJldHVybiBuZnNlcnJfcGVybTsKZGlmZiAtLWdpdCBhL2ZzL25scy9NYWtlZmlsZSBiL2ZzL25scy9NYWtlZmlsZQppbmRleCBhN2FkZTEzLi5mNDk5ZGQ3IDEwMDY0NAotLS0gYS9mcy9ubHMvTWFrZWZpbGUKKysrIGIvZnMvbmxzL01ha2VmaWxlCkBAIC0zNiwxMSArMzYsOSBAQAogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzcpCSs9IG5sc19pc284ODU5LTcubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzgpCSs9IG5sc19jcDEyNTUubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzkpCSs9IG5sc19pc284ODU5LTkubwotb2JqLSQoQ09ORklHX05MU19JU084ODU5XzEwKQkrPSBubHNfaXNvODg1OS0xMC5vCiBvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTMpCSs9IG5sc19pc284ODU5LTEzLm8KIG9iai0kKENPTkZJR19OTFNfSVNPODg1OV8xNCkJKz0gbmxzX2lzbzg4NTktMTQubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzE1KQkrPSBubHNfaXNvODg1OS0xNS5vCiBvYmotJChDT05GSUdfTkxTX0tPSThfUikJKz0gbmxzX2tvaTgtci5vCiBvYmotJChDT05GSUdfTkxTX0tPSThfVSkJKz0gbmxzX2tvaTgtdS5vIG5sc19rb2k4LXJ1Lm8KLW9iai0kKENPTkZJR19OTFNfQUJDKQkJKz0gbmxzX2FiYy5vCiBvYmotJChDT05GSUdfTkxTX1VURjgpCQkrPSBubHNfdXRmOC5vCmRpZmYgLS1naXQgYS9mcy9udGZzL25hbWVpLmMgYi9mcy9udGZzL25hbWVpLmMKaW5kZXggYmZmMDFhNS4uZTkzYzYxNCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9uYW1laS5jCisrKyBiL2ZzL250ZnMvbmFtZWkuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAKICNpbmNsdWRlICJhdHRyaWIuaCIKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDE5NzEyYTcuLmY1ZTExZjQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtNTAsNiArNTAsOCBAQAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKIHN0YXRpYyB2b2lkIG9jZnMyX2ZyZWVfdHJ1bmNhdGVfY29udGV4dChzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqdGMpOworc3RhdGljIGludCBvY2ZzMl9jYWNoZV9leHRlbnRfYmxvY2tfZnJlZShzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCwKKwkJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKTsKIAogLyoKICAqIFN0cnVjdHVyZXMgd2hpY2ggZGVzY3JpYmUgYSBwYXRoIHRocm91Z2ggYSBidHJlZSwgYW5kIGZ1bmN0aW9ucyB0bwpAQCAtMTE3LDYgKzExOSwzMSBAQAogfQogCiAvKgorICogQWxsIHRoZSBlbGVtZW50cyBvZiBzcmMgaW50byBkZXN0LiBBZnRlciB0aGlzIGNhbGwsIHNyYyBjb3VsZCBiZSBmcmVlZAorICogd2l0aG91dCBhZmZlY3RpbmcgZGVzdC4KKyAqCisgKiBCb3RoIHBhdGhzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJvb3QuIEFueSBub24tcm9vdCBlbGVtZW50cyBvZiBkZXN0CisgKiB3aWxsIGJlIGZyZWVkLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9jcF9wYXRoKHN0cnVjdCBvY2ZzMl9wYXRoICpkZXN0LCBzdHJ1Y3Qgb2NmczJfcGF0aCAqc3JjKQoreworCWludCBpOworCisJQlVHX09OKHBhdGhfcm9vdF9iaChkZXN0KSAhPSBwYXRoX3Jvb3RfYmgoc3JjKSk7CisJQlVHX09OKHBhdGhfcm9vdF9lbChkZXN0KSAhPSBwYXRoX3Jvb3RfZWwoc3JjKSk7CisKKwlvY2ZzMl9yZWluaXRfcGF0aChkZXN0LCAxKTsKKworCWZvcihpID0gMTsgaSA8IE9DRlMyX01BWF9QQVRIX0RFUFRIOyBpKyspIHsKKwkJZGVzdC0+cF9ub2RlW2ldLmJoID0gc3JjLT5wX25vZGVbaV0uYmg7CisJCWRlc3QtPnBfbm9kZVtpXS5lbCA9IHNyYy0+cF9ub2RlW2ldLmVsOworCisJCWlmIChkZXN0LT5wX25vZGVbaV0uYmgpCisJCQlnZXRfYmgoZGVzdC0+cF9ub2RlW2ldLmJoKTsKKwl9Cit9CisKKy8qCiAgKiBNYWtlIHRoZSAqZGVzdCBwYXRoIHRoZSBzYW1lIGFzIHNyYyBhbmQgcmUtaW5pdGlhbGl6ZSBzcmMgcGF0aCB0bwogICogaGF2ZSBhIHJvb3Qgb25seS4KICAqLwpAQCAtMjEyLDEwICsyMzksNDEgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZXh0ZW50IHJlY29yZCB3aGljaCBjb250YWlucyBjbHVzdGVyICN2X2NsdXN0ZXIuCisgKiAtMSBpcyByZXR1cm5lZCBpZiBpdCB3YXMgbm90IGZvdW5kLgorICoKKyAqIFNob3VsZCB3b3JrIGZpbmUgb24gaW50ZXJpb3IgYW5kIGV4dGVyaW9yIG5vZGVzLgorICovCitpbnQgb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIHUzMiB2X2NsdXN0ZXIpCit7CisJaW50IHJldCA9IC0xOworCWludCBpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJdTMyIHJlY19lbmQsIHJlY19zdGFydCwgY2x1c3RlcnM7CisKKwlmb3IoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCisJCXJlY19zdGFydCA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKTsKKwkJY2x1c3RlcnMgPSBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisKKwkJcmVjX2VuZCA9IHJlY19zdGFydCArIGNsdXN0ZXJzOworCisJCWlmICh2X2NsdXN0ZXIgPj0gcmVjX3N0YXJ0ICYmIHZfY2x1c3RlciA8IHJlY19lbmQpIHsKKwkJCXJldCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKIGVudW0gb2NmczJfY29udGlnX3R5cGUgewogCUNPTlRJR19OT05FID0gMCwKIAlDT05USUdfTEVGVCwKLQlDT05USUdfUklHSFQKKwlDT05USUdfUklHSFQsCisJQ09OVElHX0xFRlRSSUdIVCwKIH07CiAKIApAQCAtMjUzLDYgKzMxMSwxNCBAQAogewogCXU2NCBibGtubyA9IGxlNjRfdG9fY3B1KGluc2VydF9yZWMtPmVfYmxrbm8pOwogCisJLyoKKwkgKiBSZWZ1c2UgdG8gY29hbGVzY2UgZXh0ZW50IHJlY29yZHMgd2l0aCBkaWZmZXJlbnQgZmxhZworCSAqIGZpZWxkcyAtIHdlIGRvbid0IHdhbnQgdG8gbWl4IHVud3JpdHRlbiBleHRlbnRzIHdpdGggdXNlcgorCSAqIGRhdGEuCisJICovCisJaWYgKGV4dC0+ZV9mbGFncyAhPSBpbnNlcnRfcmVjLT5lX2ZsYWdzKQorCQlyZXR1cm4gQ09OVElHX05PTkU7CisKIAlpZiAob2NmczJfZXh0ZW50c19hZGphY2VudChleHQsIGluc2VydF9yZWMpICYmCiAJICAgIG9jZnMyX2Jsb2NrX2V4dGVudF9jb250aWcoaW5vZGUtPmlfc2IsIGV4dCwgYmxrbm8pKQogCQkJcmV0dXJuIENPTlRJR19SSUdIVDsKQEAgLTI3Nyw3ICszNDMsMTQgQEAKIAlBUFBFTkRfVEFJTCwKIH07CiAKK2VudW0gb2NmczJfc3BsaXRfdHlwZSB7CisJU1BMSVRfTk9ORSA9IDAsCisJU1BMSVRfTEVGVCwKKwlTUExJVF9SSUdIVCwKK307CisKIHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSB7CisJZW51bSBvY2ZzMl9zcGxpdF90eXBlCWluc19zcGxpdDsKIAllbnVtIG9jZnMyX2FwcGVuZF90eXBlCWluc19hcHBlbmRpbmc7CiAJZW51bSBvY2ZzMl9jb250aWdfdHlwZQlpbnNfY29udGlnOwogCWludAkJCWluc19jb250aWdfaW5kZXg7CkBAIC0yODUsNiArMzU4LDEzIEBACiAJaW50CQkJaW5zX3RyZWVfZGVwdGg7CiB9OwogCitzdHJ1Y3Qgb2NmczJfbWVyZ2VfY3R4dCB7CisJZW51bSBvY2ZzMl9jb250aWdfdHlwZQljX2NvbnRpZ190eXBlOworCWludAkJCWNfaGFzX2VtcHR5X2V4dGVudDsKKwlpbnQJCQljX3NwbGl0X2NvdmVyc19yZWM7CisJaW50CQkJY191c2VkX3RhaWxfcmVjczsKK307CisKIC8qCiAgKiBIb3cgbWFueSBmcmVlIGV4dGVudHMgaGF2ZSB3ZSBnb3QgYmVmb3JlIHdlIG5lZWQgbW9yZSBtZXRhIGRhdGE/CiAgKi8KQEAgLTM4NCwxMyArNDY0LDcgQEAKIAkJCXN0cmNweShlYi0+aF9zaWduYXR1cmUsIE9DRlMyX0VYVEVOVF9CTE9DS19TSUdOQVRVUkUpOwogCQkJZWItPmhfYmxrbm8gPSBjcHVfdG9fbGU2NChmaXJzdF9ibGtubyk7CiAJCQllYi0+aF9mc19nZW5lcmF0aW9uID0gY3B1X3RvX2xlMzIob3NiLT5mc19nZW5lcmF0aW9uKTsKLQotI2lmbmRlZiBPQ0ZTMl9VU0VfQUxMX01FVEFEQVRBX1NVQkFMTE9DQVRPUlMKLQkJCS8qIHdlIGFsd2F5cyB1c2Ugc2xvdCB6ZXJvJ3Mgc3ViYWxsb2NhdG9yICovCi0JCQllYi0+aF9zdWJhbGxvY19zbG90ID0gMDsKLSNlbHNlCiAJCQllYi0+aF9zdWJhbGxvY19zbG90ID0gY3B1X3RvX2xlMTYob3NiLT5zbG90X251bSk7Ci0jZW5kaWYKIAkJCWViLT5oX3N1YmFsbG9jX2JpdCA9IGNwdV90b19sZTE2KHN1YmFsbG9jX2JpdF9zdGFydCk7CiAJCQllYi0+aF9saXN0LmxfY291bnQgPQogCQkJCWNwdV90b19sZTE2KG9jZnMyX2V4dGVudF9yZWNzX3Blcl9lYihvc2ItPnNiKSk7CkBAIC00NjEsNyArNTM1LDcgQEAKIAkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxhc3RfZWJfYmgsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKIHsKIAlpbnQgc3RhdHVzLCBuZXdfYmxvY2tzLCBpOwpAQCAtNDc2LDcgKzU1MCw3IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCUJVR19PTighbGFzdF9lYl9iaCk7CisJQlVHX09OKCFsYXN0X2ViX2JoIHx8ICEqbGFzdF9lYl9iaCk7CiAKIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGZlX2JoLT5iX2RhdGE7CiAKQEAgLTUwNyw3ICs1ODEsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKWxhc3RfZWJfYmgtPmJfZGF0YTsKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopKCpsYXN0X2ViX2JoKS0+Yl9kYXRhOwogCW5ld19jcG9zID0gb2NmczJfc3VtX3JpZ2h0bW9zdF9yZWMoJmViLT5oX2xpc3QpOwogCiAJLyogTm90ZTogbmV3X2ViX2Joc1tuZXdfYmxvY2tzIC0gMV0gaXMgdGhlIGd1eSB3aGljaCB3aWxsIGJlCkBAIC01NjgsNyArNjQyLDcgQEAKIAkgKiBqb3VybmFsX2RpcnR5IGVycm9yaW5nIGFzIGl0IHdvbid0IHVubGVzcyB3ZSd2ZSBhYm9ydGVkIHRoZQogCSAqIGhhbmRsZSAoaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBuZXZlciBiZSBoZXJlKSBzbyByZXNlcnZpbmcKIAkgKiB0aGUgd3JpdGUgd2l0aCBqb3VybmFsX2FjY2VzcyBpcyBhbGwgd2UgbmVlZCB0byBkby4gKi8KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBsYXN0X2ViX2JoLAorCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsICpsYXN0X2ViX2JoLAogCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC02MDEsMTAgKzY3NSwxMCBAQAogCSAqIG5leHRfbGVhZiBvbiB0aGUgcHJldmlvdXNseSBsYXN0LWV4dGVudC1ibG9jay4gKi8KIAlmZS0+aV9sYXN0X2ViX2JsayA9IGNwdV90b19sZTY0KG5ld19sYXN0X2ViX2Jsayk7CiAKLQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopICgqbGFzdF9lYl9iaCktPmJfZGF0YTsKIAllYi0+aF9uZXh0X2xlYWZfYmxrID0gY3B1X3RvX2xlNjQobmV3X2xhc3RfZWJfYmxrKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBsYXN0X2ViX2JoKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgKmxhc3RfZWJfYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZlX2JoKTsKQEAgLTYxNiw2ICs2OTAsMTQgQEAKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAl9CiAKKwkvKgorCSAqIFNvbWUgY2FsbGVycyB3YW50IHRvIHRyYWNrIHRoZSByaWdodG1vc3QgbGVhZiBzbyBwYXNzIGl0CisJICogYmFjayBoZXJlLgorCSAqLworCWJyZWxzZSgqbGFzdF9lYl9iaCk7CisJZ2V0X2JoKG5ld19lYl9iaHNbMF0pOworCSpsYXN0X2ViX2JoID0gbmV3X2ViX2Joc1swXTsKKwogCXN0YXR1cyA9IDA7CiBiYWlsOgogCWlmIChuZXdfZWJfYmhzKSB7CkBAIC04MjksNiArOTExLDg3IEBACiB9CiAKIC8qCisgKiBHcm93IGEgYi10cmVlIHNvIHRoYXQgaXQgaGFzIG1vcmUgcmVjb3Jkcy4KKyAqCisgKiBXZSBtaWdodCBzaGlmdCB0aGUgdHJlZSBkZXB0aCBpbiB3aGljaCBjYXNlIGV4aXN0aW5nIHBhdGhzIHNob3VsZAorICogYmUgY29uc2lkZXJlZCBpbnZhbGlkLgorICoKKyAqIFRyZWUgZGVwdGggYWZ0ZXIgdGhlIGdyb3cgaXMgcmV0dXJuZWQgdmlhICpmaW5hbF9kZXB0aC4KKyAqCisgKiAqbGFzdF9lYl9iaCB3aWxsIGJlIHVwZGF0ZWQgYnkgb2NmczJfYWRkX2JyYW5jaCgpLgorICovCitzdGF0aWMgaW50IG9jZnMyX2dyb3dfdHJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwgaW50ICpmaW5hbF9kZXB0aCwKKwkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxhc3RfZWJfYmgsCisJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKK3sKKwlpbnQgcmV0LCBzaGlmdDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlpbnQgZGVwdGggPSBsZTE2X3RvX2NwdShkaS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJQlVHX09OKG1ldGFfYWMgPT0gTlVMTCk7CisKKwlzaGlmdCA9IG9jZnMyX2ZpbmRfYnJhbmNoX3RhcmdldChvc2IsIGlub2RlLCBkaV9iaCwgJmJoKTsKKwlpZiAoc2hpZnQgPCAwKSB7CisJCXJldCA9IHNoaWZ0OworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdlIHRyYXZlbGVkIGFsbCB0aGUgd2F5IHRvIHRoZSBib3R0b20gb2YgdGhlIGFsbG9jYXRpb24gdHJlZQorCSAqIGFuZCBkaWRuJ3QgZmluZCByb29tIGZvciBhbnkgbW9yZSBleHRlbnRzIC0gd2UgbmVlZCB0byBhZGQKKwkgKiBhbm90aGVyIHRyZWUgbGV2ZWwgKi8KKwlpZiAoc2hpZnQpIHsKKwkJQlVHX09OKGJoKTsKKwkJbWxvZygwLCAibmVlZCB0byBzaGlmdCB0cmVlIGRlcHRoIChjdXJyZW50ID0gJWQpXG4iLCBkZXB0aCk7CisKKwkJLyogb2NmczJfc2hpZnRfdHJlZV9kZXB0aCB3aWxsIHJldHVybiB1cyBhIGJ1ZmZlciB3aXRoCisJCSAqIHRoZSBuZXcgZXh0ZW50IGJsb2NrIChzbyB3ZSBjYW4gcGFzcyB0aGF0IHRvCisJCSAqIG9jZnMyX2FkZF9icmFuY2gpLiAqLworCQlyZXQgPSBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJCSAgICAgbWV0YV9hYywgJmJoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRlcHRoKys7CisJCWlmIChkZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogU3BlY2lhbCBjYXNlOiB3ZSBoYXZlIHJvb20gbm93IGlmIHdlIHNoaWZ0ZWQgZnJvbQorCQkJICogdHJlZV9kZXB0aCAwLCBzbyBubyBtb3JlIHdvcmsgbmVlZHMgdG8gYmUgZG9uZS4KKwkJCSAqCisJCQkgKiBXZSB3b24ndCBiZSBjYWxsaW5nIGFkZF9icmFuY2gsIHNvIHBhc3MKKwkJCSAqIGJhY2sgKmxhc3RfZWJfYmggYXMgdGhlIG5ldyBsZWFmLiBBdCBkZXB0aAorCQkJICogemVybywgaXQgc2hvdWxkIGFsd2F5cyBiZSBudWxsIHNvIHRoZXJlJ3MKKwkJCSAqIG5vIHJlYXNvbiB0byBicmVsc2UuCisJCQkgKi8KKwkJCUJVR19PTigqbGFzdF9lYl9iaCk7CisJCQlnZXRfYmgoYmgpOworCQkJKmxhc3RfZWJfYmggPSBiaDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogY2FsbCBvY2ZzMl9hZGRfYnJhbmNoIHRvIGFkZCB0aGUgZmluYWwgcGFydCBvZiB0aGUgdHJlZSB3aXRoCisJICogdGhlIG5ldyBkYXRhLiAqLworCW1sb2coMCwgImFkZCBicmFuY2guIGJoID0gJXBcbiIsIGJoKTsKKwlyZXQgPSBvY2ZzMl9hZGRfYnJhbmNoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZGlfYmgsIGJoLCBsYXN0X2ViX2JoLAorCQkJICAgICAgIG1ldGFfYWMpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJaWYgKGZpbmFsX2RlcHRoKQorCQkqZmluYWxfZGVwdGggPSBkZXB0aDsKKwlicmVsc2UoYmgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIGxlYWYgbm9kZXMsIHdoaWNoIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgY2FuCiAgKiBoYXZlIGVtcHR5IGV4dGVudHMgYW55d2F5LgogICovCkBAIC05MzQsNiArMTA5NywyMiBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIG9jZnMyX3JlbW92ZV9lbXB0eV9leHRlbnQoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKK3sKKwlpbnQgc2l6ZSwgbnVtX3JlY3MgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKworCUJVR19PTihudW1fcmVjcyA9PSAwKTsKKworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKSB7CisJCW51bV9yZWNzLS07CisJCXNpemUgPSBudW1fcmVjcyAqIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyk7CisJCW1lbW1vdmUoJmVsLT5sX3JlY3NbMF0sICZlbC0+bF9yZWNzWzFdLCBzaXplKTsKKwkJbWVtc2V0KCZlbC0+bF9yZWNzW251bV9yZWNzXSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCQllbC0+bF9uZXh0X2ZyZWVfcmVjID0gY3B1X3RvX2xlMTYobnVtX3JlY3MpOworCX0KK30KKwogLyoKICAqIENyZWF0ZSBhbiBlbXB0eSBleHRlbnQgcmVjb3JkIC4KICAqCkBAIC0xMjExLDYgKzEzOTAsMTAgQEAKIAkgKiBpbW1lZGlhdGVseSB0byB0aGVpciByaWdodC4KIAkgKi8KIAlsZWZ0X2NsdXN0ZXJzID0gbGUzMl90b19jcHUocmlnaHRfY2hpbGRfZWwtPmxfcmVjc1swXS5lX2Nwb3MpOworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJnJpZ2h0X2NoaWxkX2VsLT5sX3JlY3NbMF0pKSB7CisJCUJVR19PTihsZTE2X3RvX2NwdShyaWdodF9jaGlsZF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA8PSAxKTsKKwkJbGVmdF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHJpZ2h0X2NoaWxkX2VsLT5sX3JlY3NbMV0uZV9jcG9zKTsKKwl9CiAJbGVmdF9jbHVzdGVycyAtPSBsZTMyX3RvX2NwdShsZWZ0X3JlYy0+ZV9jcG9zKTsKIAlsZWZ0X3JlYy0+ZV9pbnRfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihsZWZ0X2NsdXN0ZXJzKTsKIApAQCAtMTUzMSwxMCArMTcxNCwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBFeHRlbmQgdGhlIHRyYW5zYWN0aW9uIGJ5IGVub3VnaCBjcmVkaXRzIHRvIGNvbXBsZXRlIHRoZSByb3RhdGlvbiwKKyAqIGFuZCBzdGlsbCBsZWF2ZSBhdCBsZWFzdCB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIGNyZWRpdHMgYWxsb2NhdGVkCisgKiB0byB0aGlzIHRyYW5zYWN0aW9uLgorICovCiBzdGF0aWMgaW50IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgaW50IHN1YnRyZWVfZGVwdGgsCisJCQkJCSAgIGludCBvcF9jcmVkaXRzLAogCQkJCQkgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCkKIHsKLQlpbnQgY3JlZGl0cyA9IChwYXRoLT5wX3RyZWVfZGVwdGggLSBzdWJ0cmVlX2RlcHRoKSAqIDIgKyAxOworCWludCBjcmVkaXRzID0gKHBhdGgtPnBfdHJlZV9kZXB0aCAtIHN1YnRyZWVfZGVwdGgpICogMiArIDEgKyBvcF9jcmVkaXRzOwogCiAJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA8IGNyZWRpdHMpCiAJCXJldHVybiBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKQEAgLTE1NjgsNiArMTc1NywyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9jZnMyX2xlZnRtb3N0X3JlY19jb250YWlucyhzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCB1MzIgY3BvcykKK3sKKwlpbnQgbmV4dF9mcmVlID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisKKwlpZiAobmV4dF9mcmVlID09IDApCisJCXJldHVybiAwOworCisJcmVjID0gJmVsLT5sX3JlY3NbMF07CisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudChyZWMpKSB7CisJCS8qIEVtcHR5IGxpc3QuICovCisJCWlmIChuZXh0X2ZyZWUgPT0gMSkKKwkJCXJldHVybiAwOworCQlyZWMgPSAmZWwtPmxfcmVjc1sxXTsKKwl9CisKKwlyYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKKwlpZiAoY3BvcyA+PSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgJiYgY3BvcyA8IHJhbmdlKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFJvdGF0ZSBhbGwgdGhlIHJlY29yZHMgaW4gYSBidHJlZSByaWdodCBvbmUgcmVjb3JkLCBzdGFydGluZyBhdCBpbnNlcnRfY3Bvcy4KICAqCkBAIC0xNTg2LDExICsxNzk4LDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfcm90YXRlX3RyZWVfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgIGVudW0gb2NmczJfc3BsaXRfdHlwZSBzcGxpdCwKIAkJCQkgICB1MzIgaW5zZXJ0X2Nwb3MsCiAJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCiAJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKipyZXRfbGVmdF9wYXRoKQogewotCWludCByZXQsIHN0YXJ0OworCWludCByZXQsIHN0YXJ0LCBvcmlnX2NyZWRpdHMgPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CiAJdTMyIGNwb3M7CiAJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CiAKQEAgLTE2NTcsOSArMTg3MCw5IEBACiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCQlwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9ibG9ja25yKTsKIAotCQlpZiAob2NmczJfcm90YXRlX3JlcXVpcmVzX3BhdGhfYWRqdXN0bWVudChsZWZ0X3BhdGgsCisJCWlmIChzcGxpdCA9PSBTUExJVF9OT05FICYmCisJCSAgICBvY2ZzMl9yb3RhdGVfcmVxdWlyZXNfcGF0aF9hZGp1c3RtZW50KGxlZnRfcGF0aCwKIAkJCQkJCQkgIGluc2VydF9jcG9zKSkgewotCQkJbWxvZygwLCAiUGF0aCBhZGp1c3RtZW50IHJlcXVpcmVkXG4iKTsKIAogCQkJLyoKIAkJCSAqIFdlJ3ZlIHJvdGF0ZWQgdGhlIHRyZWUgYXMgbXVjaCBhcyB3ZQpAQCAtMTY4Nyw3ICsxOTAwLDcgQEAKIAkJICAgICByaWdodF9wYXRoLT5wX3RyZWVfZGVwdGgpOwogCiAJCXJldCA9IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlLCBzdGFydCwKLQkJCQkJCSAgICAgIHJpZ2h0X3BhdGgpOworCQkJCQkJICAgICAgb3JpZ19jcmVkaXRzLCByaWdodF9wYXRoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0xNzAwLDYgKzE5MTMsMjQgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKKwkJaWYgKHNwbGl0ICE9IFNQTElUX05PTkUgJiYKKwkJICAgIG9jZnMyX2xlZnRtb3N0X3JlY19jb250YWlucyhwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCksCisJCQkJCQlpbnNlcnRfY3BvcykpIHsKKwkJCS8qCisJCQkgKiBBIHJvdGF0ZSBtb3ZlcyB0aGUgcmlnaHRtb3N0IGxlZnQgbGVhZgorCQkJICogcmVjb3JkIG92ZXIgdG8gdGhlIGxlZnRtb3N0IHJpZ2h0IGxlYWYKKwkJCSAqIHNsb3QuIElmIHdlJ3JlIGRvaW5nIGFuIGV4dGVudCBzcGxpdAorCQkJICogaW5zdGVhZCBvZiBhIHJlYWwgaW5zZXJ0LCB0aGVuIHdlIGhhdmUgdG8KKwkJCSAqIGNoZWNrIHRoYXQgdGhlIGV4dGVudCB0byBiZSBzcGxpdCB3YXNuJ3QKKwkJCSAqIGp1c3QgbW92ZWQgb3Zlci4gSWYgaXQgd2FzLCB0aGVuIHdlIGNhbgorCQkJICogZXhpdCBoZXJlLCBwYXNzaW5nIGxlZnRfcGF0aCBiYWNrIC0KKwkJCSAqIG9jZnMyX3NwbGl0X2V4dGVudCgpIGlzIHNtYXJ0IGVub3VnaCB0bworCQkJICogc2VhcmNoIGJvdGggbGVhdmVzLgorCQkJICovCisJCQkqcmV0X2xlZnRfcGF0aCA9IGxlZnRfcGF0aDsKKwkJCWdvdG8gb3V0X3JldF9wYXRoOworCQl9CisKIAkJLyoKIAkJICogVGhlcmUgaXMgbm8gbmVlZCB0byByZS1yZWFkIHRoZSBuZXh0IHJpZ2h0IHBhdGgKIAkJICogYXMgd2Uga25vdyB0aGF0IGl0J2xsIGJlIG91ciBjdXJyZW50IGxlZnQKQEAgLTE3MjIsNiArMTk1MywxMDMxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3RocyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoKQoreworCWludCBpLCBpZHg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXUzMiByYW5nZTsKKworCS8qIFBhdGggc2hvdWxkIGFsd2F5cyBiZSByaWdodG1vc3QuICovCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChwYXRoKS0+Yl9kYXRhOworCUJVR19PTihlYi0+aF9uZXh0X2xlYWZfYmxrICE9IDBVTEwpOworCisJZWwgPSAmZWItPmhfbGlzdDsKKwlCVUdfT04obGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0gMCk7CisJaWR4ID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOworCXJlYyA9ICZlbC0+bF9yZWNzW2lkeF07CisJcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGF0aC0+cF90cmVlX2RlcHRoOyBpKyspIHsKKwkJZWwgPSBwYXRoLT5wX25vZGVbaV0uZWw7CisJCWlkeCA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMTsKKwkJcmVjID0gJmVsLT5sX3JlY3NbaWR4XTsKKworCQlyZWMtPmVfaW50X2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIocmFuZ2UpOworCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9pbnRfY2x1c3RlcnMsIC1sZTMyX3RvX2NwdShyZWMtPmVfY3BvcykpOworCisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoLT5wX25vZGVbaV0uYmgpOworCX0KK30KKworc3RhdGljIHZvaWQgb2NmczJfdW5saW5rX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsIGludCB1bmxpbmtfc3RhcnQpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlmb3IoaSA9IHVubGlua19zdGFydDsgaSA8IHBhdGhfbnVtX2l0ZW1zKHBhdGgpOyBpKyspIHsKKwkJYmggPSBwYXRoLT5wX25vZGVbaV0uYmg7CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKWJoLT5iX2RhdGE7CisJCS8qCisJCSAqIE5vdCBhbGwgbm9kZXMgbWlnaHQgaGF2ZSBoYWQgdGhlaXIgZmluYWwgY291bnQKKwkJICogZGVjcmVtZW50ZWQgYnkgdGhlIGNhbGxlciAtIGhhbmRsZSB0aGlzIGhlcmUuCisJCSAqLworCQllbCA9ICZlYi0+aF9saXN0OworCQlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPiAxKSB7CisJCQltbG9nKE1MX0VSUk9SLAorCQkJICAgICAiSW5vZGUgJWxsdSwgYXR0ZW1wdGVkIHRvIHJlbW92ZSBleHRlbnQgYmxvY2sgIgorCQkJICAgICAiJWxsdSB3aXRoICV1IHJlY29yZHNcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwKKwkJCSAgICAgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpOworCisJCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCQkJb2NmczJfcmVtb3ZlX2Zyb21fY2FjaGUoaW5vZGUsIGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZWwtPmxfbmV4dF9mcmVlX3JlYyA9IDA7CisJCW1lbXNldCgmZWwtPmxfcmVjc1swXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKworCQlyZXQgPSBvY2ZzMl9jYWNoZV9leHRlbnRfYmxvY2tfZnJlZShkZWFsbG9jLCBlYik7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisKKwkJb2NmczJfcmVtb3ZlX2Zyb21fY2FjaGUoaW5vZGUsIGJoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3VubGlua19zdWJ0cmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkJIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAorCQkJCSBpbnQgc3VidHJlZV9pbmRleCwKKwkJCQkgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyb290X2VsID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKworCWVsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CisKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcmlnaHRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXggKyAxXS5iaC0+Yl9kYXRhOworCisJZm9yKGkgPSAxOyBpIDwgbGUxNl90b19jcHUocm9vdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKQorCQlpZiAocm9vdF9lbC0+bF9yZWNzW2ldLmVfYmxrbm8gPT0gZWItPmhfYmxrbm8pCisJCQlicmVhazsKKworCUJVR19PTihpID49IGxlMTZfdG9fY3B1KHJvb3RfZWwtPmxfbmV4dF9mcmVlX3JlYykpOworCisJbWVtc2V0KCZyb290X2VsLT5sX3JlY3NbaV0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCWxlMTZfYWRkX2NwdSgmcm9vdF9lbC0+bF9uZXh0X2ZyZWVfcmVjLCAtMSk7CisKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCktPmJfZGF0YTsKKwllYi0+aF9uZXh0X2xlYWZfYmxrID0gMDsKKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByb290X2JoKTsKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCkpOworCisJb2NmczJfdW5saW5rX3BhdGgoaW5vZGUsIGhhbmRsZSwgZGVhbGxvYywgcmlnaHRfcGF0aCwKKwkJCSAgc3VidHJlZV9pbmRleCArIDEpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV9zdWJ0cmVlX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCwKKwkJCQkgICAgIGludCBzdWJ0cmVlX2luZGV4LAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkJICAgICBpbnQgKmRlbGV0ZWQpCit7CisJaW50IHJldCwgaSwgZGVsX3JpZ2h0X3N1YnRyZWUgPSAwLCByaWdodF9oYXNfZW1wdHkgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwgKmRpX2JoID0gcGF0aF9yb290X2JoKHJpZ2h0X3BhdGgpOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRfbGVhZl9lbCwgKmxlZnRfbGVhZl9lbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKworCSpkZWxldGVkID0gMDsKKworCXJpZ2h0X2xlYWZfZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7CisJbGVmdF9sZWFmX2VsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CisJcm9vdF9iaCA9IGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoOworCUJVR19PTihyb290X2JoICE9IHJpZ2h0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaCk7CisKKwlpZiAoIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmbGVmdF9sZWFmX2VsLT5sX3JlY3NbMF0pKQorCQlyZXR1cm4gMDsKKworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCktPmJfZGF0YTsKKwlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZyaWdodF9sZWFmX2VsLT5sX3JlY3NbMF0pKSB7CisJCS8qCisJCSAqIEl0J3MgbGVnYWwgZm9yIHVzIHRvIHByb2NlZWQgaWYgdGhlIHJpZ2h0IGxlYWYgaXMKKwkJICogdGhlIHJpZ2h0bW9zdCBvbmUgYW5kIGl0IGhhcyBhbiBlbXB0eSBleHRlbnQuIFRoZXJlCisJCSAqIGFyZSB0d28gY2FzZXMgdG8gaGFuZGxlIC0gd2hldGhlciB0aGUgbGVhZiB3aWxsIGJlCisJCSAqIGVtcHR5IGFmdGVyIHJlbW92YWwgb3Igbm90LiBJZiB0aGUgbGVhZiBpc24ndCBlbXB0eQorCQkgKiB0aGVuIGp1c3QgcmVtb3ZlIHRoZSBlbXB0eSBleHRlbnQgdXAgZnJvbnQuIFRoZQorCQkgKiBuZXh0IGJsb2NrIHdpbGwgaGFuZGxlIGVtcHR5IGxlYXZlcyBieSBmbGFnZ2luZworCQkgKiB0aGVtIGZvciB1bmxpbmsuCisJCSAqCisJCSAqIE5vbiByaWdodG1vc3QgbGVhdmVzIHdpbGwgdGhyb3cgLUVBR0FJTiBhbmQgdGhlCisJCSAqIGNhbGxlciBjYW4gbWFudWFsbHkgbW92ZSB0aGUgc3VidHJlZSBhbmQgcmV0cnkuCisJCSAqLworCisJCWlmIChlYi0+aF9uZXh0X2xlYWZfYmxrICE9IDBVTEwpCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCQlpZiAobGUxNl90b19jcHUocmlnaHRfbGVhZl9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA+IDEpIHsKKwkJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCksCisJCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KHJpZ2h0X2xlYWZfZWwpOworCQl9IGVsc2UKKwkJCXJpZ2h0X2hhc19lbXB0eSA9IDE7CisJfQorCisJaWYgKGViLT5oX25leHRfbGVhZl9ibGsgPT0gMFVMTCAmJgorCSAgICBsZTE2X3RvX2NwdShyaWdodF9sZWFmX2VsLT5sX25leHRfZnJlZV9yZWMpID09IDEpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byB1cGRhdGUgaV9sYXN0X2ViX2JsayBkdXJpbmcgdGhlIG1ldGEKKwkJICogZGF0YSBkZWxldGUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRlbF9yaWdodF9zdWJ0cmVlID0gMTsKKwl9CisKKwkvKgorCSAqIEdldHRpbmcgaGVyZSB3aXRoIGFuIGVtcHR5IGV4dGVudCBpbiB0aGUgcmlnaHQgcGF0aCBpbXBsaWVzCisJICogdGhhdCBpdCdzIHRoZSByaWdodG1vc3QgcGF0aCBhbmQgd2lsbCBiZSBkZWxldGVkLgorCSAqLworCUJVR19PTihyaWdodF9oYXNfZW1wdHkgJiYgIWRlbF9yaWdodF9zdWJ0cmVlKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IoaSA9IHN1YnRyZWVfaW5kZXggKyAxOyBpIDwgcGF0aF9udW1faXRlbXMocmlnaHRfcGF0aCk7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICByaWdodF9wYXRoLT5wX25vZGVbaV0uYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICBsZWZ0X3BhdGgtPnBfbm9kZVtpXS5iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICghcmlnaHRfaGFzX2VtcHR5KSB7CisJCS8qCisJCSAqIE9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBtb3ZpbmcgYSByZWFsCisJCSAqIHJlY29yZC4gT3RoZXJ3aXNlLCB0aGUgYWN0aW9uIGlzIGRlbGF5ZWQgdW50aWwKKwkJICogYWZ0ZXIgcmVtb3ZhbCBvZiB0aGUgcmlnaHQgcGF0aCBpbiB3aGljaCBjYXNlIHdlCisJCSAqIGNhbiBkbyBhIHNpbXBsZSBzaGlmdCB0byByZW1vdmUgdGhlIGVtcHR5IGV4dGVudC4KKwkJICovCisJCW9jZnMyX3JvdGF0ZV9sZWFmKGxlZnRfbGVhZl9lbCwgJnJpZ2h0X2xlYWZfZWwtPmxfcmVjc1swXSk7CisJCW1lbXNldCgmcmlnaHRfbGVhZl9lbC0+bF9yZWNzWzBdLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisJfQorCWlmIChlYi0+aF9uZXh0X2xlYWZfYmxrID09IDBVTEwpIHsKKwkJLyoKKwkJICogTW92ZSByZWNzIG92ZXIgdG8gZ2V0IHJpZCBvZiBlbXB0eSBleHRlbnQsIGRlY3JlYXNlCisJCSAqIG5leHRfZnJlZS4gVGhpcyBpcyBhbGxvd2VkIHRvIHJlbW92ZSB0aGUgbGFzdAorCQkgKiBleHRlbnQgaW4gb3VyIGxlYWYgKHNldHRpbmcgbF9uZXh0X2ZyZWVfcmVjIHRvCisJCSAqIHplcm8pIC0gdGhlIGRlbGV0ZSBjb2RlIGJlbG93IHdvbid0IGNhcmUuCisJCSAqLworCQlvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KHJpZ2h0X2xlYWZfZWwpOworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCkpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworCWlmIChkZWxfcmlnaHRfc3VidHJlZSkgeworCQlvY2ZzMl91bmxpbmtfc3VidHJlZShpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgsCisJCQkJICAgICBzdWJ0cmVlX2luZGV4LCBkZWFsbG9jKTsKKwkJb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3Rocyhpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9kYXRhOworCQlkaS0+aV9sYXN0X2ViX2JsayA9IGViLT5oX2Jsa25vOworCisJCS8qCisJCSAqIFJlbW92YWwgb2YgdGhlIGV4dGVudCBpbiB0aGUgbGVmdCBsZWFmIHdhcyBza2lwcGVkCisJCSAqIGFib3ZlIHNvIHdlIGNvdWxkIGRlbGV0ZSB0aGUgcmlnaHQgcGF0aAorCQkgKiAxc3QuCisJCSAqLworCQlpZiAocmlnaHRfaGFzX2VtcHR5KQorCQkJb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChsZWZ0X2xlYWZfZWwpOworCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisKKwkJKmRlbGV0ZWQgPSAxOworCX0gZWxzZQorCQlvY2ZzMl9jb21wbGV0ZV9lZGdlX2luc2VydChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgsCisJCQkJCSAgIHN1YnRyZWVfaW5kZXgpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdpdmVuIGEgZnVsbCBwYXRoLCBkZXRlcm1pbmUgd2hhdCBjcG9zIHZhbHVlIHdvdWxkIHJldHVybiB1cyBhIHBhdGgKKyAqIGNvbnRhaW5pbmcgdGhlIGxlYWYgaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJyZW50IG9uZS4KKyAqCisgKiBXaWxsIHJldHVybiB6ZXJvIGlmIHRoZSBwYXRoIHBhc3NlZCBpbiBpcyBhbHJlYWR5IHRoZSByaWdodG1vc3QgcGF0aC4KKyAqCisgKiBUaGlzIGxvb2tzIHNpbWlsYXIsIGJ1dCBpcyBzdWJ0bHkgZGlmZmVyZW50IHRvCisgKiBvY2ZzMl9maW5kX2Nwb3NfZm9yX2xlZnRfbGVhZigpLgorICovCitzdGF0aWMgaW50IG9jZnMyX2ZpbmRfY3Bvc19mb3JfcmlnaHRfbGVhZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLCB1MzIgKmNwb3MpCit7CisJaW50IGksIGosIHJldCA9IDA7CisJdTY0IGJsa25vOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwkqY3BvcyA9IDA7CisKKwlpZiAocGF0aC0+cF90cmVlX2RlcHRoID09IDApCisJCXJldHVybiAwOworCisJYmxrbm8gPSBwYXRoX2xlYWZfYmgocGF0aCktPmJfYmxvY2tucjsKKworCS8qIFN0YXJ0IGF0IHRoZSB0cmVlIG5vZGUganVzdCBhYm92ZSB0aGUgbGVhZiBhbmQgd29yayBvdXIgd2F5IHVwLiAqLworCWkgPSBwYXRoLT5wX3RyZWVfZGVwdGggLSAxOworCXdoaWxlIChpID49IDApIHsKKwkJaW50IG5leHRfZnJlZTsKKworCQllbCA9IHBhdGgtPnBfbm9kZVtpXS5lbDsKKworCQkvKgorCQkgKiBGaW5kIHRoZSBleHRlbnQgcmVjb3JkIGp1c3QgYWZ0ZXIgdGhlIG9uZSBpbiBvdXIKKwkJICogcGF0aC4KKwkJICovCisJCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCQlmb3IoaiA9IDA7IGogPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaisrKSB7CisJCQlpZiAobGU2NF90b19jcHUoZWwtPmxfcmVjc1tqXS5lX2Jsa25vKSA9PSBibGtubykgeworCQkJCWlmIChqID09IChuZXh0X2ZyZWUgLSAxKSkgeworCQkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCQkvKgorCQkJCQkJICogV2UndmUgZGV0ZXJtaW5lZCB0aGF0IHRoZQorCQkJCQkJICogcGF0aCBzcGVjaWZpZWQgaXMgYWxyZWFkeQorCQkJCQkJICogdGhlIHJpZ2h0bW9zdCBvbmUgLSByZXR1cm4gYQorCQkJCQkJICogY3BvcyBvZiB6ZXJvLgorCQkJCQkJICovCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBUaGUgcmlnaHRtb3N0IHJlY29yZCBwb2ludHMgdG8gb3VyCisJCQkJCSAqIGxlYWYgLSB3ZSBuZWVkIHRvIHRyYXZlbCB1cCB0aGUKKwkJCQkJICogdHJlZSBvbmUgbGV2ZWwuCisJCQkJCSAqLworCQkJCQlnb3RvIG5leHRfbm9kZTsKKwkJCQl9CisKKwkJCQkqY3BvcyA9IGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaiArIDFdLmVfY3Bvcyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBnb3QgaGVyZSwgd2UgbmV2ZXIgZm91bmQgYSB2YWxpZCBub2RlIHdoZXJlCisJCSAqIHRoZSB0cmVlIGluZGljYXRlZCBvbmUgc2hvdWxkIGJlLgorCQkgKi8KKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkludmFsaWQgZXh0ZW50IHRyZWUgYXQgZXh0ZW50IGJsb2NrICVsbHVcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisKK25leHRfbm9kZToKKwkJYmxrbm8gPSBwYXRoLT5wX25vZGVbaV0uYmgtPmJfYmxvY2tucjsKKwkJaS0tOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcm90YXRlX3JpZ2h0bW9zdF9sZWFmX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKQorCQlyZXR1cm4gMDsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChlbCk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsIGludCBvcmlnX2NyZWRpdHMsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKiplbXB0eV9leHRlbnRfcGF0aCkKK3sKKwlpbnQgcmV0LCBzdWJ0cmVlX3Jvb3QsIGRlbGV0ZWQ7CisJdTMyIHJpZ2h0X2Nwb3M7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGggPSBOVUxMOworCisJQlVHX09OKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJihwYXRoX2xlYWZfZWwocGF0aCktPmxfcmVjc1swXSkpKTsKKworCSplbXB0eV9leHRlbnRfcGF0aCA9IE5VTEw7CisKKwlyZXQgPSBvY2ZzMl9maW5kX2Nwb3NfZm9yX3JpZ2h0X2xlYWYoaW5vZGUtPmlfc2IsIHBhdGgsCisJCQkJCSAgICAgJnJpZ2h0X2Nwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCisJCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwlpZiAoIWxlZnRfcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW9jZnMyX2NwX3BhdGgobGVmdF9wYXRoLCBwYXRoKTsKKworCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCisJCQkJICAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJaWYgKCFyaWdodF9wYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKHJpZ2h0X2Nwb3MpIHsKKwkJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCByaWdodF9wYXRoLCByaWdodF9jcG9zKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzdWJ0cmVlX3Jvb3QgPSBvY2ZzMl9maW5kX3N1YnRyZWVfcm9vdChpbm9kZSwgbGVmdF9wYXRoLAorCQkJCQkJICAgICAgIHJpZ2h0X3BhdGgpOworCisJCW1sb2coMCwgIlN1YnRyZWUgcm9vdCBhdCBpbmRleCAlZCAoYmxrICVsbHUsIGRlcHRoICVkKVxuIiwKKwkJICAgICBzdWJ0cmVlX3Jvb3QsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICByaWdodF9wYXRoLT5wX25vZGVbc3VidHJlZV9yb290XS5iaC0+Yl9ibG9ja25yLAorCQkgICAgIHJpZ2h0X3BhdGgtPnBfdHJlZV9kZXB0aCk7CisKKwkJcmV0ID0gb2NmczJfZXh0ZW5kX3JvdGF0ZV90cmFuc2FjdGlvbihoYW5kbGUsIHN1YnRyZWVfcm9vdCwKKwkJCQkJCSAgICAgIG9yaWdfY3JlZGl0cywgbGVmdF9wYXRoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfc3VidHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJCXJpZ2h0X3BhdGgsIHN1YnRyZWVfcm9vdCwKKwkJCQkJCWRlYWxsb2MsICZkZWxldGVkKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCQkvKgorCQkJICogVGhlIHJvdGF0aW9uIGhhcyB0byB0ZW1wb3JhcmlseSBzdG9wIGR1ZSB0bworCQkJICogdGhlIHJpZ2h0IHN1YnRyZWUgaGF2aW5nIGFuIGVtcHR5CisJCQkgKiBleHRlbnQuIFBhc3MgaXQgYmFjayB0byB0aGUgY2FsbGVyIGZvciBhCisJCQkgKiBmaXh1cC4KKwkJCSAqLworCQkJKmVtcHR5X2V4dGVudF9wYXRoID0gcmlnaHRfcGF0aDsKKwkJCXJpZ2h0X3BhdGggPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBUaGUgc3VidHJlZSByb3RhdGUgbWlnaHQgaGF2ZSByZW1vdmVkIHJlY29yZHMgb24KKwkJICogdGhlIHJpZ2h0bW9zdCBlZGdlLiBJZiBzbywgdGhlbiByb3RhdGlvbiBpcworCQkgKiBjb21wbGV0ZS4KKwkJICovCisJCWlmIChkZWxldGVkKQorCQkJYnJlYWs7CisKKwkJb2NmczJfbXZfcGF0aChsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgpOworCisJCXJldCA9IG9jZnMyX2ZpbmRfY3Bvc19mb3JfcmlnaHRfbGVhZihpbm9kZS0+aV9zYiwgbGVmdF9wYXRoLAorCQkJCQkJICAgICAmcmlnaHRfY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKHJpZ2h0X3BhdGgpOworCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9yZW1vdmVfcmlnaHRtb3N0X3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQsIHN1YnRyZWVfaW5kZXg7CisJdTMyIGNwb3M7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCS8qCisJICogWFhYOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSByb290IGlzIGFuIGlub2RlLCB3aGljaCBpcworCSAqIHRydWUgZm9yIG5vdyBidXQgbWF5IGNoYW5nZSBhcyB0cmVlIGNvZGUgZ2V0cyBnZW5lcmljLgorCSAqLworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilwYXRoX3Jvb3RfYmgocGF0aCktPmJfZGF0YTsKKwlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkgICAgIklub2RlICVsbHUgaGFzIGludmFsaWQgcGF0aCByb290IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlcmUncyB0d28gd2F5cyB3ZSBoYW5kbGUgdGhpcyBkZXBlbmRpbmcgb24KKwkgKiB3aGV0aGVyIHBhdGggaXMgdGhlIG9ubHkgZXhpc3Rpbmcgb25lLgorCSAqLworCXJldCA9IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlLCAwLAorCQkJCQkgICAgICBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMsCisJCQkJCSAgICAgIHBhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKGlub2RlLCBoYW5kbGUsIHBhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9maW5kX2Nwb3NfZm9yX2xlZnRfbGVhZihpbm9kZS0+aV9zYiwgcGF0aCwgJmNwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY3BvcykgeworCQkvKgorCQkgKiBXZSBoYXZlIGEgcGF0aCB0byB0aGUgbGVmdCBvZiB0aGlzIG9uZSAtIGl0IG5lZWRzCisJCSAqIGFuIHVwZGF0ZSB0b28uCisJCSAqLworCQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCisJCQkJCSAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJCWlmICghbGVmdF9wYXRoKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIGxlZnRfcGF0aCwgY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN1YnRyZWVfaW5kZXggPSBvY2ZzMl9maW5kX3N1YnRyZWVfcm9vdChpbm9kZSwgbGVmdF9wYXRoLCBwYXRoKTsKKworCQlvY2ZzMl91bmxpbmtfc3VidHJlZShpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHBhdGgsCisJCQkJICAgICBzdWJ0cmVlX2luZGV4LCBkZWFsbG9jKTsKKwkJb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3Rocyhpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9kYXRhOworCQlkaS0+aV9sYXN0X2ViX2JsayA9IGViLT5oX2Jsa25vOworCX0gZWxzZSB7CisJCS8qCisJCSAqICdwYXRoJyBpcyBhbHNvIHRoZSBsZWZ0bW9zdCBwYXRoIHdoaWNoCisJCSAqIG1lYW5zIGl0IG11c3QgYmUgdGhlIG9ubHkgb25lLiBUaGlzIGdldHMKKwkJICogaGFuZGxlZCBkaWZmZXJlbnRseSBiZWNhdXNlIHdlIHdhbnQgdG8KKwkJICogcmV2ZXJ0IHRoZSBpbm9kZSBiYWNrIHRvIGhhdmluZyBleHRlbnRzCisJCSAqIGluLWxpbmUuCisJCSAqLworCQlvY2ZzMl91bmxpbmtfcGF0aChpbm9kZSwgaGFuZGxlLCBkZWFsbG9jLCBwYXRoLCAxKTsKKworCQllbCA9ICZkaS0+aWQyLmlfbGlzdDsKKwkJZWwtPmxfdHJlZV9kZXB0aCA9IDA7CisJCWVsLT5sX25leHRfZnJlZV9yZWMgPSAwOworCQltZW1zZXQoJmVsLT5sX3JlY3NbMF0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCisJCWRpLT5pX2xhc3RfZWJfYmxrID0gMDsKKwl9CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9yb290X2JoKHBhdGgpKTsKKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBMZWZ0IHJvdGF0aW9uIG9mIGJ0cmVlIHJlY29yZHMuCisgKgorICogSW4gbWFueSB3YXlzLCB0aGlzIGlzICh1bnN1cnByaXNpbmdseSkgdGhlIG9wcG9zaXRlIG9mIHJpZ2h0CisgKiByb3RhdGlvbi4gV2Ugc3RhcnQgYXQgc29tZSBub24tcmlnaHRtb3N0IHBhdGggY29udGFpbmluZyBhbiBlbXB0eQorICogZXh0ZW50IGluIHRoZSBsZWFmIGJsb2NrLiBUaGUgY29kZSB3b3JrcyBpdHMgd2F5IHRvIHRoZSByaWdodG1vc3QKKyAqIHBhdGggYnkgcm90YXRpbmcgcmVjb3JkcyB0byB0aGUgbGVmdCBpbiBldmVyeSBzdWJ0cmVlLgorICoKKyAqIFRoaXMgaXMgdXNlZCBieSBhbnkgY29kZSB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgZXh0ZW50IHJlY29yZHMKKyAqIGluIGEgbGVhZi4gQWZ0ZXIgcmVtb3ZhbCwgYW4gZW1wdHkgcmVjb3JkIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlCisgKiBsZWZ0bW9zdCBsaXN0IHBvc2l0aW9uLgorICoKKyAqIFRoaXMgd29uJ3QgaGFuZGxlIGEgbGVuZ3RoIHVwZGF0ZSBvZiB0aGUgcmlnaHRtb3N0IHBhdGggcmVjb3JkcyBpZgorICogdGhlIHJpZ2h0bW9zdCB0cmVlIGxlYWYgcmVjb3JkIGlzIHJlbW92ZWQgc28gdGhlIGNhbGxlciBpcworICogcmVzcG9uc2libGUgZm9yIGRldGVjdGluZyBhbmQgY29ycmVjdGluZyB0aGF0LgorICovCitzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCSAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCwgb3JpZ19jcmVkaXRzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCXN0cnVjdCBvY2ZzMl9wYXRoICp0bXBfcGF0aCA9IE5VTEwsICpyZXN0YXJ0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlpZiAoIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCisJCXJldHVybiAwOworCisJaWYgKHBhdGgtPnBfdHJlZV9kZXB0aCA9PSAwKSB7CityaWdodG1vc3Rfbm9fZGVsZXRlOgorCQkvKgorCQkgKiBJbi1pbm9kZSBleHRlbnRzLiBUaGlzIGlzIHRyaXZpYWxseSBoYW5kbGVkLCBzbyBkbworCQkgKiBpdCB1cCBmcm9udC4KKwkJICovCisJCXJldCA9IG9jZnMyX3JvdGF0ZV9yaWdodG1vc3RfbGVhZl9sZWZ0KGlub2RlLCBoYW5kbGUsCisJCQkJCQkgICAgICAgcGF0aF9sZWFmX2JoKHBhdGgpLAorCQkJCQkJICAgICAgIHBhdGhfbGVhZl9lbChwYXRoKSk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSGFuZGxlIHJpZ2h0bW9zdCBicmFuY2ggbm93LiBUaGVyZSdzIHNldmVyYWwgY2FzZXM6CisJICogIDEpIHNpbXBsZSByb3RhdGlvbiBsZWF2aW5nIHJlY29yZHMgaW4gdGhlcmUuIFRoYXQncyB0cml2aWFsLgorCSAqICAyKSByb3RhdGlvbiByZXF1aXJpbmcgYSBicmFuY2ggZGVsZXRlIC0gdGhlcmUncyBubyBtb3JlCisJICogICAgIHJlY29yZHMgbGVmdC4gVHdvIGNhc2VzIG9mIHRoaXM6CisJICogICAgIGEpIFRoZXJlIGFyZSBicmFuY2hlcyB0byB0aGUgbGVmdC4KKwkgKiAgICAgYikgVGhpcyBpcyBhbHNvIHRoZSBsZWZ0bW9zdCAodGhlIG9ubHkpIGJyYW5jaC4KKwkgKgorCSAqICAxKSBpcyBoYW5kbGVkIHZpYSBvY2ZzMl9yb3RhdGVfcmlnaHRtb3N0X2xlYWZfbGVmdCgpCisJICogIDJhKSB3ZSBuZWVkIHRoZSBsZWZ0IGJyYW5jaCBzbyB0aGF0IHdlIGNhbiB1cGRhdGUgaXQgd2l0aCB0aGUgdW5saW5rCisJICogIDJiKSB3ZSBuZWVkIHRvIGJyaW5nIHRoZSBpbm9kZSBiYWNrIHRvIGlubGluZSBleHRlbnRzLgorCSAqLworCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChwYXRoKS0+Yl9kYXRhOworCWVsID0gJmViLT5oX2xpc3Q7CisJaWYgKGViLT5oX25leHRfbGVhZl9ibGsgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIGdldHMgYSBiaXQgdHJpY2t5IGlmIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZSB0aGUKKwkJICogcmlnaHRtb3N0IHBhdGguIEdldCB0aGUgb3RoZXIgY2FzZXMgb3V0IG9mIHRoZSB3YXkKKwkJICogMXN0LgorCQkgKi8KKwkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID4gMSkKKwkJCWdvdG8gcmlnaHRtb3N0X25vX2RlbGV0ZTsKKworCQlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0gMCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWxsdSBoYXMgZW1wdHkgZXh0ZW50IGJsb2NrIGF0ICVsbHUiLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlYi0+aF9ibGtubykpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBYWFg6IFRoZSBjYWxsZXIgY2FuIG5vdCB0cnVzdCAicGF0aCIgYW55IG1vcmUgYWZ0ZXIKKwkJICogdGhpcyBhcyBpdCB3aWxsIGhhdmUgYmVlbiBkZWxldGVkLiBXaGF0IGRvIHdlIGRvPworCQkgKgorCQkgKiBJbiB0aGVvcnkgdGhlIHJvdGF0ZS1mb3ItbWVyZ2UgY29kZSB3aWxsIG5ldmVyIGdldAorCQkgKiBoZXJlIGJlY2F1c2UgaXQnbGwgYWx3YXlzIGFzayBmb3IgYSByb3RhdGUgaW4gYQorCQkgKiBub25lbXB0eSBsaXN0LgorCQkgKi8KKworCQlyZXQgPSBvY2ZzMl9yZW1vdmVfcmlnaHRtb3N0X3BhdGgoaW5vZGUsIGhhbmRsZSwgcGF0aCwKKwkJCQkJCSAgZGVhbGxvYyk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTm93IHdlIGNhbiBsb29wLCByZW1lbWJlcmluZyB0aGUgcGF0aCB3ZSBnZXQgZnJvbSAtRUFHQUlOCisJICogYW5kIHJlc3RhcnRpbmcgZnJvbSB0aGVyZS4KKwkgKi8KK3RyeV9yb3RhdGU6CisJcmV0ID0gX19vY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIG9yaWdfY3JlZGl0cywgcGF0aCwKKwkJCQkgICAgICAgZGVhbGxvYywgJnJlc3RhcnRfcGF0aCk7CisJaWYgKHJldCAmJiByZXQgIT0gLUVBR0FJTikgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChyZXQgPT0gLUVBR0FJTikgeworCQl0bXBfcGF0aCA9IHJlc3RhcnRfcGF0aDsKKwkJcmVzdGFydF9wYXRoID0gTlVMTDsKKworCQlyZXQgPSBfX29jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgb3JpZ19jcmVkaXRzLAorCQkJCQkgICAgICAgdG1wX3BhdGgsIGRlYWxsb2MsCisJCQkJCSAgICAgICAmcmVzdGFydF9wYXRoKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVBR0FJTikgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlvY2ZzMl9mcmVlX3BhdGgodG1wX3BhdGgpOworCQl0bXBfcGF0aCA9IE5VTEw7CisKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byB0cnlfcm90YXRlOworCX0KKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aCh0bXBfcGF0aCk7CisJb2NmczJfZnJlZV9wYXRoKHJlc3RhcnRfcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb2NmczJfY2xlYW51cF9tZXJnZShzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLAorCQkJCWludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCXVuc2lnbmVkIGludCBzaXplOworCisJaWYgKHJlYy0+ZV9sZWFmX2NsdXN0ZXJzID09IDApIHsKKwkJLyoKKwkJICogV2UgY29uc3VtZWQgYWxsIG9mIHRoZSBtZXJnZWQtZnJvbSByZWNvcmQuIEFuIGVtcHR5CisJCSAqIGV4dGVudCBjYW5ub3QgZXhpc3QgYW55d2hlcmUgYnV0IHRoZSAxc3QgYXJyYXkKKwkJICogcG9zaXRpb24sIHNvIG1vdmUgdGhpbmdzIG92ZXIgaWYgdGhlIG1lcmdlZC1mcm9tCisJCSAqIHJlY29yZCBkb2Vzbid0IG9jY3VweSB0aGF0IHBvc2l0aW9uLgorCQkgKgorCQkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgZW1wdHkgZXh0ZW50IHNvIHRoZSBjYWxsZXIKKwkJICogc2hvdWxkIGJlIHNtYXJ0IGVub3VnaCB0byBoYXZlIHJlbW92ZWQgYW55IGV4aXN0aW5nCisJCSAqIG9uZXMuCisJCSAqLworCQlpZiAoaW5kZXggPiAwKSB7CisJCQlCVUdfT04ob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSk7CisJCQlzaXplID0gaW5kZXggKiBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpOworCQkJbWVtbW92ZSgmZWwtPmxfcmVjc1sxXSwgJmVsLT5sX3JlY3NbMF0sIHNpemUpOworCQl9CisKKwkJLyoKKwkJICogQWx3YXlzIG1lbXNldCAtIHRoZSBjYWxsZXIgZG9lc24ndCBjaGVjayB3aGV0aGVyIGl0CisJCSAqIGNyZWF0ZWQgYW4gZW1wdHkgZXh0ZW50LCBzbyB0aGVyZSBjb3VsZCBiZSBqdW5rIGluCisJCSAqIHRoZSBvdGhlciBmaWVsZHMuCisJCSAqLworCQltZW1zZXQoJmVsLT5sX3JlY3NbMF0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCX0KK30KKworLyoKKyAqIFJlbW92ZSBzcGxpdF9yZWMgY2x1c3RlcnMgZnJvbSB0aGUgcmVjb3JkIGF0IGluZGV4IGFuZCBtZXJnZSB0aGVtCisgKiBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlY29yZCBhdCBpbmRleCArIDEuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfbWVyZ2VfcmVjX3JpZ2h0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIGludCBpbmRleCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBzcGxpdF9jbHVzdGVycyA9IGxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqbGVmdF9yZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJpZ2h0X3JlYzsKKworCUJVR19PTihpbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSk7CisKKwlsZWZ0X3JlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlyaWdodF9yZWMgPSAmZWwtPmxfcmVjc1tpbmRleCArIDFdOworCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlsZTE2X2FkZF9jcHUoJmxlZnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMsIC1zcGxpdF9jbHVzdGVycyk7CisKKwlsZTMyX2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9jcG9zLCAtc3BsaXRfY2x1c3RlcnMpOworCWxlNjRfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2Jsa25vLAorCQkgICAgIC1vY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHNwbGl0X2NsdXN0ZXJzKSk7CisJbGUxNl9hZGRfY3B1KCZyaWdodF9yZWMtPmVfbGVhZl9jbHVzdGVycywgc3BsaXRfY2x1c3RlcnMpOworCisJb2NmczJfY2xlYW51cF9tZXJnZShlbCwgaW5kZXgpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVtb3ZlIHNwbGl0X3JlYyBjbHVzdGVycyBmcm9tIHRoZSByZWNvcmQgYXQgaW5kZXggYW5kIG1lcmdlIHRoZW0KKyAqIG9udG8gdGhlIHRhaWwgb2YgdGhlIHJlY29yZCBhdCBpbmRleCAtIDEuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfbWVyZ2VfcmVjX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwgaW50IGluZGV4KQoreworCWludCByZXQsIGhhc19lbXB0eV9leHRlbnQgPSAwOworCXVuc2lnbmVkIGludCBzcGxpdF9jbHVzdGVycyA9IGxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqbGVmdF9yZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJpZ2h0X3JlYzsKKworCUJVR19PTihpbmRleCA8PSAwKTsKKworCWxlZnRfcmVjID0gJmVsLT5sX3JlY3NbaW5kZXggLSAxXTsKKwlyaWdodF9yZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCisJCWhhc19lbXB0eV9leHRlbnQgPSAxOworCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaGFzX2VtcHR5X2V4dGVudCAmJiBpbmRleCA9PSAxKSB7CisJCS8qCisJCSAqIFRoZSBlYXN5IGNhc2UgLSB3ZSBjYW4ganVzdCBwbG9wIHRoZSByZWNvcmQgcmlnaHQgaW4uCisJCSAqLworCQkqbGVmdF9yZWMgPSAqc3BsaXRfcmVjOworCisJCWhhc19lbXB0eV9leHRlbnQgPSAwOworCX0gZWxzZSB7CisJCWxlMTZfYWRkX2NwdSgmbGVmdF9yZWMtPmVfbGVhZl9jbHVzdGVycywgc3BsaXRfY2x1c3RlcnMpOworCX0KKworCWxlMzJfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2Nwb3MsIHNwbGl0X2NsdXN0ZXJzKTsKKwlsZTY0X2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9ibGtubywKKwkJICAgICBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHNwbGl0X2NsdXN0ZXJzKSk7CisJbGUxNl9hZGRfY3B1KCZyaWdodF9yZWMtPmVfbGVhZl9jbHVzdGVycywgLXNwbGl0X2NsdXN0ZXJzKTsKKworCW9jZnMyX2NsZWFudXBfbWVyZ2UoZWwsIGluZGV4KTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl90cnlfdG9fbWVyZ2VfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCwKKwkJCQkgICAgIGludCBzcGxpdF9pbmRleCwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9tZXJnZV9jdHh0ICpjdHh0KQorCit7CisJaW50IHJldCA9IDAsIGRlbGV0ZV90YWlsX3JlY3MgPSAwOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjID0gJmVsLT5sX3JlY3Nbc3BsaXRfaW5kZXhdOworCisJQlVHX09OKGN0eHQtPmNfY29udGlnX3R5cGUgPT0gQ09OVElHX05PTkUpOworCisJaWYgKGN0eHQtPmNfc3BsaXRfY292ZXJzX3JlYykgeworCQlkZWxldGVfdGFpbF9yZWNzKys7CisKKwkJaWYgKGN0eHQtPmNfY29udGlnX3R5cGUgPT0gQ09OVElHX0xFRlRSSUdIVCB8fAorCQkgICAgY3R4dC0+Y19oYXNfZW1wdHlfZXh0ZW50KQorCQkJZGVsZXRlX3RhaWxfcmVjcysrOworCisJCWlmIChjdHh0LT5jX2hhc19lbXB0eV9leHRlbnQpIHsKKwkJCS8qCisJCQkgKiBUaGUgbWVyZ2UgY29kZSB3aWxsIG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5CisJCQkgKiBleHRlbnQgdG8gdGFrZSB0aGUgcGxhY2Ugb2YgdGhlIG5ld2x5CisJCQkgKiBlbXB0aWVkIHNsb3QuIFJlbW92ZSBhbnkgcHJlLWV4aXN0aW5nIGVtcHR5CisJCQkgKiBleHRlbnRzIC0gaGF2aW5nIG1vcmUgdGhhbiBvbmUgaW4gYSBsZWFmIGlzCisJCQkgKiBpbGxlZ2FsLgorCQkJICovCisJCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJCSAgICAgZGVhbGxvYyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJc3BsaXRfaW5kZXgtLTsKKwkJCXJlYyA9ICZlbC0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKwkJfQorCX0KKworCWlmIChjdHh0LT5jX2NvbnRpZ190eXBlID09IENPTlRJR19MRUZUUklHSFQpIHsKKwkJLyoKKwkJICogTGVmdC1yaWdodCBjb250aWcgaW1wbGllcyB0aGlzLgorCQkgKi8KKwkJQlVHX09OKCFjdHh0LT5jX3NwbGl0X2NvdmVyc19yZWMpOworCQlCVUdfT04oc3BsaXRfaW5kZXggPT0gMCk7CisKKwkJLyoKKwkJICogU2luY2UgdGhlIGxlZnRyaWdodCBpbnNlcnQgYWx3YXlzIGNvdmVycyB0aGUgZW50aXJlCisJCSAqIGV4dGVudCwgdGhpcyBjYWxsIHdpbGwgZGVsZXRlIHRoZSBpbnNlcnQgcmVjb3JkCisJCSAqIGVudGlyZWx5LCByZXN1bHRpbmcgaW4gYW4gZW1wdHkgZXh0ZW50IHJlY29yZCBhZGRlZCB0bworCQkgKiB0aGUgZXh0ZW50IGJsb2NrLgorCQkgKgorCQkgKiBTaW5jZSB0aGUgYWRkaW5nIG9mIGFuIGVtcHR5IGV4dGVudCBzaGlmdHMKKwkJICogZXZlcnl0aGluZyBiYWNrIHRvIHRoZSByaWdodCwgdGhlcmUncyBubyBuZWVkIHRvCisJCSAqIHVwZGF0ZSBzcGxpdF9pbmRleCBoZXJlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfbWVyZ2VfcmVjX2xlZnQoaW5vZGUsIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLAorCQkJCQkgICBoYW5kbGUsIHNwbGl0X3JlYywgZWwsIHNwbGl0X2luZGV4KTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW4gb25seSBnZXQgdGhpcyBmcm9tIGxvZ2ljIGVycm9yIGFib3ZlLgorCQkgKi8KKwkJQlVHX09OKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKTsKKworCQkvKgorCQkgKiBUaGUgbGVmdCBtZXJnZSBsZWZ0IHVzIHdpdGggYW4gZW1wdHkgZXh0ZW50LCByZW1vdmUKKwkJICogaXQuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgZGVhbGxvYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNwbGl0X2luZGV4LS07CisJCXJlYyA9ICZlbC0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKworCQkvKgorCQkgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgcGFzcyBzcGxpdF9yZWMgaGVyZSBvbiBwdXJwb3NlIC0KKwkJICogd2UndmUgbWVyZ2VkIGl0IGludG8gdGhlIGxlZnQgc2lkZS4KKwkJICovCisJCXJldCA9IG9jZnMyX21lcmdlX3JlY19yaWdodChpbm9kZSwgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCksCisJCQkJCSAgICBoYW5kbGUsIHJlYywgZWwsIHNwbGl0X2luZGV4KTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlCVUdfT04oIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpOworCisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLAorCQkJCQkgICAgIGRlYWxsb2MpOworCQkvKgorCQkgKiBFcnJvciBmcm9tIHRoaXMgbGFzdCByb3RhdGUgaXMgbm90IGNyaXRpY2FsLCBzbworCQkgKiBwcmludCBidXQgZG9uJ3QgYnViYmxlIGl0IHVwLgorCQkgKi8KKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBNZXJnZSBhIHJlY29yZCB0byB0aGUgbGVmdCBvciByaWdodC4KKwkJICoKKwkJICogJ2NvbnRpZ190eXBlJyBpcyByZWxhdGl2ZSB0byB0aGUgZXhpc3RpbmcgcmVjb3JkLAorCQkgKiBzbyBmb3IgZXhhbXBsZSwgaWYgd2UncmUgInJpZ2h0IGNvbnRpZyIsIGl0J3MgdG8KKwkJICogdGhlIHJlY29yZCBvbiB0aGUgbGVmdCAoaGVuY2UgdGhlIGxlZnQgbWVyZ2UpLgorCQkgKi8KKwkJaWYgKGN0eHQtPmNfY29udGlnX3R5cGUgPT0gQ09OVElHX1JJR0hUKSB7CisJCQlyZXQgPSBvY2ZzMl9tZXJnZV9yZWNfbGVmdChpbm9kZSwKKwkJCQkJCSAgIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLAorCQkJCQkJICAgaGFuZGxlLCBzcGxpdF9yZWMsIGVsLAorCQkJCQkJICAgc3BsaXRfaW5kZXgpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IG9jZnMyX21lcmdlX3JlY19yaWdodChpbm9kZSwKKwkJCQkJCSAgICBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSwKKwkJCQkJCSAgICBoYW5kbGUsIHNwbGl0X3JlYywgZWwsCisJCQkJCQkgICAgc3BsaXRfaW5kZXgpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmIChjdHh0LT5jX3NwbGl0X2NvdmVyc19yZWMpIHsKKwkJCS8qCisJCQkgKiBUaGUgbWVyZ2UgbWF5IGhhdmUgbGVmdCBhbiBlbXB0eSBleHRlbnQgaW4KKwkJCSAqIG91ciBsZWFmLiBUcnkgdG8gcm90YXRlIGl0IGF3YXkuCisJCQkgKi8KKwkJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLAorCQkJCQkJICAgICBkZWFsbG9jKTsKKwkJCWlmIChyZXQpCisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJcmV0ID0gMDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3N1YnRyYWN0X2Zyb21fcmVjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIGVudW0gb2NmczJfc3BsaXRfdHlwZSBzcGxpdCwKKwkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYywKKwkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYykKK3sKKwl1NjQgbGVuX2Jsb2NrczsKKworCWxlbl9ibG9ja3MgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Moc2IsCisJCQkJbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKworCWlmIChzcGxpdCA9PSBTUExJVF9MRUZUKSB7CisJCS8qCisJCSAqIFJlZ2lvbiBpcyBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBleGlzdGluZworCQkgKiByZWNvcmQuCisJCSAqLworCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9jcG9zLAorCQkJICAgICBsZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCQlsZTY0X2FkZF9jcHUoJnJlYy0+ZV9ibGtubywgbGVuX2Jsb2Nrcyk7CisJCWxlMTZfYWRkX2NwdSgmcmVjLT5lX2xlYWZfY2x1c3RlcnMsCisJCQkgICAgIC1sZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlZ2lvbiBpcyBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgZXhpc3RpbmcKKwkJICogcmVjb3JkLgorCQkgKi8KKwkJbGUxNl9hZGRfY3B1KCZyZWMtPmVfbGVhZl9jbHVzdGVycywKKwkJCSAgICAgLWxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJfQorfQorCiAvKgogICogRG8gdGhlIGZpbmFsIGJpdHMgb2YgZXh0ZW50IHJlY29yZCBpbnNlcnRpb24gYXQgdGhlIHRhcmdldCBsZWFmCiAgKiBsaXN0LiBJZiB0aGlzIGxlYWYgaXMgcGFydCBvZiBhbiBhbGxvY2F0aW9uIHRyZWUsIGl0IGlzIGFzc3VtZWQKQEAgLTE3MzgsNiArMjk5NCwxNSBAQAogCiAJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpICE9IDApOwogCisJaWYgKGluc2VydC0+aW5zX3NwbGl0ICE9IFNQTElUX05PTkUpIHsKKwkJaSA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgbGUzMl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9jcG9zKSk7CisJCUJVR19PTihpID09IC0xKTsKKwkJcmVjID0gJmVsLT5sX3JlY3NbaV07CisJCW9jZnMyX3N1YnRyYWN0X2Zyb21fcmVjKGlub2RlLT5pX3NiLCBpbnNlcnQtPmluc19zcGxpdCwgcmVjLAorCQkJCQlpbnNlcnRfcmVjKTsKKwkJZ290byByb3RhdGU7CisJfQorCiAJLyoKIAkgKiBDb250aWd1b3VzIGluc2VydCAtIGVpdGhlciBsZWZ0IG9yIHJpZ2h0LgogCSAqLwpAQCAtMTc5Miw2ICszMDU3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAorcm90YXRlOgogCS8qCiAJICogT2ssIHdlIGhhdmUgdG8gcm90YXRlLgogCSAqCkBAIC0xODE1LDEzICszMDgxLDUzIEBACiAJc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfYWRqdXN0X3JpZ2h0bW9zdF9yZWNvcmRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCQkgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYykKK3sKKwlpbnQgcmV0LCBpLCBuZXh0X2ZyZWU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisKKwkvKgorCSAqIFVwZGF0ZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgbGVhZiBibG9jay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGF0aC0+cF90cmVlX2RlcHRoOyBpKyspIHsKKwkJYmggPSBwYXRoLT5wX25vZGVbaV0uYmg7CisJCWVsID0gcGF0aC0+cF9ub2RlW2ldLmVsOworCisJCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCQlpZiAobmV4dF9mcmVlID09IDApIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiRGlub2RlICVsbHUgaGFzIGEgYmFkIGV4dGVudCBsaXN0IiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCQkJcmV0ID0gLUVJTzsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlYyA9ICZlbC0+bF9yZWNzW25leHRfZnJlZSAtIDFdOworCisJCXJlYy0+ZV9pbnRfY2x1c3RlcnMgPSBpbnNlcnRfcmVjLT5lX2Nwb3M7CisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKKwkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKKwkJCSAgICAgLWxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKworCX0KK30KKwogc3RhdGljIGludCBvY2ZzMl9hcHBlbmRfcmVjX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAogCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqKnJldF9sZWZ0X3BhdGgpCiB7Ci0JaW50IHJldCwgaSwgbmV4dF9mcmVlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldCwgbmV4dF9mcmVlOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CiAKQEAgLTE4ODcsNDAgKzMxOTMsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllbCA9IHBhdGhfcm9vdF9lbChyaWdodF9wYXRoKTsKLQliaCA9IHBhdGhfcm9vdF9iaChyaWdodF9wYXRoKTsKLQlpID0gMDsKLQl3aGlsZSAoMSkgewotCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOwotCi0JCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOwotCQlpZiAobmV4dF9mcmVlID09IDApIHsKLQkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAotCQkJCSAgICAiRGlub2RlICVsbHUgaGFzIGEgYmFkIGV4dGVudCBsaXN0IiwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmVjID0gJmVsLT5sX3JlY3NbbmV4dF9mcmVlIC0gMV07Ci0KLQkJcmVjLT5lX2ludF9jbHVzdGVycyA9IGluc2VydF9yZWMtPmVfY3BvczsKLQkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfaW50X2NsdXN0ZXJzLAotCQkJICAgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKLQkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfaW50X2NsdXN0ZXJzLAotCQkJICAgICAtbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKTsKLQotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOwotCQlpZiAocmV0KQotCQkJbWxvZ19lcnJubyhyZXQpOwotCi0JCS8qIERvbid0IHRvdWNoIHRoZSBsZWFmIG5vZGUgKi8KLQkJaWYgKCsraSA+PSByaWdodF9wYXRoLT5wX3RyZWVfZGVwdGgpCi0JCQlicmVhazsKLQotCQliaCA9IHJpZ2h0X3BhdGgtPnBfbm9kZVtpXS5iaDsKLQkJZWwgPSByaWdodF9wYXRoLT5wX25vZGVbaV0uZWw7Ci0JfQorCW9jZnMyX2FkanVzdF9yaWdodG1vc3RfcmVjb3Jkcyhpbm9kZSwgaGFuZGxlLCByaWdodF9wYXRoLCBpbnNlcnRfcmVjKTsKIAogCSpyZXRfbGVmdF9wYXRoID0gbGVmdF9wYXRoOwogCXJldCA9IDA7CkBAIC0xOTMxLDYgKzMyMDQsODMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBvY2ZzMl9zcGxpdF9yZWNvcmQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkgICAgICAgZW51bSBvY2ZzMl9zcGxpdF90eXBlIHNwbGl0KQoreworCWludCBpbmRleDsKKwl1MzIgY3BvcyA9IGxlMzJfdG9fY3B1KHNwbGl0X3JlYy0+ZV9jcG9zKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmxlZnRfZWwgPSBOVUxMLCAqcmlnaHRfZWwsICppbnNlcnRfZWwsICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjLCAqdG1wcmVjOworCisJcmlnaHRfZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7OworCWlmIChsZWZ0X3BhdGgpCisJCWxlZnRfZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKworCWVsID0gcmlnaHRfZWw7CisJaW5zZXJ0X2VsID0gcmlnaHRfZWw7CisJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCWlmIChpbmRleCAhPSAtMSkgeworCQlpZiAoaW5kZXggPT0gMCAmJiBsZWZ0X3BhdGgpIHsKKwkJCUJVR19PTihvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKTsKKworCQkJLyoKKwkJCSAqIFRoaXMgdHlwaWNhbGx5IG1lYW5zIHRoYXQgdGhlIHJlY29yZAorCQkJICogc3RhcnRlZCBpbiB0aGUgbGVmdCBwYXRoIGJ1dCBtb3ZlZCB0byB0aGUKKwkJCSAqIHJpZ2h0IGFzIGEgcmVzdWx0IG9mIHJvdGF0aW9uLiBXZSBlaXRoZXIKKwkJCSAqIG1vdmUgdGhlIGV4aXN0aW5nIHJlY29yZCB0byB0aGUgbGVmdCwgb3Igd2UKKwkJCSAqIGRvIHRoZSBsYXRlciBpbnNlcnQgdGhlcmUuCisJCQkgKgorCQkJICogSW4gdGhpcyBjYXNlLCB0aGUgbGVmdCBwYXRoIHNob3VsZCBhbHdheXMKKwkJCSAqIGV4aXN0IGFzIHRoZSByb3RhdGUgY29kZSB3aWxsIGhhdmUgcGFzc2VkCisJCQkgKiBpdCBiYWNrIGZvciBhIHBvc3QtaW5zZXJ0IHVwZGF0ZS4KKwkJCSAqLworCisJCQlpZiAoc3BsaXQgPT0gU1BMSVRfTEVGVCkgeworCQkJCS8qCisJCQkJICogSXQncyBhIGxlZnQgc3BsaXQuIFNpbmNlIHdlIGtub3cKKwkJCQkgKiB0aGF0IHRoZSByb3RhdGUgY29kZSBnYXZlIHVzIGFuCisJCQkJICogZW1wdHkgZXh0ZW50IGluIHRoZSBsZWZ0IHBhdGgsIHdlCisJCQkJICogY2FuIGp1c3QgZG8gdGhlIGluc2VydCB0aGVyZS4KKwkJCQkgKi8KKwkJCQlpbnNlcnRfZWwgPSBsZWZ0X2VsOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFJpZ2h0IHNwbGl0IC0gd2UgaGF2ZSB0byBtb3ZlIHRoZQorCQkJCSAqIGV4aXN0aW5nIHJlY29yZCBvdmVyIHRvIHRoZSBsZWZ0CisJCQkJICogbGVhZi4gVGhlIGluc2VydCB3aWxsIGJlIGludG8gdGhlCisJCQkJICogbmV3bHkgY3JlYXRlZCBlbXB0eSBleHRlbnQgaW4gdGhlCisJCQkJICogcmlnaHQgbGVhZi4KKwkJCQkgKi8KKwkJCQl0bXByZWMgPSAmcmlnaHRfZWwtPmxfcmVjc1tpbmRleF07CisJCQkJb2NmczJfcm90YXRlX2xlYWYobGVmdF9lbCwgdG1wcmVjKTsKKwkJCQllbCA9IGxlZnRfZWw7CisKKwkJCQltZW1zZXQodG1wcmVjLCAwLCBzaXplb2YoKnRtcHJlYykpOworCQkJCWluZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGxlZnRfZWwsIGNwb3MpOworCQkJCUJVR19PTihpbmRleCA9PSAtMSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlCVUdfT04oIWxlZnRfcGF0aCk7CisJCUJVR19PTighb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZsZWZ0X2VsLT5sX3JlY3NbMF0pKTsKKwkJLyoKKwkJICogTGVmdCBwYXRoIGlzIGVhc3kgLSB3ZSBjYW4ganVzdCBhbGxvdyB0aGUgaW5zZXJ0IHRvCisJCSAqIGhhcHBlbi4KKwkJICovCisJCWVsID0gbGVmdF9lbDsKKwkJaW5zZXJ0X2VsID0gbGVmdF9lbDsKKwkJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCQlCVUdfT04oaW5kZXggPT0gLTEpOworCX0KKworCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlvY2ZzMl9zdWJ0cmFjdF9mcm9tX3JlYyhpbm9kZS0+aV9zYiwgc3BsaXQsIHJlYywgc3BsaXRfcmVjKTsKKwlvY2ZzMl9yb3RhdGVfbGVhZihpbnNlcnRfZWwsIHNwbGl0X3JlYyk7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZG9lcyBpbnNlcnRzIG9uIGFuIGFsbG9jYXRpb24gYi10cmVlLiBGb3IgZGlub2RlCiAgKiBsaXN0cywgb2NmczJfaW5zZXJ0X2F0X2xlYWYoKSBpcyBjYWxsZWQgZGlyZWN0bHkuCkBAIC0xOTQ4LDcgKzMyOTgsNiBAQAogewogCWludCByZXQsIHN1YnRyZWVfaW5kZXg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsZWFmX2JoID0gcGF0aF9sZWFmX2JoKHJpZ2h0X3BhdGgpOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAKIAkvKgogCSAqIFBhc3MgYm90aCBwYXRocyB0byB0aGUgam91cm5hbC4gVGhlIG1ham9yaXR5IG9mIGluc2VydHMKQEAgLTE5ODQsOSArMzMzMywxOCBAQAogCQl9CiAJfQogCi0JZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7CisJaWYgKGluc2VydC0+aW5zX3NwbGl0ICE9IFNQTElUX05PTkUpIHsKKwkJLyoKKwkJICogV2UgY291bGQgY2FsbCBvY2ZzMl9pbnNlcnRfYXRfbGVhZigpIGZvciBzb21lIHR5cGVzCisJCSAqIG9mIHNwbGl0cywgYnV0IGl0J3MgZWFzaWVyIHRvIGp1c3QgbGV0IG9uZSBzZXBlcmF0ZQorCQkgKiBmdW5jdGlvbiBzb3J0IGl0IGFsbCBvdXQuCisJCSAqLworCQlvY2ZzMl9zcGxpdF9yZWNvcmQoaW5vZGUsIGxlZnRfcGF0aCwgcmlnaHRfcGF0aCwKKwkJCQkgICBpbnNlcnRfcmVjLCBpbnNlcnQtPmluc19zcGxpdCk7CisJfSBlbHNlCisJCW9jZnMyX2luc2VydF9hdF9sZWFmKGluc2VydF9yZWMsIHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKSwKKwkJCQkgICAgIGluc2VydCwgaW5vZGUpOwogCi0Jb2NmczJfaW5zZXJ0X2F0X2xlYWYoaW5zZXJ0X3JlYywgZWwsIGluc2VydCwgaW5vZGUpOwogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBsZWFmX2JoKTsKIAlpZiAocmV0KQogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yMDc1LDcgKzM0MzMsNyBAQAogCSAqIGNhbiB3aW5kIHVwIHNraXBwaW5nIGJvdGggb2YgdGhlc2UgdHdvIHNwZWNpYWwgY2FzZXMuLi4KIAkgKi8KIAlpZiAocm90YXRlKSB7Ci0JCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX3JpZ2h0KGlub2RlLCBoYW5kbGUsCisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX3JpZ2h0KGlub2RlLCBoYW5kbGUsIHR5cGUtPmluc19zcGxpdCwKIAkJCQkJICAgICAgbGUzMl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9jcG9zKSwKIAkJCQkJICAgICAgcmlnaHRfcGF0aCwgJmxlZnRfcGF0aCk7CiAJCWlmIChyZXQpIHsKQEAgLTIxMDAsOCArMzQ1OCw5IEBACiAJfQogCiBvdXRfdXBkYXRlX2NsdXN0ZXJzOgotCW9jZnMyX3VwZGF0ZV9kaW5vZGVfY2x1c3RlcnMoaW5vZGUsIGRpLAotCQkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJaWYgKHR5cGUtPmluc19zcGxpdCA9PSBTUExJVF9OT05FKQorCQlvY2ZzMl91cGRhdGVfZGlub2RlX2NsdXN0ZXJzKGlub2RlLCBkaSwKKwkJCQkJICAgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKIAogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CiAJaWYgKHJldCkKQEAgLTIxMTQsNiArMzQ3Myw0NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBlbnVtIG9jZnMyX2NvbnRpZ190eXBlCitvY2ZzMl9maWd1cmVfbWVyZ2VfY29udGlnX3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCBpbnQgaW5kZXgsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYykKK3sKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCWVudW0gb2NmczJfY29udGlnX3R5cGUgcmV0ID0gQ09OVElHX05PTkU7CisKKwkvKgorCSAqIFdlJ3JlIGNhcmVmdWwgdG8gY2hlY2sgZm9yIGFuIGVtcHR5IGV4dGVudCByZWNvcmQgaGVyZSAtCisJICogdGhlIG1lcmdlIGNvZGUgd2lsbCBrbm93IHdoYXQgdG8gZG8gaWYgaXQgc2VlcyBvbmUuCisJICovCisKKwlpZiAoaW5kZXggPiAwKSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4IC0gMV07CisJCWlmIChpbmRleCA9PSAxICYmIG9jZnMyX2lzX2VtcHR5X2V4dGVudChyZWMpKSB7CisJCQlpZiAoc3BsaXRfcmVjLT5lX2Nwb3MgPT0gZWwtPmxfcmVjc1tpbmRleF0uZV9jcG9zKQorCQkJCXJldCA9IENPTlRJR19SSUdIVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IG9jZnMyX2V4dGVudF9jb250aWcoaW5vZGUsIHJlYywgc3BsaXRfcmVjKTsKKwkJfQorCX0KKworCWlmIChpbmRleCA8IChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDEpKSB7CisJCWVudW0gb2NmczJfY29udGlnX3R5cGUgY29udGlnX3R5cGU7CisKKwkJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXggKyAxXTsKKwkJY29udGlnX3R5cGUgPSBvY2ZzMl9leHRlbnRfY29udGlnKGlub2RlLCByZWMsIHNwbGl0X3JlYyk7CisKKwkJaWYgKGNvbnRpZ190eXBlID09IENPTlRJR19MRUZUICYmIHJldCA9PSBDT05USUdfUklHSFQpCisJCQlyZXQgPSBDT05USUdfTEVGVFJJR0hUOworCQllbHNlIGlmIChyZXQgPT0gQ09OVElHX05PTkUpCisJCQlyZXQgPSBjb250aWdfdHlwZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSAqaW5zZXJ0LAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKQEAgLTIyMDUsNiArMzYwMiw4IEBACiAJc3RydWN0IG9jZnMyX3BhdGggKnBhdGggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCisJaW5zZXJ0LT5pbnNfc3BsaXQgPSBTUExJVF9OT05FOworCiAJZWwgPSAmZGktPmlkMi5pX2xpc3Q7CiAJaW5zZXJ0LT5pbnNfdHJlZV9kZXB0aCA9IGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpOwogCkBAIC0yMzI3LDkgKzM3MjYsMTAgQEAKIAkJCXUzMiBjcG9zLAogCQkJdTY0IHN0YXJ0X2JsaywKIAkJCXUzMiBuZXdfY2x1c3RlcnMsCisJCQl1OCBmbGFncywKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQogewotCWludCBzdGF0dXMsIHNoaWZ0OworCWludCBzdGF0dXM7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgaW5zZXJ0ID0gezAsIH07CkBAIC0yMzUwLDYgKzM3NTAsNyBAQAogCXJlYy5lX2Nwb3MgPSBjcHVfdG9fbGUzMihjcG9zKTsKIAlyZWMuZV9ibGtubyA9IGNwdV90b19sZTY0KHN0YXJ0X2Jsayk7CiAJcmVjLmVfbGVhZl9jbHVzdGVycyA9IGNwdV90b19sZTE2KG5ld19jbHVzdGVycyk7CisJcmVjLmVfZmxhZ3MgPSBmbGFnczsKIAogCXN0YXR1cyA9IG9jZnMyX2ZpZ3VyZV9pbnNlcnRfdHlwZShpbm9kZSwgZmVfYmgsICZsYXN0X2ViX2JoLCAmcmVjLAogCQkJCQkgICZpbnNlcnQpOwpAQCAtMjM2NCw1NSArMzc2NSwxNiBAQAogCSAgICAgaW5zZXJ0Lmluc19hcHBlbmRpbmcsIGluc2VydC5pbnNfY29udGlnLCBpbnNlcnQuaW5zX2NvbnRpZ19pbmRleCwKIAkgICAgIGluc2VydC5pbnNfZnJlZV9yZWNvcmRzLCBpbnNlcnQuaW5zX3RyZWVfZGVwdGgpOwogCi0JLyoKLQkgKiBBdm9pZCBncm93aW5nIHRoZSB0cmVlIHVubGVzcyB3ZSdyZSBvdXQgb2YgcmVjb3JkcyBhbmQgdGhlCi0JICogaW5zZXJ0IHR5cGUgcmVxdXJlcyBvbmUuCi0JICovCi0JaWYgKGluc2VydC5pbnNfY29udGlnICE9IENPTlRJR19OT05FIHx8IGluc2VydC5pbnNfZnJlZV9yZWNvcmRzKQotCQlnb3RvIG91dF9hZGQ7Ci0KLQlzaGlmdCA9IG9jZnMyX2ZpbmRfYnJhbmNoX3RhcmdldChvc2IsIGlub2RlLCBmZV9iaCwgJmJoKTsKLQlpZiAoc2hpZnQgPCAwKSB7Ci0JCXN0YXR1cyA9IHNoaWZ0OwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQkvKiBXZSB0cmF2ZWxlZCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tIG9mIHRoZSBhbGxvY2F0aW9uIHRyZWUKLQkgKiBhbmQgZGlkbid0IGZpbmQgcm9vbSBmb3IgYW55IG1vcmUgZXh0ZW50cyAtIHdlIG5lZWQgdG8gYWRkCi0JICogYW5vdGhlciB0cmVlIGxldmVsICovCi0JaWYgKHNoaWZ0KSB7Ci0JCUJVR19PTihiaCk7Ci0JCW1sb2coMCwgIm5lZWQgdG8gc2hpZnQgdHJlZSBkZXB0aCAiCi0JCSAgICAgIihjdXJyZW50ID0gJWQpXG4iLCBpbnNlcnQuaW5zX3RyZWVfZGVwdGgpOwotCi0JCS8qIG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGggd2lsbCByZXR1cm4gdXMgYSBidWZmZXIgd2l0aAotCQkgKiB0aGUgbmV3IGV4dGVudCBibG9jayAoc28gd2UgY2FuIHBhc3MgdGhhdCB0bwotCQkgKiBvY2ZzMl9hZGRfYnJhbmNoKS4gKi8KLQkJc3RhdHVzID0gb2NmczJfc2hpZnRfdHJlZV9kZXB0aChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLAotCQkJCQkJbWV0YV9hYywgJmJoKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKKwlpZiAoaW5zZXJ0Lmluc19jb250aWcgPT0gQ09OVElHX05PTkUgJiYgaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMgPT0gMCkgeworCQlzdGF0dXMgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZmVfYmgsCisJCQkJCSAmaW5zZXJ0Lmluc190cmVlX2RlcHRoLCAmbGFzdF9lYl9iaCwKKwkJCQkJIG1ldGFfYWMpOworCQlpZiAoc3RhdHVzKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KLQkJaW5zZXJ0Lmluc190cmVlX2RlcHRoKys7Ci0JCS8qIFNwZWNpYWwgY2FzZTogd2UgaGF2ZSByb29tIG5vdyBpZiB3ZSBzaGlmdGVkIGZyb20KLQkJICogdHJlZV9kZXB0aCAwICovCi0JCWlmIChpbnNlcnQuaW5zX3RyZWVfZGVwdGggPT0gMSkKLQkJCWdvdG8gb3V0X2FkZDsKIAl9CiAKLQkvKiBjYWxsIG9jZnMyX2FkZF9icmFuY2ggdG8gYWRkIHRoZSBmaW5hbCBwYXJ0IG9mIHRoZSB0cmVlIHdpdGgKLQkgKiB0aGUgbmV3IGRhdGEuICovCi0JbWxvZygwLCAiYWRkIGJyYW5jaC4gYmggPSAlcFxuIiwgYmgpOwotCXN0YXR1cyA9IG9jZnMyX2FkZF9icmFuY2gob3NiLCBoYW5kbGUsIGlub2RlLCBmZV9iaCwgYmgsIGxhc3RfZWJfYmgsCi0JCQkJICBtZXRhX2FjKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLW91dF9hZGQ6CiAJLyogRmluYWxseSwgd2UgY2FuIGFkZCBjbHVzdGVycy4gVGhpcyBtaWdodCByb3RhdGUgdGhlIHRyZWUgZm9yIHVzLiAqLwogCXN0YXR1cyA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZmVfYmgsICZyZWMsICZpbnNlcnQpOwogCWlmIChzdGF0dXMgPCAwKQpAQCAtMjQzMSw3ICszNzkzLDcyMCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3N0YXRpYyB2b2lkIG9jZnMyX21ha2VfcmlnaHRfc3BsaXRfcmVjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJICAgICAgIHUzMiBjcG9zLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjKQoreworCXUzMiByZWNfY3BvcyA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKTsKKwl1MzIgcmVjX3JhbmdlID0gcmVjX2Nwb3MgKyBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycyk7CisKKwltZW1zZXQoc3BsaXRfcmVjLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKworCXNwbGl0X3JlYy0+ZV9jcG9zID0gY3B1X3RvX2xlMzIoY3Bvcyk7CisJc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMgPSBjcHVfdG9fbGUxNihyZWNfcmFuZ2UgLSBjcG9zKTsKKworCXNwbGl0X3JlYy0+ZV9ibGtubyA9IHJlYy0+ZV9ibGtubzsKKwlsZTY0X2FkZF9jcHUoJnNwbGl0X3JlYy0+ZV9ibGtubywKKwkJICAgICBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Moc2IsIGNwb3MgLSByZWNfY3BvcykpOworCisJc3BsaXRfcmVjLT5lX2ZsYWdzID0gcmVjLT5lX2ZsYWdzOworfQorCitzdGF0aWMgaW50IG9jZnMyX3NwbGl0X2FuZF9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipsYXN0X2ViX2JoLAorCQkJCSAgaW50IHNwbGl0X2luZGV4LAorCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKm9yaWdfc3BsaXRfcmVjLAorCQkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpCit7CisJaW50IHJldCA9IDAsIGRlcHRoOworCXVuc2lnbmVkIGludCBpbnNlcnRfcmFuZ2UsIHJlY19yYW5nZSwgZG9fbGVmdHJpZ2h0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyB0bXByZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodG1vc3RfZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHNwbGl0X3JlYyA9ICpvcmlnX3NwbGl0X3JlYzsKKwlzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgaW5zZXJ0OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCitsZWZ0cmlnaHQ6CisJLyoKKwkgKiBTdG9yZSBhIGNvcHkgb2YgdGhlIHJlY29yZCBvbiB0aGUgc3RhY2sgLSBpdCBtaWdodCBtb3ZlCisJICogYXJvdW5kIGFzIHRoZSB0cmVlIGlzIG1hbmlwdWxhdGVkIGJlbG93LgorCSAqLworCXJlYyA9IHBhdGhfbGVhZl9lbChwYXRoKS0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXJpZ2h0bW9zdF9lbCA9ICZkaS0+aWQyLmlfbGlzdDsKKworCWRlcHRoID0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX3RyZWVfZGVwdGgpOworCWlmIChkZXB0aCkgeworCQlCVUdfT04oISgqbGFzdF9lYl9iaCkpOworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopICgqbGFzdF9lYl9iaCktPmJfZGF0YTsKKwkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJfQorCisJaWYgKGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PQorCSAgICBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpKSB7CisJCWludCBvbGRfZGVwdGggPSBkZXB0aDsKKworCQlyZXQgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZGlfYmgsICZkZXB0aCwgbGFzdF9lYl9iaCwKKwkJCQkgICAgICBtZXRhX2FjKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAob2xkX2RlcHRoICE9IGRlcHRoKSB7CisJCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopKCpsYXN0X2ViX2JoKS0+Yl9kYXRhOworCQkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJCX0KKwl9CisKKwltZW1zZXQoJmluc2VydCwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSkpOworCWluc2VydC5pbnNfYXBwZW5kaW5nID0gQVBQRU5EX05PTkU7CisJaW5zZXJ0Lmluc19jb250aWcgPSBDT05USUdfTk9ORTsKKwlpbnNlcnQuaW5zX2ZyZWVfcmVjb3JkcyA9IGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkKKwkJLSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJaW5zZXJ0Lmluc190cmVlX2RlcHRoID0gZGVwdGg7CisKKwlpbnNlcnRfcmFuZ2UgPSBsZTMyX3RvX2NwdShzcGxpdF9yZWMuZV9jcG9zKSArCisJCWxlMTZfdG9fY3B1KHNwbGl0X3JlYy5lX2xlYWZfY2x1c3RlcnMpOworCXJlY19yYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy5lX2Nwb3MpICsKKwkJbGUxNl90b19jcHUocmVjLmVfbGVhZl9jbHVzdGVycyk7CisKKwlpZiAoc3BsaXRfcmVjLmVfY3BvcyA9PSByZWMuZV9jcG9zKSB7CisJCWluc2VydC5pbnNfc3BsaXQgPSBTUExJVF9MRUZUOworCX0gZWxzZSBpZiAoaW5zZXJ0X3JhbmdlID09IHJlY19yYW5nZSkgeworCQlpbnNlcnQuaW5zX3NwbGl0ID0gU1BMSVRfUklHSFQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGVmdC9yaWdodCBzcGxpdC4gV2UgZmFrZSB0aGlzIGFzIGEgcmlnaHQgc3BsaXQKKwkJICogZmlyc3QgYW5kIHRoZW4gbWFrZSBhIHNlY29uZCBwYXNzIGFzIGEgbGVmdCBzcGxpdC4KKwkJICovCisJCWluc2VydC5pbnNfc3BsaXQgPSBTUExJVF9SSUdIVDsKKworCQlvY2ZzMl9tYWtlX3JpZ2h0X3NwbGl0X3JlYyhpbm9kZS0+aV9zYiwgJnRtcHJlYywgaW5zZXJ0X3JhbmdlLAorCQkJCQkgICAmcmVjKTsKKworCQlzcGxpdF9yZWMgPSB0bXByZWM7CisKKwkJQlVHX09OKGRvX2xlZnRyaWdodCk7CisJCWRvX2xlZnRyaWdodCA9IDE7CisJfQorCisJcmV0ID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJnNwbGl0X3JlYywKKwkJCQkgICAgICZpbnNlcnQpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZG9fbGVmdHJpZ2h0ID09IDEpIHsKKwkJdTMyIGNwb3M7CisJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwkJZG9fbGVmdHJpZ2h0Kys7CisJCXNwbGl0X3JlYyA9ICpvcmlnX3NwbGl0X3JlYzsKKworCQlvY2ZzMl9yZWluaXRfcGF0aChwYXRoLCAxKTsKKworCQljcG9zID0gbGUzMl90b19jcHUoc3BsaXRfcmVjLmVfY3Bvcyk7CisJCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcGF0aCwgY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJCXNwbGl0X2luZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBjcG9zKTsKKwkJZ290byBsZWZ0cmlnaHQ7CisJfQorb3V0OgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1hcmsgcGFydCBvciBhbGwgb2YgdGhlIGV4dGVudCByZWNvcmQgYXQgc3BsaXRfaW5kZXggaW4gdGhlIGxlYWYKKyAqIHBvaW50ZWQgdG8gYnkgcGF0aCBhcyB3cml0dGVuLiBUaGlzIHJlbW92ZXMgdGhlIHVud3JpdHRlbgorICogZXh0ZW50IGZsYWcuCisgKgorICogQ2FyZSBpcyB0YWtlbiB0byBoYW5kbGUgY29udGlndW91c25lc3Mgc28gYXMgdG8gbm90IGdyb3cgdGhlIHRyZWUuCisgKgorICogbWV0YV9hYyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IC0gd2Ugb25seSB0cnVseSBuZWVkIGl0IGlmIGdyb3d0aAorICogb2YgdGhlIHRyZWUgaXMgcmVxdWlyZWQuIEFsbCBvdGhlciBjYXNlcyB3aWxsIGRlZ3JhZGUgaW50byBhIGxlc3MKKyAqIG9wdGltYWwgdHJlZSBsYXlvdXQuCisgKgorICogbGFzdF9lYl9iaCBzaG91bGQgYmUgdGhlIHJpZ2h0bW9zdCBsZWFmIGJsb2NrIGZvciBhbnkgaW5vZGUgd2l0aCBhCisgKiBidHJlZS4gU2luY2UgYSBzcGxpdCBtYXkgZ3JvdyB0aGUgdHJlZSBvciBhIG1lcmdlIG1pZ2h0IHNocmluayBpdCwgdGhlIGNhbGxlciBjYW5ub3QgdHJ1c3QgdGhlIGNvbnRlbnRzIG9mIHRoYXQgYnVmZmVyIGFmdGVyIHRoaXMgY2FsbC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgb3B0aW1pemVkIGZvciByZWFkYWJpbGl0eSAtIHNldmVyYWwgcGFzc2VzIG1pZ2h0IGJlCisgKiBtYWRlIG92ZXIgY2VydGFpbiBwb3J0aW9ucyBvZiB0aGUgdHJlZS4gQWxsIG9mIHRob3NlIGJsb2NrcyB3aWxsCisgKiBoYXZlIGJlZW4gYnJvdWdodCBpbnRvIGNhY2hlIChhbmQgcGlubmVkIHZpYSB0aGUgam91cm5hbCksIHNvIHRoZQorICogZXh0cmEgb3ZlcmhlYWQgaXMgbm90IGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBkaXNrIHJlYWRzLgorICovCitzdGF0aWMgaW50IF9fb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkgICAgICAgaW50IHNwbGl0X2luZGV4LAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoLCAqbGFzdF9lYl9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYyA9ICZlbC0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKwlzdHJ1Y3Qgb2NmczJfbWVyZ2VfY3R4dCBjdHh0OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRtb3N0X2VsOworCisJaWYgKCFyZWMtPmVfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKSB7CisJCXJldCA9IC1FSU87CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA+IGxlMzJfdG9fY3B1KHNwbGl0X3JlYy0+ZV9jcG9zKSB8fAorCSAgICAoKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKSkgPAorCSAgICAgKGxlMzJfdG9fY3B1KHNwbGl0X3JlYy0+ZV9jcG9zKSArIGxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSkpKSB7CisJCXJldCA9IC1FSU87CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZWJfYmggPSBwYXRoX2xlYWZfYmgocGF0aCk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZWJfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwljdHh0LmNfY29udGlnX3R5cGUgPSBvY2ZzMl9maWd1cmVfbWVyZ2VfY29udGlnX3R5cGUoaW5vZGUsIGVsLAorCQkJCQkJCSAgICBzcGxpdF9pbmRleCwKKwkJCQkJCQkgICAgc3BsaXRfcmVjKTsKKworCS8qCisJICogVGhlIGNvcmUgbWVyZ2UgLyBzcGxpdCBjb2RlIHdhbnRzIHRvIGtub3cgaG93IG11Y2ggcm9vbSBpcworCSAqIGxlZnQgaW4gdGhpcyBpbm9kZXMgYWxsb2NhdGlvbiB0cmVlLCBzbyB3ZSBwYXNzIHRoZQorCSAqIHJpZ2h0bW9zdCBleHRlbnQgbGlzdC4KKwkgKi8KKwlpZiAocGF0aC0+cF90cmVlX2RlcHRoKSB7CisJCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKKwkJCQkgICAgICAgbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspLAorCQkJCSAgICAgICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXhpdChyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKKwkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7CisJCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKKwl9IGVsc2UKKwkJcmlnaHRtb3N0X2VsID0gcGF0aF9yb290X2VsKHBhdGgpOworCisJY3R4dC5jX3VzZWRfdGFpbF9yZWNzID0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpOworCWlmIChjdHh0LmNfdXNlZF90YWlsX3JlY3MgPiAwICYmCisJICAgIG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmcmlnaHRtb3N0X2VsLT5sX3JlY3NbMF0pKQorCQljdHh0LmNfdXNlZF90YWlsX3JlY3MtLTsKKworCWlmIChyZWMtPmVfY3BvcyA9PSBzcGxpdF9yZWMtPmVfY3BvcyAmJgorCSAgICByZWMtPmVfbGVhZl9jbHVzdGVycyA9PSBzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykKKwkJY3R4dC5jX3NwbGl0X2NvdmVyc19yZWMgPSAxOworCWVsc2UKKwkJY3R4dC5jX3NwbGl0X2NvdmVyc19yZWMgPSAwOworCisJY3R4dC5jX2hhc19lbXB0eV9leHRlbnQgPSBvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pOworCisJbWxvZygwLCAiaW5kZXg6ICVkLCBjb250aWc6ICV1LCB1c2VkX3RhaWxfcmVjczogJXUsICIKKwkgICAgICJoYXNfZW1wdHk6ICV1LCBzcGxpdF9jb3ZlcnM6ICV1XG4iLCBzcGxpdF9pbmRleCwKKwkgICAgIGN0eHQuY19jb250aWdfdHlwZSwgY3R4dC5jX3VzZWRfdGFpbF9yZWNzLAorCSAgICAgY3R4dC5jX2hhc19lbXB0eV9leHRlbnQsIGN0eHQuY19zcGxpdF9jb3ZlcnNfcmVjKTsKKworCWlmIChjdHh0LmNfY29udGlnX3R5cGUgPT0gQ09OVElHX05PTkUpIHsKKwkJaWYgKGN0eHQuY19zcGxpdF9jb3ZlcnNfcmVjKQorCQkJZWwtPmxfcmVjc1tzcGxpdF9pbmRleF0gPSAqc3BsaXRfcmVjOworCQllbHNlCisJCQlyZXQgPSBvY2ZzMl9zcGxpdF9hbmRfaW5zZXJ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRpX2JoLAorCQkJCQkJICAgICAmbGFzdF9lYl9iaCwgc3BsaXRfaW5kZXgsCisJCQkJCQkgICAgIHNwbGl0X3JlYywgbWV0YV9hYyk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gb2NmczJfdHJ5X3RvX21lcmdlX2V4dGVudChpbm9kZSwgaGFuZGxlLCBwYXRoLAorCQkJCQkJc3BsaXRfaW5kZXgsIHNwbGl0X3JlYywKKwkJCQkJCWRlYWxsb2MsICZjdHh0KTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZWJfYmgpOworCitvdXQ6CisJYnJlbHNlKGxhc3RfZWJfYmgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNYXJrIHRoZSBhbHJlYWR5LWV4aXN0aW5nIGV4dGVudCBhdCBjcG9zIGFzIHdyaXR0ZW4gZm9yIGxlbiBjbHVzdGVycy4KKyAqCisgKiBJZiB0aGUgZXhpc3RpbmcgZXh0ZW50IGlzIGxhcmdlciB0aGFuIHRoZSByZXF1ZXN0LCBpbml0aWF0ZSBhCisgKiBzcGxpdC4gQW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgYXQgbWVyZ2luZyB3aXRoIGFkamFjZW50IGV4dGVudHMuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcGFzc2luZyBkb3duIG1ldGFfYWMgaWYgd2UnbGwgbmVlZCBpdC4KKyAqLworaW50IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsIHUzMiBjcG9zLCB1MzIgbGVuLCB1MzIgcGh5cywKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCwgaW5kZXg7CisJdTY0IHN0YXJ0X2Jsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwaHlzKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyBzcGxpdF9yZWM7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCW1sb2coMCwgIklub2RlICVsdSBjcG9zICV1LCBsZW4gJXUsIHBoeXMgJXUgKCVsbHUpXG4iLAorCSAgICAgaW5vZGUtPmlfaW5vLCBjcG9zLCBsZW4sIHBoeXMsICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRfYmxrbm8pOworCisJaWYgKCFvY2ZzMl93cml0ZXNfdW53cml0dGVuX2V4dGVudHMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwgIklub2RlICVsbHUgaGFzIHVud3JpdHRlbiBleHRlbnRzICIKKwkJCSAgICAidGhhdCBhcmUgYmVpbmcgd3JpdHRlbiB0bywgYnV0IHRoZSBmZWF0dXJlIGJpdCAiCisJCQkgICAgImlzIG5vdCBzZXQgaW4gdGhlIHN1cGVyIGJsb2NrLiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogWFhYOiBUaGlzIHNob3VsZCBiZSBmaXhlZCB1cCBzbyB0aGF0IHdlIGp1c3QgcmUtaW5zZXJ0IHRoZQorCSAqIG5leHQgZXh0ZW50IHJlY29yZHMuCisJICovCisJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CisKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChkaV9iaCk7CisJaWYgKCFsZWZ0X3BhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIGxlZnRfcGF0aCwgY3Bvcyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKwllbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOworCisJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWxsdSBoYXMgYW4gZXh0ZW50IGF0IGNwb3MgJXUgd2hpY2ggY2FuIG5vICIKKwkJCSAgICAibG9uZ2VyIGJlIGZvdW5kLlxuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgY3Bvcyk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KCZzcGxpdF9yZWMsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCXNwbGl0X3JlYy5lX2Nwb3MgPSBjcHVfdG9fbGUzMihjcG9zKTsKKwlzcGxpdF9yZWMuZV9sZWFmX2NsdXN0ZXJzID0gY3B1X3RvX2xlMTYobGVuKTsKKwlzcGxpdF9yZWMuZV9ibGtubyA9IGNwdV90b19sZTY0KHN0YXJ0X2Jsa25vKTsKKwlzcGxpdF9yZWMuZV9mbGFncyA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpLT5sX3JlY3NbaW5kZXhdLmVfZmxhZ3M7CisJc3BsaXRfcmVjLmVfZmxhZ3MgJj0gfk9DRlMyX0VYVF9VTldSSVRURU47CisKKwlyZXQgPSBfX29jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oaW5vZGUsIGRpX2JoLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJICBpbmRleCwgJnNwbGl0X3JlYywgbWV0YV9hYywgZGVhbGxvYyk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKGxlZnRfcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9zcGxpdF90cmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkgICAgaW50IGluZGV4LCB1MzIgbmV3X3JhbmdlLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQoreworCWludCByZXQsIGRlcHRoLCBjcmVkaXRzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodG1vc3RfZWwsICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyBzcGxpdF9yZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgaW5zZXJ0OworCisJLyoKKwkgKiBTZXR1cCB0aGUgcmVjb3JkIHRvIHNwbGl0IGJlZm9yZSB3ZSBncm93IHRoZSB0cmVlLgorCSAqLworCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlvY2ZzMl9tYWtlX3JpZ2h0X3NwbGl0X3JlYyhpbm9kZS0+aV9zYiwgJnNwbGl0X3JlYywgbmV3X3JhbmdlLCByZWMpOworCisJZGVwdGggPSBwYXRoLT5wX3RyZWVfZGVwdGg7CisJaWYgKGRlcHRoID4gMCkgeworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKKwkJCQkgICAgICAgbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspLAorCQkJCSAgICAgICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbGFzdF9lYl9iaC0+Yl9kYXRhOworCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKKwl9IGVsc2UKKwkJcmlnaHRtb3N0X2VsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCisJY3JlZGl0cyArPSBwYXRoLT5wX3RyZWVfZGVwdGggKyBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZGkpOworCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpID09CisJICAgIGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkpIHsKKwkJaW50IG9sZF9kZXB0aCA9IGRlcHRoOworCisJCXJldCA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJmRlcHRoLCAmbGFzdF9lYl9iaCwKKwkJCQkgICAgICBtZXRhX2FjKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAob2xkX2RlcHRoICE9IGRlcHRoKSB7CisJCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopbGFzdF9lYl9iaC0+Yl9kYXRhOworCQkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJCX0KKwl9CisKKwltZW1zZXQoJmluc2VydCwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSkpOworCWluc2VydC5pbnNfYXBwZW5kaW5nID0gQVBQRU5EX05PTkU7CisJaW5zZXJ0Lmluc19jb250aWcgPSBDT05USUdfTk9ORTsKKwlpbnNlcnQuaW5zX3NwbGl0ID0gU1BMSVRfUklHSFQ7CisJaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMgPSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpCisJCS0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpOworCWluc2VydC5pbnNfdHJlZV9kZXB0aCA9IGRlcHRoOworCisJcmV0ID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJnNwbGl0X3JlYywgJmluc2VydCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJYnJlbHNlKGxhc3RfZWJfYmgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfdHJ1bmNhdGVfcmVjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwgaW50IGluZGV4LAorCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkgICAgICB1MzIgY3BvcywgdTMyIGxlbikKK3sKKwlpbnQgcmV0OworCXUzMiBsZWZ0X2Nwb3MsIHJlY19yYW5nZSwgdHJ1bmNfcmFuZ2U7CisJaW50IHdhbnRzX3JvdGF0ZSA9IDAsIGlzX3JpZ2h0bW9zdF90cmVlX3JlYyA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pICYmIGluZGV4ID4gMCkgeworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRlYWxsb2MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWluZGV4LS07CisJfQorCisJaWYgKGluZGV4ID09IChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDEpICYmCisJICAgIHBhdGgtPnBfdHJlZV9kZXB0aCkgeworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgdGhlIHJpZ2h0bW9zdCB0cmVlIHJlY29yZC4gSWYKKwkJICogd2UgcmVtb3ZlIGFsbCBvZiB0aGlzIHJlY29yZCBvciBwYXJ0IG9mIGl0cyByaWdodAorCQkgKiBlZGdlIHRoZW4gYW4gdXBkYXRlIG9mIHRoZSByZWNvcmQgbGVuZ3RocyBhYm92ZSBpdAorCQkgKiB3aWxsIGJlIHJlcXVpcmVkLgorCQkgKi8KKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChwYXRoKS0+Yl9kYXRhOworCQlpZiAoZWItPmhfbmV4dF9sZWFmX2JsayA9PSAwKQorCQkJaXNfcmlnaHRtb3N0X3RyZWVfcmVjID0gMTsKKwl9CisKKwlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJaWYgKGluZGV4ID09IDAgJiYgcGF0aC0+cF90cmVlX2RlcHRoICYmCisJICAgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zKSB7CisJCS8qCisJCSAqIENoYW5naW5nIHRoZSBsZWZ0bW9zdCBvZmZzZXQgKHZpYSBwYXJ0aWFsIG9yIHdob2xlCisJCSAqIHJlY29yZCB0cnVuY2F0ZSkgb2YgYW4gaW50ZXJpb3IgKG9yIHJpZ2h0bW9zdCkgcGF0aAorCQkgKiBtZWFucyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgc3VidHJlZSB0aGF0IGlzIGZvcm1lZAorCQkgKiBieSB0aGlzIGxlYWYgYW5kIHRoZSBvbmUgdG8gaXQncyBsZWZ0LgorCQkgKgorCQkgKiBUaGVyZSBhcmUgdHdvIGNhc2VzIHdlIGNhbiBza2lwOgorCQkgKiAgIDEpIFBhdGggaXMgdGhlIGxlZnRtb3N0IG9uZSBpbiBvdXIgaW5vZGUgdHJlZS4KKwkJICogICAyKSBUaGUgbGVhZiBpcyByaWdodG1vc3QgYW5kIHdpbGwgYmUgZW1wdHkgYWZ0ZXIKKwkJICogICAgICB3ZSByZW1vdmUgdGhlIGV4dGVudCByZWNvcmQgLSB0aGUgcm90YXRlIGNvZGUKKwkJICogICAgICBrbm93cyBob3cgdG8gdXBkYXRlIHRoZSBuZXdseSBmb3JtZWQgZWRnZS4KKwkJICovCisKKwkJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoaW5vZGUtPmlfc2IsIHBhdGgsCisJCQkJCQkgICAgJmxlZnRfY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGxlZnRfY3BvcyAmJiBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA+IDEpIHsKKwkJCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKKwkJCQkJCSAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJCQlpZiAoIWxlZnRfcGF0aCkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIGxlZnRfcGF0aCwgbGVmdF9jcG9zKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXQgPSBvY2ZzMl9leHRlbmRfcm90YXRlX3RyYW5zYWN0aW9uKGhhbmRsZSwgMCwKKwkJCQkJICAgICAgaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzLAorCQkJCQkgICAgICBwYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCBwYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZWNfcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJdHJ1bmNfcmFuZ2UgPSBjcG9zICsgbGVuOworCisJaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zICYmIHJlY19yYW5nZSA9PSB0cnVuY19yYW5nZSkgeworCQlpbnQgbmV4dF9mcmVlOworCisJCW1lbXNldChyZWMsIDAsIHNpemVvZigqcmVjKSk7CisJCW9jZnMyX2NsZWFudXBfbWVyZ2UoZWwsIGluZGV4KTsKKwkJd2FudHNfcm90YXRlID0gMTsKKworCQluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwkJaWYgKGlzX3JpZ2h0bW9zdF90cmVlX3JlYyAmJiBuZXh0X2ZyZWUgPiAxKSB7CisJCQkvKgorCQkJICogV2Ugc2tpcCB0aGUgZWRnZSB1cGRhdGUgaWYgdGhpcyBwYXRoIHdpbGwKKwkJCSAqIGJlIGRlbGV0ZWQgYnkgdGhlIHJvdGF0ZSBjb2RlLgorCQkJICovCisJCQlyZWMgPSAmZWwtPmxfcmVjc1tuZXh0X2ZyZWUgLSAxXTsKKwkJCW9jZnMyX2FkanVzdF9yaWdodG1vc3RfcmVjb3Jkcyhpbm9kZSwgaGFuZGxlLCBwYXRoLAorCQkJCQkJICAgICAgIHJlYyk7CisJCX0KKwl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zKSB7CisJCS8qIFJlbW92ZSBsZWZ0bW9zdCBwb3J0aW9uIG9mIHRoZSByZWNvcmQuICovCisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2Nwb3MsIGxlbik7CisJCWxlNjRfYWRkX2NwdSgmcmVjLT5lX2Jsa25vLCBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Moc2IsIGxlbikpOworCQlsZTE2X2FkZF9jcHUoJnJlYy0+ZV9sZWFmX2NsdXN0ZXJzLCAtbGVuKTsKKwl9IGVsc2UgaWYgKHJlY19yYW5nZSA9PSB0cnVuY19yYW5nZSkgeworCQkvKiBSZW1vdmUgcmlnaHRtb3N0IHBvcnRpb24gb2YgdGhlIHJlY29yZCAqLworCQlsZTE2X2FkZF9jcHUoJnJlYy0+ZV9sZWFmX2NsdXN0ZXJzLCAtbGVuKTsKKwkJaWYgKGlzX3JpZ2h0bW9zdF90cmVlX3JlYykKKwkJCW9jZnMyX2FkanVzdF9yaWdodG1vc3RfcmVjb3Jkcyhpbm9kZSwgaGFuZGxlLCBwYXRoLCByZWMpOworCX0gZWxzZSB7CisJCS8qIENhbGxlciBzaG91bGQgaGF2ZSB0cmFwcGVkIHRoaXMuICovCisJCW1sb2coTUxfRVJST1IsICJJbm9kZSAlbGx1OiBJbnZhbGlkIHJlY29yZCB0cnVuY2F0ZTogKCV1LCAldSkgIgorCQkgICAgICIoJXUsICV1KVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCSAgICAgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLAorCQkgICAgIGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKSwgY3BvcywgbGVuKTsKKwkJQlVHKCk7CisJfQorCisJaWYgKGxlZnRfcGF0aCkgeworCQlpbnQgc3VidHJlZV9pbmRleDsKKworCQlzdWJ0cmVlX2luZGV4ID0gb2NmczJfZmluZF9zdWJ0cmVlX3Jvb3QoaW5vZGUsIGxlZnRfcGF0aCwgcGF0aCk7CisJCW9jZnMyX2NvbXBsZXRlX2VkZ2VfaW5zZXJ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgcGF0aCwKKwkJCQkJICAgc3VidHJlZV9pbmRleCk7CisJfQorCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGhfbGVhZl9iaChwYXRoKSk7CisKKwlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRlYWxsb2MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfcmVtb3ZlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJdTMyIGNwb3MsIHUzMiBsZW4sIGhhbmRsZV90ICpoYW5kbGUsCisJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQsIGluZGV4OworCXUzMiByZWNfcmFuZ2UsIHRydW5jX3JhbmdlOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aDsKKworCW9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoaW5vZGUsIDApOworCisJcGF0aCA9IG9jZnMyX25ld19pbm9kZV9wYXRoKGRpX2JoKTsKKwlpZiAoIXBhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIHBhdGgsIGNwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID49IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKSB7CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJICAgICJJbm9kZSAlbGx1IGhhcyBhbiBleHRlbnQgYXQgY3BvcyAldSB3aGljaCBjYW4gbm8gIgorCQkJICAgICJsb25nZXIgYmUgZm91bmQuXG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBjcG9zKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgMyBjYXNlcyBvZiBleHRlbnQgcmVtb3ZhbDoKKwkgKiAgIDEpIFJhbmdlIGNvdmVycyB0aGUgZW50aXJlIGV4dGVudCByZWMKKwkgKiAgIDIpIFJhbmdlIGJlZ2lucyBvciBlbmRzIG9uIG9uZSBlZGdlIG9mIHRoZSBleHRlbnQgcmVjCisJICogICAzKSBSYW5nZSBpcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBleHRlbnQgcmVjIChubyBzaGFyZWQgZWRnZXMpCisJICoKKwkgKiBGb3IgY2FzZSAxIHdlIHJlbW92ZSB0aGUgZXh0ZW50IHJlYyBhbmQgbGVmdCByb3RhdGUgdG8KKwkgKiBmaWxsIHRoZSBob2xlLgorCSAqCisJICogRm9yIGNhc2UgMiB3ZSBqdXN0IHNocmluayB0aGUgZXhpc3RpbmcgZXh0ZW50IHJlYywgd2l0aCBhCisJICogdHJlZSB1cGRhdGUgaWYgdGhlIHNocmlua2luZyBlZGdlIGlzIGFsc28gdGhlIGVkZ2Ugb2YgYW4KKwkgKiBleHRlbnQgYmxvY2suCisJICoKKwkgKiBGb3IgY2FzZSAzIHdlIGRvIGEgcmlnaHQgc3BsaXQgdG8gdHVybiB0aGUgZXh0ZW50IHJlYyBpbnRvCisJICogc29tZXRoaW5nIGNhc2UgMiBjYW4gaGFuZGxlLgorCSAqLworCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlyZWNfcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJdHJ1bmNfcmFuZ2UgPSBjcG9zICsgbGVuOworCisJQlVHX09OKGNwb3MgPCBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgfHwgdHJ1bmNfcmFuZ2UgPiByZWNfcmFuZ2UpOworCisJbWxvZygwLCAiSW5vZGUgJWxsdSwgcmVtb3ZlIChjcG9zICV1LCBsZW4gJXUpLiBFeGlzdGluZyBpbmRleCAlZCAiCisJICAgICAiKGNwb3MgJXUsIGxlbiAldSlcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgY3BvcywgbGVuLCBpbmRleCwKKwkgICAgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSwgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpKTsKKworCWlmIChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPT0gY3BvcyB8fCByZWNfcmFuZ2UgPT0gdHJ1bmNfcmFuZ2UpIHsKKwkJcmV0ID0gb2NmczJfdHJ1bmNhdGVfcmVjKGlub2RlLCBoYW5kbGUsIHBhdGgsIGluZGV4LCBkZWFsbG9jLAorCQkJCQkgY3BvcywgbGVuKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBvY2ZzMl9zcGxpdF90cmVlKGlub2RlLCBkaV9iaCwgaGFuZGxlLCBwYXRoLCBpbmRleCwKKwkJCQkgICAgICAgdHJ1bmNfcmFuZ2UsIG1ldGFfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBzcGxpdCBjb3VsZCBoYXZlIG1hbmlwdWxhdGVkIHRoZSB0cmVlIGVub3VnaCB0bworCQkgKiBtb3ZlIHRoZSByZWNvcmQgbG9jYXRpb24sIHNvIHdlIGhhdmUgdG8gbG9vayBmb3IgaXQgYWdhaW4uCisJCSAqLworCQlvY2ZzMl9yZWluaXRfcGF0aChwYXRoLCAxKTsKKworCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIHBhdGgsIGNwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCQlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSkgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbm9kZSAlbGx1OiBzcGxpdCBhdCBjcG9zICV1IGxvc3QgcmVjb3JkLiIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJCSAgICBjcG9zKTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogRG91YmxlIGNoZWNrIG91ciB2YWx1ZXMgaGVyZS4gSWYgYW55dGhpbmcgaXMgZmlzaHksCisJCSAqIGl0J3MgZWFzaWVyIHRvIGNhdGNoIGl0IGF0IHRoZSB0b3AgbGV2ZWwuCisJCSAqLworCQlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJCXJlY19yYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArCisJCQlvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJCWlmIChyZWNfcmFuZ2UgIT0gdHJ1bmNfcmFuZ2UpIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWxsdTogZXJyb3IgYWZ0ZXIgc3BsaXQgYXQgY3BvcyAldSIKKwkJCQkgICAgInRydW5jIGxlbiAldSwgZXhpc3RpbmcgcmVjb3JkIGlzICgldSwldSkiLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCQkgICAgY3BvcywgbGVuLCBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksCisJCQkJICAgIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSk7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX3RydW5jYXRlX3JlYyhpbm9kZSwgaGFuZGxlLCBwYXRoLCBpbmRleCwgZGVhbGxvYywKKwkJCQkJIGNwb3MsIGxlbik7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bF9iaCA9IG9zYi0+b3NiX3RsX2JoOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwpAQCAtMjQ2NCwxMCArNDUzOSwxMCBAQAogCXJldHVybiBjdXJyZW50X3RhaWwgPT0gbmV3X3N0YXJ0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSAgICAgdTY0IHN0YXJ0X2JsaywKLQkJCQkgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpCitpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgICB1NjQgc3RhcnRfYmxrLAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9jbHVzdGVycykKIHsKIAlpbnQgc3RhdHVzLCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgc3RhcnRfY2x1c3RlciwgdGxfY291bnQ7CkBAIC0yNjIzLDcgKzQ2OTgsNyBAQAogfQogCiAvKiBFeHBlY3RzIHlvdSB0byBhbHJlYWR5IGJlIGhvbGRpbmcgdGxfaW5vZGUtPmlfbXV0ZXggKi8KLXN0YXRpYyBpbnQgX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCitpbnQgX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbnVtX3RvX2ZsdXNoOwpAQCAtMjk1Nyw2ICs1MDMyLDIxOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBEZWxheWVkIGRlLWFsbG9jYXRpb24gb2Ygc3ViYWxsb2NhdG9yIGJsb2Nrcy4KKyAqCisgKiBTb21lIHNldHMgb2YgYmxvY2sgZGUtYWxsb2NhdGlvbnMgbWlnaHQgaW52b2x2ZSBtdWx0aXBsZSBzdWJhbGxvY2F0b3IgaW5vZGVzLgorICoKKyAqIFRoZSBsb2NraW5nIGZvciB0aGlzIGNhbiBnZXQgZXh0cmVtZWx5IGNvbXBsaWNhdGVkLCBlc3BlY2lhbGx5IHdoZW4KKyAqIHRoZSBzdWJhbGxvY2F0b3IgaW5vZGVzIHRvIGRlbGV0ZSBmcm9tIGFyZW4ndCBrbm93biB1bnRpbCBkZWVwCisgKiB3aXRoaW4gYW4gdW5yZWxhdGVkIGNvZGVwYXRoLgorICoKKyAqIG9jZnMyX2V4dGVudF9ibG9jayBzdHJ1Y3R1cmVzIGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzIC0gYW4gaW5vZGUKKyAqIGJ0cmVlIGNvdWxkIGhhdmUgYmVlbiBncm93biBieSBhbnkgbnVtYmVyIG9mIG5vZGVzIGVhY2ggYWxsb2NhdGluZworICogb3V0IG9mIHRoZWlyIG93biBzdWJhbGxvYyBpbm9kZS4KKyAqCisgKiBUaGVzZSBzdHJ1Y3R1cmVzIGFsbG93IHRoZSBkZWxheSBvZiBibG9jayBkZS1hbGxvY2F0aW9uIHVudGlsIGEKKyAqIGxhdGVyIHRpbWUsIHdoZW4gbG9ja2luZyBvZiBtdWx0aXBsZSBjbHVzdGVyIGlub2RlcyB3b24ndCBjYXVzZQorICogZGVhZGxvY2suCisgKi8KKworLyoKKyAqIERlc2NyaWJlcyBhIHNpbmdsZSBibG9jayBmcmVlIGZyb20gYSBzdWJhbGxvY2F0b3IKKyAqLworc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlIHsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUJCSpmcmVlX25leHQ7CisJdTY0CQkJCQlmcmVlX2JsazsKKwl1bnNpZ25lZCBpbnQJCQkJZnJlZV9iaXQ7Cit9OworCitzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0IHsKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0CQkqZl9uZXh0X3N1YmFsbG9jYXRvcjsKKwlpbnQJCQkJCWZfaW5vZGVfdHlwZTsKKwlpbnQJCQkJCWZfc2xvdDsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUJCSpmX2ZpcnN0OworfTsKKworc3RhdGljIGludCBvY2ZzMl9mcmVlX2NhY2hlZF9pdGVtcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkgICBpbnQgc3lzZmlsZV90eXBlLAorCQkJCSAgIGludCBzbG90LAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAqaGVhZCkKK3sKKwlpbnQgcmV0OworCXU2NCBiZ19ibGtubzsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICp0bXA7CisKKwlpbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIHN5c2ZpbGVfdHlwZSwgc2xvdCk7CisJaWYgKCFpbm9kZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfbXV0ZXg7CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl3aGlsZSAoaGVhZCkgeworCQliZ19ibGtubyA9IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKGhlYWQtPmZyZWVfYmxrLAorCQkJCQkJICAgICAgaGVhZC0+ZnJlZV9iaXQpOworCQltbG9nKDAsICJGcmVlIGJpdDogKGJpdCAldSwgYmxrbm8gJWxsdSlcbiIsCisJCSAgICAgaGVhZC0+ZnJlZV9iaXQsICh1bnNpZ25lZCBsb25nIGxvbmcpaGVhZC0+ZnJlZV9ibGspOworCisJCXJldCA9IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkJICAgICAgIGhlYWQtPmZyZWVfYml0LCBiZ19ibGtubywgMSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2pvdXJuYWw7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfam91cm5hbDsKKwkJfQorCisJCXRtcCA9IGhlYWQ7CisJCWhlYWQgPSBoZWFkLT5mcmVlX25leHQ7CisJCWtmcmVlKHRtcCk7CisJfQorCitvdXRfam91cm5hbDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXRfdW5sb2NrOgorCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKwlicmVsc2UoZGlfYmgpOworb3V0X211dGV4OgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCWlwdXQoaW5vZGUpOworb3V0OgorCXdoaWxlKGhlYWQpIHsKKwkJLyogUHJlbWF0dXJlIGV4aXQgbWF5IGhhdmUgbGVmdCBzb21lIGRhbmdsaW5nIGl0ZW1zLiAqLworCQl0bXAgPSBoZWFkOworCQloZWFkID0gaGVhZC0+ZnJlZV9uZXh0OworCQlrZnJlZSh0bXApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl9ydW5fZGVhbGxvY3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCkKK3sKKwlpbnQgcmV0ID0gMCwgcmV0MjsKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0ICpmbDsKKworCWlmICghY3R4dCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3IpIHsKKwkJZmwgPSBjdHh0LT5jX2ZpcnN0X3N1YmFsbG9jYXRvcjsKKworCQlpZiAoZmwtPmZfZmlyc3QpIHsKKwkJCW1sb2coMCwgIkZyZWUgaXRlbXM6ICh0eXBlICV1LCBzbG90ICVkKVxuIiwKKwkJCSAgICAgZmwtPmZfaW5vZGVfdHlwZSwgZmwtPmZfc2xvdCk7CisJCQlyZXQyID0gb2NmczJfZnJlZV9jYWNoZWRfaXRlbXMob3NiLCBmbC0+Zl9pbm9kZV90eXBlLAorCQkJCQkJICAgICAgIGZsLT5mX3Nsb3QsIGZsLT5mX2ZpcnN0KTsKKwkJCWlmIChyZXQyKQorCQkJCW1sb2dfZXJybm8ocmV0Mik7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSByZXQyOworCQl9CisKKwkJY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3IgPSBmbC0+Zl9uZXh0X3N1YmFsbG9jYXRvcjsKKwkJa2ZyZWUoZmwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0ICoKK29jZnMyX2ZpbmRfcGVyX3Nsb3RfZnJlZV9saXN0KGludCB0eXBlLAorCQkJICAgICAgaW50IHNsb3QsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCkKK3sKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0ICpmbCA9IGN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworCisJd2hpbGUgKGZsKSB7CisJCWlmIChmbC0+Zl9pbm9kZV90eXBlID09IHR5cGUgJiYgZmwtPmZfc2xvdCA9PSBzbG90KQorCQkJcmV0dXJuIGZsOworCisJCWZsID0gZmwtPmZfbmV4dF9zdWJhbGxvY2F0b3I7CisJfQorCisJZmwgPSBrbWFsbG9jKHNpemVvZigqZmwpLCBHRlBfTk9GUyk7CisJaWYgKGZsKSB7CisJCWZsLT5mX2lub2RlX3R5cGUgPSB0eXBlOworCQlmbC0+Zl9zbG90ID0gc2xvdDsKKwkJZmwtPmZfZmlyc3QgPSBOVUxMOworCQlmbC0+Zl9uZXh0X3N1YmFsbG9jYXRvciA9IGN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworCisJCWN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yID0gZmw7CisJfQorCXJldHVybiBmbDsKK30KKworc3RhdGljIGludCBvY2ZzMl9jYWNoZV9ibG9ja19kZWFsbG9jKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0LAorCQkJCSAgICAgaW50IHR5cGUsIGludCBzbG90LCB1NjQgYmxrbm8sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgYml0KQoreworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdCAqZmw7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICppdGVtOworCisJZmwgPSBvY2ZzMl9maW5kX3Blcl9zbG90X2ZyZWVfbGlzdCh0eXBlLCBzbG90LCBjdHh0KTsKKwlpZiAoZmwgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWl0ZW0gPSBrbWFsbG9jKHNpemVvZigqaXRlbSksIEdGUF9OT0ZTKTsKKwlpZiAoaXRlbSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJbWxvZygwLCAiSW5zZXJ0OiAodHlwZSAlZCwgc2xvdCAldSwgYml0ICV1LCBibGsgJWxsdSlcbiIsCisJICAgICB0eXBlLCBzbG90LCBiaXQsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOworCisJaXRlbS0+ZnJlZV9ibGsgPSBibGtubzsKKwlpdGVtLT5mcmVlX2JpdCA9IGJpdDsKKwlpdGVtLT5mcmVlX25leHQgPSBmbC0+Zl9maXJzdDsKKworCWZsLT5mX2ZpcnN0ID0gaXRlbTsKKworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9jYWNoZV9leHRlbnRfYmxvY2tfZnJlZShzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCwKKwkJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKQoreworCXJldHVybiBvY2ZzMl9jYWNoZV9ibG9ja19kZWFsbG9jKGN0eHQsIEVYVEVOVF9BTExPQ19TWVNURU1fSU5PREUsCisJCQkJCSBsZTE2X3RvX2NwdShlYi0+aF9zdWJhbGxvY19zbG90KSwKKwkJCQkJIGxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwKKwkJCQkJIGxlMTZfdG9fY3B1KGViLT5oX3N1YmFsbG9jX2JpdCkpOworfQorCiAvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlndXJlIG91dCB3aGV0aGVyIHRoZSBjdXJyZW50bHkgbGFzdCBleHRlbnQKICAqIGJsb2NrIHdpbGwgYmUgZGVsZXRlZCwgYW5kIGlmIGl0IHdpbGwsIHdoYXQgdGhlIG5ldyBsYXN0IGV4dGVudAogICogYmxvY2sgd2lsbCBiZSBzbyB3ZSBjYW4gdXBkYXRlIGhpcyBoX25leHRfbGVhZl9ibGsgZmllbGQsIGFzIHdlbGwKQEAgLTMyMzgsMjcgKzU1MjYsMTAgQEAKIAkJCUJVR19PTihsZTMyX3RvX2NwdShlbC0+bF9yZWNzWzBdLmVfY3BvcykpOwogCQkJQlVHX09OKGxlNjRfdG9fY3B1KGVsLT5sX3JlY3NbMF0uZV9ibGtubykpOwogCi0JCQlpZiAobGUxNl90b19jcHUoZWItPmhfc3ViYWxsb2Nfc2xvdCkgPT0gMCkgewotCQkJCS8qCi0JCQkJICogVGhpcyBjb2RlIG9ubHkgdW5kZXJzdGFuZHMgaG93IHRvCi0JCQkJICogbG9jayB0aGUgc3ViYWxsb2NhdG9yIGluIHNsb3QgMCwKLQkJCQkgKiB3aGljaCBpcyBmaW5lIGJlY2F1c2UgYWxsb2NhdGlvbiBpcwotCQkJCSAqIG9ubHkgZXZlciBkb25lIG91dCBvZiB0aGF0Ci0JCQkJICogc3ViYWxsb2NhdG9yIHRvby4gQSBmdXR1cmUgdmVyc2lvbgotCQkJCSAqIG1pZ2h0IGNoYW5nZSB0aGF0IGhvd2V2ZXIsIHNvIGF2b2lkCi0JCQkJICogYSBmcmVlIGlmIHdlIGRvbid0IGtub3cgaG93IHRvCi0JCQkJICogaGFuZGxlIGl0LiBUaGlzIHdheSBhbiBmcyBpbmNvbXBhdAotCQkJCSAqIGJpdCB3aWxsIG5vdCBiZSBuZWNlc3NhcnkuCi0JCQkJICovCi0JCQkJcmV0ID0gb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlLAotCQkJCQkJCSAgICAgIHRjLT50Y19leHRfYWxsb2NfaW5vZGUsCi0JCQkJCQkJICAgICAgdGMtPnRjX2V4dF9hbGxvY19iaCwKLQkJCQkJCQkgICAgICBlYik7Ci0KLQkJCQkvKiBBbiBlcnJvciBoZXJlIGlzIG5vdCBmYXRhbC4gKi8KLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJfQorCQkJcmV0ID0gb2NmczJfY2FjaGVfZXh0ZW50X2Jsb2NrX2ZyZWUoJnRjLT50Y19kZWFsbG9jLCBlYik7CisJCQkvKiBBbiBlcnJvciBoZXJlIGlzIG5vdCBmYXRhbC4gKi8KKwkJCWlmIChyZXQgPCAwKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJfSBlbHNlIHsKIAkJCWRlbGV0ZWRfZWIgPSAwOwogCQl9CkBAIC0zMzk3LDkgKzU2NjgsOSBAQAogCXJldHVybiBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlLCBiaCk7CiB9CiAKLXN0YXRpYyB2b2lkIG9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgaXNpemUsCi0JCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtcGFnZXMsCi0JCQkJICAgICB1NjQgcGh5cywgaGFuZGxlX3QgKmhhbmRsZSkKK3N0YXRpYyB2b2lkIG9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsCisJCQkJICAgICBsb2ZmX3QgZW5kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCSAgICAgaW50IG51bXBhZ2VzLCB1NjQgcGh5cywgaGFuZGxlX3QgKmhhbmRsZSkKIHsKIAlpbnQgaSwgcmV0LCBwYXJ0aWFsID0gMDsKIAl2b2lkICprYWRkcjsKQEAgLTM0MTIsMjYgKzU2ODMsMTQgQEAKIAlpZiAobnVtcGFnZXMgPT0gMCkKIAkJZ290byBvdXQ7CiAKLQlmcm9tID0gaXNpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7IC8qIDFzdCBwYWdlIG9mZnNldCAqLwotCWlmIChQQUdFX0NBQ0hFX1NISUZUID4gT0NGUzJfU0Ioc2IpLT5zX2NsdXN0ZXJzaXplX2JpdHMpIHsKLQkJLyoKLQkJICogU2luY2UgJ2Zyb20nIGhhcyBiZWVuIGNhcHBlZCB0byBhIHZhbHVlIGJlbG93IHBhZ2UKLQkJICogc2l6ZSwgdGhpcyBjYWxjdWxhdGlvbiB3b24ndCBiZSBhYmxlIHRvIG92ZXJmbG93Ci0JCSAqICd0bycKLQkJICovCi0JCXRvID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoc2IsIGZyb20pOwotCi0JCS8qCi0JCSAqIFRoZSB0cnVuY2F0ZSB0YWlsIGluIHRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgY29udGFpbgotCQkgKiBtb3JlIHRoYW4gb25lIHBhZ2UgYXQgbWF4aW11bS4gVGhlIGxvb3AgYmVsb3cgYWxzbwotCQkgKiBhc3N1bWVzIHRoaXMuCi0JCSAqLwotCQlCVUdfT04obnVtcGFnZXMgIT0gMSk7Ci0JfQotCisJdG8gPSBQQUdFX0NBQ0hFX1NJWkU7CiAJZm9yKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgewogCQlwYWdlID0gcGFnZXNbaV07CiAKKwkJZnJvbSA9IHN0YXJ0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlpZiAoKGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUKSA9PSBwYWdlLT5pbmRleCkKKwkJCXRvID0gZW5kICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCiAJCUJVR19PTihmcm9tID4gUEFHRV9DQUNIRV9TSVpFKTsKIAkJQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKIApAQCAtMzQ2OCwxMCArNTcyNyw3IEBACiAKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKLQkJLyoKLQkJICogRXZlcnkgcGFnZSBhZnRlciB0aGUgMXN0IG9uZSBzaG91bGQgYmUgY29tcGxldGVseSB6ZXJvJ2QuCi0JCSAqLwotCQlmcm9tID0gMDsKKwkJc3RhcnQgPSAocGFnZS0+aW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCX0KIG91dDoKIAlpZiAocGFnZXMpIHsKQEAgLTM0ODQsMjQgKzU3NDAsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfZ3JhYl9lb2ZfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGlzaXplLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAotCQkJCWludCAqbnVtLCB1NjQgKnBoeXMpCitzdGF0aWMgaW50IG9jZnMyX2dyYWJfZW9mX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgKm51bSwgdTY0ICpwaHlzKQogewogCWludCBpLCBudW1wYWdlcyA9IDAsIHJldCA9IDA7Ci0JdW5zaWduZWQgaW50IGNzaXplID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT5zX2NsdXN0ZXJzaXplOwogCXVuc2lnbmVkIGludCBleHRfZmxhZ3M7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAl1bnNpZ25lZCBsb25nIGluZGV4OwotCXU2NCBuZXh0X2NsdXN0ZXJfYnl0ZXM7CisJbG9mZl90IGxhc3RfcGFnZV9ieXRlczsKIAogCUJVR19PTighb2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKHNiKSkpOworCUJVR19PTihzdGFydCA+IGVuZCk7CiAKLQkvKiBDbHVzdGVyIGJvdW5kYXJ5LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGdyYWIgYW55IHBhZ2VzLiAqLwotCWlmICgoaXNpemUgJiAoY3NpemUgLSAxKSkgPT0gMCkKKwlpZiAoc3RhcnQgPT0gZW5kKQogCQlnb3RvIG91dDsKIAotCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgaXNpemUgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMsCisJQlVHX09OKHN0YXJ0ID4+IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzICE9CisJICAgICAgIChlbmQgLSAxKSA+PiBPQ0ZTMl9TQihzYiktPnNfY2x1c3RlcnNpemVfYml0cyk7CisKKwlyZXQgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIHN0YXJ0ID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAogCQkJCQkgIHBoeXMsIE5VTEwsICZleHRfZmxhZ3MpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMzUxNyw4ICs1Nzc1LDggQEAKIAlpZiAoZXh0X2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikKIAkJZ290byBvdXQ7CiAKLQluZXh0X2NsdXN0ZXJfYnl0ZXMgPSBvY2ZzMl9hbGlnbl9ieXRlc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwgaXNpemUpOwotCWluZGV4ID0gaXNpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlsYXN0X3BhZ2VfYnl0ZXMgPSBQQUdFX0FMSUdOKGVuZCk7CisJaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWRvIHsKIAkJcGFnZXNbbnVtcGFnZXNdID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKIAkJaWYgKCFwYWdlc1tudW1wYWdlc10pIHsKQEAgLTM1MjksNyArNTc4Nyw3IEBACiAKIAkJbnVtcGFnZXMrKzsKIAkJaW5kZXgrKzsKLQl9IHdoaWxlIChpbmRleCA8IChuZXh0X2NsdXN0ZXJfYnl0ZXMgPj4gUEFHRV9DQUNIRV9TSElGVCkpOworCX0gd2hpbGUgKGluZGV4IDwgKGxhc3RfcGFnZV9ieXRlcyA+PiBQQUdFX0NBQ0hFX1NISUZUKSk7CiAKIG91dDoKIAlpZiAocmV0ICE9IDApIHsKQEAgLTM1NTgsMTEgKzU4MTYsMTAgQEAKICAqIG90aGVyd2lzZSBibG9ja193cml0ZV9mdWxsX3BhZ2UoKSB3aWxsIHNraXAgd3JpdGVvdXQgb2YgcGFnZXMgcGFzdAogICogaV9zaXplLiBUaGUgbmV3X2lfc2l6ZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGZvciB0aGlzIHJlYXNvbi4KICAqLwotaW50IG9jZnMyX3plcm9fdGFpbF9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgdTY0IG5ld19pX3NpemUpCitpbnQgb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHU2NCByYW5nZV9zdGFydCwgdTY0IHJhbmdlX2VuZCkKIHsKIAlpbnQgcmV0LCBudW1wYWdlczsKLQlsb2ZmX3QgZW5kYnl0ZTsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKIAl1NjQgcGh5czsKIApAQCAtMzU4MSw3ICs1ODM4LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfZ3JhYl9lb2ZfcGFnZXMoaW5vZGUsIG5ld19pX3NpemUsIHBhZ2VzLCAmbnVtcGFnZXMsICZwaHlzKTsKKwlyZXQgPSBvY2ZzMl9ncmFiX2VvZl9wYWdlcyhpbm9kZSwgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZCwgcGFnZXMsCisJCQkJICAgJm51bXBhZ2VzLCAmcGh5cyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzU5MCwxNyArNTg0OCwxNiBAQAogCWlmIChudW1wYWdlcyA9PSAwKQogCQlnb3RvIG91dDsKIAotCW9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhpbm9kZSwgbmV3X2lfc2l6ZSwgcGFnZXMsIG51bXBhZ2VzLCBwaHlzLAotCQkJCSBoYW5kbGUpOworCW9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhpbm9kZSwgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZCwgcGFnZXMsCisJCQkJIG51bXBhZ2VzLCBwaHlzLCBoYW5kbGUpOwogCiAJLyoKIAkgKiBJbml0aWF0ZSB3cml0ZW91dCBvZiB0aGUgcGFnZXMgd2UgemVybydkIGhlcmUuIFdlIGRvbid0CiAJICogd2FpdCBvbiB0aGVtIC0gdGhlIHRydW5jYXRlX2lub2RlX3BhZ2VzKCkgY2FsbCBsYXRlciB3aWxsCiAJICogZG8gdGhhdCBmb3IgdXMuCiAJICovCi0JZW5kYnl0ZSA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLCBuZXdfaV9zaXplKTsKLQlyZXQgPSBkb19zeW5jX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSwKLQkJCQkgICAgZW5kYnl0ZSAtIDEsIFNZTkNfRklMRV9SQU5HRV9XUklURSk7CisJcmV0ID0gZG9fc3luY19tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHJhbmdlX3N0YXJ0LAorCQkJCSAgICByYW5nZV9lbmQgLSAxLCBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUpOwogCWlmIChyZXQpCiAJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtMzYzMSw4ICs1ODg4LDYgQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0KIAluZXdfaGlnaGVzdF9jcG9zID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKG9zYi0+c2IsCiAJCQkJCQkgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKQEAgLTM3NTQsNyArNjAwOSw2IEBACiAJZ290byBzdGFydDsKIAogYmFpbDoKLQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CiAKIAlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKIApAQCAtMzc2NCw2ICs2MDE4LDggQEAKIAlpZiAoaGFuZGxlKQogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJnRjLT50Y19kZWFsbG9jKTsKKwogCW9jZnMyX2ZyZWVfcGF0aChwYXRoKTsKIAogCS8qIFRoaXMgd2lsbCBkcm9wIHRoZSBleHRfYWxsb2MgY2x1c3RlciBsb2NrIGZvciB1cyAqLwpAQCAtMzc3NCwyMyArNjAzMCwxOCBAQAogfQogCiAvKgotICogRXhwZWN0cyB0aGUgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuIFRoaXMgd2lsbCBmaWd1cmUgb3V0IHdoaWNoCi0gKiBpbm9kZXMgbmVlZCB0byBiZSBsb2NrZWQgYW5kIHdpbGwgcHV0IHRoZW0gb24gdGhlIHJldHVybmVkIHRydW5jYXRlCi0gKiBjb250ZXh0LgorICogRXhwZWN0cyB0aGUgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuCiAgKi8KIGludCBvY2ZzMl9wcmVwYXJlX3RydW5jYXRlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqKnRjKQogewotCWludCBzdGF0dXMsIG1ldGFkYXRhX2RlbGV0ZSwgaTsKKwlpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBuZXdfaV9jbHVzdGVyczsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICpleHRfYWxsb2NfaW5vZGUgPSBOVUxMOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZXh0X2FsbG9jX2JoID0gTlVMTDsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCkBAIC0zODEwLDEyICs2MDYxLDkgQEAKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQorCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCYoKnRjKS0+dGNfZGVhbGxvYyk7CiAKLQltZXRhZGF0YV9kZWxldGUgPSAwOwogCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpIHsKLQkJLyogSWYgd2UgaGF2ZSBhIHRyZWUsIHRoZW4gdGhlIHRydW5jYXRlIG1heSByZXN1bHQgaW4KLQkJICogbWV0YWRhdGEgZGVsZXRlcy4gRmlndXJlIHRoaXMgb3V0IGZyb20gdGhlCi0JCSAqIHJpZ2h0bW9zdCBsZWFmIGJsb2NrLiovCiAJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2JsayksCiAJCQkJCSAgJmxhc3RfZWJfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewpAQCAtMzgzMCw0MyArNjA3OCwxMCBAQAogCQkJc3RhdHVzID0gLUVJTzsKIAkJCWdvdG8gYmFpbDsKIAkJfQotCQllbCA9ICYoZWItPmhfbGlzdCk7Ci0KLQkJaSA9IDA7Ci0JCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKQotCQkJaSA9IDE7Ci0JCS8qCi0JCSAqIFhYWDogU2hvdWxkIHdlIGNoZWNrIHRoYXQgbmV4dF9mcmVlX3JlYyBjb250YWlucwotCQkgKiB0aGUgZXh0ZW50PwotCQkgKi8KLQkJaWYgKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jcG9zKSA+PSBuZXdfaV9jbHVzdGVycykKLQkJCW1ldGFkYXRhX2RlbGV0ZSA9IDE7CiAJfQogCiAJKCp0YyktPnRjX2xhc3RfZWJfYmggPSBsYXN0X2ViX2JoOwogCi0JaWYgKG1ldGFkYXRhX2RlbGV0ZSkgewotCQltbG9nKDAsICJXaWxsIGhhdmUgdG8gZGVsZXRlIG1ldGFkYXRhIGZvciB0aGlzIHRydW5jLiAiCi0JCSAgICAgImxvY2tpbmcgYWxsb2NhdG9yLlxuIik7Ci0JCWV4dF9hbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIEVYVEVOVF9BTExPQ19TWVNURU1fSU5PREUsIDApOwotCQlpZiAoIWV4dF9hbGxvY19pbm9kZSkgewotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCi0JCW11dGV4X2xvY2soJmV4dF9hbGxvY19pbm9kZS0+aV9tdXRleCk7Ci0JCSgqdGMpLT50Y19leHRfYWxsb2NfaW5vZGUgPSBleHRfYWxsb2NfaW5vZGU7Ci0KLQkJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGV4dF9hbGxvY19pbm9kZSwgJmV4dF9hbGxvY19iaCwgMSk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQkJKCp0YyktPnRjX2V4dF9hbGxvY19iaCA9IGV4dF9hbGxvY19iaDsKLQkJKCp0YyktPnRjX2V4dF9hbGxvY19sb2NrZWQgPSAxOwotCX0KLQogCXN0YXR1cyA9IDA7CiBiYWlsOgogCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0zODgwLDE2ICs2MDk1LDEzIEBACiAKIHN0YXRpYyB2b2lkIG9jZnMyX2ZyZWVfdHJ1bmNhdGVfY29udGV4dChzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqdGMpCiB7Ci0JaWYgKHRjLT50Y19leHRfYWxsb2NfaW5vZGUpIHsKLQkJaWYgKHRjLT50Y19leHRfYWxsb2NfbG9ja2VkKQotCQkJb2NmczJfbWV0YV91bmxvY2sodGMtPnRjX2V4dF9hbGxvY19pbm9kZSwgMSk7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ0Yy0+dGNfZXh0X2FsbG9jX2lub2RlLT5pX211dGV4KTsKLQkJaXB1dCh0Yy0+dGNfZXh0X2FsbG9jX2lub2RlKTsKLQl9Ci0KLQlpZiAodGMtPnRjX2V4dF9hbGxvY19iaCkKLQkJYnJlbHNlKHRjLT50Y19leHRfYWxsb2NfYmgpOworCS8qCisJICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29tcGxldGluZyBkZWFsbG9jYXRpb24KKwkgKiBiZWZvcmUgZnJlZWluZyB0aGUgY29udGV4dC4KKwkgKi8KKwlpZiAodGMtPnRjX2RlYWxsb2MuY19maXJzdF9zdWJhbGxvY2F0b3IgIT0gTlVMTCkKKwkJbWxvZyhNTF9OT1RJQ0UsCisJCSAgICAgIlRydW5jYXRlIGNvbXBsZXRpb24gaGFzIG5vbi1lbXB0eSBkZWFsbG9jIGNvbnRleHRcbiIpOwogCiAJaWYgKHRjLT50Y19sYXN0X2ViX2JoKQogCQlicmVsc2UodGMtPnRjX2xhc3RfZWJfYmgpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuaCBiL2ZzL29jZnMyL2FsbG9jLmgKaW5kZXggZmJjYjU5My4uOTkwZGY0OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuaAorKysgYi9mcy9vY2ZzMi9hbGxvYy5oCkBAIC0zNCw3ICszNCwxNyBAQAogCQkJdTMyIGNwb3MsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdTMyIG5ld19jbHVzdGVycywKKwkJCXU4IGZsYWdzLAogCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpOworc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQ7CitpbnQgb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwgdTMyIGNwb3MsIHUzMiBsZW4sIHUzMiBwaHlzLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYyk7CitpbnQgb2NmczJfcmVtb3ZlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJdTMyIGNwb3MsIHUzMiBsZW4sIGhhbmRsZV90ICpoYW5kbGUsCisJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKTsKIGludCBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlKTsKQEAgLTYyLDE3ICs3Miw0MSBAQAogCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKip0bF9jb3B5KTsKIGludCBvY2ZzMl9jb21wbGV0ZV90cnVuY2F0ZV9sb2dfcmVjb3Zlcnkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICp0bF9jb3B5KTsKK2ludCBvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOworaW50IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICAgdTY0IHN0YXJ0X2JsaywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpOworaW50IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKKworLyoKKyAqIFByb2Nlc3MgbG9jYWwgc3RydWN0dXJlIHdoaWNoIGRlc2NyaWJlcyB0aGUgYmxvY2sgdW5saW5rcyBkb25lCisgKiBkdXJpbmcgYW4gb3BlcmF0aW9uLiBUaGlzIGlzIHBvcHVsYXRlZCB2aWEKKyAqIG9jZnMyX2NhY2hlX2Jsb2NrX2RlYWxsb2MoKS4KKyAqCisgKiBvY2ZzMl9ydW5fZGVhbGxvY3MoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBwb3RlbnRpYWxseQorICogZGUtYWxsb2NhdGluZyByb3V0aW5lcy4gTm8gam91cm5hbCBoYW5kbGVzIHNob3VsZCBiZSBvcGVuLCBhbmQgbW9zdAorICogbG9ja3Mgc2hvdWxkIGhhdmUgYmVlbiBkcm9wcGVkLgorICovCitzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCB7CisJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdAkJKmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dChzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqYykKK3sKKwljLT5jX2ZpcnN0X3N1YmFsbG9jYXRvciA9IE5VTEw7Cit9CitpbnQgb2NmczJfcnVuX2RlYWxsb2NzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQpOwogCiBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCB7Ci0Jc3RydWN0IGlub2RlICp0Y19leHRfYWxsb2NfaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICp0Y19leHRfYWxsb2NfYmg7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgdGNfZGVhbGxvYzsKIAlpbnQgdGNfZXh0X2FsbG9jX2xvY2tlZDsgLyogaXMgaXQgY2x1c3RlciBsb2NrZWQ/ICovCiAJLyogdGhlc2UgZ2V0IGRlc3Ryb3llZCBvbmNlIGl0J3MgcGFzc2VkIHRvIG9jZnMyX2NvbW1pdF90cnVuY2F0ZS4gKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRjX2xhc3RfZWJfYmg7CiB9OwogCi1pbnQgb2NmczJfemVyb190YWlsX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSB1NjQgbmV3X2lfc2l6ZSk7CitpbnQgb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHU2NCByYW5nZV9zdGFydCwgdTY0IHJhbmdlX2VuZCk7CiBpbnQgb2NmczJfcHJlcGFyZV90cnVuY2F0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLApAQCAtODQsNiArMTE4LDcgQEAKIAogaW50IG9jZnMyX2ZpbmRfbGVhZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwsCiAJCSAgICB1MzIgY3Bvcywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGVhZl9iaCk7CitpbnQgb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIHUzMiB2X2NsdXN0ZXIpOwogCiAvKgogICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvb2sgYXQgdGhlICMgb2YgY2x1c3RlcnMgaW4gYW4gZXh0ZW50IHJlY29yZC4KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCBhNDgwYjA5Li44NGJmNmU3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC02ODQsNiArNjg0LDggQEAKIAkgICAgIGJoID0gYmgtPmJfdGhpc19wYWdlLCBibG9ja19zdGFydCArPSBic2l6ZSkgewogCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJzaXplOwogCisJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCiAJCS8qCiAJCSAqIElnbm9yZSBibG9ja3Mgb3V0c2lkZSBvZiBvdXIgaS9vIHJhbmdlIC0KIAkJICogdGhleSBtYXkgYmVsb25nIHRvIHVuYWxsb2NhdGVkIGNsdXN0ZXJzLgpAQCAtNjk4LDkgKzcwMCw4IEBACiAJCSAqIEZvciBhbiBhbGxvY2F0aW5nIHdyaXRlIHdpdGggY2x1c3RlciBzaXplID49IHBhZ2UKIAkJICogc2l6ZSwgd2UgYWx3YXlzIHdyaXRlIHRoZSBlbnRpcmUgcGFnZS4KIAkJICovCi0KLQkJaWYgKGJ1ZmZlcl9uZXcoYmgpKQotCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCWlmIChuZXcpCisJCQlzZXRfYnVmZmVyX25ldyhiaCk7CiAKIAkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgewogCQkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgKnBfYmxrbm8pOwpAQCAtNzExLDcgKzcxMiw4IEBACiAJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCiAJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCX0gZWxzZSBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYgIWJ1ZmZlcl9kZWxheShiaCkgJiYKLQkJICAgICAoYmxvY2tfc3RhcnQgPCBmcm9tIHx8IGJsb2NrX2VuZCA+IHRvKSkgeworCQkJICAgIWJ1ZmZlcl9uZXcoYmgpICYmCisJCQkgICAoYmxvY2tfc3RhcnQgPCBmcm9tIHx8IGJsb2NrX2VuZCA+IHRvKSkgewogCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKIAkJCSp3YWl0X2JoKys9Ymg7CiAJCX0KQEAgLTczOCwxOCArNzQwLDEzIEBACiAJYmggPSBoZWFkOwogCWJsb2NrX3N0YXJ0ID0gMDsKIAlkbyB7Ci0JCXZvaWQgKmthZGRyOwotCiAJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYnNpemU7CiAJCWlmIChibG9ja19lbmQgPD0gZnJvbSkKIAkJCWdvdG8gbmV4dF9iaDsKIAkJaWYgKGJsb2NrX3N0YXJ0ID49IHRvKQogCQkJYnJlYWs7CiAKLQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JCW1lbXNldChrYWRkcitibG9ja19zdGFydCwgMCwgYmgtPmJfc2l6ZSk7Ci0JCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIGJsb2NrX3N0YXJ0LCBiaC0+Yl9zaXplLCBLTV9VU0VSMCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAKQEAgLTc2MSwyMTcgKzc1OCwyNDAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWYgKFBBR0VfQ0FDSEVfU0laRSA+PSBPQ0ZTMl9NQVhfQ0xVU1RFUlNJWkUpCisjZGVmaW5lIE9DRlMyX01BWF9DVFhUX1BBR0VTCTEKKyNlbHNlCisjZGVmaW5lIE9DRlMyX01BWF9DVFhUX1BBR0VTCShPQ0ZTMl9NQVhfQ0xVU1RFUlNJWkUgLyBQQUdFX0NBQ0hFX1NJWkUpCisjZW5kaWYKKworI2RlZmluZSBPQ0ZTMl9NQVhfQ0xVU1RFUlNfUEVSX1BBR0UJKFBBR0VfQ0FDSEVfU0laRSAvIE9DRlMyX01JTl9DTFVTVEVSU0laRSkKKwogLyoKLSAqIFRoaXMgd2lsbCBjb3B5IHVzZXIgZGF0YSBmcm9tIHRoZSBidWZmZXIgcGFnZSBpbiB0aGUgc3BsaWNlCi0gKiBjb250ZXh0LgotICoKLSAqIEZvciBub3csIHdlIGlnbm9yZSBTUExJQ0VfRl9NT1ZFIGFzIHRoYXQgd291bGQgcmVxdWlyZSBzb21lIGV4dHJhCi0gKiBjb21tdW5pY2F0aW9uIG91dCBhbGwgdGhlIHdheSB0byBvY2ZzMl93cml0ZSgpLgorICogRGVzY3JpYmUgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIGNsdXN0ZXIgdG8gYmUgd3JpdHRlbiB0by4KICAqLwotaW50IG9jZnMyX21hcF9hbmRfd3JpdGVfc3BsaWNlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywgdTY0ICpwX2Jsa25vLAotCQkJCSAgdW5zaWduZWQgaW50ICpyZXRfZnJvbSwgdW5zaWduZWQgaW50ICpyZXRfdG8pCitzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjIHsKKwl1MzIJCWNfY3BvczsKKwl1MzIJCWNfcGh5czsKKwkvKgorCSAqIEdpdmUgdGhpcyBhIHVuaXF1ZSBmaWVsZCBiZWNhdXNlIGNfcGh5cyBldmVudHVhbGx5IGdldHMKKwkgKiBmaWxsZWQuCisJICovCisJdW5zaWduZWQJY19uZXc7CisJdW5zaWduZWQJY191bndyaXR0ZW47Cit9OworCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9zaG91bGRfemVyb19jbHVzdGVyKHN0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MgKmQpCiB7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgdG8sIGZyb20sIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOwotCWNoYXIgKnNyYywgKmRzdDsKLQlzdHJ1Y3Qgb2NmczJfc3BsaWNlX3dyaXRlX3ByaXYgKnNwID0gd2MtPndfcHJpdmF0ZTsKLQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHNwLT5zX2J1ZjsKLQl1bnNpZ25lZCBsb25nIGJ5dGVzLCBzcmNfZnJvbTsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQotCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMob3NiLCB3Yy0+d19jcG9zLCAmY2x1c3Rlcl9zdGFydCwKLQkJCQkJJmNsdXN0ZXJfZW5kKTsKLQotCWZyb20gPSBzcC0+c19vZmZzZXQ7Ci0Jc3JjX2Zyb20gPSBzcC0+c19idWZfb2Zmc2V0OwotCWJ5dGVzID0gd2MtPndfY291bnQ7Ci0KLQlpZiAod2MtPndfbGFyZ2VfcGFnZXMpIHsKLQkJLyoKLQkJICogRm9yIGNsdXN0ZXIgc2l6ZSA8IHBhZ2Ugc2l6ZSwgd2UgaGF2ZSB0bwotCQkgKiBjYWxjdWxhdGUgcG9zIHdpdGhpbiB0aGUgY2x1c3RlciBhbmQgb2JleQotCQkgKiB0aGUgcmlnaHRtb3N0IGJvdW5kYXJ5LgotCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsICh1bnNpZ25lZCBsb25nKShvc2ItPnNfY2x1c3RlcnNpemUKLQkJCQkgICAtICh3Yy0+d19wb3MgJiAob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSkpKSk7Ci0JfQotCXRvID0gZnJvbSArIGJ5dGVzOwotCi0JQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOwotCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7Ci0JQlVHX09OKGZyb20gPCBjbHVzdGVyX3N0YXJ0KTsKLQlCVUdfT04odG8gPiBjbHVzdGVyX2VuZCk7Ci0KLQlpZiAod2MtPndfdGhpc19wYWdlX25ldykKLQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHdjLT53X3RoaXNfcGFnZSwgcF9ibGtubywgaW5vZGUsCi0JCQkJCSAgICBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZCwgMSk7Ci0JZWxzZQotCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Mod2MtPndfdGhpc19wYWdlLCBwX2Jsa25vLCBpbm9kZSwKLQkJCQkJICAgIGZyb20sIHRvLCAwKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3JjID0gYnVmLT5vcHMtPm1hcChzcC0+c19waXBlLCBidWYsIDEpOwotCWRzdCA9IGttYXBfYXRvbWljKHdjLT53X3RoaXNfcGFnZSwgS01fVVNFUjEpOwotCW1lbWNweShkc3QgKyBmcm9tLCBzcmMgKyBzcmNfZnJvbSwgYnl0ZXMpOwotCWt1bm1hcF9hdG9taWMod2MtPndfdGhpc19wYWdlLCBLTV9VU0VSMSk7Ci0JYnVmLT5vcHMtPnVubWFwKHNwLT5zX3BpcGUsIGJ1Ziwgc3JjKTsKLQotCXdjLT53X2ZpbmlzaGVkX2NvcHkgPSAxOwotCi0JKnJldF9mcm9tID0gZnJvbTsKLQkqcmV0X3RvID0gdG87Ci1vdXQ6Ci0KLQlyZXR1cm4gYnl0ZXMgPyAodW5zaWduZWQgaW50KWJ5dGVzIDogcmV0OworCXJldHVybiBkLT5jX25ldyB8fCBkLT5jX3Vud3JpdHRlbjsKIH0KIAotLyoKLSAqIFRoaXMgd2lsbCBjb3B5IHVzZXIgZGF0YSBmcm9tIHRoZSBpb3ZlYyBpbiB0aGUgYnVmZmVyZWQgd3JpdGUKLSAqIGNvbnRleHQuCi0gKi8KLWludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3VzZXJfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLCB1NjQgKnBfYmxrbm8sCi0JCQkJICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLCB1bnNpZ25lZCBpbnQgKnJldF90bykKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCB0bywgZnJvbSwgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQ7Ci0JdW5zaWduZWQgbG9uZyBieXRlcywgc3JjX2Zyb207Ci0JY2hhciAqZHN0OwotCXN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2ICpicCA9IHdjLT53X3ByaXZhdGU7Ci0JY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92ID0gYnAtPmJfY3VyX2lvdjsKLQljaGFyIF9fdXNlciAqYnVmOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgeworCS8qIExvZ2ljYWwgY2x1c3RlciBwb3NpdGlvbiAvIGxlbiBvZiB3cml0ZSAqLworCXUzMgkJCQl3X2Nwb3M7CisJdTMyCQkJCXdfY2xlbjsKIAotCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMob3NiLCB3Yy0+d19jcG9zLCAmY2x1c3Rlcl9zdGFydCwKLQkJCQkJJmNsdXN0ZXJfZW5kKTsKLQotCWJ1ZiA9IGN1cl9pb3YtPmlvdl9iYXNlICsgYnAtPmJfY3VyX29mZjsKLQlzcmNfZnJvbSA9ICh1bnNpZ25lZCBsb25nKWJ1ZiAmIH5QQUdFX0NBQ0hFX01BU0s7Ci0KLQlmcm9tID0gd2MtPndfcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXN0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MJd19kZXNjW09DRlMyX01BWF9DTFVTVEVSU19QRVJfUEFHRV07CiAKIAkvKgotCSAqIFRoaXMgaXMgYSBsb3Qgb2YgY29tcGFyaXNvbnMsIGJ1dCBpdCByZWFkcyBxdWl0ZQotCSAqIGVhc2lseSwgd2hpY2ggaXMgaW1wb3J0YW50IGhlcmUuCi0JICovCi0JLyogU3RheSB3aXRoaW4gdGhlIHNyYyBwYWdlICovCi0JYnl0ZXMgPSBQQUdFX1NJWkUgLSBzcmNfZnJvbTsKLQkvKiBTdGF5IHdpdGhpbiB0aGUgdmVjdG9yICovCi0JYnl0ZXMgPSBtaW4oYnl0ZXMsCi0JCSAgICAodW5zaWduZWQgbG9uZykoY3VyX2lvdi0+aW92X2xlbiAtIGJwLT5iX2N1cl9vZmYpKTsKLQkvKiBTdGF5IHdpdGhpbiBjb3VudCAqLwotCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZyl3Yy0+d19jb3VudCk7Ci0JLyoKLQkgKiBGb3IgY2x1c3RlcnNpemUgPiBwYWdlIHNpemUsIGp1c3Qgc3RheSB3aXRoaW4KLQkgKiB0YXJnZXQgcGFnZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY2FsY3VsYXRlIHBvcwotCSAqIHdpdGhpbiB0aGUgY2x1c3RlciBhbmQgb2JleSB0aGUgcmlnaHRtb3N0Ci0JICogYm91bmRhcnkuCi0JICovCi0JaWYgKHdjLT53X2xhcmdlX3BhZ2VzKSB7Ci0JCS8qCi0JCSAqIEZvciBjbHVzdGVyIHNpemUgPCBwYWdlIHNpemUsIHdlIGhhdmUgdG8KLQkJICogY2FsY3VsYXRlIHBvcyB3aXRoaW4gdGhlIGNsdXN0ZXIgYW5kIG9iZXkKLQkJICogdGhlIHJpZ2h0bW9zdCBib3VuZGFyeS4KLQkJICovCi0JCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZykob3NiLT5zX2NsdXN0ZXJzaXplCi0JCQkJICAgLSAod2MtPndfcG9zICYgKG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKSkpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIGNsdXN0ZXIgc2l6ZSA+IHBhZ2Ugc2l6ZSBpcyB0aGUgbW9zdCBjb21tb24KLQkJICogY2FzZSAtIHdlIGp1c3Qgc3RheSB3aXRoaW4gdGhlIHRhcmdldCBwYWdlCi0JCSAqIGJvdW5kYXJ5LgotCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsIFBBR0VfQ0FDSEVfU0laRSAtIGZyb20pOwotCX0KLQotCXRvID0gZnJvbSArIGJ5dGVzOwotCi0JQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOwotCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7Ci0JQlVHX09OKGZyb20gPCBjbHVzdGVyX3N0YXJ0KTsKLQlCVUdfT04odG8gPiBjbHVzdGVyX2VuZCk7Ci0KLQlpZiAod2MtPndfdGhpc19wYWdlX25ldykKLQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHdjLT53X3RoaXNfcGFnZSwgcF9ibGtubywgaW5vZGUsCi0JCQkJCSAgICBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZCwgMSk7Ci0JZWxzZQotCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Mod2MtPndfdGhpc19wYWdlLCBwX2Jsa25vLCBpbm9kZSwKLQkJCQkJICAgIGZyb20sIHRvLCAwKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZHN0ID0ga21hcCh3Yy0+d190aGlzX3BhZ2UpOwotCW1lbWNweShkc3QgKyBmcm9tLCBicC0+Yl9zcmNfYnVmICsgc3JjX2Zyb20sIGJ5dGVzKTsKLQlrdW5tYXAod2MtPndfdGhpc19wYWdlKTsKLQotCS8qCi0JICogWFhYOiBUaGlzIGlzIHNsb3csIGJ1dCBzaW1wbGUuIFRoZSBjYWxsZXIgb2YKLQkgKiBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKCkgaXMgcmVzcG9uc2libGUgZm9yCi0JICogcGFzc2luZyB0aHJvdWdoIHRoZSBpb3ZlY3MsIHNvIGl0J3MgZGlmZmljdWx0IHRvCi0JICogcHJlZGljdCB3aGF0IG91ciBuZXh0IHN0ZXAgaXMgaW4gaGVyZSBhZnRlciBvdXIKLQkgKiBpbml0aWFsIHdyaXRlLiBBIGZ1dHVyZSB2ZXJzaW9uIHNob3VsZCBiZSBwdXNoaW5nCi0JICogdGhhdCBpb3ZlYyBtYW5pcHVsYXRpb24gZnVydGhlciBkb3duLgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiBwYWdlX3NpemUgPiBjbHVzdGVyX3NpemUuCiAJICoKLQkgKiBCeSBzZXR0aW5nIHRoaXMsIHdlIGluZGljYXRlIHRoYXQgYSBjb3B5IGZyb20gdXNlcgotCSAqIGRhdGEgd2FzIGRvbmUsIGFuZCBzdWJzZXF1ZW50IGNhbGxzIGZvciB0aGlzCi0JICogY2x1c3RlciB3aWxsIHNraXAgY29weWluZyBtb3JlIGRhdGEuCisJICogSXQgdHJpZ2dlcnMgYSBzZXQgb2Ygc3BlY2lhbCBjYXNlcyBkdXJpbmcgd3JpdGUgd2hpY2ggbWlnaHQKKwkgKiBoYXZlIHRvIGRlYWwgd2l0aCBhbGxvY2F0aW5nIHdyaXRlcyB0byBwYXJ0aWFsIHBhZ2VzLgogCSAqLwotCXdjLT53X2ZpbmlzaGVkX2NvcHkgPSAxOworCXVuc2lnbmVkIGludAkJCXdfbGFyZ2VfcGFnZXM7CiAKLQkqcmV0X2Zyb20gPSBmcm9tOwotCSpyZXRfdG8gPSB0bzsKLW91dDoKKwkvKgorCSAqIFBhZ2VzIGludm9sdmVkIGluIHRoaXMgd3JpdGUuCisJICoKKwkgKiB3X3RhcmdldF9wYWdlIGlzIHRoZSBwYWdlIGJlaW5nIHdyaXR0ZW4gdG8gYnkgdGhlIHVzZXIuCisJICoKKwkgKiB3X3BhZ2VzIGlzIGFuIGFycmF5IG9mIHBhZ2VzIHdoaWNoIGFsd2F5cyBjb250YWlucworCSAqIHdfdGFyZ2V0X3BhZ2UsIGFuZCBpbiB0aGUgY2FzZSBvZiBhbiBhbGxvY2F0aW5nIHdyaXRlIHdpdGgKKwkgKiBwYWdlX3NpemUgPCBjbHVzdGVyIHNpemUsIGl0IHdpbGwgY29udGFpbiB6ZXJvJ2QgYW5kIG1hcHBlZAorCSAqIHBhZ2VzIGFkamFjZW50IHRvIHdfdGFyZ2V0X3BhZ2Ugd2hpY2ggbmVlZCB0byBiZSB3cml0dGVuCisJICogb3V0IGluIHNvIHRoYXQgZnV0dXJlIHJlYWRzIGZyb20gdGhhdCByZWdpb24gd2lsbCBnZXQKKwkgKiB6ZXJvJ3MuCisJICovCisJc3RydWN0IHBhZ2UJCQkqd19wYWdlc1tPQ0ZTMl9NQVhfQ1RYVF9QQUdFU107CisJdW5zaWduZWQgaW50CQkJd19udW1fcGFnZXM7CisJc3RydWN0IHBhZ2UJCQkqd190YXJnZXRfcGFnZTsKIAotCXJldHVybiBieXRlcyA/ICh1bnNpZ25lZCBpbnQpYnl0ZXMgOiByZXQ7CisJLyoKKwkgKiBvY2ZzMl93cml0ZV9lbmQoKSB1c2VzIHRoaXMgdG8ga25vdyB3aGF0IHRoZSByZWFsIHJhbmdlIHRvCisJICogd3JpdGUgaW4gdGhlIHRhcmdldCBzaG91bGQgYmUuCisJICovCisJdW5zaWduZWQgaW50CQkJd190YXJnZXRfZnJvbTsKKwl1bnNpZ25lZCBpbnQJCQl3X3RhcmdldF90bzsKKworCS8qCisJICogV2UgY291bGQgdXNlIGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSBidXQgdGhpcyBpcyBjbGVhbmVyLAorCSAqIElNSE8gLU1hcmsKKwkgKi8KKwloYW5kbGVfdAkJCSp3X2hhbmRsZTsKKworCXN0cnVjdCBidWZmZXJfaGVhZAkJKndfZGlfYmg7CisKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCB3X2RlYWxsb2M7Cit9OworCitzdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX3dyaXRlX2N0eHQoc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKKwkJaWYgKHdjLT53X3BhZ2VzW2ldID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQl1bmxvY2tfcGFnZSh3Yy0+d19wYWdlc1tpXSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZCh3Yy0+d19wYWdlc1tpXSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZSh3Yy0+d19wYWdlc1tpXSk7CisJfQorCisJYnJlbHNlKHdjLT53X2RpX2JoKTsKKwlrZnJlZSh3Yyk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfYWxsb2Nfd3JpdGVfY3R4dChzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqKndjcCwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBsb2ZmX3QgcG9zLAorCQkJCSAgdW5zaWduZWQgbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoKQoreworCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YzsKKworCXdjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQpLCBHRlBfTk9GUyk7CisJaWYgKCF3YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3Yy0+d19jcG9zID0gcG9zID4+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOworCXdjLT53X2NsZW4gPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMob3NiLT5zYiwgbGVuKTsKKwlnZXRfYmgoZGlfYmgpOworCXdjLT53X2RpX2JoID0gZGlfYmg7CisKKwlpZiAodW5saWtlbHkoUEFHRV9DQUNIRV9TSElGVCA+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKSkKKwkJd2MtPndfbGFyZ2VfcGFnZXMgPSAxOworCWVsc2UKKwkJd2MtPndfbGFyZ2VfcGFnZXMgPSAwOworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJndjLT53X2RlYWxsb2MpOworCisJKndjcCA9IHdjOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBNYXAsIGZpbGwgYW5kIHdyaXRlIGEgcGFnZSB0byBkaXNrLgotICoKLSAqIFRoZSB3b3JrIG9mIGNvcHlpbmcgZGF0YSBpcyBkb25lIHZpYSBjYWxsYmFjay4gIE5ld2x5IGFsbG9jYXRlZAotICogcGFnZXMgd2hpY2ggZG9uJ3QgdGFrZSB1c2VyIGRhdGEgd2lsbCBiZSB6ZXJvJ2QgKHNldCAnbmV3JyB0bwotICogaW5kaWNhdGUgYW4gYWxsb2NhdGluZyB3cml0ZSkKLSAqCi0gKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvCi0gKiB0aGUgcGFnZS4KKyAqIElmIGEgcGFnZSBoYXMgYW55IG5ldyBidWZmZXJzLCB6ZXJvIHRoZW0gb3V0IGhlcmUsIGFuZCBtYXJrIHRoZW0gdXB0b2RhdGUKKyAqIGFuZCBkaXJ0eSBzbyB0aGV5J2xsIGJlIHdyaXR0ZW4gb3V0IChpbiBvcmRlciB0byBwcmV2ZW50IHVuaW5pdGlhbGlzZWQKKyAqIGJsb2NrIGRhdGEgZnJvbSBsZWFraW5nKS4gQW5kIGNsZWFyIHRoZSBuZXcgYml0LgogICovCi1zdGF0aWMgaW50IG9jZnMyX3dyaXRlX2RhdGFfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSB1NjQgKnBfYmxrbm8sIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsIGludCBuZXcpCitzdGF0aWMgdm9pZCBvY2ZzMl96ZXJvX25ld19idWZmZXJzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKIHsKLQlpbnQgcmV0LCBjb3BpZWQgPSAwOwotCXVuc2lnbmVkIGludCBmcm9tID0gMCwgdG8gPSAwOwotCXVuc2lnbmVkIGludCBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZDsKLQl1bnNpZ25lZCBpbnQgemVyb19mcm9tID0gMCwgemVyb190byA9IDA7CisJdW5zaWduZWQgaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7CiAKLQlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgd2MtPndfY3BvcywKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJcmV0dXJuOworCisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJsb2NrX3N0YXJ0ID0gMDsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmgtPmJfc2l6ZTsKKworCQlpZiAoYnVmZmVyX25ldyhiaCkpIHsKKwkJCWlmIChibG9ja19lbmQgPiBmcm9tICYmIGJsb2NrX3N0YXJ0IDwgdG8pIHsKKwkJCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJCQl1bnNpZ25lZCBzdGFydCwgZW5kOworCisJCQkJCXN0YXJ0ID0gbWF4KGZyb20sIGJsb2NrX3N0YXJ0KTsKKwkJCQkJZW5kID0gbWluKHRvLCBibG9ja19lbmQpOworCisJCQkJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIHN0YXJ0LCBlbmQgLSBzdGFydCwgS01fVVNFUjApOworCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQl9CisKKwkJCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQl9CisJCX0KKworCQlibG9ja19zdGFydCA9IGJsb2NrX2VuZDsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7Cit9CisKKy8qCisgKiBPbmx5IGNhbGxlZCB3aGVuIHdlIGhhdmUgYSBmYWlsdXJlIGR1cmluZyBhbGxvY2F0aW5nIHdyaXRlIHRvIHdyaXRlCisgKiB6ZXJvJ3MgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCByZWdpb24uCisgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX3dyaXRlX2ZhaWx1cmUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJbG9mZl90IHVzZXJfcG9zLCB1bnNpZ25lZCB1c2VyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBmcm9tLCB0bzsKKwlzdHJ1Y3QgcGFnZSAqdG1wcGFnZTsKKworCW9jZnMyX3plcm9fbmV3X2J1ZmZlcnMod2MtPndfdGFyZ2V0X3BhZ2UsIHVzZXJfcG9zLCB1c2VyX2xlbik7CisKKwlpZiAod2MtPndfbGFyZ2VfcGFnZXMpIHsKKwkJZnJvbSA9IHdjLT53X3RhcmdldF9mcm9tOworCQl0byA9IHdjLT53X3RhcmdldF90bzsKKwl9IGVsc2UgeworCQlmcm9tID0gMDsKKwkJdG8gPSBQQUdFX0NBQ0hFX1NJWkU7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKKwkJdG1wcGFnZSA9IHdjLT53X3BhZ2VzW2ldOworCisJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCisJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKKwkJCQkJICBmcm9tLCB0bywgTlVMTCwKKwkJCQkJICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOworCisJCWJsb2NrX2NvbW1pdF93cml0ZSh0bXBwYWdlLCBmcm9tLCB0byk7CisJfQorfQorCitzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfcGFnZV9mb3Jfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgdTY0ICpwX2Jsa25vLAorCQkJCQlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlLCB1MzIgY3BvcywKKwkJCQkJbG9mZl90IHVzZXJfcG9zLCB1bnNpZ25lZCB1c2VyX2xlbiwKKwkJCQkJaW50IG5ldykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBtYXBfZnJvbSA9IDAsIG1hcF90byA9IDA7CisJdW5zaWduZWQgaW50IGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOworCXVuc2lnbmVkIGludCB1c2VyX2RhdGFfZnJvbSA9IDAsIHVzZXJfZGF0YV90byA9IDA7CisKKwlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgY3BvcywKIAkJCQkJJmNsdXN0ZXJfc3RhcnQsICZjbHVzdGVyX2VuZCk7CiAKLQlpZiAoKHdjLT53X3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKSA9PSBwYWdlLT5pbmRleAotCSAgICAmJiAhd2MtPndfZmluaXNoZWRfY29weSkgeworCWlmIChwYWdlID09IHdjLT53X3RhcmdldF9wYWdlKSB7CisJCW1hcF9mcm9tID0gdXNlcl9wb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCW1hcF90byA9IG1hcF9mcm9tICsgdXNlcl9sZW47CiAKLQkJd2MtPndfdGhpc19wYWdlID0gcGFnZTsKLQkJd2MtPndfdGhpc19wYWdlX25ldyA9IG5ldzsKLQkJcmV0ID0gd2MtPndfd3JpdGVfZGF0YV9wYWdlKGlub2RlLCB3YywgcF9ibGtubywgJmZyb20sICZ0byk7Ci0JCWlmIChyZXQgPCAwKSB7CisJCWlmIChuZXcpCisJCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3MocGFnZSwgcF9ibGtubywgaW5vZGUsCisJCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsCisJCQkJCQkgICAgbmV3KTsKKwkJZWxzZQorCQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHBhZ2UsIHBfYmxrbm8sIGlub2RlLAorCQkJCQkJICAgIG1hcF9mcm9tLCBtYXBfdG8sIG5ldyk7CisJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJY29waWVkID0gcmV0OwotCi0JCXplcm9fZnJvbSA9IGZyb207Ci0JCXplcm9fdG8gPSB0bzsKKwkJdXNlcl9kYXRhX2Zyb20gPSBtYXBfZnJvbTsKKwkJdXNlcl9kYXRhX3RvID0gbWFwX3RvOwogCQlpZiAobmV3KSB7Ci0JCQlmcm9tID0gY2x1c3Rlcl9zdGFydDsKLQkJCXRvID0gY2x1c3Rlcl9lbmQ7CisJCQltYXBfZnJvbSA9IGNsdXN0ZXJfc3RhcnQ7CisJCQltYXBfdG8gPSBjbHVzdGVyX2VuZDsKIAkJfQorCisJCXdjLT53X3RhcmdldF9mcm9tID0gbWFwX2Zyb207CisJCXdjLT53X3RhcmdldF90byA9IG1hcF90bzsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJZiB3ZSBoYXZlbid0IGFsbG9jYXRlZCB0aGUgbmV3IHBhZ2UgeWV0LCB3ZQpAQCAtOTgwLDExICsxMDAwLDExIEBACiAJCSAqLwogCQlCVUdfT04oIW5ldyk7CiAKLQkJZnJvbSA9IGNsdXN0ZXJfc3RhcnQ7Ci0JCXRvID0gY2x1c3Rlcl9lbmQ7CisJCW1hcF9mcm9tID0gY2x1c3Rlcl9zdGFydDsKKwkJbWFwX3RvID0gY2x1c3Rlcl9lbmQ7CiAKIAkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHBhZ2UsIHBfYmxrbm8sIGlub2RlLAotCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsIDEpOworCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsIG5ldyk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMTAwMywxMDggKzEwMjMsMTEzIEBACiAJICovCiAJaWYgKG5ldyAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKQogCQlvY2ZzMl9jbGVhcl9wYWdlX3JlZ2lvbnMocGFnZSwgT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCQkgd2MtPndfY3BvcywgemVyb19mcm9tLCB6ZXJvX3RvKTsKKwkJCQkJIGNwb3MsIHVzZXJfZGF0YV9mcm9tLCB1c2VyX2RhdGFfdG8pOwogCiAJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKLQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7Ci0JCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwKLQkJCQkJcGFnZV9idWZmZXJzKHBhZ2UpLAotCQkJCQlmcm9tLCB0bywgTlVMTCwKLQkJCQkJb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKLQkJaWYgKHJldCA8IDApCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JfQotCi0JLyoKLQkgKiBXZSBkb24ndCB1c2UgZ2VuZXJpY19jb21taXRfd3JpdGUoKSBiZWNhdXNlIHdlIG5lZWQgdG8KLQkgKiBoYW5kbGUgb3VyIG93biBpX3NpemUgdXBkYXRlLgotCSAqLwotCXJldCA9IGJsb2NrX2NvbW1pdF93cml0ZShwYWdlLCBmcm9tLCB0byk7Ci0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOwogb3V0OgotCi0JcmV0dXJuIGNvcGllZCA/IGNvcGllZCA6IHJldDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgotICogRG8gdGhlIGFjdHVhbCB3cml0ZSBvZiBzb21lIGRhdGEgaW50byBhbiBpbm9kZS4gT3B0aW9uYWxseSBhbGxvY2F0ZQotICogaW4gb3JkZXIgdG8gZnVsZmlsbCB0aGUgd3JpdGUuCi0gKgotICogY3BvcyBpcyB0aGUgbG9naWNhbCBjbHVzdGVyIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgdG8gd3JpdGUgYXQKLSAqCi0gKiAncGh5cycgaXMgdGhlIHBoeXNpY2FsIG1hcHBpbmcgb2YgdGhhdCBvZmZzZXQuIGEgJ3BoeXMnIHZhbHVlIG9mCi0gKiB6ZXJvIGluZGljYXRlcyB0aGF0IGFsbG9jYXRpb24gaXMgcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgZGF0YV9hYwotICogYW5kIG1ldGFfYWMgc2hvdWxkIGJlIHZhbGlkIChtZXRhX2FjIGNhbiBiZSBudWxsIGlmIG1ldGFkYXRhCi0gKiBhbGxvY2F0aW9uIGlzbid0IHJlcXVpcmVkKS4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGdyYWIgb25lIGNsdXN0ZXJzIHdvcnRoIG9mIHBhZ2VzLgogICovCi1zdGF0aWMgc3NpemVfdCBvY2ZzMl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIHBoeXMsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAotCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCi0JCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKLQkJCSAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YykKK3N0YXRpYyBpbnQgb2NmczJfZ3JhYl9wYWdlc19mb3Jfd3JpdGUoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCSAgICAgIHUzMiBjcG9zLCBsb2ZmX3QgdXNlcl9wb3MsIGludCBuZXcsCisJCQkJICAgICAgc3RydWN0IHBhZ2UgKm1tYXBfcGFnZSkKIHsKLQlpbnQgcmV0LCBpLCBudW1wYWdlcyA9IDEsIG5ldzsKLQl1bnNpZ25lZCBpbnQgY29waWVkID0gMDsKLQl1MzIgdG1wX3BvczsKLQl1NjQgdl9ibGtubywgcF9ibGtubzsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlpbnQgcmV0ID0gMCwgaTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCB0YXJnZXRfaW5kZXgsIGluZGV4OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHN0YXJ0OwotCXN0cnVjdCBwYWdlICoqY3BhZ2VzOwogCi0JbmV3ID0gcGh5cyA9PSAwID8gMSA6IDA7CisJdGFyZ2V0X2luZGV4ID0gdXNlcl9wb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAogCS8qCiAJICogRmlndXJlIG91dCBob3cgbWFueSBwYWdlcyB3ZSdsbCBiZSBtYW5pcHVsYXRpbmcgaGVyZS4gRm9yCiAJICogbm9uIGFsbG9jYXRpbmcgd3JpdGUsIHdlIGp1c3QgY2hhbmdlIHRoZSBvbmUKIAkgKiBwYWdlLiBPdGhlcndpc2UsIHdlJ2xsIG5lZWQgYSB3aG9sZSBjbHVzdGVycyB3b3J0aC4KIAkgKi8KLQlpZiAobmV3KQotCQludW1wYWdlcyA9IG9jZnMyX3BhZ2VzX3Blcl9jbHVzdGVyKGlub2RlLT5pX3NiKTsKLQotCWNwYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKCpjcGFnZXMpICogbnVtcGFnZXMsIEdGUF9OT0ZTKTsKLQlpZiAoIWNwYWdlcykgewotCQlyZXQgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBGaWxsIG91ciBwYWdlIGFycmF5IGZpcnN0LiBUaGF0IHdheSB3ZSd2ZSBncmFiYmVkIGVub3VnaCBzbwotCSAqIHRoYXQgd2UgY2FuIHplcm8gYW5kIGZsdXNoIGlmIHdlIGVycm9yIGFmdGVyIGFkZGluZyB0aGUKLQkgKiBleHRlbnQuCi0JICovCiAJaWYgKG5ldykgewotCQlzdGFydCA9IG9jZnMyX2FsaWduX2NsdXN0ZXJzX3RvX3BhZ2VfaW5kZXgoaW5vZGUtPmlfc2IsCi0JCQkJCQkJICAgd2MtPndfY3Bvcyk7Ci0JCXZfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHdjLT53X2Nwb3MpOworCQl3Yy0+d19udW1fcGFnZXMgPSBvY2ZzMl9wYWdlc19wZXJfY2x1c3Rlcihpbm9kZS0+aV9zYik7CisJCXN0YXJ0ID0gb2NmczJfYWxpZ25fY2x1c3RlcnNfdG9fcGFnZV9pbmRleChpbm9kZS0+aV9zYiwgY3Bvcyk7CiAJfSBlbHNlIHsKLQkJc3RhcnQgPSB3Yy0+d19wb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJdl9ibGtubyA9IHdjLT53X3BvcyA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJd2MtPndfbnVtX3BhZ2VzID0gMTsKKwkJc3RhcnQgPSB0YXJnZXRfaW5kZXg7CiAJfQogCi0JZm9yKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgeworCWZvcihpID0gMDsgaSA8IHdjLT53X251bV9wYWdlczsgaSsrKSB7CiAJCWluZGV4ID0gc3RhcnQgKyBpOwogCi0JCWNwYWdlc1tpXSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKLQkJaWYgKCFjcGFnZXNbaV0pIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKKwkJaWYgKGluZGV4ID09IHRhcmdldF9pbmRleCAmJiBtbWFwX3BhZ2UpIHsKKwkJCS8qCisJCQkgKiBvY2ZzMl9wYWdlbWt3cml0ZSgpIGlzIGEgbGl0dGxlIGRpZmZlcmVudAorCQkJICogYW5kIHdhbnRzIHVzIHRvIGRpcmVjdGx5IHVzZSB0aGUgcGFnZQorCQkJICogcGFzc2VkIGluLgorCQkJICovCisJCQlsb2NrX3BhZ2UobW1hcF9wYWdlKTsKKworCQkJaWYgKG1tYXBfcGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSB7CisJCQkJdW5sb2NrX3BhZ2UobW1hcF9wYWdlKTsKKwkJCQkvKgorCQkJCSAqIFNhbml0eSBjaGVjayAtIHRoZSBsb2NraW5nIGluCisJCQkJICogb2NmczJfcGFnZW1rd3JpdGUoKSBzaG91bGQgZW5zdXJlCisJCQkJICogdGhhdCB0aGlzIGNvZGUgZG9lc24ndCB0cmlnZ2VyLgorCQkJCSAqLworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlwYWdlX2NhY2hlX2dldChtbWFwX3BhZ2UpOworCQkJd2MtPndfcGFnZXNbaV0gPSBtbWFwX3BhZ2U7CisJCX0gZWxzZSB7CisJCQl3Yy0+d19wYWdlc1tpXSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsCisJCQkJCQkJICAgICBHRlBfTk9GUyk7CisJCQlpZiAoIXdjLT53X3BhZ2VzW2ldKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CiAJCX0KKworCQlpZiAoaW5kZXggPT0gdGFyZ2V0X2luZGV4KQorCQkJd2MtPndfdGFyZ2V0X3BhZ2UgPSB3Yy0+d19wYWdlc1tpXTsKIAl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFByZXBhcmUgYSBzaW5nbGUgY2x1c3RlciBmb3Igd3JpdGUgb25lIGNsdXN0ZXIgaW50byB0aGUgZmlsZS4KKyAqLworc3RhdGljIGludCBvY2ZzMl93cml0ZV9jbHVzdGVyKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICAgIHUzMiBwaHlzLCB1bnNpZ25lZCBpbnQgdW53cml0dGVuLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywgdTMyIGNwb3MsCisJCQkgICAgICAgbG9mZl90IHVzZXJfcG9zLCB1bnNpZ25lZCB1c2VyX2xlbikKK3sKKwlpbnQgcmV0LCBpLCBuZXcsIHNob3VsZF96ZXJvID0gMDsKKwl1NjQgdl9ibGtubywgcF9ibGtubzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKworCW5ldyA9IHBoeXMgPT0gMCA/IDEgOiAwOworCWlmIChuZXcgfHwgdW53cml0dGVuKQorCQlzaG91bGRfemVybyA9IDE7CiAKIAlpZiAobmV3KSB7CisJCXUzMiB0bXBfcG9zOworCiAJCS8qCiAJCSAqIFRoaXMgaXMgc2FmZSB0byBjYWxsIHdpdGggdGhlIHBhZ2UgbG9ja3MgLSBpdCB3b24ndCB0YWtlCiAJCSAqIGFueSBhZGRpdGlvbmFsIHNlbWFwaG9yZXMgb3IgY2x1c3RlciBsb2Nrcy4KIAkJICovCi0JCXRtcF9wb3MgPSB3Yy0+d19jcG9zOworCQl0bXBfcG9zID0gY3BvczsKIAkJcmV0ID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZSwKLQkJCQkJCSAmdG1wX3BvcywgMSwgZGlfYmgsIGhhbmRsZSwKLQkJCQkJCSBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKKwkJCQkJCSAmdG1wX3BvcywgMSwgMCwgd2MtPndfZGlfYmgsCisJCQkJCQkgd2MtPndfaGFuZGxlLCBkYXRhX2FjLAorCQkJCQkJIG1ldGFfYWMsIE5VTEwpOwogCQkvKgogCQkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSB3ZSBtdXN0IGhhdmUgYWxyZWFkeQogCQkgKiBjYWxjdWxhdGVkIHRoZSBjb3JyZWN0IG1ldGEgZGF0YSBhbGxvY2F0aW9uIHJlcXVpcmVkLiBUaGUKQEAgLTExMjEsMTAzICsxMTQ2LDM0NCBAQAogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KKwl9IGVsc2UgaWYgKHVud3JpdHRlbikgeworCQlyZXQgPSBvY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKGlub2RlLCB3Yy0+d19kaV9iaCwKKwkJCQkJCXdjLT53X2hhbmRsZSwgY3BvcywgMSwgcGh5cywKKwkJCQkJCW1ldGFfYWMsICZ3Yy0+d19kZWFsbG9jKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCisJaWYgKHNob3VsZF96ZXJvKQorCQl2X2Jsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBjcG9zKTsKKwllbHNlCisJCXZfYmxrbm8gPSB1c2VyX3BvcyA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKworCS8qCisJICogVGhlIG9ubHkgcmVhc29uIHRoaXMgc2hvdWxkIGZhaWwgaXMgZHVlIHRvIGFuIGluYWJpbGl0eSB0bworCSAqIGZpbmQgdGhlIGV4dGVudCBhZGRlZC4KKwkgKi8KIAlyZXQgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIHZfYmxrbm8sICZwX2Jsa25vLCBOVUxMLAogCQkJCQkgIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7Ci0KLQkJLyoKLQkJICogWFhYOiBTaG91bGQgd2UgZ28gcmVhZG9ubHkgaGVyZT8KLQkJICovCi0KLQkJbWxvZ19lcnJubyhyZXQpOworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwgIkNvcnJ1cHRpbmcgZXh0ZW5kIGZvciBpbm9kZSAlbGx1LCAiCisJCQkgICAgImF0IGxvZ2ljYWwgYmxvY2sgJWxsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2X2Jsa25vKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJQlVHX09OKHBfYmxrbm8gPT0gMCk7CiAKLQlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX3dyaXRlX2RhdGFfcGFnZShpbm9kZSwgaGFuZGxlLCAmcF9ibGtubywgY3BhZ2VzW2ldLAotCQkJCQkgICAgd2MsIG5ldyk7Ci0JCWlmIChyZXQgPCAwKSB7CisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKKwkJaW50IHRtcHJldDsKKworCQl0bXByZXQgPSBvY2ZzMl9wcmVwYXJlX3BhZ2VfZm9yX3dyaXRlKGlub2RlLCAmcF9ibGtubywgd2MsCisJCQkJCQkgICAgICB3Yy0+d19wYWdlc1tpXSwgY3BvcywKKwkJCQkJCSAgICAgIHVzZXJfcG9zLCB1c2VyX2xlbiwKKwkJCQkJCSAgICAgIHNob3VsZF96ZXJvKTsKKwkJaWYgKHRtcHJldCkgeworCQkJbWxvZ19lcnJubyh0bXByZXQpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCXRtcHJldCA9IHJldDsKKwkJfQorCX0KKworCS8qCisJICogV2Ugb25seSBoYXZlIGNsZWFudXAgdG8gZG8gaW4gY2FzZSBvZiBhbGxvY2F0aW5nIHdyaXRlLgorCSAqLworCWlmIChyZXQgJiYgbmV3KQorCQlvY2ZzMl93cml0ZV9mYWlsdXJlKGlub2RlLCB3YywgdXNlcl9wb3MsIHVzZXJfbGVuKTsKKworb3V0OgorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl93cml0ZV9jbHVzdGVyX2J5X2Rlc2Moc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCSAgICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4pCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHdjLT53X2NsZW47IGkrKykgeworCQlkZXNjID0gJndjLT53X2Rlc2NbaV07CisKKwkJcmV0ID0gb2NmczJfd3JpdGVfY2x1c3RlcihtYXBwaW5nLCBkZXNjLT5jX3BoeXMsCisJCQkJCSAgZGVzYy0+Y191bndyaXR0ZW4sIGRhdGFfYWMsIG1ldGFfYWMsCisJCQkJCSAgd2MsIGRlc2MtPmNfY3BvcywgcG9zLCBsZW4pOworCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQotCi0JCWNvcGllZCArPSByZXQ7CiAJfQogCisJcmV0ID0gMDsKIG91dDoKLQlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7Ci0JCXVubG9ja19wYWdlKGNwYWdlc1tpXSk7Ci0JCW1hcmtfcGFnZV9hY2Nlc3NlZChjcGFnZXNbaV0pOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UoY3BhZ2VzW2ldKTsKLQl9Ci0Ja2ZyZWUoY3BhZ2VzKTsKLQotCXJldHVybiBjb3BpZWQgPyBjb3BpZWQgOiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jZnMyX3dyaXRlX2N0eHRfaW5pdChzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgbG9mZl90IHBvcywKLQkJCQkgIHNpemVfdCBjb3VudCwgb2NmczJfcGFnZV93cml0ZXIgKmNiLAotCQkJCSAgdm9pZCAqY2JfcHJpdikKLXsKLQl3Yy0+d19jb3VudCA9IGNvdW50OwotCXdjLT53X3BvcyA9IHBvczsKLQl3Yy0+d19jcG9zID0gd2MtPndfcG9zID4+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOwotCXdjLT53X2ZpbmlzaGVkX2NvcHkgPSAwOwotCi0JaWYgKHVubGlrZWx5KFBBR0VfQ0FDSEVfU0hJRlQgPiBvc2ItPnNfY2x1c3RlcnNpemVfYml0cykpCi0JCXdjLT53X2xhcmdlX3BhZ2VzID0gMTsKLQllbHNlCi0JCXdjLT53X2xhcmdlX3BhZ2VzID0gMDsKLQotCXdjLT53X3dyaXRlX2RhdGFfcGFnZSA9IGNiOwotCXdjLT53X3ByaXZhdGUgPSBjYl9wcml2OworCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBXcml0ZSBhIGNsdXN0ZXIgdG8gYW4gaW5vZGUuIFRoZSBjbHVzdGVyIG1heSBub3QgYmUgYWxsb2NhdGVkIHlldCwKLSAqIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZS4gVGhpcyBvbmx5IGV4aXN0cyBmb3IgYnVmZmVyZWQgd3JpdGVzIC0KLSAqIE9fRElSRUNUIHRha2VzIGEgbW9yZSAidHJhZGl0aW9uYWwiIHBhdGggdGhyb3VnaCB0aGUga2VybmVsLgotICoKLSAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluY3JlbWVudGluZyBwb3MsIHdyaXR0ZW4gY291bnRzLCBldGMKLSAqCi0gKiBGb3IgZmlsZSBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzcGFyc2UgZmlsZXMsIHByZS1hbGxvY2F0aW9uCi0gKiBhbmQgcGFnZSB6ZXJvaW5nIHVwIHVudGlsIGNwb3Mgc2hvdWxkIGJlIGRvbmUgcHJpb3IgdG8gdGhpcwotICogZnVuY3Rpb24gY2FsbC4KLSAqCi0gKiBDYWxsZXJzIHNob3VsZCBiZSBob2xkaW5nIGlfc2VtLCBhbmQgdGhlIHJ3IGNsdXN0ZXIgbG9jay4KLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdXNlciBieXRlcyB3cml0dGVuLCBvciBsZXNzIHRoYW4gemVybyBmb3IKLSAqIGVycm9yLgorICogb2NmczJfd3JpdGVfZW5kKCkgd2FudHMgdG8ga25vdyB3aGljaCBwYXJ0cyBvZiB0aGUgdGFyZ2V0IHBhZ2UgaXQKKyAqIHNob3VsZCBjb21wbGV0ZSB0aGUgd3JpdGUgb24uIEl0J3MgZWFzaWVzdCB0byBjb21wdXRlIHRoZW0gYWhlYWQgb2YKKyAqIHRpbWUgd2hlbiBhIG1vcmUgY29tcGxldGUgdmlldyBvZiB0aGUgd3JpdGUgaXMgYXZhaWxhYmxlLgogICovCi1zc2l6ZV90IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwb3MsCi0JCQkJICAgICBzaXplX3QgY291bnQsIG9jZnMyX3BhZ2Vfd3JpdGVyICphY3RvciwKLQkJCQkgICAgIHZvaWQgKnByaXYpCitzdGF0aWMgdm9pZCBvY2ZzMl9zZXRfdGFyZ2V0X2JvdW5kYXJpZXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkJbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCBpbnQgYWxsb2MpCit7CisJc3RydWN0IG9jZnMyX3dyaXRlX2NsdXN0ZXJfZGVzYyAqZGVzYzsKKworCXdjLT53X3RhcmdldF9mcm9tID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXdjLT53X3RhcmdldF90byA9IHdjLT53X3RhcmdldF9mcm9tICsgbGVuOworCisJaWYgKGFsbG9jID09IDApCisJCXJldHVybjsKKworCS8qCisJICogQWxsb2NhdGluZyB3cml0ZSAtIHdlIG1heSBoYXZlIGRpZmZlcmVudCBib3VuZGFyaWVzIGJhc2VkCisJICogb24gcGFnZSBzaXplIGFuZCBjbHVzdGVyIHNpemUuCisJICoKKwkgKiBOT1RFOiBXZSBjYW4gbm8gbG9uZ2VyIGNvbXB1dGUgb25lIHZhbHVlIGZyb20gdGhlIG90aGVyIGFzCisJICogdGhlIGFjdHVhbCB3cml0ZSBsZW5ndGggYW5kIHVzZXIgcHJvdmlkZWQgbGVuZ3RoIG1heSBiZQorCSAqIGRpZmZlcmVudC4KKwkgKi8KKworCWlmICh3Yy0+d19sYXJnZV9wYWdlcykgeworCQkvKgorCQkgKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIDFzdCBhbmQgbGFzdCBjbHVzdGVyIHdpdGhpbgorCQkgKiBvdXIgcmFuZ2UgYW5kIHdoZXRoZXIgdGhleSBzaG91bGQgYmUgemVybydkIG9yIG5vdC4gRWl0aGVyCisJCSAqIHZhbHVlIG1heSBiZSBleHRlbmRlZCBvdXQgdG8gdGhlIHN0YXJ0L2VuZCBvZiBhCisJCSAqIG5ld2x5IGFsbG9jYXRlZCBjbHVzdGVyLgorCQkgKi8KKwkJZGVzYyA9ICZ3Yy0+d19kZXNjWzBdOworCQlpZiAob2NmczJfc2hvdWxkX3plcm9fY2x1c3RlcihkZXNjKSkKKwkJCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMob3NiLAorCQkJCQkJCWRlc2MtPmNfY3BvcywKKwkJCQkJCQkmd2MtPndfdGFyZ2V0X2Zyb20sCisJCQkJCQkJTlVMTCk7CisKKwkJZGVzYyA9ICZ3Yy0+d19kZXNjW3djLT53X2NsZW4gLSAxXTsKKwkJaWYgKG9jZnMyX3Nob3VsZF96ZXJvX2NsdXN0ZXIoZGVzYykpCisJCQlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKG9zYiwKKwkJCQkJCQlkZXNjLT5jX2Nwb3MsCisJCQkJCQkJTlVMTCwKKwkJCQkJCQkmd2MtPndfdGFyZ2V0X3RvKTsKKwl9IGVsc2UgeworCQl3Yy0+d190YXJnZXRfZnJvbSA9IDA7CisJCXdjLT53X3RhcmdldF90byA9IFBBR0VfQ0FDSEVfU0laRTsKKwl9Cit9CisKKy8qCisgKiBQb3B1bGF0ZSBlYWNoIHNpbmdsZS1jbHVzdGVyIHdyaXRlIGRlc2NyaXB0b3IgaW4gdGhlIHdyaXRlIGNvbnRleHQKKyAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGkvbyB0byBiZSBkb25lLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB0aGF0IHdpbGwgaGF2ZSB0byBiZSBhbGxvY2F0ZWQsIGFzCisgKiB3ZWxsIGFzIGEgd29yc3QgY2FzZSBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGV4dGVudCByZWNvcmRzIHRoYXQKKyAqIHdvdWxkIGhhdmUgdG8gYmUgY3JlYXRlZCBkdXJpbmcgYSB3cml0ZSB0byBhbiB1bndyaXR0ZW4gcmVnaW9uLgorICovCitzdGF0aWMgaW50IG9jZnMyX3BvcHVsYXRlX3dyaXRlX2Rlc2Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqY2x1c3RlcnNfdG9fYWxsb2MsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmV4dGVudHNfdG9fc3BsaXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjICpkZXNjOworCXVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMgPSAwOworCXVuc2lnbmVkIGludCBleHRfZmxhZ3MgPSAwOworCXUzMiBwaHlzID0gMDsKKwlpbnQgaTsKKworCSpjbHVzdGVyc190b19hbGxvYyA9IDA7CisJKmV4dGVudHNfdG9fc3BsaXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHdjLT53X2NsZW47IGkrKykgeworCQlkZXNjID0gJndjLT53X2Rlc2NbaV07CisJCWRlc2MtPmNfY3BvcyA9IHdjLT53X2Nwb3MgKyBpOworCisJCWlmIChudW1fY2x1c3RlcnMgPT0gMCkgeworCQkJLyoKKwkJCSAqIE5lZWQgdG8gbG9vayB1cCB0aGUgbmV4dCBleHRlbnQgcmVjb3JkLgorCQkJICovCisJCQlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnMoaW5vZGUsIGRlc2MtPmNfY3BvcywgJnBoeXMsCisJCQkJCQkgJm51bV9jbHVzdGVycywgJmV4dF9mbGFncyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogQXNzdW1lIHdvcnN0IGNhc2UgLSB0aGF0IHdlJ3JlIHdyaXRpbmcgaW4KKwkJCSAqIHRoZSBtaWRkbGUgb2YgdGhlIGV4dGVudC4KKwkJCSAqCisJCQkgKiBXZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHdyaXRlIHByb2NlZWRzIGZyb20KKwkJCSAqIGxlZnQgdG8gcmlnaHQsIGluIHdoaWNoIGNhc2UgdGhlIGV4dGVudAorCQkJICogaW5zZXJ0IGNvZGUgaXMgc21hcnQgZW5vdWdoIHRvIGNvYWxlc2NlIHRoZQorCQkJICogbmV4dCBzcGxpdHMgaW50byB0aGUgcHJldmlvdXMgcmVjb3JkcyBjcmVhdGVkLgorCQkJICovCisJCQlpZiAoZXh0X2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikKKwkJCQkqZXh0ZW50c190b19zcGxpdCA9ICpleHRlbnRzX3RvX3NwbGl0ICsgMjsKKwkJfSBlbHNlIGlmIChwaHlzKSB7CisJCQkvKgorCQkJICogT25seSBpbmNyZW1lbnQgcGh5cyBpZiBpdCBkb2Vzbid0IGRlc2NyaWJlCisJCQkgKiBhIGhvbGUuCisJCQkgKi8KKwkJCXBoeXMrKzsKKwkJfQorCisJCWRlc2MtPmNfcGh5cyA9IHBoeXM7CisJCWlmIChwaHlzID09IDApIHsKKwkJCWRlc2MtPmNfbmV3ID0gMTsKKwkJCSpjbHVzdGVyc190b19hbGxvYyA9ICpjbHVzdGVyc190b19hbGxvYyArIDE7CisJCX0KKwkJaWYgKGV4dF9mbGFncyAmIE9DRlMyX0VYVF9VTldSSVRURU4pCisJCQlkZXNjLT5jX3Vud3JpdHRlbiA9IDE7CisKKwkJbnVtX2NsdXN0ZXJzLS07CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLCBzdHJ1Y3QgcGFnZSAqbW1hcF9wYWdlKQogewogCWludCByZXQsIGNyZWRpdHMgPSBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUzsKLQlzc2l6ZV90IHdyaXR0ZW4gPSAwOwotCXUzMiBwaHlzOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgaW50IGNsdXN0ZXJzX3RvX2FsbG9jLCBleHRlbnRzX3RvX3NwbGl0OworCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgd2M7CiAKLQlvY2ZzMl93cml0ZV9jdHh0X2luaXQoJndjLCBvc2IsIHBvcywgY291bnQsIGFjdG9yLCBwcml2KTsKKwlyZXQgPSBvY2ZzMl9hbGxvY193cml0ZV9jdHh0KCZ3Yywgb3NiLCBwb3MsIGxlbiwgZGlfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAotCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlyZXQgPSBvY2ZzMl9wb3B1bGF0ZV93cml0ZV9kZXNjKGlub2RlLCB3YywgJmNsdXN0ZXJzX3RvX2FsbG9jLAorCQkJCQkmZXh0ZW50c190b19zcGxpdCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KLQlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil3Yy0+d19kaV9iaC0+Yl9kYXRhOworCisJLyoKKwkgKiBXZSBzZXQgd190YXJnZXRfZnJvbSwgd190YXJnZXRfdG8gaGVyZSBzbyB0aGF0CisJICogb2NmczJfd3JpdGVfZW5kKCkga25vd3Mgd2hpY2ggcmFuZ2UgaW4gdGhlIHRhcmdldCBwYWdlIHRvCisJICogd3JpdGUgb3V0LiBBbiBhbGxvY2F0aW9uIHJlcXVpcmVzIHRoYXQgd2Ugd3JpdGUgdGhlIGVudGlyZQorCSAqIGNsdXN0ZXIgcmFuZ2UuCisJICovCisJaWYgKGNsdXN0ZXJzX3RvX2FsbG9jIHx8IGV4dGVudHNfdG9fc3BsaXQpIHsKKwkJLyoKKwkJICogWFhYOiBXZSBhcmUgc3RyZXRjaGluZyB0aGUgbGltaXRzIG9mCisJCSAqIG9jZnMyX2xvY2tfYWxsb2NhdG9ycygpLiBJdCBncmVhdGx5IG92ZXItZXN0aW1hdGVzCisJCSAqIHRoZSB3b3JrIHRvIGJlIGRvbmUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGRpLCBjbHVzdGVyc190b19hbGxvYywKKwkJCQkJICAgIGV4dGVudHNfdG9fc3BsaXQsICZkYXRhX2FjLCAmbWV0YV9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoaW5vZGUtPmlfc2IsIGRpLAorCQkJCQkJICAgIGNsdXN0ZXJzX3RvX2FsbG9jKTsKKworCX0KKworCW9jZnMyX3NldF90YXJnZXRfYm91bmRhcmllcyhvc2IsIHdjLCBwb3MsIGxlbiwKKwkJCQkgICAgY2x1c3RlcnNfdG9fYWxsb2MgKyBleHRlbnRzX3RvX3NwbGl0KTsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl3Yy0+d19oYW5kbGUgPSBoYW5kbGU7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdGhpcyB0byBmYWlsIGluIG9jZnMyX3dyaXRlX2VuZCgpLCBzbyBkbyBpdAorCSAqIGhlcmUuCisJICovCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgd2MtPndfZGlfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJLyoKKwkgKiBGaWxsIG91ciBwYWdlIGFycmF5IGZpcnN0LiBUaGF0IHdheSB3ZSd2ZSBncmFiYmVkIGVub3VnaCBzbworCSAqIHRoYXQgd2UgY2FuIHplcm8gYW5kIGZsdXNoIGlmIHdlIGVycm9yIGFmdGVyIGFkZGluZyB0aGUKKwkgKiBleHRlbnQuCisJICovCisJcmV0ID0gb2NmczJfZ3JhYl9wYWdlc19mb3Jfd3JpdGUobWFwcGluZywgd2MsIHdjLT53X2Nwb3MsIHBvcywKKwkJCQkJIGNsdXN0ZXJzX3RvX2FsbG9jICsgZXh0ZW50c190b19zcGxpdCwKKwkJCQkJIG1tYXBfcGFnZSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl93cml0ZV9jbHVzdGVyX2J5X2Rlc2MobWFwcGluZywgZGF0YV9hYywgbWV0YV9hYywgd2MsIHBvcywKKwkJCQkJICBsZW4pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJaWYgKGRhdGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCisJKnBhZ2VwID0gd2MtPndfdGFyZ2V0X3BhZ2U7CisJKmZzZGF0YSA9IHdjOworCXJldHVybiAwOworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXQ6CisJb2NmczJfZnJlZV93cml0ZV9jdHh0KHdjKTsKKworCWlmIChkYXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7CisJaWYgKG1ldGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfd3JpdGVfYmVnaW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQoreworCWludCByZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsICZkaV9iaCwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyoKIAkgKiBUYWtlIGFsbG9jIHNlbSBoZXJlIHRvIHByZXZlbnQgY29uY3VycmVudCBsb29rdXBzLiBUaGF0IHdheQpAQCAtMTIyOCw1MiArMTQ5NCw4NSBAQAogCSAqLwogCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwogCi0JcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCB3Yy53X2Nwb3MsICZwaHlzLCBOVUxMLCBOVUxMKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfbWV0YTsKLQl9Ci0KLQkvKiBwaHlzID09IDAgbWVhbnMgdGhhdCBhbGxvY2F0aW9uIGlzIHJlcXVpcmVkLiAqLwotCWlmIChwaHlzID09IDApIHsKLQkJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBkaSwgMSwgJmRhdGFfYWMsICZtZXRhX2FjKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfbWV0YTsKLQkJfQotCi0JCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKGlub2RlLT5pX3NiLCBkaSwgMSk7Ci0JfQotCiAJcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfbWV0YTsKKwkJZ290byBvdXRfZmFpbDsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfZGF0YTsKLQl9Ci0KLQl3cml0dGVuID0gb2NmczJfd3JpdGUoZmlsZSwgcGh5cywgaGFuZGxlLCBkaV9iaCwgZGF0YV9hYywKLQkJCSAgICAgIG1ldGFfYWMsICZ3Yyk7Ci0JaWYgKHdyaXR0ZW4gPCAwKSB7Ci0JCXJldCA9IHdyaXR0ZW47Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OwotCX0KLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2sobWFwcGluZywgcG9zLCBsZW4sIGZsYWdzLCBwYWdlcCwKKwkJCQkgICAgICAgZnNkYXRhLCBkaV9iaCwgTlVMTCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXRfZmFpbF9kYXRhOwogCX0KIAotCXBvcyArPSB3cml0dGVuOworCWJyZWxzZShkaV9iaCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZhaWxfZGF0YToKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CitvdXRfZmFpbDoKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlicmVsc2UoZGlfYmgpOworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl93cml0ZV9lbmRfbm9sb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQoreworCWludCBpOworCXVuc2lnbmVkIGZyb20sIHRvLCBzdGFydCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MgPSBmc2RhdGE7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXdjLT53X2RpX2JoLT5iX2RhdGE7CisJaGFuZGxlX3QgKmhhbmRsZSA9IHdjLT53X2hhbmRsZTsKKwlzdHJ1Y3QgcGFnZSAqdG1wcGFnZTsKKworCWlmICh1bmxpa2VseShjb3BpZWQgPCBsZW4pKSB7CisJCWlmICghUGFnZVVwdG9kYXRlKHdjLT53X3RhcmdldF9wYWdlKSkKKwkJCWNvcGllZCA9IDA7CisKKwkJb2NmczJfemVyb19uZXdfYnVmZmVycyh3Yy0+d190YXJnZXRfcGFnZSwgc3RhcnQrY29waWVkLAorCQkJCSAgICAgICBzdGFydCtsZW4pOworCX0KKwlmbHVzaF9kY2FjaGVfcGFnZSh3Yy0+d190YXJnZXRfcGFnZSk7CisKKwlmb3IoaSA9IDA7IGkgPCB3Yy0+d19udW1fcGFnZXM7IGkrKykgeworCQl0bXBwYWdlID0gd2MtPndfcGFnZXNbaV07CisKKwkJaWYgKHRtcHBhZ2UgPT0gd2MtPndfdGFyZ2V0X3BhZ2UpIHsKKwkJCWZyb20gPSB3Yy0+d190YXJnZXRfZnJvbTsKKwkJCXRvID0gd2MtPndfdGFyZ2V0X3RvOworCisJCQlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSB8fAorCQkJICAgICAgIHRvID4gUEFHRV9DQUNIRV9TSVpFIHx8CisJCQkgICAgICAgdG8gPCBmcm9tKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQYWdlcyBhZGphY2VudCB0byB0aGUgdGFyZ2V0IChpZiBhbnkpIGltcGx5CisJCQkgKiBhIGhvbGUtZmlsbGluZyB3cml0ZSBpbiB3aGljaCBjYXNlIHdlIHdhbnQKKwkJCSAqIHRvIGZsdXNoIHRoZWlyIGVudGlyZSByYW5nZS4KKwkJCSAqLworCQkJZnJvbSA9IDA7CisJCQl0byA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJfQorCisJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCisJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKKwkJCQkJICBmcm9tLCB0bywgTlVMTCwKKwkJCQkJICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOworCisJCWJsb2NrX2NvbW1pdF93cml0ZSh0bXBwYWdlLCBmcm9tLCB0byk7CisJfQorCisJcG9zICs9IGNvcGllZDsKIAlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgewogCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwpAQCAtMTI4MywyOSArMTU4MiwzMSBAQAogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJZGktPmlfbXRpbWUgPSBkaS0+aV9jdGltZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX210aW1lLnR2X3NlYyk7CiAJZGktPmlfbXRpbWVfbnNlYyA9IGRpLT5pX2N0aW1lX25zZWMgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9tdGltZS50dl9uc2VjKTsKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgd2MtPndfZGlfYmgpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7Ci0KLW91dF9jb21taXQ6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAotb3V0X2RhdGE6Ci0Jb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOworCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZ3Yy0+d19kZWFsbG9jKTsKIAotb3V0X21ldGE6CisJb2NmczJfZnJlZV93cml0ZV9jdHh0KHdjKTsKKworCXJldHVybiBjb3BpZWQ7Cit9CisKK2ludCBvY2ZzMl93cml0ZV9lbmQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQoreworCWludCByZXQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisKKwlyZXQgPSBvY2ZzMl93cml0ZV9lbmRfbm9sb2NrKG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsIHBhZ2UsIGZzZGF0YSk7CisKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CiAJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwogCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKIAotb3V0OgotCWJyZWxzZShkaV9iaCk7Ci0JaWYgKGRhdGFfYWMpCi0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKLQlpZiAobWV0YV9hYykKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOwotCi0JcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogcmV0OworCXJldHVybiByZXQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgb2NmczJfYW9wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuaCBiL2ZzL29jZnMyL2FvcHMuaAppbmRleCA0NTgyMWQ0Li4zODk1NzliIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmgKKysrIGIvZnMvb2NmczIvYW9wcy5oCkBAIC00Miw1NyArNDIsMjIgQEAKIAkJCWludCAoKmZuKSgJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpOwogCi1zdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dDsKLXR5cGVkZWYgaW50IChvY2ZzMl9wYWdlX3dyaXRlcikoc3RydWN0IGlub2RlICosIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICosCi0JCQkJdTY0ICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKik7CitpbnQgb2NmczJfd3JpdGVfYmVnaW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKTsKIAotc3NpemVfdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBvY2ZzMl9wYWdlX3dyaXRlciAqYWN0b3IsCi0JCQkJICAgICB2b2lkICpwcml2KTsKK2ludCBvY2ZzMl93cml0ZV9lbmQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKTsKIAotc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgewotCXNpemVfdAkJCQl3X2NvdW50OwotCWxvZmZfdAkJCQl3X3BvczsKLQl1MzIJCQkJd19jcG9zOwotCXVuc2lnbmVkIGludAkJCXdfZmluaXNoZWRfY29weTsKK2ludCBvY2ZzMl93cml0ZV9lbmRfbm9sb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKTsKIAotCS8qIFRoaXMgaXMgdHJ1ZSBpZiBwYWdlX3NpemUgPiBjbHVzdGVyX3NpemUgKi8KLQl1bnNpZ25lZCBpbnQJCQl3X2xhcmdlX3BhZ2VzOwotCi0JLyogRmlsbGVyIGNhbGxiYWNrIGFuZCBwcml2YXRlIGRhdGEgKi8KLQlvY2ZzMl9wYWdlX3dyaXRlcgkJKndfd3JpdGVfZGF0YV9wYWdlOwotCXZvaWQJCQkJKndfcHJpdmF0ZTsKLQotCS8qIE9ubHkgdmFsaWQgZm9yIHRoZSBmaWxsZXIgY2FsbGJhY2sgKi8KLQlzdHJ1Y3QgcGFnZQkJCSp3X3RoaXNfcGFnZTsKLQl1bnNpZ25lZCBpbnQJCQl3X3RoaXNfcGFnZV9uZXc7Ci19OwotCi1zdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiB7Ci0JY2hhcgkJCQkqYl9zcmNfYnVmOwotCWNvbnN0IHN0cnVjdCBpb3ZlYwkJKmJfY3VyX2lvdjsgLyogQ3VycmVudCBpb3ZlYyAqLwotCXNpemVfdAkJCQliX2N1cl9vZmY7IC8qIE9mZnNldCBpbiB0aGUKLQkJCQkJCSAgICAqIGN1cnJlbnQgaW92ZWMgKi8KLX07Ci1pbnQgb2NmczJfbWFwX2FuZF93cml0ZV91c2VyX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKLQkJCQkgIHU2NCAqcF9ibGtubywKLQkJCQkgIHVuc2lnbmVkIGludCAqcmV0X2Zyb20sCi0JCQkJICB1bnNpZ25lZCBpbnQgKnJldF90byk7Ci0KLXN0cnVjdCBvY2ZzMl9zcGxpY2Vfd3JpdGVfcHJpdiB7Ci0Jc3RydWN0IHNwbGljZV9kZXNjCQkqc19zZDsKLQlzdHJ1Y3QgcGlwZV9idWZmZXIJCSpzX2J1ZjsKLQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvCQkqc19waXBlOwotCS8qIE5laXRoZXIgb2Zmc2V0IHZhbHVlIGlzIGV2ZXIgbGFyZ2VyIHRoYW4gb25lIHBhZ2UgKi8KLQl1bnNpZ25lZCBpbnQJCQlzX29mZnNldDsKLQl1bnNpZ25lZCBpbnQJCQlzX2J1Zl9vZmZzZXQ7Ci19OwotaW50IG9jZnMyX21hcF9hbmRfd3JpdGVfc3BsaWNlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAotCQkJCSAgICB1NjQgKnBfYmxrbm8sCi0JCQkJICAgIHVuc2lnbmVkIGludCAqcmV0X2Zyb20sCi0JCQkJICAgIHVuc2lnbmVkIGludCAqcmV0X3RvKTsKK2ludCBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2soc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIHN0cnVjdCBwYWdlICptbWFwX3BhZ2UpOwogCiAvKiBhbGwgb2NmczJfZGlvX2VuZF9pbygpJ3MgZmF1bHQgKi8KICNkZWZpbmUgb2NmczJfaW9jYl9pc19yd19sb2NrZWQoaW9jYikgXApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKaW5kZXggOTc5MTEzNC4uMmJkN2Y3OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCkBAIC0xMzM1LDYgKzEzMzUsNyBAQAogCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShvMmhiX3N0ZWFkeV9xdWV1ZSwKIAkJCQlhdG9taWNfcmVhZCgmcmVnLT5ocl9zdGVhZHlfaXRlcmF0aW9ucykgPT0gMCk7CiAJaWYgKHJldCkgeworCQkvKiBXZSBnb3QgaW50ZXJydXB0ZWQgKGhlbGxvIHB0cmFjZSEpLiAgQ2xlYW4gdXAgKi8KIAkJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CiAJCWhiX3Rhc2sgPSByZWctPmhyX3Rhc2s7CiAJCXJlZy0+aHJfdGFzayA9IE5VTEw7CkBAIC0xMzQ1LDcgKzEzNDYsMTYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gY291bnQ7CisJLyogT2ssIHdlIHdlcmUgd29rZW4uICBNYWtlIHN1cmUgaXQgd2Fzbid0IGJ5IGRyb3BfaXRlbSgpICovCisJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisJaGJfdGFzayA9IHJlZy0+aHJfdGFzazsKKwlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOworCisJaWYgKGhiX3Rhc2spCisJCXJldCA9IGNvdW50OworCWVsc2UKKwkJcmV0ID0gLUVJTzsKKwogb3V0OgogCWlmIChmaWxwKQogCQlmcHV0KGZpbHApOwpAQCAtMTUyMyw2ICsxNTMzLDE1IEBACiAJaWYgKGhiX3Rhc2spCiAJCWt0aHJlYWRfc3RvcChoYl90YXNrKTsKIAorCS8qCisJICogSWYgd2UncmUgcmFjaW5nIGEgZGV2X3dyaXRlKCksIHdlIG5lZWQgdG8gd2FrZSB0aGVtLiAgVGhleSB3aWxsCisJICogY2hlY2sgcmVnLT5ocl90YXNrCisJICovCisJaWYgKGF0b21pY19yZWFkKCZyZWctPmhyX3N0ZWFkeV9pdGVyYXRpb25zKSAhPSAwKSB7CisJCWF0b21pY19zZXQoJnJlZy0+aHJfc3RlYWR5X2l0ZXJhdGlvbnMsIDApOworCQl3YWtlX3VwKCZvMmhiX3N0ZWFkeV9xdWV1ZSk7CisJfQorCiAJY29uZmlnX2l0ZW1fcHV0KGl0ZW0pOwogfQogCkBAIC0xNjY1LDcgKzE2ODQsNjcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG8yaGJfc2V0dXBfY2FsbGJhY2spOwogCi1pbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYykKK3N0YXRpYyBzdHJ1Y3QgbzJoYl9yZWdpb24gKm8yaGJfZmluZF9yZWdpb24oY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCit7CisJc3RydWN0IG8yaGJfcmVnaW9uICpwLCAqcmVnID0gTlVMTDsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmbzJoYl9saXZlX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmbzJoYl9hbGxfcmVnaW9ucywgaHJfYWxsX2l0ZW0pIHsKKwkJaWYgKCFzdHJjbXAocmVnaW9uX3V1aWQsIGNvbmZpZ19pdGVtX25hbWUoJnAtPmhyX2l0ZW0pKSkgeworCQkJcmVnID0gcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludCBvMmhiX3JlZ2lvbl9nZXQoY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG8yaGJfcmVnaW9uICpyZWc7CisKKwlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKworCXJlZyA9IG8yaGJfZmluZF9yZWdpb24ocmVnaW9uX3V1aWQpOworCWlmICghcmVnKQorCQlyZXQgPSAtRU5PRU5UOworCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbzJubV9kZXBlbmRfaXRlbSgmcmVnLT5ocl9pdGVtKTsKKwlpZiAocmV0KQorCQlvMm5tX3VuZGVwZW5kX3RoaXNfbm9kZSgpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbzJoYl9yZWdpb25fcHV0KGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkKQoreworCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnOworCisJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlyZWcgPSBvMmhiX2ZpbmRfcmVnaW9uKHJlZ2lvbl91dWlkKTsKKworCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlpZiAocmVnKSB7CisJCW8ybm1fdW5kZXBlbmRfaXRlbSgmcmVnLT5ocl9pdGVtKTsKKwkJbzJubV91bmRlcGVuZF90aGlzX25vZGUoKTsKKwl9Cit9CisKK2ludCBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLAorCQkJICAgc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpCiB7CiAJc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CkBAIC0xNjgxLDYgKzE3NjAsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKHJlZ2lvbl91dWlkKSB7CisJCXJldCA9IG8yaGJfcmVnaW9uX2dldChyZWdpb25fdXVpZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKIAlkb3duX3dyaXRlKCZvMmhiX2NhbGxiYWNrX3NlbSk7CiAKIAlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZoYmNhbGwtPmxpc3QpIHsKQEAgLTE3MDIsMTYgKzE3ODcsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2spOwogCi12b2lkIG8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYykKK3ZvaWQgbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLAorCQkJICAgICAgc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpCiB7CiAJQlVHX09OKGhjLT5oY19tYWdpYyAhPSBPMkhCX0NCX01BR0lDKTsKIAogCW1sb2coTUxfSEVBUlRCRUFULCAib24gYmVoYWxmIG9mICVwIGZvciBmdW5jcyAlcFxuIiwKIAkgICAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwgaGMpOwogCisJLyogWFhYIENhbiB0aGlzIGhhcHBlbiBfd2l0aF8gYSByZWdpb24gcmVmZXJlbmNlPyAqLwogCWlmIChsaXN0X2VtcHR5KCZoYy0+aGNfaXRlbSkpCiAJCXJldHVybjsKIAorCWlmIChyZWdpb25fdXVpZCkKKwkJbzJoYl9yZWdpb25fcHV0KHJlZ2lvbl91dWlkKTsKKwogCWRvd25fd3JpdGUoJm8yaGJfY2FsbGJhY2tfc2VtKTsKIAogCWxpc3RfZGVsX2luaXQoJmhjLT5oY19pdGVtKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmggYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5oCmluZGV4IGNjNmQ0MGIuLjM1Mzk3ZGQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuaApAQCAtNjksOCArNjksMTAgQEAKIAkJCSBvMmhiX2NiX2Z1bmMgKmZ1bmMsCiAJCQkgdm9pZCAqZGF0YSwKIAkJCSBpbnQgcHJpb3JpdHkpOwotaW50IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpOwotdm9pZCBvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpOworaW50IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soY29uc3QgY2hhciAqcmVnaW9uX3V1aWQsCisJCQkgICBzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYyk7Cit2b2lkIG8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhjb25zdCBjaGFyICpyZWdpb25fdXVpZCwKKwkJCSAgICAgIHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKTsKIHZvaWQgbzJoYl9maWxsX25vZGVfbWFwKHVuc2lnbmVkIGxvbmcgKm1hcCwKIAkJCXVuc2lnbmVkIGJ5dGVzKTsKIHZvaWQgbzJoYl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCmluZGV4IDlmNWFkMGYuLmFmMjA3MGQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKQEAgLTkwMCw2ICs5MDAsNDYgQEAKIAl9LAogfTsKIAoraW50IG8ybm1fZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQoreworCXJldHVybiBjb25maWdmc19kZXBlbmRfaXRlbSgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cywgaXRlbSk7Cit9CisKK3ZvaWQgbzJubV91bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwljb25maWdmc191bmRlcGVuZF9pdGVtKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLCBpdGVtKTsKK30KKworaW50IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSh2b2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvMm5tX25vZGUgKmxvY2FsX25vZGU7CisKKwlsb2NhbF9ub2RlID0gbzJubV9nZXRfbm9kZV9ieV9udW0obzJubV90aGlzX25vZGUoKSk7CisJaWYgKCFsb2NhbF9ub2RlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG8ybm1fZGVwZW5kX2l0ZW0oJmxvY2FsX25vZGUtPm5kX2l0ZW0pOworCW8ybm1fbm9kZV9wdXQobG9jYWxfbm9kZSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKHZvaWQpCit7CisJc3RydWN0IG8ybm1fbm9kZSAqbG9jYWxfbm9kZTsKKworCWxvY2FsX25vZGUgPSBvMm5tX2dldF9ub2RlX2J5X251bShvMm5tX3RoaXNfbm9kZSgpKTsKKwlCVUdfT04oIWxvY2FsX25vZGUpOworCisJbzJubV91bmRlcGVuZF9pdGVtKCZsb2NhbF9ub2RlLT5uZF9pdGVtKTsKKwlvMm5tX25vZGVfcHV0KGxvY2FsX25vZGUpOworfQorCisKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X28ybm0odm9pZCkKIHsKIAlpZiAob2NmczJfdGFibGVfaGVhZGVyKQpAQCAtOTM0LDcgKzk3NCw3IEBACiAJCWdvdG8gb3V0X3N5c2N0bDsKIAogCWNvbmZpZ19ncm91cF9pbml0KCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLnN1X2dyb3VwKTsKLQlpbml0X01VVEVYKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfaW5pdCgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cy5zdV9tdXRleCk7CiAJcmV0ID0gY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAibm9kZW1hbmFnZXI6IFJlZ2lzdHJhdGlvbiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaAppbmRleCAwNzA1MjIxLi43Yzg2MDM2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oCkBAIC03Nyw0ICs3Nyw5IEBACiB2b2lkIG8ybm1fbm9kZV9nZXQoc3RydWN0IG8ybm1fbm9kZSAqbm9kZSk7CiB2b2lkIG8ybm1fbm9kZV9wdXQoc3RydWN0IG8ybm1fbm9kZSAqbm9kZSk7CiAKK2ludCBvMm5tX2RlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7Cit2b2lkIG8ybm1fdW5kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOworaW50IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSh2b2lkKTsKK3ZvaWQgbzJubV91bmRlcGVuZF90aGlzX25vZGUodm9pZCk7CisKICNlbmRpZiAvKiBPMkNMVVNURVJfTk9ERU1BTkFHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKaW5kZXggMGIyMjlhOS4uZjBiZGZkOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCkBAIC0yNjEsMTQgKzI2MSwxMiBAQAogCiBzdGF0aWMgdm9pZCBvMm5ldF9jb21wbGV0ZV9ub2Rlc19uc3coc3RydWN0IG8ybmV0X25vZGUgKm5uKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICp0bXA7CisJc3RydWN0IG8ybmV0X3N0YXR1c193YWl0ICpuc3csICp0bXA7CiAJdW5zaWduZWQgaW50IG51bV9raWxscyA9IDA7Ci0Jc3RydWN0IG8ybmV0X3N0YXR1c193YWl0ICpuc3c7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJm5uLT5ubl9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCB0bXAsICZubi0+bm5fc3RhdHVzX2xpc3QpIHsKLQkJbnN3ID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgbzJuZXRfc3RhdHVzX3dhaXQsIG5zX25vZGVfaXRlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5zdywgdG1wLCAmbm4tPm5uX3N0YXR1c19saXN0LCBuc19ub2RlX2l0ZW0pIHsKIAkJbzJuZXRfY29tcGxldGVfbnN3X2xvY2tlZChubiwgbnN3LCBPMk5FVF9FUlJfRElFRCwgMCk7CiAJCW51bV9raWxscysrOwogCX0KQEAgLTc2NCwxMyArNzYyLDEwIEBACiAKIHZvaWQgbzJuZXRfdW5yZWdpc3Rlcl9oYW5kbGVyX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCXN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciAqbm1oOworCXN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciAqbm1oLCAqbjsKIAogCXdyaXRlX2xvY2soJm8ybmV0X2hhbmRsZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgbGlzdCkgewotCQlubWggPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG8ybmV0X21zZ19oYW5kbGVyLAotCQkJCSBuaF91bnJlZ2lzdGVyX2l0ZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShubWgsIG4sIGxpc3QsIG5oX3VucmVnaXN0ZXJfaXRlbSkgewogCQltbG9nKE1MX1RDUCwgInVucmVnaXN0ZXJpbmcgaGFuZGxlciBmdW5jICVwIHR5cGUgJXUga2V5ICUwOHhcbiIsCiAJCSAgICAgbm1oLT5uaF9mdW5jLCBubWgtPm5oX21zZ190eXBlLCBubWgtPm5oX2tleSk7CiAJCXJiX2VyYXNlKCZubWgtPm5oX25vZGUsICZvMm5ldF9oYW5kbGVyX3RyZWUpOwpAQCAtMTYzOCw4ICsxNjMzLDggQEAKIAogdm9pZCBvMm5ldF91bnJlZ2lzdGVyX2hiX2NhbGxiYWNrcyh2b2lkKQogewotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfdXApOwotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfZG93bik7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl91cCk7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl9kb3duKTsKIH0KIAogaW50IG8ybmV0X3JlZ2lzdGVyX2hiX2NhbGxiYWNrcyh2b2lkKQpAQCAtMTY1MSw5ICsxNjQ2LDkgQEAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZvMm5ldF9oYl91cCwgTzJIQl9OT0RFX1VQX0NCLAogCQkJICAgIG8ybmV0X2hiX25vZGVfdXBfY2IsIE5VTEwsIE8yTkVUX0hCX1BSSSk7CiAKLQlyZXQgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvMm5ldF9oYl91cCk7CisJcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmbzJuZXRfaGJfdXApOwogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfZG93bik7CisJCXJldCA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJm8ybmV0X2hiX2Rvd24pOwogCiAJaWYgKHJldCkKIAkJbzJuZXRfdW5yZWdpc3Rlcl9oYl9jYWxsYmFja3MoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5jIGIvZnMvb2NmczIvZGlyLmMKaW5kZXggYzQ0MWVmMS4uMGQ1ZmRkZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmMKKysrIGIvZnMvb2NmczIvZGlyLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCQl1MzIgb2Zmc2V0ID0gT0NGUzJfSShkaXIpLT5pcF9jbHVzdGVyczsKIAogCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihPQ0ZTMl9TQihzYiksIGRpciwgJm9mZnNldCwKLQkJCQkJCSAgICAxLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKKwkJCQkJCSAgICAxLCAwLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKIAkJCQkJCSAgICBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKIAkJQlVHX09OKHN0YXR1cyA9PSAtRUFHQUlOKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwppbmRleCBkODM2Yjk4Li42OTU0NTY1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCkBAIC0xMTI4LDggKzExMjgsOCBAQAogCiBzdGF0aWMgdm9pZCBkbG1fdW5yZWdpc3Rlcl9kb21haW5faGFuZGxlcnMoc3RydWN0IGRsbV9jdHh0ICpkbG0pCiB7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCk7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX3VwKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX2Rvd24pOwogCW8ybmV0X3VucmVnaXN0ZXJfaGFuZGxlcl9saXN0KCZkbG0tPmRsbV9kb21haW5faGFuZGxlcnMpOwogfQogCkBAIC0xMTQxLDEzICsxMTQxLDEzIEBACiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duLCBPMkhCX05PREVfRE9XTl9DQiwKIAkJCSAgICBkbG1faGJfbm9kZV9kb3duX2NiLCBkbG0sIERMTV9IQl9OT0RFX0RPV05fUFJJKTsKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl9kb3duKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGJhaWw7CiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCwgTzJIQl9OT0RFX1VQX0NCLAogCQkJICAgIGRsbV9oYl9ub2RlX3VwX2NiLCBkbG0sIERMTV9IQl9OT0RFX1VQX1BSSSk7Ci0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmZGxtLT5kbG1faGJfdXApOworCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX3VwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGJhaWw7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwppbmRleCA2ZWRmZmNhLi42NWIyYjliIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCkBAIC0xOTIsMjUgKzE5MiwyMCBAQAogc3RhdGljIHZvaWQgZGxtX2R1bXBfbWxlcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAkKIAltbG9nKE1MX05PVElDRSwgImR1bXBpbmcgYWxsIG1sZXMgZm9yIGRvbWFpbiAlczpcbiIsIGRsbS0+bmFtZSk7CiAJc3Bpbl9sb2NrKCZkbG0tPm1hc3Rlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1hc3Rlcl9saXN0KSB7Ci0JCW1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtbGUsICZkbG0tPm1hc3Rlcl9saXN0LCBsaXN0KQogCQlkbG1fcHJpbnRfb25lX21sZShtbGUpOwotCX0KIAlzcGluX3VubG9jaygmZGxtLT5tYXN0ZXJfbG9jayk7CiB9CiAKIGludCBkbG1fZHVtcF9hbGxfbWxlcyhjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtOwogCiAJc3Bpbl9sb2NrKCZkbG1fZG9tYWluX2xvY2spOwotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbV9kb21haW5zKSB7Ci0JCWRsbSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fY3R4dCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkbG0sICZkbG1fZG9tYWlucywgbGlzdCkgewogCQltbG9nKE1MX05PVElDRSwgImZvdW5kIGRsbTogJXAsIG5hbWU9JXNcbiIsIGRsbSwgZGxtLT5uYW1lKTsKIAkJZGxtX2R1bXBfbWxlcyhkbG0pOwogCX0KQEAgLTQ1NCwxMiArNDQ5LDEwIEBACiAJCQljaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbmFtZWxlbikKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICp0bXBtbGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5tYXN0ZXJfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1hc3Rlcl9saXN0KSB7Ci0JCXRtcG1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBtbGUsICZkbG0tPm1hc3Rlcl9saXN0LCBsaXN0KSB7CiAJCWlmICghZGxtX21sZV9lcXVhbChkbG0sIHRtcG1sZSwgbmFtZSwgbmFtZWxlbikpCiAJCQljb250aW51ZTsKIAkJZGxtX2dldF9tbGUodG1wbWxlKTsKQEAgLTQ3MiwxMyArNDY1LDEwIEBACiB2b2lkIGRsbV9oYl9ldmVudF9ub3RpZnlfYXR0YWNoZWQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIGludCBpZHgsIGludCBub2RlX3VwKQogewogCXN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgKm1sZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPnNwaW5sb2NrKTsKIAkKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1sZV9oYl9ldmVudHMpIHsKLQkJbWxlID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5LCAKLQkJCQkgaGJfZXZlbnRzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1sZSwgJmRsbS0+bWxlX2hiX2V2ZW50cywgaGJfZXZlbnRzKSB7CiAJCWlmIChub2RlX3VwKQogCQkJZGxtX21sZV9ub2RlX3VwKGRsbSwgbWxlLCBOVUxMLCBpZHgpOwogCQllbHNlCkBAIC0yNDM0LDcgKzI0MjQsNyBAQAogCWludCByZXQ7CiAJaW50IGk7CiAJaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSwgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZyZXMtPnNwaW5sb2NrKTsKQEAgLTI0NTMsOCArMjQ0Myw3IEBACiAJcmV0ID0gMDsKIAlxdWV1ZSA9ICZyZXMtPmdyYW50ZWQ7CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkrK2NvdW50OwogCQkJaWYgKGxvY2stPm1sLm5vZGUgPT0gZGxtLT5ub2RlX251bSkgewogCQkJCW1sb2coMCwgImZvdW5kIGEgbG9jayBvd25lZCBieSB0aGlzIG5vZGUgc3RpbGwgIgpAQCAtMjkyMywxOCArMjkxMiwxNiBAQAogc3RhdGljIHZvaWQgZGxtX3JlbW92ZV9ub25sb2NhbF9sb2NrcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwKIAkJCQkgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcXVldWUgPSAmcmVzLT5ncmFudGVkOwogCWludCBpLCBiaXQ7Ci0Jc3RydWN0IGRsbV9sb2NrICpsb2NrOworCXN0cnVjdCBkbG1fbG9jayAqbG9jaywgKm5leHQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCiAJQlVHX09OKHJlcy0+b3duZXIgPT0gZGxtLT5ub2RlX251bSk7CiAKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCBxdWV1ZSwgbGlzdCkgewogCQkJaWYgKGxvY2stPm1sLm5vZGUgIT0gZGxtLT5ub2RlX251bSkgewogCQkJCW1sb2coMCwgInB1dHRpbmcgbG9jayBmb3Igbm9kZSAldVxuIiwKIAkJCQkgICAgIGxvY2stPm1sLm5vZGUpOwpAQCAtMjk3Niw3ICsyOTYzLDYgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSA9ICZyZXMtPmdyYW50ZWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAJaW50IG5vZGVudW07CiAKQEAgLTI5ODQsMTAgKzI5NzAsOSBAQAogCiAJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCBxdWV1ZSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkvKiB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGlzIG5vZGUKIAkJCSAqIGlzIGFsaXZlICovCi0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKIAkJCWlmIChsb2NrLT5tbC5ub2RlICE9IGRsbS0+bm9kZV9udW0pIHsKIAkJCQlzcGluX3VubG9jaygmcmVzLT5zcGlubG9jayk7CiAJCQkJcmV0dXJuIGxvY2stPm1sLm5vZGU7CkBAIC0zMjM0LDggKzMyMTksNyBAQAogCiB2b2lkIGRsbV9jbGVhbl9tYXN0ZXJfbGlzdChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKLQlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7CisJc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqbWxlLCAqbmV4dDsKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIApAQCAtMzI0NSw5ICszMjI5LDcgQEAKIAogCS8qIGNsZWFuIHRoZSBtYXN0ZXIgbGlzdCAqLwogCXNwaW5fbG9jaygmZGxtLT5tYXN0ZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmZGxtLT5tYXN0ZXJfbGlzdCkgewotCQltbGUgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnksIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1sZSwgbmV4dCwgJmRsbS0+bWFzdGVyX2xpc3QsIGxpc3QpIHsKIAkJQlVHX09OKG1sZS0+dHlwZSAhPSBETE1fTUxFX0JMT0NLICYmCiAJCSAgICAgICBtbGUtPnR5cGUgIT0gRExNX01MRV9NQVNURVIgJiYKIAkJICAgICAgIG1sZS0+dHlwZSAhPSBETE1fTUxFX01JR1JBVElPTik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCmluZGV4IDY3MWM0ZWQuLmEyYzMzMTYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCkBAIC0xNTgsOCArMTU4LDcgQEAKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGxtX2N0eHQsIGRpc3BhdGNoZWRfd29yayk7CiAJTElTVF9IRUFEKHRtcF9saXN0KTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV93b3JrX2l0ZW0gKml0ZW07CisJc3RydWN0IGRsbV93b3JrX2l0ZW0gKml0ZW0sICpuZXh0OwogCWRsbV93b3JrZnVuY190ICp3b3JrZnVuYzsKIAlpbnQgdG90PTA7CiAKQEAgLTE2NywxMyArMTY2LDEyIEBACiAJbGlzdF9zcGxpY2VfaW5pdCgmZGxtLT53b3JrX2xpc3QsICZ0bXBfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmRsbS0+d29ya19sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJnRtcF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVtLCAmdG1wX2xpc3QsIGxpc3QpIHsKIAkJdG90Kys7CiAJfQogCW1sb2coMCwgIiVzOiB3b3JrIHRocmVhZCBoYXMgJWQgd29yayBpdGVtc1xuIiwgZGxtLT5uYW1lLCB0b3QpOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmdG1wX2xpc3QpIHsKLQkJaXRlbSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV93b3JrX2l0ZW0sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVtLCBuZXh0LCAmdG1wX2xpc3QsIGxpc3QpIHsKIAkJd29ya2Z1bmMgPSBpdGVtLT5mdW5jOwogCQlsaXN0X2RlbF9pbml0KCZpdGVtLT5saXN0KTsKIApAQCAtNTQ5LDcgKzU0Nyw2IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSAqbmRhdGE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlpbnQgYWxsX25vZGVzX2RvbmU7CiAJaW50IGRlc3Ryb3kgPSAwOwogCWludCBwYXNzID0gMDsKQEAgLTU2Nyw4ICs1NjQsNyBAQAogCiAJLyogc2FmZSB0byBhY2Nlc3MgdGhlIG5vZGUgZGF0YSBsaXN0IHdpdGhvdXQgYSBsb2NrLCBzaW5jZSB0aGlzCiAJICogcHJvY2VzcyBpcyB0aGUgb25seSBvbmUgdG8gY2hhbmdlIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSkgewotCQluZGF0YSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobmRhdGEsICZkbG0tPnJlY28ubm9kZV9kYXRhLCBsaXN0KSB7CiAJCUJVR19PTihuZGF0YS0+c3RhdGUgIT0gRExNX1JFQ09fTk9ERV9EQVRBX0lOSVQpOwogCQluZGF0YS0+c3RhdGUgPSBETE1fUkVDT19OT0RFX0RBVEFfUkVRVUVTVElORzsKIApAQCAtNjU1LDkgKzY1MSw3IEBACiAJCSAqIGRvbmUsIG9yIGlmIGFueW9uZSBkaWVkICovCiAJCWFsbF9ub2Rlc19kb25lID0gMTsKIAkJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSkgewotCQkJbmRhdGEgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhLCBsaXN0KTsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5kYXRhLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSwgbGlzdCkgewogCQkJbWxvZygwLCAiY2hlY2tpbmcgcmVjb3Zlcnkgc3RhdGUgb2Ygbm9kZSAldVxuIiwKIAkJCSAgICAgbmRhdGEtPm5vZGVfbnVtKTsKIAkJCXN3aXRjaCAobmRhdGEtPnN0YXRlKSB7CkBAIC03NzQsMTYgKzc2OCwxNCBAQAogCiBzdGF0aWMgdm9pZCBkbG1fZGVzdHJveV9yZWNvdmVyeV9hcmVhKHN0cnVjdCBkbG1fY3R4dCAqZGxtLCB1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwotCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhOworCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhLCAqbmV4dDsKIAlMSVNUX0hFQUQodG1wbGlzdCk7CiAKIAlzcGluX2xvY2soJmRsbV9yZWNvX3N0YXRlX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJmRsbS0+cmVjby5ub2RlX2RhdGEsICZ0bXBsaXN0KTsKIAlzcGluX3VubG9jaygmZGxtX3JlY29fc3RhdGVfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZ0bXBsaXN0KSB7Ci0JCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5kYXRhLCBuZXh0LCAmdG1wbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZuZGF0YS0+bGlzdCk7CiAJCWtmcmVlKG5kYXRhKTsKIAl9CkBAIC04NzYsNyArODY4LDYgQEAKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbTsKIAlMSVNUX0hFQUQocmVzb3VyY2VzKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCWludCByZXQ7CiAJdTggZGVhZF9ub2RlLCByZWNvX21hc3RlcjsKIAlpbnQgc2tpcF9hbGxfZG9uZSA9IDA7CkBAIC05MjAsOCArOTExLDcgQEAKIAogCS8qIGFueSBlcnJvcnMgcmV0dXJuZWQgd2lsbCBiZSBkdWUgdG8gdGhlIG5ld19tYXN0ZXIgZHlpbmcsCiAJICogdGhlIGRsbV9yZWNvX3RocmVhZCBzaG91bGQgZGV0ZWN0IHRoaXMgKi8KLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZyZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQlyZXQgPSBkbG1fc2VuZF9vbmVfbG9ja3JlcyhkbG0sIHJlcywgbXJlcywgcmVjb19tYXN0ZXIsCiAJCQkJICAgCURMTV9NUkVTX1JFQ09WRVJZKTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTk4Myw3ICs5NzMsNiBAQAogewogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gZGF0YTsKIAlzdHJ1Y3QgZGxtX3JlY29fZGF0YV9kb25lICpkb25lID0gKHN0cnVjdCBkbG1fcmVjb19kYXRhX2RvbmUgKiltc2ctPmJ1ZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIApAQCAtMTAwMCw4ICs5ODksNyBAQAogCQkJZGxtLT5yZWNvLmRlYWRfbm9kZSwgZG9uZS0+bm9kZV9pZHgsIGRsbS0+bm9kZV9udW0pOwogCiAJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPnJlY28ubm9kZV9kYXRhKSB7Ci0JCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZGF0YSwgJmRsbS0+cmVjby5ub2RlX2RhdGEsIGxpc3QpIHsKIAkJaWYgKG5kYXRhLT5ub2RlX251bSAhPSBkb25lLT5ub2RlX2lkeCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xMDQ5LDEzICsxMDM3LDExIEBACiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCQkJICAgICAgIAl1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOworCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCAqbmV4dDsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAKIAlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJmRsbS0+cmVjby5yZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuZXh0LCAmZGxtLT5yZWNvLnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQkvKiBhbHdheXMgcHJ1bmUgYW55ICRSRUNPVkVSWSBlbnRyaWVzIGZvciBkZWFkIG5vZGVzLAogCQkgKiBvdGhlcndpc2UgaGFuZ3MgY2FuIG9jY3VyIGR1cmluZyBsYXRlciByZWNvdmVyeSAqLwogCQlpZiAoZGxtX2lzX3JlY292ZXJ5X2xvY2socmVzLT5sb2NrbmFtZS5uYW1lLApAQCAtMTE2OSw3ICsxMTU1LDcgQEAKIAkJCQkJdTggZmxhZ3MsIHU4IG1hc3RlcikKIHsKIAkvKiBtcmVzIGhlcmUgaXMgb25lIGZ1bGwgcGFnZSAqLwotCW1lbXNldChtcmVzLCAwLCBQQUdFX1NJWkUpOworCWNsZWFyX3BhZ2UobXJlcyk7CiAJbXJlcy0+bG9ja25hbWVfbGVuID0gbmFtZWxlbjsKIAltZW1jcHkobXJlcy0+bG9ja25hbWUsIGxvY2tuYW1lLCBuYW1lbGVuKTsKIAltcmVzLT5udW1fbG9ja3MgPSAwOwpAQCAtMTI1Miw3ICsxMjM4LDcgQEAKIAkJCSBzdHJ1Y3QgZGxtX21pZ3JhdGFibGVfbG9ja3JlcyAqbXJlcywKIAkJCSB1OCBzZW5kX3RvLCB1OCBmbGFncykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSwgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CiAJaW50IHRvdGFsX2xvY2tzLCBpOwogCXU2NCBtaWdfY29va2llID0gMDsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CkBAIC0xMjc4LDkgKzEyNjQsNyBAQAogCXRvdGFsX2xvY2tzID0gMDsKIAlmb3IgKGk9RExNX0dSQU5URURfTElTVDsgaTw9RExNX0JMT0NLRURfTElTVDsgaSsrKSB7CiAJCXF1ZXVlID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGkpOwotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkvKiBhZGQgYW5vdGhlciBsb2NrLiAqLwogCQkJdG90YWxfbG9ja3MrKzsKIAkJCWlmICghZGxtX2FkZF9sb2NrX3RvX2FycmF5KGxvY2ssIG1yZXMsIGkpKQpAQCAtMTcxNyw3ICsxNzAxLDYgQEAKIAlzdHJ1Y3QgZGxtX2xvY2tzdGF0dXMgKmxrc2IgPSBOVUxMOwogCWludCByZXQgPSAwOwogCWludCBpLCBqLCBiYWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2sgPSBOVUxMOwogCXU4IGZyb20gPSBPMk5NX01BWF9OT0RFUzsKIAl1bnNpZ25lZCBpbnQgYWRkZWQgPSAwOwpAQCAtMTc1NSw4ICsxNzM4LDcgQEAKIAkJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJCQlmb3IgKGogPSBETE1fR1JBTlRFRF9MSVNUOyBqIDw9IERMTV9CTE9DS0VEX0xJU1Q7IGorKykgewogCQkJCXRtcHEgPSBkbG1fbGlzdF9pZHhfdG9fcHRyKHJlcywgaik7Ci0JCQkJbGlzdF9mb3JfZWFjaChpdGVyLCB0bXBxKSB7Ci0JCQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgdG1wcSwgbGlzdCkgewogCQkJCQlpZiAobG9jay0+bWwuY29va2llICE9IG1sLT5jb29raWUpCiAJCQkJCQlsb2NrID0gTlVMTDsKIAkJCQkJZWxzZQpAQCAtMTkzMCw4ICsxOTEyLDggQEAKIAkJCQkgICAgICAgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcXVldWUsICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV9sb2NrICpsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlOworCXN0cnVjdCBkbG1fbG9jayAqbG9jaywgKm5leHQ7CiAKIAlyZXMtPnN0YXRlIHw9IERMTV9MT0NLX1JFU19SRUNPVkVSSU5HOwogCWlmICghbGlzdF9lbXB0eSgmcmVzLT5yZWNvdmVyaW5nKSkgewpAQCAtMTk0Nyw4ICsxOTI5LDcgQEAKIAkvKiBmaW5kIGFueSBwZW5kaW5nIGxvY2tzIGFuZCBwdXQgdGhlbSBiYWNrIG9uIHByb3BlciBsaXN0ICovCiAJZm9yIChpPURMTV9CTE9DS0VEX0xJU1Q7IGk+PURMTV9HUkFOVEVEX0xJU1Q7IGktLSkgewogCQlxdWV1ZSA9IGRsbV9saXN0X2lkeF90b19wdHIocmVzLCBpKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCBxdWV1ZSwgbGlzdCkgewogCQkJZGxtX2xvY2tfZ2V0KGxvY2spOwogCQkJaWYgKGxvY2stPmNvbnZlcnRfcGVuZGluZykgewogCQkJCS8qIG1vdmUgY29udmVydGluZyBsb2NrIGJhY2sgdG8gZ3JhbnRlZCAqLwpAQCAtMjAxMywxOCArMTk5NCwxNSBAQAogCQkJCQkgICAgICB1OCBkZWFkX25vZGUsIHU4IG5ld19tYXN0ZXIpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwogCXN0cnVjdCBobGlzdF9ub2RlICpoYXNoX2l0ZXI7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKLQotCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCAqbmV4dDsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPnNwaW5sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJmRsbS0+cmVjby5yZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuZXh0LCAmZGxtLT5yZWNvLnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQlpZiAocmVzLT5vd25lciA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJnJlcy0+cmVjb3ZlcmluZyk7CiAJCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwpAQCAtMjA5OSw3ICsyMDc3LDcgQEAKIHN0YXRpYyB2b2lkIGRsbV9yZXZhbGlkYXRlX2x2YihzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwKIAkJCSAgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICpxdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZTsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAJaW50IGJsYW5rX2x2YiA9IDAsIGxvY2FsID0gMDsKIAlpbnQgaTsKQEAgLTIxMjEsOCArMjA5OSw3IEBACiAKIAlmb3IgKGk9RExNX0dSQU5URURfTElTVDsgaTw9RExNX0NPTlZFUlRJTkdfTElTVDsgaSsrKSB7CiAJCXF1ZXVlID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGkpOwotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCBxdWV1ZSwgbGlzdCkgewogCQkJaWYgKGxvY2stPm1sLm5vZGUgPT0gc2VhcmNoX25vZGUpIHsKIAkJCQlpZiAoZGxtX2x2Yl9uZWVkc19pbnZhbGlkYXRpb24obG9jaywgbG9jYWwpKSB7CiAJCQkJCS8qIHplcm8gdGhlIGxrc2IgbHZiIGFuZCBsb2NrcmVzIGx2YiAqLwpAQCAtMjE0Myw4ICsyMTIwLDcgQEAKIHN0YXRpYyB2b2lkIGRsbV9mcmVlX2RlYWRfbG9ja3Moc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMsIHU4IGRlYWRfbm9kZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqdG1waXRlcjsKLQlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CisJc3RydWN0IGRsbV9sb2NrICpsb2NrLCAqbmV4dDsKIAl1bnNpZ25lZCBpbnQgZnJlZWQgPSAwOwogCiAJLyogdGhpcyBub2RlIGlzIHRoZSBsb2NrcmVzIG1hc3RlcjoKQEAgLTIxNTUsMjQgKzIxMzEsMjEgQEAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCiAJLyogVE9ETzogY2hlY2sgcGVuZGluZ19hc3RzLCBwZW5kaW5nX2Jhc3RzIGhlcmUgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+Z3JhbnRlZCkgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+Z3JhbnRlZCwgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwogCQkJZnJlZWQrKzsKIAkJfQogCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+Y29udmVydGluZykgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+Y29udmVydGluZywgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwogCQkJZnJlZWQrKzsKIAkJfQogCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+YmxvY2tlZCkgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+YmxvY2tlZCwgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IGQxYmQzMDUuLmY3MTI1MGUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTYwMCwxNSArNjAwLDEzIEBACiBzdGF0aWMgdm9pZCBsb2NrcmVzX3NldF9mbGFncyhzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIG5ld2ZsYWdzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcDsKLQlzdHJ1Y3Qgb2NmczJfbWFza193YWl0ZXIgKm13OworCXN0cnVjdCBvY2ZzMl9tYXNrX3dhaXRlciAqbXcsICp0bXA7CiAKICAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZsb2NrcmVzLT5sX2xvY2spOwogCiAJbG9ja3Jlcy0+bF9mbGFncyA9IG5ld2ZsYWdzOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmbG9ja3Jlcy0+bF9tYXNrX3dhaXRlcnMpIHsKLQkJbXcgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG9jZnMyX21hc2tfd2FpdGVyLCBtd19pdGVtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXcsIHRtcCwgJmxvY2tyZXMtPmxfbWFza193YWl0ZXJzLCBtd19pdGVtKSB7CiAJCWlmICgobG9ja3Jlcy0+bF9mbGFncyAmIG13LT5td19tYXNrKSAhPSBtdy0+bXdfZ29hbCkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9lbmRpYW4uaCBiL2ZzL29jZnMyL2VuZGlhbi5oCmluZGV4IGYyMjZiMjIuLmZmMjU3NjIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2VuZGlhbi5oCisrKyBiL2ZzL29jZnMyL2VuZGlhbi5oCkBAIC0zMiw2ICszMiwxMSBAQAogCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqdmFyKSArIHZhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZTY0X2FkZF9jcHUoX19sZTY0ICp2YXIsIHU2NCB2YWwpCit7CisJKnZhciA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1KCp2YXIpICsgdmFsKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGxlMzJfYW5kX2NwdShfX2xlMzIgKnZhciwgdTMyIHZhbCkKIHsKIAkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKnZhcikgJiB2YWwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXhwb3J0LmggYi9mcy9vY2ZzMi9leHBvcnQuaAppbmRleCA1Yjc3ZWU3Li5lMDhiZWQ5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHBvcnQuaAorKysgYi9mcy9vY2ZzMi9leHBvcnQuaApAQCAtMjYsNiArMjYsOCBAQAogI2lmbmRlZiBPQ0ZTMl9FWFBPUlRfSAogI2RlZmluZSBPQ0ZTMl9FWFBPUlRfSAogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KKwogZXh0ZXJuIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBvY2ZzMl9leHBvcnRfb3BzOwogCiAjZW5kaWYgLyogT0NGUzJfRVhQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwppbmRleCBiYTJiMmFiLi4wM2MxZDM2NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXh0ZW50X21hcC5jCisrKyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwpAQCAtMTA5LDE3ICsxMDksMTQgQEAKICAqLwogdm9pZCBvY2ZzMl9leHRlbnRfbWFwX3RydW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBjcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0gKmVtaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtICplbWksICpuOwogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwICplbSA9ICZvaS0+aXBfZXh0ZW50X21hcDsKIAlMSVNUX0hFQUQodG1wX2xpc3QpOwogCXVuc2lnbmVkIGludCByYW5nZTsKIAogCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmZW0tPmVtX2xpc3QpIHsKLQkJZW1pID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtLCBlaV9saXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbWksIG4sICZlbS0+ZW1fbGlzdCwgZWlfbGlzdCkgewogCQlpZiAoZW1pLT5laV9jcG9zID49IGNwb3MpIHsKIAkJCS8qIEZ1bGwgdHJ1bmNhdGUgb2YgdGhpcyByZWNvcmQuICovCiAJCQlsaXN0X21vdmUoJmVtaS0+ZWlfbGlzdCwgJnRtcF9saXN0KTsKQEAgLTEzNiw4ICsxMzMsNyBAQAogCX0KIAlzcGluX3VubG9jaygmb2ktPmlwX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0bXBfbGlzdCkgewotCQllbWkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0sIGVpX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbWksIG4sICZ0bXBfbGlzdCwgZWlfbGlzdCkgewogCQlsaXN0X2RlbCgmZW1pLT5laV9saXN0KTsKIAkJa2ZyZWUoZW1pKTsKIAl9CkBAIC0zNzcsMzcgKzM3Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGV4dGVudCByZWNvcmQgd2hpY2ggY29udGFpbnMgY2x1c3RlciAjdl9jbHVzdGVyLgotICogLTEgaXMgcmV0dXJuZWQgaWYgaXQgd2FzIG5vdCBmb3VuZC4KLSAqCi0gKiBTaG91bGQgd29yayBmaW5lIG9uIGludGVyaW9yIGFuZCBleHRlcmlvciBub2Rlcy4KLSAqLwotc3RhdGljIGludCBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3Qoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKLQkJCQkgICAgdTMyIHZfY2x1c3RlcikKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JaW50IGk7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKLQl1MzIgcmVjX2VuZCwgcmVjX3N0YXJ0LCBjbHVzdGVyczsKLQotCWZvcihpID0gMDsgaSA8IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspIHsKLQkJcmVjID0gJmVsLT5sX3JlY3NbaV07Ci0KLQkJcmVjX3N0YXJ0ID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOwotCQljbHVzdGVycyA9IG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKLQotCQlyZWNfZW5kID0gcmVjX3N0YXJ0ICsgY2x1c3RlcnM7Ci0KLQkJaWYgKHZfY2x1c3RlciA+PSByZWNfc3RhcnQgJiYgdl9jbHVzdGVyIDwgcmVjX2VuZCkgewotCQkJcmV0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQogaW50IG9jZnMyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAogCQkgICAgICAgdTMyICpwX2NsdXN0ZXIsIHUzMiAqbnVtX2NsdXN0ZXJzLAogCQkgICAgICAgdW5zaWduZWQgaW50ICpleHRlbnRfZmxhZ3MpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggNDk3OWI2Ni4uZjA0YzdhYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMjYzLDYgKzI2Myw3IEBACiAJaW50IHN0YXR1czsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCXU2NCBjbHVzdGVyX2J5dGVzOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTI4Niw3ICsyODcsOSBAQAogCS8qCiAJICogRG8gdGhpcyBiZWZvcmUgc2V0dGluZyBpX3NpemUuCiAJICovCi0Jc3RhdHVzID0gb2NmczJfemVyb190YWlsX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBuZXdfaV9zaXplKTsKKwljbHVzdGVyX2J5dGVzID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIG5ld19pX3NpemUpOworCXN0YXR1cyA9IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIG5ld19pX3NpemUsCisJCQkJCSAgICAgICBjbHVzdGVyX2J5dGVzKTsKIAlpZiAoc3RhdHVzKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtMzI2LDkgKzMyOSw2IEBACiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19pX3NpemUpOwogCi0JdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7Ci0JdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSk7Ci0KIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGRpX2JoLT5iX2RhdGE7CiAJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7CiAJCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGlub2RlLT5pX3NiLCBmZSk7CkBAIC0zNjMsMTYgKzM2MywyMyBAQAogCWlmIChuZXdfaV9zaXplID09IGxlNjRfdG9fY3B1KGZlLT5pX3NpemUpKQogCQlnb3RvIGJhaWw7CiAKKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwogCS8qIFRoaXMgZm9yY2VzIG90aGVyIG5vZGVzIHRvIHN5bmMgYW5kIGRyb3AgdGhlaXIgcGFnZXMuIERvCiAJICogdGhpcyBldmVuIGlmIHdlIGhhdmUgYSB0cnVuY2F0ZSB3aXRob3V0IGFsbG9jYXRpb24gY2hhbmdlIC0KIAkgKiBvY2ZzMiBjbHVzdGVyIHNpemVzIGNhbiBiZSBtdWNoIGdyZWF0ZXIgdGhhbiBwYWdlIHNpemUsIHNvCiAJICogd2UgaGF2ZSB0byB0cnVuY2F0ZSB0aGVtIGFueXdheS4gICovCiAJc3RhdHVzID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgeworCQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCisJdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSk7CisKIAkvKiBhbHJpZ2h0LCB3ZSdyZSBnb2luZyB0byBuZWVkIHRvIGRvIGEgZnVsbCBibG93biBhbGxvYyBzaXplCiAJICogY2hhbmdlLiBPcnBoYW4gdGhlIGlub2RlIHNvIHRoYXQgcmVjb3ZlcnkgY2FuIGNvbXBsZXRlIHRoZQogCSAqIHRydW5jYXRlIGlmIG5lY2Vzc2FyeS4gVGhpcyBkb2VzIHRoZSB0YXNrIG9mIG1hcmtpbmcKQEAgLTM5OSw2ICs0MDYsOCBAQAogYmFpbF91bmxvY2tfZGF0YToKIAlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CiAKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKIGJhaWw6CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKQEAgLTQxOSw2ICs0MjgsNyBAQAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgdTMyICpsb2dpY2FsX29mZnNldCwKIAkJCSAgICAgICB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJICAgICAgIGludCBtYXJrX3Vud3JpdHRlbiwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCkBAIC00MzEsOSArNDQxLDEzIEBACiAJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgcmVhc29uID0gUkVTVEFSVF9OT05FOwogCXUzMiBiaXRfb2ZmLCBudW1fYml0czsKIAl1NjQgYmxvY2s7CisJdTggZmxhZ3MgPSAwOwogCiAJQlVHX09OKCFjbHVzdGVyc190b19hZGQpOwogCisJaWYgKG1hcmtfdW53cml0dGVuKQorCQlmbGFncyA9IE9DRlMyX0VYVF9VTldSSVRURU47CisKIAlmcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGZlKTsKIAlpZiAoZnJlZV9leHRlbnRzIDwgMCkgewogCQlzdGF0dXMgPSBmcmVlX2V4dGVudHM7CkBAIC00ODMsNyArNDk3LDcgQEAKIAkgICAgIG51bV9iaXRzLCBiaXRfb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CiAJc3RhdHVzID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLAogCQkJCSAgICAgKmxvZ2ljYWxfb2Zmc2V0LCBibG9jaywgbnVtX2JpdHMsCi0JCQkJICAgICBtZXRhX2FjKTsKKwkJCQkgICAgIGZsYWdzLCBtZXRhX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC01MTYsMjUgKzUzMCwzMSBAQAogICogRm9yIGEgZ2l2ZW4gYWxsb2NhdGlvbiwgZGV0ZXJtaW5lIHdoaWNoIGFsbG9jYXRvcnMgd2lsbCBuZWVkIHRvIGJlCiAgKiBhY2Nlc3NlZCwgYW5kIGxvY2sgdGhlbSwgcmVzZXJ2aW5nIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYml0cy4KICAqCi0gKiBDYWxsZWQgZnJvbSBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbigpIGZvciBmaWxlIHN5c3RlbXMgd2hpY2ggZG9uJ3QKLSAqIHN1cHBvcnQgaG9sZXMsIGFuZCBmcm9tIG9jZnMyX3dyaXRlKCkgZm9yIGZpbGUgc3lzdGVtcyB3aGljaAotICogdW5kZXJzdGFuZCBzcGFyc2UgaW5vZGVzLgorICogU3BhcnNlIGZpbGUgc3lzdGVtcyBjYWxsIHRoaXMgZnJvbSBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2soKQorICogYW5kIG9jZnMyX2FsbG9jYXRlX3Vud3JpdHRlbl9leHRlbnRzKCkuCisgKgorICogRmlsZSBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBvcnQgaG9sZXMgY2FsbCB0aGlzIGZyb20KKyAqIG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKCkuCiAgKi8KIGludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYykKIHsKLQlpbnQgcmV0LCBudW1fZnJlZV9leHRlbnRzOworCWludCByZXQgPSAwLCBudW1fZnJlZV9leHRlbnRzOworCXVuc2lnbmVkIGludCBtYXhfcmVjc19uZWVkZWQgPSBjbHVzdGVyc190b19hZGQgKyAyICogZXh0ZW50c190b19zcGxpdDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAogCSptZXRhX2FjID0gTlVMTDsKLQkqZGF0YV9hYyA9IE5VTEw7CisJaWYgKGRhdGFfYWMpCisJCSpkYXRhX2FjID0gTlVMTDsKKworCUJVR19PTihjbHVzdGVyc190b19hZGQgIT0gMCAmJiBkYXRhX2FjID09IE5VTEwpOwogCiAJbWxvZygwLCAiZXh0ZW5kIGlub2RlICVsbHUsIGlfc2l6ZSA9ICVsbGQsIGRpLT5pX2NsdXN0ZXJzID0gJXUsICIKLQkgICAgICJjbHVzdGVyc190b19hZGQgPSAldVxuIiwKKwkgICAgICJjbHVzdGVyc190b19hZGQgPSAldSwgZXh0ZW50c190b19zcGxpdCA9ICV1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGlfc2l6ZV9yZWFkKGlub2RlKSwKLQkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkKTsKKwkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkLCBleHRlbnRzX3RvX3NwbGl0KTsKIAogCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGRpKTsKIAlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKQEAgLTU1Miw5ICs1NzIsMTIgQEAKIAkgKgogCSAqIE1vc3Qgb2YgdGhlIHRpbWUgd2UnbGwgb25seSBiZSBzZWVpbmcgdGhpcyAxIGNsdXN0ZXIgYXQgYSB0aW1lCiAJICogYW55d2F5LgorCSAqCisJICogQWx3YXlzIGxvY2sgZm9yIGFueSB1bndyaXR0ZW4gZXh0ZW50cyAtIHdlIG1pZ2h0IHdhbnQgdG8KKwkgKiBhZGQgYmxvY2tzIGR1cmluZyBhIHNwbGl0LgogCSAqLwogCWlmICghbnVtX2ZyZWVfZXh0ZW50cyB8fAotCSAgICAob2NmczJfc3BhcnNlX2FsbG9jKG9zYikgJiYgbnVtX2ZyZWVfZXh0ZW50cyA8IGNsdXN0ZXJzX3RvX2FkZCkpIHsKKwkgICAgKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmIG51bV9mcmVlX2V4dGVudHMgPCBtYXhfcmVjc19uZWVkZWQpKSB7CiAJCXJldCA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZGksIG1ldGFfYWMpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKHJldCAhPSAtRU5PU1BDKQpAQCAtNTYzLDYgKzU4Niw5IEBACiAJCX0KIAl9CiAKKwlpZiAoY2x1c3RlcnNfdG9fYWRkID09IDApCisJCWdvdG8gb3V0OworCiAJcmV0ID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGNsdXN0ZXJzX3RvX2FkZCwgZGF0YV9hYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJaWYgKHJldCAhPSAtRU5PU1BDKQpAQCAtNTg1LDE0ICs2MTEsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCkKK3N0YXRpYyBpbnQgX19vY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgbG9naWNhbF9zdGFydCwKKwkJCQkgICAgIHUzMiBjbHVzdGVyc190b19hZGQsIGludCBtYXJrX3Vud3JpdHRlbikKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgcmVzdGFydF9mdW5jID0gMDsKLQlpbnQgZHJvcF9hbGxvY19zZW0gPSAwOwogCWludCBjcmVkaXRzOwotCXUzMiBwcmV2X2NsdXN0ZXJzLCBsb2dpY2FsX3N0YXJ0OworCXUzMiBwcmV2X2NsdXN0ZXJzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlID0gTlVMTDsKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKQEAgLTYwNyw3ICs2MzIsNyBAQAogCSAqIFRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgZm9yIGZpbGUgc3lzdGVtcyB3aGljaCBkb24ndAogCSAqIHN1cHBvcnQgaG9sZXMuCiAJICovCi0JQlVHX09OKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKKwlCVUdfT04obWFya191bndyaXR0ZW4gJiYgIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKIAogCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCwKIAkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwpAQCAtNjIzLDE5ICs2NDgsMTAgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlsb2dpY2FsX3N0YXJ0ID0gT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzOwotCiByZXN0YXJ0X2FsbDoKIAlCVUdfT04obGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpICE9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7CiAKLQkvKiBibG9ja3MgcGVvcGUgaW4gcmVhZC93cml0ZSBmcm9tIHJlYWRpbmcgb3VyIGFsbG9jYXRpb24KLQkgKiB1bnRpbCB3ZSdyZSBkb25lIGNoYW5naW5nIGl0LiBXZSBkZXBlbmQgb24gaV9tdXRleCB0byBibG9jawotCSAqIG90aGVyIGV4dGVuZC90cnVuY2F0ZSBjYWxscyB3aGlsZSB3ZSdyZSBoZXJlLiBPcmRlcmluZyB3cnQKLQkgKiBzdGFydF90cmFucyBpcyBpbXBvcnRhbnQgaGVyZSAtLSBhbHdheXMgZG8gaXQgYmVmb3JlISAqLwotCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwotCWRyb3BfYWxsb2Nfc2VtID0gMTsKLQotCXN0YXR1cyA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZmUsIGNsdXN0ZXJzX3RvX2FkZCwgJmRhdGFfYWMsCisJc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBmZSwgY2x1c3RlcnNfdG9fYWRkLCAwLCAmZGF0YV9hYywKIAkJCQkgICAgICAgJm1ldGFfYWMpOwogCWlmIChzdGF0dXMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNjY4LDYgKzY4NCw3IEBACiAJCQkJCSAgICBpbm9kZSwKIAkJCQkJICAgICZsb2dpY2FsX3N0YXJ0LAogCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkLAorCQkJCQkgICAgbWFya191bndyaXR0ZW4sCiAJCQkJCSAgICBiaCwKIAkJCQkJICAgIGhhbmRsZSwKIAkJCQkJICAgIGRhdGFfYWMsCkBAIC03MjAsMTAgKzczNyw2IEBACiAJICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKIGxlYXZlOgotCWlmIChkcm9wX2FsbG9jX3NlbSkgewotCQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JCWRyb3BfYWxsb2Nfc2VtID0gMDsKLQl9CiAJaWYgKGhhbmRsZSkgewogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNzQ5LDYgKzc2MiwyNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGxvZ2ljYWxfc3RhcnQsCisJCQkJICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgaW50IG1hcmtfdW53cml0dGVuKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFRoZSBhbGxvYyBzZW0gYmxvY2tzIHBlb3BlIGluIHJlYWQvd3JpdGUgZnJvbSByZWFkaW5nIG91cgorCSAqIGFsbG9jYXRpb24gdW50aWwgd2UncmUgZG9uZSBjaGFuZ2luZyBpdC4gV2UgZGVwZW5kIG9uCisJICogaV9tdXRleCB0byBibG9jayBvdGhlciBleHRlbmQvdHJ1bmNhdGUgY2FsbHMgd2hpbGUgd2UncmUKKwkgKiBoZXJlLgorCSAqLworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCXJldCA9IF9fb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGxvZ2ljYWxfc3RhcnQsIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQkJbWFya191bndyaXR0ZW4pOworCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qIFNvbWUgcGFydHMgb2YgdGhpcyB0YWtlbiBmcm9tIGdlbmVyaWNfY29udF9leHBhbmQsIHdoaWNoIHR1cm5lZCBvdXQKICAqIHRvIGJlIHRvbyBmcmFnaWxlIHRvIGRvIGV4YWN0bHkgd2hhdCB3ZSBuZWVkIHdpdGhvdXQgdXMgaGF2aW5nIHRvCiAgKiB3b3JyeSBhYm91dCByZWN1cnNpdmUgbG9ja2luZyBpbiAtPnByZXBhcmVfd3JpdGUoKSBhbmQKQEAgLTg5MCw3ICs5MjIsOSBAQAogCX0KIAogCWlmIChjbHVzdGVyc190b19hZGQpIHsKLQkJcmV0ID0gb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGNsdXN0ZXJzX3RvX2FkZCk7CisJCXJldCA9IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLAorCQkJCQkgICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsCisJCQkJCSAgICAgIGNsdXN0ZXJzX3RvX2FkZCwgMCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dF91bmxvY2s7CkBAIC05OTUsNiArMTAyOSwxMyBAQAogCQlnb3RvIGJhaWxfdW5sb2NrOwogCX0KIAorCS8qCisJICogVGhpcyB3aWxsIGludGVudGlvbmFsbHkgbm90IHdpbmQgdXAgY2FsbGluZyB2bXRydW5jYXRlKCksCisJICogc2luY2UgYWxsIHRoZSB3b3JrIGZvciBhIHNpemUgY2hhbmdlIGhhcyBiZWVuIGRvbmUgYWJvdmUuCisJICogT3RoZXJ3aXNlLCB3ZSBjb3VsZCBnZXQgaW50byBwcm9ibGVtcyB3aXRoIHRydW5jYXRlIGFzCisJICogaXBfYWxsb2Nfc2VtIGlzIHVzZWQgdGhlcmUgdG8gcHJvdGVjdCBhZ2FpbnN0IGlfc2l6ZQorCSAqIGNoYW5nZXMuCisJICovCiAJc3RhdHVzID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTA3MCwxNyArMTExMSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbnQgX19vY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAKIAltbG9nX2VudHJ5KCIoSW5vZGUgJWxsdSwgbW9kZSAwJW8pXG4iLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW9pLT5pcF9ibGtubywgaW5vZGUtPmlfbW9kZSk7CisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBpbm9kZS0+aV9tb2RlKTsKIAogCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwogCWlmIChoYW5kbGUgPT0gTlVMTCkgewpAQCAtMTA4OSwxNyArMTEyOSwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgb2ktPmlwX2Jsa25vLCAmYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfdHJhbnM7Ci0JfQotCiAJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCiAJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfYmg7CisJCWdvdG8gb3V0X3RyYW5zOwogCX0KIAogCWlub2RlLT5pX21vZGUgJj0gflNfSVNVSUQ7CkBAIC0xMTEyLDggKzExNDYsNyBAQAogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKLW91dF9iaDoKLQlicmVsc2UoYmgpOworCiBvdXRfdHJhbnM6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIG91dDoKQEAgLTExNTksNiArMTE5Miw0NjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG9jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJICAgICAgIG9pLT5pcF9ibGtubywgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9ICBfX29jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKGlub2RlLCBiaCk7CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQWxsb2NhdGUgZW5vdWdoIGV4dGVudHMgdG8gY292ZXIgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBieXRlIG9mZnNldAorICogc3RhcnQgZm9yIGxlbiBieXRlcy4gRXhpc3RpbmcgZXh0ZW50cyBhcmUgc2tpcHBlZCwgYW55IGV4dGVudHMKKyAqIGFkZGVkIGFyZSBtYXJrZWQgYXMgInVud3JpdHRlbiIuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlpbnQgcmV0OworCXUzMiBjcG9zLCBwaHlzX2Nwb3MsIGNsdXN0ZXJzLCBhbGxvY19zaXplOworCisJLyoKKwkgKiBXZSBjb25zaWRlciBib3RoIHN0YXJ0IGFuZCBsZW4gdG8gYmUgaW5jbHVzaXZlLgorCSAqLworCWNwb3MgPSBzdGFydCA+PiBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemVfYml0czsKKwljbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgc3RhcnQgKyBsZW4pOworCWNsdXN0ZXJzIC09IGNwb3M7CisKKwl3aGlsZSAoY2x1c3RlcnMpIHsKKwkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAorCQkJCQkgJmFsbG9jX3NpemUsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIEhvbGUgb3IgZXhpc3RpbmcgZXh0ZW50IGxlbiBjYW4gYmUgYXJiaXRyYXJ5LCBzbworCQkgKiBjYXAgaXQgdG8gb3VyIG93biBhbGxvY2F0aW9uIHJlcXVlc3QuCisJCSAqLworCQlpZiAoYWxsb2Nfc2l6ZSA+IGNsdXN0ZXJzKQorCQkJYWxsb2Nfc2l6ZSA9IGNsdXN0ZXJzOworCisJCWlmIChwaHlzX2Nwb3MpIHsKKwkJCS8qCisJCQkgKiBXZSBhbHJlYWR5IGhhdmUgYW4gYWxsb2NhdGlvbiBhdCB0aGlzCisJCQkgKiByZWdpb24gc28gd2UgY2FuIHNhZmVseSBza2lwIGl0LgorCQkJICovCisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlyZXQgPSBfX29jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLCBjcG9zLCBhbGxvY19zaXplLCAxKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHJldCAhPSAtRU5PU1BDKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKK25leHQ6CisJCWNwb3MgKz0gYWxsb2Nfc2l6ZTsKKwkJY2x1c3RlcnMgLT0gYWxsb2Nfc2l6ZTsKKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgICAgIHUzMiBjcG9zLCB1MzIgcGh5c19jcG9zLCB1MzIgbGVuLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQ7CisJdTY0IHBoeXNfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXNfY3Bvcyk7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBkaSwgMCwgMSwgTlVMTCwgJm1ldGFfYWMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2gob3NiKSkgeworCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCBkaV9iaCwgY3BvcywgbGVuLCBoYW5kbGUsIG1ldGFfYWMsCisJCQkJICBkZWFsbG9jKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyAtPSBsZW47CisJZGktPmlfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXJldCA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsIHBoeXNfYmxrbm8sIGxlbik7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRydW5jYXRlIGEgYnl0ZSByYW5nZSwgYXZvaWRpbmcgcGFnZXMgd2l0aGluIHBhcnRpYWwgY2x1c3RlcnMuIFRoaXMKKyAqIHByZXNlcnZlcyB0aG9zZSBwYWdlcyBmb3IgdGhlIHplcm9pbmcgY29kZSB0byB3cml0ZSB0by4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfdHJ1bmNhdGVfY2x1c3Rlcl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYnl0ZV9zdGFydCwKKwkJCQkJIHU2NCBieXRlX2xlbikKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlsb2ZmX3Qgc3RhcnQsIGVuZDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwlzdGFydCA9IChsb2ZmX3Qpb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIGJ5dGVfc3RhcnQpOworCWVuZCA9IGJ5dGVfc3RhcnQgKyBieXRlX2xlbjsKKwllbmQgPSBlbmQgJiB+KG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpOworCisJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCAtIHN0YXJ0LCAwKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCAtIDEpOworCX0KK30KKworc3RhdGljIGludCBvY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCWludCByZXQgPSAwOworCXU2NCB0bXBlbmQsIGVuZCA9IHN0YXJ0ICsgbGVuOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXVuc2lnbmVkIGludCBjc2l6ZSA9IG9zYi0+c19jbHVzdGVyc2l6ZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJLyoKKwkgKiBUaGUgInN0YXJ0IiBhbmQgImVuZCIgdmFsdWVzIGFyZSBOT1QgbmVjZXNzYXJpbHkgcGFydCBvZgorCSAqIHRoZSByYW5nZSB3aG9zZSBhbGxvY2F0aW9uIGlzIGJlaW5nIGRlbGV0ZWQuIFJhdGhlciwgdGhpcworCSAqIGlzIHdoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHdpdGggdGhlIHJlcXVlc3QuIFdlIG11c3QgemVybworCSAqIHBhcnRpYWwgY2x1c3RlcnMgaGVyZS4gVGhlcmUncyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0CisJICogcGh5c2ljYWwgYWxsb2NhdGlvbiAtIHRoZSB6ZXJvaW5nIGNvZGUga25vd3MgdG8gc2tpcCBob2xlcy4KKwkgKi8KKwltbG9nKDAsICJieXRlIHN0YXJ0OiAlbGx1LCBlbmQ6ICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKWVuZCk7CisKKwkvKgorCSAqIElmIGJvdGggZWRnZXMgYXJlIG9uIGEgY2x1c3RlciBib3VuZGFyeSB0aGVuIHRoZXJlJ3Mgbm8KKwkgKiB6ZXJvaW5nIHJlcXVpcmVkIGFzIHRoZSByZWdpb24gaXMgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiB0bworCSAqIGJlIHRydW5jYXRlZC4KKwkgKi8KKwlpZiAoKHN0YXJ0ICYgKGNzaXplIC0gMSkpID09IDAgJiYgKGVuZCAmIChjc2l6ZSAtIDEpKSA9PSAwKQorCQlnb3RvIG91dDsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2Ugd2FudCB0byBnZXQgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIDFzdCBjbHVzdGVyLgorCSAqLworCXRtcGVuZCA9ICh1NjQpb3NiLT5zX2NsdXN0ZXJzaXplICsgKHN0YXJ0ICYgfihvc2ItPnNfY2x1c3RlcnNpemUgLSAxKSk7CisJaWYgKHRtcGVuZCA+IGVuZCkKKwkJdG1wZW5kID0gZW5kOworCisJbWxvZygwLCAiMXN0IHJhbmdlOiBzdGFydDogJWxsdSwgdG1wZW5kOiAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBlbmQpOworCisJcmV0ID0gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgc3RhcnQsIHRtcGVuZCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJaWYgKHRtcGVuZCA8IGVuZCkgeworCQkvKgorCQkgKiBUaGlzIG1heSBtYWtlIHN0YXJ0IGFuZCBlbmQgZXF1YWwsIGJ1dCB0aGUgemVyb2luZworCQkgKiBjb2RlIHdpbGwgc2tpcCBhbnkgd29yayBpbiB0aGF0IGNhc2Ugc28gdGhlcmUncyBubworCQkgKiBuZWVkIHRvIGNhdGNoIGl0IHVwIGhlcmUuCisJCSAqLworCQlzdGFydCA9IGVuZCAmIH4ob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSk7CisKKwkJbWxvZygwLCAiMm5kIHJhbmdlOiBzdGFydDogJWxsdSwgZW5kOiAlbGx1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpZW5kKTsKKworCQlyZXQgPSBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBzdGFydCwgZW5kKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIHU2NCBieXRlX3N0YXJ0LAorCQkJCSAgICB1NjQgYnl0ZV9sZW4pCit7CisJaW50IHJldCA9IDA7CisJdTMyIHRydW5jX3N0YXJ0LCB0cnVuY19sZW4sIGNwb3MsIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmRlYWxsb2MpOworCisJaWYgKGJ5dGVfbGVuID09IDApCisJCXJldHVybiAwOworCisJdHJ1bmNfc3RhcnQgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMob3NiLT5zYiwgYnl0ZV9zdGFydCk7CisJdHJ1bmNfbGVuID0gKGJ5dGVfc3RhcnQgKyBieXRlX2xlbikgPj4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHM7CisJaWYgKHRydW5jX2xlbiA+PSB0cnVuY19zdGFydCkKKwkJdHJ1bmNfbGVuIC09IHRydW5jX3N0YXJ0OworCWVsc2UKKwkJdHJ1bmNfbGVuID0gMDsKKworCW1sb2coMCwgIklub2RlOiAlbGx1LCBzdGFydDogJWxsdSwgbGVuOiAlbGx1LCBjc3RhcnQ6ICV1LCBjbGVuOiAldVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX3N0YXJ0LAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX2xlbiwgdHJ1bmNfc3RhcnQsIHRydW5jX2xlbik7CisKKwlyZXQgPSBvY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnMoaW5vZGUsIGJ5dGVfc3RhcnQsIGJ5dGVfbGVuKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJY3BvcyA9IHRydW5jX3N0YXJ0OworCXdoaWxlICh0cnVuY19sZW4pIHsKKwkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAorCQkJCQkgJmFsbG9jX3NpemUsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChhbGxvY19zaXplID4gdHJ1bmNfbGVuKQorCQkJYWxsb2Nfc2l6ZSA9IHRydW5jX2xlbjsKKworCQkvKiBPbmx5IGRvIHdvcmsgZm9yIG5vbi1ob2xlcyAqLworCQlpZiAocGh5c19jcG9zICE9IDApIHsKKwkJCXJldCA9IF9fb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKGlub2RlLCBkaV9iaCwgY3BvcywKKwkJCQkJCQkgcGh5c19jcG9zLCBhbGxvY19zaXplLAorCQkJCQkJCSAmZGVhbGxvYyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJY3BvcyArPSBhbGxvY19zaXplOworCQl0cnVuY19sZW4gLT0gYWxsb2Nfc2l6ZTsKKwl9CisKKwlvY2ZzMl90cnVuY2F0ZV9jbHVzdGVyX3BhZ2VzKGlub2RlLCBieXRlX3N0YXJ0LCBieXRlX2xlbik7CisKK291dDoKKwlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmZGVhbGxvYyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGFydHMgb2YgdGhpcyBmdW5jdGlvbiB0YWtlbiBmcm9tIHhmc19jaGFuZ2VfZmlsZV9zcGFjZSgpCisgKi8KK2ludCBvY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiAqc3IpCit7CisJaW50IHJldDsKKwlzNjQgbGxlbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfb2ZmID0gb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWlmICgoY21kID09IE9DRlMyX0lPQ19SRVNWU1AgfHwgY21kID09IE9DRlMyX0lPQ19SRVNWU1A2NCkgJiYKKwkgICAgIW9jZnMyX3dyaXRlc191bndyaXR0ZW5fZXh0ZW50cyhvc2IpKQorCQlyZXR1cm4gLUVOT1RUWTsKKwllbHNlIGlmICgoY21kID09IE9DRlMyX0lPQ19VTlJFU1ZTUCB8fCBjbWQgPT0gT0NGUzJfSU9DX1VOUkVTVlNQNjQpICYmCisJCSAhb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKworCWlmIChvY2ZzMl9pc19oYXJkX3JlYWRvbmx5KG9zYikgfHwgb2NmczJfaXNfc29mdF9yZWFkb25seShvc2IpKQorCQlyZXR1cm4gLUVST0ZTOworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJLyoKKwkgKiBUaGlzIHByZXZlbnRzIGNvbmN1cnJlbnQgd3JpdGVzIG9uIG90aGVyIG5vZGVzCisJICovCisJcmV0ID0gb2NmczJfcndfbG9jayhpbm9kZSwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfcndfdW5sb2NrOworCX0KKworCWlmIChpbm9kZS0+aV9mbGFncyAmIChTX0lNTVVUQUJMRXxTX0FQUEVORCkpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlzd2l0Y2ggKHNyLT5sX3doZW5jZSkgeworCWNhc2UgMDogLypTRUVLX1NFVCovCisJCWJyZWFrOworCWNhc2UgMTogLypTRUVLX0NVUiovCisJCXNyLT5sX3N0YXJ0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6IC8qU0VFS19FTkQqLworCQlzci0+bF9zdGFydCArPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKwlzci0+bF93aGVuY2UgPSAwOworCisJbGxlbiA9IHNyLT5sX2xlbiA+IDAgPyBzci0+bF9sZW4gLSAxIDogc3ItPmxfbGVuOworCisJaWYgKHNyLT5sX3N0YXJ0IDwgMAorCSAgICB8fCBzci0+bF9zdGFydCA+IG1heF9vZmYKKwkgICAgfHwgKHNyLT5sX3N0YXJ0ICsgbGxlbikgPCAwCisJICAgIHx8IChzci0+bF9zdGFydCArIGxsZW4pID4gbWF4X29mZikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlpZiAoY21kID09IE9DRlMyX0lPQ19SRVNWU1AgfHwgY21kID09IE9DRlMyX0lPQ19SRVNWU1A2NCkgeworCQlpZiAoc3ItPmxfbGVuIDw9IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwkJfQorCX0KKworCWlmIChzaG91bGRfcmVtb3ZlX3N1aWQoZmlsZS0+Zl9wYXRoLmRlbnRyeSkpIHsKKwkJcmV0ID0gX19vY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChpbm9kZSwgZGlfYmgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwkJfQorCX0KKworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDY0OgorCQkvKgorCQkgKiBUaGlzIHRha2VzIHVuc2lnbmVkIG9mZnNldHMsIGJ1dCB0aGUgc2lnbmVkIG9uZXMgd2UKKwkJICogcGFzcyBoYXZlIGJlZW4gY2hlY2tlZCBhZ2FpbnN0IG92ZXJmbG93IGFib3ZlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoaW5vZGUsIHNyLT5sX3N0YXJ0LAorCQkJCQkJICAgICAgIHNyLT5sX2xlbik7CisJCWJyZWFrOworCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQNjQ6CisJCXJldCA9IG9jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShpbm9kZSwgZGlfYmgsIHNyLT5sX3N0YXJ0LAorCQkJCQkgICAgICAgc3ItPmxfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwkvKgorCSAqIFdlIHVwZGF0ZSBjL210aW1lIGZvciB0aGVzZSBjaGFuZ2VzCisJICovCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCXJldCA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSwgZGlfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXRfbWV0YV91bmxvY2s6CisJYnJlbHNlKGRpX2JoKTsKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CitvdXRfcndfdW5sb2NrOgorCW9jZnMyX3J3X3VubG9jayhpbm9kZSwgMSk7CisKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfaW5vZGVfZm9yX3dyaXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJIGxvZmZfdCAqcHBvcywKIAkJCQkJIHNpemVfdCBjb3VudCwKQEAgLTEzMjksMTUgKzE4MTYsMTYgQEAKIAkqYmFzZXAgPSBiYXNlOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKiBvY2ZzMl9nZXRfd3JpdGVfc291cmNlKHN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2ICpicCwKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqIG9jZnMyX2dldF93cml0ZV9zb3VyY2UoY2hhciAqKnJldF9zcmNfYnVmLAogCQkJCQkgICAgY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92LAogCQkJCQkgICAgc2l6ZV90IGlvdl9vZmZzZXQpCiB7CiAJaW50IHJldDsKLQljaGFyICpidWY7CisJY2hhciAqYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBpb3Zfb2Zmc2V0OwogCXN0cnVjdCBwYWdlICpzcmNfcGFnZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBvZmY7CiAKLQlidWYgPSBjdXJfaW92LT5pb3ZfYmFzZSArIGlvdl9vZmZzZXQ7CisJb2ZmID0gKHVuc2lnbmVkIGxvbmcpKGJ1ZikgJiB+UEFHRV9DQUNIRV9NQVNLOwogCiAJaWYgKCFzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSB7CiAJCS8qCkBAIC0xMzQ5LDE4ICsxODM3LDE3IEBACiAJCQkJICAgICAodW5zaWduZWQgbG9uZylidWYgJiBQQUdFX0NBQ0hFX01BU0ssIDEsCiAJCQkJICAgICAwLCAwLCAmc3JjX3BhZ2UsIE5VTEwpOwogCQlpZiAocmV0ID09IDEpCi0JCQlicC0+Yl9zcmNfYnVmID0ga21hcChzcmNfcGFnZSk7CisJCQkqcmV0X3NyY19idWYgPSBrbWFwKHNyY19wYWdlKSArIG9mZjsKIAkJZWxzZQogCQkJc3JjX3BhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpOwogCX0gZWxzZSB7Ci0JCWJwLT5iX3NyY19idWYgPSBidWY7CisJCSpyZXRfc3JjX2J1ZiA9IGJ1ZjsKIAl9CiAKIAlyZXR1cm4gc3JjX3BhZ2U7CiB9CiAKLXN0YXRpYyB2b2lkIG9jZnMyX3B1dF93cml0ZV9zb3VyY2Uoc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgKmJwLAotCQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgb2NmczJfcHV0X3dyaXRlX3NvdXJjZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAocGFnZSkgewogCQlrdW5tYXAocGFnZSk7CkBAIC0xMzc2LDEwICsxODYzLDEyIEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3NpemVfdCBjb3BpZWQsIHRvdGFsID0gMDsKLQlzaXplX3QgaW92X29mZnNldCA9IDA7CisJc2l6ZV90IGlvdl9vZmZzZXQgPSAwLCBieXRlczsKKwlsb2ZmX3QgcG9zOwogCWNvbnN0IHN0cnVjdCBpb3ZlYyAqY3VyX2lvdiA9IGlvdjsKLQlzdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiBicDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqdXNlcl9wYWdlLCAqcGFnZTsKKwljaGFyICpidWYsICpkc3Q7CisJdm9pZCAqZnNkYXRhOwogCiAJLyoKIAkgKiBoYW5kbGUgcGFydGlhbCBESU8gd3JpdGUuICBBZGp1c3QgY3VyX2lvdiBpZiBuZWVkZWQuCkBAIC0xMzg3LDIxICsxODc2LDM4IEBACiAJb2NmczJfc2V0X25leHRfaW92ZWMoJmN1cl9pb3YsICZpb3Zfb2Zmc2V0LCBvX2RpcmVjdF93cml0dGVuKTsKIAogCWRvIHsKLQkJYnAuYl9jdXJfb2ZmID0gaW92X29mZnNldDsKLQkJYnAuYl9jdXJfaW92ID0gY3VyX2lvdjsKKwkJcG9zID0gKnBwb3M7CiAKLQkJcGFnZSA9IG9jZnMyX2dldF93cml0ZV9zb3VyY2UoJmJwLCBjdXJfaW92LCBpb3Zfb2Zmc2V0KTsKLQkJaWYgKElTX0VSUihwYWdlKSkgewotCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJdXNlcl9wYWdlID0gb2NmczJfZ2V0X3dyaXRlX3NvdXJjZSgmYnVmLCBjdXJfaW92LCBpb3Zfb2Zmc2V0KTsKKwkJaWYgKElTX0VSUih1c2VyX3BhZ2UpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHVzZXJfcGFnZSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWNvcGllZCA9IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoZmlsZSwgKnBwb3MsIGNvdW50LAotCQkJCQkJICAgICAgb2NmczJfbWFwX2FuZF93cml0ZV91c2VyX2RhdGEsCi0JCQkJCQkgICAgICAmYnApOworCQkvKiBTdGF5IHdpdGhpbiBvdXIgcGFnZSBib3VuZGFyaWVzICovCisJCWJ5dGVzID0gbWluKChQQUdFX0NBQ0hFX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpcG9zICYgflBBR0VfQ0FDSEVfTUFTSykpLAorCQkJICAgIChQQUdFX0NBQ0hFX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpYnVmICYgflBBR0VfQ0FDSEVfTUFTSykpKTsKKwkJLyogU3RheSB3aXRoaW4gdGhlIHZlY3RvciBib3VuZGFyeSAqLworCQlieXRlcyA9IG1pbl90KHNpemVfdCwgYnl0ZXMsIGN1cl9pb3YtPmlvdl9sZW4gLSBpb3Zfb2Zmc2V0KTsKKwkJLyogU3RheSB3aXRoaW4gY291bnQgKi8KKwkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGNvdW50KTsKIAotCQlvY2ZzMl9wdXRfd3JpdGVfc291cmNlKCZicCwgcGFnZSk7CisJCXBhZ2UgPSBOVUxMOworCQlyZXQgPSBvY2ZzMl93cml0ZV9iZWdpbihmaWxlLCBmaWxlLT5mX21hcHBpbmcsIHBvcywgYnl0ZXMsIDAsCisJCQkJCSZwYWdlLCAmZnNkYXRhKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KIAorCQlkc3QgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbWNweShkc3QgKyAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSwgYnVmLCBieXRlcyk7CisJCWt1bm1hcF9hdG9taWMoZHN0LCBLTV9VU0VSMCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlvY2ZzMl9wdXRfd3JpdGVfc291cmNlKHVzZXJfcGFnZSk7CisKKwkJY29waWVkID0gb2NmczJfd3JpdGVfZW5kKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgcG9zLCBieXRlcywKKwkJCQkJIGJ5dGVzLCBwYWdlLCBmc2RhdGEpOwogCQlpZiAoY29waWVkIDwgMCkgewogCQkJbWxvZ19lcnJubyhjb3BpZWQpOwogCQkJcmV0ID0gY29waWVkOwpAQCAtMTQwOSw3ICsxOTE1LDcgQEAKIAkJfQogCiAJCXRvdGFsICs9IGNvcGllZDsKLQkJKnBwb3MgPSAqcHBvcyArIGNvcGllZDsKKwkJKnBwb3MgPSBwb3MgKyBjb3BpZWQ7CiAJCWNvdW50IC09IGNvcGllZDsKIAogCQlvY2ZzMl9zZXRfbmV4dF9pb3ZlYygmY3VyX2lvdiwgJmlvdl9vZmZzZXQsIGNvcGllZCk7CkBAIC0xNTc5LDUyICsyMDg1LDQ2IEBACiAJCQkJICAgIHN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmLAogCQkJCSAgICBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKnNkKQogewotCWludCByZXQsIGNvdW50LCB0b3RhbCA9IDA7CisJaW50IHJldCwgY291bnQ7CiAJc3NpemVfdCBjb3BpZWQgPSAwOwotCXN0cnVjdCBvY2ZzMl9zcGxpY2Vfd3JpdGVfcHJpdiBzcDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNkLT51LmZpbGU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJdm9pZCAqZnNkYXRhOworCWNoYXIgKnNyYywgKmRzdDsKIAogCXJldCA9IGJ1Zi0+b3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlzcC5zX3NkID0gc2Q7Ci0Jc3Auc19idWYgPSBidWY7Ci0Jc3Auc19waXBlID0gcGlwZTsKLQlzcC5zX29mZnNldCA9IHNkLT5wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwotCXNwLnNfYnVmX29mZnNldCA9IGJ1Zi0+b2Zmc2V0OwotCisJb2Zmc2V0ID0gc2QtPnBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJY291bnQgPSBzZC0+bGVuOwotCWlmIChjb3VudCArIHNwLnNfb2Zmc2V0ID4gUEFHRV9DQUNIRV9TSVpFKQotCQljb3VudCA9IFBBR0VfQ0FDSEVfU0laRSAtIHNwLnNfb2Zmc2V0OworCWlmIChjb3VudCArIG9mZnNldCA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJY291bnQgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CiAKLQlkbyB7Ci0JCS8qCi0JCSAqIHNwbGljZSB3YW50cyB1cyB0byBjb3B5IHVwIHRvIG9uZSBwYWdlIGF0IGEKLQkJICogdGltZS4gRm9yIHBhZ2VzaXplID4gY2x1c3RlciBzaXplLCB0aGlzIG1lYW5zIHdlCi0JCSAqIG1pZ2h0IGVudGVyIG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoKSBtb3JlCi0JCSAqIHRoYW4gb25jZSwgc28ga2VlcCB0cmFjayBvZiBvdXIgcHJvZ3Jlc3MgaGVyZS4KLQkJICovCi0JCWNvcGllZCA9IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoc2QtPnUuZmlsZSwKLQkJCQkJCSAgICAgIChsb2ZmX3Qpc2QtPnBvcyArIHRvdGFsLAotCQkJCQkJICAgICAgY291bnQsCi0JCQkJCQkgICAgICBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhLAotCQkJCQkJICAgICAgJnNwKTsKLQkJaWYgKGNvcGllZCA8IDApIHsKLQkJCW1sb2dfZXJybm8oY29waWVkKTsKLQkJCXJldCA9IGNvcGllZDsKLQkJCWdvdG8gb3V0OwotCQl9CisJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW4oZmlsZSwgZmlsZS0+Zl9tYXBwaW5nLCBzZC0+cG9zLCBjb3VudCwgMCwKKwkJCQkmcGFnZSwgJmZzZGF0YSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KIAotCQljb3VudCAtPSBjb3BpZWQ7Ci0JCXNwLnNfb2Zmc2V0ICs9IGNvcGllZDsKLQkJc3Auc19idWZfb2Zmc2V0ICs9IGNvcGllZDsKLQkJdG90YWwgKz0gY29waWVkOwotCX0gd2hpbGUgKGNvdW50KTsKKwlzcmMgPSBidWYtPm9wcy0+bWFwKHBpcGUsIGJ1ZiwgMSk7CisJZHN0ID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOworCW1lbWNweShkc3QgKyBvZmZzZXQsIHNyYyArIGJ1Zi0+b2Zmc2V0LCBjb3VudCk7CisJa3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CisJYnVmLT5vcHMtPnVubWFwKHBpcGUsIGJ1Ziwgc3JjKTsKIAotCXJldCA9IDA7CisJY29waWVkID0gb2NmczJfd3JpdGVfZW5kKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgc2QtPnBvcywgY291bnQsIGNvdW50LAorCQkJCSBwYWdlLCBmc2RhdGEpOworCWlmIChjb3BpZWQgPCAwKSB7CisJCW1sb2dfZXJybm8oY29waWVkKTsKKwkJcmV0ID0gY29waWVkOworCQlnb3RvIG91dDsKKwl9CiBvdXQ6CiAKLQlyZXR1cm4gdG90YWwgPyB0b3RhbCA6IHJldDsKKwlyZXR1cm4gY29waWVkID8gY29waWVkIDogcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBfX29jZnMyX2ZpbGVfc3BsaWNlX3dyaXRlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmggYi9mcy9vY2ZzMi9maWxlLmgKaW5kZXggYTRkZDFmYS4uMzZmZTI3ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5oCisrKyBiL2ZzL29jZnMyL2ZpbGUuaApAQCAtMzksMTUgKzM5LDE2IEBACiB9OwogaW50IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICAgdTMyICpjbHVzdGVyX3N0YXJ0LAorCQkJICAgICAgIHUzMiAqbG9naWNhbF9vZmZzZXQsCiAJCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSAgICAgICBpbnQgbWFya191bndyaXR0ZW4sCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAotCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb24pOworCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KTsKIGludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYyk7CiBpbnQgb2NmczJfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CkBAIC02MSw0ICs2Miw3IEBACiBpbnQgb2NmczJfdXBkYXRlX2lub2RlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCitpbnQgb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2Uoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YgKnNyKTsKKwogI2VuZGlmIC8qIE9DRlMyX0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9oZWFydGJlYXQuYwppbmRleCBiMjVlZjYzLi4zNTJlYjRhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9oZWFydGJlYXQuYworKysgYi9mcy9vY2ZzMi9oZWFydGJlYXQuYwpAQCAtMTU3LDE2ICsxNTcsMTYgQEAKIAlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKIAkJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl9kb3duKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl91cCk7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfdXApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKKwkJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl9kb3duKTsKIAl9CiAKIGJhaWw6CkBAIC0xNzgsOCArMTc4LDggQEAKIAlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKIAkJcmV0dXJuOwogCi0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX3VwKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2sob3NiLT51dWlkX3N0ciwgJm9zYi0+b3NiX2hiX2Rvd24pOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfdXApOwogfQogCiB2b2lkIG9jZnMyX3N0b3BfaGVhcnRiZWF0KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW9jdGwuYyBiL2ZzL29jZnMyL2lvY3RsLmMKaW5kZXggZjNhZDIxYS4uYmQ2OGMzZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW9jdGwuYworKysgYi9mcy9vY2ZzMi9pb2N0bC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAib2NmczIuaCIKICNpbmNsdWRlICJhbGxvYy5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKKyNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJqb3VybmFsLmgiCiAKQEAgLTExNSw2ICsxMTYsNyBAQAogewogCXVuc2lnbmVkIGludCBmbGFnczsKIAlpbnQgc3RhdHVzOworCXN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2IHNyOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9DRlMyX0lPQ19HRVRGTEFHUzoKQEAgLTEzMCw2ICsxMzIsMTQgQEAKIAogCQlyZXR1cm4gb2NmczJfc2V0X2lub2RlX2F0dHIoaW5vZGUsIGZsYWdzLAogCQkJT0NGUzJfRkxfTU9ESUZJQUJMRSk7CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDY0OgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQNjQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3IsIChpbnQgX191c2VyICopIGFyZywgc2l6ZW9mKHNyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2UoZmlscCwgY21kLCAmc3IpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PVFRZOwogCX0KQEAgLTE0OCw2ICsxNTgsMTEgQEAKIAljYXNlIE9DRlMyX0lPQzMyX1NFVEZMQUdTOgogCQljbWQgPSBPQ0ZTMl9JT0NfU0VURkxBR1M7CiAJCWJyZWFrOworCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A2NDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDY0OgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCBkYzExODgwLi5kYmZiMjBiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC03MjIsOCArNzIyLDcgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvY2ZzMl9qb3VybmFsLCBqX3JlY292ZXJ5X3dvcmspOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gam91cm5hbC0+al9vc2I7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbGFfZGlub2RlLCAqdGxfZGlub2RlOwotCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtLCAqbjsKIAlMSVNUX0hFQUQodG1wX2xhX2xpc3QpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CkBAIC03MzQsOCArNzMzLDcgQEAKIAlsaXN0X3NwbGljZV9pbml0KCZqb3VybmFsLT5qX2xhX2NsZWFudXBzLCAmdG1wX2xhX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0bXBfbGFfbGlzdCkgewotCQlpdGVtID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfbGFfcmVjb3ZlcnlfaXRlbSwgbHJpX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVtLCBuLCAmdG1wX2xhX2xpc3QsIGxyaV9saXN0KSB7CiAJCWxpc3RfZGVsX2luaXQoJml0ZW0tPmxyaV9saXN0KTsKIAogCQltbG9nKDAsICJDb21wbGV0ZSByZWNvdmVyeSBmb3Igc2xvdCAlZFxuIiwgaXRlbS0+bHJpX3Nsb3QpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5oIGIvZnMvb2NmczIvam91cm5hbC5oCmluZGV4IDNkYjVkZTQuLmNlNjBhYWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuaAorKysgYi9mcy9vY2ZzMi9qb3VybmFsLmgKQEAgLTI4OSw2ICsyODksOCBAQAogI2RlZmluZSBPQ0ZTMl9UUlVOQ0FURV9MT0dfRkxVU0hfT05FX1JFQyAoT0NGUzJfU1VCQUxMT0NfRlJFRSAJCSAgICAgIFwKIAkJCQkJICsgT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSkKIAorI2RlZmluZSBPQ0ZTMl9SRU1PVkVfRVhURU5UX0NSRURJVFMgKE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUgKyBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUykKKwogLyogZGF0YSBibG9jayBmb3IgbmV3IGRpci9zeW1saW5rLCAyIGZvciBiaXRtYXAgdXBkYXRlcyAoYml0bWFwIGZlICsKICAqIGJpdG1hcCBibG9jayBmb3IgdGhlIG5ldyBiaXQpICovCiAjZGVmaW5lIE9DRlMyX0RJUl9MSU5LX0FERElUSU9OQUxfQ1JFRElUUyAoMSArIDIpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9tbWFwLmMgYi9mcy9vY2ZzMi9tbWFwLmMKaW5kZXggYWYwMTE1OC4uZDc5YWExMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbW1hcC5jCisrKyBiL2ZzL29jZnMyL21tYXAuYwpAQCAtMzcsMTEgKzM3LDI5IEBACiAKICNpbmNsdWRlICJvY2ZzMi5oIgogCisjaW5jbHVkZSAiYW9wcy5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJtbWFwLmgiCiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3ZtX29wX2Jsb2NrX3NpZ3Moc2lnc2V0X3QgKmJsb2NrZWQsIHNpZ3NldF90ICpvbGRzZXQpCit7CisJLyogVGhlIGJlc3Qgd2F5IHRvIGRlYWwgd2l0aCBzaWduYWxzIGluIHRoZSB2bSBwYXRoIGlzCisJICogdG8gYmxvY2sgdGhlbSB1cGZyb250LCByYXRoZXIgdGhhbiBhbGxvd2luZyB0aGUKKwkgKiBsb2NraW5nIHBhdGhzIHRvIHJldHVybiAtRVJFU1RBUlRTWVMuICovCisJc2lnZmlsbHNldChibG9ja2VkKTsKKworCS8qIFdlIHNob3VsZCB0ZWNobmljYWxseSBuZXZlciBnZXQgYSBiYWQgcmV0dXJuIHZhbHVlCisJICogZnJvbSBzaWdwcm9jbWFzayAqLworCXJldHVybiBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssIGJsb2NrZWQsIG9sZHNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3ZtX29wX3VuYmxvY2tfc2lncyhzaWdzZXRfdCAqb2xkc2V0KQoreworCXJldHVybiBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgb2xkc2V0LCBOVUxMKTsKK30KKwogc3RhdGljIHN0cnVjdCBwYWdlICpvY2ZzMl9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJCSBpbnQgKnR5cGUpCkBAIC01MywxNCArNzEsNyBAQAogCW1sb2dfZW50cnkoIihhcmVhPSVwLCBhZGRyZXNzPSVsdSwgdHlwZT0lcClcbiIsIGFyZWEsIGFkZHJlc3MsCiAJCSAgIHR5cGUpOwogCi0JLyogVGhlIGJlc3Qgd2F5IHRvIGRlYWwgd2l0aCBzaWduYWxzIGluIHRoaXMgcGF0aCBpcwotCSAqIHRvIGJsb2NrIHRoZW0gdXBmcm9udCwgcmF0aGVyIHRoYW4gYWxsb3dpbmcgdGhlCi0JICogbG9ja2luZyBwYXRocyB0byByZXR1cm4gLUVSRVNUQVJUU1lTLiAqLwotCXNpZ2ZpbGxzZXQoJmJsb2NrZWQpOwotCi0JLyogV2Ugc2hvdWxkIHRlY2huaWNhbGx5IG5ldmVyIGdldCBhIGJhZCByZXQgcmV0dXJuCi0JICogZnJvbSBzaWdwcm9jbWFzayAqLwotCXJldCA9IHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmJsb2NrZWQsICZvbGRzZXQpOworCXJldCA9IG9jZnMyX3ZtX29wX2Jsb2NrX3NpZ3MoJmJsb2NrZWQsICZvbGRzZXQpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC02OCw3ICs3OSw3IEBACiAKIAlwYWdlID0gZmlsZW1hcF9ub3BhZ2UoYXJlYSwgYWRkcmVzcywgdHlwZSk7CiAKLQlyZXQgPSBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJcmV0ID0gb2NmczJfdm1fb3BfdW5ibG9ja19zaWdzKCZvbGRzZXQpOwogCWlmIChyZXQgPCAwKQogCQltbG9nX2Vycm5vKHJldCk7CiBvdXQ6CkBAIC03NiwyNyArODcsMTM1IEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKK3N0YXRpYyBpbnQgX19vY2ZzMl9wYWdlX21rd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlsb2ZmX3QgcG9zID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gUEFHRV9DQUNIRV9TSVpFOworCXBnb2ZmX3QgbGFzdF9pbmRleDsKKwlzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UgPSBOVUxMOworCXZvaWQgKmZzZGF0YTsKKwlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCS8qCisJICogQW5vdGhlciBub2RlIG1pZ2h0IGhhdmUgdHJ1bmNhdGVkIHdoaWxlIHdlIHdlcmUgd2FpdGluZyBvbgorCSAqIGNsdXN0ZXIgbG9ja3MuCisJICovCisJbGFzdF9pbmRleCA9IHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAocGFnZS0+aW5kZXggPiBsYXN0X2luZGV4KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGlfc2l6ZSBjaGVjayBhYm92ZSBkb2Vzbid0IGNhdGNoIHRoZSBjYXNlIHdoZXJlIG5vZGVzCisJICogdHJ1bmNhdGVkIGFuZCB0aGVuIHJlLWV4dGVuZGVkIHRoZSBmaWxlLiBXZSdsbCByZS1jaGVjayB0aGUKKwkgKiBwYWdlIG1hcHBpbmcgYWZ0ZXIgdGFraW5nIHRoZSBwYWdlIGxvY2sgaW5zaWRlIG9mCisJICogb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKCkuCisJICovCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgcGFnZS0+bWFwcGluZyAhPSBpbm9kZS0+aV9tYXBwaW5nKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2FsbCBvY2ZzMl93cml0ZV9iZWdpbigpIGFuZCBvY2ZzMl93cml0ZV9lbmQoKSB0byB0YWtlCisJICogYWR2YW50YWdlIG9mIHRoZSBhbGxvY2F0aW9uIGNvZGUgdGhlcmUuIFdlIHBhc3MgYSB3cml0ZQorCSAqIGxlbmd0aCBvZiB0aGUgd2hvbGUgcGFnZSAoY2hvcHBlZCB0byBpX3NpemUpIHRvIG1ha2Ugc3VyZQorCSAqIHRoZSB3aG9sZSB0aGluZyBpcyBhbGxvY2F0ZWQuCisJICoKKwkgKiBTaW5jZSB3ZSBrbm93IHRoZSBwYWdlIGlzIHVwIHRvIGRhdGUsIHdlIGRvbid0IGhhdmUgdG8KKwkgKiB3b3JyeSBhYm91dCBvY2ZzMl93cml0ZV9iZWdpbigpIHNraXBwaW5nIHNvbWUgYnVmZmVyIHJlYWRzCisJICogYmVjYXVzZSB0aGUgIndyaXRlIiB3b3VsZCBpbnZhbGlkYXRlIHRoZWlyIGRhdGEuCisJICovCisJaWYgKHBhZ2UtPmluZGV4ID09IGxhc3RfaW5kZXgpCisJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKG1hcHBpbmcsIHBvcywgbGVuLCAwLCAmbG9ja2VkX3BhZ2UsCisJCQkJICAgICAgICZmc2RhdGEsIGRpX2JoLCBwYWdlKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfd3JpdGVfZW5kX25vbG9jayhtYXBwaW5nLCBwb3MsIGxlbiwgbGVuLCBsb2NrZWRfcGFnZSwKKwkJCQkgICAgIGZzZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJQlVHX09OKHJldCAhPSBsZW4pOworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc2lnc2V0X3QgYmxvY2tlZCwgb2xkc2V0OworCWludCByZXQsIHJldDI7CisKKwlyZXQgPSBvY2ZzMl92bV9vcF9ibG9ja19zaWdzKCZibG9ja2VkLCAmb2xkc2V0KTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBUaGUgY2x1c3RlciBsb2NrcyB0YWtlbiB3aWxsIGJsb2NrIGEgdHJ1bmNhdGUgZnJvbSBhbm90aGVyCisJICogbm9kZS4gVGFraW5nIHRoZSBkYXRhIGxvY2sgd2lsbCBhbHNvIGVuc3VyZSB0aGF0IHdlIGRvbid0CisJICogYXR0ZW1wdCBwYWdlIHRydW5jYXRpb24gYXMgcGFydCBvZiBhIGRvd25jb252ZXJ0LgorCSAqLworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGFsbG9jIHNlbSBzaG91bGQgYmUgZW5vdWdoIHRvIHNlcmlhbGl6ZSB3aXRoCisJICogb2NmczJfdHJ1bmNhdGVfZmlsZSgpIGNoYW5naW5nIGlfc2l6ZSBhcyB3ZWxsIGFzIGFueSB0aHJlYWQKKwkgKiBtb2RpZnlpbmcgdGhlIGlub2RlIGJ0cmVlLgorCSAqLworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCisJcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKworCXJldCA9IF9fb2NmczJfcGFnZV9ta3dyaXRlKGlub2RlLCBkaV9iaCwgcGFnZSk7CisKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CisKK291dF9tZXRhX3VubG9jazoKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlicmVsc2UoZGlfYmgpOworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworb3V0OgorCXJldDIgPSBvY2ZzMl92bV9vcF91bmJsb2NrX3NpZ3MoJm9sZHNldCk7CisJaWYgKHJldDIgPCAwKQorCQltbG9nX2Vycm5vKHJldDIpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBvY2ZzMl9maWxlX3ZtX29wcyA9IHsKLQkubm9wYWdlID0gb2NmczJfbm9wYWdlLAorCS5ub3BhZ2UJCT0gb2NmczJfbm9wYWdlLAorCS5wYWdlX21rd3JpdGUJPSBvY2ZzMl9wYWdlX21rd3JpdGUsCiB9OwogCiBpbnQgb2NmczJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJaW50IHJldCA9IDAsIGxvY2tfbGV2ZWwgPSAwOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IpOwotCi0JLyoKLQkgKiBPbmx5IHN1cHBvcnQgc2hhcmVkIHdyaXRlYWJsZSBtbWFwIGZvciBsb2NhbCBtb3VudHMgd2hpY2gKLQkgKiBkb24ndCBrbm93IGFib3V0IGhvbGVzLgotCSAqLwotCWlmICgoIW9jZnMyX21vdW50X2xvY2FsKG9zYikgfHwgb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpICYmCi0JICAgICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkpICYmCi0JICAgICgodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVdSSVRFKSkpIHsKLQkJbWxvZygwLCAiZGlzYWxsb3cgc2hhcmVkIHdyaXRhYmxlIG1tYXBzICVseFxuIiwgdm1hLT52bV9mbGFncyk7Ci0JCS8qIFRoaXMgaXMgLUVJTlZBTCBiZWNhdXNlIGdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwCi0JCSAqIHJldHVybnMgaXQgaW4gYSBzaW1pbGFyIHNpdHVhdGlvbi4gKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJcmV0ID0gb2NmczJfbWV0YV9sb2NrX2F0aW1lKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAogCQkJCSAgICBmaWxlLT5mX3Zmc21udCwgJmxvY2tfbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggMzYyODllNi4uZDQzMGZkYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC0xNjc0LDcgKzE2NzQsNyBAQAogCQl1MzIgb2Zmc2V0ID0gMDsKIAogCQlpbm9kZS0+aV9vcCA9ICZvY2ZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsCisJCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsIDAsCiAJCQkJCQkgICAgbmV3X2ZlX2JoLAogCQkJCQkJICAgIGhhbmRsZSwgZGF0YV9hYywgTlVMTCwKIAkJCQkJCSAgICBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyLmggYi9mcy9vY2ZzMi9vY2ZzMi5oCmluZGV4IGE4NjA2MzMuLjVjYzkwYTQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyLmgKKysrIGIvZnMvb2NmczIvb2NmczIuaApAQCAtMjE5LDYgKzIxOSw3IEBACiAJdTE2IG1heF9zbG90czsKIAlzMTYgbm9kZV9udW07CiAJczE2IHNsb3RfbnVtOworCXMxNiBwcmVmZXJyZWRfc2xvdDsKIAlpbnQgc19zZWN0c2l6ZV9iaXRzOwogCWludCBzX2NsdXN0ZXJzaXplOwogCWludCBzX2NsdXN0ZXJzaXplX2JpdHM7CkBAIC0zMDUsNiArMzA2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3dyaXRlc191bndyaXR0ZW5fZXh0ZW50cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwkvKgorCSAqIFN1cHBvcnQgZm9yIHNwYXJzZSBmaWxlcyBpcyBhIHByZS1yZXF1aXNpdGUKKwkgKi8KKwlpZiAoIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKQorCQlyZXR1cm4gMDsKKworCWlmIChvc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJiBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiAvKiBzZXQgLyBjbGVhciBmdW5jdGlvbnMgYmVjYXVzZSBjbHVzdGVyIGV2ZW50cyBjYW4gbWFrZSB0aGVzZSBoYXBwZW4KICAqIGluIHBhcmFsbGVsIHNvIHdlIHdhbnQgdGhlIHRyYW5zaXRpb25zIHRvIGJlIGF0b21pYy4gdGhpcyBhbHNvCiAgKiBtZWFucyB0aGF0IGFueSBmdXR1cmUgZmxhZ3Mgb3NiX2ZsYWdzIG11c3QgYmUgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oIGIvZnMvb2NmczIvb2NmczJfZnMuaAppbmRleCBmMGQ5ZWIwLi44MmY4YTc1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oCisrKyBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9DT01QQVRfU1VQUAlPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9CQUNLVVBfU0IKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0xPQ0FMX01PVU5UIFwKIAkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9TUEFSU0VfQUxMT0MpCi0jZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJMAorI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCU9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOV1JJVFRFTgogCiAvKgogICogSGVhcnRiZWF0LW9ubHkgZGV2aWNlcyBhcmUgbWlzc2luZyBqb3VybmFscyBhbmQgb3RoZXIgZmlsZXMuICBUaGUKQEAgLTExNiw2ICsxMTYsMTEgQEAKICAqLwogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9CQUNLVVBfU0IJCTB4MDAwMQogCisvKgorICogVW53cml0dGVuIGV4dGVudHMgc3VwcG9ydC4KKyAqLworI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4JMHgwMDAxCisKIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZmlyc3QgYmFja3VwIGJsb2NrIHdpbGwgYmUgMUcuCiAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYmUgNEcsIDE2RywgNjRHLCAyNTZHIGFuZCAxVC4KICAqLwpAQCAtMTcwLDYgKzE3NSwzMiBAQAogI2RlZmluZSBPQ0ZTMl9JT0MzMl9TRVRGTEFHUwlfSU9XKCdmJywgMiwgaW50KQogCiAvKgorICogU3BhY2UgcmVzZXJ2YXRpb24gLyBhbGxvY2F0aW9uIC8gZnJlZSBpb2N0bHMgYW5kIGFyZ3VtZW50IHN0cnVjdHVyZQorICogYXJlIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBYRlMuCisgKgorICogQUxMT0NTUCogYW5kIEZSRUVTUCogYXJlIG5vdCBhbmQgd2lsbCBuZXZlciBiZSBzdXBwb3J0ZWQsIGJ1dCBhcmUKKyAqIGluY2x1ZGVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy4KKyAqLworc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YgeworCV9fczE2CQlsX3R5cGU7CisJX19zMTYJCWxfd2hlbmNlOworCV9fczY0CQlsX3N0YXJ0OworCV9fczY0CQlsX2xlbjsJCS8qIGxlbiA9PSAwIG1lYW5zIHVudGlsIGVuZCBvZiBmaWxlICovCisJX19zMzIJCWxfc3lzaWQ7CisJX191MzIJCWxfcGlkOworCV9fczMyCQlsX3BhZFs0XTsJLyogcmVzZXJ2ZSBhcmVhCQkJICAgICovCit9OworCisjZGVmaW5lIE9DRlMyX0lPQ19BTExPQ1NQCQlfSU9XICgnWCcsIDEwLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX0ZSRUVTUAkJX0lPVyAoJ1gnLCAxMSwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19SRVNWU1AJCV9JT1cgKCdYJywgNDAsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfVU5SRVNWU1AJX0lPVyAoJ1gnLCA0MSwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19BTExPQ1NQNjQJX0lPVyAoJ1gnLCAzNiwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19GUkVFU1A2NAlfSU9XICgnWCcsIDM3LCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX1JFU1ZTUDY0CV9JT1cgKCdYJywgNDIsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfVU5SRVNWU1A2NAlfSU9XICgnWCcsIDQzLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKworLyoKICAqIEpvdXJuYWwgRmxhZ3MgKG9jZnMyX2Rpbm9kZS5pZDEuam91cm5hbDEuaV9mbGFncykKICAqLwogI2RlZmluZSBPQ0ZTMl9KT1VSTkFMX0RJUlRZX0ZMCSgweDAwMDAwMDAxKQkvKiBKb3VybmFsIG5lZWRzIHJlY292ZXJ5ICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zbG90X21hcC5jIGIvZnMvb2NmczIvc2xvdF9tYXAuYwppbmRleCBkOGI3OTA2Li5hZjQ4ODJiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zbG90X21hcC5jCisrKyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKQEAgLTEyMSwxNyArMTIxLDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHMxNiBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzdHJ1Y3Qgb2NmczJfc2xvdF9pbmZvICpzaSkKK3N0YXRpYyBzMTYgX19vY2ZzMl9maW5kX2VtcHR5X3Nsb3Qoc3RydWN0IG9jZnMyX3Nsb3RfaW5mbyAqc2ksIHMxNiBwcmVmZXJyZWQpCiB7CiAJaW50IGk7CiAJczE2IHJldCA9IE9DRlMyX0lOVkFMSURfU0xPVDsKIAorCWlmIChwcmVmZXJyZWQgPj0gMCAmJiBwcmVmZXJyZWQgPCBzaS0+c2lfbnVtX3Nsb3RzKSB7CisJCWlmIChPQ0ZTMl9JTlZBTElEX1NMT1QgPT0gc2ktPnNpX2dsb2JhbF9ub2RlX251bXNbcHJlZmVycmVkXSkgeworCQkJcmV0ID0gcHJlZmVycmVkOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKIAlmb3IoaSA9IDA7IGkgPCBzaS0+c2lfbnVtX3Nsb3RzOyBpKyspIHsKIAkJaWYgKE9DRlMyX0lOVkFMSURfU0xPVCA9PSBzaS0+c2lfZ2xvYmFsX25vZGVfbnVtc1tpXSkgewogCQkJcmV0ID0gKHMxNikgaTsKIAkJCWJyZWFrOwogCQl9CiAJfQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI0OCw3ICsyNTYsNyBAQAogCWlmIChzbG90ID09IE9DRlMyX0lOVkFMSURfU0xPVCkgewogCQkvKiBpZiBubyBzbG90IHlldCwgdGhlbiBqdXN0IHRha2UgMXN0IGF2YWlsYWJsZQogCQkgKiBvbmUuICovCi0JCXNsb3QgPSBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzaSk7CisJCXNsb3QgPSBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzaSwgb3NiLT5wcmVmZXJyZWRfc2xvdCk7CiAJCWlmIChzbG90ID09IE9DRlMyX0lOVkFMSURfU0xPVCkgewogCQkJc3Bpbl91bmxvY2soJnNpLT5zaV9sb2NrKTsKIAkJCW1sb2coTUxfRVJST1IsICJubyBmcmVlIHNsb3RzIGF2YWlsYWJsZSFcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggZTM0Mzc2Mi4uZDljNWM5ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC05OCwxNCArOTgsNiBAQAogCQkJCSAgICB1MTYgY2hhaW4pOwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfcmVhc29uYWJseV9lbXB0eShzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcsCiAJCQkJCQkgICAgIHUzMiB3YW50ZWQpOwotc3RhdGljIGludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKLQkJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKLQkJCQkgICAgdTY0IGJnX2Jsa25vLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQpOwotc3RhdGljIGlubGluZSB1NjQgb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAodTY0IGJsb2NrLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBiaXQpOwogc3RhdGljIGlubGluZSB1MzIgb2NmczJfZGVzY19iaXRtYXBfdG9fY2x1c3Rlcl9vZmYoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCSAgIHU2NCBiZ19ibGtubywKIAkJCQkJCSAgIHUxNiBiZ19iaXRfb2ZmKTsKQEAgLTQ5NiwxMyArNDg4LDcgQEAKIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChmZSk7CiAJKCphYyktPmFjX3doaWNoID0gT0NGUzJfQUNfVVNFX01FVEE7Ci0KLSNpZm5kZWYgT0NGUzJfVVNFX0FMTF9NRVRBREFUQV9TVUJBTExPQ0FUT1JTCi0Jc2xvdCA9IDA7Ci0jZWxzZQogCXNsb3QgPSBvc2ItPnNsb3RfbnVtOwotI2VuZGlmCi0KIAkoKmFjKS0+YWNfZ3JvdXBfc2VhcmNoID0gb2NmczJfYmxvY2tfZ3JvdXBfc2VhcmNoOwogCiAJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgKCphYyksCkBAIC0xNjI2LDEyICsxNjEyLDEyIEBACiAvKgogICogZXhwZWN0cyB0aGUgc3ViYWxsb2MgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCi0JCQkJICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCi0JCQkJICAgIHU2NCBiZ19ibGtubywKLQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50KQoraW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9jX2JoLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0LAorCQkJICAgICB1NjQgYmdfYmxrbm8sCisJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAl1MzIgdG1wX3VzZWQ7CkBAIC0xNzAzLDEzICsxNjg5LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cCh1NjQgYmxvY2ssIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JdTY0IGdyb3VwID0gYmxvY2sgLSAodTY0KSBiaXQ7Ci0KLQlyZXR1cm4gZ3JvdXA7Ci19Ci0KIGludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLApAQCAtMTcyMywxOSArMTcwMiw2IEBACiAJCQkJCWlub2RlX2FsbG9jX2JoLCBiaXQsIGJnX2Jsa25vLCAxKTsKIH0KIAotaW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgc3RydWN0IGlub2RlICplYl9hbGxvY19pbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2FsbG9jX2JoLAotCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKQotewotCXU2NCBibGsgPSBsZTY0X3RvX2NwdShlYi0+aF9ibGtubyk7Ci0JdTE2IGJpdCA9IGxlMTZfdG9fY3B1KGViLT5oX3N1YmFsbG9jX2JpdCk7Ci0JdTY0IGJnX2Jsa25vID0gb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAoYmxrLCBiaXQpOwotCi0JcmV0dXJuIG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGUsIGViX2FsbG9jX2lub2RlLCBlYl9hbGxvY19iaCwKLQkJCQkJYml0LCBiZ19ibGtubywgMSk7Ci19Ci0KIGludCBvY2ZzMl9mcmVlX2NsdXN0ZXJzKGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmJpdG1hcF9pbm9kZSwKIAkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuaCBiL2ZzL29jZnMyL3N1YmFsbG9jLmgKaW5kZXggMWEzYzk0Yy4uZjIxMmRjMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuaAorKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCkBAIC04NiwyMCArODYsMjkgQEAKIAkJCSB1MzIgKmNsdXN0ZXJfc3RhcnQsCiAJCQkgdTMyICpudW1fY2x1c3RlcnMpOwogCitpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCisJCQkgICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCisJCQkgICAgIHU2NCBiZ19ibGtubywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKIGludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLAogCQkgICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSk7Ci1pbnQgb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmViX2FsbG9jX2lub2RlLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYWxsb2NfYmgsCi0JCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpOwogaW50IG9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBpbm9kZSAqYml0bWFwX2lub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyk7CiAKK3N0YXRpYyBpbmxpbmUgdTY0IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKHU2NCBibG9jaywgdW5zaWduZWQgaW50IGJpdCkKK3sKKwl1NjQgZ3JvdXAgPSBibG9jayAtICh1NjQpIGJpdDsKKworCXJldHVybiBncm91cDsKK30KKwogc3RhdGljIGlubGluZSB1MzIgb2NmczJfY2x1c3Rlcl9mcm9tX2Rlc2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSAgdTY0IGJnX2Jsa25vKQogewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggODZiNTU5Yy4uM2E1YTFlZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC04Miw3ICs4Miw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBpbnQgb2NmczJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcHRpb25zLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwgaW50IGlzX3JlbW91bnQpOworCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwgczE2ICpzbG90LAorCQkJICAgICAgIGludCBpc19yZW1vdW50KTsKIHN0YXRpYyB2b2lkIG9jZnMyX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyBpbnQgb2NmczJfbW91bnRfdm9sdW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIGludCBvY2ZzMl9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOwpAQCAtMTE0LDggKzExNSw2IEBACiBzdGF0aWMgc3RydWN0IGlub2RlICpvY2ZzMl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyB2b2lkIG9jZnMyX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG9jZnMyX3NvcHMgPSB7CiAJLnN0YXRmcwkJPSBvY2ZzMl9zdGF0ZnMsCiAJLmFsbG9jX2lub2RlCT0gb2NmczJfYWxsb2NfaW5vZGUsCkBAIC0xNDAsNiArMTM5LDcgQEAKIAlPcHRfZGF0YV9vcmRlcmVkLAogCU9wdF9kYXRhX3dyaXRlYmFjaywKIAlPcHRfYXRpbWVfcXVhbnR1bSwKKwlPcHRfc2xvdCwKIAlPcHRfZXJyLAogfTsKIApAQCAtMTU0LDYgKzE1NCw3IEBACiAJe09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKIAl7T3B0X2RhdGFfd3JpdGViYWNrLCAiZGF0YT13cml0ZWJhY2sifSwKIAl7T3B0X2F0aW1lX3F1YW50dW0sICJhdGltZV9xdWFudHVtPSV1In0sCisJe09wdF9zbG90LCAicHJlZmVycmVkX3Nsb3Q9JXUifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTMxOCw3ICszMTksNyBAQAogLyogRnJvbSB4ZnNfc3VwZXIuYzp4ZnNfbWF4X2ZpbGVfb2Zmc2V0CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KQordW5zaWduZWQgbG9uZyBsb25nIG9jZnMyX21heF9maWxlX29mZnNldCh1bnNpZ25lZCBpbnQgYmxvY2tzaGlmdCkKIHsKIAl1bnNpZ25lZCBpbnQgcGFnZWZhY3RvciA9IDE7CiAJdW5zaWduZWQgaW50IGJpdHNoaWZ0ID0gQklUU19QRVJfTE9ORyAtIDE7CkBAIC0zNTUsOSArMzU2LDEwIEBACiAJaW50IGluY29tcGF0X2ZlYXR1cmVzOwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgcGFyc2VkX29wdGlvbnM7CisJczE2IHNsb3Q7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihzYik7CiAKLQlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0aW9ucywgMSkpIHsKKwlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0aW9ucywgJnNsb3QsIDEpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTUzNCw2ICs1MzYsNyBAQAogCXN0cnVjdCBkZW50cnkgKnJvb3Q7CiAJaW50IHN0YXR1cywgc2VjdG9yX3NpemU7CiAJdW5zaWduZWQgbG9uZyBwYXJzZWRfb3B0OworCXMxNiBzbG90OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKQEAgLTU0MSw3ICs1NDQsNyBAQAogCiAJbWxvZ19lbnRyeSgiJXAsICVwLCAlaSIsIHNiLCBkYXRhLCBzaWxlbnQpOwogCi0JaWYgKCFvY2ZzMl9wYXJzZV9vcHRpb25zKHNiLCBkYXRhLCAmcGFyc2VkX29wdCwgMCkpIHsKKwlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0LCAmc2xvdCwgMCkpIHsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAkJZ290byByZWFkX3N1cGVyX2Vycm9yOwogCX0KQEAgLTU3MSw2ICs1NzQsNyBAQAogCWJyZWxzZShiaCk7CiAJYmggPSBOVUxMOwogCW9zYi0+c19tb3VudF9vcHQgPSBwYXJzZWRfb3B0OworCW9zYi0+cHJlZmVycmVkX3Nsb3QgPSBzbG90OwogCiAJc2ItPnNfbWFnaWMgPSBPQ0ZTMl9TVVBFUl9NQUdJQzsKIApAQCAtNzEzLDYgKzcxNyw3IEBACiBzdGF0aWMgaW50IG9jZnMyX3BhcnNlX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgICAgICBjaGFyICpvcHRpb25zLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwKKwkJCSAgICAgICBzMTYgKnNsb3QsCiAJCQkgICAgICAgaW50IGlzX3JlbW91bnQpCiB7CiAJaW50IHN0YXR1czsKQEAgLTcyMiw2ICs3MjcsNyBAQAogCQkgICBvcHRpb25zID8gb3B0aW9ucyA6ICIobm9uZSkiKTsKIAogCSptb3VudF9vcHQgPSAwOworCSpzbG90ID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCiAJaWYgKCFvcHRpb25zKSB7CiAJCXN0YXR1cyA9IDE7CkBAIC03ODIsNiArNzg4LDE1IEBACiAJCQllbHNlCiAJCQkJb3NiLT5zX2F0aW1lX3F1YW50dW0gPSBPQ0ZTMl9ERUZBVUxUX0FUSU1FX1FVQU5UVU07CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfc2xvdDoKKwkJCW9wdGlvbiA9IDA7CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkgeworCQkJCXN0YXR1cyA9IDA7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJaWYgKG9wdGlvbikKKwkJCQkqc2xvdCA9IChzMTYpb3B0aW9uOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQltbG9nKE1MX0VSUk9SLAogCQkJICAgICAiVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuaCBiL2ZzL29jZnMyL3N1cGVyLmgKaW5kZXggNzgzZjUyNy4uM2I5Y2IzZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuaAorKysgYi9mcy9vY2ZzMi9zdXBlci5oCkBAIC00NSw0ICs0NSw2IEBACiAKICNkZWZpbmUgb2NmczJfYWJvcnQoc2IsIGZtdCwgYXJncy4uLikgX19vY2ZzMl9hYm9ydChzYiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZm10LCAjI2FyZ3MpCiAKK3Vuc2lnbmVkIGxvbmcgbG9uZyBvY2ZzMl9tYXhfZmlsZV9vZmZzZXQodW5zaWduZWQgaW50IGJsb2Nrc2hpZnQpOworCiAjZW5kaWYgLyogT0NGUzJfU1VQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDBkNTE1ZDEuLmJlNmE0NTcgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTg1NSw3ICs4NTUsNyBAQAogLyoKICAqIEZpbmQgYW4gZW1wdHkgZmlsZSBkZXNjcmlwdG9yIGVudHJ5LCBhbmQgbWFyayBpdCBidXN5LgogICovCi1pbnQgZ2V0X3VudXNlZF9mZCh2b2lkKQoraW50IGdldF91bnVzZWRfZmRfZmxhZ3MoaW50IGZsYWdzKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCWludCBmZCwgZXJyb3I7CkBAIC04OTEsNyArODkxLDEwIEBACiAJfQogCiAJRkRfU0VUKGZkLCBmZHQtPm9wZW5fZmRzKTsKLQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJaWYgKGZsYWdzICYgT19DTE9FWEVDKQorCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZWxzZQorCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CiAJZmlsZXMtPm5leHRfZmQgPSBmZCArIDE7CiAjaWYgMQogCS8qIFNhbml0eSBjaGVjayAqLwpAQCAtOTA3LDYgKzkxMCwxMSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAoraW50IGdldF91bnVzZWRfZmQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X3VudXNlZF9mZF9mbGFncygwKTsKK30KKwogRVhQT1JUX1NZTUJPTChnZXRfdW51c2VkX2ZkKTsKIAogc3RhdGljIHZvaWQgX19wdXRfdW51c2VkX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCkBAIC05NTksNyArOTY3LDcgQEAKIAlpbnQgZmQgPSBQVFJfRVJSKHRtcCk7CiAKIAlpZiAoIUlTX0VSUih0bXApKSB7Ci0JCWZkID0gZ2V0X3VudXNlZF9mZCgpOworCQlmZCA9IGdldF91bnVzZWRfZmRfZmxhZ3MoZmxhZ3MpOwogCQlpZiAoZmQgPj0gMCkgewogCQkJc3RydWN0IGZpbGUgKmYgPSBkb19maWxwX29wZW4oZGZkLCB0bXAsIGZsYWdzLCBtb2RlKTsKIAkJCWlmIChJU19FUlIoZikpIHsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYyBiL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYwppbmRleCBlMzQ5MTMyLi4zZDNlMTY2IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKKysrIGIvZnMvcGFydGl0aW9ucy9hY29ybi5jCkBAIC0yNSw2ICsyNSw4IEBACiAjZGVmaW5lIFBBUlRJVElPTl9SSVNDSVhfU0NTSQkyCiAjZGVmaW5lIFBBUlRJVElPTl9MSU5VWAkJOQogCisjaWYgZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTKQogc3RhdGljIHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKgogYWRmc19wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgY2hhciAqbmFtZSwgY2hhciAqZGF0YSwKIAkgICAgICAgdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0b3IsIGludCBzbG90KQpAQCAtNDgsNiArNTAsNyBAQAogCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsIGZpcnN0X3NlY3RvciwgbnJfc2VjdHMpOwogCXJldHVybiBkcjsKIH0KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9SSVNDSVgKIApAQCAtNjUsNiArNjgsOCBAQAogCXN0cnVjdCByaXNjaXhfcGFydCBwYXJ0WzhdOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUykKIHN0YXRpYyBpbnQKIHJpc2NpeF9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0LCBpbnQgc2xvdCwgdW5zaWduZWQgbG9uZyBucl9zZWN0cykKQEAgLTEwNSw2ICsxMTAsNyBAQAogCXJldHVybiBzbG90OwogfQogI2VuZGlmCisjZW5kaWYKIAogI2RlZmluZSBMSU5VWF9OQVRJVkVfTUFHSUMgMHhkZWFmYTFkZQogI2RlZmluZSBMSU5VWF9TV0FQX01BR0lDICAgMHhkZWFmYWIxZQpAQCAtMTE1LDYgKzEyMSw4IEBACiAJX19sZTMyIG5yX3NlY3RzOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUykKIHN0YXRpYyBpbnQKIGxpbnV4X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQl1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3QsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIG5yX3NlY3RzKQpAQCAtMTQ2LDYgKzE1NCw3IEBACiAJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CiAJcmV0dXJuIHNsb3Q7CiB9CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BCiBpbnQKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCmluZGV4IDk5ODczYTIuLmU3ZGQxZDQgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpAQCAtNjc3LDE1ICs2NzcsMjQgQEAKICAqIFJldHVybjogIC0xIEVycm9yLCB0aGUgY2FsY3VsYXRlZCBvZmZzZXQgZXhjZWVkZWQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgogICogICAgICAgICAgIG4gT0ssIGEgcmFuZ2UtY2hlY2tlZCBvZmZzZXQgaW50byBidWZmZXIKICAqLwotc3RhdGljIGludCBsZG1fcmVsYXRpdmUgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIGludCBiYXNlLCBpbnQgb2Zmc2V0KQorc3RhdGljIGludCBsZG1fcmVsYXRpdmUoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGJhc2UsIGludCBvZmZzZXQpCiB7CiAKIAliYXNlICs9IG9mZnNldDsKLQlpZiAoKCFidWZmZXIpIHx8IChvZmZzZXQgPCAwKSB8fCAoYmFzZSA+IGJ1ZmxlbikpCisJaWYgKCFidWZmZXIgfHwgb2Zmc2V0IDwgMCB8fCBiYXNlID4gYnVmbGVuKSB7CisJCWlmICghYnVmZmVyKQorCQkJbGRtX2Vycm9yKCIhYnVmZmVyIik7CisJCWlmIChvZmZzZXQgPCAwKQorCQkJbGRtX2Vycm9yKCJvZmZzZXQgKCVkKSA8IDAiLCBvZmZzZXQpOworCQlpZiAoYmFzZSA+IGJ1ZmxlbikKKwkJCWxkbV9lcnJvcigiYmFzZSAoJWQpID4gYnVmbGVuICglZCkiLCBiYXNlLCBidWZsZW4pOwogCQlyZXR1cm4gLTE7Ci0JaWYgKChiYXNlICsgYnVmZmVyW2Jhc2VdKSA+PSBidWZsZW4pCisJfQorCWlmIChiYXNlICsgYnVmZmVyW2Jhc2VdID49IGJ1ZmxlbikgeworCQlsZG1fZXJyb3IoImJhc2UgKCVkKSArIGJ1ZmZlcltiYXNlXSAoJWQpID49IGJ1ZmxlbiAoJWQpIiwgYmFzZSwKKwkJCQlidWZmZXJbYmFzZV0sIGJ1Zmxlbik7CiAJCXJldHVybiAtMTsKLQorCX0KIAlyZXR1cm4gYnVmZmVyW2Jhc2VdICsgb2Zmc2V0ICsgMTsKIH0KIApAQCAtMTA1NCw2MCArMTA2Myw5OCBAQAogICogUmV0dXJuOiAgJ3RydWUnICAgQHZiIGNvbnRhaW5zIGEgVm9sdW1lIFZCTEsKICAqICAgICAgICAgICdmYWxzZScgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKICAqLwotc3RhdGljIGJvb2wgbGRtX3BhcnNlX3ZvbDUgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3N0YXRpYyBib29sIGxkbV9wYXJzZV92b2w1KGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKIHsKLQlpbnQgcl9vYmppZCwgcl9uYW1lLCByX3Z0eXBlLCByX2NoaWxkLCByX3NpemUsIHJfaWQxLCByX2lkMiwgcl9zaXplMjsKLQlpbnQgcl9kcml2ZSwgbGVuOworCWludCByX29iamlkLCByX25hbWUsIHJfdnR5cGUsIHJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIsIHJfY2hpbGQsIHJfc2l6ZTsKKwlpbnQgcl9pZDEsIHJfaWQyLCByX3NpemUyLCByX2RyaXZlLCBsZW47CiAJc3RydWN0IHZibGtfdm9sdSAqdm9sdTsKIAotCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOwotCi0Jcl9vYmppZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKLQlyX25hbWUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOwotCXJfdnR5cGUgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKLQlyX2NoaWxkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MkUsIHJfdnR5cGUpOwotCXJfc2l6ZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgzRSwgcl9jaGlsZCk7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQxKQotCQlyX2lkMSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfc2l6ZSk7Ci0JZWxzZQorCUJVR19PTighYnVmZmVyIHx8ICF2Yik7CisJcl9vYmppZCA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgMCk7CisJaWYgKHJfb2JqaWQgPCAwKSB7CisJCWxkbV9lcnJvcigicl9vYmppZCAlZCA8IDAiLCByX29iamlkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX25hbWUgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOworCWlmIChyX25hbWUgPCAwKSB7CisJCWxkbV9lcnJvcigicl9uYW1lICVkIDwgMCIsIHJfbmFtZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcl92dHlwZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKKwlpZiAocl92dHlwZSA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX3Z0eXBlICVkIDwgMCIsIHJfdnR5cGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfdnR5cGUpOworCWlmIChyX2Rpc2FibGVfZHJpdmVfbGV0dGVyIDwgMCkgeworCQlsZG1fZXJyb3IoInJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIgJWQgPCAwIiwKKwkJCQlyX2Rpc2FibGVfZHJpdmVfbGV0dGVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX2NoaWxkID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDJELCByX2Rpc2FibGVfZHJpdmVfbGV0dGVyKTsKKwlpZiAocl9jaGlsZCA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX2NoaWxkICVkIDwgMCIsIHJfY2hpbGQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfc2l6ZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgzRCwgcl9jaGlsZCk7CisJaWYgKHJfc2l6ZSA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX3NpemUgJWQgPCAwIiwgcl9zaXplKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQxKSB7CisJCXJfaWQxID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX3NpemUpOworCQlpZiAocl9pZDEgPCAwKSB7CisJCQlsZG1fZXJyb3IoInJfaWQxICVkIDwgMCIsIHJfaWQxKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQogCQlyX2lkMSA9IHJfc2l6ZTsKLQotCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9JRDIpCi0JCXJfaWQyID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9pZDEpOwotCWVsc2UKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQyKSB7CisJCXJfaWQyID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX2lkMSk7CisJCWlmIChyX2lkMiA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9pZDIgJWQgPCAwIiwgcl9pZDIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCiAJCXJfaWQyID0gcl9pZDE7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfU0laRSkKLQkJcl9zaXplMiA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfaWQyKTsKLQllbHNlCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX1NJWkUpIHsKKwkJcl9zaXplMiA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9pZDIpOworCQlpZiAocl9zaXplMiA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9zaXplMiAlZCA8IDAiLCByX3NpemUyKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQogCQlyX3NpemUyID0gcl9pZDI7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpCi0JCXJfZHJpdmUgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDUzLCByX3NpemUyKTsKLQllbHNlCi0JCXJfZHJpdmUgPSByX3NpemUyOwotCi0JbGVuID0gcl9kcml2ZTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JbGVuICs9IFZCTEtfU0laRV9WT0w1OwotCWlmIChsZW4gIT0gQkUzMiAoYnVmZmVyICsgMHgxNCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXZvbHUgPSAmdmItPnZibGsudm9sdTsKLQotCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgIHZvbHUtPnZvbHVtZV90eXBlLAotCQlzaXplb2YgKHZvbHUtPnZvbHVtZV90eXBlKSk7Ci0JbWVtY3B5ICh2b2x1LT52b2x1bWVfc3RhdGUsIGJ1ZmZlciArIDB4MTkgKyByX3Z0eXBlLAotCQkJc2l6ZW9mICh2b2x1LT52b2x1bWVfc3RhdGUpKTsKLQl2b2x1LT5zaXplID0gbGRtX2dldF92bnVtIChidWZmZXIgKyAweDNFICsgcl9jaGlsZCk7Ci0Jdm9sdS0+cGFydGl0aW9uX3R5cGUgPSBidWZmZXJbMHg0MiArIHJfc2l6ZV07Ci0JbWVtY3B5ICh2b2x1LT5ndWlkLCBidWZmZXIgKyAweDQzICsgcl9zaXplLCAgc2l6ZW9mICh2b2x1LT5ndWlkKSk7CiAJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0RSSVZFKSB7Ci0JCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHg1MyArIHJfc2l6ZSwgIHZvbHUtPmRyaXZlX2hpbnQsCi0JCQlzaXplb2YgKHZvbHUtPmRyaXZlX2hpbnQpKTsKKwkJcl9kcml2ZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9zaXplMik7CisJCWlmIChyX2RyaXZlIDwgMCkgeworCQkJbGRtX2Vycm9yKCJyX2RyaXZlICVkIDwgMCIsIHJfZHJpdmUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCisJCXJfZHJpdmUgPSByX3NpemUyOworCWxlbiA9IHJfZHJpdmU7CisJaWYgKGxlbiA8IDApIHsKKwkJbGRtX2Vycm9yKCJsZW4gJWQgPCAwIiwgbGVuKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlsZW4gKz0gVkJMS19TSVpFX1ZPTDU7CisJaWYgKGxlbiA+IEJFMzIoYnVmZmVyICsgMHgxNCkpIHsKKwkJbGRtX2Vycm9yKCJsZW4gJWQgPiBCRTMyKGJ1ZmZlciArIDB4MTQpICVkIiwgbGVuLAorCQkJCUJFMzIoYnVmZmVyICsgMHgxNCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZvbHUgPSAmdmItPnZibGsudm9sdTsKKwlsZG1fZ2V0X3ZzdHIoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgdm9sdS0+dm9sdW1lX3R5cGUsCisJCQlzaXplb2Yodm9sdS0+dm9sdW1lX3R5cGUpKTsKKwltZW1jcHkodm9sdS0+dm9sdW1lX3N0YXRlLCBidWZmZXIgKyAweDE4ICsgcl9kaXNhYmxlX2RyaXZlX2xldHRlciwKKwkJCXNpemVvZih2b2x1LT52b2x1bWVfc3RhdGUpKTsKKwl2b2x1LT5zaXplID0gbGRtX2dldF92bnVtKGJ1ZmZlciArIDB4M0QgKyByX2NoaWxkKTsKKwl2b2x1LT5wYXJ0aXRpb25fdHlwZSA9IGJ1ZmZlclsweDQxICsgcl9zaXplXTsKKwltZW1jcHkodm9sdS0+Z3VpZCwgYnVmZmVyICsgMHg0MiArIHJfc2l6ZSwgc2l6ZW9mKHZvbHUtPmd1aWQpKTsKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpIHsKKwkJbGRtX2dldF92c3RyKGJ1ZmZlciArIDB4NTIgKyByX3NpemUsIHZvbHUtPmRyaXZlX2hpbnQsCisJCQkJc2l6ZW9mKHZvbHUtPmRyaXZlX2hpbnQpKTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2xkbS5oIGIvZnMvcGFydGl0aW9ucy9sZG0uaAppbmRleCBkMmU2YTMwLi44MGY2M2I1IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2xkbS5oCisrKyBiL2ZzL3BhcnRpdGlvbnMvbGRtLmgKQEAgLTY4LDcgKzY4LDcgQEAKICNkZWZpbmUgVkJMS19TSVpFX0RTSzMJCTEyCiAjZGVmaW5lIFZCTEtfU0laRV9EU0s0CQk0NQogI2RlZmluZSBWQkxLX1NJWkVfUFJUMwkJMjgKLSNkZWZpbmUgVkJMS19TSVpFX1ZPTDUJCTU5CisjZGVmaW5lIFZCTEtfU0laRV9WT0w1CQk1OAogCiAvKiBjb21wb25lbnQgdHlwZXMgKi8KICNkZWZpbmUgQ09NUF9TVFJJUEUJCTB4MDEJCS8qIFN0cmlwZS1zZXQgKi8KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYXJyYXkuYyBiL2ZzL3Byb2MvYXJyYXkuYwppbmRleCA5OGU3OGUyLi45NjU2MjVhIDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC02Miw2ICs2Miw4IEBACiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC03Niw5ICs3OCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtODcsMTAgKzg3LDEwIEBACiBkbyB7IG1lbWNweShidWZmZXIsIHN0cmluZywgc3RybGVuKHN0cmluZykpOyBcCiAgICAgIGJ1ZmZlciArPSBzdHJsZW4oc3RyaW5nKTsgfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBjaGFyICogdGFza19uYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqIGJ1ZikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19uYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmKQogewogCWludCBpOwotCWNoYXIgKiBuYW1lOworCWNoYXIgKm5hbWU7CiAJY2hhciB0Y29tbVtzaXplb2YocC0+Y29tbSldOwogCiAJZ2V0X3Rhc2tfY29tbSh0Y29tbSwgcCk7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkiWCAoZGVhZCkiCQkvKiAzMiAqLwogfTsKIAotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICogZ2V0X3Rhc2tfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldF90YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXVuc2lnbmVkIGludCBzdGF0ZSA9ICh0c2stPnN0YXRlICYgKFRBU0tfUlVOTklORyB8CiAJCQkJCSAgICBUQVNLX0lOVEVSUlVQVElCTEUgfApAQCAtMTU2LDcgKzE1Niw3IEBACiAJcmV0dXJuICpwOwogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGlubGluZSBjaGFyICp0YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQogewogCXN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvOwogCWludCBnOwpAQCAtMTcyLDggKzE3Miw4IEBACiAJCSJVaWQ6XHQlZFx0JWRcdCVkXHQlZFxuIgogCQkiR2lkOlx0JWRcdCVkXHQlZFx0JWRcbiIsCiAJCWdldF90YXNrX3N0YXRlKHApLAotCSAgICAgICAJcC0+dGdpZCwgcC0+cGlkLAotCSAgICAgICAJcGlkX2FsaXZlKHApID8gcmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KS0+dGdpZCA6IDAsCisJCXAtPnRnaWQsIHAtPnBpZCwKKwkJcGlkX2FsaXZlKHApID8gcmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KS0+dGdpZCA6IDAsCiAJCXBpZF9hbGl2ZShwKSAmJiBwLT5wdHJhY2UgPyByY3VfZGVyZWZlcmVuY2UocC0+cGFyZW50KS0+cGlkIDogMCwKIAkJcC0+dWlkLCBwLT5ldWlkLCBwLT5zdWlkLCBwLT5mc3VpZCwKIAkJcC0+Z2lkLCBwLT5lZ2lkLCBwLT5zZ2lkLCBwLT5mc2dpZCk7CkBAIC0xOTEsMTUgKzE5MSwxNSBAQAogCWdldF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwogCXRhc2tfdW5sb2NrKHApOwogCi0JZm9yIChnID0gMDsgZyA8IG1pbihncm91cF9pbmZvLT5uZ3JvdXBzLE5HUk9VUFNfU01BTEwpOyBnKyspCi0JCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiVkICIsIEdST1VQX0FUKGdyb3VwX2luZm8sZykpOworCWZvciAoZyA9IDA7IGcgPCBtaW4oZ3JvdXBfaW5mby0+bmdyb3VwcywgTkdST1VQU19TTUFMTCk7IGcrKykKKwkJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiJWQgIiwgR1JPVVBfQVQoZ3JvdXBfaW5mbywgZykpOwogCXB1dF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwogCiAJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiXG4iKTsKIAlyZXR1cm4gYnVmZmVyOwogfQogCi1zdGF0aWMgY2hhciAqIHJlbmRlcl9zaWdzZXRfdChjb25zdCBjaGFyICpoZWFkZXIsIHNpZ3NldF90ICpzZXQsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBjaGFyICpyZW5kZXJfc2lnc2V0X3QoY29uc3QgY2hhciAqaGVhZGVyLCBzaWdzZXRfdCAqc2V0LCBjaGFyICpidWZmZXIpCiB7CiAJaW50IGksIGxlbjsKIApAQCAtMjM5LDcgKzIzOSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX3NpZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19zaWcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzaWdzZXRfdCBwZW5kaW5nLCBzaHBlbmRpbmcsIGJsb2NrZWQsIGlnbm9yZWQsIGNhdWdodDsKQEAgLTI4OSwxNCArMjg5LDIzIEBACiAJCQkgICAgY2FwX3QocC0+Y2FwX2VmZmVjdGl2ZSkpOwogfQogCi1pbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCQkJY2hhciAqYnVmZmVyKQogewotCWNoYXIgKiBvcmlnID0gYnVmZmVyOworCXJldHVybiBidWZmZXIgKyBzcHJpbnRmKGJ1ZmZlciwgInZvbHVudGFyeV9jdHh0X3N3aXRjaGVzOlx0JWx1XG4iCisJCQkgICAgIm5vbnZvbHVudGFyeV9jdHh0X3N3aXRjaGVzOlx0JWx1XG4iLAorCQkJICAgIHAtPm52Y3N3LAorCQkJICAgIHAtPm5pdmNzdyk7Cit9CisKK2ludCBwcm9jX3BpZF9zdGF0dXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJY2hhciAqb3JpZyA9IGJ1ZmZlcjsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCiAJYnVmZmVyID0gdGFza19uYW1lKHRhc2ssIGJ1ZmZlcik7CiAJYnVmZmVyID0gdGFza19zdGF0ZSh0YXNrLCBidWZmZXIpOwotIAorCiAJaWYgKG1tKSB7CiAJCWJ1ZmZlciA9IHRhc2tfbWVtKG1tLCBidWZmZXIpOwogCQltbXB1dChtbSk7CkBAIC0zMDcsNiArMzE2LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TMzkwKQogCWJ1ZmZlciA9IHRhc2tfc2hvd19yZWdzKHRhc2ssIGJ1ZmZlcik7CiAjZW5kaWYKKwlidWZmZXIgPSB0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyh0YXNrLCBidWZmZXIpOwogCXJldHVybiBidWZmZXIgLSBvcmlnOwogfQogCkBAIC0zMzIsNyArMzQyLDcgQEAKIAogc3RhdGljIGNsb2NrX3QgdGFza19zdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JY2xvY2tfdCBzdGltZSA9IGNwdXRpbWVfdG9fY2xvY2tfdChwLT5zdGltZSk7CisJY2xvY2tfdCBzdGltZTsKIAogCS8qCiAJICogVXNlIENGUydzIHByZWNpc2UgYWNjb3VudGluZy4gKHdlIHN1YnRyYWN0IHV0aW1lIGZyb20KQEAgLTM0NCw4ICszNTQsNyBAQAogCXJldHVybiBzdGltZTsKIH0KIAotCi1zdGF0aWMgaW50IGRvX3Rhc2tfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIsIGludCB3aG9sZSkKK3N0YXRpYyBpbnQgZG9fdGFza19zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyLCBpbnQgd2hvbGUpCiB7CiAJdW5zaWduZWQgbG9uZyB2c2l6ZSwgZWlwLCBlc3AsIHdjaGFuID0gfjBVTDsKIAlsb25nIHByaW9yaXR5LCBuaWNlOwpAQCAtMzUzLDcgKzM2Miw3IEBACiAJc2lnc2V0X3Qgc2lnaWduLCBzaWdjYXRjaDsKIAljaGFyIHN0YXRlOwogCWludCByZXM7Ci0gCXBpZF90IHBwaWQgPSAwLCBwZ2lkID0gLTEsIHNpZCA9IC0xOworCXBpZF90IHBwaWQgPSAwLCBwZ2lkID0gLTEsIHNpZCA9IC0xOwogCWludCBudW1fdGhyZWFkcyA9IDA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X3RpbWU7CkBAIC00MjQsNyArNDMzLDcgQEAKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAoIXdob2xlIHx8IG51bV90aHJlYWRzPDIpCisJaWYgKCF3aG9sZSB8fCBudW1fdGhyZWFkcyA8IDIpCiAJCXdjaGFuID0gZ2V0X3djaGFuKHRhc2spOwogCWlmICghd2hvbGUpIHsKIAkJbWluX2ZsdCA9IHRhc2stPm1pbl9mbHQ7CkBAIC00NDAsMTIgKzQ0OSwxMyBAQAogCiAJLyogVGVtcG9yYXJ5IHZhcmlhYmxlIG5lZWRlZCBmb3IgZ2NjLTIuOTYgKi8KIAkvKiBjb252ZXJ0IHRpbWVzcGVjIC0+IG5zZWMqLwotCXN0YXJ0X3RpbWUgPSAodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPnN0YXJ0X3RpbWUudHZfc2VjICogTlNFQ19QRVJfU0VDCi0JCQkJKyB0YXNrLT5zdGFydF90aW1lLnR2X25zZWM7CisJc3RhcnRfdGltZSA9CisJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+cmVhbF9zdGFydF90aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQworCQkJCSsgdGFzay0+cmVhbF9zdGFydF90aW1lLnR2X25zZWM7CiAJLyogY29udmVydCBuc2VjIC0+IHRpY2tzICovCiAJc3RhcnRfdGltZSA9IG5zZWNfdG9fY2xvY2tfdChzdGFydF90aW1lKTsKIAotCXJlcyA9IHNwcmludGYoYnVmZmVyLCIlZCAoJXMpICVjICVkICVkICVkICVkICVkICV1ICVsdSBcCisJcmVzID0gc3ByaW50ZihidWZmZXIsICIlZCAoJXMpICVjICVkICVkICVkICVkICVkICV1ICVsdSBcCiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsZCAlbGQgJWxkICVsZCAlZCAwICVsbHUgJWx1ICVsZCAlbHUgJWx1ICVsdSAlbHUgJWx1IFwKICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWQgJWQgJXUgJXUgJWxsdVxuIiwKIAkJdGFzay0+cGlkLApAQCAtNDcxLDcgKzQ4MSw3IEBACiAJCXN0YXJ0X3RpbWUsCiAJCXZzaXplLAogCQltbSA/IGdldF9tbV9yc3MobW0pIDogMCwKLQkgICAgICAgIHJzc2xpbSwKKwkJcnNzbGltLAogCQltbSA/IG1tLT5zdGFydF9jb2RlIDogMCwKIAkJbW0gPyBtbS0+ZW5kX2NvZGUgOiAwLAogCQltbSA/IG1tLT5zdGFydF9zdGFjayA6IDAsCkBAIC00OTMsMTcgKzUwMywxNyBAQAogCQl0YXNrLT5ydF9wcmlvcml0eSwKIAkJdGFzay0+cG9saWN5LAogCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbGF5YWNjdF9ibGtpb190aWNrcyh0YXNrKSk7Ci0JaWYobW0pCisJaWYgKG1tKQogCQltbXB1dChtbSk7CiAJcmV0dXJuIHJlczsKIH0KIAotaW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoraW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCiB7CiAJcmV0dXJuIGRvX3Rhc2tfc3RhdCh0YXNrLCBidWZmZXIsIDApOwogfQogCi1pbnQgcHJvY190Z2lkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoraW50IHByb2NfdGdpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQogewogCXJldHVybiBkb190YXNrX3N0YXQodGFzaywgYnVmZmVyLCAxKTsKIH0KQEAgLTUxMiwxMiArNTIyLDEyIEBACiB7CiAJaW50IHNpemUgPSAwLCByZXNpZGVudCA9IDAsIHNoYXJlZCA9IDAsIHRleHQgPSAwLCBsaWIgPSAwLCBkYXRhID0gMDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwotCQorCiAJaWYgKG1tKSB7CiAJCXNpemUgPSB0YXNrX3N0YXRtKG1tLCAmc2hhcmVkLCAmdGV4dCwgJmRhdGEsICZyZXNpZGVudCk7CiAJCW1tcHV0KG1tKTsKIAl9CiAKLQlyZXR1cm4gc3ByaW50ZihidWZmZXIsIiVkICVkICVkICVkICVkICVkICVkXG4iLAorCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVkICVkICVkICVkICVkICVkICVkXG4iLAogCQkgICAgICAgc2l6ZSwgcmVzaWRlbnQsIHNoYXJlZCwgdGV4dCwgbGliLCBkYXRhLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNDZlYTVkNS4uNDJjYjRmNSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTY3LDcgKzY3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgpAQCAtMjA0LDEyICsyMDMsMTcgQEAKIAlpbnQgcmVzID0gMDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCWlmIChtbSkgewotCQl1bnNpZ25lZCBpbnQgbGVuID0gbW0tPmVudl9lbmQgLSBtbS0+ZW52X3N0YXJ0OworCQl1bnNpZ25lZCBpbnQgbGVuOworCisJCXJlcyA9IC1FU1JDSDsKKwkJaWYgKCFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKKwkJCWdvdG8gb3V0OworCisJCWxlbiAgPSBtbS0+ZW52X2VuZCAtIG1tLT5lbnZfc3RhcnQ7CiAJCWlmIChsZW4gPiBQQUdFX1NJWkUpCiAJCQlsZW4gPSBQQUdFX1NJWkU7CiAJCXJlcyA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIG1tLT5lbnZfc3RhcnQsIGJ1ZmZlciwgbGVuLCAwKTsKLQkJaWYgKCFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKLQkJCXJlcyA9IC1FU1JDSDsKK291dDoKIAkJbW1wdXQobW0pOwogCX0KIAlyZXR1cm4gcmVzOwpAQCAtMjc5LDcgKzI4Myw3IEBACiBzdGF0aWMgaW50IHByb2NfcGlkX3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQogewogCXVuc2lnbmVkIGxvbmcgd2NoYW47Ci0JY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJd2NoYW4gPSBnZXRfd2NoYW4odGFzayk7CiAKQEAgLTgxMiw3MSArODE2LDYgQEAKIH07CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TRUNDT01QCi1zdGF0aWMgc3NpemVfdCBzZWNjb21wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQljaGFyIF9fYnVmWzIwXTsKLQlzaXplX3QgbGVuOwotCi0JaWYgKCF0c2spCi0JCXJldHVybiAtRVNSQ0g7Ci0JLyogbm8gbmVlZCB0byBwcmludCB0aGUgdHJhaWxpbmcgemVybywgc28gdXNlIG9ubHkgbGVuICovCi0JbGVuID0gc3ByaW50ZihfX2J1ZiwgIiV1XG4iLCB0c2stPnNlY2NvbXAubW9kZSk7Ci0JcHV0X3Rhc2tfc3RydWN0KHRzayk7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgX19idWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNlY2NvbXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JY2hhciBfX2J1ZlsyMF0sICplbmQ7Ci0JdW5zaWduZWQgaW50IHNlY2NvbXBfbW9kZTsKLQlzc2l6ZV90IHJlc3VsdDsKLQotCXJlc3VsdCA9IC1FU1JDSDsKLQlpZiAoIXRzaykKLQkJZ290byBvdXRfbm9fdGFzazsKLQotCS8qIGNhbiBzZXQgaXQgb25seSBvbmNlIHRvIGJlIGV2ZW4gbW9yZSBzZWN1cmUgKi8KLQlyZXN1bHQgPSAtRVBFUk07Ci0JaWYgKHVubGlrZWx5KHRzay0+c2VjY29tcC5tb2RlKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXN1bHQgPSAtRUZBVUxUOwotCW1lbXNldChfX2J1ZiwgMCwgc2l6ZW9mKF9fYnVmKSk7Ci0JY291bnQgPSBtaW4oY291bnQsIHNpemVvZihfX2J1ZikgLSAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoX19idWYsIGJ1ZiwgY291bnQpKQotCQlnb3RvIG91dDsKLQotCXNlY2NvbXBfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKF9fYnVmLCAmZW5kLCAwKTsKLQlpZiAoKmVuZCA9PSAnXG4nKQotCQllbmQrKzsKLQlyZXN1bHQgPSAtRUlOVkFMOwotCWlmIChzZWNjb21wX21vZGUgJiYgc2VjY29tcF9tb2RlIDw9IE5SX1NFQ0NPTVBfTU9ERVMpIHsKLQkJdHNrLT5zZWNjb21wLm1vZGUgPSBzZWNjb21wX21vZGU7Ci0JCXNldF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfU0VDQ09NUCk7Ci0JfSBlbHNlCi0JCWdvdG8gb3V0OwotCXJlc3VsdCA9IC1FSU87Ci0JaWYgKHVubGlrZWx5KCEoZW5kIC0gX19idWYpKSkKLQkJZ290byBvdXQ7Ci0JcmVzdWx0ID0gZW5kIC0gX19idWY7Ci1vdXQ6Ci0JcHV0X3Rhc2tfc3RydWN0KHRzayk7Ci1vdXRfbm9fdGFzazoKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NlY2NvbXBfb3BlcmF0aW9ucyA9IHsKLQkucmVhZAkJPSBzZWNjb21wX3JlYWQsCi0JLndyaXRlCQk9IHNlY2NvbXBfd3JpdGUsCi19OwotI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCi0KICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCiBzdGF0aWMgc3NpemVfdCBwcm9jX2ZhdWx0X2luamVjdF9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0yMDM3LDkgKzE5NzYsNiBAQAogCVJFRygibnVtYV9tYXBzIiwgIFNfSVJVR08sIG51bWFfbWFwcyksCiAjZW5kaWYKIAlSRUcoIm1lbSIsICAgICAgICBTX0lSVVNSfFNfSVdVU1IsIG1lbSksCi0jaWZkZWYgQ09ORklHX1NFQ0NPTVAKLQlSRUcoInNlY2NvbXAiLCAgICBTX0lSVVNSfFNfSVdVU1IsIHNlY2NvbXApLAotI2VuZGlmCiAJTE5LKCJjd2QiLCAgICAgICAgY3dkKSwKIAlMTksoInJvb3QiLCAgICAgICByb290KSwKIAlMTksoImV4ZSIsICAgICAgICBleGUpLApAQCAtMjMyNCw5ICsyMjYwLDYgQEAKIAlSRUcoIm51bWFfbWFwcyIsIFNfSVJVR08sIG51bWFfbWFwcyksCiAjZW5kaWYKIAlSRUcoIm1lbSIsICAgICAgIFNfSVJVU1J8U19JV1VTUiwgbWVtKSwKLSNpZmRlZiBDT05GSUdfU0VDQ09NUAotCVJFRygic2VjY29tcCIsICAgU19JUlVTUnxTX0lXVVNSLCBzZWNjb21wKSwKLSNlbmRpZgogCUxOSygiY3dkIiwgICAgICAgY3dkKSwKIAlMTksoInJvb3QiLCAgICAgIHJvb3QpLAogCUxOSygiZXhlIiwgICAgICAgZXhlKSwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKaW5kZXggOGE0MGUxNS4uYjVlNzE1NSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9nZW5lcmljLmMKKysrIGIvZnMvcHJvYy9nZW5lcmljLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtNTI5LDEyICs1MzAsNiBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAlkcC0+bG93X2lubyA9IGk7CiAKLQlzcGluX2xvY2soJnByb2Nfc3ViZGlyX2xvY2spOwotCWRwLT5uZXh0ID0gZGlyLT5zdWJkaXI7Ci0JZHAtPnBhcmVudCA9IGRpcjsKLQlkaXItPnN1YmRpciA9IGRwOwotCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKLQogCWlmIChTX0lTRElSKGRwLT5tb2RlKSkgewogCQlpZiAoZHAtPnByb2NfaW9wcyA9PSBOVUxMKSB7CiAJCQlkcC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7CkBAIC01NTAsNiArNTQ1LDEzIEBACiAJCWlmIChkcC0+cHJvY19pb3BzID09IE5VTEwpCiAJCQlkcC0+cHJvY19pb3BzID0gJnByb2NfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogCX0KKworCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisJZHAtPm5leHQgPSBkaXItPnN1YmRpcjsKKwlkcC0+cGFyZW50ID0gZGlyOworCWRpci0+c3ViZGlyID0gZHA7CisJc3Bpbl91bmxvY2soJnByb2Nfc3ViZGlyX2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMyw2ICs2MTUsOSBAQAogCWVudC0+bmFtZWxlbiA9IGxlbjsKIAllbnQtPm1vZGUgPSBtb2RlOwogCWVudC0+bmxpbmsgPSBubGluazsKKwllbnQtPnBkZV91c2VycyA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmVudC0+cGRlX3VubG9hZF9sb2NrKTsKKwllbnQtPnBkZV91bmxvYWRfY29tcGxldGlvbiA9IE5VTEw7CiAgb3V0OgogCXJldHVybiBlbnQ7CiB9CkBAIC02NDksOSArNjU0LDYgQEAKIAogCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsIG5hbWUsIFNfSUZESVIgfCBtb2RlLCAyKTsKIAlpZiAoZW50KSB7Ci0JCWVudC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7Ci0JCWVudC0+cHJvY19pb3BzID0gJnByb2NfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0KIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKIAkJCWVudCA9IE5VTEw7CkBAIC02ODYsMTAgKzY4OCw2IEBACiAKIAllbnQgPSBwcm9jX2NyZWF0ZSgmcGFyZW50LG5hbWUsbW9kZSxubGluayk7CiAJaWYgKGVudCkgewotCQlpZiAoU19JU0RJUihtb2RlKSkgewotCQkJZW50LT5wcm9jX2ZvcHMgPSAmcHJvY19kaXJfb3BlcmF0aW9uczsKLQkJCWVudC0+cHJvY19pb3BzID0gJnByb2NfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCX0KIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKIAkJCWVudCA9IE5VTEw7CkBAIC03MzQsOSArNzMyLDM1IEBACiAJCWRlID0gKnA7CiAJCSpwID0gZGUtPm5leHQ7CiAJCWRlLT5uZXh0ID0gTlVMTDsKKworCQlzcGluX2xvY2soJmRlLT5wZGVfdW5sb2FkX2xvY2spOworCQkvKgorCQkgKiBTdG9wIGFjY2VwdGluZyBuZXcgY2FsbGVycyBpbnRvIG1vZHVsZS4gSWYgeW91J3JlCisJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcgLT5wcm9jX2ZvcHMsIHNhdmUgYSBwb2ludGVyIHNvbWV3aGVyZS4KKwkJICovCisJCWRlLT5wcm9jX2ZvcHMgPSBOVUxMOworCQkvKiBXYWl0IHVudGlsIGFsbCBleGlzdGluZyBjYWxsZXJzIGludG8gbW9kdWxlIGFyZSBkb25lLiAqLworCQlpZiAoZGUtPnBkZV91c2VycyA+IDApIHsKKwkJCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGMpOworCisJCQlpZiAoIWRlLT5wZGVfdW5sb2FkX2NvbXBsZXRpb24pCisJCQkJZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbiA9ICZjOworCisJCQlzcGluX3VubG9jaygmZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCQlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbik7CisKKwkJCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisJCQlnb3RvIGNvbnRpbnVlX3JlbW92aW5nOworCQl9CisJCXNwaW5fdW5sb2NrKCZkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworY29udGludWVfcmVtb3Zpbmc6CiAJCWlmIChTX0lTRElSKGRlLT5tb2RlKSkKIAkJCXBhcmVudC0+bmxpbmstLTsKLQkJcHJvY19raWxsX2lub2RlcyhkZSk7CisJCWlmICghU19JU1JFRyhkZS0+bW9kZSkpCisJCQlwcm9jX2tpbGxfaW5vZGVzKGRlKTsKIAkJZGUtPm5saW5rID0gMDsKIAkJV0FSTl9PTihkZS0+c3ViZGlyKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmZGUtPmNvdW50KSkKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCBkNWNlNjVjLi5kZDI4ZTg2IDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xNDAsNiArMTQxLDI1MSBAQAogCS5yZW1vdW50X2ZzCT0gcHJvY19yZW1vdW50LAogfTsKIAorc3RhdGljIHZvaWQgcGRlX3VzZXJzX2RlYyhzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSkKK3sKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlwZGUtPnBkZV91c2Vycy0tOworCWlmIChwZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbiAmJiBwZGUtPnBkZV91c2VycyA9PSAwKQorCQljb21wbGV0ZShwZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbik7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKK30KKworc3RhdGljIGxvZmZfdCBwcm9jX3JlZ19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9mZl90IHJ2ID0gLUVJTlZBTDsKKwlsb2ZmX3QgKCpsbHNlZWspKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCS8qCisJICogcmVtb3ZlX3Byb2NfZW50cnkoKSBpcyBnb2luZyB0byBkZWxldGUgUERFIChhcyBwYXJ0IG9mIG1vZHVsZQorCSAqIGNsZWFudXAgc2VxdWVuY2UpLiBObyBuZXcgY2FsbGVycyBpbnRvIG1vZHVsZSBhbGxvd2VkLgorCSAqLworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwkvKgorCSAqIEJ1bXAgcmVmY291bnQgc28gdGhhdCByZW1vdmVfcHJvY19lbnRyeSB3aWxsIHdhaWwgZm9yIC0+bGxzZWVrIHRvCisJICogY29tcGxldGUuCisJICovCisJcGRlLT5wZGVfdXNlcnMrKzsKKwkvKgorCSAqIFNhdmUgZnVuY3Rpb24gcG9pbnRlciB1bmRlciBsb2NrLCB0byBwcm90ZWN0IGFnYWluc3QgLT5wcm9jX2ZvcHMKKwkgKiBOVUxMJ2lmeWluZyByaWdodCBhZnRlciAtPnBkZV91bmxvYWRfbG9jayBpcyBkcm9wcGVkLgorCSAqLworCWxsc2VlayA9IHBkZS0+cHJvY19mb3BzLT5sbHNlZWs7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmICghbGxzZWVrKQorCQlsbHNlZWsgPSBkZWZhdWx0X2xsc2VlazsKKwlydiA9IGxsc2VlayhmaWxlLCBvZmZzZXQsIHdoZW5jZSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlzc2l6ZV90IHJ2ID0gLUVJTzsKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlyZWFkID0gcGRlLT5wcm9jX2ZvcHMtPnJlYWQ7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChyZWFkKQorCQlydiA9IHJlYWQoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJc3NpemVfdCBydiA9IC1FSU87CisJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXdyaXRlID0gcGRlLT5wcm9jX2ZvcHMtPndyaXRlOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAod3JpdGUpCisJCXJ2ID0gd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHByb2NfcmVnX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcHRzKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGludCBydiA9IDA7CisJdW5zaWduZWQgaW50ICgqcG9sbCkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJcG9sbCA9IHBkZS0+cHJvY19mb3BzLT5wb2xsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAocG9sbCkKKwkJcnYgPSBwb2xsKGZpbGUsIHB0cyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgbG9uZyBwcm9jX3JlZ191bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9uZyBydiA9IC1FTk9UVFk7CisJbG9uZyAoKnVubG9ja2VkX2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmlvY3RsKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXVubG9ja2VkX2lvY3RsID0gcGRlLT5wcm9jX2ZvcHMtPnVubG9ja2VkX2lvY3RsOworCWlvY3RsID0gcGRlLT5wcm9jX2ZvcHMtPmlvY3RsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAodW5sb2NrZWRfaW9jdGwpIHsKKwkJcnYgPSB1bmxvY2tlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChydiA9PSAtRU5PSU9DVExDTUQpCisJCQlydiA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChpb2N0bCkgeworCQlsb2NrX2tlcm5lbCgpOworCQlydiA9IGlvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBwcm9jX3JlZ19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCWxvbmcgcnYgPSAtRU5PVFRZOworCWxvbmcgKCpjb21wYXRfaW9jdGwpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwljb21wYXRfaW9jdGwgPSBwZGUtPnByb2NfZm9wcy0+Y29tcGF0X2lvY3RsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAoY29tcGF0X2lvY3RsKQorCQlydiA9IGNvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHJvY19yZWdfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJ2ID0gLUVJTzsKKwlpbnQgKCptbWFwKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwltbWFwID0gcGRlLT5wcm9jX2ZvcHMtPm1tYXA7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChtbWFwKQorCQlydiA9IG1tYXAoZmlsZSwgdm1hKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19yZWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisJaW50IHJ2ID0gMDsKKwlpbnQgKCpvcGVuKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlvcGVuID0gcGRlLT5wcm9jX2ZvcHMtPm9wZW47CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChvcGVuKQorCQlydiA9IG9wZW4oaW5vZGUsIGZpbGUpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBwcm9jX3JlZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGlub2RlKTsKKwlpbnQgcnYgPSAwOworCWludCAoKnJlbGVhc2UpKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXJlbGVhc2UgPSBwZGUtPnByb2NfZm9wcy0+cmVsZWFzZTsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKHJlbGVhc2UpCisJCXJ2ID0gcmVsZWFzZShpbm9kZSwgZmlsZSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3JlZ19maWxlX29wcyA9IHsKKwkubGxzZWVrCQk9IHByb2NfcmVnX2xsc2VlaywKKwkucmVhZAkJPSBwcm9jX3JlZ19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3JlZ193cml0ZSwKKwkucG9sbAkJPSBwcm9jX3JlZ19wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IHByb2NfcmVnX3VubG9ja2VkX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gcHJvY19yZWdfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLm1tYXAJCT0gcHJvY19yZWdfbW1hcCwKKwkub3BlbgkJPSBwcm9jX3JlZ19vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19yZWdfcmVsZWFzZSwKK307CisKIHN0cnVjdCBpbm9kZSAqcHJvY19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlubywKIAkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewpAQCAtMTY2LDggKzQxMiwxMiBAQAogCQkJaW5vZGUtPmlfbmxpbmsgPSBkZS0+bmxpbms7CiAJCWlmIChkZS0+cHJvY19pb3BzKQogCQkJaW5vZGUtPmlfb3AgPSBkZS0+cHJvY19pb3BzOwotCQlpZiAoZGUtPnByb2NfZm9wcykKLQkJCWlub2RlLT5pX2ZvcCA9IGRlLT5wcm9jX2ZvcHM7CisJCWlmIChkZS0+cHJvY19mb3BzKSB7CisJCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19yZWdfZmlsZV9vcHM7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfZm9wID0gZGUtPnByb2NfZm9wczsKKwkJfQogCX0KIAogCXJldHVybiBpbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19taXNjLmMgYi9mcy9wcm9jL3Byb2NfbWlzYy5jCmluZGV4IDVmZDQ5ZTQuLmQyNGI4ZDQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19taXNjLmMKKysrIGIvZnMvcHJvYy9wcm9jX21pc2MuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAJY3B1dGltZV90IGlkbGV0aW1lID0gY3B1dGltZV9hZGQoaW5pdF90YXNrLnV0aW1lLCBpbml0X3Rhc2suc3RpbWUpOwogCiAJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnVwdGltZSk7CisJbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmdXB0aW1lKTsKIAljcHV0aW1lX3RvX3RpbWVzcGVjKGlkbGV0aW1lLCAmaWRsZSk7CiAJbGVuID0gc3ByaW50ZihwYWdlLCIlbHUuJTAybHUgJWx1LiUwMmx1XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcpIHVwdGltZS50dl9zZWMsCkBAIC00NDMsMTIgKzQ0NCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgamlmOwogCWNwdXRpbWU2NF90IHVzZXIsIG5pY2UsIHN5c3RlbSwgaWRsZSwgaW93YWl0LCBpcnEsIHNvZnRpcnEsIHN0ZWFsOwogCXU2NCBzdW0gPSAwOworCXN0cnVjdCB0aW1lc3BlYyBib290dGltZTsKIAogCXVzZXIgPSBuaWNlID0gc3lzdGVtID0gaWRsZSA9IGlvd2FpdCA9CiAJCWlycSA9IHNvZnRpcnEgPSBzdGVhbCA9IGNwdXRpbWU2NF96ZXJvOwotCWppZiA9IC0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCWlmICh3YWxsX3RvX21vbm90b25pYy50dl9uc2VjKQotCQktLWppZjsKKwlnZXRib290dGltZSgmYm9vdHRpbWUpOworCWppZiA9IGJvb3R0aW1lLnR2X3NlYzsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCWludCBqOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3R0eS5jIGIvZnMvcHJvYy9wcm9jX3R0eS5jCmluZGV4IGIzYTQ3M2IuLjIyODQ2MjIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY190dHkuYworKysgYi9mcy9wcm9jL3Byb2NfdHR5LmMKQEAgLTY5LDcgKzY5LDcgQEAKIAogc3RhdGljIGludCBzaG93X3R0eV9kcml2ZXIoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCB0dHlfZHJpdmVyICpwID0gdjsKKwlzdHJ1Y3QgdHR5X2RyaXZlciAqcCA9IGxpc3RfZW50cnkodiwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKIAlkZXZfdCBmcm9tID0gTUtERVYocC0+bWFqb3IsIHAtPm1pbm9yX3N0YXJ0KTsKIAlkZXZfdCB0byA9IGZyb20gKyBwLT5udW07CiAKQEAgLTEwNiwyMiArMTA2LDEzIEBACiAvKiBpdGVyYXRvciAqLwogc3RhdGljIHZvaWQgKnRfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCWxvZmZfdCBsID0gKnBvczsKLQogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmdHR5X2RyaXZlcnMpCi0JCWlmICghbC0tKQotCQkJcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJnR0eV9kcml2ZXJzLCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKnRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAgPSAoKHN0cnVjdCB0dHlfZHJpdmVyICopdiktPnR0eV9kcml2ZXJzLm5leHQ7Ci0JKCpwb3MpKys7Ci0JcmV0dXJuIHA9PSZ0dHlfZHJpdmVycyA/IE5VTEwgOgotCQkJbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdHR5X2RyaXZlciwgdHR5X2RyaXZlcnMpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZ0dHlfZHJpdmVycywgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgdF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhLmMgYi9mcy9xdW90YS5jCmluZGV4IDlmMjM3ZDYuLmU2NTc3YWMgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhLmMKKysrIGIvZnMvcXVvdGEuYwpAQCAtMTAsMTIgKzEwLDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBDaGVjayB2YWxpZGl0eSBvZiBnZW5lcmljIHF1b3RhY3RsIGNvbW1hbmRzICovCiBzdGF0aWMgaW50IGdlbmVyaWNfcXVvdGFjdGxfdmFsaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBjbWQsIHFpZF90IGlkKQpAQCAtMzg0LDMgKzM4NiwxMTkgQEAKIAogCXJldHVybiByZXQ7CiB9CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCisvKgorICogVGhpcyBjb2RlIHdvcmtzIG9ubHkgZm9yIDMyIGJpdCBxdW90YSB0b29scyBvdmVyIDY0IGJpdCBPUyAoeDg2XzY0LCBpYTY0KQorICogYW5kIGlzIG5lY2Vzc2FyeSBkdWUgdG8gYWxpZ25tZW50IHByb2JsZW1zLgorICovCitzdHJ1Y3QgY29tcGF0X2lmX2RxYmxrIHsKKwljb21wYXRfdTY0IGRxYl9iaGFyZGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2Jzb2Z0bGltaXQ7CisJY29tcGF0X3U2NCBkcWJfY3Vyc3BhY2U7CisJY29tcGF0X3U2NCBkcWJfaWhhcmRsaW1pdDsKKwljb21wYXRfdTY0IGRxYl9pc29mdGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2N1cmlub2RlczsKKwljb21wYXRfdTY0IGRxYl9idGltZTsKKwljb21wYXRfdTY0IGRxYl9pdGltZTsKKwljb21wYXRfdWludF90IGRxYl92YWxpZDsKK307CisKKy8qIFhGUyBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgY29tcGF0X2ZzX3FmaWxlc3RhdCB7CisJY29tcGF0X3U2NCBkcWJfYmhhcmRsaW1pdDsKKwljb21wYXRfdTY0IHFmc19uYmxrczsKKwljb21wYXRfdWludF90IHFmc19uZXh0ZW50czsKK307CisKK3N0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCB7CisJX19zOAkJcXNfdmVyc2lvbjsKKwlfX3UxNgkJcXNfZmxhZ3M7CisJX19zOAkJcXNfcGFkOworCXN0cnVjdCBjb21wYXRfZnNfcWZpbGVzdGF0CXFzX3VxdW90YTsKKwlzdHJ1Y3QgY29tcGF0X2ZzX3FmaWxlc3RhdAlxc19ncXVvdGE7CisJY29tcGF0X3VpbnRfdAlxc19pbmNvcmVkcXM7CisJY29tcGF0X2ludF90CXFzX2J0aW1lbGltaXQ7CisJY29tcGF0X2ludF90CXFzX2l0aW1lbGltaXQ7CisJY29tcGF0X2ludF90CXFzX3J0YnRpbWVsaW1pdDsKKwlfX3UxNgkJcXNfYndhcm5saW1pdDsKKwlfX3UxNgkJcXNfaXdhcm5saW1pdDsKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9xdW90YWN0bCh1bnNpZ25lZCBpbnQgY21kLCBjb25zdCBjaGFyIF9fdXNlciAqc3BlY2lhbCwKKwkJCQkJCXFpZF90IGlkLCB2b2lkIF9fdXNlciAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgY21kczsKKwlzdHJ1Y3QgaWZfZHFibGsgX191c2VyICpkcWJsazsKKwlzdHJ1Y3QgY29tcGF0X2lmX2RxYmxrIF9fdXNlciAqY29tcGF0X2RxYmxrOworCXN0cnVjdCBmc19xdW90YV9zdGF0IF9fdXNlciAqZnNxc3RhdDsKKwlzdHJ1Y3QgY29tcGF0X2ZzX3F1b3RhX3N0YXQgX191c2VyICpjb21wYXRfZnNxc3RhdDsKKwljb21wYXRfdWludF90IGRhdGE7CisJdTE2IHhkYXRhOworCWxvbmcgcmV0OworCisJY21kcyA9IGNtZCA+PiBTVUJDTURTSElGVDsKKworCXN3aXRjaCAoY21kcykgeworCWNhc2UgUV9HRVRRVU9UQToKKwkJZHFibGsgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGlmX2RxYmxrKSk7CisJCWNvbXBhdF9kcWJsayA9IGFkZHI7CisJCXJldCA9IHN5c19xdW90YWN0bChjbWQsIHNwZWNpYWwsIGlkLCBkcWJsayk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJaWYgKGNvcHlfaW5fdXNlcihjb21wYXRfZHFibGssIGRxYmxrLCBzaXplb2YoKmNvbXBhdF9kcWJsaykpIHx8CisJCQlnZXRfdXNlcihkYXRhLCAmZHFibGstPmRxYl92YWxpZCkgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZjb21wYXRfZHFibGstPmRxYl92YWxpZCkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFFfU0VUUVVPVEE6CisJCWRxYmxrID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBpZl9kcWJsaykpOworCQljb21wYXRfZHFibGsgPSBhZGRyOworCQlyZXQgPSAtRUZBVUxUOworCQlpZiAoY29weV9pbl91c2VyKGRxYmxrLCBjb21wYXRfZHFibGssIHNpemVvZigqY29tcGF0X2RxYmxrKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZjb21wYXRfZHFibGstPmRxYl92YWxpZCkgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZkcWJsay0+ZHFiX3ZhbGlkKSkKKwkJCWJyZWFrOworCQlyZXQgPSBzeXNfcXVvdGFjdGwoY21kLCBzcGVjaWFsLCBpZCwgZHFibGspOworCQlicmVhazsKKwljYXNlIFFfWEdFVFFTVEFUOgorCQlmc3FzdGF0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBmc19xdW90YV9zdGF0KSk7CisJCWNvbXBhdF9mc3FzdGF0ID0gYWRkcjsKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGZzcXN0YXQpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXJldCA9IC1FRkFVTFQ7CisJCS8qIENvcHlpbmcgcXNfdmVyc2lvbiwgcXNfZmxhZ3MsIHFzX3BhZCAqLworCQlpZiAoY29weV9pbl91c2VyKGNvbXBhdF9mc3FzdGF0LCBmc3FzdGF0LAorCQkJb2Zmc2V0b2Yoc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0LCBxc191cXVvdGEpKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHFzX3VxdW90YSAqLworCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfZnNxc3RhdC0+cXNfdXF1b3RhLAorCQkJJmZzcXN0YXQtPnFzX3VxdW90YSwKKwkJCXNpemVvZihjb21wYXRfZnNxc3RhdC0+cXNfdXF1b3RhKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZmc3FzdGF0LT5xc191cXVvdGEucWZzX25leHRlbnRzKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmNvbXBhdF9mc3FzdGF0LT5xc191cXVvdGEucWZzX25leHRlbnRzKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHFzX2dxdW90YSAqLworCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfZnNxc3RhdC0+cXNfZ3F1b3RhLAorCQkJJmZzcXN0YXQtPnFzX2dxdW90YSwKKwkJCXNpemVvZihjb21wYXRfZnNxc3RhdC0+cXNfZ3F1b3RhKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZmc3FzdGF0LT5xc19ncXVvdGEucWZzX25leHRlbnRzKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmNvbXBhdF9mc3FzdGF0LT5xc19ncXVvdGEucWZzX25leHRlbnRzKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHRoZSByZXN0ICovCisJCWlmIChjb3B5X2luX3VzZXIoJmNvbXBhdF9mc3FzdGF0LT5xc19pbmNvcmVkcXMsCisJCQkmZnNxc3RhdC0+cXNfaW5jb3JlZHFzLAorCQkJc2l6ZW9mKHN0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCkgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0LCBxc19pbmNvcmVkcXMpKSB8fAorCQkJZ2V0X3VzZXIoeGRhdGEsICZmc3FzdGF0LT5xc19pd2FybmxpbWl0KSB8fAorCQkJcHV0X3VzZXIoeGRhdGEsICZjb21wYXRfZnNxc3RhdC0+cXNfaXdhcm5saW1pdCkpCisJCQlicmVhazsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGFkZHIpOworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yYW1mcy9pbm9kZS5jIGIvZnMvcmFtZnMvaW5vZGUuYwppbmRleCBkNDBkMjJiLi5lZjJiNDZkIDEwMDY0NAotLS0gYS9mcy9yYW1mcy9pbm9kZS5jCisrKyBiL2ZzL3JhbWZzL2lub2RlLmMKQEAgLTYwLDYgKzYwLDcgQEAKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmFtZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZyYW1mc19iYWNraW5nX2Rldl9pbmZvOworCQltYXBwaW5nX3NldF9nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nLCBHRlBfSElHSFVTRVIpOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZmlsZS5jIGIvZnMvcmVpc2VyZnMvZmlsZS5jCmluZGV4IDMwZWViZmIuLjIwNzBhZWUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2ZpbGUuYworKysgYi9mcy9yZWlzZXJmcy9maWxlLmMKQEAgLTEzMDUsNyArMTMwNSw2IEBACiAJaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUgJiYKIAkgICAgKnBwb3MgKyBjb3VudCA+IE1BWF9OT05fTEZTKSB7CiAJCWlmICgqcHBvcyA+PSBNQVhfTk9OX0xGUykgewotCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQlyZXR1cm4gLUVGQklHOwogCQl9CiAJCWlmIChjb3VudCA+IE1BWF9OT05fTEZTIC0gKHVuc2lnbmVkIGxvbmcpKnBwb3MpCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCAxMjcyZDExLi5kZGRlNDg5IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc194YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKaW5kZXggYjRhYzkxMS4uNWE5M2NmZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3VwZXIuYworKysgYi9mcy9yZWlzZXJmcy9zdXBlci5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbnRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KZGlmZiAtLWdpdCBhL2ZzL3NlcV9maWxlLmMgYi9mcy9zZXFfZmlsZS5jCmluZGV4IDQ5MTk0YTQuLmJiYjE5YmUgMTAwNjQ0Ci0tLSBhL2ZzL3NlcV9maWxlLmMKKysrIGIvZnMvc2VxX2ZpbGUuYwpAQCAtMTc3LDIxICsxNzcsMjMgQEAKIAogc3RhdGljIGludCB0cmF2ZXJzZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCBvZmZzZXQpCiB7Ci0JbG9mZl90IHBvcyA9IDA7CisJbG9mZl90IHBvcyA9IDAsIGluZGV4OwogCWludCBlcnJvciA9IDA7CiAJdm9pZCAqcDsKIAogCW0tPnZlcnNpb24gPSAwOwotCW0tPmluZGV4ID0gMDsKKwlpbmRleCA9IDA7CiAJbS0+Y291bnQgPSBtLT5mcm9tID0gMDsKLQlpZiAoIW9mZnNldCkKKwlpZiAoIW9mZnNldCkgeworCQltLT5pbmRleCA9IGluZGV4OwogCQlyZXR1cm4gMDsKKwl9CiAJaWYgKCFtLT5idWYpIHsKIAkJbS0+YnVmID0ga21hbGxvYyhtLT5zaXplID0gUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtLT5idWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcCA9IG0tPm9wLT5zdGFydChtLCAmbS0+aW5kZXgpOworCXAgPSBtLT5vcC0+c3RhcnQobSwgJmluZGV4KTsKIAl3aGlsZSAocCkgewogCQllcnJvciA9IFBUUl9FUlIocCk7CiAJCWlmIChJU19FUlIocCkpCkBAIC0yMDQsMTUgKzIwNiwxNyBAQAogCQlpZiAocG9zICsgbS0+Y291bnQgPiBvZmZzZXQpIHsKIAkJCW0tPmZyb20gPSBvZmZzZXQgLSBwb3M7CiAJCQltLT5jb3VudCAtPSBtLT5mcm9tOworCQkJbS0+aW5kZXggPSBpbmRleDsKIAkJCWJyZWFrOwogCQl9CiAJCXBvcyArPSBtLT5jb3VudDsKIAkJbS0+Y291bnQgPSAwOwogCQlpZiAocG9zID09IG9mZnNldCkgewotCQkJbS0+aW5kZXgrKzsKKwkJCWluZGV4Kys7CisJCQltLT5pbmRleCA9IGluZGV4OwogCQkJYnJlYWs7CiAJCX0KLQkJcCA9IG0tPm9wLT5uZXh0KG0sIHAsICZtLT5pbmRleCk7CisJCXAgPSBtLT5vcC0+bmV4dChtLCBwLCAmaW5kZXgpOwogCX0KIAltLT5vcC0+c3RvcChtLCBwKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0yNjAsOCArMjY0LDggQEAKIAkJCQl9CiAJCQl9CiAJfQotCW11dGV4X3VubG9jaygmbS0+bG9jayk7CiAJZmlsZS0+Zl92ZXJzaW9uID0gbS0+dmVyc2lvbjsKKwltdXRleF91bmxvY2soJm0tPmxvY2spOwogCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MKHNlcV9sc2Vlayk7CmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IDZjOTgyODYuLjUzZmMyMDggMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC0xMDYxLDggKzEwNjEsOSBAQAogCiAJd2hpbGUgKGxlbikgewogCQlzaXplX3QgcmVhZF9sZW47CisJCWxvZmZfdCBwb3MgPSBzZC0+cG9zOwogCi0JCXJldCA9IGRvX3NwbGljZV90byhpbiwgJnNkLT5wb3MsIHBpcGUsIGxlbiwgZmxhZ3MpOworCQlyZXQgPSBkb19zcGxpY2VfdG8oaW4sICZwb3MsIHBpcGUsIGxlbiwgZmxhZ3MpOwogCQlpZiAodW5saWtlbHkocmV0IDw9IDApKQogCQkJZ290byBvdXRfcmVsZWFzZTsKIApAQCAtMTA4MCw2ICsxMDgxLDcgQEAKIAogCQlieXRlcyArPSByZXQ7CiAJCWxlbiAtPSByZXQ7CisJCXNkLT5wb3MgPSBwb3M7CiAKIAkJaWYgKHJldCA8IHJlYWRfbGVuKQogCQkJZ290byBvdXRfcmVsZWFzZTsKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IDUyNjBkNjIuLmZjOGViZWQgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtODg0LDYgKzg4NCw3IEBACiAJZXJyb3IgPSB0eXBlLT5nZXRfc2IodHlwZSwgZmxhZ3MsIG5hbWUsIGRhdGEsIG1udCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXRfZnJlZV9zZWNkYXRhOworCUJVR19PTighbW50LT5tbnRfc2IpOwogCiAgCWVycm9yID0gc2VjdXJpdHlfc2Jfa2Vybl9tb3VudChtbnQtPm1udF9zYiwgc2VjZGF0YSk7CiAgCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL3VkZi9jcmMuYyBiL2ZzL3VkZi9jcmMuYwppbmRleCAxYjgyYTRhLi5lZjJiZmFhIDEwMDY0NAotLS0gYS9mcy91ZGYvY3JjLmMKKysrIGIvZnMvdWRmL2NyYy5jCkBAIC0xMDYsOCArMTA2LDggQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB4OwogCi0JeCA9IHVkZl9jcmMxNihieXRlcywgc2l6ZW9mIGJ5dGVzKTsKLQlwcmludGYoInVkZl9jcmMxNjogY2FsY3VsYXRlZCA9ICU0LjR4LCBjb3JyZWN0ID0gJTQuNHhcbiIsIHgsIDB4MzI5OVUpOworCXggPSB1ZGZfY3JjKGJ5dGVzLCBzaXplb2YgYnl0ZXMpOworCXByaW50ZigidWRmX2NyYzogY2FsY3VsYXRlZCA9ICU0LjR4LCBjb3JyZWN0ID0gJTQuNHhcbiIsIHgsIDB4MzI5OVUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy91ZGYvaWFsbG9jLmMgYi9mcy91ZGYvaWFsbG9jLmMKaW5kZXggODIwNjk4My4uMTBmMzE4OCAxMDA2NDQKLS0tIGEvZnMvdWRmL2lhbGxvYy5jCisrKyBiL2ZzL3VkZi9pYWxsb2MuYwpAQCAtNTAsNyArNTAsNyBAQAogCQllbHNlCiAJCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMgPQogCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcykgLSAxKTsKLQkJCisKIAkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRiaCk7CiAJfQogCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKQEAgLTEzNiw2ICsxMzYsMTMgQEAKIAkJVURGX0lfRUZFKGlub2RlKSA9IDA7CiAJCVVERl9JX0RBVEEoaW5vZGUpID0ga3phbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIEdGUF9LRVJORUwpOwogCX0KKwlpZiAoIVVERl9JX0RBVEEoaW5vZGUpKQorCXsKKwkJaXB1dChpbm9kZSk7CisJCSplcnIgPSAtRU5PTUVNOworCQltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KIAlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IpKQogCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOwogCWVsc2UgaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lub2RlLmMgYi9mcy91ZGYvaW5vZGUuYwppbmRleCBiZjdkZTBiLi41YjgyZTQ4IDEwMDY0NAotLS0gYS9mcy91ZGYvaW5vZGUuYworKysgYi9mcy91ZGYvaW5vZGUuYwpAQCAtNDksNiArNDksNyBAQAogc3RhdGljIG1vZGVfdCB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICopOwogc3RhdGljIGludCB1ZGZfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogc3RhdGljIHZvaWQgdWRmX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3N0YXRpYyBpbnQgdWRmX2FsbG9jX2lfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9nZXRibGsoc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBpbnQgKiwKIAlsb25nICosIGludCAqKTsKIHN0YXRpYyBpbnQ4X3QgdWRmX2luc2VydF9hZXh0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uLApAQCAtNzM0LDcgKzczNSw3IEBACiAJCQkoKmMpICsrOwogCQkJKCplbmRudW0pICsrOwogCQl9Ci0JCQorCiAJCWxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IG5ld2Jsb2NrbnVtOwogCQlpZiAoZXR5cGUgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpCiAJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPQpAQCAtODM2LDcgKzgzNyw3IEBACiAJCQkJewogCQkJCQludW1hbGxvYyAtPSBlbGVuOwogCQkJCQlpZiAoKmVuZG51bSA+IChpKzEpKQotCQkJCQkJbWVtbW92ZSgmbGFhcnJbaV0sICZsYWFycltpKzFdLCAKKwkJCQkJCW1lbW1vdmUoJmxhYXJyW2ldLCAmbGFhcnJbaSsxXSwKIAkJCQkJCQlzaXplb2YobG9uZ19hZCkgKiAoKmVuZG51bSAtIChpKzEpKSk7CiAJCQkJCWkgLS07CiAJCQkJCSgqZW5kbnVtKSAtLTsKQEAgLTEwMjQsNyArMTAyNSw3IEBACiAJewogCQlibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUsIHVkZl9nZXRfYmxvY2spOwogCQl1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhpbm9kZSk7Ci0JfQkKKwl9CiAKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAlpZiAoSVNfU1lOQyhpbm9kZSkpCkBAIC0xMDg3LDEwICsxMDg4LDEwIEBACiAJCQl7CiAJCQkJa2VybmVsX2xiX2FkZHIgbG9jOwogCQkJCWllID0gKHN0cnVjdCBpbmRpcmVjdEVudHJ5ICopaWJoLT5iX2RhdGE7Ci0JCisKIAkJCQlsb2MgPSBsZWxiX3RvX2NwdShpZS0+aW5kaXJlY3RJQ0IuZXh0TG9jYXRpb24pOwotCQotCQkJCWlmIChpZS0+aW5kaXJlY3RJQ0IuZXh0TGVuZ3RoICYmIAorCisJCQkJaWYgKGllLT5pbmRpcmVjdElDQi5leHRMZW5ndGggJiYKIAkJCQkJKG5iaCA9IHVkZl9yZWFkX3B0YWdnZWQoaW5vZGUtPmlfc2IsIGxvYywgMCwgJmlkZW50KSkpCiAJCQkJewogCQkJCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0ZFIHx8CkBAIC0xMTU2LDE0ICsxMTU3LDIyIEBACiAJewogCQlVREZfSV9FRkUoaW5vZGUpID0gMTsKIAkJVURGX0lfVVNFKGlub2RlKSA9IDA7Ci0JCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1ZGZfYWxsb2NfaV9kYXRhKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSkpCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXJldHVybjsKKwkJfQogCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpOwogCX0KIAllbHNlIGlmIChsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkgPT0gVEFHX0lERU5UX0ZFKQogCXsKIAkJVURGX0lfRUZFKGlub2RlKSA9IDA7CiAJCVVERl9JX1VTRShpbm9kZSkgPSAwOwotCQlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSkpCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXJldHVybjsKKwkJfQogCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSk7CiAJfQogCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfVVNFKQpAQCAtMTE3Myw3ICsxMTgyLDExIEBACiAJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9CiAJCQlsZTMyX3RvX2NwdSgKIAkJCQkoKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqKWJoLT5iX2RhdGEpLT5sZW5ndGhBbGxvY0Rlc2NzKTsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKSkKKwkJeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CiAJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTkxLDcgKzEyMDQsNyBAQAogCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUoZmUtPmZpbGVMaW5rQ291bnQpOwogCWlmICghaW5vZGUtPmlfbmxpbmspCiAJCWlub2RlLT5pX25saW5rID0gMTsKLQkKKwogCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShmZS0+aW5mb3JtYXRpb25MZW5ndGgpOwogCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKIApAQCAtMTI0Myw3ICsxMjU2LDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJaW5vZGUtPmlfYmxvY2tzID0gbGU2NF90b19jcHUoZWZlLT5sb2dpY2FsQmxvY2tzUmVjb3JkZWQpIDw8IAorCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShlZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCkgPDwKIAkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwogCiAJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKQEAgLTEzNzQsNiArMTM4NywyMCBAQAogCX0KIH0KIAorc3RhdGljIGludCB1ZGZfYWxsb2NfaV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBzaXplKQoreworCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghVURGX0lfREFUQShpbm9kZSkpCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjp1ZGZfYWxsb2NfaV9kYXRhIChpbm8gJWxkKSBubyBmcmVlIG1lbW9yeVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgbW9kZV90CiB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICpmZSkKIHsKQEAgLTIwNzIsNyArMjA5OSw3IEBACiAJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShvZXBvcy5iaCwgaW5vZGUpOwogCQl9CiAJfQotCQorCiAJYnJlbHNlKGVwb3MuYmgpOwogCWJyZWxzZShvZXBvcy5iaCk7CiAJcmV0dXJuIChlbGVuID4+IDMwKTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zdXBlci5jIGIvZnMvdWZzL3N1cGVyLmMKaW5kZXggMjJmZjZlZC4uMmIzMDExNiAxMDA2NDQKLS0tIGEvZnMvdWZzL3N1cGVyLmMKKysrIGIvZnMvdWZzL3N1cGVyLmMKQEAgLTg3LDYgKzg3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKQEAgLTg1NCw3ICs4NTUsNyBAQAogCXVzcGktPnNfZm1hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZm1hc2spOwogCXVzcGktPnNfZnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaGlmdCk7CiAKLQlpZiAodXNwaS0+c19mc2l6ZSAmICh1c3BpLT5zX2ZzaXplIC0gMSkpIHsKKwlpZiAoIWlzX3Bvd2VyX29mXzIodXNwaS0+c19mc2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogZnJhZ21lbnQgc2l6ZSAldSBpcyBub3QgYSBwb3dlciBvZiAyXG4iLAogCQkJdXNwaS0+c19mc2l6ZSk7CiAJCQlnb3RvIGZhaWxlZDsKQEAgLTg2OSw3ICs4NzAsNyBAQAogCQkJdXNwaS0+c19mc2l6ZSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KLQlpZiAodXNwaS0+c19ic2l6ZSAmICh1c3BpLT5zX2JzaXplIC0gMSkpIHsKKwlpZiAoIWlzX3Bvd2VyX29mXzIodXNwaS0+c19ic2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogYmxvY2sgc2l6ZSAldSBpcyBub3QgYSBwb3dlciBvZiAyXG4iLAogCQkJdXNwaS0+c19ic2l6ZSk7CiAJCWdvdG8gZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZnMvdXRpbWVzLmMgYi9mcy91dGltZXMuYwppbmRleCBiM2M4ODk1Li44M2E3ZTY5IDEwMDY0NAotLS0gYS9mcy91dGltZXMuYworKysgYi9mcy91dGltZXMuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRwdXRfYW5kX291dDsKIAotCQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSB7CisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkgewogCQkJaWYgKGYpIHsKIAkJCQlpZiAoIShmLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCQkJCWdvdG8gZHB1dF9hbmRfb3V0OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCAyZGY2MzYyLi5iMGYwZTU4IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMzUsMTAgKzM1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiBzdGF0aWMga21lbV96b25lX3QgKnhmc19idWZfem9uZTsKLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnhmc19idWZfc2hha2U7CiBTVEFUSUMgaW50IHhmc2J1ZmQodm9pZCAqKTsKIFNUQVRJQyBpbnQgeGZzYnVmZF93YWtldXAoaW50LCBnZnBfdCk7CiBTVEFUSUMgdm9pZCB4ZnNfYnVmX2RlbHdyaV9xdWV1ZSh4ZnNfYnVmX3QgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgeGZzX2J1Zl9zaGFrZSA9IHsKKwkuc2hyaW5rID0geGZzYnVmZF93YWtldXAsCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzbG9nZF93b3JrcXVldWU7CiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOwpAQCAtMTgzMiwxNCArMTgzNSw5IEBACiAJaWYgKCF4ZnNkYXRhZF93b3JrcXVldWUpCiAJCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU7CiAKLQl4ZnNfYnVmX3NoYWtlID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHhmc2J1ZmRfd2FrZXVwKTsKLQlpZiAoIXhmc19idWZfc2hha2UpCi0JCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOwotCisJcmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19idWZfc2hha2UpOwogCXJldHVybiAwOwogCi0gb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAgb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU6CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogIG91dF9mcmVlX2J1Zl96b25lOgpAQCAtMTg1NCw3ICsxODUyLDcgQEAKIHZvaWQKIHhmc19idWZfdGVybWluYXRlKHZvaWQpCiB7Ci0JcmVtb3ZlX3Nocmlua2VyKHhmc19idWZfc2hha2UpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19idWZfc2hha2UpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogCWttZW1fem9uZV9kZXN0cm95KHhmc19idWZfem9uZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAwNjg5NGNmLi40NTI4ZjlhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTU2Miw2ICs1NjIsNyBAQAogCWJodl92ZnNfc3luY193b3JrX3QJKndvcmssICpuOwogCUxJU1RfSEVBRAkJKHRtcCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJdGltZWxlZnQgPSB4ZnNfc3luY2RfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7CiAJZm9yICg7OykgewogCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lbGVmdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaAppbmRleCAzM2RkMWNhLi4yMDFjYzMyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKQEAgLTE4LDYgKzE4LDggQEAKICNpZm5kZWYgX19YRlNfU1VQRVJfSF9fCiAjZGVmaW5lIF9fWEZTX1NVUEVSX0hfXwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KKwogI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKICMgZGVmaW5lIHZmc19pbnNlcnRkbWFwaSh2ZnMpCXZmc19pbnNlcnRvcHModmZzcCwgJnhmc19kbW9wcykKICMgZGVmaW5lIHZmc19pbml0ZG1hcGkoKQlkbWFwaV9pbml0KCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwppbmRleCA3ZGVmNGM2Li4yZDI3NGIyIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC02Miw3ICs2Miw2IEBACiAKIGttZW1fem9uZV90CSpxbV9kcXpvbmU7CiBrbWVtX3pvbmVfdAkqcW1fZHF0cnh6b25lOwotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqeGZzX3FtX3NoYWtlcjsKIAogc3RhdGljIGNyZWRfdAl4ZnNfemVyb2NyOwogCkBAIC03OCw2ICs3NywxMSBAQAogU1RBVElDIGludAl4ZnNfcW1faW5pdF9xdW90YWluZm8oeGZzX21vdW50X3QgKik7CiBTVEFUSUMgaW50CXhmc19xbV9zaGFrZShpbnQsIGdmcF90KTsKIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciB4ZnNfcW1fc2hha2VyID0geworCS5zaHJpbmsgPSB4ZnNfcW1fc2hha2UsCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKICNpZmRlZiBERUJVRwogZXh0ZXJuIG11dGV4X3QJcWNoZWNrX2xvY2s7CiAjZW5kaWYKQEAgLTE0OSw3ICsxNTMsNyBAQAogCX0gZWxzZQogCQl4cW0tPnFtX2Rxem9uZSA9IHFtX2Rxem9uZTsKIAotCXhmc19xbV9zaGFrZXIgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgeGZzX3FtX3NoYWtlKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmeGZzX3FtX3NoYWtlcik7CiAKIAkvKgogCSAqIFRoZSB0X2RxaW5mbyBwb3J0aW9uIG9mIHRyYW5zYWN0aW9ucy4KQEAgLTE4MSw3ICsxODUsNyBAQAogCiAJQVNTRVJUKHhxbSAhPSBOVUxMKTsKIAlBU1NFUlQoeHFtLT5xbV9ucmVmcyA9PSAwKTsKLQlyZW1vdmVfc2hyaW5rZXIoeGZzX3FtX3NoYWtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmeGZzX3FtX3NoYWtlcik7CiAJaHNpemUgPSB4cW0tPnFtX2RxaGFzaG1hc2sgKyAxOwogCWZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKSB7CiAJCXhmc19xbV9saXN0X2Rlc3Ryb3koJih4cW0tPnFtX3Vzcl9kcWh0YWJsZVtpXSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZmIuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5YmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2ZiLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyogQ2FjaGluZyBpcyBvZmYgaW4gdGhlIEkvTyBzcGFjZSBxdWFkcmFudCBieSBkZXNpZ24uICAqLworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oIGIvaW5jbHVkZS9hc20tYWxwaGEvaW8uaAppbmRleCAyMWE4NmYxLi5hYjViNjBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKQEAgLTQsNiArNCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTkwLDYgKzkxLDExIEBACiAKICNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpCXBhZ2VfdG9fcGEocGFnZSkKIAorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IF9fZGVwcmVjYXRlZCBpc2FfcGFnZV90b19idXMoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIHBhZ2VfdG9fcGh5cyhwYWdlKTsKK30KKwogLyogVGhpcyBkZXBlbmRzIG9uIHdvcmtpbmcgaW9tbXUuICAqLwogI2RlZmluZSBCSU9fVk1FUkdFX0JPVU5EQVJZCShhbHBoYV9tdi5tdl9wY2lfdGJpID8gUEFHRV9TSVpFIDogMCkKIApAQCAtMTAyLDEyICsxMDgsMTIgQEAKICAqCiAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIGZvciBhIGxpbWl0ZWQgcmFuZ2Ugb2Yga2VybmVsIGFkZHJlc3NlcywKICAqIGFuZCB2ZXJ5IHdlbGwgbWF5IG5vdCBzcGFuIGFsbCBtZW1vcnkuICBDb25zaWRlciB0aGlzIGludGVyZmFjZSAKLSAqIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucyBpbiA8YXNtL3BjaS5oPi4KKyAqIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBETUEtbWFwcGluZyBBUEkuCiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fZGlyZWN0X21hcF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19kaXJlY3RfbWFwX3NpemU7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2J1cyh2b2lkICphZGRyZXNzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZGVwcmVjYXRlZCB2aXJ0X3RvX2J1cyh2b2lkICphZGRyZXNzKQogewogCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHZpcnRfdG9fcGh5cyhhZGRyZXNzKTsKIAl1bnNpZ25lZCBsb25nIGJ1cyA9IHBoeXMgKyBfX2RpcmVjdF9tYXBfYmFzZTsKQEAgLTExNSw3ICsxMjEsNyBAQAogfQogI2RlZmluZSBpc2FfdmlydF90b19idXMgdmlydF90b19idXMKIAotc3RhdGljIGlubGluZSB2b2lkICpidXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKiBfX2RlcHJlY2F0ZWQgYnVzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXZvaWQgKnZpcnQ7CiAKQEAgLTEyNiw2ICsxMzIsNyBAQAogCXZpcnQgPSBwaHlzX3RvX3ZpcnQoYWRkcmVzcyk7CiAJcmV0dXJuIChsb25nKWFkZHJlc3MgPD0gMCA/IE5VTEwgOiB2aXJ0OwogfQorI2RlZmluZSBpc2FfYnVzX3RvX3ZpcnQgYnVzX3RvX3ZpcnQKIAogLyoKICAqIFRoZXJlIGFyZSBkaWZmZXJlbnQgY2hpcHNldHMgdG8gaW50ZXJmYWNlIHRoZSBBbHBoYSBDUFVzIHRvIHRoZSB3b3JsZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaAppbmRleCBkMmJlZDNjLi5iYWU3ZjA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oCkBAIC0xNyw3ICsxNyw4IEBACiBleHRlcm4gdm9pZCBjbGVhcl9wYWdlKHZvaWQgKnBhZ2UpOwogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2bWFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2bWFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIGV4dGVybiB2b2lkIGNvcHlfcGFnZSh2b2lkICogX3RvLCB2b2lkICogX2Zyb20pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCmluZGV4IDYxNmQyMDYuLjk5MDM3YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKQEAgLTI2NCwyMSArMjY0LDE1IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfRk9SKTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfRk9XKTsgfQotZXh0ZXJuIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GT0UpOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogCiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9GT1c7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0ZPUjsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRk9FOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfihfX0RJUlRZX0JJVFMpOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH4oX19BQ0NFU1NfQklUUyk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9XOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9SOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9FOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX19ESVJUWV9CSVRTOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX19BQ0NFU1NfQklUUzsgcmV0dXJuIHB0ZTsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmgKaW5kZXggMzllNDkyYy4uZmExMzcxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1pb3MuaApAQCAtODEsNyArODEsNyBAQAogCiAjZGVmaW5lIHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKGFfdGVybWlvcywgdV90ZXJtaW8pCQkJXAogKHsJCQkJCQkJCQkJXAotCXN0cnVjdCB0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQkJXAorCXN0cnVjdCBrdGVybWlvcyAqa190ZXJtaW9zID0gKGFfdGVybWlvcyk7CQkJCVwKIAlzdHJ1Y3QgdGVybWlvIGtfdGVybWlvOwkJCQkJCQlcCiAJaW50IGNhbm9uLCByZXQ7CQkJCQkJCQlcCiAJCQkJCQkJCQkJXApAQCAtMTEzLDcgKzExMyw3IEBACiAgKi8KICNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odV90ZXJtaW8sIGFfdGVybWlvcykJCVwKICh7CQkJCQkJCQkJXAotCXN0cnVjdCB0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQlcCisJc3RydWN0IGt0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQlcCiAJc3RydWN0IHRlcm1pbyBrX3Rlcm1pbzsJCQkJCQlcCiAJaW50IGNhbm9uOwkJCQkJCQlcCiAJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmgKaW5kZXggMGNlNmVlOS4uZDk2YjEwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MS9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTEvYm9hcmQuaApAQCAtNjQsNiArNjQsNyBAQAogCiAgLyogRXRoZXJuZXQgKEVNQUMgJiBNQUNCKSAqLwogc3RydWN0IGF0OTFfZXRoX2RhdGEgeworCXUzMgkJcGh5X21hc2s7CiAJdTgJCXBoeV9pcnFfcGluOwkvKiBQSFkgSVJRICovCiAJdTgJCWlzX3JtaWk7CS8qIHVzaW5nIFJNSUkgaW50ZXJmYWNlPyAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9mYi5oIGIvaW5jbHVkZS9hc20tYXJtL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXJtL3BndGFibGUuaAppbmRleCAyMWRlYzlmLi5kMmU4MTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLmgKQEAgLTgzLDE0ICs4MywxNCBAQAogICogbWVhbnMgdGhhdCBhIHdyaXRlIHRvIGEgY2xlYW4gcGFnZSB3aWxsIGNhdXNlIGEgcGVybWlzc2lvbiBmYXVsdCwgYW5kCiAgKiB0aGUgTGludXggTU0gbGF5ZXIgd2lsbCBtYXJrIHRoZSBwYWdlIGRpcnR5IHZpYSBoYW5kbGVfcHRlX2ZhdWx0KCkuCiAgKiBGb3IgdGhlIGhhcmR3YXJlIHRvIG5vdGljZSB0aGUgcGVybWlzc2lvbiBjaGFuZ2UsIHRoZSBUTEIgZW50cnkgbXVzdAotICogYmUgZmx1c2hlZCwgYW5kIHB0ZXBfZXN0YWJsaXNoKCkgZG9lcyB0aGF0IGZvciB1cy4KKyAqIGJlIGZsdXNoZWQsIGFuZCBwdGVwX3NldF9hY2Nlc3NfZmxhZ3MoKSBkb2VzIHRoYXQgZm9yIHVzLgogICoKICAqIFRoZSAiYWNjZXNzZWQiIG9yICJ5b3VuZyIgYml0IGlzIGVtdWxhdGVkIGJ5IGEgc2ltaWxhciBtZXRob2Q7IHdlIG9ubHkKICAqIGFsbG93IGFjY2Vzc2VzIHRvIHRoZSBwYWdlIGlmIHRoZSAieW91bmciIGJpdCBpcyBzZXQuICBBY2Nlc3NlcyB0byB0aGUKICAqIHBhZ2Ugd2lsbCBjYXVzZSBhIGZhdWx0LCBhbmQgaGFuZGxlX3B0ZV9mYXVsdCgpIHdpbGwgc2V0IHRoZSB5b3VuZyBiaXQKICAqIGZvciB1cyBhcyBsb25nIGFzIHRoZSBwYWdlIGlzIG1hcmtlZCBwcmVzZW50IGluIHRoZSBjb3JyZXNwb25kaW5nIExpbnV4Ci0gKiBQVEUgZW50cnkuICBBZ2FpbiwgcHRlcF9lc3RhYmxpc2goKSB3aWxsIGVuc3VyZSB0aGF0IHRoZSBUTEIgaXMgdXAgdG8KLSAqIGRhdGUuCisgKiBQVEUgZW50cnkuICBBZ2FpbiwgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKCkgd2lsbCBlbnN1cmUgdGhhdCB0aGUgVExCIGlzCisgKiB1cCB0byBkYXRlLgogICoKICAqIEhvd2V2ZXIsIHdoZW4gdGhlICJ5b3VuZyIgYml0IGlzIGNsZWFyZWQsIHdlIGRlbnkgYWNjZXNzIHRvIHRoZSBwYWdlCiAgKiBieSBjbGVhcmluZyB0aGUgaGFyZHdhcmUgUFRFLiAgQ3VycmVudGx5IExpbnV4IGRvZXMgbm90IGZsdXNoIHRoZSBUTEIKQEAgLTI1Nyw5ICsyNTcsNyBAQAogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCiAjZGVmaW5lIHB0ZV9wcmVzZW50KHB0ZSkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1BSRVNFTlQpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9VU0VSKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1dSSVRFKQotI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkocHRlX3ZhbChwdGUpICYgTF9QVEVfRVhFQykKICNkZWZpbmUgcHRlX2RpcnR5KHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9ESVJUWSkKICNkZWZpbmUgcHRlX3lvdW5nKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9ZT1VORykKIApAQCAtMjc1LDEyICsyNzMsOCBAQAogI2RlZmluZSBQVEVfQklUX0ZVTkMoZm4sb3ApIFwKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlXyMjZm4ocHRlX3QgcHRlKSB7IHB0ZV92YWwocHRlKSBvcDsgcmV0dXJuIHB0ZTsgfQogCi0vKlBURV9CSVRfRlVOQyhyZHByb3RlY3QsICY9IH5MX1BURV9VU0VSKTsqLwotLypQVEVfQklUX0ZVTkMobWtyZWFkLCAgICB8PSBMX1BURV9VU0VSKTsqLwogUFRFX0JJVF9GVU5DKHdycHJvdGVjdCwgJj0gfkxfUFRFX1dSSVRFKTsKIFBURV9CSVRfRlVOQyhta3dyaXRlLCAgIHw9IExfUFRFX1dSSVRFKTsKLVBURV9CSVRfRlVOQyhleHByb3RlY3QsICY9IH5MX1BURV9FWEVDKTsKLVBURV9CSVRfRlVOQyhta2V4ZWMsICAgIHw9IExfUFRFX0VYRUMpOwogUFRFX0JJVF9GVU5DKG1rY2xlYW4sICAgJj0gfkxfUFRFX0RJUlRZKTsKIFBURV9CSVRfRlVOQyhta2RpcnR5LCAgIHw9IExfUFRFX0RJUlRZKTsKIFBURV9CSVRfRlVOQyhta29sZCwgICAgICY9IH5MX1BURV9ZT1VORyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZG1hLW1hcHBpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZWFlMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2ZiLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCmluZGV4IGJhOWM3ZDguLjhhMzI5NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oCmluZGV4IDJiMjBlOWYuLjU1YTFhNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9wZ3RhYmxlLmgKQEAgLTIxOCw5ICsyMTgsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkgICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfTk9UX1VTRVIpKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKSAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQURPTkxZKSkKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKSAgICAgICAgICAgICAgICAgICAoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9OT1RfVVNFUikpCiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfQ0xFQU4pKQogI2RlZmluZSBwdGVfeW91bmcocHRlKSAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX09MRCkpCiAvL09OTFkgd2hlbiAhcHRlX3ByZXNlbnQoKSBJIHRoaW5rLiBuaWNrZWQgZnJvbSBhcm0zMiAoRklYTUUhKQpAQCAtMjMxLDggKzIyOSw2IEBACiAKIFBURV9CSVRfRlVOQyh3cnByb3RlY3QsIHw9ICBfUEFHRV9SRUFET05MWSk7CiBQVEVfQklUX0ZVTkMobWt3cml0ZSwgICAmPSB+X1BBR0VfUkVBRE9OTFkpOwotUFRFX0JJVF9GVU5DKGV4cHJvdGVjdCwgfD0gIF9QQUdFX05PVF9VU0VSKTsKLVBURV9CSVRfRlVOQyhta2V4ZWMsICAgICY9IH5fUEFHRV9OT1RfVVNFUik7CiBQVEVfQklUX0ZVTkMobWtjbGVhbiwgICB8PSAgX1BBR0VfQ0xFQU4pOwogUFRFX0JJVF9GVU5DKG1rZGlydHksICAgJj0gfl9QQUdFX0NMRUFOKTsKIFBURV9CSVRfRlVOQyhta29sZCwgICAgIHw9ICBfUEFHRV9PTEQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1iaXRzLmgKaW5kZXggZjY2YjUxOC4uNDhkMmY1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtYml0cy5oCkBAIC0xMzgsNiArMTM4LDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICBCT1RIRVIgIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE1MywxMCArMTU0LDEyIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDTVNQQVIgICAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lIElCU0hJRlQJICAxNgkJLyogU2hpZnQgZnJvbSBDQkFVRCB0byBDSUJBVUQgKi8KKwogLyogY19sZmxhZyBiaXRzICovCiAjZGVmaW5lIElTSUcJMDAwMDAwMQogI2RlZmluZSBJQ0FOT04JMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oCmluZGV4IDMyOWMzMjQuLjI5M2UzZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtaW9zLmgKQEAgLTgyLDggKzgyLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKaW5kZXggOWZkMmUzMi4uOTc0NDgwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCkBAIC0yMSw2ICsyMSw3IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX2FkZF9kZXZpY2VfdXNhcnQodW5zaWduZWQgaW50IGlkKTsKIAogc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIHsKKwl1MzIJcGh5X21hc2s7CiAJdTgJaXNfcm1paTsKIH07CiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2ZiLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYmFmODQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9mYi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdCgocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKKwkJCQkgICAgICAmIH5fUEFHRV9DQUNIQUJMRSkKKwkJCQkgICAgIHwgKF9QQUdFX0JVRkZFUiB8IF9QQUdFX0RJUlRZKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oCmluZGV4IGY2Y2MyYjAuLmMwN2JkZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9wZ3RhYmxlLmgKQEAgLTIwMSwxOCArMjAxLDEwIEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCiB7CiAJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOwogfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDVVRFOwotfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7CkBAIC0yMzEsMjEgKzIyMywxMSBAQAogfQogCiAvKiBNdXRhdG9yIGZ1bmN0aW9ucyBmb3IgUFRFIGJpdHMgKi8KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1JXKSk7CiAJcmV0dXJuIHB0ZTsKIH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRVhFQ1VURSkpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOwpAQCAtMjU2LDIxICsyMzgsMTEgQEAKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOwogCXJldHVybiBwdGU7CiB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JXKSk7CiAJcmV0dXJuIHB0ZTsKIH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9FWEVDVVRFKSk7Ci0JcmV0dXJuIHB0ZTsKLX0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL2ZiLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2ZiLmggYi9pbmNsdWRlL2FzbS1jcmlzL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvaW9jdGxzLmgKaW5kZXggOTc3ODdjMy4uNGY0ZTUyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2lvY3Rscy5oCkBAIC00OCw2ICs0OCwxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmggYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAppbmRleCA5ZjEzYzMyLi4wNjQ4ZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaApAQCAtMjAsNyArMjAsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKSAgICBjbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpIGNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCmluZGV4IGM5NGE3MTAuLjQxN2Y3MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCkBAIC0xMTEsOSArMTExLDcgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpICAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKSAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKSAgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpICAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CkBAIC0xMjQsMTggKzEyMiw2IEBACiAgICAgICAgIHJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0gICAgICAgIHB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JFQUQgfCBfUEFHRV9TSUxFTlRfUkVBRCk7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUkVBRCB8IF9QQUdFX1NJTEVOVF9SRUFEKTsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9NT0RJRklFRCB8IF9QQUdFX1NJTEVOVF9XUklURSk7IApAQCAtMTU2LDIyICsxNDIsNiBAQAogICAgICAgICByZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsKLSAgICAgICAgaWYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEKQotICAgICAgICAgICAgICAgIHB0ZV92YWwocHRlKSB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLSAgICAgICAgcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7Ci0gICAgICAgIGlmIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRCkKLSAgICAgICAgICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0gICAgICAgIHJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTU9ESUZJRUQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmgKaW5kZXggNmNjMmUyNy4uNzFjMWIzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaApAQCAtMTY2LDYgKzE2Niw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICBCT1RIRVIgIDAwMTAwMDAKICNkZWZpbmUgIEI1NzYwMCAgMDAxMDAwMQogI2RlZmluZSAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICBCMjMwNDAwIDAwMTAwMDMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy90ZXJtaW9zLmgKaW5kZXggYzlkYmQ0ZC4uYjAxMjRlNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oCkBAIC04MSw4ICs4MSwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9mYi5oIGIvaW5jbHVkZS9hc20tZnJ2L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaAppbmRleCAxMTRhZWZhLi4xNDdlOTk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9wZ3RhYmxlLmgKQEAgLTM3NywzMCArMzc3LDE3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEoKHB0ZSkucHRlICYgX1BBR0VfU1VQRVIpOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAhKChwdGUpLnB0ZSAmIF9QQUdFX1NVUEVSKTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAhKChwdGUpLnB0ZSAmIF9QQUdFX1dQKTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9TVVBFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgfD0gX1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9XUDsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX1NVUEVSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX1dQOyByZXR1cm4gcHRlOyB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JaW50IGkgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCBwdGVwKTsKLQlhc20gdm9sYXRpbGUoImRjZiAlTTAiIDo6ICJVIigqcHRlcCkpOwotCXJldHVybiBpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCWludCBpID0gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9BQ0NFU1NFRCwgcHRlcCk7CkBAIC01MTAsNyArNDk3LDYgQEAKIAkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCmluZGV4IGQwZWE2NzguLjczMDZjNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKQEAgLTMyNiwxMCArMzI2LDE0IEBACiAjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzE3CiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTgKICNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTkKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCTMyMAorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkzMjEKKyNkZWZpbmUgX19OUl90aW1lcmZkCQkzMjIKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkzMjMKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAzMjAKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzI0CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIC8qICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCmluZGV4IDdmMzBjY2UuLjM0NGUzMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaApAQCAtMjgsNyArMjgsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgSEFWRV9BUkNIX0JVR19PTgotI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmICh1bmxpa2VseSgoY29uZGl0aW9uKSE9MCkpIEJVRygpOyB9IHdoaWxlKDApCisjZGVmaW5lIEJVR19PTihjb25kaXRpb24pIGRvIHsgaWYgKHVubGlrZWx5KGNvbmRpdGlvbikpIEJVRygpOyB9IHdoaWxlKDApCiAjZW5kaWYKIAogI2lmbmRlZiBIQVZFX0FSQ0hfV0FSTl9PTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmgKaW5kZXggMjk0MTNkMy4uZTI0NjhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oCkBAIC0xLDI0ICsxLDgyIEBACiAjaWZuZGVmIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19ICiAjZGVmaW5lIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19ICiAKLS8qIFRoaXMgaXMgdXNlZCBmb3IgYXJjaHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBETUEgKi8KKy8qIGRlZmluZSB0aGUgZG1hIGFwaSB0byBhbGxvdyBjb21waWxhdGlvbiBidXQgbm90IGxpbmtpbmcgb2YKKyAqIGRtYSBkZXBlbmRlbnQgY29kZS4gIENvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBkbWEtbWFwcGluZworICogQVBJIG5lZWRzIHRvIHNldCAnZGVwZW5kcyBvbiBIQVNfRE1BJyBpbiBpdHMgS2NvbmZpZworICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqCitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKK2V4dGVybiB2b2lkICoKIGRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLAotCQkgICBnZnBfdCBmbGFnKQotewotCUJVRygpOwotCXJldHVybiBOVUxMOwotfQorCQkgICBnZnBfdCBmbGFnKTsKIAotc3RhdGljIGlubGluZSB2b2lkCitleHRlcm4gdm9pZAogZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqY3B1X2FkZHIsCi0JCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JQlVHKCk7Ci19CisJCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwogCiAjZGVmaW5lIGRtYV9hbGxvY19ub25jb2hlcmVudChkLCBzLCBoLCBmKSBkbWFfYWxsb2NfY29oZXJlbnQoZCwgcywgaCwgZikKICNkZWZpbmUgZG1hX2ZyZWVfbm9uY29oZXJlbnQoZCwgcywgdiwgaCkgZG1hX2ZyZWVfY29oZXJlbnQoZCwgcywgdiwgaCkKIAorZXh0ZXJuIGRtYV9hZGRyX3QKK2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiBpbnQKK2RtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuaHdlbnRyaWVzLAorCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIGRtYV9hZGRyX3QKK2RtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKKyNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUKKyNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUKKyNkZWZpbmUgZG1hX3N5bmNfc2dfZm9yX2RldmljZSBkbWFfc3luY19zZ19mb3JfY3B1CisKK2V4dGVybiBpbnQKK2RtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgZG1hX2FkZHIpOworCitleHRlcm4gaW50CitkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworCitleHRlcm4gaW50CitkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CisKK2V4dGVybiBpbnQKK2RtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpOworCitleHRlcm4gaW50CitkbWFfaXNfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisKK2V4dGVybiB2b2lkCitkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwogI2VuZGlmIC8qIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKaW5kZXggYzE1NGI5ZC4uYjg0Nzc0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaApAQCAtNDgsNiArNDgsOSBAQAogI2lmbmRlZiBPX05PQVRJTUUKICNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAjZW5kaWYKKyNpZm5kZWYgT19DTE9FWEVDCisjZGVmaW5lIE9fQ0xPRVhFQwkwMjAwMDAwMAkvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLworI2VuZGlmCiAjaWZuZGVmIE9fTkRFTEFZCiAjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCA3ZDdiY2Y5Li5mNjA1ZThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtMywyNSArMyw2IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKLS8qCi0gKiBFc3RhYmxpc2ggYSBuZXcgbWFwcGluZzoKLSAqICAtIGZsdXNoIHRoZSBvbGQgb25lCi0gKiAgLSB1cGRhdGUgdGhlIHBhZ2UgdGFibGVzCi0gKiAgLSBpbmZvcm0gdGhlIFRMQiBhYm91dCB0aGUgbmV3IG9uZQotICoKLSAqIFdlIGhvbGQgdGhlIG1tIHNlbWFwaG9yZSBmb3IgcmVhZGluZywgYW5kIHRoZSBwdGUgbG9jay4KLSAqCi0gKiBOb3RlOiB0aGUgb2xkIHB0ZSBpcyBrbm93biB0byBub3QgYmUgd3JpdGFibGUsIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAqIHdvcnJ5IGFib3V0IGRpcnR5IGJpdHMgZXRjIGdldHRpbmcgbG9zdC4KLSAqLwotI2RlZmluZSBwdGVwX2VzdGFibGlzaChfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXAsIF9fZW50cnkpCQlcCi1kbyB7CQkJCSAgCQkJCQlcCi0Jc2V0X3B0ZV9hdCgoX192bWEpLT52bV9tbSwgKF9fYWRkcmVzcyksIF9fcHRlcCwgX19lbnRyeSk7CVwKLQlmbHVzaF90bGJfcGFnZShfX3ZtYSwgX19hZGRyZXNzKTsJCQkJXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfU0VUX0FDQ0VTU19GTEFHUwogLyoKICAqIExhcmdlbHkgc2FtZSBhcyBhYm92ZSwgYnV0IG9ubHkgc2V0cyB0aGUgYWNjZXNzIGZsYWdzIChkaXJ0eSwKQEAgLTY4LDMxICs0OSw2IEBACiB9KQogI2VuZGlmCiAKLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCXB0ZV90IF9fcHRlID0gKl9fcHRlcDsJCQkJCQlcCi0JaW50IHIgPSAxOwkJCQkJCQlcCi0JaWYgKCFwdGVfZGlydHkoX19wdGUpKQkJCQkJCVwKLQkJciA9IDA7CQkJCQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIChfX2FkZHJlc3MpLCAoX19wdGVwKSwJXAotCQkJICAgcHRlX21rY2xlYW4oX19wdGUpKTsJCQkJXAotCXI7CQkJCQkJCQlcCi19KQotI2VuZGlmCi0KLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ESVJUWV9GTFVTSAotI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCWludCBfX2RpcnR5OwkJCQkJCQlcCi0JX19kaXJ0eSA9IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKTsJXAotCWlmIChfX2RpcnR5KQkJCQkJCQlcCi0JCWZsdXNoX3RsYl9wYWdlKF9fdm1hLCBfX2FkZHJlc3MpOwkJCVwKLQlfX2RpcnR5OwkJCQkJCQlcCi19KQotI2VuZGlmCi0KICNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIHB0ZXBfZ2V0X2FuZF9jbGVhcihfX21tLCBfX2FkZHJlc3MsIF9fcHRlcCkJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oCmluZGV4IDA5ZWM0NDcuLjE2YTQ2NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaApAQCAtMTgsNyArMTgsOCBAQAogI2RlZmluZSBnZXRfdW5hbGlnbmVkKHB0cikgXAogCV9fZ2V0X3VuYWxpZ25lZCgocHRyKSwgc2l6ZW9mKCoocHRyKSkpCiAjZGVmaW5lIHB1dF91bmFsaWduZWQoeCxwdHIpIFwKLQlfX3B1dF91bmFsaWduZWQoKF9fdTY0KSh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQorCSgodm9pZClzaXplb2YoKihwdHIpPSh4KSksXAorCV9fcHV0X3VuYWxpZ25lZCgoX19mb3JjZSBfX3U2NCkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkpCiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QuICBUaGUgaWRlYSBpcyB0aGF0IHdoZW4KQEAgLTk1LDIxICs5NiwyMSBAQAogCWRlZmF1bHQ6CQkJCVwKIAkJYmFkX3VuYWxpZ25lZF9hY2Nlc3NfbGVuZ3RoKCk7CVwKIAl9OwkJCQkJXAotCShfX3R5cGVvZl9fKCoocHRyKSkpdmFsOwkJXAorCShfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSl2YWw7CVwKIH0pCiAKICNkZWZpbmUgX19wdXRfdW5hbGlnbmVkKHZhbCwgcHRyLCBzaXplKQkJXAotZG8gewkJCQkJCVwKKyh7CQkJCQkJXAogCXZvaWQgKl9fZ3VfcCA9IHB0cjsJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCVwKIAljYXNlIDE6CQkJCQlcCi0JCSooX191OCAqKV9fZ3VfcCA9IHZhbDsJCVwKKwkJKihfX3U4ICopX19ndV9wID0gKF9fZm9yY2UgX191OCl2YWw7CQlcCiAJICAgICAgICBicmVhazsJCQkJXAogCWNhc2UgMjoJCQkJCVwKLQkJX191c3R3KHZhbCwgX19ndV9wKTsJCVwKKwkJX191c3R3KChfX2ZvcmNlIF9fdTE2KXZhbCwgX19ndV9wKTsJCVwKIAkJYnJlYWs7CQkJCVwKIAljYXNlIDQ6CQkJCQlcCi0JCV9fdXN0bCh2YWwsIF9fZ3VfcCk7CQlcCisJCV9fdXN0bCgoX19mb3JjZSBfX3UzMil2YWwsIF9fZ3VfcCk7CQlcCiAJCWJyZWFrOwkJCQlcCiAJY2FzZSA4OgkJCQkJXAogCQlfX3VzdHEodmFsLCBfX2d1X3ApOwkJXApAQCAtMTE3LDYgKzExOCw3IEBACiAJZGVmYXVsdDoJCQkJXAogCSAgICAJYmFkX3VuYWxpZ25lZF9hY2Nlc3NfbGVuZ3RoKCk7CVwKIAl9OwkJCQkJXAotfSB3aGlsZSgwKQorCSh2b2lkKTA7CQkJCVwKK30pCiAKICNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfVU5BTElHTkVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1oODMwMC9kbWEtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBlNDAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2RtYS1tYXBwaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9mYi5oIGIvaW5jbHVkZS9hc20taDgzMDAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaAppbmRleCBhYzIwNDU3Li45OGE1M2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaApAQCAtNDcsNiArNDcsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaAppbmRleCAzYjRmMjkwLi5jOGNjODFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCkBAIC0yMiw3ICsyMiw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1oODMwMC90ZXJtYml0cy5oCmluZGV4IGU4NzdiNDAuLjMxZWNhODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWJpdHMuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNTYsMTAgKzE1NywxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lIElCU0hJRlQJICAxNgkJCS8qIHNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaAppbmRleCBmYjI5MjVkLi43MGVlYTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWlvcy5oCkBAIC04Miw4ICs4MiwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oCmluZGV4IDQ1ZjA5ZGMuLmFlZTQwMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaApAQCAtOTIsNiArOTIsNyBAQAogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJNAkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcKIAkJCQkJICAgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQk1CisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJNgkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCiAKIC8qIGFzIGFib3ZlLCBidXQgYXMgYml0IHZhbHVlcyAqLwogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtOTksNiArMTAwLDcgQEAKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogCiAjZGVmaW5lIF9USUZfV09SS19NQVNLCQkweDAwMDBGRkZFCS8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mYi5oIGIvaW5jbHVkZS9hc20taTM4Ni9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZiLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitleHRlcm4gaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmgKaW5kZXggODBlYTA1Mi4uMjQ5ZTc1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oCkBAIC01NCw2ICs1NCw4IEBACiBlbnVtIGZpeGVkX2FkZHJlc3NlcyB7CiAJRklYX0hPTEUsCiAJRklYX1ZEU08sCisJRklYX0RCR1BfQkFTRSwKKwlGSVhfRUFSTFlDT05fTUVNX0JBU0UsCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJRklYX0FQSUNfQkFTRSwJLyogbG9jYWwgKENQVSkgQVBJQykgLS0gcmVxdWlyZWQgZm9yIFNNUCBvciBub3QgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaCBiL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKaW5kZXggMGZjMjQwYy4uZTc4MTdhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCkBAIC00MCwxNCArNDAsMTMgQEAKIAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBpZGVfZGVmYXVsdF9pb19iYXNlKGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAkvKgogCSAqCUlmIFBDSSBpcyBwcmVzZW50IHRoZW4gaXQgaXMgbm90IHNhZmUgdG8gcG9rZSBhcm91bmQKIAkgKgl0aGUgb3RoZXIgbGVnYWN5IElERSBwb3J0cy4gT25seSAweDFmMCBhbmQgMHgxNzAgYXJlCiAJICoJZGVmaW5lZCBjb21wYXRpYmlsaXR5IG1vZGUgcG9ydHMgZm9yIFBDSS4gQSB1c2VyIGNhbiAKIAkgKglvdmVycmlkZSB0aGlzIHVzaW5nIGlkZT0gYnV0IHdlIG11c3QgZGVmYXVsdCBzYWZlLgogCSAqLwotCWlmICgocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpKSA9PSBOVUxMKSB7CisJaWYgKG5vX3BjaV9kZXZpY2VzKCkpIHsKIAkJc3dpdGNoKGluZGV4KSB7CiAJCQljYXNlIDI6IHJldHVybiAweDFlODsKIAkJCWNhc2UgMzogcmV0dXJuIDB4MTY4OwpAQCAtNTUsNyArNTQsNiBAQAogCQkJY2FzZSA1OiByZXR1cm4gMHgxNjA7CiAJCX0KIAl9Ci0JcGNpX2Rldl9wdXQocGRldik7CiAJc3dpdGNoIChpbmRleCkgewogCQljYXNlIDA6CXJldHVybiAweDFmMDsKIAkJY2FzZSAxOglyZXR1cm4gMHgxNzA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKaW5kZXggZTc5NzU4Ni4uN2I2NWI1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW8uaApAQCAtMTI5LDYgKzEyOSw3IEBACiAgKi8KIGV4dGVybiB2b2lkICpidF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgYnRfaW91bm1hcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgX19pb21lbSAqZml4X2lvcmVtYXAodW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsb25nIHBoeXMpOwogCiAvKiBVc2UgZWFybHkgSU8gbWFwcGluZ3MgZm9yIERNSSBiZWNhdXNlIGl0J3MgaW5pdGlhbGl6ZWQgZWFybHkgKi8KICNkZWZpbmUgZG1pX2lvcmVtYXAgYnRfaW9yZW1hcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAppbmRleCA4MThhYzhiLi45OWNmNWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaApAQCAtMzQsNyArMzQsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmgKaW5kZXggYTUwZmQxNy4uODRiMDNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTJsZXZlbC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaApAQCAtNTcsMTQgKzU3LDYgQEAKICNkZWZpbmUgcGZuX3BtZChwZm4sIHByb3QpCV9fcG1kKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCiAKIC8qCi0gKiBBbGwgcHJlc2VudCB1c2VyIHBhZ2VzIGFyZSB1c2VyLWV4ZWN1dGFibGU6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3VzZXIocHRlKTsKLX0KLQotLyoKICAqIEFsbCBwcmVzZW50IHBhZ2VzIGFyZSBrZXJuZWwtZXhlY3V0YWJsZToKICAqLwogc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWNfa2VybmVsKHB0ZV90IHB0ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaAppbmRleCBlYjBmMWQ3Li45NDhhMzM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oCkBAIC0yMCwyNiArMjAsMTEgQEAKICNkZWZpbmUgcHVkX3ByZXNlbnQocHVkKQkJCTEKIAogLyoKLSAqIElzIHRoZSBwdGUgZXhlY3V0YWJsZT8KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3gocHRlX3QgcHRlKQotewotCXJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX05YKTsKLX0KLQotLyoKLSAqIEFsbCBwcmVzZW50IHVzZXItcGFnZXMgd2l0aCAhTlggYml0IGFyZSB1c2VyLWV4ZWN1dGFibGU6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3VzZXIocHRlKSAmJiBwdGVfeChwdGUpOwotfQotLyoKICAqIEFsbCBwcmVzZW50IHBhZ2VzIHdpdGggIU5YIGJpdCBhcmUga2VybmVsLWV4ZWN1dGFibGU6CiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjX2tlcm5lbChwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIHB0ZV94KHB0ZSk7CisJcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfTlgpOwogfQogCiAvKiBSdWxlcyBmb3IgdXNpbmcgc2V0X3B0ZTogdGhlIHB0ZSBiZWluZyBhc3NpZ25lZCAqbXVzdCogYmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKaW5kZXggNjI4ZmE3Ny4uYzdmZWZhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKQEAgLTc5LDcgKzc5LDcgQEAKICAqIGFyZWEgZm9yIHRoZSBzYW1lIHJlYXNvbi4gOykKICAqLwogI2RlZmluZSBWTUFMTE9DX09GRlNFVAkoOCoxMDI0KjEwMjQpCi0jZGVmaW5lIFZNQUxMT0NfU1RBUlQJKCgodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgKyB2bWFsbG9jX2Vhcmx5cmVzZXJ2ZSArIFwKKyNkZWZpbmUgVk1BTExPQ19TVEFSVAkoKCh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSArIFwKIAkJCTIqVk1BTExPQ19PRkZTRVQtMSkgJiB+KFZNQUxMT0NfT0ZGU0VULTEpKQogI2lmZGVmIENPTkZJR19ISUdITUVNCiAjIGRlZmluZSBWTUFMTE9DX0VORAkoUEtNQVBfQkFTRS0yKlBBR0VfU0laRSkKQEAgLTIxOCw4ICsyMTgsNiBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfVVNFUjsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfUlc7IH0KQEAgLTIzMCwxMyArMjI4LDkgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX0ZJTEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93ICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfUlc7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQpAQCAtMjk1LDE3ICsyODksNiBAQAogCV9fY2hhbmdlZDsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi0jZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkodm1hLCBhZGRyLCBwdGVwKSAoewkJCVwKLQlpbnQgX19yZXQgPSAwOwkJCQkJCQlcCi0JaWYgKHB0ZV9kaXJ0eSgqKHB0ZXApKSkJCQkJCQlcCi0JCV9fcmV0ID0gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwJCVwKLQkJCQkJCSYocHRlcCktPnB0ZV9sb3cpOwlcCi0JaWYgKF9fcmV0KQkJCQkJCQlcCi0JCXB0ZV91cGRhdGUoKHZtYSktPnZtX21tLCBhZGRyLCBwdGVwKTsJCQlcCi0JX19yZXQ7CQkJCQkJCQlcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKICNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyh2bWEsIGFkZHIsIHB0ZXApICh7CQkJXAogCWludCBfX3JldCA9IDA7CQkJCQkJCVwKQEAgLTMxNywyNyArMzAwLDYgQEAKIAlfX3JldDsJCQkJCQkJCVwKIH0pCiAKLS8qCi0gKiBSdWxlcyBmb3IgdXNpbmcgcHRlcF9lc3RhYmxpc2g6IHRoZSBwdGUgTVVTVCBiZSBhIHVzZXIgcHRlLCBhbmQKLSAqIG11c3QgYmUgYSBwcmVzZW50LT5wcmVzZW50IHRyYW5zaXRpb24uCi0gKi8KLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKLSNkZWZpbmUgcHRlcF9lc3RhYmxpc2godm1hLCBhZGRyZXNzLCBwdGVwLCBwdGV2YWwpCQkJXAotZG8gewkJCQkJCQkJCVwKLQlzZXRfcHRlX3ByZXNlbnQoKHZtYSktPnZtX21tLCBhZGRyZXNzLCBwdGVwLCBwdGV2YWwpOwkJXAotCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcmVzcyk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRElSVFlfRkxVU0gKLSNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaF9kaXJ0eSh2bWEsIGFkZHJlc3MsIHB0ZXApCQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fZGlydHk7CQkJCQkJCVwKLQlfX2RpcnR5ID0gcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSgodm1hKSwgKGFkZHJlc3MpLCAocHRlcCkpOwlcCi0JaWYgKF9fZGlydHkpCQkJCQkJCVwKLQkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsJCQkJXAotCV9fZGlydHk7CQkJCQkJCVwKLX0pCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ZT1VOR19GTFVTSAogI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCkJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCmluZGV4IDk0ZTBjMTQuLjQyMmNmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaApAQCAtMjI4LDYgKzIyOCwxMCBAQAogCiAjZGVmaW5lIEhBVkVfQVJDSF9QSUNLX01NQVBfTEFZT1VUCiAKK2V4dGVybiB2b2lkIGhhcmRfZGlzYWJsZV9UU0Modm9pZCk7CitleHRlcm4gdm9pZCBkaXNhYmxlX1RTQyh2b2lkKTsKK2V4dGVybiB2b2lkIGhhcmRfZW5hYmxlX1RTQyh2b2lkKTsKKwogLyoKICAqIFNpemUgb2YgaW9fYml0bWFwLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKaW5kZXggNGNiMGY5MS4uNTQ0MjRlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaApAQCAtMTM3LDYgKzEzNyw3IEBACiAjZGVmaW5lIFRJRl9ERUJVRwkJMTcJLyogdXNlcyBkZWJ1ZyByZWdpc3RlcnMgKi8KICNkZWZpbmUgVElGX0lPX0JJVE1BUAkJMTgJLyogdXNlcyBJL08gYml0bWFwICovCiAjZGVmaW5lIFRJRl9GUkVFWkUJCTE5CS8qIGlzIGZyZWV6aW5nIGZvciBzdXNwZW5kICovCisjZGVmaW5lIFRJRl9OT1RTQwkJMjAJLyogVFNDIGlzIG5vdCBhY2Nlc3NpYmxlIGluIHVzZXJsYW5kICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKQEAgLTE1MSw2ICsxNTIsNyBAQAogI2RlZmluZSBfVElGX0RFQlVHCQkoMTw8VElGX0RFQlVHKQogI2RlZmluZSBfVElGX0lPX0JJVE1BUAkJKDE8PFRJRl9JT19CSVRNQVApCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKKyNkZWZpbmUgX1RJRl9OT1RTQwkJKDE8PFRJRl9OT1RTQykKIAogLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLwogI2RlZmluZSBfVElGX1dPUktfTUFTSyBcCkBAIC0xNjAsNyArMTYyLDggQEAKICNkZWZpbmUgX1RJRl9BTExXT1JLX01BU0sJKDB4MDAwMEZGRkYgJiB+X1RJRl9TRUNDT01QKQogCiAvKiBmbGFncyB0byBjaGVjayBpbiBfX3N3aXRjaF90bygpICovCi0jZGVmaW5lIF9USUZfV09SS19DVFhTVyAoX1RJRl9ERUJVR3xfVElGX0lPX0JJVE1BUCkKKyNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXX05FWFQgKF9USUZfSU9fQklUTUFQIHwgX1RJRl9OT1RTQyB8IF9USUZfREVCVUcpCisjZGVmaW5lIF9USUZfV09SS19DVFhTV19QUkVWIChfVElGX0lPX0JJVE1BUCB8IF9USUZfTk9UU0MpCiAKIC8qCiAgKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKaW5kZXggNDBkMDFkOC4uMGY2ZTUyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCkBAIC0zMSw4ICszMSwxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIGNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9mYi5oIGIvaW5jbHVkZS9hc20taWE2NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTM5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2ZiLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoZWZpX3JhbmdlX2lzX3djKHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCisJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJZWxzZQorCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lvY3Rscy5oCmluZGV4IDMxZWU1MjEuLmY0MWI2MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pb2N0bHMuaApAQCAtNTMsNiArNTMsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKaW5kZXggNDg1NzU5Yi4uZDYzNDU0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKQEAgLTg3LDEyICs4NywxMyBAQAogfSB3aGlsZSAoMCkKIAogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIFwKLSh7CQkJCQkJXAotCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcik7IFwKLQlpZiAocGFnZSkJCQkJXAotIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CVwKLQlwYWdlOwkJCQkJXAorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikJCVwKKyh7CQkJCQkJCQkJXAorCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoCQkJCVwKKwkJR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcik7CVwKKwlpZiAocGFnZSkJCQkJCQkJXAorIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CQkJCVwKKwlwYWdlOwkJCQkJCQkJXAogfSkKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAppbmRleCA2NTgwZjMxLi5kZTZkMDFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaApAQCAtMjk3LDggKzI5Nyw2IEBACiAvKgogICogVGhlIGZvbGxvd2luZyBoYXZlIGRlZmluZWQgYmVoYXZpb3Igb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqLwotI2RlZmluZSBwdGVfdXNlcihwdGUpCQkoKHB0ZV92YWwocHRlKSAmIF9QQUdFX1BMX01BU0spID09IF9QQUdFX1BMXzMpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCSgoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FSX01BU0spID4+IF9QQUdFX0FSX1NISUZUKSA8IDYpCiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCSgodW5zaWduZWQpICgoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FSX01BU0spID4+IF9QQUdFX0FSX1NISUZUKSAtIDIpIDw9IDQpCiAjZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCSgocHRlX3ZhbChwdGUpICYgX1BBR0VfQVJfUlgpICE9IDApCiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpCQkoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0QpICE9IDApCkBAIC0zMTAsNyArMzA4LDYgQEAKICAqLwogI2RlZmluZSBwdGVfd3Jwcm90ZWN0KHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BUl9SVykpCiAjZGVmaW5lIHB0ZV9ta3dyaXRlKHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0FSX1JXKSkKLSNkZWZpbmUgcHRlX21rZXhlYyhwdGUpCQkoX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQVJfUlgpKQogI2RlZmluZSBwdGVfbWtvbGQocHRlKQkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BKSkKICNkZWZpbmUgcHRlX21reW91bmcocHRlKQkoX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQSkpCiAjZGVmaW5lIHB0ZV9ta2NsZWFuKHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9EKSkKQEAgLTM5OCwyMiArMzk1LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIGludAotcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmICghcHRlX2RpcnR5KCpwdGVwKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9EX0JJVCwgcHRlcCk7Ci0jZWxzZQotCXB0ZV90IHB0ZSA9ICpwdGVwOwotCWlmICghcHRlX2RpcnR5KHB0ZSkpCi0JCXJldHVybiAwOwotCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkciwgcHRlcCwgcHRlX21rY2xlYW4ocHRlKSk7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdAogcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewpAQCAtNTQ2LDggKzUyNywxMCBAQAogIyBkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCwgX19lbnRyeSwgX19zYWZlbHlfd3JpdGFibGUpIFwKICh7CQkJCQkJCQkJXAogCWludCBfX2NoYW5nZWQgPSAhcHRlX3NhbWUoKihfX3B0ZXApLCBfX2VudHJ5KTsJCQlcCi0JaWYgKF9fY2hhbmdlZCkJCQkJCQkJXAotCQlwdGVwX2VzdGFibGlzaChfX3ZtYSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnkpOwkJXAorCWlmIChfX2NoYW5nZWQpIHsJCQkJCQlcCisJCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIChfX2FkZHIpLCBfX3B0ZXAsIF9fZW50cnkpOwlcCisJCWZsdXNoX3RsYl9wYWdlKF9fdm1hLCBfX2FkZHIpOwkJCQlcCisJfQkJCQkJCQkJXAogCV9fY2hhbmdlZDsJCQkJCQkJXAogfSkKICNlbmRpZgpAQCAtNTkxLDcgKzU3NCw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oCmluZGV4IDdmYWUzMTAuLjlmMTYyZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1iaXRzLmgKQEAgLTE0OSw2ICsxNDksNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTY0LDEwICsxNjUsMTIgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZSBJQlNISUZUCTE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCmluZGV4IDA4NzUwYzIuLjY4OWQyMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCkBAIC04Nyw4ICs4NywxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOwlcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICMgZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1tMzJyL2RtYS1tYXBwaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjU4ZWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9BU01fTTMyUl9ETUFfTUFQUElOR19ICi0jZGVmaW5lIF9BU01fTTMyUl9ETUFfTUFQUElOR19ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KLQotI2VuZGlmIC8qIF9BU01fTTMyUl9ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2ZiLmggYi9pbmNsdWRlL2FzbS1tMzJyL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvaW9jdGxzLmgKaW5kZXggZDIzY2ZjNC4uYjlmNTRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2lvY3Rscy5oCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wYWdlLmggYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAppbmRleCA2ZjZlY2Y3Li4wNGZkMTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaApAQCAtMTUsNyArMTUsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCmluZGV4IDY2MDQzMDMuLjkyZDcyNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCkBAIC0xOTEsMTYgKzE5MSw2IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQogewogCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsKQEAgLTIyNCwxOCArMjE0LDYgQEAKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsKQEAgLTI1NCwxOCArMjMyLDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOwotCXJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0VYRUM7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOwpAQCAtMjg0LDExICsyNTAsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCBwdGVwKTsKLX0KLQogc3RhdGljIGlubGluZSAgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CiAJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfQUNDRVNTRUQsIHB0ZXApOwpAQCAtMzgyLDcgKzM0Myw2IEBACiAJCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaAppbmRleCA2YmUzYjhhLi5iYzEwNDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtYml0cy5oCkBAIC0xNDAsNiArMTQwLDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICAgQk9USEVSIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE1NSwxMSArMTU2LDEzIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ1RWQgkgIDAwNDAwMDAwMDAwMAkJLyogVmlzaW9CcmFpbGxlIFRlcm1pbmFsIGZsb3cgY29udHJvbCAqLwogI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUJSUJTSElGVAkxNgkJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKaW5kZXggNDk0M2RkOC4uOTNjZTc5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKQEAgLTgxLDggKzgxLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfU0xNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjRmY2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLQotI2lmbmRlZiBfQVRBUklfU0xNX0gKLSNkZWZpbmUgX0FUQVJJX1NMTV9ICi0KLS8qIEF0YXJpIFNMTSBsYXNlciBwcmludGVyIHNwZWNpZmljIGlvY3RscyAqLwotCi0jZGVmaW5lCVNMTUlPR1NUQVQJMHhhMTAwCi0jZGVmaW5lCVNMTUlPR1BTSVpFCTB4YTEwMQotI2RlZmluZQlTTE1JT0dNRkVFRAkweGExMDIKLQotI2RlZmluZQlTTE1JT1JFU0VUCTB4YTE0MAotCi0jZGVmaW5lCVNMTUlPU1BTSVpFCTB4YTE4MQotI2RlZmluZQlTTE1JT1NNRkVFRAkweGExODIKLQotLyogU3RhdHVzIHJldHVybmluZyBzdHJ1Y3R1cmUgKFNMTUlPR1NUQVQpICovCi1zdHJ1Y3QgU0xNX3N0YXR1cyB7Ci0JaW50CQlzdGF0OwkJLyogbnVtZXJpYyBzdGF0dXMgY29kZSAqLwotCWNoYXIJc3RyWzQwXTsJLyogc3RhdHVzIHN0cmluZyAqLwotfTsKLQotLyogUGFwZXIgc2l6ZSBzdHJ1Y3R1cmUgKFNMTUlPW0dTXVBTSVpFKSAqLwotc3RydWN0IFNMTV9wYXBlcl9zaXplIHsKLQlpbnQJCXdpZHRoOwotCWludAkJaGVpZ2h0OwotfTsKLQotI2VuZGlmIC8qIF9BVEFSSV9TTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9hY3NpLmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX2Fjc2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmZWE2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX2Fjc2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9BVEFSSV9BQ1NJX0gKLSNkZWZpbmUgX0FTTV9BVEFSSV9BQ1NJX0gKLQotLyogRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IGRyaXZlcnMvYmxvY2svYWNzaS5jICovCi0KLXZvaWQgYWNzaV9kZWxheV9zdGFydCggdm9pZCApOwotdm9pZCBhY3NpX2RlbGF5X2VuZCggbG9uZyB1c2VjICk7Ci1pbnQgYWNzaV93YWl0X2Zvcl9JUlEoIHVuc2lnbmVkIHRpbWVvdXQgKTsKLWludCBhY3NpX3dhaXRfZm9yX25vSVJRKCB1bnNpZ25lZCB0aW1lb3V0ICk7Ci1pbnQgYWNzaWNtZF9ub2RtYSggY29uc3QgY2hhciAqY21kLCBpbnQgZW5hYmxlKTsKLWludCBhY3NpX2dldHN0YXR1cyggdm9pZCApOwotaW50IGFjc2lfZXh0c3RhdHVzKCBjaGFyICpidWZmZXIsIGludCBjbnQgKTsKLXZvaWQgYWNzaV9lbmRfZXh0c3RhdHVzKCB2b2lkICk7Ci1pbnQgYWNzaV9leHRjbWQoIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGNudCApOwotCi0vKiBUaGUgQUNTSSBidWZmZXIgaXMgZ3VhcmFudHVlZWQgdG8gcmVzaWRlIGluIFNULVJBTSBhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXIKLSAqIGRyaXZlcnMgdGhhdCB3b3JrIG9uIHRoZSBBQ1NJIGJ1cywgdG9vLiBJdCdzIGRhdGEgYXJlIHZhbGlkIG9ubHkgYXMgbG9uZyBhcwotICogdGhlIFNULURNQSBpcyBsb2NrZWQuICovCi1leHRlcm4gY2hhciAqYWNzaV9idWZmZXI7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzX2Fjc2lfYnVmZmVyOwotCi0vKiBVdGlsaXR5IG1hY3JvcyAqLwotCi0vKiBTZW5kIG9uZSBkYXRhIGJ5dGUgb3ZlciB0aGUgYnVzIGFuZCBzZXQgbW9kZSBmb3IgbmV4dCBvcGVyYXRpb24KLSAqIHdpdGggb25lIG1vdmUubCAtLSBBdGFyaSByZWNvbW1lbmRzIHRoaXMuLi4KLSAqLwotCi0jZGVmaW5lIERNQV9MT05HX1dSSVRFKGRhdGEsbW9kZSkJCQkJCQkJXAotICAgIGRvIHsJCQkJCQkJCQkJCQkJXAotCQkqKCh1bnNpZ25lZCBsb25nICopJmRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQpID0JXAotCQkJKChkYXRhKTw8MTYpIHwgKG1vZGUpOwkJCQkJCQlcCi0JfSB3aGlsZSgwKQotCi0jZGVmaW5lIEVOQUJMRV9JUlEoKQlhdGFyaV90dXJub25faXJxKCBJUlFfTUZQX0FDU0kgKQotI2RlZmluZSBESVNBQkxFX0lSUSgpCWF0YXJpX3R1cm5vZmZfaXJxKCBJUlFfTUZQX0FDU0kgKQotCi0jZW5kaWYgLyogX0FTTV9BVEFSSV9BQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZmIuaCBiL2luY2x1ZGUvYXNtLW02OGsvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBiOTdhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9mYi5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2lmZGVmIENPTkZJR19TVU4zCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBTVU4zX1BBR0VfTk9DQUNIRTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoQ1BVX0lTXzAyMF9PUl8wMzApCisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PQ0FDSEUwMzA7CisJaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpICY9IF9DQUNIRU1BU0swNDA7CisJCS8qIFVzZSBuby1jYWNoZSBtb2RlLCBzZXJpYWxpemVkICovCisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PQ0FDSEVfUzsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NVTjMgKi8KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oCmluZGV4IGI1Yjc4YzAuLmQwMjliNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oCkBAIC0xNjQsMjEgKzE2NCwxNSBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ST05MWSk7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JPTkxZOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfUk9OTFk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtub2NhY2hlKHB0ZV90IHB0ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oCmluZGV4IGI5ZTYyYzEuLmI3NjZmYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaApAQCAtMTY1LDIxICsxNjUsMTUgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4uCiAgKiBbd2UgaGF2ZSB0aGUgZnVsbCBzZXQgaGVyZSBldmVuIGlmIHRoZXkgZG9uJ3QgY2hhbmdlIGZyb20gbTY4a10KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gMTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIFNVTjNfUEFHRV9XUklURUFCTEU7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIFNVTjNfUEFHRV9BQ0NFU1NFRDsgfQogCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+U1VOM19QQUdFX1dSSVRFQUJMRTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+U1VOM19QQUdFX01PRElGSUVEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5TVU4zX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBTVU4zX1BBR0VfV1JJVEVBQkxFOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IFNVTjNfUEFHRV9NT0RJRklFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IFNVTjNfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtub2NhY2hlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gU1VOM19QQUdFX05PQ0FDSEU7IHJldHVybiBwdGU7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9mYi5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaAppbmRleCAyYTFiOGJkLi45ZWZhMGE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmgKQEAgLTIyLDcgKzIyLDggQEAKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykJY2xlYXJfcGFnZShwYWdlKQogI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0bywgZnJvbSwgdmFkZHIsIHBnKQljb3B5X3BhZ2UodG8sIGZyb20pCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKaW5kZXggNjdjM2Y4ZS4uNTY4Yzc2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCkBAIC0zNyw4ICszNywxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9mYi5oIGIvaW5jbHVkZS9hc20tbWlwcy9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2Y2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKaW5kZXggMjdkNzdkOS4uMmUyZDcwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKQEAgLTE3OCw5ICsxNzgsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCXsgQlVHKCk7IHJldHVybiAwOyB9CiAjaWYgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyX1IxKQotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX1JFQUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZS5wdGVfbG93ICYgX1BBR0VfV1JJVEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZS5wdGVfbG93ICYgX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZS5wdGVfbG93ICYgX1BBR0VfQUNDRVNTRUQ7IH0KQEAgLTE5MywxMyArMTkxLDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQotewotCXB0ZS5wdGVfbG93ICAmPSB+KF9QQUdFX1JFQUQgfCBfUEFHRV9TSUxFTlRfUkVBRCk7Ci0JcHRlLnB0ZV9oaWdoICY9IH5fUEFHRV9TSUxFTlRfUkVBRDsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGUucHRlX2xvdyAgJj0gfihfUEFHRV9NT0RJRklFRCB8IF9QQUdFX1NJTEVOVF9XUklURSk7CkBAIC0yMjQsMTYgKzIxNSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKLXsKLQlwdGUucHRlX2xvdyB8PSBfUEFHRV9SRUFEOwotCWlmIChwdGUucHRlX2xvdyAmIF9QQUdFX0FDQ0VTU0VEKSB7Ci0JCXB0ZS5wdGVfbG93ICB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLQkJcHRlLnB0ZV9oaWdoIHw9IF9QQUdFX1NJTEVOVF9SRUFEOwotCX0KLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlwdGUucHRlX2xvdyB8PSBfUEFHRV9NT0RJRklFRDsKQEAgLTI1Myw3ICsyMzQsNiBAQAogCXJldHVybiBwdGU7CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CkBAIC0yNjUsMTIgKzI0NSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SRUFEIHwgX1BBR0VfU0lMRU5UX1JFQUQpOwotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX01PRElGSUVEfF9QQUdFX1NJTEVOVF9XUklURSk7CkBAIC0yOTEsMTQgKzI2NSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsKLQlpZiAocHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQpCi0JCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTU9ESUZJRUQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCmluZGV4IGJkYTM5MWQuLjI3MzhjMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCkBAIC0yMjAsMTcgKzIyMCwyNSBAQAogI2RlZmluZSBBX0JDTTE0ODBfRFVBUlQoY2hhbikgICAgICAgICAgICAgICAoKCgoY2hhbikmMikgPT0gMCk/IEFfQkNNMTQ4MF9EVUFSVDAgOiBBX0JDTTE0ODBfRFVBUlQxKQogCiAjZGVmaW5lIEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HICAgICAgIDB4MTAwCi0jZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQkNNMTQ4MF9EVUFSVF9DSEFOUkVHX1NQQUNJTkcqKChjaGFuKSYxKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocmVnKSkKLSNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0NIQU5SRUcoY2hhbixyZWcpICAgKEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HKigoY2hhbikmMSkgKyAocmVnKSkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0NIQU5SRUcoY2hhbiwgcmVnKQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArCQkJCQlcCisJIEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HICogKCgoY2hhbikgJiAxKSArIDEpICsgKHJlZykpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKGNoYW4sIHJlZykJCQkJXAorCShBX0JDTTE0ODBfRFVBUlQoY2hhbikgKwkJCQkJXAorCSBCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyAqIDMgKyAocmVnKSkKIAotI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICAoUl9EVUFSVF9JTVJfQSArICgoY2hhbikmMSkqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCi0jZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikJICAgIChSX0RVQVJUX0lTUl9BICsgKChjaGFuKSYxKSpEVUFSVF9JTVJJU1JfU1BBQ0lORykKKyNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKQkJCQkJXAorCShSX0RVQVJUX0lNUl9BICsgKChjaGFuKSAmIDEpICogRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikJCQkJCVwKKwkoUl9EVUFSVF9JU1JfQSArICgoY2hhbikgJiAxKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQogCi0jZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgKyBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pKQotI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsgUl9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKSkKLSNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lOX1BPUlQoY2hhbikgICAgICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArIFJfRFVBUlRfSU5QX09SVCkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKQkJCQkJXAorCShBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRygoY2hhbiksIFJfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikpKQorI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKChjaGFuKSwgUl9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKSkpCisKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lOX1BPUlQoY2hhbikJCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUX0NUUkxSRUcoKGNoYW4pLCBSX0RVQVJUX0lOX1BPUlQpKQogCiAvKgogICogVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgYWJzb2x1dGUgYWRkcmVzc2VzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKaW5kZXggZGE3YzE4OC4uMjIwYjdlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCkBAIC0yNzIsNTkgKzI3Miw2OSBAQAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCiAKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4CQkvKiBUaGlzIE1DIG9ubHkgb24gMTI1MCAmIDExMnggKi8KKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4ICAgIC8qIFRoaXMgTUMgb25seSBvbiAxMjUwICYgMTEyeCAqLwogI2RlZmluZSBSX0RVQVJUX05VTV9QT1JUUyAgICAgICAgICAgMgogCiAjZGVmaW5lIEFfRFVBUlQgICAgICAgICAgICAgICAgICAgICAweDAwMTAwNjAwMDAKIAogI2RlZmluZSBEVUFSVF9DSEFOUkVHX1NQQUNJTkcgICAgICAgMHgxMDAKLSNkZWZpbmUgQV9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChBX0RVQVJUICsgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKihjaGFuKSArIChyZWcpKQotI2RlZmluZSBSX0RVQVJUX0NIQU5SRUcoY2hhbixyZWcpICAgKERVQVJUX0NIQU5SRUdfU1BBQ0lORyooY2hhbikgKyAocmVnKSkKKworI2RlZmluZSBBX0RVQVJUX0NIQU5SRUcoY2hhbiwgcmVnKQkJCQkJXAorCShBX0RVQVJUICsgRFVBUlRfQ0hBTlJFR19TUEFDSU5HICogKChjaGFuKSArIDEpICsgKHJlZykpCiAjZW5kaWYJLyogMTI1MCAmIDExMnggKi8KIAotI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzEJICAgIDB4MTAwCi0jZGVmaW5lIFJfRFVBUlRfTU9ERV9SRUdfMgkgICAgMHgxMTAKLSNkZWZpbmUgUl9EVUFSVF9TVEFUVVMgICAgICAgICAgICAgIDB4MTIwCi0jZGVmaW5lIFJfRFVBUlRfQ0xLX1NFTCAgICAgICAgICAgICAweDEzMAotI2RlZmluZSBSX0RVQVJUX0NNRCAgICAgICAgICAgICAgICAgMHgxNTAKLSNkZWZpbmUgUl9EVUFSVF9SWF9IT0xEICAgICAgICAgICAgIDB4MTYwCi0jZGVmaW5lIFJfRFVBUlRfVFhfSE9MRCAgICAgICAgICAgICAweDE3MAorI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzEJICAgIDB4MDAwCisjZGVmaW5lIFJfRFVBUlRfTU9ERV9SRUdfMgkgICAgMHgwMTAKKyNkZWZpbmUgUl9EVUFSVF9TVEFUVVMJCSAgICAweDAyMAorI2RlZmluZSBSX0RVQVJUX0NMS19TRUwJCSAgICAweDAzMAorI2RlZmluZSBSX0RVQVJUX0NNRAkJICAgIDB4MDUwCisjZGVmaW5lIFJfRFVBUlRfUlhfSE9MRAkJICAgIDB4MDYwCisjZGVmaW5lIFJfRFVBUlRfVFhfSE9MRAkJICAgIDB4MDcwCiAKICNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzIpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkgfHwgU0lCWVRFX0hEUl9GRUFUVVJFX0NISVAoMTQ4MCkKLSNkZWZpbmUgUl9EVUFSVF9GVUxMX0NUTAkgICAgMHgxNDAKLSNkZWZpbmUgUl9EVUFSVF9PUENSX1gJCSAgICAweDE4MAotI2RlZmluZSBSX0RVQVJUX0FVWENUTF9YCSAgICAweDE5MAotI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSB8fCAxNDgwKi8KKyNkZWZpbmUgUl9EVUFSVF9GVUxMX0NUTAkgICAgMHgwNDAKKyNkZWZpbmUgUl9EVUFSVF9PUENSX1gJCSAgICAweDA4MAorI2RlZmluZSBSX0RVQVJUX0FVWENUTF9YCSAgICAweDA5MAorI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSB8fCAxNDgwICovCiAKIAogLyoKICAqIFRoZSBJTVIgYW5kIElTUiBjYW4ndCBiZSBhZGRyZXNzZWQgd2l0aCBBX0RVQVJUX0NIQU5SRUcsCi0gKiBzbyB1c2UgdGhpcyBtYWNybyBpbnN0ZWFkLgorICogc28gdXNlIHRoZXNlIG1hY3JvcyBpbnN0ZWFkLgogICovCiAKLSNkZWZpbmUgUl9EVUFSVF9BVVhfQ1RSTCAgICAgICAgICAgIDB4MzEwCi0jZGVmaW5lIFJfRFVBUlRfSVNSX0EgICAgICAgICAgICAgICAweDMyMAotI2RlZmluZSBSX0RVQVJUX0lNUl9BICAgICAgICAgICAgICAgMHgzMzAKLSNkZWZpbmUgUl9EVUFSVF9JU1JfQiAgICAgICAgICAgICAgIDB4MzQwCi0jZGVmaW5lIFJfRFVBUlRfSU1SX0IgICAgICAgICAgICAgICAweDM1MAotI2RlZmluZSBSX0RVQVJUX09VVF9QT1JUICAgICAgICAgICAgMHgzNjAKLSNkZWZpbmUgUl9EVUFSVF9PUENSICAgICAgICAgICAgICAgIDB4MzcwCi0jZGVmaW5lIFJfRFVBUlRfSU5fUE9SVCAgICAgICAgICAgICAweDM4MAorI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMnggICAgLyogVGhpcyBNQyBvbmx5IG9uIDEyNTAgJiAxMTJ4ICovCisjZGVmaW5lIERVQVJUX0lNUklTUl9TUEFDSU5HCSAgICAweDIwCisjZGVmaW5lIERVQVJUX0lOQ0hOR19TUEFDSU5HCSAgICAweDEwCiAKLSNkZWZpbmUgUl9EVUFSVF9TRVRfT1BSCQkgICAgMHgzQjAKLSNkZWZpbmUgUl9EVUFSVF9DTEVBUl9PUFIJICAgIDB4M0MwCisjZGVmaW5lIEFfRFVBUlRfQ1RSTFJFRyhyZWcpCQkJCQkJXAorCShBX0RVQVJUICsgRFVBUlRfQ0hBTlJFR19TUEFDSU5HICogMyArIChyZWcpKQogCi0jZGVmaW5lIERVQVJUX0lNUklTUl9TUEFDSU5HICAgICAgICAweDIwCisjZGVmaW5lIFJfRFVBUlRfSU1SUkVHKGNoYW4pCQkJCQkJXAorCShSX0RVQVJUX0lNUl9BICsgKGNoYW4pICogRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfRFVBUlRfSVNSUkVHKGNoYW4pCQkJCQkJXAorCShSX0RVQVJUX0lTUl9BICsgKGNoYW4pICogRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfRFVBUlRfSU5DSFJFRyhjaGFuKQkJCQkJCVwKKwkoUl9EVUFSVF9JTl9DSE5HX0EgKyAoY2hhbikgKiBEVUFSVF9JTkNITkdfU1BBQ0lORykKIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngJCS8qIFRoaXMgTUMgb25seSBvbiAxMjUwICYgMTEyeCAqLwotI2RlZmluZSBSX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgKFJfRFVBUlRfSU1SX0EgKyAoY2hhbikqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCi0jZGVmaW5lIFJfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoUl9EVUFSVF9JU1JfQSArIChjaGFuKSpEVUFSVF9JTVJJU1JfU1BBQ0lORykKLQotI2RlZmluZSBBX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgKEFfRFVBUlQgKyBSX0RVQVJUX0lNUlJFRyhjaGFuKSkKLSNkZWZpbmUgQV9EVUFSVF9JU1JSRUcoY2hhbikJICAgIChBX0RVQVJUICsgUl9EVUFSVF9JU1JSRUcoY2hhbikpCisjZGVmaW5lIEFfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICBBX0RVQVJUX0NUUkxSRUcoUl9EVUFSVF9JTVJSRUcoY2hhbikpCisjZGVmaW5lIEFfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICBBX0RVQVJUX0NUUkxSRUcoUl9EVUFSVF9JU1JSRUcoY2hhbikpCisjZGVmaW5lIEFfRFVBUlRfSU5DSFJFRyhjaGFuKQkgICAgQV9EVUFSVF9DVFJMUkVHKFJfRFVBUlRfSU5DSFJFRyhjaGFuKSkKICNlbmRpZgkvKiAxMjUwICYgMTEyeCAqLwogCisjZGVmaW5lIFJfRFVBUlRfQVVYX0NUUkwJICAgIDB4MDEwCisjZGVmaW5lIFJfRFVBUlRfSVNSX0EJCSAgICAweDAyMAorI2RlZmluZSBSX0RVQVJUX0lNUl9BCQkgICAgMHgwMzAKKyNkZWZpbmUgUl9EVUFSVF9JU1JfQgkJICAgIDB4MDQwCisjZGVmaW5lIFJfRFVBUlRfSU1SX0IJCSAgICAweDA1MAorI2RlZmluZSBSX0RVQVJUX09VVF9QT1JUCSAgICAweDA2MAorI2RlZmluZSBSX0RVQVJUX09QQ1IJCSAgICAweDA3MAorI2RlZmluZSBSX0RVQVJUX0lOX1BPUlQJCSAgICAweDA4MAogCisjZGVmaW5lIFJfRFVBUlRfU0VUX09QUgkJICAgIDB4MEIwCisjZGVmaW5lIFJfRFVBUlRfQ0xFQVJfT1BSCSAgICAweDBDMAorI2RlZmluZSBSX0RVQVJUX0lOX0NITkdfQQkgICAgMHgwRDAKKyNkZWZpbmUgUl9EVUFSVF9JTl9DSE5HX0IJICAgIDB4MEUwCiAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oCmluZGV4IGU4NzA0NWUuLmNmNzRmZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaApAQCAtNzUsNyArNzUsOCBAQAogI2RlZmluZSBWX0RVQVJUX1BBUklUWV9NT0RFX0FERF9GSVhFRCBWX0RVQVJUX1BBUklUWV9NT0RFKEtfRFVBUlRfUEFSSVRZX01PREVfQUREX0ZJWEVEKQogI2RlZmluZSBWX0RVQVJUX1BBUklUWV9NT0RFX05PTkUgICAgICBWX0RVQVJUX1BBUklUWV9NT0RFKEtfRFVBUlRfUEFSSVRZX01PREVfTk9ORSkKIAotI2RlZmluZSBNX0RVQVJUX0VSUl9NT0RFICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg1KSAgICAvKiBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUgTV9EVUFSVF9UWF9JUlFfU0VMX1RYUkRZICAgIDAKKyNkZWZpbmUgTV9EVUFSVF9UWF9JUlFfU0VMX1RYRU1QVCAgIF9TQl9NQUtFTUFTSzEoNSkKIAogI2RlZmluZSBNX0RVQVJUX1JYX0lSUV9TRUxfUlhSRFkgICAgMAogI2RlZmluZSBNX0RVQVJUX1JYX0lSUV9TRUxfUlhGVUxMICAgX1NCX01BS0VNQVNLMSg2KQpAQCAtMjQ2LDEwICsyNDcsMTMgQEAKIAogI2RlZmluZSBNX0RVQVJUX0lTUl9CUktfQSAgICAgICAgICAgX1NCX01BS0VNQVNLMSgyKQogI2RlZmluZSBNX0RVQVJUX0lTUl9JTl9BICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgzKQorI2RlZmluZSBNX0RVQVJUX0lTUl9BTExfQQkgICAgX1NCX01BS0VNQVNLKDQsMCkKKwogI2RlZmluZSBNX0RVQVJUX0lTUl9UWF9CICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg0KQogI2RlZmluZSBNX0RVQVJUX0lTUl9SWF9CICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg1KQogI2RlZmluZSBNX0RVQVJUX0lTUl9CUktfQiAgICAgICAgICAgX1NCX01BS0VNQVNLMSg2KQogI2RlZmluZSBNX0RVQVJUX0lTUl9JTl9CICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg3KQorI2RlZmluZSBNX0RVQVJUX0lTUl9BTExfQgkgICAgX1NCX01BS0VNQVNLKDQsNCkKIAogLyoKICAqIERVQVJUIENoYW5uZWwgQSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChUYWJsZSAxMC0xNykKQEAgLTI2Miw2ICsyNjYsNyBAQAogI2RlZmluZSBNX0RVQVJUX0lTUl9SWCAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgxKQogI2RlZmluZSBNX0RVQVJUX0lTUl9CUksgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgyKQogI2RlZmluZSBNX0RVQVJUX0lTUl9JTiAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgzKQorI2RlZmluZSBNX0RVQVJUX0lTUl9BTEwJCSAgICBfU0JfTUFLRU1BU0soNCwwKQogI2RlZmluZSBNX0RVQVJUX0lTUl9SRVNFUlZFRCAgICAgICAgX1NCX01BS0VNQVNLKDQsNCkKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaAppbmRleCAxMWY0MjIyLi41YTg1ZDFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oCkBAIC0zMSw4ICszMSwxMCBAQAogCiB0eXBlZGVmIHMzMgljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgljb21wYXRfbG9uZ190OwordHlwZWRlZiBzNjQJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgljb21wYXRfdWxvbmdfdDsKK3R5cGVkZWYgdTY0CWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJCXR2X3NlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mYi5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1MDNhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9fQ0FDSEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaAppbmRleCAzMTc4NTFmLi4xZTFjODI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaApAQCAtMywyMSArMywyMiBAQAogCiAvKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCiAgICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BUFBFTkQJMDAwMDAwMTAKLSNkZWZpbmUgT19CTEtTRUVLCTAwMDAwMTAwIC8qIEhQVVggb25seSAqLwotI2RlZmluZSBPX0NSRUFUCQkwMDAwMDQwMCAvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkwMDAwMjAwMCAvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19MQVJHRUZJTEUJMDAwMDQwMDAKLSNkZWZpbmUgT19TWU5DCQkwMDEwMDAwMAotI2RlZmluZSBPX05PTkJMT0NLCTAwMjAwMDA0IC8qIEhQVVggaGFzIHNlcGFyYXRlIE5ERUxBWSAmIE5PTkJMT0NLICovCi0jZGVmaW5lIE9fTk9DVFRZCTAwNDAwMDAwIC8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0RTWU5DCQkwMTAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KLSNkZWZpbmUgT19SU1lOQwkJMDIwMDAwMDAgLyogSFBVWCBvbmx5ICovCi0jZGVmaW5lIE9fTk9BVElNRQkwNDAwMDAwMAorI2RlZmluZSBPX0FQUEVORAkwMDAwMDAwMTAKKyNkZWZpbmUgT19CTEtTRUVLCTAwMDAwMDEwMCAvKiBIUFVYIG9ubHkgKi8KKyNkZWZpbmUgT19DUkVBVAkJMDAwMDAwNDAwIC8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0VYQ0wJCTAwMDAwMjAwMCAvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19MQVJHRUZJTEUJMDAwMDA0MDAwCisjZGVmaW5lIE9fU1lOQwkJMDAwMTAwMDAwCisjZGVmaW5lIE9fTk9OQkxPQ0sJMDAwMjAwMDA0IC8qIEhQVVggaGFzIHNlcGFyYXRlIE5ERUxBWSAmIE5PTkJMT0NLICovCisjZGVmaW5lIE9fTk9DVFRZCTAwMDQwMDAwMCAvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19EU1lOQwkJMDAxMDAwMDAwIC8qIEhQVVggb25seSAqLworI2RlZmluZSBPX1JTWU5DCQkwMDIwMDAwMDAgLyogSFBVWCBvbmx5ICovCisjZGVmaW5lIE9fTk9BVElNRQkwMDQwMDAwMDAKKyNkZWZpbmUgT19DTE9FWEVDCTAxMDAwMDAwMCAvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLwogCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAwMDEwMDAwIC8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgT19OT0ZPTExPVwkwMDAwMDIwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19JTlZJU0lCTEUJMDQwMDAwMDAgLyogaW52aXNpYmxlIEkvTywgZm9yIERNQVBJL1hEU00gKi8KKyNkZWZpbmUgT19ESVJFQ1RPUlkJMDAwMDEwMDAwIC8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgT19OT0ZPTExPVwkwMDAwMDAyMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCisjZGVmaW5lIE9fSU5WSVNJQkxFCTAwNDAwMDAwMCAvKiBpbnZpc2libGUgSS9PLCBmb3IgRE1BUEkvWERTTSAqLwogCiAjZGVmaW5lIEZfR0VUTEs2NAk4CiAjZGVmaW5lIEZfU0VUTEs2NAk5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BndGFibGUuaAppbmRleCBiZWIyYWRiLi5lODhjYWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wZ3RhYmxlLmgKQEAgLTMzNSwxOCArMzM1LDE0IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQUQ7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkgCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiAKLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9SRUFEOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1dSSVRFOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1dSSVRFOyByZXR1cm4gcHRlOyB9CkBAIC00NTEsMjEgKzQ0Nyw2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKCFwdGVfZGlydHkoKnB0ZXApKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KHhsYXRlX3BhYml0KF9QQUdFX0RJUlRZX0JJVCksICZwdGVfdmFsKCpwdGVwKSk7Ci0jZWxzZQotCXB0ZV90IHB0ZSA9ICpwdGVwOwotCWlmICghcHRlX2RpcnR5KHB0ZSkpCi0JCXJldHVybiAwOwotCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkciwgcHRlcCwgcHRlX21rY2xlYW4ocHRlKSk7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQogZXh0ZXJuIHNwaW5sb2NrX3QgcGFfZGJpdF9sb2NrOwogCiBzdHJ1Y3QgbW1fc3RydWN0OwpAQCAtNTMzLDcgKzUxNCw2IEBACiAjZGVmaW5lIEhBVkVfQVJDSF9VTk1BUFBFRF9BUkVBCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaAppbmRleCA2NDJiZTYyLi41MzUwNzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oCkBAIC0zNCw1ICszNCw5IEBACiBleHRlcm4gc3RydWN0IHBwYzY0X2NhY2hlcyBwcGM2NF9jYWNoZXM7CiAjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAmJiAhIF9fQVNTRU1CTFlfXyAqLwogCisjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQorI2RlZmluZSBfX3JlYWRfbW9zdGx5IF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5yZWFkX21vc3RseSIpKSkKKyNlbmRpZgorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaAppbmRleCBhYWNhYWJkLi42NGFiMWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY29tcGF0LmgKQEAgLTMzLDggKzMzLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CQljb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAkJY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKaW5kZXggODJkNTk1YS4uM2RjOGUyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaApAQCAtMTExLDcgKzExMSw3IEBACiAvKiBDUFUga2VybmVsIGZlYXR1cmVzICovCiAKIC8qIFJldGFpbiB0aGUgMzJiIGRlZmluaXRpb25zIGFsbCB1c2UgYm90dG9tIGhhbGYgb2Ygd29yZCAqLwotI2RlZmluZSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQorI2RlZmluZSBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKICNkZWZpbmUgQ1BVX0ZUUl9MMkNSCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMikKICNkZWZpbmUgQ1BVX0ZUUl9TUEVDNzQ1MAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNCkKICNkZWZpbmUgQ1BVX0ZUUl9BTFRJVkVDCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwOCkKQEAgLTEzNSw2ICsxMzUsNyBAQAogI2RlZmluZSBDUFVfRlRSX1BQQ19MRQkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAyMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUkVBTF9MRQkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDA0MDAwMDApCiAjZGVmaW5lIENQVV9GVFJfRlBVX1VOQVZBSUxBQkxFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwODAwMDAwKQorI2RlZmluZSBDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMTAwMDAwMCkKIAogLyoKICAqIEFkZCB0aGUgNjQtYml0IHByb2Nlc3NvciB1bmlxdWUgZmVhdHVyZXMgaW4gdGhlIHRvcCBoYWxmIG9mIHRoZSB3b3JkOwpAQCAtMTU0LDcgKzE1NSw2IEBACiAjZGVmaW5lIENQVV9GVFJfTU1DUkEJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMDQwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfQ1RSTAkJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAwODAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9TTVQJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMTAwMDAwMDAwMDApCi0jZGVmaW5lIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMjAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfTE9DS0xFU1NfVExCSUUJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDA0MDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFCQlMT05HX0FTTV9DT05TVCgweDAwMDAxMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUEFVU0VfWkVSTwkJTE9OR19BU01fQ09OU1QoMHgwMDAwMjAwMDAwMDAwMDAwKQpAQCAtMjA2LDE2NCArMjA2LDE0OSBAQAogCQkgICAgICFkZWZpbmVkKENPTkZJR19QT1dFUjMpICYmICFkZWZpbmVkKENPTkZJR19QT1dFUjQpICYmIFwKIAkJICAgICAhZGVmaW5lZChDT05GSUdfQk9PS0UpKQogCi0jZGVmaW5lIENQVV9GVFJTX1BQQzYwMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSXzYwMSB8IENQVV9GVFJfSFBURV9UQUJMRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNjAzCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BQQzYwMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSXzYwMSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKKwlDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRSkKKyNkZWZpbmUgQ1BVX0ZUUlNfNjAzCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNjA0CShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzYwNAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl82MDRfUEVSRl9NT04gfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDBfTk9UQVUJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQwX05PVEFVCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0MAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MENMCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBGWDEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9EVUFMX1BMTF83NTBGWCB8IENQVV9GVFJfTk9fRFBNIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MEZYMgkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX05PX0RQTSB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBGWAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MEdYCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQwMF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NTBDTAkoQ1BVX0ZUUlNfNzUwIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTKQorI2RlZmluZSBDUFVfRlRSU183NTBGWDEJKENQVV9GVFJTXzc1MCB8IENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX05PX0RQTSkKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgyCShDUFVfRlRSU183NTAgfCBDUFVfRlRSX05PX0RQTSkKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgJKENQVV9GVFJTXzc1MCB8IENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBcCisJCUNQVV9GVFJfSEFTX0hJR0hfQkFUUykKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwR1gJKENQVV9GVFJTXzc1MEZYKQorI2RlZmluZSBDUFVfRlRSU183NDAwX05PVEFVCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0MDAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQwMAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTBfMjAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDUwXzIxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTBfMjEJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0wzX0RJU0FCTEVfTkFQIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMwkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDUwXzIzCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTVfMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDU1XzEJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0wzQ1IgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDU1XzIwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTVfMjAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0wzX0RJU0FCTEVfTkFQIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDU1CShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N18xMAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDQ3XzEwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX05PX0JUSUMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0NwkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDQ3CShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N0EJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N0EJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDQ4CShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NDgJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU184MlhYCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzgyWFgJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIpCi0jZGVmaW5lIENQVV9GVFJTX0cyX0xFCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfRzJfTEUJKENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTKQotI2RlZmluZSBDUFVfRlRSU19FMzAwCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfRTMwMAkoQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfQ09NTU9OKQotI2RlZmluZSBDUFVfRlRSU19FMzAwQzIJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAorI2RlZmluZSBDUFVfRlRSU19FMzAwQzIJKENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfRlBVX1VOQVZBSUxBQkxFKQotI2RlZmluZSBDUFVfRlRSU19DTEFTU0lDMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfQ0xBU1NJQzMyCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUpCi0jZGVmaW5lIENQVV9GVFJTXzhYWAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCKQotI2RlZmluZSBDUFVfRlRSU180MFgJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKLQkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTXzQ0WAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX05PRFNJU1JBTElHTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTIwMAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTUwMAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX05PRFNJU1JBTElHTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTUwMF8yCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTXzhYWAkoQ1BVX0ZUUl9VU0VfVEIpCisjZGVmaW5lIENQVV9GVFJTXzQwWAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKKyNkZWZpbmUgQ1BVX0ZUUlNfNDRYCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQorI2RlZmluZSBDUFVfRlRSU19FMjAwCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOIHwgXAorCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRSkKKyNkZWZpbmUgQ1BVX0ZUUlNfRTUwMAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKKyNkZWZpbmUgQ1BVX0ZUUlNfRTUwMF8yCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9CSUdfUEhZUyB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQogI2RlZmluZSBDUFVfRlRSU19HRU5FUklDXzMyCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQogCiAvKiA2NC1iaXQgQ1BVcyAqLwotI2RlZmluZSBDUFVfRlRSU19QT1dFUjMJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVIzCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTX1JTNjQJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUlM2NAkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCkKLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI0CShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSNAkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSkKLSNkZWZpbmUgQ1BVX0ZUUlNfUFBDOTcwCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BQQzk3MAkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX01NQ1JBKQotI2RlZmluZSBDUFVfRlRSU19QT1dFUjUJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI1CShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSKQotI2RlZmluZSBDUFVfRlRSU19QT1dFUjYgKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI2IChDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9TUFVSUiB8IENQVV9GVFJfUkVBTF9MRSB8IFwKIAkgICAgQ1BVX0ZUUl9EU0NSKQotI2RlZmluZSBDUFVfRlRSU19DRUxMCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX1BBVVNFX1pFUk8gfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBDUFVfRlRSX0NFTExfVEJfQlVHKQotI2RlZmluZSBDUFVfRlRSU19QQTZUIChDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BBNlQgKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFIHwgXAogCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1JFQUxfTEUpCi0jZGVmaW5lIENQVV9GVFJTX0NPTVBBVElCTEUJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfQ09NUEFUSUJMRQkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMikKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTFhZjhkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mYi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCBvZmYgPj4gUEFHRV9TSElGVCwKKwkJCQkJCSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJCQkgdm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCmluZGV4IGFmYTcwMGQuLjM0MTQ2ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaApAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBmZF9mcmVlX2lycSgpICAgICAgICAgICBmcmVlX2lycShGTE9QUFlfSVJRLCBOVUxMKTsKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CS8qIGZvciBwcGM2NF9pc2FicmlkZ2VfZGV2ICovCisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4JLyogZm9yIGlzYV9icmlkZ2VfcGNpZGV2ICovCiAKICNkZWZpbmUgZmRfZG1hX3NldHVwKGFkZHIsc2l6ZSxtb2RlLGlvKSBmZF9vcHMtPl9kbWFfc2V0dXAoYWRkcixzaXplLG1vZGUsaW8pCiAKQEAgLTEzOSwxMiArMTM5LDEyIEBACiAJaWYgKGJ1c19hZGRyIAogCSAgICAmJiAoYWRkciAhPSBwcmV2X2FkZHIgfHwgc2l6ZSAhPSBwcmV2X3NpemUgfHwgZGlyICE9IHByZXZfZGlyKSkgewogCQkvKiBkaWZmZXJlbnQgZnJvbSBsYXN0IHRpbWUgLS0gdW5tYXAgcHJldiAqLwotCQlwY2lfdW5tYXBfc2luZ2xlKHBwYzY0X2lzYWJyaWRnZV9kZXYsIGJ1c19hZGRyLCBwcmV2X3NpemUsIHByZXZfZGlyKTsKKwkJcGNpX3VubWFwX3NpbmdsZShpc2FfYnJpZGdlX3BjaWRldiwgYnVzX2FkZHIsIHByZXZfc2l6ZSwgcHJldl9kaXIpOwogCQlidXNfYWRkciA9IDA7CiAJfQogCiAJaWYgKCFidXNfYWRkcikJLyogbmVlZCB0byBtYXAgaXQgKi8KLQkJYnVzX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwcGM2NF9pc2FicmlkZ2VfZGV2LCBhZGRyLCBzaXplLCBkaXIpOworCQlidXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGlzYV9icmlkZ2VfcGNpZGV2LCBhZGRyLCBzaXplLCBkaXIpOwogCiAJLyogcmVtZW1iZXIgdGhpcyBvbmUgYXMgcHJldiAqLwogCXByZXZfYWRkciA9IGFkZHI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaAppbmRleCA2MmVmZDlkLi5iZjZjZDdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKQEAgLTIwNiw2ICsyMDYsNyBAQAogI2RlZmluZSBIX0ZSRUVfTE9HSUNBTF9MQU5fQlVGRkVSIDB4MUQ0CiAjZGVmaW5lIEhfUVVFUllfSU5UX1NUQVRFICAgICAgIDB4MUU0CiAjZGVmaW5lIEhfUE9MTF9QRU5ESU5HCQkweDFEOAorI2RlZmluZSBIX0lMTEFOX0FUVFJJQlVURVMJMHgyNDQKICNkZWZpbmUgSF9KT0lOCQkJMHgyOTgKICNkZWZpbmUgSF9WQVNJX1NUQVRFICAgICAgICAgICAgMHgyQTQKICNkZWZpbmUgSF9FTkFCTEVfQ1JRCQkweDJCMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCmluZGV4IDM1MGM5YmQuLmJiOGQ5NjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKQEAgLTYwNyw5ICs2MDcsOSBAQAogICoKICAqICogaW91bm1hcCB1bmRvZXMgc3VjaCBhIG1hcHBpbmcgYW5kIGNhbiBiZSBob29rZWQKICAqCi0gKiAqIF9faW9yZW1hcF9leHBsaWNpdCAoYW5kIHRoZSBwZW5kaW5nIF9faW91bm1hcF9leHBsaWNpdCkgYXJlIGxvdyBsZXZlbAotICogICBmdW5jdGlvbnMgdG8gY3JlYXRlIGhhbmQtbWFkZSBtYXBwaW5ncyBmb3IgdXNlIG9ubHkgYnkgdGhlIFBDSSBjb2RlCi0gKiAgIGFuZCBjYW5ub3QgY3VycmVudGx5IGJlIGhvb2tlZC4KKyAqICogX19pb3JlbWFwX2F0IChhbmQgdGhlIHBlbmRpbmcgX19pb3VubWFwX2F0KSBhcmUgbG93IGxldmVsIGZ1bmN0aW9ucyB0bworICogICBjcmVhdGUgaGFuZC1tYWRlIG1hcHBpbmdzIGZvciB1c2Ugb25seSBieSB0aGUgUENJIGNvZGUgYW5kIGNhbm5vdAorICogICBjdXJyZW50bHkgYmUgaG9va2VkLiBNdXN0IGJlIHBhZ2UgYWxpZ25lZC4KICAqCiAgKiAqIF9faW9yZW1hcCBpcyB0aGUgbG93IGxldmVsIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgaW9yZW1hcCBhbmQKICAqICAgaW9yZW1hcF9mbGFncyBhbmQgY2Fubm90IGJlIGhvb2tlZCAoYnV0IGNhbiBiZSB1c2VkIGJ5IGEgaG9vayBvbiBvbmUKQEAgLTYyOSwxOSArNjI5LDkgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiB2b2lkIF9faW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwogCi1leHRlcm4gaW50IF9faW9yZW1hcF9leHBsaWNpdChwaHlzX2FkZHJfdCBwX2FkZHIsIHVuc2lnbmVkIGxvbmcgdl9hZGRyLAotCQkgICAgIAkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIGludCBfX2lvdW5tYXBfZXhwbGljaXQodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzdGFydCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiB2b2lkIF9faW9tZW0gKiByZXNlcnZlX3BoYl9pb3NwYWNlKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLS8qIFRob3NlIGFyZSBtb3JlIDMyIGJpdHMgb25seSBmdW5jdGlvbnMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGlvcGEodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1tX3B0b3YodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwotZXh0ZXJuIHZvaWQgaW9fYmxvY2tfbWFwcGluZyh1bnNpZ25lZCBsb25nIHZpcnQsIHBoeXNfYWRkcl90IHBoeXMsCi0JCQkgICAgIHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpOwotCitleHRlcm4gdm9pZCBfX2lvbWVtICogX19pb3JlbWFwX2F0KHBoeXNfYWRkcl90IHBhLCB2b2lkICplYSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIHZvaWQgX19pb3VubWFwX2F0KHZvaWQgKmVhLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCiAvKgogICogV2hlbiBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIHNldCwgd2UgdXNlIHRoZSBnZW5lcmljIGlvbWFwIGltcGxlbWVudGF0aW9uCkBAIC02NTEsOCArNjQxLDggQEAKICAqLwogI2RlZmluZSBIQVZFX0FSQ0hfUElPX1NJWkUJCTEKICNkZWZpbmUgUElPX09GRlNFVAkJCTB4MDAwMDAwMDBVTAotI2RlZmluZSBQSU9fTUFTSwkJCTB4M2ZmZmZmZmZVTAotI2RlZmluZSBQSU9fUkVTRVJWRUQJCQkweDQwMDAwMDAwVUwKKyNkZWZpbmUgUElPX01BU0sJCQkoRlVMTF9JT19TSVpFIC0gMSkKKyNkZWZpbmUgUElPX1JFU0VSVkVECQkJKEZVTExfSU9fU0laRSkKIAogI2RlZmluZSBtbWlvX3JlYWQxNmJlKGFkZHIpCQlyZWFkd19iZShhZGRyKQogI2RlZmluZSBtbWlvX3JlYWQzMmJlKGFkZHIpCQlyZWFkbF9iZShhZGRyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKaW5kZXggMDVkZDVhMy4uMDQ4NWM1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCkBAIC0yMjMsNiArMjIzLDE1IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGlycV9maW5kX21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0LAogCQkJCSAgICAgaXJxX2h3X251bWJlcl90IGh3aXJxKTsKIAorLyoqCisgKiBpcnFfY3JlYXRlX2RpcmVjdF9tYXBwaW5nIC0gQWxsb2NhdGUgYSB2aXJxIGZvciBkaXJlY3QgbWFwcGluZworICogQGhvc3Q6IGhvc3QgdG8gYWxsb2NhdGUgdGhlIHZpcnEgZm9yIG9yIE5VTEwgZm9yIGRlZmF1bHQgaG9zdAorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBpcnEgY29udHJvbGxlcnMgd2hpY2ggY2FuIGNob29zZSB0aGUgaGFyZHdhcmUKKyAqIGludGVycnVwdCBudW1iZXJzIHRoZXkgZ2VuZXJhdGUuIEluIHN1Y2ggYSBjYXNlIGl0J3Mgc2ltcGxlc3QgdG8gdXNlCisgKiB0aGUgbGludXggdmlycSBhcyB0aGUgaGFyZHdhcmUgaW50ZXJydXB0IG51bWJlci4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX2RpcmVjdF9tYXBwaW5nKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCk7CiAKIC8qKgogICogaXJxX3JhZGl4X3Jldm1hcCAtIEZpbmQgYSBsaW51eCB2aXJxIGZyb20gYSBodyBpcnEgbnVtYmVyLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaAppbmRleCBiMGU0MGZmLi45NTM3ZmRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaApAQCAtNjUsMTAgKzY1LDEwIEBACiAJCX0gZWxzZSBpZiAobmFtZVswXSAhPSAnLicpCQkJCVwKIAkJCWFkZHIgPSAqKGtwcm9iZV9vcGNvZGVfdCAqKilhZGRyOwkJXAogCX0gZWxzZSB7CQkJCQkJCVwKLQkJY2hhciBkb3RfbmFtZVtLU1lNX05BTUVfTEVOKzFdOwkJCQlcCisJCWNoYXIgZG90X25hbWVbS1NZTV9OQU1FX0xFTl07CQkJCVwKIAkJZG90X25hbWVbMF0gPSAnLic7CQkJCQlcCiAJCWRvdF9uYW1lWzFdID0gJ1wwJzsJCQkJCVwKLQkJc3RybmNhdChkb3RfbmFtZSwgbmFtZSwgS1NZTV9OQU1FX0xFTik7CQkJXAorCQlzdHJuY2F0KGRvdF9uYW1lLCBuYW1lLCBLU1lNX05BTUVfTEVOIC0gMik7CQlcCiAJCWFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopa2FsbHN5bXNfbG9va3VwX25hbWUoZG90X25hbWUpOyBcCiAJfQkJCQkJCQkJXAogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKaW5kZXggODIxZWEwYy4uNTY3ZWQ5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCkBAIC05OCw3ICs5OCw3IEBACiAJdTY0CXNhdmVkX2dwcjU7CQkvLyBTYXZlZCBHUFI1ICAgICAgICAgICAgICAgICAgIHgzMC14MzcKIAogCXU4CXJlc2VydmVkNDsJCS8vIFJlc2VydmVkCQkJeDM4LXgzOAotCXU4CWNwdWN0bHNfdGFza19hdHRyczsJLy8gVGFzayBhdHRyaWJ1dGVzIGZvciBjcHVjdGxzICB4MzkteDM5CisJdTgJZG9uYXRlX2RlZGljYXRlZF9jcHU7CS8vIERvbmF0ZSBkZWRpY2F0ZWQgQ1BVIGN5Y2xlcyAgeDM5LXgzOQogCXU4CWZwcmVnc19pbl91c2U7CQkvLyBGUCByZWdzIGluIHVzZSAgICAgICAgICAgICAgIHgzQS14M0EKIAl1OAlwbWNyZWdzX2luX3VzZTsJCS8vIFBNQyByZWdzIGluIHVzZSAgICAgICAgICAgICAgeDNCLXgzQgogCXZvbGF0aWxlIHUzMiBzYXZlZF9kZWNyOwkvLyBTYXZlZCBEZWNyIFZhbHVlICAgICAgICAgICAgIHgzQy14M0YKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKaW5kZXggZjczM2JlZS4uODE3MTNhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKQEAgLTIzOCw2ICsyMzgsNyBAQAogTFYxX0NBTEwoY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAsICAgICAgICAgICAgICAgICAgICAzLCAwLCAgMTEgKQogTFYxX0NBTEwoY29ubmVjdF9pcnFfcGx1Z19leHQsICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCAgMTIgKQogTFYxX0NBTEwocmVsZWFzZV9tZW1vcnksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAgMTMgKQorTFYxX0NBTEwocHV0X2lvcHRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCAgMTUgKQogTFYxX0NBTEwoZGlzY29ubmVjdF9pcnFfcGx1Z19leHQsICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAgMTcgKQogTFYxX0NBTEwoY29uc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCwgICAgICAgICAgICAgICAgICAwLCAxLCAgMTggKQogTFYxX0NBTEwoZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0LCAgICAgICAgICAgICAgICAgICAxLCAwLCAgMTkgKQpAQCAtMjY4LDYgKzI2OSw4IEBACiBMVjFfQ0FMTChyZWFkX2h0YWJfZW50cmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDUsICA5NSApCiBMVjFfQ0FMTChzZXRfZGFiciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsICA5NiApCiBMVjFfQ0FMTChnZXRfdG90YWxfZXhlY3V0aW9uX3RpbWUsICAgICAgICAgICAgICAgICAgICAgIDIsIDEsIDEwMyApCitMVjFfQ0FMTChhbGxvY2F0ZV9pb19zZWdtZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDExNiApCitMVjFfQ0FMTChyZWxlYXNlX2lvX3NlZ21lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsIDExNyApCiBMVjFfQ0FMTChjb25zdHJ1Y3RfaW9faXJxX291dGxldCwgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEyMCApCiBMVjFfQ0FMTChkZXN0cnVjdF9pb19pcnFfb3V0bGV0LCAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDEyMSApCiBMVjFfQ0FMTChtYXBfaHRhYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEyMiApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCmluZGV4IDZjZjFhODMuLjcxYzZlN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCkBAIC0yMTgsNyArMjE4LDcgQEAKIAlpbnQgICgqcGNpYmlvc19lbmFibGVfZGV2aWNlX2hvb2spKHN0cnVjdCBwY2lfZGV2ICosIGludCBpbml0aWFsKTsKIAogCS8qIENhbGxlZCBpbiBpbmRpcmVjdF8qIHRvIGF2b2lkIHRvdWNoaW5nIGRldmljZXMgKi8KLQlpbnQgKCpwY2lfZXhjbHVkZV9kZXZpY2UpKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpOworCWludCAoKnBjaV9leGNsdWRlX2RldmljZSkoc3RydWN0IHBjaV9jb250cm9sbGVyICosIHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpOwogCiAJLyogQ2FsbGVkIGF0IHRoZW4gdmVyeSBlbmQgb2YgcGNpYmlvc19pbml0KCkgKi8KIAl2b2lkICgqcGNpYmlvc19hZnRlcl9pbml0KSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LTh4eC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyYmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LTh4eC5oCkBAIC0wLDAgKzEsMTQ3IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfOFhYX0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19NTVVfOFhYX0hfCisvKgorICogUFBDOHh4IHN1cHBvcnQKKyAqLworCisvKiBDb250cm9sL3N0YXR1cyByZWdpc3RlcnMgZm9yIHRoZSBNUEM4eHguCisgKiBBIHdyaXRlIG9wZXJhdGlvbiB0byB0aGVzZSByZWdpc3RlcnMgY2F1c2VzIHNlcmlhbGl6ZWQgYWNjZXNzLgorICogRHVyaW5nIHNvZnR3YXJlIHRhYmxld2FsaywgdGhlIHJlZ2lzdGVycyB1c2VkIHBlcmZvcm0gbWFzay9zaGlmdC1hZGQKKyAqIG9wZXJhdGlvbnMgd2hlbiB3cml0dGVuL3JlYWQuICBBIFRMQiBlbnRyeSBpcyBjcmVhdGVkIHdoZW4gdGhlIE14X1JQTgorICogaXMgd3JpdHRlbiwgYW5kIHRoZSBjb250ZW50cyBvZiBzZXZlcmFsIHJlZ2lzdGVycyBhcmUgdXNlZCB0bworICogY3JlYXRlIHRoZSBlbnRyeS4KKyAqLworI2RlZmluZSBTUFJOX01JX0NUUgk3ODQJLyogSW5zdHJ1Y3Rpb24gVExCIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlfR1BNCQkweDgwMDAwMDAwCS8qIFNldCBkb21haW4gbWFuYWdlciBtb2RlICovCisjZGVmaW5lIE1JX1BQTQkJMHg0MDAwMDAwMAkvKiBTZXQgc3VicGFnZSBwcm90ZWN0aW9uICovCisjZGVmaW5lIE1JX0NJREVGCTB4MjAwMDAwMDAJLyogU2V0IGNhY2hlIGluaGliaXQgd2hlbiBNTVUgZGlzICovCisjZGVmaW5lIE1JX1JTVjRJCTB4MDgwMDAwMDAJLyogUmVzZXJ2ZSA0IFRMQiBlbnRyaWVzICovCisjZGVmaW5lIE1JX1BQQ1MJCTB4MDIwMDAwMDAJLyogVXNlIE1JX1JQTiBwcm9iL3ByaXYgc3RhdGUgKi8KKyNkZWZpbmUgTUlfSURYTUFTSwkweDAwMDAxZjAwCS8qIFRMQiBpbmRleCB0byBiZSBsb2FkZWQgKi8KKyNkZWZpbmUgTUlfUkVTRVRWQUwJMHgwMDAwMDAwMAkvKiBWYWx1ZSBvZiByZWdpc3RlciBhdCByZXNldCAqLworCisvKiBUaGVzZSBhcmUgdGhlIEtzIGFuZCBLcCBmcm9tIHRoZSBQb3dlclBDIGJvb2tzLiAgRm9yIHByb3BlciBvcGVyYXRpb24sCisgKiBLcyA9IDAsIEtwID0gMS4KKyAqLworI2RlZmluZSBTUFJOX01JX0FQCTc4NgorI2RlZmluZSBNSV9LcwkJMHg4MDAwMDAwMAkvKiBTaG91bGQgbm90IGJlIHNldCAqLworI2RlZmluZSBNSV9LcAkJMHg0MDAwMDAwMAkvKiBTaG91bGQgYWx3YXlzIGJlIHNldCAqLworCisvKiBUaGUgZWZmZWN0aXZlIHBhZ2UgbnVtYmVyIHJlZ2lzdGVyLiAgV2hlbiByZWFkLCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KKyAqIGFib3V0IHRoZSBsYXN0IGluc3RydWN0aW9uIFRMQiBtaXNzLiAgV2hlbiBNSV9SUE4gaXMgd3JpdHRlbiwgYml0cyBpbgorICogdGhpcyByZWdpc3RlciBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIFRMQiBlbnRyeS4KKyAqLworI2RlZmluZSBTUFJOX01JX0VQTgk3ODcKKyNkZWZpbmUgTUlfRVBOTUFTSwkweGZmZmZmMDAwCS8qIEVmZmVjdGl2ZSBwYWdlIG51bWJlciBmb3IgZW50cnkgKi8KKyNkZWZpbmUgTUlfRVZBTElECTB4MDAwMDAyMDAJLyogRW50cnkgaXMgdmFsaWQgKi8KKyNkZWZpbmUgTUlfQVNJRE1BU0sJMHgwMDAwMDAwZgkvKiBBU0lEIG1hdGNoIHZhbHVlICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisvKiBBICJsZXZlbCAxIiBvciAic2VnbWVudCIgb3Igd2hhdGV2ZXIgeW91IHdhbnQgdG8gY2FsbCBpdCByZWdpc3Rlci4KKyAqIEZvciB0aGUgaW5zdHJ1Y3Rpb24gVExCLCBpdCBjb250YWlucyBiaXRzIHRoYXQgZ2V0IGxvYWRlZCBpbnRvIHRoZQorICogVExCIGVudHJ5IHdoZW4gdGhlIE1JX1JQTiBpcyB3cml0dGVuLgorICovCisjZGVmaW5lIFNQUk5fTUlfVFdDCTc4OQorI2RlZmluZSBNSV9BUEcJCTB4MDAwMDAxZTAJLyogQWNjZXNzIHByb3RlY3Rpb24gZ3JvdXAgKDApICovCisjZGVmaW5lIE1JX0dVQVJERUQJMHgwMDAwMDAxMAkvKiBHdWFyZGVkIHN0b3JhZ2UgKi8KKyNkZWZpbmUgTUlfUFNNQVNLCTB4MDAwMDAwMGMJLyogTWFzayBvZiBwYWdlIHNpemUgYml0cyAqLworI2RlZmluZSBNSV9QUzhNRUcJMHgwMDAwMDAwYwkvKiA4TSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTUlfUFM1MTJLCTB4MDAwMDAwMDQJLyogNTEySyBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTUlfUFM0S18xNksJMHgwMDAwMDAwMAkvKiA0SyBvciAxNksgcGFnZSBzaXplICovCisjZGVmaW5lIE1JX1NWQUxJRAkweDAwMDAwMDAxCS8qIFNlZ21lbnQgZW50cnkgaXMgdmFsaWQgKi8KKwkJCQkJLyogUmVzZXQgdmFsdWUgaXMgdW5kZWZpbmVkICovCisKKy8qIFJlYWwgcGFnZSBudW1iZXIuICBEZWZpbmVkIGJ5IHRoZSBwdGUuICBXcml0aW5nIHRoaXMgcmVnaXN0ZXIKKyAqIGNhdXNlcyBhIFRMQiBlbnRyeSB0byBiZSBjcmVhdGVkIGZvciB0aGUgaW5zdHJ1Y3Rpb24gVExCLCB1c2luZworICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBNSV9FUE4sIGFuZCBNSV9UV0MgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFNQUk5fTUlfUlBOCTc5MAorCisvKiBEZWZpbmUgYW4gUlBOIHZhbHVlIGZvciBtYXBwaW5nIGtlcm5lbCBtZW1vcnkgdG8gbGFyZ2UgdmlydHVhbAorICogcGFnZXMgZm9yIGJvb3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGhhcyByZWFsIHBhZ2UgbnVtYmVyIG9mIDAsCisgKiBsYXJnZSBwYWdlIHNpemUsIHNoYXJlZCBwYWdlLCBjYWNoZSBlbmFibGVkLCBhbmQgdmFsaWQuCisgKiBBbHNvIG1hcmsgYWxsIHN1YnBhZ2VzIHZhbGlkIGFuZCB3cml0ZSBhY2Nlc3MuCisgKi8KKyNkZWZpbmUgTUlfQk9PVElOSVQJMHgwMDAwMDFmZAorCisjZGVmaW5lIFNQUk5fTURfQ1RSCTc5MgkvKiBEYXRhIFRMQiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1EX0dQTQkJMHg4MDAwMDAwMAkvKiBTZXQgZG9tYWluIG1hbmFnZXIgbW9kZSAqLworI2RlZmluZSBNRF9QUE0JCTB4NDAwMDAwMDAJLyogU2V0IHN1YnBhZ2UgcHJvdGVjdGlvbiAqLworI2RlZmluZSBNRF9DSURFRgkweDIwMDAwMDAwCS8qIFNldCBjYWNoZSBpbmhpYml0IHdoZW4gTU1VIGRpcyAqLworI2RlZmluZSBNRF9XVERFRgkweDEwMDAwMDAwCS8qIFNldCB3cml0ZXRocm91Z2ggd2hlbiBNTVUgZGlzICovCisjZGVmaW5lIE1EX1JTVjRJCTB4MDgwMDAwMDAJLyogUmVzZXJ2ZSA0IFRMQiBlbnRyaWVzICovCisjZGVmaW5lIE1EX1RXQU0JCTB4MDQwMDAwMDAJLyogVXNlIDRLIHBhZ2UgaGFyZHdhcmUgYXNzaXN0ICovCisjZGVmaW5lIE1EX1BQQ1MJCTB4MDIwMDAwMDAJLyogVXNlIE1JX1JQTiBwcm9iL3ByaXYgc3RhdGUgKi8KKyNkZWZpbmUgTURfSURYTUFTSwkweDAwMDAxZjAwCS8qIFRMQiBpbmRleCB0byBiZSBsb2FkZWQgKi8KKyNkZWZpbmUgTURfUkVTRVRWQUwJMHgwNDAwMDAwMAkvKiBWYWx1ZSBvZiByZWdpc3RlciBhdCByZXNldCAqLworCisjZGVmaW5lIFNQUk5fTV9DQVNJRAk3OTMJLyogQWRkcmVzcyBzcGFjZSBJRCAoY29udGV4dCkgdG8gbWF0Y2ggKi8KKyNkZWZpbmUgTUNfQVNJRE1BU0sJMHgwMDAwMDAwZgkvKiBCaXRzIHVzZWQgZm9yIEFTSUQgdmFsdWUgKi8KKworCisvKiBUaGVzZSBhcmUgdGhlIEtzIGFuZCBLcCBmcm9tIHRoZSBQb3dlclBDIGJvb2tzLiAgRm9yIHByb3BlciBvcGVyYXRpb24sCisgKiBLcyA9IDAsIEtwID0gMS4KKyAqLworI2RlZmluZSBTUFJOX01EX0FQCTc5NAorI2RlZmluZSBNRF9LcwkJMHg4MDAwMDAwMAkvKiBTaG91bGQgbm90IGJlIHNldCAqLworI2RlZmluZSBNRF9LcAkJMHg0MDAwMDAwMAkvKiBTaG91bGQgYWx3YXlzIGJlIHNldCAqLworCisvKiBUaGUgZWZmZWN0aXZlIHBhZ2UgbnVtYmVyIHJlZ2lzdGVyLiAgV2hlbiByZWFkLCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KKyAqIGFib3V0IHRoZSBsYXN0IGluc3RydWN0aW9uIFRMQiBtaXNzLiAgV2hlbiBNRF9SUE4gaXMgd3JpdHRlbiwgYml0cyBpbgorICogdGhpcyByZWdpc3RlciBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIFRMQiBlbnRyeS4KKyAqLworI2RlZmluZSBTUFJOX01EX0VQTgk3OTUKKyNkZWZpbmUgTURfRVBOTUFTSwkweGZmZmZmMDAwCS8qIEVmZmVjdGl2ZSBwYWdlIG51bWJlciBmb3IgZW50cnkgKi8KKyNkZWZpbmUgTURfRVZBTElECTB4MDAwMDAyMDAJLyogRW50cnkgaXMgdmFsaWQgKi8KKyNkZWZpbmUgTURfQVNJRE1BU0sJMHgwMDAwMDAwZgkvKiBBU0lEIG1hdGNoIHZhbHVlICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisvKiBUaGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBsZXZlbCBwYWdlIHRhYmxlLgorICogRHVyaW5nIGEgc29mdHdhcmUgdGFibGV3YWxrLCByZWFkaW5nIHRoaXMgcmVnaXN0ZXIgcHJvdmlkZXMgdGhlIGFkZHJlc3MKKyAqIG9mIHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggTURfRVBOLgorICovCisjZGVmaW5lIFNQUk5fTV9UV0IJNzk2CisjZGVmaW5lCU1fTDFUQgkJMHhmZmZmZjAwMAkvKiBMZXZlbCAxIHRhYmxlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBNX0wxSU5EWAkweDAwMDAwZmZjCS8qIExldmVsIDEgaW5kZXgsIHdoZW4gcmVhZCAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworLyogQSAibGV2ZWwgMSIgb3IgInNlZ21lbnQiIG9yIHdoYXRldmVyIHlvdSB3YW50IHRvIGNhbGwgaXQgcmVnaXN0ZXIuCisgKiBGb3IgdGhlIGRhdGEgVExCLCBpdCBjb250YWlucyBiaXRzIHRoYXQgZ2V0IGxvYWRlZCBpbnRvIHRoZSBUTEIgZW50cnkKKyAqIHdoZW4gdGhlIE1EX1JQTiBpcyB3cml0dGVuLiAgSXQgaXMgYWxzbyBwcm92aWRlcyB0aGUgaGFyZHdhcmUgYXNzaXN0CisgKiBmb3IgZmluZGluZyB0aGUgUFRFIGFkZHJlc3MgZHVyaW5nIHNvZnR3YXJlIHRhYmxld2Fsay4KKyAqLworI2RlZmluZSBTUFJOX01EX1RXQwk3OTcKKyNkZWZpbmUgTURfTDJUQgkJMHhmZmZmZjAwMAkvKiBMZXZlbCAyIHRhYmxlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBNRF9MMklORFgJMHhmZmZmZmUwMAkvKiBMZXZlbCAyIGluZGV4ICgqcHRlKSwgd2hlbiByZWFkICovCisjZGVmaW5lIE1EX0FQRwkJMHgwMDAwMDFlMAkvKiBBY2Nlc3MgcHJvdGVjdGlvbiBncm91cCAoMCkgKi8KKyNkZWZpbmUgTURfR1VBUkRFRAkweDAwMDAwMDEwCS8qIEd1YXJkZWQgc3RvcmFnZSAqLworI2RlZmluZSBNRF9QU01BU0sJMHgwMDAwMDAwYwkvKiBNYXNrIG9mIHBhZ2Ugc2l6ZSBiaXRzICovCisjZGVmaW5lIE1EX1BTOE1FRwkweDAwMDAwMDBjCS8qIDhNIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNRF9QUzUxMksJMHgwMDAwMDAwNAkvKiA1MTJLIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNRF9QUzRLXzE2SwkweDAwMDAwMDAwCS8qIDRLIG9yIDE2SyBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTURfV1QJCTB4MDAwMDAwMDIJLyogVXNlIHdyaXRldGhyb3VnaCBwYWdlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBNRF9TVkFMSUQJMHgwMDAwMDAwMQkvKiBTZWdtZW50IGVudHJ5IGlzIHZhbGlkICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisKKy8qIFJlYWwgcGFnZSBudW1iZXIuICBEZWZpbmVkIGJ5IHRoZSBwdGUuICBXcml0aW5nIHRoaXMgcmVnaXN0ZXIKKyAqIGNhdXNlcyBhIFRMQiBlbnRyeSB0byBiZSBjcmVhdGVkIGZvciB0aGUgZGF0YSBUTEIsIHVzaW5nCisgKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIE1EX0VQTiwgYW5kIE1EX1RXQyByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9SUE4JNzk4CisKKy8qIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSByZWdpc3RlciB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gc2F2ZQorICogYSBwcm9jZXNzb3Igd29ya2luZyByZWdpc3RlciBkdXJpbmcgYSB0YWJsZXdhbGsuCisgKi8KKyNkZWZpbmUgU1BSTl9NX1RXCTc5OQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBpZDsKKwl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKK30gbW1fY29udGV4dF90OworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19NTVVfOFhYX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1mc2wtYm9va2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWZzbC1ib29rZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTgwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1mc2wtYm9va2UuaApAQCAtMCwwICsxLDg4IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfRlNMX0JPT0tFX0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19NTVVfRlNMX0JPT0tFX0hfCisvKgorICogRnJlZXNjYWxlIEJvb2stRSBNTVUgc3VwcG9ydAorICovCisKKy8qIEJvb2stRSBkZWZpbmVkIHBhZ2Ugc2l6ZXMgKi8KKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFLCQkwCisjZGVmaW5lIEJPT0tFX1BBR0VTWl80SwkJMQorI2RlZmluZSBCT09LRV9QQUdFU1pfMTZLCTIKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzY0SwkzCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8yNTZLCTQKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFNCQk1CisjZGVmaW5lIEJPT0tFX1BBR0VTWl80TQkJNgorI2RlZmluZSBCT09LRV9QQUdFU1pfMTZNCTcKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzY0TQk4CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8yNTZNCTkKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFHQgkxMAorI2RlZmluZSBCT09LRV9QQUdFU1pfNEdCCTExCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xNkdCCTEyCisjZGVmaW5lIEJPT0tFX1BBR0VTWl82NEdCCTEzCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8yNTZHQgkxNAorI2RlZmluZSBCT09LRV9QQUdFU1pfMVRCCTE1CisKKyNkZWZpbmUgTUFTMF9UTEJTRUwoeCkJKCh4IDw8IDI4KSAmIDB4MzAwMDAwMDApCisjZGVmaW5lIE1BUzBfRVNFTCh4KQkoKHggPDwgMTYpICYgMHgwRkZGMDAwMCkKKyNkZWZpbmUgTUFTMF9OVih4KQkoKHgpICYgMHgwMDAwMEZGRikKKworI2RlZmluZSBNQVMxX1ZBTElEIAkweDgwMDAwMDAwCisjZGVmaW5lIE1BUzFfSVBST1QJMHg0MDAwMDAwMAorI2RlZmluZSBNQVMxX1RJRCh4KQkoKHggPDwgMTYpICYgMHgzRkZGMDAwMCkKKyNkZWZpbmUgTUFTMV9UUwkJMHgwMDAwMTAwMAorI2RlZmluZSBNQVMxX1RTSVpFKHgpCSgoeCA8PCA4KSAmIDB4MDAwMDBGMDApCisKKyNkZWZpbmUgTUFTMl9FUE4JMHhGRkZGRjAwMAorI2RlZmluZSBNQVMyX1gwCQkweDAwMDAwMDQwCisjZGVmaW5lIE1BUzJfWDEJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFTMl9XCQkweDAwMDAwMDEwCisjZGVmaW5lIE1BUzJfSQkJMHgwMDAwMDAwOAorI2RlZmluZSBNQVMyX00JCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUFTMl9HCQkweDAwMDAwMDAyCisjZGVmaW5lIE1BUzJfRQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1BUzNfUlBOCTB4RkZGRkYwMDAKKyNkZWZpbmUgTUFTM19VMAkJMHgwMDAwMDIwMAorI2RlZmluZSBNQVMzX1UxCQkweDAwMDAwMTAwCisjZGVmaW5lIE1BUzNfVTIJCTB4MDAwMDAwODAKKyNkZWZpbmUgTUFTM19VMwkJMHgwMDAwMDA0MAorI2RlZmluZSBNQVMzX1VYCQkweDAwMDAwMDIwCisjZGVmaW5lIE1BUzNfU1gJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFTM19VVwkJMHgwMDAwMDAwOAorI2RlZmluZSBNQVMzX1NXCQkweDAwMDAwMDA0CisjZGVmaW5lIE1BUzNfVVIJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUFTM19TUgkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1BUzRfVExCU0VMRCh4KSBNQVMwX1RMQlNFTCh4KQorI2RlZmluZSBNQVM0X1RJRERTRUwJMHgwMDBGMDAwMAorI2RlZmluZSBNQVM0X1RTSVpFRCh4KQlNQVMxX1RTSVpFKHgpCisjZGVmaW5lIE1BUzRfWDBECTB4MDAwMDAwNDAKKyNkZWZpbmUgTUFTNF9YMUQJMHgwMDAwMDAyMAorI2RlZmluZSBNQVM0X1dECQkweDAwMDAwMDEwCisjZGVmaW5lIE1BUzRfSUQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFTNF9NRAkJMHgwMDAwMDAwNAorI2RlZmluZSBNQVM0X0dECQkweDAwMDAwMDAyCisjZGVmaW5lIE1BUzRfRUQJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNQVM2X1NQSUQwCTB4M0ZGRjAwMDAKKyNkZWZpbmUgTUFTNl9TUElEMQkweDAwMDA3RkZFCisjZGVmaW5lIE1BUzZfU0FTCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFTNl9TUElECU1BUzZfU1BJRDAKKworI2RlZmluZSBNQVM3X1JQTgkweEZGRkZGRkZGCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZm5kZWYgQ09ORklHX1BIWVNfNjRCSVQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBwaHlzX2FkZHJfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBpZDsKKwl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKK30gbW1fY29udGV4dF90OworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19NTVVfRlNMX0JPT0tFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoMzIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2gzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDczNWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoMzIuaApAQCAtMCwwICsxLDkxIEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfSEFTSDMyX0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19NTVVfSEFTSDMyX0hfCisvKgorICogMzItYml0IGhhc2ggdGFibGUgTU1VIHN1cHBvcnQKKyAqLworCisvKgorICogQkFUcworICovCisKKy8qIEJsb2NrIHNpemUgbWFza3MgKi8KKyNkZWZpbmUgQkxfMTI4SwkweDAwMAorI2RlZmluZSBCTF8yNTZLIDB4MDAxCisjZGVmaW5lIEJMXzUxMksgMHgwMDMKKyNkZWZpbmUgQkxfMU0gICAweDAwNworI2RlZmluZSBCTF8yTSAgIDB4MDBGCisjZGVmaW5lIEJMXzRNICAgMHgwMUYKKyNkZWZpbmUgQkxfOE0gICAweDAzRgorI2RlZmluZSBCTF8xNk0gIDB4MDdGCisjZGVmaW5lIEJMXzMyTSAgMHgwRkYKKyNkZWZpbmUgQkxfNjRNICAweDFGRgorI2RlZmluZSBCTF8xMjhNIDB4M0ZGCisjZGVmaW5lIEJMXzI1Nk0gMHg3RkYKKworLyogQkFUIEFjY2VzcyBQcm90ZWN0aW9uICovCisjZGVmaW5lIEJQUF9YWAkweDAwCQkvKiBObyBhY2Nlc3MgKi8KKyNkZWZpbmUgQlBQX1JYCTB4MDEJCS8qIFJlYWQgb25seSAqLworI2RlZmluZSBCUFBfUlcJMHgwMgkJLyogUmVhZC93cml0ZSAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworc3RydWN0IHBwY19iYXQgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgYmVwaToxNTsJLyogRWZmZWN0aXZlIHBhZ2UgaW5kZXggKHZpcnR1YWwgYWRkcmVzcykgKi8KKwkJdW5zaWduZWQgbG9uZyA6NDsJLyogVW51c2VkICovCisJCXVuc2lnbmVkIGxvbmcgYmw6MTE7CS8qIEJsb2NrIHNpemUgbWFzayAqLworCQl1bnNpZ25lZCBsb25nIHZzOjE7CS8qIFN1cGVydmlzb3IgdmFsaWQgKi8KKwkJdW5zaWduZWQgbG9uZyB2cDoxOwkvKiBVc2VyIHZhbGlkICovCisJfSBiYXR1OyAJCS8qIFVwcGVyIHJlZ2lzdGVyICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBicnBuOjE1OwkvKiBSZWFsIHBhZ2UgaW5kZXggKHBoeXNpY2FsIGFkZHJlc3MpICovCisJCXVuc2lnbmVkIGxvbmcgOjEwOwkvKiBVbnVzZWQgKi8KKwkJdW5zaWduZWQgbG9uZyB3OjE7CS8qIFdyaXRlLXRocnUgY2FjaGUgKi8KKwkJdW5zaWduZWQgbG9uZyBpOjE7CS8qIENhY2hlIGluaGliaXQgKi8KKwkJdW5zaWduZWQgbG9uZyBtOjE7CS8qIE1lbW9yeSBjb2hlcmVuY2UgKi8KKwkJdW5zaWduZWQgbG9uZyBnOjE7CS8qIEd1YXJkZWQgKE1CWiBpbiBJQkFUKSAqLworCQl1bnNpZ25lZCBsb25nIDoxOwkvKiBVbnVzZWQgKi8KKwkJdW5zaWduZWQgbG9uZyBwcDoyOwkvKiBQYWdlIGFjY2VzcyBwcm90ZWN0aW9ucyAqLworCX0gYmF0bDsJCQkvKiBMb3dlciByZWdpc3RlciAqLworfTsKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBIYXNoIHRhYmxlCisgKi8KKworLyogVmFsdWVzIGZvciBQUCAoYXNzdW1lcyBLcz0wLCBLcD0xKSAqLworI2RlZmluZSBQUF9SV1hYCTAJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIG5vbmUgKi8KKyNkZWZpbmUgUFBfUldSWCAxCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciByZWFkICovCisjZGVmaW5lIFBQX1JXUlcgMgkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgcmVhZC93cml0ZSAqLworI2RlZmluZSBQUF9SWFJYIDMJLyogU3VwZXJ2aXNvciByZWFkLCAgICAgICBVc2VyIHJlYWQgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogSGFyZHdhcmUgUGFnZSBUYWJsZSBFbnRyeSAqLworc3RydWN0IGhhc2hfcHRlIHsKKwl1bnNpZ25lZCBsb25nIHY6MTsJLyogRW50cnkgaXMgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIHZzaWQ6MjQ7CS8qIFZpcnR1YWwgc2VnbWVudCBpZGVudGlmaWVyICovCisJdW5zaWduZWQgbG9uZyBoOjE7CS8qIEhhc2ggYWxnb3JpdGhtIGluZGljYXRvciAqLworCXVuc2lnbmVkIGxvbmcgYXBpOjY7CS8qIEFiYnJldmlhdGVkIHBhZ2UgaW5kZXggKi8KKwl1bnNpZ25lZCBsb25nIHJwbjoyMDsJLyogUmVhbCAocGh5c2ljYWwpIHBhZ2UgbnVtYmVyICovCisJdW5zaWduZWQgbG9uZyAgICA6MzsJLyogVW51c2VkICovCisJdW5zaWduZWQgbG9uZyByOjE7CS8qIFJlZmVyZW5jZWQgKi8KKwl1bnNpZ25lZCBsb25nIGM6MTsJLyogQ2hhbmdlZCAqLworCXVuc2lnbmVkIGxvbmcgdzoxOwkvKiBXcml0ZS10aHJ1IGNhY2hlIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGk6MTsJLyogQ2FjaGUgaW5oaWJpdGVkICovCisJdW5zaWduZWQgbG9uZyBtOjE7CS8qIE1lbW9yeSBjb2hlcmVuY2UgKi8KKwl1bnNpZ25lZCBsb25nIGc6MTsJLyogR3VhcmRlZCAqLworCXVuc2lnbmVkIGxvbmcgIDoxOwkvKiBVbnVzZWQgKi8KKwl1bnNpZ25lZCBsb25nIHBwOjI7CS8qIFBhZ2UgcHJvdGVjdGlvbiAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaWQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Cit9IG1tX2NvbnRleHRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX01NVV9IQVNIMzJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmgKaW5kZXggYjhkY2EzMC4uNjk1OTYyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmgKQEAgLTk0LDYgKzk0LDkgQEAKICNkZWZpbmUgSFBURV9SX0MJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwODApCiAjZGVmaW5lIEhQVEVfUl9SCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMTAwKQogCisjZGVmaW5lIEhQVEVfVl8xVEJfU0VHCQlBU01fQ09OU1QoMHg0MDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBIUFRFX1ZfVlJNQV9NQVNLCUFTTV9DT05TVCgweDQwMDFmZmZmZmYwMDAwMDApCisKIC8qIFZhbHVlcyBmb3IgUFAgKGFzc3VtZXMgS3M9MCwgS3A9MSkgKi8KIC8qIHBwMCB3aWxsIGFsd2F5cyBiZSAwIGZvciBsaW51eCAgICAgKi8KICNkZWZpbmUgUFBfUldYWAkwCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciBub25lICovCkBAIC0xMDMsMTIgKzEwNiwxMiBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgaGFzaF9wdGUgewogCXVuc2lnbmVkIGxvbmcgdjsKIAl1bnNpZ25lZCBsb25nIHI7Ci19IGhwdGVfdDsKK307CiAKLWV4dGVybiBocHRlX3QgKmh0YWJfYWRkcmVzczsKK2V4dGVybiBzdHJ1Y3QgaGFzaF9wdGUgKmh0YWJfYWRkcmVzczsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZV9ieXRlczsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGh0YWJfaGFzaF9tYXNrOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaAppbmRleCBmZTUxMGZmLi5kNDRkMjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKQEAgLTUsMTMgKzUsMTggQEAKICNpZmRlZiBDT05GSUdfUFBDNjQKIC8qIDY0LWJpdCBjbGFzc2ljIGhhc2ggdGFibGUgTU1VICovCiAjICBpbmNsdWRlIDxhc20vbW11LWhhc2g2NC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX1NURF9NTVUpCisvKiAzMi1iaXQgY2xhc3NpYyBoYXNoIHRhYmxlIE1NVSAqLworIyAgaW5jbHVkZSA8YXNtL21tdS1oYXNoMzIuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHXzQ0eCkKIC8qIDQ0eC1zdHlsZSBzb2Z0d2FyZSBsb2FkZWQgVExCICovCiAjICBpbmNsdWRlIDxhc20vbW11LTQ0eC5oPgotI2Vsc2UKLS8qIE90aGVyIDMyLWJpdC4gIEZJWE1FOiBzcGxpdCB1cCB0aGUgb3RoZXIgMzItYml0IE1NVSB0eXBlcywgYW5kCi0gKiByZXZpc2UgZm9yIGFyY2gvcG93ZXJwYyAqLwotIyAgaW5jbHVkZSA8YXNtLXBwYy9tbXUuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZTTF9CT09LRSkKKy8qIEZyZWVzY2FsZSBCb29rLUUgc29mdHdhcmUgbG9hZGVkIFRMQiAqLworIyAgaW5jbHVkZSA8YXNtL21tdS1mc2wtYm9va2UuaD4KKyNlbGlmIGRlZmluZWQgKENPTkZJR19QUENfOHh4KQorLyogTW90b3JvbGEvRnJlZXNjYWxlIDh4eCBzb2Z0d2FyZSBsb2FkZWQgVExCICovCisjICBpbmNsdWRlIDxhc20vbW11LTh4eC5oPgogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKaW5kZXggNDBjOWU1YS4uZjg2M2FjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaApAQCAtMiwxNiArMiwyMTAgQEAKICNkZWZpbmUgX19BU01fUE9XRVJQQ19NTVVfQ09OVEVYVF9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8YXNtL21tdS5oPgkKKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbV9ob29rcy5oPgorCiAjaWZuZGVmIENPTkZJR19QUEM2NAotI2luY2x1ZGUgPGFzbS1wcGMvbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCisvKgorICogT24gMzItYml0IFBvd2VyUEMgNnh4Lzd4eC83eHh4IENQVXMsIHdlIHVzZSBhIHNldCBvZiAxNiBWU0lEcworICogKHZpcnR1YWwgc2VnbWVudCBpZGVudGlmaWVycykgZm9yIGVhY2ggY29udGV4dC4gIEFsdGhvdWdoIHRoZQorICogaGFyZHdhcmUgc3VwcG9ydHMgMjQtYml0IFZTSURzLCBhbmQgdGh1cyA+MSBtaWxsaW9uIGNvbnRleHRzLAorICogd2Ugb25seSB1c2UgMzIsNzY4IG9mIHRoZW0uICBUaGF0IGlzIGFtcGxlLCBzaW5jZSB0aGVyZSBjYW4gYmUKKyAqIGF0IG1vc3QgYXJvdW5kIDMwLDAwMCB0YXNrcyBpbiB0aGUgc3lzdGVtIGFueXdheSwgYW5kIGl0IG1lYW5zCisgKiB0aGF0IHdlIGNhbiB1c2UgYSBiaXRtYXAgdG8gaW5kaWNhdGUgd2hpY2ggY29udGV4dHMgYXJlIGluIHVzZS4KKyAqIFVzaW5nIGEgYml0bWFwIG1lYW5zIHRoYXQgd2UgZW50aXJlbHkgYXZvaWQgYWxsIG9mIHRoZSBwcm9ibGVtcworICogdGhhdCB3ZSB1c2VkIHRvIGhhdmUgd2hlbiB0aGUgY29udGV4dCBudW1iZXIgb3ZlcmZsb3dlZCwKKyAqIHBhcnRpY3VsYXJseSBvbiBTTVAgc3lzdGVtcy4KKyAqICAtLSBwYXVsdXMuCisgKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGNvbnRleHRzIHRvIFZTSURzICh2aXJ0dWFsCisgKiBzZWdtZW50IElEcykuICBXZSB1c2UgYSBza2V3IG9uIGJvdGggdGhlIGNvbnRleHQgYW5kIHRoZSBoaWdoIDQgYml0cworICogb2YgdGhlIDMyLWJpdCB2aXJ0dWFsIGFkZHJlc3MgKHRoZSAiZWZmZWN0aXZlIHNlZ21lbnQgSUQiKSBpbiBvcmRlcgorICogdG8gc3ByZWFkIG91dCB0aGUgZW50cmllcyBpbiB0aGUgTU1VIGhhc2ggdGFibGUuICBOb3RlLCBpZiB0aGlzCisgKiBmdW5jdGlvbiBpcyBjaGFuZ2VkIHRoZW4gYXJjaC9wcGMvbW0vaGFzaHRhYmxlLlMgd2lsbCBoYXZlIHRvIGJlCisgKiBjaGFuZ2VkIHRvIGNvcnJlc3BvbmQuCisgKi8KKyNkZWZpbmUgQ1RYX1RPX1ZTSUQoY3R4LCB2YSkJKCgoY3R4KSAqICg4OTcgKiAxNikgKyAoKHZhKSA+PiAyOCkgKiAweDExMSkgXAorCQkJCSAmIDB4ZmZmZmZmKQorCisvKgorICAgVGhlIE1QQzh4eCBoYXMgb25seSAxNiBjb250ZXh0cy4gIFdlIHJvdGF0ZSB0aHJvdWdoIHRoZW0gb24gZWFjaAorICAgdGFzayBzd2l0Y2guICBBIGJldHRlciB3YXkgd291bGQgYmUgdG8ga2VlcCB0cmFjayBvZiB0YXNrcyB0aGF0CisgICBvd24gY29udGV4dHMsIGFuZCBpbXBsZW1lbnQgYW4gTFJVIHVzYWdlLiAgVGhhdCB3YXkgdmVyeSBhY3RpdmUKKyAgIHRhc2tzIGRvbid0IGFsd2F5cyBoYXZlIHRvIHBheSB0aGUgVExCIHJlbG9hZCBvdmVyaGVhZC4gIFRoZQorICAga2VybmVsIHBhZ2VzIGFyZSBtYXBwZWQgc2hhcmVkLCBzbyB0aGUga2VybmVsIGNhbiBydW4gb24gYmVoYWxmCisgICBvZiBhbnkgdGFzayB0aGF0IG1ha2VzIGEga2VybmVsIGVudHJ5LiAgU2hhcmVkIGRvZXMgbm90IG1lYW4gdGhleQorICAgYXJlIG5vdCBwcm90ZWN0ZWQsIGp1c3QgdGhhdCB0aGUgQVNJRCBjb21wYXJpc29uIGlzIG5vdCBwZXJmb3JtZWQuCisgICAgICAgIC0tIERhbgorCisgICBUaGUgSUJNNHh4IGhhcyAyNTYgY29udGV4dHMsIHNvIHdlIGNhbiBqdXN0IHJvdGF0ZSB0aHJvdWdoIHRoZXNlCisgICBhcyBhIHdheSBvZiAic3dpdGNoaW5nIiBjb250ZXh0cy4gIElmIHRoZSBUSUQgb2YgdGhlIFRMQiBpcyB6ZXJvLAorICAgdGhlIFBJRC9USUQgY29tcGFyaXNvbiBpcyBkaXNhYmxlZCwgc28gd2UgY2FuIHVzZSBhIFRJRCBvZiB6ZXJvCisgICB0byByZXByZXNlbnQgYWxsIGtlcm5lbCBwYWdlcyBhcyBzaGFyZWQgYW1vbmcgYWxsIGNvbnRleHRzLgorICAgCS0tIERhbgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5X3RsYihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7Cit9CisKKyNpZmRlZiBDT05GSUdfOHh4CisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJMTYKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkxNQorI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkwCisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzR4eCkKKyNkZWZpbmUgTk9fQ09OVEVYVCAgICAgIAkyNTYKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkyNTUKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19FMjAwKSB8fCBkZWZpbmVkKENPTkZJR19FNTAwKQorI2RlZmluZSBOT19DT05URVhUICAgICAgCTI1NgorI2RlZmluZSBMQVNUX0NPTlRFWFQgICAgCTI1NQorI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCisKKyNlbHNlCisKKy8qIFBQQyA2eHgsIDd4eCBDUFVzICovCisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJKCh1bnNpZ25lZCBsb25nKSAtMSkKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkzMjc2NworI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCisjZW5kaWYKKworLyoKKyAqIFNldCB0aGUgY3VycmVudCBNTVUgY29udGV4dC4KKyAqIE9uIDMyLWJpdCBQb3dlclBDcyAob3RoZXIgdGhhbiB0aGUgOHh4IGVtYmVkZGVkIGNoaXBzKSwgdGhpcyBpcyBkb25lIGJ5CisgKiBsb2FkaW5nIHVwIHRoZSBzZWdtZW50IHJlZ2lzdGVycyBmb3IgdGhlIHVzZXIgcGFydCBvZiB0aGUgYWRkcmVzcyBzcGFjZS4KKyAqCisgKiBTaW5jZSB0aGUgUEdEIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwgaXQgaXMgbXVjaCBmYXN0ZXIgdG8gc2ltcGx5CisgKiBwYXNzIHRoaXMgYWxvbmcgYXMgYSBzZWNvbmQgcGFyYW1ldGVyLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgOHh4IGFuZAorICogY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBvbiBhbGwgcHJvY2Vzc29ycyAoaWYgeW91IGhhcHBlbiB0byBoYXZlCisgKiBhbiBBYmF0cm9uKS4KKyAqLworZXh0ZXJuIHZvaWQgc2V0X2NvbnRleHQodW5zaWduZWQgbG9uZyBjb250ZXh0aWQsIHBnZF90ICpwZ2QpOworCisvKgorICogQml0bWFwIG9mIGNvbnRleHRzIGluIHVzZS4KKyAqIFRoZSBzaXplIG9mIHRoaXMgYml0bWFwIGlzIExBU1RfQ09OVEVYVCArIDEgYml0cy4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29udGV4dF9tYXBbXTsKKworLyoKKyAqIFRoaXMgY2FjaGVzIHRoZSBuZXh0IGNvbnRleHQgbnVtYmVyIHRoYXQgd2UgZXhwZWN0IHRvIGJlIGZyZWUuCisgKiBJdHMgdXNlIGlzIGFuIG9wdGltaXphdGlvbiBvbmx5LCB3ZSBjYW4ndCByZWx5IG9uIHRoaXMgY29udGV4dAorICogbnVtYmVyIHRvIGJlIGZyZWUsIGJ1dCBpdCB1c3VhbGx5IHdpbGwgYmUuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIG5leHRfbW11X2NvbnRleHQ7CisKKy8qCisgKiBJZiB3ZSBkb24ndCBoYXZlIHN1ZmZpY2llbnQgY29udGV4dHMgdG8gZ2l2ZSBvbmUgdG8gZXZlcnkgdGFzaworICogdGhhdCBjb3VsZCBiZSBpbiB0aGUgc3lzdGVtLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc3RlYWwgY29udGV4dHMuCisgKiBUaGVzZSB2YXJpYWJsZXMgc3VwcG9ydCB0aGF0LgorICovCisjaWYgTEFTVF9DT05URVhUIDwgMzAwMDAKKyNkZWZpbmUgRkVXX0NPTlRFWFRTCTEKK2V4dGVybiBhdG9taWNfdCBucl9mcmVlX2NvbnRleHRzOworZXh0ZXJuIHN0cnVjdCBtbV9zdHJ1Y3QgKmNvbnRleHRfbW1bTEFTVF9DT05URVhUKzFdOworZXh0ZXJuIHZvaWQgc3RlYWxfY29udGV4dCh2b2lkKTsKKyNlbmRpZgorCisvKgorICogR2V0IGEgbmV3IG1tdSBjb250ZXh0IGZvciB0aGUgYWRkcmVzcyBzcGFjZSBkZXNjcmliZWQgYnkgYG1tJy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGdldF9tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIGN0eDsKKworCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKQorCQlyZXR1cm47CisjaWZkZWYgRkVXX0NPTlRFWFRTCisJd2hpbGUgKGF0b21pY19kZWNfaWZfcG9zaXRpdmUoJm5yX2ZyZWVfY29udGV4dHMpIDwgMCkKKwkJc3RlYWxfY29udGV4dCgpOworI2VuZGlmCisJY3R4ID0gbmV4dF9tbXVfY29udGV4dDsKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChjdHgsIGNvbnRleHRfbWFwKSkgeworCQljdHggPSBmaW5kX25leHRfemVyb19iaXQoY29udGV4dF9tYXAsIExBU1RfQ09OVEVYVCsxLCBjdHgpOworCQlpZiAoY3R4ID4gTEFTVF9DT05URVhUKQorCQkJY3R4ID0gMDsKKwl9CisJbmV4dF9tbXVfY29udGV4dCA9IChjdHggKyAxKSAmIExBU1RfQ09OVEVYVDsKKwltbS0+Y29udGV4dC5pZCA9IGN0eDsKKyNpZmRlZiBGRVdfQ09OVEVYVFMKKwljb250ZXh0X21tW2N0eF0gPSBtbTsKKyNlbmRpZgorfQorCisvKgorICogU2V0IHVwIHRoZSBjb250ZXh0IGZvciBhIG5ldyBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworCW1tLT5jb250ZXh0LnZkc29fYmFzZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSdyZSBmaW5pc2hlZCB1c2luZyB0aGUgY29udGV4dCBmb3IgYW4gYWRkcmVzcyBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlpZiAobW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkgeworCQljbGVhcl9iaXQobW0tPmNvbnRleHQuaWQsIGNvbnRleHRfbWFwKTsKKwkJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworI2lmZGVmIEZFV19DT05URVhUUworCQlhdG9taWNfaW5jKCZucl9mcmVlX2NvbnRleHRzKTsKKyNlbmRpZgorCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCisJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworI2lmZGVmIENPTkZJR19BTFRJVkVDCisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKQorCWFzbSB2b2xhdGlsZSAoImRzc2FsbDtcbiIKKyNpZm5kZWYgQ09ORklHX1BPV0VSNAorCSAic3luYztcbiIgLyogRzQgbmVlZHMgYSBzeW5jIGhlcmUsIEc1IGFwcGFyZW50bHkgbm90ICovCisjZW5kaWYKKwkgOiA6ICk7CisjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KKworCXRzay0+dGhyZWFkLnBnZGlyID0gbmV4dC0+cGdkOworCisJLyogTm8gbmVlZCB0byBmbHVzaCB1c2Vyc3BhY2Ugc2VnbWVudHMgaWYgdGhlIG1tIGRvZXNudCBjaGFuZ2UgKi8KKwlpZiAocHJldiA9PSBuZXh0KQorCQlyZXR1cm47CisKKwkvKiBTZXR1cCBuZXcgdXNlcnNwYWNlIGNvbnRleHQgKi8KKwlnZXRfbW11X2NvbnRleHQobmV4dCk7CisJc2V0X2NvbnRleHQobmV4dC0+Y29udGV4dC5pZCwgbmV4dC0+cGdkKTsKK30KKworI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzayxtbSkJZG8geyB9IHdoaWxlICgwKQorCisvKgorICogQWZ0ZXIgd2UgaGF2ZSBzZXQgY3VycmVudC0+bW0gdG8gYSBuZXcgdmFsdWUsIHRoaXMgYWN0aXZhdGVzCisgKiB0aGUgY29udGV4dCBmb3IgdGhlIG5ldyBtbSBzbyB3ZSBzZWUgdGhlIG5ldyBtYXBwaW5ncy4KKyAqLworI2RlZmluZSBhY3RpdmF0ZV9tbShhY3RpdmVfbW0sIG1tKSAgIHN3aXRjaF9tbShhY3RpdmVfbW0sIG1tLCBjdXJyZW50KQorCitleHRlcm4gdm9pZCBtbXVfY29udGV4dF9pbml0KHZvaWQpOworCisKICNlbHNlCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JCiAjaW5jbHVkZSA8bGludXgvbW0uaD4JCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vbW11Lmg+CQotI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tX2hvb2tzLmg+CiAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUFBDIDY0IFRlYW0sIElCTSBDb3JwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oCmluZGV4IGI4NWRmNDUuLjE1ZjY1MGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oCkBAIC0xOSwxMiArMTksNiBAQAogCiAjaWZkZWYgQ09ORklHX1BQQ184Nnh4CiAKLSNkZWZpbmUgX0lPX0JBU0UgICAgICAgIGlzYV9pb19iYXNlCi0jZGVmaW5lIF9JU0FfTUVNX0JBU0UgICBpc2FfbWVtX2Jhc2UKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCBwY2lfZHJhbV9vZmZzZXQKLSNlbmRpZgotCiAjZGVmaW5lIENQVTBfQk9PVF9SRUxFQVNFIDB4MDEwMDAwMDAKICNkZWZpbmUgQ1BVMV9CT09UX1JFTEVBU0UgMHgwMjAwMDAwMAogI2RlZmluZSBDUFVfQUxMX1JFTEVBU0VEIChDUFUwX0JPT1RfUkVMRUFTRSB8IENQVTFfQk9PVF9SRUxFQVNFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjOHh4LmgKaW5kZXggNTgwMzcxMS4uMmJlMDE0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4eHguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzh4eC5oCkBAIC0yMyw2ICsyMywxMCBAQAogI2luY2x1ZGUgPHBsYXRmb3Jtcy84eHgvbXBjODg1YWRzLmg+CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorZXh0ZXJuIHN0cnVjdCBtcGM4eHhfcGNtY2lhX29wcyBtOHh4X3BjbWNpYV9vcHM7CisjZW5kaWYKKwogI2VuZGlmIC8qIENPTkZJR184eHggKi8KICNlbmRpZiAvKiBfX0NPTkZJR184eHhfREVGUyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKaW5kZXggZDliZjVhYi4uZTcyYzJhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKQEAgLTIsMTIgKzIsOTEgQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BDSV9CUklER0VfSAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2lmbmRlZiBDT05GSUdfUFBDNjQKLSNpbmNsdWRlIDxhc20tcHBjL3BjaS1icmlkZ2UuaD4KLSNlbHNlCi0KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpZm5kZWYgQ09ORklHX1BQQzY0CisKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBwY2lfY29udHJvbGxlcjsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIFBDSSBjb250cm9sbGVyIChob3N0IGJyaWRnZSkKKyAqLworc3RydWN0IHBjaV9jb250cm9sbGVyIHsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCWNoYXIgaXNfZHluYW1pYzsKKwl2b2lkICphcmNoX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X25vZGU7CisJc3RydWN0IGRldmljZSAqcGFyZW50OworCisJaW50IGZpcnN0X2J1c25vOworCWludCBsYXN0X2J1c25vOworCWludCBzZWxmX2J1c25vOworCisJdm9pZCBfX2lvbWVtICppb19iYXNlX3ZpcnQ7CisJcmVzb3VyY2Vfc2l6ZV90IGlvX2Jhc2VfcGh5czsKKworCS8qIFNvbWUgbWFjaGluZXMgKFBSZVApIGhhdmUgYSBub24gMToxIG1hcHBpbmcgb2YKKwkgKiB0aGUgUENJIG1lbW9yeSBzcGFjZSBpbiB0aGUgQ1BVIGJ1cyBzcGFjZQorCSAqLworCXJlc291cmNlX3NpemVfdCBwY2lfbWVtX29mZnNldDsKKworCXN0cnVjdCBwY2lfb3BzICpvcHM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IF9faW9tZW0gKmNmZ19hZGRyOworCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CisKKwkvKgorCSAqIFVzZWQgZm9yIHZhcmlhbnRzIG9mIFBDSSBpbmRpcmVjdCBoYW5kbGluZyBhbmQgcG9zc2libGUgcXVpcmtzOgorCSAqICBTRVRfQ0ZHX1RZUEUgLSB1c2VkIG9uIDR4eCBvciBhbnkgUEhCIHRoYXQgZG9lcyBleHBsaWNpdCB0eXBlMC8xCisJICogIEVYVF9SRUcgLSBwcm92aWRlcyBhY2Nlc3MgdG8gUENJLWUgZXh0ZW5kZWQgcmVnaXN0ZXJzCisJICogIFNVUlBSRVNTX1BSSU1BUllfQlVTIC0gd2Ugc3VycHJlc3MgdGhlIHNldHRpbmcgb2YgUENJX1BSSU1BUllfQlVTCisJICogICBvbiBGcmVlc2NhbGUgUENJLWUgY29udHJvbGxlcnMgc2luY2UgdGhleSB1c2VkIHRoZSBQQ0lfUFJJTUFSWV9CVVMKKwkgKiAgIHRvIGRldGVybWluZSB3aGljaCBidXMgbnVtYmVyIHRvIG1hdGNoIG9uIHdoZW4gZ2VuZXJhdGluZyB0eXBlMAorCSAqICAgY29uZmlnIGN5Y2xlcworCSAqLworI2RlZmluZSBQUENfSU5ESVJFQ1RfVFlQRV9TRVRfQ0ZHX1RZUEUJCSgweDAwMDAwMDAxKQorI2RlZmluZSBQUENfSU5ESVJFQ1RfVFlQRV9FWFRfUkVHCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVMJKDB4MDAwMDAwMDQpCisJdTMyIGluZGlyZWN0X3R5cGU7CisKKwkvKiBDdXJyZW50bHksIHdlIGxpbWl0IG91cnNlbHZlcyB0byAxIElPIHJhbmdlIGFuZCAzIG1lbQorCSAqIHJhbmdlcyBzaW5jZSB0aGUgY29tbW9uIHBjaV9idXMgc3RydWN0dXJlIGNhbid0IGhhbmRsZSBtb3JlCisJICovCisJc3RydWN0IHJlc291cmNlCWlvX3Jlc291cmNlOworCXN0cnVjdCByZXNvdXJjZSBtZW1fcmVzb3VyY2VzWzNdOworCWludCBnbG9iYWxfbnVtYmVyOwkJLyogUENJIGRvbWFpbiBudW1iZXIgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9jb250cm9sbGVyICpwY2lfYnVzX3RvX2hvc3Qoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gYnVzLT5zeXNkYXRhOworfQorCisvKiBUaGVzZSBhcmUgdXNlZCBmb3IgY29uZmlnIGFjY2VzcyBiZWZvcmUgYWxsIHRoZSBQQ0kgcHJvYmluZworICAgaGFzIGJlZW4gZG9uZS4gKi8KK2ludCBlYXJseV9yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgIGludCB3aGVyZSwgdTggKnZhbCk7CitpbnQgZWFybHlfcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICBpbnQgd2hlcmUsIHUxNiAqdmFsKTsKK2ludCBlYXJseV9yZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICAgaW50IHdoZXJlLCB1MzIgKnZhbCk7CitpbnQgZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgIGludCB3aGVyZSwgdTggdmFsKTsKK2ludCBlYXJseV93cml0ZV9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICAgaW50IHdoZXJlLCB1MTYgdmFsKTsKK2ludCBlYXJseV93cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgICBpbnQgd2hlcmUsIHUzMiB2YWwpOworCitleHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLAorCQkJICAgICAgIHZvaWQgX19pb21lbSAqY2ZnX2FkZHIsIHZvaWQgX19pb21lbSAqY2ZnX2RhdGEpOworZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwKKwkJCSAgICAgICB1MzIgY2ZnX2FkZHIsIHUzMiBjZmdfZGF0YSk7CitleHRlcm4gdm9pZCBzZXR1cF9ncmFja2xlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisKKyNlbHNlCisKIAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTMxLDYgKzExMCw3IEBACiAJaW50IGxhc3RfYnVzbm87CiAKIAl2b2lkIF9faW9tZW0gKmlvX2Jhc2VfdmlydDsKKwl2b2lkICppb19iYXNlX2FsbG9jOwogCXJlc291cmNlX3NpemVfdCBpb19iYXNlX3BoeXM7CiAKIAkvKiBTb21lIG1hY2hpbmVzIGhhdmUgYSBub24gMToxIG1hcHBpbmcgb2YKQEAgLTQ4LDggKzEyOCw3IEBACiAJICovCiAJc3RydWN0IHJlc291cmNlIGlvX3Jlc291cmNlOwogCXN0cnVjdCByZXNvdXJjZSBtZW1fcmVzb3VyY2VzWzNdOwotCWludCBnbG9iYWxfbnVtYmVyOwkJCi0JaW50IGxvY2FsX251bWJlcjsJCQorCWludCBnbG9iYWxfbnVtYmVyOwogCXVuc2lnbmVkIGxvbmcgYnVpZDsKIAl1bnNpZ25lZCBsb25nIGRtYV93aW5kb3dfYmFzZV9jdXI7CiAJdW5zaWduZWQgbG9uZyBkbWFfd2luZG93X3NpemU7CkBAIC03MCwxOSArMTQ5LDIyIEBACiAJaW50CWRldmZuOwkJCS8qIHBjaSBkZXZpY2UgYW5kIGZ1bmN0aW9uIG51bWJlciAqLwogCWludAljbGFzc19jb2RlOwkJLyogcGNpIGRldmljZSBjbGFzcyAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCisJc3RydWN0ICBwY2lfY29udHJvbGxlciAqcGhiOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KKwlzdHJ1Y3QJaW9tbXVfdGFibGUgKmlvbW11X3RhYmxlOwkvKiBmb3IgcGhiJ3Mgb3IgYnJpZGdlcyAqLworCXN0cnVjdAlwY2lfZGV2ICpwY2lkZXY7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgcGNpIGRldmljZSAqLworCXN0cnVjdAlkZXZpY2Vfbm9kZSAqbm9kZTsJLyogYmFjay1wb2ludGVyIHRvIHRoZSBkZXZpY2Vfbm9kZSAqLworCisJaW50CXBjaV9leHRfY29uZmlnX3NwYWNlOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KKworI2lmZGVmIENPTkZJR19FRUgKIAlpbnQJZWVoX21vZGU7CQkvKiBTZWUgZWVoLmggZm9yIHBvc3NpYmxlIEVFSF9NT0RFcyAqLwogCWludAllZWhfY29uZmlnX2FkZHI7CiAJaW50CWVlaF9wZV9jb25maWdfYWRkcjsgLyogbmV3LXN0eWxlIHBhcnRpdGlvbiBlbmRwb2ludCBhZGRyZXNzICovCiAJaW50IAllZWhfY2hlY2tfY291bnQ7CS8qICMgdGltZXMgZHJpdmVyIGlnbm9yZWQgZXJyb3IgKi8KIAlpbnQgCWVlaF9mcmVlemVfY291bnQ7CS8qICMgdGltZXMgdGhpcyBkZXZpY2UgZnJvemUgdXAuICovCi0jZW5kaWYKLQlpbnQJcGNpX2V4dF9jb25maWdfc3BhY2U7CS8qIGZvciBwY2kgZGV2aWNlcyAqLwotCXN0cnVjdCAgcGNpX2NvbnRyb2xsZXIgKnBoYjsJLyogZm9yIHBjaSBkZXZpY2VzICovCi0Jc3RydWN0CWlvbW11X3RhYmxlICppb21tdV90YWJsZTsJLyogZm9yIHBoYidzIG9yIGJyaWRnZXMgKi8KLQlzdHJ1Y3QJcGNpX2RldiAqcGNpZGV2OwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIHBjaSBkZXZpY2UgKi8KLQlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5vZGU7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgZGV2aWNlX25vZGUgKi8KKwlpbnQgCWVlaF9mYWxzZV9wb3NpdGl2ZXM7CS8qICMgdGltZXMgdGhpcyBkZXZpY2UgcmVwb3J0ZWQgI2ZmJ3MgKi8KIAl1MzIJY29uZmlnX3NwYWNlWzE2XTsJLyogc2F2ZWQgUENJIGNvbmZpZyBzcGFjZSAqLworI2VuZGlmCiB9OwogCiAvKiBHZXQgdGhlIHBvaW50ZXIgdG8gYSBkZXZpY2Vfbm9kZSdzIHBjaV9kbiAqLwpAQCAtMTI4LDkgKzIxMCw2IEBACiAvKiogRmluZCB0aGUgYnVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGljYXRlZCBkZXZpY2Ugbm9kZSAqLwogc3RydWN0IHBjaV9idXMgKiBwY2liaW9zX2ZpbmRfcGNpX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIAotZXh0ZXJuIHZvaWQgcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IHByaW1hcnkpOwotCiAvKiogUmVtb3ZlIGFsbCBvZiB0aGUgUENJIGRldmljZXMgdW5kZXIgdGhpcyBidXMgKi8KIHZvaWQgcGNpYmlvc19yZW1vdmVfcGNpX2RldmljZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKQEAgLTE0OCwyMSArMjI3LDEyIEBACiAJcmV0dXJuIFBDSV9ETihidXNkbiktPnBoYjsKIH0KIAotZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlcioKLXBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpOwotCi1leHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyICoKLXBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiBleHRlcm4gdm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CiAKLSNpZmRlZiBDT05GSUdfUENJCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKQotewotCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLX0KLSNlbmRpZgorZXh0ZXJuIHZvaWQgaXNhX2JyaWRnZV9maW5kX2Vhcmx5KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisKK2V4dGVybiBpbnQgcGNpYmlvc191bm1hcF9pb19zcGFjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK2V4dGVybiBpbnQgcGNpYmlvc19tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIHBwY19tZC5wY2lfcHJvYmVfbW9kZSBmdW5jdGlvbiAqLwogI2RlZmluZSBQQ0lfUFJPQkVfTk9ORQkJLTEJLyogRG9uJ3QgbG9vayBhdCB0aGlzIGJ1cyBhdCBhbGwgKi8KQEAgLTE3Niw1ICsyNDYsMjkgQEAKICNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKKy8qIEdldCB0aGUgUENJIGhvc3QgY29udHJvbGxlciBmb3IgYW4gT0YgZGV2aWNlICovCitleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyKgorcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSk7CisKKy8qIEZpbGwgdXAgaG9zdCBjb250cm9sbGVyIHJlc291cmNlcyBmcm9tIHRoZSBPRiBub2RlICovCitleHRlcm4gdm9pZAorcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IHByaW1hcnkpOworCisvKiBBbGxvY2F0ZSBhIG5ldyBQQ0kgaG9zdCBicmlkZ2Ugc3RydWN0dXJlICovCitleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyICoKK3BjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CisjaWZkZWYgQ09ORklHX1BDSQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Cit9CisjZW5kaWYKKworCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCmluZGV4IGUxNmU3YmMuLjdiMTE3NjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaApAQCAtOTUsOCArOTUsNiBAQAogI2RlZmluZSBnZXRfcGNpX2RtYV9vcHMoKQlOVUxMCiAjZW5kaWYKIAotZXh0ZXJuIGludCBwY2lfZG9tYWluX25yKHN0cnVjdCBwY2lfYnVzICpidXMpOwotCiAvKiBEZWNpZGUgd2hldGhlciB0byBkaXNwbGF5IHRoZSBkb21haW4gbnVtYmVyIGluIC9wcm9jICovCiBleHRlcm4gaW50IHBjaV9wcm9jX2RvbWFpbihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIApAQCAtMTEyLDkgKzExMCw2IEBACiB9CiAjZW5kaWYKIAotLyogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgUENJIGNvbnRyb2xsZXIgZm9yIGRldmljZSBQREVWLiAqLwotI2RlZmluZSBwY2lfZG9tYWluX25yKGJ1cykgKChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKikoYnVzKS0+c3lzZGF0YSktPmluZGV4Ci0KIC8qIFNldCB0aGUgbmFtZSBvZiB0aGUgYnVzIGFzIGl0IGFwcGVhcnMgaW4gL3Byb2MvYnVzL3BjaSAqLwogc3RhdGljIGlubGluZSBpbnQgcGNpX3Byb2NfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CkBAIC0xMjMsNiArMTE4LDggQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCitleHRlcm4gaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cyk7CisKIHN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKIC8qIE1hcCBhIHJhbmdlIG9mIFBDSSBtZW1vcnkgb3IgSS9PIHNwYWNlIGZvciBhIGRldmljZSBpbnRvIHVzZXIgc3BhY2UgKi8KIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKQEAgLTIwMiwxMCArMTk5LDYgQEAKIAlyZXR1cm4gcm9vdDsKIH0KIAotZXh0ZXJuIGludCB1bm1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci0KLWV4dGVybiBpbnQgcmVtYXBfYnVzX3JhbmdlKHN0cnVjdCBwY2lfYnVzICpidXMpOwotCiBleHRlcm4gdm9pZCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCXN0cnVjdCBwY2lfYnVzICpidXMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGMzMi5oCmluZGV4IDdmYjczMGMuLjg2YTU0YTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaApAQCAtNiwxMSArNiw3IEBACiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIEZvciBUQVNLX1NJWkUgKi8KLSNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4JCQkvKiBGb3Igc3ViLWFyY2ggc3BlY2lmaWMgUFBDX1BJTl9TSVpFICovCi1zdHJ1Y3QgbW1fc3RydWN0OwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB2YV90b19waHlzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiBleHRlcm4gcHRlX3QgKnZhX3RvX3B0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwpAQCAtNDg4LDE0ICs0ODQsNiBAQAogI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkJX19wdGUoKChwdGVfYmFzaWNfdCkocGZuKSA8PCBQRk5fU0hJRlRfT0ZGU0VUKSB8XAogCQkJCQlwZ3Byb3RfdmFsKHByb3QpKQogI2RlZmluZSBta19wdGUocGFnZSwgcHJvdCkJcGZuX3B0ZShwYWdlX3RvX3BmbihwYWdlKSwgcHJvdCkKLQotLyoKLSAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCi0gKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVsxMDI0XTsKLSNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCi0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2RlZmluZSBwdGVfbm9uZShwdGUpCQkoKHB0ZV92YWwocHRlKSAmIH5fUFRFX05PTkVfTUFTSykgPT0gMCkKQEAgLTUxMiw5ICs1MDAsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUlc7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUM7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CkBAIC01MjIsMjEgKzUwOCwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV91bmNhY2hlKHB0ZV90IHB0ZSkgICAgICAgeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTk9fQ0FDSEU7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfY2FjaGUocHRlX3QgcHRlKSAgICAgICAgIHsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9OT19DQUNIRTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUlcgfCBfUEFHRV9IV1dSSVRFKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9ESVJUWSB8IF9QQUdFX0hXV1JJVEUpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSIHwgX1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKSB7CkBAIC02NDMsMTMgKzYyMSw2IEBACiAjZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoX192bWEsIF9fYWRkciwgX19wdGVwKSBcCiAJX19wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKChfX3ZtYSktPnZtX21tLT5jb250ZXh0LmlkLCBfX2FkZHIsIF9fcHRlcCkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi1zdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlyZXR1cm4gKHB0ZV91cGRhdGUocHRlcCwgKF9QQUdFX0RJUlRZIHwgX1BBR0VfSFdXUklURSksIDApICYgX1BBR0VfRElSVFkpICE9IDA7Ci19Ci0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICAgICBwdGVfdCAqcHRlcCkKQEAgLTczNCwxMCArNzA1LDYgQEAKICNkZWZpbmUgcHRlX3VubWFwKHB0ZSkJCWt1bm1hcF9hdG9taWMocHRlLCBLTV9QVEUwKQogI2RlZmluZSBwdGVfdW5tYXBfbmVzdGVkKHB0ZSkJa3VubWFwX2F0b21pYyhwdGUsIEtNX1BURTEpCiAKLWV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOwotCi1leHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKLQogLyoKICAqIEVuY29kZSBhbmQgZGVjb2RlIGEgc3dhcCBlbnRyeS4KICAqIE5vdGUgdGhhdCB0aGUgYml0cyB3ZSB1c2UgaW4gYSBQVEUgZm9yIHJlcHJlc2VudGluZyBhIHN3YXAgZW50cnkKQEAgLTc1NSw0MCArNzIyLDYgQEAKICNkZWZpbmUgcHRlX3RvX3Bnb2ZmKHB0ZSkJKHB0ZV92YWwocHRlKSA+PiAzKQogI2RlZmluZSBwZ29mZl90b19wdGUob2ZmKQkoKHB0ZV90KSB7ICgob2ZmKSA8PCAzKSB8IF9QQUdFX0ZJTEUgfSkKIAotLyogQ09ORklHX0FQVVMgKi8KLS8qIEZvciB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyBjb252ZXJzaW9uICovCi1leHRlcm4gdm9pZCBjYWNoZV9jbGVhcihfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKLWV4dGVybiB2b2lkIGNhY2hlX3B1c2goX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1leHRlcm4gaW50IG1tX2VuZF9vZl9jaHVuayAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlvcGEodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1tX3B0b3YodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwotCi0vKiBWYWx1ZXMgZm9yIG5vY2FjaGVmbGFnIGFuZCBjbW9kZSAqLwotLyogVGhlc2UgYXJlIG5vdCB1c2VkIGJ5IHRoZSBBUFVTIGtlcm5lbF9tYXAsIGJ1dCBwcmV2ZW50cwotICAgY29tcGlsYXRpb24gZXJyb3JzLiAqLwotI2RlZmluZQlLRVJORUxNQVBfRlVMTF9DQUNISU5HCQkwCi0jZGVmaW5lCUtFUk5FTE1BUF9OT0NBQ0hFX1NFUgkJMQotI2RlZmluZQlLRVJORUxNQVBfTk9DQUNIRV9OT05TRVIJMgotI2RlZmluZQlLRVJORUxNQVBfTk9fQ09QWUJBQ0sJCTMKLQotLyoKLSAqIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGtlcm5lbF9tYXAodW5zaWduZWQgbG9uZyBwYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCWludCBub2NhY2hlZmxhZywgdW5zaWduZWQgbG9uZyAqbWVtYXZhaWxwICk7Ci0KLS8qCi0gKiBTZXQgY2FjaGUgbW9kZSBvZiAoa2VybmVsIHNwYWNlKSBhZGRyZXNzIHJhbmdlLgotICovCi1leHRlcm4gdm9pZCBrZXJuZWxfc2V0X2NhY2hlbW9kZSAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21vZGUpOwotCi0vKiBOZWVkcyB0byBiZSBkZWZpbmVkIGhlcmUgYW5kIG5vdCBpbiBsaW51eC9tbS5oLCBhcyBpdCBpcyBhcmNoIGRlcGVuZGVudCAqLwotI2RlZmluZSBrZXJuX2FkZHJfdmFsaWQoYWRkcikJKDEpCi0KLSNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkJCVwKLQkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKLQogLyoKICAqIE5vIHBhZ2UgdGFibGUgY2FjaGVzIHRvIGluaXRpYWxpc2UKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjNjQuaAppbmRleCAzY2ZkOThmLi4zMDBmOWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjNjQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjNjQuaApAQCAtNywxMSArNyw3IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogRm9yIFRBU0tfU0laRSAqLwotI2luY2x1ZGUgPGFzbS9tbXUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotc3RydWN0IG1tX3N0cnVjdDsKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCkBAIC0yNyw3ICsyMyw3IEBACiAgKi8KICNkZWZpbmUgUEdUQUJMRV9FQUREUl9TSVpFIChQVEVfSU5ERVhfU0laRSArIFBNRF9JTkRFWF9TSVpFICsgXAogICAgICAgICAgICAgICAgIAkgICAgUFVEX0lOREVYX1NJWkUgKyBQR0RfSU5ERVhfU0laRSArIFBBR0VfU0hJRlQpCi0jZGVmaW5lIFBHVEFCTEVfUkFOR0UgKDFVTCA8PCBQR1RBQkxFX0VBRERSX1NJWkUpCisjZGVmaW5lIFBHVEFCTEVfUkFOR0UgKEFTTV9DT05TVCgxKSA8PCBQR1RBQkxFX0VBRERSX1NJWkUpCiAKICNpZiBUQVNLX1NJWkVfVVNFUjY0ID4gUEdUQUJMRV9SQU5HRQogI2Vycm9yIFRBU0tfU0laRV9VU0VSNjQgZXhjZWVkcyBwYWdldGFibGUgcmFuZ2UKQEAgLTM3LDE5ICszMywyOCBAQAogI2Vycm9yIFRBU0tfU0laRV9VU0VSNjQgZXhjZWVkcyB1c2VyIFZTSUQgcmFuZ2UKICNlbmRpZgogCisKIC8qCiAgKiBEZWZpbmUgdGhlIGFkZHJlc3MgcmFuZ2Ugb2YgdGhlIHZtYWxsb2MgVk0gYXJlYS4KICAqLwogI2RlZmluZSBWTUFMTE9DX1NUQVJUIEFTTV9DT05TVCgweEQwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFZNQUxMT0NfU0laRSAgQVNNX0NPTlNUKDB4ODAwMDAwMDAwMDApCisjZGVmaW5lIFZNQUxMT0NfU0laRSAgKFBHVEFCTEVfUkFOR0UgPj4gMSkKICNkZWZpbmUgVk1BTExPQ19FTkQgICAoVk1BTExPQ19TVEFSVCArIFZNQUxMT0NfU0laRSkKIAogLyoKLSAqIERlZmluZSB0aGUgYWRkcmVzcyByYW5nZSBvZiB0aGUgaW1hbGxvYyBWTSBhcmVhLgorICogRGVmaW5lIHRoZSBhZGRyZXNzIHJhbmdlcyBmb3IgTU1JTyBhbmQgSU8gc3BhY2UgOgorICoKKyAqICBJU0FfSU9fQkFTRSA9IFZNQUxMT0NfRU5ELCA2NEsgcmVzZXJ2ZWQgYXJlYQorICogIFBIQl9JT19CQVNFID0gSVNBX0lPX0JBU0UgKyA2NEsgdG8gSVNBX0lPX0JBU0UgKyAyRywgUEhCIElPIHNwYWNlcworICogSU9SRU1BUF9CQVNFID0gSVNBX0lPX0JBU0UgKyAyRyB0byBWTUFMTE9DX1NUQVJUICsgUEdUQUJMRV9SQU5HRQogICovCi0jZGVmaW5lIFBIQlNfSU9fQkFTRQlWTUFMTE9DX0VORAotI2RlZmluZSBJTUFMTE9DX0JBU0UJKFBIQlNfSU9fQkFTRSArIDB4ODAwMDAwMDB1bCkJLyogUmVzZXJ2ZSAyIGdpZ3MgZm9yIFBIQnMgKi8KLSNkZWZpbmUgSU1BTExPQ19FTkQJKFZNQUxMT0NfU1RBUlQgKyBQR1RBQkxFX1JBTkdFKQorI2RlZmluZSBGVUxMX0lPX1NJWkUJMHg4MDAwMDAwMHVsCisjZGVmaW5lICBJU0FfSU9fQkFTRQkoVk1BTExPQ19FTkQpCisjZGVmaW5lICBJU0FfSU9fRU5ECShWTUFMTE9DX0VORCArIDB4MTAwMDB1bCkKKyNkZWZpbmUgIFBIQl9JT19CQVNFCShJU0FfSU9fRU5EKQorI2RlZmluZSAgUEhCX0lPX0VORAkoVk1BTExPQ19FTkQgKyBGVUxMX0lPX1NJWkUpCisjZGVmaW5lIElPUkVNQVBfQkFTRQkoUEhCX0lPX0VORCkKKyNkZWZpbmUgSU9SRU1BUF9FTkQJKFZNQUxMT0NfU1RBUlQgKyBQR1RBQkxFX1JBTkdFKQogCiAvKgogICogUmVnaW9uIElEcwpAQCAtMTM0LDE2ICsxMzksNiBAQAogI2RlZmluZSBfX1MxMTAJUEFHRV9TSEFSRURfWAogI2RlZmluZSBfX1MxMTEJUEFHRV9TSEFSRURfWAogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0vKgotICogWkVST19QQUdFIGlzIGEgZ2xvYmFsIHNoYXJlZCBwYWdlIHRoYXQgaXMgYWx3YXlzIHplcm86IHVzZWQKLSAqIGZvciB6ZXJvLW1hcHBlZCBtZW1vcnkgYXJlYXMgZXRjLi4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlW1BBR0VfU0laRS9zaXplb2YodW5zaWduZWQgbG9uZyldOwotI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlKSkKLSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KLQogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKIAogI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQQpAQCAtMjMyLDkgKzIyNyw3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUlc7fQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKSAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQzt9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTt9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDt9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7fQpAQCAtMjQyLDIwICsyMzUsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfdW5jYWNoZShwdGVfdCBwdGUpIHsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX05PX0NBQ0hFOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NhY2hlKHB0ZV90IHB0ZSkgICB7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfTk9fQ0FDSEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JXKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9ESVJUWSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSIHwgX1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKSB7CkBAIC0zMDcsMjkgKzI5Miw2IEBACiAJX19yOwkJCQkJCQkJICAgXAogfSkKIAotLyoKLSAqIE9uIFJXL0RJUlRZIGJpdCB0cmFuc2l0aW9ucyB3ZSBjYW4gYXZvaWQgZmx1c2hpbmcgdGhlIGhwdGUuIEZvciB0aGUKLSAqIG1vbWVudCB3ZSBhbHdheXMgZmx1c2ggYnV0IHdlIG5lZWQgdG8gZml4IGhwdGVfdXBkYXRlIGFuZCB0ZXN0IGlmIHRoZQotICogb3B0aW1pc2F0aW9uIGlzIHdvcnRoIGl0LgotICovCi1zdGF0aWMgaW5saW5lIGludCBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JdW5zaWduZWQgbG9uZyBvbGQ7Ci0KLSAgICAgICAJaWYgKChwdGVfdmFsKCpwdGVwKSAmIF9QQUdFX0RJUlRZKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlvbGQgPSBwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCBfUEFHRV9ESVJUWSwgMCk7Ci0JcmV0dXJuIChvbGQgJiBfUEFHRV9ESVJUWSkgIT0gMDsKLX0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KF9fdm1hLCBfX2FkZHIsIF9fcHRlcCkJCSAgIFwKLSh7CQkJCQkJCQkJICAgXAotCWludCBfX3I7CQkJCQkJCSAgIFwKLQlfX3IgPSBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoKF9fdm1hKS0+dm1fbW0sIF9fYWRkciwgX19wdGVwKTsgXAotCV9fcjsJCQkJCQkJCSAgIFwKLX0pCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlcF9zZXRfd3Jwcm90ZWN0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICAgcHRlX3QgKnB0ZXApCkBAIC0zNTcsMTQgKzMxOSw2IEBACiAJX195b3VuZzsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0RJUlRZX0ZMVVNICi0jZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfZGlydHkoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fZGlydHkgPSBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoKF9fdm1hKS0+dm1fbW0sIF9fYWRkcmVzcywgXAotCQkJCQkJICBfX3B0ZXApOyAJCVwKLQlfX2RpcnR5OwkJCQkJCQlcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCkBAIC00NDIsMTAgKzM5Niw2IEBACiAjZGVmaW5lIHBnZF9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHBnZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcGdkX3ZhbChlKSkKIAotZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW107Ci0KLWV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwotCiAvKiBFbmNvZGUgYW5kIGRlLWNvZGUgYSBzd2FwIGVudHJ5ICovCiAjZGVmaW5lIF9fc3dwX3R5cGUoZW50cnkpCSgoKGVudHJ5KS52YWwgPj4gMSkgJiAweDNmKQogI2RlZmluZSBfX3N3cF9vZmZzZXQoZW50cnkpCSgoZW50cnkpLnZhbCA+PiA4KQpAQCAtNDU2LDE3ICs0MDYsNiBAQAogI2RlZmluZSBwZ29mZl90b19wdGUob2ZmKQkoKHB0ZV90KSB7KChvZmYpIDw8IFBURV9SUE5fU0hJRlQpfF9QQUdFX0ZJTEV9KQogI2RlZmluZSBQVEVfRklMRV9NQVhfQklUUwkoQklUU19QRVJfTE9ORyAtIFBURV9SUE5fU0hJRlQpCiAKLS8qCi0gKiBrZXJuX2FkZHJfdmFsaWQgaXMgaW50ZW5kZWQgdG8gaW5kaWNhdGUgd2hldGhlciBhbiBhZGRyZXNzIGlzIGEgdmFsaWQKLSAqIGtlcm5lbCBhZGRyZXNzLiAgTW9zdCAzMi1iaXQgYXJjaHMgZGVmaW5lIGl0IGFzIGFsd2F5cyB0cnVlIChsaWtlIHRoaXMpCi0gKiBidXQgbW9zdCA2NC1iaXQgYXJjaHMgYWN0dWFsbHkgcGVyZm9ybSBhIHRlc3QuICBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPwotICogVGhlIG9ubHkgdXNlIGlzIGluIGZzL25jcGZzL2Rpci5jCi0gKi8KLSNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCSgxKQotCi0jZGVmaW5lIGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCQlcCi0JCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCi0KIHZvaWQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaAppbmRleCA3OGJmNGFlLi5kMThmZmU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaApAQCAtMiw2ICsyLDEzIEBACiAjZGVmaW5lIF9BU01fUE9XRVJQQ19QR1RBQkxFX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogRm9yIFRBU0tfU0laRSAqLworI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorc3RydWN0IG1tX3N0cnVjdDsKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKICNpZiBkZWZpbmVkKENPTkZJR19QUEM2NCkKICMgIGluY2x1ZGUgPGFzbS9wZ3RhYmxlLXBwYzY0Lmg+CiAjZWxzZQpAQCAtOSw2ICsxNiwyNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogWkVST19QQUdFIGlzIGEgZ2xvYmFsIHNoYXJlZCBwYWdlIHRoYXQgaXMgYWx3YXlzIHplcm86IHVzZWQKKyAqIGZvciB6ZXJvLW1hcHBlZCBtZW1vcnkgYXJlYXMgZXRjLi4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlW107CisjZGVmaW5lIFpFUk9fUEFHRSh2YWRkcikgKHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpKQorCitleHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbXTsKKworZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7CisKKy8qCisgKiBrZXJuX2FkZHJfdmFsaWQgaXMgaW50ZW5kZWQgdG8gaW5kaWNhdGUgd2hldGhlciBhbiBhZGRyZXNzIGlzIGEgdmFsaWQKKyAqIGtlcm5lbCBhZGRyZXNzLiAgTW9zdCAzMi1iaXQgYXJjaHMgZGVmaW5lIGl0IGFzIGFsd2F5cyB0cnVlIChsaWtlIHRoaXMpCisgKiBidXQgbW9zdCA2NC1iaXQgYXJjaHMgYWN0dWFsbHkgcGVyZm9ybSBhIHRlc3QuICBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPworICovCisjZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKQkoMSkKKworI2RlZmluZSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQkJXAorCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjLXBjaS5oCmluZGV4IDhlMjAwNTEuLmI4NDdhYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjLXBjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjLXBjaS5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIGV4dGVybiB2b2lkIGZpbmRfYW5kX2luaXRfcGhicyh2b2lkKTsKIAotZXh0ZXJuIHN0cnVjdCBwY2lfZGV2ICpwcGM2NF9pc2FicmlkZ2VfZGV2OwkvKiBtYXkgYmUgTlVMTCBpZiBubyBJU0EgYnVzICovCitleHRlcm4gc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2VfcGNpZGV2OwkvKiBtYXkgYmUgTlVMTCBpZiBubyBJU0EgYnVzICovCiAKIC8qKiBCdXMgVW5pdCBJRCBtYWNyb3M7IGdldCBsb3cgYW5kIGhpIDMyLWJpdHMgb2YgdGhlIDY0LWJpdCBCVUlEICovCiAjZGVmaW5lIEJVSURfSEkoYnVpZCkgKChidWlkKSA+PiAzMikKQEAgLTQ3LDggKzQ3LDggQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9waGJfYnVpZCAoc3RydWN0IGRldmljZV9ub2RlICopOwogZXh0ZXJuIGludCBydGFzX3NldHVwX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CiAKLS8qIEZyb20gcFNlcmllc19wY2kuaCAqLwotZXh0ZXJuIHZvaWQgcFNlcmllc19maW5hbF9maXh1cCh2b2lkKTsKKy8qIEZyb20gaVNlcmllcyBQQ0kgKi8KK2V4dGVybiB2b2lkIGlTZXJpZXNfcGNpYmlvc19pbml0KHZvaWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfcHJvYmVfb25seTsKIApAQCAtMTM5LDYgKzEzOSw5IEBACiAgKi8KIHN0cnVjdCBkZXZpY2Vfbm9kZSAqIGZpbmRfZGV2aWNlX3BlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pOwogCit2b2lkIGVlaF9zeXNmc19hZGRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3ZvaWQgZWVoX3N5c2ZzX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCiAjZW5kaWYgLyogQ09ORklHX0VFSCAqLwogCiAjZWxzZSAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAppbmRleCBkOTQ3YjE2Li5lMjhiMTA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKQEAgLTQzLDE0ICs0Myw2IEBACiAvKiB3aGF0IGtpbmQgb2YgcHJlcCB3b3Jrc3RhdGlvbiB3ZSBhcmUgKi8KIGV4dGVybiBpbnQgX3ByZXBfdHlwZTsKIAotLyoKLSAqIFRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYm9hcmQgdHlwZSBmcm9tIGEgZ2l2ZW4gUFJlUCBib2FyZAotICogdmVuZG9yLiBCb2FyZCByZXZpc2lvbiBpcyBhbHNvIG1hZGUgYXZhaWxhYmxlLiBUaGlzIHdpbGwgYmUgbW92ZWQKLSAqIGVsc2V3aGVyZSBzb29uCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXY7Ci1leHRlcm4gdW5zaWduZWQgY2hhciB1Y0JvYXJkUmV2TWFqLCB1Y0JvYXJkUmV2TWluOwotCiAjZW5kaWYgLyogQ09ORklHX1BQQ19QUkVQICovCiAKICNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoQ09ORklHX1BQQzMyKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaAppbmRleCA2ODQ1YWY5Li4xNjMyYmFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaApAQCAtOTgsMTAgKzk4LDE5IEBACiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9jaG9zZW47CiAKIC8qIGZsYWcgZGVzY3JpcHRpb25zICovCi0jZGVmaW5lIE9GX0RZTkFNSUMgMSAvKiBub2RlIGFuZCBwcm9wZXJ0aWVzIHdlcmUgYWxsb2NhdGVkIHZpYSBrbWFsbG9jICovCisjZGVmaW5lIE9GX0RZTkFNSUMJMSAvKiBub2RlIGFuZCBwcm9wZXJ0aWVzIHdlcmUgYWxsb2NhdGVkIHZpYSBrbWFsbG9jICovCisjZGVmaW5lIE9GX0RFVEFDSEVECTIgLyogbm9kZSBoYXMgYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBkZXZpY2UgdHJlZSAqLwogCi0jZGVmaW5lIE9GX0lTX0RZTkFNSUMoeCkgdGVzdF9iaXQoT0ZfRFlOQU1JQywgJngtPl9mbGFncykKLSNkZWZpbmUgT0ZfTUFSS19EWU5BTUlDKHgpIHNldF9iaXQoT0ZfRFlOQU1JQywgJngtPl9mbGFncykKK3N0YXRpYyBpbmxpbmUgaW50IG9mX25vZGVfY2hlY2tfZmxhZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm4sIHVuc2lnbmVkIGxvbmcgZmxhZykKK3sKKwlyZXR1cm4gdGVzdF9iaXQoZmxhZywgJm4tPl9mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvZl9ub2RlX3NldF9mbGFnKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbiwgdW5zaWduZWQgbG9uZyBmbGFnKQoreworCXNldF9iaXQoZmxhZywgJm4tPl9mbGFncyk7Cit9CisKIAogI2RlZmluZSBIQVZFX0FSQ0hfREVWVFJFRV9GSVhVUFMKIApAQCAtMTI0LDYgKzEzMyw5IEBACiAJICAgICBkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKGRuLCB0eXBlKSkKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZnJvbSwKIAljb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpjb21wYXQpOworI2RlZmluZSBmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUoZG4sIHR5cGUsIGNvbXBhdGlibGUpIFwKKwlmb3IgKGRuID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgdHlwZSwgY29tcGF0aWJsZSk7IGRuOyBcCisJICAgICBkbiA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKGRuLCB0eXBlLCBjb21wYXRpYmxlKSkKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUocGhhbmRsZSBoYW5kbGUpOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9hbGxfbm9kZXMoc3RydWN0IGRldmljZV9ub2RlICpwcmV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oCmluZGV4IDFlMDQ2NTEuLmE2ZjNmNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczMuaApAQCAtMzUsNyArMzUsOCBAQAogCX07CiB9OwogCi1pbnQgcHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKHVuaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uICp2KTsKK3ZvaWQgcHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKHVuaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uICp2KTsKK2ludCBwczNfY29tcGFyZV9maXJtd2FyZV92ZXJzaW9uKHUxNiBtYWpvciwgdTE2IG1pbm9yLCB1MTYgcmV2KTsKIAogLyogJ090aGVyIE9TJyBhcmVhICovCiAKQEAgLTQ4LDE4ICs0OSw2IEBACiAKIGVudW0gcHMzX3BhcmFtX2F2X211bHRpX291dCBwczNfb3NfYXJlYV9nZXRfYXZfbXVsdGlfb3V0KHZvaWQpOwogCi0vKioKLSAqIHN0cnVjdCBwczNfZGV2aWNlX2lkIC0gSFYgYnVzIGRldmljZSBpZGVudGlmaWVyIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5Ci0gKiBAYnVzX2lkOiBIViBidXMgaWQsIHsxLi59ICh6ZXJvIGludmFsaWQpCi0gKiBAZGV2X2lkOiBIViBkZXZpY2UgaWQsIHswLi59Ci0gKi8KLQotc3RydWN0IHBzM19kZXZpY2VfaWQgewotCXVuc2lnbmVkIGludCBidXNfaWQ7Ci0JdW5zaWduZWQgaW50IGRldl9pZDsKLX07Ci0KLQogLyogZG1hIHJvdXRpbmVzICovCiAKIGVudW0gcHMzX2RtYV9wYWdlX3NpemUgewpAQCAtNzQsNiArNjMsOCBAQAogCVBTM19ETUFfSU5URVJOQUwgPSAyLAogfTsKIAorc3RydWN0IHBzM19kbWFfcmVnaW9uX29wczsKKwogLyoqCiAgKiBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gLSBBIHBlciBkZXZpY2UgZG1hIHN0YXRlIHZhcmlhYmxlcyBzdHJ1Y3R1cmUKICAqIEBkaWQ6IFRoZSBIViBkZXZpY2UgaWQuCkBAIC04MSwyMSArNzIsNDIgQEAKICAqIEByZWdpb25fdHlwZTogVGhlIEhWIHJlZ2lvbiB0eXBlLgogICogQGJ1c19hZGRyOiBUaGUgJ3RyYW5zbGF0ZWQnIGJ1cyBhZGRyZXNzIG9mIHRoZSByZWdpb24uCiAgKiBAbGVuOiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSByZWdpb24uCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIG1lbW9yeSBvZiB0aGUgcmVnaW9uLgorICogQGlvaWQ6IFRoZSBJT0lEIG9mIHRoZSBkZXZpY2Ugd2hvIG93bnMgdGhpcyByZWdpb24KICAqIEBjaHVua19saXN0OiBPcGFxdWUgdmFyaWFibGUgdXNlZCBieSB0aGUgaW9jIHBhZ2UgbWFuYWdlci4KKyAqIEByZWdpb25fb3BzOiBzdHJ1Y3QgcHMzX2RtYV9yZWdpb25fb3BzIC0gZG1hIHJlZ2lvbiBvcGVyYXRpb25zCiAgKi8KIAogc3RydWN0IHBzM19kbWFfcmVnaW9uIHsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OworCS8qIGRldmljZSB2YXJpYWJsZXMgKi8KKwljb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb25fb3BzICpyZWdpb25fb3BzOworCXVuc2lnbmVkIGNoYXIgaW9pZDsKIAllbnVtIHBzM19kbWFfcGFnZV9zaXplIHBhZ2Vfc2l6ZTsKIAllbnVtIHBzM19kbWFfcmVnaW9uX3R5cGUgcmVnaW9uX3R5cGU7Ci0JdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGxlbjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCS8qIGRyaXZlciB2YXJpYWJsZXMgIChzZXQgYnkgcHMzX2RtYV9yZWdpb25fY3JlYXRlKSAqLworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CiAJc3RydWN0IHsKIAkJc3BpbmxvY2tfdCBsb2NrOwogCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CiAJfSBjaHVua19saXN0OwogfTsKIAorc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyB7CisJaW50ICgqY3JlYXRlKShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKik7CisJaW50ICgqZnJlZSkoc3RydWN0IHBzM19kbWFfcmVnaW9uICopOworCWludCAoKm1hcCkoc3RydWN0IHBzM19kbWFfcmVnaW9uICosCisJCSAgIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAorCQkgICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJICAgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJCSAgIHU2NCBpb3B0ZV9wcCk7CisJaW50ICgqdW5tYXApKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCisJCSAgICAgdW5zaWduZWQgbG9uZyBsZW4pOworfTsKIC8qKgogICogc3RydWN0IHBzM19kbWFfcmVnaW9uX2luaXQgLSBIZWxwZXIgdG8gaW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgdmFyaWFibGVzCiAgKgpAQCAtMTAzLDE4ICsxMTUsMTYgQEAKICAqIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3Rlci4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHMzX2RtYV9yZWdpb25faW5pdChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCi0JY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQqIGRpZCwgZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemUsCi0JZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlKQotewotCXItPmRpZCA9ICpkaWQ7Ci0Jci0+cGFnZV9zaXplID0gcGFnZV9zaXplOwotCXItPnJlZ2lvbl90eXBlID0gcmVnaW9uX3R5cGU7Ci19CitzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlOworCitpbnQgcHMzX2RtYV9yZWdpb25faW5pdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCBlbnVtIHBzM19kbWFfcGFnZV9zaXplIHBhZ2Vfc2l6ZSwKKwllbnVtIHBzM19kbWFfcmVnaW9uX3R5cGUgcmVnaW9uX3R5cGUsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKIGludCBwczNfZG1hX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKTsKIGludCBwczNfZG1hX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcik7CiBpbnQgcHMzX2RtYV9tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpOworCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwl1NjQgaW9wdGVfcHApOwogaW50IHBzM19kbWFfdW5tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuKTsKIApAQCAtMTI1LDYgKzEzNSw3IEBACiAJUFMzX01NSU9fNjRLID0gMTZVCiB9OwogCitzdHJ1Y3QgcHMzX21taW9fcmVnaW9uX29wczsKIC8qKgogICogc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAtIGEgcGVyIGRldmljZSBtbWlvIHN0YXRlIHZhcmlhYmxlcyBzdHJ1Y3R1cmUKICAqCkBAIC0xMzIsMTMgKzE0MywxOCBAQAogICovCiAKIHN0cnVjdCBwczNfbW1pb19yZWdpb24gewotCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXY7CisJY29uc3Qgc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9vcHMgKm1taW9fb3BzOwogCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBsZW47CiAJZW51bSBwczNfbW1pb19wYWdlX3NpemUgcGFnZV9zaXplOwogCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyOwogfTsKIAorc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9vcHMgeworCWludCAoKmNyZWF0ZSkoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqKTsKKwlpbnQgKCpmcmVlKShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICopOworfTsKIC8qKgogICogc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9pbml0IC0gSGVscGVyIHRvIGluaXRpYWxpemUgc3RydWN0dXJlIHZhcmlhYmxlcwogICoKQEAgLTE0NiwxNSArMTYyLDkgQEAKICAqIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3Rlci4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHMzX21taW9fcmVnaW9uX2luaXQoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqciwKLQljb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCogZGlkLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCBlbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemUpCi17Ci0Jci0+ZGlkID0gKmRpZDsKLQlyLT5idXNfYWRkciA9IGJ1c19hZGRyOwotCXItPmxlbiA9IGxlbjsKLQlyLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7Ci19CitpbnQgcHMzX21taW9fcmVnaW9uX2luaXQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCWVudW0gcHMzX21taW9fcGFnZV9zaXplIHBhZ2Vfc2l6ZSk7CiBpbnQgcHMzX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKTsKIGludCBwczNfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKTsKIHVuc2lnbmVkIGxvbmcgcHMzX21tX3BoeXNfdG9fbHBhcih1bnNpZ25lZCBsb25nIHBoeXNfYWRkcik7CkBAIC0xODcsMTEgKzE5NywxMCBAQAogCXVuc2lnbmVkIGludCBjbGFzcywgdW5zaWduZWQgaW50ICp2aXJxKTsKIGludCBwczNfc3BlX2lycV9kZXN0cm95KHVuc2lnbmVkIGludCB2aXJxKTsKIAotaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoZW51bSBwczNfY3B1X2JpbmRpbmcgY3B1LAotCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsIHVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsCi0JdW5zaWduZWQgaW50ICp2aXJxKTsKLWludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQgKmRpZCwKLQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLCB1bnNpZ25lZCBpbnQgdmlycSk7CitpbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJZW51bSBwczNfY3B1X2JpbmRpbmcgY3B1LCB1bnNpZ25lZCBpbnQgKnZpcnEpOworaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJdW5zaWduZWQgaW50IHZpcnEpOwogCiAvKiBsdjEgcmVzdWx0IGNvZGVzICovCiAKQEAgLTI4OSwxMSArMjk4LDMzIEBACiAvKiBzeXN0ZW0gYnVzIHJvdXRpbmVzICovCiAKIGVudW0gcHMzX21hdGNoX2lkIHsKLQlQUzNfTUFUQ0hfSURfRUhDSSA9IDEsCi0JUFMzX01BVENIX0lEX09IQ0ksCi0JUFMzX01BVENIX0lEX0dFTElDLAotCVBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUywKLQlQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVIsCisJUFMzX01BVENIX0lEX0VIQ0kgICAgICAgICAgID0gMSwKKwlQUzNfTUFUQ0hfSURfT0hDSSAgICAgICAgICAgPSAyLAorCVBTM19NQVRDSF9JRF9HRUxJQyAgICAgICAgICA9IDMsCisJUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTICAgID0gNCwKKwlQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVIgPSA1LAorCVBTM19NQVRDSF9JRF9TVE9SX0RJU0sgICAgICA9IDYsCisJUFMzX01BVENIX0lEX1NUT1JfUk9NICAgICAgID0gNywKKwlQUzNfTUFUQ0hfSURfU1RPUl9GTEFTSCAgICAgPSA4LAorCVBTM19NQVRDSF9JRF9TT1VORCAgICAgICAgICA9IDksCisJUFMzX01BVENIX0lEX0dSQVBISUNTICAgICAgID0gMTAsCit9OworCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfRUhDSSAgICAgICAgICAgInBzMzoxIgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX09IQ0kgICAgICAgICAgICJwczM6MiIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19HRUxJQyAgICAgICAgICAicHMzOjMiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfQVZfU0VUVElOR1MgICAgInBzMzo0IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX1NZU1RFTV9NQU5BR0VSICJwczM6NSIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TVE9SX0RJU0sgICAgICAicHMzOjYiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1RPUl9ST00gICAgICAgInBzMzo3IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX1NUT1JfRkxBU0ggICAgICJwczM6OCIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TT1VORCAgICAgICAgICAicHMzOjkiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR1JBUEhJQ1MgICAgICAgInBzMzoxMCIKKworZW51bSBwczNfc3lzdGVtX2J1c19kZXZpY2VfdHlwZSB7CisJUFMzX0RFVklDRV9UWVBFX0lPQzAgPSAxLAorCVBTM19ERVZJQ0VfVFlQRV9TQiwKKwlQUzNfREVWSUNFX1RZUEVfVlVBUlQsCiB9OwogCiAvKioKQEAgLTMwMiwxNCArMzMzLDIzIEBACiAKIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgewogCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOwotCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKLQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkOwotLyoJc3RydWN0IGlvbW11X3RhYmxlICppb21tdV90YWJsZTsgLS0gd2FpdGluZyBmb3IgQmVuJ3MgY2xlYW51cHMgKi8KLQlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKmRfcmVnaW9uOwotCXN0cnVjdCBwczNfbW1pb19yZWdpb24gKm1fcmVnaW9uOworCWVudW0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3R5cGUgZGV2X3R5cGU7CisKKwl1bnNpZ25lZCBpbnQgYnVzX2lkOyAgICAgICAgICAgICAgLyogU0IgKi8KKwl1bnNpZ25lZCBpbnQgZGV2X2lkOyAgICAgICAgICAgICAgLyogU0IgKi8KKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkOyAgICAgICAgLyogU0IgKi8KKwlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKmRfcmVnaW9uOyAgLyogU0IsIElPQzAgKi8KKwlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICptX3JlZ2lvbjsgLyogU0IsIElPQzAqLworCXVuc2lnbmVkIGludCBwb3J0X251bWJlcjsgICAgICAgICAvKiBWVUFSVCAqLworCisvKglzdHJ1Y3QgaW9tbXVfdGFibGUgKmlvbW11X3RhYmxlOyAtLSB3YWl0aW5nIGZvciBCZW5IJ3MgY2xlYW51cHMgKi8KIAlzdHJ1Y3QgZGV2aWNlIGNvcmU7CisJdm9pZCAqZHJpdmVyX3ByaXY7IC8qIHByaXZhdGUgZHJpdmVyIHZhcmlhYmxlcyAqLwogfTsKIAoraW50IHBzM19vcGVuX2h2X2RldmljZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOworaW50IHBzM19jbG9zZV9odl9kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKKwogLyoqCiAgKiBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyIC0gYSBkcml2ZXIgZm9yIGEgZGV2aWNlIG9uIHRoZSBzeXN0ZW0gYnVzCiAgKi8KQEAgLTMxOSw2ICszNTksNyBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGNvcmU7CiAJaW50ICgqcHJvYmUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CiAJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworCWludCAoKnNodXRkb3duKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOwogLyoJaW50ICgqc3VzcGVuZCkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqLCBwbV9tZXNzYWdlX3QpOyAqLwogLyoJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOyAqLwogfTsKQEAgLTMyNiwxNiArMzY3LDI0IEBACiBpbnQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7CiBpbnQgcHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydik7CiB2b2lkIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydik7Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKnRvX3BzM19zeXN0ZW1fYnVzX2RyaXZlcigKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpwczNfZHJ2X3RvX3N5c3RlbV9idXNfZHJ2KAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpfZHJ2KQogewogCXJldHVybiBjb250YWluZXJfb2YoX2Rydiwgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciwgY29yZSk7CiB9Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKnRvX3BzM19zeXN0ZW1fYnVzX2RldmljZSgKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldigKIAlzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewogCXJldHVybiBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSwgY29yZSk7CiB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKgorCXBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpfZGV2KQoreworCUJVR19PTighX2Rldik7CisJQlVHX09OKCFfZGV2LT5jb3JlLmRyaXZlcik7CisJcmV0dXJuIHBzM19kcnZfdG9fc3lzdGVtX2J1c19kcnYoX2Rldi0+Y29yZS5kcml2ZXIpOworfQogCiAvKioKICAqIHBzM19zeXN0ZW1fYnVzX3NldF9kcnZkYXRhIC0KQEAgLTM1OCwzMiArNDA3LDE3IEBACiAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcHMzX3N5c3RlbV9idXNfdHlwZTsKIAotLyogdnVhcnQgcm91dGluZXMgKi8KLQotc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXY7Ci0KLS8qKgotICogc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAtIGEgZGV2aWNlIG9uIGEgdnVhcnQgcG9ydAotICovCi0KLXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgewotCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOwotCXN0cnVjdCBkZXZpY2UgY29yZTsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiogcHJpdjsgLyogcHJpdmF0ZSBkcml2ZXIgdmFyaWFibGVzICovCi0KLX07Ci0KLWludCBwczNfdnVhcnRfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLQogLyogc3lzdGVtIG1hbmFnZXIgKi8KIAotI2lmZGVmIENPTkZJR19QUzNfU1lTX01BTkFHRVIKLXZvaWQgcHMzX3N5c19tYW5hZ2VyX3Jlc3RhcnQodm9pZCk7CitzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcyB7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OworCXZvaWQgKCpwb3dlcl9vZmYpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7CisJdm9pZCAoKnJlc3RhcnQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7Cit9OworCit2b2lkIHBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMoY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgKm9wcyk7CiB2b2lkIHBzM19zeXNfbWFuYWdlcl9wb3dlcl9vZmYodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3Bvd2VyX29mZih2b2lkKSB7fQotI2VuZGlmCit2b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpOwogCiBzdHJ1Y3QgcHMzX3ByZWFsbG9jIHsKICAgICBjb25zdCBjaGFyICpuYW1lOwpAQCAtMzkzLDUgKzQyNyw3IEBACiB9OwogCiBleHRlcm4gc3RydWN0IHBzM19wcmVhbGxvYyBwczNmYl92aWRlb21lbW9yeTsKK2V4dGVybiBzdHJ1Y3QgcHMzX3ByZWFsbG9jIHBzM2ZsYXNoX2JvdW5jZV9idWZmZXI7CisKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2F2LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2F2LmgKaW5kZXggOWVmYzQwZi4uN2RmNDI1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNhdi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzYXYuaApAQCAtMSwyMCArMSwyMyBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgotICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgU29ueSBDb3Jwb3JhdGlvbgorICogIFBTMyBBViBiYWNrZW5kIHN1cHBvcnQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLworCiAjaWZuZGVmIF9BU01fUE9XRVJQQ19QUzNBVl9IXwogI2RlZmluZSBfQVNNX1BPV0VSUENfUFMzQVZfSF8KIApAQCAtMTU5LDYgKzE2Miw5IEBACiAjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19GTVRfWDhSOEc4QjgJCQkweDAwMDAKIC8qIHZpZGVvX291dF9mb3JtYXQgKi8KICNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX09VVF9GT1JNQVRfUkdCXzEyQklUCQkweDAwMDAKKy8qIHZpZGVvX2NsX2NudiAqLworI2RlZmluZSBQUzNBVl9DTURfVklERU9fQ0xfQ05WX0VOQUJMRV9MVVQJCTB4MDAwMAorI2RlZmluZSBQUzNBVl9DTURfVklERU9fQ0xfQ05WX0RJU0FCTEVfTFVUCQkweDAwMTAKIC8qIHZpZGVvX3N5bmMgKi8KICNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX1NZTkNfVlNZTkMJCQkweDAwMDEKICNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX1NZTkNfQ1NZTkMJCQkweDAwMDQKQEAgLTMxMSw2ICszMTcsOCBAQAogI2RlZmluZSBQUzNBVl9NT0RFX01BU0sJCQkJMHgwMDBGCiAjZGVmaW5lIFBTM0FWX01PREVfSERDUF9PRkYJCQkweDEwMDAJLyogUmV0YWlsIFBTMyBwcm9kdWN0IGRvZXNuJ3Qgc3VwcG9ydCB0aGlzICovCiAjZGVmaW5lIFBTM0FWX01PREVfRElUSEVSCQkJMHgwODAwCisjZGVmaW5lIFBTM0FWX01PREVfQ09MT1IJCQkweDA0MDAKKyNkZWZpbmUgUFMzQVZfTU9ERV9XSElURQkJCTB4MDIwMAogI2RlZmluZSBQUzNBVl9NT0RFX0ZVTEwJCQkJMHgwMDgwCiAjZGVmaW5lIFBTM0FWX01PREVfRFZJCQkJCTB4MDA0MAogI2RlZmluZSBQUzNBVl9NT0RFX1JHQgkJCQkweDAwMjAKQEAgLTUyOSw5ICs1MzcsOSBAQAogCXUzMiB2aWRlb19vdXRfZm9ybWF0OwkvKiBpbjogb3V0IGZvcm1hdCAqLwogCXUzMiB2aWRlb19mb3JtYXQ7CS8qIGluOiBpbnB1dCBmcmFtZSBidWZmZXIgZm9ybWF0ICovCiAJdTggcmVzZXJ2ZWQzOwotCXU4IHJlc2VydmVkNDsKKwl1OCB2aWRlb19jbF9jbnY7CS8qIGluOiBjb2xvciBjb252ZXJzaW9uICovCiAJdTE2IHZpZGVvX29yZGVyOwkvKiBpbjogaW5wdXQgUkdCIG9yZGVyICovCi0JdTMyIHJlc2VydmVkNTsKKwl1MzIgcmVzZXJ2ZWQ0OwogfTsKIAogLyogdmlkZW86IGZvcm1hdCAqLwpAQCAtNTM5LDcgKzU0Nyw4IEBACiAJc3RydWN0IHBzM2F2X3NlbmRfaGRyIHNlbmRfaGRyOwogCXUzMiB2aWRlb19oZWFkOwkJLyogaW46IGhlYWQgKi8KIAl1MzIgdmlkZW9fZm9ybWF0OwkvKiBpbjogZnJhbWUgYnVmZmVyIGZvcm1hdCAqLwotCXUxNiByZXNlcnZlZDsKKwl1OCByZXNlcnZlZDsKKwl1OCB2aWRlb19jbF9jbnY7CS8qIGluOiBjb2xvciBjb252ZXJzaW9uICovCiAJdTE2IHZpZGVvX29yZGVyOwkvKiBpbjogaW5wdXQgUkdCIG9yZGVyICovCiB9OwogCkBAIC02OTgsMTIgKzcwNyw2IEBACiBleHRlcm4gaW50IHBzM2F2X2NtZF92aWRlb19nZXRfbW9uaXRvcl9pbmZvKHN0cnVjdCBwczNhdl9wa3RfYXZfZ2V0X21vbml0b3JfaW5mbyAqLAogCQkJCQkgICAgdTMyKTsKIAotc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZTsKLWV4dGVybiBpbnQgcHMzYXZfdnVhcnRfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAotCQkJICAgICBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gaW50IHBzM2F2X3Z1YXJ0X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkICpidWYsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgdGltZW91dCk7Ci0KIGV4dGVybiBpbnQgcHMzYXZfc2V0X3ZpZGVvX21vZGUodTMyLCBpbnQpOwogZXh0ZXJuIGludCBwczNhdl9zZXRfYXVkaW9fbW9kZSh1MzIsIHUzMiwgdTMyLCB1MzIsIHUzMik7CiBleHRlcm4gaW50IHBzM2F2X2dldF9hdXRvX21vZGUoaW50KTsKQEAgLTcxNiw1ICs3MTksOCBAQAogZXh0ZXJuIGludCBwczNhdl9hdWRpb19tdXRlKGludCk7CiBleHRlcm4gaW50IHBzM2F2X2Rldl9vcGVuKHZvaWQpOwogZXh0ZXJuIGludCBwczNhdl9kZXZfY2xvc2Uodm9pZCk7CitleHRlcm4gdm9pZCBwczNhdl9yZWdpc3Rlcl9mbGlwX2N0bCh2b2lkICgqZmxpcF9jdGwpKGludCBvbiwgdm9pZCAqZGF0YSksCisJCQkJICAgIHZvaWQgKmZsaXBfZGF0YSk7CitleHRlcm4gdm9pZCBwczNhdl9mbGlwX2N0bChpbnQgb24pOwogCiAjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1BTM0FWX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2ZiLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2ZiLmgKaW5kZXggYWQ4MWNmNC4uM2YxMjFmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNmYi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzZmIuaApAQCAtNDEsMTYgKzQxLDQgQEAKIAlfX3UzMiBudW1fZnJhbWVzOyAvKiBudW0gb2YgZnJhbWUgYnVmZmVycyAqLwogfTsKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2lmZGVmIENPTkZJR19GQl9QUzMKLWV4dGVybiB2b2lkIHBzM2ZiX2ZsaXBfY3RsKGludCBvbik7Ci1leHRlcm4gdm9pZCBwczNmYl9jbGVhbnVwKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwczNmYl9mbGlwX2N0bChpbnQgb24pIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcHMzZmJfY2xlYW51cCh2b2lkKSB7fQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfUFMzRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzc3Rvci5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNzdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYWY3MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzc3Rvci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBQUzMgU3RvcmFnZSBEZXZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BPV0VSUENfUFMzU1RPUl9IXworI2RlZmluZSBfQVNNX1BPV0VSUENfUFMzU1RPUl9IXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vcHMzLmg+CisKKworc3RydWN0IHBzM19zdG9yYWdlX3JlZ2lvbiB7CisJdW5zaWduZWQgaW50IGlkOworCXU2NCBzdGFydDsKKwl1NjQgc2l6ZTsKK307CisKK3N0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgeworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2Ugc2JkOworCisJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRtYV9yZWdpb247CisJdW5zaWduZWQgaW50IGlycTsKKwl1NjQgYmxrX3NpemU7CisKKwl1NjQgdGFnOworCXU2NCBsdjFfc3RhdHVzOworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CisKKwl1bnNpZ25lZCBsb25nIGJvdW5jZV9zaXplOworCXZvaWQgKmJvdW5jZV9idWY7CisJdTY0IGJvdW5jZV9scGFyOworCWRtYV9hZGRyX3QgYm91bmNlX2RtYTsKKworCXVuc2lnbmVkIGludCBudW1fcmVnaW9uczsKKwl1bnNpZ25lZCBsb25nIGFjY2Vzc2libGVfcmVnaW9uczsKKwl1bnNpZ25lZCBpbnQgcmVnaW9uX2lkeDsJCS8qIGZpcnN0IGFjY2Vzc2libGUgcmVnaW9uICovCisJc3RydWN0IHBzM19zdG9yYWdlX3JlZ2lvbiByZWdpb25zWzBdOwkvKiBNdXN0IGJlIGxhc3QgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqdG9fcHMzX3N0b3JhZ2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSwgc2JkLmNvcmUpOworfQorCitleHRlcm4gaW50IHBzM3N0b3Jfc2V0dXAoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2LAorCQkJIGlycV9oYW5kbGVyX3QgaGFuZGxlcik7CitleHRlcm4gdm9pZCBwczNzdG9yX3RlYXJkb3duKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldik7CitleHRlcm4gdTY0IHBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwgdTY0IGxwYXIsCisJCQkJICAgICAgdTY0IHN0YXJ0X3NlY3RvciwgdTY0IHNlY3RvcnMsCisJCQkJICAgICAgaW50IHdyaXRlKTsKK2V4dGVybiB1NjQgcHMzc3Rvcl9zZW5kX2NvbW1hbmQoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2LCB1NjQgY21kLAorCQkJCXU2NCBhcmcxLCB1NjQgYXJnMiwgdTY0IGFyZzMsIHU2NCBhcmc0KTsKKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19QUzNTVE9SX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaAppbmRleCA0YWQ3N2ExLi4xM2ZjY2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmgKQEAgLTkyLDYgKzkyLDExIEBACiAJCXNldF90aHJlYWRfZmxhZyhUSUZfTk9FUlJPUik7IFwKIAl9IHdoaWxlKDApCiAKK3N0cnVjdCB0YXNrX3N0cnVjdDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHB0cmFjZV9nZXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vKTsKK2V4dGVybiBpbnQgcHRyYWNlX3B1dF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8sCisJCQkgIHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKIC8qCiAgKiBXZSB1c2UgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgdHJhcCBmaWVsZCB0byBpbmRpY2F0ZQogICogd2hldGhlciB3ZSBoYXZlIHNhdmVkIHRoZSBmdWxsIHNldCBvZiByZWdpc3RlcnMsIG9yIG9ubHkgYQpAQCAtMTU4LDkgKzE2Myw3IEBACiAKICNkZWZpbmUgUFRfTklQCTMyCiAjZGVmaW5lIFBUX01TUgkzMwotI2lmZGVmIF9fS0VSTkVMX18KICNkZWZpbmUgUFRfT1JJR19SMyAzNAotI2VuZGlmCiAjZGVmaW5lIFBUX0NUUgkzNQogI2RlZmluZSBQVF9MTksJMzYKICNkZWZpbmUgUFRfWEVSCTM3CkBAIC0xNjksMTEgKzE3MiwxMiBAQAogI2RlZmluZSBQVF9NUQkzOQogI2Vsc2UKICNkZWZpbmUgUFRfU09GVEUgMzkKKyNlbmRpZgogI2RlZmluZSBQVF9UUkFQCTQwCiAjZGVmaW5lIFBUX0RBUgk0MQogI2RlZmluZSBQVF9EU0lTUiA0MgogI2RlZmluZSBQVF9SRVNVTFQgNDMKLSNlbmRpZgorI2RlZmluZSBQVF9SRUdTX0NPVU5UIDQ0CiAKICNkZWZpbmUgUFRfRlBSMAk0OAkvKiBlYWNoIEZQIHJlZyBvY2N1cGllcyAyIHNsb3RzIGluIHRoaXMgc3BhY2UgKi8KIApAQCAtMjI5LDcgKzIzMywxNyBAQAogI2RlZmluZSBQVFJBQ0VfR0VUX0RFQlVHUkVHCTI1CiAjZGVmaW5lIFBUUkFDRV9TRVRfREVCVUdSRUcJMjYKIAotLyogQWRkaXRpb25hbCBQVFJBQ0UgcmVxdWVzdHMgaW1wbGVtZW50ZWQgb24gUG93ZXJQQy4gKi8KKy8qIChuZXcpIFBUUkFDRSByZXF1ZXN0cyB1c2luZyB0aGUgc2FtZSBudW1iZXJzIGFzIHg4NiBhbmQgdGhlIHNhbWUKKyAqIGFyZ3VtZW50IG9yZGVyaW5nLiBBZGRpdGlvbmFsbHksIHRoZXkgc3VwcG9ydCBtb3JlIHJlZ2lzdGVycyB0b28KKyAqLworI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKKyNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUyAgICAgICAgICAxNAorI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTICAgICAgICAgIDE1CisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTNjQJICAyMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUzY0CSAgMjMKKworLyogKG9sZCkgUFRSQUNFIHJlcXVlc3RzIHdpdGggaW52ZXJ0ZWQgYXJndW1lbnRzICovCiAjZGVmaW5lIFBQQ19QVFJBQ0VfR0VUUkVHUwkweDk5CS8qIEdldCBHUFJzIDAgLSAzMSAqLwogI2RlZmluZSBQUENfUFRSQUNFX1NFVFJFR1MJMHg5OAkvKiBTZXQgR1BScyAwIC0gMzEgKi8KICNkZWZpbmUgUFBDX1BUUkFDRV9HRVRGUFJFR1MJMHg5NwkvKiBHZXQgRlBScyAwIC0gMzEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCmluZGV4IDc0OWM3ZjkuLjI4MTAxMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaApAQCAtNDUzLDYgKzQ1Myw4IEBACiAjZGVmaW5lIFNQUk5fTU1DUkEJMHgzMTIKICNkZWZpbmUgICBNTUNSQV9TSUhWCTB4MTAwMDAwMDBVTCAvKiBzdGF0ZSBvZiBNU1IgSFYgd2hlbiBTSUFSIHNldCAqLwogI2RlZmluZSAgIE1NQ1JBX1NJUFIJMHgwODAwMDAwMFVMIC8qIHN0YXRlIG9mIE1TUiBQUiB3aGVuIFNJQVIgc2V0ICovCisjZGVmaW5lICAgTU1DUkFfU0xPVAkweDA3MDAwMDAwVUwgLyogU0xPVCBiaXRzICgzNy0zOSkgKi8KKyNkZWZpbmUgICBNTUNSQV9TTE9UX1NISUZUCTI0CiAjZGVmaW5lICAgTU1DUkFfU0FNUExFX0VOQUJMRSAweDAwMDAwMDAxVUwgLyogZW5hYmxlIHNhbXBsaW5nICovCiAjZGVmaW5lICAgUE9XRVI2X01NQ1JBX1NJSFYgICAweDAwMDAwNDAwMDAwMDAwMDBVTEwKICNkZWZpbmUgICBQT1dFUjZfTU1DUkFfU0lQUiAgIDB4MDAwMDAyMDAwMDAwMDAwMFVMTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKaW5kZXggMzFkNTA1NC4uZWVkYzgyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oCkBAIC0xMDYsNiArMTA2LDE0IEBACiBzdHJ1Y3Qgc3B1X3J1bnF1ZXVlOwogc3RydWN0IGRldmljZV9ub2RlOwogCitlbnVtIHNwdV91dGlsaXphdGlvbl9zdGF0ZSB7CisJU1BVX1VUSUxfU1lTVEVNLAorCVNQVV9VVElMX1VTRVIsCisJU1BVX1VUSUxfSU9XQUlULAorCVNQVV9VVElMX0lETEUsCisJU1BVX1VUSUxfTUFYCit9OworCiBzdHJ1Y3Qgc3B1IHsKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGxvbmcgbG9jYWxfc3RvcmVfcGh5czsKQEAgLTE1Niw2ICsxNjQsMjEgQEAKIAl1NjQgc2hhZG93X2ludF9tYXNrX1JXWzNdOwogCiAJc3RydWN0IHN5c19kZXZpY2Ugc3lzZGV2OworCisJc3RydWN0IHsKKwkJLyogcHJvdGVjdGVkIGJ5IGludGVycnVwdCByZWVudHJhbmN5ICovCisJCWVudW0gc3B1X3V0aWxpemF0aW9uX3N0YXRlIHV0aWxpemF0aW9uX3N0YXRlOworCQl1bnNpZ25lZCBsb25nIHRzdGFtcDsJCS8qIHRpbWUgb2YgbGFzdCBjdHggc3dpdGNoICovCisJCXVuc2lnbmVkIGxvbmcgdGltZXNbU1BVX1VUSUxfTUFYXTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHZvbF9jdHhfc3dpdGNoOworCQl1bnNpZ25lZCBsb25nIGxvbmcgaW52b2xfY3R4X3N3aXRjaDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIG1pbl9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBtYWpfZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgaGFzaF9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGJfZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgY2xhc3MyX2ludHI7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBsaWJhc3Npc3Q7CisJfSBzdGF0czsKIH07CiAKIHN0cnVjdCBzcHUgKnNwdV9hbGxvYyh2b2lkKTsKQEAgLTQ0OCw2ICs0NzEsNyBAQAogI2RlZmluZSBNRkNfU1RBVEUxX1BST0JMRU1fU1RBVEVfTUFTSwkJMHgwOHVsbAogI2RlZmluZSBNRkNfU1RBVEUxX1JFTE9DQVRFX01BU0sJCTB4MTB1bGwKICNkZWZpbmUgTUZDX1NUQVRFMV9NQVNURVJfUlVOX0NPTlRST0xfTUFTSwkweDIwdWxsCisjZGVmaW5lIE1GQ19TVEFURTFfVEFCTEVfU0VBUkNIX01BU0sJCTB4NDB1bGwKIAl1NjQgbWZjX2xwaWRfUlc7CQkJCQkvKiAweDAwOCAqLwogCXU2NCBzcHVfaWRyX1JXOwkJCQkJCS8qIDB4MDEwICovCiAJdTY0IG1mY192cl9STzsJCQkJCQkvKiAweDAxOCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXNjYWxscy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXNjYWxscy5oCmluZGV4IGMyZmU3OWQuLmIzY2E0MWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzY2FsbHMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c2NhbGxzLmgKQEAgLTQzLDE2ICs0Myw5IEBACiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcnRfc2lnc3VzcGVuZChzaWdzZXRfdCBfX3VzZXIgKnVuZXdzZXQsCiAJCXNpemVfdCBzaWdzZXRzaXplKTsKLQotI2lmbmRlZiBfX3Bvd2VycGM2NF9fCi1hc21saW5rYWdlIGxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsCi0JCXN0YWNrX3QgX191c2VyICp1b3NzLCBpbnQgcjUsIGludCByNiwgaW50IHI3LCBpbnQgcjgsCi0JCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbHNlIC8qIF9fcG93ZXJwYzY0X18gKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywKIAkJc3RhY2tfdCBfX3VzZXIgKnVvc3MsIHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsCiAJCXVuc2lnbmVkIGxvbmcgcjcsIHVuc2lnbmVkIGxvbmcgcjgsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fUE9XRVJQQ19TWVNDQUxMU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAppbmRleCAwOTYyMWY2Li4zMmFhNDJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKQEAgLTQzLDcgKzQzLDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIHNtcF9tYigpCW1iKCkKICNkZWZpbmUgc21wX3JtYigpCXJtYigpCi0jZGVmaW5lIHNtcF93bWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgc21wX3dtYigpCWVpZWlvKCkKICNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQogI2Vsc2UKICNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCkBAIC01NTksNSArNTU5LDcgQEAKIGV4dGVybiB2b2lkIGFjY291bnRfc3lzdGVtX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKICNlbmRpZgogCitleHRlcm4gc3RydWN0IGRlbnRyeSAqcG93ZXJwY19kZWJ1Z2ZzX3Jvb3Q7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmgKaW5kZXggNWU3OTE5OC4uNjY5ODE4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaApAQCAtMTUyLDYgKzE1MiwxMCBAQAogI2RlZmluZSBCMzAwMDAwMCAgMDAwMzQKICNkZWZpbmUgQjM1MDAwMDAgIDAwMDM1CiAjZGVmaW5lIEI0MDAwMDAwICAwMDAzNgorI2RlZmluZSAgIEJPVEhFUiAgMDAwMzcKKworI2RlZmluZSBDSUJBVUQJMDc3NjAwMDAwCisjZGVmaW5lIElCU0hJRlQJMTYJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCiAKICNkZWZpbmUgQ1NJWkUJMDAwMDE0MDAKICNkZWZpbmUgICBDUzUJMDAwMDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaAppbmRleCAzZjMyY2E4Li45ZDlhZWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oCkBAIC0xMTMsOCArMTEzLDggQEAKICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTQJLyogdHJ1ZSBpZiBwb2xsX2lkbGUoKSBpcyBwb2xsaW5nCiAJCQkJCSAgIFRJRl9ORUVEX1JFU0NIRUQgKi8KICNkZWZpbmUgVElGXzMyQklUCQk1CS8qIDMyIGJpdCBiaW5hcnkgKi8KLSNkZWZpbmUgVElGX1JVTkxBVENICQk2CS8qIElzIHRoZSBydW5sYXRjaCBlbmFibGVkPyAqLwotI2RlZmluZSBUSUZfQUJJX1BFTkRJTkcJCTcJLyogMzIvNjQgYml0IHN3aXRjaCBuZWVkZWQgKi8KKyNkZWZpbmUgVElGX1BFUkZNT05fV09SSwk2CS8qIHdvcmsgZm9yIHBmbV9oYW5kbGVfd29yaygpICovCisjZGVmaW5lIFRJRl9QRVJGTU9OX0NUWFNXCTcJLyogcGVyZm1vbiBuZWVkcyBjdHhzdyBjYWxscyAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9BVURJVAk4CS8qIHN5c2NhbGwgYXVkaXRpbmcgYWN0aXZlICovCiAjZGVmaW5lIFRJRl9TSU5HTEVTVEVQCQk5CS8qIHNpbmdsZXN0ZXBwaW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkxMApAQCAtMTIzLDYgKzEyMyw4IEBACiAjZGVmaW5lIFRJRl9OT0VSUk9SCQkxNAkvKiBGb3JjZSBzdWNjZXNzZnVsIHN5c2NhbGwgcmV0dXJuICovCiAjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJMTUJLyogUmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwgKi8KICNkZWZpbmUgVElGX0ZSRUVaRQkJMTYJLyogRnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KKyNkZWZpbmUgVElGX1JVTkxBVENICQkxNwkvKiBJcyB0aGUgcnVubGF0Y2ggZW5hYmxlZD8gKi8KKyNkZWZpbmUgVElGX0FCSV9QRU5ESU5HCQkxOAkvKiAzMi82NCBiaXQgc3dpdGNoIG5lZWRlZCAqLwogCiAvKiBhcyBhYm92ZSwgYnV0IGFzIGJpdCB2YWx1ZXMgKi8KICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKQEAgLTEzMSw4ICsxMzMsOCBAQAogI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMTw8VElGX1BPTExJTkdfTlJGTEFHKQogI2RlZmluZSBfVElGXzMyQklUCQkoMTw8VElGXzMyQklUKQotI2RlZmluZSBfVElGX1JVTkxBVENICQkoMTw8VElGX1JVTkxBVENIKQotI2RlZmluZSBfVElGX0FCSV9QRU5ESU5HCSgxPDxUSUZfQUJJX1BFTkRJTkcpCisjZGVmaW5lIF9USUZfUEVSRk1PTl9XT1JLCSgxPDxUSUZfUEVSRk1PTl9XT1JLKQorI2RlZmluZSBfVElGX1BFUkZNT05fQ1RYU1cJKDE8PFRJRl9QRVJGTU9OX0NUWFNXKQogI2RlZmluZSBfVElGX1NZU0NBTExfQVVESVQJKDE8PFRJRl9TWVNDQUxMX0FVRElUKQogI2RlZmluZSBfVElGX1NJTkdMRVNURVAJCSgxPDxUSUZfU0lOR0xFU1RFUCkKICNkZWZpbmUgX1RJRl9TRUNDT01QCQkoMTw8VElGX1NFQ0NPTVApCkBAIC0xNDAsNiArMTQyLDggQEAKICNkZWZpbmUgX1RJRl9OT0VSUk9SCQkoMTw8VElGX05PRVJST1IpCiAjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogI2RlZmluZSBfVElGX0ZSRUVaRQkJKDE8PFRJRl9GUkVFWkUpCisjZGVmaW5lIF9USUZfUlVOTEFUQ0gJCSgxPDxUSUZfUlVOTEFUQ0gpCisjZGVmaW5lIF9USUZfQUJJX1BFTkRJTkcJKDE8PFRJRl9BQklfUEVORElORykKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RfT1JfQQkoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NFQ0NPTVApCiAKICNkZWZpbmUgX1RJRl9VU0VSX1dPUktfTUFTSwkoX1RJRl9OT1RJRllfUkVTVU1FIHwgX1RJRl9TSUdQRU5ESU5HIHwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaAppbmRleCAzZmQ1N2MwLi5kN2Y1ZGRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaApAQCAtMjMyLDcgKzIzMiw3IEBACiAjZGVmaW5lIGFjY291bnRfcHJvY2Vzc192dGltZSh0c2spCQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcpICYmIGRlZmluZWQoQ09ORklHX1BQQ19TUExQQVIpCisjaWYgZGVmaW5lZChDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORykKIGV4dGVybiB2b2lkIGNhbGN1bGF0ZV9zdGVhbF90aW1lKHZvaWQpOwogZXh0ZXJuIHZvaWQgc25hcHNob3RfdGltZWJhc2VzKHZvaWQpOwogI2Vsc2UKQEAgLTI0MCw1ICsyNDAsNyBAQAogI2RlZmluZSBzbmFwc2hvdF90aW1lYmFzZXMoKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCitleHRlcm4gdm9pZCBpU2VyaWVzX3RpbWVfaW5pdF9lYXJseSh2b2lkKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX1BPV0VSUENfVElNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYmZsdXNoLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYmZsdXNoLmgKaW5kZXggODZlNjI2Ni4uOTlhMDQzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiZmx1c2guaApAQCAtMTU1LDYgKzE1NSwxMSBAQAogewogfQogCisvKiBQcml2YXRlIGZ1bmN0aW9uIGZvciB1c2UgYnkgUENJIElPIG1hcHBpbmcgY29kZSAqLworZXh0ZXJuIHZvaWQgX19mbHVzaF9oYXNoX3RhYmxlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpOworCisKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmgKaW5kZXggOWQwY2U5Zi4uYzE1OTMxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcGd0YWJsZS5oCkBAIC01MzMsOSArNTMzLDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQpAQCAtNTQzLDIxICs1NDEsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfdW5jYWNoZShwdGVfdCBwdGUpICAgICAgIHsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX05PX0NBQ0hFOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NhY2hlKHB0ZV90IHB0ZSkgICAgICAgICB7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfTk9fQ0FDSEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JXIHwgX1BBR0VfSFdXUklURSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfRElSVFkgfCBfUEFHRV9IV1dSSVRFKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUiB8IF9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JXOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkgewpAQCAtNjY0LDEzICs2NTQsNiBAQAogI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCkgXAogCV9fcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZygoX192bWEpLT52bV9tbS0+Y29udGV4dC5pZCwgX19hZGRyLCBfX3B0ZXApCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcmV0dXJuIChwdGVfdXBkYXRlKHB0ZXAsIChfUEFHRV9ESVJUWSB8IF9QQUdFX0hXV1JJVEUpLCAwKSAmIF9QQUdFX0RJUlRZKSAhPSAwOwotfQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkgICAgICAgcHRlX3QgKnB0ZXApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaAppbmRleCAyOTZmNGYxLi43ZjRhZDYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY29tcGF0LmgKQEAgLTYwLDggKzYwLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CQljb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAkJY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1zMzkwL2RtYS1tYXBwaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGMxMmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyoKLSAqICBpbmNsdWRlL2FzbS1zMzkwL2RtYS1tYXBwaW5nLmgKLSAqCi0gKiAgUzM5MCB2ZXJzaW9uCi0gKgotICogIFRoaXMgZmlsZSBleGlzdHMgc28gdGhhdCAjaW5jbHVkZSA8ZG1hLW1hcHBpbmcuaD4gZG9lc24ndCBicmVhayBhbnl0aGluZy4KLSAqLwotCi0jaWZuZGVmIF9BU01fRE1BX01BUFBJTkdfSAotI2RlZmluZSBfQVNNX0RNQV9NQVBQSU5HX0gKLQotI2VuZGlmIC8qIF9BU01fRE1BX01BUFBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9mYi5oIGIvaW5jbHVkZS9hc20tczM5MC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oIGIvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKaW5kZXggMDVlYTZmMS4uZjMyNjQ1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKQEAgLTY0LDcgKzY0LDggQEAKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykJY2xlYXJfcGFnZShwYWdlKQogI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0bywgZnJvbSwgdmFkZHIsIHBnKQljb3B5X3BhZ2UodG8sIGZyb20pCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaAppbmRleCAwYTMwN2JiMi4uMzIwOGRjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKQEAgLTUzMCwxNCArNTMwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQotewotCS8qIEFsbCBwYWdlcyBhcmUgcmVhZGFibGUgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoZSBmZXRjaAotCSAqIHByb3RlY3Rpb24gYml0IGluIHRoZSBzdG9yYWdlIGtleS4KLQkgKi8KLQlyZXR1cm4gMTsKLX0KLQogLyoKICAqIHBnZC9wbWQvcHRlIG1vZGlmaWNhdGlvbiBmdW5jdGlvbnMKICAqLwpAQCAtNjc3LDE5ICs2NjksNiBAQAogCXJldHVybiBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKLXsKLQkvKiBObyBuZWVkIHRvIGZsdXNoIFRMQjsgYml0cyBhcmUgaW4gc3RvcmFnZSBrZXkgKi8KLQlyZXR1cm4gcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSh2bWEsIGFkZHJlc3MsIHB0ZXApOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlwdGVfdCBwdGUgPSAqcHRlcDsKQEAgLTcxNSwxNiArNjk0LDE5IEBACiAJcHRlX3ZhbCgqcHRlcCkgPSBfUEFHRV9UWVBFX0VNUFRZOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90Ci1wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX2ludmFsaWRhdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3sKKwlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKKwlwdGVwID0gZ2V0X3NoYWRvd19wdGUocHRlcCk7CisJaWYgKHB0ZXApCisJCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfY2xlYXJfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQogewogCXB0ZV90IHB0ZSA9ICpwdGVwOwotCXB0ZV90ICpzaGFkb3dfcHRlID0gZ2V0X3NoYWRvd19wdGUocHRlcCk7Ci0KLQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKLQlpZiAoc2hhZG93X3B0ZSkKLQkJX19wdGVwX2lwdGUoYWRkcmVzcywgc2hhZG93X3B0ZSk7CisJcHRlcF9pbnZhbGlkYXRlKGFkZHJlc3MsIHB0ZXApOwogCXJldHVybiBwdGU7CiB9CiAKQEAgLTczNCwyMSArNzE2LDE0IEBACiAJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlX3dycHJvdGVjdChvbGRfcHRlKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcHRlcF9lc3RhYmxpc2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIAotCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwLAotCSAgICAgICBwdGVfdCBlbnRyeSkKLXsKLQlwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHRlcCk7Ci0Jc2V0X3B0ZShwdGVwLCBlbnRyeSk7Ci19Ci0KLSNkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSwgX19kaXJ0eSkgXAotKHsJCQkJCQkJCQkgIFwKLQlpbnQgX19jaGFuZ2VkID0gIXB0ZV9zYW1lKCooX19wdGVwKSwgX19lbnRyeSk7CQkJICBcCi0JaWYgKF9fY2hhbmdlZCkJCQkJCQkJICBcCi0JCXB0ZXBfZXN0YWJsaXNoKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSk7CSAgXAotCV9fY2hhbmdlZDsJCQkJCQkJICBcCisjZGVmaW5lIHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnksIF9fZGlydHkpCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX2NoYW5nZWQgPSAhcHRlX3NhbWUoKihfX3B0ZXApLCBfX2VudHJ5KTsJCQlcCisJaWYgKF9fY2hhbmdlZCkgewkJCQkJCVwKKwkJcHRlcF9pbnZhbGlkYXRlKF9fYWRkciwgX19wdGVwKTsJCQlcCisJCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIF9fYWRkciwgX19wdGVwLCBfX2VudHJ5KTsJXAorCX0JCQkJCQkJCVwKKwlfX2NoYW5nZWQ7CQkJCQkJCVwKIH0pCiAKIC8qCkBAIC05NDgsMTIgKzkyMyw5IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX01FTU1BUF9JTklUCiBleHRlcm4gdm9pZCBtZW1tYXBfaW5pdCh1bnNpZ25lZCBsb25nLCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfRVNUQUJMSVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX0FDQ0VTU19GTEFHUwogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfWU9VTkdfRkxVU0gKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0RJUlRZX0ZMVVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0ZMVVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYnVncy5oIGIvaW5jbHVkZS9hc20tc2gvYnVncy5oCmluZGV4IDVhMTE3ZWMuLmFlZWU4ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9idWdzLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAljdXJyZW50X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKIAogCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS50eXBlKSB7Ci0JY2FzZSBDUFVfU0g3NjA0IC4uLiBDUFVfU0g3NjE5OgorCWNhc2UgQ1BVX1NINzYxOToKIAkJKnArKyA9ICcyJzsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfU0g3MjA2OgpAQCAtMzUsNyArMzUsNyBAQAogCWNhc2UgQ1BVX1NINzc1MCAuLi4gQ1BVX1NINF81MDE6CiAJCSpwKysgPSAnNCc7CiAJCWJyZWFrOwotCWNhc2UgQ1BVX1NINzc3MCAuLi4gQ1BVX1NINzc4NToKKwljYXNlIENQVV9TSDc3NzAgLi4uIENQVV9TSFgzOgogCQkqcCsrID0gJzQnOwogCQkqcCsrID0gJ2EnOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jYWNoZS5oCmluZGV4IDlhM2NiNmIuLjdhMTg2NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY2FjaGUuaApAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgX19BU01fU0hfQ0FDSEVfSAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vY3B1L2NhY2hlLmg+CiAKICNkZWZpbmUgU0hfQ0FDSEVfVkFMSUQJCTEKQEAgLTQ4LDYgKzQ5LDkgQEAKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OworCitpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKTsKKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9TSF9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmgKaW5kZXggMjBiOTc5Ni4uZjAyYmE3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGUuaApAQCAtMTIsMjMgKzEyLDcgQEAKIAogI2RlZmluZSBMMV9DQUNIRV9TSElGVAk0CiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0jZGVmaW5lIENDUgkJMHhmZmZmZmU5MgkvKiBBZGRyZXNzIG9mIENhY2hlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBDQ1JfQ0FDSEVfQ0UJMHgwMQkvKiBDYWNoZSBlbmFibGUgKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFX0lECTB4MDIJLyogSW5zdHJ1Y3Rpb24gUmVwbGFjZW1lbnQgZGlzYWJsZSAqLwotI2RlZmluZSBDQ1JfQ0FDSEVfT0QJMHgwNAkvKiBEYXRhIFJlcGxhY2VtZW50IGRpc2FibGUgKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFX1RXCTB4MDgJLyogVHdvLXdheSBtb2RlICovCi0jZGVmaW5lIENDUl9DQUNIRV9DUAkweDEwCS8qIENhY2hlIHB1cmdlICovCi0KLSNkZWZpbmUgQ0FDSEVfT0NfQUREUkVTU19BUlJBWQkweDYwMDAwMDAwCi0KLSNkZWZpbmUgQ0NSX0NBQ0hFX0VOQUJMRQlDQ1JfQ0FDSEVfQ0UKLSNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJQ0NSX0NBQ0hFX0NQCi0jZGVmaW5lIENDUl9DQUNIRV9PUkEJCUNDUl9DQUNIRV9UVwotI2RlZmluZSBDQ1JfQ0FDSEVfV1QJCTB4MDAJLyogU0gtMiBpcyBfYWx3YXlzXyB3cml0ZS10aHJvdWdoICovCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCiAjZGVmaW5lIENDUjEJCTB4ZmZmZmZmZWMKICNkZWZpbmUgQ0NSCQlDQ1IxCiAKQEAgLTQ5LDUgKzMzLDUgQEAKICNkZWZpbmUgQ0NSX0NBQ0hFX0VOQUJMRQlDQ1JfQ0FDSEVfQ0UKICNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJQ0NSX0NBQ0hFX0NGCiAjZW5kaWYKLSNlbmRpZiAvKiBfX0FTTV9DUFVfU0gyX0NBQ0hFX0ggKi8KIAorI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDJfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oCmluZGV4IGIyMzk0Y2YuLjQ5MjhiMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3RpbWVyLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCi0jZGVmaW5lIFRNVV9UU1RSCTB4YTQxMmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCTB4YTQxMmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIAogI2RlZmluZSBUTVUwX1RDT1IJMHhhNDEyZmU5NAkvKiBMb25nIGFjY2VzcyAqLwogI2RlZmluZSBUTVUwX1RDTlQJMHhhNDEyZmU5OAkvKiBMb25nIGFjY2VzcyAqLwpAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBUTVUyX1RDUgkweGE0MTJmZWI0CS8qIFdvcmQgYWNjZXNzICovCiAKICNlbHNlCi0jZGVmaW5lIFRNVV9UU1RSCTB4ZmZmZmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCTB4ZmZmZmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIAogI2RlZmluZSBUTVUwX1RDT1IJMHhmZmZmZmU5NAkvKiBMb25nIGFjY2VzcyAqLwogI2RlZmluZSBUTVUwX1RDTlQJMHhmZmZmZmU5OAkvKiBMb25nIGFjY2VzcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9mcmVxLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAppbmRleCAzOWY0MWZjLi4wMjYwMjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaApAQCAtMjIsNiArMjIsOCBAQAogI2RlZmluZSBGUlFDUjAJCQkweGZmYzgwMDAwCiAjZGVmaW5lIEZSUUNSMQkJCTB4ZmZjODAwMDQKICNkZWZpbmUgRlJRTVIxCQkJMHhmZmM4MDAxNAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKKyNkZWZpbmUgRlJRQ1IJCQkweGZmYzAwMDE0CiAjZWxzZQogI2RlZmluZSBGUlFDUgkJCTB4ZmZjMDAwMDAKICNkZWZpbmUgRlJRQ1JfUFNUQlkJCTB4MDIwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oCmluZGV4IDhhNGFmMTIuLmQxZTc5NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3RpbWVyLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IExpbmVvIFNvbHV0aW9ucywgSW5jLiAKKyAqIENvcHlyaWdodCAoQykgMjAwNCBMaW5lbyBTb2x1dGlvbnMsIEluYy4KICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtMTYsMzYgKzE2LDQ1IEBACiAgKglTSDc3NTBTL1NINzc1MFIKICAqCVNINzc1MS9TSDc3NTFSCiAgKglTSDc3NjAKKyAqCVNILVgzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotCi0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKLSNkZWZpbmUgVE1VX1RPQ1IgICAgICAgIDB4ZmZkODAwMDAgICAgICAvKiBCeXRlIGFjY2VzcyAqLworI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzCisjZGVmaW5lIFRNVV8wMTJfQkFTRQkweGZmYzEwMDAwCisjZGVmaW5lIFRNVV8zNDVfQkFTRQkweGZmYzIwMDAwCisjZWxzZQorI2RlZmluZSBUTVVfMDEyX0JBU0UJMHhmZmQ4MDAwMAorI2RlZmluZSBUTVVfMzQ1X0JBU0UJMHhmZTEwMDAwMAogI2VuZGlmCi0jZGVmaW5lIFRNVV9UU1RSICAgICAgICAweGZmZDgwMDA0ICAgICAgLyogQnl0ZSBhY2Nlc3MgKi8KIAotI2RlZmluZSBUTVUwX1RDT1IgICAgICAgMHhmZmQ4MDAwOCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENOVCAgICAgICAweGZmZDgwMDBjICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMF9UQ1IgICAgICAgIDB4ZmZkODAwMTAgICAgICAvKiBXb3JkIGFjY2VzcyAqLworI2RlZmluZSBUTVVfVE9DUglUTVVfMDEyX0JBU0UJLyogTm90IHN1cHBvcnRlZCBvbiBhbGwgQ1BVcyAqLwogCi0jZGVmaW5lIFRNVTFfVENPUiAgICAgICAweGZmZDgwMDE0ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMV9UQ05UICAgICAgIDB4ZmZkODAwMTggICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDUiAgICAgICAgMHhmZmQ4MDAxYyAgICAgIC8qIFdvcmQgYWNjZXNzICovCisjZGVmaW5lIFRNVV8wMTJfVFNUUgkoVE1VXzAxMl9CQVNFICsgMHgwNCkKKyNkZWZpbmUgVE1VXzM0NV9UU1RSCShUTVVfMzQ1X0JBU0UgKyAweDA0KQogCi0jZGVmaW5lIFRNVTJfVENPUiAgICAgICAweGZmZDgwMDIwICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ05UICAgICAgIDB4ZmZkODAwMjQgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUyX1RDUiAgICAgICAgMHhmZmQ4MDAyOCAgICAgIC8qIFdvcmQgYWNjZXNzICovCi0jZGVmaW5lIFRNVTJfVENQUgkweGZmZDgwMDJjCS8qIExvbmcgYWNjZXNzICovCisjZGVmaW5lIFRNVTBfVENPUgkoVE1VXzAxMl9CQVNFICsgMHgwOCkKKyNkZWZpbmUgVE1VMF9UQ05UCShUTVVfMDEyX0JBU0UgKyAweDBjKQorI2RlZmluZSBUTVUwX1RDUgkoVE1VXzAxMl9CQVNFICsgMHgxMCkKIAotI2lmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCi0jZGVmaW5lIFRNVTNfVENPUiAgICAgICAweGZlMTAwMDA4ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VM19UQ05UICAgICAgIDB4ZmUxMDAwMGMgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUzX1RDUiAgICAgICAgMHhmZTEwMDAxMCAgICAgIC8qIFdvcmQgYWNjZXNzICovCisjZGVmaW5lIFRNVTFfVENPUiAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgxNCkKKyNkZWZpbmUgVE1VMV9UQ05UICAgICAgIChUTVVfMDEyX0JBU0UgKyAweDE4KQorI2RlZmluZSBUTVUxX1RDUiAgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MWMpCiAKLSNkZWZpbmUgVE1VNF9UQ09SICAgICAgIDB4ZmUxMDAwMTQgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVU0X1RDTlQgICAgICAgMHhmZTEwMDAxOCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTRfVENSICAgICAgICAweGZlMTAwMDFjICAgICAgLyogV29yZCBhY2Nlc3MgKi8KLSNlbmRpZgorI2RlZmluZSBUTVUyX1RDT1IgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MjApCisjZGVmaW5lIFRNVTJfVENOVCAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgyNCkKKyNkZWZpbmUgVE1VMl9UQ1IJKFRNVV8wMTJfQkFTRSArIDB4MjgpCisjZGVmaW5lIFRNVTJfVENQUgkoVE1VXzAxMl9CQVNFICsgMHgyYykKKworI2RlZmluZSBUTVUzX1RDT1IJKFRNVV8zNDVfQkFTRSArIDB4MDgpCisjZGVmaW5lIFRNVTNfVENOVAkoVE1VXzM0NV9CQVNFICsgMHgwYykKKyNkZWZpbmUgVE1VM19UQ1IJKFRNVV8zNDVfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgVE1VNF9UQ09SCShUTVVfMzQ1X0JBU0UgKyAweDE0KQorI2RlZmluZSBUTVU0X1RDTlQJKFRNVV8zNDVfQkFTRSArIDB4MTgpCisjZGVmaW5lIFRNVTRfVENSCShUTVVfMzQ1X0JBU0UgKyAweDFjKQorCisjZGVmaW5lIFRNVTVfVENPUgkoVE1VXzM0NV9CQVNFICsgMHgyMCkKKyNkZWZpbmUgVE1VNV9UQ05UCShUTVVfMzQ1X0JBU0UgKyAweDI0KQorI2RlZmluZSBUTVU1X1RDUgkoVE1VXzM0NV9CQVNFICsgMHgyOCkKIAogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfVElNRVJfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mYi5oIGIvaW5jbHVkZS9hc20tc2gvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJlOTljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZnV0ZXgtaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9mdXRleC1pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYxNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXgtaXJxLmgKQEAgLTAsMCArMSwxMTEgQEAKKyNpZm5kZWYgX19BU01fU0hfRlVURVhfSVJRX0gKKyNkZWZpbmUgX19BU01fU0hfRlVURVhfSVJRX0gKKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfc2V0KGludCBvcGFyZywgaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCSAgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIob3BhcmcsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19mdXRleF9vcF94Y2hnX2FkZChpbnQgb3BhcmcsIGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkgICBpbnQgKm9sZHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcigqb2xkdmFsLCB1YWRkcik7CisJaWYgKCFyZXQpCisJCXJldCA9IHB1dF91c2VyKCpvbGR2YWwgKyBvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfb3IoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICBpbnQgKm9sZHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcigqb2xkdmFsLCB1YWRkcik7CisJaWYgKCFyZXQpCisJCXJldCA9IHB1dF91c2VyKCpvbGR2YWwgfCBvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfYW5kKGludCBvcGFyZywgaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCSAgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKm9sZHZhbCAmIG9wYXJnLCB1YWRkcik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ194b3IoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICAgaW50ICpvbGR2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIoKm9sZHZhbCwgdWFkZHIpOworCWlmICghcmV0KQorCQlyZXQgPSBwdXRfdXNlcigqb2xkdmFsIF4gb3BhcmcsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19mdXRleF9vcF9jbXB4Y2hnX2luYXRvbWljKGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkJICAgaW50IG9sZHZhbCwgaW50IG5ld3ZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQsIHByZXYgPSAwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIocHJldiwgdWFkZHIpOworCWlmICghcmV0ICYmIG9sZHZhbCA9PSBwcmV2KQorCQlyZXQgPSBwdXRfdXNlcihuZXd2YWwsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcHJldjsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NIX0ZVVEVYX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mdXRleC5oIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXguaAppbmRleCA2YTMzMmE5Li43NGVkMzY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmgKQEAgLTEsNiArMSw3NyBAQAotI2lmbmRlZiBfQVNNX0ZVVEVYX0gKLSNkZWZpbmUgX0FTTV9GVVRFWF9ICisjaWZuZGVmIF9fQVNNX1NIX0ZVVEVYX0gKKyNkZWZpbmUgX19BU01fU0hfRlVURVhfSAogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KKyNpZmRlZiBfX0tFUk5FTF9fCiAKLSNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogWFhYOiBVUCB2YXJpYW50cywgZml4IGZvciBTSC00QSBhbmQgU01QLi4gKi8KKyNpbmNsdWRlIDxhc20vZnV0ZXgtaXJxLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGZ1dGV4X2F0b21pY19vcF9pbnVzZXIoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldDsKKworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJCXJldCA9IGF0b21pY19mdXRleF9vcF94Y2hnX3NldChvcGFyZywgdWFkZHIsICZvbGR2YWwpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX0FERDoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfYWRkKG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfT1I6CisJCXJldCA9IGF0b21pY19mdXRleF9vcF94Y2hnX29yKG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQU5ETjoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfYW5kKH5vcGFyZywgdWFkZHIsICZvbGR2YWwpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX1hPUjoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfeG9yKG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKGludCBfX3VzZXIgKnVhZGRyLCBpbnQgb2xkdmFsLCBpbnQgbmV3dmFsKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gYXRvbWljX2Z1dGV4X29wX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIG9sZHZhbCwgbmV3dmFsKTsKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FTTV9TSF9GVVRFWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9oZDY0NDYxLmggYi9pbmNsdWRlL2FzbS1zaC9oZDY0NDYxLmgKaW5kZXggMjdlNWMzNC4uNGRkODU5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaGQ2NDQ2MS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEuaApAQCAtMSwyMDAgKzEsMjQxIEBACiAjaWZuZGVmIF9fQVNNX1NIX0hENjQ0NjEKICNkZWZpbmUgX19BU01fU0hfSEQ2NDQ2MQogLyoKLSAqCSRJZDogaGQ2NDQ2MS5oLHYgMS41IDIwMDQvMDMvMTYgMDA6MDc6NTEgbGV0aGFsIEV4cCAkCisgKglDb3B5cmlnaHQgKEMpIDIwMDcgS3Jpc3RvZmZlciBFcmljc29uIDxLcmlzdG9mZmVyLkVyaWNzb25AZ21haWwuY29tPgorICoJQ29weXJpZ2h0IChDKSAyMDA0IFBhdWwgTXVuZHQKICAqCUNvcHlyaWdodCAoQykgMjAwMCBZQUVHQVNISSBUYWtlc2hpCi0gKglIaXRhY2hpIEhENjQ0NjEgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAorICoKKyAqCQlIaXRhY2hpIEhENjQ0NjEgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAorICoJKHBsZWFzZSBub3RlIG1hbnVhbCByZWZlcmVuY2UgMHgxMDAwMDAwMCA9IDB4YjAwMDAwMDApCiAgKi8KIAogLyogQ29uc3RhbnRzIGZvciBQQ01DSUEgbWFwcGluZ3MgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NfV0lORE9XCTB4MDEwMDAwMDAKKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NfV0lORE9XCTB4MDEwMDAwMDAKIAotI2RlZmluZSBIRDY0NDYxX1BDQzBfQkFTRQkweGI4MDAwMDAwCS8qIGFyZWEgNiAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBfQVRUUgkoSEQ2NDQ2MV9QQ0MwX0JBU0UpCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9DT01NCShIRDY0NDYxX1BDQzBfQkFTRStIRDY0NDYxX1BDQ19XSU5ET1cpCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9JTwkJKEhENjQ0NjFfUENDMF9CQVNFKzIqSEQ2NDQ2MV9QQ0NfV0lORE9XKQorLyogQXJlYSA2IC0gU2xvdCAwIC0gbWVtb3J5IGFuZC9vciBJTyBjYXJkICovCisjZGVmaW5lCUhENjQ0NjFfUENDMF9CQVNFCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDgwMDAwMDApCisjZGVmaW5lCUhENjQ0NjFfUENDMF9BVFRSCShIRDY0NDYxX1BDQzBfQkFTRSkJCQkJLyogMHhiODAwMDAwMDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0NPTU0JKEhENjQ0NjFfUENDMF9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykJCS8qIDB4YjkwMDAwMDAwICovCisjZGVmaW5lCUhENjQ0NjFfUENDMF9JTwkJKEhENjQ0NjFfUENDMF9CQVNFKzIqSEQ2NDQ2MV9QQ0NfV0lORE9XKQkvKiAweGJhMDAwMDAwMCAqLwogCi0jZGVmaW5lIEhENjQ0NjFfUENDMV9CQVNFCTB4YjQwMDAwMDAJLyogYXJlYSA1ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMV9BVFRSCShIRDY0NDYxX1BDQzFfQkFTRSkKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxX0NPTU0JKEhENjQ0NjFfUENDMV9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykKKy8qIEFyZWEgNSAtIFNsb3QgMSAtIG1lbW9yeSBjYXJkIG9ubHkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxX0JBU0UJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAwMDAwMCkKKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxX0FUVFIJKEhENjQ0NjFfUENDMV9CQVNFKQkJCQkvKiAweGI0MDAwMDAwICovCisjZGVmaW5lCUhENjQ0NjFfUENDMV9DT01NCShIRDY0NDYxX1BDQzFfQkFTRStIRDY0NDYxX1BDQ19XSU5ET1cpCQkvKiAweGI1MDAwMDAwICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUgkweDEwMDAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfQ0tJT19TVEJZCQkJMHgyMDAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9JU1QJCTB4MTAwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NMQ0tFX0lTVAkJCTB4MDgwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NBRkVDS0VfT1NUCQkweDA0MDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TTENLRV9PU1QJCQkweDAyMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TTUlBU1QJCQkweDAxMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TTENEU1QJCQkweDAwODAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TUEMwU1QJCQkweDAwNDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TUEMxU1QJCQkweDAwMjAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TQUZFU1QJCQkweDAwMTAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TVE0wU1QJCQkweDAwMDgKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TVE0xU1QJCQkweDAwMDQKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TSVJTVAkJCQkweDAwMDIKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TVVJUU1QJCQkweDAwMDEKKy8qIFN0YW5kYnkgQ29udHJvbCBSZWdpc3RlciBmb3IgSEQ2NDQ2MSAqLworI2RlZmluZQlIRDY0NDYxX1NUQkNSCQkJQ09ORklHX0hENjQ0NjFfSU9CQVNFCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfQ0tJT19TVEJZCQkweDIwMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TQUZFQ0tFX0lTVAkweDEwMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TTENLRV9JU1QJCTB4MDgwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NBRkVDS0VfT1NUCTB4MDQwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NMQ0tFX09TVAkJMHgwMjAwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU01JQVNUCQkweDAxMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TTENEU1QJCTB4MDA4MAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NQQzBTVAkJMHgwMDQwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1BDMVNUCQkweDAwMjAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TQUZFU1QJCTB4MDAxMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NUTTBTVAkJMHgwMDA4CisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1RNMVNUCQkweDAwMDQKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TSVJTVAkJMHgwMDAyCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1VSVFNUCQkweDAwMDEKIAotI2RlZmluZSBIRDY0NDYxX1NZU0NSCTB4MTAwMDIKLSNkZWZpbmUgSEQ2NDQ2MV9TQ1BVQ1IJMHgxMDAwNAorLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9TWVNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MDIpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQkFSCQkweDExMDAwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0xPUgkJMHgxMTAwMgotI2RlZmluZSBIRDY0NDYxX0xDRENDUgkJMHgxMTAwNAotI2RlZmluZSBIRDY0NDYxX0xDRENDUl9TVEJBQ0sJMHgwNDAwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NUUkVRCTB4MDEwMAotI2RlZmluZSBIRDY0NDYxX0xDRENDUl9NT0ZGCTB4MDA4MAotI2RlZmluZSBIRDY0NDYxX0xDRENDUl9SRUZTRUwJMHgwMDQwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX0VQT04JMHgwMDIwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NQT04JMHgwMDEwCisvKiBDUFUgRGF0YSBCdXMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1NDUFVDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MDQpCiAKLSNkZWZpbmUJSEQ2NDQ2MV9MRFIxCQkweDExMDEwCi0jZGVmaW5lCUhENjQ0NjFfTERSMV9ET04JMHgwMQotI2RlZmluZQlIRDY0NDYxX0xEUjFfRElOVgkweDgwCisvKiBCYXNlIEFkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0xDRENCQVIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMDApCiAKLSNkZWZpbmUJSEQ2NDQ2MV9MRFIyCQkweDExMDEyCi0jZGVmaW5lCUhENjQ0NjFfTERITkNSCQkweDExMDE0Ci0jZGVmaW5lCUhENjQ0NjFfTERITlNSCQkweDExMDE2Ci0jZGVmaW5lIEhENjQ0NjFfTERWTlRSCQkweDExMDE4Ci0jZGVmaW5lIEhENjQ0NjFfTERWTkRSCQkweDExMDFhCi0jZGVmaW5lIEhENjQ0NjFfTERWU1BSCQkweDExMDFjCi0jZGVmaW5lIEhENjQ0NjFfTERSMwkJMHgxMTAxZQorLyogTGluZSBpbmNyZW1lbnQgYWRyZXNzICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0xPUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAwMikKIAotI2RlZmluZSBIRDY0NDYxX0NQVFdBUgkJMHgxMTAzMAotI2RlZmluZSBIRDY0NDYxX0NQVFdEUgkJMHgxMTAzMgotI2RlZmluZSBIRDY0NDYxX0NQVFJBUgkJMHgxMTAzNAotI2RlZmluZSBIRDY0NDYxX0NQVFJEUgkJMHgxMTAzNgorLyogQ29udHJvbHMgTENEIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMDQpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9HUkRPUgkJMHgxMTA0MAotI2RlZmluZSBIRDY0NDYxX0dSU0NSCQkweDExMDQyCi0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSCQkweDExMDQ0Ci0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSX0FDQ1NUQVRVUwkJMHgxMAotI2RlZmluZSBIRDY0NDYxX0dSQ0ZHUl9BQ0NSRVNFVAkJCTB4MDgKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBUlRfQklUQkxUCTB4MDYKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBUlRfTElORQkweDA0Ci0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSX0NPTE9SREVQVEgxNgkJMHgwMQorLyogTENDRFIgY29udHJvbCBiaXRzICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1NUQkFDSwkweDA0MDAJLyogU3RhbmRieSBCYWNrICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1NUUkVRCTB4MDEwMAkvKiBTdGFuZGJ5IFJlcXVlc3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfTU9GRgkweDAwODAJLyogTWVtb3J5IE9mZiAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUl9SRUZTRUwJMHgwMDQwCS8qIFJlZnJlc2ggU2VsZWN0ICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX0VQT04JMHgwMDIwCS8qIEVuZCBQb3dlciBPbiAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUl9TUE9OCTB4MDAxMAkvKiBTdGFydCBQb3dlciBPbiAqLwogCi0jZGVmaW5lIEhENjQ0NjFfTE5TQVJICQkweDExMDQ2Ci0jZGVmaW5lIEhENjQ0NjFfTE5TQVJMCQkweDExMDQ4Ci0jZGVmaW5lIEhENjQ0NjFfTE5BWExSCQkweDExMDRhCi0jZGVmaW5lIEhENjQ0NjFfTE5ER1IJCTB4MTEwNGMKLSNkZWZpbmUgSEQ2NDQ2MV9MTkFYUgkJMHgxMTA0ZQotI2RlZmluZSBIRDY0NDYxX0xORVJUUgkJMHgxMTA1MAotI2RlZmluZSBIRDY0NDYxX0xOTURSCQkweDExMDUyCi0jZGVmaW5lIEhENjQ0NjFfQkJUU1NBUkgJMHgxMTA1NAotI2RlZmluZSBIRDY0NDYxX0JCVFNTQVJMCTB4MTEwNTYKLSNkZWZpbmUgSEQ2NDQ2MV9CQlREU0FSSAkweDExMDU4Ci0jZGVmaW5lIEhENjQ0NjFfQkJURFNBUkwJMHgxMTA1YQotI2RlZmluZSBIRDY0NDYxX0JCVERXUgkJMHgxMTA1YwotI2RlZmluZSBIRDY0NDYxX0JCVERIUgkJMHgxMTA1ZQotI2RlZmluZSBIRDY0NDYxX0JCVFBBUkgJCTB4MTEwNjAKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRQQVJMCQkweDExMDYyCi0jZGVmaW5lIEhENjQ0NjFfQkJUTUFSSAkJMHgxMTA2NAotI2RlZmluZSBIRDY0NDYxX0JCVE1BUkwJCTB4MTEwNjYKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRST1BSCQkweDExMDY4Ci0jZGVmaW5lIEhENjQ0NjFfQkJUTURSCQkweDExMDZhCisvKiBDb250cm9scyBMQ0QgKDEpICovCisjZGVmaW5lCUhENjQ0NjFfTERSMQkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxMCkKKyNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RPTgkweDAxCS8qIERpc3BsYXkgT24gKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RJTlYJMHg4MAkvKiBEaXNwbGF5IEludmVydCAqLworCisvKiBDb250cm9scyBMQ0QgKDIpICovCisjZGVmaW5lCUhENjQ0NjFfTERSMgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxMikKKyNkZWZpbmUJSEQ2NDQ2MV9MREhOQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTQpCS8qIE51bWJlciBvZiBob3Jpem9udGFsIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MREhOU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTYpCS8qIFNwZWNpZnkgb3V0cHV0IHN0YXJ0IHBvc2l0aW9uICsgd2lkdGggb2YgQ0wxICovCisjZGVmaW5lCUhENjQ0NjFfTERWTlRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDE4KQkvKiBTcGVjaWZ5IHRvdGFsIHZlcnRpY2FsIGxpbmVzICovCisjZGVmaW5lCUhENjQ0NjFfTERWTkRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFhKQkvKiBzcGVjaWZ5IG51bWJlciBvZiBkaXNwbGF5IHZlcnRpY2FsIGxpbmVzICovCisjZGVmaW5lCUhENjQ0NjFfTERWU1BSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFjKQkvKiBzcGVjaWZ5IHZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwb3MgYW5kIEFDIG5yICovCisKKy8qIENvbnRyb2xzIExDRCAoMykgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIzCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFlKQorCisvKiBQYWxldHRlIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0NQVFdBUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzMCkJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBBZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9DUFRXRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMzIpCS8qIENvbG9yIFBhbGV0dGUgV3JpdGUgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFJBUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzNCkJLyogQ29sb3IgUGFsZXR0ZSBSZWFkIEFkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFJEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzNikJLyogQ29sb3IgUGFsZXR0ZSBSZWFkIERhdGEgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlIRDY0NDYxX0dSRE9SCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQwKQkvKiBEaXNwbGF5IFJlc29sdXRpb24gT2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfR1JTQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDIpCS8qIFNvbGlkIENvbG9yIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQ0KQkvKiBBY2NlbGVyYXRvciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBVFVTCTB4MTAJLyogQWNjZWxlcmF0b3IgU3RhdHVzICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0FDQ1JFU0VUCQkweDA4CS8qIEFjY2VsZXJhdG9yIFJlc2V0ICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0FDQ1NUQVJUX0JJVEJMVAkweDA2CS8qIEFjY2VsZXJhdG9yIFN0YXJ0IEJJVEJMVCAqLworI2RlZmluZQlIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFSVF9MSU5FCTB4MDQJLyogQWNjZWxlcmF0b3IgU3RhcnQgTGluZSBEcmF3aW5nICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0NPTE9SREVQVEgxNgkweDAxCS8qIFNldHMgQ29sb3JkZXB0aCAxNiBmb3IgQWNjZWxlcmF0b3IgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQ09MT1JERVBUSDgJMHgwMQkvKiBTZXRzIENvbG9yZGVwdGggOCBmb3IgQWNjZWxlcmF0b3IgKi8KKworLyogTGluZSBEcmF3aW5nIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0xOU0FSSAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0NikJLyogTGluZSBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfTE5TQVJMCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQ4KQkvKiBMaW5lIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkFYTFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGEpCS8qIEF4aXMgUGl4ZWwgTGVuZ3RoIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5ER1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGMpCS8qIERpYWdvbmFsIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5BWFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGUpCS8qIEF4aWFsIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5FUlRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDUwKQkvKiBTdGFydCBFcnJvciBUZXJtIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5NRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTIpCS8qIExpbmUgTW9kZSBSZWdpc3RlciAqLworCisvKiBCaXRCTFQgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfQkJUU1NBUkgJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1NCkJLyogU291cmNlIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRTU0FSTAkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDU2KQkvKiBTb3VyY2UgU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChMKSAqLworI2RlZmluZQlIRDY0NDYxX0JCVERTQVJICShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTgpCS8qIERlc3RpbmF0aW9uIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlREU0FSTAkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDVhKQkvKiBEZXN0aW5hdGlvbiBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJURFdSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDVjKQkvKiBEZXN0aW5hdGlvbiBCbG9jayBXaWR0aCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0JCVERIUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1ZSkJLyogRGVzdGluYXRpb24gQmxvY2sgSGVpZ2h0IFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQkJUUEFSSAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2MCkJLyogUGF0dGVybiBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUUEFSTAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2MikJLyogUGF0dGVybiBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUTUFSSAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2NCkJLyogTWFzayBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUTUFSTAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2NikJLyogTWFzayBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUUk9QUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2OCkJLyogUk9QIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQkJUTURSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDZhKQkvKiBCaXRCTFQgTW9kZSBSZWdpc3RlciAqLwogCiAvKiBQQyBDYXJkIENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMElTUiAgICAgICAgIDB4MTIwMDAgLyogc29ja2V0IDAgaW50ZXJmYWNlIHN0YXR1cyAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBHQ1IgICAgICAgICAweDEyMDAyIC8qIHNvY2tldCAwIGdlbmVyYWwgY29udHJvbCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBDU0NSICAgICAgICAweDEyMDA0IC8qIHNvY2tldCAwIGNhcmQgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBDU0NJRVIgICAgICAweDEyMDA2IC8qIHNvY2tldCAwIGNhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMFNDUiAgICAgICAgIDB4MTIwMDggLyogc29ja2V0IDAgc29mdHdhcmUgY29udHJvbCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFJU1IgICAgICAgICAweDEyMDEwIC8qIHNvY2tldCAxIGludGVyZmFjZSBzdGF0dXMgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxR0NSICAgICAgICAgMHgxMjAxMiAvKiBzb2NrZXQgMSBnZW5lcmFsIGNvbnRyb2wgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxQ1NDUiAgICAgICAgMHgxMjAxNCAvKiBzb2NrZXQgMSBjYXJkIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxQ1NDSUVSICAgICAgMHgxMjAxNiAvKiBzb2NrZXQgMSBjYXJkIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFTQ1IgICAgICAgICAweDEyMDE4IC8qIHNvY2tldCAxIHNvZnR3YXJlIGNvbnRyb2wgKi8KKy8qIE1hcHMgdG8gUGh5c2ljYWwgQXJlYSA2ICovCisjZGVmaW5lCUhENjQ0NjFfUENDMElTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwMCkJLyogc29ja2V0IDAgaW50ZXJmYWNlIHN0YXR1cyAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDIpCS8qIHNvY2tldCAwIGdlbmVyYWwgY29udHJvbCAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBDU0NSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDQpCS8qIHNvY2tldCAwIGNhcmQgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBDU0NJRVIJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwNikJLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDA4KQkvKiBzb2NrZXQgMCBzb2Z0d2FyZSBjb250cm9sICovCisvKiBNYXBzIHRvIFBoeXNpY2FsIEFyZWEgNSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTApCS8qIHNvY2tldCAxIGludGVyZmFjZSBzdGF0dXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxR0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDEyKQkvKiBzb2NrZXQgMSBnZW5lcmFsIGNvbnRyb2wgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxQ1NDUgkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDE0KQkvKiBzb2NrZXQgMSBjYXJkIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxQ1NDSUVSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTYpCS8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDMVNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxOCkJLyogc29ja2V0IDEgc29mdHdhcmUgY29udHJvbCAqLwogCiAvKiBQQ0MgSW50ZXJmYWNlIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9SRUFEWQkJMHg4MAkvKiBjYXJkIHJlYWR5ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX01XUAkJMHg0MAkvKiBjYXJkIHdyaXRlLXByb3RlY3RlZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9WUzIJCTB4MjAJLyogdm9sdGFnZSBzZWxlY3QgcGluIDIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfVlMxCQkweDEwCS8qIHZvbHRhZ2Ugc2VsZWN0IHBpbiAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0NEMgkJMHgwOAkvKiBjYXJkIGRldGVjdCAyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0NEMQkJMHgwNAkvKiBjYXJkIGRldGVjdCAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRDIJCTB4MDIJLyogYmF0dGVyeSAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRDEJCTB4MDEJLyogYmF0dGVyeSAxICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX1JFQURZCQkweDgwCS8qIGNhcmQgcmVhZHkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfTVdQCQkweDQwCS8qIGNhcmQgd3JpdGUtcHJvdGVjdGVkICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX1ZTMgkJMHgyMAkvKiB2b2x0YWdlIHNlbGVjdCBwaW4gMiAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9WUzEJCTB4MTAJLyogdm9sdGFnZSBzZWxlY3QgcGluIDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQ0QyCQkweDA4CS8qIGNhcmQgZGV0ZWN0IDIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQ0QxCQkweDA0CS8qIGNhcmQgZGV0ZWN0IDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEMgkJMHgwMgkvKiBiYXR0ZXJ5IDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEMQkJMHgwMQkvKiBiYXR0ZXJ5IDEgKi8KIAotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9QQ0RfTUFTSwkJMHgwYyAgICAvKiBjYXJkIGRldGVjdCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfTUFTSwkJMHgwMyAgICAvKiBiYXR0ZXJ5IHZvbHRhZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVEdPT0QJMHgwMyAgICAvKiBiYXR0ZXJ5IGdvb2QgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVFdBUk4JMHgwMSAgICAvKiBiYXR0ZXJ5IGxvdyB3YXJuaW5nICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9CQVRERUFEMQkweDAyICAgIC8qIGJhdHRlcnkgZGVhZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUREVBRDIJMHgwMCAgICAvKiBiYXR0ZXJ5IGRlYWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfUENEX01BU0sJCTB4MGMJLyogY2FyZCBkZXRlY3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX01BU0sJCTB4MDMJLyogYmF0dGVyeSB2b2x0YWdlICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX0JWRF9CQVRHT09ECTB4MDMJLyogYmF0dGVyeSBnb29kICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX0JWRF9CQVRXQVJOCTB4MDEJLyogYmF0dGVyeSBsb3cgd2FybmluZyAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUREVBRDEJMHgwMgkvKiBiYXR0ZXJ5IGRlYWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVERFQUQyCTB4MDAJLyogYmF0dGVyeSBkZWFkICovCiAKIC8qIFBDQyBHZW5lcmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfRFJWRQkJMHg4MCAgICAvKiBvdXRwdXQgZHJpdmUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUENDUgkJMHg0MCAgICAvKiBQQyBjYXJkIHJlc2V0ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BDQ1QJCTB4MjAgICAgLyogUEMgY2FyZCB0eXBlLCAxPUlPJm1lbSwgMD1tZW0gKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfVkNDMAkJMHgxMCAgICAvKiB2b2x0YWdlIGNvbnRyb2wgcGluIFZDQzBTRUwwICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BNTU9ECQkweDA4ICAgIC8qIG1lbW9yeSBtb2RlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BBMjUJCTB4MDQgICAgLyogcGluIEEyNSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9QQTI0CQkweDAyICAgIC8qIHBpbiBBMjQgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUkVHCQkweDAxICAgIC8qIHBpbiBQQ0MwUkVHIyAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9EUlZFCQkweDgwCS8qIG91dHB1dCBkcml2ZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QQ0NSCQkweDQwCS8qIFBDIGNhcmQgcmVzZXQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUENDVAkJMHgyMAkvKiBQQyBjYXJkIHR5cGUsIDE9SU8mbWVtLCAwPW1lbSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9WQ0MwCQkweDEwCS8qIHZvbHRhZ2UgY29udHJvbCBwaW4gVkNDMFNFTDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUE1NT0QJCTB4MDgJLyogbWVtb3J5IG1vZGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUEEyNQkJMHgwNAkvKiBwaW4gQTI1ICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1BBMjQJCTB4MDIJLyogcGluIEEyNCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9SRUcJCTB4MDEJLyogcGluIFBDQzBSRUcjICovCiAKIC8qIFBDQyBDYXJkIFN0YXR1cyBDaGFuZ2UgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX1NDREkJCTB4ODAgICAgLyogc3cgY2FyZCBkZXRlY3QgaW50ciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfU1JWMQkJMHg0MCAgICAvKiByZXNlcnZlZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfSVJFUQkJMHgyMCAgICAvKiBJUkVRIGludHIgcmVxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9TQwkJMHgxMCAgICAvKiBTVFNDSEcgKHN0YXR1cyBjaGFuZ2UpIHBpbiAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfQ0RDCQkweDA4ICAgIC8qIENEIChjYXJkIGRldGVjdCkgY2hhbmdlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9SQwkJMHgwNCAgICAvKiBSRUFEWSBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX0JXCQkweDAyICAgIC8qIGJhdHRlcnkgd2FybmluZyBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX0JECQkweDAxICAgIC8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX1NDREkJCTB4ODAJLyogc3cgY2FyZCBkZXRlY3QgaW50ciAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfU1JWMQkJMHg0MAkvKiByZXNlcnZlZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfSVJFUQkJMHgyMAkvKiBJUkVRIGludHIgcmVxICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9TQwkJMHgxMAkvKiBTVFNDSEcgKHN0YXR1cyBjaGFuZ2UpIHBpbiAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfQ0RDCQkweDA4CS8qIENEIChjYXJkIGRldGVjdCkgY2hhbmdlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9SQwkJMHgwNAkvKiBSRUFEWSBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX0JXCQkweDAyCS8qIGJhdHRlcnkgd2FybmluZyBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX0JECQkweDAxCS8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgKi8KIAogLyogUENDIENhcmQgU3RhdHVzIENoYW5nZSBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0NSRQkJMHg4MCAgICAvKiBjaGFuZ2UgcmVzZXQgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX01BU0sJMHg2MCAgIC8qIElSRVEgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0RJU0FCTEVECTB4MDAgICAvKiBJUkVRIGRpc2FibGVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0xFVkVMCTB4MjAgICAvKiBJUkVRIGxldmVsLXRyaWdnZXJlZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9GQUxMSU5HCTB4NDAgICAvKiBJUkVRIGZhbGxpbmctZWRnZS10cmlnICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX1JJU0lORwkweDYwICAgLyogSVJFUSByaXNpbmctZWRnZS10cmlnICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0NSRQkJMHg4MAkvKiBjaGFuZ2UgcmVzZXQgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX01BU0sJMHg2MAkvKiBJUkVRIGVuYWJsZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9ESVNBQkxFRCAweDAwCS8qIElSRVEgZGlzYWJsZWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTEVWRUwJMHgyMAkvKiBJUkVRIGxldmVsLXRyaWdnZXJlZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9GQUxMSU5HCTB4NDAJLyogSVJFUSBmYWxsaW5nLWVkZ2UtdHJpZyAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9SSVNJTkcJMHg2MAkvKiBJUkVRIHJpc2luZy1lZGdlLXRyaWcgKi8KIAotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9TQ0UJCTB4MTAgICAgLyogc3RhdHVzIGNoYW5nZSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfQ0RFCQkweDA4ICAgIC8qIGNhcmQgZGV0ZWN0IGNoYW5nZSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfUkUJCTB4MDQgICAgLyogcmVhZHkgY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9CV0UJCTB4MDIgICAgLyogYmF0dGVyeSB3YXJuIGNoYW5nZSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfQkRFCQkweDAxICAgIC8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgZW5hYmxlKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfU0NFCQkweDEwCS8qIHN0YXR1cyBjaGFuZ2UgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0NERQkJMHgwOAkvKiBjYXJkIGRldGVjdCBjaGFuZ2UgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX1JFCQkweDA0CS8qIHJlYWR5IGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQldFCQkweDAyCS8qIGJhdHRlcnkgd2FybiBjaGFuZ2UgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0JERQkJMHgwMQkvKiBiYXR0ZXJ5IGRlYWQgY2hhbmdlIGVuYWJsZSovCiAKIC8qIFBDQyBTb2Z0d2FyZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDU0NSX1ZDQzEJCTB4MDIJLyogdm9sdGFnZSBjb250cm9sIHBpbiAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDU0NSX1NXUAkJMHgwMSAgICAvKiB3cml0ZSBwcm90ZWN0ICovCisjZGVmaW5lCUhENjQ0NjFfUENDU0NSX1ZDQzEJCTB4MDIJLyogdm9sdGFnZSBjb250cm9sIHBpbiAxICovCisjZGVmaW5lCUhENjQ0NjFfUENDU0NSX1NXUAkJMHgwMQkvKiB3cml0ZSBwcm90ZWN0ICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9QME9DUiAgICAgICAgICAgMHgxMjAyYQotI2RlZmluZSBIRDY0NDYxX1AxT0NSICAgICAgICAgICAweDEyMDJjCi0jZGVmaW5lIEhENjQ0NjFfUEdDUiAgICAgICAgICAgIDB4MTIwMmUKKy8qIFBDQzAgT3V0cHV0IFBpbnMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1AwT0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDJhKQogCi0jZGVmaW5lIEhENjQ0NjFfR1BBQ1IJCTB4MTQwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9HUEJDUgkJMHgxNDAwMgotI2RlZmluZSBIRDY0NDYxX0dQQ0NSCQkweDE0MDA0Ci0jZGVmaW5lIEhENjQ0NjFfR1BEQ1IJCTB4MTQwMDYKLSNkZWZpbmUgSEQ2NDQ2MV9HUEFEUgkJMHgxNDAxMAotI2RlZmluZSBIRDY0NDYxX0dQQkRSCQkweDE0MDEyCi0jZGVmaW5lIEhENjQ0NjFfR1BDRFIJCTB4MTQwMTQKLSNkZWZpbmUgSEQ2NDQ2MV9HUEREUgkJMHgxNDAxNgotI2RlZmluZSBIRDY0NDYxX0dQQUlDUgkJMHgxNDAyMAotI2RlZmluZSBIRDY0NDYxX0dQQklDUgkJMHgxNDAyMgotI2RlZmluZSBIRDY0NDYxX0dQQ0lDUgkJMHgxNDAyNAotI2RlZmluZSBIRDY0NDYxX0dQRElDUgkJMHgxNDAyNgotI2RlZmluZSBIRDY0NDYxX0dQQUlTUgkJMHgxNDA0MAotI2RlZmluZSBIRDY0NDYxX0dQQklTUgkJMHgxNDA0MgotI2RlZmluZSBIRDY0NDYxX0dQQ0lTUgkJMHgxNDA0NAotI2RlZmluZSBIRDY0NDYxX0dQRElTUgkJMHgxNDA0NgorLyogUENDMSBPdXRwdXQgUGlucyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfUDFPQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMmMpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9OSVJSCQkweDE1MDAwCi0jZGVmaW5lIEhENjQ0NjFfTklNUgkJMHgxNTAwMgorLyogUEMgQ2FyZCBHZW5lcmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QR0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDJlKQogCi0jZGVmaW5lIEhENjQ0NjFfSVJRQkFTRQkJT0ZGQ0hJUF9JUlFfQkFTRQotI2RlZmluZSBIRDY0NDYxX0lSUV9OVU0JCTE2CisvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfR1BBQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMDApCS8qIFBvcnQgQSAtIEhhbmRsZXMgSVJEQS9USU1FUiAqLworI2RlZmluZQlIRDY0NDYxX0dQQkNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDAyKQkvKiBQb3J0IEIgLSBIYW5kbGVzIFVBUlQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAwNCkJLyogUG9ydCBDIC0gSGFuZGxlcyBQQ01DSUEgMSAqLworI2RlZmluZQlIRDY0NDYxX0dQRENSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDA2KQkvKiBQb3J0IEQgLSBIYW5kbGVzIFBDTUNJQSAxICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfVUFSVAkoSEQ2NDQ2MV9JUlFCQVNFKzUpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX0lSREEJKEhENjQ0NjFfSVJRQkFTRSs2KQotI2RlZmluZSBIRDY0NDYxX0lSUV9UTVUxCShIRDY0NDYxX0lSUUJBU0UrOSkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfVE1VMAkoSEQ2NDQ2MV9JUlFCQVNFKzEwKQotI2RlZmluZSBIRDY0NDYxX0lSUV9HUElPCShIRDY0NDYxX0lSUUJBU0UrMTEpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX0FGRQkJKEhENjQ0NjFfSVJRQkFTRSsxMikKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfUENDMQkoSEQ2NDQ2MV9JUlFCQVNFKzEzKQotI2RlZmluZSBIRDY0NDYxX0lSUV9QQ0MwCShIRDY0NDYxX0lSUUJBU0UrMTQpCisvKiBQb3J0IENvbnRyb2wgRGF0YSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAxMCkJLyogQSAqLworI2RlZmluZQlIRDY0NDYxX0dQQkRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDEyKQkvKiBCICovCisjZGVmaW5lCUhENjQ0NjFfR1BDRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMTQpCS8qIEMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEREUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAxNikJLyogRCAqLworCisvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjApCS8qIEEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEJJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjIpCS8qIEIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjQpCS8qIEMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUERJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjYpCS8qIEQgKi8KKworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDApCS8qIEEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEJJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDIpCS8qIEIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDQpCS8qIEMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUERJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDYpCS8qIEQgKi8KKworLyogSW50ZXJydXB0IFJlcXVlc3QgUmVnaXN0ZXIgJiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX05JUlIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDUwMDApCisjZGVmaW5lCUhENjQ0NjFfTklNUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NTAwMikKKworI2RlZmluZQlIRDY0NDYxX0lSUUJBU0UJCU9GRkNISVBfSVJRX0JBU0UKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfTlVNCQkxNgorCisjZGVmaW5lCUhENjQ0NjFfSVJRX1VBUlQJKEhENjQ0NjFfSVJRQkFTRSs1KQorI2RlZmluZQlIRDY0NDYxX0lSUV9JUkRBCShIRDY0NDYxX0lSUUJBU0UrNikKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfVE1VMQkoSEQ2NDQ2MV9JUlFCQVNFKzkpCisjZGVmaW5lCUhENjQ0NjFfSVJRX1RNVTAJKEhENjQ0NjFfSVJRQkFTRSsxMCkKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfR1BJTwkoSEQ2NDQ2MV9JUlFCQVNFKzExKQorI2RlZmluZQlIRDY0NDYxX0lSUV9BRkUJCShIRDY0NDYxX0lSUUJBU0UrMTIpCisjZGVmaW5lCUhENjQ0NjFfSVJRX1BDQzEJKEhENjQ0NjFfSVJRQkFTRSsxMykKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfUENDMAkoSEQ2NDQ2MV9JUlFCQVNFKzE0KQogCiAjZGVmaW5lIF9fSU9fUFJFRklYCWhkNjQ0NjEKICNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9od19pcnEuaAppbmRleCA4MGVlMWNkLi40Y2EzZjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9od19pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9od19pcnEuaApAQCAtNSw0ICs1LDQ2IEBACiAKIGV4dGVybiBhdG9taWNfdCBpcnFfZXJyX2NvdW50OwogCitzdHJ1Y3QgaW50YzJfZGF0YSB7CisJdW5zaWduZWQgc2hvcnQgaXJxOworCXVuc2lnbmVkIGNoYXIgaXByX29mZnNldCwgaXByX3NoaWZ0OworCXVuc2lnbmVkIGNoYXIgbXNrX29mZnNldCwgbXNrX3NoaWZ0OworCXVuc2lnbmVkIGNoYXIgcHJpb3JpdHk7Cit9OworCitzdHJ1Y3QgaW50YzJfZGVzYyB7CisJdW5zaWduZWQgbG9uZyBwcmlvX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBtc2tfYmFzZTsKKwl1bnNpZ25lZCBsb25nIG1za2Nscl9iYXNlOworCXN0cnVjdCBpbnRjMl9kYXRhICppbnRjMl9kYXRhOworCXVuc2lnbmVkIGludCBucl9pcnFzOworCXN0cnVjdCBpcnFfY2hpcCBjaGlwOworfTsKKwordm9pZCByZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKHN0cnVjdCBpbnRjMl9kZXNjICopOwordm9pZCBpbml0X0lSUV9pbnRjMih2b2lkKTsKKworc3RydWN0IGlwcl9kYXRhIHsKKwl1bnNpZ25lZCBjaGFyIGlycTsKKwl1bnNpZ25lZCBjaGFyIGlwcl9pZHg7CQkvKiBJbmRleCBmb3IgdGhlIElQUiByZWdpc3RlcmVkICovCisJdW5zaWduZWQgY2hhciBzaGlmdDsJCS8qIE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IHRoZSBkYXRhICovCisJdW5zaWduZWQgY2hhciBwcmlvcml0eTsJCS8qIFRoZSBwcmlvcml0eSAqLworfTsKKworc3RydWN0IGlwcl9kZXNjIHsKKwl1bnNpZ25lZCBsb25nICppcHJfb2Zmc2V0czsKKwl1bnNpZ25lZCBpbnQgbnJfb2Zmc2V0czsKKwlzdHJ1Y3QgaXByX2RhdGEgKmlwcl9kYXRhOworCXVuc2lnbmVkIGludCBucl9pcnFzOworCXN0cnVjdCBpcnFfY2hpcCBjaGlwOworfTsKKwordm9pZCByZWdpc3Rlcl9pcHJfY29udHJvbGxlcihzdHJ1Y3QgaXByX2Rlc2MgKik7Cit2b2lkIGluaXRfSVJRX2lwcih2b2lkKTsKKworLyoKKyAqIEVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbCBJUFIgSVJRcy4KKyAqLwordm9pZCBpcHJfaXJxX2VuYWJsZV9pcmxtKHZvaWQpOworCiAjZW5kaWYgLyogX19BU01fU0hfSFdfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2lycS5oIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKaW5kZXggZTgxYmYyMS4uYzYxZDkwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKQEAgLTMxLDQ3ICszMSw3IEBACiAgKiBQSU5UIElSUXMKICAqLwogdm9pZCBpbml0X0lSUV9waW50KHZvaWQpOwotCi0vKgotICogVGhlIHNoaWZ0IHZhbHVlIGlzIG5vdyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQsIG5vdCB0aGUgbnVtYmVyIG9mCi0gKiBiaXRzLzQuIFRoaXMgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUKLSAqIGRhdGFzaGVldHMuIFRoZSBJUFIgYWRkcmVzcywgYWRkciwgd2lsbCBiZSBzZXQgZnJvbSBpcHJfaWR4IHZpYSB0aGUKLSAqIG1hcF9pcHJpZHhfdG9fYWRkciBmdW5jdGlvbi4KLSAqLwotc3RydWN0IGlwcl9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCWludCBpcHJfaWR4OwkJLyogSW5kZXggZm9yIHRoZSBJUFIgcmVnaXN0ZXJlZCAqLwotCWludCBzaGlmdDsJCS8qIE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IHRoZSBkYXRhICovCi0JaW50IHByaW9yaXR5OwkJLyogVGhlIHByaW9yaXR5ICovCi0JdW5zaWduZWQgaW50IGFkZHI7CS8qIEFkZHJlc3Mgb2YgSW50ZXJydXB0IFByaW9yaXR5IFJlZ2lzdGVyICovCi19OwotCi0vKgotICogR2l2ZW4gYW4gSVBSIElEWCwgbWFwIHRoZSB2YWx1ZSB0byBhbiBJUFIgcmVnaXN0ZXIgYWRkcmVzcy4KLSAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KTsKLQotLyoKLSAqIEVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbCBJUFIgSVJRcy4KLSAqLwotdm9pZCBpcHJfaXJxX2VuYWJsZV9pcmxtKHZvaWQpOwotCi0vKgotICogRnVuY3Rpb24gZm9yICJvbiBjaGlwIHN1cHBvcnQgbW9kdWxlcyIuCi0gKi8KLXZvaWQgbWFrZV9pcHJfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKTsKIHZvaWQgbWFrZV9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSk7Ci12b2lkIGluaXRfSVJRX2lwcih2b2lkKTsKLQotc3RydWN0IGludGMyX2RhdGEgewotCXVuc2lnbmVkIHNob3J0IGlycTsKLQl1bnNpZ25lZCBjaGFyIGlwcl9vZmZzZXQsIGlwcl9zaGlmdDsKLQl1bnNpZ25lZCBjaGFyIG1za19vZmZzZXQsIG1za19zaGlmdDsKLQl1bnNpZ25lZCBjaGFyIHByaW9yaXR5OwotfTsKLQotdm9pZCBtYWtlX2ludGMyX2lycShzdHJ1Y3QgaW50YzJfZGF0YSAqLCB1bnNpZ25lZCBpbnQgbnJfaXJxcyk7Ci12b2lkIGluaXRfSVJRX2ludGMyKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBnZW5lcmljX2lycV9kZW11eChpbnQgaXJxKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oIGIvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oCmluZGV4IDcwMzg5YjcuLjA4ODY5OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmgKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaHR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWNfaW5pdC5oPgogCiBzdHJ1Y3QgZGV2aWNlOwogCkBAIC02OCw0ICs2Nyw3IEBACiAKICNkZWZpbmUgZ2V0X3N5c3RlbV90eXBlKCkJc2hfbXYubXZfbmFtZQogCisjZGVmaW5lIF9faW5pdG12IFwKKwlfX2F0dHJpYnV0ZV91c2VkX18gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18gKCIubWFjaHZlYy5pbml0IikpKQorCiAjZW5kaWYgLyogX0FTTV9TSF9NQUNIVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWNfaW5pdC5oIGIvaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTc3OTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMCBTdHVhcnQgTWVuZWZ5IChzdHVhcnQubWVuZWZ5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogVGhpcyBmaWxlIGhhcyBnb29kaWVzIHRvIGhlbHAgc2ltcGxpZnkgaW5zdGFudGlhdGlvbiBvZiBtYWNoaW5lIHZlY3RvcnMuCi0gKi8KLQotI2lmbmRlZiBfX1NIX01BQ0hWRUNfSU5JVF9ICi0jZGVmaW5lIF9fU0hfTUFDSFZFQ19JTklUX0gKLQotCi0vKgotICogSW4gYSBHRU5FUklDIGtlcm5lbCwgd2UgaGF2ZSBsb3RzIG9mIHRoZXNlIHZlY3RvcnMgZmxvYXRpbmcgYWJvdXQsCi0gKiBhbGwgYnV0IG9uZSBvZiB3aGljaCB3ZSB3YW50IHRvIGdvIGF3YXkuICBJbiBhIG5vbi1HRU5FUklDIGtlcm5lbCwKLSAqIHdlIHdhbnQgb25seSBvbmUsIGV2ZXIuCi0gKgotICogQWNjb21wbGlzaCB0aGlzIGluIHRoZSBHRU5FUklDIGtlcm5lbCBieSBwdXRpbmcgYWxsIG9mIHRoZSB2ZWN0b3JzCi0gKiBpbiB0aGUgLmluaXQuZGF0YSBzZWN0aW9uIHdoZXJlIHRoZXknbGwgZ28gYXdheS4gIFdlJ2xsIGNvcHkgdGhlCi0gKiBvbmUgd2Ugd2FudCB0byB0aGUgcmVhbCBhbHBoYV9tdiB2ZWN0b3IgaW4gc2V0dXBfYXJjaC4KLSAqCi0gKiBBY2NvbXBsaXNoIHRoaXMgaW4gYSBub24tR0VORVJJQyBrZXJuZWwgYnkgaWZkZWYnaW5nIG91dCBhbGwgYnV0Ci0gKiBvbmUgb2YgdGhlIHZlY3RvcnMsIHdoaWNoIHdpbGwgbm90IHJlc2lkZSBpbiAuaW5pdC5kYXRhLiAgV2UgdGhlbgotICogYWxpYXMgdGhpcyBvbmUgdmVjdG9yIHRvIGFscGhhX212LCBzbyBubyBjb3B5IGlzIG5lZWRlZC4KLSAqCi0gKiBVcHNob3Q6IHNldCBfX2luaXRkYXRhIHRvIG5vdGhpbmcgZm9yIG5vbi1HRU5FUklDIGtlcm5lbHMuCi0gKgotICogTm90ZSB3ZSBkbyB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIFVOS05PV04ga2VybmVsLCBhcyB3ZSBuZWVkIHRvIHdyaXRlCi0gKiB0byB0aGUgbWFjaGluZSB2ZWN0b3Igd2hpbGUgc2V0dGluZyBpdCB1cC4KLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfU0hfVU5LTk9XTikKLSNkZWZpbmUgX19pbml0bXYgX19hdHRyaWJ1dGVfXygodW51c2VkLF9fc2VjdGlvbl9fICgiLm1hY2h2ZWMuaW5pdCIpKSkKLSNkZWZpbmUgQUxJQVNfTVYoeCkKLSNlbHNlCi0jZGVmaW5lIF9faW5pdG12Ci0KLS8qIEdDQyBhY3R1YWxseSBoYXMgYSBzeW50YXggZm9yIGRlZmluaW5nIGFsaWFzZXMsIGJ1dCBpcyB1bmRlciBzb21lCi0gICBkZWx1c2lvbiB0aGF0IHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBkZWNsYXJlIGl0IGV4dGVybiBzb21ld2hlcmUKLSAgIGVsc2UgYmVmb3JlaGFuZC4gIEZpbmUuICBXZSdsbCBkbyBpdCBvdXJzZWx2ZXMuICAqLwotI2lmIDAKLSNkZWZpbmUgQUxJQVNfTVYoc3lzdGVtKSBcCi0gIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBzaF9tdiBfX2F0dHJpYnV0ZV9fKChhbGlhcygibXZfIiNzeXN0ZW0pKSk7Ci0jZWxzZQotI2RlZmluZSBBTElBU19NVihzeXN0ZW0pIFwKLSAgYXNtKCIuZ2xvYmFsIHNoX212XG5zaF9tdiA9IG12XyIjc3lzdGVtICk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBHRU5FUklDICovCi0KLSNlbmRpZiAvKiBfX1NIX01BQ0hWRUNfSU5JVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tbXpvbmUuaCBiL2luY2x1ZGUvYXNtLXNoL21tem9uZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjlmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9tbXpvbmUuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9fQVNNX1NIX01NWk9ORV9ICisjZGVmaW5lIF9fQVNNX1NIX01NWk9ORV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUworZXh0ZXJuIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW107CisjZGVmaW5lIE5PREVfREFUQShuaWQpCQkobm9kZV9kYXRhW25pZF0pCisKKyNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQorI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuICsgXAorCQkJCSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzKQorCitzdGF0aWMgaW5saW5lIGludCBwZm5fdG9fbmlkKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCWludCBuaWQ7CisKKwlmb3IgKG5pZCA9IDA7IG5pZCA8IE1BWF9OVU1OT0RFUzsgbmlkKyspCisJCWlmIChwZm4gPj0gbm9kZV9zdGFydF9wZm4obmlkKSAmJiBwZm4gPD0gbm9kZV9lbmRfcGZuKG5pZCkpCisJCQlicmVhazsKKworCXJldHVybiBuaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBnbGlzdF9kYXRhICpwZm5fdG9fcGdkYXQodW5zaWduZWQgbG9uZyBwZm4pCit7CisJcmV0dXJuIE5PREVfREFUQShwZm5fdG9fbmlkKHBmbikpOworfQorCisvKiBhcmNoL3NoL21tL251bWEuYyAqLwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldHVwX2Jvb3RtZW1fbm9kZShpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLworCisvKiBQbGF0Zm9ybSBzcGVjaWZpYyBtZW0gaW5pdCAqLwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCk7CisKKy8qIGFyY2gvc2gva2VybmVsL3NldHVwLmMgKi8KK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FTTV9TSF9NTVpPTkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGFnZS5oIGIvaW5jbHVkZS9hc20tc2gvcGFnZS5oCmluZGV4IDc0NjRkZTQuLjZiYzliYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKQEAgLTYwLDYgKzYwLDcgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2htX2FsaWduX21hc2s7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbiwgbWluX2xvd19wZm47CitleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CiAKICNpZmRlZiBDT05GSUdfTU1VCiBleHRlcm4gdm9pZCBjbGVhcl9wYWdlX3Nsb3codm9pZCAqdG8pOwpAQCAtMTM0LDcgKzEzNSw5IEBACiAjZGVmaW5lIFBGTl9TVEFSVAkJKF9fTUVNT1JZX1NUQVJUID4+IFBBR0VfU0hJRlQpCiAjZGVmaW5lIEFSQ0hfUEZOX09GRlNFVAkJKFBGTl9TVEFSVCkKICNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQorI2lmZGVmIENPTkZJR19GTEFUTUVNCiAjZGVmaW5lIHBmbl92YWxpZChwZm4pCQkoKHBmbikgPj0gbWluX2xvd19wZm4gJiYgKHBmbikgPCBtYXhfbG93X3BmbikKKyNlbmRpZgogI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogCiAjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKQEAgLTE0OCw1ICsxNTEsMTIgQEAKICNkZWZpbmUgX19IQVZFX0FSQ0hfR0FURV9BUkVBCiAjZW5kaWYKIAorLyoKKyAqIFNsdWIgZGVmYXVsdHMgdG8gOC1ieXRlIGFsaWdubWVudCwgd2UncmUgb25seSBpbnRlcmVzdGVkIGluIDQuCisgKiBTbGFiIGRlZmF1bHRzIHRvIEJZVEVTX1BFUl9XT1JELCB3aGljaCBlbmRzIHVwIGJlaW5nIHRoZSBzYW1lIGFueXdheXMuCisgKi8KKyNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOCTQKKyNkZWZpbmUgQVJDSF9TTEFCX01JTkFMSUdOCTQKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9TSF9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BhcnBvcnQuaCBiL2luY2x1ZGUvYXNtLXNoL3BhcnBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjdiYTYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvcGFycG9ydC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgIFRpbSBXYXVnaCA8dGltQGN5YmVyZWxrLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgZmlsZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBieSBkcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jLgorICovCisjaWZuZGVmIF9fQVNNX1NIX1BBUlBPUlRfSAorI2RlZmluZSBfX0FTTV9TSF9QQVJQT1JUX0gKKworc3RhdGljIGludCBfX2RldmluaXQgcGFycG9ydF9wY19maW5kX2lzYV9wb3J0cyhpbnQgYXV0b2lycSwgaW50IGF1dG9kbWEpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X3BjX2ZpbmRfbm9ucGNpX3BvcnRzKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKK3sKKwlyZXR1cm4gcGFycG9ydF9wY19maW5kX2lzYV9wb3J0cyhhdXRvaXJxLCBhdXRvZG1hKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NIX1BBUlBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCmluZGV4IDViNTIzYzcuLjIyZWZmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKQEAgLTQwMiwxMiArNDAyLDggQEAKICNkZWZpbmUgcHRlX2ZpbGUocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEUpCiAKICNpZmRlZiBDT05GSUdfWDJUTEIKLSNkZWZpbmUgcHRlX3JlYWQocHRlKQkJKChwdGUpLnB0ZV9oaWdoICYgX1BBR0VfRVhUX1VTRVJfUkVBRCkKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKChwdGUpLnB0ZV9oaWdoICYgX1BBR0VfRVhUX1VTRVJfRVhFQykKICNkZWZpbmUgcHRlX3dyaXRlKHB0ZSkJCSgocHRlKS5wdGVfaGlnaCAmIF9QQUdFX0VYVF9VU0VSX1dSSVRFKQogI2Vsc2UKLSNkZWZpbmUgcHRlX3JlYWQocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVIpCi0jZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXKQogI2VuZGlmCiAKQEAgLTQyMCwyMCArNDE2LDEyIEBACiAgKiBpbmRpdmlkdWFsbHkgdG9nZ2xlZCAoYW5kIHVzZXIgcGVybWlzc2lvbnMgYXJlIGVudGlyZWx5IGRlY291cGxlZCBmcm9tCiAgKiBrZXJuZWwgcGVybWlzc2lvbnMpLCB3ZSBhdHRlbXB0IHRvIGNvdXBsZSB0aGVtIGEgYml0IG1vcmUgc2FuZWx5IGhlcmUuCiAgKi8KLVBURV9CSVRfRlVOQyhoaWdoLCByZHByb3RlY3QsICY9IH5fUEFHRV9FWFRfVVNFUl9SRUFEKTsKLVBURV9CSVRfRlVOQyhoaWdoLCBta3JlYWQsIHw9IF9QQUdFX0VYVF9VU0VSX1JFQUQgfCBfUEFHRV9FWFRfS0VSTl9SRUFEKTsKIFBURV9CSVRfRlVOQyhoaWdoLCB3cnByb3RlY3QsICY9IH5fUEFHRV9FWFRfVVNFUl9XUklURSk7CiBQVEVfQklUX0ZVTkMoaGlnaCwgbWt3cml0ZSwgfD0gX1BBR0VfRVhUX1VTRVJfV1JJVEUgfCBfUEFHRV9FWFRfS0VSTl9XUklURSk7Ci1QVEVfQklUX0ZVTkMoaGlnaCwgZXhwcm90ZWN0LCAmPSB+X1BBR0VfRVhUX1VTRVJfRVhFQyk7Ci1QVEVfQklUX0ZVTkMoaGlnaCwgbWtleGVjLCB8PSBfUEFHRV9FWFRfVVNFUl9FWEVDIHwgX1BBR0VfRVhUX0tFUk5fRVhFQyk7CiBQVEVfQklUX0ZVTkMoaGlnaCwgbWtodWdlLCB8PSBfUEFHRV9TWkhVR0UpOwogI2Vsc2UKLVBURV9CSVRfRlVOQyhsb3csIHJkcHJvdGVjdCwgJj0gfl9QQUdFX1VTRVIpOwotUFRFX0JJVF9GVU5DKGxvdywgbWtyZWFkLCB8PSBfUEFHRV9VU0VSKTsKIFBURV9CSVRfRlVOQyhsb3csIHdycHJvdGVjdCwgJj0gfl9QQUdFX1JXKTsKIFBURV9CSVRfRlVOQyhsb3csIG1rd3JpdGUsIHw9IF9QQUdFX1JXKTsKLVBURV9CSVRfRlVOQyhsb3csIGV4cHJvdGVjdCwgJj0gfl9QQUdFX1VTRVIpOwotUFRFX0JJVF9GVU5DKGxvdywgbWtleGVjLCB8PSBfUEFHRV9VU0VSKTsKIFBURV9CSVRfRlVOQyhsb3csIG1raHVnZSwgfD0gX1BBR0VfU1pIVUdFKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCmluZGV4IGQ0MmY2OGUuLjIyNTJlNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCkBAIC0zNiw3ICszNiw3IEBACiAgKi8KIGVudW0gY3B1X3R5cGUgewogCS8qIFNILTIgdHlwZXMgKi8KLQlDUFVfU0g3NjA0LCBDUFVfU0g3NjE5LAorCUNQVV9TSDc2MTksCiAKIAkvKiBTSC0yQSB0eXBlcyAqLwogCUNQVV9TSDcyMDYsCkBAIC01Miw3ICs1Miw3IEBACiAJQ1BVX1NINzc2MCwgQ1BVX1NUNDBSQSwgQ1BVX1NUNDBHWDEsIENQVV9TSDRfMjAyLCBDUFVfU0g0XzUwMSwKIAogCS8qIFNILTRBIHR5cGVzICovCi0JQ1BVX1NINzc3MCwgQ1BVX1NINzc4MCwgQ1BVX1NINzc4MSwgQ1BVX1NINzc4NSwKKwlDUFVfU0g3NzcwLCBDUFVfU0g3NzgwLCBDUFVfU0g3NzgxLCBDUFVfU0g3Nzg1LCBDUFVfU0hYMywKIAogCS8qIFNINEFMLURTUCB0eXBlcyAqLwogCUNQVV9TSDczMTgwLCBDUFVfU0g3MzQzLCBDUFVfU0g3NzIyLApAQCAtMjI4LDExICsyMjgsNyBAQAogCXJlZ3MtPnNyICY9IH5TUl9GRDsKIH0KIAotI2lmZGVmIENPTkZJR19DUFVfU0g0CiBleHRlcm4gdm9pZCBzYXZlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZWxzZQotI2RlZmluZSBzYXZlX2ZwdSh0c2spCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgogCiAjZGVmaW5lIHVubGF6eV9mcHUodHNrLCByZWdzKSBkbyB7CQkJXAogCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKSkgewlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oIGIvaW5jbHVkZS9hc20tc2gvcndzZW0uaAppbmRleCA0OTMxYmE4Li4xOTg3ZjNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3J3c2VtLmgKQEAgLTEsMTEgKzEsMTUgQEAKIC8qCi0gKiBpbmNsdWRlL2FzbS1wcGMvcndzZW0uaDogUi9XIHNlbWFwaG9yZXMgZm9yIFNIIHVzaW5nIHRoZSBzdHVmZgorICogaW5jbHVkZS9hc20tc2gvcndzZW0uaDogUi9XIHNlbWFwaG9yZXMgZm9yIFNIIHVzaW5nIHRoZSBzdHVmZgogICogaW4gbGliL3J3c2VtLmMuCiAgKi8KIAogI2lmbmRlZiBfQVNNX1NIX1JXU0VNX0gKICNkZWZpbmUgX0FTTV9TSF9SV1NFTV9ICiAKKyNpZm5kZWYgX0xJTlVYX1JXU0VNX0gKKyNlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgYXNtL3J3c2VtLmggZGlyZWN0bHksIHVzZSBsaW51eC9yd3NlbS5oIGluc3RlYWQiCisjZW5kaWYKKwogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NhdHVybi9pby5oIGIvaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjliNWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmgKLSAqCi0gKiBJL08gZnVuY3Rpb25zIGZvciB1c2Ugb24gdGhlIFNlZ2EgU2F0dXJuLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBQYXVsIE11bmR0Ci0gKgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCi0gKi8KLSNpZm5kZWYgX19BU01fU0hfU0FUVVJOX0lPX0gKLSNkZWZpbmUgX19BU01fU0hfU0FUVVJOX0lPX0gKLQotLyogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIHNhdHVybl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLWV4dGVybiB2b2lkICpzYXR1cm5faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiB2b2lkIHNhdHVybl9pb3VubWFwKHZvaWQgKmFkZHIpOwotCi0jZW5kaWYgLyogX19BU01fU0hfU0FUVVJOX0lPX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL3NtcGMuaCBiL2luY2x1ZGUvYXNtLXNoL3NhdHVybi9zbXBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZTVjMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL3NtcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9zYXR1cm4vc21wYy5oCi0gKgotICogU3lzdGVtIE1hbmFnZXIgLyBQZXJpcGhlcmFsIENvbnRyb2wgZGVmaW5pdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2lmbmRlZiBfX0FTTV9TSF9TQVRVUk5fU01QQ19ICi0jZGVmaW5lIF9fQVNNX1NIX1NBVFVSTl9TTVBDX0gKLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jZGVmaW5lIFNNUENfQ09NTUFORAkweDIwMTAwMDFmCS8qIFNNUEMgY29tbWFuZCByZWdpc3RlciAqLwotI2RlZmluZSBTTVBDX1JFU1VMVAkweDIwMTAwMDVmCS8qIFNNUEMgcmVzdWx0IHJlZ2lzdGVyICovCi0jZGVmaW5lIFNNUENfU1RBVFVTCTB4MjAxMDAwNjMJLyogU01QQyBzdGF0dXMgcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBTTVBDX0NNRF9NU0hPTgkweDAwMDEJCS8qIE1hc3RlciBTSCBPbiAqLwotI2RlZmluZSBTTVBDX0NNRF9TU0hPTgkweDAwMDIJCS8qIFNsYXZlIFNIIE9uICovCi0jZGVmaW5lIFNNUENfQ01EX1NTSE9GRgkweDAwMDMJCS8qIFNsYXZlIFNIIE9mZiAqLwotI2RlZmluZSBTTVBDX0NNRF9TTkRPTgkweDAwMDQJCS8qIFNvdW5kIE9uICovCi0jZGVmaW5lIFNNUENfQ01EX1NORE9GRgkweDAwMDUJCS8qIFNvdW5kIE9mZiAqLwotI2RlZmluZSBTTVBDX0NNRF9DRE9OCTB4MDAwNgkJLyogQ0QgT24gKi8KLSNkZWZpbmUgU01QQ19DTURfQ0RPRkYJMHgwMDA3CQkvKiBDRCBPZmYgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHNtcGNfYmFycmllcih2b2lkKQotewotCXdoaWxlICgoY3RybF9pbmIoU01QQ19TVEFUVVMpICYgMHgwMDAxKSA9PSAweDAwMDEpCi0JCTsKLX0KLQotI2VuZGlmIC8qIF9fQVNNX1NIX1NBVFVSTl9TTVBDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2VjdGlvbnMuaCBiL2luY2x1ZGUvYXNtLXNoL3NlY3Rpb25zLmgKaW5kZXggNTdhYmQ3MC4uMmE2OTZiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2VjdGlvbnMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zZWN0aW9ucy5oCkBAIC0zLDcgKzMsNyBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KIAotZXh0ZXJuIGNoYXIgX2VuZFtdOworZXh0ZXJuIGxvbmcgX19tYWNodmVjX3N0YXJ0LCBfX21hY2h2ZWNfZW5kOwogCiAjZW5kaWYgLyogX19BU01fU0hfU0VDVElPTlNfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oIGIvaW5jbHVkZS9hc20tc2gvc2V0dXAuaAppbmRleCAxNTgzYzZiLi41ODZhOTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NldHVwLmgKQEAgLTYsNiArNiw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiBpbnQgc2V0dXBfZWFybHlfcHJpbnRrKGNoYXIgKik7Cit2b2lkIHNoX212X3NldHVwKHZvaWQpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmgKaW5kZXggZGYzYjE4Ny4uNGZmMWViOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2gwMy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NoMDMvaW8uaApAQCAtMTQsMjIgKzE0LDE4IEBACiAjZGVmaW5lIElOVENfSVBSRAkweGZmZDAwMDEwVUwKIAogI2RlZmluZSBJUkwwX0lSUQkyCi0jZGVmaW5lIElSTDBfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDBfSVBSX1BPUwkzCiAjZGVmaW5lIElSTDBfUFJJT1JJVFkJMTMKIAogI2RlZmluZSBJUkwxX0lSUQk1Ci0jZGVmaW5lIElSTDFfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDFfSVBSX1BPUwkyCiAjZGVmaW5lIElSTDFfUFJJT1JJVFkJMTAKIAogI2RlZmluZSBJUkwyX0lSUQk4Ci0jZGVmaW5lIElSTDJfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDJfSVBSX1BPUwkxCiAjZGVmaW5lIElSTDJfUFJJT1JJVFkJNwogCiAjZGVmaW5lIElSTDNfSVJRCTExCi0jZGVmaW5lIElSTDNfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDNfSVBSX1BPUwkwCiAjZGVmaW5lIElSTDNfUFJJT1JJVFkJNAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zbXAuaCBiL2luY2x1ZGUvYXNtLXNoL3NtcC5oCmluZGV4IGNhYTdiOTMuLmI5OWNhNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NtcC5oCkBAIC0zOSw0ICszOSw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKKyNkZWZpbmUgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkJKDApCisKICNlbmRpZiAvKiBfX0FTTV9TSF9TTVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc25hcGdlYXIuaCBiL2luY2x1ZGUvYXNtLXNoL3NuYXBnZWFyLmgKaW5kZXggMmQ3MTJlNy4uMzU1NGUzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc25hcGdlYXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oCkBAIC0yMCwyMiArMjAsMTggQEAKICAqLwogCiAjZGVmaW5lIElSTDBfSVJRCQkyCi0jZGVmaW5lIElSTDBfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDBfSVBSX1BPUwkzCiAjZGVmaW5lIElSTDBfUFJJT1JJVFkJMTMKIAogI2RlZmluZSBJUkwxX0lSUQkJNQotI2RlZmluZSBJUkwxX0lQUl9BRERSCUlOVENfSVBSRAogI2RlZmluZSBJUkwxX0lQUl9QT1MJMgogI2RlZmluZSBJUkwxX1BSSU9SSVRZCTEwCiAKICNkZWZpbmUgSVJMMl9JUlEJCTgKLSNkZWZpbmUgSVJMMl9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMl9JUFJfUE9TCTEKICNkZWZpbmUgSVJMMl9QUklPUklUWQk3CiAKICNkZWZpbmUgSVJMM19JUlEJCTExCi0jZGVmaW5lIElSTDNfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDNfSVBSX1BPUwkwCiAjZGVmaW5lIElSTDNfUFJJT1JJVFkJNAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zcGFyc2VtZW0uaCBiL2luY2x1ZGUvYXNtLXNoL3NwYXJzZW1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2E1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9zcGFyc2VtZW0uaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9fQVNNX1NIX1NQQVJTRU1FTV9ICisjZGVmaW5lIF9fQVNNX1NIX1NQQVJTRU1FTV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogU0VDVElPTl9TSVpFX0JJVFMJCTJeTjogaG93IGJpZyBlYWNoIHNlY3Rpb24gd2lsbCBiZQorICogTUFYX1BIWVNBRERSX0JJVFMJCTJeTjogaG93IG11Y2ggcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSB3ZSBoYXZlCisgKiBNQVhfUEhZU01FTV9CSVRTCQkyXk46IGhvdyBtdWNoIG1lbW9yeSB3ZSBjYW4gaGF2ZSBpbiB0aGF0IHNwYWNlCisgKi8KKyNkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMJMjYKKyNkZWZpbmUgTUFYX1BIWVNBRERSX0JJVFMJMzIKKyNkZWZpbmUgTUFYX1BIWVNNRU1fQklUUwkzMgorCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX1NIX1NQQVJTRU1FTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCmluZGV4IDgyZjNlMjIuLjdjNzUwNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCkBAIC04LDkgKzgsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOworCiAvKgogICoJc3dpdGNoX3RvKCkgc2hvdWxkIHN3aXRjaCB0YXNrcyB0byB0YXNrIG5yIG4sIGZpcnN0CiAgKi8KQEAgLTEyMiw3ICsxMjYsNyBAQAogI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0jZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7IHhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyAodm9pZCl4Y2hnKCZ2YXIsIHZhbHVlKTsgfSB3aGlsZSAoMCkKIAogLyoKICAqIEp1bXAgdG8gUDIgYXJlYS4KQEAgLTI3MSw2ICsyNzUsMTYgQEAKIHZvaWQgZGlzYWJsZV9obHQodm9pZCk7CiB2b2lkIGVuYWJsZV9obHQodm9pZCk7CiAKK3ZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworCithc21saW5rYWdlIHZvaWQgYnJlYWtfcG9pbnRfdHJhcCh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBkZWJ1Z190cmFwX2hhbmRsZXIodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJCSAgIHN0cnVjdCBwdF9yZWdzIF9fcmVncyk7Cithc21saW5rYWdlIHZvaWQgYnVnX3RyYXBfaGFuZGxlcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCSB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJCSBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpOworCiAjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXNoL3RvcG9sb2d5LmgKaW5kZXggY2ZmMDAxYy4uZjQwMmEzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1zaC90b3BvbG9neS5oCkBAIC0xLDYgKzEsMzYgQEAKICNpZm5kZWYgX0FTTV9TSF9UT1BPTE9HWV9ICiAjZGVmaW5lIF9BU01fU0hfVE9QT0xPR1lfSAogCisjaWZkZWYgQ09ORklHX05VTUEKKworLyogc2NoZWRfZG9tYWlucyBTRF9OT0RFX0lOSVQgZm9yIHNoIG1hY2hpbmVzICovCisjZGVmaW5lIFNEX05PREVfSU5JVCAoc3RydWN0IHNjaGVkX2RvbWFpbikgewkJXAorCS5zcGFuCQkJPSBDUFVfTUFTS19OT05FLAlcCisJLnBhcmVudAkJCT0gTlVMTCwJCQlcCisJLmNoaWxkCQkJPSBOVUxMLAkJCVwKKwkuZ3JvdXBzCQkJPSBOVUxMLAkJCVwKKwkubWluX2ludGVydmFsCQk9IDgsCQkJXAorCS5tYXhfaW50ZXJ2YWwJCT0gMzIsCQkJXAorCS5idXN5X2ZhY3RvcgkJPSAzMiwJCQlcCisJLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKKwkuY2FjaGVfbmljZV90cmllcwk9IDIsCQkJXAorCS5idXN5X2lkeAkJPSAzLAkJCVwKKwkuaWRsZV9pZHgJCT0gMiwJCQlcCisJLm5ld2lkbGVfaWR4CQk9IDAsCQkJXAorCS53YWtlX2lkeAkJPSAxLAkJCVwKKwkuZm9ya2V4ZWNfaWR4CQk9IDEsCQkJXAorCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKKwkJCQl8IFNEX0JBTEFOQ0VfRk9SSwlcCisJCQkJfCBTRF9CQUxBTkNFX0VYRUMJXAorCQkJCXwgU0RfU0VSSUFMSVpFCQlcCisJCQkJfCBTRF9XQUtFX0JBTEFOQ0UsCVwKKwkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCisJLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKKwkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKK30KKworI2VuZGlmCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy90b3BvbG9neS5oPgogCiAjZW5kaWYgLyogX0FTTV9TSF9UT1BPTE9HWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmgKaW5kZXggNWM0OWVkNi4uZjE4YTFhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaApAQCAtNjEsOCArNjEsNiBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBfX2FjY2Vzc19vayh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7Ci0KIAlyZXR1cm4gKChhZGRyID49IG1lbW9yeV9zdGFydCkgJiYgKChhZGRyICsgc2l6ZSkgPCBtZW1vcnlfZW5kKSk7CiB9CiAjZWxzZSAvKiBDT05GSUdfTU1VICovCkBAIC03Niw3ICs3NCw3IEBACiAgKiBfX2FjY2Vzc19vazogQ2hlY2sgaWYgYWRkcmVzcyB3aXRoIHNpemUgaXMgT0sgb3Igbm90LgogICoKICAqIFdlIGRvIHRocmVlIGNoZWNrczoKLSAqICgxKSBpcyBpdCB1c2VyIHNwYWNlPyAKKyAqICgxKSBpcyBpdCB1c2VyIHNwYWNlPwogICogKDIpIGFkZHIgKyBzaXplIC0tPiBjYXJyeT8KICAqICgzKSBhZGRyICsgc2l6ZSA+PSAweDgwMDAwMDAwICAoUEFHRV9PRkZTRVQpCiAgKgpAQCAtMTQyLDExICsxNDAsMTIgQEAKICAgX19nZXRfdXNlcl9ub2NoZWNrKCh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkKIAogc3RydWN0IF9fbGFyZ2Vfc3RydWN0IHsgdW5zaWduZWQgbG9uZyBidWZbMTAwXTsgfTsKLSNkZWZpbmUgX19tKHgpICgqKHN0cnVjdCBfX2xhcmdlX3N0cnVjdCAqKSh4KSkKKyNkZWZpbmUgX19tKHgpICgqKHN0cnVjdCBfX2xhcmdlX3N0cnVjdCBfX3VzZXIgKikoeCkpCiAKICNkZWZpbmUgX19nZXRfdXNlcl9zaXplKHgscHRyLHNpemUscmV0dmFsKQkJCVwKIGRvIHsJCQkJCQkJCVwKIAlyZXR2YWwgPSAwOwkJCQkJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCVwKIAkJX19nZXRfdXNlcl9hc20oeCwgcHRyLCByZXR2YWwsICJiIik7CQlcCkBAIC0xNzUsNiArMTc0LDcgQEAKICNkZWZpbmUgX19nZXRfdXNlcl9jaGVjayh4LHB0cixzaXplKQkJCQlcCiAoewkJCQkJCQkJXAogCWxvbmcgX19ndV9lcnIsIF9fZ3VfdmFsOwkJCQlcCisJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJCVwKIAlzd2l0Y2ggKHNpemUpIHsJCQkJCQlcCiAJY2FzZSAxOgkJCQkJCQlcCiAJCV9fZ2V0X3VzZXJfMShfX2d1X3ZhbCwgKHB0ciksIF9fZ3VfZXJyKTsJXApAQCAtMzAwLDYgKzMwMCw3IEBACiAjZGVmaW5lIF9fcHV0X3VzZXJfc2l6ZSh4LHB0cixzaXplLHJldHZhbCkJCVwKIGRvIHsJCQkJCQkJXAogCXJldHZhbCA9IDA7CQkJCQlcCisJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJXAogCWNhc2UgMToJCQkJCQlcCiAJCV9fcHV0X3VzZXJfYXNtKHgsIHB0ciwgcmV0dmFsLCAiYiIpOwlcCkBAIC0zMjgsNyArMzI5LDcgQEAKICNkZWZpbmUgX19wdXRfdXNlcl9jaGVjayh4LHB0cixzaXplKQkJCQlcCiAoewkJCQkJCQkJXAogCWxvbmcgX19wdV9lcnIgPSAtRUZBVUxUOwkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpICpfX3B1X2FkZHIgPSAocHRyKTsJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fdXNlciAqX19wdV9hZGRyID0gKHB0cik7CQlcCiAJCQkJCQkJCVwKIAlpZiAoX19hY2Nlc3Nfb2soKHVuc2lnbmVkIGxvbmcpX19wdV9hZGRyLHNpemUpKQkJXAogCQlfX3B1dF91c2VyX3NpemUoKHgpLF9fcHVfYWRkciwoc2l6ZSksX19wdV9lcnIpOwlcCkBAIC00MDYsMTAgKzQwNywxMCBAQAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIF9fcHV0X3VzZXJfdW5rbm93bih2b2lkKTsKLQwKKwogLyogR2VuZXJpYyBhcmJpdHJhcnkgc2l6ZWQgY29weS4gICovCiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBOT1QgY29waWVkICovCi1leHRlcm4gX19rZXJuZWxfc2l6ZV90IF9fY29weV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBfX2tlcm5lbF9zaXplX3Qgbik7CitfX2tlcm5lbF9zaXplX3QgX19jb3B5X3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIF9fa2VybmVsX3NpemVfdCBuKTsKIAogI2RlZmluZSBjb3B5X3RvX3VzZXIodG8sZnJvbSxuKSAoeyBcCiB2b2lkICpfX2NvcHlfdG8gPSAodm9pZCAqKSAodG8pOyBcCkBAIC00MjAsMTQgKzQyMSw2IEBACiB9IGVsc2UgX19jb3B5X3JlcyA9IF9fY29weV9zaXplOyBcCiBfX2NvcHlfcmVzOyB9KQogCi0jZGVmaW5lIF9fY29weV90b191c2VyKHRvLGZyb20sbikJCVwKLQlfX2NvcHlfdXNlcigodm9pZCAqKSh0byksCQlcCi0JCSAgICAodm9pZCAqKShmcm9tKSwgbikKLQotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKLQotCiAjZGVmaW5lIGNvcHlfZnJvbV91c2VyKHRvLGZyb20sbikgKHsgXAogdm9pZCAqX19jb3B5X3RvID0gKHZvaWQgKikgKHRvKTsgXAogdm9pZCAqX19jb3B5X2Zyb20gPSAodm9pZCAqKSAoZnJvbSk7IFwKQEAgLTQzOCw5ICs0MzEsMjAgQEAKIH0gZWxzZSBfX2NvcHlfcmVzID0gX19jb3B5X3NpemU7IFwKIF9fY29weV9yZXM7IH0pCiAKLSNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0byxmcm9tLG4pCQlcCi0JX19jb3B5X3VzZXIoKHZvaWQgKikodG8pLAkJXAotCQkgICAgKHZvaWQgKikoZnJvbSksIG4pCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJcmV0dXJuIF9fY29weV91c2VyKHRvLCAoX19mb3JjZSB2b2lkICopZnJvbSwgbik7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK19fY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiBfX2NvcHlfdXNlcigoX19mb3JjZSB2b2lkICopdG8sIGZyb20sIG4pOworfQorCisjZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljIF9fY29weV90b191c2VyCisjZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMgX19jb3B5X2Zyb21fdXNlcgogCiAvKgogICogQ2xlYXIgdGhlIGFyZWEgYW5kIHJldHVybiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC91YmMuaCBiL2luY2x1ZGUvYXNtLXNoL3ViYy5oCmluZGV4IGFlOWJiZGUuLjM4ZDQ2ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3ViYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3ViYy5oCkBAIC01MSw5ICs1MSwxNCBAQAogI2RlZmluZSBCUkNSX1VCREUJCSgxIDw8IDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKiBhcmNoL3NoL2tlcm5lbC91YmMuUyAqLwotZXh0ZXJuIHZvaWQgdWJjX3dha2V1cCh2b2lkKTsKKy8qIGFyY2gvc2gva2VybmVsL2NwdS91YmMuUyAqLwogZXh0ZXJuIHZvaWQgdWJjX3NsZWVwKHZvaWQpOworCisjaWZkZWYgQ09ORklHX1VCQ19XQUtFVVAKK2V4dGVybiB2b2lkIHViY193YWtldXAodm9pZCk7CisjZWxzZQorI2RlZmluZSB1YmNfd2FrZXVwKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCiAjZW5kaWYKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvZmIuaCBiL2luY2x1ZGUvYXNtLXNoNjQvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJlOTljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCmluZGV4IGI4NzU0ODIuLjM0ODhmZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCkBAIC00MTUsMjIgKzQxNSwxNSBAQAogLyoKICAqIFRoZSBmb2xsb3dpbmcgaGF2ZSBkZWZpbmVkIGJlaGF2aW9yIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDVVRFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SRUFEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfV1JJVEUpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9FWEVDVVRFKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9SRUFEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfV1JJVEUpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0VYRUNVVEUpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0FDQ0VTU0VEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21raHVnZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9TWkhVR0UpKTsgcmV0dXJuIHB0ZTsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvZmIuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3BndGFibGUuaAppbmRleCA1OTIyOWFlLi5hNTVmNGMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcGd0YWJsZS5oCkBAIC0xNTEsNyArMTUxLDYgQEAKIEJURklYVVBERUZfU0VUSEkobm9uZV9tYXNrKQogQlRGSVhVUERFRl9DQUxMX0NPTlNUKGludCwgcHRlX3ByZXNlbnQsIHB0ZV90KQogQlRGSVhVUERFRl9DQUxMKHZvaWQsIHB0ZV9jbGVhciwgcHRlX3QgKikKLUJURklYVVBERUZfQ0FMTChpbnQsIHB0ZV9yZWFkLCBwdGVfdCkKIAogc3RhdGljIGlubGluZSBpbnQgcHRlX25vbmUocHRlX3QgcHRlKQogewpAQCAtMTYwLDcgKzE1OSw2IEBACiAKICNkZWZpbmUgcHRlX3ByZXNlbnQocHRlKSBCVEZJWFVQX0NBTEwocHRlX3ByZXNlbnQpKHB0ZSkKICNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIscHRlKSBCVEZJWFVQX0NBTEwocHRlX2NsZWFyKShwdGUpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkgQlRGSVhVUF9DQUxMKHB0ZV9yZWFkKShwdGUpCiAKIEJURklYVVBERUZfQ0FMTF9DT05TVChpbnQsIHBtZF9iYWQsIHBtZF90KQogQlRGSVhVUERFRl9DQUxMX0NPTlNUKGludCwgcG1kX3ByZXNlbnQsIHBtZF90KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9idWdzLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaAppbmRleCBiZjM5ZDg2Li4xMWFkZTY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaApAQCAtNCwxMiArNCw3IEBACiAgKi8KICNpbmNsdWRlIDxhc20vc3N0YXRlLmg+CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeTsKLQogc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2J1Z3Modm9pZCkKIHsKLSNpZm5kZWYgQ09ORklHX1NNUAotCWNwdV9kYXRhKDApLnVkZWxheV92YWwgPSBsb29wc19wZXJfamlmZnk7Ci0jZW5kaWYKIAlzc3RhdGVfcnVubmluZygpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKaW5kZXggMzY1MTFjYS4uMDFmZTY2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCkBAIC0zMSw4ICszMSwxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jcHVkYXRhLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaAppbmRleCA0NDUwMjZmLi45OGE2ZTYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaApAQCAtMTksNyArMTksNyBAQAogCXVuc2lnbmVkIGludAlfX3NvZnRpcnFfcGVuZGluZzsgLyogbXVzdCBiZSAxc3QsIHNlZSBydHJhcC5TICovCiAJdW5zaWduZWQgaW50CV9fcGFkMDsKIAl1bnNpZ25lZCBsb25nCWNsb2NrX3RpY2s7CS8qICV0aWNrJ3MgcGVyIHNlY29uZCAqLwotCXVuc2lnbmVkIGxvbmcJdWRlbGF5X3ZhbDsKKwl1bnNpZ25lZCBsb25nCV9fcGFkOwogCXVuc2lnbmVkIGludAlfX3BhZDE7CiAJdW5zaWduZWQgaW50CV9fcGFkMjsKIApAQCAtODAsNyArODAsOCBAQAogCXVuc2lnbmVkIGludAkJZGV2X21vbmRvX3FtYXNrOwogCXVuc2lnbmVkIGludAkJcmVzdW1fcW1hc2s7CiAJdW5zaWduZWQgaW50CQlub25yZXN1bV9xbWFzazsKLQl1bnNpZ25lZCBpbnQJCV9fcGFkMlszXTsKKwl1bnNpZ25lZCBpbnQJCV9fcGFkMlsxXTsKKwl2b2lkCQkJKmhkZXNjOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDY0KSkpOwogZXh0ZXJuIHN0cnVjdCB0cmFwX3Blcl9jcHUgdHJhcF9ibG9ja1tOUl9DUFVTXTsKIGV4dGVybiB2b2lkIGluaXRfY3VyX2NwdV90cmFwKHN0cnVjdCB0aHJlYWRfaW5mbyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZGVsYXkuaAppbmRleCBhNGFhZTZmLi5hNzdhYTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZWxheS5oCkBAIC0xLDM3ICsxLDE3IEBACiAvKiBkZWxheS5oOiBMaW51eCBkZWxheSByb3V0aW5lcyBvbiBzcGFyYzY0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMjAwNCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpLgotICoKLSAqIEJhc2VkIGhlYXZpbHkgdXBvbiB4ODYgdmFyaWFudCB3aGljaCBpczoKLSAqIENvcHlyaWdodCAoQykgMTk5MyBMaW51cyBUb3J2YWxkcwotICoKLSAqIERlbGF5IHJvdXRpbmVzIGNhbGxpbmcgZnVuY3Rpb25zIGluIGFyY2gvc3BhcmM2NC9saWIvZGVsYXkuYworICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA0LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkuCiAgKi8KIAotI2lmbmRlZiBfX1NQQVJDNjRfREVMQVlfSAotI2RlZmluZSBfX1NQQVJDNjRfREVMQVlfSAotCi0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgorI2lmbmRlZiBfU1BBUkM2NF9ERUxBWV9ICisjZGVmaW5lIF9TUEFSQzY0X0RFTEFZX0gKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotZXh0ZXJuIHZvaWQgX19iYWRfdWRlbGF5KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19iYWRfbmRlbGF5KHZvaWQpOwotCi1leHRlcm4gdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKLWV4dGVybiB2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnNlY3MpOwotZXh0ZXJuIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwotCi0jZGVmaW5lIHVkZWxheShuKSAoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCi0JKChuKSA+IDIwMDAwID8gX19iYWRfdWRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiAweDEwYzd1bCkpIDogXAotCV9fdWRlbGF5KG4pKQotCQotI2RlZmluZSBuZGVsYXkobikgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAotCSgobikgPiAyMDAwMCA/IF9fYmFkX25kZWxheSgpIDogX19jb25zdF91ZGVsYXkoKG4pICogNXVsKSkgOiBcCi0JX19uZGVsYXkobikpCitleHRlcm4gdm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CisjZGVmaW5lIG1kZWxheShuKQl1ZGVsYXkoKG4pICogMTAwMCkKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAotI2VuZGlmIC8qIGRlZmluZWQoX19TUEFSQzY0X0RFTEFZX0gpICovCisjZW5kaWYgLyogX1NQQVJDNjRfREVMQVlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mYi5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2QzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZiLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2h2dHJhbXAuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHZ0cmFtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGQ2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2h2dHJhbXAuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9TUEFSQzY0X0hWVFJBUF9ICisjZGVmaW5lIF9TUEFSQzY0X0hWVFJBUF9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaHZ0cmFtcF9tYXBwaW5nIHsKKwlfX3U2NAkJdmFkZHI7CisJX191NjQJCXR0ZTsKK307CisKK3N0cnVjdCBodnRyYW1wX2Rlc2NyIHsKKwlfX3UzMgkJCWNwdTsKKwlfX3UzMgkJCW51bV9tYXBwaW5nczsKKwlfX3U2NAkJCWZhdWx0X2luZm9fdmE7CisJX191NjQJCQlmYXVsdF9pbmZvX3BhOworCV9fdTY0CQkJdGhyZWFkX3JlZzsKKwlzdHJ1Y3QgaHZ0cmFtcF9tYXBwaW5nCW1hcHNbMl07Cit9OworCitleHRlcm4gdm9pZCBodl9jcHVfc3RhcnR1cCh1bnNpZ25lZCBsb25nIGh2ZGVzY3JfcGEpOworCisjZW5kaWYKKworI2RlZmluZSBIVlRSQU1QX0RFU0NSX0NQVQkJMHgwMAorI2RlZmluZSBIVlRSQU1QX0RFU0NSX05VTV9NQVBQSU5HUwkweDA0CisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfRkFVTFRfSU5GT19WQQkweDA4CisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfRkFVTFRfSU5GT19QQQkweDEwCisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfVEhSRUFEX1JFRwkweDE4CisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfTUFQUwkJMHgyMAorCisjZGVmaW5lIEhWVFJBTVBfTUFQUElOR19WQUREUgkJMHgwMAorI2RlZmluZSBIVlRSQU1QX01BUFBJTkdfVFRFCQkweDA4CisjZGVmaW5lIEhWVFJBTVBfTUFQUElOR19TSVpFCQkweDEwCisKKyNlbmRpZiAvKiBfU1BBUkM2NF9IVlRSQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9oeXBlcnZpc29yLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaAppbmRleCBkYjIxMzBhLi41MjRkNDk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaApAQCAtOTgsNyArOTgsNyBAQAogI2RlZmluZSBIVl9GQVNUX01BQ0hfRVhJVAkJMHgwMAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwotZXh0ZXJuIHZvaWQgc3VuNHZfbWFjaF9leGl0KHVuc2lnbmVkIGxvbmcgZXhpdF9jb3JlKTsKK2V4dGVybiB2b2lkIHN1bjR2X21hY2hfZXhpdCh1bnNpZ25lZCBsb25nIGV4aXRfY29kZSk7CiAjZW5kaWYKIAogLyogRG9tYWluIHNlcnZpY2VzLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lycS5oCmluZGV4IDkwNzgxZTMuLmU2YzQzNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaApAQCAtNTMsNiArNTMsOCBAQAogZXh0ZXJuIHZvaWQgc3VuNHZfZGVzdHJveV9tc2kodW5zaWduZWQgaW50IHZpcnRfaXJxKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEodm9pZCAqc2J1cywgdW5zaWduZWQgaW50IGlubyk7CiAKK2V4dGVybiB2b2lkIGZpeHVwX2lycXModm9pZCk7CisKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X3NvZnRpbnQodW5zaWduZWQgbG9uZyBiaXRzKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cgklMCwgMHgwLCAlJXNldF9zb2Z0aW50IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9sZGMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbGRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiNTI0YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbGRjLmgKQEAgLTAsMCArMSwxMzggQEAKKyNpZm5kZWYgX1NQQVJDNjRfTERDX0gKKyNkZWZpbmUgX1NQQVJDNjRfTERDX0gKKworI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CisKK2V4dGVybiBpbnQgbGRvbV9kb21haW5pbmdfZW5hYmxlZDsKK2V4dGVybiB2b2lkIGxkb21fc2V0X3Zhcihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGxkb21fcmVib290KGNvbnN0IGNoYXIgKmJvb3RfY29tbWFuZCk7CitleHRlcm4gdm9pZCBsZG9tX3Bvd2VyX29mZih2b2lkKTsKKworLyogVGhlIGV2ZW50IGhhbmRsZXIgd2lsbCBiZSBldm9rZWQgd2hlbiBsaW5rIHN0YXRlIGNoYW5nZXMKKyAqIG9yIGRhdGEgYmVjb21lcyBhdmFpbGFibGUgb24gdGhlIHJlY2VpdmUgc2lkZS4KKyAqCisgKiBGb3Igbm9uLVJBVyBsaW5rcywgaWYgdGhlIExEQ19FVkVOVF9SRVNFVCBldmVudCBhcnJpdmVzIHRoZQorICogZHJpdmVyIHNob3VsZCByZXNldCBhbGwgb2YgaXQncyBpbnRlcm5hbCBzdGF0ZSBhbmQgcmVpbnZva2UKKyAqIGxkY19jb25uZWN0KCkgdG8gdHJ5IGFuZCBicmluZyB0aGUgbGluayB1cCBhZ2Fpbi4KKyAqCisgKiBGb3IgUkFXIGxpbmtzLCBsZGNfY29ubmVjdCgpIGlzIG5vdCB1c2VkLiAgSW5zdGVhZCB0aGUgZHJpdmVyCisgKiBqdXN0IHdhaXRzIGZvciB0aGUgTERDX0VWRU5UX1VQIGV2ZW50LgorICovCitzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIHsKKwl2b2lkICgqZXZlbnQpKHZvaWQgKmFyZywgaW50IGV2ZW50KTsKKworCXUzMgkJCW10dTsKKwl1bnNpZ25lZCBpbnQJCXJ4X2lycTsKKwl1bnNpZ25lZCBpbnQJCXR4X2lycTsKKwl1OAkJCW1vZGU7CisjZGVmaW5lIExEQ19NT0RFX1JBVwkJMHgwMAorI2RlZmluZSBMRENfTU9ERV9VTlJFTElBQkxFCTB4MDEKKyNkZWZpbmUgTERDX01PREVfUkVTRVJWRUQJMHgwMgorI2RlZmluZSBMRENfTU9ERV9TVFJFQU0JCTB4MDMKKworCXU4CQkJZGVidWc7CisjZGVmaW5lIExEQ19ERUJVR19IUwkJMHgwMQorI2RlZmluZSBMRENfREVCVUdfU1RBVEUJCTB4MDIKKyNkZWZpbmUgTERDX0RFQlVHX1JYCQkweDA0CisjZGVmaW5lIExEQ19ERUJVR19UWAkJMHgwOAorI2RlZmluZSBMRENfREVCVUdfREFUQQkJMHgxMAorfTsKKworI2RlZmluZSBMRENfRVZFTlRfUkVTRVQJCTB4MDEKKyNkZWZpbmUgTERDX0VWRU5UX1VQCQkweDAyCisjZGVmaW5lIExEQ19FVkVOVF9EQVRBX1JFQURZCTB4MDQKKworI2RlZmluZSBMRENfU1RBVEVfSU5WQUxJRAkweDAwCisjZGVmaW5lIExEQ19TVEFURV9JTklUCQkweDAxCisjZGVmaW5lIExEQ19TVEFURV9CT1VORAkJMHgwMgorI2RlZmluZSBMRENfU1RBVEVfUkVBRFkJCTB4MDMKKyNkZWZpbmUgTERDX1NUQVRFX0NPTk5FQ1RFRAkweDA0CisKK3N0cnVjdCBsZGNfY2hhbm5lbDsKKworLyogQWxsb2NhdGUgc3RhdGUgZm9yIGEgY2hhbm5lbC4gICovCitleHRlcm4gc3RydWN0IGxkY19jaGFubmVsICpsZGNfYWxsb2ModW5zaWduZWQgbG9uZyBpZCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgKmNmZ3AsCisJCQkJICAgICB2b2lkICpldmVudF9hcmcpOworCisvKiBTaHV0IGRvd24gYW5kIGZyZWUgc3RhdGUgZm9yIGEgY2hhbm5lbC4gICovCitleHRlcm4gdm9pZCBsZGNfZnJlZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKTsKKworLyogUmVnaXN0ZXIgVFggYW5kIFJYIHF1ZXVlcyBvZiB0aGUgbGluayB3aXRoIHRoZSBoeXBlcnZpc29yLiAgKi8KK2V4dGVybiBpbnQgbGRjX2JpbmQoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIEZvciBub24tUkFXIHByb3RvY29scyB3ZSBuZWVkIHRvIGNvbXBsZXRlIGEgaGFuZHNoYWtlIGJlZm9yZQorICogY29tbXVuaWNhdGlvbiBjYW4gcHJvY2VlZC4gIGxkY19jb25uZWN0KCkgZG9lcyB0aGF0LCBpZiB0aGUKKyAqIGhhbmRzaGFrZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBhbiBMRENfRVZFTlRfVVAgZXZlbnQgd2lsbAorICogYmUgc2VudCB1cCB0byB0aGUgZHJpdmVyLgorICovCitleHRlcm4gaW50IGxkY19jb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApOworZXh0ZXJuIGludCBsZGNfZGlzY29ubmVjdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKTsKKworZXh0ZXJuIGludCBsZGNfc3RhdGUoc3RydWN0IGxkY19jaGFubmVsICpscCk7CisKKy8qIFJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuICBPbmx5IHZhbGlkIHdoZW4gdGhlIGxpbmsgaXMgdXAuICAqLworZXh0ZXJuIGludCBsZGNfd3JpdGUoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLAorCQkgICAgIHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiBpbnQgbGRjX3JlYWQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKyNkZWZpbmUgTERDX01BUF9TSEFET1cJMHgwMQorI2RlZmluZSBMRENfTUFQX0RJUkVDVAkweDAyCisjZGVmaW5lIExEQ19NQVBfSU8JMHgwNAorI2RlZmluZSBMRENfTUFQX1IJMHgwOAorI2RlZmluZSBMRENfTUFQX1cJMHgxMAorI2RlZmluZSBMRENfTUFQX1gJMHgyMAorI2RlZmluZSBMRENfTUFQX1JXCShMRENfTUFQX1IgfCBMRENfTUFQX1cpCisjZGVmaW5lIExEQ19NQVBfUldYCShMRENfTUFQX1IgfCBMRENfTUFQX1cgfCBMRENfTUFQX1gpCisjZGVmaW5lIExEQ19NQVBfQUxMCTB4MDNmCisKK3N0cnVjdCBsZGNfdHJhbnNfY29va2llIHsKKwl1NjQJCQljb29raWVfYWRkcjsKKwl1NjQJCQljb29raWVfc2l6ZTsKK307CisKK3N0cnVjdCBzY2F0dGVybGlzdDsKK2V4dGVybiBpbnQgbGRjX21hcF9zZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbnVtX3NnLAorCQkgICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pOworCitleHRlcm4gaW50IGxkY19tYXBfc2luZ2xlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCSAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkJCSAgdW5zaWduZWQgaW50IG1hcF9wZXJtKTsKKworZXh0ZXJuIHZvaWQgbGRjX3VubWFwKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkgICAgICBpbnQgbmNvb2tpZXMpOworCitleHRlcm4gaW50IGxkY19jb3B5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGludCBjb3B5X2RpciwKKwkJICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCSAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKTsKKworc3RhdGljIGlubGluZSBpbnQgbGRjX2dldF9kcmluZ19lbnRyeShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCSAgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywKKwkJCQkgICAgICBpbnQgbmNvb2tpZXMpCit7CisJcmV0dXJuIGxkY19jb3B5KGxwLCBMRENfQ09QWV9JTiwgYnVmLCBsZW4sIG9mZnNldCwgY29va2llcywgbmNvb2tpZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZGNfcHV0X2RyaW5nX2VudHJ5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJICAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkJCSAgICAgIGludCBuY29va2llcykKK3sKKwlyZXR1cm4gbGRjX2NvcHkobHAsIExEQ19DT1BZX09VVCwgYnVmLCBsZW4sIG9mZnNldCwgY29va2llcywgbmNvb2tpZXMpOworfQorCitleHRlcm4gdm9pZCAqbGRjX2FsbG9jX2V4cF9kcmluZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywKKwkJCQkgaW50ICpuY29va2llcywgdW5zaWduZWQgaW50IG1hcF9wZXJtKTsKKworZXh0ZXJuIHZvaWQgbGRjX2ZyZWVfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMpOworCisjZW5kaWYgLyogX1NQQVJDNjRfTERDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbWRlc2MuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbWRlc2MuaAppbmRleCBjNjM4Mzk4Li5lOTdjNDMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L21kZXNjLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tZGVzYy5oCkBAIC0yLDM4ICsyLDY2IEBACiAjZGVmaW5lIF9TUEFSQzY0X01ERVNDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKLXN0cnVjdCBtZGVzY19ub2RlOwotc3RydWN0IG1kZXNjX2FyYyB7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0Jc3RydWN0IG1kZXNjX25vZGUJKmFyYzsKLX07CitzdHJ1Y3QgbWRlc2NfaGFuZGxlOwogCi1zdHJ1Y3QgbWRlc2Nfbm9kZSB7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0JdTY0CQkJbm9kZTsKLQl1bnNpZ25lZCBpbnQJCXVuaXF1ZV9pZDsKLQl1bnNpZ25lZCBpbnQJCW51bV9hcmNzOwotCXVuc2lnbmVkIGludAkJaXJxc1syXTsKLQlzdHJ1Y3QgcHJvcGVydHkJCSpwcm9wZXJ0aWVzOwotCXN0cnVjdCBtZGVzY19ub2RlCSpoYXNoX25leHQ7Ci0Jc3RydWN0IG1kZXNjX25vZGUJKmFsbG5vZGVzX25leHQ7Ci0Jc3RydWN0IG1kZXNjX2FyYwlhcmNzWzBdOwotfTsKKy8qIE1hY2hpbmUgZGVzY3JpcHRpb24gb3BlcmF0aW9ucyBhcmUgdG8gYmUgc3Vycm91bmRlZCBieSBncmFiIGFuZAorICogcmVsZWFzZSBjYWxscy4gIFRoZSBtZGVzY19oYW5kbGUgcmV0dXJuZWQgZnJvbSB0aGUgZ3JhYiBpcworICogdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGFsbCBvZiB0aGUgb3BlcmF0aW9uYWwgY2FsbHMgdGhhdCB3b3JrCisgKiBvbiBtZGVzY3MuCisgKi8KK2V4dGVybiBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19ncmFiKHZvaWQpOworZXh0ZXJuIHZvaWQgbWRlc2NfcmVsZWFzZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICopOwogCi1leHRlcm4gc3RydWN0IG1kZXNjX25vZGUgKm1kX2ZpbmRfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19ub2RlICpmcm9tLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSk7Ci0jZGVmaW5lIG1kX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShfX21uLCBfX25hbWUpIFwKLQlmb3IgKF9fbW4gPSBtZF9maW5kX25vZGVfYnlfbmFtZShOVUxMLCBfX25hbWUpOyBfX21uOyBcCi0JICAgICBfX21uID0gbWRfZmluZF9ub2RlX2J5X25hbWUoX19tbiwgX19uYW1lKSkKKyNkZWZpbmUgTURFU0NfTk9ERV9OVUxMCQkofih1NjQpMCkKIAotZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqbWRfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsCi0JCQkJCSBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgaW50ICpsZW5wKTsKLWV4dGVybiBjb25zdCB2b2lkICptZF9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IG1kZXNjX25vZGUgKm1wLAotCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgaW50ICpsZW5wKTsKK2V4dGVybiB1NjQgbWRlc2Nfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgIHU2NCBmcm9tX25vZGUsIGNvbnN0IGNoYXIgKm5hbWUpOworI2RlZmluZSBtZGVzY19mb3JfZWFjaF9ub2RlX2J5X25hbWUoX19oZGwsIF9fbm9kZSwgX19uYW1lKSBcCisJZm9yIChfX25vZGUgPSBtZGVzY19ub2RlX2J5X25hbWUoX19oZGwsIE1ERVNDX05PREVfTlVMTCwgX19uYW1lKTsgXAorCSAgICAgKF9fbm9kZSkgIT0gTURFU0NfTk9ERV9OVUxMOyBcCisJICAgICBfX25vZGUgPSBtZGVzY19ub2RlX2J5X25hbWUoX19oZGwsIF9fbm9kZSwgX19uYW1lKSkKKworLyogQWNjZXNzIHRvIHByb3BlcnR5IHZhbHVlcyByZXR1cm5lZCBmcm9tIG1kZXNjX2dldF9wcm9wZXJ0eSgpIGFyZQorICogb25seSB2YWxpZCBpbnNpZGUgb2YgYSBtZGVzY19ncmFiKCkvbWRlc2NfcmVsZWFzZSgpIHNlcXVlbmNlLgorICogT25jZSBtZGVzY19yZWxlYXNlKCkgaXMgY2FsbGVkLCB0aGUgbWVtb3J5IGJhY2tlZCB1cCBieSB0aGVzZQorICogcG9pbnRlcnMgbWF5IHJlZmVyZW5jZSBmcmVlZCB1cCBtZW1vcnkuCisgKgorICogVGhlcmVmb3JlIGNhbGxlcnMgbXVzdCBtYWtlIGNvcGllcyBvZiBhbnkgcHJvcGVydHkgdmFsdWVzCisgKiB0aGV5IG5lZWQuCisgKgorICogVGhlc2Ugc2FtZSBydWxlcyBhcHBseSB0byBtZGVzY19ub2RlX25hbWUoKS4KKyAqLworZXh0ZXJuIGNvbnN0IHZvaWQgKm1kZXNjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICAgdTY0IG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCk7CitleHRlcm4gY29uc3QgY2hhciAqbWRlc2Nfbm9kZV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbm9kZSk7CisKKy8qIE1EIGFyYyBpdGVyYXRpb24sIHRoZSBzdGFuZGFyZCBzZXF1ZW5jZSBpczoKKyAqCisgKgl1bnNpZ25lZCBsb25nIGFyYzsKKyAqCW1kZXNjX2Zvcl9lYWNoX2FyYyhhcmMsIGhhbmRsZSwgbm9kZSwgTURFU0NfQVJDX1RZUEVfe0ZXRCxCQUNLfSkgeworICoJCXVuc2lnbmVkIGxvbmcgdGFyZ2V0ID0gbWRlc2NfYXJjX3RhcmdldChoYW5kbGUsIGFyYyk7CisgKgkJLi4uCisgKgl9CisgKi8KKworI2RlZmluZSBNREVTQ19BUkNfVFlQRV9GV0QJImZ3ZCIKKyNkZWZpbmUgTURFU0NfQVJDX1RZUEVfQkFDSwkiYmFjayIKKworZXh0ZXJuIHU2NCBtZGVzY19uZXh0X2FyYyhzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUsIHU2NCBmcm9tLAorCQkJICBjb25zdCBjaGFyICphcmNfdHlwZSk7CisjZGVmaW5lIG1kZXNjX2Zvcl9lYWNoX2FyYyhfX2FyYywgX19oZGwsIF9fbm9kZSwgX190eXBlKSBcCisJZm9yIChfX2FyYyA9IG1kZXNjX25leHRfYXJjKF9faGRsLCBfX25vZGUsIF9fdHlwZSk7IFwKKwkgICAgIChfX2FyYykgIT0gTURFU0NfTk9ERV9OVUxMOyBcCisJICAgICBfX2FyYyA9IG1kZXNjX25leHRfYXJjKF9faGRsLCBfX2FyYywgX190eXBlKSkKKworZXh0ZXJuIHU2NCBtZGVzY19hcmNfdGFyZ2V0KHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgYXJjKTsKKworZXh0ZXJuIHZvaWQgbWRlc2NfdXBkYXRlKHZvaWQpOworCitleHRlcm4gdm9pZCBtZGVzY19maWxsX2luX2NwdV9kYXRhKGNwdW1hc2tfdCBtYXNrKTsKIAogZXh0ZXJuIHZvaWQgc3VuNHZfbWRlc2NfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oCmluZGV4IDhkMTI5MDMuLjlmYzIyNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmgKQEAgLTc2LDYgKzc2LDkgQEAKIAl1bnNpZ25lZCBsb25nIGN0eF92YWxpZCwgZmxhZ3M7CiAJaW50IGNwdTsKIAorCWlmICh1bmxpa2VseShtbSA9PSAmaW5pdF9tbSkpCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZtbS0+Y29udGV4dC5sb2NrLCBmbGFncyk7CiAJY3R4X3ZhbGlkID0gQ1RYX1ZBTElEKG1tLT5jb250ZXh0KTsKIAlpZiAoIWN0eF92YWxpZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmgKaW5kZXggOWU4MGFkNC4uMDM5MzM4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmgKQEAgLTU3MywyNCArNTczLDYgQEAKIAlyZXR1cm4gKHB0ZV92YWwocHRlKSAmIG1hc2spOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX3JlYWQocHRlX3QgcHRlKQotewotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJcbjY2MToJbW92CQklMSwgJTBcbiIKLQkiCW5vcFxuIgotCSIJLnNlY3Rpb24JLnN1bjR2XzJpbnNuX3BhdGNoLCBcImF4XCJcbiIKLQkiCS53b3JkCQk2NjFiXG4iCi0JIglzZXRoaQkJJSV1aGkoJTIpLCAlMFxuIgotCSIJc2xseAkJJTAsIDMyLCAlMFxuIgotCSIJLnByZXZpb3VzXG4iCi0JOiAiPXIiIChtYXNrKQotCTogImkiIChfUEFHRV9SRUFEXzRVKSwgImkiIChfUEFHRV9SRUFEXzRWKSk7Ci0KLQlyZXR1cm4gKHB0ZV92YWwocHRlKSAmIG1hc2spOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX2ZpbGUocHRlX3QgcHRlKQogewogCXVuc2lnbmVkIGxvbmcgdmFsID0gcHRlX3ZhbChwdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wb3dlci5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wb3dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDk1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Bvd2VyLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9TUEFSQzY0X1BPV0VSX0gKKyNkZWZpbmUgX1NQQVJDNjRfUE9XRVJfSAorCitleHRlcm4gdm9pZCB3YWtlX3VwX3Bvd2VyZCh2b2lkKTsKK2V4dGVybiBpbnQgc3RhcnRfcG93ZXJkKHZvaWQpOworCisjZW5kaWYgLyogIShfU1BBUkM2NF9QT1dFUl9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc21wLmgKaW5kZXggNGZiOGM0Yi4uZThhOTZhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NtcC5oCkBAIC0yOSw5ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAotZXh0ZXJuIGNwdW1hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcDsKLSNkZWZpbmUgY3B1X3Bvc3NpYmxlX21hcCBwaHlzX2NwdV9wcmVzZW50X21hcAotCiBleHRlcm4gY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXTsKIGV4dGVybiBjcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdOwogZXh0ZXJuIGludCBzcGFyYzY0X211bHRpX2NvcmU7CkBAIC00NCw3ICs0MSwxMiBAQAogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKIAogZXh0ZXJuIHZvaWQgc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcyh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOworZXh0ZXJuIHZvaWQgY3B1X3BsYXlfZGVhZCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorZXh0ZXJuIGludCBfX2NwdV9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpOworI2VuZGlmCiAKICNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KIApAQCAtNTIsNyArNTQsNiBAQAogCiAjZGVmaW5lIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpCQkwCiAjZGVmaW5lIHNtcF9maWxsX2luX3NpYl9jb3JlX21hcHMoKSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGJvb3RfY3B1X2lkCSgwKQogCiAjZW5kaWYgLyogIShDT05GSUdfU01QKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Zpby5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC92aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M5NjQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC92aW8uaApAQCAtMCwwICsxLDQwNCBAQAorI2lmbmRlZiBfU1BBUkM2NF9WSU9fSAorI2RlZmluZSBfU1BBUkM2NF9WSU9fSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL21kZXNjLmg+CisKK3N0cnVjdCB2aW9fbXNnX3RhZyB7CisJdTgJCQl0eXBlOworI2RlZmluZSBWSU9fVFlQRV9DVFJMCQkweDAxCisjZGVmaW5lIFZJT19UWVBFX0RBVEEJCTB4MDIKKyNkZWZpbmUgVklPX1RZUEVfRVJSCQkweDA0CisKKwl1OAkJCXN0eXBlOworI2RlZmluZSBWSU9fU1VCVFlQRV9JTkZPCTB4MDEKKyNkZWZpbmUgVklPX1NVQlRZUEVfQUNLCQkweDAyCisjZGVmaW5lIFZJT19TVUJUWVBFX05BQ0sJMHgwNAorCisJdTE2CQkJc3R5cGVfZW52OworI2RlZmluZSBWSU9fVkVSX0lORk8JCTB4MDAwMQorI2RlZmluZSBWSU9fQVRUUl9JTkZPCQkweDAwMDIKKyNkZWZpbmUgVklPX0RSSU5HX1JFRwkJMHgwMDAzCisjZGVmaW5lIFZJT19EUklOR19VTlJFRwkJMHgwMDA0CisjZGVmaW5lIFZJT19SRFgJCQkweDAwMDUKKyNkZWZpbmUgVklPX1BLVF9EQVRBCQkweDAwNDAKKyNkZWZpbmUgVklPX0RFU0NfREFUQQkJMHgwMDQxCisjZGVmaW5lIFZJT19EUklOR19EQVRBCQkweDAwNDIKKyNkZWZpbmUgVk5FVF9NQ0FTVF9JTkZPCQkweDAxMDEKKworCXUzMgkJc2lkOworfTsKKworc3RydWN0IHZpb19yZHggeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJcmVzdls2XTsKK307CisKK3N0cnVjdCB2aW9fdmVyX2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTE2CQkJbWFqb3I7CisJdTE2CQkJbWlub3I7CisJdTgJCQlkZXZfY2xhc3M7CisjZGVmaW5lIFZERVZfTkVUV09SSwkJMHgwMQorI2RlZmluZSBWREVWX05FVFdPUktfU1dJVENICTB4MDIKKyNkZWZpbmUgVkRFVl9ESVNLCQkweDAzCisjZGVmaW5lIFZERVZfRElTS19TRVJWRVIJMHgwNAorCisJdTgJCQlyZXN2MVszXTsKKwl1NjQJCQlyZXN2Mls1XTsKK307CisKK3N0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJZHJpbmdfaWRlbnQ7CisJdTMyCQkJbnVtX2Rlc2NyOworCXUzMgkJCWRlc2NyX3NpemU7CisJdTE2CQkJb3B0aW9uczsKKyNkZWZpbmUgVklPX1RYX0RSSU5HCQkweDAwMDEKKyNkZWZpbmUgVklPX1JYX0RSSU5HCQkweDAwMDIKKwl1MTYJCQlyZXN2OworCXUzMgkJCW51bV9jb29raWVzOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbMF07Cit9OworCitzdHJ1Y3QgdmlvX2RyaW5nX3VucmVnaXN0ZXIgeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJZHJpbmdfaWRlbnQ7CisJdTY0CQkJcmVzdls1XTsKK307CisKKy8qIERhdGEgdHJhbnNmZXIgbW9kZXMgKi8KKyNkZWZpbmUgVklPX1BLVF9NT0RFCQkweDAxIC8qIFBhY2tldCBiYXNlZCB0cmFuc2ZlcgkqLworI2RlZmluZSBWSU9fREVTQ19NT0RFCQkweDAyIC8qIEluLWJhbmQgZGVzY3JpcHRvcnMJKi8KKyNkZWZpbmUgVklPX0RSSU5HX01PREUJCTB4MDMgLyogRGVzY3JpcHRvciByaW5ncwkqLworCitzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJc2VxOworCXU2NAkJCWRyaW5nX2lkZW50OworCXUzMgkJCXN0YXJ0X2lkeDsKKwl1MzIJCQllbmRfaWR4OworCXU4CQkJc3RhdGU7CisjZGVmaW5lIFZJT19EUklOR19BQ1RJVkUJMHgwMQorI2RlZmluZSBWSU9fRFJJTkdfU1RPUFBFRAkweDAyCisKKwl1OAkJCV9fcGFkMTsKKwl1MTYJCQlfX3BhZDI7CisJdTMyCQkJX19wYWQzOworCXU2NAkJCV9fcGFyNFsyXTsKK307CisKK3N0cnVjdCB2aW9fZHJpbmdfaGRyIHsKKwl1OAkJCXN0YXRlOworI2RlZmluZSBWSU9fREVTQ19GUkVFCQkweDAxCisjZGVmaW5lIFZJT19ERVNDX1JFQURZCQkweDAyCisjZGVmaW5lIFZJT19ERVNDX0FDQ0VQVEVECTB4MDMKKyNkZWZpbmUgVklPX0RFU0NfRE9ORQkJMHgwNAorCXU4CQkJYWNrOworI2RlZmluZSBWSU9fQUNLX0VOQUJMRQkJMHgwMQorI2RlZmluZSBWSU9fQUNLX0RJU0FCTEUJCTB4MDAKKworCXUxNgkJCV9fcGFkMTsKKwl1MzIJCQlfX3BhZDI7Cit9OworCisvKiBWSU8gZGlzayBzcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzICovCitzdHJ1Y3QgdmlvX2Rpc2tfYXR0cl9pbmZvIHsKKwlzdHJ1Y3QgdmlvX21zZ190YWcJdGFnOworCXU4CQkJeGZlcl9tb2RlOworCXU4CQkJdmRpc2tfdHlwZTsKKyNkZWZpbmUgVkRfRElTS19UWVBFX1NMSUNFCTB4MDEgLyogU2xpY2UgaW4gYmxvY2sgZGV2aWNlCSovCisjZGVmaW5lIFZEX0RJU0tfVFlQRV9ESVNLCTB4MDIgLyogRW50aXJlIGJsb2NrIGRldmljZQkqLworCXUxNgkJCXJlc3YxOworCXUzMgkJCXZkaXNrX2Jsb2NrX3NpemU7CisJdTY0CQkJb3BlcmF0aW9uczsKKwl1NjQJCQl2ZGlza19zaXplOworCXU2NAkJCW1heF94ZmVyX3NpemU7CisJdTY0CQkJcmVzdjJbMl07Cit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZGVzYyB7CisJc3RydWN0IHZpb19kcmluZ19oZHIJaGRyOworCXU2NAkJCXJlcV9pZDsKKwl1OAkJCW9wZXJhdGlvbjsKKyNkZWZpbmUgVkRfT1BfQlJFQUQJCTB4MDEgLyogQmxvY2sgcmVhZAkJCSovCisjZGVmaW5lIFZEX09QX0JXUklURQkJMHgwMiAvKiBCbG9jayB3cml0ZQkJCSovCisjZGVmaW5lIFZEX09QX0ZMVVNICQkweDAzIC8qIEZsdXNoIGRpc2sgY29udGVudHMJCSovCisjZGVmaW5lIFZEX09QX0dFVF9XQ0UJCTB4MDQgLyogR2V0IHdyaXRlLWNhY2hlIHN0YXR1cwkJKi8KKyNkZWZpbmUgVkRfT1BfU0VUX1dDRQkJMHgwNSAvKiBFbmFibGUvZGlzYWJsZSB3cml0ZS1jYWNoZQkqLworI2RlZmluZSBWRF9PUF9HRVRfVlRPQwkJMHgwNiAvKiBHZXQgVlRPQwkJCSovCisjZGVmaW5lIFZEX09QX1NFVF9WVE9DCQkweDA3IC8qIFNldCBWVE9DCQkJKi8KKyNkZWZpbmUgVkRfT1BfR0VUX0RJU0tHRU9NCTB4MDggLyogR2V0IGRpc2sgZ2VvbWV0cnkJCSovCisjZGVmaW5lIFZEX09QX1NFVF9ESVNLR0VPTQkweDA5IC8qIFNldCBkaXNrIGdlb21ldHJ5CQkqLworI2RlZmluZSBWRF9PUF9TQ1NJQ01ECQkweDBhIC8qIFNDU0kgY29udHJvbCBjb21tYW5kCQkqLworI2RlZmluZSBWRF9PUF9HRVRfREVWSUQJCTB4MGIgLyogR2V0IGRldmljZSBJRAkJCSovCisjZGVmaW5lIFZEX09QX0dFVF9FRkkJCTB4MGMgLyogR2V0IEVGSQkJCQkqLworI2RlZmluZSBWRF9PUF9TRVRfRUZJCQkweDBkIC8qIFNldCBFRkkJCQkJKi8KKwl1OAkJCXNsaWNlOworCXUxNgkJCXJlc3YxOworCXUzMgkJCXN0YXR1czsKKwl1NjQJCQlvZmZzZXQ7CisJdTY0CQkJc2l6ZTsKKwl1MzIJCQluY29va2llczsKKwl1MzIJCQlyZXN2MjsKKwlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZQljb29raWVzWzBdOworfTsKKworI2RlZmluZSBWSU9fRElTS19WTkFNRV9MRU4JOAorI2RlZmluZSBWSU9fRElTS19BTEFCRUxfTEVOCTEyOAorI2RlZmluZSBWSU9fRElTS19OVU1fUEFSVAk4CisKK3N0cnVjdCB2aW9fZGlza192dG9jIHsKKwl1OAkJCXZvbHVtZV9uYW1lW1ZJT19ESVNLX1ZOQU1FX0xFTl07CisJdTE2CQkJc2VjdG9yX3NpemU7CisJdTE2CQkJbnVtX3BhcnRpdGlvbnM7CisJdTgJCQlhc2NpaV9sYWJlbFtWSU9fRElTS19BTEFCRUxfTEVOXTsKKwlzdHJ1Y3QgeworCQl1MTYJCWlkOworCQl1MTYJCXBlcm1fZmxhZ3M7CisJCXUzMgkJcmVzdjsKKwkJdTY0CQlzdGFydF9ibG9jazsKKwkJdTY0CQludW1fYmxvY2tzOworCX0gcGFydGl0aW9uc1tWSU9fRElTS19OVU1fUEFSVF07Cit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZ2VvbSB7CisJdTE2CQkJbnVtX2N5bDsgLyogTnVtIGRhdGEgY3lsaW5kZXJzCQkqLworCXUxNgkJCWFsdF9jeWw7IC8qIE51bSBhbHRlcm5hdGUgY3lsaW5kZXJzCSovCisJdTE2CQkJYmVnX2N5bDsgLyogQ3lsIG9mZiBvZiBmaXhlZCBoZWFkIGFyZWEJKi8KKwl1MTYJCQludW1faGQ7ICAvKiBOdW0gaGVhZHMJCQkqLworCXUxNgkJCW51bV9zZWM7IC8qIE51bSBzZWN0b3JzCQkJKi8KKwl1MTYJCQlpZmFjdDsgICAvKiBJbnRlcmxlYXZlIGZhY3RvcgkJKi8KKwl1MTYJCQlhcGM7ICAgICAvKiBBbHRzIHBlciBjeWxpbmRlciAoU0NTSSkJKi8KKwl1MTYJCQlycG07CSAvKiBSZXZvbHV0aW9ucyBwZXIgbWludXRlCSovCisJdTE2CQkJcGh5X2N5bDsgLyogTnVtIHBoeXNpY2FsIGN5bGluZGVycwkqLworCXUxNgkJCXdyX3NraXA7IC8qIE51bSBzZWN0cyB0byBza2lwLCB3cml0ZXMJKi8KKwl1MTYJCQlyZF9za2lwOyAvKiBOdW0gc2VjdHMgdG8gc2tpcCwgd3JpdGVzCSovCit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZGV2aWQgeworCXUxNgkJCXJlc3Y7CisJdTE2CQkJdHlwZTsKKwl1MzIJCQlsZW47CisJY2hhcgkJCWlkWzBdOworfTsKKworc3RydWN0IHZpb19kaXNrX2VmaSB7CisJdTY0CQkJbGJhOworCXU2NAkJCWxlbjsKKwljaGFyCQkJZGF0YVswXTsKK307CisKKy8qIFZJTyBuZXQgc3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgZGVmaW5lcyAqLworc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvIHsKKwlzdHJ1Y3QgdmlvX21zZ190YWcJdGFnOworCXU4CQkJeGZlcl9tb2RlOworCXU4CQkJYWRkcl90eXBlOworI2RlZmluZSBWTkVUX0FERFJfRVRIRVJNQUMJMHgwMQorCXUxNgkJCWFja19mcmVxOworCXUzMgkJCXJlc3YxOworCXU2NAkJCWFkZHI7CisJdTY0CQkJbXR1OworCXU2NAkJCXJlc3YyWzNdOworfTsKKworI2RlZmluZSBWTkVUX05VTV9NQ0FTVAkJNworCitzdHJ1Y3QgdmlvX25ldF9tY2FzdF9pbmZvIHsKKwlzdHJ1Y3QgdmlvX21zZ190YWcJdGFnOworCXU4CQkJc2V0OworCXU4CQkJY291bnQ7CisJdTgJCQltY2FzdF9hZGRyW1ZORVRfTlVNX01DQVNUICogNl07CisJdTMyCQkJcmVzdjsKK307CisKK3N0cnVjdCB2aW9fbmV0X2Rlc2MgeworCXN0cnVjdCB2aW9fZHJpbmdfaGRyCWhkcjsKKwl1MzIJCQlzaXplOworCXUzMgkJCW5jb29raWVzOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbMF07Cit9OworCisjZGVmaW5lIFZJT19NQVhfUklOR19DT09LSUVTCTI0CisKK3N0cnVjdCB2aW9fZHJpbmdfc3RhdGUgeworCXU2NAkJCWlkZW50OworCXZvaWQJCQkqYmFzZTsKKwl1NjQJCQlzbmRfbnh0OworCXU2NAkJCXJjdl9ueHQ7CisJdTMyCQkJZW50cnlfc2l6ZTsKKwl1MzIJCQludW1fZW50cmllczsKKwl1MzIJCQlwcm9kOworCXUzMgkJCWNvbnM7CisJdTMyCQkJcGVuZGluZzsKKwlpbnQJCQluY29va2llczsKKwlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZQljb29raWVzW1ZJT19NQVhfUklOR19DT09LSUVTXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmlvX2RyaW5nX2N1cihzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlyZXR1cm4gZHItPmJhc2UgKyAoZHItPmVudHJ5X3NpemUgKiBkci0+cHJvZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmlvX2RyaW5nX2VudHJ5KHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIGRyLT5iYXNlICsgKGRyLT5lbnRyeV9zaXplICogaW5kZXgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB2aW9fZHJpbmdfYXZhaWwoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkJICB1bnNpZ25lZCBpbnQgcmluZ19zaXplKQoreworCS8qIEVuc3VyZSBidWlsZC10aW1lIHBvd2VyLW9mLTIuICAqLworCUJVSUxEX0JVR19PTihyaW5nX3NpemUgJiAocmluZ19zaXplIC0gMSkpOworCisJcmV0dXJuIChkci0+cGVuZGluZyAtCisJCSgoZHItPnByb2QgLSBkci0+Y29ucykgJiAocmluZ19zaXplIC0gMSkpKTsKK30KKworI2RlZmluZSBWSU9fTUFYX1RZUEVfTEVOCTY0CisjZGVmaW5lIFZJT19NQVhfQ09NUEFUX0xFTgk2NAorCitzdHJ1Y3QgdmlvX2RldiB7CisJdTY0CQkJbXA7CisJc3RydWN0IGRldmljZV9ub2RlCSpkcDsKKworCWNoYXIJCQl0eXBlW1ZJT19NQVhfVFlQRV9MRU5dOworCWNoYXIJCQljb21wYXRbVklPX01BWF9DT01QQVRfTEVOXTsKKwlpbnQJCQljb21wYXRfbGVuOworCisJdW5zaWduZWQgbG9uZwkJY2hhbm5lbF9pZDsKKworCXVuc2lnbmVkIGludAkJdHhfaXJxOworCXVuc2lnbmVkIGludAkJcnhfaXJxOworCisJc3RydWN0IGRldmljZQkJZGV2OworfTsKKworc3RydWN0IHZpb19kcml2ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQJCW5vZGU7CisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQJKmlkX3RhYmxlOworCWludCAoKnByb2JlKShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpOworCWludCAoKnJlbW92ZSkoc3RydWN0IHZpb19kZXYgKmRldik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgdmlvX2RldiAqZGV2KTsKKwl1bnNpZ25lZCBsb25nCQkJZHJpdmVyX2RhdGE7CisJc3RydWN0IGRldmljZV9kcml2ZXIJCWRyaXZlcjsKK307CisKK3N0cnVjdCB2aW9fdmVyc2lvbiB7CisJdTE2CQltYWpvcjsKKwl1MTYJCW1pbm9yOworfTsKKworc3RydWN0IHZpb19kcml2ZXJfc3RhdGU7CitzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMgeworCWludAkoKnNlbmRfYXR0cikoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CisJaW50CSgqaGFuZGxlX2F0dHIpKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCk7CisJdm9pZAkoKmhhbmRzaGFrZV9jb21wbGV0ZSkoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7Cit9OworCitzdHJ1Y3QgdmlvX2NvbXBsZXRpb24geworCXN0cnVjdCBjb21wbGV0aW9uCWNvbTsKKwlpbnQJCQllcnI7CisJaW50CQkJd2FpdGluZ19mb3I7Cit9OworCitzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSB7CisJLyogUHJvdGVjdHMgVklPIGhhbmRzaGFrZSBhbmQsIG9wdGlvbmFsbHksIGRyaXZlciBwcml2YXRlIHN0YXRlLiAgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IGxkY19jaGFubmVsCSpscDsKKworCXUzMgkJCV9wZWVyX3NpZDsKKwl1MzIJCQlfbG9jYWxfc2lkOworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUJZHJpbmdzWzJdOworI2RlZmluZSBWSU9fRFJJVkVSX1RYX1JJTkcJMAorI2RlZmluZSBWSU9fRFJJVkVSX1JYX1JJTkcJMQorCisJdTgJCQloc19zdGF0ZTsKKyNkZWZpbmUgVklPX0hTX0lOVkFMSUQJCTB4MDAKKyNkZWZpbmUgVklPX0hTX0dPVFZFUlMJCTB4MDEKKyNkZWZpbmUgVklPX0hTX0dPVF9BVFRSCQkweDA0CisjZGVmaW5lIFZJT19IU19TRU5UX0RSRUcJMHgwOAorI2RlZmluZSBWSU9fSFNfU0VOVF9SRFgJCTB4MTAKKyNkZWZpbmUgVklPX0hTX0dPVF9SRFhfQUNLCTB4MjAKKyNkZWZpbmUgVklPX0hTX0dPVF9SRFgJCTB4NDAKKyNkZWZpbmUgVklPX0hTX1NFTlRfUkRYX0FDSwkweDgwCisjZGVmaW5lIFZJT19IU19DT01QTEVURQkJKFZJT19IU19HT1RfUkRYX0FDSyB8IFZJT19IU19TRU5UX1JEWF9BQ0spCisKKwl1OAkJCWRldl9jbGFzczsKKworCXU4CQkJZHJfc3RhdGU7CisjZGVmaW5lIFZJT19EUl9TVEFURV9UWFJFRwkweDAxCisjZGVmaW5lIFZJT19EUl9TVEFURV9SWFJFRwkweDAyCisjZGVmaW5lIFZJT19EUl9TVEFURV9UWFJFUQkweDEwCisjZGVmaW5lIFZJT19EUl9TVEFURV9SWFJFUQkweDIwCisKKwl1OAkJCWRlYnVnOworI2RlZmluZSBWSU9fREVCVUdfSFMJCTB4MDEKKyNkZWZpbmUgVklPX0RFQlVHX0RBVEEJCTB4MDIKKworCXZvaWQJCQkqZGVzY19idWY7CisJdW5zaWduZWQgaW50CQlkZXNjX2J1Zl9sZW47CisKKwlzdHJ1Y3QgdmlvX2NvbXBsZXRpb24JKmNtcDsKKworCXN0cnVjdCB2aW9fZGV2CQkqdmRldjsKKworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCisJc3RydWN0IHZpb192ZXJzaW9uCXZlcjsKKworCXN0cnVjdCB2aW9fdmVyc2lvbgkqdmVyX3RhYmxlOworCWludAkJCXZlcl90YWJsZV9lbnRyaWVzOworCisJY2hhcgkJCSpuYW1lOworCisJc3RydWN0IHZpb19kcml2ZXJfb3BzCSpvcHM7Cit9OworCisjZGVmaW5lIHZpb2RiZyhUWVBFLCBmLCBhLi4uKSBcCitkbyB7CWlmICh2aW8tPmRlYnVnICYgVklPX0RFQlVHXyMjVFlQRSkgXAorCQlwcmludGsoS0VSTl9JTkZPICJ2aW86IElEWyVsdV0gIiBmLCBcCisJCSAgICAgICB2aW8tPnZkZXYtPmNoYW5uZWxfaWQsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCitleHRlcm4gaW50IHZpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpb19kcml2ZXIgKmRydik7CitleHRlcm4gdm9pZCB2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpb19kcml2ZXIgKmRydik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZpb19kcml2ZXIgKnRvX3Zpb19kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRydiwgc3RydWN0IHZpb19kcml2ZXIsIGRyaXZlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZpb19kZXYgKnRvX3Zpb19kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdmlvX2RldiwgZGV2KTsKK30KKworZXh0ZXJuIGludCB2aW9fbGRjX3NlbmQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqZGF0YSwgaW50IGxlbik7CitleHRlcm4gdm9pZCB2aW9fbGlua19zdGF0ZV9jaGFuZ2Uoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgaW50IGV2ZW50KTsKK2V4dGVybiB2b2lkIHZpb19jb25uX3Jlc2V0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pOworZXh0ZXJuIGludCB2aW9fY29udHJvbF9wa3RfZW5naW5lKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCk7CitleHRlcm4gaW50IHZpb192YWxpZGF0ZV9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX21zZ190YWcgKnRwKTsKK2V4dGVybiB1MzIgdmlvX3NlbmRfc2lkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pOworZXh0ZXJuIGludCB2aW9fbGRjX2FsbG9jKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyAqYmFzZV9jZmcsIHZvaWQgKmV2ZW50X2FyZyk7CitleHRlcm4gdm9pZCB2aW9fbGRjX2ZyZWUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CitleHRlcm4gaW50IHZpb19kcml2ZXJfaW5pdChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgIHU4IGRldl9jbGFzcywgc3RydWN0IHZpb192ZXJzaW9uICp2ZXJfdGFibGUsCisJCQkgICBpbnQgdmVyX3RhYmxlX3NpemUsIHN0cnVjdCB2aW9fZHJpdmVyX29wcyAqb3BzLAorCQkJICAgY2hhciAqbmFtZSk7CisKK2V4dGVybiB2b2lkIHZpb19wb3J0X3VwKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pOworCisjZW5kaWYgLyogX1NQQVJDNjRfVklPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaAppbmRleCAxYjEwOTBhLi44MzBmYzZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oCkBAIC0xNzUsMTIgKzE3NSw2IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4oKHB0ZV9nZXRfYml0cyhwdGUsIF9QQUdFX1VTRVIpKSAmJgotCSAgICAgICAhKHB0ZV9nZXRfYml0cyhwdGUsIF9QQUdFX1BST1ROT05FKSkpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCiB7IAogCXJldHVybigocHRlX2dldF9iaXRzKHB0ZSwgX1BBR0VfVVNFUikpICYmCkBAIC0yMzgsMTggKzIzMiw2IEBACiAJcmV0dXJuKHB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17IAotCXB0ZV9jbGVhcl9iaXRzKHB0ZSwgX1BBR0VfVVNFUik7Ci0JcmV0dXJuKHB0ZV9ta25ld3Byb3QocHRlKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCi17IAotCXB0ZV9jbGVhcl9iaXRzKHB0ZSwgX1BBR0VfVVNFUik7Ci0JcmV0dXJuKHB0ZV9ta25ld3Byb3QocHRlKSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXB0ZV9jbGVhcl9iaXRzKHB0ZSwgX1BBR0VfRElSVFkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXVtL3RocmVhZF9pbmZvLmgKaW5kZXggMThhMTNiYS4uNmU1ZmQ1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oCkBAIC01MiwxMCArNTIsMjEgQEAKIAlyZXR1cm4gdGk7CiB9CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKKworI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIFwKKwkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBcCisJCQkJCQkgQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikpCisjZWxzZQorCiAvKiB0aHJlYWQgaW5mb3JtYXRpb24gYWxsb2NhdGlvbiAqLwogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIFwKLQkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBrbWFsbG9jKFRIUkVBRF9TSVpFLCBHRlBfS0VSTkVMKSkKLSNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkga2ZyZWUodGkpCisJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBcCisJCQkJCQkgQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikpCisjZW5kaWYKKworI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBcCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykodGkpLENPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2ZiLmggYi9pbmNsdWRlL2FzbS12ODUwL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLXY4NTAvaW9jdGxzLmgKaW5kZXggMDVjMGRjOS4uNTMxM2FiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2lvY3Rscy5oCkBAIC00Niw2ICs0NiwxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tdjg1MC90ZXJtYml0cy5oCmluZGV4IDM1NDEyZjcuLjI5NWQ3YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTU2LDEwICsxNTcsMTIgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZQlJQlNISUZUCTE2CQkvKiBTaGlmciBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oCmluZGV4IGMyYzJiMWQuLmZjZDE3MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oCkBAIC04MCw4ICs4MCwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaAppbmRleCBiMzdhYjgyLi41M2NiOTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCkBAIC0zMyw4ICszMywxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIGNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ZiLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU0OGU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaAppbmRleCBlOTBlMTY3Li4yYWNiOWI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oCkBAIC0zNSw2ICszNSw4IEBACiAJVlNZU0NBTExfTEFTVF9QQUdFLAogCVZTWVNDQUxMX0ZJUlNUX1BBR0UgPSBWU1lTQ0FMTF9MQVNUX1BBR0UgKyAoKFZTWVNDQUxMX0VORC1WU1lTQ0FMTF9TVEFSVCkgPj4gUEFHRV9TSElGVCkgLSAxLAogCVZTWVNDQUxMX0hQRVQsCisJRklYX0RCR1BfQkFTRSwKKwlGSVhfRUFSTFlDT05fTUVNX0JBU0UsCiAJRklYX0hQRVRfQkFTRSwKIAlGSVhfQVBJQ19CQVNFLAkvKiBsb2NhbCAoQ1BVKSBBUElDKSAtLSByZXF1aXJlZCBmb3IgU01QIG9yIG5vdCAqLwogCUZJWF9JT19BUElDX0JBU0VfMCwKQEAgLTg0LDcgKzg2LDcgQEAKIAlpZiAoaWR4ID49IF9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcykKIAkJX190aGlzX2ZpeG1hcF9kb2VzX25vdF9leGlzdCgpOwogCi0gICAgICAgIHJldHVybiBfX2ZpeF90b192aXJ0KGlkeCk7CisJcmV0dXJuIF9fZml4X3RvX3ZpcnQoaWR4KTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaW8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oCmluZGV4IGRlMmNkOWEuLjc0NzUwOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oCkBAIC0xNDQsNiArMTQ0LDcgQEAKICAqLwogZXh0ZXJuIHZvaWQgX19pb21lbSAqIGlvcmVtYXBfbm9jYWNoZSAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBpb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CitleHRlcm4gdm9pZCBfX2lvbWVtICpmaXhfaW9yZW1hcCh1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxvbmcgcGh5cyk7CiAKIC8qCiAgKiBJU0EgSS9PIGJ1cyBtZW1vcnkgYWRkcmVzc2VzIGFyZSAxOjEgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCmluZGV4IGUzMjdjODMuLjg4YWRmMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaApAQCAtNDgsNyArNDgsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAvKgogICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCmluZGV4IDBhNzFlMGIuLjNiYTUzMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaApAQCAtMjY2LDIxICsyNjYsMTUgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwogI2RlZmluZSBfX0xBUkdFX1BURSAoX1BBR0VfUFNFfF9QQUdFX1BSRVNFTlQpCi1zdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX05YKTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2h1Z2UocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUFNFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1VTRVIpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0FDQ0VTU0VEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfUlcpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1VTRVIpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9OWCkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQpAQCAtMjkwLDEzICsyODQsNiBAQAogCiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JaWYgKCFwdGVfZGlydHkoKnB0ZXApKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwgJnB0ZXAtPnB0ZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CiAJaWYgKCFwdGVfeW91bmcoKnB0ZXApKQpAQCAtNDMzLDcgKzQyMCw2IEBACiAgICAoKChvKSAmICgxVUwgPDwgKF9fVklSVFVBTF9NQVNLX1NISUZULTEpKSkgPyAoKG8pIHwgKH5fX1ZJUlRVQUxfTUFTSykpIDogKG8pKQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSX0ZVTEwKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZmIuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmgKaW5kZXggMmQ0YjVkYi4uMDY4NTBmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCkBAIC0xOTcsMTYgKzE5NywxMyBAQAogCiAvKiBOb3RlOiBXZSB1c2UgdGhlIF9QQUdFX1VTRVIgYml0IHRvIGluZGljYXRlIHdyaXRlLXByb3RlY3Qga2VybmVsIG1lbW9yeSAqLwogCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JXIHwgX1BBR0VfV1JFTkFCTEUpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KQEAgLTI3MCwxNyArMjY3LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLXB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKLSAgIAkJCSAgcHRlX3QgKnB0ZXApCi17Ci0JcHRlX3QgcHRlID0gKnB0ZXA7Ci0JaWYgKCFwdGVfZGlydHkocHRlKSkKLQkJcmV0dXJuIDA7Ci0JdXBkYXRlX3B0ZShwdGVwLCBwdGVfbWtjbGVhbihwdGUpKTsKLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdAogcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewpAQCAtNDIxLDcgKzQwNyw2IEBACiAjZW5kaWYgLyogIWRlZmluZWQgKF9fQVNTRU1CTFlfXykgKi8KIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX01LRElSVFkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggMTI3ZDJkMS4uYmNmODc1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTI0Nyw3ICsyNDcsNiBAQAogdW5pZmRlZi15ICs9IGlzZG5pZi5oCiB1bmlmZGVmLXkgKz0gaXNkbl9kaXZlcnRpZi5oCiB1bmlmZGVmLXkgKz0gaXNkbl9wcHAuaAotdW5pZmRlZi15ICs9IGlzaWNvbS5oCiB1bmlmZGVmLXkgKz0gamJkLmgKIHVuaWZkZWYteSArPSBqb3lzdGljay5oCiB1bmlmZGVmLXkgKz0ga2Rldl90LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXR0cmlidXRlX2NvbnRhaW5lci5oIGIvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKaW5kZXggOTNiZmIwYi4uOGZmMjc0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciB7CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCmluZGV4IGZjY2M2ZTUuLjhjYTdjYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTYzLDkgKzYzLDEyIEBACiAjZGVmaW5lIEFVRElUX0FERF9SVUxFCQkxMDExCS8qIEFkZCBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCiAjZGVmaW5lIEFVRElUX0RFTF9SVUxFCQkxMDEyCS8qIERlbGV0ZSBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCiAjZGVmaW5lIEFVRElUX0xJU1RfUlVMRVMJMTAxMwkvKiBMaXN0IHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGVzICovCisjZGVmaW5lIEFVRElUX1RUWV9HRVQJCTEwMTQJLyogR2V0IFRUWSBhdWRpdGluZyBzdGF0dXMgKi8KKyNkZWZpbmUgQVVESVRfVFRZX1NFVAkJMTAxNQkvKiBTZXQgVFRZIGF1ZGl0aW5nIHN0YXR1cyAqLwogCiAjZGVmaW5lIEFVRElUX0ZJUlNUX1VTRVJfTVNHCTExMDAJLyogVXNlcnNwYWNlIG1lc3NhZ2VzIG1vc3RseSB1bmludGVyZXN0aW5nIHRvIGtlcm5lbCAqLwogI2RlZmluZSBBVURJVF9VU0VSX0FWQwkJMTEwNwkvKiBXZSBmaWx0ZXIgdGhpcyBkaWZmZXJlbnRseSAqLworI2RlZmluZSBBVURJVF9VU0VSX1RUWQkJMTEyNAkvKiBOb24tSUNBTk9OIFRUWSBpbnB1dCBtZWFuaW5nICovCiAjZGVmaW5lIEFVRElUX0xBU1RfVVNFUl9NU0cJMTE5OQogI2RlZmluZSBBVURJVF9GSVJTVF9VU0VSX01TRzIJMjEwMAkvKiBNb3JlIHVzZXIgc3BhY2UgbWVzc2FnZXMgKi8KICNkZWZpbmUgQVVESVRfTEFTVF9VU0VSX01TRzIJMjk5OQpAQCAtOTIsNiArOTUsNyBAQAogI2RlZmluZSBBVURJVF9LRVJORUxfT1RIRVIJMTMxNgkvKiBGb3IgdXNlIGJ5IDNyZCBwYXJ0eSBtb2R1bGVzICovCiAjZGVmaW5lIEFVRElUX0ZEX1BBSVIJCTEzMTcgICAgLyogYXVkaXQgcmVjb3JkIGZvciBwaXBlL3NvY2tldHBhaXIgKi8KICNkZWZpbmUgQVVESVRfT0JKX1BJRAkJMTMxOAkvKiBwdHJhY2UgdGFyZ2V0ICovCisjZGVmaW5lIEFVRElUX1RUWQkJMTMxOQkvKiBJbnB1dCBvbiBhbiBhZG1pbmlzdHJhdGl2ZSBUVFkgKi8KIAogI2RlZmluZSBBVURJVF9BVkMJCTE0MDAJLyogU0UgTGludXggYXZjIGRlbmlhbCBvciBncmFudCAqLwogI2RlZmluZSBBVURJVF9TRUxJTlVYX0VSUgkxNDAxCS8qIEludGVybmFsIFNFIExpbnV4IEVycm9ycyAqLwpAQCAtMjg5LDYgKzI5MywxMCBAQAogCV9fdTMyCQliYWNrbG9nOwkvKiBtZXNzYWdlcyB3YWl0aW5nIGluIHF1ZXVlICovCiB9OwogCitzdHJ1Y3QgYXVkaXRfdHR5X3N0YXR1cyB7CisJX191MzIJCWVuYWJsZWQ7IC8qIDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KK307CisKIC8qIGF1ZGl0X3J1bGVfZGF0YSBzdXBwb3J0cyBmaWx0ZXIgcnVsZXMgd2l0aCBib3RoIGludGVnZXIgYW5kIHN0cmluZwogICogZmllbGRzLiAgSXQgY29ycmVzcG9uZHMgd2l0aCBBVURJVF9BRERfUlVMRSwgQVVESVRfREVMX1JVTEUgYW5kCiAgKiBBVURJVF9MSVNUX1JVTEVTIHJlcXVlc3RzLgpAQCAtNTE1LDExICs1MjMsMTMgQEAKIAkJCQkJICAgICBjb25zdCBjaGFyICpwcmVmaXgsCiAJCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50KTsKK2V4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2xvc3QoY29uc3QgY2hhciAqbWVzc2FnZSk7CiAJCQkJLyogUHJpdmF0ZSBBUEkgKGZvciBhdWRpdC5jIG9ubHkpICovCiBleHRlcm4gaW50IGF1ZGl0X2ZpbHRlcl91c2VyKHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqY2IsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgYXVkaXRfZmlsdGVyX3R5cGUoaW50IHR5cGUpOwogZXh0ZXJuIGludCAgYXVkaXRfcmVjZWl2ZV9maWx0ZXIoaW50IHR5cGUsIGludCBwaWQsIGludCB1aWQsIGludCBzZXEsCiAJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFzeiwgdWlkX3QgbG9naW51aWQsIHUzMiBzaWQpOworZXh0ZXJuIGludCBhdWRpdF9lbmFibGVkOwogI2Vsc2UKICNkZWZpbmUgYXVkaXRfbG9nKGMsZyx0LGYsLi4uKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX3N0YXJ0KGMsZyx0KSAoeyBOVUxMOyB9KQpAQCAtNTMwLDYgKzU0MCw3IEBACiAjZGVmaW5lIGF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYSxzKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKGEsbixzKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX2RfcGF0aChiLHAsZCx2KSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYXVkaXRfZW5hYmxlZCAwCiAjZW5kaWYKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmggYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKaW5kZXggZjI1NDJjMi4uNzAxMWQ2MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKQEAgLTkzLDcgKzkzLDYgQEAKIHZvaWQgY2xlYXJfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOwogdm9pZCBzZXRfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOwogbG9uZyBjb25nZXN0aW9uX3dhaXQoaW50IHJ3LCBsb25nIHRpbWVvdXQpOwotbG9uZyBjb25nZXN0aW9uX3dhaXRfaW50ZXJydXB0aWJsZShpbnQgcncsIGxvbmcgdGltZW91dCk7CiB2b2lkIGNvbmdlc3Rpb25fZW5kKGludCBydyk7CiAKICNkZWZpbmUgYmRpX2NhcF93cml0ZWJhY2tfZGlydHkoYmRpKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCBmYWUxMzhiLi5mNzg5NjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9ic2cuaD4KIAogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogCkBAIC00MSw2ICs0Miw4IEBACiB0eXBlZGVmIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSBlbGV2YXRvcl90Owogc3RydWN0IHJlcXVlc3RfcG1fc3RhdGU7CiBzdHJ1Y3QgYmxrX3RyYWNlOworc3RydWN0IHJlcXVlc3Q7CitzdHJ1Y3Qgc2dfaW9faGRyOwogCiAjZGVmaW5lIEJMS0RFVl9NSU5fUlEJNAogI2RlZmluZSBCTEtERVZfTUFYX1JRCTEyOAkvKiBEZWZhdWx0IG1heGltdW0gKi8KQEAgLTMxNCw2ICszMTcsOSBAQAogCSAqLwogCXJxX2VuZF9pb19mbiAqZW5kX2lvOwogCXZvaWQgKmVuZF9pb19kYXRhOworCisJLyogZm9yIGJpZGkgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqbmV4dF9ycTsKIH07CiAKIC8qCkBAIC00NjgsNiArNDc0LDEwIEBACiAJdW5zaWduZWQgaW50CQliaV9zaXplOwogCiAJc3RydWN0IG11dGV4CQlzeXNmc19sb2NrOworCisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9CU0cpCisJc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgYnNnX2RldjsKKyNlbmRpZgogfTsKIAogI2RlZmluZSBRVUVVRV9GTEFHX0NMVVNURVIJMAkvKiBjbHVzdGVyIHNldmVyYWwgc2VnbWVudHMgaW50byAxICovCkBAIC00NzksNiArNDg5LDcgQEAKICNkZWZpbmUgUVVFVUVfRkxBR19SRUVOVEVSCTYJLyogUmUtZW50cmFuY3kgYXZvaWRhbmNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfUExVR0dFRAk3CS8qIHF1ZXVlIGlzIHBsdWdnZWQgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19FTFZTV0lUQ0gJOAkvKiBkb24ndCB1c2UgZWxldmF0b3IsIGp1c3QgZG8gRklGTyAqLworI2RlZmluZSBRVUVVRV9GTEFHX0JJREkJCTkJLyogcXVldWUgc3VwcG9ydHMgYmlkaSByZXF1ZXN0cyAqLwogCiBlbnVtIHsKIAkvKgpAQCAtNTQzLDYgKzU1NCw3IEBACiAjZGVmaW5lIGJsa19zb3J0ZWRfcnEocnEpCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfU09SVEVEKQogI2RlZmluZSBibGtfYmFycmllcl9ycShycSkJKChycSktPmNtZF9mbGFncyAmIFJFUV9IQVJEQkFSUklFUikKICNkZWZpbmUgYmxrX2Z1YV9ycShycSkJCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfRlVBKQorI2RlZmluZSBibGtfYmlkaV9ycShycSkJCSgocnEpLT5uZXh0X3JxICE9IE5VTEwpCiAKICNkZWZpbmUgbGlzdF9lbnRyeV9ycShwdHIpCWxpc3RfZW50cnkoKHB0ciksIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpCiAKQEAgLTYwNyw3ICs2MTksMTIgQEAKICNkZWZpbmUgQkxLX0JPVU5DRV9BTlkJCSgodTY0KWJsa19tYXhfcGZuIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIEJMS19CT1VOQ0VfSVNBCQkoSVNBX0RNQV9USFJFU0hPTEQpCiAKLSNpZmRlZiBDT05GSUdfTU1VCisvKgorICogZGVmYXVsdCB0aW1lb3V0IGZvciBTR19JTyBpZiBub25lIHNwZWNpZmllZAorICovCisjZGVmaW5lIEJMS19ERUZBVUxUX1NHX1RJTUVPVVQJKDYwICogSFopCisKKyNpZmRlZiBDT05GSUdfQk9VTkNFCiBleHRlcm4gaW50IGluaXRfZW1lcmdlbmN5X2lzYV9wb29sKHZvaWQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2JvdW5jZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKipiaW8pOwogI2Vsc2UKQEAgLTYzNyw3ICs2NTQsOCBAQAogZXh0ZXJuIHZvaWQgYmxrX3BsdWdfZGV2aWNlKHJlcXVlc3RfcXVldWVfdCAqKTsKIGV4dGVybiBpbnQgYmxrX3JlbW92ZV9wbHVnKHJlcXVlc3RfcXVldWVfdCAqKTsKIGV4dGVybiB2b2lkIGJsa19yZWNvdW50X3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgYmlvICopOwotZXh0ZXJuIGludCBzY3NpX2NtZF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZ2VuZGlzayAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopOworZXh0ZXJuIGludCBzY3NpX2NtZF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLAorCQkJICBzdHJ1Y3QgZ2VuZGlzayAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopOwogZXh0ZXJuIGludCBzZ19zY3NpX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosCiAJCXN0cnVjdCBnZW5kaXNrICosIHN0cnVjdCBzY3NpX2lvY3RsX2NvbW1hbmQgX191c2VyICopOwogCkBAIC02ODAsNiArNjk4LDEyIEBACiAJCQkgIHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiBleHRlcm4gdm9pZCBibGtfZXhlY3V0ZV9ycV9ub3dhaXQocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBnZW5kaXNrICosCiAJCQkJICBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIHJxX2VuZF9pb19mbiAqKTsKK2V4dGVybiBpbnQgYmxrX2ZpbGxfc2doZHJfcnEocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosCisJCSAgICAgIHN0cnVjdCBzZ19pb19oZHIgKiwgaW50KTsKK2V4dGVybiBpbnQgYmxrX3VubWFwX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzZ19pb19oZHIgKik7CitleHRlcm4gaW50IGJsa19jb21wbGV0ZV9zZ2hkcl9ycShzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3Qgc2dfaW9faGRyICosCisJCQkgIHN0cnVjdCBiaW8gKik7CitleHRlcm4gaW50IGJsa192ZXJpZnlfY29tbWFuZCh1bnNpZ25lZCBjaGFyICosIGludCk7CiAKIHN0YXRpYyBpbmxpbmUgcmVxdWVzdF9xdWV1ZV90ICpiZGV2X2dldF9xdWV1ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ic2cuaCBiL2luY2x1ZGUvbGludXgvYnNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5OThjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYnNnLmgKQEAgLTAsMCArMSw3MCBAQAorI2lmbmRlZiBCU0dfSAorI2RlZmluZSBCU0dfSAorCisjZGVmaW5lIEJTR19QUk9UT0NPTF9TQ1NJCQkwCisKKyNkZWZpbmUgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX0NNRAkwCisjZGVmaW5lIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9UTUYJMQorI2RlZmluZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfVFJBTlNQT1JUCTIKKworc3RydWN0IHNnX2lvX3Y0IHsKKwlfX3MzMiBndWFyZDsJCS8qIFtpXSAnUScgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIHYzICovCisJX191MzIgcHJvdG9jb2w7CQkvKiBbaV0gMCAtPiBTQ1NJICwgLi4uLiAqLworCV9fdTMyIHN1YnByb3RvY29sOwkvKiBbaV0gMCAtPiBTQ1NJIGNvbW1hbmQsIDEgLT4gU0NTSSB0YXNrCisJCQkJICAgbWFuYWdlbWVudCBmdW5jdGlvbiwgLi4uLiAqLworCisJX191MzIgcmVxdWVzdF9sZW47CS8qIFtpXSBpbiBieXRlcyAqLworCV9fdTY0IHJlcXVlc3Q7CQkvKiBbaV0sIFsqaV0ge1NDU0k6IGNkYn0gKi8KKwlfX3UzMiByZXF1ZXN0X2F0dHI7CS8qIFtpXSB7U0NTSTogdGFzayBhdHRyaWJ1dGV9ICovCisJX191MzIgcmVxdWVzdF90YWc7CS8qIFtpXSB7U0NTSTogdGFzayB0YWcgKG9ubHkgaWYgZmxhZ2dlZCl9ICovCisJX191MzIgcmVxdWVzdF9wcmlvcml0eTsJLyogW2ldIHtTQ1NJOiB0YXNrIHByaW9yaXR5fSAqLworCV9fdTMyIG1heF9yZXNwb25zZV9sZW47CS8qIFtpXSBpbiBieXRlcyAqLworCV9fdTY0IHJlc3BvbnNlOwkJLyogW2ldLCBbKm9dIHtTQ1NJOiAoYXV0bylzZW5zZSBkYXRhfSAqLworCisJLyogImRpbl8iIGZvciBkYXRhIGluIChmcm9tIGRldmljZSk7ICJkb3V0XyIgZm9yIGRhdGEgb3V0ICh0byBkZXZpY2UpICovCisJX191MzIgZG91dF94ZmVyX2xlbjsJLyogW2ldIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIHRvIGRldmljZSAqLworCV9fdTMyIGRpbl94ZmVyX2xlbjsJLyogW2ldIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlICovCisJX191NjQgZG91dF94ZmVycDsJLyogW2ldLCBbKmldICovCisJX191NjQgZGluX3hmZXJwOwkvKiBbaV0sIFsqb10gKi8KKworCV9fdTMyIHRpbWVvdXQ7CQkvKiBbaV0gdW5pdHM6IG1pbGxpc2Vjb25kICovCisJX191MzIgZmxhZ3M7CQkvKiBbaV0gYml0IG1hc2sgKi8KKwlfX3U2NCB1c3JfcHRyOwkJLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5ICovCisJX191MzIgc3BhcmVfaW47CQkvKiBbaV0gKi8KKworCV9fdTMyIGRyaXZlcl9zdGF0dXM7CS8qIFtvXSAwIC0+IG9rICovCisJX191MzIgdHJhbnNwb3J0X3N0YXR1czsJLyogW29dIDAgLT4gb2sgKi8KKwlfX3UzMiBkZXZpY2Vfc3RhdHVzOwkvKiBbb10ge1NDU0k6IGNvbW1hbmQgY29tcGxldGlvbiBzdGF0dXN9ICovCisJX191MzIgcmV0cnlfZGVsYXk7CS8qIFtvXSB7U0NTSTogc3RhdHVzIGF1eGlsaWFyeSBpbmZvcm1hdGlvbn0gKi8KKwlfX3UzMiBpbmZvOwkJLyogW29dIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KKwlfX3UzMiBkdXJhdGlvbjsJCS8qIFtvXSB0aW1lIHRvIGNvbXBsZXRlLCBpbiBtaWxsaXNlY29uZHMgKi8KKwlfX3UzMiByZXNwb25zZV9sZW47CS8qIFtvXSBieXRlcyBvZiByZXNwb25zZSBhY3R1YWxseSB3cml0dGVuICovCisJX19zMzIgZGluX3Jlc2lkOwkvKiBbb10gYWN0dWFsX2Rpbl94ZmVyX2xlbiAtIGRpbl94ZmVyX2xlbiAqLworCV9fdTMyIGdlbmVyYXRlZF90YWc7CS8qIFtvXSB7U0NTSTogdGFzayB0YWcgdGhhdCB0cmFuc3BvcnQgY2hvc2V9ICovCisJX191MzIgc3BhcmVfb3V0OwkvKiBbb10gKi8KKworCV9fdTMyIHBhZGRpbmc7Cit9OworCisjaWZkZWYgX19LRVJORUxfXworCisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9CU0cpCitzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSB7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgbWlub3I7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKK307CisKK2V4dGVybiBpbnQgYnNnX3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBic2dfdW5yZWdpc3Rlcl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKKyNlbHNlCitzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSB7IH07CisjZGVmaW5lIGJzZ19yZWdpc3Rlcl9xdWV1ZShkaXNrLCBuYW1lKQkJKDApCisjZGVmaW5lIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKGRpc2spCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnVnLmggYi9pbmNsdWRlL2xpbnV4L2J1Zy5oCmluZGV4IDQyYWEwYTUuLjU0Mzk4ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9idWcuaApAQCAtMTAsNiArMTAsOCBAQAogCUJVR19UUkFQX1RZUEVfQlVHID0gMiwKIH07CiAKK3N0cnVjdCBwdF9yZWdzOworCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQlVHCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CiAKQEAgLTIwLDcgKzIyLDcgQEAKIAogY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSAqZmluZF9idWcodW5zaWduZWQgbG9uZyBidWdhZGRyKTsKIAotZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdfYWRkcik7CitlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIGludCAgbW9kdWxlX2J1Z19maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqLCBjb25zdCBFbGZfU2hkciAqLAogCQkJIHN0cnVjdCBtb2R1bGUgKik7CkBAIC0zMSw3ICszMyw4IEBACiAKICNlbHNlCS8qICFDT05GSUdfR0VORVJJQ19CVUcgKi8KIAotc3RhdGljIGlubGluZSBlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyKQorc3RhdGljIGlubGluZSBlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyLAorCQkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJcmV0dXJuIEJVR19UUkFQX1RZUEVfQlVHOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAppbmRleCBiYmY4ZGY3Li4yZGZhNTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtNDQsNyArNDQsNiBAQAogICAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAKIC8qICNkZWZpbmUgU1RSSUNUX0NBUF9UX1RZUEVDSEVDS1MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2Ryb20uaCBiL2luY2x1ZGUvbGludXgvY2Ryb20uaAppbmRleCBmNTBmMDRiLi4yYjY0MWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZHJvbS5oCkBAIC00MTQsOCArNDE0LDggQEAKICNkZWZpbmUgQ0RPX0NIRUNLX1RZUEUJCTB4MTAgICAgLyogY2hlY2sgdHlwZSBvbiBvcGVuIGZvciBkYXRhICovCiAKIC8qIFNwZWNpYWwgY29kZXMgdXNlZCB3aGVuIHNwZWNpZnlpbmcgY2hhbmdlciBzbG90cy4gKi8KLSNkZWZpbmUgQ0RTTF9OT05FICAgICAgIAkoKGludCkgKH4wVT4+MSktMSkKLSNkZWZpbmUgQ0RTTF9DVVJSRU5UICAgIAkoKGludCkgKH4wVT4+MSkpCisjZGVmaW5lIENEU0xfTk9ORSAgICAgICAJKElOVF9NQVgtMSkKKyNkZWZpbmUgQ0RTTF9DVVJSRU5UICAgIAlJTlRfTUFYCiAKIC8qIEZvciBwYXJ0aXRpb24gYmFzZWQgbXVsdGlzZXNzaW9uIGFjY2Vzcy4gSURFIGNhbiBoYW5kbGUgNjQgcGFydGl0aW9ucwogICogcGVyIGRyaXZlIC0gU0NTSSBDRC1ST00ncyB1c2UgbWlub3JzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29iYWx0LW52cmFtLmggYi9pbmNsdWRlL2xpbnV4L2NvYmFsdC1udnJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQyOTU2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvY29iYWx0LW52cmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqICRJZDogY29iYWx0LW52cmFtLmgsdiAxLjIwIDIwMDEvMTAvMTcgMjM6MTY6NTUgdGhvY2tpbiBFeHAgJAotICogY29iYWx0LW52cmFtLmggOiBkZWZpbmVzIGZvciB0aGUgdmFyaW91cyBmaWVsZHMgaW4gdGhlIGNvYmFsdCBOVlJBTQotICoKLSAqIENvcHlyaWdodCAyMDAxLDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICovCi0KLSNpZm5kZWYgQ09CQUxUX05WUkFNX0gKLSNkZWZpbmUgQ09CQUxUX05WUkFNX0gKLQotI2luY2x1ZGUgPGxpbnV4L252cmFtLmg+Ci0KLSNkZWZpbmUgQ09CVF9DTU9TX0lORk9fTUFYCQkweDdmCS8qIHRvcCBhZGRyZXNzIGFsbG93ZWQgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0JJT1NfRFJJVkVfSU5GTwkweDEyCS8qIGRyaXZlIGluZm8gd291bGQgZ28gaGVyZSAqLwotCi0jZGVmaW5lIENPQlRfQ01PU19DS1NfU1RBUlQJCU5WUkFNX09GRlNFVCgweDBlKQotI2RlZmluZSBDT0JUX0NNT1NfQ0tTX0VORAkJTlZSQU1fT0ZGU0VUKDB4N2YpCi0KLS8qIGZsYWcgYnl0ZXMgLSAxNiBmbGFncyBmb3Igbm93LCBsZWF2ZSByb29tIGZvciBtb3JlICovCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX0JZVEVfMAkJTlZSQU1fT0ZGU0VUKDB4MTApCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX0JZVEVfMQkJTlZSQU1fT0ZGU0VUKDB4MTEpCi0KLS8qIGZsYWdzIGluIGZsYWcgYnl0ZXMgLSB1cCB0byAxNiAqLwotI2RlZmluZSBDT0JUX0NNT1NfRkxBR19NSU4JCTB4MDAwMQotI2RlZmluZSBDT0JUX0NNT1NfQ09OU09MRV9GTEFHCQkweDAwMDEgLyogY29uc29sZSBvbi9vZmYgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0RFQlVHX0ZMQUcJCTB4MDAwMiAvKiBST00gZGVidWcgbWVzc2FnZXMgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0FVVE9fUFJPTVBUX0ZMQUcJMHgwMDA0IC8qIGJvb3QgdG8gUk9NIHByb21wdD8gKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0NMRUFOX0JPT1RfRkxBRwkweDAwMDggLyogc2V0IGJ5IGEgY2xlYW4gc2h1dGRvd24gKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0hXX05PUFJPQkVfRkxBRwkweDAwMTAgLyogZ28gZWFzeSBvbiB0aGUgcHJvYmluZyAqLwotI2RlZmluZSBDT0JUX0NNT1NfU1lTRkFVTFRfRkxBRwkJMHgwMDIwIC8qIHN5c3RlbSBmYXVsdCBkZXRlY3RlZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfT09QU1BBTklDX0ZMQUcJMHgwMDQwIC8qIHBhbmljIG9uIG9vcHMgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0RFTEFZX0NBQ0hFX0ZMQUcJMHgwMDgwIC8qIGRlbGF5IGNhY2hlIGluaXRpYWxpemF0aW9uICovCi0jZGVmaW5lIENPQlRfQ01PU19OT0xPR09fRkxBRwkJMHgwMTAwIC8qIGhpZGUgIkMiIGxvZ28gQCBib290ICovCi0jZGVmaW5lIENPQlRfQ01PU19WRVJTSU9OX0ZMQUcJCTB4MDIwMCAvKiB0aGUgdmVyc2lvbiBmaWVsZCBpcyB2YWxpZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfRkxBR19NQVgJCTB4MDIwMAotCi0vKiBsZWF2ZSBieXRlIDB4MTIgYmxhbmsgLSBMaW51eCBsb29rcyBmb3IgZHJpdmUgaW5mbyBoZXJlICovCi0KLS8qIENNT1Mgc3RydWN0dXJlIHZlcnNpb24sIHZhbGlkIGlmIENPQlRfQ01PU19WRVJTSU9OX0ZMQUcgaXMgdHJ1ZSAqLwotI2RlZmluZSBDT0JUX0NNT1NfVkVSU0lPTgkJTlZSQU1fT0ZGU0VUKDB4MTMpCi0jZGVmaW5lIENPQlRfQ01PU19WRVJfQlRPQ09ERQkJMSAvKiBtaW4uIHZlcnNpb24gbmVlZGVkIGZvciBidG9jb2RlICovCi0KLS8qIGluZGV4IG9mIGRlZmF1bHQgYm9vdCBtZXRob2QgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfTUVUSE9ECQlOVlJBTV9PRkZTRVQoMHgyMCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX0RJU0sJMAotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfUk9NCTEKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX05FVAkyCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjEpCi0vKiBtYWpvciAjLCBtaW5vciAjIG9mIGZpcnN0IHRocm91Z2ggZm91cnRoIGJvb3QgZGV2aWNlICovCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjBfTUFKCQlOVlJBTV9PRkZTRVQoMHgyMSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMF9NSU4JCU5WUkFNX09GRlNFVCgweDIyKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYxX01BSgkJTlZSQU1fT0ZGU0VUKDB4MjMpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjFfTUlOCQlOVlJBTV9PRkZTRVQoMHgyNCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMl9NQUoJCU5WUkFNX09GRlNFVCgweDI1KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYyX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjYpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjNfTUFKCQlOVlJBTV9PRkZTRVQoMHgyNykKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWM19NSU4JCU5WUkFNX09GRlNFVCgweDI4KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVZfTUFYCQlOVlJBTV9PRkZTRVQoMHgyOCkKLQotLyogY2hlY2tzdW0gb2YgYnl0ZXMgMHhlLTB4N2YgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0NIRUNLU1VNCQlOVlJBTV9PRkZTRVQoMHgyZSkKLQotLyogcnVubmluZyB1cHRpbWUgY291bnRlciwgdW5pdHMgb2YgNSBtaW51dGVzICgzMiBiaXRzID1+IDQxMDAwIHllYXJzKSAqLwotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzAJCU5WUkFNX09GRlNFVCgweDMwKQotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzEJCU5WUkFNX09GRlNFVCgweDMxKQotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzIJCU5WUkFNX09GRlNFVCgweDMyKQotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzMJCU5WUkFNX09GRlNFVCgweDMzKQotCi0vKiBjb3VudCBvZiBzdWNjZXNzZnVsIGJvb3RzICgzMiBiaXRzKSAqLwotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzAJCU5WUkFNX09GRlNFVCgweDM4KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzEJCU5WUkFNX09GRlNFVCgweDM5KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzIJCU5WUkFNX09GRlNFVCgweDNhKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzMJCU5WUkFNX09GRlNFVCgweDNiKQotCi0vKiAxMyBieXRlczogc3lzdGVtIHNlcmlhbCBudW1iZXIsIHNhbWUgYXMgb24gdGhlIGJhY2sgb2YgdGhlIHN5c3RlbSAqLwotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV9MRU4JMTMKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMAkJTlZSQU1fT0ZGU0VUKDB4NDApCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzEJCU5WUkFNX09GRlNFVCgweDQxKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8yCQlOVlJBTV9PRkZTRVQoMHg0MikKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMwkJTlZSQU1fT0ZGU0VUKDB4NDMpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzQJCU5WUkFNX09GRlNFVCgweDQ0KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV81CQlOVlJBTV9PRkZTRVQoMHg0NSkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fNgkJTlZSQU1fT0ZGU0VUKDB4NDYpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzcJCU5WUkFNX09GRlNFVCgweDQ3KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV84CQlOVlJBTV9PRkZTRVQoMHg0OCkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fOQkJTlZSQU1fT0ZGU0VUKDB4NDkpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzEwCQlOVlJBTV9PRkZTRVQoMHg0YSkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMTEJCU5WUkFNX09GRlNFVCgweDRiKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8xMgkJTlZSQU1fT0ZGU0VUKDB4NGMpCi0vKiBjaGVja3N1bSBmb3Igc2VyaWFsIG51bSAtIDEgYnl0ZSAqLwotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV9DU1VNCU5WUkFNX09GRlNFVCgweDRmKQotCi0jZGVmaW5lIENPQlRfQ01PU19ST01fUkVWX01BSgkJTlZSQU1fT0ZGU0VUKDB4NTApCi0jZGVmaW5lIENPQlRfQ01PU19ST01fUkVWX01JTgkJTlZSQU1fT0ZGU0VUKDB4NTEpCi0jZGVmaW5lIENPQlRfQ01PU19ST01fUkVWX1JFVgkJTlZSQU1fT0ZGU0VUKDB4NTIpCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19DT0RFXzAJCU5WUkFNX09GRlNFVCgweDUzKQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0NPREVfMQkJTlZSQU1fT0ZGU0VUKDB4NTQpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fQ09ERV8yCQlOVlJBTV9PRkZTRVQoMHg1NSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19DT0RFXzMJCU5WUkFNX09GRlNFVCgweDU2KQotCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfQ1NVTQkJTlZSQU1fT0ZGU0VUKDB4NTcpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMAkJTlZSQU1fT0ZGU0VUKDB4NTgpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMQkJTlZSQU1fT0ZGU0VUKDB4NTkpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMgkJTlZSQU1fT0ZGU0VUKDB4NWEpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMwkJTlZSQU1fT0ZGU0VUKDB4NWIpCi0KLSNlbmRpZiAvKiBDT0JBTFRfTlZSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25maWdmcy5oIGIvaW5jbHVkZS9saW51eC9jb25maWdmcy5oCmluZGV4IGZlZjZmM2QuLjhjNjk2N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmgKQEAgLTQwLDkgKzQwLDkgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNkZWZpbmUgQ09ORklHRlNfSVRFTV9OQU1FX0xFTgkyMAogCkBAIC03NSw3ICs3NSw2IEBACiBleHRlcm4gdm9pZCBjb25maWdfaXRlbV9pbml0X3R5cGVfbmFtZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0sCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgICAgIHN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlKTsKLWV4dGVybiB2b2lkIGNvbmZpZ19pdGVtX2NsZWFudXAoc3RydWN0IGNvbmZpZ19pdGVtICopOwogCiBleHRlcm4gc3RydWN0IGNvbmZpZ19pdGVtICogY29uZmlnX2l0ZW1fZ2V0KHN0cnVjdCBjb25maWdfaXRlbSAqKTsKIGV4dGVybiB2b2lkIGNvbmZpZ19pdGVtX3B1dChzdHJ1Y3QgY29uZmlnX2l0ZW0gKik7CkBAIC04NywxMiArODYsMTAgQEAKIAlzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlCQkqKmN0X2F0dHJzOwogfTsKIAotCiAvKioKICAqCWdyb3VwIC0gYSBncm91cCBvZiBjb25maWdfaXRlbXMgb2YgYSBzcGVjaWZpYyB0eXBlLCBiZWxvbmdpbmcKICAqCXRvIGEgc3BlY2lmaWMgc3Vic3lzdGVtLgogICovCi0KIHN0cnVjdCBjb25maWdfZ3JvdXAgewogCXN0cnVjdCBjb25maWdfaXRlbQkJY2dfaXRlbTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQljZ19jaGlsZHJlbjsKQEAgLTEwMCwxMyArOTcsMTEgQEAKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwCQkqKmRlZmF1bHRfZ3JvdXBzOwogfTsKIAotCiBleHRlcm4gdm9pZCBjb25maWdfZ3JvdXBfaW5pdChzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCk7CiBleHRlcm4gdm9pZCBjb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsCiAJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCXN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlKTsKIAotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjb25maWdfZ3JvdXAgKnRvX2NvbmZpZ19ncm91cChzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCiB7CiAJcmV0dXJuIGl0ZW0gPyBjb250YWluZXJfb2YoaXRlbSxzdHJ1Y3QgY29uZmlnX2dyb3VwLGNnX2l0ZW0pIDogTlVMTDsKQEAgLTEyMiw3ICsxMTcsOCBAQAogCWNvbmZpZ19pdGVtX3B1dCgmZ3JvdXAtPmNnX2l0ZW0pOwogfQogCi1leHRlcm4gc3RydWN0IGNvbmZpZ19pdGVtICpjb25maWdfZ3JvdXBfZmluZF9vYmooc3RydWN0IGNvbmZpZ19ncm91cCAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHN0cnVjdCBjb25maWdfaXRlbSAqY29uZmlnX2dyb3VwX2ZpbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2dyb3VwICosCisJCQkJCQkgIGNvbnN0IGNoYXIgKik7CiAKIAogc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSB7CkBAIC0xMzEsNiArMTI3LDIyIEBACiAJbW9kZV90CQkJY2FfbW9kZTsKIH07CiAKKy8qCisgKiBVc2VycyBvZnRlbiBuZWVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGUgc3RydWN0dXJlcyBmb3IgdGhlaXIgY29uZmlndXJhYmxlCisgKiBhdHRyaWJ1dGVzLCBjb250YWluaW5nIGEgY29uZmlnZnNfYXR0cmlidXRlIG1lbWJlciBhbmQgZnVuY3Rpb24gcG9pbnRlcnMKKyAqIGZvciB0aGUgc2hvdygpIGFuZCBzdG9yZSgpIG9wZXJhdGlvbnMgb24gdGhhdCBhdHRyaWJ1dGUuIFRoZXkgY2FuIHVzZQorICogdGhpcyBtYWNybyAoc2ltaWxhciB0byBzeXNmcycgX19BVFRSKSB0byBtYWtlIGRlZmluaW5nIGF0dHJpYnV0ZXMgZWFzaWVyLgorICovCisjZGVmaW5lIF9fQ09ORklHRlNfQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAorewkJCQkJCQkJCVwKKwkuYXR0cgk9IHsJCQkJCQkJXAorCQkJLmNhX25hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCQkJXAorCQkJLmNhX21vZGUgPSBfbW9kZSwJCQkJXAorCQkJLmNhX293bmVyID0gVEhJU19NT0RVTEUsCQkJXAorCX0sCQkJCQkJCQlcCisJLnNob3cJPSBfc2hvdywJCQkJCQlcCisJLnN0b3JlCT0gX3N0b3JlLAkJCQkJCVwKK30KIAogLyoKICAqIElmIGFsbG93X2xpbmsoKSBleGlzdHMsIHRoZSBpdGVtIGNhbiBzeW1saW5rKDIpIG91dCB0byBvdGhlcgpAQCAtMTU3LDEyICsxNjksMTMgQEAKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0gKigqbWFrZV9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgY29uc3QgY2hhciAqbmFtZSk7CiAJc3RydWN0IGNvbmZpZ19ncm91cCAqKCptYWtlX2dyb3VwKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgY29uc3QgY2hhciAqbmFtZSk7CiAJaW50ICgqY29tbWl0X2l0ZW0pKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CisJdm9pZCAoKmRpc2Nvbm5lY3Rfbm90aWZ5KShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKIAl2b2lkICgqZHJvcF9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKIH07CiAKIHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gewogCXN0cnVjdCBjb25maWdfZ3JvdXAJc3VfZ3JvdXA7Ci0Jc3RydWN0IHNlbWFwaG9yZQlzdV9zZW07CisJc3RydWN0IG11dGV4CQlzdV9tdXRleDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqdG9fY29uZmlnZnNfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwKQpAQCAtMTc1LDYgKzE4OCwxMSBAQAogaW50IGNvbmZpZ2ZzX3JlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogdm9pZCBjb25maWdmc191bnJlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogCisvKiBUaGVzZSBmdW5jdGlvbnMgY2FuIHNsZWVwIGFuZCBjYW4gYWxsb2Mgd2l0aCBHRlBfS0VSTkVMICovCisvKiBXQVJOSU5HOiBUaGVzZSBjYW5ub3QgYmUgY2FsbGVkIHVuZGVybmVhdGggY29uZmlnZnMgY2FsbGJhY2tzISEgKi8KK2ludCBjb25maWdmc19kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMsIHN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KTsKK3ZvaWQgY29uZmlnZnNfdW5kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMsIHN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KTsKKwogI2VuZGlmICAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfQ09ORklHRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29uc29sZS5oIGIvaW5jbHVkZS9saW51eC9jb25zb2xlLmgKaW5kZXggNjJlZjZlMS4uNTZhN2JjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25zb2xlLmgKQEAgLTE1LDcgKzE1LDYgQEAKICNkZWZpbmUgX0xJTlVYX0NPTlNPTEVfSF8gMQogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgdmNfZGF0YTsKIHN0cnVjdCBjb25zb2xlX2ZvbnRfb3A7CkBAIC05OSw2ICs5OCw3IEBACiAJc3RydWN0IHR0eV9kcml2ZXIgKigqZGV2aWNlKShzdHJ1Y3QgY29uc29sZSAqLCBpbnQgKik7CiAJdm9pZAkoKnVuYmxhbmspKHZvaWQpOwogCWludAkoKnNldHVwKShzdHJ1Y3QgY29uc29sZSAqLCBjaGFyICopOworCWludAkoKmVhcmx5X3NldHVwKSh2b2lkKTsKIAlzaG9ydAlmbGFnczsKIAlzaG9ydAlpbmRleDsKIAlpbnQJY2ZsYWc7CkBAIC0xMDcsNiArMTA3LDcgQEAKIH07CiAKIGV4dGVybiBpbnQgYWRkX3ByZWZlcnJlZF9jb25zb2xlKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm9wdGlvbnMpOworZXh0ZXJuIGludCB1cGRhdGVfY29uc29sZV9jbWRsaW5lKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm5hbWVfbmV3LCBpbnQgaWR4X25ldywgY2hhciAqb3B0aW9ucyk7CiBleHRlcm4gdm9pZCByZWdpc3Rlcl9jb25zb2xlKHN0cnVjdCBjb25zb2xlICopOwogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2NvbnNvbGUoc3RydWN0IGNvbnNvbGUgKik7CiBleHRlcm4gc3RydWN0IGNvbnNvbGUgKmNvbnNvbGVfZHJpdmVyczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29uc29sZW1hcC5oIGIvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmgKaW5kZXggODJjOWExZi4uMDZiMjc2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmgKQEAgLTgsOSArOCwxMiBAQAogI2RlZmluZSBJQk1QQ19NQVAgMgogI2RlZmluZSBVU0VSX01BUCAzCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiBzdHJ1Y3QgdmNfZGF0YTsKIAotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgaW52ZXJzZV90cmFuc2xhdGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGludCBnbHlwaCk7CitleHRlcm4gdTE2IGludmVyc2VfdHJhbnNsYXRlKHN0cnVjdCB2Y19kYXRhICpjb25wLCBpbnQgZ2x5cGgsIGludCB1c2VfdW5pY29kZSk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgKnNldF90cmFuc2xhdGUoaW50IG0sIHN0cnVjdCB2Y19kYXRhICp2Yyk7CiBleHRlcm4gaW50IGNvbnZfdW5pX3RvX3BjKHN0cnVjdCB2Y19kYXRhICpjb25wLCBsb25nIHVjcyk7CitleHRlcm4gdTMyIGNvbnZfOGJpdF90b191bmkodW5zaWduZWQgY2hhciBjKTsKIHZvaWQgY29uc29sZV9tYXBfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1LmggYi9pbmNsdWRlL2xpbnV4L2NwdS5oCmluZGV4IDNiMmRmMjUuLmMyMjM2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHUuaApAQCAtMTIwLDcgKzEyMCw2IEBACiAKICNkZWZpbmUgbG9ja19jcHVfaG90cGx1ZygpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgdW5sb2NrX2NwdV9ob3RwbHVnKCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBsb2NrX2NwdV9ob3RwbHVnX2ludGVycnVwdGlibGUoKSAwCiAjZGVmaW5lIGhvdGNwdV9ub3RpZmllcihmbiwgcHJpKQlkbyB7ICh2b2lkKShmbik7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcihuYikJZG8geyAodm9pZCkobmIpOyB9IHdoaWxlICgwKQogI2RlZmluZSB1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcihuYikJZG8geyAodm9pZCkobmIpOyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmM3LmggYi9pbmNsdWRlL2xpbnV4L2NyYzcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg2ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jcmM3LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfTElOVVhfQ1JDN19ICisjZGVmaW5lIF9MSU5VWF9DUkM3X0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitleHRlcm4gY29uc3QgdTggY3JjN19zeW5kcm9tZV90YWJsZVsyNTZdOworCitzdGF0aWMgaW5saW5lIHU4IGNyYzdfYnl0ZSh1OCBjcmMsIHU4IGRhdGEpCit7CisJcmV0dXJuIGNyYzdfc3luZHJvbWVfdGFibGVbKGNyYyA8PCAxKSBeIGRhdGFdOworfQorCitleHRlcm4gdTggY3JjNyh1OCBjcmMsIGNvbnN0IHU4ICpidWZmZXIsIHNpemVfdCBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAppbmRleCA5YTY2M2M2Li4yZGMyMWNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCkBAIC0zMSw3ICszMSwxMSBAQAogCQkoZG1hX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpKTsKIH0KIAorI2lmZGVmIENPTkZJR19IQVNfRE1BCiAjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+CisjZWxzZQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oPgorI2VuZGlmCiAKIC8qIEJhY2t3YXJkcyBjb21wYXQsIHJlbW92ZSBpbiAyLjcueCAqLwogI2RlZmluZSBkbWFfc3luY19zaW5nbGUJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RzMTcyODdydGMuaCBiL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oCmluZGV4IGMyODFiYTQuLmQ4NWQzZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oCkBAIC0xMSw3ICsxMSw2IEBACiAjZGVmaW5lIF9fTElOVVhfRFMxNzI4N1JUQ19ICiAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4JCQkvKiBnZXQgdGhlIHVzZXItbGV2ZWwgQVBJICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4JCS8qIHNwaW5sb2NrX3QgKi8KICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogCiAvKiBSZWdpc3RlciBBICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oIGIvaW5jbHVkZS9saW51eC9lZnNfZnMuaAppbmRleCBkZmVkODAwLi4xNmNiMjVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZzX2ZzLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKIGV4dGVybiBpbnQgZWZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwogCiBleHRlcm4gc3RydWN0IGRlbnRyeSAqZWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmVmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICplZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICopOwogZXh0ZXJuIGludCBlZnNfYm1hcChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHBvcnRmcy5oIGIvaW5jbHVkZS9saW51eC9leHBvcnRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzJmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2V4cG9ydGZzLmgKQEAgLTAsMCArMSwxMjYgQEAKKyNpZm5kZWYgTElOVVhfRVhQT1JURlNfSAorI2RlZmluZSBMSU5VWF9FWFBPUlRGU19IIDEKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBkZW50cnk7CitzdHJ1Y3Qgc3VwZXJfYmxvY2s7CitzdHJ1Y3QgdmZzbW91bnQ7CisKKworLyoqCisgKiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgLSBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZSB3aXRoIGZpbGUgc3lzdGVtcworICogQGRlY29kZV9maDogICAgICBkZWNvZGUgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCBhbmQgcmV0dXJuIGEgJnN0cnVjdCBkZW50cnkKKyAqIEBlbmNvZGVfZmg6ICAgICAgZW5jb2RlIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQgZnJvbSBhIGRlbnRyeQorICogQGdldF9uYW1lOiAgICAgICBmaW5kIHRoZSBuYW1lIGZvciBhIGdpdmVuIGlub2RlIGluIGEgZ2l2ZW4gZGlyZWN0b3J5CisgKiBAZ2V0X3BhcmVudDogICAgIGZpbmQgdGhlIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeQorICogQGdldF9kZW50cnk6ICAgICBmaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUgZ2l2ZW4gYSBmaWxlIGhhbmRsZSBzdWItZnJhZ21lbnQKKyAqIEBmaW5kX2V4cG9ydGVkX2RlbnRyeToKKyAqCXNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciBmdW5jdGlvbi4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIFRoZSBleHBvcnRfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBtZWFucyBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZQorICogICAgd2l0aCBhIHBhcnRpY3VsYXIgZXhwb3J0ZWQgZmlsZSBzeXN0ZW0gIC0gcGFydGljdWxhcmx5IGVuYWJsaW5nIG5mc2QgYW5kCisgKiAgICB0aGUgZmlsZXN5c3RlbSB0byBjby1vcGVyYXRlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGUgaGFuZGxlcy4KKyAqCisgKiAgICBleHBvcnRfb3BlcmF0aW9ucyBjb250YWlucyB0d28gYmFzaWMgb3BlcmF0aW9uIGZvciBkZWFsaW5nIHdpdGggZmlsZQorICogICAgaGFuZGxlcywgZGVjb2RlX2ZoKCkgYW5kIGVuY29kZV9maCgpLCBhbmQgYWxsb3dzIGZvciBzb21lIG90aGVyCisgKiAgICBvcGVyYXRpb25zIHRvIGJlIGRlZmluZWQgd2hpY2ggc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIHVzZSB0byBnZXQKKyAqICAgIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVzeXN0ZW0uCisgKgorICogICAgbmZzZCBlbmNvZGVzIGluZm9ybWF0aW9uIHVzZSB0byBkZXRlcm1pbmUgd2hpY2ggZmlsZXN5c3RlbSBhIGZpbGVoYW5kbGUKKyAqICAgIGFwcGxpZXMgdG8gaW4gdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgZmlsZSBoYW5kbGUuICBUaGUgcmVtYWluZGVyLCB0ZXJtZWQKKyAqICAgIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQsIGlzIGNvbnRyb2xsZWQgY29tcGxldGVseSBieSB0aGUgZmlsZXN5c3RlbS4gIFRoZQorICogICAgc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoaXMgZnJhZ21lbnQgd2lsbCBjb250YWluIG9uZSBvcgorICogICAgdHdvIHN1Yi1mcmFnbWVudHMsIG9uZSB3aGljaCBpZGVudGlmaWVzIHRoZSBmaWxlLCBhbmQgb25lIHdoaWNoIG1heSBiZQorICogICAgdXNlZCB0byBpZGVudGlmeSB0aGUgKGEpIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlLgorICoKKyAqICAgIEluIHNvbWUgc2l0dWF0aW9ucywgbmZzZCBuZWVkcyB0byBnZXQgYSBkZW50cnkgd2hpY2ggaXMgY29ubmVjdGVkIGludG8gYQorICogICAgc3BlY2lmaWMgcGFydCBvZiB0aGUgZmlsZSB0cmVlLiAgVG8gYWxsb3cgZm9yIHRoaXMsIGl0IHBhc3NlcyB0aGUKKyAqICAgIGZ1bmN0aW9uIGFjY2VwdGFibGUoKSB0b2dldGhlciB3aXRoIGEgQGNvbnRleHQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VlCisgKiAgICBpZiB0aGUgZGVudHJ5IGlzIGFjY2VwdGFibGUuICBBcyB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgZGVudHJ5cyBmb3IgYQorICogICAgZ2l2ZW4gZmlsZSwgdGhlIGZpbGVzeXN0ZW0gc2hvdWxkIGNoZWNrIGVhY2ggb25lIGZvciBhY2NlcHRhYmlsaXR5IGJlZm9yZQorICogICAgbG9va2luZyBmb3IgdGhlIG5leHQuICBBcyBzb29uIGFzIGFuIGFjY2VwdGFibGUgb25lIGlzIGZvdW5kLCBpdCBzaG91bGQKKyAqICAgIGJlIHJldHVybmVkLgorICoKKyAqIGRlY29kZV9maDoKKyAqICAgIEBkZWNvZGVfZmggaXMgZ2l2ZW4gYSAmc3RydWN0IHN1cGVyX2Jsb2NrIChAc2IpLCBhIGZpbGUgaGFuZGxlIGZyYWdtZW50CisgKiAgICAoQGZoLCBAZmhfbGVuKSBhbmQgYW4gYWNjZXB0YWJpbGl0eSB0ZXN0aW5nIGZ1bmN0aW9uIChAYWNjZXB0YWJsZSwKKyAqICAgIEBjb250ZXh0KS4gIEl0IHNob3VsZCByZXR1cm4gYSAmc3RydWN0IGRlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHNhbWUKKyAqICAgIGZpbGUgdGhhdCB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQgcmVmZXJzIHRvLCAgYW5kIHdoaWNoIHBhc3NlcyB0aGUKKyAqICAgIGFjY2VwdGFiaWxpdHkgdGVzdC4gIElmIGl0IGNhbm5vdCwgaXQgc2hvdWxkIHJldHVybiBhICVOVUxMIHBvaW50ZXIgaWYKKyAqICAgIHRoZSBmaWxlIHdhcyBmb3VuZCBidXQgbm8gYWNjZXB0YWJsZSAmZGVudHJpZXMgd2VyZSBhdmFpbGFibGUsIG9yIGEKKyAqICAgICVFUlJfUFRSIGVycm9yIGNvZGUgaW5kaWNhdGluZyB3aHkgaXQgY291bGRuJ3QgYmUgZm91bmQgKGUuZy4gJUVOT0VOVCBvcgorICogICAgJUVOT01FTSkuCisgKgorICogZW5jb2RlX2ZoOgorICogICAgQGVuY29kZV9maCBzaG91bGQgc3RvcmUgaW4gdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50IEBmaCAodXNpbmcgYXQgbW9zdAorICogICAgQG1heF9sZW4gYnl0ZXMpIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgQGRlY29kZV9maCB0byByZWNvdmVyIHRoZQorICogICAgZmlsZSByZWZlcmVkIHRvIGJ5IHRoZSAmc3RydWN0IGRlbnRyeSBAZGUuICBJZiB0aGUgQGNvbm5lY3RhYmxlIGZsYWcgaXMKKyAqICAgIHNldCwgdGhlIGVuY29kZV9maCgpIHNob3VsZCBzdG9yZSBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHNvIHRoYXQgYSBnb29kCisgKiAgICBhdHRlbXB0IGNhbiBiZSBtYWRlIHRvIGZpbmQgbm90IG9ubHkgdGhlIGZpbGUgYnV0IGFsc28gaXQncyBwbGFjZSBpbiB0aGUKKyAqICAgIGZpbGVzeXN0ZW0uICAgVGhpcyB0eXBpY2FsbHkgbWVhbnMgc3RvcmluZyBhIHJlZmVyZW5jZSB0byBkZS0+ZF9wYXJlbnQgaW4KKyAqICAgIHRoZSBmaWxlaGFuZGxlIGZyYWdtZW50LiAgZW5jb2RlX2ZoKCkgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiAgICBzdG9yZWQgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHN1Y2ggYXMgJS1FTk9TUEMKKyAqCisgKiBnZXRfbmFtZToKKyAqICAgIEBnZXRfbmFtZSBzaG91bGQgZmluZCBhIG5hbWUgZm9yIHRoZSBnaXZlbiBAY2hpbGQgaW4gdGhlIGdpdmVuIEBwYXJlbnQKKyAqICAgIGRpcmVjdG9yeS4gIFRoZSBuYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIEBuYW1lICh3aXRoIHRoZQorICogICAgdW5kZXJzdGFuZGluZyB0aGF0IGl0IGlzIGFscmVhZHkgcG9pbnRpbmcgdG8gYSBhICVOQU1FX01BWCsxIHNpemVkCisgKiAgICBidWZmZXIuICAgZ2V0X25hbWUoKSBzaG91bGQgcmV0dXJuICUwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICogICAgb3IgZXJyb3IuICBAZ2V0X25hbWUgd2lsbCBiZSBjYWxsZWQgd2l0aG91dCBAcGFyZW50LT5pX211dGV4IGhlbGQuCisgKgorICogZ2V0X3BhcmVudDoKKyAqICAgIEBnZXRfcGFyZW50IHNob3VsZCBmaW5kIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gQGNoaWxkIHdoaWNoCisgKiAgICBpcyBhbHNvIGEgZGlyZWN0b3J5LiAgSW4gdGhlIGV2ZW50IHRoYXQgaXQgY2Fubm90IGJlIGZvdW5kLCBvciBzdG9yYWdlCisgKiAgICBzcGFjZSBjYW5ub3QgYmUgYWxsb2NhdGVkLCBhICVFUlJfUFRSIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKiBnZXRfZGVudHJ5OgorICogICAgR2l2ZW4gYSAmc3VwZXJfYmxvY2sgKEBzYikgYW5kIGEgcG9pbnRlciB0byBhIGZpbGUtc3lzdGVtIHNwZWNpZmljIGlub2RlCisgKiAgICBpZGVudGlmaWVyLCBwb3NzaWJseSBhbiBpbm9kZSBudW1iZXIsIChAaW51bXApIGdldF9kZW50cnkoKSBzaG91bGQgZmluZAorICogICAgdGhlIGlkZW50aWZpZWQgaW5vZGUgYW5kIHJldHVybiBhIGRlbnRyeSBmb3IgdGhhdCBpbm9kZS4gIEFueSBzdWl0YWJsZQorICogICAgZGVudHJ5IGNhbiBiZSByZXR1cm5lZCBpbmNsdWRpbmcsIGlmIG5lY2Vzc2FyeSwgYSBuZXcgZGVudHJ5IGNyZWF0ZWQgd2l0aAorICogICAgZF9hbGxvY19yb290LiAgVGhlIGNhbGxlciBjYW4gdGhlbiBmaW5kIGFueSBvdGhlciBleHRhbnQgZGVudHJ5cyBieQorICogICAgZm9sbG93aW5nIHRoZSBkX2FsaWFzIGxpbmtzLiAgSWYgYSBuZXcgZGVudHJ5IHdhcyBjcmVhdGVkIHVzaW5nCisgKiAgICBkX2FsbG9jX3Jvb3QsIERDQUNIRV9ORlNEX0RJU0NPTk5FQ1RFRCBzaG91bGQgYmUgc2V0LCBhbmQgdGhlIGRlbnRyeQorICogICAgc2hvdWxkIGJlIGRfcmVoYXNoKCllZC4KKyAqCisgKiAgICBJZiB0aGUgaW5vZGUgY2Fubm90IGJlIGZvdW5kLCBlaXRoZXIgYSAlTlVMTCBwb2ludGVyIG9yIGFuICVFUlJfUFRSIGNvZGUKKyAqICAgIGNhbiBiZSByZXR1cm5lZC4gIFRoZSBAaW51bXAgd2lsbCBiZSB3aGF0ZXZlciB3YXMgcGFzc2VkIHRvCisgKiAgICBuZnNkX2ZpbmRfZmhfZGVudHJ5KCkgaW4gZWl0aGVyIHRoZSBAb2JqIG9yIEBwYXJlbnQgcGFyYW1ldGVycy4KKyAqCisgKiBMb2NraW5nIHJ1bGVzOgorICogICAgZ2V0X3BhcmVudCBpcyBjYWxsZWQgd2l0aCBjaGlsZC0+ZF9pbm9kZS0+aV9tdXRleCBkb3duCisgKiAgICBnZXRfbmFtZSBpcyBub3QgKHdoaWNoIGlzIHBvc3NpYmx5IGluY29uc2lzdGVudCkKKyAqLworCitzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgeworCXN0cnVjdCBkZW50cnkgKigqZGVjb2RlX2ZoKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqZmgsCisJCQlpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSwKKwkJCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJCXZvaWQgKmNvbnRleHQpOworCWludCAoKmVuY29kZV9maCkoc3RydWN0IGRlbnRyeSAqZGUsIF9fdTMyICpmaCwgaW50ICptYXhfbGVuLAorCQkJaW50IGNvbm5lY3RhYmxlKTsKKwlpbnQgKCpnZXRfbmFtZSkoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGRlbnRyeSAqY2hpbGQpOworCXN0cnVjdCBkZW50cnkgKiAoKmdldF9wYXJlbnQpKHN0cnVjdCBkZW50cnkgKmNoaWxkKTsKKwlzdHJ1Y3QgZGVudHJ5ICogKCpnZXRfZGVudHJ5KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICppbnVtcCk7CisKKwkvKiBUaGlzIGlzIHNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciAqLworCXN0cnVjdCBkZW50cnkgKiAoKmZpbmRfZXhwb3J0ZWRfZGVudHJ5KSgKKwkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAorCQkJaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAorCQkJdm9pZCAqY29udGV4dCk7Cit9OworCitleHRlcm4gc3RydWN0IGRlbnRyeSAqZmluZF9leHBvcnRlZF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLAorCXZvaWQgKnBhcmVudCwgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAorCXZvaWQgKmNvbnRleHQpOworCitleHRlcm4gaW50IGV4cG9ydGZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpmaCwgaW50ICptYXhfbGVuLAorCWludCBjb25uZWN0YWJsZSk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqZXhwb3J0ZnNfZGVjb2RlX2ZoKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBfX3UzMiAqZmgsCisJaW50IGZoX2xlbiwgaW50IGZpbGVpZF90eXBlLCBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICosIHN0cnVjdCBkZW50cnkgKiksCisJdm9pZCAqY29udGV4dCk7CisKKyNlbmRpZiAvKiBMSU5VWF9FWFBPUlRGU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCmluZGV4IDRlZGEwZWQuLmQxNDlmMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCkBAIC0zMyw2ICszMyw4IEBACiAJdW5zaWduZWQgbG9uZyBzX2dkYl9jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZyBzX2Rlc2NfcGVyX2Jsb2NrOwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvcnMgcGVyIGJsb2NrICovCiAJdW5zaWduZWQgbG9uZyBzX2dyb3Vwc19jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZnMgKi8KKwl1bnNpZ25lZCBsb25nIHNfb3ZlcmhlYWRfbGFzdDsgIC8qIExhc3QgY2FsY3VsYXRlZCBvdmVyaGVhZCAqLworCXVuc2lnbmVkIGxvbmcgc19ibG9ja3NfbGFzdDsgICAgLyogTGFzdCBzZWVuIGJsb2NrIGNvdW50ICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLwogCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2dyb3VwX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCmluZGV4IGY2MTMwOWMuLmQzYzA4MzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCkBAIC0zOCw2ICszOCw4IEBACiAJdW5zaWduZWQgbG9uZyBzX2dkYl9jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZyBzX2Rlc2NfcGVyX2Jsb2NrOwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvcnMgcGVyIGJsb2NrICovCiAJdW5zaWduZWQgbG9uZyBzX2dyb3Vwc19jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZnMgKi8KKwl1bnNpZ25lZCBsb25nIHNfb3ZlcmhlYWRfbGFzdDsgIC8qIExhc3QgY2FsY3VsYXRlZCBvdmVyaGVhZCAqLworCXVuc2lnbmVkIGxvbmcgc19ibG9ja3NfbGFzdDsgICAgLyogTGFzdCBzZWVuIGJsb2NrIGNvdW50ICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLwogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2dyb3VwX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDRfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCmluZGV4IDY5MWE3MTMuLjIzNDc1NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCkBAIC0zOSw2ICszOSw4IEBACiAJdW5zaWduZWQgbG9uZyBzX2dkYl9jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZyBzX2Rlc2NfcGVyX2Jsb2NrOwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvcnMgcGVyIGJsb2NrICovCiAJdW5zaWduZWQgbG9uZyBzX2dyb3Vwc19jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZnMgKi8KKwl1bnNpZ25lZCBsb25nIHNfb3ZlcmhlYWRfbGFzdDsgIC8qIExhc3QgY2FsY3VsYXRlZCBvdmVyaGVhZCAqLworCXVuc2lnbmVkIGxvbmcgc19ibG9ja3NfbGFzdDsgICAgLyogTGFzdCBzZWVuIGJsb2NrIGNvdW50ICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICogc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2dyb3VwX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKaW5kZXggNjYyMjY4Mi4uY2VjNTQxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtMTE5LDYgKzExOSw3IEBACiAjZGVmaW5lIEZCX0FDQ0VMX05WXzQwICAgICAgICAgIDQ2ICAgICAgLyogblZpZGlhIEFyY2ggNDAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1YJNDcJLyogWEdJIFZvbGFyaSBWM1hULCBWNSwgVjggICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1oJNDgJLyogWEdJIFZvbGFyaSBaNyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9PTUFQMTYxMAk0OQkvKiBUSSBPTUFQMTZ4eCAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA3MCA5MAkvKiBOZW9NYWdpYyBOTTIwNzAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MCA5MQkvKiBOZW9NYWdpYyBOTTIwOTAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MyA5MgkvKiBOZW9NYWdpYyBOTTIwOTMgICAgICAgICAgICAgICovCkBAIC01MjksNiArNTMwLDggQEAKICNkZWZpbmUgRkJfRVZFTlRfQ09OQkxBTksgICAgICAgICAgICAgICAweDBDCiAvKiAgICAgIEdldCBkcmF3aW5nIHJlcXVpcmVtZW50cyAgICAgICAgKi8KICNkZWZpbmUgRkJfRVZFTlRfR0VUX1JFUSAgICAgICAgICAgICAgICAweDBECisvKiAgICAgIFVuYmluZCBmcm9tIHRoZSBjb25zb2xlIGlmIHBvc3NpYmxlICovCisjZGVmaW5lIEZCX0VWRU5UX0ZCX1VOQklORCAgICAgICAgICAgICAgMHgwRQogCiBzdHJ1Y3QgZmJfZXZlbnQgewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maWxlLmggYi9pbmNsdWRlL2xpbnV4L2ZpbGUuaAppbmRleCBhNTkwMDFlLi4wMTE0ZmJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpbGUuaApAQCAtNzMsNiArNzMsNyBAQAogZXh0ZXJuIHZvaWQgRkFTVENBTEwoc2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBpbnQgZmxhZykpOwogZXh0ZXJuIHZvaWQgcHV0X2ZpbHAoc3RydWN0IGZpbGUgKik7CiBleHRlcm4gaW50IGdldF91bnVzZWRfZmQodm9pZCk7CitleHRlcm4gaW50IGdldF91bnVzZWRfZmRfZmxhZ3MoaW50IGZsYWdzKTsKIGV4dGVybiB2b2lkIEZBU1RDQUxMKHB1dF91bnVzZWRfZmQodW5zaWduZWQgaW50IGZkKSk7CiBzdHJ1Y3Qga21lbV9jYWNoZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcmVlemVyLmggYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAppbmRleCA0NjMxMDg2Li4yZDM4YjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaApAQCAtMSw1ICsxLDggQEAKIC8qIEZyZWV6ZXIgZGVjbGFyYXRpb25zICovCiAKKyNpZm5kZWYgRlJFRVpFUl9IX0lOQ0xVREVECisjZGVmaW5lIEZSRUVaRVJfSF9JTkNMVURFRAorCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMTE1LDYgKzExOCwxNCBAQAogCXJldHVybiAhIShwLT5mbGFncyAmIFBGX0ZSRUVaRVJfU0tJUCk7CiB9CiAKKy8qCisgKiBUZWxsIHRoZSBmcmVlemVyIHRoYXQgdGhlIGN1cnJlbnQgdGFzayBzaG91bGQgYmUgZnJvemVuIGJ5IGl0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJlZXphYmxlKHZvaWQpCit7CisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX05PRlJFRVpFOworfQorCiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgZnJvemVuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgZnJlZXppbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9CkBAIC0xMzAsNCArMTQxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlemVyX2RvX25vdF9jb3VudCh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZXJfY291bnQodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgaW50IGZyZWV6ZXJfc2hvdWxkX3NraXAoc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZyZWV6YWJsZSh2b2lkKSB7fQogI2VuZGlmCisKKyNlbmRpZgkvKiBGUkVFWkVSX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCA0ZjBiM2JmLi41OGNlMzM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC00NCw3ICs0NCw3IEBACiBzdHJ1Y3QgaW5vZGVzX3N0YXRfdCB7CiAJaW50IG5yX2lub2RlczsKIAlpbnQgbnJfdW51c2VkOwotCWludCBkdW1teVs1XTsKKwlpbnQgZHVtbXlbNV07CQkvKiBwYWRkaW5nIGZvciBzeXNjdGwgQUJJIGNvbXBhdGliaWxpdHkgKi8KIH07CiBleHRlcm4gc3RydWN0IGlub2Rlc19zdGF0X3QgaW5vZGVzX3N0YXQ7CiAKQEAgLTI4MywxMSArMjgzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zOwogc3RydWN0IGhkX2dlb21ldHJ5Owogc3RydWN0IGlvdmVjOwogc3RydWN0IG5hbWVpZGF0YTsKQEAgLTgyMCw2ICs4MjIsMTAgQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCBuZnNfbG9ja19pbmZvCW5mc19mbDsKIAkJc3RydWN0IG5mczRfbG9ja19pbmZvCW5mczRfZmw7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CS8qIGxpbmsgaW4gQUZTIHZub2RlJ3MgcGVuZGluZ19sb2NrcyBsaXN0ICovCisJCQlpbnQgc3RhdGU7CQkvKiBzdGF0ZSBvZiBncmFudCBvciBlcnJvciBpZiAtdmUgKi8KKwkJfSBhZnM7CiAJfSBmbF91OwogfTsKIApAQCAtMTI3MywxMTkgKzEyNzksNiBAQAogCiBpbnQgc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiAKLS8qKgotICogc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIC0gZm9yIG5mc2QgdG8gY29tbXVuaWNhdGUgd2l0aCBmaWxlIHN5c3RlbXMKLSAqIEBkZWNvZGVfZmg6ICAgICAgZGVjb2RlIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQgYW5kIHJldHVybiBhICZzdHJ1Y3QgZGVudHJ5Ci0gKiBAZW5jb2RlX2ZoOiAgICAgIGVuY29kZSBhIGZpbGUgaGFuZGxlIGZyYWdtZW50IGZyb20gYSBkZW50cnkKLSAqIEBnZXRfbmFtZTogICAgICAgZmluZCB0aGUgbmFtZSBmb3IgYSBnaXZlbiBpbm9kZSBpbiBhIGdpdmVuIGRpcmVjdG9yeQotICogQGdldF9wYXJlbnQ6ICAgICBmaW5kIHRoZSBwYXJlbnQgb2YgYSBnaXZlbiBkaXJlY3RvcnkKLSAqIEBnZXRfZGVudHJ5OiAgICAgZmluZCBhIGRlbnRyeSBmb3IgdGhlIGlub2RlIGdpdmVuIGEgZmlsZSBoYW5kbGUgc3ViLWZyYWdtZW50Ci0gKiBAZmluZF9leHBvcnRlZF9kZW50cnk6Ci0gKglzZXQgYnkgdGhlIGV4cG9ydGluZyBtb2R1bGUgdG8gYSBzdGFuZGFyZCBoZWxwZXIgZnVuY3Rpb24uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBUaGUgZXhwb3J0X29wZXJhdGlvbnMgc3RydWN0dXJlIHByb3ZpZGVzIGEgbWVhbnMgZm9yIG5mc2QgdG8gY29tbXVuaWNhdGUKLSAqICAgIHdpdGggYSBwYXJ0aWN1bGFyIGV4cG9ydGVkIGZpbGUgc3lzdGVtICAtIHBhcnRpY3VsYXJseSBlbmFibGluZyBuZnNkIGFuZAotICogICAgdGhlIGZpbGVzeXN0ZW0gdG8gY28tb3BlcmF0ZSB3aGVuIGRlYWxpbmcgd2l0aCBmaWxlIGhhbmRsZXMuCi0gKgotICogICAgZXhwb3J0X29wZXJhdGlvbnMgY29udGFpbnMgdHdvIGJhc2ljIG9wZXJhdGlvbiBmb3IgZGVhbGluZyB3aXRoIGZpbGUKLSAqICAgIGhhbmRsZXMsIGRlY29kZV9maCgpIGFuZCBlbmNvZGVfZmgoKSwgYW5kIGFsbG93cyBmb3Igc29tZSBvdGhlcgotICogICAgb3BlcmF0aW9ucyB0byBiZSBkZWZpbmVkIHdoaWNoIHN0YW5kYXJkIGhlbHBlciByb3V0aW5lcyB1c2UgdG8gZ2V0Ci0gKiAgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlc3lzdGVtLgotICoKLSAqICAgIG5mc2QgZW5jb2RlcyBpbmZvcm1hdGlvbiB1c2UgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpbGVzeXN0ZW0gYSBmaWxlaGFuZGxlCi0gKiAgICBhcHBsaWVzIHRvIGluIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIGZpbGUgaGFuZGxlLiAgVGhlIHJlbWFpbmRlciwgdGVybWVkCi0gKiAgICBhIGZpbGUgaGFuZGxlIGZyYWdtZW50LCBpcyBjb250cm9sbGVkIGNvbXBsZXRlbHkgYnkgdGhlIGZpbGVzeXN0ZW0uICBUaGUKLSAqICAgIHN0YW5kYXJkIGhlbHBlciByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGlzIGZyYWdtZW50IHdpbGwgY29udGFpbiBvbmUgb3IKLSAqICAgIHR3byBzdWItZnJhZ21lbnRzLCBvbmUgd2hpY2ggaWRlbnRpZmllcyB0aGUgZmlsZSwgYW5kIG9uZSB3aGljaCBtYXkgYmUKLSAqICAgIHVzZWQgdG8gaWRlbnRpZnkgdGhlIChhKSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZS4KLSAqCi0gKiAgICBJbiBzb21lIHNpdHVhdGlvbnMsIG5mc2QgbmVlZHMgdG8gZ2V0IGEgZGVudHJ5IHdoaWNoIGlzIGNvbm5lY3RlZCBpbnRvIGEKLSAqICAgIHNwZWNpZmljIHBhcnQgb2YgdGhlIGZpbGUgdHJlZS4gIFRvIGFsbG93IGZvciB0aGlzLCBpdCBwYXNzZXMgdGhlCi0gKiAgICBmdW5jdGlvbiBhY2NlcHRhYmxlKCkgdG9nZXRoZXIgd2l0aCBhIEBjb250ZXh0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlZQotICogICAgaWYgdGhlIGRlbnRyeSBpcyBhY2NlcHRhYmxlLiAgQXMgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGRlbnRyeXMgZm9yIGEKLSAqICAgIGdpdmVuIGZpbGUsIHRoZSBmaWxlc3lzdGVtIHNob3VsZCBjaGVjayBlYWNoIG9uZSBmb3IgYWNjZXB0YWJpbGl0eSBiZWZvcmUKLSAqICAgIGxvb2tpbmcgZm9yIHRoZSBuZXh0LiAgQXMgc29vbiBhcyBhbiBhY2NlcHRhYmxlIG9uZSBpcyBmb3VuZCwgaXQgc2hvdWxkCi0gKiAgICBiZSByZXR1cm5lZC4KLSAqCi0gKiBkZWNvZGVfZmg6Ci0gKiAgICBAZGVjb2RlX2ZoIGlzIGdpdmVuIGEgJnN0cnVjdCBzdXBlcl9ibG9jayAoQHNiKSwgYSBmaWxlIGhhbmRsZSBmcmFnbWVudAotICogICAgKEBmaCwgQGZoX2xlbikgYW5kIGFuIGFjY2VwdGFiaWxpdHkgdGVzdGluZyBmdW5jdGlvbiAoQGFjY2VwdGFibGUsCi0gKiAgICBAY29udGV4dCkuICBJdCBzaG91bGQgcmV0dXJuIGEgJnN0cnVjdCBkZW50cnkgd2hpY2ggcmVmZXJzIHRvIHRoZSBzYW1lCi0gKiAgICBmaWxlIHRoYXQgdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50IHJlZmVycyB0bywgIGFuZCB3aGljaCBwYXNzZXMgdGhlCi0gKiAgICBhY2NlcHRhYmlsaXR5IHRlc3QuICBJZiBpdCBjYW5ub3QsIGl0IHNob3VsZCByZXR1cm4gYSAlTlVMTCBwb2ludGVyIGlmCi0gKiAgICB0aGUgZmlsZSB3YXMgZm91bmQgYnV0IG5vIGFjY2VwdGFibGUgJmRlbnRyaWVzIHdlcmUgYXZhaWxhYmxlLCBvciBhCi0gKiAgICAlRVJSX1BUUiBlcnJvciBjb2RlIGluZGljYXRpbmcgd2h5IGl0IGNvdWxkbid0IGJlIGZvdW5kIChlLmcuICVFTk9FTlQgb3IKLSAqICAgICVFTk9NRU0pLgotICoKLSAqIGVuY29kZV9maDoKLSAqICAgIEBlbmNvZGVfZmggc2hvdWxkIHN0b3JlIGluIHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudCBAZmggKHVzaW5nIGF0IG1vc3QKLSAqICAgIEBtYXhfbGVuIGJ5dGVzKSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IEBkZWNvZGVfZmggdG8gcmVjb3ZlciB0aGUKLSAqICAgIGZpbGUgcmVmZXJlZCB0byBieSB0aGUgJnN0cnVjdCBkZW50cnkgQGRlLiAgSWYgdGhlIEBjb25uZWN0YWJsZSBmbGFnIGlzCi0gKiAgICBzZXQsIHRoZSBlbmNvZGVfZmgoKSBzaG91bGQgc3RvcmUgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBzbyB0aGF0IGEgZ29vZAotICogICAgYXR0ZW1wdCBjYW4gYmUgbWFkZSB0byBmaW5kIG5vdCBvbmx5IHRoZSBmaWxlIGJ1dCBhbHNvIGl0J3MgcGxhY2UgaW4gdGhlCi0gKiAgICBmaWxlc3lzdGVtLiAgIFRoaXMgdHlwaWNhbGx5IG1lYW5zIHN0b3JpbmcgYSByZWZlcmVuY2UgdG8gZGUtPmRfcGFyZW50IGluCi0gKiAgICB0aGUgZmlsZWhhbmRsZSBmcmFnbWVudC4gIGVuY29kZV9maCgpIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcwotICogICAgc3RvcmVkIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBzdWNoIGFzICUtRU5PU1BDCi0gKgotICogZ2V0X25hbWU6Ci0gKiAgICBAZ2V0X25hbWUgc2hvdWxkIGZpbmQgYSBuYW1lIGZvciB0aGUgZ2l2ZW4gQGNoaWxkIGluIHRoZSBnaXZlbiBAcGFyZW50Ci0gKiAgICBkaXJlY3RvcnkuICBUaGUgbmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBAbmFtZSAod2l0aCB0aGUKLSAqICAgIHVuZGVyc3RhbmRpbmcgdGhhdCBpdCBpcyBhbHJlYWR5IHBvaW50aW5nIHRvIGEgYSAlTkFNRV9NQVgrMSBzaXplZAotICogICAgYnVmZmVyLiAgIGdldF9uYW1lKCkgc2hvdWxkIHJldHVybiAlMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKLSAqICAgIG9yIGVycm9yLiAgQGdldF9uYW1lIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgQHBhcmVudC0+aV9tdXRleCBoZWxkLgotICoKLSAqIGdldF9wYXJlbnQ6Ci0gKiAgICBAZ2V0X3BhcmVudCBzaG91bGQgZmluZCB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgdGhlIGdpdmVuIEBjaGlsZCB3aGljaAotICogICAgaXMgYWxzbyBhIGRpcmVjdG9yeS4gIEluIHRoZSBldmVudCB0aGF0IGl0IGNhbm5vdCBiZSBmb3VuZCwgb3Igc3RvcmFnZQotICogICAgc3BhY2UgY2Fubm90IGJlIGFsbG9jYXRlZCwgYSAlRVJSX1BUUiBzaG91bGQgYmUgcmV0dXJuZWQuCi0gKgotICogZ2V0X2RlbnRyeToKLSAqICAgIEdpdmVuIGEgJnN1cGVyX2Jsb2NrIChAc2IpIGFuZCBhIHBvaW50ZXIgdG8gYSBmaWxlLXN5c3RlbSBzcGVjaWZpYyBpbm9kZQotICogICAgaWRlbnRpZmllciwgcG9zc2libHkgYW4gaW5vZGUgbnVtYmVyLCAoQGludW1wKSBnZXRfZGVudHJ5KCkgc2hvdWxkIGZpbmQKLSAqICAgIHRoZSBpZGVudGlmaWVkIGlub2RlIGFuZCByZXR1cm4gYSBkZW50cnkgZm9yIHRoYXQgaW5vZGUuICBBbnkgc3VpdGFibGUKLSAqICAgIGRlbnRyeSBjYW4gYmUgcmV0dXJuZWQgaW5jbHVkaW5nLCBpZiBuZWNlc3NhcnksIGEgbmV3IGRlbnRyeSBjcmVhdGVkIHdpdGgKLSAqICAgIGRfYWxsb2Nfcm9vdC4gIFRoZSBjYWxsZXIgY2FuIHRoZW4gZmluZCBhbnkgb3RoZXIgZXh0YW50IGRlbnRyeXMgYnkKLSAqICAgIGZvbGxvd2luZyB0aGUgZF9hbGlhcyBsaW5rcy4gIElmIGEgbmV3IGRlbnRyeSB3YXMgY3JlYXRlZCB1c2luZwotICogICAgZF9hbGxvY19yb290LCBEQ0FDSEVfTkZTRF9ESVNDT05ORUNURUQgc2hvdWxkIGJlIHNldCwgYW5kIHRoZSBkZW50cnkKLSAqICAgIHNob3VsZCBiZSBkX3JlaGFzaCgpZWQuCi0gKgotICogICAgSWYgdGhlIGlub2RlIGNhbm5vdCBiZSBmb3VuZCwgZWl0aGVyIGEgJU5VTEwgcG9pbnRlciBvciBhbiAlRVJSX1BUUiBjb2RlCi0gKiAgICBjYW4gYmUgcmV0dXJuZWQuICBUaGUgQGludW1wIHdpbGwgYmUgd2hhdGV2ZXIgd2FzIHBhc3NlZCB0bwotICogICAgbmZzZF9maW5kX2ZoX2RlbnRyeSgpIGluIGVpdGhlciB0aGUgQG9iaiBvciBAcGFyZW50IHBhcmFtZXRlcnMuCi0gKgotICogTG9ja2luZyBydWxlczoKLSAqICAgIGdldF9wYXJlbnQgaXMgY2FsbGVkIHdpdGggY2hpbGQtPmRfaW5vZGUtPmlfbXV0ZXggZG93bgotICogICAgZ2V0X25hbWUgaXMgbm90ICh3aGljaCBpcyBwb3NzaWJseSBpbmNvbnNpc3RlbnQpCi0gKi8KLQotc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIHsKLQlzdHJ1Y3QgZGVudHJ5ICooKmRlY29kZV9maCkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKmZoLCBpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSwKLQkJCSBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCQkgdm9pZCAqY29udGV4dCk7Ci0JaW50ICgqZW5jb2RlX2ZoKShzdHJ1Y3QgZGVudHJ5ICpkZSwgX191MzIgKmZoLCBpbnQgKm1heF9sZW4sCi0JCQkgaW50IGNvbm5lY3RhYmxlKTsKLQotCS8qIHRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgY2FsbGVkIGZyb20gdGhlIGZpbGVzeXN0ZW0gaXRzZWxmICovCi0JaW50ICgqZ2V0X25hbWUpKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgY2hhciAqbmFtZSwKLQkJCXN0cnVjdCBkZW50cnkgKmNoaWxkKTsKLQlzdHJ1Y3QgZGVudHJ5ICogKCpnZXRfcGFyZW50KShzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7Ci0Jc3RydWN0IGRlbnRyeSAqICgqZ2V0X2RlbnRyeSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqaW51bXApOwotCi0JLyogVGhpcyBpcyBzZXQgYnkgdGhlIGV4cG9ydGluZyBtb2R1bGUgdG8gYSBzdGFuZGFyZCBoZWxwZXIgKi8KLQlzdHJ1Y3QgZGVudHJ5ICogKCpmaW5kX2V4cG9ydGVkX2RlbnRyeSkoCi0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAotCQlpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCXZvaWQgKmNvbnRleHQpOwotCi0KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICoKLWZpbmRfZXhwb3J0ZWRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAotCQkgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJICAgICB2b2lkICpjb250ZXh0KTsKLQogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGZzX2ZsYWdzOwpAQCAtMTUyMiw3ICsxNDE1LDcgQEAKIAogI2lmZGVmIENPTkZJR19CTE9DSwogZXh0ZXJuIGludCByZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqYmRnZXQoZGV2X3QpOwogZXh0ZXJuIHZvaWQgYmRfc2V0X3NpemUoc3RydWN0IGJsb2NrX2RldmljZSAqLCBsb2ZmX3Qgc2l6ZSk7CiBleHRlcm4gdm9pZCBiZF9mb3JnZXQoc3RydWN0IGlub2RlICppbm9kZSk7CkBAIC0xNjEwLDYgKzE1MDMsOSBAQAogZXh0ZXJuIGludCBpbnZhbGlkYXRlX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqLCBpbnQpOwogI2VuZGlmCiBleHRlcm4gaW50IGludmFsaWRhdGVfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3Vuc2lnbmVkIGxvbmcgX19pbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kLAorCQkJCQlib29sIGJlX2F0b21pYyk7CiB1bnNpZ25lZCBsb25nIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQpOwogCkBAIC0yMDQzLDUgKzE5MzksOSBAQAogeyB9CiAjZW5kaWYJLyogQ09ORklHX1NFQ1VSSVRZICovCiAKK2ludCBwcm9jX25yX2ZpbGVzKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOworCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaCBiL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaAppbmRleCA3MzcxMGQ2Li42OTU3NDFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCkBAIC0xMTIsNyArMTEyLDcgQEAKIHN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgewogCXUzMiAJaW5pdGlhbF9zcG1vZGU7CS8qIGluaXRpYWwgU1BNT0RFIHZhbHVlICovCiAJdTE2CWJ1c19udW07Ci0KKwlib29sCXFlX21vZGU7CiAJLyogYm9hcmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIAl1MTYJbWF4X2NoaXBzZWxlY3Q7CiAJdm9pZAkoKmFjdGl2YXRlX2NzKSh1OCBjcywgdTggcG9sYXJpdHkpOwpAQCAtMTIwLDUgKzEyMCwxMCBAQAogCXUzMglzeXNjbGs7CiB9OwogCitzdHJ1Y3QgbXBjOHh4X3BjbWNpYV9vcHMgeworCXZvaWQoKmh3X2N0cmwpKGludCBzbG90LCBpbnQgZW5hYmxlKTsKKwlpbnQoKnZvbHRhZ2Vfc2V0KShpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCk7Cit9OworCiAjZW5kaWYgLyogX0ZTTF9ERVZJQ0VfSF8gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaCBiL2luY2x1ZGUvbGludXgvZnVzZS5oCmluZGV4IDUzNDc0NGUuLjlmYmU5ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnVzZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnVzZS5oCkBAIC0zMzksNyArMzM5LDcgQEAKIAljaGFyIG5hbWVbMF07CiB9OwogCi0jZGVmaW5lIEZVU0VfTkFNRV9PRkZTRVQgKCh1bnNpZ25lZCkgKChzdHJ1Y3QgZnVzZV9kaXJlbnQgKikgMCktPm5hbWUpCisjZGVmaW5lIEZVU0VfTkFNRV9PRkZTRVQgb2Zmc2V0b2Yoc3RydWN0IGZ1c2VfZGlyZW50LCBuYW1lKQogI2RlZmluZSBGVVNFX0RJUkVOVF9BTElHTih4KSAoKCh4KSArIHNpemVvZihfX3U2NCkgLSAxKSAmIH4oc2l6ZW9mKF9fdTY0KSAtIDEpKQogI2RlZmluZSBGVVNFX0RJUkVOVF9TSVpFKGQpIFwKIAlGVVNFX0RJUkVOVF9BTElHTihGVVNFX05BTUVfT0ZGU0VUICsgKGQpLT5uYW1lbGVuKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnAuaCBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKaW5kZXggMGQyZWYwYi4uYmM2OGRkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZnAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dmcC5oCkBAIC0zMCw2ICszMCw5IEBACiAgKiBjYW5ub3QgaGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZXMuCiAgKgogICogX19HRlBfTk9SRVRSWTogVGhlIFZNIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IHJldHJ5IGluZGVmaW5pdGVseS4KKyAqCisgKiBfX0dGUF9NT1ZBQkxFOiBGbGFnIHRoYXQgdGhpcyBwYWdlIHdpbGwgYmUgbW92YWJsZSBieSB0aGUgcGFnZSBtaWdyYXRpb24KKyAqIG1lY2hhbmlzbSBvciByZWNsYWltZWQKICAqLwogI2RlZmluZSBfX0dGUF9XQUlUCSgoX19mb3JjZSBnZnBfdCkweDEwdSkJLyogQ2FuIHdhaXQgYW5kIHJlc2NoZWR1bGU/ICovCiAjZGVmaW5lIF9fR0ZQX0hJR0gJKChfX2ZvcmNlIGdmcF90KTB4MjB1KQkvKiBTaG91bGQgYWNjZXNzIGVtZXJnZW5jeSBwb29scz8gKi8KQEAgLTQ1LDYgKzQ4LDcgQEAKICNkZWZpbmUgX19HRlBfTk9NRU1BTExPQyAoKF9fZm9yY2UgZ2ZwX3QpMHgxMDAwMHUpIC8qIERvbid0IHVzZSBlbWVyZ2VuY3kgcmVzZXJ2ZXMgKi8KICNkZWZpbmUgX19HRlBfSEFSRFdBTEwgICAoKF9fZm9yY2UgZ2ZwX3QpMHgyMDAwMHUpIC8qIEVuZm9yY2UgaGFyZHdhbGwgY3B1c2V0IG1lbW9yeSBhbGxvY3MgKi8KICNkZWZpbmUgX19HRlBfVEhJU05PREUJKChfX2ZvcmNlIGdmcF90KTB4NDAwMDB1KS8qIE5vIGZhbGxiYWNrLCBubyBwb2xpY2llcyAqLworI2RlZmluZSBfX0dGUF9NT1ZBQkxFCSgoX19mb3JjZSBnZnBfdCkweDgwMDAwdSkgLyogUGFnZSBpcyBtb3ZhYmxlICovCiAKICNkZWZpbmUgX19HRlBfQklUU19TSElGVCAyMAkvKiBSb29tIGZvciAyMCBfX0dGUF9GT08gYml0cyAqLwogI2RlZmluZSBfX0dGUF9CSVRTX01BU0sgKChfX2ZvcmNlIGdmcF90KSgoMSA8PCBfX0dGUF9CSVRTX1NISUZUKSAtIDEpKQpAQCAtNTMsNyArNTcsOCBAQAogI2RlZmluZSBHRlBfTEVWRUxfTUFTSyAoX19HRlBfV0FJVHxfX0dGUF9ISUdIfF9fR0ZQX0lPfF9fR0ZQX0ZTfCBcCiAJCQlfX0dGUF9DT0xEfF9fR0ZQX05PV0FSTnxfX0dGUF9SRVBFQVR8IFwKIAkJCV9fR0ZQX05PRkFJTHxfX0dGUF9OT1JFVFJZfF9fR0ZQX0NPTVB8IFwKLQkJCV9fR0ZQX05PTUVNQUxMT0N8X19HRlBfSEFSRFdBTEx8X19HRlBfVEhJU05PREUpCisJCQlfX0dGUF9OT01FTUFMTE9DfF9fR0ZQX0hBUkRXQUxMfF9fR0ZQX1RISVNOT0RFfCBcCisJCQlfX0dGUF9NT1ZBQkxFKQogCiAvKiBUaGlzIGVxdWFscyAwLCBidXQgdXNlIGNvbnN0YW50cyBpbiBjYXNlIHRoZXkgZXZlciBjaGFuZ2UgKi8KICNkZWZpbmUgR0ZQX05PV0FJVAkoR0ZQX0FUT01JQyAmIH5fX0dGUF9ISUdIKQpAQCAtNjUsNiArNzAsMTUgQEAKICNkZWZpbmUgR0ZQX1VTRVIJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgX19HRlBfSEFSRFdBTEwpCiAjZGVmaW5lIEdGUF9ISUdIVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBfX0dGUF9IQVJEV0FMTCB8IFwKIAkJCSBfX0dGUF9ISUdITUVNKQorI2RlZmluZSBHRlBfSElHSFVTRVJfTU9WQUJMRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCisJCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfSElHSE1FTSB8IFwKKwkJCQkgX19HRlBfTU9WQUJMRSkKKyNkZWZpbmUgR0ZQX05PRlNfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9NT1ZBQkxFKQorI2RlZmluZSBHRlBfVVNFUl9QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgXAorCQkJCSBfX0dGUF9IQVJEV0FMTCB8IF9fR0ZQX01PVkFCTEUpCisjZGVmaW5lIEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgXAorCQkJCSBfX0dGUF9IQVJEV0FMTCB8IF9fR0ZQX0hJR0hNRU0gfCBcCisJCQkJIF9fR0ZQX01PVkFCTEUpCiAKICNpZmRlZiBDT05GSUdfTlVNQQogI2RlZmluZSBHRlBfVEhJU05PREUJKF9fR0ZQX1RISVNOT0RFIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSkKQEAgLTkyLDYgKzEwNiw5IEBACiAJaWYgKGZsYWdzICYgX19HRlBfRE1BMzIpCiAJCXJldHVybiBaT05FX0RNQTMyOwogI2VuZGlmCisJaWYgKChmbGFncyAmIChfX0dGUF9ISUdITUVNIHwgX19HRlBfTU9WQUJMRSkpID09CisJCQkoX19HRlBfSElHSE1FTSB8IF9fR0ZQX01PVkFCTEUpKQorCQlyZXR1cm4gWk9ORV9NT1ZBQkxFOwogI2lmZGVmIENPTkZJR19ISUdITUVNCiAJaWYgKGZsYWdzICYgX19HRlBfSElHSE1FTSkKIAkJcmV0dXJuIFpPTkVfSElHSE1FTTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlnaG1lbS5oIGIvaW5jbHVkZS9saW51eC9oaWdobWVtLmgKaW5kZXggOThlMmNjZS4uMTJjNWU0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWdobWVtLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWdobWVtLmgKQEAgLTczLDEwICs3MywyNyBAQAogfQogCiAjaWZuZGVmIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCisvKioKKyAqIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UgLSBBbGxvY2F0ZSBhIHplcm9lZCBISUdITUVNIHBhZ2UgZm9yIGEgVk1BIHdpdGggY2FsbGVyLXNwZWNpZmllZCBtb3ZhYmxlIEdGUCBmbGFncworICogQG1vdmFibGVmbGFnczogVGhlIEdGUCBmbGFncyByZWxhdGVkIHRvIHRoZSBwYWdlcyBmdXR1cmUgYWJpbGl0eSB0byBtb3ZlIGxpa2UgX19HRlBfTU9WQUJMRQorICogQHZtYTogVGhlIFZNQSB0aGUgcGFnZSBpcyB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBAdmFkZHI6IFRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhlIHBhZ2Ugd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgcGFnZSBmb3IgYSBWTUEgYnV0IHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIHNwZWNpZnkgdmlhIG1vdmFibGVmbGFncyB3aGV0aGVyIHRoZSBwYWdlIHdpbGwgYmUgbW92YWJsZSBpbiB0aGUKKyAqIGZ1dHVyZSBvciBub3QKKyAqCisgKiBBbiBhcmNoaXRlY3R1cmUgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gYnkgZGVmaW5pbmcKKyAqIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFIGFuZCBwcm92aWRpbmcgdGhlaXIgb3duCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCi1hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK19fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UoZ2ZwX3QgbW92YWJsZWZsYWdzLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQl1bnNpZ25lZCBsb25nIHZhZGRyKQogewotCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSLCB2bWEsIHZhZGRyKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IG1vdmFibGVmbGFncywKKwkJCXZtYSwgdmFkZHIpOwogCiAJaWYgKHBhZ2UpCiAJCWNsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgdmFkZHIpOwpAQCAtODUsNiArMTAyLDM2IEBACiB9CiAjZW5kaWYKIAorLyoqCisgKiBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSAtIEFsbG9jYXRlIGEgemVyb2VkIEhJR0hNRU0gcGFnZSBmb3IgYSBWTUEKKyAqIEB2bWE6IFRoZSBWTUEgdGhlIHBhZ2UgaXMgdG8gYmUgYWxsb2NhdGVkIGZvcgorICogQHZhZGRyOiBUaGUgdmlydHVhbCBhZGRyZXNzIHRoZSBwYWdlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhIHBhZ2UgZm9yIGEgVk1BIHRoYXQgdGhlIGNhbGxlciBrbm93cyB3aWxsCisgKiBub3QgYmUgYWJsZSB0byBtb3ZlIGluIHRoZSBmdXR1cmUgdXNpbmcgbW92ZV9wYWdlcygpIG9yIHJlY2xhaW0uIElmIGl0CisgKiBpcyBrbm93biB0aGF0IHRoZSBwYWdlIGNhbiBtb3ZlLCB1c2UgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2VfbW92YWJsZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKK2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXJldHVybiBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKDAsIHZtYSwgdmFkZHIpOworfQorCisvKioKKyAqIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlX21vdmFibGUgLSBBbGxvY2F0ZSBhIHplcm9lZCBISUdITUVNIHBhZ2UgZm9yIGEgVk1BIHRoYXQgdGhlIGNhbGxlciBrbm93cyBjYW4gbW92ZQorICogQHZtYTogVGhlIFZNQSB0aGUgcGFnZSBpcyB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBAdmFkZHI6IFRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhlIHBhZ2Ugd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgcGFnZSBmb3IgYSBWTUEgdGhhdCB0aGUgY2FsbGVyIGtub3dzIHdpbGwKKyAqIGJlIGFibGUgdG8gbWlncmF0ZSBpbiB0aGUgZnV0dXJlIHVzaW5nIG1vdmVfcGFnZXMoKSBvciByZWNsYWltZWQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCithbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQl1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXJldHVybiBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKF9fR0ZQX01PVkFCTEUsIHZtYSwgdmFkZHIpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IDE3YzI5ZGMuLjU0MDc5OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC0zMjksMTIgKzMyOSwxMyBAQAogI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwogCiBleHRlcm4gdm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAotCQkJCSAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSk7CisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKmNvbW0sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdGltZXJfZmxhZyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQogewogCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCi0JCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0pOworCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tLCAwKTsKIH0KIAogZXh0ZXJuIHZvaWQgX190aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKaW5kZXggMmMxMzcxNS4uNDliNzA1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9odWdldGxiLmgKKysrIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKQEAgLTE1LDYgKzE1LDcgQEAKIH0KIAogaW50IGh1Z2V0bGJfc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitpbnQgaHVnZXRsYl90cmVhdF9tb3ZhYmxlX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiBpbnQgY29weV9odWdldGxiX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIGludCBmb2xsb3dfaHVnZXRsYl9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHN0cnVjdCBwYWdlICoqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiosIHVuc2lnbmVkIGxvbmcgKiwgaW50ICosIGludCk7CiB2b2lkIHVubWFwX2h1Z2VwYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKQEAgLTI5LDYgKzMwLDcgQEAKIHZvaWQgaHVnZXRsYl91bnJlc2VydmVfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBvZmZzZXQsIGxvbmcgZnJlZWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfaHVnZV9wYWdlczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgaHVnZXRsYl96ZXJvLCBodWdldGxiX2luZmluaXR5OwogZXh0ZXJuIGludCBzeXNjdGxfaHVnZXRsYl9zaG1fZ3JvdXA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJvLmggYi9pbmNsdWRlL2xpbnV4L2kyby5oCmluZGV4IDUyZjUzZTIuLjMzM2EzNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMm8uaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4JLyogd29ya19zdHJ1Y3QgKi8KICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4JLyogTmVlZGVkIGZvciBNVVRFWCBpbml0IG1hY3JvcyAqLwpAQCAtNDI1LDcgKzQyNiw3IEBACiAKIAlzdHJ1Y3QgZGV2aWNlIGRldmljZTsKIAotCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsJLyogZGV2aWNlIGxvY2sgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsJLyogZGV2aWNlIGxvY2sgKi8KIH07CiAKIC8qCkBAIC01NDQsNyArNTQ1LDcgQEAKIAlzdHJ1Y3QgaTJvX2RtYSBocnQ7CS8qIEhXIFJlc291cmNlIFRhYmxlICovCiAJaTJvX2xjdCAqbGN0OwkJLyogTG9naWNhbCBDb25maWcgVGFibGUgKi8KIAlzdHJ1Y3QgaTJvX2RtYSBkbGN0OwkvKiBUZW1wIExDVCAqLwotCXN0cnVjdCBzZW1hcGhvcmUgbGN0X2xvY2s7CS8qIExvY2sgZm9yIExDVCB1cGRhdGVzICovCisJc3RydWN0IG11dGV4IGxjdF9sb2NrOwkvKiBMb2NrIGZvciBMQ1QgdXBkYXRlcyAqLwogCXN0cnVjdCBpMm9fZG1hIHN0YXR1c19ibG9jazsJLyogSU9QIHN0YXR1cyBibG9jayAqLwogCiAJc3RydWN0IGkyb19pbyBiYXNlOwkvKiBjb250cm9sbGVyIG1lc3NhZ2luZyB1bml0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkci5oIGIvaW5jbHVkZS9saW51eC9pZHIuaAppbmRleCA5MTU1NzJmLi4wZWRkYTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRyLmgKQEAgLTc4LDggKzc4LDExIEBACiBpbnQgaWRyX3ByZV9nZXQoc3RydWN0IGlkciAqaWRwLCBnZnBfdCBnZnBfbWFzayk7CiBpbnQgaWRyX2dldF9uZXcoc3RydWN0IGlkciAqaWRwLCB2b2lkICpwdHIsIGludCAqaWQpOwogaW50IGlkcl9nZXRfbmV3X2Fib3ZlKHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgc3RhcnRpbmdfaWQsIGludCAqaWQpOworaW50IGlkcl9mb3JfZWFjaChzdHJ1Y3QgaWRyICppZHAsCisJCSBpbnQgKCpmbikoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7CiB2b2lkICppZHJfcmVwbGFjZShzdHJ1Y3QgaWRyICppZHAsIHZvaWQgKnB0ciwgaW50IGlkKTsKIHZvaWQgaWRyX3JlbW92ZShzdHJ1Y3QgaWRyICppZHAsIGludCBpZCk7Cit2b2lkIGlkcl9yZW1vdmVfYWxsKHN0cnVjdCBpZHIgKmlkcCk7CiB2b2lkIGlkcl9kZXN0cm95KHN0cnVjdCBpZHIgKmlkcCk7CiB2b2lkIGlkcl9pbml0KHN0cnVjdCBpZHIgKmlkcCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggNTZlYzRjNi4uNWI1Mjg1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTE3MSw5ICsxNzEsNiBAQAogI2RlZmluZSBfX3NldHVwKHN0ciwgZm4pCQkJCQlcCiAJX19zZXR1cF9wYXJhbShzdHIsIGZuLCBmbiwgMCkKIAotI2RlZmluZSBfX29ic29sZXRlX3NldHVwKHN0cikJCQkJCVwKLQlfX3NldHVwX251bGxfcGFyYW0oc3RyLCBfX0xJTkVfXykKLQogLyogTk9URTogZm4gaXMgYXMgcGVyIG1vZHVsZV9wYXJhbSwgbm90IF9fc2V0dXAhICBFbWl0cyB3YXJuaW5nIGlmIGZuCiAgKiByZXR1cm5zIG5vbi16ZXJvLiAqLwogI2RlZmluZSBlYXJseV9wYXJhbShzdHIsIGZuKQkJCQkJXApAQCAtMjM5LDcgKzIzNiw2IEBACiAjZGVmaW5lIF9fc2V0dXBfcGFyYW0oc3RyLCB1bmlxdWVfaWQsIGZuKQkvKiBub3RoaW5nICovCiAjZGVmaW5lIF9fc2V0dXBfbnVsbF9wYXJhbShzdHIsIHVuaXF1ZV9pZCkgCS8qIG5vdGhpbmcgKi8KICNkZWZpbmUgX19zZXR1cChzdHIsIGZ1bmMpIAkJCS8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgX19vYnNvbGV0ZV9zZXR1cChzdHIpIAkJCS8qIG5vdGhpbmcgKi8KICNlbmRpZgogCiAvKiBEYXRhIG1hcmtlZCBub3QgdG8gYmUgc2F2ZWQgYnkgc29mdHdhcmUgc3VzcGVuZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaCBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKaW5kZXggMjc2Y2NhYS4uY2FiNzQxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAogI2RlZmluZSBJTklUX0ZEVEFCTEUgXAogewkJCQkJCQlcCkBAIC03OCw2ICs3OSw3IEBACiAJLnV0c19ucwkJPSAmaW5pdF91dHNfbnMsCQkJCQlcCiAJLm1udF9ucwkJPSBOVUxMLAkJCQkJCVwKIAlJTklUX0lQQ19OUyhpcGNfbnMpCQkJCQkJXAorCS51c2VyX25zCT0gJmluaXRfdXNlcl9ucywJCQkJXAogfQogCiAjZGVmaW5lIElOSVRfU0lHSEFORChzaWdoYW5kKSB7CQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pby5oIGIvaW5jbHVkZS9saW51eC9pby5oCmluZGV4IDg0MjNkZDMuLmUzYjJkZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvLmgKQEAgLTYzLDMyICs2Myw3IEBACiB2b2lkIF9faW9tZW0gKiBkZXZtX2lvcmVtYXBfbm9jYWNoZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpOwogdm9pZCBkZXZtX2lvdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpOwotCi0vKioKLSAqCWNoZWNrX3NpZ25hdHVyZQkJLQlmaW5kIEJJT1Mgc2lnbmF0dXJlcwotICoJQGlvX2FkZHI6IG1taW8gYWRkcmVzcyB0byBjaGVjawotICoJQHNpZ25hdHVyZTogIHNpZ25hdHVyZSBibG9jawotICoJQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQotICoKLSAqCVBlcmZvcm0gYSBzaWduYXR1cmUgY29tcGFyaXNvbiB3aXRoIHRoZSBtbWlvIGFkZHJlc3MgaW9fYWRkci4gVGhpcwotICoJYWRkcmVzcyBzaG91bGQgaGF2ZSBiZWVuIG9idGFpbmVkIGJ5IGlvcmVtYXAuCi0gKglSZXR1cm5zIDEgb24gYSBtYXRjaC4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICppb19hZGRyLAotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlkbyB7Ci0JCWlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQotCQkJZ290byBvdXQ7Ci0JCWlvX2FkZHIrKzsKLQkJc2lnbmF0dXJlKys7Ci0JCWxlbmd0aC0tOwotCX0gd2hpbGUgKGxlbmd0aCk7Ci0JcmV0dmFsID0gMTsKLW91dDoKLQlyZXR1cm4gcmV0dmFsOwotfQoraW50IGNoZWNrX3NpZ25hdHVyZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmlvX2FkZHIsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpOwogCiAjZW5kaWYgLyogX0xJTlVYX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXBjLmggYi9pbmNsdWRlL2xpbnV4L2lwYy5oCmluZGV4IDE5ODA4NjcuLjNmZDNkZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcGMuaApAQCAtNTIsNiArNTIsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjZGVmaW5lIElQQ01OSSAzMjc2OCAgLyogPD0gTUFYX0lOVCBsaW1pdCBmb3IgaXBjIGFycmF5cyAoaW5jbHVkaW5nIHN5c2N0bCBjaGFuZ2VzKSAqLwogCkBAIC05Miw2ICs5Myw3IEBACiAKICNpZmRlZiBDT05GSUdfU1lTVklQQwogI2RlZmluZSBJTklUX0lQQ19OUyhucykJCS5ucwkJPSAmaW5pdF9pcGNfbnMsCitleHRlcm4gdm9pZCBmcmVlX2lwY19ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7CiBleHRlcm4gc3RydWN0IGlwY19uYW1lc3BhY2UgKmNvcHlfaXBjcyh1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJCQkJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKTsKICNlbHNlCkBAIC0xMDMsMTMgKzEwNSw5IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19JUENfTlMKLWV4dGVybiB2b2lkIGZyZWVfaXBjX25zKHN0cnVjdCBrcmVmICprcmVmKTsKLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpnZXRfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKLSNpZmRlZiBDT05GSUdfSVBDX05TCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKIAlpZiAobnMpCiAJCWtyZWZfZ2V0KCZucy0+a3JlZik7CiAjZW5kaWYKQEAgLTExOCw3ICsxMTYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2lwY19ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7Ci0jaWZkZWYgQ09ORklHX0lQQ19OUworI2lmZGVmIENPTkZJR19TWVNWSVBDCiAJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX2lwY19ucyk7CiAjZW5kaWYKIH0KQEAgLTEyNiw1ICsxMjQsMyBAQAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9JUENfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IDE2OTUwNTQuLjQ0NjU3MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMTYxLDYgKzE2MSw3IEBACiAJdW5zaWduZWQgaW50CQl3YWtlX2RlcHRoOwkvKiBuZXN0ZWQgd2FrZSBlbmFibGVzICovCiAJdW5zaWduZWQgaW50CQlpcnFfY291bnQ7CS8qIEZvciBkZXRlY3RpbmcgYnJva2VuIElSUXMgKi8KIAl1bnNpZ25lZCBpbnQJCWlycXNfdW5oYW5kbGVkOworCXVuc2lnbmVkIGxvbmcJCWxhc3RfdW5oYW5kbGVkOwkvKiBBZ2luZyB0aW1lciBmb3IgdW5oYW5kbGVkIGNvdW50ICovCiAJc3BpbmxvY2tfdAkJbG9jazsKICNpZmRlZiBDT05GSUdfU01QCiAJY3B1bWFza190CQlhZmZpbml0eTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaCBiL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaAppbmRleCA1ZjA2NTI3Li5mNzNkZTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKKysrIGIvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCkBAIC03LDkgKzcsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAotI2RlZmluZSBLU1lNX05BTUVfTEVOIDEyNwotI2RlZmluZSBLU1lNX1NZTUJPTF9MRU4gKHNpemVvZigiJXMrJSNseC8lI2x4IFslc10iKSArIEtTWU1fTkFNRV9MRU4gKwlcCi0JCQkgMiooQklUU19QRVJfTE9ORyozLzEwKSArIE1PRFVMRV9OQU1FX0xFTiArIDEpCisjZGVmaW5lIEtTWU1fTkFNRV9MRU4gMTI4CisjZGVmaW5lIEtTWU1fU1lNQk9MX0xFTiAoc2l6ZW9mKCIlcyslI2x4LyUjbHggWyVzXSIpICsgKEtTWU1fTkFNRV9MRU4gLSAxKSArIFwKKwkJCSAyKihCSVRTX1BFUl9MT05HKjMvMTApICsgKE1PRFVMRV9OQU1FX0xFTiAtIDEpICsgMSkKIAogI2lmZGVmIENPTkZJR19LQUxMU1lNUwogLyogTG9va3VwIHRoZSBhZGRyZXNzIGZvciBhIHN5bWJvbC4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IDdhNDg1MjUuLjFlYjljZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMjEwLDYgKzIxMCw3IEBACiAjZGVmaW5lIFRBSU5UX01BQ0hJTkVfQ0hFQ0sJCSgxPDw0KQogI2RlZmluZSBUQUlOVF9CQURfUEFHRQkJCSgxPDw1KQogI2RlZmluZSBUQUlOVF9VU0VSCQkJKDE8PDYpCisjZGVmaW5lIFRBSU5UX0RJRQkJCSgxPDw3KQogCiBleHRlcm4gdm9pZCBkdW1wX3N0YWNrKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaCBiL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCmluZGV4IGFlYTM0ZTc0Li44YzQzNTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaApAQCAtNjQsNyArNjQsNyBAQAogCXVuc2lnbmVkIGxvbmcgbnJlY3ZkYXRhcGt0OwogCXVuc2lnbmVkIGxvbmcgbnNlbnRjdGxwa3Q7CiAJdW5zaWduZWQgbG9uZyBuc2VudGRhdGFwa3Q7Ci0Jc3RydWN0IHNlbWFwaG9yZSByZWN2X3NlbTsKKwlzdHJ1Y3QgbXV0ZXggcmVjdl9tdHg7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCByZWN2X3F1ZXVlOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZWN2X3dvcms7CiAJaW50IHJlbGVhc2VfaW5fcHJvZ3Jlc3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xlZHMuaCBiL2luY2x1ZGUvbGludXgvbGVkcy5oCmluZGV4IDg4YWZjZWYuLjQ5NGJlZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGVkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGVkcy5oCkBAIC0xMyw3ICsxMyw2IEBACiAjZGVmaW5lIF9fTElOVVhfTEVEU19IX0lOQ0xVREVECiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogc3RydWN0IGRldmljZTsKIHN0cnVjdCBjbGFzc19kZXZpY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oIGIvaW5jbHVkZS9saW51eC9saW1pdHMuaAppbmRleCBlYWYyZTA5Li4yZDBmOTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGltaXRzLmgKQEAgLTUsOCArNSw2IEBACiAKICNkZWZpbmUgTkdST1VQU19NQVggICAgNjU1MzYJLyogc3VwcGxlbWVudGFsIGdyb3VwIElEcyBhcmUgYXZhaWxhYmxlICovCiAjZGVmaW5lIEFSR19NQVggICAgICAgMTMxMDcyCS8qICMgYnl0ZXMgb2YgYXJncyArIGVudmlyb24gZm9yIGV4ZWMoKSAqLwotI2RlZmluZSBDSElMRF9NQVggICAgICAgIDk5OSAgICAvKiBubyBsaW1pdCA6LSkgKi8KLSNkZWZpbmUgT1BFTl9NQVggICAgICAgICAyNTYJLyogIyBvcGVuIGZpbGVzIGEgcHJvY2VzcyBtYXkgaGF2ZSAqLwogI2RlZmluZSBMSU5LX01BWCAgICAgICAgIDEyNwkvKiAjIGxpbmtzIGEgZmlsZSBtYXkgaGF2ZSAqLwogI2RlZmluZSBNQVhfQ0FOT04gICAgICAgIDI1NQkvKiBzaXplIG9mIHRoZSBjYW5vbmljYWwgaW5wdXQgcXVldWUgKi8KICNkZWZpbmUgTUFYX0lOUFVUICAgICAgICAyNTUJLyogc2l6ZSBvZiB0aGUgdHlwZS1haGVhZCBidWZmZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGludXhfbG9nby5oIGIvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmgKaW5kZXggOWMwMWJkZS4uMDhhOTI5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmgKKysrIGIvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmgKQEAgLTMzLDUgKzMzLDEzIEBACiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmZiX2ZpbmRfbG9nbyhpbnQgZGVwdGgpOworI2lmZGVmIENPTkZJR19GQl9MT0dPX0VYVFJBCitleHRlcm4gdm9pZCBmYl9hcHBlbmRfZXh0cmFfbG9nbyhjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywKKwkJCQkgdW5zaWduZWQgaW50IG4pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9hcHBlbmRfZXh0cmFfbG9nbyhjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywKKwkJCQkJdW5zaWduZWQgaW50IG4pCit7fQorI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfTElOVVhfTE9HT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oCmluZGV4IDI0NmRlMWQuLjZmMTYzN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oCkBAIC0yNyw2ICsyNyw3IEBACiAJCQkJCQlzdHJ1Y3QgbmZzX2ZoICosCiAJCQkJCQlzdHJ1Y3QgZmlsZSAqKik7CiAJdm9pZAkJCSgqZmNsb3NlKShzdHJ1Y3QgZmlsZSAqKTsKKwl1bnNpZ25lZCBsb25nCQkoKmdldF9ncmFjZV9wZXJpb2QpKHZvaWQpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBubG1zdmNfYmluZGluZyAqCW5sbXN2Y19vcHM7CkBAIC0zOCw0ICszOSwxMiBAQAogZXh0ZXJuIGludAlsb2NrZF91cChpbnQgcHJvdG8pOwogZXh0ZXJuIHZvaWQJbG9ja2RfZG93bih2b2lkKTsKIAordW5zaWduZWQgbG9uZyBnZXRfbmZzX2dyYWNlX3BlcmlvZCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19ORlNEX1Y0Cit1bnNpZ25lZCBsb25nIGdldF9uZnM0X2dyYWNlX3BlcmlvZCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X25mczRfZ3JhY2VfcGVyaW9kKHZvaWQpIHtyZXR1cm4gMDt9CisjZW5kaWYKKwogI2VuZGlmIC8qIExJTlVYX0xPQ0tEX0JJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sem8uaCBiL2luY2x1ZGUvbGludXgvbHpvLmgKaW5kZXggNTgyZDhiNy4uZDc5MzQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sem8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2x6by5oCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIExaTzFYX01FTV9DT01QUkVTUwkoMTYzODQgKiBzaXplb2YodW5zaWduZWQgY2hhciAqKSkKICNkZWZpbmUgTFpPMVhfMV9NRU1fQ09NUFJFU1MJTFpPMVhfTUVNX0NPTVBSRVNTCiAKLSNkZWZpbmUgbHpvMXhfd29yc3RfY29tcHJlc3MoeCkgKHggKyAoeCAvIDY0KSArIDE2ICsgMykKKyNkZWZpbmUgbHpvMXhfd29yc3RfY29tcHJlc3MoeCkgKCh4KSArICgoeCkgLyAxNikgKyA2NCArIDMpCiAKIC8qIFRoaXMgcmVxdWlyZXMgJ3dvcmttZW0nIG9mIHNpemUgTFpPMVhfMV9NRU1fQ09NUFJFU1MgKi8KIGludCBsem8xeF8xX2NvbXByZXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAppbmRleCBkYWFiYjNhLi5lMTQ3Y2Y1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKQEAgLTE1OSw3ICsxNTksNyBAQAogCiBleHRlcm4gc3RydWN0IG1lbXBvbGljeSBkZWZhdWx0X3BvbGljeTsKIGV4dGVybiBzdHJ1Y3Qgem9uZWxpc3QgKmh1Z2Vfem9uZWxpc3Qoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCXVuc2lnbmVkIGxvbmcgYWRkcik7CisJCXVuc2lnbmVkIGxvbmcgYWRkciwgZ2ZwX3QgZ2ZwX2ZsYWdzKTsKIGV4dGVybiB1bnNpZ25lZCBzbGFiX25vZGUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KTsKIAogZXh0ZXJuIGVudW0gem9uZV90eXBlIHBvbGljeV96b25lOwpAQCAtMjU2LDkgKzI1Niw5IEBACiAjZGVmaW5lIHNldF9jcHVzZXRfYmVpbmdfcmVib3VuZCh4KSBkbyB7fSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZWxpc3QgKmh1Z2Vfem9uZWxpc3Qoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCXVuc2lnbmVkIGxvbmcgYWRkcikKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCBnZnBfdCBnZnBfZmxhZ3MpCiB7Ci0JcmV0dXJuIE5PREVfREFUQSgwKS0+bm9kZV96b25lbGlzdHMgKyBnZnBfem9uZShHRlBfSElHSFVTRVIpOworCXJldHVybiBOT0RFX0RBVEEoMCktPm5vZGVfem9uZWxpc3RzICsgZ2ZwX3pvbmUoZ2ZwX2ZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZG9fbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAxYzEyMDc0Li5hNWM0NTE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0yLDcgKzIsNiBAQAogI2RlZmluZSBfTElOVVhfTU1fSAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTI3LDcgKzI2LDYgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbnVtX3BoeXNwYWdlczsKIGV4dGVybiB2b2lkICogaGlnaF9tZW1vcnk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2Vhcmx5cmVzZXJ2ZTsKIGV4dGVybiBpbnQgcGFnZV9jbHVzdGVyOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApAQCAtNjAxLDYgKzU5OSw3IEBACiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCisJVk1fQlVHX09OKFBhZ2VTbGFiKHBhZ2UpKTsKIAlpZiAodW5saWtlbHkoUGFnZVN3YXBDYWNoZShwYWdlKSkpCiAJCW1hcHBpbmcgPSAmc3dhcHBlcl9zcGFjZTsKICNpZmRlZiBDT05GSUdfU0xVQgpAQCAtODEyLDI3ICs4MTEsMzEgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG5ld19hZGRyKTsKIAogLyoKLSAqIFByb3RvdHlwZSB0byBhZGQgYSBzaHJpbmtlciBjYWxsYmFjayBmb3IgYWdlYWJsZSBjYWNoZXMuCi0gKiAKLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIGEgY291bnQgYG5yX3RvX3NjYW4nIGFuZCBhIGdmcG1hc2suICBUaGV5IHNob3VsZAotICogc2NhbiBgbnJfdG9fc2Nhbicgb2JqZWN0cywgYXR0ZW1wdGluZyB0byBmcmVlIHRoZW0uCisgKiBBIGNhbGxiYWNrIHlvdSBjYW4gcmVnaXN0ZXIgdG8gYXBwbHkgcHJlc3N1cmUgdG8gYWdlYWJsZSBjYWNoZXMuCiAgKgotICogVGhlIGNhbGxiYWNrIG11c3QgcmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB3aGljaCByZW1haW4gaW4gdGhlIGNhY2hlLgorICogJ3NocmluaycgaXMgcGFzc2VkIGEgY291bnQgJ25yX3RvX3NjYW4nIGFuZCBhICdnZnBtYXNrJy4gIEl0IHNob3VsZAorICogbG9vayB0aHJvdWdoIHRoZSBsZWFzdC1yZWNlbnRseS11c2VkICducl90b19zY2FuJyBlbnRyaWVzIGFuZAorICogYXR0ZW1wdCB0byBmcmVlIHRoZW0gdXAuICBJdCBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cworICogd2hpY2ggcmVtYWluIGluIHRoZSBjYWNoZS4gIElmIGl0IHJldHVybnMgLTEsIGl0IG1lYW5zIGl0IGNhbm5vdCBkbworICogYW55IHNjYW5uaW5nIGF0IHRoaXMgdGltZSAoZWcuIHRoZXJlIGlzIGEgcmlzayBvZiBkZWFkbG9jaykuCiAgKgotICogVGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIG5yX3RvX3NjYW4gPT0gMCB3aGVuIHRoZSBWTSBpcyBxdWVyeWluZyB0aGUKLSAqIGNhY2hlIHNpemUsIHNvIGEgZmFzdHBhdGggZm9yIHRoYXQgY2FzZSBpcyBhcHByb3ByaWF0ZS4KKyAqIFRoZSAnZ2ZwbWFzaycgcmVmZXJzIHRvIHRoZSBhbGxvY2F0aW9uIHdlIGFyZSBjdXJyZW50bHkgdHJ5aW5nIHRvCisgKiBmdWxmaWwuCisgKgorICogTm90ZSB0aGF0ICdzaHJpbmsnIHdpbGwgYmUgcGFzc2VkIG5yX3RvX3NjYW4gPT0gMCB3aGVuIHRoZSBWTSBpcworICogcXVlcnlpbmcgdGhlIGNhY2hlIHNpemUsIHNvIGEgZmFzdHBhdGggZm9yIHRoYXQgY2FzZSBpcyBhcHByb3ByaWF0ZS4KICAqLwotdHlwZWRlZiBpbnQgKCpzaHJpbmtlcl90KShpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spOworc3RydWN0IHNocmlua2VyIHsKKwlpbnQgKCpzaHJpbmspKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzayk7CisJaW50IHNlZWtzOwkvKiBzZWVrcyB0byByZWNyZWF0ZSBhbiBvYmogKi8KIAotLyoKLSAqIEFkZCBhbiBhZ2luZyBjYWxsYmFjay4gIFRoZSBpbnQgaXMgdGhlIG51bWJlciBvZiAnc2Vla3MnIGl0IHRha2VzCi0gKiB0byByZWNyZWF0ZSBvbmUgb2YgdGhlIG9iamVjdHMgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYWdlLgotICovCi0KLSNkZWZpbmUgREVGQVVMVF9TRUVLUyAyCi1zdHJ1Y3Qgc2hyaW5rZXI7Ci1leHRlcm4gc3RydWN0IHNocmlua2VyICpzZXRfc2hyaW5rZXIoaW50LCBzaHJpbmtlcl90KTsKLWV4dGVybiB2b2lkIHJlbW92ZV9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyKTsKKwkvKiBUaGVzZSBhcmUgZm9yIGludGVybmFsIHVzZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlsb25nIG5yOwkvKiBvYmpzIHBlbmRpbmcgZGVsZXRlICovCit9OworI2RlZmluZSBERUZBVUxUX1NFRUtTIDIgLyogQSBnb29kIG51bWJlciBpZiB5b3UgZG9uJ3Qga25vdyBiZXR0ZXIuICovCitleHRlcm4gdm9pZCByZWdpc3Rlcl9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKik7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqKTsKIAogLyoKICAqIFNvbWUgc2hhcmVkIG1hcHBpZ25zIHdpbGwgd2FudCB0aGUgcGFnZXMgbWFya2VkIHJlYWQtb25seQpAQCAtMTA3Miw2ICsxMDc1LDEwIEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKIAl1bnNpZ25lZCBsb25nIGZsYWcsIHVuc2lnbmVkIGxvbmcgcGdvZmYpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW1hcF9yZWdpb24oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncywKKwl1bnNpZ25lZCBpbnQgdm1fZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJaW50IGFjY291bnRhYmxlKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggZDA5YjEzNC4uZGE4ZWI4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC0yNCw2ICsyNCwxNCBAQAogI2VuZGlmCiAjZGVmaW5lIE1BWF9PUkRFUl9OUl9QQUdFUyAoMSA8PCAoTUFYX09SREVSIC0gMSkpCiAKKy8qCisgKiBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUiBpcyB0aGUgb3JkZXIgYXQgd2hpY2ggYWxsb2NhdGlvbnMgYXJlIGRlZW1lZAorICogY29zdGx5IHRvIHNlcnZpY2UuICBUaGF0IGlzIGJldHdlZW4gYWxsb2NhdGlvbiBvcmRlcnMgd2hpY2ggc2hvdWxkCisgKiBjb2VsZXNjZSBuYXR1cmFsbHkgdW5kZXIgcmVhc29uYWJsZSByZWNsYWltIHByZXNzdXJlIGFuZCB0aG9zZSB3aGljaAorICogd2lsbCBub3QuCisgKi8KKyNkZWZpbmUgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgMworCiBzdHJ1Y3QgZnJlZV9hcmVhIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfbGlzdDsKIAl1bnNpZ25lZCBsb25nCQlucl9mcmVlOwpAQCAtMTQ2LDYgKzE1NCw3IEBACiAJICovCiAJWk9ORV9ISUdITUVNLAogI2VuZGlmCisJWk9ORV9NT1ZBQkxFLAogCU1BWF9OUl9aT05FUwogfTsKIApAQCAtMTY3LDYgKzE3Niw3IEBACiAJKyBkZWZpbmVkKENPTkZJR19aT05FX0RNQTMyKQlcCiAJKyAxCQkJCVwKIAkrIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pCVwKKwkrIDEJCQkJXAogKQogI2lmIF9fWk9ORV9DT1VOVCA8IDIKICNkZWZpbmUgWk9ORVNfU0hJRlQgMApAQCAtNDk5LDEwICs1MDksMjIgQEAKIAlyZXR1cm4gKCEhem9uZS0+cHJlc2VudF9wYWdlcyk7CiB9CiAKK2V4dGVybiBpbnQgbW92YWJsZV96b25lOworCitzdGF0aWMgaW5saW5lIGludCB6b25lX21vdmFibGVfaXNfaGlnaG1lbSh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQKQorCXJldHVybiBtb3ZhYmxlX3pvbmUgPT0gWk9ORV9ISUdITUVNOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW5saW5lIGludCBpc19oaWdobWVtX2lkeChlbnVtIHpvbmVfdHlwZSBpZHgpCiB7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlyZXR1cm4gKGlkeCA9PSBaT05FX0hJR0hNRU0pOworCXJldHVybiAoaWR4ID09IFpPTkVfSElHSE1FTSB8fAorCQkoaWR4ID09IFpPTkVfTU9WQUJMRSAmJiB6b25lX21vdmFibGVfaXNfaGlnaG1lbSgpKSk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC01MjIsNyArNTQ0LDkgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2hpZ2htZW0oc3RydWN0IHpvbmUgKnpvbmUpCiB7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlyZXR1cm4gem9uZSA9PSB6b25lLT56b25lX3BnZGF0LT5ub2RlX3pvbmVzICsgWk9ORV9ISUdITUVNOworCWludCB6b25lX2lkeCA9IHpvbmUgLSB6b25lLT56b25lX3BnZGF0LT5ub2RlX3pvbmVzOworCXJldHVybiB6b25lX2lkeCA9PSBaT05FX0hJR0hNRU0gfHwKKwkJKHpvbmVfaWR4ID09IFpPTkVfTU9WQUJMRSAmJiB6b25lX21vdmFibGVfaXNfaGlnaG1lbSgpKTsKICNlbHNlCiAJcmV0dXJuIDA7CiAjZW5kaWYKQEAgLTU2Niw2ICs1OTAsMTEgQEAKIGludCBzeXNjdGxfbWluX3NsYWJfcmF0aW9fc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCiAJCQlzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogCitleHRlcm4gaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKKwkJCXN0cnVjdCBmaWxlICosIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitleHRlcm4gY2hhciBudW1hX3pvbmVsaXN0X29yZGVyW107CisjZGVmaW5lIE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOIDE2CS8qIHN0cmluZyBidWZmZXIgc2l6ZSAqLworCiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY3VycmVudCBOb2RlLiAqLwogI2lmbmRlZiBudW1hX25vZGVfaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKaW5kZXggMWZhNGQ5OC4uOGVlZDQ0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKQEAgLTE0LDcgKzE0LDcgQEAKIAlpbnQgZXZlbnQ7CiB9OwogCi1leHRlcm4gc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKGludCwgc3RydWN0IG1udF9uYW1lc3BhY2UgKiwKK2V4dGVybiBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqY29weV9tbnRfbnModW5zaWduZWQgbG9uZywgc3RydWN0IG1udF9uYW1lc3BhY2UgKiwKIAkJc3RydWN0IGZzX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIF9fcHV0X21udF9ucyhzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCBlNmUwZjg2Li5iNmE2NDZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTYsNyArNiw2IEBACiAgKiBSZXdyaXR0ZW4gYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4gRGVjIDE5OTYKICAqIFJld3JpdHRlbiBhZ2FpbiBieSBSdXN0eSBSdXNzZWxsLCAyMDAyCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaCBiL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaAppbmRleCAwZTA5YzAwLi5mOTUwOTIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCkBAIC0xNDYsNyArMTQ2LDcgQEAKIH07CiAKIHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgewotCV9fdTgJbmFtZVs4XSxleHRbM107CS8qIG5hbWUgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJbmFtZVtNU0RPU19OQU1FXTsvKiBuYW1lIGFuZCBleHRlbnNpb24gKi8KIAlfX3U4CWF0dHI7CQkvKiBhdHRyaWJ1dGUgYml0cyAqLwogCV9fdTggICAgbGNhc2U7CQkvKiBDYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KIAlfX3U4CWN0aW1lX2NzOwkvKiBDcmVhdGlvbiB0aW1lLCBjZW50aXNlY29uZHMgKDAtMTk5KSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaCBiL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKaW5kZXggODNlMzllYi4uODg3NjZlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCkBAIC0xNDgsOCArMTQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uY3BfZnNfaS5oPgogI2luY2x1ZGUgPGxpbnV4L25jcF9mc19zYi5oPgogCi0vKiB1bmRlZiBiZWNhdXNlIHB1YmxpYyBkZWZpbmUgaW4gdW1zZG9zX2ZzLmggKG5jcF9mcy5oIGlzbid0IHB1YmxpYykgKi8KLSN1bmRlZiBQUklOVEsKIC8qIGRlZmluZSBiZWNhdXNlIGl0IGlzIGVhc3kgdG8gY2hhbmdlIFBSSU5USyB0byB7Kn1QUklOVEsgKi8KICNkZWZpbmUgUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggMzIyYjVlYS4uZGE3YTEzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0yNjIsOCArMjYyLDYgQEAKIAlfX0xJTktfU1RBVEVfTElOS1dBVENIX1BFTkRJTkcsCiAJX19MSU5LX1NUQVRFX0RPUk1BTlQsCiAJX19MSU5LX1NUQVRFX1FESVNDX1JVTk5JTkcsCi0JLyogU2V0IGJ5IHRoZSBuZXRwb2xsIE5BUEkgY29kZSAqLwotCV9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLAogfTsKIAogCkBAIC0xMDIyLDE0ICsxMDIwLDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jaWZkZWYgQ09ORklHX05FVFBPTEwKLQkvKiBQcmV2ZW50IHJhY2Ugd2l0aCBuZXRwb2xsIC0geWVzLCB0aGlzIGlzIGEga2x1ZGdlLgotCSAqIEJ1dCBhdCBsZWFzdCBpdCBkb2Vzbid0IHBlbmFsaXplIHRoZSBub24tbmV0cG9sbAotCSAqIGNvZGUgcGF0aC4gKi8KLQlpZiAodGVzdF9iaXQoX19MSU5LX1NUQVRFX1BPTExfTElTVF9GUk9aRU4sICZkZXYtPnN0YXRlKSkKLQkJcmV0dXJuOwotI2VuZGlmCi0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaAppbmRleCA5ZjYyZDYxLi43OGZlYjdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCkBAIC00Miw2ICs0Miw5IEBACiAjZGVmaW5lCU5GU0VYUF9OT0FDTAkJMHg4MDAwCS8qIHJlc2VydmVkIGZvciBwb3NzaWJsZSBBQ0wgcmVsYXRlZCB1c2UgKi8KICNkZWZpbmUgTkZTRVhQX0FMTEZMQUdTCQkweEZFM0YKIAorLyogVGhlIGZsYWdzIHRoYXQgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHNlY3VyaXR5IGZsYXZvcjogKi8KKyNkZWZpbmUgTkZTRVhQX1NFQ0lORk9fRkxBR1MJKE5GU0VYUF9SRUFET05MWSB8IE5GU0VYUF9ST09UU1FVQVNIIFwKKwkJCQkJfCBORlNFWFBfQUxMU1FVQVNIKQogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC02NCw2ICs2NywxOSBAQAogCWludCBtaWdyYXRlZDsKIH07CiAKKy8qCisgKiBXZSBrZWVwIGFuIGFycmF5IG9mIHBzZXVkb2ZsYXZvcnMgd2l0aCB0aGUgZXhwb3J0LCBpbiBvcmRlciBmcm9tIG1vc3QKKyAqIHRvIGxlYXN0IHByZWZlcnJlZC4gIEZvciB0aGUgZm9yc2VlYWJsZSBmdXR1cmUsIHdlIGRvbid0IGV4cGVjdCBtb3JlCisgKiB0aGFuIHRoZSBlaWdodCBwc2V1ZG9mbGF2b3JzIG51bGwsIHVuaXgsIGtyYjUsIGtyYjVpLCBrcmI1cCwgc2twbTMsCisgKiBzcGttM2ksIGFuZCBzcGttM3AgKGFuZCB1c2luZyBhbGwgOCBhdCBvbmNlIHNob3VsZCBiZSByYXJlKS4KKyAqLworI2RlZmluZSBNQVhfU0VDSU5GT19MSVNUCTgKKworc3RydWN0IGV4cF9mbGF2b3JfaW5mbyB7CisJdTMyCXBzZXVkb2ZsYXZvcjsKKwl1MzIJZmxhZ3M7Cit9OworCiBzdHJ1Y3Qgc3ZjX2V4cG9ydCB7CiAJc3RydWN0IGNhY2hlX2hlYWQJaDsKIAlzdHJ1Y3QgYXV0aF9kb21haW4gKglleF9jbGllbnQ7CkBAIC03Niw2ICs5Miw4IEBACiAJaW50CQkJZXhfZnNpZDsKIAl1bnNpZ25lZCBjaGFyICoJCWV4X3V1aWQ7IC8qIDE2IGJ5dGUgZnNpZCAqLwogCXN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgZXhfZnNsb2NzOworCWludAkJCWV4X25mbGF2b3JzOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8JZXhfZmxhdm9yc1tNQVhfU0VDSU5GT19MSVNUXTsKIH07CiAKIC8qIGFuICJleHBvcnQga2V5IiAoZXhwa2V5KSBtYXBzIGEgZmlsZWhhbmRsZWZyYWdlbWVudCB0byBhbgpAQCAtOTUsMTAgKzExMywyMiBAQAogCiAjZGVmaW5lIEVYX1NFQ1VSRShleHApCQkoISgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfSU5TRUNVUkVfUE9SVCkpCiAjZGVmaW5lIEVYX0lTU1lOQyhleHApCQkoISgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfQVNZTkMpKQotI2RlZmluZSBFWF9SRE9OTFkoZXhwKQkJKChleHApLT5leF9mbGFncyAmIE5GU0VYUF9SRUFET05MWSkKICNkZWZpbmUgRVhfTk9ISURFKGV4cCkJCSgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9ISURFKQogI2RlZmluZSBFWF9XR0FUSEVSKGV4cCkJCSgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfR0FUSEVSRURfV1JJVEVTKQogCitzdGF0aWMgaW5saW5lIGludCBFWF9SRE9OTFkoc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmVuZCA9IGV4cC0+ZXhfZmxhdm9ycyArIGV4cC0+ZXhfbmZsYXZvcnM7CisKKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBlbmQ7IGYrKykgeworCQlpZiAoZi0+cHNldWRvZmxhdm9yID09IHJxc3RwLT5ycV9mbGF2b3IpCisJCQlyZXR1cm4gZi0+ZmxhZ3MgJiBORlNFWFBfUkVBRE9OTFk7CisJfQorCXJldHVybiBleHAtPmV4X2ZsYWdzICYgTkZTRVhQX1JFQURPTkxZOworfQorCitfX2JlMzIgY2hlY2tfbmZzZF9hY2Nlc3Moc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCk7CiAKIC8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKQEAgLTExMiwxMyArMTQyLDE5IEBACiAJCQkJCXN0cnVjdCB2ZnNtb3VudCAqbW50LAogCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCXN0cnVjdCBjYWNoZV9yZXEgKnJlcXApOworc3RydWN0IHN2Y19leHBvcnQgKglycXN0X2V4cF9nZXRfYnlfbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKKwkJCQkJICAgICBzdHJ1Y3QgdmZzbW91bnQgKiwKKwkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICopOwogc3RydWN0IHN2Y19leHBvcnQgKglleHBfcGFyZW50KHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLAogCQkJCSAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAogCQkJCSAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgICBzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKTsKK3N0cnVjdCBzdmNfZXhwb3J0ICoJcnFzdF9leHBfcGFyZW50KHN0cnVjdCBzdmNfcnFzdCAqLAorCQkJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGludAkJCWV4cF9yb290Zmgoc3RydWN0IGF1dGhfZG9tYWluICosIAogCQkJCQljaGFyICpwYXRoLCBzdHJ1Y3Qga25mc2RfZmggKiwgaW50IG1heHNpemUpOwotX19iZTMyCQkJZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IGF1dGhfZG9tYWluICosIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGNhY2hlX3JlcSAqY3JlcSk7CitfX2JlMzIJCQlleHBfcHNldWRvcm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqKTsKIF9fYmUzMgkJCW5mc2Vycm5vKGludCBlcnJubyk7CiAKIGV4dGVybiBzdHJ1Y3QgY2FjaGVfZGV0YWlsIHN2Y19leHBvcnRfY2FjaGU7CkBAIC0xMzUsNiArMTcxLDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCiBleHBfZmluZChzdHJ1Y3QgYXV0aF9kb21haW4gKmNscCwgaW50IGZzaWRfdHlwZSwgdTMyICpmc2lkdiwKIAkgc3RydWN0IGNhY2hlX3JlcSAqcmVxcCk7CitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqIHJxc3RfZXhwX2ZpbmQoc3RydWN0IHN2Y19ycXN0ICosIGludCwgdTMyICopOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvaW50ZXJmYWNlLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDk3OTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvbGludXgvbmZzZC9pbnRlcmZhY2UuaAotICoKLSAqIGRlZmluZXMgaW50ZXJmYWNlIGJldHdlZW4gbmZzZCBhbmQgb3RoZXIgYml0cyBvZgotICogdGhlIGtlcm5lbC4gIFBhcnRpY3VsYXJseSBmaWxlc3lzdGVtcyAoZXZlbnR1YWxseSkuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KLSAqLwotCi0jaWZuZGVmIExJTlVYX05GU0RfSU5URVJGQUNFX0gKLSNkZWZpbmUgTElOVVhfTkZTRF9JTlRFUkZBQ0VfSAotCi0jZW5kaWYgLyogTElOVVhfTkZTRF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKaW5kZXggNzJmZWFjNS4uZTQ1MjI1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL2F1dGguaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9pbnRlcmZhY2UuaD4KIC8qCiAgKiBuZnNkIHZlcnNpb24KICAqLwpAQCAtNzIsNiArNzEsOSBAQAogCQkgICAgICAgICAgICAgICAgc3RydWN0IHN2Y19leHBvcnQgKipleHBwKTsKIF9fYmUzMgkJbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQljb25zdCBjaGFyICosIGludCwgc3RydWN0IHN2Y19maCAqKTsKK19fYmUzMgkJIG5mc2RfbG9va3VwX2RlbnRyeShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorCQkJCWNvbnN0IGNoYXIgKiwgaW50LAorCQkJCXN0cnVjdCBzdmNfZXhwb3J0ICoqLCBzdHJ1Y3QgZGVudHJ5ICoqKTsKIF9fYmUzMgkJbmZzZF9zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJc3RydWN0IGlhdHRyICosIGludCwgdGltZV90KTsKICNpZmRlZiBDT05GSUdfTkZTRF9WNApAQCAtMTIwLDcgKzEyMiw4IEBACiAJCQkJc3RydWN0IGtzdGF0ZnMgKik7CiAKIGludAkJbmZzZF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7Ci1fX2JlMzIJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitfX2JlMzIJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19leHBvcnQgKiwKKwkJCQlzdHJ1Y3QgZGVudHJ5ICosIGludCk7CiBpbnQJCW5mc2Rfc3luY19kaXIoc3RydWN0IGRlbnRyeSAqZHApOwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTRF9WMl9BQ0wpIHx8IGRlZmluZWQoQ09ORklHX05GU0RfVjNfQUNMKQpAQCAtMTQ5LDYgKzE1Miw3IEBACiAgKiBORlN2NCBTdGF0ZQogICovCiAjaWZkZWYgQ09ORklHX05GU0RfVjQKK2V4dGVybiB1bnNpZ25lZCBpbnQgbWF4X2RlbGVnYXRpb25zOwogdm9pZCBuZnM0X3N0YXRlX2luaXQodm9pZCk7CiBpbnQgbmZzNF9zdGF0ZV9zdGFydCh2b2lkKTsKIHZvaWQgbmZzNF9zdGF0ZV9zaHV0ZG93bih2b2lkKTsKQEAgLTIzNiw2ICsyNDAsNyBAQAogI2RlZmluZQluZnNlcnJfYmFkbmFtZQkJX19jb25zdGFudF9odG9ubChORlNFUlJfQkFETkFNRSkKICNkZWZpbmUJbmZzZXJyX2NiX3BhdGhfZG93bglfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9DQl9QQVRIX0RPV04pCiAjZGVmaW5lCW5mc2Vycl9sb2NrZWQJCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0xPQ0tFRCkKKyNkZWZpbmUJbmZzZXJyX3dyb25nc2VjCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9XUk9OR1NFQykKICNkZWZpbmUJbmZzZXJyX3JlcGxheV9tZQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9SRVBMQVlfTUUpCiAKIC8qIGVycm9yIGNvZGVzIGZvciBpbnRlcm5hbCB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKaW5kZXggYWI1YzIzNi4uZGIzNDhmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKQEAgLTY3LDcgKzY3LDcgQEAKIAlpbnQJCQljYnJfdHJ1bmM7CiAJc3RhdGVpZF90CQljYnJfc3RhdGVpZDsKIAl1MzIJCQljYnJfZmhsZW47Ci0JdTMyCQkJY2JyX2ZodmFsW05GUzRfRkhTSVpFXTsKKwljaGFyCQkJY2JyX2ZodmFsW05GUzRfRkhTSVpFXTsKIAlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uCSpjYnJfZHA7CiB9OwogCkBAIC0yMjQsNiArMjI0LDcgQEAKIAlzdHJ1Y3QgaW5vZGUJCSpmaV9pbm9kZTsKIAl1MzIgICAgICAgICAgICAgICAgICAgICBmaV9pZDsgICAgICAvKiB1c2VkIHdpdGggc3RhdGVvd25lci0+c29faWQgCiAJCQkJCSAgICAgKiBmb3Igc3RhdGVpZF9oYXNodGJsIGhhc2ggKi8KKwlib29sCQkJZmlfaGFkX2NvbmZsaWN0OwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmggYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCmluZGV4IDA5Nzk5YmMuLjFiNjUzMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaApAQCAtMjkzLDYgKzI5MywxMiBAQAogCXN0cnVjdCBuZnNkNF9jaGFuZ2VfaW5mbyAgcm5fdGluZm87IC8qIHJlc3BvbnNlICovCiB9OwogCitzdHJ1Y3QgbmZzZDRfc2VjaW5mbyB7CisJdTMyIHNpX25hbWVsZW47CQkJCQkvKiByZXF1ZXN0ICovCisJY2hhciAqc2lfbmFtZTsJCQkJCS8qIHJlcXVlc3QgKi8KKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqc2lfZXhwOwkJCS8qIHJlc3BvbnNlICovCit9OworCiBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciB7CiAJc3RhdGVpZF90CXNhX3N0YXRlaWQ7ICAgICAgICAgLyogcmVxdWVzdCAqLwogCXUzMgkJc2FfYm12YWxbMl07ICAgICAgICAvKiByZXF1ZXN0ICovCkBAIC0zNjUsNiArMzcxLDcgQEAKIAkJc3RydWN0IG5mc2Q0X3JlbW92ZQkJcmVtb3ZlOwogCQlzdHJ1Y3QgbmZzZDRfcmVuYW1lCQlyZW5hbWU7CiAJCWNsaWVudGlkX3QJCQlyZW5ldzsKKwkJc3RydWN0IG5mc2Q0X3NlY2luZm8JCXNlY2luZm87CiAJCXN0cnVjdCBuZnNkNF9zZXRhdHRyCQlzZXRhdHRyOwogCQlzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQJc2V0Y2xpZW50aWQ7CiAJCXN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtIHNldGNsaWVudGlkX2NvbmZpcm07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25zcHJveHkuaCBiL2luY2x1ZGUvbGludXgvbnNwcm94eS5oCmluZGV4IDE4OWUwZGMuLmNlMDYxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbnNwcm94eS5oCisrKyBiL2luY2x1ZGUvbGludXgvbnNwcm94eS5oCkBAIC0yOCwxMCArMjgsMTEgQEAKIAlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqaXBjX25zOwogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICptbnRfbnM7CiAJc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9uczsKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7CiB9OwogZXh0ZXJuIHN0cnVjdCBuc3Byb3h5IGluaXRfbnNwcm94eTsKIAotaW50IGNvcHlfbmFtZXNwYWNlcyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKK2ludCBjb3B5X25hbWVzcGFjZXModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogdm9pZCBnZXRfdGFza19uYW1lc3BhY2VzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIHZvaWQgZnJlZV9uc3Byb3h5KHN0cnVjdCBuc3Byb3h5ICpucyk7CiBpbnQgdW5zaGFyZV9uc3Byb3h5X25hbWVzcGFjZXModW5zaWduZWQgbG9uZywgc3RydWN0IG5zcHJveHkgKiosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCAzN2E3MTU4Li41ZTg0ZjJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTQzMiw2ICs0MzIsOCBAQAogICogY29kZSwgb3IgcGNpIGNvcmUgY29kZS4gKi8KIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHBjaV9yb290X2J1c2VzOwkvKiBsaXN0IG9mIGFsbCBrbm93biBQQ0kgYnVzZXMgKi8KIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHBjaV9kZXZpY2VzOwkvKiBsaXN0IG9mIGFsbCBkZXZpY2VzICovCisvKiBTb21lIGRldmljZSBkcml2ZXJzIG5lZWQga25vdyBpZiBwY2kgaXMgaW5pdGlhdGVkICovCitleHRlcm4gaW50IG5vX3BjaV9kZXZpY2VzKHZvaWQpOwogCiB2b2lkIHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICopOwogaW50IF9fbXVzdF9jaGVjayBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOwpAQCAtNzI0LDYgKzcyNiw3IEBACiB7IHJldHVybiBOVUxMOyB9CiAKICNkZWZpbmUgcGNpX2Rldl9wcmVzZW50KGlkcykJKDApCisjZGVmaW5lIG5vX3BjaV9kZXZpY2VzKCkJKDEpCiAjZGVmaW5lIHBjaV9maW5kX3ByZXNlbnQoaWRzKQkoTlVMTCkKICNkZWZpbmUgcGNpX2Rldl9wdXQoZGV2KQlkbyB7IH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1LmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCmluZGV4IGI3MmJlMmYuLjkyNmFkYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19MSU5VWF9QRVJDUFVfSAogI2RlZmluZSBfX0xJTlVYX1BFUkNQVV9ICiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPiAvKiBGb3IgcHJlZW1wdF9kaXNhYmxlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPiAvKiBGb3Iga21hbGxvYygpICovCiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIEZvciBtZW1zZXQoKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCmluZGV4IGY1YWE1OTMuLjNkOWY3MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTE3LDYgKzE4LDkgQEAKIHN0cnVjdCBwZXJjcHVfY291bnRlciB7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXM2NCBjb3VudDsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIEFsbCBwZXJjcHVfY291bnRlcnMgYXJlIG9uIGEgbGlzdCAqLworI2VuZGlmCiAJczMyICpjb3VudGVyczsKIH07CiAKQEAgLTI2LDE4ICszMCw4IEBACiAjZGVmaW5lIEZCQ19CQVRDSAkoTlJfQ1BVUyo0KQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQotewotCXNwaW5fbG9ja19pbml0KCZmYmMtPmxvY2spOwotCWZiYy0+Y291bnQgPSBhbW91bnQ7Ci0JZmJjLT5jb3VudGVycyA9IGFsbG9jX3BlcmNwdShzMzIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKLXsKLQlmcmVlX3BlcmNwdShmYmMtPmNvdW50ZXJzKTsKLX0KLQordm9pZCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KTsKK3ZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyk7CiB2b2lkIHBlcmNwdV9jb3VudGVyX21vZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczMyIGFtb3VudCk7CiBzNjQgcGVyY3B1X2NvdW50ZXJfc3VtKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaAppbmRleCAxNjljNmMyLi5iOWExN2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaApAQCAtMjksNyArMjksNyBAQAogCWtyZWZfZ2V0KCZucy0+a3JlZik7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnMoaW50IGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOworZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOwogZXh0ZXJuIHZvaWQgZnJlZV9waWRfbnMoc3RydWN0IGtyZWYgKmtyZWYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BpZF9ucyhzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ByY3RsLmggYi9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKaW5kZXggNTJhOWJlNC4uZTJlZmY5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcmN0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJjdGwuaApAQCAtNTksNCArNTksOCBAQAogIyBkZWZpbmUgUFJfRU5ESUFOX0xJVFRMRQkxCS8qIFRydWUgbGl0dGxlIGVuZGlhbiBtb2RlICovCiAjIGRlZmluZSBQUl9FTkRJQU5fUFBDX0xJVFRMRQkyCS8qICJQb3dlclBDIiBwc2V1ZG8gbGl0dGxlIGVuZGlhbiAqLwogCisvKiBHZXQvc2V0IHByb2Nlc3Mgc2VjY29tcCBtb2RlICovCisjZGVmaW5lIFBSX0dFVF9TRUNDT01QCTIxCisjZGVmaW5lIFBSX1NFVF9TRUNDT01QCTIyCisKICNlbmRpZiAvKiBfTElOVVhfUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oIGIvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oCmluZGV4IGZjODZmMjcuLjFhZGZlNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaAorKysgYi9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAkKIAlwcmVmZXRjaCh4KSAgCS0gcHJlZmV0Y2hlcyB0aGUgY2FjaGVsaW5lIGF0ICJ4IiBmb3IgcmVhZAogCXByZWZldGNodyh4KQktIHByZWZldGNoZXMgdGhlIGNhY2hlbGluZSBhdCAieCIgZm9yIHdyaXRlCi0Jc3Bpbl9sb2NrX3ByZWZldGNoKHgpIC0gcHJlZmVjdGNoZXMgdGhlIHNwaW5sb2NrICp4IGZvciB0YWtpbmcKKwlzcGluX2xvY2tfcHJlZmV0Y2goeCkgLSBwcmVmZXRjaGVzIHRoZSBzcGlubG9jayAqeCBmb3IgdGFraW5nCiAJCiAJdGhlcmUgaXMgYWxzbyBQUkVGRVRDSF9TVFJJREUgd2hpY2ggaXMgdGhlIGFyY2hpdGVjdXJlLXByZWZlcmVkIAogCSJsb29rYWhlYWQiIHNpemUgZm9yIHByZWZldGNoaW5nIHN0cmVhbWVkIG9wZXJhdGlvbnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaCBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCmluZGV4IDM0NjlmOTYuLjI4ZTM2NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCkBAIC03LDYgKzcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCitzdHJ1Y3QgY29tcGxldGlvbjsKKwogLyoKICAqIFRoZSBwcm9jIGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKICAqLwpAQCAtNTYsNiArNTgsMTQgQEAKIAlnaWRfdCBnaWQ7CiAJbG9mZl90IHNpemU7CiAJY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgKnByb2NfaW9wczsKKwkvKgorCSAqIE5VTEwgLT5wcm9jX2ZvcHMgbWVhbnMgIlBERSBpcyBnb2luZyBhd2F5IFJTTiIgb3IKKwkgKiAiUERFIGlzIGp1c3QgY3JlYXRlZCIuIEluIGVpdGhlciBjYXNlLCBlLmcuIC0+cmVhZF9wcm9jIHdvbid0IGJlCisJICogY2FsbGVkIGJlY2F1c2UgaXQncyB0b28gbGF0ZSBvciB0b28gZWFybHksIHJlc3BlY3RpdmVseS4KKwkgKgorCSAqIElmIHlvdSdyZSBhbGxvY2F0aW5nIC0+cHJvY19mb3BzIGR5bmFtaWNhbGx5LCBzYXZlIGEgcG9pbnRlcgorCSAqIHNvbWV3aGVyZS4KKwkgKi8KIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpwcm9jX2ZvcHM7CiAJZ2V0X2luZm9fdCAqZ2V0X2luZm87CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CkBAIC02Niw2ICs3Niw5IEBACiAJYXRvbWljX3QgY291bnQ7CQkvKiB1c2UgY291bnQgKi8KIAlpbnQgZGVsZXRlZDsJCS8qIGRlbGV0ZSBmbGFnICovCiAJdm9pZCAqc2V0OworCWludCBwZGVfdXNlcnM7CS8qIG51bWJlciBvZiBjYWxsZXJzIGludG8gbW9kdWxlIGluIHByb2dyZXNzICovCisJc3BpbmxvY2tfdCBwZGVfdW5sb2FkX2xvY2s7IC8qIHByb2NfZm9wcyBjaGVja3MgYW5kIHBkZV91c2VycyBidW1wcyAqLworCXN0cnVjdCBjb21wbGV0aW9uICpwZGVfdW5sb2FkX2NvbXBsZXRpb247CiB9OwogCiBzdHJ1Y3Qga2NvcmVfbGlzdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaAppbmRleCBlZWIxOTc2Li5hZTgxNDZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKQEAgLTExMCw2ICsxMTAsOCBAQAogCQlfX3B0cmFjZV91bmxpbmsoY2hpbGQpOwogfQogCitpbnQgZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGxvbmcgYWRkciwgbG9uZyBkYXRhKTsKK2ludCBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBhZGRyLCBsb25nIGRhdGEpOwogCiAjaWZuZGVmIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4KIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKaW5kZXggZGQ1YTA1ZC4uNzVlMTdhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaApAQCAtMjYyLDcgKzI2Miw3IEBACiAKIGNoYXIgKmZpbGVfcGF0aChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBpbnQgY291bnQpOwogdm9pZCBiaXRtYXBfcHJpbnRfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKLWludCBiaXRtYXBfdXBkYXRlX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Cit2b2lkIGJpdG1hcF91cGRhdGVfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIAogaW50ICBiaXRtYXBfc2V0YWxsYml0cyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogdm9pZCBiaXRtYXBfd3JpdGVfYWxsKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CkBAIC0yNzgsOCArMjc4LDggQEAKIHZvaWQgYml0bWFwX2VuZF9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgKmJsb2NrcywgaW50IGFib3J0ZWQpOwogdm9pZCBiaXRtYXBfY2xvc2Vfc3luYyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogCi1pbnQgYml0bWFwX3VucGx1ZyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwotaW50IGJpdG1hcF9kYWVtb25fd29yayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwordm9pZCBiaXRtYXBfdW5wbHVnKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Cit2b2lkIGJpdG1hcF9kYWVtb25fd29yayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaCBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKaW5kZXggZGU3MmM0OS4uMjhhYzYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCkBAIC01MSw3ICs1MSw3IEBACiAKIAlzZWN0b3JfdCBzaXplOwkJCS8qIERldmljZSBzaXplIChpbiBibG9ja3MpICovCiAJbWRkZXZfdCAqbWRkZXY7CQkJLyogUkFJRCBhcnJheSBpZiBydW5uaW5nICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X2V2ZW50czsJLyogSU8gZXZlbnQgdGltZXN0YW1wICovCisJbG9uZyBsYXN0X2V2ZW50czsJCS8qIElPIGV2ZW50IHRpbWVzdGFtcCAqLwogCiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsJLyogYmxvY2sgZGV2aWNlIGhhbmRsZSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0Yy9tNDh0NTkuaCBiL2luY2x1ZGUvbGludXgvcnRjL200OHQ1OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YzdjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy9tNDh0NTkuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIHBsYXRmb3JtIGRhdGEgb2YgbTQ4dDU5IFJUQyBjaGlwIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuCisgKgorICogTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1JUQ19NNDhUNTlfSF8KKyNkZWZpbmUgX0xJTlVYX1JUQ19NNDhUNTlfSF8KKworLyoKKyAqIE00OFQ1OSBSZWdpc3RlciBPZmZzZXQKKyAqLworI2RlZmluZSBNNDhUNTlfWUVBUgkJMHgxZmZmCisjZGVmaW5lIE00OFQ1OV9NT05USAkJMHgxZmZlCisjZGVmaW5lIE00OFQ1OV9NREFZCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCisjZGVmaW5lIE00OFQ1OV9XREFZCQkweDFmZmMJLyogRGF5IG9mIFdlZWsgKi8KKyNkZWZpbmUgTTQ4VDU5X1dEQVlfQ0IJCQkweDIwCS8qIENlbnR1cnkgQml0ICovCisjZGVmaW5lIE00OFQ1OV9XREFZX0NFQgkJCTB4MTAJLyogQ2VudHVyeSBFbmFibGUgQml0ICovCisjZGVmaW5lIE00OFQ1OV9IT1VSCQkweDFmZmIKKyNkZWZpbmUgTTQ4VDU5X01JTgkJMHgxZmZhCisjZGVmaW5lIE00OFQ1OV9TRUMJCTB4MWZmOQorI2RlZmluZSBNNDhUNTlfQ05UTAkJMHgxZmY4CisjZGVmaW5lIE00OFQ1OV9DTlRMX1JFQUQJCTB4NDAKKyNkZWZpbmUgTTQ4VDU5X0NOVExfV1JJVEUJCTB4ODAKKyNkZWZpbmUgTTQ4VDU5X1dBVENIRE9HCQkweDFmZjcKKyNkZWZpbmUgTTQ4VDU5X0lOVFIJCTB4MWZmNgorI2RlZmluZSBNNDhUNTlfSU5UUl9BRkUJCQkweDgwCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTTQ4VDU5X0lOVFJfQUJFCQkJMHgyMAorI2RlZmluZSBNNDhUNTlfQUxBUk1fREFURQkweDFmZjUKKyNkZWZpbmUgTTQ4VDU5X0FMQVJNX0hPVVIJMHgxZmY0CisjZGVmaW5lIE00OFQ1OV9BTEFSTV9NSU4JMHgxZmYzCisjZGVmaW5lIE00OFQ1OV9BTEFSTV9TRUMJMHgxZmYyCisjZGVmaW5lIE00OFQ1OV9VTlVTRUQJCTB4MWZmMQorI2RlZmluZSBNNDhUNTlfRkxBR1MJCTB4MWZmMAorI2RlZmluZSBNNDhUNTlfRkxBR1NfV0RUCQkweDgwCS8qIHdhdGNoZG9nIHRpbWVyIGV4cGlyZWQgKi8KKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTX0FGCQkJMHg0MAkvKiBhbGFybSAqLworI2RlZmluZSBNNDhUNTlfRkxBR1NfQkYJCQkweDEwCS8qIGxvdyBiYXR0ZXJ5ICovCisKKyNkZWZpbmUgTTQ4VDU5X05WUkFNX1NJWkUJMHgxZmYwCisKK3N0cnVjdCBtNDh0NTlfcGxhdF9kYXRhIHsKKwkvKiBUaGUgbWV0aG9kIHRvIGFjY2VzcyBNNDhUNTkgcmVnaXN0ZXJzLAorCSAqIE5PVEU6IFRoZSAnb2ZzJyBzaG91bGQgYmUgMHgwMH4weDFmZmYKKwkgKi8KKwl2b2lkICgqd3JpdGVfYnl0ZSkoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzLCB1OCB2YWwpOworCXVuc2lnbmVkIGNoYXIgKCpyZWFkX2J5dGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIG9mcyk7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1JUQ19NNDhUNTlfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCBjZmI2ODA1Li43MzFlZGFjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMjYsNiArMjYsNyBAQAogI2RlZmluZSBDTE9ORV9TVE9QUEVECQkweDAyMDAwMDAwCS8qIFN0YXJ0IGluIHN0b3BwZWQgc3RhdGUgKi8KICNkZWZpbmUgQ0xPTkVfTkVXVVRTCQkweDA0MDAwMDAwCS8qIE5ldyB1dHNuYW1lIGdyb3VwPyAqLwogI2RlZmluZSBDTE9ORV9ORVdJUEMJCTB4MDgwMDAwMDAJLyogTmV3IGlwY3MgKi8KKyNkZWZpbmUgQ0xPTkVfTkVXVVNFUgkJMHgxMDAwMDAwMAkvKiBOZXcgdXNlciBuYW1lc3BhY2UgKi8KIAogLyoKICAqIFNjaGVkdWxpbmcgcG9saWNpZXMKQEAgLTI4Nyw2ICsyODgsNyBAQAogYXNtbGlua2FnZSB2b2lkIHNjaGVkdWxlKHZvaWQpOwogCiBzdHJ1Y3QgbnNwcm94eTsKK3N0cnVjdCB1c2VyX25hbWVzcGFjZTsKIAogLyogTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIG1hcCBhcmVhcy4uIFRoaXMgaXMgYSByYW5kb20gKGxhcmdlKSBudW1iZXIgKi8KICNkZWZpbmUgREVGQVVMVF9NQVhfTUFQX0NPVU5UCTY1NTM2CkBAIC01MjksNiArNTMxLDEwIEBACiAjaWZkZWYgQ09ORklHX1RBU0tTVEFUUwogCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRElUCisJdW5zaWduZWQgYXVkaXRfdHR5OworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICp0dHlfYXVkaXRfYnVmOworI2VuZGlmCiB9OwogCiAvKiBDb250ZXh0IHN3aXRjaCBtdXN0IGJlIHVubG9ja2VkIGlmIGludGVycnVwdHMgYXJlIHRvIGJlIGVuYWJsZWQgKi8KQEAgLTk3Miw3ICs5NzgsOCBAQAogCXVuc2lnbmVkIGludCBydF9wcmlvcml0eTsKIAljcHV0aW1lX3QgdXRpbWUsIHN0aW1lOwogCXVuc2lnbmVkIGxvbmcgbnZjc3csIG5pdmNzdzsgLyogY29udGV4dCBzd2l0Y2ggY291bnRzICovCi0Jc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RpbWU7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RpbWU7IAkJLyogbW9ub3RvbmljIHRpbWUgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgcmVhbF9zdGFydF90aW1lOwkvKiBib290IGJhc2VkIHRpbWUgKi8KIC8qIG1tIGZhdWx0IGFuZCBzd2FwIGluZm86IHRoaXMgY2FuIGFyZ3VhYmx5IGJlIHNlZW4gYXMgZWl0aGVyIG1tLXNwZWNpZmljIG9yIHRocmVhZC1zcGVjaWZpYyAqLwogCXVuc2lnbmVkIGxvbmcgbWluX2ZsdCwgbWFqX2ZsdDsKIApAQCAtMTQwMyw3ICsxNDEwLDcgQEAKIGV4dGVybiB2b2lkIF9fc2V0X3NwZWNpYWxfcGlkcyhwaWRfdCBzZXNzaW9uLCBwaWRfdCBwZ3JwKTsKIAogLyogcGVyLVVJRCBwcm9jZXNzIGNoYXJnaW5nLiAqLwotZXh0ZXJuIHN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZCh1aWRfdCk7CitleHRlcm4gc3RydWN0IHVzZXJfc3RydWN0ICogYWxsb2NfdWlkKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqLCB1aWRfdCk7CiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX3N0cnVjdCAqZ2V0X3VpZChzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnUpCiB7CiAJYXRvbWljX2luYygmdS0+X19jb3VudCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjeDIwMF9ncGlvLmggYi9pbmNsdWRlL2xpbnV4L3NjeDIwMF9ncGlvLmgKaW5kZXggMWE4MmQzMC4uZDJiMDU4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY3gyMDBfZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvc2N4MjAwX2dwaW8uaApAQCAtMSw1ICsxLDMgQEAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCiB1MzIgc2N4MjAwX2dwaW9fY29uZmlndXJlKHVuc2lnbmVkIGluZGV4LCB1MzIgc2V0LCB1MzIgY2xlYXIpOwogCiBleHRlcm4gdW5zaWduZWQgc2N4MjAwX2dwaW9fYmFzZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VjY29tcC5oIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKaW5kZXggM2U4YjFjZi4uMjYyYThkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKQEAgLTQsOCArNCw2IEBACiAKICNpZmRlZiBDT05GSUdfU0VDQ09NUAogCi0jZGVmaW5lIE5SX1NFQ0NPTVBfTU9ERVMgMQotCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vc2VjY29tcC5oPgogCkBAIC0xOCwyMCArMTYsMjMgQEAKIAkJX19zZWN1cmVfY29tcHV0aW5nKHRoaXNfc3lzY2FsbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhhc19zZWN1cmVfY29tcHV0aW5nKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCi17Ci0JcmV0dXJuIHVubGlrZWx5KHRlc3RfdGlfdGhyZWFkX2ZsYWcodGksIFRJRl9TRUNDT01QKSk7Ci19CitleHRlcm4gbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKTsKK2V4dGVybiBsb25nIHByY3RsX3NldF9zZWNjb21wKHVuc2lnbmVkIGxvbmcpOwogCiAjZWxzZSAvKiBDT05GSUdfU0VDQ09NUCAqLwogCiB0eXBlZGVmIHN0cnVjdCB7IH0gc2VjY29tcF90OwogCiAjZGVmaW5lIHNlY3VyZV9jb21wdXRpbmcoeCkgZG8geyB9IHdoaWxlICgwKQotLyogc3RhdGljIGlubGluZSB0byBwcmVzZXJ2ZSB0eXBlY2hlY2tpbmcgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhhc19zZWN1cmVfY29tcHV0aW5nKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKQogewotCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgcHJjdGxfc2V0X3NlY2NvbXAodW5zaWduZWQgbG9uZyBhcmcyKQoreworCXJldHVybiAtRUlOVkFMOwogfQogCiAjZW5kaWYgLyogQ09ORklHX1NFQ0NPTVAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCmluZGV4IDMzZmM4Y2IuLmRlYjcxNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWwuaApAQCAtMTc3LDExICsxNzcsNSBAQAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi0vKiBBbGxvdyBhcmNoaXRlY3R1cmVzIHRvIG92ZXJyaWRlIGVudHJpZXMgaW4gc2VyaWFsODI1MF9wb3J0c1tdIGF0IHJ1biB0aW1lOiAqLwotc3RydWN0IHVhcnRfcG9ydDsJLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotZXh0ZXJuIGludCBlYXJseV9zZXJpYWxfc2V0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7Ci1leHRlcm4gaW50IGVhcmx5X3NlcmlhbF9jb25zb2xlX2luaXQoY2hhciAqb3B0aW9ucyk7Ci1leHRlcm4gaW50IHNlcmlhbDgyNTBfc3RhcnRfY29uc29sZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBjaGFyICpvcHRpb25zKTsKLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAppbmRleCA3MTMxMGQ4Li43MDZlZTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCkBAIC02MCw0ICs2MCw4IEBACiB2b2lkIHNlcmlhbDgyNTBfc3VzcGVuZF9wb3J0KGludCBsaW5lKTsKIHZvaWQgc2VyaWFsODI1MF9yZXN1bWVfcG9ydChpbnQgbGluZSk7CiAKK2V4dGVybiBpbnQgc2VyaWFsODI1MF9maW5kX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcCk7CitleHRlcm4gaW50IHNlcmlhbDgyNTBfZmluZF9wb3J0X2Zvcl9lYXJseWNvbih2b2lkKTsKK2V4dGVybiBpbnQgc2V0dXBfZWFybHlfc2VyaWFsODI1MF9jb25zb2xlKGNoYXIgKmNtZGxpbmUpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCA3ZjJjOTlkLi45YzcyMWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0xNDIsNiArMTQyLDkgQEAKIC8qIE1pY3JlbCBLUzg2OTUgKi8KICNkZWZpbmUgUE9SVF9LUzg2OTUJNzYKIAorLyogQnJvYWRjb20gU0IxMjUwLCBldGMuIFNPQyAqLworI2RlZmluZSBQT1JUX1NCMTI1MF9EVUFSVAk3NworCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCmluZGV4IDlhNWVhYzUuLmVhOTFhYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaApAQCAtNiw3ICs2LDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogLyoKICAqIFJlYWwgVGltZSBzaWduYWxzIG1heSBiZSBxdWV1ZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IGNlYmNkMzguLjBlMWQwZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC0xNCw4ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotdHlwZWRlZiBzdHJ1Y3Qga21lbV9jYWNoZSBrbWVtX2NhY2hlX3QgX19kZXByZWNhdGVkOwotCiAvKgogICogRmxhZ3MgdG8gcGFzcyB0byBrbWVtX2NhY2hlX2NyZWF0ZSgpLgogICogVGhlIG9uZXMgbWFya2VkIERFQlVHIGFyZSBvbmx5IHZhbGlkIGlmIENPTkZJR19TTEFCX0RFQlVHIGlzIHNldC4KQEAgLTMzLDYgKzMxLDE5IEBACiAjZGVmaW5lIFNMQUJfVFJBQ0UJCTB4MDAyMDAwMDBVTAkvKiBUcmFjZSBhbGxvY2F0aW9ucyBhbmQgZnJlZXMgKi8KIAogLyoKKyAqIFpFUk9fU0laRV9QVFIgd2lsbCBiZSByZXR1cm5lZCBmb3IgemVybyBzaXplZCBrbWFsbG9jIHJlcXVlc3RzLgorICoKKyAqIERlcmVmZXJlbmNpbmcgWkVST19TSVpFX1BUUiB3aWxsIGxlYWQgdG8gYSBkaXN0aW5jdCBhY2Nlc3MgZmF1bHQuCisgKgorICogWkVST19TSVpFX1BUUiBjYW4gYmUgcGFzc2VkIHRvIGtmcmVlIHRob3VnaCBpbiB0aGUgc2FtZSB3YXkgdGhhdCBOVUxMIGNhbi4KKyAqIEJvdGggbWFrZSBrZnJlZSBhIG5vLW9wLgorICovCisjZGVmaW5lIFpFUk9fU0laRV9QVFIgKCh2b2lkICopMTYpCisKKyNkZWZpbmUgWkVST19PUl9OVUxMX1BUUih4KSAoKHVuc2lnbmVkIGxvbmcpKHgpIDwgXAorCQkJCSh1bnNpZ25lZCBsb25nKVpFUk9fU0laRV9QVFIpCisKKy8qCiAgKiBzdHJ1Y3Qga21lbV9jYWNoZSByZWxhdGVkIHByb3RvdHlwZXMKICAqLwogdm9pZCBfX2luaXQga21lbV9jYWNoZV9pbml0KHZvaWQpOwpAQCAtNDQsOCArNTUsNiBAQAogCQkJdm9pZCAoKikodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKSk7CiB2b2lkIGttZW1fY2FjaGVfZGVzdHJveShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKIGludCBrbWVtX2NhY2hlX3NocmluayhzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwotdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwogdm9pZCBrbWVtX2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKiwgdm9pZCAqKTsKIHVuc2lnbmVkIGludCBrbWVtX2NhY2hlX3NpemUoc3RydWN0IGttZW1fY2FjaGUgKik7CiBjb25zdCBjaGFyICprbWVtX2NhY2hlX25hbWUoc3RydWN0IGttZW1fY2FjaGUgKik7CkBAIC02MywxNiArNzIsNiBAQAogCQlzaXplb2Yoc3RydWN0IF9fc3RydWN0KSwgX19hbGlnbm9mX18oc3RydWN0IF9fc3RydWN0KSxcCiAJCShfX2ZsYWdzKSwgTlVMTCwgTlVMTCkKIAotI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKLQkJCQkJZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQotewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOwotfQotI2VuZGlmCi0KIC8qCiAgKiBUaGUgbGFyZ2VzdCBrbWFsbG9jIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBzbGFiIGFsbG9jYXRvcnMgaXMKICAqIDMyIG1lZ2FieXRlICgyXjI1KSBvciB0aGUgbWF4aW11bSBhbGxvY2F0YWJsZSBwYWdlIG9yZGVyIGlmIHRoYXQgaXMKQEAgLTkxLDUxICs5MCw0MiBAQAogLyoKICAqIENvbW1vbiBrbWFsbG9jIGZ1bmN0aW9ucyBwcm92aWRlZCBieSBhbGwgYWxsb2NhdG9ycwogICovCi12b2lkICpfX2ttYWxsb2Moc2l6ZV90LCBnZnBfdCk7Ci12b2lkICpfX2t6YWxsb2Moc2l6ZV90LCBnZnBfdCk7CiB2b2lkICogX19tdXN0X2NoZWNrIGtyZWFsbG9jKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBnZnBfdCk7CiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKik7CiBzaXplX3Qga3NpemUoY29uc3Qgdm9pZCAqKTsKIAorLyoKKyAqIEFsbG9jYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhlc2UgYXJlIG1haW5seSB1c2VkIHRvIGVzdGFibGlzaCBvcHRpbWl6ZWQKKyAqIHdheXMgdG8gY29udmVydCBrbWFsbG9jKCkgY2FsbHMgdG8ga21lbV9jYWNoZV9hbGxvYygpIGludm9jYXRpb25zIGJ5CisgKiBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlIGdlbmVyYWwgY2FjaGUgYXQgY29tcGlsZSB0aW1lLgorICoKKyAqIEFsbG9jYXRvcnMgbXVzdCBkZWZpbmUgYXQgbGVhc3Q6CisgKgorICoJa21lbV9jYWNoZV9hbGxvYygpCisgKglfX2ttYWxsb2MoKQorICoJa21hbGxvYygpCisgKgorICogVGhvc2Ugd2lzaGluZyB0byBzdXBwb3J0IE5VTUEgbXVzdCBhbHNvIGRlZmluZToKKyAqCisgKglrbWVtX2NhY2hlX2FsbG9jX25vZGUoKQorICoJa21hbGxvY19ub2RlKCkKKyAqCisgKiBTZWUgZWFjaCBhbGxvY2F0b3IgZGVmaW5pdGlvbiBmaWxlIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzIGFuZAorICogaW1wbGVtZW50YXRpb24gbm90ZXMuCisgKi8KKyNpZmRlZiBDT05GSUdfU0xVQgorI2luY2x1ZGUgPGxpbnV4L3NsdWJfZGVmLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19TTE9CKQorI2luY2x1ZGUgPGxpbnV4L3Nsb2JfZGVmLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3NsYWJfZGVmLmg+CisjZW5kaWYKKwogLyoqCiAgKiBrY2FsbG9jIC0gYWxsb2NhdGUgbWVtb3J5IGZvciBhbiBhcnJheS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KICAqIEBuOiBudW1iZXIgb2YgZWxlbWVudHMuCiAgKiBAc2l6ZTogZWxlbWVudCBzaXplLgogICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCWlmIChuICE9IDAgJiYgc2l6ZSA+IFVMT05HX01BWCAvIG4pCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBfX2t6YWxsb2MobiAqIHNpemUsIGZsYWdzKTsKLX0KLQotLyoKLSAqIEFsbG9jYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhlc2UgYXJlIG1haW5seSB1c2VkIHRvIGVzdGFibGlzaCBvcHRpbWl6ZWQKLSAqIHdheXMgdG8gY29udmVydCBrbWFsbG9jKCkgY2FsbHMgdG8ga21lbV9jYWNoZV9hbGxvYygpIGludm9jYXRpb25zIGJ5IHNlbGVjdGluZwotICogdGhlIGFwcHJvcHJpYXRlIGdlbmVyYWwgY2FjaGUgYXQgY29tcGlsZSB0aW1lLgotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTEFCKSB8fCBkZWZpbmVkKENPTkZJR19TTFVCKQotI2lmZGVmIENPTkZJR19TTFVCCi0jaW5jbHVkZSA8bGludXgvc2x1Yl9kZWYuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvc2xhYl9kZWYuaD4KLSNlbmRpZiAvKiAhQ09ORklHX1NMVUIgKi8KLSNlbHNlCi0KLS8qCi0gKiBGYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgYW4gYWxsb2NhdG9yIG5vdCB3YW50aW5nIHRvIHByb3ZpZGUKLSAqIGl0cyBvd24gb3B0aW1pemVkIGttYWxsb2MgZGVmaW5pdGlvbnMgKGxpa2UgU0xPQikuCi0gKi8KLQotLyoqCi0gKiBrbWFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5Ci0gKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICoKLSAqIGttYWxsb2MgaXMgdGhlIG5vcm1hbCBtZXRob2Qgb2YgYWxsb2NhdGluZyBtZW1vcnkKLSAqIGluIHRoZSBrZXJuZWwuCiAgKgogICogVGhlIEBmbGFncyBhcmd1bWVudCBtYXkgYmUgb25lIG9mOgogICoKQEAgLTE0Myw3ICsxMzMsNyBAQAogICoKICAqICVHRlBfS0VSTkVMIC0gQWxsb2NhdGUgbm9ybWFsIGtlcm5lbCByYW0uICBNYXkgc2xlZXAuCiAgKgotICogJUdGUF9BVE9NSUMgLSBBbGxvY2F0aW9uIHdpbGwgbm90IHNsZWVwLgorICogJUdGUF9BVE9NSUMgLSBBbGxvY2F0aW9uIHdpbGwgbm90IHNsZWVwLiAgTWF5IHVzZSBlbWVyZ2VuY3kgcG9vbHMuCiAgKiAgIEZvciBleGFtcGxlLCB1c2UgdGhpcyBpbnNpZGUgaW50ZXJydXB0IGhhbmRsZXJzLgogICoKICAqICVHRlBfSElHSFVTRVIgLSBBbGxvY2F0ZSBwYWdlcyBmcm9tIGhpZ2ggbWVtb3J5LgpAQCAtMTUyLDE4ICsxNDIsMjIgQEAKICAqCiAgKiAlR0ZQX05PRlMgLSBEbyBub3QgbWFrZSBhbnkgZnMgY2FsbHMgd2hpbGUgdHJ5aW5nIHRvIGdldCBtZW1vcnkuCiAgKgorICogJUdGUF9OT1dBSVQgLSBBbGxvY2F0aW9uIHdpbGwgbm90IHNsZWVwLgorICoKKyAqICVHRlBfVEhJU05PREUgLSBBbGxvY2F0ZSBub2RlLWxvY2FsIG1lbW9yeSBvbmx5LgorICoKKyAqICVHRlBfRE1BIC0gQWxsb2NhdGlvbiBzdWl0YWJsZSBmb3IgRE1BLgorICogICBTaG91bGQgb25seSBiZSB1c2VkIGZvciBrbWFsbG9jKCkgY2FjaGVzLiBPdGhlcndpc2UsIHVzZSBhCisgKiAgIHNsYWIgY3JlYXRlZCB3aXRoIFNMQUJfRE1BLgorICoKICAqIEFsc28gaXQgaXMgcG9zc2libGUgdG8gc2V0IGRpZmZlcmVudCBmbGFncyBieSBPUidpbmcKICAqIGluIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBAZmxhZ3M6CiAgKgogICogJV9fR0ZQX0NPTEQgLSBSZXF1ZXN0IGNhY2hlLWNvbGQgcGFnZXMgaW5zdGVhZCBvZgogICogICB0cnlpbmcgdG8gcmV0dXJuIGNhY2hlLXdhcm0gcGFnZXMuCiAgKgotICogJV9fR0ZQX0RNQSAtIFJlcXVlc3QgbWVtb3J5IGZyb20gdGhlIERNQS1jYXBhYmxlIHpvbmUuCi0gKgogICogJV9fR0ZQX0hJR0ggLSBUaGlzIGFsbG9jYXRpb24gaGFzIGhpZ2ggcHJpb3JpdHkgYW5kIG1heSB1c2UgZW1lcmdlbmN5IHBvb2xzLgogICoKLSAqICVfX0dGUF9ISUdITUVNIC0gQWxsb2NhdGVkIG1lbW9yeSBtYXkgYmUgZnJvbSBoaWdobWVtLgotICoKICAqICVfX0dGUF9OT0ZBSUwgLSBJbmRpY2F0ZSB0aGF0IHRoaXMgYWxsb2NhdGlvbiBpcyBpbiBubyB3YXkgYWxsb3dlZCB0byBmYWlsCiAgKiAgICh0aGluayB0d2ljZSBiZWZvcmUgdXNpbmcpLgogICoKQEAgLTE3MywyNCArMTY3LDI5IEBACiAgKiAlX19HRlBfTk9XQVJOIC0gSWYgYWxsb2NhdGlvbiBmYWlscywgZG9uJ3QgaXNzdWUgYW55IHdhcm5pbmdzLgogICoKICAqICVfX0dGUF9SRVBFQVQgLSBJZiBhbGxvY2F0aW9uIGZhaWxzIGluaXRpYWxseSwgdHJ5IG9uY2UgbW9yZSBiZWZvcmUgZmFpbGluZy4KKyAqCisgKiBUaGVyZSBhcmUgb3RoZXIgZmxhZ3MgYXZhaWxhYmxlIGFzIHdlbGwsIGJ1dCB0aGVzZSBhcmUgbm90IGludGVuZGVkCisgKiBmb3IgZ2VuZXJhbCB1c2UsIGFuZCBzbyBhcmUgbm90IGRvY3VtZW50ZWQgaGVyZS4gRm9yIGEgZnVsbCBsaXN0IG9mCisgKiBwb3RlbnRpYWwgZmxhZ3MsIGFsd2F5cyByZWZlciB0byBsaW51eC9nZnAuaC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewotCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOworCWlmIChuICE9IDAgJiYgc2l6ZSA+IFVMT05HX01BWCAvIG4pCisJCXJldHVybiBOVUxMOworCXJldHVybiBfX2ttYWxsb2MobiAqIHNpemUsIGZsYWdzIHwgX19HRlBfWkVSTyk7CiB9CiAKKyNpZiAhZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgIWRlZmluZWQoQ09ORklHX1NMT0IpCiAvKioKLSAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBrbWFsbG9jX25vZGUgLSBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBhIHNwZWNpZmljIG5vZGUKICAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrbWFsbG9jKS4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga2NhbGxvYykuCisgKiBAbm9kZTogbm9kZSB0byBhbGxvY2F0ZSBmcm9tLgorICoKKyAqIGttYWxsb2MoKSBmb3Igbm9uLWxvY2FsIG5vZGVzLCB1c2VkIHRvIGFsbG9jYXRlIGZyb20gYSBzcGVjaWZpYyBub2RlCisgKiBpZiBhdmFpbGFibGUuIEVxdWl2YWxlbnQgdG8ga21hbGxvYygpIGluIHRoZSBub24tTlVNQSBzaW5nbGUtbm9kZQorICogY2FzZS4KICAqLwotc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIENPTkZJR19OVU1BCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewogCXJldHVybiBrbWFsbG9jKHNpemUsIGZsYWdzKTsKQEAgLTIwMCw3ICsxOTksMTUgQEAKIHsKIAlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KLSNlbmRpZiAvKiAhQ09ORklHX05VTUEgKi8KKwordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCisJCQkJCWdmcF90IGZsYWdzLCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKK30KKyNlbmRpZiAvKiAhQ09ORklHX05VTUEgJiYgIUNPTkZJR19TTE9CICovCiAKIC8qCiAgKiBrbWFsbG9jX3RyYWNrX2NhbGxlciBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBrbWFsbG9jIHRoYXQgcmVjb3JkcyB0aGUKQEAgLTI0NSw2ICsyNTIsMjMgQEAKIAogI2VuZGlmIC8qIERFQlVHX1NMQUIgKi8KIAorLyoKKyAqIFNob3J0Y3V0cworICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfemFsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICprLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhrLCBmbGFncyB8IF9fR0ZQX1pFUk8pOworfQorCisvKioKKyAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga21hbGxvYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MgfCBfX0dGUF9aRVJPKTsKK30KKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfTElOVVhfU0xBQl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAppbmRleCA4ZDgxYTYwLi4zMmJkYzJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCkBAIC0yNSwxMCArMjUsMTcgQEAKIH07CiBleHRlcm4gc3RydWN0IGNhY2hlX3NpemVzIG1hbGxvY19zaXplc1tdOwogCit2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKK3ZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewogCQlpbnQgaSA9IDA7CisKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisKICNkZWZpbmUgQ0FDSEUoeCkgXAogCQlpZiAoc2l6ZSA8PSB4KSBcCiAJCQlnb3RvIGZvdW5kOyBcCkBAIC01MSwzOSArNTgsMTggQEAKIAlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKLQkJaW50IGkgPSAwOwotI2RlZmluZSBDQUNIRSh4KSBcCi0JCWlmIChzaXplIDw9IHgpIFwKLQkJCWdvdG8gZm91bmQ7IFwKLQkJZWxzZSBcCi0JCQlpKys7Ci0jaW5jbHVkZSAia21hbGxvY19zaXplcy5oIgotI3VuZGVmIENBQ0hFCi0JCXsKLQkJCWV4dGVybiB2b2lkIF9feW91X2Nhbm5vdF9remFsbG9jX3RoYXRfbXVjaCh2b2lkKTsKLQkJCV9feW91X2Nhbm5vdF9remFsbG9jX3RoYXRfbXVjaCgpOwotCQl9Ci1mb3VuZDoKLSNpZmRlZiBDT05GSUdfWk9ORV9ETUEKLQkJaWYgKGZsYWdzICYgR0ZQX0RNQSkKLQkJCXJldHVybiBrbWVtX2NhY2hlX3phbGxvYyhtYWxsb2Nfc2l6ZXNbaV0uY3NfZG1hY2FjaGVwLAotCQkJCQkJZmxhZ3MpOwotI2VuZGlmCi0JCXJldHVybiBrbWVtX2NhY2hlX3phbGxvYyhtYWxsb2Nfc2l6ZXNbaV0uY3NfY2FjaGVwLCBmbGFncyk7Ci0JfQotCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQotCiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiB2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKIAogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKIAkJaW50IGkgPSAwOworCisJCWlmICghc2l6ZSkKKwkJCXJldHVybiBaRVJPX1NJWkVfUFRSOworCiAjZGVmaW5lIENBQ0hFKHgpIFwKIAkJaWYgKHNpemUgPD0geCkgXAogCQkJZ290byBmb3VuZDsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZGFmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBfX0xJTlVYX1NMT0JfREVGX0gKKyNkZWZpbmUgX19MSU5VWF9TTE9CX0RFRl9ICisKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCAtMSk7Cit9CisKK3ZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQoreworCXJldHVybiBfX2ttYWxsb2Nfbm9kZShzaXplLCBmbGFncywgbm9kZSk7Cit9CisKKy8qKgorICoga21hbGxvYyAtIGFsbG9jYXRlIG1lbW9yeQorICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGtjYWxsb2MpLgorICoKKyAqIGttYWxsb2MgaXMgdGhlIG5vcm1hbCBtZXRob2Qgb2YgYWxsb2NhdGluZyBtZW1vcnkKKyAqIGluIHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIF9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCAtMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7Cit9CisKKy8qKgorICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrY2FsbG9jKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKK30KKworI2VuZGlmIC8qIF9fTElOVVhfU0xPQl9ERUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCmluZGV4IDYyMDdhM2QuLjA3ZjdlNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKQEAgLTE2LDcgKzE2LDkgQEAKIAl1bnNpZ25lZCBsb25nIG5yX3BhcnRpYWw7CiAJYXRvbWljX2xvbmdfdCBucl9zbGFiczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBhcnRpYWw7CisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZ1bGw7CisjZW5kaWYKIH07CiAKIC8qCkBAIC00NCw3ICs0Niw5IEBACiAJaW50IGFsaWduOwkJLyogQWxpZ25tZW50ICovCiAJY29uc3QgY2hhciAqbmFtZTsJLyogTmFtZSAob25seSBmb3IgZGlzcGxheSEpICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBMaXN0IG9mIHNsYWIgY2FjaGVzICovCisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwkvKiBGb3Igc3lzZnMgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX05VTUEKIAlpbnQgZGVmcmFnX3JhdGlvOwpAQCAtMTU5LDE3ICsxNjMsOCBAQAogI2RlZmluZSBTTFVCX0RNQSAwCiAjZW5kaWYKIAotCi0vKgotICogWkVST19TSVpFX1BUUiB3aWxsIGJlIHJldHVybmVkIGZvciB6ZXJvIHNpemVkIGttYWxsb2MgcmVxdWVzdHMuCi0gKgotICogRGVyZWZlcmVuY2luZyBaRVJPX1NJWkVfUFRSIHdpbGwgbGVhZCB0byBhIGRpc3RpbmN0IGFjY2VzcyBmYXVsdC4KLSAqCi0gKiBaRVJPX1NJWkVfUFRSIGNhbiBiZSBwYXNzZWQgdG8ga2ZyZWUgdGhvdWdoIGluIHRoZSBzYW1lIHdheSB0aGF0IE5VTEwgY2FuLgotICogQm90aCBtYWtlIGtmcmVlIGEgbm8tb3AuCi0gKi8KLSNkZWZpbmUgWkVST19TSVpFX1BUUiAoKHZvaWQgKikxNikKLQordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Cit2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKIAogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKQEAgLTE4NCwyMSArMTc5LDkgQEAKIAkJcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpICYmICEoZmxhZ3MgJiBTTFVCX0RNQSkpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBrbWFsbG9jX3NsYWIoc2l6ZSk7Ci0KLQkJaWYgKCFzKQotCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7Ci0KLQkJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKHMsIGZsYWdzKTsKLQl9IGVsc2UKLQkJcmV0dXJuIF9fa3phbGxvYyhzaXplLCBmbGFncyk7Ci19Ci0KICNpZmRlZiBDT05GSUdfTlVNQQotZXh0ZXJuIHZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwordm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7Cit2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKIAogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21wX2xvY2suaCBiL2luY2x1ZGUvbGludXgvc21wX2xvY2suaAppbmRleCBjZjcxNWE0Li41ODk2MmM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NtcF9sb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXBfbG9jay5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaWZkZWYgQ09ORklHX0xPQ0tfS0VSTkVMCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjZGVmaW5lIGtlcm5lbF9sb2NrZWQoKQkJKGN1cnJlbnQtPmxvY2tfZGVwdGggPj0gMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggZmUxOTVjOS4uZjg1MmUxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0yNTMsNiArMjUzLDkgQEAKIAogI2RlZmluZSBNU0dfRU9GICAgICAgICAgTVNHX0ZJTgogCisjZGVmaW5lIE1TR19DTVNHX0NMT0VYRUMgMHg0MDAwMDAwMAkvKiBTZXQgY2xvc2Vfb25fZXhpdCBmb3IgZmlsZQorCQkJCQkgICBkZXNjcmlwdG9yIHJlY2VpdmVkIHRocm91Z2gKKwkJCQkJICAgU0NNX1JJR0hUUyAqLwogI2lmIGRlZmluZWQoQ09ORklHX0NPTVBBVCkKICNkZWZpbmUgTVNHX0NNU0dfQ09NUEFUCTB4ODAwMDAwMDAJLyogVGhpcyBtZXNzYWdlIG5lZWRzIDMyIGJpdCBmaXh1cHMgKi8KICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oIGIvaW5jbHVkZS9saW51eC9zb255cGkuaAppbmRleCAzNGQ0YjA3Li40MGM3YjVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ueXBpLmgKQEAgLTE1Myw4ICsxNTMsNiBAQAogI2RlZmluZSBTT05ZUElfQ09NTUFORF9HRVRDQU1FUkFST01WRVJTSU9OCTE4CS8qIG9ic29sZXRlICovCiAjZGVmaW5lIFNPTllQSV9DT01NQU5EX0dFVENBTUVSQVJFVklTSU9OCTE5CS8qIG9ic29sZXRlICovCiAKLWludCBzb255cGlfY2FtZXJhX2NvbW1hbmQoaW50IGNvbW1hbmQsIHU4IHZhbHVlKTsKLQogI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCQkJCS8qIF9TT05ZUElfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKaW5kZXggMWJlNWVhMC4uMzAyYjgxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKQEAgLTc2LDYgKzc2LDcgQEAKICNkZWZpbmUJU1BJX01PREVfMwkoU1BJX0NQT0x8U1BJX0NQSEEpCiAjZGVmaW5lCVNQSV9DU19ISUdICTB4MDQJCQkvKiBjaGlwc2VsZWN0IGFjdGl2ZSBoaWdoPyAqLwogI2RlZmluZQlTUElfTFNCX0ZJUlNUCTB4MDgJCQkvKiBwZXItd29yZCBiaXRzLW9uLXdpcmUgKi8KKyNkZWZpbmUJU1BJXzNXSVJFCTB4MTAJCQkvKiBTSS9TTyBzaWduYWxzIHNoYXJlZCAqLwogCXU4CQkJYml0c19wZXJfd29yZDsKIAlpbnQJCQlpcnE7CiAJdm9pZAkJCSpjb250cm9sbGVyX3N0YXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKaW5kZXggOWRiY2E2Mi4uYjhkYjMyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCkBAIC0yNiw2ICsyNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKIAl1OAkJCWJ1c3k7CiAJdTgJCQl1c2VfZG1hOworCXU4CQkJZmxhZ3M7CQkvKiBleHRyYSBzcGktPm1vZGUgc3VwcG9ydCAqLwogCiAJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvdGxlNjJ4MC5oIGIvaW5jbHVkZS9saW51eC9zcGkvdGxlNjJ4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjU5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS90bGU2MngwLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHRsZTYyeDAuaCAtIHBsYXRmb3JtIGdsdWUgdG8gSW5maW5lb24gVExFNjJ4MCBkcml2ZXIgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCitzdHJ1Y3QgdGxlNjJ4MF9wZGF0YSB7CisJdW5zaWduZWQgaW50CQlpbml0X3N0YXRlOworCXVuc2lnbmVkIGludAkJZ3Bpb19jb3VudDsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKaW5kZXggYTk0NjE3Ni4uYzM3NmYzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaApAQCAtMjgyLDYgKzI4MiwxMyBAQAogCTEgOiAoeyBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IDA7IH0pOyBcCiB9KQogCisjZGVmaW5lIHdyaXRlX3RyeWxvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykgXAorKHsgXAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCXdyaXRlX3RyeWxvY2sobG9jaykgPyBcCisJMSA6ICh7IGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgMDsgfSk7IFwKK30pCisKIC8qCiAgKiBMb2NrcyB0d28gc3BpbmxvY2tzIGwxIGFuZCBsMi4KICAqIGwxX2ZpcnN0IGluZGljYXRlcyBpZiBzcGlubG9jayBsMSBzaG91bGQgYmUgdGFrZW4gZmlyc3QuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmgKaW5kZXggYmJhYzEwMS4uNDU5YzVmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaApAQCAtNTgsNiArNTgsNyBAQAogdTMyIGdzc19kZWxldGVfc2VjX2NvbnRleHQoCiAJCXN0cnVjdCBnc3NfY3R4CQkqKmN0eF9pZCk7CiAKK3UzMiBnc3Nfc3ZjX3RvX3BzZXVkb2ZsYXZvcihzdHJ1Y3QgZ3NzX2FwaV9tZWNoICosIHUzMiBzZXJ2aWNlKTsKIHUzMiBnc3NfcHNldWRvZmxhdm9yX3RvX3NlcnZpY2Uoc3RydWN0IGdzc19hcGlfbWVjaCAqLCB1MzIgcHNldWRvZmxhdm9yKTsKIGNoYXIgKmdzc19zZXJ2aWNlX3RvX2F1dGhfZG9tYWluX25hbWUoc3RydWN0IGdzc19hcGlfbWVjaCAqLCB1MzIgc2VydmljZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKaW5kZXggMTI5ZDUwZi4uODUzMWE3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKQEAgLTIxMiw2ICsyMTIsNyBAQAogCXN0cnVjdCBzdmNfcG9vbCAqCXJxX3Bvb2w7CS8qIHRocmVhZCBwb29sICovCiAJc3RydWN0IHN2Y19wcm9jZWR1cmUgKglycV9wcm9jaW5mbzsJLyogcHJvY2VkdXJlIGluZm8gKi8KIAlzdHJ1Y3QgYXV0aF9vcHMgKglycV9hdXRob3A7CS8qIGF1dGhlbnRpY2F0aW9uIGZsYXZvdXIgKi8KKwl1MzIJCQlycV9mbGF2b3I7CS8qIHBzZXVkb2ZsYXZvciAqLwogCXN0cnVjdCBzdmNfY3JlZAkJcnFfY3JlZDsJLyogYXV0aCBpbmZvICovCiAJc3RydWN0IHNrX2J1ZmYgKglycV9za2J1ZmY7CS8qIGZhc3QgcmVjdiBpbmV0IGJ1ZmZlciAqLwogCXN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxKnJxX2RlZmVycmVkOwkvKiBkZWZlcnJlZCByZXF1ZXN0IHdlIGFyZSByZXBsYXlpbmcgKi8KQEAgLTI0OCw2ICsyNDksNyBAQAogCQkJCQkJICovCiAJLyogQ2F0ZXJpbmcgdG8gbmZzZCAqLwogCXN0cnVjdCBhdXRoX2RvbWFpbiAqCXJxX2NsaWVudDsJLyogUlBDIHBlZXIgaW5mbyAqLworCXN0cnVjdCBhdXRoX2RvbWFpbiAqCXJxX2dzc2NsaWVudDsJLyogImdzcy8iLXN0eWxlIHBlZXIgaW5mbyAqLwogCXN0cnVjdCBzdmNfY2FjaGVyZXAgKglycV9jYWNoZXJlcDsJLyogY2FjaGUgaW5mbyAqLwogCXN0cnVjdCBrbmZzZF9maCAqCXJxX3JlZmZoOwkvKiBSZWZlcnJlbmNlIGZpbGVoYW5kbGUsIHVzZWQgdG8KIAkJCQkJCSAqIGRldGVybWluZSB3aGF0IGRldmljZSBudW1iZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGguaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGguaAppbmRleCBkZTkyNjE5Li4yMmUxZWY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aC5oCkBAIC0xMjcsNiArMTI3LDcgQEAKIGV4dGVybiBpbnQgYXV0aF91bml4X2ZvcmdldF9vbGQoc3RydWN0IGF1dGhfZG9tYWluICpkb20pOwogZXh0ZXJuIHZvaWQgc3ZjYXV0aF91bml4X3B1cmdlKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3ZjYXV0aF91bml4X2luZm9fcmVsZWFzZSh2b2lkICopOworZXh0ZXJuIGludCBzdmNhdXRoX3VuaXhfc2V0X2NsaWVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2hfc3RyKGNoYXIgKm5hbWUsIGludCBiaXRzKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmgKaW5kZXggNWE1ZGIxNi4uNDE3YTFkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oCkBAIC0yMiw2ICsyMiw3IEBACiBpbnQgZ3NzX3N2Y19pbml0KHZvaWQpOwogdm9pZCBnc3Nfc3ZjX3NodXRkb3duKHZvaWQpOwogaW50IHN2Y2F1dGhfZ3NzX3JlZ2lzdGVyX3BzZXVkb2ZsYXZvcih1MzIgcHNldWRvZmxhdm9yLCBjaGFyICogbmFtZSk7Cit1MzIgc3ZjYXV0aF9nc3NfZmxhdm9yKHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfU1VOUlBDX1NWQ0FVVEhfR1NTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggMDA2ODY4OC4uNjY1Zjg1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTE4OCw3ICsxODgsOCBAQAogZXh0ZXJuIHZvaWQgc3dhcF9zZXR1cCh2b2lkKTsKIAogLyogbGludXgvbW0vdm1zY2FuLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICoqLCBnZnBfdCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKnpvbmVzLCBpbnQgb3JkZXIsCisJCQkJCWdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNocmlua19hbGxfbWVtb3J5KHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogZXh0ZXJuIGludCB2bV9zd2FwcGluZXNzOwogZXh0ZXJuIGludCByZW1vdmVfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaCBiL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKaW5kZXggYTQ2MTA0YS4uZGNlMWVkMjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKQEAgLTMxLDcgKzMxLDcgQEAKICAqLwogCiAKLSNkZWZpbmUgVEFTS1NUQVRTX1ZFUlNJT04JNAorI2RlZmluZSBUQVNLU1RBVFNfVkVSU0lPTgk1CiAjZGVmaW5lIFRTX0NPTU1fTEVOCQkzMgkvKiBzaG91bGQgYmUgPj0gVEFTS19DT01NX0xFTgogCQkJCQkgKiBpbiBsaW51eC9zY2hlZC5oICovCiAKQEAgLTE0OSw2ICsxNDksOSBAQAogCV9fdTY0CXJlYWRfYnl0ZXM7CQkvKiBieXRlcyBvZiByZWFkIEkvTyAqLwogCV9fdTY0CXdyaXRlX2J5dGVzOwkJLyogYnl0ZXMgb2Ygd3JpdGUgSS9PICovCiAJX191NjQJY2FuY2VsbGVkX3dyaXRlX2J5dGVzOwkvKiBieXRlcyBvZiBjYW5jZWxsZWQgd3JpdGUgSS9PICovCisKKwlfX3U2NCAgbnZjc3c7CQkJLyogdm9sdW50YXJ5X2N0eHRfc3dpdGNoZXMgKi8KKwlfX3U2NCAgbml2Y3N3OwkJCS8qIG5vbnZvbHVudGFyeV9jdHh0X3N3aXRjaGVzICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZS5oIGIvaW5jbHVkZS9saW51eC90aW1lLmgKaW5kZXggZGRhOWJlNi4uZWMzYjBjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTM2LDcgKzM2LDggQEAKICNkZWZpbmUgTlNFQ19QRVJfU0VDCTEwMDAwMDAwMDBMCiAjZGVmaW5lIEZTRUNfUEVSX1NFQwkxMDAwMDAwMDAwMDAwMDAwTAogCi1zdGF0aWMgaW5saW5lIGludCB0aW1lc3BlY19lcXVhbChzdHJ1Y3QgdGltZXNwZWMgKmEsIHN0cnVjdCB0aW1lc3BlYyAqYikKK3N0YXRpYyBpbmxpbmUgaW50IHRpbWVzcGVjX2VxdWFsKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYikKIHsKIAlyZXR1cm4gKGEtPnR2X3NlYyA9PSBiLT50dl9zZWMpICYmIChhLT50dl9uc2VjID09IGItPnR2X25zZWMpOwogfQpAQCAtMTE2LDYgKzExNyw4IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGFsYXJtX3NldGl0aW1lcih1bnNpZ25lZCBpbnQgc2Vjb25kcyk7CiBleHRlcm4gaW50IGRvX2dldGl0aW1lcihpbnQgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgKnZhbHVlKTsKIGV4dGVybiB2b2lkIGdldG5zdGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpOworZXh0ZXJuIHZvaWQgZ2V0Ym9vdHRpbWUoc3RydWN0IHRpbWVzcGVjICp0cyk7CitleHRlcm4gdm9pZCBtb25vdG9uaWNfdG9fYm9vdGJhc2VkKHN0cnVjdCB0aW1lc3BlYyAqdHMpOwogCiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX3RydW5jKHN0cnVjdCB0aW1lc3BlYyB0LCB1bnNpZ25lZCBncmFuKTsKIGV4dGVybiBpbnQgdGltZWtlZXBpbmdfaXNfY29udGludW91cyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXIuaCBiL2luY2x1ZGUvbGludXgvdGltZXIuaAppbmRleCBjNjYxNzEwLi43OGNmODk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lci5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIAogc3RydWN0IHR2ZWNfdF9iYXNlX3M7CkBAIC05MSwxNiArOTAsMTMgQEAKICAqLwogI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwogCisjZGVmaW5lIFRJTUVSX1NUQVRTX0ZMQUdfREVGRVJSQUJMRQkweDEKKwogZXh0ZXJuIHZvaWQgaW5pdF90aW1lcl9zdGF0cyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKLQkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqIGNvbW0pOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCi17Ci0JdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKLQkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSk7Ci19CisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKmNvbW0sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdGltZXJfZmxhZyk7CiAKIGV4dGVybiB2b2lkIF9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAogCQkJCQkgICAgICAgdm9pZCAqYWRkcik7CkBAIC0xMTksMTAgKzExNSw2IEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKLXsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5LmggYi9pbmNsdWRlL2xpbnV4L3R0eS5oCmluZGV4IGJiNDU3NjAuLjY5MWExNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5LmgKKysrIGIvaW5jbHVkZS9saW51eC90dHkuaApAQCAtMTc4LDYgKzE3OCw3IEBACiAjZGVmaW5lIExfSUVYVEVOKHR0eSkJX0xfRkxBRygodHR5KSxJRVhURU4pCiAKIHN0cnVjdCBkZXZpY2U7CitzdHJ1Y3Qgc2lnbmFsX3N0cnVjdDsKIC8qCiAgKiBXaGVyZSBhbGwgb2YgdGhlIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBhIHR0eSBpcyBrZXB0IHdoaWxlIHRoZSB0dHkKICAqIGlzIG9wZW4uICBTaW5jZSB0aGUgdGVybWlvcyBzdGF0ZSBzaG91bGQgYmUga2VwdCBldmVuIGlmIHRoZSB0dHkKQEAgLTMxMCw2ICszMTEsNyBAQAogZXh0ZXJuIHZvaWQgdHR5X3ZoYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwogZXh0ZXJuIHZvaWQgdHR5X3VuaGFuZ3VwKHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgdHR5X2h1bmdfdXBfcChzdHJ1Y3QgZmlsZSAqIGZpbHApOworZXh0ZXJuIGludCBpc190dHkoc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIHZvaWQgZG9fU0FLKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogZXh0ZXJuIHZvaWQgX19kb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gdm9pZCBkaXNhc3NvY2lhdGVfY3R0eShpbnQgcHJpdik7CkBAIC0zMzgsOSArMzQwLDQ2IEBACiAKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggdHR5X211dGV4OwogCitleHRlcm4gdm9pZCB0dHlfd3JpdGVfdW5sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIGludCB0dHlfd3JpdGVfbG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbmRlbGF5KTsKKyNkZWZpbmUgdHR5X2lzX3dyaXRlbG9ja2VkKHR0eSkgIChtdXRleF9pc19sb2NrZWQoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKQorCisKKwogLyogbl90dHkuYyAqLwogZXh0ZXJuIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjX05fVFRZOwogCisvKiB0dHlfYXVkaXQuYyAqLworI2lmZGVmIENPTkZJR19BVURJVAorZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X2FkZF9kYXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X2V4aXQodm9pZCk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfZm9yayhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKTsKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X3B1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdWlkX3QgbG9naW51aWQpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X29wZW5pbmcodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9hZGRfZGF0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9leGl0KHZvaWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X2Zvcmsoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfcHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9wdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVpZF90IGxvZ2ludWlkKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9vcGVuaW5nKHZvaWQpCit7Cit9CisjZW5kaWYKKwogLyogdHR5X2lvY3RsLmMgKi8KIGV4dGVybiBpbnQgbl90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvLmggYi9pbmNsdWRlL2xpbnV4L3Vpby5oCmluZGV4IDlhZjhiYmMuLmI3ZmUxMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW8uaApAQCAtMTMsMTAgKzEzLDYgQEAKICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLQotLyogQSB3b3JkIG9mIHdhcm5pbmc6IE91ciB1aW8gc3RydWN0dXJlIHdpbGwgY2xhc2ggd2l0aCB0aGUgQyBsaWJyYXJ5IG9uZSAod2hpY2ggaXMgbm93IG9ic29sZXRlKS4gUmVtb3ZlIHRoZSBDCi0gICBsaWJyYXJ5IG9uZSBmcm9tIHN5cy91aW8uaCBpZiB5b3UgaGF2ZSBhIHZlcnkgb2xkIGxpYnJhcnkgc2V0ICovCi0KIHN0cnVjdCBpb3ZlYwogewogCXZvaWQgX191c2VyICppb3ZfYmFzZTsJLyogQlNEIHVzZXMgY2FkZHJfdCAoMTAwMy4xZyByZXF1aXJlcyB2b2lkICopICovCkBAIC0zOCwxMSArMzQsNiBAQAogIAogI2RlZmluZSBVSU9fRkFTVElPVgk4CiAjZGVmaW5lIFVJT19NQVhJT1YJMTAyNAotI2lmIDAKLSNkZWZpbmUgVUlPX01BWElPVgkxNgkvKiBNYXhpbXVtIGlvdmVjJ3MgaW4gb25lIG9wZXJhdGlvbiAKLQkJCQkgICAxNiBtYXRjaGVzIEJTRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCZWcgcGFyZG9uOiBCU0QgaGFzIDEwMjQgLS1BTksgKi8KLSNlbmRpZgogCiAvKgogICogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGNvdmVyZWQgYnkgYW4gaW92ZWMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzMjA1NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9MSU5VWF9VU0VSX05BTUVTUEFDRV9ICisjZGVmaW5lIF9MSU5VWF9VU0VSX05BTUVTUEFDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNkZWZpbmUgVUlESEFTSF9CSVRTCShDT05GSUdfQkFTRV9TTUFMTCA/IDMgOiA4KQorI2RlZmluZSBVSURIQVNIX1NaCSgxIDw8IFVJREhBU0hfQklUUykKKworc3RydWN0IHVzZXJfbmFtZXNwYWNlIHsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXVpZGhhc2hfdGFibGVbVUlESEFTSF9TWl07CisJc3RydWN0IHVzZXJfc3RydWN0CSpyb290X3VzZXI7Cit9OworCitleHRlcm4gc3RydWN0IHVzZXJfbmFtZXNwYWNlIGluaXRfdXNlcl9uczsKKworI2lmZGVmIENPTkZJR19VU0VSX05TCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpnZXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCWlmIChucykKKwkJa3JlZl9nZXQoJm5zLT5rcmVmKTsKKwlyZXR1cm4gbnM7Cit9CisKK2V4dGVybiBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmNvcHlfdXNlcl9ucyhpbnQgZmxhZ3MsCisJCQkJCSAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqb2xkX25zKTsKK2V4dGVybiB2b2lkIGZyZWVfdXNlcl9ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCWlmIChucykKKwkJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX3VzZXJfbnMpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqZ2V0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKwlyZXR1cm4gJmluaXRfdXNlcl9uczsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmNvcHlfdXNlcl9ucyhpbnQgZmxhZ3MsCisJCQkJCQkgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqb2xkX25zKQoreworCWlmIChmbGFncyAmIENMT05FX05FV1VTRVIpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oIGIvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKaW5kZXggZjhkM2IzMi4uOTIzZGI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKQEAgLTQ4LDI2ICs0OCwxNCBAQAogCWtyZWZfZ2V0KCZucy0+a3JlZik7CiB9CiAKLSNpZmRlZiBDT05GSUdfVVRTX05TCi1leHRlcm4gc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZShpbnQgZmxhZ3MsIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpucyk7CitleHRlcm4gc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZSh1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCQlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpOwogZXh0ZXJuIHZvaWQgZnJlZV91dHNfbnMoc3RydWN0IGtyZWYgKmtyZWYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3V0c19ucyhzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpCiB7CiAJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX3V0c19ucyk7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKGludCBmbGFncywKLQkJCQkJCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpucykKLXsKLQlyZXR1cm4gbnM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXRzX25zKHN0cnVjdCB1dHNfbmFtZXNwYWNlICpucykKLXsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXdfdXRzbmFtZSAqdXRzbmFtZSh2b2lkKQogewogCXJldHVybiAmY3VycmVudC0+bnNwcm94eS0+dXRzX25zLT5uYW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAppbmRleCA0YjdlZTgzLi4xMzJiMjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtNjUsOSArNjUsMTAgQEAKIAkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbm9kZSwKIAkJCQkJICBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqcmVtb3ZlX3ZtX2FyZWEodm9pZCAqYWRkcik7CisKIGV4dGVybiBpbnQgbWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSwgcGdwcm90X3QgcHJvdCwKIAkJCXN0cnVjdCBwYWdlICoqKnBhZ2VzKTsKLWV4dGVybiB2b2lkIHVubWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSk7CitleHRlcm4gdm9pZCB1bm1hcF9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCiAvKgogICoJSW50ZXJuYWxzLiAgRG9udCd0IHVzZS4uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oIGIvaW5jbHVkZS9saW51eC92bXN0YXQuaAppbmRleCBkOTMyNWNmLi43NTM3MGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgSElHSE1FTV9aT05FKHh4KQogI2VuZGlmCiAKLSNkZWZpbmUgRk9SX0FMTF9aT05FUyh4eCkgRE1BX1pPTkUoeHgpIERNQTMyX1pPTkUoeHgpIHh4IyNfTk9STUFMIEhJR0hNRU1fWk9ORSh4eCkKKyNkZWZpbmUgRk9SX0FMTF9aT05FUyh4eCkgRE1BX1pPTkUoeHgpIERNQTMyX1pPTkUoeHgpIHh4IyNfTk9STUFMIEhJR0hNRU1fWk9ORSh4eCkgLCB4eCMjX01PVkFCTEUKIAogZW51bSB2bV9ldmVudF9pdGVtIHsgUEdQR0lOLCBQR1BHT1VULCBQU1dQSU4sIFBTV1BPVVQsCiAJCUZPUl9BTExfWk9ORVMoUEdBTExPQyksCkBAIC0xNzAsNyArMTcwLDggQEAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCQl6b25lX3BhZ2Vfc3RhdGUoJnpvbmVzW1pPTkVfSElHSE1FTV0sIGl0ZW0pICsKICNlbmRpZgotCQl6b25lX3BhZ2Vfc3RhdGUoJnpvbmVzW1pPTkVfTk9STUFMXSwgaXRlbSk7CisJCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9OT1JNQUxdLCBpdGVtKSArCisJCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9NT1ZBQkxFXSwgaXRlbSk7CiB9CiAKIGV4dGVybiB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZWxpc3QgKiwgc3RydWN0IHpvbmUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Z0X2tlcm4uaCBiL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCmluZGV4IGQ5NjE2MzUuLjY5OWI3ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCisrKyBiL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCkBAIC03NSw2ICs3NSw4IEBACiBpbnQgdnRfd2FpdGFjdGl2ZShpbnQgdnQpOwogdm9pZCBjaGFuZ2VfY29uc29sZShzdHJ1Y3QgdmNfZGF0YSAqbmV3X3ZjKTsKIHZvaWQgcmVzZXRfdmMoc3RydWN0IHZjX2RhdGEgKnZjKTsKK2V4dGVybiBpbnQgdW5iaW5kX2Nvbl9kcml2ZXIoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3csIGludCBmaXJzdCwgaW50IGxhc3QsCisJCQkgICAgIGludCBkZWZsdCk7CiAKIC8qCiAgKiB2Y19zY3JlZW4uYyBzaGFyZXMgdGhpcyB0ZW1wb3JhcnkgYnVmZmVyIHdpdGggdGhlIGNvbnNvbGUgd3JpdGUgY29kZSBzbyB0aGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCBjZTA3MTlhLi5jZTZiYWRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTE0OCw3ICsxNDgsNyBAQAogZXh0ZXJuIHZvaWQgaW5pdF93b3JrcXVldWVzKHZvaWQpOwogaW50IGV4ZWN1dGVfaW5fcHJvY2Vzc19jb250ZXh0KHdvcmtfZnVuY190IGZuLCBzdHJ1Y3QgZXhlY3V0ZV93b3JrICopOwogCi1leHRlcm4gdm9pZCBjYW5jZWxfd29ya19zeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gaW50IGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyoKICAqIEtpbGwgb2ZmIGEgcGVuZGluZyBzY2hlZHVsZV9kZWxheWVkX3dvcmsoKS4gIE5vdGUgdGhhdCB0aGUgd29yayBjYWxsYmFjawpAQCAtMTY2LDE0ICsxNjYsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1leHRlcm4gdm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspOworZXh0ZXJuIGludCBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayk7CiAKLS8qIE9ic29sZXRlLiB1c2UgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygpICovCisvKiBPYnNvbGV0ZS4gdXNlIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygpICovCiBzdGF0aWMgaW5saW5lCiB2b2lkIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCiAJCQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCiB7Ci0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayh3b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMod29yayk7Cit9CisKKy8qIE9ic29sZXRlLiB1c2UgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCkgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyh3b3JrKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY20uaCBiL2luY2x1ZGUvbmV0L3NjbS5oCmluZGV4IDU2MzdkNWUuLjQyM2NiMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjbS5oCisrKyBiL2luY2x1ZGUvbmV0L3NjbS5oCkBAIC04LDcgKzgsNyBAQAogLyogV2VsbCwgd2Ugc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIGRlc2NyaXB0b3Igb3BlbgogICogdG8gYWNjZXB0IHBhc3NlZCBGRHMgOCkKICAqLwotI2RlZmluZSBTQ01fTUFYX0ZECShPUEVOX01BWC0xKQorI2RlZmluZSBTQ01fTUFYX0ZECTI1NQogCiBzdHJ1Y3Qgc2NtX2ZwX2xpc3QKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vdGdhZmIuaCBiL2luY2x1ZGUvdmlkZW8vdGdhZmIuaAppbmRleCAwM2QwZGJlLi43YmM1ZTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL3RnYWZiLmgKKysrIGIvaW5jbHVkZS92aWRlby90Z2FmYi5oCkBAIC0yMTYsNiArMjE2LDcgQEAKIAl1MzIgcGxsX2ZyZXE7CQkJLyogcGl4Y2xvY2sgaW4gbWh6ICovCiAJdTMyIGJpdHNfcGVyX3BpeGVsOwkJLyogYml0cyBwZXIgcGl4ZWwgKi8KIAl1MzIgc3luY19vbl9ncmVlbjsJCS8qIHNldCBpZiBzeW5jIGlzIG9uIGdyZWVuICovCisJdTMyIHBhbGV0dGVbMTZdOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggZDlkODc4YS4uZTIwNTY4MiAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMTIwLDE1ICsxMjAsNiBAQAogCSAgc2VjdGlvbiA2LjQgb2YgdGhlIExpbnV4IFByb2dyYW1tZXIncyBHdWlkZSwgYXZhaWxhYmxlIGZyb20KIAkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2d1aWRlcy5odG1sPi4KIAotY29uZmlnIElQQ19OUwotCWJvb2wgIklQQyBOYW1lc3BhY2VzIgotCWRlcGVuZHMgb24gU1lTVklQQwotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFN1cHBvcnQgaXBjIG5hbWVzcGFjZXMuICBUaGlzIGFsbG93cyBjb250YWluZXJzLCBpLmUuIHZpcnR1YWwKLQkgIGVudmlyb25tZW50cywgdG8gdXNlIGlwYyBuYW1lc3BhY2VzIHRvIHByb3ZpZGUgZGlmZmVyZW50IGlwYwotCSAgb2JqZWN0cyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgU1lTVklQQ19TWVNDVEwKIAlib29sCiAJZGVwZW5kcyBvbiBTWVNWSVBDCkBAIC0yMTgsMTMgKzIwOSwxNCBAQAogCiAJICBTYXkgTiBpZiB1bnN1cmUuCiAKLWNvbmZpZyBVVFNfTlMKLQlib29sICJVVFMgTmFtZXNwYWNlcyIKK2NvbmZpZyBVU0VSX05TCisJYm9vbCAiVXNlciBOYW1lc3BhY2VzIChFWFBFUklNRU5UQUwpIgogCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAotCSAgU3VwcG9ydCB1dHMgbmFtZXNwYWNlcy4gIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4KLQkgIHZzZXJ2ZXJzLCB0byB1c2UgdXRzIG5hbWVzcGFjZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQKLQkgIHV0cyBpbmZvIGZvciBkaWZmZXJlbnQgc2VydmVycy4gIElmIHVuc3VyZSwgc2F5IE4uCisJICBTdXBwb3J0IHVzZXIgbmFtZXNwYWNlcy4gIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4KKwkgIHZzZXJ2ZXJzLCB0byB1c2UgdXNlciBuYW1lc3BhY2VzIHRvIHByb3ZpZGUgZGlmZmVyZW50CisJICB1c2VyIGluZm8gZm9yIGRpZmZlcmVudCBzZXJ2ZXJzLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIEFVRElUCiAJYm9vbCAiQXVkaXRpbmcgc3VwcG9ydCIKQEAgLTU1NCw3ICs1NDYsNyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIkNob29zZSBTTEFCIGFsbG9jYXRvciIKLQlkZWZhdWx0IFNMQUIKKwlkZWZhdWx0IFNMVUIKIAloZWxwCiAJICAgVGhpcyBvcHRpb24gYWxsb3dzIHRvIHNlbGVjdCBhIHNsYWIgYWxsb2NhdG9yLgogCkBAIC01NzYsNyArNTY4LDcgQEAKIAkgICBhbmQgaGFzIGVuaGFuY2VkIGRpYWdub3N0aWNzLgogCiBjb25maWcgU0xPQgotCWRlcGVuZHMgb24gRU1CRURERUQgJiYgIVNQQVJTRU1FTQorCWRlcGVuZHMgb24gRU1CRURERUQKIAlib29sICJTTE9CIChTaW1wbGUgQWxsb2NhdG9yKSIKIAloZWxwCiAJICAgU0xPQiByZXBsYWNlcyB0aGUgU0xBQiBhbGxvY2F0b3Igd2l0aCBhIGRyYXN0aWNhbGx5IHNpbXBsZXIKQEAgLTYwMiw5ICs1OTQsNyBAQAogCWRlZmF1bHQgMCBpZiBCQVNFX0ZVTEwKIAlkZWZhdWx0IDEgaWYgIUJBU0VfRlVMTAogCi1tZW51ICJMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydCIKLQotY29uZmlnIE1PRFVMRVMKK21lbnVjb25maWcgTU9EVUxFUwogCWJvb2wgIkVuYWJsZSBsb2FkYWJsZSBtb2R1bGUgc3VwcG9ydCIKIAloZWxwCiAJICBLZXJuZWwgbW9kdWxlcyBhcmUgc21hbGwgcGllY2VzIG9mIGNvbXBpbGVkIGNvZGUgd2hpY2ggY2FuCkBAIC02ODQsNiArNjc0LDUgQEAKIAlkZXBlbmRzIG9uIChTTVAgJiYgTU9EVUxFX1VOTE9BRCkgfHwgSE9UUExVR19DUFUKIAloZWxwCiAJICBOZWVkIHN0b3BfbWFjaGluZSgpIHByaW1pdGl2ZS4KLWVuZG1lbnUKIAogc291cmNlICJibG9jay9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKaW5kZXggNDZmZTQwNy4uNGVmYTFlNSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgYi9pbml0L2RvX21vdW50cy5jCkBAIC0yNSw2ICsyNSw3IEBACiBpbnQgcm9vdF9tb3VudGZsYWdzID0gTVNfUkRPTkxZIHwgTVNfU0lMRU5UOwogY2hhciAqIF9faW5pdGRhdGEgcm9vdF9kZXZpY2VfbmFtZTsKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgc2F2ZWRfcm9vdF9uYW1lWzY0XTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSByb290X3dhaXQ7CiAKIGRldl90IFJPT1RfREVWOwogCkBAIC0yMTYsNiArMjE3LDE2IEBACiAKIF9fc2V0dXAoInJvb3Q9Iiwgcm9vdF9kZXZfc2V0dXApOwogCitzdGF0aWMgaW50IF9faW5pdCByb290d2FpdF9zZXR1cChjaGFyICpzdHIpCit7CisJaWYgKCpzdHIpCisJCXJldHVybiAwOworCXJvb3Rfd2FpdCA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInJvb3R3YWl0Iiwgcm9vdHdhaXRfc2V0dXApOworCiBzdGF0aWMgY2hhciAqIF9faW5pdGRhdGEgcm9vdF9tb3VudF9kYXRhOwogc3RhdGljIGludCBfX2luaXQgcm9vdF9kYXRhX3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTQzOCwxMSArNDQ5LDIwIEBACiAJCQlyb290X2RldmljZV9uYW1lICs9IDU7CiAJfQogCi0JaXNfZmxvcHB5ID0gTUFKT1IoUk9PVF9ERVYpID09IEZMT1BQWV9NQUpPUjsKLQogCWlmIChpbml0cmRfbG9hZCgpKQogCQlnb3RvIG91dDsKIAorCS8qIHdhaXQgZm9yIGFueSBhc3luY2hyb25vdXMgc2Nhbm5pbmcgdG8gY29tcGxldGUgKi8KKwlpZiAoKFJPT1RfREVWID09IDApICYmIHJvb3Rfd2FpdCkgeworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciByb290IGRldmljZSAlcy4uLlxuIiwKKwkJCXNhdmVkX3Jvb3RfbmFtZSk7CisJCXdoaWxlIChkcml2ZXJfcHJvYmVfZG9uZSgpICE9IDAgfHwKKwkJCShST09UX0RFViA9IG5hbWVfdG9fZGV2X3Qoc2F2ZWRfcm9vdF9uYW1lKSkgPT0gMCkKKwkJCW1zbGVlcCgxMDApOworCX0KKworCWlzX2Zsb3BweSA9IE1BSk9SKFJPT1RfREVWKSA9PSBGTE9QUFlfTUFKT1I7CisKIAlpZiAoaXNfZmxvcHB5ICYmIHJkX2RvbG9hZCAmJiByZF9sb2FkX2Rpc2soMCkpCiAJCVJPT1RfREVWID0gUm9vdF9SQU0wOwogCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19pbml0cmQuYyBiL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCmluZGV4IGIyMjJjZTkuLmE2YjRjMGMgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCisrKyBiL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCkBAIC01NiwxMiArNTYsOSBAQAogCXN5c19jaHJvb3QoIi4iKTsKIAogCXBpZCA9IGtlcm5lbF90aHJlYWQoZG9fbGludXhyYywgIi9saW51eHJjIiwgU0lHQ0hMRCk7Ci0JaWYgKHBpZCA+IDApIHsKLQkJd2hpbGUgKHBpZCAhPSBzeXNfd2FpdDQoLTEsIE5VTEwsIDAsIE5VTEwpKSB7Ci0JCQl0cnlfdG9fZnJlZXplKCk7CisJaWYgKHBpZCA+IDApCisJCXdoaWxlIChwaWQgIT0gc3lzX3dhaXQ0KC0xLCBOVUxMLCAwLCBOVUxMKSkKIAkJCXlpZWxkKCk7Ci0JCX0KLQl9CiAKIAkvKiBtb3ZlIGluaXRyZCB0byByb290ZnMnIC9vbGQgKi8KIAlzeXNfZmNoZGlyKG9sZF9mZCk7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IDBlYjFjNzQuLmQzYmNiM2IgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC0xMzIsMjAgKzEzMiw5IEBACiBzdGF0aWMgY2hhciAqZXhlY3V0ZV9jb21tYW5kOwogc3RhdGljIGNoYXIgKnJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kOwogCisjaWZkZWYgQ09ORklHX1NNUAogLyogU2V0dXAgY29uZmlndXJlZCBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHRvIGFjdGl2YXRlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG1heF9jcHVzID0gTlJfQ1BVUzsKLQotLyoKLSAqIElmIHNldCwgdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBkcml2ZXJzIHRoYXQgcmVzZXQgdGhlIHVuZGVybHlpbmcKLSAqIGRldmljZSBiZWZvcmUgZ29pbmcgYWhlYWQgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gb3RoZXJ3aXNlIGRyaXZlciBtaWdodAotICogcmVseSBvbiB0aGUgQklPUyBhbmQgc2tpcCB0aGUgcmVzZXQgb3BlcmF0aW9uLgotICoKLSAqIFRoaXMgaXMgdXNlZnVsIGlmIGtlcm5lbCBpcyBib290aW5nIGluIGFuIHVucmVsaWFibGUgZW52aXJvbm1lbnQuCi0gKiBGb3IgZXguIGtkdW1wIHNpdHVhaXRvbiB3aGVyZSBwcmV2aW91cyBrZXJuZWwgaGFzIGNyYXNoZWQsIEJJT1MgaGFzIGJlZW4KLSAqIHNraXBwZWQgYW5kIGRldmljZXMgd2lsbCBiZSBpbiB1bmtub3duIHN0YXRlLgotICovCi11bnNpZ25lZCBpbnQgcmVzZXRfZGV2aWNlczsKLUVYUE9SVF9TWU1CT0wocmVzZXRfZGV2aWNlcyk7CitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgbWF4X2NwdXMgPSBOUl9DUFVTOwogCiAvKgogICogU2V0dXAgcm91dGluZSBmb3IgY29udHJvbGxpbmcgU01QIGFjdGl2YXRpb24KQEAgLTE2MCwxMCArMTQ5LDEwIEBACiBzdGF0aWMgaW50IF9faW5pdCBub3NtcChjaGFyICpzdHIpCiB7CiAJbWF4X2NwdXMgPSAwOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCi1fX3NldHVwKCJub3NtcCIsIG5vc21wKTsKK2Vhcmx5X3BhcmFtKCJub3NtcCIsIG5vc21wKTsKIAogc3RhdGljIGludCBfX2luaXQgbWF4Y3B1cyhjaGFyICpzdHIpCiB7CkBAIC0xNzIsNiArMTYxLDIxIEBACiB9CiAKIF9fc2V0dXAoIm1heGNwdXM9IiwgbWF4Y3B1cyk7CisjZWxzZQorI2RlZmluZSBtYXhfY3B1cyBOUl9DUFVTCisjZW5kaWYKKworLyoKKyAqIElmIHNldCwgdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBkcml2ZXJzIHRoYXQgcmVzZXQgdGhlIHVuZGVybHlpbmcKKyAqIGRldmljZSBiZWZvcmUgZ29pbmcgYWhlYWQgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gb3RoZXJ3aXNlIGRyaXZlciBtaWdodAorICogcmVseSBvbiB0aGUgQklPUyBhbmQgc2tpcCB0aGUgcmVzZXQgb3BlcmF0aW9uLgorICoKKyAqIFRoaXMgaXMgdXNlZnVsIGlmIGtlcm5lbCBpcyBib290aW5nIGluIGFuIHVucmVsaWFibGUgZW52aXJvbm1lbnQuCisgKiBGb3IgZXguIGtkdW1wIHNpdHVhaXRvbiB3aGVyZSBwcmV2aW91cyBrZXJuZWwgaGFzIGNyYXNoZWQsIEJJT1MgaGFzIGJlZW4KKyAqIHNraXBwZWQgYW5kIGRldmljZXMgd2lsbCBiZSBpbiB1bmtub3duIHN0YXRlLgorICovCit1bnNpZ25lZCBpbnQgcmVzZXRfZGV2aWNlczsKK0VYUE9SVF9TWU1CT0wocmVzZXRfZGV2aWNlcyk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldF9yZXNldF9kZXZpY2VzKGNoYXIgKnN0cikKIHsKQEAgLTM4NSw2ICszODksMTAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCisjaWZuZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCWNwdV9wb3NzaWJsZV9tYXAgPSBjcHVfcHJlc2VudF9tYXA7CisjZW5kaWYKKwogCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBkb25lIGluIHVzZXJzcGFjZSAtLVJSICovCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCWlmIChudW1fb25saW5lX2NwdXMoKSA+PSBtYXhfY3B1cykKQEAgLTQ1Myw3ICs0NjEsMTAgQEAKIAlzdHJ1Y3Qgb2JzX2tlcm5lbF9wYXJhbSAqcDsKIAogCWZvciAocCA9IF9fc2V0dXBfc3RhcnQ7IHAgPCBfX3NldHVwX2VuZDsgcCsrKSB7Ci0JCWlmIChwLT5lYXJseSAmJiBzdHJjbXAocGFyYW0sIHAtPnN0cikgPT0gMCkgeworCQlpZiAoKHAtPmVhcmx5ICYmIHN0cmNtcChwYXJhbSwgcC0+c3RyKSA9PSAwKSB8fAorCQkgICAgKHN0cmNtcChwYXJhbSwgImNvbnNvbGUiKSA9PSAwICYmCisJCSAgICAgc3RyY21wKHAtPnN0ciwgImVhcmx5Y29uIikgPT0gMCkKKwkJKSB7CiAJCQlpZiAocC0+c2V0dXBfZnVuYyh2YWwpICE9IDApCiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCSAgICAgICAiTWFsZm9ybWVkIGVhcmx5IG9wdGlvbiAnJXMnXG4iLCBwYXJhbSk7CkBAIC01MjYsNiArNTM3LDEwIEBACiAJc2V0dXBfYXJjaCgmY29tbWFuZF9saW5lKTsKIAlzZXR1cF9jb21tYW5kX2xpbmUoY29tbWFuZF9saW5lKTsKIAl1bndpbmRfc2V0dXAoKTsKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJaWYgKG1heF9jcHVzIDwgMikKKwkJY3B1X3Bvc3NpYmxlX21hcCA9IGNwdV9vbmxpbmVfbWFwOworI2VuZGlmCiAJc2V0dXBfcGVyX2NwdV9hcmVhcygpOwogCXNtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7CS8qIGFyY2gtc3BlY2lmaWMgYm9vdC1jcHUgaG9va3MgKi8KIApAQCAtNzI1LDYgKzc0MCwxNSBAQAogCWRvX2luaXRjYWxscygpOwogfQogCitzdGF0aWMgaW50IF9faW5pdGRhdGEgbm9zb2Z0bG9ja3VwOworCitzdGF0aWMgaW50IF9faW5pdCBub3NvZnRsb2NrdXBfc2V0dXAoY2hhciAqc3RyKQoreworCW5vc29mdGxvY2t1cCA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub3NvZnRsb2NrdXAiLCBub3NvZnRsb2NrdXBfc2V0dXApOworCiBzdGF0aWMgdm9pZCBfX2luaXQgZG9fcHJlX3NtcF9pbml0Y2FsbHModm9pZCkKIHsKIAlleHRlcm4gaW50IHNwYXduX2tzb2Z0aXJxZCh2b2lkKTsKQEAgLTczNCw3ICs3NTgsOCBAQAogCW1pZ3JhdGlvbl9pbml0KCk7CiAjZW5kaWYKIAlzcGF3bl9rc29mdGlycWQoKTsKLQlzcGF3bl9zb2Z0bG9ja3VwX3Rhc2soKTsKKwlpZiAoIW5vc29mdGxvY2t1cCkKKwkJc3Bhd25fc29mdGxvY2t1cF90YXNrKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ1bl9pbml0X3Byb2Nlc3MoY2hhciAqaW5pdF9maWxlbmFtZSkKZGlmZiAtLWdpdCBhL2lwYy9tc2cuYyBiL2lwYy9tc2cuYwppbmRleCBhMzg4ODI0Li5jYmQyN2U1IDEwMDY0NAotLS0gYS9pcGMvbXNnLmMKKysrIGIvaXBjL21zZy5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgaW50IHN5c3ZpcGNfbXNnX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0KTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2lwY19pbml0IF9fbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQorc3RhdGljIHZvaWQgX19tc2dfaW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCiB7CiAJbnMtPmlkc1tJUENfTVNHX0lEU10gPSBpZHM7CiAJbnMtPm1zZ19jdGxtYXggPSBNU0dNQVg7CkBAIC05Niw3ICs5Niw2IEBACiAJaXBjX2luaXRfaWRzKGlkcywgbnMtPm1zZ19jdGxtbmkpOwogfQogCi0jaWZkZWYgQ09ORklHX0lQQ19OUwogaW50IG1zZ19pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKIAlzdHJ1Y3QgaXBjX2lkcyAqaWRzOwpAQCAtMTI4LDcgKzEyNyw2IEBACiAJa2ZyZWUobnMtPmlkc1tJUENfTVNHX0lEU10pOwogCW5zLT5pZHNbSVBDX01TR19JRFNdID0gTlVMTDsKIH0KLSNlbmRpZgogCiB2b2lkIF9faW5pdCBtc2dfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IDk5NjRiMjIuLjg5YmZkZmYgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogI2RlZmluZSBzY19zZW1vcG0Jc2VtX2N0bHNbMl0KICNkZWZpbmUgc2Nfc2VtbW5pCXNlbV9jdGxzWzNdCiAKLXN0YXRpYyB2b2lkIF9faXBjX2luaXQgX19zZW1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCitzdGF0aWMgdm9pZCBfX3NlbV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKIHsKIAlucy0+aWRzW0lQQ19TRU1fSURTXSA9IGlkczsKIAlucy0+c2Nfc2VtbXNsID0gU0VNTVNMOwpAQCAtMTMyLDcgKzEzMiw2IEBACiAJaXBjX2luaXRfaWRzKGlkcywgbnMtPnNjX3NlbW1uaSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBpbnQgc2VtX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewogCXN0cnVjdCBpcGNfaWRzICppZHM7CkBAIC0xNjQsNyArMTYzLDYgQEAKIAlrZnJlZShucy0+aWRzW0lQQ19TRU1fSURTXSk7CiAJbnMtPmlkc1tJUENfU0VNX0lEU10gPSBOVUxMOwogfQotI2VuZGlmCiAKIHZvaWQgX19pbml0IHNlbV9pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDA4NTJmMjAuLjI0MmMzZjYgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTc3LDcgKzc3LDcgQEAKIHN0YXRpYyBpbnQgc3lzdmlwY19zaG1fcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpOwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faXBjX2luaXQgX19zaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCitzdGF0aWMgdm9pZCBfX3NobV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKIHsKIAlucy0+aWRzW0lQQ19TSE1fSURTXSA9IGlkczsKIAlucy0+c2htX2N0bG1heCA9IFNITU1BWDsKQEAgLTk4LDcgKzk4LDYgQEAKIAkJc2htX2Rlc3Ryb3kobnMsIHNocCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBpbnQgc2htX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewogCXN0cnVjdCBpcGNfaWRzICppZHM7CkBAIC0xMzAsNyArMTI5LDYgQEAKIAlrZnJlZShucy0+aWRzW0lQQ19TSE1fSURTXSk7CiAJbnMtPmlkc1tJUENfU0hNX0lEU10gPSBOVUxMOwogfQotI2VuZGlmCiAKIHZvaWQgX19pbml0IHNobV9pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuYyBiL2lwYy91dGlsLmMKaW5kZXggNzUzNmE3Mi4uNDRlNTEzNSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuYworKysgYi9pcGMvdXRpbC5jCkBAIC01MCw3ICs1MCw2IEBACiAJfSwKIH07CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBzdGF0aWMgc3RydWN0IGlwY19uYW1lc3BhY2UgKmNsb25lX2lwY19ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqb2xkX25zKQogewogCWludCBlcnI7CkBAIC0xMTAsMTQgKzEwOSw2IEBACiAJc2htX2V4aXRfbnMobnMpOwogCWtmcmVlKG5zKTsKIH0KLSNlbHNlCi1zdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY29weV9pcGNzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKLXsKLQlpZiAoZmxhZ3MgJiBDTE9ORV9ORVdJUEMpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCXJldHVybiBuczsKLX0KLSNlbmRpZgogCiAvKioKICAqCWlwY19pbml0CS0JaW5pdGlhbGlzZSBJUEMgc3Vic3lzdGVtCkBAIC0xNDUsNyArMTM2LDcgQEAKICAqCWFycmF5IGl0c2VsZi4gCiAgKi8KICAKLXZvaWQgX19pcGNfaW5pdCBpcGNfaW5pdF9pZHMoc3RydWN0IGlwY19pZHMqIGlkcywgaW50IHNpemUpCit2b2lkIGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyogaWRzLCBpbnQgc2l6ZSkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggZTNhYTJjNS4uMzMzZTg5MSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC00MSwxMiArNDEsOCBAQAogfTsKIAogc3RydWN0IHNlcV9maWxlOwotI2lmZGVmIENPTkZJR19JUENfTlMKLSNkZWZpbmUgX19pcGNfaW5pdAotI2Vsc2UKLSNkZWZpbmUgX19pcGNfaW5pdAlfX2luaXQKLSNlbmRpZgotdm9pZCBfX2lwY19pbml0IGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyAqaWRzLCBpbnQgc2l6ZSk7CisKK3ZvaWQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzICppZHMsIGludCBzaXplKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogdm9pZCBfX2luaXQgaXBjX2luaXRfcHJvY19pbnRlcmZhY2UoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqaGVhZGVyLAogCQlpbnQgaWRzLCBpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNjQyZDQyNy4uMmE5OTk4MyAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtNCwxMSArNCwxMiBAQAogCiBvYmoteSAgICAgPSBzY2hlZC5vIGZvcmsubyBleGVjX2RvbWFpbi5vIHBhbmljLm8gcHJpbnRrLm8gcHJvZmlsZS5vIFwKIAkgICAgZXhpdC5vIGl0aW1lci5vIHRpbWUubyBzb2Z0aXJxLm8gcmVzb3VyY2UubyBcCi0JICAgIHN5c2N0bC5vIGNhcGFiaWxpdHkubyBwdHJhY2UubyB0aW1lci5vIHVzZXIubyBcCisJICAgIHN5c2N0bC5vIGNhcGFiaWxpdHkubyBwdHJhY2UubyB0aW1lci5vIHVzZXIubyB1c2VyX25hbWVzcGFjZS5vIFwKIAkgICAgc2lnbmFsLm8gc3lzLm8ga21vZC5vIHdvcmtxdWV1ZS5vIHBpZC5vIFwKIAkgICAgcmN1cGRhdGUubyBleHRhYmxlLm8gcGFyYW1zLm8gcG9zaXgtdGltZXJzLm8gXAogCSAgICBrdGhyZWFkLm8gd2FpdC5vIGtmaWZvLm8gc3lzX25pLm8gcG9zaXgtY3B1LXRpbWVycy5vIG11dGV4Lm8gXAotCSAgICBocnRpbWVyLm8gcndzZW0ubyBsYXRlbmN5Lm8gbnNwcm94eS5vIHNyY3UubyBkaWVfbm90aWZpZXIubworCSAgICBocnRpbWVyLm8gcndzZW0ubyBsYXRlbmN5Lm8gbnNwcm94eS5vIHNyY3UubyBkaWVfbm90aWZpZXIubyBcCisJICAgIHV0c25hbWUubwogCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkgKz0gc3RhY2t0cmFjZS5vCiBvYmoteSArPSB0aW1lLwpAQCAtNDgsNyArNDksNiBAQAogb2JqLSQoQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QpICs9IHJjdXRvcnR1cmUubwogb2JqLSQoQ09ORklHX1JFTEFZKSArPSByZWxheS5vCiBvYmotJChDT05GSUdfU1lTQ1RMKSArPSB1dHNuYW1lX3N5c2N0bC5vCi1vYmotJChDT05GSUdfVVRTX05TKSArPSB1dHNuYW1lLm8KIG9iai0kKENPTkZJR19UQVNLX0RFTEFZX0FDQ1QpICs9IGRlbGF5YWNjdC5vCiBvYmotJChDT05GSUdfVEFTS1NUQVRTKSArPSB0YXNrc3RhdHMubyB0c2FjY3QubwogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IGQxMzI3NmQuLmViMGY5MTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC01OCw2ICs1OCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VsaW51eC5oPgogI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAKICNpbmNsdWRlICJhdWRpdC5oIgogCkBAIC0zOTEsNiArMzkyLDcgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZhdWRpdF9za2JfcXVldWUpOwogCQl3YWtlX3VwKCZhdWRpdF9iYWNrbG9nX3dhaXQpOwpAQCAtNDIzLDYgKzQyNSwzMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF1ZGl0X3ByZXBhcmVfdXNlcl90dHkocGlkX3QgcGlkLCB1aWRfdCBsb2dpbnVpZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwlpbnQgZXJyOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl0c2sgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJZXJyID0gLUVTUkNIOworCWlmICghdHNrKQorCQlnb3RvIG91dDsKKwllcnIgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIXRzay0+c2lnbmFsLT5hdWRpdF90dHkpCisJCWVyciA9IC1FUEVSTTsKKwlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0dHlfYXVkaXRfcHVzaF90YXNrKHRzaywgbG9naW51aWQpOworb3V0OgorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgYXVkaXRfc2VuZF9saXN0KHZvaWQgKl9kZXN0KQogewogCXN0cnVjdCBhdWRpdF9uZXRsaW5rX2xpc3QgKmRlc3QgPSBfZGVzdDsKQEAgLTUxMSw2ICs1MzgsOCBAQAogCWNhc2UgQVVESVRfREVMOgogCWNhc2UgQVVESVRfREVMX1JVTEU6CiAJY2FzZSBBVURJVF9TSUdOQUxfSU5GTzoKKwljYXNlIEFVRElUX1RUWV9HRVQ6CisJY2FzZSBBVURJVF9UVFlfU0VUOgogCQlpZiAoc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX0FVRElUX0NPTlRST0wpKQogCQkJZXJyID0gLUVQRVJNOwogCQlicmVhazsKQEAgLTYyMiw2ICs2NTEsMTEgQEAKIAkJZXJyID0gYXVkaXRfZmlsdGVyX3VzZXIoJk5FVExJTktfQ0Ioc2tiKSwgbXNnX3R5cGUpOwogCQlpZiAoZXJyID09IDEpIHsKIAkJCWVyciA9IDA7CisJCQlpZiAobXNnX3R5cGUgPT0gQVVESVRfVVNFUl9UVFkpIHsKKwkJCQllcnIgPSBhdWRpdF9wcmVwYXJlX3VzZXJfdHR5KHBpZCwgbG9naW51aWQpOworCQkJCWlmIChlcnIpCisJCQkJCWJyZWFrOworCQkJfQogCQkJYWIgPSBhdWRpdF9sb2dfc3RhcnQoTlVMTCwgR0ZQX0tFUk5FTCwgbXNnX3R5cGUpOwogCQkJaWYgKGFiKSB7CiAJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwKQEAgLTYzOCw4ICs2NzIsMTcgQEAKIAkJCQkJCQkiIHN1Ymo9JXMiLCBjdHgpOwogCQkJCQlrZnJlZShjdHgpOwogCQkJCX0KLQkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG1zZz0nJS4xMDI0cyciLAotCQkJCQkgKGNoYXIgKilkYXRhKTsKKwkJCQlpZiAobXNnX3R5cGUgIT0gQVVESVRfVVNFUl9UVFkpCisJCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbXNnPSclLjEwMjRzJyIsCisJCQkJCQkJIChjaGFyICopZGF0YSk7CisJCQkJZWxzZSB7CisJCQkJCWludCBzaXplOworCisJCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbXNnPSIpOworCQkJCQlzaXplID0gbmxtc2dfbGVuKG5saCk7CisJCQkJCWF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZyhhYiwgc2l6ZSwKKwkJCQkJCQkJICAgIGRhdGEpOworCQkJCX0KIAkJCQlhdWRpdF9zZXRfcGlkKGFiLCBwaWQpOwogCQkJCWF1ZGl0X2xvZ19lbmQoYWIpOwogCQkJfQpAQCAtNzMwLDYgKzc3Myw0NSBAQAogCQkJCTAsIDAsIHNpZ19kYXRhLCBzaXplb2YoKnNpZ19kYXRhKSArIGxlbik7CiAJCWtmcmVlKHNpZ19kYXRhKTsKIAkJYnJlYWs7CisJY2FzZSBBVURJVF9UVFlfR0VUOiB7CisJCXN0cnVjdCBhdWRpdF90dHlfc3RhdHVzIHM7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCisJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJCXRzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJaWYgKCF0c2spCisJCQllcnIgPSAtRVNSQ0g7CisJCWVsc2UgeworCQkJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJCXMuZW5hYmxlZCA9IHRzay0+c2lnbmFsLT5hdWRpdF90dHkgIT0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJfQorCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCWF1ZGl0X3NlbmRfcmVwbHkoTkVUTElOS19DQihza2IpLnBpZCwgc2VxLCBBVURJVF9UVFlfR0VULCAwLCAwLAorCQkJCSAmcywgc2l6ZW9mKHMpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESVRfVFRZX1NFVDogeworCQlzdHJ1Y3QgYXVkaXRfdHR5X3N0YXR1cyAqczsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisKKwkJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKHN0cnVjdCBhdWRpdF90dHlfc3RhdHVzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzID0gZGF0YTsKKwkJaWYgKHMtPmVuYWJsZWQgIT0gMCAmJiBzLT5lbmFibGVkICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJdHNrID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCQlpZiAoIXRzaykKKwkJCWVyciA9IC1FU1JDSDsKKwkJZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQkJdHNrLT5zaWduYWwtPmF1ZGl0X3R0eSA9IHMtPmVuYWJsZWQgIT0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJfQorCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKQEAgLTExODUsNyArMTI2Nyw3IEBACiB9CiAKIC8qKgotICogYXVkaXRfbG9nX25fdW5zdHJ1c3RlZHN0cmluZyAtIGxvZyBhIHN0cmluZyB0aGF0IG1heSBjb250YWluIHJhbmRvbSBjaGFyYWN0ZXJzCisgKiBhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcgLSBsb2cgYSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiByYW5kb20gY2hhcmFjdGVycwogICogQGFiOiBhdWRpdF9idWZmZXIKICAqIEBsZW46IGxlbnRoIG9mIHN0cmluZyAobm90IGluY2x1ZGluZyB0cmFpbGluZyBudWxsKQogICogQHN0cmluZzogc3RyaW5nIHRvIGJlIGxvZ2dlZApAQCAtMTIwMSwyNSArMTI4MywyNCBAQAogY29uc3QgY2hhciAqYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBzaXplX3QgbGVuLAogCQkJCQljb25zdCBjaGFyICpzdHJpbmcpCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHN0cmluZzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOwogCi0Jd2hpbGUgKCpwKSB7CisJZm9yIChwID0gc3RyaW5nOyBwIDwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzdHJpbmcgKyBsZW4gJiYgKnA7IHArKykgewogCQlpZiAoKnAgPT0gJyInIHx8ICpwIDwgMHgyMSB8fCAqcCA+IDB4N2YpIHsKIAkJCWF1ZGl0X2xvZ19oZXgoYWIsIHN0cmluZywgbGVuKTsKIAkJCXJldHVybiBzdHJpbmcgKyBsZW4gKyAxOwogCQl9Ci0JCXArKzsKIAl9CiAJYXVkaXRfbG9nX25fc3RyaW5nKGFiLCBsZW4sIHN0cmluZyk7CiAJcmV0dXJuIHAgKyAxOwogfQogCiAvKioKLSAqIGF1ZGl0X2xvZ191bnN0cnVzdGVkc3RyaW5nIC0gbG9nIGEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gcmFuZG9tIGNoYXJhY3RlcnMKKyAqIGF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcgLSBsb2cgYSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiByYW5kb20gY2hhcmFjdGVycwogICogQGFiOiBhdWRpdF9idWZmZXIKICAqIEBzdHJpbmc6IHN0cmluZyB0byBiZSBsb2dnZWQKICAqCi0gKiBTYW1lIGFzIGF1ZGl0X2xvZ19uX3Vuc3RydXN0ZWRzdHJpbmcoKSwgZXhjZXB0IHRoYXQgc3RybGVuIGlzIHVzZWQgdG8KKyAqIFNhbWUgYXMgYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKCksIGV4Y2VwdCB0aGF0IHN0cmxlbiBpcyB1c2VkIHRvCiAgKiBkZXRlcm1pbmUgc3RyaW5nIGxlbmd0aC4KICAqLwogY29uc3QgY2hhciAqYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgY29uc3QgY2hhciAqc3RyaW5nKQpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmggYi9rZXJuZWwvYXVkaXQuaAppbmRleCA4MTVkNmY1Li45NTg3NzQzIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuaAorKysgYi9rZXJuZWwvYXVkaXQuaApAQCAtMTE1LDcgKzExNSw2IEBACiBleHRlcm4gdm9pZAkJICAgIGF1ZGl0X3NlbmRfcmVwbHkoaW50IHBpZCwgaW50IHNlcSwgaW50IHR5cGUsCiAJCQkJCSAgICAgaW50IGRvbmUsIGludCBtdWx0aSwKIAkJCQkJICAgICB2b2lkICpwYXlsb2FkLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZAkJICAgIGF1ZGl0X2xvZ19sb3N0KGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwogZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9wYW5pYyhjb25zdCBjaGFyICptZXNzYWdlKTsKIAogc3RydWN0IGF1ZGl0X25ldGxpbmtfbGlzdCB7CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRzYy5jIGIva2VybmVsL2F1ZGl0c2MuYwppbmRleCBlMzY0ODFlLi5iNzY0MGE1IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRzYy5jCisrKyBiL2tlcm5lbC9hdWRpdHNjLmMKQEAgLTcxLDkgKzcxLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYXVkaXRfZmlsdGVyX2xpc3RbXTsKIAotLyogTm8gc3lzY2FsbCBhdWRpdGluZyB3aWxsIHRha2UgcGxhY2UgdW5sZXNzIGF1ZGl0X2VuYWJsZWQgIT0gMC4gKi8KLWV4dGVybiBpbnQgYXVkaXRfZW5hYmxlZDsKLQogLyogQVVESVRfTkFNRVMgaXMgdGhlIG51bWJlciBvZiBzbG90cyB3ZSByZXNlcnZlIGluIHRoZSBhdWRpdF9jb250ZXh0CiAgKiBmb3Igc2F2aW5nIG5hbWVzIGZyb20gZ2V0bmFtZSgpLiAqLwogI2RlZmluZSBBVURJVF9OQU1FUyAgICAyMApAQCAtMjA0MCw3ICsyMDM3LDcgQEAKIAogLyoqCiAgKiBhdWRpdF9jb3JlX2R1bXBzIC0gcmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IHByb2Nlc3NlcyB0aGF0IGVuZCBhYm5vcm1hbGx5Ci0gKiBAc2lnOiBzaWduYWwgdmFsdWUKKyAqIEBzaWducjogc2lnbmFsIHZhbHVlCiAgKgogICogSWYgYSBwcm9jZXNzIGVuZHMgd2l0aCBhIGNvcmUgZHVtcCwgc29tZXRoaW5nIGZpc2h5IGlzIGdvaW5nIG9uIGFuZCB3ZQogICogc2hvdWxkIHJlY29yZCB0aGUgZXZlbnQgZm9yIGludmVzdGlnYXRpb24uCmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1c2V0LmMgYi9rZXJuZWwvY3B1c2V0LmMKaW5kZXggYzRkMTIzZi4uYjQ3OTZkOCAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtOTgxLDEwICs5ODEsMTAgQEAKIAkJbW1hcnJheSA9IGttYWxsb2MobnRhc2tzICogc2l6ZW9mKCptbWFycmF5KSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbW1hcnJheSkKIAkJCWdvdG8gZG9uZTsKLQkJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwkJLyogYmxvY2sgZm9yayAqLworCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwkJLyogYmxvY2sgZm9yayAqLwogCQlpZiAoYXRvbWljX3JlYWQoJmNzLT5jb3VudCkgPD0gbnRhc2tzKQogCQkJYnJlYWs7CQkJCS8qIGdvdCBlbm91Z2ggKi8KLQkJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CS8qIHRyeSBhZ2FpbiAqLworCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CQkvKiB0cnkgYWdhaW4gKi8KIAkJa2ZyZWUobW1hcnJheSk7CiAJfQogCkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogCQkJY29udGludWU7CiAJCW1tYXJyYXlbbisrXSA9IG1tOwogCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7Ci0Jd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCiAJLyoKIAkgKiBOb3cgdGhhdCB3ZSd2ZSBkcm9wcGVkIHRoZSB0YXNrbGlzdCBzcGlubG9jaywgd2UgY2FuCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBjYTZhMTFiLi5lOGFmOGQwIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrc3RhdHNfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpAQCAtMzg3LDYgKzM4OCwxMSBAQAogCSAqIHRoZXkgd291bGQgYmUgbG9ja2VkIGludG8gbWVtb3J5LgogCSAqLwogCWV4aXRfbW0oY3VycmVudCk7CisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGhhdmUgVElGX0ZSRUVaRSBzZXQgaWYgdGhlIHN5c3RlbS13aWRlIGhpYmVybmF0aW9uCisJICogb3Igc3VzcGVuZCB0cmFuc2l0aW9uIGJlZ2lucyByaWdodCBub3cuCisJICovCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlzZXRfc3BlY2lhbF9waWRzKDEsIDEpOwogCXByb2NfY2xlYXJfdHR5KGN1cnJlbnQpOwpAQCAtODU4LDYgKzg2NCwzNCBAQAogCQlyZWxlYXNlX3Rhc2sodHNrKTsKIH0KIAorI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS19VU0FHRQorc3RhdGljIHZvaWQgY2hlY2tfc3RhY2tfdXNhZ2Uodm9pZCkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvd193YXRlcl9sb2NrKTsKKwlzdGF0aWMgaW50IGxvd2VzdF90b19kYXRlID0gVEhSRUFEX1NJWkU7CisJdW5zaWduZWQgbG9uZyAqbiA9IGVuZF9vZl9zdGFjayhjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZyZWU7CisKKwl3aGlsZSAoKm4gPT0gMCkKKwkJbisrOworCWZyZWUgPSAodW5zaWduZWQgbG9uZyluIC0gKHVuc2lnbmVkIGxvbmcpZW5kX29mX3N0YWNrKGN1cnJlbnQpOworCisJaWYgKGZyZWUgPj0gbG93ZXN0X3RvX2RhdGUpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmbG93X3dhdGVyX2xvY2spOworCWlmIChmcmVlIDwgbG93ZXN0X3RvX2RhdGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogJWx1IGJ5dGVzICIKKwkJCQkibGVmdFxuIiwKKwkJCQljdXJyZW50LT5jb21tLCBmcmVlKTsKKwkJbG93ZXN0X3RvX2RhdGUgPSBmcmVlOworCX0KKwlzcGluX3VubG9jaygmbG93X3dhdGVyX2xvY2spOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19zdGFja191c2FnZSh2b2lkKSB7fQorI2VuZGlmCisKIGZhc3RjYWxsIE5PUkVUX1RZUEUgdm9pZCBkb19leGl0KGxvbmcgY29kZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CkBAIC05MzcsNiArOTcxLDggQEAKIAlpZiAodW5saWtlbHkodHNrLT5jb21wYXRfcm9idXN0X2xpc3QpKQogCQljb21wYXRfZXhpdF9yb2J1c3RfbGlzdCh0c2spOwogI2VuZGlmCisJaWYgKGdyb3VwX2RlYWQpCisJCXR0eV9hdWRpdF9leGl0KCk7CiAJaWYgKHVubGlrZWx5KHRzay0+YXVkaXRfY29udGV4dCkpCiAJCWF1ZGl0X2ZyZWUodHNrKTsKIApAQCAtOTQ5LDYgKzk4NSw3IEBACiAJZXhpdF9zZW0odHNrKTsKIAlfX2V4aXRfZmlsZXModHNrKTsKIAlfX2V4aXRfZnModHNrKTsKKwljaGVja19zdGFja191c2FnZSgpOwogCWV4aXRfdGhyZWFkKCk7CiAJY3B1c2V0X2V4aXQodHNrKTsKIAlleGl0X2tleXModHNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IGRhM2ExNTUuLmJhMzliZGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC04OTcsNiArODk4LDggQEAKIAl9CiAJYWNjdF9pbml0X3BhY2N0KCZzaWctPnBhY2N0KTsKIAorCXR0eV9hdWRpdF9mb3JrKHNpZyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIwLDcgKzkyMyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBuZXdfZmxhZ3MgPSBwLT5mbGFnczsKIAotCW5ld19mbGFncyAmPSB+KFBGX1NVUEVSUFJJViB8IFBGX05PRlJFRVpFKTsKKwluZXdfZmxhZ3MgJj0gflBGX1NVUEVSUFJJVjsKIAluZXdfZmxhZ3MgfD0gUEZfRk9SS05PRVhFQzsKIAlpZiAoIShjbG9uZV9mbGFncyAmIENMT05FX1BUUkFDRSkpCiAJCXAtPnB0cmFjZSA9IDA7CkBAIC05OTksNyArMTAwMiw3IEBACiAJaWYgKGF0b21pY19yZWFkKCZwLT51c2VyLT5wcm9jZXNzZXMpID49CiAJCQlwLT5zaWduYWwtPnJsaW1bUkxJTUlUX05QUk9DXS5ybGltX2N1cikgewogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgJiYgIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkgJiYKLQkJCQlwLT51c2VyICE9ICZyb290X3VzZXIpCisJCSAgICBwLT51c2VyICE9IGN1cnJlbnQtPm5zcHJveHktPnVzZXJfbnMtPnJvb3RfdXNlcikKIAkJCWdvdG8gYmFkX2ZvcmtfZnJlZTsKIAl9CiAKQEAgLTEwNTksNiArMTA2Miw4IEBACiAKIAlwLT5sb2NrX2RlcHRoID0gLTE7CQkvKiAtMSA9IG5vIGxvY2sgKi8KIAlkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSgmcC0+c3RhcnRfdGltZSk7CisJcC0+cmVhbF9zdGFydF90aW1lID0gcC0+c3RhcnRfdGltZTsKKwltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZwLT5yZWFsX3N0YXJ0X3RpbWUpOwogCXAtPnNlY3VyaXR5ID0gTlVMTDsKIAlwLT5pb19jb250ZXh0ID0gTlVMTDsKIAlwLT5pb193YWl0ID0gTlVMTDsKQEAgLTE2MDEsNyArMTYwNiw3IEBACiAJZXJyID0gLUVJTlZBTDsKIAlpZiAodW5zaGFyZV9mbGFncyAmIH4oQ0xPTkVfVEhSRUFEfENMT05FX0ZTfENMT05FX05FV05TfENMT05FX1NJR0hBTkR8CiAJCQkJQ0xPTkVfVk18Q0xPTkVfRklMRVN8Q0xPTkVfU1lTVlNFTXwKLQkJCQlDTE9ORV9ORVdVVFN8Q0xPTkVfTkVXSVBDKSkKKwkJCQlDTE9ORV9ORVdVVFN8Q0xPTkVfTkVXSVBDfENMT05FX05FV1VTRVIpKQogCQlnb3RvIGJhZF91bnNoYXJlX291dDsKIAogCWlmICgoZXJyID0gdW5zaGFyZV90aHJlYWQodW5zaGFyZV9mbGFncykpKQpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA0NTQ5MGJlLi41YzNmNDVkIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMTIxLDYgKzEyMSwyNCBAQAogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqZnV0ZXhfbW50OwogCiAvKgorICogVGFrZSBtbS0+bW1hcF9zZW0sIHdoZW4gZnV0ZXggaXMgc2hhcmVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmdXRleF9sb2NrX21tKHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQpCit7CisJaWYgKGZzaGFyZWQpCisJCWRvd25fcmVhZChmc2hhcmVkKTsKK30KKworLyoKKyAqIFJlbGVhc2UgbW0tPm1tYXBfc2VtLCB3aGVuIHRoZSBmdXRleCBpcyBzaGFyZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X3VubG9ja19tbShzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkKQoreworCWlmIChmc2hhcmVkKQorCQl1cF9yZWFkKGZzaGFyZWQpOworfQorCisvKgogICogV2UgaGFzaCBvbiB0aGUga2V5cyByZXR1cm5lZCBmcm9tIGdldF9mdXRleF9rZXkgKHNlZSBiZWxvdykuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhhc2hfZnV0ZXgodW5pb24gZnV0ZXhfa2V5ICprZXkpCkBAIC0yODcsNyArMzA1LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkcm9wX2Z1dGV4X2tleV9yZWZzKTsKIAotc3RhdGljIGlubGluZSBpbnQgZ2V0X2Z1dGV4X3ZhbHVlX2xvY2tlZCh1MzIgKmRlc3QsIHUzMiBfX3VzZXIgKmZyb20pCitzdGF0aWMgdTMyIGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiBfX3VzZXIgKnVhZGRyLCB1MzIgdXZhbCwgdTMyIG5ld3ZhbCkKK3sKKwl1MzIgY3VydmFsOworCisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKwljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgdXZhbCwgbmV3dmFsKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gY3VydmFsOworfQorCitzdGF0aWMgaW50IGdldF9mdXRleF92YWx1ZV9sb2NrZWQodTMyICpkZXN0LCB1MzIgX191c2VyICpmcm9tKQogewogCWludCByZXQ7CiAKQEAgLTYyMCw5ICs2NDksNyBAQAogCiAJCW5ld3ZhbCA9IEZVVEVYX1dBSVRFUlMgfCBuZXdfb3duZXItPnBpZDsKIAotCQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgdXZhbCwgbmV3dmFsKTsKLQkJcGFnZWZhdWx0X2VuYWJsZSgpOworCQljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgbmV3dmFsKTsKIAogCQlpZiAoY3VydmFsID09IC1FRkFVTFQpCiAJCQlyZXQgPSAtRUZBVUxUOwpAQCAtNjU5LDkgKzY4Niw3IEBACiAJICogVGhlcmUgaXMgbm8gd2FpdGVyLCBzbyB3ZSB1bmxvY2sgdGhlIGZ1dGV4LiBUaGUgb3duZXIgZGllZAogCSAqIGJpdCBoYXMgbm90IHRvIGJlIHByZXNlcnZlZCBoZXJlLiBXZSBhcmUgdGhlIG93bmVyOgogCSAqLwotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0Jb2xkdmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIHV2YWwsIDApOwotCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwlvbGR2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgMCk7CiAKIAlpZiAob2xkdmFsID09IC1FRkFVTFQpCiAJCXJldHVybiBvbGR2YWw7CkBAIC03MDAsOCArNzI1LDcgQEAKIAl1bmlvbiBmdXRleF9rZXkga2V5OwogCWludCByZXQ7CiAKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAma2V5KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtNzI1LDggKzc0OSw3IEBACiAKIAlzcGluX3VubG9jaygmaGItPmxvY2spOwogb3V0OgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NDYsOCArNzY5LDcgQEAKIAlpbnQgcmV0LCBvcF9yZXQsIGF0dGVtcHQgPSAwOwogCiByZXRyeWZ1bGw6Ci0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZzaGFyZWQsICZrZXkxKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtNzkzLDcgKzgxNSw3IEBACiAJCSAqLwogCQlpZiAoYXR0ZW1wdCsrKSB7CiAJCQlyZXQgPSBmdXRleF9oYW5kbGVfZmF1bHQoKHVuc2lnbmVkIGxvbmcpdWFkZHIyLAotCQkJCQkJZnNoYXJlZCwgYXR0ZW1wdCk7CisJCQkJCQkgZnNoYXJlZCwgYXR0ZW1wdCk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gb3V0OwogCQkJZ290byByZXRyeTsKQEAgLTgwMyw4ICs4MjUsNyBAQAogCQkgKiBJZiB3ZSB3b3VsZCBoYXZlIGZhdWx0ZWQsIHJlbGVhc2UgbW1hcF9zZW0sCiAJCSAqIGZhdWx0IGl0IGluIGFuZCBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4KIAkJICovCi0JCWlmIChmc2hhcmVkKQotCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJCXJldCA9IGdldF91c2VyKGR1bW15LCB1YWRkcjIpOwogCQlpZiAocmV0KQpAQCAtODQxLDggKzg2Miw4IEBACiAJaWYgKGhiMSAhPSBoYjIpCiAJCXNwaW5fdW5sb2NrKCZoYjItPmxvY2spOwogb3V0OgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg2MSw4ICs4ODIsNyBAQAogCWludCByZXQsIGRyb3BfY291bnQgPSAwOwogCiAgcmV0cnk6Ci0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZzaGFyZWQsICZrZXkxKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtODkwLDggKzkxMCw3IEBACiAJCQkgKiBJZiB3ZSB3b3VsZCBoYXZlIGZhdWx0ZWQsIHJlbGVhc2UgbW1hcF9zZW0sIGZhdWx0CiAJCQkgKiBpdCBpbiBhbmQgc3RhcnQgYWxsIG92ZXIgYWdhaW4uCiAJCQkgKi8KLQkJCWlmIChmc2hhcmVkKQotCQkJCXVwX3JlYWQoZnNoYXJlZCk7CisJCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkJCXJldCA9IGdldF91c2VyKGN1cnZhbCwgdWFkZHIxKTsKIApAQCAtOTQ0LDggKzk2Myw3IEBACiAJCWRyb3BfZnV0ZXhfa2V5X3JlZnMoJmtleTEpOwogCiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMTMsMTAgKzExMzEsNyBAQAogCXdoaWxlICghcmV0KSB7CiAJCW5ld3ZhbCA9ICh1dmFsICYgRlVURVhfT1dORVJfRElFRCkgfCBuZXd0aWQ7CiAKLQkJcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQkJY3VydmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsCi0JCQkJCQkgICAgICAgdXZhbCwgbmV3dmFsKTsKLQkJcGFnZWZhdWx0X2VuYWJsZSgpOworCQljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgbmV3dmFsKTsKIAogCQlpZiAoY3VydmFsID09IC1FRkFVTFQpCiAJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMTEzNCw2ICsxMTQ5LDcgQEAKICNkZWZpbmUgQVJHM19TSEFSRUQgIDEKIAogc3RhdGljIGxvbmcgZnV0ZXhfd2FpdF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KTsKKwogc3RhdGljIGludCBmdXRleF93YWl0KHUzMiBfX3VzZXIgKnVhZGRyLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkLAogCQkgICAgICB1MzIgdmFsLCBrdGltZV90ICphYnNfdGltZSkKIHsKQEAgLTExNDgsOCArMTE2NCw3IEBACiAKIAlxLnBpX3N0YXRlID0gTlVMTDsKICByZXRyeToKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC0xMTg2LDggKzEyMDEsNyBAQAogCQkgKiBJZiB3ZSB3b3VsZCBoYXZlIGZhdWx0ZWQsIHJlbGVhc2UgbW1hcF9zZW0sIGZhdWx0IGl0IGluIGFuZAogCQkgKiBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4KIAkJICovCi0JCWlmIChmc2hhcmVkKQotCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIApAQCAtMTIwNiw4ICsxMjIwLDcgQEAKIAkgKiBOb3cgdGhlIGZ1dGV4IGlzIHF1ZXVlZCBhbmQgd2UgaGF2ZSBjaGVja2VkIHRoZSBkYXRhLCB3ZQogCSAqIGRvbid0IHdhbnQgdG8gaG9sZCBtbWFwX3NlbSB3aGlsZSB3ZSBzbGVlcC4KIAkgKi8KLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkvKgogCSAqIFRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBzY2hlZHVsaW5nIHNpbmNlIHRoZSBxdWV1ZV9tZSgpLCBhcyB3ZQpAQCAtMTI4NSw4ICsxMjk4LDcgQEAKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKIAogIG91dF9yZWxlYXNlX3NlbToKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTMzMyw4ICsxMzQ1LDcgQEAKIAogCXEucGlfc3RhdGUgPSBOVUxMOwogIHJldHJ5OgotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTEzNTMsOSArMTM2NCw3IEBACiAJICovCiAJbmV3dmFsID0gY3VycmVudC0+cGlkOwogCi0JcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgMCwgbmV3dmFsKTsKLQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIDAsIG5ld3ZhbCk7CiAKIAlpZiAodW5saWtlbHkoY3VydmFsID09IC1FRkFVTFQpKQogCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7CkBAIC0xMzk4LDkgKzE0MDcsNyBAQAogCQlsb2NrX3Rha2VuID0gMTsKIAl9CiAKLQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwotCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgbmV3dmFsKTsKIAogCWlmICh1bmxpa2VseShjdXJ2YWwgPT0gLUVGQVVMVCkpCiAJCWdvdG8gdWFkZHJfZmF1bHRlZDsKQEAgLTE0MjgsOCArMTQzNSw3IEBACiAJCQkgKiBleGl0IHRvIGNvbXBsZXRlLgogCQkJICovCiAJCQlxdWV1ZV91bmxvY2soJnEsIGhiKTsKLQkJCWlmIChmc2hhcmVkKQotCQkJCXVwX3JlYWQoZnNoYXJlZCk7CisJCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJCWdvdG8gcmV0cnk7CiAKQEAgLTE0NjUsOCArMTQ3MSw3IEBACiAJICogTm93IHRoZSBmdXRleCBpcyBxdWV1ZWQgYW5kIHdlIGhhdmUgY2hlY2tlZCB0aGUgZGF0YSwgd2UKIAkgKiBkb24ndCB3YW50IHRvIGhvbGQgbW1hcF9zZW0gd2hpbGUgd2Ugc2xlZXAuCiAJICovCi0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJV0FSTl9PTighcS5waV9zdGF0ZSk7CiAJLyoKQEAgLTE0ODAsOCArMTQ4NSw3IEBACiAJCXJldCA9IHJldCA/IDAgOiAtRVdPVUxEQkxPQ0s7CiAJfQogCi0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCXNwaW5fbG9jayhxLmxvY2tfcHRyKTsKIAogCWlmICghcmV0KSB7CkBAIC0xNTE4LDggKzE1MjIsNyBAQAogCiAJLyogVW5xdWV1ZSBhbmQgZHJvcCB0aGUgbG9jayAqLwogCXVucXVldWVfbWVfcGkoJnEpOwotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCXJldHVybiByZXQgIT0gLUVJTlRSID8gcmV0IDogLUVSRVNUQVJUTk9JTlRSOwogCkBAIC0xNTI3LDggKzE1MzAsNyBAQAogCXF1ZXVlX3VubG9jaygmcSwgaGIpOwogCiAgb3V0X3JlbGVhc2Vfc2VtOgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAlyZXR1cm4gcmV0OwogCiAgdWFkZHJfZmF1bHRlZDoKQEAgLTE1NTAsOCArMTU1Miw3IEBACiAJCWdvdG8gcmV0cnlfdW5sb2NrZWQ7CiAJfQogCi0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCWlmICghcmV0ICYmICh1dmFsICE9IC1FRkFVTFQpKQpAQCAtMTU4NSw4ICsxNTg2LDcgQEAKIAkvKgogCSAqIEZpcnN0IHRha2UgYWxsIHRoZSBmdXRleCByZWxhdGVkIGxvY2tzOgogCSAqLwotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZrZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC0xNjAxLDExICsxNjAxLDkgQEAKIAkgKiBhZ2Fpbi4gSWYgaXQgc3VjY2VlZHMgdGhlbiB3ZSBjYW4gcmV0dXJuIHdpdGhvdXQgd2FraW5nCiAJICogYW55b25lIGVsc2UgdXA6CiAJICovCi0JaWYgKCEodXZhbCAmIEZVVEVYX09XTkVSX0RJRUQpKSB7Ci0JCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JCXV2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgY3VycmVudC0+cGlkLCAwKTsKLQkJcGFnZWZhdWx0X2VuYWJsZSgpOwotCX0KKwlpZiAoISh1dmFsICYgRlVURVhfT1dORVJfRElFRCkpCisJCXV2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgY3VycmVudC0+cGlkLCAwKTsKKwogCiAJaWYgKHVubGlrZWx5KHV2YWwgPT0gLUVGQVVMVCkpCiAJCWdvdG8gcGlfZmF1bHRlZDsKQEAgLTE2NDcsOCArMTY0NSw3IEBACiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZoYi0+bG9jayk7CiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0dXJuIHJldDsKIApAQCAtMTY3MSw4ICsxNjY4LDcgQEAKIAkJZ290byByZXRyeV91bmxvY2tlZDsKIAl9CiAKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfdXNlcih1dmFsLCB1YWRkcik7CiAJaWYgKCFyZXQgJiYgKHV2YWwgIT0gLUVGQVVMVCkpCkBAIC0xNzI5LDggKzE3MjUsOCBAQAogCiAJaWYgKHByaW50a190aW1lZF9yYXRlbGltaXQoJnByaW50a19pbnRlcnZhbCwgNjAgKiA2MCAqIDEwMDApKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3MgYCVzJyB1c2VkIEZVVEVYX0ZELCB3aGljaCAiCi0JCSAgICAJIndpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwgaW4gSnVuZSAyMDA3XG4iLAotCQkJY3VycmVudC0+Y29tbSk7CisJCSAgICAgICAid2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBpbiBKdW5lIDIwMDdcbiIsCisJCSAgICAgICBjdXJyZW50LT5jb21tKTsKIAl9CiAKIAlyZXQgPSAtRUlOVkFMOwpAQCAtMTkwOCwxMCArMTkwNCw4IEBACiAJCSAqIFdha2Ugcm9idXN0IG5vbi1QSSBmdXRleGVzIGhlcmUuIFRoZSB3YWtldXAgb2YKIAkJICogUEkgZnV0ZXhlcyBoYXBwZW5zIGluIGV4aXRfcGlfc3RhdGUoKToKIAkJICovCi0JCWlmICghcGkpIHsKLQkJCWlmICh1dmFsICYgRlVURVhfV0FJVEVSUykKKwkJaWYgKCFwaSAmJiAodXZhbCAmIEZVVEVYX1dBSVRFUlMpKQogCQkJCWZ1dGV4X3dha2UodWFkZHIsICZjdXJyLT5tbS0+bW1hcF9zZW0sIDEpOwotCQl9CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKaW5kZXggMjNjMDNmNC4uNzJkMDM0MiAxMDA2NDQKLS0tIGEva2VybmVsL2hydGltZXIuYworKysgYi9rZXJuZWwvaHJ0aW1lci5jCkBAIC0xNDA2LDcgKzE0MDYsNyBAQAogc3RhdGljIGludCBfX2NwdWluaXQgaHJ0aW1lcl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKIAkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OworCXVuc2lnbmVkIGludCBjcHUgPSAobG9uZyloY3B1OwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9zcHVyaW91cy5jIGIva2VybmVsL2lycS9zcHVyaW91cy5jCmluZGV4IGJkOWUyNzIuLjMyYjE2MTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYworKysgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKQEAgLTE3Miw3ICsxNzIsMTcgQEAKIAkJICAgIGlycXJldHVybl90IGFjdGlvbl9yZXQpCiB7CiAJaWYgKHVubGlrZWx5KGFjdGlvbl9yZXQgIT0gSVJRX0hBTkRMRUQpKSB7Ci0JCWRlc2MtPmlycXNfdW5oYW5kbGVkKys7CisJCS8qCisJCSAqIElmIHdlIGFyZSBzZWVpbmcgb25seSB0aGUgb2RkIHNwdXJpb3VzIElSUSBjYXVzZWQgYnkKKwkJICogYnVzIGFzeW5jaHJvbmljaXR5IHRoZW4gZG9uJ3QgZXZlbnR1YWxseSB0cmlnZ2VyIGFuIGVycm9yLAorCQkgKiBvdGhlcndpc2UgdGhlIGNvdXRlciBiZWNvbWVzIGEgZG9vbXNkYXkgdGltZXIgZm9yIG90aGVyd2lzZQorCQkgKiB3b3JraW5nIHN5c3RlbXMKKwkJICovCisJCWlmIChqaWZmaWVzIC0gZGVzYy0+bGFzdF91bmhhbmRsZWQgPiBIWi8xMCkKKwkJCWRlc2MtPmlycXNfdW5oYW5kbGVkID0gMTsKKwkJZWxzZQorCQkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKKwkJZGVzYy0+bGFzdF91bmhhbmRsZWQgPSBqaWZmaWVzOwogCQlpZiAodW5saWtlbHkoYWN0aW9uX3JldCAhPSBJUlFfTk9ORSkpCiAJCQlyZXBvcnRfYmFkX2lycShpcnEsIGRlc2MsIGFjdGlvbl9yZXQpOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rYWxsc3ltcy5jIGIva2VybmVsL2thbGxzeW1zLmMKaW5kZXggZmVkNTQ0MS4uNDc0MjE5YSAxMDA2NDQKLS0tIGEva2VybmVsL2thbGxzeW1zLmMKKysrIGIva2VybmVsL2thbGxzeW1zLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogLyogTG9va3VwIHRoZSBhZGRyZXNzIGZvciB0aGlzIHN5bWJvbC4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4gKi8KIHVuc2lnbmVkIGxvbmcga2FsbHN5bXNfbG9va3VwX25hbWUoY29uc3QgY2hhciAqbmFtZSkKIHsKLQljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTl07CiAJdW5zaWduZWQgbG9uZyBpOwogCXVuc2lnbmVkIGludCBvZmY7CiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogewogCWNvbnN0IGNoYXIgKm1zeW07CiAKLQluYW1lYnVmW0tTWU1fTkFNRV9MRU5dID0gMDsKKwluYW1lYnVmW0tTWU1fTkFNRV9MRU4gLSAxXSA9IDA7CiAJbmFtZWJ1ZlswXSA9IDA7CiAKIAlpZiAoaXNfa3N5bV9hZGRyKGFkZHIpKSB7CkBAIC0yNjUsNyArMjY1LDcgQEAKIAkvKiBzZWUgaWYgaXQncyBpbiBhIG1vZHVsZSAqLwogCW1zeW0gPSBtb2R1bGVfYWRkcmVzc19sb29rdXAoYWRkciwgc3ltYm9sc2l6ZSwgb2Zmc2V0LCBtb2RuYW1lKTsKIAlpZiAobXN5bSkKLQkJcmV0dXJuIHN0cm5jcHkobmFtZWJ1ZiwgbXN5bSwgS1NZTV9OQU1FX0xFTik7CisJCXJldHVybiBzdHJuY3B5KG5hbWVidWYsIG1zeW0sIEtTWU1fTkFNRV9MRU4gLSAxKTsKIAogCXJldHVybiBOVUxMOwogfQpAQCAtMjczLDcgKzI3Myw3IEBACiBpbnQgbG9va3VwX3N5bWJvbF9uYW1lKHVuc2lnbmVkIGxvbmcgYWRkciwgY2hhciAqc3ltbmFtZSkKIHsKIAlzeW1uYW1lWzBdID0gJ1wwJzsKLQlzeW1uYW1lW0tTWU1fTkFNRV9MRU5dID0gJ1wwJzsKKwlzeW1uYW1lW0tTWU1fTkFNRV9MRU4gLSAxXSA9ICdcMCc7CiAKIAlpZiAoaXNfa3N5bV9hZGRyKGFkZHIpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcG9zOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCQl1bnNpZ25lZCBsb25nICpvZmZzZXQsIGNoYXIgKm1vZG5hbWUsIGNoYXIgKm5hbWUpCiB7CiAJbmFtZVswXSA9ICdcMCc7Ci0JbmFtZVtLU1lNX05BTUVfTEVOXSA9ICdcMCc7CisJbmFtZVtLU1lNX05BTUVfTEVOIC0gMV0gPSAnXDAnOwogCiAJaWYgKGlzX2tzeW1fYWRkcihhZGRyKSkgewogCQl1bnNpZ25lZCBsb25nIHBvczsKQEAgLTMxMiwxOCArMzEyLDE3IEBACiAJY2hhciAqbW9kbmFtZTsKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplOwotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOXTsKIAogCW5hbWUgPSBrYWxsc3ltc19sb29rdXAoYWRkcmVzcywgJnNpemUsICZvZmZzZXQsICZtb2RuYW1lLCBuYW1lYnVmKTsKIAlpZiAoIW5hbWUpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIjB4JWx4IiwgYWRkcmVzcyk7Ci0JZWxzZSB7Ci0JCWlmIChtb2RuYW1lKQotCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IFslc10iLCBuYW1lLCBvZmZzZXQsCisKKwlpZiAobW9kbmFtZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IFslc10iLCBuYW1lLCBvZmZzZXQsCiAJCQkJc2l6ZSwgbW9kbmFtZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzKyUjbHgvJSNseCIsIG5hbWUsIG9mZnNldCwgc2l6ZSk7Ci0JfQorCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IiwgbmFtZSwgb2Zmc2V0LCBzaXplKTsKIH0KIAogLyogTG9vayB1cCBhIGtlcm5lbCBzeW1ib2wgYW5kIHByaW50IGl0IHRvIHRoZSBrZXJuZWwgbWVzc2FnZXMuICovCkBAIC0zNDMsOCArMzQyLDggQEAKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCXVuc2lnbmVkIGludCBuYW1lb2ZmOyAvKiBJZiBpdGVyYXRpbmcgaW4gY29yZSBrZXJuZWwgc3ltYm9scyAqLwogCWNoYXIgdHlwZTsKLQljaGFyIG5hbWVbS1NZTV9OQU1FX0xFTisxXTsKLQljaGFyIG1vZHVsZV9uYW1lW01PRFVMRV9OQU1FX0xFTiArIDFdOworCWNoYXIgbmFtZVtLU1lNX05BTUVfTEVOXTsKKwljaGFyIG1vZHVsZV9uYW1lW01PRFVMRV9OQU1FX0xFTl07CiAJaW50IGV4cG9ydGVkOwogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2tmaWZvLmMgYi9rZXJuZWwva2ZpZm8uYwppbmRleCBjZWU0MTkxLi5iYzQxYWQwIDEwMDY0NAotLS0gYS9rZXJuZWwva2ZpZm8uYworKysgYi9rZXJuZWwva2ZpZm8uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogLyoqCiAgKiBrZmlmb19pbml0IC0gYWxsb2NhdGVzIGEgbmV3IEZJRk8gdXNpbmcgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyCkBAIC00MSw3ICs0Miw3IEBACiAJc3RydWN0IGtmaWZvICpmaWZvOwogCiAJLyogc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLwotCUJVR19PTihzaXplICYgKHNpemUgLSAxKSk7CisJQlVHX09OKCFpc19wb3dlcl9vZl8yKHNpemUpKTsKIAogCWZpZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2ZpZm8pLCBnZnBfbWFzayk7CiAJaWYgKCFmaWZvKQpkaWZmIC0tZ2l0IGEva2VybmVsL2t0aHJlYWQuYyBiL2tlcm5lbC9rdGhyZWFkLmMKaW5kZXggYmJkNTFiOC4uYTQwNGY3ZSAxMDA2NDQKLS0tIGEva2VybmVsL2t0aHJlYWQuYworKysgYi9rZXJuZWwva3RocmVhZC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIEVYUE9SVF9TWU1CT0woa3RocmVhZF9zdG9wKTsKIAogCi1zdGF0aWMgX19pbml0IHZvaWQga3RocmVhZGRfc2V0dXAodm9pZCkKK3N0YXRpYyBub2lubGluZSBfX2luaXRfcmVmb2sgdm9pZCBrdGhyZWFkZF9zZXR1cCh2b2lkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggMWE1ZmYyMi4uZWRiYTJmZiAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0zNzksNyArMzc5LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfbG9ja19uYW1lKHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcykKIHsKLQljaGFyIHN0cltLU1lNX05BTUVfTEVOICsgMV0sIGMxLCBjMiwgYzMsIGM0OworCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU5dLCBjMSwgYzIsIGMzLCBjNDsKIAljb25zdCBjaGFyICpuYW1lOwogCiAJZ2V0X3VzYWdlX2NoYXJzKGNsYXNzLCAmYzEsICZjMiwgJmMzLCAmYzQpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiBzdGF0aWMgdm9pZCBwcmludF9sb2NrZGVwX2NhY2hlKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaykKIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU4gKyAxXTsKKwljaGFyIHN0cltLU1lNX05BTUVfTEVOXTsKIAogCW5hbWUgPSBsb2NrLT5uYW1lOwogCWlmICghbmFtZSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCAwMTVkNjBjLi4zM2MwNGFkIDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC02MSwxMCArNjEsOCBAQAogLyogSWYgdGhpcyBpcyBzZXQsIHRoZSBzZWN0aW9uIGJlbG9uZ3MgaW4gdGhlIGluaXQgcGFydCBvZiB0aGUgbW9kdWxlICovCiAjZGVmaW5lIElOSVRfT0ZGU0VUX01BU0sgKDFVTCA8PCAoQklUU19QRVJfTE9ORy0xKSkKIAotLyogUHJvdGVjdHMgbW9kdWxlIGxpc3QgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobW9kbGlzdF9sb2NrKTsKLQotLyogTGlzdCBvZiBtb2R1bGVzLCBwcm90ZWN0ZWQgYnkgbW9kdWxlX211dGV4IEFORCBtb2RsaXN0X2xvY2sgKi8KKy8qIExpc3Qgb2YgbW9kdWxlcywgcHJvdGVjdGVkIGJ5IG1vZHVsZV9tdXRleCBvciBwcmVlbXB0X2Rpc2FibGUKKyAqIChhZGQvZGVsZXRlIHVzZXMgc3RvcF9tYWNoaW5lKS4gKi8KIHN0YXRpYyBERUZJTkVfTVVURVgobW9kdWxlX211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQobW9kdWxlcyk7CiAKQEAgLTc2MCwxNCArNzU4LDEzIEBACiB2b2lkIF9fc3ltYm9sX3B1dChjb25zdCBjaGFyICpzeW1ib2wpCiB7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAljb25zdCB1bnNpZ25lZCBsb25nICpjcmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJaWYgKCFfX2ZpbmRfc3ltYm9sKHN5bWJvbCwgJm93bmVyLCAmY3JjLCAxKSkKIAkJQlVHKCk7CiAJbW9kdWxlX3B1dChvd25lcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0woX19zeW1ib2xfcHV0KTsKIApAQCAtMTIyOCwxNCArMTIyNSwxNCBAQAogdm9pZCAqX19zeW1ib2xfZ2V0KGNvbnN0IGNoYXIgKnN5bWJvbCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQl1bnNpZ25lZCBsb25nIHZhbHVlLCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmNyYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAl2YWx1ZSA9IF9fZmluZF9zeW1ib2woc3ltYm9sLCAmb3duZXIsICZjcmMsIDEpOwogCWlmICh2YWx1ZSAmJiAhc3Ryb25nX3RyeV9tb2R1bGVfZ2V0KG93bmVyKSkKIAkJdmFsdWUgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlyZXR1cm4gKHZvaWQgKil2YWx1ZTsKIH0KQEAgLTIxMzYsNyArMjEzMyw3IEBACiAJCQlzeW0gPSBnZXRfa3N5bWJvbChtb2QsIGFkZHIsIE5VTEwsIE5VTEwpOwogCQkJaWYgKCFzeW0pCiAJCQkJZ290byBvdXQ7Ci0JCQlzdHJsY3B5KHN5bW5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTiArIDEpOworCQkJc3RybGNweShzeW1uYW1lLCBzeW0sIEtTWU1fTkFNRV9MRU4pOwogCQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIxNjEsOSArMjE1OCw5IEBACiAJCQlpZiAoIXN5bSkKIAkJCQlnb3RvIG91dDsKIAkJCWlmIChtb2RuYW1lKQotCQkJCXN0cmxjcHkobW9kbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4gKyAxKTsKKwkJCQlzdHJsY3B5KG1vZG5hbWUsIG1vZC0+bmFtZSwgTU9EVUxFX05BTUVfTEVOKTsKIAkJCWlmIChuYW1lKQotCQkJCXN0cmxjcHkobmFtZSwgc3ltLCBLU1lNX05BTUVfTEVOICsgMSk7CisJCQkJc3RybGNweShuYW1lLCBzeW0sIEtTWU1fTkFNRV9MRU4pOwogCQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIxODQsOCArMjE4MSw4IEBACiAJCQkqdmFsdWUgPSBtb2QtPnN5bXRhYltzeW1udW1dLnN0X3ZhbHVlOwogCQkJKnR5cGUgPSBtb2QtPnN5bXRhYltzeW1udW1dLnN0X2luZm87CiAJCQlzdHJsY3B5KG5hbWUsIG1vZC0+c3RydGFiICsgbW9kLT5zeW10YWJbc3ltbnVtXS5zdF9uYW1lLAotCQkJCUtTWU1fTkFNRV9MRU4gKyAxKTsKLQkJCXN0cmxjcHkobW9kdWxlX25hbWUsIG1vZC0+bmFtZSwgTU9EVUxFX05BTUVfTEVOICsgMSk7CisJCQkJS1NZTV9OQU1FX0xFTik7CisJCQlzdHJsY3B5KG1vZHVsZV9uYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7CiAJCQkqZXhwb3J0ZWQgPSBpc19leHBvcnRlZChuYW1lLCBtb2QpOwogCQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCQkJcmV0dXJuIDA7CkBAIC0yMjMyLDI2ICsyMjI5LDEzIEBACiAvKiBDYWxsZWQgYnkgdGhlIC9wcm9jIGZpbGUgc3lzdGVtIHRvIHJldHVybiBhIGxpc3Qgb2YgbW9kdWxlcy4gKi8KIHN0YXRpYyB2b2lkICptX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaTsKLQlsb2ZmX3QgbiA9IDA7Ci0KIAltdXRleF9sb2NrKCZtb2R1bGVfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2goaSwgJm1vZHVsZXMpIHsKLQkJaWYgKG4rKyA9PSAqcG9zKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09ICZtb2R1bGVzKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaTsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJm1vZHVsZXMsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaSA9IHA7Ci0JKCpwb3MpKys7Ci0JaWYgKGktPm5leHQgPT0gJm1vZHVsZXMpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpLT5uZXh0OworCXJldHVybiBzZXFfbGlzdF9uZXh0KHAsICZtb2R1bGVzLCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBtX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQpAQCAtMjMyMSwxMSArMjMwNSwxMCBAQAogLyogR2l2ZW4gYW4gYWRkcmVzcywgbG9vayBmb3IgaXQgaW4gdGhlIG1vZHVsZSBleGNlcHRpb24gdGFibGVzLiAqLwogY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqc2VhcmNoX21vZHVsZV9leHRhYmxlcyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICplID0gTlVMTDsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2QsICZtb2R1bGVzLCBsaXN0KSB7CiAJCWlmIChtb2QtPm51bV9leGVudHJpZXMgPT0gMCkKIAkJCWNvbnRpbnVlOwpAQCAtMjMzNiw3ICsyMzE5LDcgQEAKIAkJaWYgKGUpCiAJCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCS8qIE5vdywgaWYgd2UgZm91bmQgb25lLCB3ZSBhcmUgcnVubmluZyBpbnNpZGUgaXQgbm93LCBoZW5jZQogICAgICAgICAgICB3ZSBjYW5ub3QgdW5sb2FkIHRoZSBtb2R1bGUsIGhlbmNlIG5vIHJlZmNudCBuZWVkZWQuICovCkBAIC0yMzQ4LDI1ICsyMzMxLDI0IEBACiAgKi8KIGludCBpc19tb2R1bGVfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKIAkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCXJldHVybiAwOwogfQogCiAKLS8qIElzIHRoaXMgYSB2YWxpZCBrZXJuZWwgYWRkcmVzcz8gIFdlIGRvbid0IGdyYWIgdGhlIGxvY2s6IHdlIGFyZSBvb3BzaW5nLiAqLworLyogSXMgdGhpcyBhIHZhbGlkIGtlcm5lbCBhZGRyZXNzPyAqLwogc3RydWN0IG1vZHVsZSAqX19tb2R1bGVfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CkBAIC0yMzgxLDExICsyMzYzLDEwIEBACiBzdHJ1Y3QgbW9kdWxlICptb2R1bGVfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAltb2QgPSBfX21vZHVsZV90ZXh0X2FkZHJlc3MoYWRkcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCXJldHVybiBtb2Q7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvbnNwcm94eS5jIGIva2VybmVsL25zcHJveHkuYwppbmRleCA5ZTgzYjU4Li4xMGYwYmJiIDEwMDY0NAotLS0gYS9rZXJuZWwvbnNwcm94eS5jCisrKyBiL2tlcm5lbC9uc3Byb3h5LmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgogCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm5zcHJveHlfY2FjaGVwOworCiBzdHJ1Y3QgbnNwcm94eSBpbml0X25zcHJveHkgPSBJTklUX05TUFJPWFkoaW5pdF9uc3Byb3h5KTsKIAogc3RhdGljIGlubGluZSB2b2lkIGdldF9uc3Byb3h5KHN0cnVjdCBuc3Byb3h5ICpucykKQEAgLTQzLDkgKzQ1LDExIEBACiB7CiAJc3RydWN0IG5zcHJveHkgKm5zOwogCi0JbnMgPSBrbWVtZHVwKG9yaWcsIHNpemVvZihzdHJ1Y3QgbnNwcm94eSksIEdGUF9LRVJORUwpOwotCWlmIChucykKKwlucyA9IGttZW1fY2FjaGVfYWxsb2MobnNwcm94eV9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmIChucykgeworCQltZW1jcHkobnMsIG9yaWcsIHNpemVvZihzdHJ1Y3QgbnNwcm94eSkpOwogCQlhdG9taWNfc2V0KCZucy0+Y291bnQsIDEpOworCX0KIAlyZXR1cm4gbnM7CiB9CiAKQEAgLTU0LDMzICs1OCw1MSBAQAogICogUmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG5zcHJveHkuICBEbyBub3QgYXR0YWNoIHRoaXMgdG8gdGhlIHRhc2ssCiAgKiBsZWF2ZSBpdCB0byB0aGUgY2FsbGVyIHRvIGRvIHByb3BlciBsb2NraW5nIGFuZCBhdHRhY2ggaXQgdG8gdGFzay4KICAqLwotc3RhdGljIHN0cnVjdCBuc3Byb3h5ICpjcmVhdGVfbmV3X25hbWVzcGFjZXMoaW50IGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCXN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcykKK3N0YXRpYyBzdHJ1Y3QgbnNwcm94eSAqY3JlYXRlX25ld19uYW1lc3BhY2VzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKQogewogCXN0cnVjdCBuc3Byb3h5ICpuZXdfbnNwOworCWludCBlcnI7CiAKIAluZXdfbnNwID0gY2xvbmVfbnNwcm94eSh0c2stPm5zcHJveHkpOwogCWlmICghbmV3X25zcCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAluZXdfbnNwLT5tbnRfbnMgPSBjb3B5X21udF9ucyhmbGFncywgdHNrLT5uc3Byb3h5LT5tbnRfbnMsIG5ld19mcyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT5tbnRfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+bW50X25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPm1udF9ucyk7CiAJCWdvdG8gb3V0X25zOworCX0KIAogCW5ld19uc3AtPnV0c19ucyA9IGNvcHlfdXRzbmFtZShmbGFncywgdHNrLT5uc3Byb3h5LT51dHNfbnMpOwotCWlmIChJU19FUlIobmV3X25zcC0+dXRzX25zKSkKKwlpZiAoSVNfRVJSKG5ld19uc3AtPnV0c19ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT51dHNfbnMpOwogCQlnb3RvIG91dF91dHM7CisJfQogCiAJbmV3X25zcC0+aXBjX25zID0gY29weV9pcGNzKGZsYWdzLCB0c2stPm5zcHJveHktPmlwY19ucyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT5pcGNfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+aXBjX25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPmlwY19ucyk7CiAJCWdvdG8gb3V0X2lwYzsKKwl9CiAKIAluZXdfbnNwLT5waWRfbnMgPSBjb3B5X3BpZF9ucyhmbGFncywgdHNrLT5uc3Byb3h5LT5waWRfbnMpOwotCWlmIChJU19FUlIobmV3X25zcC0+cGlkX25zKSkKKwlpZiAoSVNfRVJSKG5ld19uc3AtPnBpZF9ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT5waWRfbnMpOwogCQlnb3RvIG91dF9waWQ7CisJfQorCisJbmV3X25zcC0+dXNlcl9ucyA9IGNvcHlfdXNlcl9ucyhmbGFncywgdHNrLT5uc3Byb3h5LT51c2VyX25zKTsKKwlpZiAoSVNfRVJSKG5ld19uc3AtPnVzZXJfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+dXNlcl9ucyk7CisJCWdvdG8gb3V0X3VzZXI7CisJfQogCiAJcmV0dXJuIG5ld19uc3A7CiAKK291dF91c2VyOgorCWlmIChuZXdfbnNwLT5waWRfbnMpCisJCXB1dF9waWRfbnMobmV3X25zcC0+cGlkX25zKTsKIG91dF9waWQ6CiAJaWYgKG5ld19uc3AtPmlwY19ucykKIAkJcHV0X2lwY19ucyhuZXdfbnNwLT5pcGNfbnMpOwpAQCAtOTEsMTUgKzExMywxNSBAQAogCWlmIChuZXdfbnNwLT5tbnRfbnMpCiAJCXB1dF9tbnRfbnMobmV3X25zcC0+bW50X25zKTsKIG91dF9uczoKLQlrZnJlZShuZXdfbnNwKTsKLQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlrbWVtX2NhY2hlX2ZyZWUobnNwcm94eV9jYWNoZXAsIG5ld19uc3ApOworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIC8qCiAgKiBjYWxsZWQgZnJvbSBjbG9uZS4gIFRoaXMgbm93IGhhbmRsZXMgY29weSBmb3IgbnNwcm94eSBhbmQgYWxsCiAgKiBuYW1lc3BhY2VzIHRoZXJlaW4uCiAgKi8KLWludCBjb3B5X25hbWVzcGFjZXMoaW50IGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK2ludCBjb3B5X25hbWVzcGFjZXModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IG5zcHJveHkgKm9sZF9ucyA9IHRzay0+bnNwcm94eTsKIAlzdHJ1Y3QgbnNwcm94eSAqbmV3X25zOwpAQCAtMTEwLDcgKzEzMiw3IEBACiAKIAlnZXRfbnNwcm94eShvbGRfbnMpOwogCi0JaWYgKCEoZmxhZ3MgJiAoQ0xPTkVfTkVXTlMgfCBDTE9ORV9ORVdVVFMgfCBDTE9ORV9ORVdJUEMpKSkKKwlpZiAoIShmbGFncyAmIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1VUUyB8IENMT05FX05FV0lQQyB8IENMT05FX05FV1VTRVIpKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKQEAgLTE0MCw3ICsxNjIsOSBAQAogCQlwdXRfaXBjX25zKG5zLT5pcGNfbnMpOwogCWlmIChucy0+cGlkX25zKQogCQlwdXRfcGlkX25zKG5zLT5waWRfbnMpOwotCWtmcmVlKG5zKTsKKwlpZiAobnMtPnVzZXJfbnMpCisJCXB1dF91c2VyX25zKG5zLT51c2VyX25zKTsKKwlrbWVtX2NhY2hlX2ZyZWUobnNwcm94eV9jYWNoZXAsIG5zKTsKIH0KIAogLyoKQEAgLTE1MiwxOSArMTc2LDEwIEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoISh1bnNoYXJlX2ZsYWdzICYgKENMT05FX05FV05TIHwgQ0xPTkVfTkVXVVRTIHwgQ0xPTkVfTkVXSVBDKSkpCisJaWYgKCEodW5zaGFyZV9mbGFncyAmIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1VUUyB8IENMT05FX05FV0lQQyB8CisJCQkgICAgICAgQ0xPTkVfTkVXVVNFUikpKQogCQlyZXR1cm4gMDsKIAotI2lmbmRlZiBDT05GSUdfSVBDX05TCi0JaWYgKHVuc2hhcmVfZmxhZ3MgJiBDTE9ORV9ORVdJUEMpCi0JCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX1VUU19OUwotCWlmICh1bnNoYXJlX2ZsYWdzICYgQ0xPTkVfTkVXVVRTKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCkBAIC0xNzQsMyArMTg5LDEyIEBACiAJCWVyciA9IFBUUl9FUlIoKm5ld19uc3ApOwogCXJldHVybiBlcnI7CiB9CisKK3N0YXRpYyBpbnQgX19pbml0IG5zcHJveHlfY2FjaGVfaW5pdCh2b2lkKQoreworCW5zcHJveHlfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5zcHJveHkiLCBzaXplb2Yoc3RydWN0IG5zcHJveHkpLAorCQkJCQkgICAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQobnNwcm94eV9jYWNoZV9pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wYW5pYy5jIGIva2VybmVsL3BhbmljLmMKaW5kZXggNjIzZDE4Mi4uZjY0ZjRjMSAxMDA2NDQKLS0tIGEva2VybmVsL3BhbmljLmMKKysrIGIva2VybmVsL3BhbmljLmMKQEAgLTE1OSwxNCArMTU5LDE1IEBACiB7CiAJc3RhdGljIGNoYXIgYnVmWzIwXTsKIAlpZiAodGFpbnRlZCkgewotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVGFpbnRlZDogJWMlYyVjJWMlYyVjJWMiLAorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVGFpbnRlZDogJWMlYyVjJWMlYyVjJWMlYyIsCiAJCQl0YWludGVkICYgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFID8gJ1AnIDogJ0cnLAogCQkJdGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUgPyAnRicgOiAnICcsCiAJCQl0YWludGVkICYgVEFJTlRfVU5TQUZFX1NNUCA/ICdTJyA6ICcgJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9GT1JDRURfUk1NT0QgPyAnUicgOiAnICcsCiAgCQkJdGFpbnRlZCAmIFRBSU5UX01BQ0hJTkVfQ0hFQ0sgPyAnTScgOiAnICcsCiAJCQl0YWludGVkICYgVEFJTlRfQkFEX1BBR0UgPyAnQicgOiAnICcsCi0JCQl0YWludGVkICYgVEFJTlRfVVNFUiA/ICdVJyA6ICcgJyk7CisJCQl0YWludGVkICYgVEFJTlRfVVNFUiA/ICdVJyA6ICcgJywKKwkJCXRhaW50ZWQgJiBUQUlOVF9ESUUgPyAnRCcgOiAnICcpOwogCX0KIAllbHNlCiAJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJOb3QgdGFpbnRlZCIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZC5jIGIva2VybmVsL3BpZC5jCmluZGV4IGViNjZiZDIuLmM2ZTNmOWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9waWQuYworKysgYi9rZXJuZWwvcGlkLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmluZF9nZXRfcGlkKTsKIAotc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNvcHlfcGlkX25zKGludCBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm9sZF9ucykKK3N0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqb2xkX25zKQogewogCUJVR19PTighb2xkX25zKTsKIAlnZXRfcGlkX25zKG9sZF9ucyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggMGJiZGVhYy4uMDUxZDI3ZSAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtNDQ5LDEzICs0NDksMTYgQEAKICNlbHNlCiBzdGF0aWMgaW50IHByaW50a190aW1lID0gMDsKICNlbmRpZgotbW9kdWxlX3BhcmFtKHByaW50a190aW1lLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0aW1lLCBwcmludGtfdGltZSwgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwogCiBzdGF0aWMgaW50IF9faW5pdCBwcmludGtfdGltZV9zZXR1cChjaGFyICpzdHIpCiB7CiAJaWYgKCpzdHIpCiAJCXJldHVybiAwOwogCXByaW50a190aW1lID0gMTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlRoZSAndGltZScgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kICIKKwkJImlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiBlYXJseSAyMDA4XG4iKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlVzZSAncHJpbnRrLnRpbWU9PHZhbHVlPicgaW5zdGVhZFxuIik7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQ4Myw2ICs0ODYsOSBAQAogICogQGZtdDogZm9ybWF0IHN0cmluZwogICoKICAqIFRoaXMgaXMgcHJpbnRrKCkuICBJdCBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuICBXZSB3YW50IGl0IHRvIHdvcmsuCisgKiBCZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IGlmIG9vcHNfaW5fcHJvZ3Jlc3MgaXMgbm90IHNldCwgd2UgbWlnaHQgdHJ5IHRvCisgKiB3YWtlIGtsb2dkIHVwIHdoaWNoIGNvdWxkIGRlYWRsb2NrIG9uIHJ1bnF1ZXVlIGxvY2sgaWYgcHJpbnRrKCkgaXMgY2FsbGVkCisgKiBmcm9tIHNjaGVkdWxlciBjb2RlLgogICoKICAqIFdlIHRyeSB0byBncmFiIHRoZSBjb25zb2xlX3NlbS4gIElmIHdlIHN1Y2NlZWQsIGl0J3MgZWFzeSAtIHdlIGxvZyB0aGUgb3V0cHV0IGFuZAogICogY2FsbCB0aGUgY29uc29sZSBkcml2ZXJzLiAgSWYgd2UgZmFpbCB0byBnZXQgdGhlIHNlbWFwaG9yZSB3ZSBwbGFjZSB0aGUgb3V0cHV0CkBAIC02NTQsNyArNjYwLDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgY29uc29sZV9zZXR1cChjaGFyICpzdHIpCiB7Ci0JY2hhciBuYW1lW3NpemVvZihjb25zb2xlX2NtZGxpbmVbMF0ubmFtZSldOworCWNoYXIgYnVmW3NpemVvZihjb25zb2xlX2NtZGxpbmVbMF0ubmFtZSkgKyA0XTsgLyogNCBmb3IgaW5kZXggKi8KIAljaGFyICpzLCAqb3B0aW9uczsKIAlpbnQgaWR4OwogCkBAIC02NjIsMjcgKzY2OCwyNyBAQAogCSAqIERlY29kZSBzdHIgaW50byBuYW1lLCBpbmRleCwgb3B0aW9ucy4KIAkgKi8KIAlpZiAoc3RyWzBdID49ICcwJyAmJiBzdHJbMF0gPD0gJzknKSB7Ci0JCXN0cmNweShuYW1lLCAidHR5UyIpOwotCQlzdHJuY3B5KG5hbWUgKyA0LCBzdHIsIHNpemVvZihuYW1lKSAtIDUpOworCQlzdHJjcHkoYnVmLCAidHR5UyIpOworCQlzdHJuY3B5KGJ1ZiArIDQsIHN0ciwgc2l6ZW9mKGJ1ZikgLSA1KTsKIAl9IGVsc2UgewotCQlzdHJuY3B5KG5hbWUsIHN0ciwgc2l6ZW9mKG5hbWUpIC0gMSk7CisJCXN0cm5jcHkoYnVmLCBzdHIsIHNpemVvZihidWYpIC0gMSk7CiAJfQotCW5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAwOworCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKIAlpZiAoKG9wdGlvbnMgPSBzdHJjaHIoc3RyLCAnLCcpKSAhPSBOVUxMKQogCQkqKG9wdGlvbnMrKykgPSAwOwogI2lmZGVmIF9fc3BhcmNfXwogCWlmICghc3RyY21wKHN0ciwgInR0eWEiKSkKLQkJc3RyY3B5KG5hbWUsICJ0dHlTMCIpOworCQlzdHJjcHkoYnVmLCAidHR5UzAiKTsKIAlpZiAoIXN0cmNtcChzdHIsICJ0dHliIikpCi0JCXN0cmNweShuYW1lLCAidHR5UzEiKTsKKwkJc3RyY3B5KGJ1ZiwgInR0eVMxIik7CiAjZW5kaWYKLQlmb3IgKHMgPSBuYW1lOyAqczsgcysrKQorCWZvciAocyA9IGJ1ZjsgKnM7IHMrKykKIAkJaWYgKCgqcyA+PSAnMCcgJiYgKnMgPD0gJzknKSB8fCAqcyA9PSAnLCcpCiAJCQlicmVhazsKIAlpZHggPSBzaW1wbGVfc3RydG91bChzLCBOVUxMLCAxMCk7CiAJKnMgPSAwOwogCi0JYWRkX3ByZWZlcnJlZF9jb25zb2xlKG5hbWUsIGlkeCwgb3B0aW9ucyk7CisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKGJ1ZiwgaWR4LCBvcHRpb25zKTsKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoImNvbnNvbGU9IiwgY29uc29sZV9zZXR1cCk7CkBAIC03MDksNyArNzE1LDcgQEAKIAkgKglTZWUgaWYgdGhpcyB0dHkgaXMgbm90IHlldCByZWdpc3RlcmVkLCBhbmQKIAkgKglpZiB3ZSBoYXZlIGEgc2xvdCBmcmVlLgogCSAqLwotCWZvcihpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NNRExJTkVDT05TT0xFUyAmJiBjb25zb2xlX2NtZGxpbmVbaV0ubmFtZVswXTsgaSsrKQogCQlpZiAoc3RyY21wKGNvbnNvbGVfY21kbGluZVtpXS5uYW1lLCBuYW1lKSA9PSAwICYmCiAJCQkgIGNvbnNvbGVfY21kbGluZVtpXS5pbmRleCA9PSBpZHgpIHsKIAkJCQlzZWxlY3RlZF9jb25zb2xlID0gaTsKQEAgLTcyNiw2ICs3MzIsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IF9faW5pdCB1cGRhdGVfY29uc29sZV9jbWRsaW5lKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm5hbWVfbmV3LCBpbnQgaWR4X25ldywgY2hhciAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgY29uc29sZV9jbWRsaW5lICpjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07IGkrKykKKwkJaWYgKHN0cmNtcChjb25zb2xlX2NtZGxpbmVbaV0ubmFtZSwgbmFtZSkgPT0gMCAmJgorCQkJICBjb25zb2xlX2NtZGxpbmVbaV0uaW5kZXggPT0gaWR4KSB7CisJCQkJYyA9ICZjb25zb2xlX2NtZGxpbmVbaV07CisJCQkJbWVtY3B5KGMtPm5hbWUsIG5hbWVfbmV3LCBzaXplb2YoYy0+bmFtZSkpOworCQkJCWMtPm5hbWVbc2l6ZW9mKGMtPm5hbWUpIC0gMV0gPSAwOworCQkJCWMtPm9wdGlvbnMgPSBvcHRpb25zOworCQkJCWMtPmluZGV4ID0gaWR4X25ldzsKKwkJCQlyZXR1cm4gaTsKKwkJfQorCS8qIG5vdCBmb3VuZCAqLworCXJldHVybiAtMTsKK30KKwogI2lmbmRlZiBDT05GSUdfRElTQUJMRV9DT05TT0xFX1NVU1BFTkQKIC8qKgogICogc3VzcGVuZF9jb25zb2xlIC0gc3VzcGVuZCB0aGUgY29uc29sZSBzdWJzeXN0ZW0KQEAgLTk0Miw2ICs5NjcsOSBAQAogCWlmIChwcmVmZXJyZWRfY29uc29sZSA8IDAgfHwgYm9vdGNvbnNvbGUgfHwgIWNvbnNvbGVfZHJpdmVycykKIAkJcHJlZmVycmVkX2NvbnNvbGUgPSBzZWxlY3RlZF9jb25zb2xlOwogCisJaWYgKGNvbnNvbGUtPmVhcmx5X3NldHVwKQorCQljb25zb2xlLT5lYXJseV9zZXR1cCgpOworCiAJLyoKIAkgKglTZWUgaWYgd2Ugd2FudCB0byB1c2UgdGhpcyBjb25zb2xlIGRyaXZlci4gSWYgd2UKIAkgKglkaWRuJ3Qgc2VsZWN0IGEgY29uc29sZSB3ZSB0YWtlIHRoZSBmaXJzdCBvbmUKQEAgLTk4NSwxMiArMTAxMywxNSBAQAogCWlmICghKGNvbnNvbGUtPmZsYWdzICYgQ09OX0VOQUJMRUQpKQogCQlyZXR1cm47CiAKLQlpZiAoYm9vdGNvbnNvbGUpIHsKKwlpZiAoYm9vdGNvbnNvbGUgJiYgKGNvbnNvbGUtPmZsYWdzICYgQ09OX0NPTlNERVYpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImNvbnNvbGUgaGFuZG92ZXI6IGJvb3QgWyVzJWRdIC0+IHJlYWwgWyVzJWRdXG4iLAogCQkgICAgICAgYm9vdGNvbnNvbGUtPm5hbWUsIGJvb3Rjb25zb2xlLT5pbmRleCwKIAkJICAgICAgIGNvbnNvbGUtPm5hbWUsIGNvbnNvbGUtPmluZGV4KTsKIAkJdW5yZWdpc3Rlcl9jb25zb2xlKGJvb3Rjb25zb2xlKTsKIAkJY29uc29sZS0+ZmxhZ3MgJj0gfkNPTl9QUklOVEJVRkZFUjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJjb25zb2xlIFslcyVkXSBlbmFibGVkXG4iLAorCQkgICAgICAgY29uc29sZS0+bmFtZSwgY29uc29sZS0+aW5kZXgpOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9rZXJuZWwvcHRyYWNlLmMgYi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYWQ3OTQ5YS4uNGExNzQ1ZjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogaW50IHB0cmFjZV9hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWF1ZGl0X3B0cmFjZSh0YXNrKTsKIApAQCAtMTgxLDkgKzE4Miw3IEBACiAJICogY3B1J3MgdGhhdCBtYXkgaGF2ZSB0YXNrX2xvY2spLgogCSAqLwogCXRhc2tfbG9jayh0YXNrKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWlmICghd3JpdGVfdHJ5bG9jaygmdGFza2xpc3RfbG9jaykpIHsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlmICghd3JpdGVfdHJ5bG9ja19pcnFzYXZlKCZ0YXNrbGlzdF9sb2NrLCBmbGFncykpIHsKIAkJdGFza191bmxvY2sodGFzayk7CiAJCWRvIHsKIAkJCWNwdV9yZWxheCgpOwpAQCAtMjExLDcgKzIxMCw3IEBACiAJZm9yY2Vfc2lnX3NwZWNpZmljKFNJR1NUT1AsIHRhc2spOwogCiBiYWQ6Ci0Jd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKTsKIAl0YXNrX3VubG9jayh0YXNrKTsKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNDkxLDMgKzQ5MCwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAjZW5kaWYgLyogX19BUkNIX1NZU19QVFJBQ0UgKi8KKworaW50IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgY29waWVkOworCisJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0odHNrLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7CisJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7Cit9CisKK2ludCBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJaW50IGNvcGllZDsKKworCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRzaywgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSk7CisJcmV0dXJuIChjb3BpZWQgPT0gc2l6ZW9mKGRhdGEpKSA/IDAgOiAtRUlPOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggNTViYTgyYS4uZGRmZjMzMiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNTE4LDcgKzUxOSw2IEBACiAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0YXJ0ZWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWRvIHsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CkBAIC01NTgsNyArNTU4LDYgQEAKIAogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfZmFrZXdyaXRlciB0YXNrIHN0YXJ0ZWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWRvIHsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSArIHJjdV9yYW5kb20oJnJhbmQpJTEwKTsKQEAgLTU4OSw3ICs1ODgsNiBAQAogCiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9yZWFkZXIgdGFzayBzdGFydGVkIik7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlkbyB7CiAJCWlkeCA9IGN1cl9vcHMtPnJlYWRsb2NrKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwppbmRleCBkYThkNmJmLi41YWVkYmVlIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCisrKyBiL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKQEAgLTI5LDEyICsyOSw2IEBACiAKICNpbmNsdWRlICJydG11dGV4X2NvbW1vbi5oIgogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMKLSMgaW5jbHVkZSAicnRtdXRleC1kZWJ1Zy5oIgotI2Vsc2UKLSMgaW5jbHVkZSAicnRtdXRleC5oIgotI2VuZGlmCi0KICMgZGVmaW5lIFRSQUNFX1dBUk5fT04oeCkJCQlXQVJOX09OKHgpCiAjIGRlZmluZSBUUkFDRV9CVUdfT04oeCkJCQlCVUdfT04oeCkKIApkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXgtdGVzdGVyLmMgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwppbmRleCAwMTVmYzYzLi5lMzA1NWJhIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYworKysgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwpAQCAtMjYwLDYgKzI2MCw3IEBACiAJaW50IHJldDsKIAogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01VVEVYX1RFU1RFUjsKKwlzZXRfZnJlZXphYmxlKCk7CiAJYWxsb3dfc2lnbmFsKFNJR0hVUCk7CiAKIAlmb3IoOzspIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LmMgYi9rZXJuZWwvcnRtdXRleC5jCmluZGV4IDE3ZDI4Y2UuLjhjZDliZDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LmMKKysrIGIva2VybmVsL3J0bXV0ZXguYwpAQCAtMTcsMTIgKzE3LDYgQEAKIAogI2luY2x1ZGUgInJ0bXV0ZXhfY29tbW9uLmgiCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUlRfTVVURVhFUwotIyBpbmNsdWRlICJydG11dGV4LWRlYnVnLmgiCi0jZWxzZQotIyBpbmNsdWRlICJydG11dGV4LmgiCi0jZW5kaWYKLQogLyoKICAqIGxvY2stPm93bmVyIHN0YXRlIHRyYWNraW5nOgogICoKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oIGIva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKaW5kZXggOWM3NTg1Ni4uMmQzYjgzNSAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKKysrIGIva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqcnRfbXV0ZXhfcmVhbF9vd25lcihzdHJ1Y3QgcnRfbXV0ZXggKmxvY2spCiB7Ci0gCXJldHVybiAoc3RydWN0IHRhc2tfc3RydWN0ICopCisJcmV0dXJuIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKikKIAkJKCh1bnNpZ25lZCBsb25nKWxvY2stPm93bmVyICYgflJUX01VVEVYX0hBU19XQUlURVJTKTsKIH0KIApAQCAtMTIwLDQgKzEyMCwxMSBAQAogCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb3h5X293bmVyKTsKIGV4dGVybiB2b2lkIHJ0X211dGV4X3Byb3h5X3VubG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCiAJCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb3h5X293bmVyKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19SVF9NVVRFWEVTCisjIGluY2x1ZGUgInJ0bXV0ZXgtZGVidWcuaCIKKyNlbHNlCisjIGluY2x1ZGUgInJ0bXV0ZXguaCIKKyNlbmRpZgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggMzMzMmJiYi4uY2IzMWZiNCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTczNiw3ICs3MzYsOSBAQAogICoKICAqIFRoZSAiMTAlIGVmZmVjdCIgaXMgcmVsYXRpdmUgYW5kIGN1bXVsYXRpdmU6IGZyb20gX2FueV8gbmljZSBsZXZlbCwKICAqIGlmIHlvdSBnbyB1cCAxIGxldmVsLCBpdCdzIC0xMCUgQ1BVIHVzYWdlLCBpZiB5b3UgZ28gZG93biAxIGxldmVsCi0gKiBpdCdzICsxMCUgQ1BVIHVzYWdlLgorICogaXQncyArMTAlIENQVSB1c2FnZS4gKHRvIGFjaGlldmUgdGhhdCB3ZSB1c2UgYSBtdWx0aXBsaWVyIG9mIDEuMjUuCisgKiBJZiBhIHRhc2sgZ29lcyB1cCBieSB+MTAlIGFuZCBhbm90aGVyIHRhc2sgZ29lcyBkb3duIGJ5IH4xMCUgdGhlbgorICogdGhlIHJlbGF0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBpcyB+MjUlLikKICAqLwogc3RhdGljIGNvbnN0IGludCBwcmlvX3RvX3dlaWdodFs0MF0gPSB7CiAvKiAtMjAgKi8gODg4MTgsIDcxMDU0LCA1Njg0MywgNDU0NzUsIDM2MzgwLCAyOTEwNCwgMjMyODMsIDE4NjI2LCAxNDkwMSwgMTE5MjEsCkBAIC03NDYsMTUgKzc0OCwyMiBAQAogLyogIDEwICovICAgMTEwLCAgICA4NywgICAgNzAsICAgIDU2LCAgICA0NSwgICAgMzYsICAgIDI5LCAgICAyMywgICAgMTgsICAgIDE1LAogfTsKIAorLyoKKyAqIEludmVyc2UgKDJeMzIveCkgdmFsdWVzIG9mIHRoZSBwcmlvX3RvX3dlaWdodFtdIGFycmF5LCBwcmVjYWxjdWxhdGVkLgorICoKKyAqIEluIGNhc2VzIHdoZXJlIHRoZSB3ZWlnaHQgZG9lcyBub3QgY2hhbmdlIG9mdGVuLCB3ZSBjYW4gdXNlIHRoZQorICogcHJlY2FsY3VsYXRlZCBpbnZlcnNlIHRvIHNwZWVkIHVwIGFyaXRobWV0aWNzIGJ5IHR1cm5pbmcgZGl2aXNpb25zCisgKiBpbnRvIG11bHRpcGxpY2F0aW9uczoKKyAqLwogc3RhdGljIGNvbnN0IHUzMiBwcmlvX3RvX3dtdWx0WzQwXSA9IHsKLQk0ODM1NiwgICA2MDQ0NiwgICA3NTU1OCwgICA5NDQ0NiwgIDExODA1OCwgIDE0NzU3MywKLQkxODQ0NjcsICAyMzA1ODksICAyODgyMzMsICAzNjAyODUsICA0NTAzNDcsCi0JNTYyOTc5LCAgNzAzNzQ2LCAgODc5NTc1LCAxMDk5NTgyLCAxMzc0Mzg5LAotCTE3MTc5ODYsIDIxNDc0ODMsIDI2ODQzNTQsIDMzNTU0NDMsIDQxOTQzMDQsCi0JNTI0NDE2MCwgNjU1NzIwMSwgODE5NjUwMiwgMTAyNTA1MTgsIDEyNzgyNjQwLAotCTE2MDI1OTk3LCAxOTk3NjU5MiwgMjQ5NzA3NDAsIDMxMzUwMTI2LCAzOTA0NTE1NywKLQk0OTM2NzQ0MCwgNjEzNTY2NzUsIDc2Njk1ODQ0LCA5NTQ0MzcxNywgMTE5MzA0NjQ3LAotCTE0ODEwMjMyMCwgMTg2NzM3NzA4LCAyMzg2MDkyOTQsIDI4NjMzMTE1MywKKy8qIC0yMCAqLyAgICAgNDgzNTYsICAgICA2MDQ0NiwgICAgIDc1NTU4LCAgICAgOTQ0NDYsICAgIDExODA1OCwKKy8qIC0xNSAqLyAgICAxNDc1NzMsICAgIDE4NDQ2NywgICAgMjMwNTg5LCAgICAyODgyMzMsICAgIDM2MDI4NSwKKy8qIC0xMCAqLyAgICA0NTAzNDcsICAgIDU2Mjk3OSwgICAgNzAzNzQ2LCAgICA4Nzk1NzUsICAgMTA5OTU4MiwKKy8qICAtNSAqLyAgIDEzNzQzODksICAgMTcxNzk4NiwgICAyMTQ3NDgzLCAgIDI2ODQzNTQsICAgMzM1NTQ0MywKKy8qICAgMCAqLyAgIDQxOTQzMDQsICAgNTI0NDE2MCwgICA2NTU3MjAxLCAgIDgxOTY1MDIsICAxMDI1MDUxOCwKKy8qICAgNSAqLyAgMTI3ODI2NDAsICAxNjAyNTk5NywgIDE5OTc2NTkyLCAgMjQ5NzA3NDAsICAzMTM1MDEyNiwKKy8qICAxMCAqLyAgMzkwNDUxNTcsICA0OTM2NzQ0MCwgIDYxMzU2Njc1LCAgNzY2OTU4NDQsICA5NTQ0MzcxNywKKy8qICAxNSAqLyAxMTkzMDQ2NDcsIDE0ODEwMjMyMCwgMTg2NzM3NzA4LCAyMzg2MDkyOTQsIDI4NjMzMTE1MywKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNDkwMyw4ICs0OTEyLDYgQEAKIAkJc3RydWN0IG1pZ3JhdGlvbl9yZXEgKnJlcTsKIAkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAotCQl0cnlfdG9fZnJlZXplKCk7Ci0KIAkJc3Bpbl9sb2NrX2lycSgmcnEtPmxvY2spOwogCiAJCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKSB7CkBAIC01MTM4LDcgKzUxNDUsNiBAQAogCQlwID0ga3RocmVhZF9jcmVhdGUobWlncmF0aW9uX3RocmVhZCwgaGNwdSwgIm1pZ3JhdGlvbi8lZCIsIGNwdSk7CiAJCWlmIChJU19FUlIocCkpCiAJCQlyZXR1cm4gTk9USUZZX0JBRDsKLQkJcC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJCWt0aHJlYWRfYmluZChwLCBjcHUpOwogCQkvKiBNdXN0IGJlIGhpZ2ggcHJpbzogc3RvcF9tYWNoaW5lIGV4cGVjdHMgdG8geWllbGQgdG8gaXQuICovCiAJCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2VjY29tcC5jIGIva2VybmVsL3NlY2NvbXAuYwppbmRleCBjMzM5MWI2Li5hZDY0ZmNiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2VjY29tcC5jCisrKyBiL2tlcm5lbC9zZWNjb21wLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAvKiAjZGVmaW5lIFNFQ0NPTVBfREVCVUcgMSAqLworI2RlZmluZSBOUl9TRUNDT01QX01PREVTIDEKIAogLyoKICAqIFNlY3VyZSBjb21wdXRpbmcgbW9kZSAxIGFsbG93cyBvbmx5IHJlYWQvd3JpdGUvZXhpdC9zaWdyZXR1cm4uCkBAIC01NCwzICs1NSwzMSBAQAogI2VuZGlmCiAJZG9fZXhpdChTSUdLSUxMKTsKIH0KKworbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKQoreworCXJldHVybiBjdXJyZW50LT5zZWNjb21wLm1vZGU7Cit9CisKK2xvbmcgcHJjdGxfc2V0X3NlY2NvbXAodW5zaWduZWQgbG9uZyBzZWNjb21wX21vZGUpCit7CisJbG9uZyByZXQ7CisKKwkvKiBjYW4gc2V0IGl0IG9ubHkgb25jZSB0byBiZSBldmVuIG1vcmUgc2VjdXJlICovCisJcmV0ID0gLUVQRVJNOworCWlmICh1bmxpa2VseShjdXJyZW50LT5zZWNjb21wLm1vZGUpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlY2NvbXBfbW9kZSAmJiBzZWNjb21wX21vZGUgPD0gTlJfU0VDQ09NUF9NT0RFUykgeworCQljdXJyZW50LT5zZWNjb21wLm1vZGUgPSBzZWNjb21wX21vZGU7CisJCXNldF90aHJlYWRfZmxhZyhUSUZfU0VDQ09NUCk7CisjaWZkZWYgVElGX05PVFNDCisJCWRpc2FibGVfVFNDKCk7CisjZW5kaWYKKwkJcmV0ID0gMDsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBmOTQwNTYwLi4zOWQxMjI3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC03MTgsNiArNzE4LDM3IEBACiAjZGVmaW5lIExFR0FDWV9RVUVVRShzaWdwdHIsIHNpZykgXAogCSgoKHNpZykgPCBTSUdSVE1JTikgJiYgc2lnaXNtZW1iZXIoJihzaWdwdHIpLT5zaWduYWwsIChzaWcpKSkKIAoraW50IHByaW50X2ZhdGFsX3NpZ25hbHM7CisKK3N0YXRpYyB2b2lkIHByaW50X2ZhdGFsX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHNpZ25yKQoreworCXByaW50aygiJXMvJWQ6IHBvdGVudGlhbGx5IHVuZXhwZWN0ZWQgZmF0YWwgc2lnbmFsICVkLlxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBzaWducik7CisKKyNpZmRlZiBfX2kzODZfXworCXByaW50aygiY29kZSBhdCAlMDhseDogIiwgcmVncy0+ZWlwKTsKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJdW5zaWduZWQgY2hhciBpbnNuOworCisJCQlfX2dldF91c2VyKGluc24sICh1bnNpZ25lZCBjaGFyICopKHJlZ3MtPmVpcCArIGkpKTsKKwkJCXByaW50aygiJTAyeCAiLCBpbnNuKTsKKwkJfQorCX0KKyNlbmRpZgorCXByaW50aygiXG4iKTsKKwlzaG93X3JlZ3MocmVncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3ByaW50X2ZhdGFsX3NpZ25hbHMoY2hhciAqc3RyKQoreworCWdldF9vcHRpb24gKCZzdHIsICZwcmludF9mYXRhbF9zaWduYWxzKTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJwcmludC1mYXRhbC1zaWduYWxzPSIsIHNldHVwX3ByaW50X2ZhdGFsX3NpZ25hbHMpOwogCiBzdGF0aWMgaW50CiBzcGVjaWZpY19zZW5kX3NpZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCkBAIC0xODU1LDYgKzE4ODYsOCBAQAogCQkgKiBBbnl0aGluZyBlbHNlIGlzIGZhdGFsLCBtYXliZSB3aXRoIGEgY29yZSBkdW1wLgogCQkgKi8KIAkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU0lHTkFMRUQ7CisJCWlmICgoc2lnbnIgIT0gU0lHS0lMTCkgJiYgcHJpbnRfZmF0YWxfc2lnbmFscykKKwkJCXByaW50X2ZhdGFsX3NpZ25hbChyZWdzLCBzaWducik7CiAJCWlmIChzaWdfa2VybmVsX2NvcmVkdW1wKHNpZ25yKSkgewogCQkJLyoKIAkJCSAqIElmIGl0IHdhcyBhYmxlIHRvIGR1bXAgY29yZSwgdGhpcyBraWxscyBhbGwKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0aXJxLmMgYi9rZXJuZWwvc29mdGlycS5jCmluZGV4IDczMjE3YTkuLjBmNTQ2ZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0aXJxLmMKKysrIGIva2VybmVsL3NvZnRpcnEuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtNDg4LDggKzQ4OSw2IEBACiAKIHN0YXRpYyBpbnQga3NvZnRpcnFkKHZvaWQgKiBfX2JpbmRfY3B1KQogewotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CkBAIC02MTQsMTIgKzYxMywxNiBAQAogCQlrdGhyZWFkX2JpbmQocGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSksCiAJCQkgICAgIGFueV9vbmxpbmVfY3B1KGNwdV9vbmxpbmVfbWFwKSk7CiAJY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwljYXNlIENQVV9ERUFEX0ZST1pFTjogeworCQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKKwogCQlwID0gcGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSk7CiAJCXBlcl9jcHUoa3NvZnRpcnFkLCBob3RjcHUpID0gTlVMTDsKKwkJc2NoZWRfc2V0c2NoZWR1bGVyKHAsIFNDSEVEX0ZJRk8sICZwYXJhbSk7CiAJCWt0aHJlYWRfc3RvcChwKTsKIAkJdGFrZW92ZXJfdGFza2xldHMoaG90Y3B1KTsKIAkJYnJlYWs7CisJfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMgYi9rZXJuZWwvc29mdGxvY2t1cC5jCmluZGV4IDAxMzFlMjkuLjcwOGQ0ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMKKysrIGIva2VybmVsL3NvZnRsb2NrdXAuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTExNiw3ICsxMTcsNiBAQAogCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsgLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8tMSB9OwogCiAJc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkvKiBpbml0aWFsaXplIHRpbWVzdGFtcCAqLwogCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwppbmRleCBmY2VlMmE4Li4zMTk4MjFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKKysrIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCkBAIC05MywxMCArOTMsNiBAQAogc3RhdGljIGludCBzdG9wX21hY2hpbmUodm9pZCkKIHsKIAlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKLQotCS8qIE9uZSBoaWdoLXByaW8gdGhyZWFkIHBlciBjcHUuICBXZSdsbCBkbyB0aGlzIG9uZS4gKi8KLQlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAogCWF0b21pY19zZXQoJnN0b3BtYWNoaW5lX3RocmVhZF9hY2ssIDApOwogCXN0b3BtYWNoaW5lX251bV90aHJlYWRzID0gMDsKQEAgLTE4OSw2ICsxODUsMTAgQEAKIAogCXAgPSBrdGhyZWFkX2NyZWF0ZShkb19zdG9wLCAmc21kYXRhLCAia3N0b3BtYWNoaW5lIik7CiAJaWYgKCFJU19FUlIocCkpIHsKKwkJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CisKKwkJLyogT25lIGhpZ2gtcHJpbyB0aHJlYWQgcGVyIGNwdS4gIFdlJ2xsIGRvIHRoaXMgb25lLiAqLworCQlzY2hlZF9zZXRzY2hlZHVsZXIocCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAkJa3RocmVhZF9iaW5kKHAsIGNwdSk7CiAJCXdha2VfdXBfcHJvY2VzcyhwKTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmc21kYXRhLmRvbmUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDg3MjI3MWMuLjRkMTQxYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTMxLDEwICszMSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2NuX3Byb2MuaD4KICNpbmNsdWRlIDxsaW51eC9nZXRjcHUuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xMDc4LDEzICsxMDgwLDEzIEBACiB7CiAJc3RydWN0IHVzZXJfc3RydWN0ICpuZXdfdXNlcjsKIAotCW5ld191c2VyID0gYWxsb2NfdWlkKG5ld19ydWlkKTsKKwluZXdfdXNlciA9IGFsbG9jX3VpZChjdXJyZW50LT5uc3Byb3h5LT51c2VyX25zLCBuZXdfcnVpZCk7CiAJaWYgKCFuZXdfdXNlcikKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlpZiAoYXRvbWljX3JlYWQoJm5ld191c2VyLT5wcm9jZXNzZXMpID49CiAJCQkJY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OUFJPQ10ucmxpbV9jdXIgJiYKLQkJCW5ld191c2VyICE9ICZyb290X3VzZXIpIHsKKwkJCW5ld191c2VyICE9IGN1cnJlbnQtPm5zcHJveHktPnVzZXJfbnMtPnJvb3RfdXNlcikgewogCQlmcmVlX3VpZChuZXdfdXNlcik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTIyNDEsNiArMjI0MywxMyBAQAogCQkJZXJyb3IgPSBTRVRfRU5ESUFOKGN1cnJlbnQsIGFyZzIpOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBQUl9HRVRfU0VDQ09NUDoKKwkJCWVycm9yID0gcHJjdGxfZ2V0X3NlY2NvbXAoKTsKKwkJCWJyZWFrOworCQljYXNlIFBSX1NFVF9TRUNDT01QOgorCQkJZXJyb3IgPSBwcmN0bF9zZXRfc2VjY29tcChhcmcyKTsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCA3ZTExZTJjLi5iMGVjNDk4IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC0xNCw2ICsxNCw3IEBACiAKIGNvbmRfc3lzY2FsbChzeXNfbmZzc2VydmN0bCk7CiBjb25kX3N5c2NhbGwoc3lzX3F1b3RhY3RsKTsKK2NvbmRfc3lzY2FsbChzeXMzMl9xdW90YWN0bCk7CiBjb25kX3N5c2NhbGwoc3lzX2FjY3QpOwogY29uZF9zeXNjYWxsKHN5c19sb29rdXBfZGNvb2tpZSk7CiBjb25kX3N5c2NhbGwoc3lzX3N3YXBvbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZDkzZTEzZC4uNzA2M2ViYyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CkBAIC00OSw5ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLWV4dGVybiBpbnQgcHJvY19ucl9maWxlcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwotCiAjaWZkZWYgQ09ORklHX1g4NgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgpAQCAtNjEsNiArNTksNyBAQAogCiAvKiBFeHRlcm5hbCB2YXJpYWJsZXMgbm90IGluIGEgaGVhZGVyIGZpbGUuICovCiBleHRlcm4gaW50IENfQV9EOworZXh0ZXJuIGludCBwcmludF9mYXRhbF9zaWduYWxzOwogZXh0ZXJuIGludCBzeXNjdGxfb3ZlcmNvbW1pdF9tZW1vcnk7CiBleHRlcm4gaW50IHN5c2N0bF9vdmVyY29tbWl0X3JhdGlvOwogZXh0ZXJuIGludCBzeXNjdGxfcGFuaWNfb25fb29tOwpAQCAtMjAyLDcgKzIwMSwxMCBAQAogCQkubW9kZQkJPSAwNTU1LAogCQkuY2hpbGQJCT0gZGV2X3RhYmxlLAogCX0sCi0KKy8qCisgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKKyAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAorICovCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTM0MCw2ICszNDIsMTQgQEAKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCiAjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAicHJpbnQtZmF0YWwtc2lnbmFscyIsCisJCS5kYXRhCQk9ICZwcmludF9mYXRhbF9zaWduYWxzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKICNpZmRlZiBfX3NwYXJjX18KIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fU1BBUkNfUkVCT09ULApAQCAtODE0LDYgKzgyNCwxNCBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJIH0sCisJIHsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSIsCisJCS5kYXRhCQk9ICZodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZodWdldGxiX3RyZWF0X21vdmFibGVfaGFuZGxlciwKKwl9LAogI2VuZGlmCiAJewogCQkuY3RsX25hbWUJPSBWTV9MT1dNRU1fUkVTRVJWRV9SQVRJTywKQEAgLTk1OCw2ICs5NzYsMTcgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvdWxvbmd2ZWNfbWlubWF4LAogCX0sCisjaWZkZWYgQ09ORklHX05VTUEKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibnVtYV96b25lbGlzdF9vcmRlciIsCisJCS5kYXRhCQk9ICZudW1hX3pvbmVsaXN0X29yZGVyLAorCQkubWF4bGVuCQk9IE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJm51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlciwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9zdHJpbmcsCisJfSwKKyNlbmRpZgogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSB8fCBcCiAgICAoZGVmaW5lZChDT05GSUdfU1VQRVJIKSAmJiBkZWZpbmVkKENPTkZJR19WU1lTQ0FMTCkpCkBAIC05NzIsNiArMTAwMSwxMCBAQAogCQkuZXh0cmExCQk9ICZ6ZXJvLAogCX0sCiAjZW5kaWYKKy8qCisgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKKyAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAorICovCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTExMTIsNiArMTE0NSwxMCBAQAogCQkuY2hpbGQJCT0gYmluZm10X21pc2NfdGFibGUsCiAJfSwKICNlbmRpZgorLyoKKyAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAorICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CisgKi8KIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Rhc2tzdGF0cy5jIGIva2VybmVsL3Rhc2tzdGF0cy5jCmluZGV4IDkwNmNhZTcuLjA1OTQzMWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90YXNrc3RhdHMuYworKysgYi9rZXJuZWwvdGFza3N0YXRzLmMKQEAgLTE5Niw2ICsxOTYsOCBAQAogCiAJLyogZmlsbCBpbiBiYXNpYyBhY2N0IGZpZWxkcyAqLwogCXN0YXRzLT52ZXJzaW9uID0gVEFTS1NUQVRTX1ZFUlNJT047CisJc3RhdHMtPm52Y3N3ID0gdHNrLT5udmNzdzsKKwlzdGF0cy0+bml2Y3N3ID0gdHNrLT5uaXZjc3c7CiAJYmFjY3RfYWRkX3RzayhzdGF0cywgdHNrKTsKIAogCS8qIGZpbGwgaW4gZXh0ZW5kZWQgYWNjdCBmaWVsZHMgKi8KQEAgLTI0Miw2ICsyNDQsOCBAQAogCQkgKi8KIAkJZGVsYXlhY2N0X2FkZF90c2soc3RhdHMsIHRzayk7CiAKKwkJc3RhdHMtPm52Y3N3ICs9IHRzay0+bnZjc3c7CisJCXN0YXRzLT5uaXZjc3cgKz0gdHNrLT5uaXZjc3c7CiAJfSB3aGlsZV9lYWNoX3RocmVhZChmaXJzdCwgdHNrKTsKIAogCXVubG9ja190YXNrX3NpZ2hhbmQoZmlyc3QsICZmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS5jIGIva2VybmVsL3RpbWUuYwppbmRleCBmMDQ3OTFmLi5mZmUxOTE0IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTU3LDE0ICs1NywxNyBAQAogICovCiBhc21saW5rYWdlIGxvbmcgc3lzX3RpbWUodGltZV90IF9fdXNlciAqIHRsb2MpCiB7Ci0JdGltZV90IGk7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7CisJLyoKKwkgKiBXZSByZWFkIHh0aW1lLnR2X3NlYyBhdG9taWNhbGx5IC0gaXQncyB1cGRhdGVkCisJICogYXRvbWljYWxseSBieSB1cGRhdGVfd2FsbF90aW1lKCksIHNvIG5vIG5lZWQgdG8KKwkgKiBldmVuIHJlYWQtbG9jayB0aGUgeHRpbWUgc2VxbG9jazoKKwkgKi8KKwl0aW1lX3QgaSA9IHh0aW1lLnR2X3NlYzsKIAotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCWkgPSB0di50dl9zZWM7CisJc21wX3JtYigpOyAvKiBzeXNfdGltZSgpIHJlc3VsdHMgYXJlIGNvaGVyZW50ICovCiAKIAlpZiAodGxvYykgewotCQlpZiAocHV0X3VzZXIoaSx0bG9jKSkKKwkJaWYgKHB1dF91c2VyKGksIHRsb2MpKQogCQkJaSA9IC1FRkFVTFQ7CiAJfQogCXJldHVybiBpOwpAQCAtMzczLDEyICszNzYsMjUgQEAKIAogCXR2LT50dl9zZWMgPSBzZWM7CiAJdHYtPnR2X3VzZWMgPSB1c2VjOwotfQogCisJLyoKKwkgKiBNYWtlIHN1cmUgeHRpbWUudHZfc2VjIFtyZXR1cm5lZCBieSBzeXNfdGltZSgpXSBhbHdheXMKKwkgKiBmb2xsb3dzIHRoZSBnZXR0aW1lb2ZkYXkoKSByZXN1bHQgcHJlY2lzZWx5LiBUaGlzCisJICogY29uZGl0aW9uIGlzIGV4dHJlbWVseSB1bmxpa2VseSwgaXQgY2FuIGhpdCBhdCBtb3N0CisJICogb25jZSBwZXIgc2Vjb25kOgorCSAqLworCWlmICh1bmxpa2VseSh4dGltZS50dl9zZWMgIT0gdHYtPnR2X3NlYykpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3dhbGxfdGltZSgpOworCQl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCX0KK30KIEVYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKIAorI2Vsc2UJLyogQ09ORklHX1RJTUVfSU5URVJQT0xBVElPTiAqLwogCi0jZWxzZQogI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiAvKgogICogU2ltdWxhdGUgZ2V0dGltZW9mZGF5IHVzaW5nIGRvX2dldHRpbWVvZmRheSB3aGljaCBvbmx5IGFsbG93cyBhIHRpbWV2YWwKQEAgLTM5NCw3ICs0MTAsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0bnN0aW1lb2ZkYXkpOwogI2VuZGlmCi0jZW5kaWYKKyNlbmRpZgkvKiBDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OICovCiAKIC8qIENvbnZlcnRzIEdyZWdvcmlhbiBkYXRlIHRvIHNlY29uZHMgc2luY2UgMTk3MC0wMS0wMSAwMDowMDowMC4KICAqIEFzc3VtZXMgaW5wdXQgaW4gbm9ybWFsIGRhdGUgZm9ybWF0LCBpLmUuIDE5ODAtMTItMzEgMjM6NTk6NTkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCmluZGV4IDc2MjEyYjIuLjJhZDFjMzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwpAQCAtMjA1LDQ3ICsyMDUsNiBAQAogfQogCiAvKioKLSAqIGNsb2NrZXZlbnRzX3JlcXVlc3RfZGV2aWNlCi0gKi8KLXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsb2NrZXZlbnRzX3JlcXVlc3RfZGV2aWNlKHVuc2lnbmVkIGludCBmZWF0dXJlcywKLQkJCQkJCSAgICAgIGNwdW1hc2tfdCBjcHVtYXNrKQotewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmN1ciwgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCi0Jc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2godG1wLCAmY2xvY2tldmVudF9kZXZpY2VzKSB7Ci0JCWN1ciA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKLQotCQlpZiAoKGN1ci0+ZmVhdHVyZXMgJiBmZWF0dXJlcykgPT0gZmVhdHVyZXMgJiYKLQkJICAgIGNwdXNfZXF1YWwoY3B1bWFzaywgY3VyLT5jcHVtYXNrKSkgewotCQkJaWYgKCFkZXYgfHwgZGV2LT5yYXRpbmcgPCBjdXItPnJhdGluZykKLQkJCQlkZXYgPSBjdXI7Ci0JCX0KLQl9Ci0KLQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoTlVMTCwgZGV2KTsKLQotCXNwaW5fdW5sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCXJldHVybiBkZXY7Ci19Ci0KLS8qKgotICogY2xvY2tldmVudHNfcmVsZWFzZV9kZXZpY2UKLSAqLwotdm9pZCBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCi17Ci0Jc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShkZXYsIE5VTEwpOwotCWNsb2NrZXZlbnRzX25vdGlmeV9yZWxlYXNlZCgpOwotCi0Jc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOwotfQotCi0vKioKICAqIGNsb2NrZXZlbnRzX25vdGlmeSAtIG5vdGlmaWNhdGlvbiBhYm91dCByZWxldmFudCBldmVudHMKICAqLwogdm9pZCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggY2Y1M2JiNS4uNDM4YzZiNyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCmluZGV4IDNkMTA0MmYuLjcyOGNlZGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtMzYsOSArMzYsMTcgQEAKICAqIGF0IHplcm8gYXQgc3lzdGVtIGJvb3QgdGltZSwgc28gd2FsbF90b19tb25vdG9uaWMgd2lsbCBiZSBuZWdhdGl2ZSwKICAqIGhvd2V2ZXIsIHdlIHdpbGwgQUxXQVlTIGtlZXAgdGhlIHR2X25zZWMgcGFydCBwb3NpdGl2ZSBzbyB3ZSBjYW4gdXNlCiAgKiB0aGUgdXN1YWwgbm9ybWFsaXphdGlvbi4KKyAqCisgKiB3YWxsX3RvX21vbm90b25pYyBpcyBtb3ZlZCBhZnRlciByZXN1bWUgZnJvbSBzdXNwZW5kIGZvciB0aGUgbW9ub3RvbmljCisgKiB0aW1lIG5vdCB0byBqdW1wLiBXZSBuZWVkIHRvIGFkZCB0b3RhbF9zbGVlcF90aW1lIHRvIHdhbGxfdG9fbW9ub3RvbmljCisgKiB0byBnZXQgdGhlIHJlYWwgYm9vdCBiYXNlZCB0aW1lIG9mZnNldC4KKyAqCisgKiAtIHdhbGxfdG9fbW9ub3RvbmljIGlzIG5vIGxvbmdlciB0aGUgYm9vdCB0aW1lLCBnZXRib290dGltZSBtdXN0IGJlCisgKiB1c2VkIGluc3RlYWQuCiAgKi8KIHN0cnVjdCB0aW1lc3BlYyB4dGltZSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CiBzdHJ1Y3QgdGltZXNwZWMgd2FsbF90b19tb25vdG9uaWMgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfc2xlZXBfdGltZTsJCS8qIHNlY29uZHMgKi8KIAogRVhQT1JUX1NZTUJPTCh4dGltZSk7CiAKQEAgLTI1MSw2ICsyNTksNyBAQAogCXh0aW1lLnR2X25zZWMgPSAwOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKIAkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCXRvdGFsX3NsZWVwX3RpbWUgPSAwOwogCiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTI4Miw2ICsyOTEsNyBAQAogCiAJCXh0aW1lLnR2X3NlYyArPSBzbGVlcF9sZW5ndGg7CiAJCXdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyAtPSBzbGVlcF9sZW5ndGg7CisJCXRvdGFsX3NsZWVwX3RpbWUgKz0gc2xlZXBfbGVuZ3RoOwogCX0KIAkvKiByZS1iYXNlIHRoZSBsYXN0IGN5Y2xlIHZhbHVlICovCiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKQEAgLTQ3NiwzICs0ODYsMzAgQEAKIAljaGFuZ2VfY2xvY2tzb3VyY2UoKTsKIAl1cGRhdGVfdnN5c2NhbGwoJnh0aW1lLCBjbG9jayk7CiB9CisKKy8qKgorICogZ2V0Ym9vdHRpbWUgLSBSZXR1cm4gdGhlIHJlYWwgdGltZSBvZiBzeXN0ZW0gYm9vdC4KKyAqIEB0czoJCXBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHRvIGJlIHNldAorICoKKyAqIFJldHVybnMgdGhlIHRpbWUgb2YgZGF5IGluIGEgdGltZXNwZWMuCisgKgorICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgd2FsbF90b19tb25vdG9uaWMgb2Zmc2V0IGFuZCB0aGUgdG90YWwgc3VzcGVuZAorICogdGltZS4gQ2FsbHMgdG8gc2V0dGltZW9mZGF5IHdpbGwgYWZmZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCAod2hpY2gKKyAqIGJhc2ljYWxseSBtZWFucyB0aGF0IGhvd2V2ZXIgd3JvbmcgeW91ciByZWFsIHRpbWUgY2xvY2sgaXMgYXQgYm9vdCB0aW1lLAorICogeW91IGdldCB0aGUgcmlnaHQgdGltZSBoZXJlKS4KKyAqLwordm9pZCBnZXRib290dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKHRzLAorCQktICh3YWxsX3RvX21vbm90b25pYy50dl9zZWMgKyB0b3RhbF9zbGVlcF90aW1lKSwKKwkJLSB3YWxsX3RvX21vbm90b25pYy50dl9uc2VjKTsKK30KKworLyoqCisgKiBtb25vdG9uaWNfdG9fYm9vdGJhc2VkIC0gQ29udmVydCB0aGUgbW9ub3RvbmljIHRpbWUgdG8gYm9vdCBiYXNlZC4KKyAqIEB0czoJCXBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHRvIGJlIGNvbnZlcnRlZAorICovCit2b2lkIG1vbm90b25pY190b19ib290YmFzZWQoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwl0cy0+dHZfc2VjICs9IHRvdGFsX3NsZWVwX3RpbWU7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKaW5kZXggOGJiY2ZiNy4uZTVlZGMzYSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwpAQCAtMzgsNyArMzgsNyBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9uYW1lX29mZnNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnN5bSkKIHsKLQljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTl07CiAKIAlpZiAobG9va3VwX3N5bWJvbF9uYW1lKCh1bnNpZ25lZCBsb25nKXN5bSwgc3ltbmFtZSkgPCAwKQogCQlTRVFfcHJpbnRmKG0sICI8JXA+Iiwgc3ltKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCmluZGV4IDMyMTY5MzcuLjhlZDYyZmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMKKysrIGIva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYwpAQCAtNjgsNiArNjgsNyBAQAogCSAqIE51bWJlciBvZiB0aW1lb3V0IGV2ZW50czoKIAkgKi8KIAl1bnNpZ25lZCBsb25nCQljb3VudDsKKwl1bnNpZ25lZCBpbnQJCXRpbWVyX2ZsYWc7CiAKIAkvKgogCSAqIFdlIHNhdmUgdGhlIGNvbW1hbmQtbGluZSBzdHJpbmcgdG8gcHJlc2VydmUKQEAgLTIzMSw3ICsyMzIsOCBAQAogICogaW5jcmVtZW50ZWQuIE90aGVyd2lzZSB0aGUgdGltZXIgaXMgcmVnaXN0ZXJlZCBpbiBhIGZyZWUgc2xvdC4KICAqLwogdm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAotCQkJICAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSkKKwkJCSAgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqY29tbSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCB0aW1lcl9mbGFnKQogewogCS8qCiAJICogSXQgZG9lc250IG1hdHRlciB3aGljaCBsb2NrIHdlIHRha2U6CkBAIC0yNDksNiArMjUxLDcgQEAKIAlpbnB1dC5zdGFydF9mdW5jID0gc3RhcnRmOwogCWlucHV0LmV4cGlyZV9mdW5jID0gdGltZXJmOwogCWlucHV0LnBpZCA9IHBpZDsKKwlpbnB1dC50aW1lcl9mbGFnID0gdGltZXJfZmxhZzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKIAlpZiAoIWFjdGl2ZSkKQEAgLTI2Niw3ICsyNjksNyBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9uYW1lX29mZnNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTl07CiAKIAlpZiAobG9va3VwX3N5bWJvbF9uYW1lKGFkZHIsIHN5bW5hbWUpIDwgMCkKIAkJc2VxX3ByaW50ZihtLCAiPCVwPiIsICh2b2lkICopYWRkcik7CkBAIC0yOTUsNyArMjk4LDcgQEAKIAlwZXJpb2QgPSBrdGltZV90b190aW1lc3BlYyh0aW1lKTsKIAltcyA9IHBlcmlvZC50dl9uc2VjIC8gMTAwMDAwMDsKIAotCXNlcV9wdXRzKG0sICJUaW1lciBTdGF0cyBWZXJzaW9uOiB2MC4xXG4iKTsKKwlzZXFfcHV0cyhtLCAiVGltZXIgU3RhdHMgVmVyc2lvbjogdjAuMlxuIik7CiAJc2VxX3ByaW50ZihtLCAiU2FtcGxlIHBlcmlvZDogJWxkLiUwM2xkIHNcbiIsIHBlcmlvZC50dl9zZWMsIG1zKTsKIAlpZiAoYXRvbWljX3JlYWQoJm92ZXJmbG93X2NvdW50KSkKIAkJc2VxX3ByaW50ZihtLCAiT3ZlcmZsb3c6ICVkIGVudHJpZXNcbiIsCkBAIC0zMDMsOCArMzA2LDEzIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZW50cmllczsgaSsrKSB7CiAJCWVudHJ5ID0gZW50cmllcyArIGk7Ci0JCXNlcV9wcmludGYobSwgIiU0bHUsICU1ZCAlLTE2cyAiLAorIAkJaWYgKGVudHJ5LT50aW1lcl9mbGFnICYgVElNRVJfU1RBVFNfRkxBR19ERUZFUlJBQkxFKSB7CisJCQlzZXFfcHJpbnRmKG0sICIlNGx1RCwgJTVkICUtMTZzICIsCiAJCQkJZW50cnktPmNvdW50LCBlbnRyeS0+cGlkLCBlbnRyeS0+Y29tbSk7CisJCX0gZWxzZSB7CisJCQlzZXFfcHJpbnRmKG0sICIgJTRsdSwgJTVkICUtMTZzICIsCisJCQkJZW50cnktPmNvdW50LCBlbnRyeS0+cGlkLCBlbnRyeS0+Y29tbSk7CisJCX0KIAogCQlwcmludF9uYW1lX29mZnNldChtLCAodW5zaWduZWQgbG9uZyllbnRyeS0+c3RhcnRfZnVuYyk7CiAJCXNlcV9wdXRzKG0sICIgKCIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCAxYTY5NzA1Li5iNzc5MmZiIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtMzA1LDYgKzMwNSwyMCBAQAogCW1lbWNweSh0aW1lci0+c3RhcnRfY29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CiAJdGltZXItPnN0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKIH0KKworc3RhdGljIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJdW5zaWduZWQgaW50IGZsYWcgPSAwOworCisJaWYgKHVubGlrZWx5KHRiYXNlX2dldF9kZWZlcnJhYmxlKHRpbWVyLT5iYXNlKSkpCisJCWZsYWcgfD0gVElNRVJfU1RBVFNfRkxBR19ERUZFUlJBQkxFOworCisJdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKKwkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSwgZmxhZyk7Cit9CisKKyNlbHNlCitzdGF0aWMgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikge30KICNlbmRpZgogCiAvKioKQEAgLTExMTQsNiArMTEyOCw3IEBACiAJCWdldG5zdGltZW9mZGF5KCZ0cCk7CiAJCXRwLnR2X3NlYyArPSB3YWxsX3RvX21vbm90b25pYy50dl9zZWM7CiAJCXRwLnR2X25zZWMgKz0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYzsKKwkJbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmdHApOwogCQlpZiAodHAudHZfbnNlYyAtIE5TRUNfUEVSX1NFQyA+PSAwKSB7CiAJCQl0cC50dl9uc2VjID0gdHAudHZfbnNlYyAtIE5TRUNfUEVSX1NFQzsKIAkJCXRwLnR2X3NlYysrOwpAQCAtMTIwNiw3ICsxMjIxLDggQEAKIAkJCS8qCiAJCQkgKiBUaGUgQVBzIHVzZSB0aGlzIHBhdGggbGF0ZXIgaW4gYm9vdAogCQkJICovCi0JCQliYXNlID0ga21hbGxvY19ub2RlKHNpemVvZigqYmFzZSksIEdGUF9LRVJORUwsCisJCQliYXNlID0ga21hbGxvY19ub2RlKHNpemVvZigqYmFzZSksCisJCQkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKIAkJCQkJCWNwdV90b19ub2RlKGNwdSkpOwogCQkJaWYgKCFiYXNlKQogCQkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTIxNyw3ICsxMjMzLDYgQEAKIAkJCQlrZnJlZShiYXNlKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KLQkJCW1lbXNldChiYXNlLCAwLCBzaXplb2YoKmJhc2UpKTsKIAkJCXBlcl9jcHUodHZlY19iYXNlcywgY3B1KSA9IGJhc2U7CiAJCX0gZWxzZSB7CiAJCQkvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmMKaW5kZXggNDg2OTU2My4uOThiODI1MCAxMDA2NDQKLS0tIGEva2VybmVsL3VzZXIuYworKysgYi9rZXJuZWwvdXNlci5jCkBAIC0xNCwyMCArMTQsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgogCiAvKgogICogVUlEIHRhc2sgY291bnQgY2FjaGUsIHRvIGdldCBmYXN0IHVzZXIgbG9va3VwIGluICJhbGxvY191aWQiCiAgKiB3aGVuIGNoYW5naW5nIHVzZXIgSUQncyAoaWUgc2V0dWlkKCkgYW5kIGZyaWVuZHMpLgogICovCiAKLSNkZWZpbmUgVUlESEFTSF9CSVRTIChDT05GSUdfQkFTRV9TTUFMTCA/IDMgOiA4KQotI2RlZmluZSBVSURIQVNIX1NaCQkoMSA8PCBVSURIQVNIX0JJVFMpCiAjZGVmaW5lIFVJREhBU0hfTUFTSwkJKFVJREhBU0hfU1ogLSAxKQogI2RlZmluZSBfX3VpZGhhc2hmbih1aWQpCSgoKHVpZCA+PiBVSURIQVNIX0JJVFMpICsgdWlkKSAmIFVJREhBU0hfTUFTSykKLSNkZWZpbmUgdWlkaGFzaGVudHJ5KHVpZCkJKHVpZGhhc2hfdGFibGUgKyBfX3VpZGhhc2hmbigodWlkKSkpCisjZGVmaW5lIHVpZGhhc2hlbnRyeShucywgdWlkKQkoKG5zKS0+dWlkaGFzaF90YWJsZSArIF9fdWlkaGFzaGZuKCh1aWQpKSkKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp1aWRfY2FjaGVwOwotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdWlkaGFzaF90YWJsZVtVSURIQVNIX1NaXTsKIAogLyoKICAqIFRoZSB1aWRoYXNoX2xvY2sgaXMgbW9zdGx5IHRha2VuIGZyb20gcHJvY2VzcyBjb250ZXh0LCBidXQgaXQgaXMKQEAgLTk0LDkgKzkzLDEwIEBACiB7CiAJc3RydWN0IHVzZXJfc3RydWN0ICpyZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zID0gY3VycmVudC0+bnNwcm94eS0+dXNlcl9uczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1aWRoYXNoX2xvY2ssIGZsYWdzKTsKLQlyZXQgPSB1aWRfaGFzaF9maW5kKHVpZCwgdWlkaGFzaGVudHJ5KHVpZCkpOworCXJldCA9IHVpZF9oYXNoX2ZpbmQodWlkLCB1aWRoYXNoZW50cnkobnMsIHVpZCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVpZGhhc2hfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMjAsOSArMTIwLDkgQEAKIAl9CiB9CiAKLXN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZCh1aWRfdCB1aWQpCitzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKiBhbGxvY191aWQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucywgdWlkX3QgdWlkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hlbnQgPSB1aWRoYXNoZW50cnkodWlkKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoZW50ID0gdWlkaGFzaGVudHJ5KG5zLCB1aWQpOwogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXA7CiAKIAlzcGluX2xvY2tfaXJxKCZ1aWRoYXNoX2xvY2spOwpAQCAtMjExLDExICsyMTEsMTEgQEAKIAkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKIAogCWZvcihuID0gMDsgbiA8IFVJREhBU0hfU1o7ICsrbikKLQkJSU5JVF9MSVNUX0hFQUQodWlkaGFzaF90YWJsZSArIG4pOworCQlJTklUX0xJU1RfSEVBRChpbml0X3VzZXJfbnMudWlkaGFzaF90YWJsZSArIG4pOwogCiAJLyogSW5zZXJ0IHRoZSByb290IHVzZXIgaW1tZWRpYXRlbHkgKGluaXQgYWxyZWFkeSBydW5zIGFzIHJvb3QpICovCiAJc3Bpbl9sb2NrX2lycSgmdWlkaGFzaF9sb2NrKTsKLQl1aWRfaGFzaF9pbnNlcnQoJnJvb3RfdXNlciwgdWlkaGFzaGVudHJ5KDApKTsKKwl1aWRfaGFzaF9pbnNlcnQoJnJvb3RfdXNlciwgdWlkaGFzaGVudHJ5KCZpbml0X3VzZXJfbnMsIDApKTsKIAlzcGluX3VubG9ja19pcnEoJnVpZGhhc2hfbG9jayk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jIGIva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1NWQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqICBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CisKK3N0cnVjdCB1c2VyX25hbWVzcGFjZSBpbml0X3VzZXJfbnMgPSB7CisJLmtyZWYgPSB7CisJCS5yZWZjb3VudAk9IEFUT01JQ19JTklUKDIpLAorCX0sCisJLnJvb3RfdXNlciA9ICZyb290X3VzZXIsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChpbml0X3VzZXJfbnMpOworCisjaWZkZWYgQ09ORklHX1VTRVJfTlMKKworLyoKKyAqIENsb25lIGEgbmV3IG5zIGNvcHlpbmcgYW4gb3JpZ2luYWwgdXNlciBucywgc2V0dGluZyByZWZjb3VudCB0byAxCisgKiBAb2xkX25zOiBuYW1lc3BhY2UgdG8gY2xvbmUKKyAqIFJldHVybiBOVUxMIG9uIGVycm9yIChmYWlsdXJlIHRvIGttYWxsb2MpLCBuZXcgbnMgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmNsb25lX3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvbGRfbnMpCit7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpuczsKKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKm5ld191c2VyOworCWludCBuOworCisJbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5zKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWtyZWZfaW5pdCgmbnMtPmtyZWYpOworCisJZm9yIChuID0gMDsgbiA8IFVJREhBU0hfU1o7ICsrbikKKwkJSU5JVF9MSVNUX0hFQUQobnMtPnVpZGhhc2hfdGFibGUgKyBuKTsKKworCS8qIEluc2VydCBuZXcgcm9vdCB1c2VyLiAgKi8KKwlucy0+cm9vdF91c2VyID0gYWxsb2NfdWlkKG5zLCAwKTsKKwlpZiAoIW5zLT5yb290X3VzZXIpIHsKKwkJa2ZyZWUobnMpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwkvKiBSZXNldCBjdXJyZW50LT51c2VyIHdpdGggYSBuZXcgb25lICovCisJbmV3X3VzZXIgPSBhbGxvY191aWQobnMsIGN1cnJlbnQtPnVpZCk7CisJaWYgKCFuZXdfdXNlcikgeworCQlmcmVlX3VpZChucy0+cm9vdF91c2VyKTsKKwkJa2ZyZWUobnMpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlzd2l0Y2hfdWlkKG5ld191c2VyKTsKKwlyZXR1cm4gbnM7Cit9CisKK3N0cnVjdCB1c2VyX25hbWVzcGFjZSAqIGNvcHlfdXNlcl9ucyhpbnQgZmxhZ3MsIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqb2xkX25zKQoreworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbmV3X25zOworCisJQlVHX09OKCFvbGRfbnMpOworCWdldF91c2VyX25zKG9sZF9ucyk7CisKKwlpZiAoIShmbGFncyAmIENMT05FX05FV1VTRVIpKQorCQlyZXR1cm4gb2xkX25zOworCisJbmV3X25zID0gY2xvbmVfdXNlcl9ucyhvbGRfbnMpOworCisJcHV0X3VzZXJfbnMob2xkX25zKTsKKwlyZXR1cm4gbmV3X25zOworfQorCit2b2lkIGZyZWVfdXNlcl9ucyhzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zOworCisJbnMgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHVzZXJfbmFtZXNwYWNlLCBrcmVmKTsKKwlrZnJlZShucyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVVNFUl9OUyAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3V0c25hbWUuYyBiL2tlcm5lbC91dHNuYW1lLmMKaW5kZXggMTYwYzhjNS4uOWQ4MTgwYSAxMDA2NDQKLS0tIGEva2VybmVsL3V0c25hbWUuYworKysgYi9rZXJuZWwvdXRzbmFtZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdXRzLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogLyoKICAqIENsb25lIGEgbmV3IG5zIGNvcHlpbmcgYW4gb3JpZ2luYWwgdXRzbmFtZSwgc2V0dGluZyByZWZjb3VudCB0byAxCkBAIC0yNCwxMCArMjUsMTEgQEAKIAlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnM7CiAKIAlucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1dHNfbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5zKSB7Ci0JCW1lbWNweSgmbnMtPm5hbWUsICZvbGRfbnMtPm5hbWUsIHNpemVvZihucy0+bmFtZSkpOwotCQlrcmVmX2luaXQoJm5zLT5rcmVmKTsKLQl9CisJaWYgKCFucykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1jcHkoJm5zLT5uYW1lLCAmb2xkX25zLT5uYW1lLCBzaXplb2YobnMtPm5hbWUpKTsKKwlrcmVmX2luaXQoJm5zLT5rcmVmKTsKIAlyZXR1cm4gbnM7CiB9CiAKQEAgLTM3LDcgKzM5LDcgQEAKICAqIHV0c25hbWUgb2YgdGhpcyBwcm9jZXNzIHdvbid0IGJlIHNlZW4gYnkgcGFyZW50LCBhbmQgdmljZQogICogdmVyc2EuCiAgKi8KLXN0cnVjdCB1dHNfbmFtZXNwYWNlICpjb3B5X3V0c25hbWUoaW50IGZsYWdzLCBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqb2xkX25zKQorc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZSh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqb2xkX25zKQogewogCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpuZXdfbnM7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jIGIva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKaW5kZXggZjIyYjlkYi4uYzc2YzA2NCAxMDA2NDQKLS0tIGEva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKKysrIGIva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKQEAgLTE4LDEwICsxOCw3IEBACiBzdGF0aWMgdm9pZCAqZ2V0X3V0cyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUpCiB7CiAJY2hhciAqd2hpY2ggPSB0YWJsZS0+ZGF0YTsKLSNpZmRlZiBDT05GSUdfVVRTX05TCi0Jc3RydWN0IHV0c19uYW1lc3BhY2UgKnV0c19ucyA9IGN1cnJlbnQtPm5zcHJveHktPnV0c19uczsKLQl3aGljaCA9ICh3aGljaCAtIChjaGFyICopJmluaXRfdXRzX25zKSArIChjaGFyICopdXRzX25zOwotI2VuZGlmCisKIAlpZiAoIXdyaXRlKQogCQlkb3duX3JlYWQoJnV0c19zZW0pOwogCWVsc2UKZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCAzYmViZjczLi41OGU1YzE1IDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0yODIsOCArMjgyLDggQEAKIAlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSA9IF9fY3dxOwogCURFRklORV9XQUlUKHdhaXQpOwogCi0JaWYgKCFjd3EtPndxLT5mcmVlemVhYmxlKQotCQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKwlpZiAoY3dxLT53cS0+ZnJlZXplYWJsZSkKKwkJc2V0X2ZyZWV6YWJsZSgpOwogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtNSk7CiAKQEAgLTM4MiwxNiArMzgyLDE2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChmbHVzaF93b3JrcXVldWUpOwogCiAvKgotICogVXBvbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgY2FsbGVyICJvd25zIiBXT1JLX1NUUlVDVF9QRU5ESU5HIGJpdCwKKyAqIFVwb24gYSBzdWNjZXNzZnVsIHJldHVybiAoPj0gMCksIHRoZSBjYWxsZXIgIm93bnMiIFdPUktfU1RSVUNUX1BFTkRJTkcgYml0LAogICogc28gdGhpcyB3b3JrIGNhbid0IGJlIHJlLWFybWVkIGluIGFueSB3YXkuCiAgKi8KIHN0YXRpYyBpbnQgdHJ5X3RvX2dyYWJfcGVuZGluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3E7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IC0xOwogCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFdPUktfU1RSVUNUX1BFTkRJTkcsIHdvcmtfZGF0YV9iaXRzKHdvcmspKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBUaGUgcXVldWVpbmcgaXMgaW4gcHJvZ3Jlc3MsIG9yIGl0IGlzIGFscmVhZHkgcXVldWVkLiBUcnkgdG8KQEAgLTQ1NywxMCArNDU3LDI4IEBACiAJCXdhaXRfb25fY3B1X3dvcmsocGVyX2NwdV9wdHIod3EtPmNwdV93cSwgY3B1KSwgd29yayk7CiB9CiAKK3N0YXRpYyBpbnQgX19jYW5jZWxfd29ya190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssCisJCQkJc3RydWN0IHRpbWVyX2xpc3QqIHRpbWVyKQoreworCWludCByZXQ7CisKKwlkbyB7CisJCXJldCA9ICh0aW1lciAmJiBsaWtlbHkoZGVsX3RpbWVyKHRpbWVyKSkpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHRyeV90b19ncmFiX3BlbmRpbmcod29yayk7CisJCXdhaXRfb25fd29yayh3b3JrKTsKKwl9IHdoaWxlICh1bmxpa2VseShyZXQgPCAwKSk7CisKKwl3b3JrX2NsZWFyX3BlbmRpbmcod29yayk7CisJcmV0dXJuIHJldDsKK30KKwogLyoqCiAgKiBjYW5jZWxfd29ya19zeW5jIC0gYmxvY2sgdW50aWwgYSB3b3JrX3N0cnVjdCdzIGNhbGxiYWNrIGhhcyB0ZXJtaW5hdGVkCiAgKiBAd29yazogdGhlIHdvcmsgd2hpY2ggaXMgdG8gYmUgZmx1c2hlZAogICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAd29yayB3YXMgcGVuZGluZy4KKyAqCiAgKiBjYW5jZWxfd29ya19zeW5jKCkgd2lsbCBjYW5jZWwgdGhlIHdvcmsgaWYgaXQgaXMgcXVldWVkLiBJZiB0aGUgd29yaydzCiAgKiBjYWxsYmFjayBhcHBlYXJzIHRvIGJlIHJ1bm5pbmcsIGNhbmNlbF93b3JrX3N5bmMoKSB3aWxsIGJsb2NrIHVudGlsIGl0CiAgKiBoYXMgY29tcGxldGVkLgpAQCAtNDc2LDMxICs0OTQsMjYgQEAKICAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB3b3JrcXVldWVfc3RydWN0IG9uIHdoaWNoIHRoaXMgd29yayB3YXMgbGFzdAogICogcXVldWVkIGNhbid0IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgogICovCi12b2lkIGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoraW50IGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXdoaWxlICghdHJ5X3RvX2dyYWJfcGVuZGluZyh3b3JrKSkKLQkJY3B1X3JlbGF4KCk7Ci0Jd2FpdF9vbl93b3JrKHdvcmspOwotCXdvcmtfY2xlYXJfcGVuZGluZyh3b3JrKTsKKwlyZXR1cm4gX19jYW5jZWxfd29ya190aW1lcih3b3JrLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNhbmNlbF93b3JrX3N5bmMpOwogCiAvKioKLSAqIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsgLSByZWxpYWJseSBraWxsIG9mZiBhIGRlbGF5ZWQgd29yay4KKyAqIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyAtIHJlbGlhYmx5IGtpbGwgb2ZmIGEgZGVsYXllZCB3b3JrLgogICogQGR3b3JrOiB0aGUgZGVsYXllZCB3b3JrIHN0cnVjdAogICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAZHdvcmsgd2FzIHBlbmRpbmcuCisgKgogICogSXQgaXMgcG9zc2libGUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gaWYgQGR3b3JrIHJlYXJtcyBpdHNlbGYgdmlhIHF1ZXVlX3dvcmsoKQogICogb3IgcXVldWVfZGVsYXllZF93b3JrKCkuIFNlZSBhbHNvIHRoZSBjb21tZW50IGZvciBjYW5jZWxfd29ya19zeW5jKCkuCiAgKi8KLXZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKK2ludCBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmspCiB7Ci0Jd2hpbGUgKCFkZWxfdGltZXIoJmR3b3JrLT50aW1lcikgJiYKLQkgICAgICAgIXRyeV90b19ncmFiX3BlbmRpbmcoJmR3b3JrLT53b3JrKSkKLQkJY3B1X3JlbGF4KCk7Ci0Jd2FpdF9vbl93b3JrKCZkd29yay0+d29yayk7Ci0Jd29ya19jbGVhcl9wZW5kaW5nKCZkd29yay0+d29yayk7CisJcmV0dXJuIF9fY2FuY2VsX3dvcmtfdGltZXIoJmR3b3JrLT53b3JrLCAmZHdvcmstPnRpbWVyKTsKIH0KLUVYUE9SVF9TWU1CT0woY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayk7CitFWFBPUlRfU1lNQk9MKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyk7CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2V2ZW50ZF93cSBfX3JlYWRfbW9zdGx5OwogCkBAIC03MzksMTggKzc1MiwxNyBAQAogCWlmIChjd3EtPnRocmVhZCA9PSBOVUxMKQogCQlyZXR1cm47CiAKKwlmbHVzaF9jcHVfd29ya3F1ZXVlKGN3cSk7CiAJLyoKLQkgKiBJZiB0aGUgY2FsbGVyIGlzIENQVV9ERUFEIHRoZSBzaW5nbGUgZmx1c2hfY3B1X3dvcmtxdWV1ZSgpCi0JICogaXMgbm90IGVub3VnaCwgYSBjb25jdXJyZW50IGZsdXNoX3dvcmtxdWV1ZSgpIGNhbiBpbnNlcnQgYQotCSAqIGJhcnJpZXIgYWZ0ZXIgdXMuCisJICogSWYgdGhlIGNhbGxlciBpcyBDUFVfREVBRCBhbmQgY3dxLT53b3JrbGlzdCB3YXMgbm90IGVtcHR5LAorCSAqIGEgY29uY3VycmVudCBmbHVzaF93b3JrcXVldWUoKSBjYW4gaW5zZXJ0IGEgYmFycmllciBhZnRlciB1cy4KKwkgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgcnVuX3dvcmtxdWV1ZSgpIHdvbid0IHJldHVybiBhbmQgY2hlY2sKKwkgKiBrdGhyZWFkX3Nob3VsZF9zdG9wKCkgdW50aWwgaXQgZmx1c2hlcyBhbGwgd29ya19zdHJ1Y3Qncy4KIAkgKiBXaGVuIC0+d29ya2xpc3QgYmVjb21lcyBlbXB0eSBpdCBpcyBzYWZlIHRvIGV4aXQgYmVjYXVzZSBubwogCSAqIG1vcmUgd29ya19zdHJ1Y3RzIGNhbiBiZSBxdWV1ZWQgb24gdGhpcyBjd3E6IGZsdXNoX3dvcmtxdWV1ZQogCSAqIGNoZWNrcyBsaXN0X2VtcHR5KCksIGFuZCBhICJub3JtYWwiIHF1ZXVlX3dvcmsoKSBjYW4ndCB1c2UKIAkgKiBhIGRlYWQgQ1BVLgogCSAqLwotCXdoaWxlIChmbHVzaF9jcHVfd29ya3F1ZXVlKGN3cSkpCi0JCTsKLQogCWt0aHJlYWRfc3RvcChjd3EtPnRocmVhZCk7CiAJY3dxLT50aHJlYWQgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcgYi9saWIvS2NvbmZpZwppbmRleCAzZWIyOWQ1Li5lNWMyYzUxIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZworKysgYi9saWIvS2NvbmZpZwpAQCAtNDEsNiArNDEsMTQgQEAKIAkgIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQzMyIGZ1bmN0aW9ucwogCSAgcmVxdWlyZSBNIGhlcmUuCiAKK2NvbmZpZyBDUkM3CisJdHJpc3RhdGUgIkNSQzcgZnVuY3Rpb25zIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgY2FzZSB3aGVyZSBubyBpbi1rZXJuZWwtdHJlZQorCSAgbW9kdWxlcyByZXF1aXJlIENSQzcgZnVuY3Rpb25zLCBidXQgYSBtb2R1bGUgYnVpbHQgb3V0c2lkZQorCSAgdGhlIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQzcKKwkgIGZ1bmN0aW9ucyByZXF1aXJlIE0gaGVyZS4KKwogY29uZmlnIExJQkNSQzMyQwogCXRyaXN0YXRlICJDUkMzMmMgKENhc3RhZ25vbGksIGV0IGFsKSBDeWNsaWMgUmVkdW5kYW5jeS1DaGVjayIKIAloZWxwCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IGZhYjMyYTIuLjY0MDg0NDAgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC0xNTIsNiArMTUyLDE5IEBACiAJYm9vbCAiTWVtb3J5IGxlYWsgZGVidWdnaW5nIgogCWRlcGVuZHMgb24gREVCVUdfU0xBQgogCitjb25maWcgU0xVQl9ERUJVR19PTgorCWJvb2wgIlNMVUIgZGVidWdnaW5nIG9uIGJ5IGRlZmF1bHQiCisJZGVwZW5kcyBvbiBTTFVCICYmIFNMVUJfREVCVUcKKwlkZWZhdWx0IG4KKwloZWxwCisJICBCb290IHdpdGggZGVidWdnaW5nIG9uIGJ5IGRlZmF1bHQuIFNMVUIgYm9vdHMgYnkgZGVmYXVsdCB3aXRoCisJICB0aGUgcnVudGltZSBkZWJ1ZyBjYXBhYmlsaXRpZXMgc3dpdGNoZWQgb2ZmLiBFbmFibGluZyB0aGlzIGlzCisJICBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlICJzbHViX2RlYnVnIiBwYXJhbWV0ZXIgb24gYm9vdC4KKwkgIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIG1vcmUgZmluZSBncmFpbmVkIGRlYnVnIGNvbnRyb2wgbGlrZQorCSAgcG9zc2libGUgd2l0aCBzbHViX2RlYnVnPXh4eC4gU0xVQiBkZWJ1Z2dpbmcgbWF5IGJlIHN3aXRjaGVkCisJICBvZmYgaW4gYSBrZXJuZWwgYnVpbHQgd2l0aCBDT05GSUdfU0xVQl9ERUJVR19PTiBieSBzcGVjaWZ5aW5nCisJICAic2x1Yl9kZWJ1Zz0tIi4KKwogY29uZmlnIERFQlVHX1BSRUVNUFQKIAlib29sICJEZWJ1ZyBwcmVlbXB0aWJsZSBrZXJuZWwiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgUFJFRU1QVCAmJiBUUkFDRV9JUlFGTEFHU19TVVBQT1JUCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUKaW5kZXggZDFiMzY2Yi4uZGE2OGIyYyAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9NYWtlZmlsZQpAQCAtMjEsNyArMjEsNyBAQAogZW5kaWYKIAogb2JqLSQoQ09ORklHX0dFTkVSSUNfSU9NQVApICs9IGlvbWFwLm8KLW9iai0kKENPTkZJR19IQVNfSU9NRU0pICs9IGlvbWFwX2NvcHkubyBkZXZyZXMubworb2JqLSQoQ09ORklHX0hBU19JT01FTSkgKz0gaW9tYXBfY29weS5vIGRldnJlcy5vIGNoZWNrX3NpZ25hdHVyZS5vCiBvYmotJChDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTKSArPSBsb2NraW5nLXNlbGZ0ZXN0Lm8KIG9iai0kKENPTkZJR19ERUJVR19TUElOTE9DSykgKz0gc3BpbmxvY2tfZGVidWcubwogbGliLSQoQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0spICs9IHJ3c2VtLXNwaW5sb2NrLm8KQEAgLTQzLDYgKzQzLDcgQEAKIG9iai0kKENPTkZJR19DUkMxNikJKz0gY3JjMTYubwogb2JqLSQoQ09ORklHX0NSQ19JVFVfVCkJKz0gY3JjLWl0dS10Lm8KIG9iai0kKENPTkZJR19DUkMzMikJKz0gY3JjMzIubworb2JqLSQoQ09ORklHX0NSQzcpCSs9IGNyYzcubwogb2JqLSQoQ09ORklHX0xJQkNSQzMyQykJKz0gbGliY3JjMzJjLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0FMTE9DQVRPUikgKz0gZ2VuYWxsb2MubwogCmRpZmYgLS1naXQgYS9saWIvYnVnLmMgYi9saWIvYnVnLmMKaW5kZXggMDE0YjU4Mi4uNTMwZjM4ZiAxMDA2NDQKLS0tIGEvbGliL2J1Zy5jCisrKyBiL2xpYi9idWcuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiBleHRlcm4gY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSBfX3N0YXJ0X19fYnVnX3RhYmxlW10sIF9fc3RvcF9fX2J1Z190YWJsZVtdOwogCkBAIC0xMTIsNyArMTEzLDcgQEAKIAlyZXR1cm4gbW9kdWxlX2ZpbmRfYnVnKGJ1Z2FkZHIpOwogfQogCi1lbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpCitlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWNvbnN0IHN0cnVjdCBidWdfZW50cnkgKmJ1ZzsKIAljb25zdCBjaGFyICpmaWxlOwpAQCAtMTQ3LDcgKzE0OCw3IEBACiAJCQkgICAgICAgIlt2ZXJib3NlIGRlYnVnIGluZm8gdW5hdmFpbGFibGVdXG4iLAogCQkJICAgICAgICh2b2lkICopYnVnYWRkcik7CiAKLQkJZHVtcF9zdGFjaygpOworCQlzaG93X3JlZ3MocmVncyk7CiAJCXJldHVybiBCVUdfVFJBUF9UWVBFX1dBUk47CiAJfQogCmRpZmYgLS1naXQgYS9saWIvY2hlY2tfc2lnbmF0dXJlLmMgYi9saWIvY2hlY2tfc2lnbmF0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2YWYxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jaGVja19zaWduYXR1cmUuYwpAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoqCisgKgljaGVja19zaWduYXR1cmUJCS0JZmluZCBCSU9TIHNpZ25hdHVyZXMKKyAqCUBpb19hZGRyOiBtbWlvIGFkZHJlc3MgdG8gY2hlY2sKKyAqCUBzaWduYXR1cmU6ICBzaWduYXR1cmUgYmxvY2sKKyAqCUBsZW5ndGg6IGxlbmd0aCBvZiBzaWduYXR1cmUKKyAqCisgKglQZXJmb3JtIGEgc2lnbmF0dXJlIGNvbXBhcmlzb24gd2l0aCB0aGUgbW1pbyBhZGRyZXNzIGlvX2FkZHIuIFRoaXMKKyAqCWFkZHJlc3Mgc2hvdWxkIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBpb3JlbWFwLgorICoJUmV0dXJucyAxIG9uIGEgbWF0Y2guCisgKi8KKworaW50IGNoZWNrX3NpZ25hdHVyZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmlvX2FkZHIsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCit7CisJd2hpbGUgKGxlbmd0aC0tKSB7CisJCWlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQorCQkJcmV0dXJuIDA7CisJCWlvX2FkZHIrKzsKKwkJc2lnbmF0dXJlKys7CisJfQorCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChjaGVja19zaWduYXR1cmUpOwpkaWZmIC0tZ2l0IGEvbGliL2NyYzcuYyBiL2xpYi9jcmM3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjM2ExNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcmM3LmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICAgICAgY3JjNy5jCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjNy5oPgorCisKKy8qIFRhYmxlIGZvciBDUkMtNyAocG9seW5vbWlhbCB4XjcgKyB4XjMgKyAxKSAqLworY29uc3QgdTggY3JjN19zeW5kcm9tZV90YWJsZVsyNTZdID0geworCTB4MDAsIDB4MDksIDB4MTIsIDB4MWIsIDB4MjQsIDB4MmQsIDB4MzYsIDB4M2YsCisJMHg0OCwgMHg0MSwgMHg1YSwgMHg1MywgMHg2YywgMHg2NSwgMHg3ZSwgMHg3NywKKwkweDE5LCAweDEwLCAweDBiLCAweDAyLCAweDNkLCAweDM0LCAweDJmLCAweDI2LAorCTB4NTEsIDB4NTgsIDB4NDMsIDB4NGEsIDB4NzUsIDB4N2MsIDB4NjcsIDB4NmUsCisJMHgzMiwgMHgzYiwgMHgyMCwgMHgyOSwgMHgxNiwgMHgxZiwgMHgwNCwgMHgwZCwKKwkweDdhLCAweDczLCAweDY4LCAweDYxLCAweDVlLCAweDU3LCAweDRjLCAweDQ1LAorCTB4MmIsIDB4MjIsIDB4MzksIDB4MzAsIDB4MGYsIDB4MDYsIDB4MWQsIDB4MTQsCisJMHg2MywgMHg2YSwgMHg3MSwgMHg3OCwgMHg0NywgMHg0ZSwgMHg1NSwgMHg1YywKKwkweDY0LCAweDZkLCAweDc2LCAweDdmLCAweDQwLCAweDQ5LCAweDUyLCAweDViLAorCTB4MmMsIDB4MjUsIDB4M2UsIDB4MzcsIDB4MDgsIDB4MDEsIDB4MWEsIDB4MTMsCisJMHg3ZCwgMHg3NCwgMHg2ZiwgMHg2NiwgMHg1OSwgMHg1MCwgMHg0YiwgMHg0MiwKKwkweDM1LCAweDNjLCAweDI3LCAweDJlLCAweDExLCAweDE4LCAweDAzLCAweDBhLAorCTB4NTYsIDB4NWYsIDB4NDQsIDB4NGQsIDB4NzIsIDB4N2IsIDB4NjAsIDB4NjksCisJMHgxZSwgMHgxNywgMHgwYywgMHgwNSwgMHgzYSwgMHgzMywgMHgyOCwgMHgyMSwKKwkweDRmLCAweDQ2LCAweDVkLCAweDU0LCAweDZiLCAweDYyLCAweDc5LCAweDcwLAorCTB4MDcsIDB4MGUsIDB4MTUsIDB4MWMsIDB4MjMsIDB4MmEsIDB4MzEsIDB4MzgsCisJMHg0MSwgMHg0OCwgMHg1MywgMHg1YSwgMHg2NSwgMHg2YywgMHg3NywgMHg3ZSwKKwkweDA5LCAweDAwLCAweDFiLCAweDEyLCAweDJkLCAweDI0LCAweDNmLCAweDM2LAorCTB4NTgsIDB4NTEsIDB4NGEsIDB4NDMsIDB4N2MsIDB4NzUsIDB4NmUsIDB4NjcsCisJMHgxMCwgMHgxOSwgMHgwMiwgMHgwYiwgMHgzNCwgMHgzZCwgMHgyNiwgMHgyZiwKKwkweDczLCAweDdhLCAweDYxLCAweDY4LCAweDU3LCAweDVlLCAweDQ1LCAweDRjLAorCTB4M2IsIDB4MzIsIDB4MjksIDB4MjAsIDB4MWYsIDB4MTYsIDB4MGQsIDB4MDQsCisJMHg2YSwgMHg2MywgMHg3OCwgMHg3MSwgMHg0ZSwgMHg0NywgMHg1YywgMHg1NSwKKwkweDIyLCAweDJiLCAweDMwLCAweDM5LCAweDA2LCAweDBmLCAweDE0LCAweDFkLAorCTB4MjUsIDB4MmMsIDB4MzcsIDB4M2UsIDB4MDEsIDB4MDgsIDB4MTMsIDB4MWEsCisJMHg2ZCwgMHg2NCwgMHg3ZiwgMHg3NiwgMHg0OSwgMHg0MCwgMHg1YiwgMHg1MiwKKwkweDNjLCAweDM1LCAweDJlLCAweDI3LCAweDE4LCAweDExLCAweDBhLCAweDAzLAorCTB4NzQsIDB4N2QsIDB4NjYsIDB4NmYsIDB4NTAsIDB4NTksIDB4NDIsIDB4NGIsCisJMHgxNywgMHgxZSwgMHgwNSwgMHgwYywgMHgzMywgMHgzYSwgMHgyMSwgMHgyOCwKKwkweDVmLCAweDU2LCAweDRkLCAweDQ0LCAweDdiLCAweDcyLCAweDY5LCAweDYwLAorCTB4MGUsIDB4MDcsIDB4MWMsIDB4MTUsIDB4MmEsIDB4MjMsIDB4MzgsIDB4MzEsCisJMHg0NiwgMHg0ZiwgMHg1NCwgMHg1ZCwgMHg2MiwgMHg2YiwgMHg3MCwgMHg3OQorfTsKK0VYUE9SVF9TWU1CT0woY3JjN19zeW5kcm9tZV90YWJsZSk7CisKKy8qKgorICogY3JjNyAtIHVwZGF0ZSB0aGUgQ1JDNyBmb3IgdGhlIGRhdGEgYnVmZmVyCisgKiBAY3JjOiAgICAgcHJldmlvdXMgQ1JDNyB2YWx1ZQorICogQGJ1ZmZlcjogIGRhdGEgcG9pbnRlcgorICogQGxlbjogICAgIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCisgKiBDb250ZXh0OiBhbnkKKyAqCisgKiBSZXR1cm5zIHRoZSB1cGRhdGVkIENSQzcgdmFsdWUuCisgKi8KK3U4IGNyYzcodTggY3JjLCBjb25zdCB1OCAqYnVmZmVyLCBzaXplX3QgbGVuKQoreworCXdoaWxlIChsZW4tLSkKKwkJY3JjID0gY3JjN19ieXRlKGNyYywgKmJ1ZmZlcisrKTsKKwlyZXR1cm4gY3JjOworfQorRVhQT1JUX1NZTUJPTChjcmM3KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDUkM3IGNhbGN1bGF0aW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbGliL2dlbmFsbG9jLmMgYi9saWIvZ2VuYWxsb2MuYwppbmRleCBlYjdjMmJhLi5mNmQyNzZkIDEwMDY0NAotLS0gYS9saWIvZ2VuYWxsb2MuYworKysgYi9saWIvZ2VuYWxsb2MuYwpAQCAtNTQsMTEgKzU0LDEwIEBACiAJaW50IG5ieXRlcyA9IHNpemVvZihzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmspICsKIAkJCQkobmJpdHMgKyBCSVRTX1BFUl9CWVRFIC0gMSkgLyBCSVRTX1BFUl9CWVRFOwogCi0JY2h1bmsgPSBrbWFsbG9jX25vZGUobmJ5dGVzLCBHRlBfS0VSTkVMLCBuaWQpOworCWNodW5rID0ga21hbGxvY19ub2RlKG5ieXRlcywgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIG5pZCk7CiAJaWYgKHVubGlrZWx5KGNodW5rID09IE5VTEwpKQogCQlyZXR1cm4gLTE7CiAKLQltZW1zZXQoY2h1bmssIDAsIG5ieXRlcyk7CiAJc3Bpbl9sb2NrX2luaXQoJmNodW5rLT5sb2NrKTsKIAljaHVuay0+c3RhcnRfYWRkciA9IGFkZHI7CiAJY2h1bmstPmVuZF9hZGRyID0gYWRkciArIHNpemU7CmRpZmYgLS1naXQgYS9saWIvaWRyLmMgYi9saWIvaWRyLmMKaW5kZXggYjk4ZjAxYS4uNWNhNjdiMyAxMDA2NDQKLS0tIGEvbGliL2lkci5jCisrKyBiL2xpYi9pZHIuYwpAQCAtMzkxLDYgKzM5MSw1MyBAQAogRVhQT1JUX1NZTUJPTChpZHJfcmVtb3ZlKTsKIAogLyoqCisgKiBpZHJfcmVtb3ZlX2FsbCAtIHJlbW92ZSBhbGwgaWRzIGZyb20gdGhlIGdpdmVuIGlkciB0cmVlCisgKiBAaWRwOiBpZHIgaGFuZGxlCisgKgorICogaWRyX2Rlc3Ryb3koKSBvbmx5IGZyZWVzIHVwIHVudXNlZCwgY2FjaGVkIGlkcF9sYXllcnMsIGJ1dCB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIHJlbW92ZSBhbGwgaWQgbWFwcGluZ3MgYW5kIGxlYXZlIGFsbCBpZHBfbGF5ZXJzCisgKiB1bnVzZWQuCisgKgorICogQSB0eXBpY2FsIGNsZWFuLXVwIHNlcXVlbmNlIGZvciBvYmplY3RzIHN0b3JlZCBpbiBhbiBpZHIgdHJlZSwgd2lsbAorICogdXNlIGlkcl9mb3JfZWFjaCgpIHRvIGZyZWUgYWxsIG9iamVjdHMsIGlmIG5lY2Vzc2F5LCB0aGVuCisgKiBpZHJfcmVtb3ZlX2FsbCgpIHRvIHJlbW92ZSBhbGwgaWRzLCBhbmQgaWRyX2Rlc3Ryb3koKSB0byBmcmVlCisgKiB1cCB0aGUgY2FjaGVkIGlkcl9sYXllcnMuCisgKi8KK3ZvaWQgaWRyX3JlbW92ZV9hbGwoc3RydWN0IGlkciAqaWRwKQoreworCWludCBuLCBpZCwgbWF4LCBlcnJvciA9IDA7CisJc3RydWN0IGlkcl9sYXllciAqcDsKKwlzdHJ1Y3QgaWRyX2xheWVyICpwYVtNQVhfTEVWRUxdOworCXN0cnVjdCBpZHJfbGF5ZXIgKipwYWEgPSAmcGFbMF07CisKKwluID0gaWRwLT5sYXllcnMgKiBJRFJfQklUUzsKKwlwID0gaWRwLT50b3A7CisJbWF4ID0gMSA8PCBuOworCisJaWQgPSAwOworCXdoaWxlIChpZCA8IG1heCAmJiAhZXJyb3IpIHsKKwkJd2hpbGUgKG4gPiBJRFJfQklUUyAmJiBwKSB7CisJCQluIC09IElEUl9CSVRTOworCQkJKnBhYSsrID0gcDsKKwkJCXAgPSBwLT5hcnlbKGlkID4+IG4pICYgSURSX01BU0tdOworCQl9CisKKwkJaWQgKz0gMSA8PCBuOworCQl3aGlsZSAobiA8IGZscyhpZCkpIHsKKwkJCWlmIChwKSB7CisJCQkJbWVtc2V0KHAsIDAsIHNpemVvZiAqcCk7CisJCQkJZnJlZV9sYXllcihpZHAsIHApOworCQkJfQorCQkJbiArPSBJRFJfQklUUzsKKwkJCXAgPSAqLS1wYWE7CisJCX0KKwl9CisJaWRwLT50b3AgPSBOVUxMOworCWlkcC0+bGF5ZXJzID0gMDsKK30KK0VYUE9SVF9TWU1CT0woaWRyX3JlbW92ZV9hbGwpOworCisvKioKICAqIGlkcl9kZXN0cm95IC0gcmVsZWFzZSBhbGwgY2FjaGVkIGxheWVycyB3aXRoaW4gYW4gaWRyIHRyZWUKICAqIGlkcDogaWRyIGhhbmRsZQogICovCkBAIC00MzcsNiArNDg0LDYxIEBACiBFWFBPUlRfU1lNQk9MKGlkcl9maW5kKTsKIAogLyoqCisgKiBpZHJfZm9yX2VhY2ggLSBpdGVyYXRlIHRocm91Z2ggYWxsIHN0b3JlZCBwb2ludGVycworICogQGlkcDogaWRyIGhhbmRsZQorICogQGZuOiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggcG9pbnRlcgorICogQGRhdGE6IGRhdGEgcGFzc2VkIGJhY2sgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBJdGVyYXRlIG92ZXIgdGhlIHBvaW50ZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZ2l2ZW4gaWRyLiAgVGhlCisgKiBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBwb2ludGVyIGN1cnJlbnRseQorICogcmVnaXN0ZXJlZCwgcGFzc2luZyB0aGUgaWQsIHRoZSBwb2ludGVyIGFuZCB0aGUgZGF0YSBwb2ludGVyIHBhc3NlZAorICogdG8gdGhpcyBmdW5jdGlvbi4gIEl0IGlzIG5vdCBzYWZlIHRvIG1vZGlmeSB0aGUgaWRyIHRyZWUgd2hpbGUgaW4KKyAqIHRoZSBjYWxsYmFjaywgc28gZnVuY3Rpb25zIHN1Y2ggYXMgaWRyX2dldF9uZXcgYW5kIGlkcl9yZW1vdmUgYXJlCisgKiBub3QgYWxsb3dlZC4KKyAqCisgKiBXZSBjaGVjayB0aGUgcmV0dXJuIG9mIEBmbiBlYWNoIHRpbWUuIElmIGl0IHJldHVybnMgYW55dGhpbmcgb3RoZXIKKyAqIHRoYW4gMCwgd2UgYnJlYWsgb3V0IGFuZCByZXR1cm4gdGhhdCB2YWx1ZS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3Qgc2VyaWFsaXplIGlkcl9mb3JfZWFjaCgpIHZzIGlkcl9nZXRfbmV3KCkgYW5kIGlkcl9yZW1vdmUoKS4KKyAqLworaW50IGlkcl9mb3JfZWFjaChzdHJ1Y3QgaWRyICppZHAsCisJCSBpbnQgKCpmbikoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbiwgaWQsIG1heCwgZXJyb3IgPSAwOworCXN0cnVjdCBpZHJfbGF5ZXIgKnA7CisJc3RydWN0IGlkcl9sYXllciAqcGFbTUFYX0xFVkVMXTsKKwlzdHJ1Y3QgaWRyX2xheWVyICoqcGFhID0gJnBhWzBdOworCisJbiA9IGlkcC0+bGF5ZXJzICogSURSX0JJVFM7CisJcCA9IGlkcC0+dG9wOworCW1heCA9IDEgPDwgbjsKKworCWlkID0gMDsKKwl3aGlsZSAoaWQgPCBtYXgpIHsKKwkJd2hpbGUgKG4gPiAwICYmIHApIHsKKwkJCW4gLT0gSURSX0JJVFM7CisJCQkqcGFhKysgPSBwOworCQkJcCA9IHAtPmFyeVsoaWQgPj4gbikgJiBJRFJfTUFTS107CisJCX0KKworCQlpZiAocCkgeworCQkJZXJyb3IgPSBmbihpZCwgKHZvaWQgKilwLCBkYXRhKTsKKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsKKwkJfQorCisJCWlkICs9IDEgPDwgbjsKKwkJd2hpbGUgKG4gPCBmbHMoaWQpKSB7CisJCQluICs9IElEUl9CSVRTOworCQkJcCA9ICotLXBhYTsKKwkJfQorCX0KKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0woaWRyX2Zvcl9lYWNoKTsKKworLyoqCiAgKiBpZHJfcmVwbGFjZSAtIHJlcGxhY2UgcG9pbnRlciBmb3IgZ2l2ZW4gaWQKICAqIEBpZHA6IGlkciBoYW5kbGUKICAqIEBwdHI6IHBvaW50ZXIgeW91IHdhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZApkaWZmIC0tZ2l0IGEvbGliL3BlcmNwdV9jb3VudGVyLmMgYi9saWIvcGVyY3B1X2NvdW50ZXIuYwppbmRleCA4NTA0NDkwLi5jZjIyYzYxIDEwMDY0NAotLS0gYS9saWIvcGVyY3B1X2NvdW50ZXIuYworKysgYi9saWIvcGVyY3B1X2NvdW50ZXIuYwpAQCAtMyw4ICszLDE3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIExJU1RfSEVBRChwZXJjcHVfY291bnRlcnMpOworc3RhdGljIERFRklORV9NVVRFWChwZXJjcHVfY291bnRlcnNfbG9jayk7CisjZW5kaWYKKwogdm9pZCBwZXJjcHVfY291bnRlcl9tb2Qoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHMzMiBhbW91bnQpCiB7CiAJbG9uZyBjb3VudDsKQEAgLTM2LDcgKzQ1LDcgQEAKIAogCXNwaW5fbG9jaygmZmJjLT5sb2NrKTsKIAlyZXQgPSBmYmMtPmNvdW50OwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlzMzIgKnBjb3VudCA9IHBlcl9jcHVfcHRyKGZiYy0+Y291bnRlcnMsIGNwdSk7CiAJCXJldCArPSAqcGNvdW50OwogCX0KQEAgLTQ0LDMgKzUzLDYwIEBACiAJcmV0dXJuIHJldCA8IDAgPyAwIDogcmV0OwogfQogRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9zdW0pOworCit2b2lkIHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCit7CisJc3Bpbl9sb2NrX2luaXQoJmZiYy0+bG9jayk7CisJZmJjLT5jb3VudCA9IGFtb3VudDsKKwlmYmMtPmNvdW50ZXJzID0gYWxsb2NfcGVyY3B1KHMzMik7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJbXV0ZXhfbG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworCWxpc3RfYWRkKCZmYmMtPmxpc3QsICZwZXJjcHVfY291bnRlcnMpOworCW11dGV4X3VubG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2luaXQpOworCit2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCit7CisJZnJlZV9wZXJjcHUoZmJjLT5jb3VudGVycyk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJbXV0ZXhfbG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworCWxpc3RfZGVsKCZmYmMtPmxpc3QpOworCW11dGV4X3VubG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3kpOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgaW50IF9fY3B1aW5pdCBwZXJjcHVfY291bnRlcl9ob3RjcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYzsKKworCWlmIChhY3Rpb24gIT0gQ1BVX0RFQUQpCisJCXJldHVybiBOT1RJRllfT0s7CisKKwljcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCW11dGV4X2xvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZiYywgJnBlcmNwdV9jb3VudGVycywgbGlzdCkgeworCQlzMzIgKnBjb3VudDsKKworCQlzcGluX2xvY2soJmZiYy0+bG9jayk7CisJCXBjb3VudCA9IHBlcl9jcHVfcHRyKGZiYy0+Y291bnRlcnMsIGNwdSk7CisJCWZiYy0+Y291bnQgKz0gKnBjb3VudDsKKwkJKnBjb3VudCA9IDA7CisJCXNwaW5fdW5sb2NrKCZmYmMtPmxvY2spOworCX0KKwltdXRleF91bmxvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwZXJjcHVfY291bnRlcl9zdGFydHVwKHZvaWQpCit7CisJaG90Y3B1X25vdGlmaWVyKHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjaywgMCk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChwZXJjcHVfY291bnRlcl9zdGFydHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCAwMTcyOTAyLi42YjY3MzRkIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMTM1LDYgKzEzNSwxMDMgQEAKIAlyZXR1cm4gaTsKIH0KIAorLyogRGVjaW1hbCBjb252ZXJzaW9uIGlzIGJ5IGZhciB0aGUgbW9zdCB0eXBpY2FsLCBhbmQgaXMgdXNlZAorICogZm9yIC9wcm9jIGFuZCAvc3lzIGRhdGEuIFRoaXMgZGlyZWN0bHkgaW1wYWN0cyBlLmcuIHRvcCBwZXJmb3JtYW5jZQorICogd2l0aCBtYW55IHByb2Nlc3NlcyBydW5uaW5nLiBXZSBvcHRpbWl6ZSBpdCBmb3Igc3BlZWQKKyAqIHVzaW5nIGNvZGUgZnJvbQorICogaHR0cDovL3d3dy5jcy51aW93YS5lZHUvfmpvbmVzL2JjZC9kZWNpbWFsLmh0bWwKKyAqICh3aXRoIHBlcm1pc3Npb24gZnJvbSB0aGUgYXV0aG9yLCBEb3VnbGFzIFcuIEpvbmVzKS4gKi8KKworLyogRm9ybWF0cyBjb3JyZWN0bHkgYW55IGludGVnZXIgaW4gWzAsOTk5OTldLgorICogT3V0cHV0cyBmcm9tIG9uZSB0byBmaXZlIGRpZ2l0cyBkZXBlbmRpbmcgb24gaW5wdXQuCisgKiBPbiBpMzg2IGdjYyA0LjEuMiAtTzI6IH4yNTAgYnl0ZXMgb2YgY29kZS4gKi8KK3N0YXRpYyBjaGFyKiBwdXRfZGVjX3RydW5jKGNoYXIgKmJ1ZiwgdW5zaWduZWQgcSkKK3sKKwl1bnNpZ25lZCBkMywgZDIsIGQxLCBkMDsKKwlkMSA9IChxPj40KSAmIDB4ZjsKKwlkMiA9IChxPj44KSAmIDB4ZjsKKwlkMyA9IChxPj4xMik7CisKKwlkMCA9IDYqKGQzICsgZDIgKyBkMSkgKyAocSAmIDB4Zik7CisJcSA9IChkMCAqIDB4Y2QpID4+IDExOworCWQwID0gZDAgLSAxMCpxOworCSpidWYrKyA9IGQwICsgJzAnOyAvKiBsZWFzdCBzaWduaWZpY2FudCBkaWdpdCAqLworCWQxID0gcSArIDkqZDMgKyA1KmQyICsgZDE7CisJaWYgKGQxICE9IDApIHsKKwkJcSA9IChkMSAqIDB4Y2QpID4+IDExOworCQlkMSA9IGQxIC0gMTAqcTsKKwkJKmJ1ZisrID0gZDEgKyAnMCc7IC8qIG5leHQgZGlnaXQgKi8KKworCQlkMiA9IHEgKyAyKmQyOworCQlpZiAoKGQyICE9IDApIHx8IChkMyAhPSAwKSkgeworCQkJcSA9IChkMiAqIDB4ZCkgPj4gNzsKKwkJCWQyID0gZDIgLSAxMCpxOworCQkJKmJ1ZisrID0gZDIgKyAnMCc7IC8qIG5leHQgZGlnaXQgKi8KKworCQkJZDMgPSBxICsgNCpkMzsKKwkJCWlmIChkMyAhPSAwKSB7CisJCQkJcSA9IChkMyAqIDB4Y2QpID4+IDExOworCQkJCWQzID0gZDMgLSAxMCpxOworCQkJCSpidWYrKyA9IGQzICsgJzAnOyAgLyogbmV4dCBkaWdpdCAqLworCQkJCWlmIChxICE9IDApCisJCQkJCSpidWYrKyA9IHEgKyAnMCc7ICAvKiBtb3N0IHNpZ24uIGRpZ2l0ICovCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGJ1ZjsKK30KKy8qIFNhbWUgd2l0aCBpZidzIHJlbW92ZWQuIEFsd2F5cyBlbWl0cyBmaXZlIGRpZ2l0cyAqLworc3RhdGljIGNoYXIqIHB1dF9kZWNfZnVsbChjaGFyICpidWYsIHVuc2lnbmVkIHEpCit7CisJLyogQlRXLCBpZiBxIGlzIGluIFswLDk5OTldLCA4LWJpdCBpbnRzIHdpbGwgYmUgZW5vdWdoLCAqLworCS8qIGJ1dCBhbnl3YXksIGdjYyBwcm9kdWNlcyBiZXR0ZXIgY29kZSB3aXRoIGZ1bGwtc2l6ZWQgaW50cyAqLworCXVuc2lnbmVkIGQzLCBkMiwgZDEsIGQwOworCWQxID0gKHE+PjQpICYgMHhmOworCWQyID0gKHE+PjgpICYgMHhmOworCWQzID0gKHE+PjEyKTsKKworCS8qIFBvc3NpYmxlIHdheXMgdG8gYXBwcm94LiBkaXZpZGUgYnkgMTAgKi8KKwkvKiBnY2MgLU8yIHJlcGxhY2VzIG11bHRpcGx5IHdpdGggc2hpZnRzIGFuZCBhZGRzICovCisJLy8gKHggKiAweGNkKSA+PiAxMTogMTEwMDExMDEgLSBzaG9ydGVyIGNvZGUgdGhhbiAqIDB4NjcgKG9uIGkzODYpCisJLy8gKHggKiAweDY3KSA+PiAxMDogIDExMDAxMTEKKwkvLyAoeCAqIDB4MzQpID4+IDk6ICAgIDExMDEwMCAtIHNhbWUKKwkvLyAoeCAqIDB4MWEpID4+IDg6ICAgICAxMTAxMCAtIHNhbWUKKwkvLyAoeCAqIDB4MGQpID4+IDc6ICAgICAgMTEwMSAtIHNhbWUsIHNob3J0ZXN0IGNvZGUgKG9uIGkzODYpCisKKwlkMCA9IDYqKGQzICsgZDIgKyBkMSkgKyAocSAmIDB4Zik7CisJcSA9IChkMCAqIDB4Y2QpID4+IDExOworCWQwID0gZDAgLSAxMCpxOworCSpidWYrKyA9IGQwICsgJzAnOworCWQxID0gcSArIDkqZDMgKyA1KmQyICsgZDE7CisJCXEgPSAoZDEgKiAweGNkKSA+PiAxMTsKKwkJZDEgPSBkMSAtIDEwKnE7CisJCSpidWYrKyA9IGQxICsgJzAnOworCisJCWQyID0gcSArIDIqZDI7CisJCQlxID0gKGQyICogMHhkKSA+PiA3OworCQkJZDIgPSBkMiAtIDEwKnE7CisJCQkqYnVmKysgPSBkMiArICcwJzsKKworCQkJZDMgPSBxICsgNCpkMzsKKwkJCQlxID0gKGQzICogMHhjZCkgPj4gMTE7IC8qIC0gc2hvcnRlciBjb2RlICovCisJCQkJLyogcSA9IChkMyAqIDB4NjcpID4+IDEwOyAtIHdvdWxkIGFsc28gd29yayAqLworCQkJCWQzID0gZDMgLSAxMCpxOworCQkJCSpidWYrKyA9IGQzICsgJzAnOworCQkJCQkqYnVmKysgPSBxICsgJzAnOworCXJldHVybiBidWY7Cit9CisvKiBObyBpbmxpbmluZyBoZWxwcyBnY2MgdG8gdXNlIHJlZ2lzdGVycyBiZXR0ZXIgKi8KK3N0YXRpYyBub2lubGluZSBjaGFyKiBwdXRfZGVjKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nIG51bSkKK3sKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCByZW07CisJCWlmIChudW0gPCAxMDAwMDApCisJCQlyZXR1cm4gcHV0X2RlY190cnVuYyhidWYsIG51bSk7CisJCXJlbSA9IGRvX2RpdihudW0sIDEwMDAwMCk7CisJCWJ1ZiA9IHB1dF9kZWNfZnVsbChidWYsIHJlbSk7CisJfQorfQorCiAjZGVmaW5lIFpFUk9QQUQJMQkJLyogcGFkIHdpdGggemVybyAqLwogI2RlZmluZSBTSUdOCTIJCS8qIHVuc2lnbmVkL3NpZ25lZCBsb25nICovCiAjZGVmaW5lIFBMVVMJNAkJLyogc2hvdyBwbHVzICovCkBAIC0xNDMsMTIgKzI0MCwxNCBAQAogI2RlZmluZSBTUEVDSUFMCTMyCQkvKiAweCAqLwogI2RlZmluZSBMQVJHRQk2NAkJLyogdXNlICdBQkNERUYnIGluc3RlYWQgb2YgJ2FiY2RlZicgKi8KIAotc3RhdGljIGNoYXIgKiBudW1iZXIoY2hhciAqIGJ1ZiwgY2hhciAqIGVuZCwgdW5zaWduZWQgbG9uZyBsb25nIG51bSwgaW50IGJhc2UsIGludCBzaXplLCBpbnQgcHJlY2lzaW9uLCBpbnQgdHlwZSkKK3N0YXRpYyBjaGFyICpudW1iZXIoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sIGludCBiYXNlLCBpbnQgc2l6ZSwgaW50IHByZWNpc2lvbiwgaW50IHR5cGUpCiB7Ci0JY2hhciBjLHNpZ24sdG1wWzY2XTsKKwljaGFyIHNpZ24sdG1wWzY2XTsKIAljb25zdCBjaGFyICpkaWdpdHM7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgc21hbGxfZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLQlzdGF0aWMgY29uc3QgY2hhciBsYXJnZV9kaWdpdHNbXSA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOworCS8qIHdlIGFyZSBjYWxsZWQgd2l0aCBiYXNlIDgsIDEwIG9yIDE2LCBvbmx5LCB0aHVzIGRvbid0IG5lZWQgImcuLi4iICAqLworCXN0YXRpYyBjb25zdCBjaGFyIHNtYWxsX2RpZ2l0c1tdID0gIjAxMjM0NTY3ODlhYmNkZWZ4IjsgLyogImdoaWprbG1ub3BxcnN0dXZ3eHl6IjsgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBsYXJnZV9kaWdpdHNbXSA9ICIwMTIzNDU2Nzg5QUJDREVGWCI7IC8qICJHSElKS0xNTk9QUVJTVFVWV1hZWiI7ICovCisJaW50IG5lZWRfcGZ4ID0gKCh0eXBlICYgU1BFQ0lBTCkgJiYgYmFzZSAhPSAxMCk7CiAJaW50IGk7CiAKIAlkaWdpdHMgPSAodHlwZSAmIExBUkdFKSA/IGxhcmdlX2RpZ2l0cyA6IHNtYWxsX2RpZ2l0czsKQEAgLTE1Niw3ICsyNTUsNiBAQAogCQl0eXBlICY9IH5aRVJPUEFEOwogCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCiAJCXJldHVybiBOVUxMOwotCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOwogCXNpZ24gPSAwOwogCWlmICh0eXBlICYgU0lHTikgewogCQlpZiAoKHNpZ25lZCBsb25nIGxvbmcpIG51bSA8IDApIHsKQEAgLTE3MSw2NCArMjY5LDg1IEBACiAJCQlzaXplLS07CiAJCX0KIAl9Ci0JaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJaWYgKG5lZWRfcGZ4KSB7CisJCXNpemUtLTsKIAkJaWYgKGJhc2UgPT0gMTYpCi0JCQlzaXplIC09IDI7Ci0JCWVsc2UgaWYgKGJhc2UgPT0gOCkKIAkJCXNpemUtLTsKIAl9CisKKwkvKiBnZW5lcmF0ZSBmdWxsIHN0cmluZyBpbiB0bXBbXSwgaW4gcmV2ZXJzZSBvcmRlciAqLwogCWkgPSAwOwogCWlmIChudW0gPT0gMCkKLQkJdG1wW2krK109JzAnOwotCWVsc2Ugd2hpbGUgKG51bSAhPSAwKQorCQl0bXBbaSsrXSA9ICcwJzsKKwkvKiBHZW5lcmljIGNvZGUsIGZvciBhbnkgYmFzZToKKwllbHNlIGRvIHsKIAkJdG1wW2krK10gPSBkaWdpdHNbZG9fZGl2KG51bSxiYXNlKV07CisJfSB3aGlsZSAobnVtICE9IDApOworCSovCisJZWxzZSBpZiAoYmFzZSAhPSAxMCkgeyAvKiA4IG9yIDE2ICovCisJCWludCBtYXNrID0gYmFzZSAtIDE7CisJCWludCBzaGlmdCA9IDM7CisJCWlmIChiYXNlID09IDE2KSBzaGlmdCA9IDQ7CisJCWRvIHsKKwkJCXRtcFtpKytdID0gZGlnaXRzWygodW5zaWduZWQgY2hhciludW0pICYgbWFza107CisJCQludW0gPj49IHNoaWZ0OworCQl9IHdoaWxlIChudW0pOworCX0gZWxzZSB7IC8qIGJhc2UgMTAgKi8KKwkJaSA9IHB1dF9kZWModG1wLCBudW0pIC0gdG1wOworCX0KKworCS8qIHByaW50aW5nIDEwMCB1c2luZyAlMmQgZ2l2ZXMgIjEwMCIsIG5vdCAiMDAiICovCiAJaWYgKGkgPiBwcmVjaXNpb24pCiAJCXByZWNpc2lvbiA9IGk7CisJLyogbGVhZGluZyBzcGFjZSBwYWRkaW5nICovCiAJc2l6ZSAtPSBwcmVjaXNpb247Ci0JaWYgKCEodHlwZSYoWkVST1BBRCtMRUZUKSkpIHsKLQkJd2hpbGUoc2l6ZS0tPjApIHsKKwlpZiAoISh0eXBlICYgKFpFUk9QQUQrTEVGVCkpKSB7CisJCXdoaWxlKC0tc2l6ZSA+PSAwKSB7CiAJCQlpZiAoYnVmIDwgZW5kKQogCQkJCSpidWYgPSAnICc7CiAJCQkrK2J1ZjsKIAkJfQogCX0KKwkvKiBzaWduICovCiAJaWYgKHNpZ24pIHsKIAkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSBzaWduOwogCQkrK2J1ZjsKIAl9Ci0JaWYgKHR5cGUgJiBTUEVDSUFMKSB7Ci0JCWlmIChiYXNlPT04KSB7CisJLyogIjB4IiAvICIwIiBwcmVmaXggKi8KKwlpZiAobmVlZF9wZngpIHsKKwkJaWYgKGJ1ZiA8IGVuZCkKKwkJCSpidWYgPSAnMCc7CisJCSsrYnVmOworCQlpZiAoYmFzZSA9PSAxNikgewogCQkJaWYgKGJ1ZiA8IGVuZCkKLQkJCQkqYnVmID0gJzAnOwotCQkJKytidWY7Ci0JCX0gZWxzZSBpZiAoYmFzZT09MTYpIHsKLQkJCWlmIChidWYgPCBlbmQpCi0JCQkJKmJ1ZiA9ICcwJzsKLQkJCSsrYnVmOwotCQkJaWYgKGJ1ZiA8IGVuZCkKLQkJCQkqYnVmID0gZGlnaXRzWzMzXTsKKwkJCQkqYnVmID0gZGlnaXRzWzE2XTsgLyogZm9yIGFyYml0cmFyeSBiYXNlOiBkaWdpdHNbMzNdOyAqLwogCQkJKytidWY7CiAJCX0KIAl9CisJLyogemVybyBvciBzcGFjZSBwYWRkaW5nICovCiAJaWYgKCEodHlwZSAmIExFRlQpKSB7Ci0JCXdoaWxlIChzaXplLS0gPiAwKSB7CisJCWNoYXIgYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CisJCXdoaWxlICgtLXNpemUgPj0gMCkgewogCQkJaWYgKGJ1ZiA8IGVuZCkKIAkJCQkqYnVmID0gYzsKIAkJCSsrYnVmOwogCQl9CiAJfQotCXdoaWxlIChpIDwgcHJlY2lzaW9uLS0pIHsKKwkvKiBobW0gZXZlbiBtb3JlIHplcm8gcGFkZGluZz8gKi8KKwl3aGlsZSAoaSA8PSAtLXByZWNpc2lvbikgewogCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9ICcwJzsKIAkJKytidWY7CiAJfQotCXdoaWxlIChpLS0gPiAwKSB7CisJLyogYWN0dWFsIGRpZ2l0cyBvZiByZXN1bHQgKi8KKwl3aGlsZSAoLS1pID49IDApIHsKIAkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSB0bXBbaV07CiAJCSsrYnVmOwogCX0KLQl3aGlsZSAoc2l6ZS0tID4gMCkgeworCS8qIHRyYWlsaW5nIHNwYWNlIHBhZGRpbmcgKi8KKwl3aGlsZSAoLS1zaXplID49IDApIHsKIAkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSAnICc7CiAJCSsrYnVmOwpAQCAtMjc2LDcgKzM5NSw3IEBACiAJICAgdXNlZCBmb3IgdW5rbm93biBidWZmZXIgc2l6ZXMuICovCiAJaWYgKHVubGlrZWx5KChpbnQpIHNpemUgPCAwKSkgewogCQkvKiBUaGVyZSBjYW4gYmUgb25seSBvbmUuLiAqLwotCQlzdGF0aWMgaW50IHdhcm4gPSAxOworCQlzdGF0aWMgY2hhciB3YXJuID0gMTsKIAkJV0FSTl9PTih3YXJuKTsKIAkJd2FybiA9IDA7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggOGFjNDEyYi4uODYxODcyMiAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlib29sICJBbGxvdyBmb3IgbWVtb3J5IGhvdC1hZGQiCiAJZGVwZW5kcyBvbiBTUEFSU0VNRU0gfHwgWDg2XzY0X0FDUElfTlVNQQogCWRlcGVuZHMgb24gSE9UUExVRyAmJiAhU09GVFdBUkVfU1VTUEVORCAmJiBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRwotCWRlcGVuZHMgb24gKElBNjQgfHwgWDg2IHx8IFBQQzY0KQorCWRlcGVuZHMgb24gKElBNjQgfHwgWDg2IHx8IFBQQzY0IHx8IFNVUEVSSCkKIAogY29tbWVudCAiTWVtb3J5IGhvdHBsdWcgaXMgY3VycmVudGx5IGluY29tcGF0aWJsZSB3aXRoIFNvZnR3YXJlIFN1c3BlbmQiCiAJZGVwZW5kcyBvbiBTUEFSU0VNRU0gJiYgSE9UUExVRyAmJiBTT0ZUV0FSRV9TVVNQRU5ECkBAIC0xNjMsOCArMTYzLDE2IEBACiAJZGVmYXVsdCAiMCIgaWYgIVpPTkVfRE1BCiAJZGVmYXVsdCAiMSIKIAorY29uZmlnIEJPVU5DRQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIEJMT0NLICYmIE1NVSAmJiAoWk9ORV9ETUEgfHwgSElHSE1FTSkKKwogY29uZmlnIE5SX1FVSUNLCiAJaW50CiAJZGVwZW5kcyBvbiBRVUlDS0xJU1QKIAlkZWZhdWx0ICIyIiBpZiAoU1VQRVJIICYmICFTVVBFUkg2NCkKIAlkZWZhdWx0ICIxIgorCitjb25maWcgVklSVF9UT19CVVMKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiAhQVJDSF9OT19WSVJUX1RPX0JVUwpkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZQppbmRleCBhOTE0OGVhLi4yNDVlMzNhIDEwMDY0NAotLS0gYS9tbS9NYWtlZmlsZQorKysgYi9tbS9NYWtlZmlsZQpAQCAtMTMsOSArMTMsNyBAQAogCQkJICAgcHJpb190cmVlLm8gdXRpbC5vIG1tem9uZS5vIHZtc3RhdC5vIGJhY2tpbmctZGV2Lm8gXAogCQkJICAgJChtbXUteSkKIAotaWZlcSAoJChDT05GSUdfTU1VKSQoQ09ORklHX0JMT0NLKSx5eSkKLW9iai15CQkJKz0gYm91bmNlLm8KLWVuZGlmCitvYmotJChDT05GSUdfQk9VTkNFKQkrPSBib3VuY2Uubwogb2JqLSQoQ09ORklHX1NXQVApCSs9IHBhZ2VfaW8ubyBzd2FwX3N0YXRlLm8gc3dhcGZpbGUubyB0aHJhc2gubwogb2JqLSQoQ09ORklHX0hVR0VUTEJGUykJKz0gaHVnZXRsYi5vCiBvYmotJChDT05GSUdfTlVNQSkgCSs9IG1lbXBvbGljeS5vCmRpZmYgLS1naXQgYS9tbS9hbGxvY3BlcmNwdS5jIGIvbW0vYWxsb2NwZXJjcHUuYwppbmRleCBiMjQ4NmNmLi4wMGIwMjYyIDEwMDY0NAotLS0gYS9tbS9hbGxvY3BlcmNwdS5jCisrKyBiL21tL2FsbG9jcGVyY3B1LmMKQEAgLTUzLDEyICs1Myw5IEBACiAJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwogCiAJQlVHX09OKHBkYXRhLT5wdHJzW2NwdV0pOwotCWlmIChub2RlX29ubGluZShub2RlKSkgewotCQkvKiBGSVhNRToga3phbGxvY19ub2RlKHNpemUsIGdmcCwgbm9kZSkgKi8KLQkJcGRhdGEtPnB0cnNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLCBnZnAsIG5vZGUpOwotCQlpZiAocGRhdGEtPnB0cnNbY3B1XSkKLQkJCW1lbXNldChwZGF0YS0+cHRyc1tjcHVdLCAwLCBzaXplKTsKLQl9IGVsc2UKKwlpZiAobm9kZV9vbmxpbmUobm9kZSkpCisJCXBkYXRhLT5wdHJzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwgZ2ZwfF9fR0ZQX1pFUk8sIG5vZGUpOworCWVsc2UKIAkJcGRhdGEtPnB0cnNbY3B1XSA9IGt6YWxsb2Moc2l6ZSwgZ2ZwKTsKIAlyZXR1cm4gcGRhdGEtPnB0cnNbY3B1XTsKIH0KZGlmZiAtLWdpdCBhL21tL2JhY2tpbmctZGV2LmMgYi9tbS9iYWNraW5nLWRldi5jCmluZGV4IGU1ZGUzNzguLmY1MGEyODEgMTAwNjQ0Ci0tLSBhL21tL2JhY2tpbmctZGV2LmMKKysrIGIvbW0vYmFja2luZy1kZXYuYwpAQCAtNTUsMjIgKzU1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woY29uZ2VzdGlvbl93YWl0KTsKIAotbG9uZyBjb25nZXN0aW9uX3dhaXRfaW50ZXJydXB0aWJsZShpbnQgcncsIGxvbmcgdGltZW91dCkKLXsKLQlsb25nIHJldDsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoID0gJmNvbmdlc3Rpb25fd3FoW3J3XTsKLQotCXByZXBhcmVfdG9fd2FpdCh3cWgsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCWVsc2UKLQkJcmV0ID0gaW9fc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQlmaW5pc2hfd2FpdCh3cWgsICZ3YWl0KTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjb25nZXN0aW9uX3dhaXRfaW50ZXJydXB0aWJsZSk7Ci0KIC8qKgogICogY29uZ2VzdGlvbl9lbmQgLSB3YWtlIHVwIHNsZWVwZXJzIG9uIGEgY29uZ2VzdGVkIGJhY2tpbmdfZGV2X2luZm8KICAqIEBydzogUkVBRCBvciBXUklURQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGM2ZWJkOWYuLjVkNTQ0OWYgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTEyMCw2ICsxMjAsNyBAQAogCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOwogCW1hcHBpbmctPm5ycGFnZXMtLTsKIAlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7CisJQlVHX09OKHBhZ2VfbWFwcGVkKHBhZ2UpKTsKIH0KIAogdm9pZCByZW1vdmVfZnJvbV9wYWdlX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtODY2LDEzICs4NjcsMTEgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAl1bnNpZ25lZCBsb25nIGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4OwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleDsKIAl1bnNpZ25lZCBsb25nIG5leHRfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBwcmV2X2luZGV4OwogCXVuc2lnbmVkIGludCBwcmV2X29mZnNldDsKLQlsb2ZmX3QgaXNpemU7CiAJc3RydWN0IHBhZ2UgKmNhY2hlZF9wYWdlOwogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSByYSA9ICpfcmE7CkBAIC04ODUsMjcgKzg4NCwxMiBAQAogCWxhc3RfaW5kZXggPSAoKnBwb3MgKyBkZXNjLT5jb3VudCArIFBBR0VfQ0FDSEVfU0laRS0xKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCW9mZnNldCA9ICpwcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKIAotCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCWlmICghaXNpemUpCi0JCWdvdG8gb3V0OwotCi0JZW5kX2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOworCQl1bnNpZ25lZCBsb25nIGVuZF9pbmRleDsKKwkJbG9mZl90IGlzaXplOwogCQl1bnNpZ25lZCBsb25nIG5yLCByZXQ7CiAKLQkJLyogbnIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSB0aGlzIHBhZ2UgKi8KLQkJbnIgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWlmIChpbmRleCA+PSBlbmRfaW5kZXgpIHsKLQkJCWlmIChpbmRleCA+IGVuZF9pbmRleCkKLQkJCQlnb3RvIG91dDsKLQkJCW5yID0gKChpc2l6ZSAtIDEpICYgflBBR0VfQ0FDSEVfTUFTSykgKyAxOwotCQkJaWYgKG5yIDw9IG9mZnNldCkgewotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCW5yID0gbnIgLSBvZmZzZXQ7Ci0KIAkJY29uZF9yZXNjaGVkKCk7CiAJCWlmIChpbmRleCA9PSBuZXh0X2luZGV4KQogCQkJbmV4dF9pbmRleCA9IHBhZ2VfY2FjaGVfcmVhZGFoZWFkKG1hcHBpbmcsICZyYSwgZmlscCwKQEAgLTkyMCw2ICs5MDQsMzIgQEAKIAkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCiAJCQlnb3RvIHBhZ2Vfbm90X3VwX3RvX2RhdGU7CiBwYWdlX29rOgorCQkvKgorCQkgKiBpX3NpemUgbXVzdCBiZSBjaGVja2VkIGFmdGVyIHdlIGtub3cgdGhlIHBhZ2UgaXMgVXB0b2RhdGUuCisJCSAqCisJCSAqIENoZWNraW5nIGlfc2l6ZSBhZnRlciB0aGUgY2hlY2sgYWxsb3dzIHVzIHRvIGNhbGN1bGF0ZQorCQkgKiB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgIm5yIiwgd2hpY2ggbWVhbnMgdGhlIHplcm8tZmlsbGVkCisJCSAqIHBhcnQgb2YgdGhlIHBhZ2UgaXMgbm90IGNvcGllZCBiYWNrIHRvIHVzZXJzcGFjZSAodW5sZXNzCisJCSAqIGFub3RoZXIgdHJ1bmNhdGUgZXh0ZW5kcyB0aGUgZmlsZSAtIHRoaXMgaXMgZGVzaXJlZCB0aG91Z2gpLgorCQkgKi8KKworCQlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJZW5kX2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJaWYgKHVubGlrZWx5KCFpc2l6ZSB8fCBpbmRleCA+IGVuZF9pbmRleCkpIHsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogbnIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSB0aGlzIHBhZ2UgKi8KKwkJbnIgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWlmIChpbmRleCA9PSBlbmRfaW5kZXgpIHsKKwkJCW5yID0gKChpc2l6ZSAtIDEpICYgflBBR0VfQ0FDSEVfTUFTSykgKyAxOworCQkJaWYgKG5yIDw9IG9mZnNldCkgeworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQluciA9IG5yIC0gb2Zmc2V0OwogCiAJCS8qIElmIHVzZXJzIGNhbiBiZSB3cml0aW5nIHRvIHRoaXMgcGFnZSB1c2luZyBhcmJpdHJhcnkKIAkJICogdmlydHVhbCBhZGRyZXNzZXMsIHRha2UgY2FyZSBhYm91dCBwb3RlbnRpYWwgYWxpYXNpbmcKQEAgLTEwMDYsMzEgKzEwMTYsNiBAQAogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCX0KIAotCQkvKgotCQkgKiBpX3NpemUgbXVzdCBiZSBjaGVja2VkIGFmdGVyIHdlIGhhdmUgZG9uZSAtPnJlYWRwYWdlLgotCQkgKgotCQkgKiBDaGVja2luZyBpX3NpemUgYWZ0ZXIgdGhlIHJlYWRwYWdlIGFsbG93cyB1cyB0byBjYWxjdWxhdGUKLQkJICogdGhlIGNvcnJlY3QgdmFsdWUgZm9yICJuciIsIHdoaWNoIG1lYW5zIHRoZSB6ZXJvLWZpbGxlZAotCQkgKiBwYXJ0IG9mIHRoZSBwYWdlIGlzIG5vdCBjb3BpZWQgYmFjayB0byB1c2Vyc3BhY2UgKHVubGVzcwotCQkgKiBhbm90aGVyIHRydW5jYXRlIGV4dGVuZHMgdGhlIGZpbGUgLSB0aGlzIGlzIGRlc2lyZWQgdGhvdWdoKS4KLQkJICovCi0JCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQllbmRfaW5kZXggPSAoaXNpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQlpZiAodW5saWtlbHkoIWlzaXplIHx8IGluZGV4ID4gZW5kX2luZGV4KSkgewotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKiBuciBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHRoaXMgcGFnZSAqLwotCQluciA9IFBBR0VfQ0FDSEVfU0laRTsKLQkJaWYgKGluZGV4ID09IGVuZF9pbmRleCkgewotCQkJbnIgPSAoKGlzaXplIC0gMSkgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7Ci0JCQlpZiAobnIgPD0gb2Zmc2V0KSB7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCW5yID0gbnIgLSBvZmZzZXQ7CiAJCWdvdG8gcGFnZV9vazsKIAogcmVhZHBhZ2VfZXJyb3I6CkBAIC0xMjE4LDYgKzEyMDMsOCBAQAogCQkJCXJldHZhbCA9IHJldHZhbCA/OiBkZXNjLmVycm9yOwogCQkJCWJyZWFrOwogCQkJfQorCQkJaWYgKGRlc2MuY291bnQgPiAwKQorCQkJCWJyZWFrOwogCQl9CiAJfQogb3V0OgpAQCAtMTk2NCw3ICsxOTUxLDYgQEAKIAlpZiAodW5saWtlbHkoKnBvcyArICpjb3VudCA+IE1BWF9OT05fTEZTICYmCiAJCQkJIShmaWxlLT5mX2ZsYWdzICYgT19MQVJHRUZJTEUpKSkgewogCQlpZiAoKnBvcyA+PSBNQVhfTk9OX0xGUykgewotCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQlyZXR1cm4gLUVGQklHOwogCQl9CiAJCWlmICgqY291bnQgPiBNQVhfTk9OX0xGUyAtICh1bnNpZ25lZCBsb25nKSpwb3MpIHsKQEAgLTE5ODIsNyArMTk2OCw2IEBACiAJaWYgKGxpa2VseSghaXNibGspKSB7CiAJCWlmICh1bmxpa2VseSgqcG9zID49IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSkgewogCQkJaWYgKCpjb3VudCB8fCAqcG9zID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKLQkJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKIAkJCQlyZXR1cm4gLUVGQklHOwogCQkJfQogCQkJLyogemVyby1sZW5ndGggd3JpdGVzIGF0IC0+c19tYXhieXRlcyBhcmUgT0sgKi8KZGlmZiAtLWdpdCBhL21tL2hpZ2htZW0uYyBiL21tL2hpZ2htZW0uYwppbmRleCBiZThmOGQzLi43YTk2N2JjIDEwMDY0NAotLS0gYS9tbS9oaWdobWVtLmMKKysrIGIvbW0vaGlnaG1lbS5jCkBAIC00Niw5ICs0NiwxNCBAQAogCXBnX2RhdGFfdCAqcGdkYXQ7CiAJdW5zaWduZWQgaW50IHBhZ2VzID0gMDsKIAotCWZvcl9lYWNoX29ubGluZV9wZ2RhdChwZ2RhdCkKKwlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKIAkJcGFnZXMgKz0gem9uZV9wYWdlX3N0YXRlKCZwZ2RhdC0+bm9kZV96b25lc1taT05FX0hJR0hNRU1dLAogCQkJTlJfRlJFRV9QQUdFUyk7CisJCWlmICh6b25lX21vdmFibGVfaXNfaGlnaG1lbSgpKQorCQkJcGFnZXMgKz0gem9uZV9wYWdlX3N0YXRlKAorCQkJCQkmcGdkYXQtPm5vZGVfem9uZXNbWk9ORV9NT1ZBQkxFXSwKKwkJCQkJTlJfRlJFRV9QQUdFUyk7CisJfQogCiAJcmV0dXJuIHBhZ2VzOwogfQpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IGE0NWQxZjAuLjY5MTJiYmYgMTAwNjQ0Ci0tLSBhL21tL2h1Z2V0bGIuYworKysgYi9tbS9odWdldGxiLmMKQEAgLTI3LDYgKzI3LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGh1Z2VwYWdlX2ZyZWVsaXN0c1tNQVhfTlVNTk9ERVNdOwogc3RhdGljIHVuc2lnbmVkIGludCBucl9odWdlX3BhZ2VzX25vZGVbTUFYX05VTU5PREVTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZnJlZV9odWdlX3BhZ2VzX25vZGVbTUFYX05VTU5PREVTXTsKK3N0YXRpYyBnZnBfdCBodGxiX2FsbG9jX21hc2sgPSBHRlBfSElHSFVTRVI7Cit1bnNpZ25lZCBsb25nIGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlOworCiAvKgogICogUHJvdGVjdHMgdXBkYXRlcyB0byBodWdlcGFnZV9mcmVlbGlzdHMsIG5yX2h1Z2VfcGFnZXMsIGFuZCBmcmVlX2h1Z2VfcGFnZXMKICAqLwpAQCAtNjYsMTQgKzY5LDE1IEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKmRlcXVldWVfaHVnZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlpbnQgbmlkID0gbnVtYV9ub2RlX2lkKCk7CisJaW50IG5pZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0Jc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCA9IGh1Z2Vfem9uZWxpc3Qodm1hLCBhZGRyZXNzKTsKKwlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0ID0gaHVnZV96b25lbGlzdCh2bWEsIGFkZHJlc3MsCisJCQkJCQlodGxiX2FsbG9jX21hc2spOwogCXN0cnVjdCB6b25lICoqejsKIAogCWZvciAoeiA9IHpvbmVsaXN0LT56b25lczsgKno7IHorKykgewogCQluaWQgPSB6b25lX3RvX25pZCgqeik7Ci0JCWlmIChjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKCp6LCBHRlBfSElHSFVTRVIpICYmCisJCWlmIChjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKCp6LCBodGxiX2FsbG9jX21hc2spICYmCiAJCSAgICAhbGlzdF9lbXB0eSgmaHVnZXBhZ2VfZnJlZWxpc3RzW25pZF0pKQogCQkJYnJlYWs7CiAJfQpAQCAtMTAxLDEzICsxMDUsMjAgQEAKIAogc3RhdGljIGludCBhbGxvY19mcmVzaF9odWdlX3BhZ2Uodm9pZCkKIHsKLQlzdGF0aWMgaW50IG5pZCA9IDA7CisJc3RhdGljIGludCBwcmV2X25pZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShuaWQsIEdGUF9ISUdIVVNFUnxfX0dGUF9DT01QfF9fR0ZQX05PV0FSTiwKLQkJCQkJSFVHRVRMQl9QQUdFX09SREVSKTsKLQluaWQgPSBuZXh0X25vZGUobmlkLCBub2RlX29ubGluZV9tYXApOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmlkX2xvY2spOworCWludCBuaWQ7CisKKwlzcGluX2xvY2soJm5pZF9sb2NrKTsKKwluaWQgPSBuZXh0X25vZGUocHJldl9uaWQsIG5vZGVfb25saW5lX21hcCk7CiAJaWYgKG5pZCA9PSBNQVhfTlVNTk9ERVMpCiAJCW5pZCA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKKwlwcmV2X25pZCA9IG5pZDsKKwlzcGluX3VubG9jaygmbmlkX2xvY2spOworCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobmlkLCBodGxiX2FsbG9jX21hc2t8X19HRlBfQ09NUHxfX0dGUF9OT1dBUk4sCisJCQkJCUhVR0VUTEJfUEFHRV9PUkRFUik7CiAJaWYgKHBhZ2UpIHsKIAkJc2V0X2NvbXBvdW5kX3BhZ2VfZHRvcihwYWdlLCBmcmVlX2h1Z2VfcGFnZSk7CiAJCXNwaW5fbG9jaygmaHVnZXRsYl9sb2NrKTsKQEAgLTI1Niw2ICsyNjcsMTkgQEAKIAltYXhfaHVnZV9wYWdlcyA9IHNldF9tYXhfaHVnZV9wYWdlcyhtYXhfaHVnZV9wYWdlcyk7CiAJcmV0dXJuIDA7CiB9CisKK2ludCBodWdldGxiX3RyZWF0X21vdmFibGVfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsCisJCQlzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQoreworCXByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJaWYgKGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlKQorCQlodGxiX2FsbG9jX21hc2sgPSBHRlBfSElHSFVTRVJfTU9WQUJMRTsKKwllbHNlCisJCWh0bGJfYWxsb2NfbWFzayA9IEdGUF9ISUdIVVNFUjsKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAogaW50IGh1Z2V0bGJfcmVwb3J0X21lbWluZm8oY2hhciAqYnVmKQpAQCAtNDc0LDcgKzQ5OCw3IEBACiAJcmV0dXJuIFZNX0ZBVUxUX01JTk9SOwogfQogCi1pbnQgaHVnZXRsYl9ub19wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKK3N0YXRpYyBpbnQgaHVnZXRsYl9ub19wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAsIGludCB3cml0ZV9hY2Nlc3MpCiB7CiAJaW50IHJldCA9IFZNX0ZBVUxUX1NJR0JVUzsKZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuYwppbmRleCA2MDU0MmQwLi45M2VlMzc1IDEwMDY0NAotLS0gYS9tbS9tYWR2aXNlLmMKKysrIGIvbW0vbWFkdmlzZS5jCkBAIC0yODcsOSArMjg3LDExIEBACiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLCAqcHJldjsKIAlpbnQgdW5tYXBwZWRfZXJyb3IgPSAwOwogCWludCBlcnJvciA9IC1FSU5WQUw7CisJaW50IHdyaXRlOwogCXNpemVfdCBsZW47CiAKLQlpZiAobWFkdmlzZV9uZWVkX21tYXBfd3JpdGUoYmVoYXZpb3IpKQorCXdyaXRlID0gbWFkdmlzZV9uZWVkX21tYXBfd3JpdGUoYmVoYXZpb3IpOworCWlmICh3cml0ZSkKIAkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAllbHNlCiAJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKQEAgLTM1NCw3ICszNTYsNyBAQAogCQkJdm1hID0gZmluZF92bWEoY3VycmVudC0+bW0sIHN0YXJ0KTsKIAl9CiBvdXQ6Ci0JaWYgKG1hZHZpc2VfbmVlZF9tbWFwX3dyaXRlKGJlaGF2aW9yKSkKKwlpZiAod3JpdGUpCiAJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWVsc2UKIAkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggZjY0Y2JmOS4uOWM2ZmY3ZiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTc4LDExICs3OCw5IEBACiAgKiBhbmQgWk9ORV9ISUdITUVNLgogICovCiB2b2lkICogaGlnaF9tZW1vcnk7Ci11bnNpZ25lZCBsb25nIHZtYWxsb2NfZWFybHlyZXNlcnZlOwogCiBFWFBPUlRfU1lNQk9MKG51bV9waHlzcGFnZXMpOwogRVhQT1JUX1NZTUJPTChoaWdoX21lbW9yeSk7Ci1FWFBPUlRfU1lNQk9MKHZtYWxsb2NfZWFybHlyZXNlcnZlKTsKIAogaW50IHJhbmRvbWl6ZV92YV9zcGFjZSBfX3JlYWRfbW9zdGx5ID0gMTsKIApAQCAtMTA1NSw2ICsxMDUzLDE0IEBACiAJCWRvIHsKIAkJCXN0cnVjdCBwYWdlICpwYWdlOwogCisJCQkvKgorCQkJICogSWYgdHNrIGlzIG9vbWluZywgY3V0IG9mZiBpdHMgYWNjZXNzIHRvIGxhcmdlIG1lbW9yeQorCQkJICogYWxsb2NhdGlvbnMuIEl0IGhhcyBhIHBlbmRpbmcgU0lHS0lMTCwgYnV0IGl0IGNhbid0CisJCQkgKiBiZSBwcm9jZXNzZWQgdW50aWwgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9NRU1ESUUpKSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwogCQkJaWYgKHdyaXRlKQogCQkJCWZvbGxfZmxhZ3MgfD0gRk9MTF9XUklURTsKIApAQCAtMTcwOSwxMSArMTcxNSwxMSBAQAogCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQogCQlnb3RvIG9vbTsKIAlpZiAob2xkX3BhZ2UgPT0gWkVST19QQUdFKGFkZHJlc3MpKSB7Ci0JCW5ld19wYWdlID0gYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCBhZGRyZXNzKTsKKwkJbmV3X3BhZ2UgPSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlKHZtYSwgYWRkcmVzcyk7CiAJCWlmICghbmV3X3BhZ2UpCiAJCQlnb3RvIG9vbTsKIAl9IGVsc2UgewotCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBhZGRyZXNzKTsKKwkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwgdm1hLCBhZGRyZXNzKTsKIAkJaWYgKCFuZXdfcGFnZSkKIAkJCWdvdG8gb29tOwogCQljb3dfdXNlcl9wYWdlKG5ld19wYWdlLCBvbGRfcGFnZSwgYWRkcmVzcywgdm1hKTsKQEAgLTIyMzEsNyArMjIzNyw3IEBACiAKIAkJaWYgKHVubGlrZWx5KGFub25fdm1hX3ByZXBhcmUodm1hKSkpCiAJCQlnb3RvIG9vbTsKLQkJcGFnZSA9IGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgYWRkcmVzcyk7CisJCXBhZ2UgPSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlKHZtYSwgYWRkcmVzcyk7CiAJCWlmICghcGFnZSkKIAkJCWdvdG8gb29tOwogCkBAIC0yMzM0LDcgKzIzNDAsOCBAQAogCiAJCQlpZiAodW5saWtlbHkoYW5vbl92bWFfcHJlcGFyZSh2bWEpKSkKIAkJCQlnb3RvIG9vbTsKLQkJCXBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgYWRkcmVzcyk7CisJCQlwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSX01PVkFCTEUsCisJCQkJCQl2bWEsIGFkZHJlc3MpOwogCQkJaWYgKCFwYWdlKQogCQkJCWdvdG8gb29tOwogCQkJY29weV91c2VyX2hpZ2hwYWdlKHBhZ2UsIG5ld19wYWdlLCBhZGRyZXNzLCB2bWEpOwpAQCAtMjY3Myw3ICsyNjgwLDcgQEAKIAl3cml0ZSA9ICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpICE9IDA7CiAJQlVHX09OKGFkZHIgPj0gZW5kKTsKIAlCVUdfT04oZW5kID4gdm1hLT52bV9lbmQpOwotCWxlbiA9IChlbmQrUEFHRV9TSVpFLTEpL1BBR0VfU0laRS1hZGRyL1BBR0VfU0laRTsKKwlsZW4gPSBESVZfUk9VTkRfVVAoZW5kLCBQQUdFX1NJWkUpIC0gYWRkci9QQUdFX1NJWkU7CiAJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGFkZHIsCiAJCQlsZW4sIHdyaXRlLCAwLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggZDc2ZThlYi4uOWY0ZTliOSAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTEwMSw4ICsxMDEsNiBAQAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwb2xpY3lfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNuX2NhY2hlOwogCi0jZGVmaW5lIFBEcHJpbnRrKGZtdC4uLikKLQogLyogSGlnaGVzdCB6b25lLiBBbiBzcGVjaWZpYyBhbGxvY2F0aW9uIGZvciBhIHpvbmUgYmVsb3cgdGhhdCBpcyBub3QKICAgIHBvbGljaWVkLiAqLwogZW51bSB6b25lX3R5cGUgcG9saWN5X3pvbmUgPSAwOwpAQCAtMTc1LDcgKzE3Myw5IEBACiB7CiAJc3RydWN0IG1lbXBvbGljeSAqcG9saWN5OwogCi0JUERwcmludGsoInNldHRpbmcgbW9kZSAlZCBub2Rlc1swXSAlbHhcbiIsIG1vZGUsIG5vZGVzX2FkZHIoKm5vZGVzKVswXSk7CisJcHJfZGVidWcoInNldHRpbmcgbW9kZSAlZCBub2Rlc1swXSAlbHhcbiIsCisJCSBtb2RlLCBub2RlcyA/IG5vZGVzX2FkZHIoKm5vZGVzKVswXSA6IC0xKTsKKwogCWlmIChtb2RlID09IE1QT0xfREVGQVVMVCkKIAkJcmV0dXJuIE5VTEw7CiAJcG9saWN5ID0ga21lbV9jYWNoZV9hbGxvYyhwb2xpY3lfY2FjaGUsIEdGUF9LRVJORUwpOwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJaW50IGVyciA9IDA7CiAJc3RydWN0IG1lbXBvbGljeSAqb2xkID0gdm1hLT52bV9wb2xpY3k7CiAKLQlQRHByaW50aygidm1hICVseC0lbHgvJWx4IHZtX29wcyAlcCB2bV9maWxlICVwIHNldF9wb2xpY3kgJXBcbiIsCisJcHJfZGVidWcoInZtYSAlbHgtJWx4LyVseCB2bV9vcHMgJXAgdm1fZmlsZSAlcCBzZXRfcG9saWN5ICVwXG4iLAogCQkgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHZtYS0+dm1fcGdvZmYsCiAJCSB2bWEtPnZtX29wcywgdm1hLT52bV9maWxlLAogCQkgdm1hLT52bV9vcHMgPyB2bWEtPnZtX29wcy0+c2V0X3BvbGljeSA6IE5VTEwpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqbmV3X25vZGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBub2RlLCBpbnQgKip4KQogewotCXJldHVybiBhbGxvY19wYWdlc19ub2RlKG5vZGUsIEdGUF9ISUdIVVNFUiwgMCk7CisJcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgR0ZQX0hJR0hVU0VSX01PVkFCTEUsIDApOwogfQogCiAvKgpAQCAtNzEwLDcgKzcxMCw4IEBACiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICopcHJpdmF0ZTsKIAotCXJldHVybiBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgcGFnZV9hZGRyZXNzX2luX3ZtYShwYWdlLCB2bWEpKTsKKwlyZXR1cm4gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSX01PVkFCTEUsIHZtYSwKKwkJCQkJcGFnZV9hZGRyZXNzX2luX3ZtYShwYWdlLCB2bWEpKTsKIH0KICNlbHNlCiAKQEAgLTc3Niw4ICs3NzcsOCBAQAogCWlmICghbmV3KQogCQlmbGFncyB8PSBNUE9MX01GX0RJU0NPTlRJR19PSzsKIAotCVBEcHJpbnRrKCJtYmluZCAlbHgtJWx4IG1vZGU6JWxkIG5vZGVzOiVseFxuIixzdGFydCxzdGFydCtsZW4sCi0JCQltb2RlLG5vZGVzX2FkZHIobm9kZXMpWzBdKTsKKwlwcl9kZWJ1ZygibWJpbmQgJWx4LSVseCBtb2RlOiVsZCBub2RlczolbHhcbiIsc3RhcnQsc3RhcnQrbGVuLAorCQkgbW9kZSwgbm1hc2sgPyBub2Rlc19hZGRyKCpubWFzaylbMF0gOiAtMSk7CiAKIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXZtYSA9IGNoZWNrX3JhbmdlKG1tLCBzdGFydCwgZW5kLCBubWFzaywKQEAgLTEyMDIsNyArMTIwMyw4IEBACiAKICNpZmRlZiBDT05GSUdfSFVHRVRMQkZTCiAvKiBSZXR1cm4gYSB6b25lbGlzdCBzdWl0YWJsZSBmb3IgYSBodWdlIHBhZ2UgYWxsb2NhdGlvbi4gKi8KLXN0cnVjdCB6b25lbGlzdCAqaHVnZV96b25lbGlzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RydWN0IHpvbmVsaXN0ICpodWdlX3pvbmVsaXN0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCQkJZ2ZwX3QgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCA9IGdldF92bWFfcG9saWN5KGN1cnJlbnQsIHZtYSwgYWRkcik7CiAKQEAgLTEyMTAsNyArMTIxMiw3IEBACiAJCXVuc2lnbmVkIG5pZDsKIAogCQluaWQgPSBpbnRlcmxlYXZlX25pZChwb2wsIHZtYSwgYWRkciwgSFBBR0VfU0hJRlQpOwotCQlyZXR1cm4gTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZWxpc3RzICsgZ2ZwX3pvbmUoR0ZQX0hJR0hVU0VSKTsKKwkJcmV0dXJuIE5PREVfREFUQShuaWQpLT5ub2RlX3pvbmVsaXN0cyArIGdmcF96b25lKGdmcF9mbGFncyk7CiAJfQogCXJldHVybiB6b25lbGlzdF9wb2xpY3koR0ZQX0hJR0hVU0VSLCBwb2wpOwogfQpAQCAtMTQzNCw3ICsxNDM2LDcgQEAKIAl9CiAJcmJfbGlua19ub2RlKCZuZXctPm5kLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmbmV3LT5uZCwgJnNwLT5yb290KTsKLQlQRHByaW50aygiaW5zZXJ0aW5nICVseC0lbHg6ICVkXG4iLCBuZXctPnN0YXJ0LCBuZXctPmVuZCwKKwlwcl9kZWJ1ZygiaW5zZXJ0aW5nICVseC0lbHg6ICVkXG4iLCBuZXctPnN0YXJ0LCBuZXctPmVuZCwKIAkJIG5ldy0+cG9saWN5ID8gbmV3LT5wb2xpY3ktPnBvbGljeSA6IDApOwogfQogCkBAIC0xNDU5LDcgKzE0NjEsNyBAQAogCiBzdGF0aWMgdm9pZCBzcF9kZWxldGUoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3Qgc3Bfbm9kZSAqbikKIHsKLQlQRHByaW50aygiZGVsZXRpbmcgJWx4LWwleFxuIiwgbi0+c3RhcnQsIG4tPmVuZCk7CisJcHJfZGVidWcoImRlbGV0aW5nICVseC1sJWx4XG4iLCBuLT5zdGFydCwgbi0+ZW5kKTsKIAlyYl9lcmFzZSgmbi0+bmQsICZzcC0+cm9vdCk7CiAJbXBvbF9mcmVlKG4tPnBvbGljeSk7CiAJa21lbV9jYWNoZV9mcmVlKHNuX2NhY2hlLCBuKTsKQEAgLTE1NTgsMTAgKzE1NjAsMTAgQEAKIAlzdHJ1Y3Qgc3Bfbm9kZSAqbmV3ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHN6ID0gdm1hX3BhZ2VzKHZtYSk7CiAKLQlQRHByaW50aygic2V0X3NoYXJlZF9wb2xpY3kgJWx4IHN6ICVsdSAlZCAlbHhcbiIsCisJcHJfZGVidWcoInNldF9zaGFyZWRfcG9saWN5ICVseCBzeiAlbHUgJWQgJWx4XG4iLAogCQkgdm1hLT52bV9wZ29mZiwKIAkJIHN6LCBucG9sPyBucG9sLT5wb2xpY3kgOiAtMSwKLQkJbnBvbCA/IG5vZGVzX2FkZHIobnBvbC0+di5ub2RlcylbMF0gOiAtMSk7CisJCSBucG9sID8gbm9kZXNfYWRkcihucG9sLT52Lm5vZGVzKVswXSA6IC0xKTsKIAogCWlmIChucG9sKSB7CiAJCW5ldyA9IHNwX2FsbG9jKHZtYS0+dm1fcGdvZmYsIHZtYS0+dm1fcGdvZmYgKyBzeiwgbnBvbCk7CkBAIC0xNTk3LDYgKzE1OTksMTAgQEAKIC8qIGFzc3VtZXMgZnMgPT0gS0VSTkVMX0RTICovCiB2b2lkIF9faW5pdCBudW1hX3BvbGljeV9pbml0KHZvaWQpCiB7CisJbm9kZW1hc2tfdCBpbnRlcmxlYXZlX25vZGVzOworCXVuc2lnbmVkIGxvbmcgbGFyZ2VzdCA9IDA7CisJaW50IG5pZCwgcHJlZmVyID0gMDsKKwogCXBvbGljeV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJudW1hX3BvbGljeSIsCiAJCQkJCSBzaXplb2Yoc3RydWN0IG1lbXBvbGljeSksCiAJCQkJCSAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKQEAgLTE2MDUsMTAgKzE2MTEsMzEgQEAKIAkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc3Bfbm9kZSksCiAJCQkJICAgICAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKIAotCS8qIFNldCBpbnRlcmxlYXZpbmcgcG9saWN5IGZvciBzeXN0ZW0gaW5pdC4gVGhpcyB3YXkgbm90IGFsbAotCSAgIHRoZSBkYXRhIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGF0IHN5c3RlbSBib290IGVuZCB1cCBpbiBub2RlIHplcm8uICovCisJLyoKKwkgKiBTZXQgaW50ZXJsZWF2aW5nIHBvbGljeSBmb3Igc3lzdGVtIGluaXQuIEludGVybGVhdmluZyBpcyBvbmx5CisJICogZW5hYmxlZCBhY3Jvc3Mgc3VpdGFibHkgc2l6ZWQgbm9kZXMgKGRlZmF1bHQgaXMgPj0gMTZNQiksIG9yCisJICogZmFsbCBiYWNrIHRvIHRoZSBsYXJnZXN0IG5vZGUgaWYgdGhleSdyZSBhbGwgc21hbGxlci4KKwkgKi8KKwlub2Rlc19jbGVhcihpbnRlcmxlYXZlX25vZGVzKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJdW5zaWduZWQgbG9uZyB0b3RhbF9wYWdlcyA9IG5vZGVfcHJlc2VudF9wYWdlcyhuaWQpOwogCi0JaWYgKGRvX3NldF9tZW1wb2xpY3koTVBPTF9JTlRFUkxFQVZFLCAmbm9kZV9vbmxpbmVfbWFwKSkKKwkJLyogUHJlc2VydmUgdGhlIGxhcmdlc3Qgbm9kZSAqLworCQlpZiAobGFyZ2VzdCA8IHRvdGFsX3BhZ2VzKSB7CisJCQlsYXJnZXN0ID0gdG90YWxfcGFnZXM7CisJCQlwcmVmZXIgPSBuaWQ7CisJCX0KKworCQkvKiBJbnRlcmxlYXZlIHRoaXMgbm9kZT8gKi8KKwkJaWYgKCh0b3RhbF9wYWdlcyA8PCBQQUdFX1NISUZUKSA+PSAoMTYgPDwgMjApKQorCQkJbm9kZV9zZXQobmlkLCBpbnRlcmxlYXZlX25vZGVzKTsKKwl9CisKKwkvKiBBbGwgdG9vIHNtYWxsLCB1c2UgdGhlIGxhcmdlc3QgKi8KKwlpZiAodW5saWtlbHkobm9kZXNfZW1wdHkoaW50ZXJsZWF2ZV9ub2RlcykpKQorCQlub2RlX3NldChwcmVmZXIsIGludGVybGVhdmVfbm9kZXMpOworCisJaWYgKGRvX3NldF9tZW1wb2xpY3koTVBPTF9JTlRFUkxFQVZFLCAmaW50ZXJsZWF2ZV9ub2RlcykpCiAJCXByaW50aygibnVtYV9wb2xpY3lfaW5pdDogaW50ZXJsZWF2aW5nIGZhaWxlZFxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL21tL21lbXBvb2wuYyBiL21tL21lbXBvb2wuYwppbmRleCBjYzFjYTg2Li4wMmQ1ZWMzIDEwMDY0NAotLS0gYS9tbS9tZW1wb29sLmMKKysrIGIvbW0vbWVtcG9vbC5jCkBAIC02MiwxMCArNjIsOSBAQAogCQkJbWVtcG9vbF9mcmVlX3QgKmZyZWVfZm4sIHZvaWQgKnBvb2xfZGF0YSwgaW50IG5vZGVfaWQpCiB7CiAJbWVtcG9vbF90ICpwb29sOwotCXBvb2wgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpwb29sKSwgR0ZQX0tFUk5FTCwgbm9kZV9pZCk7CisJcG9vbCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgbm9kZV9pZCk7CiAJaWYgKCFwb29sKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQocG9vbCwgMCwgc2l6ZW9mKCpwb29sKSk7CiAJcG9vbC0+ZWxlbWVudHMgPSBrbWFsbG9jX25vZGUobWluX25yICogc2l6ZW9mKHZvaWQgKiksCiAJCQkJCUdGUF9LRVJORUwsIG5vZGVfaWQpOwogCWlmICghcG9vbC0+ZWxlbWVudHMpIHsKQEAgLTI2Myw2ICsyNjIsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAodW5saWtlbHkoZWxlbWVudCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCiAJc21wX21iKCk7CiAJaWYgKHBvb2wtPmN1cnJfbnIgPCBwb29sLT5taW5fbnIpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCBhOTFjYTAwLi4zNGQ4YWRhIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC03NjEsNyArNzYxLDggQEAKIAogCSpyZXN1bHQgPSAmcG0tPnN0YXR1czsKIAotCXJldHVybiBhbGxvY19wYWdlc19ub2RlKHBtLT5ub2RlLCBHRlBfSElHSFVTRVIgfCBHRlBfVEhJU05PREUsIDApOworCXJldHVybiBhbGxvY19wYWdlc19ub2RlKHBtLT5ub2RlLAorCQkJCUdGUF9ISUdIVVNFUl9NT1ZBQkxFIHwgR0ZQX1RISVNOT0RFLCAwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL21tL21sb2NrLmMgYi9tbS9tbG9jay5jCmluZGV4IDRkM2ZlYTIuLjdiMjY1NjAgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtMjQ0LDkgKzI0NCwxMiBAQAogCiAJbG9ja2VkID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwogCWxvY2tfbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX01FTUxPQ0tdLnJsaW1fY3VyOworCWlmIChsb2NrX2xpbWl0ID09IFJMSU1fSU5GSU5JVFkpCisJCWFsbG93ZWQgPSAxOwogCWxvY2tfbGltaXQgPj49IFBBR0VfU0hJRlQ7CiAJc3Bpbl9sb2NrKCZzaG1sb2NrX3VzZXJfbG9jayk7Ci0JaWYgKGxvY2tlZCArIHVzZXItPmxvY2tlZF9zaG0gPiBsb2NrX2xpbWl0ICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpCisJaWYgKCFhbGxvd2VkICYmCisJICAgIGxvY2tlZCArIHVzZXItPmxvY2tlZF9zaG0gPiBsb2NrX2xpbWl0ICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpCiAJCWdvdG8gb3V0OwogCWdldF91aWQodXNlcik7CiAJdXNlci0+bG9ja2VkX3NobSArPSBsb2NrZWQ7CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggOWY3MGM4ZS4uMTQ0YjRhMiAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtODk0LDE0ICs4OTQsMTEgQEAKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gY3VycmVudC0+bW07Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLCAqIHByZXY7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAl1bnNpZ25lZCBpbnQgdm1fZmxhZ3M7Ci0JaW50IGNvcnJlY3Rfd2NvdW50ID0gMDsKIAlpbnQgZXJyb3I7Ci0Jc3RydWN0IHJiX25vZGUgKiogcmJfbGluaywgKiByYl9wYXJlbnQ7CiAJaW50IGFjY291bnRhYmxlID0gMTsKLQl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwLCByZXFwcm90ID0gcHJvdDsKKwl1bnNpZ25lZCBsb25nIHJlcXByb3QgPSBwcm90OwogCiAJLyoKIAkgKiBEb2VzIHRoZSBhcHBsaWNhdGlvbiBleHBlY3QgUFJPVF9SRUFEIHRvIGltcGx5IFBST1RfRVhFQz8KQEAgLTEwMjcsNiArMTAyNCwyNCBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCisJcmV0dXJuIG1tYXBfcmVnaW9uKGZpbGUsIGFkZHIsIGxlbiwgZmxhZ3MsIHZtX2ZsYWdzLCBwZ29mZiwKKwkJCSAgIGFjY291bnRhYmxlKTsKK30KK0VYUE9SVF9TWU1CT0woZG9fbW1hcF9wZ29mZik7CisKK3Vuc2lnbmVkIGxvbmcgbW1hcF9yZWdpb24oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkgIHVuc2lnbmVkIGludCB2bV9mbGFncywgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwkJCSAgaW50IGFjY291bnRhYmxlKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsICpwcmV2OworCWludCBjb3JyZWN0X3djb3VudCA9IDA7CisJaW50IGVycm9yOworCXN0cnVjdCByYl9ub2RlICoqcmJfbGluaywgKnJiX3BhcmVudDsKKwl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAgZmlsZSA/IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUgOiBOVUxMOworCiAJLyogQ2xlYXIgb2xkIG1hcHMgKi8KIAllcnJvciA9IC1FTk9NRU07CiBtdW5tYXBfYmFjazoKQEAgLTExNzUsOCArMTE5MCw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1FWFBPUlRfU1lNQk9MKGRvX21tYXBfcGdvZmYpOwotCiAvKiBHZXQgYW4gYWRkcmVzcyByYW5nZSB3aGljaCBpcyBjdXJyZW50bHkgdW5tYXBwZWQuCiAgKiBGb3Igc2htYXQoKSB3aXRoIGFkZHI9MC4KICAqCmRpZmYgLS1naXQgYS9tbS9ub21tdS5jIGIvbW0vbm9tbXUuYwppbmRleCA5ODllMmU5Li44YmJiZjE0IDEwMDY0NAotLS0gYS9tbS9ub21tdS5jCisrKyBiL21tL25vbW11LmMKQEAgLTM2Nyw2ICszNjcsMTEgQEAKIAlyZXR1cm4gZmluZF92bWEobW0sIGFkZHIpOwogfQogCitpbnQgZXhwYW5kX3N0YWNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKIC8qCiAgKiBsb29rIHVwIHRoZSBmaXJzdCBWTUEgZXhhY3RseSB0aGF0IGV4YWN0bHkgbWF0Y2hlcyBhZGRyCiAgKiAtIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBtbS0+bW1hcF9zZW0gYXQgbGVhc3QgaGVsZCByZWFkbG9ja2VkCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCBlZWMxNDgxLi44ODZlYTBkIDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTQ3NiwxNSArNDc2LDEzIEBACiAgKiBzeXNjdGwgaGFuZGxlciBmb3IgL3Byb2Mvc3lzL3ZtL2RpcnR5X3dyaXRlYmFja19jZW50aXNlY3MKICAqLwogaW50IGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3NfaGFuZGxlcihjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQorCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQogewogCXByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXModGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7Ci0JaWYgKGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCkgewotCQltb2RfdGltZXIoJndiX3RpbWVyLAotCQkJamlmZmllcyArIGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCk7Ci0JCX0gZWxzZSB7CisJaWYgKGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCkKKwkJbW9kX3RpbWVyKCZ3Yl90aW1lciwgamlmZmllcyArIGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCk7CisJZWxzZQogCQlkZWxfdGltZXIoJndiX3RpbWVyKTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyNiw2ICs4MjQsNyBAQAogCQltYXBwaW5nMiA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIAkJaWYgKG1hcHBpbmcyKSB7IC8qIFJhY2Ugd2l0aCB0cnVuY2F0ZT8gKi8KIAkJCUJVR19PTihtYXBwaW5nMiAhPSBtYXBwaW5nKTsKKwkJCVdBUk5fT05fT05DRSghUGFnZVByaXZhdGUocGFnZSkgJiYgIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAJCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgewogCQkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKIAkJCQl0YXNrX2lvX2FjY291bnRfd3JpdGUoUEFHRV9DQUNIRV9TSVpFKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCAwNWFjZTQ0Li5lMmExMGI5IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC04MCw4ICs4MCw5IEBACiAJIDI1NiwKICNlbmRpZgogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JIDMyCisJIDMyLAogI2VuZGlmCisJIDMyLAogfTsKIAogRVhQT1JUX1NZTUJPTCh0b3RhbHJhbV9wYWdlcyk7CkBAIC05NSw4ICs5Niw5IEBACiAjZW5kaWYKIAkgIk5vcm1hbCIsCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQkgIkhpZ2hNZW0iCisJICJIaWdoTWVtIiwKICNlbmRpZgorCSAiTW92YWJsZSIsCiB9OwogCiBpbnQgbWluX2ZyZWVfa2J5dGVzID0gMTAyNDsKQEAgLTEyNiwxNCArMTI4LDIxIEBACiAgICAgI2VuZGlmCiAgICNlbmRpZgogCi0gIHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gX19tZW1pbml0ZGF0YSBlYXJseV9ub2RlX21hcFtNQVhfQUNUSVZFX1JFR0lPTlNdOwotICBpbnQgX19tZW1pbml0ZGF0YSBucl9ub2RlbWFwX2VudHJpZXM7Ci0gIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwotICB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CisgIHN0YXRpYyBzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uIF9fbWVtaW5pdGRhdGEgZWFybHlfbm9kZV9tYXBbTUFYX0FDVElWRV9SRUdJT05TXTsKKyAgc3RhdGljIGludCBfX21lbWluaXRkYXRhIG5yX25vZGVtYXBfZW50cmllczsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFCi0gIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdOwotICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9lbmRfcGZuW01BWF9OVU1OT0RFU107CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bTUFYX05VTU5PREVTXTsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X2VuZF9wZm5bTUFYX05VTU5PREVTXTsKICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRSAqLworICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmVxdWlyZWRfa2VybmVsY29yZTsKKyAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHJlcXVpcmVkX21vdmFibGVjb3JlOworICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgem9uZV9tb3ZhYmxlX3BmbltNQVhfTlVNTk9ERVNdOworCisgIC8qIG1vdmFibGVfem9uZSBpcyB0aGUgInJlYWwiIHpvbmUgcGFnZXMgaW4gWk9ORV9NT1ZBQkxFIGFyZSB0YWtlbiBmcm9tICovCisgIGludCBtb3ZhYmxlX3pvbmU7CisgIEVYUE9SVF9TWU1CT0wobW92YWJsZV96b25lKTsKICNlbmRpZiAvKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAgKi8KIAogI2lmIE1BWF9OVU1OT0RFUyA+IDEKQEAgLTkwMCwxMSArOTA5LDEzIEBACiAKIAl1MzIgaWdub3JlX2dmcF9oaWdobWVtOwogCXUzMiBpZ25vcmVfZ2ZwX3dhaXQ7CisJdTMyIG1pbl9vcmRlcjsKIAogI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKIAogCXN0cnVjdCBkZW50cnkgKmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlOwogCXN0cnVjdCBkZW50cnkgKmlnbm9yZV9nZnBfd2FpdF9maWxlOworCXN0cnVjdCBkZW50cnkgKm1pbl9vcmRlcl9maWxlOwogCiAjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwogCkBAIC05MTIsNiArOTIzLDcgQEAKIAkuYXR0ciA9IEZBVUxUX0FUVFJfSU5JVElBTElaRVIsCiAJLmlnbm9yZV9nZnBfd2FpdCA9IDEsCiAJLmlnbm9yZV9nZnBfaGlnaG1lbSA9IDEsCisJLm1pbl9vcmRlciA9IDEsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9mYWlsX3BhZ2VfYWxsb2MoY2hhciAqc3RyKQpAQCAtOTIyLDYgKzkzNCw4IEBACiAKIHN0YXRpYyBpbnQgc2hvdWxkX2ZhaWxfYWxsb2NfcGFnZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQogeworCWlmIChvcmRlciA8IGZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXIpCisJCXJldHVybiAwOwogCWlmIChnZnBfbWFzayAmIF9fR0ZQX05PRkFJTCkKIAkJcmV0dXJuIDA7CiAJaWYgKGZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW0gJiYgKGdmcF9tYXNrICYgX19HRlBfSElHSE1FTSkpCkBAIC05NTMsMTIgKzk2NywxNyBAQAogCWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZSA9CiAJCWRlYnVnZnNfY3JlYXRlX2Jvb2woImlnbm9yZS1nZnAtaGlnaG1lbSIsIG1vZGUsIGRpciwKIAkJCQkgICAgICAmZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbSk7CisJZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcl9maWxlID0KKwkJZGVidWdmc19jcmVhdGVfdTMyKCJtaW4tb3JkZXIiLCBtb2RlLCBkaXIsCisJCQkJICAgJmZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXIpOwogCiAJaWYgKCFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF93YWl0X2ZpbGUgfHwKLQkJCSFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUpIHsKKyAgICAgICAgICAgICFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUgfHwKKyAgICAgICAgICAgICFmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyX2ZpbGUpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfd2FpdF9maWxlKTsKIAkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlKTsKKwkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcl9maWxlKTsKIAkJY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsX3BhZ2VfYWxsb2MuYXR0cik7CiAJfQogCkBAIC0xMzE0LDcgKzEzMzMsNyBAQAogCXJlY2xhaW1fc3RhdGUucmVjbGFpbWVkX3NsYWIgPSAwOwogCXAtPnJlY2xhaW1fc3RhdGUgPSAmcmVjbGFpbV9zdGF0ZTsKIAotCWRpZF9zb21lX3Byb2dyZXNzID0gdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZWxpc3QtPnpvbmVzLCBnZnBfbWFzayk7CisJZGlkX3NvbWVfcHJvZ3Jlc3MgPSB0cnlfdG9fZnJlZV9wYWdlcyh6b25lbGlzdC0+em9uZXMsIG9yZGVyLCBnZnBfbWFzayk7CiAKIAlwLT5yZWNsYWltX3N0YXRlID0gTlVMTDsKIAlwLT5mbGFncyAmPSB+UEZfTUVNQUxMT0M7CkBAIC0xMzUxLDcgKzEzNzAsOCBAQAogCSAqLwogCWRvX3JldHJ5ID0gMDsKIAlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX05PUkVUUlkpKSB7Ci0JCWlmICgob3JkZXIgPD0gMykgfHwgKGdmcF9tYXNrICYgX19HRlBfUkVQRUFUKSkKKwkJaWYgKChvcmRlciA8PSBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUikgfHwKKwkJCQkJCShnZnBfbWFzayAmIF9fR0ZQX1JFUEVBVCkpCiAJCQlkb19yZXRyeSA9IDE7CiAJCWlmIChnZnBfbWFzayAmIF9fR0ZQX05PRkFJTCkKIAkJCWRvX3JldHJ5ID0gMTsKQEAgLTE0NjQsMTMgKzE0ODQsMTQgQEAKIHsKIAlyZXR1cm4gbnJfZnJlZV96b25lX3BhZ2VzKGdmcF96b25lKEdGUF9VU0VSKSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChucl9mcmVlX2J1ZmZlcl9wYWdlcyk7CiAKIC8qCiAgKiBBbW91bnQgb2YgZnJlZSBSQU0gYWxsb2NhdGFibGUgd2l0aGluIGFsbCB6b25lcwogICovCiB1bnNpZ25lZCBpbnQgbnJfZnJlZV9wYWdlY2FjaGVfcGFnZXModm9pZCkKIHsKLQlyZXR1cm4gbnJfZnJlZV96b25lX3BhZ2VzKGdmcF96b25lKEdGUF9ISUdIVVNFUikpOworCXJldHVybiBucl9mcmVlX3pvbmVfcGFnZXMoZ2ZwX3pvbmUoR0ZQX0hJR0hVU0VSX01PVkFCTEUpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNob3dfbm9kZShzdHJ1Y3Qgem9uZSAqem9uZSkKQEAgLTE2MjEsOCArMTY0Miw4IEBACiAgKgogICogQWRkIGFsbCBwb3B1bGF0ZWQgem9uZXMgb2YgYSBub2RlIHRvIHRoZSB6b25lbGlzdC4KICAqLwotc3RhdGljIGludCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwKLQkJCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsIGludCBucl96b25lcywgZW51bSB6b25lX3R5cGUgem9uZV90eXBlKQorc3RhdGljIGludCBidWlsZF96b25lbGlzdHNfbm9kZShwZ19kYXRhX3QgKnBnZGF0LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAorCQkJCWludCBucl96b25lcywgZW51bSB6b25lX3R5cGUgem9uZV90eXBlKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCkBAIC0xNjQxLDkgKzE2NjIsMTAyIEBACiAJcmV0dXJuIG5yX3pvbmVzOwogfQogCisKKy8qCisgKiAgem9uZWxpc3Rfb3JkZXI6CisgKiAgMCA9IGF1dG9tYXRpYyBkZXRlY3Rpb24gb2YgYmV0dGVyIG9yZGVyaW5nLgorICogIDEgPSBvcmRlciBieSAoW25vZGVdIGRpc3RhbmNlLCAtem9uZXR5cGUpCisgKiAgMiA9IG9yZGVyIGJ5ICgtem9uZXR5cGUsIFtub2RlXSBkaXN0YW5jZSkKKyAqCisgKiAgSWYgbm90IE5VTUEsIFpPTkVMSVNUX09SREVSX1pPTkUgYW5kIFpPTkVMSVNUX09SREVSX05PREUgd2lsbCBjcmVhdGUKKyAqICB0aGUgc2FtZSB6b25lbGlzdC4gU28gb25seSBOVU1BIGNhbiBjb25maWd1cmUgdGhpcyBwYXJhbS4KKyAqLworI2RlZmluZSBaT05FTElTVF9PUkRFUl9ERUZBVUxUICAwCisjZGVmaW5lIFpPTkVMSVNUX09SREVSX05PREUgICAgIDEKKyNkZWZpbmUgWk9ORUxJU1RfT1JERVJfWk9ORSAgICAgMgorCisvKiB6b25lbGlzdCBvcmRlciBpbiB0aGUga2VybmVsLgorICogc2V0X3pvbmVsaXN0X29yZGVyKCkgd2lsbCBzZXQgdGhpcyB0byBOT0RFIG9yIFpPTkUuCisgKi8KK3N0YXRpYyBpbnQgY3VycmVudF96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX0RFRkFVTFQ7CitzdGF0aWMgY2hhciB6b25lbGlzdF9vcmRlcl9uYW1lWzNdWzhdID0geyJEZWZhdWx0IiwgIk5vZGUiLCAiWm9uZSJ9OworCisKICNpZmRlZiBDT05GSUdfTlVNQQorLyogVGhlIHZhbHVlIHVzZXIgc3BlY2lmaWVkIC4uLi5jaGFuZ2VkIGJ5IGNvbmZpZyAqLworc3RhdGljIGludCB1c2VyX3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfREVGQVVMVDsKKy8qIHN0cmluZyBmb3Igc3lzY3RsICovCisjZGVmaW5lIE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOCTE2CitjaGFyIG51bWFfem9uZWxpc3Rfb3JkZXJbMTZdID0gImRlZmF1bHQiOworCisvKgorICogaW50ZXJmYWNlIGZvciBjb25maWd1cmUgem9uZWxpc3Qgb3JkZXJpbmcuCisgKiBjb21tYW5kIGxpbmUgb3B0aW9uICJudW1hX3pvbmVsaXN0X29yZGVyIgorICoJPSAiW2REXWVmYXVsdAktIGRlZmF1bHQsIGF1dG9tYXRpYyBjb25maWd1cmF0aW9uLgorICoJPSAiW25OXW9kZSAJLSBvcmRlciBieSBub2RlIGxvY2FsaXR5LCB0aGVuIGJ5IHpvbmUgd2l0aGluIG5vZGUKKyAqCT0gIlt6Wl1vbmUgICAgICAtIG9yZGVyIGJ5IHpvbmUsIHRoZW4gYnkgbG9jYWxpdHkgd2l0aGluIHpvbmUKKyAqLworCitzdGF0aWMgaW50IF9fcGFyc2VfbnVtYV96b25lbGlzdF9vcmRlcihjaGFyICpzKQoreworCWlmICgqcyA9PSAnZCcgfHwgKnMgPT0gJ0QnKSB7CisJCXVzZXJfem9uZWxpc3Rfb3JkZXIgPSBaT05FTElTVF9PUkRFUl9ERUZBVUxUOworCX0gZWxzZSBpZiAoKnMgPT0gJ24nIHx8ICpzID09ICdOJykgeworCQl1c2VyX3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfTk9ERTsKKwl9IGVsc2UgaWYgKCpzID09ICd6JyB8fCAqcyA9PSAnWicpIHsKKwkJdXNlcl96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX1pPTkU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIklnbm9yaW5nIGludmFsaWQgbnVtYV96b25lbGlzdF9vcmRlciB2YWx1ZTogICIKKwkJCSIlc1xuIiwgcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbnVtYV96b25lbGlzdF9vcmRlcihjaGFyICpzKQoreworCWlmIChzKQorCQlyZXR1cm4gX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKHMpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm51bWFfem9uZWxpc3Rfb3JkZXIiLCBzZXR1cF9udW1hX3pvbmVsaXN0X29yZGVyKTsKKworLyoKKyAqIHN5c2N0bCBoYW5kbGVyIGZvciBudW1hX3pvbmVsaXN0X29yZGVyCisgKi8KK2ludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsCisJCWxvZmZfdCAqcHBvcykKK3sKKwljaGFyIHNhdmVkX3N0cmluZ1tOVU1BX1pPTkVMSVNUX09SREVSX0xFTl07CisJaW50IHJldDsKKworCWlmICh3cml0ZSkKKwkJc3RybmNweShzYXZlZF9zdHJpbmcsIChjaGFyKil0YWJsZS0+ZGF0YSwKKwkJCU5VTUFfWk9ORUxJU1RfT1JERVJfTEVOKTsKKwlyZXQgPSBwcm9jX2Rvc3RyaW5nKHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHdyaXRlKSB7CisJCWludCBvbGR2YWwgPSB1c2VyX3pvbmVsaXN0X29yZGVyOworCQlpZiAoX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKChjaGFyKil0YWJsZS0+ZGF0YSkpIHsKKwkJCS8qCisJCQkgKiBib2d1cyB2YWx1ZS4gIHJlc3RvcmUgc2F2ZWQgc3RyaW5nCisJCQkgKi8KKwkJCXN0cm5jcHkoKGNoYXIqKXRhYmxlLT5kYXRhLCBzYXZlZF9zdHJpbmcsCisJCQkJTlVNQV9aT05FTElTVF9PUkRFUl9MRU4pOworCQkJdXNlcl96b25lbGlzdF9vcmRlciA9IG9sZHZhbDsKKwkJfSBlbHNlIGlmIChvbGR2YWwgIT0gdXNlcl96b25lbGlzdF9vcmRlcikKKwkJCWJ1aWxkX2FsbF96b25lbGlzdHMoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwogI2RlZmluZSBNQVhfTk9ERV9MT0FEIChudW1fb25saW5lX25vZGVzKCkpCi1zdGF0aWMgaW50IF9fbWVtaW5pdGRhdGEgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CitzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOworCiAvKioKICAqIGZpbmRfbmV4dF9iZXN0X25vZGUgLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QKICAqIEBub2RlOiBub2RlIHdob3NlIGZhbGxiYWNrIGxpc3Qgd2UncmUgYXBwZW5kaW5nCkBAIC0xNjU4LDcgKzE3NzIsNyBAQAogICogb24gdGhlbSBvdGhlcndpc2UuCiAgKiBJdCByZXR1cm5zIC0xIGlmIG5vIG5vZGUgaXMgZm91bmQuCiAgKi8KLXN0YXRpYyBpbnQgX19tZW1pbml0IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKQorc3RhdGljIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIHsKIAlpbnQgbiwgdmFsOwogCWludCBtaW5fdmFsID0gSU5UX01BWDsKQEAgLTE3MDQsMTMgKzE4MTgsMTI5IEBACiAJcmV0dXJuIGJlc3Rfbm9kZTsKIH0KIAotc3RhdGljIHZvaWQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQorCisvKgorICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuCisgKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwKKyAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgorICovCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgbm9kZSkKIHsKLQlpbnQgaiwgbm9kZSwgbG9jYWxfbm9kZTsKIAllbnVtIHpvbmVfdHlwZSBpOwotCWludCBwcmV2X25vZGUsIGxvYWQ7CisJaW50IGo7CiAJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgeworCQl6b25lbGlzdCA9IHBnZGF0LT5ub2RlX3pvbmVsaXN0cyArIGk7CisJCWZvciAoaiA9IDA7IHpvbmVsaXN0LT56b25lc1tqXSAhPSBOVUxMOyBqKyspCisJCQk7CisgCQlqID0gYnVpbGRfem9uZWxpc3RzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lbGlzdCwgaiwgaSk7CisJCXpvbmVsaXN0LT56b25lc1tqXSA9IE5VTEw7CisJfQorfQorCisvKgorICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgem9uZSBhbmQgbm9kZXMgd2l0aGluIHpvbmVzLgorICogVGhpcyByZXN1bHRzIGluIGNvbnNlcnZpbmcgRE1BIHpvbmVbc10gdW50aWwgYWxsIE5vcm1hbCBtZW1vcnkgaXMKKyAqIGV4aGF1c3RlZCwgYnV0IHJlc3VsdHMgaW4gb3ZlcmZsb3dpbmcgdG8gcmVtb3RlIG5vZGUgd2hpbGUgbWVtb3J5CisgKiBtYXkgc3RpbGwgZXhpc3QgaW4gbG9jYWwgRE1BIHpvbmUuCisgKi8KK3N0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdOworCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fem9uZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgbnJfbm9kZXMpCit7CisJZW51bSB6b25lX3R5cGUgaTsKKwlpbnQgcG9zLCBqLCBub2RlOworCWludCB6b25lX3R5cGU7CQkvKiBuZWVkcyB0byBiZSBzaWduZWQgKi8KKwlzdHJ1Y3Qgem9uZSAqejsKKwlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0OworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCXpvbmVsaXN0ID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzICsgaTsKKwkJcG9zID0gMDsKKwkJZm9yICh6b25lX3R5cGUgPSBpOyB6b25lX3R5cGUgPj0gMDsgem9uZV90eXBlLS0pIHsKKwkJCWZvciAoaiA9IDA7IGogPCBucl9ub2RlczsgaisrKSB7CisJCQkJbm9kZSA9IG5vZGVfb3JkZXJbal07CisJCQkJeiA9ICZOT0RFX0RBVEEobm9kZSktPm5vZGVfem9uZXNbem9uZV90eXBlXTsKKwkJCQlpZiAocG9wdWxhdGVkX3pvbmUoeikpIHsKKwkJCQkJem9uZWxpc3QtPnpvbmVzW3BvcysrXSA9IHo7CisJCQkJCWNoZWNrX2hpZ2hlc3Rfem9uZSh6b25lX3R5cGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQl6b25lbGlzdC0+em9uZXNbcG9zXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGRlZmF1bHRfem9uZWxpc3Rfb3JkZXIodm9pZCkKK3sKKwlpbnQgbmlkLCB6b25lX3R5cGU7CisJdW5zaWduZWQgbG9uZyBsb3dfa21lbV9zaXplLHRvdGFsX3NpemU7CisJc3RydWN0IHpvbmUgKno7CisJaW50IGF2ZXJhZ2Vfc2l6ZTsKKwkvKgorICAgICAgICAgKiBaT05FX0RNQSBhbmQgWk9ORV9ETUEzMiBjYW4gYmUgdmVyeSBzbWFsbCBhcmVhIGluIHRoZSBzeXRlbS4KKwkgKiBJZiB0aGV5IGFyZSByZWFsbHkgc21hbGwgYW5kIHVzZWQgaGVhdmlseSwgdGhlIHN5c3RlbSBjYW4gZmFsbAorCSAqIGludG8gT09NIHZlcnkgZWFzaWx5LgorCSAqIFRoaXMgZnVuY3Rpb24gZGV0ZWN0IFpPTkVfRE1BL0RNQTMyIHNpemUgYW5kIGNvbmZnaWd1cmVzIHpvbmUgb3JkZXIuCisJICovCisJLyogSXMgdGhlcmUgWk9ORV9OT1JNQUwgPyAoZXguIHBwYyBoYXMgb25seSBETUEgem9uZS4uKSAqLworCWxvd19rbWVtX3NpemUgPSAwOworCXRvdGFsX3NpemUgPSAwOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlmb3IgKHpvbmVfdHlwZSA9IDA7IHpvbmVfdHlwZSA8IE1BWF9OUl9aT05FUzsgem9uZV90eXBlKyspIHsKKwkJCXogPSAmTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZXNbem9uZV90eXBlXTsKKwkJCWlmIChwb3B1bGF0ZWRfem9uZSh6KSkgeworCQkJCWlmICh6b25lX3R5cGUgPCBaT05FX05PUk1BTCkKKwkJCQkJbG93X2ttZW1fc2l6ZSArPSB6LT5wcmVzZW50X3BhZ2VzOworCQkJCXRvdGFsX3NpemUgKz0gei0+cHJlc2VudF9wYWdlczsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWxvd19rbWVtX3NpemUgfHwgIC8qIHRoZXJlIGFyZSBubyBETUEgYXJlYS4gKi8KKwkgICAgbG93X2ttZW1fc2l6ZSA+IHRvdGFsX3NpemUvMikgLyogRE1BL0RNQTMyIGlzIGJpZy4gKi8KKwkJcmV0dXJuIFpPTkVMSVNUX09SREVSX05PREU7CisJLyoKKwkgKiBsb29rIGludG8gZWFjaCBub2RlJ3MgY29uZmlnLgorICAJICogSWYgdGhlcmUgaXMgYSBub2RlIHdob3NlIERNQS9ETUEzMiBtZW1vcnkgaXMgdmVyeSBiaWcgYXJlYSBvbgorIAkgKiBsb2NhbCBtZW1vcnksIE5PREVfT1JERVIgbWF5IGJlIHN1aXRhYmxlLgorICAgICAgICAgKi8KKwlhdmVyYWdlX3NpemUgPSB0b3RhbF9zaXplIC8gKG51bV9vbmxpbmVfbm9kZXMoKSArIDEpOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlsb3dfa21lbV9zaXplID0gMDsKKwkJdG90YWxfc2l6ZSA9IDA7CisJCWZvciAoem9uZV90eXBlID0gMDsgem9uZV90eXBlIDwgTUFYX05SX1pPTkVTOyB6b25lX3R5cGUrKykgeworCQkJeiA9ICZOT0RFX0RBVEEobmlkKS0+bm9kZV96b25lc1t6b25lX3R5cGVdOworCQkJaWYgKHBvcHVsYXRlZF96b25lKHopKSB7CisJCQkJaWYgKHpvbmVfdHlwZSA8IFpPTkVfTk9STUFMKQorCQkJCQlsb3dfa21lbV9zaXplICs9IHotPnByZXNlbnRfcGFnZXM7CisJCQkJdG90YWxfc2l6ZSArPSB6LT5wcmVzZW50X3BhZ2VzOworCQkJfQorCQl9CisJCWlmIChsb3dfa21lbV9zaXplICYmCisJCSAgICB0b3RhbF9zaXplID4gYXZlcmFnZV9zaXplICYmIC8qIGlnbm9yZSBzbWFsbCBub2RlICovCisJCSAgICBsb3dfa21lbV9zaXplID4gdG90YWxfc2l6ZSAqIDcwLzEwMCkKKwkJCXJldHVybiBaT05FTElTVF9PUkRFUl9OT0RFOworCX0KKwlyZXR1cm4gWk9ORUxJU1RfT1JERVJfWk9ORTsKK30KKworc3RhdGljIHZvaWQgc2V0X3pvbmVsaXN0X29yZGVyKHZvaWQpCit7CisJaWYgKHVzZXJfem9uZWxpc3Rfb3JkZXIgPT0gWk9ORUxJU1RfT1JERVJfREVGQVVMVCkKKwkJY3VycmVudF96b25lbGlzdF9vcmRlciA9IGRlZmF1bHRfem9uZWxpc3Rfb3JkZXIoKTsKKwllbHNlCisJCWN1cnJlbnRfem9uZWxpc3Rfb3JkZXIgPSB1c2VyX3pvbmVsaXN0X29yZGVyOworfQorCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKK3sKKwlpbnQgaiwgbm9kZSwgbG9hZDsKKwllbnVtIHpvbmVfdHlwZSBpOwogCW5vZGVtYXNrX3QgdXNlZF9tYXNrOworCWludCBsb2NhbF9ub2RlLCBwcmV2X25vZGU7CisJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdDsKKwlpbnQgb3JkZXIgPSBjdXJyZW50X3pvbmVsaXN0X29yZGVyOwogCiAJLyogaW5pdGlhbGl6ZSB6b25lbGlzdHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKQEAgLTE3MjMsNiArMTk1MywxMSBAQAogCWxvYWQgPSBudW1fb25saW5lX25vZGVzKCk7CiAJcHJldl9ub2RlID0gbG9jYWxfbm9kZTsKIAlub2Rlc19jbGVhcih1c2VkX21hc2spOworCisJbWVtc2V0KG5vZGVfbG9hZCwgMCwgc2l6ZW9mKG5vZGVfbG9hZCkpOworCW1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpOworCWogPSAwOworCiAJd2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShsb2NhbF9ub2RlLCAmdXNlZF9tYXNrKSkgPj0gMCkgewogCQlpbnQgZGlzdGFuY2UgPSBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIG5vZGUpOwogCkBAIC0xNzM4LDIzICsxOTczLDI1IEBACiAJCSAqIFNvIGFkZGluZyBwZW5hbHR5IHRvIHRoZSBmaXJzdCBub2RlIGluIHNhbWUKIAkJICogZGlzdGFuY2UgZ3JvdXAgdG8gbWFrZSBpdCByb3VuZC1yb2Jpbi4KIAkJICovCi0KIAkJaWYgKGRpc3RhbmNlICE9IG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgcHJldl9ub2RlKSkKLQkJCW5vZGVfbG9hZFtub2RlXSArPSBsb2FkOworCQkJbm9kZV9sb2FkW25vZGVdID0gbG9hZDsKKwogCQlwcmV2X25vZGUgPSBub2RlOwogCQlsb2FkLS07Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgewotCQkJem9uZWxpc3QgPSBwZ2RhdC0+bm9kZV96b25lbGlzdHMgKyBpOwotCQkJZm9yIChqID0gMDsgem9uZWxpc3QtPnpvbmVzW2pdICE9IE5VTEw7IGorKyk7CisJCWlmIChvcmRlciA9PSBaT05FTElTVF9PUkRFUl9OT0RFKQorCQkJYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdkYXQsIG5vZGUpOworCQllbHNlCisJCQlub2RlX29yZGVyW2orK10gPSBub2RlOwkvKiByZW1lbWJlciBvcmRlciAqLworCX0KIAotCSAJCWogPSBidWlsZF96b25lbGlzdHNfbm9kZShOT0RFX0RBVEEobm9kZSksIHpvbmVsaXN0LCBqLCBpKTsKLQkJCXpvbmVsaXN0LT56b25lc1tqXSA9IE5VTEw7Ci0JCX0KKwlpZiAob3JkZXIgPT0gWk9ORUxJU1RfT1JERVJfWk9ORSkgeworCQkvKiBjYWxjdWxhdGUgbm9kZSBvcmRlciAtLSBpLmUuLCBETUEgbGFzdCEgKi8KKwkJYnVpbGRfem9uZWxpc3RzX2luX3pvbmVfb3JkZXIocGdkYXQsIGopOwogCX0KIH0KIAogLyogQ29uc3RydWN0IHRoZSB6b25lbGlzdCBwZXJmb3JtYW5jZSBjYWNoZSAtIHNlZSBmdXJ0aGVyIG1tem9uZS5oICovCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RfY2FjaGUocGdfZGF0YV90ICpwZ2RhdCkKK3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0X2NhY2hlKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJaW50IGk7CiAKQEAgLTE3NzEsOSArMjAwOCwxNSBAQAogCX0KIH0KIAorCiAjZWxzZQkvKiBDT05GSUdfTlVNQSAqLwogCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCitzdGF0aWMgdm9pZCBzZXRfem9uZWxpc3Rfb3JkZXIodm9pZCkKK3sKKwljdXJyZW50X3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfWk9ORTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJaW50IG5vZGUsIGxvY2FsX25vZGU7CiAJZW51bSB6b25lX3R5cGUgaSxqOwpAQCAtMTgwOSw3ICsyMDUyLDcgQEAKIH0KIAogLyogbm9uLU5VTUEgdmFyaWFudCBvZiB6b25lbGlzdCBwZXJmb3JtYW5jZSBjYWNoZSAtIGp1c3QgTlVMTCB6bGNhY2hlX3B0ciAqLwotc3RhdGljIHZvaWQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0X2NhY2hlKHBnX2RhdGFfdCAqcGdkYXQpCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdF9jYWNoZShwZ19kYXRhX3QgKnBnZGF0KQogewogCWludCBpOwogCkBAIC0xODIwLDcgKzIwNjMsNyBAQAogI2VuZGlmCS8qIENPTkZJR19OVU1BICovCiAKIC8qIHJldHVybiB2YWx1ZXMgaW50IC4uLi5qdXN0IGZvciBzdG9wX21hY2hpbmVfcnVuKCkgKi8KLXN0YXRpYyBpbnQgX19tZW1pbml0IF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmR1bW15KQogewogCWludCBuaWQ7CiAKQEAgLTE4MzEsOCArMjA3NCwxMCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fbWVtaW5pdCBidWlsZF9hbGxfem9uZWxpc3RzKHZvaWQpCit2b2lkIGJ1aWxkX2FsbF96b25lbGlzdHModm9pZCkKIHsKKwlzZXRfem9uZWxpc3Rfb3JkZXIoKTsKKwogCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKIAkJX19idWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpOwogCQljcHVzZXRfaW5pdF9jdXJyZW50X21lbXNfYWxsb3dlZCgpOwpAQCAtMTg0Myw4ICsyMDg4LDEzIEBACiAJCS8qIGNwdXNldCByZWZyZXNoIHJvdXRpbmUgc2hvdWxkIGJlIGhlcmUgKi8KIAl9CiAJdm1fdG90YWxfcGFnZXMgPSBucl9mcmVlX3BhZ2VjYWNoZV9wYWdlcygpOwotCXByaW50aygiQnVpbHQgJWkgem9uZWxpc3RzLiAgVG90YWwgcGFnZXM6ICVsZFxuIiwKLQkJCW51bV9vbmxpbmVfbm9kZXMoKSwgdm1fdG90YWxfcGFnZXMpOworCXByaW50aygiQnVpbHQgJWkgem9uZWxpc3RzIGluICVzIG9yZGVyLiAgVG90YWwgcGFnZXM6ICVsZFxuIiwKKwkJCW51bV9vbmxpbmVfbm9kZXMoKSwKKwkJCXpvbmVsaXN0X29yZGVyX25hbWVbY3VycmVudF96b25lbGlzdF9vcmRlcl0sCisJCQl2bV90b3RhbF9wYWdlcyk7CisjaWZkZWYgQ09ORklHX05VTUEKKwlwcmludGsoIlBvbGljeSB6b25lOiAlc1xuIiwgem9uZV9uYW1lc1twb2xpY3lfem9uZV0pOworI2VuZGlmCiB9CiAKIC8qCkBAIC0xOTUzLDggKzIyMDMsOCBAQAogCX0KIH0KIAotdm9pZCB6b25lX2luaXRfZnJlZV9saXN0cyhzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LCBzdHJ1Y3Qgem9uZSAqem9uZSwKLQkJCQl1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgdm9pZCBfX21lbWluaXQgem9uZV9pbml0X2ZyZWVfbGlzdHMoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKKwkJCQlzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWludCBvcmRlcjsKIAlmb3IgKG9yZGVyID0gMDsgb3JkZXIgPCBNQVhfT1JERVIgOyBvcmRlcisrKSB7CkBAIC0yMzcwLDcgKzI2MjAsNyBAQAogfQogCiAvKiBJZiBuZWNlc3NhcnksIHB1c2ggdGhlIG5vZGUgYm91bmRhcnkgb3V0IGZvciByZXNlcnZlIGhvdGFkZCAqLwotc3RhdGljIHZvaWQgX19pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAorc3RhdGljIHZvaWQgX19tZW1pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAogCQl1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pCiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgIkVudGVyaW5nIGFjY291bnRfbm9kZV9ib3VuZGFyeSgldSwgJWx1LCAlbHUpXG4iLApAQCAtMjM5MCw3ICsyNjQwLDcgQEAKIHZvaWQgX19pbml0IHB1c2hfbm9kZV9ib3VuZGFyaWVzKHVuc2lnbmVkIGludCBuaWQsCiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pIHt9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhY2NvdW50X25vZGVfYm91bmRhcnkodW5zaWduZWQgaW50IG5pZCwKK3N0YXRpYyB2b2lkIF9fbWVtaW5pdCBhY2NvdW50X25vZGVfYm91bmRhcnkodW5zaWduZWQgaW50IG5pZCwKIAkJdW5zaWduZWQgbG9uZyAqc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nICplbmRfcGZuKSB7fQogI2VuZGlmCiAKQEAgLTI0MjgsMTAgKzI2NzgsNjcgQEAKIH0KIAogLyoKKyAqIFRoaXMgZmluZHMgYSB6b25lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIFpPTkVfTU9WQUJMRSBwYWdlcy4gVGhlCisgKiBhc3N1bXB0aW9uIGlzIG1hZGUgdGhhdCB6b25lcyB3aXRoaW4gYSBub2RlIGFyZSBvcmRlcmVkIGluIG1vbm90b25pYworICogaW5jcmVhc2luZyBtZW1vcnkgYWRkcmVzc2VzIHNvIHRoYXQgdGhlICJoaWdoZXN0IiBwb3B1bGF0ZWQgem9uZSBpcyB1c2VkCisgKi8KK3ZvaWQgX19pbml0IGZpbmRfdXNhYmxlX3pvbmVfZm9yX21vdmFibGUodm9pZCkKK3sKKwlpbnQgem9uZV9pbmRleDsKKwlmb3IgKHpvbmVfaW5kZXggPSBNQVhfTlJfWk9ORVMgLSAxOyB6b25lX2luZGV4ID49IDA7IHpvbmVfaW5kZXgtLSkgeworCQlpZiAoem9uZV9pbmRleCA9PSBaT05FX01PVkFCTEUpCisJCQljb250aW51ZTsKKworCQlpZiAoYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW3pvbmVfaW5kZXhdID4KKwkJCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3Bmblt6b25lX2luZGV4XSkKKwkJCWJyZWFrOworCX0KKworCVZNX0JVR19PTih6b25lX2luZGV4ID09IC0xKTsKKwltb3ZhYmxlX3pvbmUgPSB6b25lX2luZGV4OworfQorCisvKgorICogVGhlIHpvbmUgcmFuZ2VzIHByb3ZpZGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgZG8gbm90IGluY2x1ZGUgWk9ORV9NT1ZBQkxFCisgKiBiZWNhdXNlIGl0IGlzIHNpemVkIGluZGVwZW5kYW50IG9mIGFyY2hpdGVjdHVyZS4gVW5saWtlIHRoZSBvdGhlciB6b25lcywKKyAqIHRoZSBzdGFydGluZyBwb2ludCBmb3IgWk9ORV9NT1ZBQkxFIGlzIG5vdCBmaXhlZC4gSXQgbWF5IGJlIGRpZmZlcmVudAorICogaW4gZWFjaCBub2RlIGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiBlYWNoIG5vZGUgYW5kIGhvdyBldmVubHkga2VybmVsY29yZQorICogaXMgZGlzdHJpYnV0ZWQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGFkanVzdHMgdGhlIHpvbmUgcmFuZ2VzCisgKiBwcm92aWRlZCBieSB0aGUgYXJjaGl0ZWN0dXJlIGZvciBhIGdpdmVuIG5vZGUgYnkgdXNpbmcgdGhlIGVuZCBvZiB0aGUKKyAqIGhpZ2hlc3QgdXNhYmxlIHpvbmUgZm9yIFpPTkVfTU9WQUJMRS4gVGhpcyBwcmVzZXJ2ZXMgdGhlIGFzc3VtcHRpb24gdGhhdAorICogem9uZXMgd2l0aGluIGEgbm9kZSBhcmUgaW4gb3JkZXIgb2YgbW9ub3RvbmljIGluY3JlYXNlcyBtZW1vcnkgYWRkcmVzc2VzCisgKi8KK3ZvaWQgX19tZW1pbml0IGFkanVzdF96b25lX3JhbmdlX2Zvcl96b25lX21vdmFibGUoaW50IG5pZCwKKwkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgbm9kZV9zdGFydF9wZm4sCisJCQkJCXVuc2lnbmVkIGxvbmcgbm9kZV9lbmRfcGZuLAorCQkJCQl1bnNpZ25lZCBsb25nICp6b25lX3N0YXJ0X3BmbiwKKwkJCQkJdW5zaWduZWQgbG9uZyAqem9uZV9lbmRfcGZuKQoreworCS8qIE9ubHkgYWRqdXN0IGlmIFpPTkVfTU9WQUJMRSBpcyBvbiB0aGlzIG5vZGUgKi8KKwlpZiAoem9uZV9tb3ZhYmxlX3BmbltuaWRdKSB7CisJCS8qIFNpemUgWk9ORV9NT1ZBQkxFICovCisJCWlmICh6b25lX3R5cGUgPT0gWk9ORV9NT1ZBQkxFKSB7CisJCQkqem9uZV9zdGFydF9wZm4gPSB6b25lX21vdmFibGVfcGZuW25pZF07CisJCQkqem9uZV9lbmRfcGZuID0gbWluKG5vZGVfZW5kX3BmbiwKKwkJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bbW92YWJsZV96b25lXSk7CisKKwkJLyogQWRqdXN0IGZvciBaT05FX01PVkFCTEUgc3RhcnRpbmcgd2l0aGluIHRoaXMgcmFuZ2UgKi8KKwkJfSBlbHNlIGlmICgqem9uZV9zdGFydF9wZm4gPCB6b25lX21vdmFibGVfcGZuW25pZF0gJiYKKwkJCQkqem9uZV9lbmRfcGZuID4gem9uZV9tb3ZhYmxlX3BmbltuaWRdKSB7CisJCQkqem9uZV9lbmRfcGZuID0gem9uZV9tb3ZhYmxlX3BmbltuaWRdOworCisJCS8qIENoZWNrIGlmIHRoaXMgd2hvbGUgcmFuZ2UgaXMgd2l0aGluIFpPTkVfTU9WQUJMRSAqLworCQl9IGVsc2UgaWYgKCp6b25lX3N0YXJ0X3BmbiA+PSB6b25lX21vdmFibGVfcGZuW25pZF0pCisJCQkqem9uZV9zdGFydF9wZm4gPSAqem9uZV9lbmRfcGZuOworCX0KK30KKworLyoKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGEgem9uZSBzcGFucyBpbiBhIG5vZGUsIGluY2x1ZGluZyBob2xlcwogICogcHJlc2VudF9wYWdlcyA9IHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKCkgLSB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKCkKICAqLwotdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUoaW50IG5pZCwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqaWdub3JlZCkKIHsKQEAgLTI0NDIsNiArMjc0OSw5IEBACiAJZ2V0X3Bmbl9yYW5nZV9mb3JfbmlkKG5pZCwgJm5vZGVfc3RhcnRfcGZuLCAmbm9kZV9lbmRfcGZuKTsKIAl6b25lX3N0YXJ0X3BmbiA9IGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW3pvbmVfdHlwZV07CiAJem9uZV9lbmRfcGZuID0gYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW3pvbmVfdHlwZV07CisJYWRqdXN0X3pvbmVfcmFuZ2VfZm9yX3pvbmVfbW92YWJsZShuaWQsIHpvbmVfdHlwZSwKKwkJCQlub2RlX3N0YXJ0X3Bmbiwgbm9kZV9lbmRfcGZuLAorCQkJCSZ6b25lX3N0YXJ0X3BmbiwgJnpvbmVfZW5kX3Bmbik7CiAKIAkvKiBDaGVjayB0aGF0IHRoaXMgbm9kZSBoYXMgcGFnZXMgd2l0aGluIHRoZSB6b25lJ3MgcmVxdWlyZWQgcmFuZ2UgKi8KIAlpZiAoem9uZV9lbmRfcGZuIDwgbm9kZV9zdGFydF9wZm4gfHwgem9uZV9zdGFydF9wZm4gPiBub2RlX2VuZF9wZm4pCkBAIC0yNTE5LDcgKzI4MjksNyBAQAogfQogCiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlIGZyYW1lcyBpbiBob2xlcyBpbiBhIHpvbmUgb24gYSBub2RlICovCi11bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKGludCBuaWQsCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqaWdub3JlZCkKIHsKQEAgLTI1MzIsMTggKzI4NDIsMjEgQEAKIAl6b25lX2VuZF9wZm4gPSBtaW4oYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW3pvbmVfdHlwZV0sCiAJCQkJCQkJbm9kZV9lbmRfcGZuKTsKIAorCWFkanVzdF96b25lX3JhbmdlX2Zvcl96b25lX21vdmFibGUobmlkLCB6b25lX3R5cGUsCisJCQlub2RlX3N0YXJ0X3Bmbiwgbm9kZV9lbmRfcGZuLAorCQkJJnpvbmVfc3RhcnRfcGZuLCAmem9uZV9lbmRfcGZuKTsKIAlyZXR1cm4gX19hYnNlbnRfcGFnZXNfaW5fcmFuZ2UobmlkLCB6b25lX3N0YXJ0X3Bmbiwgem9uZV9lbmRfcGZuKTsKIH0KIAogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqem9uZXNfc2l6ZSkKIHsKIAlyZXR1cm4gem9uZXNfc2l6ZVt6b25lX3R5cGVdOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKGludCBuaWQsCiAJCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplKQogewpAQCAtMjkwOSw2ICszMjIyLDE1NyBAQAogCXJldHVybiBtYXhfcGZuOwogfQogCit1bnNpZ25lZCBsb25nIF9faW5pdCBlYXJseV9jYWxjdWxhdGVfdG90YWxwYWdlcyh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgdG90YWxwYWdlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZW1hcF9lbnRyaWVzOyBpKyspCisJCXRvdGFscGFnZXMgKz0gZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbiAtCisJCQkJCQllYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm47CisKKwlyZXR1cm4gdG90YWxwYWdlczsKK30KKworLyoKKyAqIEZpbmQgdGhlIFBGTiB0aGUgTW92YWJsZSB6b25lIGJlZ2lucyBpbiBlYWNoIG5vZGUuIEtlcm5lbCBtZW1vcnkKKyAqIGlzIHNwcmVhZCBldmVubHkgYmV0d2VlbiBub2RlcyBhcyBsb25nIGFzIHRoZSBub2RlcyBoYXZlIGVub3VnaAorICogbWVtb3J5LiBXaGVuIHRoZXkgZG9uJ3QsIHNvbWUgbm9kZXMgd2lsbCBoYXZlIG1vcmUga2VybmVsY29yZSB0aGFuCisgKiBvdGhlcnMKKyAqLwordm9pZCBfX2luaXQgZmluZF96b25lX21vdmFibGVfcGZuc19mb3Jfbm9kZXModW5zaWduZWQgbG9uZyAqbW92YWJsZV9wZm4pCit7CisJaW50IGksIG5pZDsKKwl1bnNpZ25lZCBsb25nIHVzYWJsZV9zdGFydHBmbjsKKwl1bnNpZ25lZCBsb25nIGtlcm5lbGNvcmVfbm9kZSwga2VybmVsY29yZV9yZW1haW5pbmc7CisJaW50IHVzYWJsZV9ub2RlcyA9IG51bV9vbmxpbmVfbm9kZXMoKTsKKworCS8qCisJICogSWYgbW92YWJsZWNvcmUgd2FzIHNwZWNpZmllZCwgY2FsY3VsYXRlIHdoYXQgc2l6ZSBvZgorCSAqIGtlcm5lbGNvcmUgdGhhdCBjb3JyZXNwb25kcyBzbyB0aGF0IG1lbW9yeSB1c2FibGUgZm9yCisJICogYW55IGFsbG9jYXRpb24gdHlwZSBpcyBldmVubHkgc3ByZWFkLiBJZiBib3RoIGtlcm5lbGNvcmUKKwkgKiBhbmQgbW92YWJsZWNvcmUgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgdmFsdWUgb2Yga2VybmVsY29yZQorCSAqIHdpbGwgYmUgdXNlZCBmb3IgcmVxdWlyZWRfa2VybmVsY29yZSBpZiBpdCdzIGdyZWF0ZXIgdGhhbgorCSAqIHdoYXQgbW92YWJsZWNvcmUgd291bGQgaGF2ZSBhbGxvd2VkLgorCSAqLworCWlmIChyZXF1aXJlZF9tb3ZhYmxlY29yZSkgeworCQl1bnNpZ25lZCBsb25nIHRvdGFscGFnZXMgPSBlYXJseV9jYWxjdWxhdGVfdG90YWxwYWdlcygpOworCQl1bnNpZ25lZCBsb25nIGNvcmVwYWdlczsKKworCQkvKgorCQkgKiBSb3VuZC11cCBzbyB0aGF0IFpPTkVfTU9WQUJMRSBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB3aGF0CisJCSAqIHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIKKwkJICovCisJCXJlcXVpcmVkX21vdmFibGVjb3JlID0KKwkJCXJvdW5kdXAocmVxdWlyZWRfbW92YWJsZWNvcmUsIE1BWF9PUkRFUl9OUl9QQUdFUyk7CisJCWNvcmVwYWdlcyA9IHRvdGFscGFnZXMgLSByZXF1aXJlZF9tb3ZhYmxlY29yZTsKKworCQlyZXF1aXJlZF9rZXJuZWxjb3JlID0gbWF4KHJlcXVpcmVkX2tlcm5lbGNvcmUsIGNvcmVwYWdlcyk7CisJfQorCisJLyogSWYga2VybmVsY29yZSB3YXMgbm90IHNwZWNpZmllZCwgdGhlcmUgaXMgbm8gWk9ORV9NT1ZBQkxFICovCisJaWYgKCFyZXF1aXJlZF9rZXJuZWxjb3JlKQorCQlyZXR1cm47CisKKwkvKiB1c2FibGVfc3RhcnRwZm4gaXMgdGhlIGxvd2VzdCBwb3NzaWJsZSBwZm4gWk9ORV9NT1ZBQkxFIGNhbiBiZSBhdCAqLworCWZpbmRfdXNhYmxlX3pvbmVfZm9yX21vdmFibGUoKTsKKwl1c2FibGVfc3RhcnRwZm4gPSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3Bmblttb3ZhYmxlX3pvbmVdOworCityZXN0YXJ0OgorCS8qIFNwcmVhZCBrZXJuZWxjb3JlIG1lbW9yeSBhcyBldmVubHkgYXMgcG9zc2libGUgdGhyb3VnaG91dCBub2RlcyAqLworCWtlcm5lbGNvcmVfbm9kZSA9IHJlcXVpcmVkX2tlcm5lbGNvcmUgLyB1c2FibGVfbm9kZXM7CisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCS8qCisJCSAqIFJlY2FsY3VsYXRlIGtlcm5lbGNvcmVfbm9kZSBpZiB0aGUgZGl2aXNpb24gcGVyIG5vZGUKKwkJICogbm93IGV4Y2VlZHMgd2hhdCBpcyBuZWNlc3NhcnkgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdGVkCisJCSAqIGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBrZXJuZWwKKwkJICovCisJCWlmIChyZXF1aXJlZF9rZXJuZWxjb3JlIDwga2VybmVsY29yZV9ub2RlKQorCQkJa2VybmVsY29yZV9ub2RlID0gcmVxdWlyZWRfa2VybmVsY29yZSAvIHVzYWJsZV9ub2RlczsKKworCQkvKgorCQkgKiBBcyB0aGUgbWFwIGlzIHdhbGtlZCwgd2UgdHJhY2sgaG93IG11Y2ggbWVtb3J5IGlzIHVzYWJsZQorCQkgKiBieSB0aGUga2VybmVsIHVzaW5nIGtlcm5lbGNvcmVfcmVtYWluaW5nLiBXaGVuIGl0IGlzCisJCSAqIDAsIHRoZSByZXN0IG9mIHRoZSBub2RlIGlzIHVzYWJsZSBieSBaT05FX01PVkFCTEUKKwkJICovCisJCWtlcm5lbGNvcmVfcmVtYWluaW5nID0ga2VybmVsY29yZV9ub2RlOworCisJCS8qIEdvIHRocm91Z2ggZWFjaCByYW5nZSBvZiBQRk5zIHdpdGhpbiB0aGlzIG5vZGUgKi8KKwkJZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOworCQkJdW5zaWduZWQgbG9uZyBzaXplX3BhZ2VzOworCisJCQlzdGFydF9wZm4gPSBtYXgoZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuLAorCQkJCQkJem9uZV9tb3ZhYmxlX3BmbltuaWRdKTsKKwkJCWVuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOworCQkJaWYgKHN0YXJ0X3BmbiA+PSBlbmRfcGZuKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBBY2NvdW50IGZvciB3aGF0IGlzIG9ubHkgdXNhYmxlIGZvciBrZXJuZWxjb3JlICovCisJCQlpZiAoc3RhcnRfcGZuIDwgdXNhYmxlX3N0YXJ0cGZuKSB7CisJCQkJdW5zaWduZWQgbG9uZyBrZXJuZWxfcGFnZXM7CisJCQkJa2VybmVsX3BhZ2VzID0gbWluKGVuZF9wZm4sIHVzYWJsZV9zdGFydHBmbikKKwkJCQkJCQkJLSBzdGFydF9wZm47CisKKwkJCQlrZXJuZWxjb3JlX3JlbWFpbmluZyAtPSBtaW4oa2VybmVsX3BhZ2VzLAorCQkJCQkJCWtlcm5lbGNvcmVfcmVtYWluaW5nKTsKKwkJCQlyZXF1aXJlZF9rZXJuZWxjb3JlIC09IG1pbihrZXJuZWxfcGFnZXMsCisJCQkJCQkJcmVxdWlyZWRfa2VybmVsY29yZSk7CisKKwkJCQkvKiBDb250aW51ZSBpZiByYW5nZSBpcyBub3cgZnVsbHkgYWNjb3VudGVkICovCisJCQkJaWYgKGVuZF9wZm4gPD0gdXNhYmxlX3N0YXJ0cGZuKSB7CisKKwkJCQkJLyoKKwkJCQkJICogUHVzaCB6b25lX21vdmFibGVfcGZuIHRvIHRoZSBlbmQgc28KKwkJCQkJICogdGhhdCBpZiB3ZSBoYXZlIHRvIHJlYmFsYW5jZQorCQkJCQkgKiBrZXJuZWxjb3JlIGFjcm9zcyBub2Rlcywgd2Ugd2lsbAorCQkJCQkgKiBub3QgZG91YmxlIGFjY291bnQgaGVyZQorCQkJCQkgKi8KKwkJCQkJem9uZV9tb3ZhYmxlX3BmbltuaWRdID0gZW5kX3BmbjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXN0YXJ0X3BmbiA9IHVzYWJsZV9zdGFydHBmbjsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSB1c2FibGUgUEZOIHJhbmdlIGZvciBaT05FX01PVkFCTEUgaXMgZnJvbQorCQkJICogc3RhcnRfcGZuLT5lbmRfcGZuLiBDYWxjdWxhdGUgc2l6ZV9wYWdlcyBhcyB0aGUKKwkJCSAqIG51bWJlciBvZiBwYWdlcyB1c2VkIGFzIGtlcm5lbGNvcmUKKwkJCSAqLworCQkJc2l6ZV9wYWdlcyA9IGVuZF9wZm4gLSBzdGFydF9wZm47CisJCQlpZiAoc2l6ZV9wYWdlcyA+IGtlcm5lbGNvcmVfcmVtYWluaW5nKQorCQkJCXNpemVfcGFnZXMgPSBrZXJuZWxjb3JlX3JlbWFpbmluZzsKKwkJCXpvbmVfbW92YWJsZV9wZm5bbmlkXSA9IHN0YXJ0X3BmbiArIHNpemVfcGFnZXM7CisKKwkJCS8qCisJCQkgKiBTb21lIGtlcm5lbGNvcmUgaGFzIGJlZW4gbWV0LCB1cGRhdGUgY291bnRzIGFuZAorCQkJICogYnJlYWsgaWYgdGhlIGtlcm5lbGNvcmUgZm9yIHRoaXMgbm9kZSBoYXMgYmVlbgorCQkJICogc2F0aXNpZmllZAorCQkJICovCisJCQlyZXF1aXJlZF9rZXJuZWxjb3JlIC09IG1pbihyZXF1aXJlZF9rZXJuZWxjb3JlLAorCQkJCQkJCQlzaXplX3BhZ2VzKTsKKwkJCWtlcm5lbGNvcmVfcmVtYWluaW5nIC09IHNpemVfcGFnZXM7CisJCQlpZiAoIWtlcm5lbGNvcmVfcmVtYWluaW5nKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBzdGlsbCByZXF1aXJlZF9rZXJuZWxjb3JlLCB3ZSBkbyBhbm90aGVyIHBhc3Mgd2l0aCBvbmUKKwkgKiBsZXNzIG5vZGUgaW4gdGhlIGNvdW50LiBUaGlzIHdpbGwgcHVzaCB6b25lX21vdmFibGVfcGZuW25pZF0gZnVydGhlcgorCSAqIGFsb25nIG9uIHRoZSBub2RlcyB0aGF0IHN0aWxsIGhhdmUgbWVtb3J5IHVudGlsIGtlcm5lbGNvcmUgaXMKKwkgKiBzYXRpc2lmaWVkCisJICovCisJdXNhYmxlX25vZGVzLS07CisJaWYgKHVzYWJsZV9ub2RlcyAmJiByZXF1aXJlZF9rZXJuZWxjb3JlID4gdXNhYmxlX25vZGVzKQorCQlnb3RvIHJlc3RhcnQ7CisKKwkvKiBBbGlnbiBzdGFydCBvZiBaT05FX01PVkFCTEUgb24gYWxsIG5pZHMgdG8gTUFYX09SREVSX05SX1BBR0VTICovCisJZm9yIChuaWQgPSAwOyBuaWQgPCBNQVhfTlVNTk9ERVM7IG5pZCsrKQorCQl6b25lX21vdmFibGVfcGZuW25pZF0gPQorCQkJcm91bmR1cCh6b25lX21vdmFibGVfcGZuW25pZF0sIE1BWF9PUkRFUl9OUl9QQUdFUyk7Cit9CisKIC8qKgogICogZnJlZV9hcmVhX2luaXRfbm9kZXMgLSBJbml0aWFsaXNlIGFsbCBwZ19kYXRhX3QgYW5kIHpvbmUgZGF0YQogICogQG1heF96b25lX3BmbjogYW4gYXJyYXkgb2YgbWF4IFBGTnMgZm9yIGVhY2ggem9uZQpAQCAtMjkzOCwxOSArMzQwMiwzNyBAQAogCWFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuWzBdID0gZmluZF9taW5fcGZuX3dpdGhfYWN0aXZlX3JlZ2lvbnMoKTsKIAlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bMF0gPSBtYXhfem9uZV9wZm5bMF07CiAJZm9yIChpID0gMTsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCWlmIChpID09IFpPTkVfTU9WQUJMRSkKKwkJCWNvbnRpbnVlOwogCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSA9CiAJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5baS0xXTsKIAkJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW2ldID0KIAkJCW1heChtYXhfem9uZV9wZm5baV0sIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW2ldKTsKIAl9CisJYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bWk9ORV9NT1ZBQkxFXSA9IDA7CisJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW1pPTkVfTU9WQUJMRV0gPSAwOworCisJLyogRmluZCB0aGUgUEZOcyB0aGF0IFpPTkVfTU9WQUJMRSBiZWdpbnMgYXQgaW4gZWFjaCBub2RlICovCisJbWVtc2V0KHpvbmVfbW92YWJsZV9wZm4sIDAsIHNpemVvZih6b25lX21vdmFibGVfcGZuKSk7CisJZmluZF96b25lX21vdmFibGVfcGZuc19mb3Jfbm9kZXMoem9uZV9tb3ZhYmxlX3Bmbik7CiAKIAkvKiBQcmludCBvdXQgdGhlIHpvbmUgcmFuZ2VzICovCiAJcHJpbnRrKCJab25lIFBGTiByYW5nZXM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCWlmIChpID09IFpPTkVfTU9WQUJMRSkKKwkJCWNvbnRpbnVlOwogCQlwcmludGsoIiAgJS04cyAlOGx1IC0+ICU4bHVcbiIsCiAJCQkJem9uZV9uYW1lc1tpXSwKIAkJCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSwKIAkJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5baV0pOworCX0KKworCS8qIFByaW50IG91dCB0aGUgUEZOcyBaT05FX01PVkFCTEUgYmVnaW5zIGF0IGluIGVhY2ggbm9kZSAqLworCXByaW50aygiTW92YWJsZSB6b25lIHN0YXJ0IFBGTiBmb3IgZWFjaCBub2RlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKKwkJaWYgKHpvbmVfbW92YWJsZV9wZm5baV0pCisJCQlwcmludGsoIiAgTm9kZSAlZDogJWx1XG4iLCBpLCB6b25lX21vdmFibGVfcGZuW2ldKTsKKwl9CiAKIAkvKiBQcmludCBvdXQgdGhlIGVhcmx5X25vZGVfbWFwW10gKi8KIAlwcmludGsoImVhcmx5X25vZGVfbWFwWyVkXSBhY3RpdmUgUEZOIHJhbmdlc1xuIiwgbnJfbm9kZW1hcF9lbnRyaWVzKTsKQEAgLTI5NjcsNiArMzQ0OSw0MyBAQAogCQkJCWZpbmRfbWluX3Bmbl9mb3Jfbm9kZShuaWQpLCBOVUxMKTsKIAl9CiB9CisKK3N0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2VfY29yZShjaGFyICpwLCB1bnNpZ25lZCBsb25nICpjb3JlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjb3JlbWVtOworCWlmICghcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb3JlbWVtID0gbWVtcGFyc2UocCwgJnApOworCSpjb3JlID0gY29yZW1lbSA+PiBQQUdFX1NISUZUOworCisJLyogUGFyYW5vaWQgY2hlY2sgdGhhdCBVTCBpcyBlbm91Z2ggZm9yIHRoZSBjb3JlbWVtIHZhbHVlICovCisJV0FSTl9PTigoY29yZW1lbSA+PiBQQUdFX1NISUZUKSA+IFVMT05HX01BWCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGtlcm5lbGNvcmU9c2l6ZSBzZXRzIHRoZSBhbW91bnQgb2YgbWVtb3J5IGZvciB1c2UgZm9yIGFsbG9jYXRpb25zIHRoYXQKKyAqIGNhbm5vdCBiZSByZWNsYWltZWQgb3IgbWlncmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2Vfa2VybmVsY29yZShjaGFyICpwKQoreworCXJldHVybiBjbWRsaW5lX3BhcnNlX2NvcmUocCwgJnJlcXVpcmVkX2tlcm5lbGNvcmUpOworfQorCisvKgorICogbW92YWJsZWNvcmU9c2l6ZSBzZXRzIHRoZSBhbW91bnQgb2YgbWVtb3J5IGZvciB1c2UgZm9yIGFsbG9jYXRpb25zIHRoYXQKKyAqIGNhbiBiZSByZWNsYWltZWQgb3IgbWlncmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2VfbW92YWJsZWNvcmUoY2hhciAqcCkKK3sKKwlyZXR1cm4gY21kbGluZV9wYXJzZV9jb3JlKHAsICZyZXF1aXJlZF9tb3ZhYmxlY29yZSk7Cit9CisKK2Vhcmx5X3BhcmFtKCJrZXJuZWxjb3JlIiwgY21kbGluZV9wYXJzZV9rZXJuZWxjb3JlKTsKK2Vhcmx5X3BhcmFtKCJtb3ZhYmxlY29yZSIsIGNtZGxpbmVfcGFyc2VfbW92YWJsZWNvcmUpOworCiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQICovCiAKIC8qKgpAQCAtMzM1NSwxMyArMzg3NCwyOCBAQAogCQkJZm9yIChvcmRlciA9IDA7ICgoMVVMIDw8IG9yZGVyKSA8PCBQQUdFX1NISUZUKSA8IHNpemU7IG9yZGVyKyspCiAJCQkJOwogCQkJdGFibGUgPSAodm9pZCopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXIpOworCQkJLyoKKwkJCSAqIElmIGJ1Y2tldHNpemUgaXMgbm90IGEgcG93ZXItb2YtdHdvLCB3ZSBtYXkgZnJlZQorCQkJICogc29tZSBwYWdlcyBhdCB0aGUgZW5kIG9mIGhhc2ggdGFibGUuCisJCQkgKi8KKwkJCWlmICh0YWJsZSkgeworCQkJCXVuc2lnbmVkIGxvbmcgYWxsb2NfZW5kID0gKHVuc2lnbmVkIGxvbmcpdGFibGUgKworCQkJCQkJKFBBR0VfU0laRSA8PCBvcmRlcik7CisJCQkJdW5zaWduZWQgbG9uZyB1c2VkID0gKHVuc2lnbmVkIGxvbmcpdGFibGUgKworCQkJCQkJUEFHRV9BTElHTihzaXplKTsKKwkJCQlzcGxpdF9wYWdlKHZpcnRfdG9fcGFnZSh0YWJsZSksIG9yZGVyKTsKKwkJCQl3aGlsZSAodXNlZCA8IGFsbG9jX2VuZCkgeworCQkJCQlmcmVlX3BhZ2UodXNlZCk7CisJCQkJCXVzZWQgKz0gUEFHRV9TSVpFOworCQkJCX0KKwkJCX0KIAkJfQogCX0gd2hpbGUgKCF0YWJsZSAmJiBzaXplID4gUEFHRV9TSVpFICYmIC0tbG9nMnF0eSk7CiAKIAlpZiAoIXRhYmxlKQogCQlwYW5pYygiRmFpbGVkIHRvIGFsbG9jYXRlICVzIGhhc2ggdGFibGVcbiIsIHRhYmxlbmFtZSk7CiAKLQlwcmludGsoIiVzIGhhc2ggdGFibGUgZW50cmllczogJWQgKG9yZGVyOiAlZCwgJWx1IGJ5dGVzKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlcyBoYXNoIHRhYmxlIGVudHJpZXM6ICVkIChvcmRlcjogJWQsICVsdSBieXRlcylcbiIsCiAJICAgICAgIHRhYmxlbmFtZSwKIAkgICAgICAgKDFVIDw8IGxvZzJxdHkpLAogCSAgICAgICBpbG9nMihzaXplKSAtIFBBR0VfU0hJRlQsCmRpZmYgLS1naXQgYS9tbS9wZGZsdXNoLmMgYi9tbS9wZGZsdXNoLmMKaW5kZXggOGNlMDkwMC4uOGY2ZWUwNyAxMDA2NDQKLS0tIGEvbW0vcGRmbHVzaC5jCisrKyBiL21tL3BkZmx1c2guYwpAQCAtOTIsNiArOTIsNyBAQAogc3RhdGljIGludCBfX3BkZmx1c2goc3RydWN0IHBkZmx1c2hfd29yayAqbXlfd29yaykKIHsKIAljdXJyZW50LT5mbGFncyB8PSBQRl9GTFVTSEVSIHwgUEZfU1dBUFdSSVRFOworCXNldF9mcmVlemFibGUoKTsKIAlteV93b3JrLT5mbiA9IE5VTEw7CiAJbXlfd29yay0+d2hvID0gY3VycmVudDsKIAlJTklUX0xJU1RfSEVBRCgmbXlfd29yay0+bGlzdCk7CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCAwNDkzZTRkLi45NmZhNzlmIDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KQEAgLTkzLDggKzk0LDExIEBACiAJICogVGhlIGFib3ZlIGRlZmluaXRpb24gb2YgRU5UUklFU19QRVJfUEFHRSwgYW5kIHRoZSB1c2Ugb2YKIAkgKiBCTE9DS1NfUEVSX1BBR0Ugb24gaW5kaXJlY3QgcGFnZXMsIGFzc3VtZSBQQUdFX0NBQ0hFX1NJWkU6CiAJICogbWlnaHQgYmUgcmVjb25zaWRlcmVkIGlmIGl0IGV2ZXIgZGl2ZXJnZXMgZnJvbSBQQUdFX1NJWkUuCisJICoKKwkgKiBfX0dGUF9NT1ZBQkxFIGlzIG1hc2tlZCBvdXQgYXMgc3dhcCB2ZWN0b3JzIGNhbm5vdCBtb3ZlCiAJICovCi0JcmV0dXJuIGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCBQQUdFX0NBQ0hFX1NISUZULVBBR0VfU0hJRlQpOworCXJldHVybiBhbGxvY19wYWdlcygoZ2ZwX21hc2sgJiB+X19HRlBfTU9WQUJMRSkgfCBfX0dGUF9aRVJPLAorCQkJCVBBR0VfQ0FDSEVfU0hJRlQtUEFHRV9TSElGVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9kaXJfZnJlZShzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTM3Miw3ICszNzYsNyBAQAogCQl9CiAKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQlwYWdlID0gc2htZW1fZGlyX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZykgfCBfX0dGUF9aRVJPKTsKKwkJcGFnZSA9IHNobWVtX2Rpcl9hbGxvYyhtYXBwaW5nX2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcpKTsKIAkJaWYgKHBhZ2UpCiAJCQlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOwogCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGIzNDRlNjcuLjk2ZDMwZWUgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTc3NSw2ICs3NzUsOSBAQAogCSAqLwogCUJVR19PTihtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCA9PSBOVUxMKTsKICNlbmRpZgorCWlmICghc2l6ZSkKKwkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisKIAl3aGlsZSAoc2l6ZSA+IGNzaXplcC0+Y3Nfc2l6ZSkKIAkJY3NpemVwKys7CiAKQEAgLTkyOSw3ICs5MzIsNyBAQAogICogdGhlIENQVXMgZ2V0dGluZyBpbnRvIGxvY2tzdGVwIGFuZCBjb250ZW5kaW5nIGZvciB0aGUgZ2xvYmFsIGNhY2hlIGNoYWluCiAgKiBsb2NrLgogICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgc3RhcnRfY3B1X3RpbWVyKGludCBjcHUpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgc3RhcnRfY3B1X3RpbWVyKGludCBjcHUpCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqcmVhcF93b3JrID0gJnBlcl9jcHUocmVhcF93b3JrLCBjcHUpOwogCkBAIC0yMzUxLDcgKzIzNTQsNyBAQAogCQkgKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGF0IGFsbC4KIAkJICogQnV0IGxlYXZlIGEgQlVHX09OIGZvciBzb21lIGx1Y2t5IGR1ZGUuCiAJCSAqLwotCQlCVUdfT04oIWNhY2hlcC0+c2xhYnBfY2FjaGUpOworCQlCVUdfT04oWkVST19PUl9OVUxMX1BUUihjYWNoZXAtPnNsYWJwX2NhY2hlKSk7CiAJfQogCWNhY2hlcC0+Y3RvciA9IGN0b3I7CiAJY2FjaGVwLT5uYW1lID0gbmFtZTsKQEAgLTI3NDMsNyArMjc0Niw3IEBACiAJICogQmUgbGF6eSBhbmQgb25seSBjaGVjayBmb3IgdmFsaWQgZmxhZ3MgaGVyZSwgIGtlZXBpbmcgaXQgb3V0IG9mIHRoZQogCSAqIGNyaXRpY2FsIHBhdGggaW4ga21lbV9jYWNoZV9hbGxvYygpLgogCSAqLwotCUJVR19PTihmbGFncyAmIH4oR0ZQX0RNQSB8IEdGUF9MRVZFTF9NQVNLKSk7CisJQlVHX09OKGZsYWdzICYgfihHRlBfRE1BIHwgX19HRlBfWkVSTyB8IEdGUF9MRVZFTF9NQVNLKSk7CiAKIAlsb2NhbF9mbGFncyA9IChmbGFncyAmIEdGUF9MRVZFTF9NQVNLKTsKIAkvKiBUYWtlIHRoZSBsMyBsaXN0IGxvY2sgdG8gY2hhbmdlIHRoZSBjb2xvdXJfbmV4dCBvbiB0aGlzIG5vZGUgKi8KQEAgLTMzODksNiArMzM5Miw5IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoc2F2ZV9mbGFncyk7CiAJcHRyID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBwdHIsIGNhbGxlcik7CiAKKwlpZiAodW5saWtlbHkoKGZsYWdzICYgX19HRlBfWkVSTykgJiYgcHRyKSkKKwkJbWVtc2V0KHB0ciwgMCwgb2JqX3NpemUoY2FjaGVwKSk7CisKIAlyZXR1cm4gcHRyOwogfQogCkBAIC0zNDQwLDYgKzM0NDYsOSBAQAogCW9ianAgPSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGNhY2hlcCwgZmxhZ3MsIG9ianAsIGNhbGxlcik7CiAJcHJlZmV0Y2h3KG9ianApOwogCisJaWYgKHVubGlrZWx5KChmbGFncyAmIF9fR0ZQX1pFUk8pICYmIG9ianApKQorCQltZW1zZXQob2JqcCwgMCwgb2JqX3NpemUoY2FjaGVwKSk7CisKIAlyZXR1cm4gb2JqcDsKIH0KIApAQCAtMzU4MSwyMyArMzU5MCw2IEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2MpOwogCiAvKioKLSAqIGttZW1fY2FjaGVfemFsbG9jIC0gQWxsb2NhdGUgYW4gb2JqZWN0LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgotICogQGNhY2hlOiBUaGUgY2FjaGUgdG8gYWxsb2NhdGUgZnJvbS4KLSAqIEBmbGFnczogU2VlIGttYWxsb2MoKS4KLSAqCi0gKiBBbGxvY2F0ZSBhbiBvYmplY3QgZnJvbSB0aGlzIGNhY2hlIGFuZCBzZXQgdGhlIGFsbG9jYXRlZCBtZW1vcnkgdG8gemVyby4KLSAqIFRoZSBmbGFncyBhcmUgb25seSByZWxldmFudCBpZiB0aGUgY2FjaGUgaGFzIG5vIGF2YWlsYWJsZSBvYmplY3RzLgotICovCi12b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldCA9IF9fY2FjaGVfYWxsb2MoY2FjaGUsIGZsYWdzLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCWlmIChyZXQpCi0JCW1lbXNldChyZXQsIDAsIG9ial9zaXplKGNhY2hlKSk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV96YWxsb2MpOwotCi0vKioKICAqIGttZW1fcHRyX3ZhbGlkYXRlIC0gY2hlY2sgaWYgYW4gdW50cnVzdGVkIHBvaW50ZXIgbWlnaHQKICAqCWJlIGEgc2xhYiBlbnRyeS4KICAqIEBjYWNoZXA6IHRoZSBjYWNoZSB3ZSdyZSBjaGVja2luZyBhZ2FpbnN0CkBAIC0zNjUzLDggKzM2NDUsOCBAQAogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CiAKIAljYWNoZXAgPSBrbWVtX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZSwgZmxhZ3MpOwotCWlmICh1bmxpa2VseShjYWNoZXAgPT0gTlVMTCkpCi0JCXJldHVybiBOVUxMOworCWlmICh1bmxpa2VseShaRVJPX09SX05VTExfUFRSKGNhY2hlcCkpKQorCQlyZXR1cm4gY2FjaGVwOwogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZSk7CiB9CiAKQEAgLTM3MjYsNTIgKzM3MTgsNiBAQAogI2VuZGlmCiAKIC8qKgotICoga3JlYWxsb2MgLSByZWFsbG9jYXRlIG1lbW9yeS4gVGhlIGNvbnRlbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KLSAqIEBwOiBvYmplY3QgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgZm9yLgotICogQG5ld19zaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBhcmUgcHJlc2VydmVkIHVwIHRvIHRoZQotICogbGVzc2VyIG9mIHRoZSBuZXcgYW5kIG9sZCBzaXplcy4gIElmIEBwIGlzICVOVUxMLCBrcmVhbGxvYygpCi0gKiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBrbWFsbG9jKCkuICBJZiBAc2l6ZSBpcyAwIGFuZCBAcCBpcyBub3QgYQotICogJU5VTEwgcG9pbnRlciwgdGhlIG9iamVjdCBwb2ludGVkIHRvIGlzIGZyZWVkLgotICovCi12b2lkICprcmVhbGxvYyhjb25zdCB2b2lkICpwLCBzaXplX3QgbmV3X3NpemUsIGdmcF90IGZsYWdzKQotewotCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgKm5ld19jYWNoZTsKLQl2b2lkICpyZXQ7Ci0KLQlpZiAodW5saWtlbHkoIXApKQotCQlyZXR1cm4ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKLQotCWlmICh1bmxpa2VseSghbmV3X3NpemUpKSB7Ci0JCWtmcmVlKHApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQljYWNoZSA9IHZpcnRfdG9fY2FjaGUocCk7Ci0JbmV3X2NhY2hlID0gX19maW5kX2dlbmVyYWxfY2FjaGVwKG5ld19zaXplLCBmbGFncyk7Ci0KLQkvKgotIAkgKiBJZiBuZXcgc2l6ZSBmaXRzIGluIHRoZSBjdXJyZW50IGNhY2hlLCBiYWlsIG91dC4KLSAJICovCi0JaWYgKGxpa2VseShjYWNoZSA9PSBuZXdfY2FjaGUpKQotCQlyZXR1cm4gKHZvaWQgKilwOwotCi0JLyoKLSAJICogV2UgYXJlIG9uIHRoZSBzbG93LXBhdGggaGVyZSBzbyBkbyBub3QgdXNlIF9fY2FjaGVfYWxsb2MKLSAJICogYmVjYXVzZSBpdCBibG9hdHMga2VybmVsIHRleHQuCi0gCSAqLwotCXJldCA9IGttYWxsb2NfdHJhY2tfY2FsbGVyKG5ld19zaXplLCBmbGFncyk7Ci0JaWYgKHJldCkgewotCQltZW1jcHkocmV0LCBwLCBtaW4obmV3X3NpemUsIGtzaXplKHApKSk7Ci0JCWtmcmVlKHApOwotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChrcmVhbGxvYyk7Ci0KLS8qKgogICoga21lbV9jYWNoZV9mcmVlIC0gRGVhbGxvY2F0ZSBhbiBvYmplY3QKICAqIEBjYWNoZXA6IFRoZSBjYWNoZSB0aGUgYWxsb2NhdGlvbiB3YXMgZnJvbS4KICAqIEBvYmpwOiBUaGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgb2JqZWN0LgpAQCAtMzgwNiw3ICszNzUyLDcgQEAKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHVubGlrZWx5KCFvYmpwKSkKKwlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUihvYmpwKSkpCiAJCXJldHVybjsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJa2ZyZWVfZGVidWdjaGVjayhvYmpwKTsKQEAgLTQxNTcsMjYgKzQxMDMsMTcgQEAKIHN0YXRpYyB2b2lkICpzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7CiAJbG9mZl90IG4gPSAqcG9zOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJaWYgKCFuKQogCQlwcmludF9zbGFiaW5mb19oZWFkZXIobSk7Ci0JcCA9IGNhY2hlX2NoYWluLm5leHQ7Ci0Jd2hpbGUgKG4tLSkgewotCQlwID0gcC0+bmV4dDsKLQkJaWYgKHAgPT0gJmNhY2hlX2NoYWluKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCBrbWVtX2NhY2hlLCBuZXh0KTsKKworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmY2FjaGVfY2hhaW4sICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCA9IHA7Ci0JKysqcG9zOwotCXJldHVybiBjYWNoZXAtPm5leHQubmV4dCA9PSAmY2FjaGVfY2hhaW4gPwotCQlOVUxMIDogbGlzdF9lbnRyeShjYWNoZXAtPm5leHQubmV4dCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHAsICZjYWNoZV9jaGFpbiwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKQEAgLTQxODYsNyArNDEyMyw3IEBACiAKIHN0YXRpYyBpbnQgc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKIHsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gcDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CiAJc3RydWN0IHNsYWIgKnNsYWJwOwogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX29ianM7CiAJdW5zaWduZWQgbG9uZyBudW1fb2JqczsKQEAgLTQzNTUsMTcgKzQyOTIsOCBAQAogCiBzdGF0aWMgdm9pZCAqbGVha3Nfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlsb2ZmX3QgbiA9ICpwb3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKLQogCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKLQlwID0gY2FjaGVfY2hhaW4ubmV4dDsKLQl3aGlsZSAobi0tKSB7Ci0JCXAgPSBwLT5uZXh0OwotCQlpZiAocCA9PSAmY2FjaGVfY2hhaW4pCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmY2FjaGVfY2hhaW4sICpwb3MpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhZGRfY2FsbGVyKHVuc2lnbmVkIGxvbmcgKm4sIHVuc2lnbmVkIGxvbmcgdikKQEAgLTQ0MTYsNyArNDM0NCw3IEBACiB7CiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemU7Ci0JY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTiArIDFdLCBuYW1lW0tTWU1fTkFNRV9MRU4gKyAxXTsKKwljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOXSwgbmFtZVtLU1lNX05BTUVfTEVOXTsKIAogCWlmIChsb29rdXBfc3ltYm9sX2F0dHJzKGFkZHJlc3MsICZzaXplLCAmb2Zmc2V0LCBtb2RuYW1lLCBuYW1lKSA9PSAwKSB7CiAJCXNlcV9wcmludGYobSwgIiVzKyUjbHgvJSNseCIsIG5hbWUsIG9mZnNldCwgc2l6ZSk7CkBAIC00NDMwLDcgKzQzNTgsNyBAQAogCiBzdGF0aWMgaW50IGxlYWtzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewotCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBwOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBrbWVtX2NhY2hlLCBuZXh0KTsKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC00NTExLDcgKzQ0MzksNyBAQAogICovCiBzaXplX3Qga3NpemUoY29uc3Qgdm9pZCAqb2JqcCkKIHsKLQlpZiAodW5saWtlbHkob2JqcCA9PSBOVUxMKSkKKwlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUihvYmpwKSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIG9ial9zaXplKHZpcnRfdG9fY2FjaGUob2JqcCkpOwpkaWZmIC0tZ2l0IGEvbW0vc2xvYi5jIGIvbW0vc2xvYi5jCmluZGV4IDcxOTc2YzUuLmM4OWVmMTEgMTAwNjQ0Ci0tLSBhL21tL3Nsb2IuYworKysgYi9tbS9zbG9iLmMKQEAgLTMsNTcgKzMsMTU5IEBACiAgKgogICogTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+IDEyLzMwLzAzCiAgKgorICogTlVNQSBzdXBwb3J0IGJ5IFBhdWwgTXVuZHQsIDIwMDcuCisgKgogICogSG93IFNMT0Igd29ya3M6CiAgKgogICogVGhlIGNvcmUgb2YgU0xPQiBpcyBhIHRyYWRpdGlvbmFsIEsmUiBzdHlsZSBoZWFwIGFsbG9jYXRvciwgd2l0aAogICogc3VwcG9ydCBmb3IgcmV0dXJuaW5nIGFsaWduZWQgb2JqZWN0cy4gVGhlIGdyYW51bGFyaXR5IG9mIHRoaXMKLSAqIGFsbG9jYXRvciBpcyA4IGJ5dGVzIG9uIHg4NiwgdGhvdWdoIGl0J3MgcGVyaGFwcyBwb3NzaWJsZSB0byByZWR1Y2UKLSAqIHRoaXMgdG8gNCBpZiBpdCdzIGRlZW1lZCB3b3J0aCB0aGUgZWZmb3J0LiBUaGUgc2xvYiBoZWFwIGlzIGEKLSAqIHNpbmdseS1saW5rZWQgbGlzdCBvZiBwYWdlcyBmcm9tIF9fZ2V0X2ZyZWVfcGFnZSwgZ3Jvd24gb24gZGVtYW5kCi0gKiBhbmQgYWxsb2NhdGlvbiBmcm9tIHRoZSBoZWFwIGlzIGN1cnJlbnRseSBmaXJzdC1maXQuCisgKiBhbGxvY2F0b3IgaXMgYXMgbGl0dGxlIGFzIDIgYnl0ZXMsIGhvd2V2ZXIgdHlwaWNhbGx5IG1vc3QgYXJjaGl0ZWN0dXJlcworICogd2lsbCByZXF1aXJlIDQgYnl0ZXMgb24gMzItYml0IGFuZCA4IGJ5dGVzIG9uIDY0LWJpdC4KKyAqCisgKiBUaGUgc2xvYiBoZWFwIGlzIGEgbGlua2VkIGxpc3Qgb2YgcGFnZXMgZnJvbSBhbGxvY19wYWdlcygpLCBhbmQKKyAqIHdpdGhpbiBlYWNoIHBhZ2UsIHRoZXJlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IG9mIGZyZWUgYmxvY2tzIChzbG9iX3QpLgorICogVGhlIGhlYXAgaXMgZ3Jvd24gb24gZGVtYW5kIGFuZCBhbGxvY2F0aW9uIGZyb20gdGhlIGhlYXAgaXMgY3VycmVudGx5CisgKiBmaXJzdC1maXQuCiAgKgogICogQWJvdmUgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBrbWFsbG9jL2tmcmVlLiBCbG9ja3MgcmV0dXJuZWQKLSAqIGZyb20ga21hbGxvYyBhcmUgOC1ieXRlIGFsaWduZWQgYW5kIHByZXBlbmRlZCB3aXRoIGEgOC1ieXRlIGhlYWRlci4KKyAqIGZyb20ga21hbGxvYyBhcmUgcHJlcGVuZGVkIHdpdGggYSA0LWJ5dGUgaGVhZGVyIHdpdGggdGhlIGttYWxsb2Mgc2l6ZS4KICAqIElmIGttYWxsb2MgaXMgYXNrZWQgZm9yIG9iamVjdHMgb2YgUEFHRV9TSVpFIG9yIGxhcmdlciwgaXQgY2FsbHMKLSAqIF9fZ2V0X2ZyZWVfcGFnZXMgZGlyZWN0bHkgc28gdGhhdCBpdCBjYW4gcmV0dXJuIHBhZ2UtYWxpZ25lZCBibG9ja3MKLSAqIGFuZCBrZWVwcyBhIGxpbmtlZCBsaXN0IG9mIHN1Y2ggcGFnZXMgYW5kIHRoZWlyIG9yZGVycy4gVGhlc2UKLSAqIG9iamVjdHMgYXJlIGRldGVjdGVkIGluIGtmcmVlKCkgYnkgdGhlaXIgcGFnZSBhbGlnbm1lbnQuCisgKiBhbGxvY19wYWdlcygpIGRpcmVjdGx5LCBhbGxvY2F0aW5nIGNvbXBvdW5kIHBhZ2VzIHNvIHRoZSBwYWdlIG9yZGVyCisgKiBkb2VzIG5vdCBoYXZlIHRvIGJlIHNlcGFyYXRlbHkgdHJhY2tlZCwgYW5kIGFsc28gc3RvcmVzIHRoZSBleGFjdAorICogYWxsb2NhdGlvbiBzaXplIGluIHBhZ2UtPnByaXZhdGUgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBhY2N1cmF0ZWx5CisgKiBwcm92aWRlIGtzaXplKCkuIFRoZXNlIG9iamVjdHMgYXJlIGRldGVjdGVkIGluIGtmcmVlKCkgYmVjYXVzZSBzbG9iX3BhZ2UoKQorICogaXMgZmFsc2UgZm9yIHRoZW0uCiAgKgogICogU0xBQiBpcyBlbXVsYXRlZCBvbiB0b3Agb2YgU0xPQiBieSBzaW1wbHkgY2FsbGluZyBjb25zdHJ1Y3RvcnMgYW5kCi0gKiBkZXN0cnVjdG9ycyBmb3IgZXZlcnkgU0xBQiBhbGxvY2F0aW9uLiBPYmplY3RzIGFyZSByZXR1cm5lZCB3aXRoCi0gKiB0aGUgOC1ieXRlIGFsaWdubWVudCB1bmxlc3MgdGhlIFNMQUJfSFdDQUNIRV9BTElHTiBmbGFnIGlzCi0gKiBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIGxvdy1sZXZlbCBhbGxvY2F0b3Igd2lsbCBmcmFnbWVudCBibG9ja3MgdG8KLSAqIGNyZWF0ZSB0aGUgcHJvcGVyIGFsaWdubWVudC4gQWdhaW4sIG9iamVjdHMgb2YgcGFnZS1zaXplIG9yIGdyZWF0ZXIKLSAqIGFyZSBhbGxvY2F0ZWQgYnkgY2FsbGluZyBfX2dldF9mcmVlX3BhZ2VzLiBBcyBTTEFCIG9iamVjdHMga25vdwotICogdGhlaXIgc2l6ZSwgbm8gc2VwYXJhdGUgc2l6ZSBib29ra2VlcGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzCi0gKiBlc3NlbnRpYWxseSBubyBhbGxvY2F0aW9uIHNwYWNlIG92ZXJoZWFkLgorICogZGVzdHJ1Y3RvcnMgZm9yIGV2ZXJ5IFNMQUIgYWxsb2NhdGlvbi4gT2JqZWN0cyBhcmUgcmV0dXJuZWQgd2l0aCB0aGUKKyAqIDQtYnl0ZSBhbGlnbm1lbnQgdW5sZXNzIHRoZSBTTEFCX0hXQ0FDSEVfQUxJR04gZmxhZyBpcyBzZXQsIGluIHdoaWNoCisgKiBjYXNlIHRoZSBsb3ctbGV2ZWwgYWxsb2NhdG9yIHdpbGwgZnJhZ21lbnQgYmxvY2tzIHRvIGNyZWF0ZSB0aGUgcHJvcGVyCisgKiBhbGlnbm1lbnQuIEFnYWluLCBvYmplY3RzIG9mIHBhZ2Utc2l6ZSBvciBncmVhdGVyIGFyZSBhbGxvY2F0ZWQgYnkKKyAqIGNhbGxpbmcgYWxsb2NfcGFnZXMoKS4gQXMgU0xBQiBvYmplY3RzIGtub3cgdGhlaXIgc2l6ZSwgbm8gc2VwYXJhdGUKKyAqIHNpemUgYm9va2tlZXBpbmcgaXMgbmVjZXNzYXJ5IGFuZCB0aGVyZSBpcyBlc3NlbnRpYWxseSBubyBhbGxvY2F0aW9uCisgKiBzcGFjZSBvdmVyaGVhZCwgYW5kIGNvbXBvdW5kIHBhZ2VzIGFyZW4ndCBuZWVkZWQgZm9yIG11bHRpLXBhZ2UKKyAqIGFsbG9jYXRpb25zLgorICoKKyAqIE5VTUEgc3VwcG9ydCBpbiBTTE9CIGlzIGZhaXJseSBzaW1wbGlzdGljLCBwdXNoaW5nIG1vc3Qgb2YgdGhlIHJlYWwKKyAqIGxvZ2ljIGRvd24gdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLCBhbmQgc2ltcGx5IGRvaW5nIHRoZSBub2RlIGFjY291bnRpbmcKKyAqIG9uIHRoZSB1cHBlciBsZXZlbHMuIEluIHRoZSBldmVudCB0aGF0IGEgbm9kZSBpZCBpcyBleHBsaWNpdGx5CisgKiBwcm92aWRlZCwgYWxsb2NfcGFnZXNfbm9kZSgpIHdpdGggdGhlIHNwZWNpZmllZCBub2RlIGlkIGlzIHVzZWQKKyAqIGluc3RlYWQuIFRoZSBjb21tb24gY2FzZSAob3Igd2hlbiB0aGUgbm9kZSBpZCBpc24ndCBleHBsaWNpdGx5IHByb3ZpZGVkKQorICogd2lsbCBkZWZhdWx0IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIHBlciBudW1hX25vZGVfaWQoKS4KKyAqCisgKiBOb2RlIGF3YXJlIHBhZ2VzIGFyZSBzdGlsbCBpbnNlcnRlZCBpbiB0byB0aGUgZ2xvYmFsIGZyZWVsaXN0LCBhbmQKKyAqIHRoZXNlIGFyZSBzY2FubmVkIGZvciBieSBtYXRjaGluZyBhZ2FpbnN0IHRoZSBub2RlIGlkIGVuY29kZWQgaW4gdGhlCisgKiBwYWdlIGZsYWdzLiBBcyBhIHJlc3VsdCwgYmxvY2sgYWxsb2NhdGlvbnMgdGhhdCBjYW4gYmUgc2F0aXNmaWVkIGZyb20KKyAqIHRoZSBmcmVlbGlzdCB3aWxsIG9ubHkgYmUgZG9uZSBzbyBvbiBwYWdlcyByZXNpZGluZyBvbiB0aGUgc2FtZSBub2RlLAorICogaW4gb3JkZXIgdG8gcHJldmVudCByYW5kb20gbm9kZSBwbGFjZW1lbnQuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisvKgorICogc2xvYl9ibG9jayBoYXMgYSBmaWVsZCAndW5pdHMnLCB3aGljaCBpbmRpY2F0ZXMgc2l6ZSBvZiBibG9jayBpZiArdmUsCisgKiBvciBvZmZzZXQgb2YgbmV4dCBibG9jayBpZiAtdmUgKGluIFNMT0JfVU5JVHMpLgorICoKKyAqIEZyZWUgYmxvY2tzIG9mIHNpemUgMSB1bml0IHNpbXBseSBjb250YWluIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgYmxvY2suCisgKiBUaG9zZSB3aXRoIGxhcmdlciBzaXplIGNvbnRhaW4gdGhlaXIgc2l6ZSBpbiB0aGUgZmlyc3QgU0xPQl9VTklUIG9mCisgKiBtZW1vcnksIGFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGZyZWUgYmxvY2sgaW4gdGhlIHNlY29uZCBTTE9CX1VOSVQuCisgKi8KKyNpZiBQQUdFX1NJWkUgPD0gKDMyNzY3ICogMikKK3R5cGVkZWYgczE2IHNsb2JpZHhfdDsKKyNlbHNlCit0eXBlZGVmIHMzMiBzbG9iaWR4X3Q7CisjZW5kaWYKIAogc3RydWN0IHNsb2JfYmxvY2sgewotCWludCB1bml0czsKLQlzdHJ1Y3Qgc2xvYl9ibG9jayAqbmV4dDsKKwlzbG9iaWR4X3QgdW5pdHM7CiB9OwogdHlwZWRlZiBzdHJ1Y3Qgc2xvYl9ibG9jayBzbG9iX3Q7CiAKKy8qCisgKiBXZSB1c2Ugc3RydWN0IHBhZ2UgZmllbGRzIHRvIG1hbmFnZSBzb21lIHNsb2IgYWxsb2NhdGlvbiBhc3BlY3RzLAorICogaG93ZXZlciB0byBhdm9pZCB0aGUgaG9ycmlibGUgbWVzcyBpbiBpbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgsIHdlJ2xsCisgKiBqdXN0IGRlZmluZSBvdXIgb3duIHN0cnVjdCBwYWdlIHR5cGUgdmFyaWFudCBoZXJlLgorICovCitzdHJ1Y3Qgc2xvYl9wYWdlIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBtYW5kYXRvcnkgKi8KKwkJCWF0b21pY190IF9jb3VudDsJLyogbWFuZGF0b3J5ICovCisJCQlzbG9iaWR4X3QgdW5pdHM7CS8qIGZyZWUgdW5pdHMgbGVmdCBpbiBwYWdlICovCisJCQl1bnNpZ25lZCBsb25nIHBhZFsyXTsKKwkJCXNsb2JfdCAqZnJlZTsJCS8qIGZpcnN0IGZyZWUgc2xvYl90IGluIHBhZ2UgKi8KKwkJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbGlua2VkIGxpc3Qgb2YgZnJlZSBwYWdlcyAqLworCQl9OworCQlzdHJ1Y3QgcGFnZSBwYWdlOworCX07Cit9Oworc3RhdGljIGlubGluZSB2b2lkIHN0cnVjdF9zbG9iX3BhZ2Vfd3Jvbmdfc2l6ZSh2b2lkKQoreyBCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBzbG9iX3BhZ2UpICE9IHNpemVvZihzdHJ1Y3QgcGFnZSkpOyB9CisKKy8qCisgKiBmcmVlX3Nsb2JfcGFnZTogY2FsbCBiZWZvcmUgYSBzbG9iX3BhZ2UgaXMgcmV0dXJuZWQgdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zbG9iX3BhZ2Uoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJcmVzZXRfcGFnZV9tYXBjb3VudCgmc3AtPnBhZ2UpOworCXNwLT5wYWdlLm1hcHBpbmcgPSBOVUxMOworfQorCisvKgorICogQWxsIChwYXJ0aWFsbHkpIGZyZWUgc2xvYiBwYWdlcyBnbyBvbiB0aGlzIGxpc3QuCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoZnJlZV9zbG9iX3BhZ2VzKTsKKworLyoKKyAqIHNsb2JfcGFnZTogVHJ1ZSBmb3IgYWxsIHNsb2IgcGFnZXMgKGZhbHNlIGZvciBiaWdibG9jayBwYWdlcykKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2xvYl9wYWdlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCXJldHVybiB0ZXN0X2JpdChQR19hY3RpdmUsICZzcC0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Nsb2JfcGFnZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlfX3NldF9iaXQoUEdfYWN0aXZlLCAmc3AtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3Nsb2JfcGFnZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlfX2NsZWFyX2JpdChQR19hY3RpdmUsICZzcC0+ZmxhZ3MpOworfQorCisvKgorICogc2xvYl9wYWdlX2ZyZWU6IHRydWUgZm9yIHBhZ2VzIG9uIGZyZWVfc2xvYl9wYWdlcyBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIGludCBzbG9iX3BhZ2VfZnJlZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoUEdfcHJpdmF0ZSwgJnNwLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2xvYl9wYWdlX2ZyZWUoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJbGlzdF9hZGQoJnNwLT5saXN0LCAmZnJlZV9zbG9iX3BhZ2VzKTsKKwlfX3NldF9iaXQoUEdfcHJpdmF0ZSwgJnNwLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zbG9iX3BhZ2VfZnJlZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlsaXN0X2RlbCgmc3AtPmxpc3QpOworCV9fY2xlYXJfYml0KFBHX3ByaXZhdGUsICZzcC0+ZmxhZ3MpOworfQorCiAjZGVmaW5lIFNMT0JfVU5JVCBzaXplb2Yoc2xvYl90KQogI2RlZmluZSBTTE9CX1VOSVRTKHNpemUpICgoKHNpemUpICsgU0xPQl9VTklUIC0gMSkvU0xPQl9VTklUKQogI2RlZmluZSBTTE9CX0FMSUdOIEwxX0NBQ0hFX0JZVEVTCiAKLXN0cnVjdCBiaWdibG9jayB7Ci0JaW50IG9yZGVyOwotCXZvaWQgKnBhZ2VzOwotCXN0cnVjdCBiaWdibG9jayAqbmV4dDsKLX07Ci10eXBlZGVmIHN0cnVjdCBiaWdibG9jayBiaWdibG9ja190OwotCiAvKgogICogc3RydWN0IHNsb2JfcmN1IGlzIGluc2VydGVkIGF0IHRoZSB0YWlsIG9mIGFsbG9jYXRlZCBzbG9iIGJsb2Nrcywgd2hpY2gKICAqIHdlcmUgY3JlYXRlZCB3aXRoIGEgU0xBQl9ERVNUUk9ZX0JZX1JDVSBzbGFiLiBzbG9iX3JjdSBpcyB1c2VkIHRvIGZyZWUKQEAgLTY0LDIxNSArMTY2LDMyMSBAQAogCWludCBzaXplOwogfTsKIAotc3RhdGljIHNsb2JfdCBhcmVuYSA9IHsgLm5leHQgPSAmYXJlbmEsIC51bml0cyA9IDEgfTsKLXN0YXRpYyBzbG9iX3QgKnNsb2JmcmVlID0gJmFyZW5hOwotc3RhdGljIGJpZ2Jsb2NrX3QgKmJpZ2Jsb2NrczsKKy8qCisgKiBzbG9iX2xvY2sgcHJvdGVjdHMgYWxsIHNsb2IgYWxsb2NhdG9yIHN0cnVjdHVyZXMuCisgKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2xvYl9sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYmxvY2tfbG9jayk7CiAKLXN0YXRpYyB2b2lkIHNsb2JfZnJlZSh2b2lkICpiLCBpbnQgc2l6ZSk7Ci1zdGF0aWMgdm9pZCBzbG9iX3RpbWVyX2Niayh2b2lkKTsKKy8qCisgKiBFbmNvZGUgdGhlIGdpdmVuIHNpemUgYW5kIG5leHQgaW5mbyBpbnRvIGEgZnJlZSBzbG9iIGJsb2NrIHMuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9zbG9iKHNsb2JfdCAqcywgc2xvYmlkeF90IHNpemUsIHNsb2JfdCAqbmV4dCkKK3sKKwlzbG9iX3QgKmJhc2UgPSAoc2xvYl90ICopKCh1bnNpZ25lZCBsb25nKXMgJiBQQUdFX01BU0spOworCXNsb2JpZHhfdCBvZmZzZXQgPSBuZXh0IC0gYmFzZTsKIAorCWlmIChzaXplID4gMSkgeworCQlzWzBdLnVuaXRzID0gc2l6ZTsKKwkJc1sxXS51bml0cyA9IG9mZnNldDsKKwl9IGVsc2UKKwkJc1swXS51bml0cyA9IC1vZmZzZXQ7Cit9CiAKLXN0YXRpYyB2b2lkICpzbG9iX2FsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBnZnAsIGludCBhbGlnbikKKy8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBzbG9iIGJsb2NrLgorICovCitzdGF0aWMgc2xvYmlkeF90IHNsb2JfdW5pdHMoc2xvYl90ICpzKQoreworCWlmIChzLT51bml0cyA+IDApCisJCXJldHVybiBzLT51bml0czsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbmV4dCBmcmVlIHNsb2IgYmxvY2sgcG9pbnRlciBhZnRlciB0aGlzIG9uZS4KKyAqLworc3RhdGljIHNsb2JfdCAqc2xvYl9uZXh0KHNsb2JfdCAqcykKK3sKKwlzbG9iX3QgKmJhc2UgPSAoc2xvYl90ICopKCh1bnNpZ25lZCBsb25nKXMgJiBQQUdFX01BU0spOworCXNsb2JpZHhfdCBuZXh0OworCisJaWYgKHNbMF0udW5pdHMgPCAwKQorCQluZXh0ID0gLXNbMF0udW5pdHM7CisJZWxzZQorCQluZXh0ID0gc1sxXS51bml0czsKKwlyZXR1cm4gYmFzZStuZXh0OworfQorCisvKgorICogUmV0dXJucyB0cnVlIGlmIHMgaXMgdGhlIGxhc3QgZnJlZSBibG9jayBpbiBpdHMgcGFnZS4KKyAqLworc3RhdGljIGludCBzbG9iX2xhc3Qoc2xvYl90ICpzKQoreworCXJldHVybiAhKCh1bnNpZ25lZCBsb25nKXNsb2JfbmV4dChzKSAmIH5QQUdFX01BU0spOworfQorCitzdGF0aWMgdm9pZCAqc2xvYl9uZXdfcGFnZShnZnBfdCBnZnAsIGludCBvcmRlciwgaW50IG5vZGUpCit7CisJdm9pZCAqcGFnZTsKKworI2lmZGVmIENPTkZJR19OVU1BCisJaWYgKG5vZGUgIT0gLTEpCisJCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5vZGUsIGdmcCwgb3JkZXIpOworCWVsc2UKKyNlbmRpZgorCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwLCBvcmRlcik7CisKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgc2xvYiBibG9jayB3aXRoaW4gYSBnaXZlbiBzbG9iX3BhZ2Ugc3AuCisgKi8KK3N0YXRpYyB2b2lkICpzbG9iX3BhZ2VfYWxsb2Moc3RydWN0IHNsb2JfcGFnZSAqc3AsIHNpemVfdCBzaXplLCBpbnQgYWxpZ24pCiB7CiAJc2xvYl90ICpwcmV2LCAqY3VyLCAqYWxpZ25lZCA9IDA7CiAJaW50IGRlbHRhID0gMCwgdW5pdHMgPSBTTE9CX1VOSVRTKHNpemUpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvYl9sb2NrLCBmbGFncyk7Ci0JcHJldiA9IHNsb2JmcmVlOwotCWZvciAoY3VyID0gcHJldi0+bmV4dDsgOyBwcmV2ID0gY3VyLCBjdXIgPSBjdXItPm5leHQpIHsKKwlmb3IgKHByZXYgPSBOVUxMLCBjdXIgPSBzcC0+ZnJlZTsgOyBwcmV2ID0gY3VyLCBjdXIgPSBzbG9iX25leHQoY3VyKSkgeworCQlzbG9iaWR4X3QgYXZhaWwgPSBzbG9iX3VuaXRzKGN1cik7CisKIAkJaWYgKGFsaWduKSB7CiAJCQlhbGlnbmVkID0gKHNsb2JfdCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKWN1ciwgYWxpZ24pOwogCQkJZGVsdGEgPSBhbGlnbmVkIC0gY3VyOwogCQl9Ci0JCWlmIChjdXItPnVuaXRzID49IHVuaXRzICsgZGVsdGEpIHsgLyogcm9vbSBlbm91Z2g/ICovCisJCWlmIChhdmFpbCA+PSB1bml0cyArIGRlbHRhKSB7IC8qIHJvb20gZW5vdWdoPyAqLworCQkJc2xvYl90ICpuZXh0OworCiAJCQlpZiAoZGVsdGEpIHsgLyogbmVlZCB0byBmcmFnbWVudCBoZWFkIHRvIGFsaWduPyAqLwotCQkJCWFsaWduZWQtPnVuaXRzID0gY3VyLT51bml0cyAtIGRlbHRhOwotCQkJCWFsaWduZWQtPm5leHQgPSBjdXItPm5leHQ7Ci0JCQkJY3VyLT5uZXh0ID0gYWxpZ25lZDsKLQkJCQljdXItPnVuaXRzID0gZGVsdGE7CisJCQkJbmV4dCA9IHNsb2JfbmV4dChjdXIpOworCQkJCXNldF9zbG9iKGFsaWduZWQsIGF2YWlsIC0gZGVsdGEsIG5leHQpOworCQkJCXNldF9zbG9iKGN1ciwgZGVsdGEsIGFsaWduZWQpOwogCQkJCXByZXYgPSBjdXI7CiAJCQkJY3VyID0gYWxpZ25lZDsKKwkJCQlhdmFpbCA9IHNsb2JfdW5pdHMoY3VyKTsKIAkJCX0KIAotCQkJaWYgKGN1ci0+dW5pdHMgPT0gdW5pdHMpIC8qIGV4YWN0IGZpdD8gKi8KLQkJCQlwcmV2LT5uZXh0ID0gY3VyLT5uZXh0OyAvKiB1bmxpbmsgKi8KLQkJCWVsc2UgeyAvKiBmcmFnbWVudCAqLwotCQkJCXByZXYtPm5leHQgPSBjdXIgKyB1bml0czsKLQkJCQlwcmV2LT5uZXh0LT51bml0cyA9IGN1ci0+dW5pdHMgLSB1bml0czsKLQkJCQlwcmV2LT5uZXh0LT5uZXh0ID0gY3VyLT5uZXh0OwotCQkJCWN1ci0+dW5pdHMgPSB1bml0czsKKwkJCW5leHQgPSBzbG9iX25leHQoY3VyKTsKKwkJCWlmIChhdmFpbCA9PSB1bml0cykgeyAvKiBleGFjdCBmaXQ/IHVubGluay4gKi8KKwkJCQlpZiAocHJldikKKwkJCQkJc2V0X3Nsb2IocHJldiwgc2xvYl91bml0cyhwcmV2KSwgbmV4dCk7CisJCQkJZWxzZQorCQkJCQlzcC0+ZnJlZSA9IG5leHQ7CisJCQl9IGVsc2UgeyAvKiBmcmFnbWVudCAqLworCQkJCWlmIChwcmV2KQorCQkJCQlzZXRfc2xvYihwcmV2LCBzbG9iX3VuaXRzKHByZXYpLCBjdXIgKyB1bml0cyk7CisJCQkJZWxzZQorCQkJCQlzcC0+ZnJlZSA9IGN1ciArIHVuaXRzOworCQkJCXNldF9zbG9iKGN1ciArIHVuaXRzLCBhdmFpbCAtIHVuaXRzLCBuZXh0KTsKIAkJCX0KIAotCQkJc2xvYmZyZWUgPSBwcmV2OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CisJCQlzcC0+dW5pdHMgLT0gdW5pdHM7CisJCQlpZiAoIXNwLT51bml0cykKKwkJCQljbGVhcl9zbG9iX3BhZ2VfZnJlZShzcCk7CiAJCQlyZXR1cm4gY3VyOwogCQl9Ci0JCWlmIChjdXIgPT0gc2xvYmZyZWUpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpIC8qIHRyeWluZyB0byBzaHJpbmsgYXJlbmE/ICovCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCWN1ciA9IChzbG9iX3QgKilfX2dldF9mcmVlX3BhZ2UoZ2ZwKTsKLQkJCWlmICghY3VyKQotCQkJCXJldHVybiAwOwotCi0JCQlzbG9iX2ZyZWUoY3VyLCBQQUdFX1NJWkUpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOwotCQkJY3VyID0gc2xvYmZyZWU7Ci0JCX0KKwkJaWYgKHNsb2JfbGFzdChjdXIpKQorCQkJcmV0dXJuIE5VTEw7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBzbG9iX2ZyZWUodm9pZCAqYmxvY2ssIGludCBzaXplKQorLyoKKyAqIHNsb2JfYWxsb2M6IGVudHJ5IHBvaW50IGludG8gdGhlIHNsb2IgYWxsb2NhdG9yLgorICovCitzdGF0aWMgdm9pZCAqc2xvYl9hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwLCBpbnQgYWxpZ24sIGludCBub2RlKQogewotCXNsb2JfdCAqY3VyLCAqYiA9IChzbG9iX3QgKilibG9jazsKKwlzdHJ1Y3Qgc2xvYl9wYWdlICpzcDsKKwlzbG9iX3QgKmIgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWJsb2NrKQotCQlyZXR1cm47Ci0KLQlpZiAoc2l6ZSkKLQkJYi0+dW5pdHMgPSBTTE9CX1VOSVRTKHNpemUpOwotCi0JLyogRmluZCByZWluc2VydGlvbiBwb2ludCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGN1ciA9IHNsb2JmcmVlOyAhKGIgPiBjdXIgJiYgYiA8IGN1ci0+bmV4dCk7IGN1ciA9IGN1ci0+bmV4dCkKLQkJaWYgKGN1ciA+PSBjdXItPm5leHQgJiYgKGIgPiBjdXIgfHwgYiA8IGN1ci0+bmV4dCkpCi0JCQlicmVhazsKKwkvKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBwYXJ0aWFsbHkgZnJlZSBwYWdlLCB0cnkgdG8gZmluZCByb29tICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcCwgJmZyZWVfc2xvYl9wYWdlcywgbGlzdCkgeworI2lmZGVmIENPTkZJR19OVU1BCisJCS8qCisJCSAqIElmIHRoZXJlJ3MgYSBub2RlIHNwZWNpZmljYXRpb24sIHNlYXJjaCBmb3IgYSBwYXJ0aWFsCisJCSAqIHBhZ2Ugd2l0aCBhIG1hdGNoaW5nIG5vZGUgaWQgaW4gdGhlIGZyZWVsaXN0LgorCQkgKi8KKwkJaWYgKG5vZGUgIT0gLTEgJiYgcGFnZV90b19uaWQoJnNwLT5wYWdlKSAhPSBub2RlKQorCQkJY29udGludWU7CisjZW5kaWYKIAotCWlmIChiICsgYi0+dW5pdHMgPT0gY3VyLT5uZXh0KSB7Ci0JCWItPnVuaXRzICs9IGN1ci0+bmV4dC0+dW5pdHM7Ci0JCWItPm5leHQgPSBjdXItPm5leHQtPm5leHQ7Ci0JfSBlbHNlCi0JCWItPm5leHQgPSBjdXItPm5leHQ7CisJCWlmIChzcC0+dW5pdHMgPj0gU0xPQl9VTklUUyhzaXplKSkgeworCQkJYiA9IHNsb2JfcGFnZV9hbGxvYyhzcCwgc2l6ZSwgYWxpZ24pOworCQkJaWYgKGIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CiAKLQlpZiAoY3VyICsgY3VyLT51bml0cyA9PSBiKSB7Ci0JCWN1ci0+dW5pdHMgKz0gYi0+dW5pdHM7Ci0JCWN1ci0+bmV4dCA9IGItPm5leHQ7Ci0JfSBlbHNlCi0JCWN1ci0+bmV4dCA9IGI7CisJLyogTm90IGVub3VnaCBzcGFjZTogbXVzdCBhbGxvY2F0ZSBhIG5ldyBwYWdlICovCisJaWYgKCFiKSB7CisJCWIgPSBzbG9iX25ld19wYWdlKGdmcCwgMCwgbm9kZSk7CisJCWlmICghYikKKwkJCXJldHVybiAwOworCQlzcCA9IChzdHJ1Y3Qgc2xvYl9wYWdlICopdmlydF90b19wYWdlKGIpOworCQlzZXRfc2xvYl9wYWdlKHNwKTsKIAotCXNsb2JmcmVlID0gY3VyOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvYl9sb2NrLCBmbGFncyk7CisJCXNwLT51bml0cyA9IFNMT0JfVU5JVFMoUEFHRV9TSVpFKTsKKwkJc3AtPmZyZWUgPSBiOworCQlJTklUX0xJU1RfSEVBRCgmc3AtPmxpc3QpOworCQlzZXRfc2xvYihiLCBTTE9CX1VOSVRTKFBBR0VfU0laRSksIGIgKyBTTE9CX1VOSVRTKFBBR0VfU0laRSkpOworCQlzZXRfc2xvYl9wYWdlX2ZyZWUoc3ApOworCQliID0gc2xvYl9wYWdlX2FsbG9jKHNwLCBzaXplLCBhbGlnbik7CisJCUJVR19PTighYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCX0KKwlpZiAodW5saWtlbHkoKGdmcCAmIF9fR0ZQX1pFUk8pICYmIGIpKQorCQltZW1zZXQoYiwgMCwgc2l6ZSk7CisJcmV0dXJuIGI7Cit9CiAKKy8qCisgKiBzbG9iX2ZyZWU6IGVudHJ5IHBvaW50IGludG8gdGhlIHNsb2IgYWxsb2NhdG9yLgorICovCitzdGF0aWMgdm9pZCBzbG9iX2ZyZWUodm9pZCAqYmxvY2ssIGludCBzaXplKQoreworCXN0cnVjdCBzbG9iX3BhZ2UgKnNwOworCXNsb2JfdCAqcHJldiwgKm5leHQsICpiID0gKHNsb2JfdCAqKWJsb2NrOworCXNsb2JpZHhfdCB1bml0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKFpFUk9fT1JfTlVMTF9QVFIoYmxvY2spKQorCQlyZXR1cm47CisJQlVHX09OKCFzaXplKTsKKworCXNwID0gKHN0cnVjdCBzbG9iX3BhZ2UgKil2aXJ0X3RvX3BhZ2UoYmxvY2spOworCXVuaXRzID0gU0xPQl9VTklUUyhzaXplKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKKworCWlmIChzcC0+dW5pdHMgKyB1bml0cyA9PSBTTE9CX1VOSVRTKFBBR0VfU0laRSkpIHsKKwkJLyogR28gZGlyZWN0bHkgdG8gcGFnZSBhbGxvY2F0b3IuIERvIG5vdCBwYXNzIHNsb2IgYWxsb2NhdG9yICovCisJCWlmIChzbG9iX3BhZ2VfZnJlZShzcCkpCisJCQljbGVhcl9zbG9iX3BhZ2VfZnJlZShzcCk7CisJCWNsZWFyX3Nsb2JfcGFnZShzcCk7CisJCWZyZWVfc2xvYl9wYWdlKHNwKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXNsb2JfcGFnZV9mcmVlKHNwKSkgeworCQkvKiBUaGlzIHNsb2IgcGFnZSBpcyBhYm91dCB0byBiZWNvbWUgcGFydGlhbGx5IGZyZWUuIEVhc3khICovCisJCXNwLT51bml0cyA9IHVuaXRzOworCQlzcC0+ZnJlZSA9IGI7CisJCXNldF9zbG9iKGIsIHVuaXRzLAorCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGIgKworCQkJCQlTTE9CX1VOSVRTKFBBR0VfU0laRSkpICYgUEFHRV9NQVNLKSk7CisJCXNldF9zbG9iX3BhZ2VfZnJlZShzcCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogT3RoZXJ3aXNlIHRoZSBwYWdlIGlzIGFscmVhZHkgcGFydGlhbGx5IGZyZWUsIHNvIGZpbmQgcmVpbnNlcnRpb24KKwkgKiBwb2ludC4KKwkgKi8KKwlzcC0+dW5pdHMgKz0gdW5pdHM7CisKKwlpZiAoYiA8IHNwLT5mcmVlKSB7CisJCXNldF9zbG9iKGIsIHVuaXRzLCBzcC0+ZnJlZSk7CisJCXNwLT5mcmVlID0gYjsKKwl9IGVsc2UgeworCQlwcmV2ID0gc3AtPmZyZWU7CisJCW5leHQgPSBzbG9iX25leHQocHJldik7CisJCXdoaWxlIChiID4gbmV4dCkgeworCQkJcHJldiA9IG5leHQ7CisJCQluZXh0ID0gc2xvYl9uZXh0KHByZXYpOworCQl9CisKKwkJaWYgKCFzbG9iX2xhc3QocHJldikgJiYgYiArIHVuaXRzID09IG5leHQpIHsKKwkJCXVuaXRzICs9IHNsb2JfdW5pdHMobmV4dCk7CisJCQlzZXRfc2xvYihiLCB1bml0cywgc2xvYl9uZXh0KG5leHQpKTsKKwkJfSBlbHNlCisJCQlzZXRfc2xvYihiLCB1bml0cywgbmV4dCk7CisKKwkJaWYgKHByZXYgKyBzbG9iX3VuaXRzKHByZXYpID09IGIpIHsKKwkJCXVuaXRzID0gc2xvYl91bml0cyhiKSArIHNsb2JfdW5pdHMocHJldik7CisJCQlzZXRfc2xvYihwcmV2LCB1bml0cywgc2xvYl9uZXh0KGIpKTsKKwkJfSBlbHNlCisJCQlzZXRfc2xvYihwcmV2LCBzbG9iX3VuaXRzKHByZXYpLCBiKTsKKwl9CitvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwKQotewotCXNsb2JfdCAqbTsKLQliaWdibG9ja190ICpiYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNpemUgPCBQQUdFX1NJWkUgLSBTTE9CX1VOSVQpIHsKLQkJbSA9IHNsb2JfYWxsb2Moc2l6ZSArIFNMT0JfVU5JVCwgZ2ZwLCAwKTsKLQkJcmV0dXJuIG0gPyAodm9pZCAqKShtICsgMSkgOiAwOwotCX0KLQotCWJiID0gc2xvYl9hbGxvYyhzaXplb2YoYmlnYmxvY2tfdCksIGdmcCwgMCk7Ci0JaWYgKCFiYikKLQkJcmV0dXJuIDA7Ci0KLQliYi0+b3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0JYmItPnBhZ2VzID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgYmItPm9yZGVyKTsKLQotCWlmIChiYi0+cGFnZXMpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJYmItPm5leHQgPSBiaWdibG9ja3M7Ci0JCWJpZ2Jsb2NrcyA9IGJiOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBiYi0+cGFnZXM7Ci0JfQotCi0Jc2xvYl9mcmVlKGJiLCBzaXplb2YoYmlnYmxvY2tfdCkpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChfX2ttYWxsb2MpOwotCi0vKioKLSAqIGtyZWFsbG9jIC0gcmVhbGxvY2F0ZSBtZW1vcnkuIFRoZSBjb250ZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuCi0gKgotICogQHA6IG9iamVjdCB0byByZWFsbG9jYXRlIG1lbW9yeSBmb3IuCi0gKiBAbmV3X3NpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqCi0gKiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBwb2ludGVkIHRvIGFyZSBwcmVzZXJ2ZWQgdXAgdG8gdGhlCi0gKiBsZXNzZXIgb2YgdGhlIG5ldyBhbmQgb2xkIHNpemVzLiAgSWYgQHAgaXMgJU5VTEwsIGtyZWFsbG9jKCkKLSAqIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGttYWxsb2MoKS4gIElmIEBzaXplIGlzIDAgYW5kIEBwIGlzIG5vdCBhCi0gKiAlTlVMTCBwb2ludGVyLCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gaXMgZnJlZWQuCisvKgorICogRW5kIG9mIHNsb2IgYWxsb2NhdG9yIHByb3Blci4gQmVnaW4ga21lbV9jYWNoZV9hbGxvYyBhbmQga21hbGxvYyBmcm9udGVuZC4KICAqLwotdm9pZCAqa3JlYWxsb2MoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG5ld19zaXplLCBnZnBfdCBmbGFncykKKworI2lmbmRlZiBBUkNIX0tNQUxMT0NfTUlOQUxJR04KKyNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcpCisjZW5kaWYKKworI2lmbmRlZiBBUkNIX1NMQUJfTUlOQUxJR04KKyNkZWZpbmUgQVJDSF9TTEFCX01JTkFMSUdOIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcpCisjZW5kaWYKKwordm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGdmcCwgaW50IG5vZGUpCiB7Ci0Jdm9pZCAqcmV0OworCXVuc2lnbmVkIGludCAqbTsKKwlpbnQgYWxpZ24gPSBtYXgoQVJDSF9LTUFMTE9DX01JTkFMSUdOLCBBUkNIX1NMQUJfTUlOQUxJR04pOwogCi0JaWYgKHVubGlrZWx5KCFwKSkKLQkJcmV0dXJuIGttYWxsb2NfdHJhY2tfY2FsbGVyKG5ld19zaXplLCBmbGFncyk7CisJaWYgKHNpemUgPCBQQUdFX1NJWkUgLSBhbGlnbikgeworCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKIAotCWlmICh1bmxpa2VseSghbmV3X3NpemUpKSB7Ci0JCWtmcmVlKHApOwotCQlyZXR1cm4gTlVMTDsKKwkJbSA9IHNsb2JfYWxsb2Moc2l6ZSArIGFsaWduLCBnZnAsIGFsaWduLCBub2RlKTsKKwkJaWYgKG0pCisJCQkqbSA9IHNpemU7CisJCXJldHVybiAodm9pZCAqKW0gKyBhbGlnbjsKKwl9IGVsc2UgeworCQl2b2lkICpyZXQ7CisKKwkJcmV0ID0gc2xvYl9uZXdfcGFnZShnZnAgfCBfX0dGUF9DT01QLCBnZXRfb3JkZXIoc2l6ZSksIG5vZGUpOworCQlpZiAocmV0KSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocmV0KTsKKwkJCXBhZ2UtPnByaXZhdGUgPSBzaXplOworCQl9CisJCXJldHVybiByZXQ7CiAJfQotCi0JcmV0ID0ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKLQlpZiAocmV0KSB7Ci0JCW1lbWNweShyZXQsIHAsIG1pbihuZXdfc2l6ZSwga3NpemUocCkpKTsKLQkJa2ZyZWUocCk7Ci0JfQotCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGtyZWFsbG9jKTsKK0VYUE9SVF9TWU1CT0woX19rbWFsbG9jX25vZGUpOwogCiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKmJsb2NrKQogewotCWJpZ2Jsb2NrX3QgKmJiLCAqKmxhc3QgPSAmYmlnYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNsb2JfcGFnZSAqc3A7CiAKLQlpZiAoIWJsb2NrKQorCWlmIChaRVJPX09SX05VTExfUFRSKGJsb2NrKSkKIAkJcmV0dXJuOwogCi0JaWYgKCEoKHVuc2lnbmVkIGxvbmcpYmxvY2sgJiAoUEFHRV9TSVpFLTEpKSkgewotCQkvKiBtaWdodCBiZSBvbiB0aGUgYmlnIGJsb2NrIGxpc3QgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJZm9yIChiYiA9IGJpZ2Jsb2NrczsgYmI7IGxhc3QgPSAmYmItPm5leHQsIGJiID0gYmItPm5leHQpIHsKLQkJCWlmIChiYi0+cGFnZXMgPT0gYmxvY2spIHsKLQkJCQkqbGFzdCA9IGJiLT5uZXh0OwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWJsb2NrLCBiYi0+b3JkZXIpOwotCQkJCXNsb2JfZnJlZShiYiwgc2l6ZW9mKGJpZ2Jsb2NrX3QpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCX0KLQotCXNsb2JfZnJlZSgoc2xvYl90ICopYmxvY2sgLSAxLCAwKTsKLQlyZXR1cm47CisJc3AgPSAoc3RydWN0IHNsb2JfcGFnZSAqKXZpcnRfdG9fcGFnZShibG9jayk7CisJaWYgKHNsb2JfcGFnZShzcCkpIHsKKwkJaW50IGFsaWduID0gbWF4KEFSQ0hfS01BTExPQ19NSU5BTElHTiwgQVJDSF9TTEFCX01JTkFMSUdOKTsKKwkJdW5zaWduZWQgaW50ICptID0gKHVuc2lnbmVkIGludCAqKShibG9jayAtIGFsaWduKTsKKwkJc2xvYl9mcmVlKG0sICptICsgYWxpZ24pOworCX0gZWxzZQorCQlwdXRfcGFnZSgmc3AtPnBhZ2UpOwogfQotCiBFWFBPUlRfU1lNQk9MKGtmcmVlKTsKIAorLyogY2FuJ3QgdXNlIGtzaXplIGZvciBrbWVtX2NhY2hlX2FsbG9jIG1lbW9yeSwgb25seSBrbWFsbG9jICovCiBzaXplX3Qga3NpemUoY29uc3Qgdm9pZCAqYmxvY2spCiB7Ci0JYmlnYmxvY2tfdCAqYmI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2xvYl9wYWdlICpzcDsKIAotCWlmICghYmxvY2spCisJaWYgKFpFUk9fT1JfTlVMTF9QVFIoYmxvY2spKQogCQlyZXR1cm4gMDsKIAotCWlmICghKCh1bnNpZ25lZCBsb25nKWJsb2NrICYgKFBBR0VfU0laRS0xKSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJZm9yIChiYiA9IGJpZ2Jsb2NrczsgYmI7IGJiID0gYmItPm5leHQpCi0JCQlpZiAoYmItPnBhZ2VzID09IGJsb2NrKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7Ci0JCQkJcmV0dXJuIFBBR0VfU0laRSA8PCBiYi0+b3JkZXI7Ci0JCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gKChzbG9iX3QgKilibG9jayAtIDEpLT51bml0cyAqIFNMT0JfVU5JVDsKKwlzcCA9IChzdHJ1Y3Qgc2xvYl9wYWdlICopdmlydF90b19wYWdlKGJsb2NrKTsKKwlpZiAoc2xvYl9wYWdlKHNwKSkKKwkJcmV0dXJuICgoc2xvYl90ICopYmxvY2sgLSAxKS0+dW5pdHMgKyBTTE9CX1VOSVQ7CisJZWxzZQorCQlyZXR1cm4gc3AtPnBhZ2UucHJpdmF0ZTsKIH0KIAogc3RydWN0IGttZW1fY2FjaGUgewpAQCAtMjg5LDcgKzQ5Nyw3IEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKmM7CiAKLQljID0gc2xvYl9hbGxvYyhzaXplb2Yoc3RydWN0IGttZW1fY2FjaGUpLCBmbGFncywgMCk7CisJYyA9IHNsb2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlKSwgZmxhZ3MsIDAsIC0xKTsKIAogCWlmIChjKSB7CiAJCWMtPm5hbWUgPSBuYW1lOwpAQCAtMzAyLDYgKzUxMCw4IEBACiAJCWMtPmN0b3IgPSBjdG9yOwogCQkvKiBpZ25vcmUgYWxpZ25tZW50IHVubGVzcyBpdCdzIGZvcmNlZCAqLwogCQljLT5hbGlnbiA9IChmbGFncyAmIFNMQUJfSFdDQUNIRV9BTElHTikgPyBTTE9CX0FMSUdOIDogMDsKKwkJaWYgKGMtPmFsaWduIDwgQVJDSF9TTEFCX01JTkFMSUdOKQorCQkJYy0+YWxpZ24gPSBBUkNIX1NMQUJfTUlOQUxJR047CiAJCWlmIChjLT5hbGlnbiA8IGFsaWduKQogCQkJYy0+YWxpZ24gPSBhbGlnbjsKIAl9IGVsc2UgaWYgKGZsYWdzICYgU0xBQl9QQU5JQykKQEAgLTMxNywzMSArNTI3LDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfZGVzdHJveSk7CiAKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmMsIGdmcF90IGZsYWdzKQordm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CiAJdm9pZCAqYjsKIAogCWlmIChjLT5zaXplIDwgUEFHRV9TSVpFKQotCQliID0gc2xvYl9hbGxvYyhjLT5zaXplLCBmbGFncywgYy0+YWxpZ24pOworCQliID0gc2xvYl9hbGxvYyhjLT5zaXplLCBmbGFncywgYy0+YWxpZ24sIG5vZGUpOwogCWVsc2UKLQkJYiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgZ2V0X29yZGVyKGMtPnNpemUpKTsKKwkJYiA9IHNsb2JfbmV3X3BhZ2UoZmxhZ3MsIGdldF9vcmRlcihjLT5zaXplKSwgbm9kZSk7CiAKIAlpZiAoYy0+Y3RvcikKIAkJYy0+Y3RvcihiLCBjLCAwKTsKIAogCXJldHVybiBiOwogfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jKTsKLQotdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmMsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldCA9IGttZW1fY2FjaGVfYWxsb2MoYywgZmxhZ3MpOwotCWlmIChyZXQpCi0JCW1lbXNldChyZXQsIDAsIGMtPnNpemUpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV96YWxsb2MpOworRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGUpOwogCiBzdGF0aWMgdm9pZCBfX2ttZW1fY2FjaGVfZnJlZSh2b2lkICpiLCBpbnQgc2l6ZSkKIHsKQEAgLTM4NSw5ICs1ODUsNiBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX25hbWUpOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2xvYl90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKAotCSh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlzbG9iX3RpbWVyX2NiaywgMCwgMCk7Ci0KIGludCBrbWVtX2NhY2hlX3NocmluayhzdHJ1Y3Qga21lbV9jYWNoZSAqZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTM5OSwxNyArNTk2LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBzbG9iX3JlYWR5IF9fcmVhZF9tb3N0bHk7CisKK2ludCBzbGFiX2lzX2F2YWlsYWJsZSh2b2lkKQogewotCXNsb2JfdGltZXJfY2JrKCk7CisJcmV0dXJuIHNsb2JfcmVhZHk7CiB9CiAKLXN0YXRpYyB2b2lkIHNsb2JfdGltZXJfY2JrKHZvaWQpCit2b2lkIF9faW5pdCBrbWVtX2NhY2hlX2luaXQodm9pZCkKIHsKLQl2b2lkICpwID0gc2xvYl9hbGxvYyhQQUdFX1NJWkUsIDAsIFBBR0VfU0laRS0xKTsKLQotCWlmIChwKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcCk7Ci0KLQltb2RfdGltZXIoJnNsb2JfdGltZXIsIGppZmZpZXMgKyBIWik7CisJc2xvYl9yZWFkeSA9IDE7CiB9CmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggZTBjZjYyMS4uNTJhNGY0NCAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMjA1LDYgKzIwNSwxMSBAQAogI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gX19hbGlnbm9mX18odW5zaWduZWQgbG9uZyBsb25nKQogI2VuZGlmCiAKKy8qCisgKiBUaGUgcGFnZS0+aW51c2UgZmllbGQgaXMgMTYgYml0IHRodXMgd2UgaGF2ZSB0aGlzIGxpbWl0YXRpb24KKyAqLworI2RlZmluZSBNQVhfT0JKRUNUU19QRVJfU0xBQiA2NTUzNQorCiAvKiBJbnRlcm5hbCBTTFVCIGZsYWdzICovCiAjZGVmaW5lIF9fT0JKRUNUX1BPSVNPTiAweDgwMDAwMDAwCS8qIFBvaXNvbiBvYmplY3QgKi8KIApAQCAtMjI4LDcgKzIzMyw3IEBACiAKIC8qIEEgbGlzdCBvZiBhbGwgc2xhYiBjYWNoZXMgb24gdGhlIHN5c3RlbSAqLwogc3RhdGljIERFQ0xBUkVfUldTRU0oc2x1Yl9sb2NrKTsKLUxJU1RfSEVBRChzbGFiX2NhY2hlcyk7CitzdGF0aWMgTElTVF9IRUFEKHNsYWJfY2FjaGVzKTsKIAogLyoKICAqIFRyYWNraW5nIHVzZXIgb2YgYSBzbGFiLgpAQCAtMjQ3LDkgKzI1MiwxMCBAQAogc3RhdGljIGludCBzeXNmc19zbGFiX2FsaWFzKHN0cnVjdCBrbWVtX2NhY2hlICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgdm9pZCBzeXNmc19zbGFiX3JlbW92ZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKICNlbHNlCi1zdGF0aWMgaW50IHN5c2ZzX3NsYWJfYWRkKHN0cnVjdCBrbWVtX2NhY2hlICpzKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW50IHN5c2ZzX3NsYWJfYWxpYXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNvbnN0IGNoYXIgKnApIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyB2b2lkIHN5c2ZzX3NsYWJfcmVtb3ZlKHN0cnVjdCBrbWVtX2NhY2hlICpzKSB7fQorc3RhdGljIGlubGluZSBpbnQgc3lzZnNfc2xhYl9hZGQoc3RydWN0IGttZW1fY2FjaGUgKnMpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX3NsYWJfYWxpYXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNvbnN0IGNoYXIgKnApCisJCQkJCQkJeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX3NsYWJfcmVtb3ZlKHN0cnVjdCBrbWVtX2NhY2hlICpzKSB7fQogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzIzLDcgKzMyOSwxMSBAQAogLyoKICAqIERlYnVnIHNldHRpbmdzOgogICovCisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUdfT04KK3N0YXRpYyBpbnQgc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7CisjZWxzZQogc3RhdGljIGludCBzbHViX2RlYnVnOworI2VuZGlmCiAKIHN0YXRpYyBjaGFyICpzbHViX2RlYnVnX3NsYWJzOwogCkBAIC0zNDAsNyArMzUwLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpZiAobmV3bGluZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlMTBzIDB4JXA6ICIsIHRleHQsIGFkZHIgKyBpKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJThzIDB4JXA6ICIsIHRleHQsIGFkZHIgKyBpKTsKIAkJCW5ld2xpbmUgPSAwOwogCQl9CiAJCXByaW50aygiICUwMngiLCBhZGRyW2ldKTsKQEAgLTM5NywxMCArNDA3LDExIEBACiAKIHN0YXRpYyB2b2lkIGluaXRfdHJhY2tpbmcoc3RydWN0IGttZW1fY2FjaGUgKnMsIHZvaWQgKm9iamVjdCkKIHsKLQlpZiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpIHsKLQkJc2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfRlJFRSwgTlVMTCk7Ci0JCXNldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0FMTE9DLCBOVUxMKTsKLQl9CisJaWYgKCEocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpKQorCQlyZXR1cm47CisKKwlzZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19GUkVFLCBOVUxMKTsKKwlzZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19BTExPQywgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X3RyYWNrKGNvbnN0IGNoYXIgKnMsIHN0cnVjdCB0cmFjayAqdCkKQEAgLTQwOCw2NSArNDE5LDEwNiBAQAogCWlmICghdC0+YWRkcikKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogIiwgcyk7CisJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiAlcyBpbiAiLCBzKTsKIAlfX3ByaW50X3N5bWJvbCgiJXMiLCAodW5zaWduZWQgbG9uZyl0LT5hZGRyKTsKLQlwcmludGsoIiBqaWZmaWVzX2Fnbz0lbHUgY3B1PSV1IHBpZD0lZFxuIiwgamlmZmllcyAtIHQtPndoZW4sIHQtPmNwdSwgdC0+cGlkKTsKKwlwcmludGsoIiBhZ2U9JWx1IGNwdT0ldSBwaWQ9JWRcbiIsIGppZmZpZXMgLSB0LT53aGVuLCB0LT5jcHUsIHQtPnBpZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3RyYWlsZXIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHU4ICpwKQorc3RhdGljIHZvaWQgcHJpbnRfdHJhY2tpbmcoc3RydWN0IGttZW1fY2FjaGUgKnMsIHZvaWQgKm9iamVjdCkKK3sKKwlpZiAoIShzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCisJCXJldHVybjsKKworCXByaW50X3RyYWNrKCJBbGxvY2F0ZWQiLCBnZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19BTExPQykpOworCXByaW50X3RyYWNrKCJGcmVlZCIsIGdldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0ZSRUUpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGFnZV9pbmZvKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogU2xhYiAweCVwIHVzZWQ9JXUgZnA9MHglcCBmbGFncz0weCUwNGx4XG4iLAorCQlwYWdlLCBwYWdlLT5pbnVzZSwgcGFnZS0+ZnJlZWxpc3QsIHBhZ2UtPmZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBzbGFiX2J1ZyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzEwMF07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlwcmludGsoS0VSTl9FUlIgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKEtFUk5fRVJSICJCVUcgJXM6ICVzXG4iLCBzLT5uYW1lLCBidWYpOworCXByaW50ayhLRVJOX0VSUiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOworfQorCitzdGF0aWMgdm9pZCBzbGFiX2ZpeChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzEwMF07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlwcmludGsoS0VSTl9FUlIgIkZJWCAlczogJXNcbiIsIHMtPm5hbWUsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3RyYWlsZXIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCB1OCAqcCkKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmOwkvKiBPZmZzZXQgb2YgbGFzdCBieXRlICovCisJdTggKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlwcmludF90cmFja2luZyhzLCBwKTsKKworCXByaW50X3BhZ2VfaW5mbyhwYWdlKTsKKworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogT2JqZWN0IDB4JXAgQG9mZnNldD0ldHUgZnA9MHglcFxuXG4iLAorCQkJcCwgcCAtIGFkZHIsIGdldF9mcmVlcG9pbnRlcihzLCBwKSk7CisKKwlpZiAocCA+IGFkZHIgKyAxNikKKwkJcHJpbnRfc2VjdGlvbigiQnl0ZXMgYjQiLCBwIC0gMTYsIDE2KTsKKworCXByaW50X3NlY3Rpb24oIk9iamVjdCIsIHAsIG1pbihzLT5vYmpzaXplLCAxMjgpKTsKIAogCWlmIChzLT5mbGFncyAmIFNMQUJfUkVEX1pPTkUpCiAJCXByaW50X3NlY3Rpb24oIlJlZHpvbmUiLCBwICsgcy0+b2Jqc2l6ZSwKIAkJCXMtPmludXNlIC0gcy0+b2Jqc2l6ZSk7CiAKLQlwcmludGsoS0VSTl9FUlIgIkZyZWVQb2ludGVyIDB4JXAgLT4gMHglcFxuIiwKLQkJCXAgKyBzLT5vZmZzZXQsCi0JCQlnZXRfZnJlZXBvaW50ZXIocywgcCkpOwotCiAJaWYgKHMtPm9mZnNldCkKIAkJb2ZmID0gcy0+b2Zmc2V0ICsgc2l6ZW9mKHZvaWQgKik7CiAJZWxzZQogCQlvZmYgPSBzLT5pbnVzZTsKIAotCWlmIChzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikgewotCQlwcmludF90cmFjaygiTGFzdCBhbGxvYyIsIGdldF90cmFjayhzLCBwLCBUUkFDS19BTExPQykpOwotCQlwcmludF90cmFjaygiTGFzdCBmcmVlICIsIGdldF90cmFjayhzLCBwLCBUUkFDS19GUkVFKSk7CisJaWYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKQogCQlvZmYgKz0gMiAqIHNpemVvZihzdHJ1Y3QgdHJhY2spOwotCX0KIAogCWlmIChvZmYgIT0gcy0+c2l6ZSkKIAkJLyogQmVnaW5uaW5nIG9mIHRoZSBmaWxsZXIgaXMgdGhlIGZyZWUgcG9pbnRlciAqLwotCQlwcmludF9zZWN0aW9uKCJGaWxsZXIiLCBwICsgb2ZmLCBzLT5zaXplIC0gb2ZmKTsKKwkJcHJpbnRfc2VjdGlvbigiUGFkZGluZyIsIHAgKyBvZmYsIHMtPnNpemUgLSBvZmYpOworCisJZHVtcF9zdGFjaygpOwogfQogCiBzdGF0aWMgdm9pZCBvYmplY3RfZXJyKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCXU4ICpvYmplY3QsIGNoYXIgKnJlYXNvbikKIHsKLQl1OCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQotCXByaW50ayhLRVJOX0VSUiAiKioqIFNMVUIgJXM6ICVzQDB4JXAgc2xhYiAweCVwXG4iLAotCQkJcy0+bmFtZSwgcmVhc29uLCBvYmplY3QsIHBhZ2UpOwotCXByaW50ayhLRVJOX0VSUiAiICAgIG9mZnNldD0ldHUgZmxhZ3M9MHglMDRseCBpbnVzZT0ldSBmcmVlbGlzdD0weCVwXG4iLAotCQlvYmplY3QgLSBhZGRyLCBwYWdlLT5mbGFncywgcGFnZS0+aW51c2UsIHBhZ2UtPmZyZWVsaXN0KTsKLQlpZiAob2JqZWN0ID4gYWRkciArIDE2KQotCQlwcmludF9zZWN0aW9uKCJCeXRlcyBiNCIsIG9iamVjdCAtIDE2LCAxNik7Ci0JcHJpbnRfc2VjdGlvbigiT2JqZWN0Iiwgb2JqZWN0LCBtaW4ocy0+b2Jqc2l6ZSwgMTI4KSk7Ci0JcHJpbnRfdHJhaWxlcihzLCBvYmplY3QpOwotCWR1bXBfc3RhY2soKTsKKwlzbGFiX2J1ZyhzLCByZWFzb24pOworCXByaW50X3RyYWlsZXIocywgcGFnZSwgb2JqZWN0KTsKIH0KIAotc3RhdGljIHZvaWQgc2xhYl9lcnIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBjaGFyICpyZWFzb24sIC4uLikKK3N0YXRpYyB2b2lkIHNsYWJfZXJyKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCWNoYXIgYnVmWzEwMF07CiAKLQl2YV9zdGFydChhcmdzLCByZWFzb24pOwotCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCByZWFzb24sIGFyZ3MpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwotCXByaW50ayhLRVJOX0VSUiAiKioqIFNMVUIgJXM6ICVzIGluIHNsYWIgQDB4JXBcbiIsIHMtPm5hbWUsIGJ1ZiwKLQkJcGFnZSk7CisJc2xhYl9idWcocywgZm10KTsKKwlwcmludF9wYWdlX2luZm8ocGFnZSk7CiAJZHVtcF9zdGFjaygpOwogfQogCkBAIC00ODUsMTUgKzUzNyw0NiBAQAogCQkJcy0+aW51c2UgLSBzLT5vYmpzaXplKTsKIH0KIAotc3RhdGljIGludCBjaGVja19ieXRlcyh1OCAqc3RhcnQsIHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQorc3RhdGljIHU4ICpjaGVja19ieXRlcyh1OCAqc3RhcnQsIHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQogewogCXdoaWxlIChieXRlcykgewogCQlpZiAoKnN0YXJ0ICE9ICh1OCl2YWx1ZSkKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIHN0YXJ0OwogCQlzdGFydCsrOwogCQlieXRlcy0tOwogCX0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV9ieXRlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqbWVzc2FnZSwgdTggZGF0YSwKKwkJCQkJCXZvaWQgKmZyb20sIHZvaWQgKnRvKQoreworCXNsYWJfZml4KHMsICJSZXN0b3JpbmcgMHglcC0weCVwPTB4JXhcbiIsIGZyb20sIHRvIC0gMSwgZGF0YSk7CisJbWVtc2V0KGZyb20sIGRhdGEsIHRvIC0gZnJvbSk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1OCAqb2JqZWN0LCBjaGFyICp3aGF0LAorCQkJdTgqIHN0YXJ0LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKK3sKKwl1OCAqZmF1bHQ7CisJdTggKmVuZDsKKworCWZhdWx0ID0gY2hlY2tfYnl0ZXMoc3RhcnQsIHZhbHVlLCBieXRlcyk7CisJaWYgKCFmYXVsdCkKKwkJcmV0dXJuIDE7CisKKwllbmQgPSBzdGFydCArIGJ5dGVzOworCXdoaWxlIChlbmQgPiBmYXVsdCAmJiBlbmRbLTFdID09IHZhbHVlKQorCQllbmQtLTsKKworCXNsYWJfYnVnKHMsICIlcyBvdmVyd3JpdHRlbiIsIHdoYXQpOworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogMHglcC0weCVwLiBGaXJzdCBieXRlIDB4JXggaW5zdGVhZCBvZiAweCV4XG4iLAorCQkJCQlmYXVsdCwgZW5kIC0gMSwgZmF1bHRbMF0sIHZhbHVlKTsKKwlwcmludF90cmFpbGVyKHMsIHBhZ2UsIG9iamVjdCk7CisKKwlyZXN0b3JlX2J5dGVzKHMsIHdoYXQsIHZhbHVlLCBmYXVsdCwgZW5kKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTUzNCwxNCArNjE3LDYgQEAKICAqIG1heSBiZSB1c2VkIHdpdGggbWVyZ2VkIHNsYWJjYWNoZXMuCiAgKi8KIAotc3RhdGljIHZvaWQgcmVzdG9yZV9ieXRlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqbWVzc2FnZSwgdTggZGF0YSwKLQkJCQkJCXZvaWQgKmZyb20sIHZvaWQgKnRvKQotewotCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUIgJXM6IFJlc3RvcmluZyAlcyAoMHgleCkgZnJvbSAweCVwLTB4JXBcbiIsCi0JCXMtPm5hbWUsIG1lc3NhZ2UsIGRhdGEsIGZyb20sIHRvIC0gMSk7Ci0JbWVtc2V0KGZyb20sIGRhdGEsIHRvIC0gZnJvbSk7Ci19Ci0KIHN0YXRpYyBpbnQgY2hlY2tfcGFkX2J5dGVzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTggKnApCiB7CiAJdW5zaWduZWQgbG9uZyBvZmYgPSBzLT5pbnVzZTsJLyogVGhlIGVuZCBvZiBpbmZvICovCkBAIC01NTcsMzkgKzYzMiwzOSBAQAogCWlmIChzLT5zaXplID09IG9mZikKIAkJcmV0dXJuIDE7CiAKLQlpZiAoY2hlY2tfYnl0ZXMocCArIG9mZiwgUE9JU09OX0lOVVNFLCBzLT5zaXplIC0gb2ZmKSkKLQkJcmV0dXJuIDE7Ci0KLQlvYmplY3RfZXJyKHMsIHBhZ2UsIHAsICJPYmplY3QgcGFkZGluZyBjaGVjayBmYWlscyIpOwotCi0JLyoKLQkgKiBSZXN0b3JlIHBhZGRpbmcKLQkgKi8KLQlyZXN0b3JlX2J5dGVzKHMsICJvYmplY3QgcGFkZGluZyIsIFBPSVNPTl9JTlVTRSwgcCArIG9mZiwgcCArIHMtPnNpemUpOwotCXJldHVybiAwOworCXJldHVybiBjaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIHAsICJPYmplY3QgcGFkZGluZyIsCisJCQkJcCArIG9mZiwgUE9JU09OX0lOVVNFLCBzLT5zaXplIC0gb2ZmKTsKIH0KIAogc3RhdGljIGludCBzbGFiX3BhZF9jaGVjayhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JdTggKnA7Ci0JaW50IGxlbmd0aCwgcmVtYWluZGVyOworCXU4ICpzdGFydDsKKwl1OCAqZmF1bHQ7CisJdTggKmVuZDsKKwlpbnQgbGVuZ3RoOworCWludCByZW1haW5kZXI7CiAKIAlpZiAoIShzLT5mbGFncyAmIFNMQUJfUE9JU09OKSkKIAkJcmV0dXJuIDE7CiAKLQlwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXN0YXJ0ID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWVuZCA9IHN0YXJ0ICsgKFBBR0VfU0laRSA8PCBzLT5vcmRlcik7CiAJbGVuZ3RoID0gcy0+b2JqZWN0cyAqIHMtPnNpemU7Ci0JcmVtYWluZGVyID0gKFBBR0VfU0laRSA8PCBzLT5vcmRlcikgLSBsZW5ndGg7CisJcmVtYWluZGVyID0gZW5kIC0gKHN0YXJ0ICsgbGVuZ3RoKTsKIAlpZiAoIXJlbWFpbmRlcikKIAkJcmV0dXJuIDE7CiAKLQlpZiAoIWNoZWNrX2J5dGVzKHAgKyBsZW5ndGgsIFBPSVNPTl9JTlVTRSwgcmVtYWluZGVyKSkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiUGFkZGluZyBjaGVjayBmYWlsZWQiKTsKLQkJcmVzdG9yZV9ieXRlcyhzLCAic2xhYiBwYWRkaW5nIiwgUE9JU09OX0lOVVNFLCBwICsgbGVuZ3RoLAotCQkJcCArIGxlbmd0aCArIHJlbWFpbmRlcik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKwlmYXVsdCA9IGNoZWNrX2J5dGVzKHN0YXJ0ICsgbGVuZ3RoLCBQT0lTT05fSU5VU0UsIHJlbWFpbmRlcik7CisJaWYgKCFmYXVsdCkKKwkJcmV0dXJuIDE7CisJd2hpbGUgKGVuZCA+IGZhdWx0ICYmIGVuZFstMV0gPT0gUE9JU09OX0lOVVNFKQorCQllbmQtLTsKKworCXNsYWJfZXJyKHMsIHBhZ2UsICJQYWRkaW5nIG92ZXJ3cml0dGVuLiAweCVwLTB4JXAiLCBmYXVsdCwgZW5kIC0gMSk7CisJcHJpbnRfc2VjdGlvbigiUGFkZGluZyIsIHN0YXJ0LCBsZW5ndGgpOworCisJcmVzdG9yZV9ieXRlcyhzLCAic2xhYiBwYWRkaW5nIiwgUE9JU09OX0lOVVNFLCBzdGFydCwgZW5kKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjaGVja19vYmplY3Qoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLApAQCAtNjAyLDQxICs2NzcsMjIgQEAKIAkJdW5zaWduZWQgaW50IHJlZCA9CiAJCQlhY3RpdmUgPyBTTFVCX1JFRF9BQ1RJVkUgOiBTTFVCX1JFRF9JTkFDVElWRTsKIAotCQlpZiAoIWNoZWNrX2J5dGVzKGVuZG9iamVjdCwgcmVkLCBzLT5pbnVzZSAtIHMtPm9ianNpemUpKSB7Ci0JCQlvYmplY3RfZXJyKHMsIHBhZ2UsIG9iamVjdCwKLQkJCWFjdGl2ZSA/ICJSZWR6b25lIEFjdGl2ZSIgOiAiUmVkem9uZSBJbmFjdGl2ZSIpOwotCQkJcmVzdG9yZV9ieXRlcyhzLCAicmVkem9uZSIsIHJlZCwKLQkJCQllbmRvYmplY3QsIG9iamVjdCArIHMtPmludXNlKTsKKwkJaWYgKCFjaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIG9iamVjdCwgIlJlZHpvbmUiLAorCQkJZW5kb2JqZWN0LCByZWQsIHMtPmludXNlIC0gcy0+b2Jqc2l6ZSkpCiAJCQlyZXR1cm4gMDsKLQkJfQogCX0gZWxzZSB7Ci0JCWlmICgocy0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikgJiYgcy0+b2Jqc2l6ZSA8IHMtPmludXNlICYmCi0JCQkhY2hlY2tfYnl0ZXMoZW5kb2JqZWN0LCBQT0lTT05fSU5VU0UsCi0JCQkJCXMtPmludXNlIC0gcy0+b2Jqc2l6ZSkpIHsKLQkJb2JqZWN0X2VycihzLCBwYWdlLCBwLCAiQWxpZ25tZW50IHBhZGRpbmcgY2hlY2sgZmFpbHMiKTsKLQkJLyoKLQkJICogRml4IGl0IHNvIHRoYXQgdGhlcmUgd2lsbCBub3QgYmUgYW5vdGhlciByZXBvcnQuCi0JCSAqCi0JCSAqIEhtbW0uLi4gV2UgbWF5IGJlIGNvcnJ1cHRpbmcgYW4gb2JqZWN0IHRoYXQgbm93IGV4cGVjdHMKLQkJICogdG8gYmUgbG9uZ2VyIHRoYW4gYWxsb3dlZC4KLQkJICovCi0JCXJlc3RvcmVfYnl0ZXMocywgImFsaWdubWVudCBwYWRkaW5nIiwgUE9JU09OX0lOVVNFLAotCQkJZW5kb2JqZWN0LCBvYmplY3QgKyBzLT5pbnVzZSk7Ci0JCX0KKwkJaWYgKChzLT5mbGFncyAmIFNMQUJfUE9JU09OKSAmJiBzLT5vYmpzaXplIDwgcy0+aW51c2UpCisJCQljaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIHAsICJBbGlnbm1lbnQgcGFkZGluZyIsIGVuZG9iamVjdCwKKwkJCQlQT0lTT05fSU5VU0UsIHMtPmludXNlIC0gcy0+b2Jqc2l6ZSk7CiAJfQogCiAJaWYgKHMtPmZsYWdzICYgU0xBQl9QT0lTT04pIHsKIAkJaWYgKCFhY3RpdmUgJiYgKHMtPmZsYWdzICYgX19PQkpFQ1RfUE9JU09OKSAmJgotCQkJKCFjaGVja19ieXRlcyhwLCBQT0lTT05fRlJFRSwgcy0+b2Jqc2l6ZSAtIDEpIHx8Ci0JCQkJcFtzLT5vYmpzaXplIC0gMV0gIT0gUE9JU09OX0VORCkpIHsKLQotCQkJb2JqZWN0X2VycihzLCBwYWdlLCBwLCAiUG9pc29uIGNoZWNrIGZhaWxlZCIpOwotCQkJcmVzdG9yZV9ieXRlcyhzLCAiUG9pc29uIiwgUE9JU09OX0ZSRUUsCi0JCQkJCQlwLCBwICsgcy0+b2Jqc2l6ZSAtMSk7Ci0JCQlyZXN0b3JlX2J5dGVzKHMsICJQb2lzb24iLCBQT0lTT05fRU5ELAotCQkJCQlwICsgcy0+b2Jqc2l6ZSAtIDEsIHAgKyBzLT5vYmpzaXplKTsKKwkJCSghY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzLCBwYWdlLCBwLCAiUG9pc29uIiwgcCwKKwkJCQkJUE9JU09OX0ZSRUUsIHMtPm9ianNpemUgLSAxKSB8fAorCQkJICFjaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIHAsICJQb2lzb24iLAorCQkJIAlwICsgcy0+b2Jqc2l6ZSAtMSwgUE9JU09OX0VORCwgMSkpKQogCQkJcmV0dXJuIDA7Ci0JCX0KIAkJLyoKIAkJICogY2hlY2tfcGFkX2J5dGVzIGNsZWFucyB1cCBvbiBpdHMgb3duLgogCQkgKi8KQEAgLTY2OSwyNSArNzI1LDE3IEBACiAJVk1fQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOwogCiAJaWYgKCFQYWdlU2xhYihwYWdlKSkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiTm90IGEgdmFsaWQgc2xhYiBwYWdlIGZsYWdzPSVseCAiCi0JCQkibWFwcGluZz0weCVwIGNvdW50PSVkIiwgcGFnZS0+ZmxhZ3MsIHBhZ2UtPm1hcHBpbmcsCi0JCQlwYWdlX2NvdW50KHBhZ2UpKTsKKwkJc2xhYl9lcnIocywgcGFnZSwgIk5vdCBhIHZhbGlkIHNsYWIgcGFnZSIpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHBhZ2UtPm9mZnNldCAqIHNpemVvZih2b2lkICopICE9IHMtPm9mZnNldCkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiQ29ycnVwdGVkIG9mZnNldCAlbHUgZmxhZ3M9MHglbHggIgotCQkJIm1hcHBpbmc9MHglcCBjb3VudD0lZCIsCi0JCQkodW5zaWduZWQgbG9uZykocGFnZS0+b2Zmc2V0ICogc2l6ZW9mKHZvaWQgKikpLAotCQkJcGFnZS0+ZmxhZ3MsCi0JCQlwYWdlLT5tYXBwaW5nLAotCQkJcGFnZV9jb3VudChwYWdlKSk7CisJCXNsYWJfZXJyKHMsIHBhZ2UsICJDb3JydXB0ZWQgb2Zmc2V0ICVsdSIsCisJCQkodW5zaWduZWQgbG9uZykocGFnZS0+b2Zmc2V0ICogc2l6ZW9mKHZvaWQgKikpKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChwYWdlLT5pbnVzZSA+IHMtPm9iamVjdHMpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgImludXNlICV1ID4gbWF4ICV1IEAweCVwIGZsYWdzPSVseCAiCi0JCQkibWFwcGluZz0weCVwIGNvdW50PSVkIiwKLQkJCXMtPm5hbWUsIHBhZ2UtPmludXNlLCBzLT5vYmplY3RzLCBwYWdlLT5mbGFncywKLQkJCXBhZ2UtPm1hcHBpbmcsIHBhZ2VfY291bnQocGFnZSkpOworCQlzbGFiX2VycihzLCBwYWdlLCAiaW51c2UgJXUgPiBtYXggJXUiLAorCQkJcy0+bmFtZSwgcGFnZS0+aW51c2UsIHMtPm9iamVjdHMpOwogCQlyZXR1cm4gMDsKIAl9CiAJLyogU2xhYl9wYWRfY2hlY2sgZml4ZXMgdGhpbmdzIHVwIGFmdGVyIGl0c2VsZiAqLwpAQCAtNzE1LDEzICs3NjMsMTAgQEAKIAkJCQlzZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0LCBOVUxMKTsKIAkJCQlicmVhazsKIAkJCX0gZWxzZSB7Ci0JCQkJc2xhYl9lcnIocywgcGFnZSwgIkZyZWVwb2ludGVyIDB4JXAgY29ycnVwdCIsCi0JCQkJCQkJCQlmcCk7CisJCQkJc2xhYl9lcnIocywgcGFnZSwgIkZyZWVwb2ludGVyIGNvcnJ1cHQiKTsKIAkJCQlwYWdlLT5mcmVlbGlzdCA9IE5VTEw7CiAJCQkJcGFnZS0+aW51c2UgPSBzLT5vYmplY3RzOwotCQkJCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUIgJXM6IEZyZWVsaXN0ICIKLQkJCQkJImNsZWFyZWQuIFNsYWIgMHglcFxuIiwKLQkJCQkJcy0+bmFtZSwgcGFnZSk7CisJCQkJc2xhYl9maXgocywgIkZyZWVsaXN0IGNsZWFyZWQiKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNzMzLDExICs3NzgsOSBAQAogCiAJaWYgKHBhZ2UtPmludXNlICE9IHMtPm9iamVjdHMgLSBucikgewogCQlzbGFiX2VycihzLCBwYWdlLCAiV3Jvbmcgb2JqZWN0IGNvdW50LiBDb3VudGVyIGlzICVkIGJ1dCAiCi0JCQkiY291bnRlZCB3ZXJlICVkIiwgcywgcGFnZSwgcGFnZS0+aW51c2UsCi0JCQkJCQkJcy0+b2JqZWN0cyAtIG5yKTsKKwkJCSJjb3VudGVkIHdlcmUgJWQiLCBwYWdlLT5pbnVzZSwgcy0+b2JqZWN0cyAtIG5yKTsKIAkJcGFnZS0+aW51c2UgPSBzLT5vYmplY3RzIC0gbnI7Ci0JCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUIgJXM6IE9iamVjdCBjb3VudCBhZGp1c3RlZC4gIgotCQkJIlNsYWIgQDB4JXBcbiIsIHMtPm5hbWUsIHBhZ2UpOworCQlzbGFiX2ZpeChzLCAiT2JqZWN0IGNvdW50IGFkanVzdGVkLiIpOwogCX0KIAlyZXR1cm4gc2VhcmNoID09IE5VTEw7CiB9CkBAIC03OTksNyArODQyLDcgQEAKIAkJZ290byBiYWQ7CiAKIAlpZiAob2JqZWN0ICYmICFvbl9mcmVlbGlzdChzLCBwYWdlLCBvYmplY3QpKSB7Ci0JCXNsYWJfZXJyKHMsIHBhZ2UsICJPYmplY3QgMHglcCBhbHJlYWR5IGFsbG9jYXRlZCIsIG9iamVjdCk7CisJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LCAiT2JqZWN0IGFscmVhZHkgYWxsb2NhdGVkIik7CiAJCWdvdG8gYmFkOwogCX0KIApAQCAtODI1LDggKzg2OCw3IEBACiAJCSAqIHRvIGF2b2lkIGlzc3VlcyBpbiB0aGUgZnV0dXJlLiBNYXJraW5nIGFsbCBvYmplY3RzCiAJCSAqIGFzIHVzZWQgYXZvaWRzIHRvdWNoaW5nIHRoZSByZW1haW5pbmcgb2JqZWN0cy4KIAkJICovCi0JCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUI6ICVzIHNsYWIgMHglcC4gTWFya2luZyBhbGwgb2JqZWN0cyB1c2VkLlxuIiwKLQkJCXMtPm5hbWUsIHBhZ2UpOworCQlzbGFiX2ZpeChzLCAiTWFya2luZyBhbGwgb2JqZWN0cyB1c2VkIik7CiAJCXBhZ2UtPmludXNlID0gcy0+b2JqZWN0czsKIAkJcGFnZS0+ZnJlZWxpc3QgPSBOVUxMOwogCQkvKiBGaXggdXAgZmllbGRzIHRoYXQgbWF5IGJlIGNvcnJ1cHRlZCAqLwpAQCAtODQ3LDcgKzg4OSw3IEBACiAJfQogCiAJaWYgKG9uX2ZyZWVsaXN0KHMsIHBhZ2UsIG9iamVjdCkpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgIk9iamVjdCAweCVwIGFscmVhZHkgZnJlZSIsIG9iamVjdCk7CisJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LCAiT2JqZWN0IGFscmVhZHkgZnJlZSIpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC04NjYsOCArOTA4LDggQEAKIAkJCWR1bXBfc3RhY2soKTsKIAkJfQogCQllbHNlCi0JCQlzbGFiX2VycihzLCBwYWdlLCAib2JqZWN0IGF0IDB4JXAgYmVsb25ncyAiCi0JCQkJInRvIHNsYWIgJXMiLCBvYmplY3QsIHBhZ2UtPnNsYWItPm5hbWUpOworCQkJb2JqZWN0X2VycihzLCBwYWdlLCBvYmplY3QsCisJCQkJCSJwYWdlIHNsYWIgcG9pbnRlciBjb3JydXB0LiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC04ODEsNDUgKzkyMyw2MyBAQAogCXJldHVybiAxOwogCiBmYWlsOgotCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUI6ICVzIHNsYWIgMHglcCBvYmplY3QgYXQgMHglcCBub3QgZnJlZWQuXG4iLAotCQlzLT5uYW1lLCBwYWdlLCBvYmplY3QpOworCXNsYWJfZml4KHMsICJPYmplY3QgYXQgMHglcCBub3QgZnJlZWQiLCBvYmplY3QpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9zbHViX2RlYnVnKGNoYXIgKnN0cikKIHsKLQlpZiAoIXN0ciB8fCAqc3RyICE9ICc9JykKLQkJc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7Ci0JZWxzZSB7Ci0JCXN0cisrOwotCQlpZiAoKnN0ciA9PSAwIHx8ICpzdHIgPT0gJywnKQotCQkJc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7Ci0JCWVsc2UKLQkJZm9yKCA7KnN0ciAmJiAqc3RyICE9ICcsJzsgc3RyKyspCi0JCQlzd2l0Y2ggKCpzdHIpIHsKLQkJCWNhc2UgJ2YnIDogY2FzZSAnRicgOgotCQkJCXNsdWJfZGVidWcgfD0gU0xBQl9ERUJVR19GUkVFOwotCQkJCWJyZWFrOwotCQkJY2FzZSAneicgOiBjYXNlICdaJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1JFRF9aT05FOwotCQkJCWJyZWFrOwotCQkJY2FzZSAncCcgOiBjYXNlICdQJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1BPSVNPTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3UnIDogY2FzZSAnVScgOgotCQkJCXNsdWJfZGVidWcgfD0gU0xBQl9TVE9SRV9VU0VSOwotCQkJCWJyZWFrOwotCQkJY2FzZSAndCcgOiBjYXNlICdUJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1RSQUNFOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9FUlIgInNsdWJfZGVidWcgb3B0aW9uICclYycgIgotCQkJCQkidW5rbm93bi4gc2tpcHBlZFxuIiwqc3RyKTsKLQkJCX0KLQl9CisJc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7CisJaWYgKCpzdHIrKyAhPSAnPScgfHwgISpzdHIpCisJCS8qCisJCSAqIE5vIG9wdGlvbnMgc3BlY2lmaWVkLiBTd2l0Y2ggb24gZnVsbCBkZWJ1Z2dpbmcuCisJCSAqLworCQlnb3RvIG91dDsKIAogCWlmICgqc3RyID09ICcsJykKKwkJLyoKKwkJICogTm8gb3B0aW9ucyBidXQgcmVzdHJpY3Rpb24gb24gc2xhYnMuIFRoaXMgbWVhbnMgZnVsbAorCQkgKiBkZWJ1Z2dpbmcgZm9yIHNsYWJzIG1hdGNoaW5nIGEgcGF0dGVybi4KKwkJICovCisJCWdvdG8gY2hlY2tfc2xhYnM7CisKKwlzbHViX2RlYnVnID0gMDsKKwlpZiAoKnN0ciA9PSAnLScpCisJCS8qCisJCSAqIFN3aXRjaCBvZmYgYWxsIGRlYnVnZ2luZyBtZWFzdXJlcy4KKwkJICovCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBEZXRlcm1pbmUgd2hpY2ggZGVidWcgZmVhdHVyZXMgc2hvdWxkIGJlIHN3aXRjaGVkIG9uCisJICovCisJZm9yICggOypzdHIgJiYgKnN0ciAhPSAnLCc7IHN0cisrKSB7CisJCXN3aXRjaCAodG9sb3dlcigqc3RyKSkgeworCQljYXNlICdmJzoKKwkJCXNsdWJfZGVidWcgfD0gU0xBQl9ERUJVR19GUkVFOworCQkJYnJlYWs7CisJCWNhc2UgJ3onOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1JFRF9aT05FOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1BPSVNPTjsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCXNsdWJfZGVidWcgfD0gU0xBQl9TVE9SRV9VU0VSOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1RSQUNFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgInNsdWJfZGVidWcgb3B0aW9uICclYycgIgorCQkJCSJ1bmtub3duLiBza2lwcGVkXG4iLCpzdHIpOworCQl9CisJfQorCitjaGVja19zbGFiczoKKwlpZiAoKnN0ciA9PSAnLCcpCiAJCXNsdWJfZGVidWdfc2xhYnMgPSBzdHIgKyAxOworb3V0OgogCXJldHVybiAxOwogfQogCkBAIC0xMDE4LDcgKzEwNzgsNyBAQAogCXZvaWQgKmxhc3Q7CiAJdm9pZCAqcDsKIAotCUJVR19PTihmbGFncyAmIH4oR0ZQX0RNQSB8IEdGUF9MRVZFTF9NQVNLKSk7CisJQlVHX09OKGZsYWdzICYgfihHRlBfRE1BIHwgX19HRlBfWkVSTyB8IEdGUF9MRVZFTF9NQVNLKSk7CiAKIAlpZiAoZmxhZ3MgJiBfX0dGUF9XQUlUKQogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC0xMzM2LDcgKzEzOTYsNyBAQAogCXVuZnJlZXplX3NsYWIocywgcGFnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZsdXNoX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgY3B1KQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgY3B1KQogewogCXNsYWJfbG9jayhwYWdlKTsKIAlkZWFjdGl2YXRlX3NsYWIocywgcGFnZSwgY3B1KTsKQEAgLTEzNDYsNyArMTQwNiw3IEBACiAgKiBGbHVzaCBjcHUgc2xhYi4KICAqIENhbGxlZCBmcm9tIElQSSBoYW5kbGVyIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotc3RhdGljIHZvaWQgX19mbHVzaF9jcHVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX2NwdV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBpbnQgY3B1KQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gcy0+Y3B1X3NsYWJbY3B1XTsKIApAQCAtMTQ4MSw3ICsxNTQxLDcgQEAKICAqIE90aGVyd2lzZSB3ZSBjYW4gc2ltcGx5IHBpY2sgdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIGxvY2tsZXNzIGZyZWUgbGlzdC4KICAqLwogc3RhdGljIHZvaWQgX19hbHdheXNfaW5saW5lICpzbGFiX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpzLAotCQkJCWdmcF90IGdmcGZsYWdzLCBpbnQgbm9kZSwgdm9pZCAqYWRkcikKKwkJZ2ZwX3QgZ2ZwZmxhZ3MsIGludCBub2RlLCB2b2lkICphZGRyKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCXZvaWQgKipvYmplY3Q7CkBAIC0xNDk5LDYgKzE1NTksMTAgQEAKIAkJcGFnZS0+bG9ja2xlc3NfZnJlZWxpc3QgPSBvYmplY3RbcGFnZS0+b2Zmc2V0XTsKIAl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KChnZnBmbGFncyAmIF9fR0ZQX1pFUk8pICYmIG9iamVjdCkpCisJCW1lbXNldChvYmplY3QsIDAsIHMtPm9ianNpemUpOworCiAJcmV0dXJuIG9iamVjdDsKIH0KIApAQCAtMTY4Miw4ICsxNzQ2LDE3IEBACiB7CiAJaW50IG9yZGVyOwogCWludCByZW07CisJaW50IG1pbl9vcmRlciA9IHNsdWJfbWluX29yZGVyOwogCi0JZm9yIChvcmRlciA9IG1heChzbHViX21pbl9vcmRlciwKKwkvKgorCSAqIElmIHdlIHdvdWxkIGNyZWF0ZSB0b28gbWFueSBvYmplY3QgcGVyIHNsYWIgdGhlbiByZWR1Y2UKKwkgKiB0aGUgc2xhYiBvcmRlciBldmVuIGlmIGl0IGdvZXMgYmVsb3cgc2x1Yl9taW5fb3JkZXIuCisJICovCisJd2hpbGUgKG1pbl9vcmRlciA+IDAgJiYKKwkJKFBBR0VfU0laRSA8PCBtaW5fb3JkZXIpID49IE1BWF9PQkpFQ1RTX1BFUl9TTEFCICogc2l6ZSkKKwkJCW1pbl9vcmRlci0tOworCisJZm9yIChvcmRlciA9IG1heChtaW5fb3JkZXIsCiAJCQkJZmxzKG1pbl9vYmplY3RzICogc2l6ZSAtIDEpIC0gUEFHRV9TSElGVCk7CiAJCQlvcmRlciA8PSBtYXhfb3JkZXI7IG9yZGVyKyspIHsKIApAQCAtMTY5Nyw2ICsxNzcwLDkgQEAKIAkJaWYgKHJlbSA8PSBzbGFiX3NpemUgLyBmcmFjdF9sZWZ0b3ZlcikKIAkJCWJyZWFrOwogCisJCS8qIElmIHRoZSBuZXh0IHNpemUgaXMgdG9vIGhpZ2ggdGhlbiBleGl0IG5vdyAqLworCQlpZiAoc2xhYl9zaXplICogMiA+PSBNQVhfT0JKRUNUU19QRVJfU0xBQiAqIHNpemUpCisJCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gb3JkZXI7CkBAIC0xNzc3LDcgKzE4NTMsOSBAQAogCWF0b21pY19sb25nX3NldCgmbi0+bnJfc2xhYnMsIDApOwogCXNwaW5fbG9ja19pbml0KCZuLT5saXN0X2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZuLT5wYXJ0aWFsKTsKKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogCUlOSVRfTElTVF9IRUFEKCZuLT5mdWxsKTsKKyNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKQEAgLTE4MDUsNyArMTg4MywxMCBAQAogCXBhZ2UtPmZyZWVsaXN0ID0gZ2V0X2ZyZWVwb2ludGVyKGttYWxsb2NfY2FjaGVzLCBuKTsKIAlwYWdlLT5pbnVzZSsrOwogCWttYWxsb2NfY2FjaGVzLT5ub2RlW25vZGVdID0gbjsKLQlzZXR1cF9vYmplY3RfZGVidWcoa21hbGxvY19jYWNoZXMsIHBhZ2UsIG4pOworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCisJaW5pdF9vYmplY3Qoa21hbGxvY19jYWNoZXMsIG4sIDEpOworCWluaXRfdHJhY2tpbmcoa21hbGxvY19jYWNoZXMsIG4pOworI2VuZGlmCiAJaW5pdF9rbWVtX2NhY2hlX25vZGUobik7CiAJYXRvbWljX2xvbmdfaW5jKCZuLT5ucl9zbGFicyk7CiAJYWRkX3BhcnRpYWwobiwgcGFnZSk7CkBAIC0xOTgzLDcgKzIwNjQsNyBAQAogCSAqIFRoZSBwYWdlLT5pbnVzZSBmaWVsZCBpcyBvbmx5IDE2IGJpdCB3aWRlISBTbyB3ZSBjYW5ub3QgaGF2ZQogCSAqIG1vcmUgdGhhbiA2NGsgb2JqZWN0cyBwZXIgc2xhYi4KIAkgKi8KLQlpZiAoIXMtPm9iamVjdHMgfHwgcy0+b2JqZWN0cyA+IDY1NTM1KQorCWlmICghcy0+b2JqZWN0cyB8fCBzLT5vYmplY3RzID4gTUFYX09CSkVDVFNfUEVSX1NMQUIpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogCkBAIC0yMDg3LDcgKzIxNjgsNyBAQAogLyoKICAqIFJlbGVhc2UgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGEgc2xhYiBjYWNoZS4KICAqLwotc3RhdGljIGludCBrbWVtX2NhY2hlX2Nsb3NlKHN0cnVjdCBrbWVtX2NhY2hlICpzKQorc3RhdGljIGlubGluZSBpbnQga21lbV9jYWNoZV9jbG9zZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykKIHsKIAlpbnQgbm9kZTsKIApAQCAtMjExNSwxMiArMjE5NiwxMyBAQAogCXMtPnJlZmNvdW50LS07CiAJaWYgKCFzLT5yZWZjb3VudCkgewogCQlsaXN0X2RlbCgmcy0+bGlzdCk7CisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQlpZiAoa21lbV9jYWNoZV9jbG9zZShzKSkKIAkJCVdBUk5fT04oMSk7CiAJCXN5c2ZzX3NsYWJfcmVtb3ZlKHMpOwogCQlrZnJlZShzKTsKLQl9Ci0JdXBfd3JpdGUoJnNsdWJfbG9jayk7CisJfSBlbHNlCisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2Rlc3Ryb3kpOwogCkBAIC0yMTkzLDQ3ICsyMjc1LDkyIEBACiAJcGFuaWMoIkNyZWF0aW9uIG9mIGttYWxsb2Mgc2xhYiAlcyBzaXplPSVkIGZhaWxlZC5cbiIsIG5hbWUsIHNpemUpOwogfQogCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmdldF9zbGFiKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlpbnQgaW5kZXggPSBrbWFsbG9jX2luZGV4KHNpemUpOwotCi0JaWYgKCFpbmRleCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBBbGxvY2F0aW9uIHRvbyBsYXJnZT8gKi8KLQlCVUdfT04oaW5kZXggPCAwKTsKLQogI2lmZGVmIENPTkZJR19aT05FX0RNQQotCWlmICgoZmxhZ3MgJiBTTFVCX0RNQSkpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnM7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICp4OwotCQljaGFyICp0ZXh0OwotCQlzaXplX3QgcmVhbHNpemU7CitzdGF0aWMgbm9pbmxpbmUgc3RydWN0IGttZW1fY2FjaGUgKmRtYV9rbWFsbG9jX2NhY2hlKGludCBpbmRleCwgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CisJc3RydWN0IGttZW1fY2FjaGUgKng7CisJY2hhciAqdGV4dDsKKwlzaXplX3QgcmVhbHNpemU7CiAKLQkJcyA9IGttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF07Ci0JCWlmIChzKQotCQkJcmV0dXJuIHM7CisJcyA9IGttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF07CisJaWYgKHMpCisJCXJldHVybiBzOwogCi0JCS8qIER5bmFtaWNhbGx5IGNyZWF0ZSBkbWEgY2FjaGUgKi8KLQkJeCA9IGttYWxsb2Moa21lbV9zaXplLCBmbGFncyAmIH5TTFVCX0RNQSk7Ci0JCWlmICgheCkKLQkJCXBhbmljKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkbWEgY2FjaGVcbiIpOworCS8qIER5bmFtaWNhbGx5IGNyZWF0ZSBkbWEgY2FjaGUgKi8KKwl4ID0ga21hbGxvYyhrbWVtX3NpemUsIGZsYWdzICYgflNMVUJfRE1BKTsKKwlpZiAoIXgpCisJCXBhbmljKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkbWEgY2FjaGVcbiIpOwogCi0JCWlmIChpbmRleCA8PSBLTUFMTE9DX1NISUZUX0hJR0gpCi0JCQlyZWFsc2l6ZSA9IDEgPDwgaW5kZXg7Ci0JCWVsc2UgewotCQkJaWYgKGluZGV4ID09IDEpCi0JCQkJcmVhbHNpemUgPSA5NjsKLQkJCWVsc2UKLQkJCQlyZWFsc2l6ZSA9IDE5MjsKLQkJfQotCi0JCXRleHQgPSBrYXNwcmludGYoZmxhZ3MgJiB+U0xVQl9ETUEsICJrbWFsbG9jX2RtYS0lZCIsCi0JCQkJKHVuc2lnbmVkIGludClyZWFsc2l6ZSk7Ci0JCXMgPSBjcmVhdGVfa21hbGxvY19jYWNoZSh4LCB0ZXh0LCByZWFsc2l6ZSwgZmxhZ3MpOworCXJlYWxzaXplID0ga21hbGxvY19jYWNoZXNbaW5kZXhdLm9ianNpemU7CisJdGV4dCA9IGthc3ByaW50ZihmbGFncyAmIH5TTFVCX0RNQSwgImttYWxsb2NfZG1hLSVkIiwKKwkJCSh1bnNpZ25lZCBpbnQpcmVhbHNpemUpOworCXMgPSBjcmVhdGVfa21hbGxvY19jYWNoZSh4LCB0ZXh0LCByZWFsc2l6ZSwgZmxhZ3MpOworCWRvd25fd3JpdGUoJnNsdWJfbG9jayk7CisJaWYgKCFrbWFsbG9jX2NhY2hlc19kbWFbaW5kZXhdKSB7CiAJCWttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF0gPSBzOworCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIAkJcmV0dXJuIHM7CiAJfQorCXVwX3dyaXRlKCZzbHViX2xvY2spOworCWttZW1fY2FjaGVfZGVzdHJveShzKTsKKwlyZXR1cm4ga21hbGxvY19jYWNoZXNfZG1hW2luZGV4XTsKK30KKyNlbmRpZgorCisvKgorICogQ29udmVyc2lvbiB0YWJsZSBmb3Igc21hbGwgc2xhYnMgc2l6ZXMgLyA4IHRvIHRoZSBpbmRleCBpbiB0aGUKKyAqIGttYWxsb2MgYXJyYXkuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzbGFicyA8IDE5MiBzaW5jZSB3ZSBoYXZlIG5vbiBwb3dlcgorICogb2YgdHdvIGNhY2hlIHNpemVzIHRoZXJlLiBUaGUgc2l6ZSBvZiBsYXJnZXIgc2xhYnMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKKyAqIGZscy4KKyAqLworc3RhdGljIHM4IHNpemVfaW5kZXhbMjRdID0geworCTMsCS8qIDggKi8KKwk0LAkvKiAxNiAqLworCTUsCS8qIDI0ICovCisJNSwJLyogMzIgKi8KKwk2LAkvKiA0MCAqLworCTYsCS8qIDQ4ICovCisJNiwJLyogNTYgKi8KKwk2LAkvKiA2NCAqLworCTEsCS8qIDcyICovCisJMSwJLyogODAgKi8KKwkxLAkvKiA4OCAqLworCTEsCS8qIDk2ICovCisJNywJLyogMTA0ICovCisJNywJLyogMTEyICovCisJNywJLyogMTIwICovCisJNywJLyogMTI4ICovCisJMiwJLyogMTM2ICovCisJMiwJLyogMTQ0ICovCisJMiwJLyogMTUyICovCisJMiwJLyogMTYwICovCisJMiwJLyogMTY4ICovCisJMiwJLyogMTc2ICovCisJMiwJLyogMTg0ICovCisJMgkvKiAxOTIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2V0X3NsYWIoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCWludCBpbmRleDsKKworCWlmIChzaXplIDw9IDE5MikgeworCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKworCQlpbmRleCA9IHNpemVfaW5kZXhbKHNpemUgLSAxKSAvIDhdOworCX0gZWxzZSB7CisJCWlmIChzaXplID4gS01BTExPQ19NQVhfU0laRSkKKwkJCXJldHVybiBOVUxMOworCisJCWluZGV4ID0gZmxzKHNpemUgLSAxKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwlpZiAodW5saWtlbHkoKGZsYWdzICYgU0xVQl9ETUEpKSkKKwkJcmV0dXJuIGRtYV9rbWFsbG9jX2NhY2hlKGluZGV4LCBmbGFncyk7CisKICNlbmRpZgogCXJldHVybiAma21hbGxvY19jYWNoZXNbaW5kZXhdOwogfQpAQCAtMjI0Miw5ICsyMzY5LDEwIEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBnZXRfc2xhYihzaXplLCBmbGFncyk7CiAKLQlpZiAocykKLQkJcmV0dXJuIHNsYWJfYWxsb2MocywgZmxhZ3MsIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCXJldHVybiBaRVJPX1NJWkVfUFRSOworCWlmIChaRVJPX09SX05VTExfUFRSKHMpKQorCQlyZXR1cm4gczsKKworCXJldHVybiBzbGFiX2FsbG9jKHMsIGZsYWdzLCAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIEVYUE9SVF9TWU1CT0woX19rbWFsbG9jKTsKIApAQCAtMjI1Myw5ICsyMzgxLDEwIEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBnZXRfc2xhYihzaXplLCBmbGFncyk7CiAKLQlpZiAocykKLQkJcmV0dXJuIHNsYWJfYWxsb2MocywgZmxhZ3MsIG5vZGUsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JcmV0dXJuIFpFUk9fU0laRV9QVFI7CisJaWYgKFpFUk9fT1JfTlVMTF9QVFIocykpCisJCXJldHVybiBzOworCisJcmV0dXJuIHNsYWJfYWxsb2MocywgZmxhZ3MsIG5vZGUsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fa21hbGxvY19ub2RlKTsKICNlbmRpZgpAQCAtMjMwNiw3ICsyNDM1LDcgQEAKIAkgKiB0aGlzIGNvbXBhcmlzb24gd291bGQgYmUgdHJ1ZSBmb3IgYWxsICJuZWdhdGl2ZSIgcG9pbnRlcnMKIAkgKiAod2hpY2ggd291bGQgY292ZXIgdGhlIHdob2xlIHVwcGVyIGhhbGYgb2YgdGhlIGFkZHJlc3Mgc3BhY2UpLgogCSAqLwotCWlmICgodW5zaWduZWQgbG9uZyl4IDw9ICh1bnNpZ25lZCBsb25nKVpFUk9fU0laRV9QVFIpCisJaWYgKFpFUk9fT1JfTlVMTF9QVFIoeCkpCiAJCXJldHVybjsKIAogCXBhZ2UgPSB2aXJ0X3RvX2hlYWRfcGFnZSh4KTsKQEAgLTIzOTUsNDMgKzI1MjQsNiBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3Nocmluayk7CiAKLS8qKgotICoga3JlYWxsb2MgLSByZWFsbG9jYXRlIG1lbW9yeS4gVGhlIGNvbnRlbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KLSAqIEBwOiBvYmplY3QgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgZm9yLgotICogQG5ld19zaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBhcmUgcHJlc2VydmVkIHVwIHRvIHRoZQotICogbGVzc2VyIG9mIHRoZSBuZXcgYW5kIG9sZCBzaXplcy4gIElmIEBwIGlzICVOVUxMLCBrcmVhbGxvYygpCi0gKiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBrbWFsbG9jKCkuICBJZiBAc2l6ZSBpcyAwIGFuZCBAcCBpcyBub3QgYQotICogJU5VTEwgcG9pbnRlciwgdGhlIG9iamVjdCBwb2ludGVkIHRvIGlzIGZyZWVkLgotICovCi12b2lkICprcmVhbGxvYyhjb25zdCB2b2lkICpwLCBzaXplX3QgbmV3X3NpemUsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldDsKLQlzaXplX3Qga3M7Ci0KLQlpZiAodW5saWtlbHkoIXAgfHwgcCA9PSBaRVJPX1NJWkVfUFRSKSkKLQkJcmV0dXJuIGttYWxsb2MobmV3X3NpemUsIGZsYWdzKTsKLQotCWlmICh1bmxpa2VseSghbmV3X3NpemUpKSB7Ci0JCWtmcmVlKHApOwotCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKLQl9Ci0KLQlrcyA9IGtzaXplKHApOwotCWlmIChrcyA+PSBuZXdfc2l6ZSkKLQkJcmV0dXJuICh2b2lkICopcDsKLQotCXJldCA9IGttYWxsb2MobmV3X3NpemUsIGZsYWdzKTsKLQlpZiAocmV0KSB7Ci0JCW1lbWNweShyZXQsIHAsIG1pbihuZXdfc2l6ZSwga3MpKTsKLQkJa2ZyZWUocCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGtyZWFsbG9jKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCUJhc2ljIHNldHVwIG9mIHNsYWJzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0NzQsNiArMjU2NiwyNCBAQAogCQljYWNoZXMrKzsKIAl9CiAKKworCS8qCisJICogUGF0Y2ggdXAgdGhlIHNpemVfaW5kZXggdGFibGUgaWYgd2UgaGF2ZSBzdHJhbmdlIGxhcmdlIGFsaWdubWVudAorCSAqIHJlcXVpcmVtZW50cyBmb3IgdGhlIGttYWxsb2MgYXJyYXkuIFRoaXMgaXMgb25seSB0aGUgY2FzZSBmb3IKKwkgKiBtaXBzIGl0IHNlZW1zLiBUaGUgc3RhbmRhcmQgYXJjaGVzIHdpbGwgbm90IGdlbmVyYXRlIGFueSBjb2RlIGhlcmUuCisJICoKKwkgKiBMYXJnZXN0IHBlcm1pdHRlZCBhbGlnbm1lbnQgaXMgMjU2IGJ5dGVzIGR1ZSB0byB0aGUgd2F5IHdlCisJICogaGFuZGxlIHRoZSBpbmRleCBkZXRlcm1pbmF0aW9uIGZvciB0aGUgc21hbGxlciBjYWNoZXMuCisJICoKKwkgKiBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIGNyYXp5IGhhcHBlbnMgaWYgc29tZW9uZSBzdGFydHMgdGlua2VyaW5nCisJICogYXJvdW5kIHdpdGggQVJDSF9LTUFMTE9DX01JTkFMSUdOCisJICovCisJQlVJTERfQlVHX09OKEtNQUxMT0NfTUlOX1NJWkUgPiAyNTYgfHwKKwkJKEtNQUxMT0NfTUlOX1NJWkUgJiAoS01BTExPQ19NSU5fU0laRSAtIDEpKSk7CisKKwlmb3IgKGkgPSA4OyBpIDwgS01BTExPQ19NSU5fU0laRTsgaSArPSA4KQorCQlzaXplX2luZGV4WyhpIC0gMSkgLyA4XSA9IEtNQUxMT0NfU0hJRlRfTE9XOworCiAJc2xhYl9zdGF0ZSA9IFVQOwogCiAJLyogUHJvdmlkZSB0aGUgY29ycmVjdCBrbWFsbG9jIG5hbWVzIG5vdyB0aGF0IHRoZSBjYWNoZXMgYXJlIHVwICovCkBAIC0yNTE5LDcgKzI2MjksNyBAQAogCQlzaXplX3QgYWxpZ24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCXZvaWQgKCpjdG9yKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CiAKIAlpZiAoc2x1Yl9ub21lcmdlIHx8IChmbGFncyAmIFNMVUJfTkVWRVJfTUVSR0UpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTI1MzEsMTAgKzI2NDEsNyBAQAogCWFsaWduID0gY2FsY3VsYXRlX2FsaWdubWVudChmbGFncywgYWxpZ24sIHNpemUpOwogCXNpemUgPSBBTElHTihzaXplLCBhbGlnbik7CiAKLQlsaXN0X2Zvcl9lYWNoKGgsICZzbGFiX2NhY2hlcykgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9Ci0JCQljb250YWluZXJfb2YoaCwgc3RydWN0IGttZW1fY2FjaGUsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKIAkJaWYgKHNsYWJfdW5tZXJnZWFibGUocykpCiAJCQljb250aW51ZTsKIApAQCAtMjU3NywyNSArMjY4NCwyNiBAQAogCQkgKi8KIAkJcy0+b2Jqc2l6ZSA9IG1heChzLT5vYmpzaXplLCAoaW50KXNpemUpOwogCQlzLT5pbnVzZSA9IG1heF90KGludCwgcy0+aW51c2UsIEFMSUdOKHNpemUsIHNpemVvZih2b2lkICopKSk7CisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQlpZiAoc3lzZnNfc2xhYl9hbGlhcyhzLCBuYW1lKSkKIAkJCWdvdG8gZXJyOwotCX0gZWxzZSB7Ci0JCXMgPSBrbWFsbG9jKGttZW1fc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChzICYmIGttZW1fY2FjaGVfb3BlbihzLCBHRlBfS0VSTkVMLCBuYW1lLAorCQlyZXR1cm4gczsKKwl9CisJcyA9IGttYWxsb2Moa21lbV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocykgeworCQlpZiAoa21lbV9jYWNoZV9vcGVuKHMsIEdGUF9LRVJORUwsIG5hbWUsCiAJCQkJc2l6ZSwgYWxpZ24sIGZsYWdzLCBjdG9yKSkgewotCQkJaWYgKHN5c2ZzX3NsYWJfYWRkKHMpKSB7Ci0JCQkJa2ZyZWUocyk7Ci0JCQkJZ290byBlcnI7Ci0JCQl9CiAJCQlsaXN0X2FkZCgmcy0+bGlzdCwgJnNsYWJfY2FjaGVzKTsKLQkJfSBlbHNlCi0JCQlrZnJlZShzKTsKKwkJCXVwX3dyaXRlKCZzbHViX2xvY2spOworCQkJaWYgKHN5c2ZzX3NsYWJfYWRkKHMpKQorCQkJCWdvdG8gZXJyOworCQkJcmV0dXJuIHM7CisJCX0KKwkJa2ZyZWUocyk7CiAJfQogCXVwX3dyaXRlKCZzbHViX2xvY2spOwotCXJldHVybiBzOwogCiBlcnI6Ci0JdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJaWYgKGZsYWdzICYgU0xBQl9QQU5JQykKIAkJcGFuaWMoIkNhbm5vdCBjcmVhdGUgc2xhYmNhY2hlICVzXG4iLCBuYW1lKTsKIAllbHNlCkBAIC0yNjA0LDQ1ICsyNzEyLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9jcmVhdGUpOwogCi12b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZmxhZ3MpCi17Ci0Jdm9pZCAqeDsKLQotCXggPSBzbGFiX2FsbG9jKHMsIGZsYWdzLCAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQlpZiAoeCkKLQkJbWVtc2V0KHgsIDAsIHMtPm9ianNpemUpOwotCXJldHVybiB4OwotfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3phbGxvYyk7Ci0KICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBmb3JfYWxsX3NsYWJzKHZvaWQgKCpmdW5jKShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBpbnQpLCBpbnQgY3B1KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmg7Ci0KLQlkb3duX3JlYWQoJnNsdWJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChoLCAmc2xhYl9jYWNoZXMpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPQotCQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBrbWVtX2NhY2hlLCBsaXN0KTsKLQotCQlmdW5jKHMsIGNwdSk7Ci0JfQotCXVwX3JlYWQoJnNsdWJfbG9jayk7Ci19Ci0KLS8qCi0gKiBWZXJzaW9uIG9mIF9fZmx1c2hfY3B1X3NsYWIgZm9yIHRoZSBjYXNlIHRoYXQgaW50ZXJydXB0cwotICogYXJlIGVuYWJsZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGNwdV9zbGFiX2ZsdXNoKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBpbnQgY3B1KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JX19mbHVzaF9jcHVfc2xhYihzLCBjcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQogLyoKICAqIFVzZSB0aGUgY3B1IG5vdGlmaWVyIHRvIGluc3VyZSB0aGF0IHRoZSBjcHUgc2xhYnMgYXJlIGZsdXNoZWQgd2hlbgogICogbmVjZXNzYXJ5LgpAQCAtMjY1MSwxMyArMjcyMSwyMSBAQAogCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAlsb25nIGNwdSA9IChsb25nKWhjcHU7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgogCWNhc2UgQ1BVX0RFQUQ6CiAJY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCWZvcl9hbGxfc2xhYnMoY3B1X3NsYWJfZmx1c2gsIGNwdSk7CisJCWRvd25fcmVhZCgmc2x1Yl9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCV9fZmx1c2hfY3B1X3NsYWIocywgY3B1KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJfQorCQl1cF9yZWFkKCZzbHViX2xvY2spOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTI2NzQsOCArMjc1Miw4IEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBnZXRfc2xhYihzaXplLCBnZnBmbGFncyk7CiAKLQlpZiAoIXMpCi0JCXJldHVybiBaRVJPX1NJWkVfUFRSOworCWlmIChaRVJPX09SX05VTExfUFRSKHMpKQorCQlyZXR1cm4gczsKIAogCXJldHVybiBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCAtMSwgY2FsbGVyKTsKIH0KQEAgLTI2ODUsMTggKzI3NjMsMTggQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGdldF9zbGFiKHNpemUsIGdmcGZsYWdzKTsKIAotCWlmICghcykKLQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisJaWYgKFpFUk9fT1JfTlVMTF9QVFIocykpCisJCXJldHVybiBzOwogCiAJcmV0dXJuIHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIG5vZGUsIGNhbGxlcik7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19TWVNGUykgJiYgZGVmaW5lZChDT05GSUdfU0xVQl9ERUJVRykKLXN0YXRpYyBpbnQgdmFsaWRhdGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW50IHZhbGlkYXRlX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkJdW5zaWduZWQgbG9uZyAqbWFwKQogewogCXZvaWQgKnA7CiAJdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQlERUNMQVJFX0JJVE1BUChtYXAsIHMtPm9iamVjdHMpOwogCiAJaWYgKCFjaGVja19zbGFiKHMsIHBhZ2UpIHx8CiAJCQkhb25fZnJlZWxpc3QocywgcGFnZSwgTlVMTCkpCkBAIC0yNzE4LDEwICsyNzk2LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIHZhbGlkYXRlX3NsYWJfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9zbGFiX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkJdW5zaWduZWQgbG9uZyAqbWFwKQogewogCWlmIChzbGFiX3RyeWxvY2socGFnZSkpIHsKLQkJdmFsaWRhdGVfc2xhYihzLCBwYWdlKTsKKwkJdmFsaWRhdGVfc2xhYihzLCBwYWdlLCBtYXApOwogCQlzbGFiX3VubG9jayhwYWdlKTsKIAl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTyAiU0xVQiAlczogU2tpcHBlZCBidXN5IHNsYWIgMHglcFxuIiwKQEAgLTI3MzgsNyArMjgxNyw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHZhbGlkYXRlX3NsYWJfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbikKK3N0YXRpYyBpbnQgdmFsaWRhdGVfc2xhYl9ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAorCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCB1bnNpZ25lZCBsb25nICptYXApCiB7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0yNzQ3LDcgKzI4MjcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZuLT5saXN0X2xvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGFnZSwgJm4tPnBhcnRpYWwsIGxydSkgewotCQl2YWxpZGF0ZV9zbGFiX3NsYWIocywgcGFnZSk7CisJCXZhbGlkYXRlX3NsYWJfc2xhYihzLCBwYWdlLCBtYXApOwogCQljb3VudCsrOwogCX0KIAlpZiAoY291bnQgIT0gbi0+bnJfcGFydGlhbCkKQEAgLTI3NTgsNyArMjgzOCw3IEBACiAJCWdvdG8gb3V0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCAmbi0+ZnVsbCwgbHJ1KSB7Ci0JCXZhbGlkYXRlX3NsYWJfc2xhYihzLCBwYWdlKTsKKwkJdmFsaWRhdGVfc2xhYl9zbGFiKHMsIHBhZ2UsIG1hcCk7CiAJCWNvdW50Kys7CiAJfQogCWlmIChjb3VudCAhPSBhdG9taWNfbG9uZ19yZWFkKCZuLT5ucl9zbGFicykpCkBAIC0yNzcxLDE3ICsyODUxLDIzIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2YWxpZGF0ZV9zbGFiX2NhY2hlKHN0cnVjdCBrbWVtX2NhY2hlICpzKQorc3RhdGljIGxvbmcgdmFsaWRhdGVfc2xhYl9jYWNoZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykKIHsKIAlpbnQgbm9kZTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nICptYXAgPSBrbWFsbG9jKEJJVFNfVE9fTE9OR1Mocy0+b2JqZWN0cykgKgorCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlmbHVzaF9hbGwocyk7CiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuID0gZ2V0X25vZGUocywgbm9kZSk7CiAKLQkJY291bnQgKz0gdmFsaWRhdGVfc2xhYl9ub2RlKHMsIG4pOworCQljb3VudCArPSB2YWxpZGF0ZV9zbGFiX25vZGUocywgbiwgbWFwKTsKIAl9CisJa2ZyZWUobWFwKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTI4NzAsMTggKzI5NTYsMTQgQEAKIAkJCWdldF9vcmRlcihzaXplb2Yoc3RydWN0IGxvY2F0aW9uKSAqIHQtPm1heCkpOwogfQogCi1zdGF0aWMgaW50IGFsbG9jX2xvY190cmFjayhzdHJ1Y3QgbG9jX3RyYWNrICp0LCB1bnNpZ25lZCBsb25nIG1heCkKK3N0YXRpYyBpbnQgYWxsb2NfbG9jX3RyYWNrKHN0cnVjdCBsb2NfdHJhY2sgKnQsIHVuc2lnbmVkIGxvbmcgbWF4LCBnZnBfdCBmbGFncykKIHsKIAlzdHJ1Y3QgbG9jYXRpb24gKmw7CiAJaW50IG9yZGVyOwogCi0JaWYgKCFtYXgpCi0JCW1heCA9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbG9jYXRpb24pOwotCiAJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBsb2NhdGlvbikgKiBtYXgpOwogCi0JbCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBvcmRlcik7Ci0KKwlsID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWdzLCBvcmRlcik7CiAJaWYgKCFsKQogCQlyZXR1cm4gMDsKIApAQCAtMjk0Nyw3ICszMDI5LDcgQEAKIAkvKgogCSAqIE5vdCBmb3VuZC4gSW5zZXJ0IG5ldyB0cmFja2luZyBlbGVtZW50LgogCSAqLwotCWlmICh0LT5jb3VudCA+PSB0LT5tYXggJiYgIWFsbG9jX2xvY190cmFjayh0LCAyICogdC0+bWF4KSkKKwlpZiAodC0+Y291bnQgPj0gdC0+bWF4ICYmICFhbGxvY19sb2NfdHJhY2sodCwgMiAqIHQtPm1heCwgR0ZQX0FUT01JQykpCiAJCXJldHVybiAwOwogCiAJbCA9IHQtPmxvYyArIHBvczsKQEAgLTI5OTAsMTEgKzMwNzIsMTIgQEAKIHsKIAlpbnQgbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBpOwotCXN0cnVjdCBsb2NfdHJhY2sgdDsKKwlzdHJ1Y3QgbG9jX3RyYWNrIHQgPSB7IDAsIDAsIE5VTEwgfTsKIAlpbnQgbm9kZTsKIAotCXQuY291bnQgPSAwOwotCXQubWF4ID0gMDsKKwlpZiAoIWFsbG9jX2xvY190cmFjaygmdCwgUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBsb2NhdGlvbiksCisJCQlHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAKIAkvKiBQdXNoIGJhY2sgY3B1IHNsYWJzICovCiAJZmx1c2hfYWxsKHMpOwpAQCAtMzM5OCwxMSArMzQ4MSwxNCBAQAogc3RhdGljIHNzaXplX3QgdmFsaWRhdGVfc3RvcmUoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW5ndGgpCiB7Ci0JaWYgKGJ1ZlswXSA9PSAnMScpCi0JCXZhbGlkYXRlX3NsYWJfY2FjaGUocyk7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gbGVuZ3RoOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKGJ1ZlswXSA9PSAnMScpIHsKKwkJcmV0ID0gdmFsaWRhdGVfc2xhYl9jYWNoZShzKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gbGVuZ3RoOworCX0KKwlyZXR1cm4gcmV0OwogfQogU0xBQl9BVFRSKHZhbGlkYXRlKTsKIApAQCAtMzU1Niw3ICszNjQyLDcgQEAKIAkuZmlsdGVyID0gdWV2ZW50X2ZpbHRlciwKIH07CiAKLWRlY2xfc3Vic3lzKHNsYWIsICZzbGFiX2t0eXBlLCAmc2xhYl91ZXZlbnRfb3BzKTsKK3N0YXRpYyBkZWNsX3N1YnN5cyhzbGFiLCAmc2xhYl9rdHlwZSwgJnNsYWJfdWV2ZW50X29wcyk7CiAKICNkZWZpbmUgSURfU1RSX0xFTkdUSCA2NAogCkBAIC0zNjU0LDcgKzM3NDAsNyBAQAogCXN0cnVjdCBzYXZlZF9hbGlhcyAqbmV4dDsKIH07CiAKLXN0cnVjdCBzYXZlZF9hbGlhcyAqYWxpYXNfbGlzdDsKK3N0YXRpYyBzdHJ1Y3Qgc2F2ZWRfYWxpYXMgKmFsaWFzX2xpc3Q7CiAKIHN0YXRpYyBpbnQgc3lzZnNfc2xhYl9hbGlhcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTM2ODIsNyArMzc2OCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNsYWJfc3lzZnNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CiAJaW50IGVycjsKIAogCWVyciA9IHN1YnN5c3RlbV9yZWdpc3Rlcigmc2xhYl9zdWJzeXMpOwpAQCAtMzY5MywxMCArMzc3OSw3IEBACiAKIAlzbGFiX3N0YXRlID0gU1lTRlM7CiAKLQlsaXN0X2Zvcl9lYWNoKGgsICZzbGFiX2NhY2hlcykgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9Ci0JCQljb250YWluZXJfb2YoaCwgc3RydWN0IGttZW1fY2FjaGUsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKIAkJZXJyID0gc3lzZnNfc2xhYl9hZGQocyk7CiAJCUJVR19PTihlcnIpOwogCX0KZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA1ZjdjZjJhLi42N2RhZWNiIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIC8qCiAgKiBzd2FwcGVyX3NwYWNlIGlzIGEgZmljdGlvbiwgcmV0YWluZWQgdG8gc2ltcGxpZnkgdGhlIHBhdGggdGhyb3VnaAotICogdm1zY2FuJ3Mgc2hyaW5rX2xpc3QsIHRvIG1ha2Ugc3luY19wYWdlIGxvb2sgbmljZXIsIGFuZCB0byBhbGxvdworICogdm1zY2FuJ3Mgc2hyaW5rX3BhZ2VfbGlzdCwgdG8gbWFrZSBzeW5jX3BhZ2UgbG9vayBuaWNlciwgYW5kIHRvIGFsbG93CiAgKiBmdXR1cmUgdXNlIG9mIHJhZGl4X3RyZWUgdGFncyBpbiB0aGUgc3dhcCBjYWNoZS4KICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgc3dhcF9hb3BzID0gewpAQCAtMzM0LDcgKzMzNCw4IEBACiAJCSAqIEdldCBhIG5ldyBwYWdlIHRvIHJlYWQgaW50byBmcm9tIHN3YXAuCiAJCSAqLwogCQlpZiAoIW5ld19wYWdlKSB7Ci0JCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBhZGRyKTsKKwkJCW5ld19wYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSX01PVkFCTEUsCisJCQkJCQkJCXZtYSwgYWRkcik7CiAJCQlpZiAoIW5ld19wYWdlKQogCQkJCWJyZWFrOwkJLyogT3V0IG9mIG1lbW9yeSAqLwogCQl9CmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCBhY2MxNzJjLi43ZmYwYTgxIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTg4NSw3ICs4ODUsNyBAQAogCQkvKgogCQkgKiBTbyB3ZSBjb3VsZCBza2lwIHNlYXJjaGluZyBtbXMgb25jZSBzd2FwIGNvdW50IHdlbnQKIAkJICogdG8gMSwgd2UgZGlkIG5vdCBtYXJrIGFueSBwcmVzZW50IHB0ZXMgYXMgZGlydHk6IG11c3QKLQkJICogbWFyayBwYWdlIGRpcnR5IHNvIHNocmlua19saXN0IHdpbGwgcHJlc2VydmUgaXQuCisJCSAqIG1hcmsgcGFnZSBkaXJ0eSBzbyBzaHJpbmtfcGFnZV9saXN0IHdpbGwgcHJlc2VydmUgaXQuCiAJCSAqLwogCQlTZXRQYWdlRGlydHkocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggNGZiZTFhMi4uZjQ3ZTQ2ZCAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYworKysgYi9tbS90cnVuY2F0ZS5jCkBAIC0xMDAsOSArMTAwLDkgQEAKIAlpZiAoUGFnZVByaXZhdGUocGFnZSkpCiAJCWRvX2ludmFsaWRhdGVwYWdlKHBhZ2UsIDApOwogCisJcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKIAlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKIAlDbGVhclBhZ2VNYXBwZWRUb0Rpc2socGFnZSk7Ci0JcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CS8qIHBhZ2VjYWNoZSByZWYgKi8KIH0KIApAQCAtMjUzLDIxICsyNTMsOCBAQAogfQogRVhQT1JUX1NZTUJPTCh0cnVuY2F0ZV9pbm9kZV9wYWdlcyk7CiAKLS8qKgotICogaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzIC0gSW52YWxpZGF0ZSBhbGwgdGhlIHVubG9ja2VkIHBhZ2VzIG9mIG9uZSBpbm9kZQotICogQG1hcHBpbmc6IHRoZSBhZGRyZXNzX3NwYWNlIHdoaWNoIGhvbGRzIHRoZSBwYWdlcyB0byBpbnZhbGlkYXRlCi0gKiBAc3RhcnQ6IHRoZSBvZmZzZXQgJ2Zyb20nIHdoaWNoIHRvIGludmFsaWRhdGUKLSAqIEBlbmQ6IHRoZSBvZmZzZXQgJ3RvJyB3aGljaCB0byBpbnZhbGlkYXRlIChpbmNsdXNpdmUpCi0gKgotICogVGhpcyBmdW5jdGlvbiBvbmx5IHJlbW92ZXMgdGhlIHVubG9ja2VkIHBhZ2VzLCBpZiB5b3Ugd2FudCB0bwotICogcmVtb3ZlIGFsbCB0aGUgcGFnZXMgb2Ygb25lIGlub2RlLCB5b3UgbXVzdCBjYWxsIHRydW5jYXRlX2lub2RlX3BhZ2VzLgotICoKLSAqIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcygpIHdpbGwgbm90IGJsb2NrIG9uIElPIGFjdGl2aXR5LiBJdCB3aWxsIG5vdAotICogaW52YWxpZGF0ZSBwYWdlcyB3aGljaCBhcmUgZGlydHksIGxvY2tlZCwgdW5kZXIgd3JpdGViYWNrIG9yIG1hcHBlZCBpbnRvCi0gKiBwYWdldGFibGVzLgotICovCi11bnNpZ25lZCBsb25nIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCkKK3Vuc2lnbmVkIGxvbmcgX19pbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIGJvb2wgYmVfYXRvbWljKQogewogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJcGdvZmZfdCBuZXh0ID0gc3RhcnQ7CkBAIC0zMDgsMTcgKzI5NSwzOCBAQAogCQkJCWJyZWFrOwogCQl9CiAJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWlmIChsaWtlbHkoIWJlX2F0b21pYykpCisJCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMgLSBJbnZhbGlkYXRlIGFsbCB0aGUgdW5sb2NrZWQgcGFnZXMgb2Ygb25lIGlub2RlCisgKiBAbWFwcGluZzogdGhlIGFkZHJlc3Nfc3BhY2Ugd2hpY2ggaG9sZHMgdGhlIHBhZ2VzIHRvIGludmFsaWRhdGUKKyAqIEBzdGFydDogdGhlIG9mZnNldCAnZnJvbScgd2hpY2ggdG8gaW52YWxpZGF0ZQorICogQGVuZDogdGhlIG9mZnNldCAndG8nIHdoaWNoIHRvIGludmFsaWRhdGUgKGluY2x1c2l2ZSkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgcmVtb3ZlcyB0aGUgdW5sb2NrZWQgcGFnZXMsIGlmIHlvdSB3YW50IHRvCisgKiByZW1vdmUgYWxsIHRoZSBwYWdlcyBvZiBvbmUgaW5vZGUsIHlvdSBtdXN0IGNhbGwgdHJ1bmNhdGVfaW5vZGVfcGFnZXMuCisgKgorICogaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKCkgd2lsbCBub3QgYmxvY2sgb24gSU8gYWN0aXZpdHkuIEl0IHdpbGwgbm90CisgKiBpbnZhbGlkYXRlIHBhZ2VzIHdoaWNoIGFyZSBkaXJ0eSwgbG9ja2VkLCB1bmRlciB3cml0ZWJhY2sgb3IgbWFwcGVkIGludG8KKyAqIHBhZ2V0YWJsZXMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKQoreworCXJldHVybiBfX2ludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhtYXBwaW5nLCBzdGFydCwgZW5kLCBmYWxzZSk7Cit9CiBFWFBPUlRfU1lNQk9MKGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyk7CiAKIC8qCiAgKiBUaGlzIGlzIGxpa2UgaW52YWxpZGF0ZV9jb21wbGV0ZV9wYWdlKCksIGV4Y2VwdCBpdCBpZ25vcmVzIHRoZSBwYWdlJ3MKICAqIHJlZmNvdW50LiAgV2UgZG8gdGhpcyBiZWNhdXNlIGludmFsaWRhdGVfaW5vZGVfcGFnZXMyKCkgbmVlZHMgc3Ryb25nZXIKICAqIGludmFsaWRhdGlvbiBndWFyYW50ZWVzLCBhbmQgY2Fubm90IGFmZm9yZCB0byBsZWF2ZSBwYWdlcyBiZWhpbmQgYmVjYXVzZQotICogc2hyaW5rX2xpc3QoKSBoYXMgYSB0ZW1wIHJlZiBvbiB0aGVtLCBvciBiZWNhdXNlIHRoZXkncmUgdHJhbnNpZW50bHkgc2l0dGluZwotICogaW4gdGhlIGxydV9jYWNoZV9hZGQoKSBwYWdldmVjcy4KKyAqIHNocmlua19wYWdlX2xpc3QoKSBoYXMgYSB0ZW1wIHJlZiBvbiB0aGVtLCBvciBiZWNhdXNlIHRoZXkncmUgdHJhbnNpZW50bHkKKyAqIHNpdHRpbmcgaW4gdGhlIGxydV9jYWNoZV9hZGQoKSBwYWdldmVjcy4KICAqLwogc3RhdGljIGludAogaW52YWxpZGF0ZV9jb21wbGV0ZV9wYWdlMihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpCmRpZmYgLS1naXQgYS9tbS91dGlsLmMgYi9tbS91dGlsLmMKaW5kZXggYWNlMmFlYS4uNzhmMzc4MyAxMDA2NDQKLS0tIGEvbW0vdXRpbC5jCisrKyBiL21tL3V0aWwuYwpAQCAtNSwyMCArNSw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyoqCi0gKiBfX2t6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCi0gKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICovCi12b2lkICpfX2t6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldCA9IGttYWxsb2NfdHJhY2tfY2FsbGVyKHNpemUsIGZsYWdzKTsKLQlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChfX2t6YWxsb2MpOwotCi0vKgogICoga3N0cmR1cCAtIGFsbG9jYXRlIHNwYWNlIGZvciBhbmQgY29weSBhbiBleGlzdGluZyBzdHJpbmcKICAqCiAgKiBAczogdGhlIHN0cmluZyB0byBkdXBsaWNhdGUKQEAgLTU4LDYgKzQ0LDQwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGttZW1kdXApOwogCisvKioKKyAqIGtyZWFsbG9jIC0gcmVhbGxvY2F0ZSBtZW1vcnkuIFRoZSBjb250ZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuCisgKiBAcDogb2JqZWN0IHRvIHJlYWxsb2NhdGUgbWVtb3J5IGZvci4KKyAqIEBuZXdfc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYXJlIHByZXNlcnZlZCB1cCB0byB0aGUKKyAqIGxlc3NlciBvZiB0aGUgbmV3IGFuZCBvbGQgc2l6ZXMuICBJZiBAcCBpcyAlTlVMTCwga3JlYWxsb2MoKQorICogYmVoYXZlcyBleGFjdGx5IGxpa2Uga21hbGxvYygpLiAgSWYgQHNpemUgaXMgMCBhbmQgQHAgaXMgbm90IGEKKyAqICVOVUxMIHBvaW50ZXIsIHRoZSBvYmplY3QgcG9pbnRlZCB0byBpcyBmcmVlZC4KKyAqLwordm9pZCAqa3JlYWxsb2MoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG5ld19zaXplLCBnZnBfdCBmbGFncykKK3sKKwl2b2lkICpyZXQ7CisJc2l6ZV90IGtzOworCisJaWYgKHVubGlrZWx5KCFuZXdfc2l6ZSkpIHsKKwkJa2ZyZWUocCk7CisJCXJldHVybiBaRVJPX1NJWkVfUFRSOworCX0KKworCWtzID0ga3NpemUocCk7CisJaWYgKGtzID49IG5ld19zaXplKQorCQlyZXR1cm4gKHZvaWQgKilwOworCisJcmV0ID0ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKKwlpZiAocmV0KSB7CisJCW1lbWNweShyZXQsIHAsIG1pbihuZXdfc2l6ZSwga3MpKTsKKwkJa2ZyZWUocCk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGtyZWFsbG9jKTsKKwogLyoKICAqIHN0cm5kdXBfdXNlciAtIGR1cGxpY2F0ZSBhbiBleGlzdGluZyBzdHJpbmcgZnJvbSB1c2VyIHNwYWNlCiAgKgpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IGQzYTljNTMuLjhlMDVhMTEgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTY4LDEyICs2OCwxMiBAQAogCX0gd2hpbGUgKHB1ZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogfQogCi12b2lkIHVubWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSkKK3ZvaWQgdW5tYXBfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXBnZF90ICpwZ2Q7CiAJdW5zaWduZWQgbG9uZyBuZXh0OwotCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhcmVhLT5hZGRyOwotCXVuc2lnbmVkIGxvbmcgZW5kID0gYWRkciArIGFyZWEtPnNpemU7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHI7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgc2l6ZTsKIAogCUJVR19PTihhZGRyID49IGVuZCk7CiAJcGdkID0gcGdkX29mZnNldF9rKGFkZHIpOwpAQCAtODQsNyArODQsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQl2dW5tYXBfcHVkX3JhbmdlKHBnZCwgYWRkciwgbmV4dCk7CiAJfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7Ci0JZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZykgYXJlYS0+YWRkciwgZW5kKTsKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEpCit7CisJdW5tYXBfa2VybmVsX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFyZWEtPmFkZHIsIGFyZWEtPnNpemUpOwogfQogCiBzdGF0aWMgaW50IHZtYXBfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKQEAgLTQyNywxMSArNDMyLDEyIEBACiAJYXJlYS0+bnJfcGFnZXMgPSBucl9wYWdlczsKIAkvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSByZWN1cnNpb24gaXMgc3RyaWN0bHkgYm91bmRlZC4gKi8KIAlpZiAoYXJyYXlfc2l6ZSA+IFBBR0VfU0laRSkgewotCQlwYWdlcyA9IF9fdm1hbGxvY19ub2RlKGFycmF5X3NpemUsIGdmcF9tYXNrLCBQQUdFX0tFUk5FTCwgbm9kZSk7CisJCXBhZ2VzID0gX192bWFsbG9jX25vZGUoYXJyYXlfc2l6ZSwgZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQlQQUdFX0tFUk5FTCwgbm9kZSk7CiAJCWFyZWEtPmZsYWdzIHw9IFZNX1ZQQUdFUzsKIAl9IGVsc2UgewogCQlwYWdlcyA9IGttYWxsb2Nfbm9kZShhcnJheV9zaXplLAotCQkJCShnZnBfbWFzayAmIEdGUF9MRVZFTF9NQVNLKSwKKwkJCQkoZ2ZwX21hc2sgJiBHRlBfTEVWRUxfTUFTSykgfCBfX0dGUF9aRVJPLAogCQkJCW5vZGUpOwogCX0KIAlhcmVhLT5wYWdlcyA9IHBhZ2VzOwpAQCAtNDQwLDcgKzQ0Niw2IEBACiAJCWtmcmVlKGFyZWEpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KGFyZWEtPnBhZ2VzLCAwLCBhcnJheV9zaXplKTsKIAogCWZvciAoaSA9IDA7IGkgPCBhcmVhLT5ucl9wYWdlczsgaSsrKSB7CiAJCWlmIChub2RlIDwgMCkKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggMWJlNWE2My4uZDQxOWUxMCAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTY2LDE3ICs2Niw4IEBACiAJaW50IHN3YXBwaW5lc3M7CiAKIAlpbnQgYWxsX3VucmVjbGFpbWFibGU7Ci19OwogCi0vKgotICogVGhlIGxpc3Qgb2Ygc2hyaW5rZXIgY2FsbGJhY2tzIHVzZWQgYnkgdG8gYXBwbHkgcHJlc3N1cmUgdG8KLSAqIGFnZWFibGUgY2FjaGVzLgotICovCi1zdHJ1Y3Qgc2hyaW5rZXIgewotCXNocmlua2VyX3QJCXNocmlua2VyOwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlpbnQJCQlzZWVrczsJLyogc2Vla3MgdG8gcmVjcmVhdGUgYW4gb2JqICovCi0JbG9uZwkJCW5yOwkvKiBvYmpzIHBlbmRpbmcgZGVsZXRlICovCisJaW50IG9yZGVyOwogfTsKIAogI2RlZmluZSBscnVfdG9fcGFnZShfaGVhZCkgKGxpc3RfZW50cnkoKF9oZWFkKS0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSkpCkBAIC0xMjEsMzQgKzExMiwyNSBAQAogLyoKICAqIEFkZCBhIHNocmlua2VyIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSB2bQogICovCi1zdHJ1Y3Qgc2hyaW5rZXIgKnNldF9zaHJpbmtlcihpbnQgc2Vla3MsIHNocmlua2VyX3QgdGhlc2hyaW5rZXIpCit2b2lkIHJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIpCiB7Ci0gICAgICAgIHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXI7Ci0KLSAgICAgICAgc2hyaW5rZXIgPSBrbWFsbG9jKHNpemVvZigqc2hyaW5rZXIpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKHNocmlua2VyKSB7Ci0JICAgICAgICBzaHJpbmtlci0+c2hyaW5rZXIgPSB0aGVzaHJpbmtlcjsKLQkgICAgICAgIHNocmlua2VyLT5zZWVrcyA9IHNlZWtzOwotCSAgICAgICAgc2hyaW5rZXItPm5yID0gMDsKLQkgICAgICAgIGRvd25fd3JpdGUoJnNocmlua2VyX3J3c2VtKTsKLQkgICAgICAgIGxpc3RfYWRkX3RhaWwoJnNocmlua2VyLT5saXN0LCAmc2hyaW5rZXJfbGlzdCk7Ci0JICAgICAgICB1cF93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwotCX0KLQlyZXR1cm4gc2hyaW5rZXI7CisJc2hyaW5rZXItPm5yID0gMDsKKwlkb3duX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7CisJbGlzdF9hZGRfdGFpbCgmc2hyaW5rZXItPmxpc3QsICZzaHJpbmtlcl9saXN0KTsKKwl1cF93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwogfQotRVhQT1JUX1NZTUJPTChzZXRfc2hyaW5rZXIpOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9zaHJpbmtlcik7CiAKIC8qCiAgKiBSZW1vdmUgb25lCiAgKi8KLXZvaWQgcmVtb3ZlX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIpCit2b2lkIHVucmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICpzaHJpbmtlcikKIHsKIAlkb3duX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7CiAJbGlzdF9kZWwoJnNocmlua2VyLT5saXN0KTsKIAl1cF93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwotCWtmcmVlKHNocmlua2VyKTsKIH0KLUVYUE9SVF9TWU1CT0wocmVtb3ZlX3Nocmlua2VyKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9zaHJpbmtlcik7CiAKICNkZWZpbmUgU0hSSU5LX0JBVENIIDEyOAogLyoKQEAgLTE4NSw3ICsxNjcsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2hyaW5rZXIsICZzaHJpbmtlcl9saXN0LCBsaXN0KSB7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YTsKIAkJdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FuOwotCQl1bnNpZ25lZCBsb25nIG1heF9wYXNzID0gKCpzaHJpbmtlci0+c2hyaW5rZXIpKDAsIGdmcF9tYXNrKTsKKwkJdW5zaWduZWQgbG9uZyBtYXhfcGFzcyA9ICgqc2hyaW5rZXItPnNocmluaykoMCwgZ2ZwX21hc2spOwogCiAJCWRlbHRhID0gKDQgKiBzY2FubmVkKSAvIHNocmlua2VyLT5zZWVrczsKIAkJZGVsdGEgKj0gbWF4X3Bhc3M7CkBAIC0yMTMsOCArMTk1LDggQEAKIAkJCWludCBzaHJpbmtfcmV0OwogCQkJaW50IG5yX2JlZm9yZTsKIAotCQkJbnJfYmVmb3JlID0gKCpzaHJpbmtlci0+c2hyaW5rZXIpKDAsIGdmcF9tYXNrKTsKLQkJCXNocmlua19yZXQgPSAoKnNocmlua2VyLT5zaHJpbmtlcikodGhpc19zY2FuLCBnZnBfbWFzayk7CisJCQlucl9iZWZvcmUgPSAoKnNocmlua2VyLT5zaHJpbmspKDAsIGdmcF9tYXNrKTsKKwkJCXNocmlua19yZXQgPSAoKnNocmlua2VyLT5zaHJpbmspKHRoaXNfc2NhbiwgZ2ZwX21hc2spOwogCQkJaWYgKHNocmlua19yZXQgPT0gLTEpCiAJCQkJYnJlYWs7CiAJCQlpZiAoc2hyaW5rX3JldCA8IG5yX2JlZm9yZSkKQEAgLTQ4MSw3ICs0NjMsOCBAQAogCiAJCXJlZmVyZW5jZWQgPSBwYWdlX3JlZmVyZW5jZWQocGFnZSwgMSk7CiAJCS8qIEluIGFjdGl2ZSB1c2Ugb3IgcmVhbGx5IHVuZnJlZWFibGU/ICBBY3RpdmF0ZSBpdC4gKi8KLQkJaWYgKHJlZmVyZW5jZWQgJiYgcGFnZV9tYXBwaW5nX2ludXNlKHBhZ2UpKQorCQlpZiAoc2MtPm9yZGVyIDw9IFBBR0VfQUxMT0NfQ09TVExZX09SREVSICYmCisJCQkJCXJlZmVyZW5jZWQgJiYgcGFnZV9tYXBwaW5nX2ludXNlKHBhZ2UpKQogCQkJZ290byBhY3RpdmF0ZV9sb2NrZWQ7CiAKICNpZmRlZiBDT05GSUdfU1dBUApAQCAtNTE0LDcgKzQ5Nyw3IEBACiAJCX0KIAogCQlpZiAoUGFnZURpcnR5KHBhZ2UpKSB7Ci0JCQlpZiAocmVmZXJlbmNlZCkKKwkJCWlmIChzYy0+b3JkZXIgPD0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgJiYgcmVmZXJlbmNlZCkKIAkJCQlnb3RvIGtlZXBfbG9ja2VkOwogCQkJaWYgKCFtYXlfZW50ZXJfZnMpCiAJCQkJZ290byBrZWVwX2xvY2tlZDsKQEAgLTU5OCw2ICs1ODEsNTEgQEAKIAlyZXR1cm4gbnJfcmVjbGFpbWVkOwogfQogCisvKiBMUlUgSXNvbGF0aW9uIG1vZGVzLiAqLworI2RlZmluZSBJU09MQVRFX0lOQUNUSVZFIDAJLyogSXNvbGF0ZSBpbmFjdGl2ZSBwYWdlcy4gKi8KKyNkZWZpbmUgSVNPTEFURV9BQ1RJVkUgMQkvKiBJc29sYXRlIGFjdGl2ZSBwYWdlcy4gKi8KKyNkZWZpbmUgSVNPTEFURV9CT1RIIDIJCS8qIElzb2xhdGUgYm90aCBhY3RpdmUgYW5kIGluYWN0aXZlIHBhZ2VzLiAqLworCisvKgorICogQXR0ZW1wdCB0byByZW1vdmUgdGhlIHNwZWNpZmllZCBwYWdlIGZyb20gaXRzIExSVS4gIE9ubHkgdGFrZSB0aGlzIHBhZ2UKKyAqIGlmIGl0IGlzIG9mIHRoZSBhcHByb3ByaWF0ZSBQYWdlQWN0aXZlIHN0YXR1cy4gIFBhZ2VzIHdoaWNoIGFyZSBiZWluZworICogZnJlZWQgZWxzZXdoZXJlIGFyZSBhbHNvIGlnbm9yZWQuCisgKgorICogcGFnZToJcGFnZSB0byBjb25zaWRlcgorICogbW9kZToJb25lIG9mIHRoZSBMUlUgaXNvbGF0aW9uIG1vZGVzIGRlZmluZWQgYWJvdmUKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLXZlIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19pc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCS8qIE9ubHkgdGFrZSBwYWdlcyBvbiB0aGUgTFJVLiAqLworCWlmICghUGFnZUxSVShwYWdlKSkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2hlbiBjaGVja2luZyB0aGUgYWN0aXZlIHN0YXRlLCB3ZSBuZWVkIHRvIGJlIHN1cmUgd2UgYXJlCisJICogZGVhbGluZyB3aXRoIGNvbXBhcmlibGUgYm9vbGVhbiB2YWx1ZXMuICBUYWtlIHRoZSBsb2dpY2FsIG5vdAorCSAqIG9mIGVhY2guCisJICovCisJaWYgKG1vZGUgIT0gSVNPTEFURV9CT1RIICYmICghUGFnZUFjdGl2ZShwYWdlKSAhPSAhbW9kZSkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSAtRUJVU1k7CisJaWYgKGxpa2VseShnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkpIHsKKwkJLyoKKwkJICogQmUgY2FyZWZ1bCBub3QgdG8gY2xlYXIgUGFnZUxSVSB1bnRpbCBhZnRlciB3ZSdyZQorCQkgKiBzdXJlIHRoZSBwYWdlIGlzIG5vdCBiZWluZyBmcmVlZCBlbHNld2hlcmUgLS0gdGhlCisJCSAqIHBhZ2UgcmVsZWFzZSBjb2RlIHJlbGllcyBvbiBpdC4KKwkJICovCisJCUNsZWFyUGFnZUxSVShwYWdlKTsKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogem9uZS0+bHJ1X2xvY2sgaXMgaGVhdmlseSBjb250ZW5kZWQuICBTb21lIG9mIHRoZSBmdW5jdGlvbnMgdGhhdAogICogc2hyaW5rIHRoZSBsaXN0cyBwZXJmb3JtIGJldHRlciBieSB0YWtpbmcgb3V0IGEgYmF0Y2ggb2YgcGFnZXMKQEAgLTYxMiwzOCArNjQwLDkwIEBACiAgKiBAc3JjOglUaGUgTFJVIGxpc3QgdG8gcHVsbCBwYWdlcyBvZmYuCiAgKiBAZHN0OglUaGUgdGVtcCBsaXN0IHRvIHB1dCBwYWdlcyBvbiB0by4KICAqIEBzY2FubmVkOglUaGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2VyZSBzY2FubmVkLgorICogQG9yZGVyOglUaGUgY2FsbGVyJ3MgYXR0ZW1wdGVkIGFsbG9jYXRpb24gb3JkZXIKKyAqIEBtb2RlOglPbmUgb2YgdGhlIExSVSBpc29sYXRpb24gbW9kZXMKICAqCiAgKiByZXR1cm5zIGhvdyBtYW55IHBhZ2VzIHdlcmUgbW92ZWQgb250byAqQGRzdC4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNvbGF0ZV9scnVfcGFnZXModW5zaWduZWQgbG9uZyBucl90b19zY2FuLAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpzcmMsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKLQkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCkKKwkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCwgaW50IG9yZGVyLCBpbnQgbW9kZSkKIHsKIAl1bnNpZ25lZCBsb25nIG5yX3Rha2VuID0gMDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIHNjYW47CiAKIAlmb3IgKHNjYW4gPSAwOyBzY2FuIDwgbnJfdG9fc2NhbiAmJiAhbGlzdF9lbXB0eShzcmMpOyBzY2FuKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0OworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdW5zaWduZWQgbG9uZyBwZm47CisJCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKKwkJdW5zaWduZWQgbG9uZyBwYWdlX3BmbjsKKwkJaW50IHpvbmVfaWQ7CisKIAkJcGFnZSA9IGxydV90b19wYWdlKHNyYyk7CiAJCXByZWZldGNod19wcmV2X2xydV9wYWdlKHBhZ2UsIHNyYywgZmxhZ3MpOwogCiAJCVZNX0JVR19PTighUGFnZUxSVShwYWdlKSk7CiAKLQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7Ci0JCXRhcmdldCA9IHNyYzsKLQkJaWYgKGxpa2VseShnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkpIHsKLQkJCS8qCi0JCQkgKiBCZSBjYXJlZnVsIG5vdCB0byBjbGVhciBQYWdlTFJVIHVudGlsIGFmdGVyIHdlJ3JlCi0JCQkgKiBzdXJlIHRoZSBwYWdlIGlzIG5vdCBiZWluZyBmcmVlZCBlbHNld2hlcmUgLS0gdGhlCi0JCQkgKiBwYWdlIHJlbGVhc2UgY29kZSByZWxpZXMgb24gaXQuCi0JCQkgKi8KLQkJCUNsZWFyUGFnZUxSVShwYWdlKTsKLQkJCXRhcmdldCA9IGRzdDsKKwkJc3dpdGNoIChfX2lzb2xhdGVfbHJ1X3BhZ2UocGFnZSwgbW9kZSkpIHsKKwkJY2FzZSAwOgorCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIGRzdCk7CiAJCQlucl90YWtlbisrOwotCQl9IC8qIGVsc2UgaXQgaXMgYmVpbmcgZnJlZWQgZWxzZXdoZXJlICovCisJCQlicmVhazsKIAotCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCB0YXJnZXQpOworCQljYXNlIC1FQlVTWToKKwkJCS8qIGVsc2UgaXQgaXMgYmVpbmcgZnJlZWQgZWxzZXdoZXJlICovCisJCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwgc3JjKTsKKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCisJCWlmICghb3JkZXIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBBdHRlbXB0IHRvIHRha2UgYWxsIHBhZ2VzIGluIHRoZSBvcmRlciBhbGlnbmVkIHJlZ2lvbgorCQkgKiBzdXJyb3VuZGluZyB0aGUgdGFnIHBhZ2UuICBPbmx5IHRha2UgdGhvc2UgcGFnZXMgb2YKKwkJICogdGhlIHNhbWUgYWN0aXZlIHN0YXRlIGFzIHRoYXQgdGFnIHBhZ2UuICBXZSBtYXkgc2FmZWx5CisJCSAqIHJvdW5kIHRoZSB0YXJnZXQgcGFnZSBwZm4gZG93biB0byB0aGUgcmVxdWVzdGVkIG9yZGVyCisJCSAqIGFzIHRoZSBtZW1fbWFwIGlzIGd1YXJlbnRlZWQgdmFsaWQgb3V0IHRvIE1BWF9PUkRFUiwKKwkJICogd2hlcmUgdGhhdCBwYWdlIGlzIGluIGEgZGlmZmVyZW50IHpvbmUgd2Ugd2lsbCBkZXRlY3QKKwkJICogaXQgZnJvbSBpdHMgem9uZSBpZCBhbmQgYWJvcnQgdGhpcyBibG9jayBzY2FuLgorCQkgKi8KKwkJem9uZV9pZCA9IHBhZ2Vfem9uZV9pZChwYWdlKTsKKwkJcGFnZV9wZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwkJcGZuID0gcGFnZV9wZm4gJiB+KCgxIDw8IG9yZGVyKSAtIDEpOworCQllbmRfcGZuID0gcGZuICsgKDEgPDwgb3JkZXIpOworCQlmb3IgKDsgcGZuIDwgZW5kX3BmbjsgcGZuKyspIHsKKwkJCXN0cnVjdCBwYWdlICpjdXJzb3JfcGFnZTsKKworCQkJLyogVGhlIHRhcmdldCBwYWdlIGlzIGluIHRoZSBibG9jaywgaWdub3JlIGl0LiAqLworCQkJaWYgKHVubGlrZWx5KHBmbiA9PSBwYWdlX3BmbikpCisJCQkJY29udGludWU7CisKKwkJCS8qIEF2b2lkIGhvbGVzIHdpdGhpbiB0aGUgem9uZS4gKi8KKwkJCWlmICh1bmxpa2VseSghcGZuX3ZhbGlkX3dpdGhpbihwZm4pKSkKKwkJCQlicmVhazsKKworCQkJY3Vyc29yX3BhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQkJLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBjcm9zc2VkIGEgem9uZSBib3VuZGFyeS4gKi8KKwkJCWlmICh1bmxpa2VseShwYWdlX3pvbmVfaWQoY3Vyc29yX3BhZ2UpICE9IHpvbmVfaWQpKQorCQkJCWNvbnRpbnVlOworCQkJc3dpdGNoIChfX2lzb2xhdGVfbHJ1X3BhZ2UoY3Vyc29yX3BhZ2UsIG1vZGUpKSB7CisJCQljYXNlIDA6CisJCQkJbGlzdF9tb3ZlKCZjdXJzb3JfcGFnZS0+bHJ1LCBkc3QpOworCQkJCW5yX3Rha2VuKys7CisJCQkJc2NhbisrOworCQkJCWJyZWFrOworCisJCQljYXNlIC1FQlVTWToKKwkJCQkvKiBlbHNlIGl0IGlzIGJlaW5nIGZyZWVkIGVsc2V3aGVyZSAqLworCQkJCWxpc3RfbW92ZSgmY3Vyc29yX3BhZ2UtPmxydSwgc3JjKTsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9CiAKIAkqc2Nhbm5lZCA9IHNjYW47CkBAIC02NTEsNiArNzMxLDI0IEBACiB9CiAKIC8qCisgKiBjbGVhcl9hY3RpdmVfZmxhZ3MoKSBpcyBhIGhlbHBlciBmb3Igc2hyaW5rX2FjdGl2ZV9saXN0KCksIGNsZWFyaW5nCisgKiBhbnkgYWN0aXZlIGJpdHMgZnJvbSB0aGUgcGFnZXMgaW4gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsZWFyX2FjdGl2ZV9mbGFncyhzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlX2xpc3QpCit7CisJaW50IG5yX2FjdGl2ZSA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsIHBhZ2VfbGlzdCwgbHJ1KQorCQlpZiAoUGFnZUFjdGl2ZShwYWdlKSkgeworCQkJQ2xlYXJQYWdlQWN0aXZlKHBhZ2UpOworCQkJbnJfYWN0aXZlKys7CisJCX0KKworCXJldHVybiBucl9hY3RpdmU7Cit9CisKKy8qCiAgKiBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpIGlzIGEgaGVscGVyIGZvciBzaHJpbmtfem9uZSgpLiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyCiAgKiBvZiByZWNsYWltZWQgcGFnZXMKICAqLwpAQCAtNjcxLDExICs3NjksMTggQEAKIAkJdW5zaWduZWQgbG9uZyBucl90YWtlbjsKIAkJdW5zaWduZWQgbG9uZyBucl9zY2FuOwogCQl1bnNpZ25lZCBsb25nIG5yX2ZyZWVkOworCQl1bnNpZ25lZCBsb25nIG5yX2FjdGl2ZTsKIAogCQlucl90YWtlbiA9IGlzb2xhdGVfbHJ1X3BhZ2VzKHNjLT5zd2FwX2NsdXN0ZXJfbWF4LAotCQkJCQkgICAgICZ6b25lLT5pbmFjdGl2ZV9saXN0LAotCQkJCQkgICAgICZwYWdlX2xpc3QsICZucl9zY2FuKTsKLQkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFLCAtbnJfdGFrZW4pOworCQkJICAgICAmem9uZS0+aW5hY3RpdmVfbGlzdCwKKwkJCSAgICAgJnBhZ2VfbGlzdCwgJm5yX3NjYW4sIHNjLT5vcmRlciwKKwkJCSAgICAgKHNjLT5vcmRlciA+IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKT8KKwkJCQkJICAgICBJU09MQVRFX0JPVEggOiBJU09MQVRFX0lOQUNUSVZFKTsKKwkJbnJfYWN0aXZlID0gY2xlYXJfYWN0aXZlX2ZsYWdzKCZwYWdlX2xpc3QpOworCisJCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUsIC1ucl9hY3RpdmUpOworCQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkUsCisJCQkJCQktKG5yX3Rha2VuIC0gbnJfYWN0aXZlKSk7CiAJCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gbnJfc2NhbjsKIAkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAKQEAgLTgyMCw3ICs5MjUsNyBAQAogCWxydV9hZGRfZHJhaW4oKTsKIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAJcGdtb3ZlZCA9IGlzb2xhdGVfbHJ1X3BhZ2VzKG5yX3BhZ2VzLCAmem9uZS0+YWN0aXZlX2xpc3QsCi0JCQkJICAgICZsX2hvbGQsICZwZ3NjYW5uZWQpOworCQkJICAgICZsX2hvbGQsICZwZ3NjYW5uZWQsIHNjLT5vcmRlciwgSVNPTEFURV9BQ1RJVkUpOwogCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gcGdzY2FubmVkOwogCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUsIC1wZ21vdmVkKTsKIAlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKQEAgLTEwMTEsNyArMTExNiw3IEBACiAgKiBob2xkcyBmaWxlc3lzdGVtIGxvY2tzIHdoaWNoIHByZXZlbnQgd3JpdGVvdXQgdGhpcyBtaWdodCBub3Qgd29yaywgYW5kIHRoZQogICogYWxsb2NhdGlvbiBhdHRlbXB0IHdpbGwgZmFpbC4KICAqLwotdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKnpvbmVzLCBnZnBfdCBnZnBfbWFzaykKK3Vuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKip6b25lcywgaW50IG9yZGVyLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlpbnQgcHJpb3JpdHk7CiAJaW50IHJldCA9IDA7CkBAIC0xMDI2LDYgKzExMzEsNyBAQAogCQkuc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVgsCiAJCS5tYXlfc3dhcCA9IDEsCiAJCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKKwkJLm9yZGVyID0gb3JkZXIsCiAJfTsKIAogCWNvdW50X3ZtX2V2ZW50KEFMTE9DU1RBTEwpOwpAQCAtMTEzMSw2ICsxMjM3LDcgQEAKIAkJLm1heV9zd2FwID0gMSwKIAkJLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYLAogCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCisJCS5vcmRlciA9IG9yZGVyLAogCX07CiAJLyoKIAkgKiB0ZW1wX3ByaW9yaXR5IGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIHNjYW5uaW5nIHByaW9yaXR5IGF0IHdoaWNoCkBAIC0xMzE0LDYgKzE0MjEsNyBAQAogCSAqIHRyeWluZyB0byBmcmVlIHRoZSBmaXJzdCBwaWVjZSBvZiBtZW1vcnkgaW4gdGhlIGZpcnN0IHBsYWNlKS4KIAkgKi8KIAl0c2stPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfU1dBUFdSSVRFIHwgUEZfS1NXQVBEOworCXNldF9mcmVlemFibGUoKTsKIAogCW9yZGVyID0gMDsKIAlmb3IgKCA7IDsgKSB7CmRpZmYgLS1naXQgYS9tbS92bXN0YXQuYyBiL21tL3Ztc3RhdC5jCmluZGV4IGVjZWFmNDkuLmZhZGY3OTEgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5jCkBAIC00NzIsNyArNDcyLDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIFRFWFRTX0ZPUl9aT05FUyh4eCkgVEVYVF9GT1JfRE1BKHh4KSBURVhUX0ZPUl9ETUEzMih4eCkgeHggIl9ub3JtYWwiLCBcCi0JCQkJCVRFWFRfRk9SX0hJR0hNRU0oeHgpCisJCQkJCVRFWFRfRk9SX0hJR0hNRU0oeHgpIHh4ICJfbW92YWJsZSIsCiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1zdGF0X3RleHRbXSA9IHsKIAkvKiBab25lZCBWTSBjb3VudGVycyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggMWM4ZjRhMC4uMWY3OGMzZSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtNDc0LDcgKzQ3NSw2IEBACiAKIAlkYWVtb25pemUoImtibmVwZCAlcyIsIGRldi0+bmFtZSk7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKaW5kZXggNjZiZWYxYy4uY2E2MGE0NSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgpAQCAtMjg3LDcgKzI4OCw2IEBACiAKIAlkYWVtb25pemUoImtjbXRwZF9jdHJfJWQiLCBzZXNzaW9uLT5udW0pOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IDQ1MGViMDIuLjY0ZDg5Y2EgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KQEAgLTU0Nyw3ICs1NDgsNiBAQAogCiAJZGFlbW9uaXplKCJraGlkcGRfJTA0eCUwNHgiLCB2ZW5kb3IsIHByb2R1Y3QpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZjdHJsX3dhaXQsIGN1cnJlbnQpOwogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZpbnRyX3dhaXQsIGN1cnJlbnQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCmluZGV4IDUyZTA0ZGYuLmJiNzIyMDcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgpAQCAtMTk0MCw3ICsxOTQxLDYgQEAKIAogCWRhZW1vbml6ZSgia3JmY29tbWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xMCk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlCVF9EQkcoIiIpOwogCmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggOWEwZjVmMi4uZDc0ZDgyMSAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMjc2LDcgKzI3Niw4IEBACiAJCWVyciA9IHNlY3VyaXR5X2ZpbGVfcmVjZWl2ZShmcFtpXSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKLQkJZXJyID0gZ2V0X3VudXNlZF9mZCgpOworCQllcnIgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKE1TR19DTVNHX0NMT0VYRUMgJiBrbXNnLT5tc2dfZmxhZ3MKKwkJCQkJICA/IE9fQ0xPRVhFQyA6IDApOwogCQlpZiAoZXJyIDwgMCkKIAkJCWJyZWFrOwogCQluZXdfZmQgPSBlcnI7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRwb2xsLmMgYi9uZXQvY29yZS9uZXRwb2xsLmMKaW5kZXggZDEyNjRlOS4uZGUxYjI2YSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0cG9sbC5jCisrKyBiL25ldC9jb3JlL25ldHBvbGwuYwpAQCAtMTI0LDEzICsxMjQsNiBAQAogCWlmICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsICZucC0+ZGV2LT5zdGF0ZSkgJiYKIAkgICAgbnBpbmZvLT5wb2xsX293bmVyICE9IHNtcF9wcm9jZXNzb3JfaWQoKSAmJgogCSAgICBzcGluX3RyeWxvY2soJm5waW5mby0+cG9sbF9sb2NrKSkgewotCQkvKiBXaGVuIGNhbGxpbmcgZGV2LT5wb2xsIGZyb20gcG9sbF9uYXBpLCB3ZSBtYXkgZW5kIHVwIGluCi0JCSAqIG5ldGlmX3J4X2NvbXBsZXRlLiBIb3dldmVyLCBvbmx5IHRoZSBDUFUgdG8gd2hpY2ggdGhlCi0JCSAqIGRldmljZSB3YXMgcXVldWVkIGlzIGFsbG93ZWQgdG8gcmVtb3ZlIGl0IGZyb20gcG9sbF9saXN0LgotCQkgKiBTZXR0aW5nIFBPTExfTElTVF9GUk9aRU4gdGVsbHMgbmV0aWZfcnhfY29tcGxldGUKLQkJICogdG8gbGVhdmUgdGhlIE5BUEkgc3RhdGUgYWxvbmUuCi0JCSAqLwotCQlzZXRfYml0KF9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLCAmbnAtPmRldi0+c3RhdGUpOwogCQlucGluZm8tPnJ4X2ZsYWdzIHw9IE5FVFBPTExfUlhfRFJPUDsKIAkJYXRvbWljX2luYygmdHJhcHBlZCk7CiAKQEAgLTEzOCw3ICsxMzEsNiBAQAogCiAJCWF0b21pY19kZWMoJnRyYXBwZWQpOwogCQlucGluZm8tPnJ4X2ZsYWdzICY9IH5ORVRQT0xMX1JYX0RST1A7Ci0JCWNsZWFyX2JpdChfX0xJTktfU1RBVEVfUE9MTF9MSVNUX0ZST1pFTiwgJm5wLT5kZXYtPnN0YXRlKTsKIAkJc3Bpbl91bmxvY2soJm5waW5mby0+cG9sbF9sb2NrKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9wa3RnZW4uYyBiL25ldC9jb3JlL3BrdGdlbi5jCmluZGV4IDc1MjE1MzMuLmJjYTc4N2YgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3BrdGdlbi5jCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC0zNDY1LDYgKzM0NjUsOCBAQAogCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAorCXNldF9mcmVlemFibGUoKTsKKwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXBrdF9kZXYgPSBuZXh0X3RvX3J1bih0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2NtLmMgYi9uZXQvY29yZS9zY20uYwppbmRleCAyOTJhZDhkLi40NGM0ZWMyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zY20uYworKysgYi9uZXQvY29yZS9zY20uYwpAQCAtMjI4LDcgKzIyOCw4IEBACiAJCWVyciA9IHNlY3VyaXR5X2ZpbGVfcmVjZWl2ZShmcFtpXSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKLQkJZXJyID0gZ2V0X3VudXNlZF9mZCgpOworCQllcnIgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKE1TR19DTVNHX0NMT0VYRUMgJiBtc2ctPm1zZ19mbGFncworCQkJCQkgID8gT19DTE9FWEVDIDogMCk7CiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CiAJCW5ld19mZCA9IGVycjsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jCmluZGV4IGNjODExMGIuLmFmYjZjNjYgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMKKysrIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYwpAQCAtMjcxLDggKzI3MSwxMSBAQAogCQkJICovCiAJCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFzc29jaWF0ZTogU2Nhbm5pbmcgZm9yIG5ldHdvcmtzIGZpcnN0LlxuIik7CiAJCQlpZWVlODAyMTFzb2Z0bWFjX25vdGlmeShtYWMtPmRldiwgSUVFRTgwMjExU09GVE1BQ19FVkVOVF9TQ0FOX0ZJTklTSEVELCBpZWVlODAyMTFzb2Z0bWFjX2Fzc29jX25vdGlmeV9zY2FuLCBOVUxMKTsKLQkJCWlmIChpZWVlODAyMTFzb2Z0bWFjX3N0YXJ0X3NjYW4obWFjKSkKKwkJCWlmIChpZWVlODAyMTFzb2Z0bWFjX3N0YXJ0X3NjYW4obWFjKSkgewogCQkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQXNzb2NpYXRlOiBmYWlsZWQgdG8gaW5pdGlhdGUgc2Nhbi4gSXMgZGV2aWNlIHVwP1xuIik7CisJCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOworCQkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgPSAwOworCQkJfQogCQkJZ290byBvdXQ7CiAJCX0gZWxzZSB7CiAJCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDA7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYwppbmRleCA0MmYxMmJkLi44OWRjYzQ4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKQEAgLTQ2LDEwICs0Niw2IEBACiAjaW5jbHVkZSAibmV0bGFiZWxfY2lwc29fdjQuaCIKICNpbmNsdWRlICJuZXRsYWJlbF91c2VyLmgiCiAKLS8qIGRvIG5vdCBkbyBhbnkgYXVkaXRpbmcgaWYgYXVkaXRfZW5hYmxlZCA9PSAwLCBzZWUga2VybmVsL2F1ZGl0LmMgZm9yCi0gKiBkZXRhaWxzICovCi1leHRlcm4gaW50IGF1ZGl0X2VuYWJsZWQ7Ci0KIC8qCiAgKiBOZXRMYWJlbCBORVRMSU5LIFNldHVwIEZ1bmN0aW9ucwogICovCmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggZjQ1MzAxOS4uYjcxMTE0MiAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtMTkzOSw5ICsxOTM5LDcgQEAKIAl0b3RhbF9sZW4gPSBlcnI7CiAKIAljbXNnX3B0ciA9ICh1bnNpZ25lZCBsb25nKW1zZ19zeXMubXNnX2NvbnRyb2w7Ci0JbXNnX3N5cy5tc2dfZmxhZ3MgPSAwOwotCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKLQkJbXNnX3N5cy5tc2dfZmxhZ3MgPSBNU0dfQ01TR19DT01QQVQ7CisJbXNnX3N5cy5tc2dfZmxhZ3MgPSBmbGFncyAmIChNU0dfQ01TR19DTE9FWEVDfE1TR19DTVNHX0NPTVBBVCk7CiAKIAlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCiAJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aC5jIGIvbmV0L3N1bnJwYy9hdXRoLmMKaW5kZXggYWE1NWQwYS4uMjlhOGVjYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoLmMKQEAgLTU0MywxNyArNTQzLDE4IEBACiAJCXRlc3RfYml0KFJQQ0FVVEhfQ1JFRF9VUFRPREFURSwgJmNyZWQtPmNyX2ZsYWdzKSAhPSAwOwogfQogCi0KLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnJwY19jcmVkX3Nocmlua2VyOworc3RhdGljIHN0cnVjdCBzaHJpbmtlciBycGNfY3JlZF9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gcnBjYXV0aF9jYWNoZV9zaHJpbmtlciwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKIAogdm9pZCBfX2luaXQgcnBjYXV0aF9pbml0X21vZHVsZSh2b2lkKQogewogCXJwY19pbml0X2F1dGh1bml4KCk7Ci0JcnBjX2NyZWRfc2hyaW5rZXIgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgcnBjYXV0aF9jYWNoZV9zaHJpbmtlcik7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJnJwY19jcmVkX3Nocmlua2VyKTsKIH0KIAogdm9pZCBfX2V4aXQgcnBjYXV0aF9yZW1vdmVfbW9kdWxlKHZvaWQpCiB7Ci0JaWYgKHJwY19jcmVkX3Nocmlua2VyICE9IE5VTEwpCi0JCXJlbW92ZV9zaHJpbmtlcihycGNfY3JlZF9zaHJpbmtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmcnBjX2NyZWRfc2hyaW5rZXIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCmluZGV4IGJhZjQwOTZkLi5hYmZkYTMzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9hdXRoLmg+CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCmluZGV4IDcxYjlkYWUuLjk4NDNlYWMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCkBAIC0yMzEsNiArMjMxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZ3NzX2FwaV9tZWNoIGdzc19rZXJiZXJvc19tZWNoID0gewogCS5nbV9uYW1lCT0gImtyYjUiLAogCS5nbV9vd25lcgk9IFRISVNfTU9EVUxFLAorCS5nbV9vaWQJCT0gezksICh2b2lkICopIlx4MmFceDg2XHg0OFx4ODZceGY3XHgxMlx4MDFceDAyXHgwMiJ9LAogCS5nbV9vcHMJCT0gJmdzc19rZXJiZXJvc19vcHMsCiAJLmdtX3BmX251bQk9IEFSUkFZX1NJWkUoZ3NzX2tlcmJlcm9zX3BmcyksCiAJLmdtX3BmcwkJPSBnc3Nfa2VyYmVyb3NfcGZzLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKaW5kZXggMjY4NzI1MS4uNjE4MDFhMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jCkBAIC0xOTQsNiArMTk0LDIwIEBACiBFWFBPUlRfU1lNQk9MKGdzc19tZWNoX2dldF9ieV9wc2V1ZG9mbGF2b3IpOwogCiB1MzIKK2dzc19zdmNfdG9fcHNldWRvZmxhdm9yKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgc2VydmljZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBnbS0+Z21fcGZfbnVtOyBpKyspIHsKKwkJaWYgKGdtLT5nbV9wZnNbaV0uc2VydmljZSA9PSBzZXJ2aWNlKSB7CisJCQlyZXR1cm4gZ20tPmdtX3Bmc1tpXS5wc2V1ZG9mbGF2b3I7CisJCX0KKwl9CisJcmV0dXJuIFJQQ19BVVRIX01BWEZMQVZPUjsgLyogaWxsZWdhbCB2YWx1ZSAqLworfQorRVhQT1JUX1NZTUJPTChnc3Nfc3ZjX3RvX3BzZXVkb2ZsYXZvcik7CisKK3UzMgogZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgcHNldWRvZmxhdm9yKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCmluZGV4IDU3N2Q1OTAuLjVkZWI0YjYgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKQEAgLTIxNyw2ICsyMTcsNyBAQAogc3RhdGljIHN0cnVjdCBnc3NfYXBpX21lY2ggZ3NzX3Nwa20zX21lY2ggPSB7CiAJLmdtX25hbWUJPSAic3BrbTMiLAogCS5nbV9vd25lcgk9IFRISVNfTU9EVUxFLAorCS5nbV9vaWQJCT0gezcsICJcMDUzXDAwNlwwMDFcMDA1XDAwNVwwMDFcMDAzIn0sCiAJLmdtX29wcwkJPSAmZ3NzX3Nwa20zX29wcywKIAkuZ21fcGZfbnVtCT0gQVJSQVlfU0laRShnc3Nfc3BrbTNfcGZzKSwKIAkuZ21fcGZzCQk9IGdzc19zcGttM19wZnMsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKaW5kZXggYzA5NDU4My4uNDkwNjk3NSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwpAQCAtNzQzLDYgKzc0MywxNSBAQAogCiBzdGF0aWMgc3RydWN0IGF1dGhfb3BzIHN2Y2F1dGhvcHNfZ3NzOwogCit1MzIgc3ZjYXV0aF9nc3NfZmxhdm9yKHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKQoreworCXN0cnVjdCBnc3NfZG9tYWluICpnZCA9IGNvbnRhaW5lcl9vZihkb20sIHN0cnVjdCBnc3NfZG9tYWluLCBoKTsKKworCXJldHVybiBnZC0+cHNldWRvZmxhdm9yOworfQorCitFWFBPUlRfU1lNQk9MKHN2Y2F1dGhfZ3NzX2ZsYXZvcik7CisKIGludAogc3ZjYXV0aF9nc3NfcmVnaXN0ZXJfcHNldWRvZmxhdm9yKHUzMiBwc2V1ZG9mbGF2b3IsIGNoYXIgKiBuYW1lKQogewpAQCAtOTEzLDEwICs5MjIsMjMgQEAKIAlzdHJ1Y3QgZ3NzX3N2Y19kYXRhICpzdmNkYXRhID0gcnFzdHAtPnJxX2F1dGhfZGF0YTsKIAlzdHJ1Y3QgcnNjICpyc2NpID0gc3ZjZGF0YS0+cnNjaTsKIAlzdHJ1Y3QgcnBjX2dzc193aXJlX2NyZWQgKmdjID0gJnN2Y2RhdGEtPmNsY3JlZDsKKwlpbnQgc3RhdDsKIAotCXJxc3RwLT5ycV9jbGllbnQgPSBmaW5kX2dzc19hdXRoX2RvbWFpbihyc2NpLT5tZWNoY3R4LCBnYy0+Z2Nfc3ZjKTsKLQlpZiAocnFzdHAtPnJxX2NsaWVudCA9PSBOVUxMKQorCS8qCisJICogQSBnc3MgZXhwb3J0IGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGJ5OgorCSAqIAlleHBvcnQJKihzZWM9a3JiNSxydykKKwkgKiBvciBieQorCSAqIAlleHBvcnQgZ3NzL2tyYjUocncpCisJICogVGhlIGxhdHRlciBpcyBkZXByZWNhdGVkOyBidXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMKKwkgKiB0aGUgbmZzZCBjb2RlIHdpbGwgc3RpbGwgZmFsbCBiYWNrIG9uIHRyeWluZyBpdCBpZiB0aGUgZm9ybWVyCisJICogZG9lc24ndCB3b3JrOyBzbyB3ZSB0cnkgdG8gbWFrZSBib3RoIGF2YWlsYWJsZSB0byBuZnNkLCBiZWxvdy4KKwkgKi8KKwlycXN0cC0+cnFfZ3NzY2xpZW50ID0gZmluZF9nc3NfYXV0aF9kb21haW4ocnNjaS0+bWVjaGN0eCwgZ2MtPmdjX3N2Yyk7CisJaWYgKHJxc3RwLT5ycV9nc3NjbGllbnQgPT0gTlVMTCkKIAkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJc3RhdCA9IHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KHJxc3RwKTsKKwlpZiAoc3RhdCA9PSBTVkNfRFJPUCkKKwkJcmV0dXJuIHN0YXQ7CiAJcmV0dXJuIFNWQ19PSzsKIH0KIApAQCAtMTA4OCw3ICsxMTEwLDYgQEAKIAkJCXN2Y19wdXRubChyZXN2LCBHU1NfU0VRX1dJTik7CiAJCQlpZiAoc3ZjX3NhZmVfcHV0bmV0b2JqKHJlc3YsICZyc2lwLT5vdXRfdG9rZW4pKQogCQkJCWdvdG8gZHJvcDsKLQkJCXJxc3RwLT5ycV9jbGllbnQgPSBOVUxMOwogCQl9CiAJCWdvdG8gY29tcGxldGU7CiAJY2FzZSBSUENfR1NTX1BST0NfREVTVFJPWToKQEAgLTExMzEsNiArMTE1Miw4IEBACiAJCX0KIAkJc3ZjZGF0YS0+cnNjaSA9IHJzY2k7CiAJCWNhY2hlX2dldCgmcnNjaS0+aCk7CisJCXJxc3RwLT5ycV9mbGF2b3IgPSBnc3Nfc3ZjX3RvX3BzZXVkb2ZsYXZvcigKKwkJCQkJcnNjaS0+bWVjaGN0eC0+bWVjaF90eXBlLCBnYy0+Z2Nfc3ZjKTsKIAkJcmV0ID0gU1ZDX09LOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMzE3LDYgKzEzNDAsOSBAQAogCWlmIChycXN0cC0+cnFfY2xpZW50KQogCQlhdXRoX2RvbWFpbl9wdXQocnFzdHAtPnJxX2NsaWVudCk7CiAJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJaWYgKHJxc3RwLT5ycV9nc3NjbGllbnQpCisJCWF1dGhfZG9tYWluX3B1dChycXN0cC0+cnFfZ3NzY2xpZW50KTsKKwlycXN0cC0+cnFfZ3NzY2xpZW50ID0gTlVMTDsKIAlpZiAocnFzdHAtPnJxX2NyZWQuY3JfZ3JvdXBfaW5mbykKIAkJcHV0X2dyb3VwX2luZm8ocnFzdHAtPnJxX2NyZWQuY3JfZ3JvdXBfaW5mbyk7CiAJcnFzdHAtPnJxX2NyZWQuY3JfZ3JvdXBfaW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwppbmRleCAwN2RjZDIwLi40MTE0Nzk0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGguaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgpAQCAtNjM3LDcgKzYzOCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50CitpbnQKIHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCiB7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSBzdmNfYWRkcl9pbihycXN0cCk7CkBAIC02NzIsNiArNjczLDggQEAKIAlyZXR1cm4gU1ZDX09LOwogfQogCitFWFBPUlRfU1lNQk9MKHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KTsKKwogc3RhdGljIGludAogc3ZjYXV0aF9udWxsX2FjY2VwdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKmF1dGhwKQogewpAQCAtNzA3LDYgKzcxMCw3IEBACiAJc3ZjX3B1dG5sKHJlc3YsIFJQQ19BVVRIX05VTEwpOwogCXN2Y19wdXRubChyZXN2LCAwKTsKIAorCXJxc3RwLT5ycV9mbGF2b3IgPSBSUENfQVVUSF9OVUxMOwogCXJldHVybiBTVkNfT0s7CiB9CiAKQEAgLTc4NCw2ICs3ODgsNyBAQAogCXN2Y19wdXRubChyZXN2LCBSUENfQVVUSF9OVUxMKTsKIAlzdmNfcHV0bmwocmVzdiwgMCk7CiAKKwlycXN0cC0+cnFfZmxhdm9yID0gUlBDX0FVVEhfVU5JWDsKIAlyZXR1cm4gU1ZDX09LOwogCiBiYWRjcmVkOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCmluZGV4IDI3N2MzMjYuLjI1ZTIwYTIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbAorKysgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKQEAgLTksNyArOSw3IEBACiBteSAkUCA9ICQwOwogJFAgPX4gc0AuKi9AQGc7CiAKLW15ICRWID0gJzAuMDYnOworbXkgJFYgPSAnMC4wNyc7CiAKIHVzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldik7CiAKQEAgLTI0Niw2ICsyNDYsMTkgQEAKIAlyZXR1cm4gJHZldDsKIH0KIAorc3ViIEVSUk9SIHsKKwlwcmludCAiRVJST1I6ICRfWzBdXG4iOworCW91ciAkY2xlYW4gPSAwOworfQorc3ViIFdBUk4geworCXByaW50ICJXQVJOSU5HOiAkX1swXVxuIjsKKwlvdXIgJGNsZWFuID0gMDsKK30KK3N1YiBDSEsgeworCXByaW50ICJDSEVDSzogJF9bMF1cbiI7CisJb3VyICRjbGVhbiA9IDA7Cit9CisKIHN1YiBwcm9jZXNzIHsKIAlteSAkZmlsZW5hbWUgPSBzaGlmdDsKIAlteSBAbGluZXMgPSBAXzsKQEAgLTI1OSw3ICsyNzIsNyBAQAogCW15ICRwcmV2aW5kZW50PTA7CiAJbXkgJHN0YXNoaW5kZW50PTA7CiAKLQlteSAkY2xlYW4gPSAxOworCW91ciAkY2xlYW4gPSAxOwogCW15ICRzaWdub2ZmID0gMDsKIAlteSAkaXNfcGF0Y2ggPSAwOwogCkBAIC0yOTAsOCArMzAzLDExIEBACiAJCQkJCWxvbmdccytpbnR8CiAJCQkJCWxvbmdccytsb25nfAogCQkJCQlsb25nXHMrbG9uZ1xzK2ludHwKKwkJCQkJdTh8dTE2fHUzMnx1NjR8CisJCQkJCXM4fHMxNnxzMzJ8czY0fAogCQkJCQlzdHJ1Y3RccyskSWRlbnR8CiAJCQkJCXVuaW9uXHMrJElkZW50fAorCQkJCQllbnVtXHMrJElkZW50fAogCQkJCQkke0lkZW50fV90CiAJCQkJKQogCQkJCSg/OlxzKyRTcGFyc2UpKgpAQCAtMzA0LDYgKzMyMCwyMyBAQAogCW15ICREZWNsYXJlCT0gcXJ7KD86JFN0b3JhZ2VccyspPyRUeXBlfTsKIAlteSAkQXR0cmlidXRlCT0gcXJ7X19yZWFkX21vc3RseXxfX2luaXR8X19pbml0ZGF0YX07CiAKKwkjIFByZS1zY2FuIHRoZSBwYXRjaCBsb29raW5nIGZvciBhbnkgX19zZXR1cCBkb2N1bWVudGF0aW9uLgorCW15IEBzZXR1cF9kb2NzID0gKCk7CisJbXkgJHNldHVwX2RvY3MgPSAwOworCWZvcmVhY2ggbXkgJGxpbmUgKEBsaW5lcykgeworCQlpZiAoJGxpbmU9fi9eXCtcK1wrXHMrKFxTKykvKSB7CisJCQkkc2V0dXBfZG9jcyA9IDA7CisJCQlpZiAoJDEgPX4gbUBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCRAKSB7CisJCQkJJHNldHVwX2RvY3MgPSAxOworCQkJfQorCQkJbmV4dDsKKwkJfQorCisJCWlmICgkc2V0dXBfZG9jcyAmJiAkbGluZSA9fiAvXlwrLykgeworCQkJcHVzaChAc2V0dXBfZG9jcywgJGxpbmUpOworCQl9CisJfQorCiAJZm9yZWFjaCBteSAkbGluZSAoQGxpbmVzKSB7CiAJCSRsaW5lbnIrKzsKIApAQCAtMzY5LDMwICs0MDIsNDIgQEAKIAkJJGhlcmUgLj0gIkZJTEU6ICRyZWFsZmlsZTokcmVhbGxpbmU6IiBpZiAoJHJlYWxjbnQgIT0gMCk7CiAKIAkJbXkgJGhlcmVsaW5lID0gIiRoZXJlXG4kbGluZVxuIjsKLQkJbXkgJGhlcmVjdXJyID0gIiRoZXJlXG4kbGluZVxuXG4iOwotCQlteSAkaGVyZXByZXYgPSAiJGhlcmVcbiRwcmV2bGluZVxuJGxpbmVcblxuIjsKKwkJbXkgJGhlcmVjdXJyID0gIiRoZXJlXG4kbGluZVxuIjsKKwkJbXkgJGhlcmVwcmV2ID0gIiRoZXJlXG4kcHJldmxpbmVcbiRsaW5lXG4iOwogCiAjY2hlY2sgdGhlIHBhdGNoIGZvciBhIHNpZ25vZmY6CiAJCWlmICgkbGluZSA9fiAvXlxzKnNpZ25lZC1vZmYtYnk6L2kpIHsKIAkJCSMgVGhpcyBpcyBhIHNpZ25vZmYsIGlmIHVnbHksIHNvIGRvIG5vdCBkb3VibGUgcmVwb3J0LgogCQkJJHNpZ25vZmYrKzsKIAkJCWlmICghKCRsaW5lID1+IC9eXHMqU2lnbmVkLW9mZi1ieTovKSkgewotCQkJCXByaW50ICJTaWduZWQtb2ZmLWJ5OiBpcyB0aGUgcHJlZmVycmVkIGZvcm1cbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlXQVJOKCJTaWduZWQtb2ZmLWJ5OiBpcyB0aGUgcHJlZmVycmVkIGZvcm1cbiIgLgorCQkJCQkkaGVyZWN1cnIpOwogCQkJfQogCQkJaWYgKCRsaW5lID1+IC9eXHMqc2lnbmVkLW9mZi1ieTpcUy9pKSB7Ci0JCQkJcHJpbnQgIm5lZWQgc3BhY2UgYWZ0ZXIgU2lnbmVkLW9mZi1ieTpcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlXQVJOKCJuZWVkIHNwYWNlIGFmdGVyIFNpZ25lZC1vZmYtYnk6XG4iIC4KKwkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIENoZWNrIGZvciB3cmFwcGFnZSB3aXRoaW4gYSB2YWxpZCBodW5rIG9mIHRoZSBmaWxlCiAJCWlmICgkcmVhbGNudCAhPSAwICYmICRsaW5lICF+IG17Xig/OlwrfC18IHwkKX0pIHsKLQkJCXByaW50ICJwYXRjaCBzZWVtcyB0byBiZSBjb3JydXB0IChsaW5lIHdyYXBwZWQ/KSBbJHJlYWxjbnRdXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoInBhdGNoIHNlZW1zIHRvIGJlIGNvcnJ1cHQgKGxpbmUgd3JhcHBlZD8pXG4iIC4KKwkJCQkkaGVyZWN1cnIpOworCQl9CisKKyMgVVRGLTggcmVnZXggZm91bmQgYXQgaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9xdWVzdGlvbnMvcWEtZm9ybXMtdXRmLTguZW4ucGhwCisJCWlmICgoJHJlYWxmaWxlID1+IC9eJC8gfHwgJGxpbmUgPX4gL15cKy8pICYmCisJCSAgICAgISgkbGluZSA9fiBtL14oCisJCQkJW1x4MDlceDBBXHgwRFx4MjAtXHg3RV0gICAgICAgICAgICAgICMgQVNDSUkKKwkJCQl8IFtceEMyLVx4REZdW1x4ODAtXHhCRl0gICAgICAgICAgICAgIyBub24tb3ZlcmxvbmcgMi1ieXRlCisJCQkJfCAgXHhFMFtceEEwLVx4QkZdW1x4ODAtXHhCRl0gICAgICAgICMgZXhjbHVkaW5nIG92ZXJsb25ncworCQkJCXwgW1x4RTEtXHhFQ1x4RUVceEVGXVtceDgwLVx4QkZdezJ9ICAjIHN0cmFpZ2h0IDMtYnl0ZQorCQkJCXwgIFx4RURbXHg4MC1ceDlGXVtceDgwLVx4QkZdICAgICAgICAjIGV4Y2x1ZGluZyBzdXJyb2dhdGVzCisJCQkJfCAgXHhGMFtceDkwLVx4QkZdW1x4ODAtXHhCRl17Mn0gICAgICMgcGxhbmVzIDEtMworCQkJCXwgW1x4RjEtXHhGM11bXHg4MC1ceEJGXXszfSAgICAgICAgICAjIHBsYW5lcyA0LTE1CisJCQkJfCAgXHhGNFtceDgwLVx4OEZdW1x4ODAtXHhCRl17Mn0gICAgICMgcGxhbmUgMTYKKwkJCQkpKiQveCApKSB7CisJCQlFUlJPUigiSW52YWxpZCBVVEYtOFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogI2lnbm9yZSBsaW5lcyBiZWluZyByZW1vdmVkCkBAIC00MDMsMTYgKzQ0OCwxMiBAQAogCiAjdHJhaWxpbmcgd2hpdGVzcGFjZQogCQlpZiAoJGxpbmUgPX4gL15cKy4qXFNccyskLyB8fCAkbGluZSA9fiAvXlwrXHMrJC8pIHsKLQkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG5cbiI7Ci0JCQlwcmludCAidHJhaWxpbmcgd2hpdGVzcGFjZVxuIjsKLQkJCXByaW50ICIkaGVyZXZldCI7Ci0JCQkkY2xlYW4gPSAwOworCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRsaW5lKSAuICJcbiI7CisJCQlFUlJPUigidHJhaWxpbmcgd2hpdGVzcGFjZVxuIiAuICRoZXJldmV0KTsKIAkJfQogIzgwIGNvbHVtbiBsaW1pdAogCQlpZiAoJGxpbmUgPX4gL15cKy8gJiYgISgkcHJldmxpbmU9fi9cL1wqXCovKSAmJiAkbGVuZ3RoID4gODApIHsKLQkJCXByaW50ICJsaW5lIG92ZXIgODAgY2hhcmFjdGVyc1xuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCVdBUk4oImxpbmUgb3ZlciA4MCBjaGFyYWN0ZXJzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIHdlIGFyZSBpbiBhIHZhbGlkIHNvdXJjZSBmaWxlICouW2hjXSBpZiBub3QgdGhlbiBpZ25vcmUgdGhpcyBodW5rCkBAIC00MjEsMTAgKzQ2Miw4IEBACiAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGFueSB0YWJzIG11c3QgY29tZSBmaXJzdCBhbmQgYW55dGhpbmcKICMgbW9yZSB0aGFuIDggbXVzdCB1c2UgdGFicy4KIAkJaWYgKCRsaW5lPX4vXlwrXHMqIFx0XHMqXFMvIG9yICRsaW5lPX4vXlwrXHMqICAgICAgICBccyovKSB7Ci0JCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJGxpbmUpIC4gIlxuXG4iOwotCQkJcHJpbnQgInVzZSB0YWJzIG5vdCBzcGFjZXNcbiI7Ci0JCQlwcmludCAiJGhlcmV2ZXQiOwotCQkJJGNsZWFuID0gMDsKKwkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG4iOworCQkJRVJST1IoInVzZSB0YWJzIG5vdCBzcGFjZXNcbiIgLiAkaGVyZXZldCk7CiAJCX0KIAogCQkjCkBAIC00NjMsOSArNTAyLDI3IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKCRlcnIgbmUgJycpIHsKLQkJCQlwcmludCAic3dpdGNoIGFuZCBjYXNlIHNob3VsZCBiZSBhdCB0aGUgc2FtZSBpbmRlbnRcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlXG4kbGluZVxuJGVyclxuIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUVSUk9SKCJzd2l0Y2ggYW5kIGNhc2Ugc2hvdWxkIGJlIGF0IHRoZSBzYW1lIGluZGVudFxuJGhlcmVsaW5lXG4kZXJyXG4iKTsKKwkJCX0KKwkJfQorCisjIGlmL3doaWxlL2V0YyBicmFjZSBkbyBub3QgZ28gb24gbmV4dCBsaW5lLCB1bmxlc3MgZGVmaW5pbmcgYSBkbyB3aGlsZSBsb29wLAorIyBvciBpZiB0aGF0IGJyYWNlIG9uIHRoZSBuZXh0IGxpbmUgaXMgZm9yIHNvbWV0aGluZyBlbHNlCisJCWlmICgkbGluZSA9fiAvXGIoPzooaWZ8d2hpbGV8Zm9yfHN3aXRjaClccypcKHxkb1xifGVsc2VcYikvICYmICRsaW5lICF+IC9eLiMvKSB7CisJCQlteSBAY3R4ID0gY3R4X3N0YXRlbWVudCgkbGluZW5yLCAkcmVhbGNudCk7CisJCQlteSAkY3R4X2xuID0gJGxpbmVuciArICQjY3R4ICsgMTsKKwkJCW15ICRjdHhfY250ID0gJHJlYWxjbnQgLSAkI2N0eCAtIDE7CisJCQlteSAkY3R4ID0gam9pbigiXG4iLCBAY3R4KTsKKworCQkJd2hpbGUgKCRjdHhfY250ID4gMCAmJiAkbGluZXNbJGN0eF9sbiAtIDFdID1+IC9eLS8pIHsKKwkJCQkkY3R4X2xuKys7CisJCQkJJGN0eF9jbnQtLTsKKwkJCX0KKwkJCSMjd2FybiAibGluZTwkbGluZT5cbmN0eDwkY3R4PlxubmV4dDwkbGluZXNbJGN0eF9sbiAtIDFdPiI7CisKKwkJCWlmICgkY3R4ICF+IC97XHMqLyAmJiAkY3R4X2NudCA+IDAgJiYgJGxpbmVzWyRjdHhfbG4gLSAxXSA9fiAvXlwrXHMqey8pIHsKKwkJCQlFUlJPUigiVGhhdCB7IHNob3VsZCBiZSBvbiB0aGUgcHJldmlvdXMgbGluZVxuIiAuCisJCQkJCSIkaGVyZVxuJGN0eFxuJGxpbmVzWyRjdHhfbG4gLSAxXSIpOwogCQkJfQogCQl9CiAKQEAgLTQ3NCw5ICs1MzEsNyBAQAogCiAjIFRFU1Q6IGFsbG93IGRpcmVjdCB0ZXN0aW5nIG9mIHRoZSB0eXBlIG1hdGNoZXIuCiAJCWlmICgkdHN0X3R5cGUgJiYgJGxpbmUgPX4gL14uJERlY2xhcmUkLykgewotCQkJcHJpbnQgIlRFU1Q6IGlzIHR5cGUgJERlY2xhcmVcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiVEVTVDogaXMgdHlwZSAkRGVjbGFyZVxuIiAuICRoZXJlY3Vycik7CiAJCQluZXh0OwogCQl9CiAKQEAgLTQ4OCw5ICs1NDMsOCBAQAogCQlpZiAoJHJhd2xpbmUgPX4gbXteLiNccyppbmNsdWRlXHMrWzwiXSguKilbIj5dfSkgewogCQkJbXkgJHBhdGggPSAkMTsKIAkJCWlmICgkcGF0aCA9fiBtey8vfSkgewotCQkJCXByaW50ICJtYWxmb3JtZWQgI2luY2x1ZGUgZmlsZW5hbWVcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlFUlJPUigibWFsZm9ybWVkICNpbmNsdWRlIGZpbGVuYW1lXG4iIC4KKwkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJCSMgU2FuaXRpc2UgdGhpcyBzcGVjaWFsIGZvcm0gb2Ygc3RyaW5nLgogCQkJJHBhdGggPSAnWCcgeCBsZW5ndGgoJHBhdGgpOwpAQCAtNDk5LDkgKzU1Myw3IEBACiAKICMgbm8gQzk5IC8vIGNvbW1lbnRzCiAJCWlmICgkbGluZSA9fiBtey8vfSkgewotCQkJcHJpbnQgImRvIG5vdCB1c2UgQzk5IC8vIGNvbW1lbnRzXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoImRvIG5vdCB1c2UgQzk5IC8vIGNvbW1lbnRzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCQkjIFJlbW92ZSBDOTkgY29tbWVudHMuCiAJCSRsaW5lID1+IHNALy8uKkBAOwpAQCAtNTE0LDQ5ICs1NjYsNDAgQEAKIAkJCSAgICgkcHJldmxpbmUgIX4gL15cK30vKSAmJgogCQkJICAgKCRwcmV2bGluZSAhfiAvXiB9LykgJiYKIAkJCSAgICgkcHJldmxpbmUgIX4gL1xzJG5hbWUoPzpccyskQXR0cmlidXRlKT9ccyooPzo7fD0pLykpIHsKLQkJCQlwcmludCAiRVhQT1JUX1NZTUJPTChmb28pOyBzaG91bGQgaW1tZWRpYXRlbHkgZm9sbG93IGl0cyBmdW5jdGlvbi92YXJpYWJsZVxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCVdBUk4oIkVYUE9SVF9TWU1CT0woZm9vKTsgc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyBpdHMgZnVuY3Rpb24vdmFyaWFibGVcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgY2hlY2sgZm9yIHN0YXRpYyBpbml0aWFsaXNlcnMuCiAJCWlmICgkbGluZT1+L1xzKnN0YXRpY1xzLio9XHMrKDB8TlVMTCk7LykgewotCQkJcHJpbnQgImRvIG5vdCBpbml0aWFsaXNlIHN0YXRpY3MgdG8gMCBvciBOVUxMXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoImRvIG5vdCBpbml0aWFsaXNlIHN0YXRpY3MgdG8gMCBvciBOVUxMXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgZm9yIG5ldyB0eXBlZGVmcywgb25seSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCBzcGFyc2UgYW5ub3RhdGlvbnMKICMgbWFrZSBzZW5zZS4KIAkJaWYgKCRsaW5lID1+IC9cYnR5cGVkZWZccy8gJiYKLQkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzK1woXHMqJElkZW50XHMqXClccypcKC8gJiYKKwkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzK1woXHMqXCokSWRlbnRccypcKVxzKlwoLyAmJgogCQkgICAgJGxpbmUgIX4gL1xiX19iaXR3aXNlKD86X198KVxiLykgewotCQkJcHJpbnQgImRvIG5vdCBhZGQgbmV3IHR5cGVkZWZzXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJV0FSTigiZG8gbm90IGFkZCBuZXcgdHlwZWRlZnNcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgKiBnb2VzIG9uIHZhcmlhYmxlIG5vdCBvbiB0eXBlCiAJCWlmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGUoXCorKSg/OlxzK2NvbnN0KT9cKX0pIHsKLQkJCXByaW50ICJcIihmb28kMSlcIiBzaG91bGQgYmUgXCIoZm9vICQxKVwiXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIlwiKGZvbyQxKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiIgLgorCQkJCSRoZXJlY3Vycik7CiAKIAkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcKCROb25wdHJUeXBlXHMrKFwqKykoPyFccytjb25zdClccytcKX0pIHsKLQkJCXByaW50ICJcIihmb28gJDEgKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiXCIoZm9vICQxIClcIiBzaG91bGQgYmUgXCIoZm9vICQxKVwiXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCiAJCX0gZWxzaWYgKCRsaW5lID1+IG17JE5vbnB0clR5cGUoXCorKSg/OlxzK2NvbnN0KT9ccytbQS1aYS16XGRfXSt9KSB7Ci0JCQlwcmludCAiXCJmb28kMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJcImZvbyQxIGJhclwiIHNob3VsZCBiZSBcImZvbyAkMWJhclwiXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCiAJCX0gZWxzaWYgKCRsaW5lID1+IG17JE5vbnB0clR5cGVccysoXCorKSg/IVxzK2NvbnN0KVxzK1tBLVphLXpcZF9dK30pIHsKLQkJCXByaW50ICJcImZvbyAkMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJcImZvbyAkMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAkJfQogCiAjICMgbm8gQlVHKCkgb3IgQlVHX09OKCkKQEAgLTU4NSw5ICs2MjgsNyBAQAogCQkJCX0KIAkJCX0KIAkJCWlmICgkb2sgPT0gMCkgewotCQkJCXByaW50ICJwcmludGsoKSBzaG91bGQgaW5jbHVkZSBLRVJOXyBmYWNpbGl0eSBsZXZlbFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCVdBUk4oInByaW50aygpIHNob3VsZCBpbmNsdWRlIEtFUk5fIGZhY2lsaXR5IGxldmVsXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCkBAIC01OTUsOSArNjM2LDcgQEAKICMgb3IgaWYgY2xvc2VkIG9uIHNhbWUgbGluZQogCQlpZiAoKCRsaW5lPX4vJFR5cGVccypbQS1aYS16XGRfXStcKC4qXCkuKiB7LykgYW5kCiAJCSAgICAhKCRsaW5lPX4vXCNkZWZpbmUuKmRvXHN7LykgYW5kICEoJGxpbmU9fi99LykpIHsKLQkJCXByaW50ICJicmFjZXMgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBnbyBvbiB0aGUgbmV4dCBsaW5lXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIm9wZW4gYnJhY2UgJ3snIGZvbGxvd2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZ28gb24gdGhlIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBDaGVjayBvcGVyYXRvciBzcGFjaW5nLgpAQCAtNjMzLDI3ICs2NzIsMjcgQEAKIAkJCQl9CiAKIAkJCQkjIFBpY2sgdXAgdGhlIHByZWNlZWRpbmcgYW5kIHN1Y2NlZWRpbmcgY2hhcmFjdGVycy4KLQkJCQlteSAkY2EgPSBzdWJzdHIoJG9wbGluZSwgJG9mZiAtIDEsIDEpOworCQkJCW15ICRjYSA9IHN1YnN0cigkb3BsaW5lLCAwLCAkb2ZmKTsKIAkJCQlteSAkY2MgPSAnJzsKIAkJCQlpZiAobGVuZ3RoKCRvcGxpbmUpID49ICgkb2ZmICsgbGVuZ3RoKCRlbGVtZW50c1skbiArIDFdKSkpIHsKIAkJCQkJJGNjID0gc3Vic3RyKCRvcGxpbmUsICRvZmYgKyBsZW5ndGgoJGVsZW1lbnRzWyRuICsgMV0pKTsKIAkJCQl9CisJCQkJbXkgJGNiID0gIiRjYSQ7JGNjIjsKIAogCQkJCW15ICRjdHggPSAiJHthfXgke2N9IjsKIAogCQkJCW15ICRhdCA9ICIoY3R4OiRjdHgpIjsKIAogCQkJCW15ICRwdHIgPSAoIiAiIHggJG9mZikgLiAiXiI7Ci0JCQkJbXkgJGhlcmVwdHIgPSAiJGhlcmVsaW5lJHB0clxuXG4iOworCQkJCW15ICRoZXJlcHRyID0gIiRoZXJlbGluZSRwdHJcbiI7CiAKIAkJCQkjI3ByaW50ICI8JHMxOiRvcDokczI+IDwkZWxlbWVudHNbJG5dOiRlbGVtZW50c1skbiArIDFdOiRlbGVtZW50c1skbiArIDJdPlxuIjsKIAogCQkJCSMgOyBzaG91bGQgaGF2ZSBlaXRoZXIgdGhlIGVuZCBvZiBsaW5lIG9yIGEgc3BhY2Ugb3IgXCBhZnRlciBpdAogCQkJCWlmICgkb3AgZXEgJzsnKSB7Ci0JCQkJCWlmICgkY3R4ICF+IC8ueFtXRV0vICYmICRjYyAhfiAvXlxcLykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJaWYgKCRjdHggIX4gLy54W1dFQl0vICYmICRjYyAhfiAvXlxcLyAmJgorCQkJCQkgICAgJGNjICF+IC9eOy8pIHsKKwkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIC8vIGlzIGEgY29tbWVudApAQCAtNjYyLDQzICs3MDEsMzEgQEAKIAkJCQkjIC0+IHNob3VsZCBoYXZlIG5vIHNwYWNlcwogCQkJCX0gZWxzaWYgKCRvcCBlcSAnLT4nKSB7CiAJCQkJCWlmICgkY3R4ID1+IC9XeC58LnhXLykgewotCQkJCQkJcHJpbnQgIm5vIHNwYWNlcyBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJubyBzcGFjZXMgYXJvdW5kIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjICwgbXVzdCBoYXZlIGEgc3BhY2Ugb24gdGhlIHJpZ2h0LgogCQkJCX0gZWxzaWYgKCRvcCBlcSAnLCcpIHsKIAkJCQkJaWYgKCRjdHggIX4gLy54V3wueEUvICYmICRjYyAhfiAvXn0vKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgdW5hcnkgISBhbmQgdW5hcnkgfiBhcmUgYWxsb3dlZCBubyBzcGFjZSBvbiB0aGUgcmlnaHQKIAkJCQl9IGVsc2lmICgkb3AgZXEgJyEnIG9yICRvcCBlcSAnficpIHsKIAkJCQkJaWYgKCRjdHggIX4gL1tXT0VCXXguLykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAkJCQkJaWYgKCRjdHggPX4gLy54Vy8pIHsKLQkJCQkJCXByaW50ICJubyBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5vIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIHVuYXJ5ICsrIGFuZCB1bmFyeSAtLSBhcmUgYWxsb3dlZCBubyBzcGFjZSBvbiBvbmUgc2lkZS4KIAkJCQl9IGVsc2lmICgkb3AgZXEgJysrJyBvciAkb3AgZXEgJy0tJykgewogCQkJCQlpZiAoJGN0eCAhfiAvW1dPQl14W15XXS8gJiYgJGN0eCAhfiAvW15XXXhbV09CRV0vKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBvbmUgc2lkZSBvZiB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2Ugb25lIHNpZGUgb2YgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAkJCQkJaWYgKCRjdHggPX4gL1d4Li8gJiYgJGNjID1+IC9eOy8pIHsKLQkJCQkJCXByaW50ICJubyBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJubyBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgJiBpcyBib3RoIHVuYXJ5IGFuZCBiaW5hcnkKQEAgLTcxNSw5ICs3NDIsNyBAQAogCQkJCSMKIAkJCQl9IGVsc2lmICgkb3AgZXEgJyYnIG9yICRvcCBlcSAnLScpIHsKIAkJCQkJaWYgKCRjdHggIX4gL1Z4VnxbRVddeFtXRV18W0VXQl14W1ZPXS8pIHsKLQkJCQkJCXByaW50ICJuZWVkIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjICogaXMgdGhlIHNhbWUgYXMgJiBvbmx5IGFkZGluZzoKQEAgLTcyNiwxNiArNzUxLDkgQEAKIAkJCQkjCShmb28gKiopCiAJCQkJIwogCQkJCX0gZWxzaWYgKCRvcCBlcSAnKicpIHsKLQkJCQkJaWYgKCRjYSBlcSAnKicpIHsKLQkJCQkJCWlmICgkY2MgPX4gL15ccyg/IVxzKmNvbnN0KS8pIHsKLQkJCQkJCQlwcmludCAibm8gc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCQkkY2xlYW4gPSAwOwotCQkJCQkJfQotCQkJCQl9IGVsc2lmICgkY3R4ICF+IC9WeFZ8W0VXXXhbV0VdfFtFV0JdeFtWT118T3hWfFd4QnxCeEIvKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJaWYgKCRjYSAhfiAvJFR5cGUkLyAmJiAkY2IgIX4gLyhcKiQ7fCQ7XCopLyAmJgorCQkJCQkgICAgJGN0eCAhfiAvVnhWfFtFV114W1dFXXxbRVdCXXhbVk9dfE94VnxXeEJ8QnhCLykgeworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIDw8IGFuZCA+PiBtYXkgZWl0aGVyIGhhdmUgb3Igbm90IGhhdmUgc3BhY2VzIGJvdGggc2lkZXMKQEAgLTc0Myw1OCArNzYxLDUxIEBACiAJCQkJCSAkb3AgZXEgJ14nIG9yICRvcCBlcSAnfCcpCiAJCQkJewogCQkJCQlpZiAoJGN0eCAhfiAvVnhWfFd4V3xWeEV8V3hFLykgewotCQkJCQkJcHJpbnQgIm5lZWQgY29uc2lzdGVudCBzcGFjaW5nIGFyb3VuZCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJuZWVkIGNvbnNpc3RlbnQgc3BhY2luZyBhcm91bmQgJyRvcCcgJGF0XG4iIC4KKwkJCQkJCQkkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgQWxsIHRoZSBvdGhlcnMgbmVlZCBzcGFjZXMgYm90aCBzaWRlcy4KIAkJCQl9IGVsc2lmICgkY3R4ICF+IC9bRVddeFtXRV0vKSB7Ci0JCQkJCXByaW50ICJuZWVkIHNwYWNlcyBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCSRjbGVhbiA9IDA7CisJCQkJCUVSUk9SKCJuZWVkIHNwYWNlcyBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJfQogCQkJCSRvZmYgKz0gbGVuZ3RoKCRlbGVtZW50c1skbiArIDFdKTsKIAkJCX0KIAkJfQogCiAjbmVlZCBzcGFjZSBiZWZvcmUgYnJhY2UgZm9sbG93aW5nIGlmLCB3aGlsZSwgZXRjCi0JCWlmICgkbGluZT1+L1woLipcKXsvKSB7Ci0JCQlwcmludCAibmVlZCBhIHNwYWNlIGJlZm9yZSB0aGUgYnJhY2VcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCWlmICgkbGluZSA9fiAvXCguKlwpey8gfHwgJGxpbmUgPX4gL2Rvey8pIHsKKwkJCUVSUk9SKCJuZWVkIGEgc3BhY2UgYmVmb3JlIHRoZSBvcGVuIGJyYWNlICd7J1xuIiAuICRoZXJlY3Vycik7CisJCX0KKworIyBjbG9zaW5nIGJyYWNlIHNob3VsZCBoYXZlIGEgc3BhY2UgZm9sbG93aW5nIGl0IHdoZW4gaXQgaGFzIGFueXRoaW5nCisjIG9uIHRoZSBsaW5lCisJCWlmICgkbGluZSA9fiAvfSg/ISg/Oix8O3xcKSkpXFMvKSB7CisJCQlFUlJPUigibmVlZCBhIHNwYWNlIGFmdGVyIHRoYXQgY2xvc2UgYnJhY2UgJ30nXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjZ290byBsYWJlbHMgYXJlbid0IGluZGVudGVkLCBhbGxvdyBhIHNpbmdsZSBzcGFjZSBob3dldmVyCiAJCWlmICgkbGluZT1+L14uXHMrW0EtWmEtelxkX10rOig/IVswLTldKykvIGFuZAogCQkgICAhKCRsaW5lPX4vXi4gW0EtWmEtelxkX10rOi8pIGFuZCAhKCRsaW5lPX4vXi5ccytkZWZhdWx0Oi8pKSB7Ci0JCQlwcmludCAibGFiZWxzIHNob3VsZCBub3QgYmUgaW5kZW50ZWRcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlXQVJOKCJsYWJlbHMgc2hvdWxkIG5vdCBiZSBpbmRlbnRlZFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBOZWVkIGEgc3BhY2UgYmVmb3JlIG9wZW4gcGFyZW50aGVzaXMgYWZ0ZXIgaWYsIHdoaWxlIGV0YwogCQlpZiAoJGxpbmU9fi9cYihpZnx3aGlsZXxmb3J8c3dpdGNoKVwoLykgewotCQkJcHJpbnQgIm5lZWQgYSBzcGFjZSBiZWZvcmUgdGhlIG9wZW4gcGFyZW50aGVzaXNcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigibmVlZCBhIHNwYWNlIGJlZm9yZSB0aGUgb3BlbiBwYXJlbnRoZXNpcyAnKCdcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgQ2hlY2sgZm9yIGlsbGVnYWwgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25hbC4KIAkJaWYgKCRsaW5lPX4vXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKlwpLykgewogCQkJI25leHQgaWYgKCRsaW5lPX4vXCIuKlxRJG9wXEUuKlwiLyBvciAkbGluZT1+L1wnXFEkb3BcRVwnLyk7Ci0JCQlwcmludCAiZG8gbm90IHVzZSBhc3NpZ25tZW50IGluIGlmIGNvbmRpdGlvblxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJkbyBub3QgdXNlIGFzc2lnbm1lbnQgaW4gaWYgY29uZGl0aW9uXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAJCSMgQ2hlY2sgZm9yIH08bmw+ZWxzZSB7LCB0aGVzZSBtdXN0IGJlIGF0IHRoZSBzYW1lCiAJCSMgaW5kZW50IGxldmVsIHRvIGJlIHJlbGV2YW50IHRvIGVhY2ggb3RoZXIuCiAJCWlmICgkcHJldmxpbmU9fi99XHMqJC8gYW5kICRsaW5lPX4vXi5ccyplbHNlXHMqLyBhbmQKIAkJCQkJCSRwcmV2aW5kZW50ID09ICRpbmRlbnQpIHsKLQkJCXByaW50ICJlbHNlIHNob3VsZCBmb2xsb3cgY2xvc2UgYnJhY2VcbiI7Ci0JCQlwcmludCAiJGhlcmVwcmV2IjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiZWxzZSBzaG91bGQgZm9sbG93IGNsb3NlIGJyYWNlICd9J1xuIiAuICRoZXJlcHJldik7CiAJCX0KIAogI3N0dWRseSBjYXBzLCBjb21tZW50ZWQgb3V0IHVudGlsIGZpZ3VyZSBvdXQgaG93IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdXNlIG9mIGV4aXN0aW5nIGFuZCBhZGRpbmcgbmV3CkBAIC04MDYsNTcgKzgxNywyMiBAQAogCiAjbm8gc3BhY2VzIGFsbG93ZWQgYWZ0ZXIgXCBpbiBkZWZpbmUKIAkJaWYgKCRsaW5lPX4vXCNkZWZpbmUuKlxcXHMkLykgewotCQkJcHJpbnQoIldoaXRlcHNwYWNlIGFmdGVyIFxcIG1ha2VzIG5leHQgbGluZXMgdXNlbGVzc1xuIik7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlXQVJOKCJXaGl0ZXBzcGFjZSBhZnRlciBcXCBtYWtlcyBuZXh0IGxpbmVzIHVzZWxlc3NcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICN3YXJuIGlmIDxhc20vZm9vLmg+IGlzICNpbmNsdWRlZCBhbmQgPGxpbnV4L2Zvby5oPiBpcyBhdmFpbGFibGUgKHVzZXMgUkFXIGxpbmUpCiAJCWlmICgkdHJlZSAmJiAkcmF3bGluZSA9fiBte14uXCNccyppbmNsdWRlXHMqXDxhc21cLyguKilcLmhcPn0pIHsKIAkJCW15ICRjaGVja2ZpbGUgPSAiaW5jbHVkZS9saW51eC8kMS5oIjsKIAkJCWlmICgtZiAkY2hlY2tmaWxlKSB7Ci0JCQkJcHJpbnQgIlVzZSAjaW5jbHVkZSA8bGludXgvJDEuaD4gaW5zdGVhZCBvZiA8YXNtLyQxLmg+XG4iOwotCQkJCXByaW50ICRoZXJlY3VycjsKLQkJCQkkY2xlYW4gPSAwOwotCQkJfQotCQl9Ci0KLSMgaWYvd2hpbGUvZXRjIGJyYWNlIGRvIG5vdCBnbyBvbiBuZXh0IGxpbmUsIHVubGVzcyBkZWZpbmluZyBhIGRvIHdoaWxlIGxvb3AsCi0jIG9yIGlmIHRoYXQgYnJhY2Ugb24gdGhlIG5leHQgbGluZSBpcyBmb3Igc29tZXRoaW5nIGVsc2UKLQkJaWYgKCRwcmV2bGluZT1+L1xiKD86KGlmfHdoaWxlfGZvcnxzd2l0Y2gpXHMqXCh8ZG9cYnxlbHNlXGIpLykgewotCQkJbXkgQG9wZW5lZCA9ICRwcmV2bGluZT1+L1woL2c7Ci0JCQlteSBAY2xvc2VkID0gJHByZXZsaW5lPX4vXCkvZzsKLQkJCW15ICRucl9saW5lID0gJGxpbmVucjsKLQkJCW15ICRyZW1haW5pbmcgPSAkcmVhbGNudCAtIDE7Ci0JCQlteSAkbmV4dF9saW5lID0gJGxpbmU7Ci0JCQlteSAkZXh0cmFfbGluZXMgPSAwOwotCQkJbXkgJGRpc3BsYXlfc2VnbWVudCA9ICRwcmV2bGluZTsKLQotCQkJd2hpbGUgKCRyZW1haW5pbmcgPiAwICYmIHNjYWxhciBAb3BlbmVkID4gc2NhbGFyIEBjbG9zZWQpIHsKLQkJCQkkcHJldmxpbmUgLj0gJG5leHRfbGluZTsKLQkJCQkkZGlzcGxheV9zZWdtZW50IC49ICJcbiIgLiAkbmV4dF9saW5lOwotCQkJCSRuZXh0X2xpbmUgPSAkbGluZXNbJG5yX2xpbmVdOwotCQkJCSRucl9saW5lKys7Ci0JCQkJJHJlbWFpbmluZy0tOwotCi0JCQkJQG9wZW5lZCA9ICRwcmV2bGluZT1+L1woL2c7Ci0JCQkJQGNsb3NlZCA9ICRwcmV2bGluZT1+L1wpL2c7Ci0JCQl9Ci0KLQkJCWlmICgoJHByZXZsaW5lPX4vXGIoPzooaWZ8d2hpbGV8Zm9yfHN3aXRjaClccypcKC4qXCl8ZG98ZWxzZSlccyokLykgYW5kICgkbmV4dF9saW5lPX4vey8pIGFuZAotCQkJICAgISgkbmV4dF9saW5lPX4vXGIoPzppZnx3aGlsZXxmb3J8c3dpdGNofGRvfGVsc2UpXGIvKSBhbmQgISgkbmV4dF9saW5lPX4vXCNkZWZpbmUuKmRvLip3aGlsZS8pKSB7Ci0JCQkJcHJpbnQgIlRoYXQgeyBzaG91bGQgYmUgb24gdGhlIHByZXZpb3VzIGxpbmVcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlXG4kZGlzcGxheV9zZWdtZW50XG4kbmV4dF9saW5lXG5cbiI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlDSEsoIlVzZSAjaW5jbHVkZSA8bGludXgvJDEuaD4gaW5zdGVhZCBvZiA8YXNtLyQxLmg+XG4iIC4KKwkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIGlmIGFuZCBlbHNlIHNob3VsZCBub3QgaGF2ZSBnZW5lcmFsIHN0YXRlbWVudHMgYWZ0ZXIgaXQKIAkJaWYgKCRsaW5lID1+IC9eLlxzKig/On1ccyopP2Vsc2VcYiguKikvICYmCi0JCSAgICAkMSAhfiAvXlxzKig/OlxzaWZ8e3wkKS8pIHsKLQkJCXByaW50ICJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCSAgICAkMSAhfiAvXlxzKig/OlxzaWZ8e3xcXHwkKS8pIHsKKwkJCUVSUk9SKCJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgbXVsdGktc3RhdGVtZW50IG1hY3JvcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gYSBkbyB3aGlsZSBsb29wLCBncmFiIHRoZQpAQCAtODc3LDQ5ICs4NTMsNDkgQEAKIAkJCQkkbG4tLTsKIAkJCQkkY250Kys7CiAJCQl9Ci0JCQlteSAkY3R4ID0gam9pbignJywgY3R4X3N0YXRlbWVudCgkbG4sICRjbnQpKTsKKwkJCW15IEBjdHggPSBjdHhfc3RhdGVtZW50KCRsbiwgJGNudCk7CisJCQlteSAkY3R4X2xuID0gJGxuICsgJCNjdHggKyAxOworCQkJbXkgJGN0eCA9IGpvaW4oIlxuIiwgQGN0eCk7CisKKwkJCSMgUHVsbCBpbiBhbnkgZW1wdHkgZXh0ZW5zaW9uIGxpbmVzLgorCQkJd2hpbGUgKCRjdHggPX4gL1xcJC8gJiYKKwkJCSAgICAgICAkbGluZXNbJGN0eF9sbiAtIDFdID1+IC9eLlxzKig/OlxcKT8kLykgeworCQkJCSRjdHggLj0gJGxpbmVzWyRjdHhfbG4gLSAxXTsKKwkJCQkkY3R4X2xuKys7CisJCQl9CiAKIAkJCWlmICgkY3R4ID1+IC9cXCQvKSB7CiAJCQkJaWYgKCRjdHggPX4gLzsvKSB7Ci0JCQkJCXByaW50ICJNYWNyb3Mgd2l0aCBtdWx0aXBsZSBzdGF0ZW1lbnRzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBhIGRvIC0gd2hpbGUgbG9vcFxuIjsKKwkJCQkJRVJST1IoIk1hY3JvcyB3aXRoIG11bHRpcGxlIHN0YXRlbWVudHMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgZG8gLSB3aGlsZSBsb29wXG4iIC4gIiRoZXJlXG4kY3R4XG4iKTsKIAkJCQl9IGVsc2UgewotCQkJCQlwcmludCAiTWFjcm9zIHdpdGggY29tcGxleCB2YWx1ZXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHBhcmVudGhlc2lzXG4iOworCQkJCQlFUlJPUigiTWFjcm9zIHdpdGggY29tcGxleCB2YWx1ZXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHBhcmVudGhlc2lzXG4iIC4gIiRoZXJlXG4kY3R4XG4iKTsKIAkJCQl9Ci0JCQkJcHJpbnQgIiRoZXJlcHJldiI7Ci0JCQkJJGNsZWFuID0gMDsKIAkJCX0KIAkJfQogCiAjIGRvbid0IGluY2x1ZGUgZGVwcmVjYXRlZCBpbmNsdWRlIGZpbGVzICh1c2VzIFJBVyBsaW5lKQogCQlmb3IgbXkgJGluYyAoQGRlcF9pbmNsdWRlcykgewogCQkJaWYgKCRyYXdsaW5lID1+IG1AXCNccyppbmNsdWRlXHMqXDwkaW5jPkApIHsKLQkJCQlwcmludCAiRG9uJ3QgdXNlIDwkaW5jPjogc2VlIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUVSUk9SKCJEb24ndCB1c2UgPCRpbmM+OiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIGRvbid0IHVzZSBkZXByZWNhdGVkIGZ1bmN0aW9ucwogCQlmb3IgbXkgJGZ1bmMgKEBkZXBfZnVuY3Rpb25zKSB7CiAJCQlpZiAoJGxpbmUgPX4gL1xiJGZ1bmNcYi8pIHsKLQkJCQlwcmludCAiRG9uJ3QgdXNlICRmdW5jKCk6IHNlZSBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHRcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlFUlJPUigiRG9uJ3QgdXNlICRmdW5jKCk6IHNlZSBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHRcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgbm8gdm9sYXRpbGVzIHBsZWFzZQogCQlpZiAoJGxpbmUgPX4gL1xidm9sYXRpbGVcYi8gJiYgJGxpbmUgIX4gL1xiYXNtXHMrdm9sYXRpbGVcYi8pIHsKLQkJCXByaW50ICJVc2Ugb2Ygdm9sYXRpbGUgaXMgdXN1YWxseSB3cm9uZzogc2VlIERvY3VtZW50YXRpb24vdm9sYXRpbGUtY29uc2lkZXJlZC1oYXJtZnVsLnR4dFxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCVdBUk4oIlVzZSBvZiB2b2xhdGlsZSBpcyB1c3VhbGx5IHdyb25nOiBzZWUgRG9jdW1lbnRhdGlvbi92b2xhdGlsZS1jb25zaWRlcmVkLWhhcm1mdWwudHh0XG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIHdhcm4gYWJvdXQgI2lmIDAKIAkJaWYgKCRsaW5lID1+IC9eLiNccyppZlxzKzBcYi8pIHsKLQkJCXByaW50ICIjaWYgMCAtLSBpZiB0aGlzIGNvZGUgcmVkdW5kYW50IHJlbW92ZSBpdFxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUNISygiaWYgdGhpcyBjb2RlIGlzIHJlZHVuZGFudCBjb25zaWRlciByZW1vdmluZyBpdFxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAkJfQogCiAjIHdhcm4gYWJvdXQgI2lmZGVmcyBpbiBDIGZpbGVzCkBAIC05MzMsNDEgKzkwOSw0NyBAQAogCQlpZiAoJGxpbmUgPX4gL14uXHMqKHN0cnVjdFxzK211dGV4fHNwaW5sb2NrX3QpXHMrXFMrOy8pIHsKIAkJCW15ICR3aGljaCA9ICQxOwogCQkJaWYgKCFjdHhfaGFzX2NvbW1lbnQoJGZpcnN0X2xpbmUsICRsaW5lbnIpKSB7Ci0JCQkJcHJpbnQgIiQxIGRlZmluaXRpb24gd2l0aG91dCBjb21tZW50XG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJQ0hLKCIkMSBkZWZpbml0aW9uIHdpdGhvdXQgY29tbWVudFxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KICMgY2hlY2sgZm9yIG1lbW9yeSBiYXJyaWVycyB3aXRob3V0IGEgY29tbWVudC4KIAkJaWYgKCRsaW5lID1+IC9cYihtYnxybWJ8d21ifHJlYWRfYmFycmllcl9kZXBlbmRzfHNtcF9tYnxzbXBfcm1ifHNtcF93bWJ8c21wX3JlYWRfYmFycmllcl9kZXBlbmRzKVwoLykgewogCQkJaWYgKCFjdHhfaGFzX2NvbW1lbnQoJGZpcnN0X2xpbmUsICRsaW5lbnIpKSB7Ci0JCQkJcHJpbnQgIm1lbW9yeSBiYXJyaWVyIHdpdGhvdXQgY29tbWVudFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUNISygibWVtb3J5IGJhcnJpZXIgd2l0aG91dCBjb21tZW50XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogIyBjaGVjayBvZiBoYXJkd2FyZSBzcGVjaWZpYyBkZWZpbmVzCiAJCWlmICgkbGluZSA9fiBtQF4uI1xzKmlmLipcYihfX2kzODZfX3xfX3Bvd2VycGM2NF9ffF9fc3VuX198X19zMzkweF9fKVxiQCkgewotCQkJcHJpbnQgImFyY2hpdGVjdHVyZSBzcGVjaWZpYyBkZWZpbmVzIHNob3VsZCBiZSBhdm9pZGVkXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJQ0hLKCJhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZGVmaW5lcyBzaG91bGQgYmUgYXZvaWRlZFxuIiAuICAkaGVyZWN1cnIpOwogCQl9CiAKKyMgY2hlY2sgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmxpbmUgYXR0cmlidXRlLCB0aGF0IGl0IGlzIGJldHdlZW4KKyMgc3RvcmFnZSBjbGFzcyBhbmQgdHlwZS4KIAkJaWYgKCRsaW5lID1+IC8kVHlwZVxzKyg/OmlubGluZXxfX2Fsd2F5c19pbmxpbmUpXGIvIHx8CiAJCSAgICAkbGluZSA9fiAvXGIoPzppbmxpbmV8YWx3YXlzX2lubGluZSlccyskU3RvcmFnZS8pIHsKLQkJCXByaW50ICJpbmxpbmUga2V5d29yZCBzaG91bGQgc2l0IGJldHdlZW4gc3RvcmFnZSBjbGFzcyBhbmQgdHlwZVxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJpbmxpbmUga2V5d29yZCBzaG91bGQgc2l0IGJldHdlZW4gc3RvcmFnZSBjbGFzcyBhbmQgdHlwZVxuIiAuICRoZXJlY3Vycik7CisJCX0KKworIyBjaGVjayBmb3IgbmV3IGV4dGVybnMgaW4gLmMgZmlsZXMuCisJCWlmICgkbGluZSA9fiAvXi5ccypleHRlcm5ccy8gJiYgKCRyZWFsZmlsZSA9fiAvXC5jJC8pKSB7CisJCQlXQVJOKCJleHRlcm5zIHNob3VsZCBiZSBhdm9pZGVkIGluIC5jIGZpbGVzXG4iIC4gICRoZXJlY3Vycik7CisJCX0KKworIyBjaGVja3MgZm9yIG5ldyBfX3NldHVwJ3MKKwkJaWYgKCRyYXdsaW5lID1+IC9cYl9fc2V0dXBcKCIoW14iXSopIi8pIHsKKwkJCW15ICRuYW1lID0gJDE7CisKKwkJCWlmICghZ3JlcCgvJG5hbWUvLCBAc2V0dXBfZG9jcykpIHsKKwkJCQlDSEsoIl9fc2V0dXAgYXBwZWFycyB1bi1kb2N1bWVudGVkIC0tIGNoZWNrIERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0XG4iIC4gJGhlcmVjdXJyKTsKKwkJCX0KIAkJfQogCX0KIAogCWlmICgkY2hrX3BhdGNoICYmICEkaXNfcGF0Y2gpIHsKLQkJJGNsZWFuID0gMDsKLQkJcHJpbnQgIkRvZXMgbm90IGFwcGVhciB0byBiZSBhIHVuaWZpZWQtZGlmZiBmb3JtYXQgcGF0Y2hcbiI7CisJCUVSUk9SKCJEb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB1bmlmaWVkLWRpZmYgZm9ybWF0IHBhdGNoXG4iKTsKIAl9CiAJaWYgKCRpc19wYXRjaCAmJiAkY2hrX3NpZ25vZmYgJiYgJHNpZ25vZmYgPT0gMCkgewotCQkkY2xlYW4gPSAwOwotCQlwcmludCAiTWlzc2luZyBTaWduZWQtb2ZmLWJ5OiBsaW5lKHMpXG4iOworCQlFUlJPUigiTWlzc2luZyBTaWduZWQtb2ZmLWJ5OiBsaW5lKHMpXG4iKTsKIAl9CiAKIAlpZiAoJGNsZWFuID09IDEgJiYgJHF1aWV0ID09IDApIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZGVjb2RlY29kZSBiL3NjcmlwdHMvZGVjb2RlY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFhOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9kZWNvZGVjb2RlCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorIyBEaXNhc3NlbWJsZSB0aGUgQ29kZTogbGluZSBpbiBMaW51eCBvb3BzZXMKKyMgdXNhZ2U6IGRlY29kZWNvZGUgPCBvb3BzLmZpbGUKKyMKKyMgb3B0aW9uczogc2V0IGVudi4gdmFyaWFibGUgQUZMQUdTPW9wdGlvbnMgdG8gcGFzcyBvcHRpb25zIHRvICJhcyI7CisjIGUuZy4sIHRvIGRlY29kZSBhbiBpMzg2IG9vcHMgb24gYW4geDg2XzY0IHN5c3RlbSwgdXNlOgorIyBBRkxBR1M9LS0zMiBkZWNvZGVjb2RlIDwgMzg2Lm9vcHMKKworVD1gbWt0ZW1wYAorY29kZT0KKword2hpbGUgcmVhZCBpIDsgZG8KKworY2FzZSAiJGkiIGluCisqQ29kZToqKQorCWNvZGU9JGkKKwk7OworZXNhYworCitkb25lCisKK2lmIFsgLXogIiRjb2RlIiBdOyB0aGVuCisJZXhpdAorZmkKKworZWNobyAkY29kZQorY29kZT1gZWNobyAkY29kZSB8IHNlZCAtZSAncy8uKkNvZGU6IC8vJ2AKKworbWFya2VyPWBleHByIGluZGV4ICIkY29kZSIgIlw8ImAKK2lmIFsgJG1hcmtlciAtZXEgMCBdOyB0aGVuCisJbWFya2VyPWBleHByIGluZGV4ICIkY29kZSIgIlwoImAKK2ZpCisKK2lmIFsgJG1hcmtlciAtbmUgMCBdOyB0aGVuCisJYmVmb3JlbWFyaz1gZWNobyAiJGNvZGUiIHwgY3V0IC1jLSQoKCR7bWFya2VyfSAtIDEpKWAKKwllY2hvIC1uICIJLmJ5dGUgMHgiID4gJFQucworCWVjaG8gJGJlZm9yZW1hcmsgfCBzZWQgLWUgJ3MvIC8sMHgvZycgPj4gJFQucworCWFzICRBRkxBR1MgLW8gJFQubyAkVC5zCisJb2JqZHVtcCAtUyAkVC5vCisJcm0gJFQubyAkVC5zCisKKyMgYW5kIGZpeCBjb2RlIGF0LWFuZC1hZnRlciBtYXJrZXIKKwljb2RlPWBlY2hvICIkY29kZSIgfCBjdXQgLWMkKCgke21hcmtlcn0gKyAxKSktYAorZmkKKworY29kZT1gZWNobyAkY29kZSB8IHNlZCAtZSAncy8gWzwoXS8gLztzL1s+KV0gLyAvO3MvIC8sMHgvZydgCitlY2hvIC1uICIJLmJ5dGUgMHgiID4gJFQucworZWNobyAkY29kZSA+PiAkVC5zCithcyAkQUZMQUdTIC1vICRULm8gJFQucworb2JqZHVtcCAtUyAkVC5vCitybSAkVC5vICRULnMKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2FsbHN5bXMuYyBiL3NjcmlwdHMva2FsbHN5bXMuYwppbmRleCA4YjgwOWIyLi4xMGIwMDY2IDEwMDY0NAotLS0gYS9zY3JpcHRzL2thbGxzeW1zLmMKKysrIGIvc2NyaXB0cy9rYWxsc3ltcy5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAotI2RlZmluZSBLU1lNX05BTUVfTEVOCQkxMjcKKyNkZWZpbmUgS1NZTV9OQU1FX0xFTgkJMTI4CiAKIAogc3RydWN0IHN5bV9lbnRyeSB7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgaywgb2ZmOwogCXVuc2lnbmVkIGludCBiZXN0X2lkeFsyNTZdOwogCXVuc2lnbmVkIGludCAqbWFya2VyczsKLQljaGFyIGJ1ZltLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgYnVmW0tTWU1fTkFNRV9MRU5dOwogCiAJcHJpbnRmKCIjaW5jbHVkZSA8YXNtL3R5cGVzLmg+XG4iKTsKIAlwcmludGYoIiNpZiBCSVRTX1BFUl9MT05HID09IDY0XG4iKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwppbmRleCBjY2ZlODc1Li5lZGRjN2I0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCkBAIC0xMTAsNiArMTEwLDggQEAKIAl7IEFVRElUX0RFTF9SVUxFLAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgfSwKIAl7IEFVRElUX1VTRVIsCQlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfUkVMQVkgICAgfSwKIAl7IEFVRElUX1NJR05BTF9JTkZPLAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfUkVBRCAgICAgfSwKKwl7IEFVRElUX1RUWV9HRVQsCU5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19SRUFEICAgICB9LAorCXsgQVVESVRfVFRZX1NFVCwJTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1dSSVRFICAgIH0sCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9LY29uZmlnIGIvc291bmQvb3NzL0tjb25maWcKaW5kZXggNGIzMGFlNi4uODY2ZDRkZSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL0tjb25maWcKKysrIGIvc291bmQvb3NzL0tjb25maWcKQEAgLTUsMzUgKzUsNiBAQAogIwogIyBQcm9tcHQgdXNlciBmb3IgcHJpbWFyeSBkcml2ZXJzLgogCi1jb25maWcgT1NTX09CU09MRVRFCi0JYm9vbCAiT2Jzb2xldGUgT1NTIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3Igb2Jzb2xldGUgT1NTIGRyaXZlcnMgdGhhdAotCSAgYXJlIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiB0aGUgbmVhciBmdXR1cmUuCi0KLQkgIFBsZWFzZSBjb250YWN0IEFkcmlhbiBCdW5rIDxidW5rQHN0dXN0YS5kZT4gaWYgeW91IGhhZCB0bwotCSAgc2F5IFkgaGVyZSBiZWNhdXNlIHlvdXIgaGFyZHdhcmUgaXMgbm90IHByb3Blcmx5IHN1cHBvcnRlZAotCSAgYnkgQUxTQS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIFNPVU5EX0JUODc4Ci0JdHJpc3RhdGUgIkJUODc4IGF1ZGlvIGRtYSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSSAmJiBPU1NfT0JTT0xFVEUKLQktLS1oZWxwLS0tCi0JICBBdWRpbyBETUEgc3VwcG9ydCBmb3IgYnQ4NzggYmFzZWQgZ3JhYmJlciBib2FyZHMuICBBcyB5b3UgbWlnaHQgaGF2ZQotCSAgYWxyZWFkeSBub3RpY2VkLCBidDg3OCBpcyBsaXN0ZWQgd2l0aCB0d28gZnVuY3Rpb25zIGluIC9wcm9jL3BjaS4KLQkgIEZ1bmN0aW9uIDAgZG9lcyB0aGUgdmlkZW8gc3R1ZmYgKGJ0ODQ4IGNvbXBhdGlibGUpLCBmdW5jdGlvbiAxIGRvZXMKLQkgIHRoZSBzYW1lIGZvciBhdWRpbyBkYXRhLiAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIGF1ZGlvIHBhcnQgb2YKLQkgIHRoZSBjaGlwLiAgSWYgeW91IHNheSAnWScgaGVyZSB5b3UgZ2V0IGEgb3NzLWNvbXBhdGlibGUgZHNwIGRldmljZQotCSAgd2hlcmUgeW91IGNhbiByZWNvcmQgZnJvbS4gIElmIHlvdSB3YW50IGp1c3Qgd2F0Y2ggVFYgeW91IHByb2JhYmx5Ci0JICBkb24ndCBuZWVkIHRoaXMgZHJpdmVyIGFzIG1vc3QgVFYgY2FyZHMgaGFuZGxlIHNvdW5kIHdpdGggYSBzaG9ydAotCSAgY2FibGUgZnJvbSB0aGUgVFYgY2FyZCB0byB5b3VyIHNvdW5kIGNhcmQncyBsaW5lLWluLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBidGF1ZGlvLgotCiBjb25maWcgU09VTkRfQkNNX0NTNDI5N0EKIAl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZCBDUzQyOTdhIChmb3IgU3dhcm0pIgogCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgU0lCWVRFX1NXQVJNCkBAIC00NCwxMyArMTUsNiBAQAogCSAgbm90ZSB0aGF0IENPTkZJR19LR0RCIHNob3VsZCBub3QgYmUgZW5hYmxlZCBhdCB0aGUgc2FtZQogCSAgdGltZSwgc2luY2UgaXQgYWxzbyBhdHRlbXB0cyB0byB1c2UgdGhpcyBVQVJUIHBvcnQuCiAKLWNvbmZpZyBTT1VORF9JQ0gKLQl0cmlzdGF0ZSAiSW50ZWwgSUNIIChpOHh4KSBhdWRpbyBzdXBwb3J0IgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJICYmIE9TU19PQlNPTEVURQotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIGludGVncmFsIGF1ZGlvIGluIEludGVsJ3MgSS9PIENvbnRyb2xsZXIgSHViIChJQ0gpCi0JICBjaGlwc2V0LCBhcyB1c2VkIG9uIHRoZSA4MTAvODIwLzg0MCBtb3RoZXJib2FyZHMuCi0KIGNvbmZpZyBTT1VORF9WV1NORAogCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIFNvdW5kIgogCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgWDg2X1ZJU1dTCkBAIC0zNDYsMjkgKzMxMCw5IEBACiAJICBhbmQgUGlubmFjbGUpLiBMYXJnZXIgdmFsdWVzIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGRhdGEgb3ZlcnJ1bnMgYXQKIAkgIHRoZSBleHBlbnNlIG9mIG92ZXJhbGwgbGF0ZW5jeS4gSWYgdW5zdXJlLCB1c2UgdGhlIGRlZmF1bHQuCiAKLWNvbmZpZyBTT1VORF9WSUE4MkNYWFgKLQl0cmlzdGF0ZSAiVklBIDgyQzY4NiBBdWRpbyBDb2RlYyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSSAmJiBPU1NfT0JTT0xFVEUKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIGF1ZGlvIGNvZGVjIGZvdW5kIG9uIFZJQQotCSAgODJDeHh4LWJhc2VkIGNoaXBzLiBUeXBpY2FsbHkgdGhlc2UgYXJlIGJ1aWx0IGludG8gYSBtb3RoZXJib2FyZC4KLQotCSAgRE8gTk9UIHNlbGVjdCBTb3VuZCBCbGFzdGVyIG9yIEFkbGliIHdpdGggdGhpcyBkcml2ZXIsIHVubGVzcwotCSAgeW91IGhhdmUgYSBTb3VuZCBCbGFzdGVyIG9yIEFkbGliIGNhcmQgaW4gYWRkaXRpb24gdG8geW91ciBWSUEKLQkgIGF1ZGlvIGNoaXAuCi0KLWNvbmZpZyBNSURJX1ZJQTgyQ1hYWAotCWJvb2wgIlZJQSA4MkM2ODYgTUlESSIKLQlkZXBlbmRzIG9uIFNPVU5EX1ZJQTgyQ1hYWCAmJiBJU0FfRE1BX0FQSQotCWhlbHAKLQkgIEFuc3dlciBZIHRvIHVzZSB0aGUgTUlESSBpbnRlcmZhY2Ugb2YgdGhlIFZpYTY4Ni4gWW91IG1heSBuZWVkIHRvCi0JICBlbmFibGUgdGhpcyBpbiB0aGUgQklPUyBiZWZvcmUgaXQgd2lsbCB3b3JrLiBUaGlzIGlzIGZvciBjb25uZWN0aW9uCi0JICB0byBleHRlcm5hbCBNSURJIGhhcmR3YXJlLCBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciBzb2Z0d2FyZSBwbGF5YmFjawotCSAgb2YgTUlESSBmaWxlcy4KLQogY29uZmlnIFNPVU5EX09TUwogCXRyaXN0YXRlICJPU1Mgc291bmQgbW9kdWxlcyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBJU0FfRE1BX0FQSSAmJiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIE9TUyBpcyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gc3VpdGUgb2Ygc291bmQgY2FyZCBkcml2ZXJzLiAgVGhleSBtYWtlCiAJICBzb3VuZCBwcm9ncmFtbWluZyBlYXNpZXIgc2luY2UgdGhleSBwcm92aWRlIGEgY29tbW9uIEFQSS4gIFNheSBZIG9yCkBAIC00MDAsMjMgKzM0NCwxMCBAQAogCiAJICBTYXkgWSB1bmxlc3MgeW91IGhhdmUgMTZNQiBvciBtb3JlIFJBTSBvciBhIFBDSSBzb3VuZCBjYXJkLgogCi1jb25maWcgU09VTkRfQ1M0MjMyCi0JdHJpc3RhdGUgIkNyeXN0YWwgQ1M0MjMyIGJhc2VkIChQblApIGNhcmRzIgotCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIE9TU19PQlNPTEVURQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjYXJkIGJhc2VkIG9uIHRoZSBDcnlzdGFsIENTNDIzMiBjaGlwIHNldCwKLQkgIHdoaWNoIHVzZXMgaXRzIG93biBQbHVnIGFuZCBQbGF5IHByb3RvY29sLgotCi0JICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCi0JICAiY3M0MjMyPTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDxtcHVpbz4sPG1wdWlycT4iIHRvIHRoZSBrZXJuZWwKLQkgIGNvbW1hbmQgbGluZS4KLQotCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0NTNDIzMj4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KLQkgIGNvbmZpZ3VyaW5nIHRoaXMgY2FyZC4KLQogY29uZmlnIFNPVU5EX1NTQ0FQRQogCXRyaXN0YXRlICJFbnNvbmlxIFNvdW5kU2NhcGUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPVU5EX09TUworCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAloZWxwCiAJICBBbnN3ZXIgWSBpZiB5b3UgaGF2ZSBhIHNvdW5kIGNhcmQgYmFzZWQgb24gdGhlIEVuc29uaXEgU291bmRTY2FwZQogCSAgY2hpcHNldC4gU3VjaCBjYXJkcyBhcmUgYmVpbmcgbWFudWZhY3R1cmVkIGF0IGxlYXN0IGJ5IEVuc29uaXEsIFNwZWEKQEAgLTcxOSwxMyArNjUwLDYgQEAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUm9ja3dlbGwgV2F2ZUFydGlzdCBzb3VuZAogCSAgc3lzdGVtLiAgVGhpcyBkcml2ZXIgaXMgbWFpbmx5IGZvciB0aGUgTmV0V2luZGVyLgogCi1jb25maWcgU09VTkRfVFZNSVhFUgotCXRyaXN0YXRlICJUViBjYXJkIChidDg0OCkgbWl4ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIEkyQyAmJiBWSURFT19WNEwxICYmIE9TU19PQlNPTEVURQotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIGF1ZGlvIG1peGVyIGZhY2lsaXRpZXMgb24gdGhlIEJUODQ4IFRWIGZyYW1lLWdyYWJiZXIKLQkgIGNhcmQuCi0KIGNvbmZpZyBTT1VORF9LQUhMVUEKIAl0cmlzdGF0ZSAiWHByZXNzQXVkaW8gU291bmQgQmxhc3RlciBlbXVsYXRpb24iCiAJZGVwZW5kcyBvbiBTT1VORF9TQgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL01ha2VmaWxlIGIvc291bmQvb3NzL01ha2VmaWxlCmluZGV4IDI0ODliZDYuLjdhMmY5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9NYWtlZmlsZQorKysgYi9zb3VuZC9vc3MvTWFrZWZpbGUKQEAgLTE4LDIwICsxOCwxNSBAQAogb2JqLSQoQ09ORklHX1NPVU5EX1NTQ0FQRSkJKz0gc3NjYXBlLm8gYWQxODQ4Lm8gbXB1NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9DUzQyMzIpCSs9IGNzNDIzMi5vIHVhcnQ0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX01TUykJCSs9IGFkMTg0OC5vCi1vYmotJChDT05GSUdfU09VTkRfT1BMM1NBMikJKz0gb3BsM3NhMi5vIGFkMTg0OC5vIG1wdTQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfUEFTKQkJKz0gcGFzMi5vIHNiLm8gc2JfbGliLm8gdWFydDQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfU0IpCQkrPSBzYi5vIHNiX2xpYi5vIHVhcnQ0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX0tBSExVQSkJKz0ga2FobHVhLm8KIG9iai0kKENPTkZJR19TT1VORF9NUFU0MDEpCSs9IG1wdTQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfVUFSVDY4NTApCSs9IHVhcnQ2ODUwLm8KLW9iai0kKENPTkZJR19TT1VORF9BRExJQikJKz0gYWRsaWJfY2FyZC5vIG9wbDMubwogb2JqLSQoQ09ORklHX1NPVU5EX1lNMzgxMikJKz0gb3BsMy5vCiBvYmotJChDT05GSUdfU09VTkRfVk1JREkpCSs9IHZfbWlkaS5vCiBvYmotJChDT05GSUdfU09VTkRfVklEQykJKz0gdmlkY19tb2Qubwogb2JqLSQoQ09ORklHX1NPVU5EX1dBVkVBUlRJU1QpCSs9IHdhdmVhcnRpc3Qubwotb2JqLSQoQ09ORklHX1NPVU5EX0FEMTgxNikJKz0gYWQxODE2Lm8KLW9iai0kKENPTkZJR19TT1VORF9BRDE4ODkpCSs9IGFkMTg4OS5vIGFjOTdfY29kZWMubwotb2JqLSQoQ09ORklHX1NPVU5EX0FDSV9NSVhFUikJKz0gYWNpLm8KIAogb2JqLSQoQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCkJKz0gdmlhODJjeHh4X2F1ZGlvLm8gYWM5N19jb2RlYy5vCiBpZmVxICgkKENPTkZJR19NSURJX1ZJQTgyQ1hYWCkseSkKQEAgLTQwLDI0ICszNSwxNiBAQAogb2JqLSQoQ09ORklHX1NPVU5EX01TTkRDTEFTKQkrPSBtc25kLm8gbXNuZF9jbGFzc2ljLm8KIG9iai0kKENPTkZJR19TT1VORF9NU05EUElOKQkrPSBtc25kLm8gbXNuZF9waW5uYWNsZS5vCiBvYmotJChDT05GSUdfU09VTkRfVldTTkQpCSs9IHZ3c25kLm8KLW9iai0kKENPTkZJR19TT1VORF9OTTI1NikJKz0gbm0yNTZfYXVkaW8ubyBhYzk3Lm8KIG9iai0kKENPTkZJR19TT1VORF9JQ0gpCQkrPSBpODEwX2F1ZGlvLm8gYWM5N19jb2RlYy5vCiBvYmotJChDT05GSUdfU09VTkRfRVMxMzcxKQkrPSBlczEzNzEubyBhYzk3X2NvZGVjLm8KIG9iai0kKENPTkZJR19TT1VORF9WUkM1NDc3KQkrPSBuZWNfdnJjNTQ3Ny5vIGFjOTdfY29kZWMubwogb2JqLSQoQ09ORklHX1NPVU5EX0FVMTU1MF9BQzk3KQkrPSBhdTE1NTBfYWM5Ny5vIGFjOTdfY29kZWMubwotb2JqLSQoQ09ORklHX1NPVU5EX0ZVU0lPTikJKz0gY3M0Nnh4Lm8gYWM5N19jb2RlYy5vCiBvYmotJChDT05GSUdfU09VTkRfVFJJREVOVCkJKz0gdHJpZGVudC5vIGFjOTdfY29kZWMubwotb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IGFjOTdfY29kZWMubwogb2JqLSQoQ09ORklHX1NPVU5EX0JDTV9DUzQyOTdBKQkrPSBzd2FybV9jczQyOTdhLm8KIG9iai0kKENPTkZJR19TT1VORF9CVDg3OCkJKz0gYnRhdWRpby5vCiAKIG9iai0kKENPTkZJR19TT1VORF9XTTk3WFgpCSs9IGFjOTdfcGx1Z2luX3dtOTd4eC5vCiAKLWlmZXEgKCQoQ09ORklHX01JRElfRU1VMTBLMSkseSkKLSAgb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IHNvdW5kLm8KLWVuZGlmCi0KLW9iai0kKENPTkZJR19TT1VORF9FTVUxMEsxKQkrPSBlbXUxMGsxLwogb2JqLSQoQ09ORklHX0RNQVNPVU5EKQkJKz0gZG1hc291bmQvCiAKICMgRGVjbGFyZSBtdWx0aS1wYXJ0IGRyaXZlcnMuCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWM5Ny5jIGIvc291bmQvb3NzL2FjOTcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZjRlZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWM5Ny5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSAiYWM5Ny5oIgotCi0vKiBGbGFnIGZvciBtb25vIGNvbnRyb2xzLiAqLwotI2RlZmluZSBNTyAwCi0vKiBBbmQgZm9yIHN0ZXJlby4gKi8KLSNkZWZpbmUgU1QgMQotCi0vKiBXaGV0aGVyIG9yIG5vdCB0aGUgYml0cyBpbiB0aGUgY2hhbm5lbCBhcmUgaW52ZXJ0ZWQuICovCi0jZGVmaW5lIElOViAxCi0jZGVmaW5lIE5JTlYgMAotCi1zdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgewotICAgIGludCBhYzk3X3JlZ251bTsKLSAgICBpbnQgb3NzX2NoYW5uZWw7Ci0gICAgaW50IG1heHZhbDsKLSAgICBpbnQgaXNfc3RlcmVvOwotICAgIGludCBvc3NfbWFzazsKLSAgICBpbnQgcmVjb3JkTnVtOwotICAgIHUxNiByZWdtYXNrOwotICAgIGludCBpc19pbnZlcnRlZDsKLX0gbWl4ZXJSZWdzW10gPSB7Ci0gICAgeyBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBTT1VORF9NSVhFUl9WT0xVTUUsICAgMHgzZiwgU1QsIFNPVU5EX01BU0tfVk9MVU1FLCAgIDUsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19NQVNURVJfVk9MX01PTk8sICAgU09VTkRfTUlYRVJfUEhPTkVPVVQsIDB4M2YsIE1PLCBTT1VORF9NQVNLX1BIT05FT1VULCA2LCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfTUFTVEVSX1RPTkUsICAgICAgIFNPVU5EX01JWEVSX1RSRUJMRSwgICAweDBmLCBNTywgU09VTkRfTUFTS19UUkVCTEUsICAtMSwgMHgwMGZmLCBJTlYgIH0sCi0gICAgeyBBQzk3X01BU1RFUl9UT05FLCAgICAgICBTT1VORF9NSVhFUl9CQVNTLCAgICAgMHgwZiwgTU8sIFNPVU5EX01BU0tfQkFTUywgICAgLTEsIDB4ZmYwMCwgSU5WICB9LAotICAgIHsgQUM5N19QQ0JFRVBfVk9MLCAgICAgICAgU09VTkRfTUlYRVJfU1BFQUtFUiwgIDB4MGYsIE1PLCBTT1VORF9NQVNLX1NQRUFLRVIsIC0xLCAweDAwMWUsIElOViAgfSwKLSAgICB7IEFDOTdfUEhPTkVfVk9MLCAgICAgICAgIFNPVU5EX01JWEVSX1BIT05FSU4sICAweDFmLCBNTywgU09VTkRfTUFTS19QSE9ORUlOLCAgNywgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X01JQ19WT0wsICAgICAgICAgICBTT1VORF9NSVhFUl9NSUMsICAgICAgMHgxZiwgTU8sIFNPVU5EX01BU0tfTUlDLCAgICAgIDAsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19MSU5FSU5fVk9MLCAgICAgICAgU09VTkRfTUlYRVJfTElORSwgICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUsICAgICA0LCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfQ0RfVk9MLCAgICAgICAgICAgIFNPVU5EX01JWEVSX0NELCAgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19DRCwgICAgICAgMSwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X1ZJREVPX1ZPTCwgICAgICAgICBTT1VORF9NSVhFUl9WSURFTywgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfVklERU8sICAgIDIsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19BVVhfVk9MLCAgICAgICAgICAgU09VTkRfTUlYRVJfTElORTEsICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUxLAkgICAzLCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfUENNT1VUX1ZPTCwgICAgICAgIFNPVU5EX01JWEVSX1BDTSwgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19QQ00sICAgICAtMSwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X1JFQ09SRF9HQUlOLCAgICAgICBTT1VORF9NSVhFUl9JR0FJTiwgICAgMHgwZiwgU1QsIFNPVU5EX01BU0tfSUdBSU4sICAgLTEsIDB4MDAwMCwgTklOViB9LAotICAgIHsgLTEsCQkgICAgICAtMSwJCSAgICAweGZmLCAwLCAgMCwgICAgICAgICAgICAgICAgICAtMSwgMHgwMDAwLCAwICAgIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgKgotYWM5N19maW5kX2NobmRlc2MgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCAhPSAtMTsgeCsrKSB7Ci0JaWYgKG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCA9PSBvc3NfY2hhbm5lbCkKLQkgICAgcmV0dXJuIG1peGVyUmVncyArIHg7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1hYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaG4pCi17Ci0gICAgcmV0dXJuIChkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbY2huLT5hYzk3X3JlZ251bSAvIDJdCi0JICAgICE9IEFDOTdfUkVHX1VOU1VQUE9SVEVEKTsKLX0KLQotaW50Ci1hYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCi17Ci0gICAgaW50IHg7Ci0gICAgaW50IHJlZzA7Ci0KLSAgICAvKiBDbGVhciBvdXQgdGhlIGFycmF5cyBvZiBjYWNoZWQgdmFsdWVzLiAqLwotICAgIGZvciAoeCA9IDA7IHggPCBBQzk3X1JFR19DTlQ7IHgrKykKLQlkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOwotCi0gICAgZm9yICh4ID0gMDsgeCA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgeCsrKQotCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOwotCi0gICAgLyogQ2xlYXIgdGhlIGRldmljZSBtYXNrcy4gICovCi0gICAgZGV2LT5taXhlcl9kZXZtYXNrID0gMDsKLSAgICBkZXYtPm1peGVyX3N0ZXJlb21hc2sgPSAwOwotICAgIGRldi0+bWl4ZXJfcmVjbWFzayA9IDA7Ci0KLSAgICAvKiA/Pz8gRG8gYSAic3RhbmRhcmQgcmVzZXQiIHZpYSByZWdpc3RlciAwPyAqLwotCi0gICAgLyogSGFyZHdhcmUtZGVwZW5kZW50IHJlc2V0LiAgKi8KLSAgICBpZiAoZGV2LT5yZXNldF9kZXZpY2UgKGRldikpCi0JcmV0dXJuIC0xOwotCi0gICAgLyogQ2hlY2sgdGhlIG1peGVyIGRldmljZSBjYXBhYmlsaXRpZXMuICAqLwotICAgIHJlZzAgPSBkZXYtPnJlYWRfcmVnIChkZXYsIEFDOTdfUkVTRVQpOwotCi0gICAgaWYgKHJlZzAgPCAwKQotCXJldHVybiAtMTsKLQotICAgIC8qIENoZWNrIGZvciBzdXBwb3J0IGZvciB0cmVibGUvYmFzcyBjb250cm9scy4gICovCi0gICAgaWYgKCEgKHJlZzAgJiA0KSkgewotCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X01BU1RFUl9UT05FIC8gMl0gCi0JICAgID0gQUM5N19SRUdfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLyogPz8/IFRoZXJlIG1heSBiZSBvdGhlciB0ZXN0cyBoZXJlPyAqLwotCi0gICAgLyogRmlsbCBpbiB0aGUgZGV2aWNlIG1hc2tzLiAgKi8KLSAgICBmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gIT0gLTE7IHgrKykgewotCWlmIChhYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKGRldiwgbWl4ZXJSZWdzICsgeCkpIHsKLQkgICAgZGV2LT5taXhlcl9kZXZtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQotCSAgICBpZiAobWl4ZXJSZWdzW3hdLmlzX3N0ZXJlbykKLQkJZGV2LT5taXhlcl9zdGVyZW9tYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQotCSAgICBpZiAobWl4ZXJSZWdzW3hdLnJlY29yZE51bSAhPSAtMSkKLQkJZGV2LT5taXhlcl9yZWNtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB0aGUgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHOyB1c2UgdGhlIGNhY2hlIGlmIHRoZSB2YWx1ZSBpbiBpdAotICAgaXMgdmFsaWQuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAqLwotc3RhdGljIGludAotYWM5N19nZXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZykgCi17Ci0gICAgaWYgKHJlZyA+IDEyNyB8fCAocmVnICYgMSkpCi0JcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAvKiBTZWUgaWYgaXQncyBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0J3MganVzdCBwbGFpbiBpbnZhbGlkLiAgKi8KLSAgICBzd2l0Y2ggKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSkgewotICAgIGNhc2UgQUM5N19SRUdfVU5TVVBQT1JURUQ6Ci0JcmV0dXJuIC1FSU5WQUw7Ci0JYnJlYWs7Ci0gICAgY2FzZSBBQzk3X1JFR1ZBTF9VTktOT1dOOgotCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IGRldi0+cmVhZF9yZWcgKGRldiwgcmVnKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdOwotfQotCi0vKiBXcml0ZSBWQUxVRSB0byBBQzk3IHJlZ2lzdGVyIFJFRywgYW5kIGNhY2hlIGl0cyB2YWx1ZSBpbiB0aGUgbGFzdC13cml0dGVuCi0gICBjYWNoZS4gIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIG9yIDAgb24gc3VjY2Vzcy4gKi8KLWludAotYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKQotewotICAgIGlmIChyZWcgPiAxMjcgfHwgKHJlZyAmIDEpKQotCXJldHVybiAtRUlOVkFMOwotCi0gICAgaWYgKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9PSBBQzk3X1JFR19VTlNVUFBPUlRFRCkKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICBlbHNlIHsKLQlpbnQgcmVzID0gZGV2LT53cml0ZV9yZWcgKGRldiwgcmVnLCB2YWx1ZSk7Ci0JaWYgKHJlcyA+PSAwKSB7Ci0JICAgIGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IHZhbHVlOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JZWxzZQotCSAgICByZXR1cm4gcmVzOwotICAgIH0KLX0KLQotLyogU2NhbGUgVkFMVUUgKGEgdmFsdWUgZnJvIDAgdG8gTUFYVkFMKSB0byBhIHZhbHVlIGZyb20gMC0xMDAuICBJZgotICAgSVNfU1RFUkVPIGlzIHNldCwgVkFMVUUgaXMgYSBzdGVyZW8gdmFsdWU7IHRoZSBsZWZ0IGNoYW5uZWwgdmFsdWUKLSAgIGlzIGluIHRoZSBsb3dlciA4IGJpdHMsIGFuZCB0aGUgcmlnaHQgY2hhbm5lbCB2YWx1ZSBpcyBpbiB0aGUgdXBwZXIKLSAgIDggYml0cy4KLQotICAgQSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlzIHJldHVybmVkIG9uIGZhaWx1cmUsIG9yIHRoZSB1bnNpZ25lZAotICAgc2NhbGVkIHZhbHVlIG9uIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgaW50Ci1hYzk3X3NjYWxlX3RvX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKLXsKLSAgICAvKiBNdXRlZD8gICovCi0gICAgaWYgKHZhbHVlICYgQUM5N19NVVRFKQotCXJldHVybiAwOwotCi0gICAgaWYgKGlzX3N0ZXJlbykKLQlyZXR1cm4gKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAodmFsdWUgJiAyNTUsIG1heHZhbCwgMCwgaW52KSA8PCA4KQotCXwgKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7Ci0gICAgZWxzZSB7Ci0JaW50IGk7Ci0JCi0JLyogSW52ZXJ0ZWQuICovCi0JaWYgKGludikKLQkgICAgdmFsdWUgPSBtYXh2YWwgLSB2YWx1ZTsKLQotCWkgPSAodmFsdWUgKiAxMDAgKyAobWF4dmFsIC8gMikpIC8gbWF4dmFsOwotCWlmIChpID4gMTAwKQotCSAgICAgaSA9IDEwMDsKLQlpZiAoaSA8IDApCi0JICAgIGkgPSAwOwotCXJldHVybiBpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotYWM5N19zY2FsZV9mcm9tX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKLXsKLSAgICBpZiAoaXNfc3RlcmVvKQotCXJldHVybiAoYWM5N19zY2FsZV9mcm9tX29zc192YWwgKHZhbHVlICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgOCkKLQl8IChhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7Ci0gICAgZWxzZSB7Ci0JaW50IGkgPSAoKHZhbHVlICYgMjU1KSAqIG1heHZhbCArIDUwKSAvIDEwMDsKLQlpZiAoaW52KQotCSAgICBpID0gbWF4dmFsIC0gaTsKLQlpZiAoaSA8IDApCi0JICAgIGkgPSAwOwotCWlmIChpID4gbWF4dmFsKQotCSAgICBpID0gbWF4dmFsOwotCXJldHVybiBpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotYWM5N19zZXRfbWl4ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCwgdTE2IG9zc192YWx1ZSkKLXsKLSAgICBpbnQgc2NhbGVkX3ZhbHVlOwotICAgIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGFubmVsID0gYWM5N19maW5kX2NobmRlc2MgKGRldiwgb3NzX2NoYW5uZWwpOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoY2hhbm5lbCA9PSBOVUxMKQotCXJldHVybiAtRU5PREVWOwotICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICBzY2FsZWRfdmFsdWUgPSBhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAob3NzX3ZhbHVlLCBjaGFubmVsLT5tYXh2YWwsCi0JCQkJCSAgICBjaGFubmVsLT5pc19zdGVyZW8sIAotCQkJCQkgICAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOwotICAgIGlmIChzY2FsZWRfdmFsdWUgPCAwKQotCXJldHVybiBzY2FsZWRfdmFsdWU7Ci0KLSAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7Ci0JaW50IG12OwotCi0JaW50IG9sZHZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKLQlpZiAob2xkdmFsIDwgMCkKLQkgICAgcmV0dXJuIG9sZHZhbDsKLQotCWZvciAobXYgPSBjaGFubmVsLT5yZWdtYXNrOyAhIChtdiAmIDEpOyBtdiA+Pj0gMSkKLQkgICAgc2NhbGVkX3ZhbHVlIDw8PSAxOwotCi0Jc2NhbGVkX3ZhbHVlICY9IGNoYW5uZWwtPnJlZ21hc2s7Ci0Jc2NhbGVkX3ZhbHVlIHw9IChvbGR2YWwgJiB+Y2hhbm5lbC0+cmVnbWFzayk7Ci0gICAgfQotICAgIHJlc3VsdCA9IGFjOTdfcHV0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtLCBzY2FsZWRfdmFsdWUpOwotICAgIGlmIChyZXN1bHQgPT0gMCkKLQlkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW29zc19jaGFubmVsXSA9IG9zc192YWx1ZTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1hYzk3X2dldF9taXhlcl9zY2FsZWQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKLXsKLSAgICBzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqY2hhbm5lbCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIG9zc19jaGFubmVsKTsKLSAgICBpbnQgcmVndmFsOwotCi0gICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIHJlZ3ZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKLQotICAgIGlmIChyZWd2YWwgPCAwKQotCXJldHVybiByZWd2YWw7Ci0KLSAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7Ci0JaW50IG12OwotCi0JcmVndmFsICY9IGNoYW5uZWwtPnJlZ21hc2s7Ci0KLQlmb3IgKG12ID0gY2hhbm5lbC0+cmVnbWFzazsgISAobXYgJiAxKTsgbXYgPj49IDEpCi0JICAgIHJlZ3ZhbCA+Pj0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAocmVndmFsLCBjaGFubmVsLT5tYXh2YWwsCi0JCQkJICBjaGFubmVsLT5pc19zdGVyZW8sIAotCQkJCSAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOwotfQotCi1zdGF0aWMgaW50Ci1hYzk3X2dldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQotewotICAgIGludCByZWNSZWcgPSBhYzk3X2dldF9yZWdpc3RlciAoZGV2LCBBQzk3X1JFQ09SRF9TRUxFQ1QpOwotCi0gICAgaWYgKHJlY1JlZyA8IDApCi0JcmV0dXJuIHJlY1JlZzsKLSAgICBlbHNlIHsKLQlpbnQgeDsKLQlmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gPj0gMDsgeCsrKSB7Ci0JICAgIGlmIChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID09IChyZWNSZWcgJiA3KSkKLQkJcmV0dXJuIG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQl9Ci0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1hYzk3X3NldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBpbnQgb3NzX3JlY21hc2spCi17Ci0gICAgaW50IHg7Ci0KLSAgICBpZiAob3NzX3JlY21hc2sgPT0gMCkKLQlvc3NfcmVjbWFzayA9IFNPVU5EX01JWEVSX01JQzsKLQotICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA+PSAwOyB4KyspIHsgCi0JaWYgKChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID49IDApCi0JICAgICAmJiAob3NzX3JlY21hc2sgJiBtaXhlclJlZ3NbeF0ub3NzX21hc2spKQotCSAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA8IDApCi0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgZWxzZSB7Ci0JaW50IHJlZ3ZhbCA9IChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtIDw8IDgpIHwgbWl4ZXJSZWdzW3hdLnJlY29yZE51bTsKLQlpbnQgcmVzID0gYWM5N19wdXRfcmVnaXN0ZXIgKGRldiwgQUM5N19SRUNPUkRfU0VMRUNULCByZWd2YWwpOwotCWlmIChyZXMgPT0gMCkKLQkgICAgcmV0dXJuIGFjOTdfZ2V0X3JlY21hc2sgKGRldik7Ci0JZWxzZQotCSAgICByZXR1cm4gcmVzOwotICAgIH0KLX0KLQotLyogU2V0IHRoZSBtaXhlciBERVYgdG8gdGhlIGxpc3Qgb2YgdmFsdWVzIGluIFZBTFVFX0xJU1QuICBSZXR1cm4gMCBvbgotICAgc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KLWludAotYWM5N19zZXRfdmFsdWVzIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCAKLQkJIHN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QgKnZhbHVlX2xpc3QpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsICE9IC0xOyB4KyspIHsKLQlpbnQgY2hudW0gPSB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsOwotCXN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGVudCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIGNobnVtKTsKLQlpZiAoY2hlbnQgIT0gTlVMTCkgewotCSAgICB1MTYgdmFsOwotCSAgICBpbnQgcmVzOwotCi0JICAgIGlmIChjaGVudC0+aXNfc3RlcmVvKQotCQl2YWwgPSAodmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ucmlnaHQgPDwgOCkgCi0JCSAgICAgIHwgdmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ubGVmdDsKLQkgICAgZWxzZSB7Ci0JCS8qIFdlIGRvIHRoaXMgc28gdGhlIHJldHVybmVkIHZhbHVlIGxvb2tzIE9LIGluIHRoZQotCQkgICBtaXhlciBhcHAuICBJdCdzIG5vdCBuZWNlc3Nhcnkgb3RoZXJ3aXNlLiAgKi8KLQkJdmFsID0gKHZhbHVlX2xpc3RbeF0udmFsdWUubW9ubyA8PCA4KSAKLQkJICAgICAgfCB2YWx1ZV9saXN0W3hdLnZhbHVlLm1vbm87Ci0JICAgIH0KLQkgICAgcmVzID0gYWM5N19zZXRfbWl4ZXIgKGRldiwgY2hudW0sIHZhbCk7Ci0JICAgIGlmIChyZXMgPCAwKQotCQlyZXR1cm4gcmVzOwotCX0KLQllbHNlCi0JICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1hYzk3X21peGVyX2lvY3RsIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotICAgIGludCByZXQ7Ci0KLSAgICBzd2l0Y2ggKGNtZCkgewotICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6Ci0JcmV0ID0gYWM5N19nZXRfcmVjbWFzayAoZGV2KTsKLQlicmVhazsKLQotICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgotCXsKLQkgICAgaWYgKGdldF91c2VyIChyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldCA9IC1FRkFVTFQ7Ci0JICAgIGVsc2UKLQkJcmV0ID0gYWM5N19zZXRfcmVjbWFzayAoZGV2LCByZXQpOwotCX0KLQlicmVhazsKLQotICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgotCXJldCA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOwotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6Ci0JcmV0ID0gZGV2LT5taXhlcl9kZXZtYXNrOwotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6Ci0JcmV0ID0gZGV2LT5taXhlcl9yZWNtYXNrOwotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6Ci0JcmV0ID0gZGV2LT5taXhlcl9zdGVyZW9tYXNrOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQkvKiBSZWFkIG9yIHdyaXRlIHJlcXVlc3QuICovCi0JcmV0ID0gLUVJTlZBTDsKLQlpZiAoX0lPQ19UWVBFIChjbWQpID09ICdNJykgewotCSAgICBpbnQgZGlyID0gX1NJT0NfRElSIChjbWQpOwotCSAgICBpbnQgY2hhbm5lbCA9IF9JT0NfTlIgKGNtZCk7Ci0KLQkgICAgaWYgKGNoYW5uZWwgPj0gMCAmJiBjaGFubmVsIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTKSB7Ci0JCXJldCA9IDA7Ci0JCWlmIChkaXIgJiBfU0lPQ19XUklURSkgewotCQkgICAgaW50IHZhbDsKLQkJICAgIGlmIChnZXRfdXNlciAodmFsLCAoaW50IF9fdXNlciAqKSBhcmcpID09IDApCi0JCQlyZXQgPSBhYzk3X3NldF9taXhlciAoZGV2LCBjaGFubmVsLCB2YWwpOwotCQkgICAgZWxzZQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJfQotCQlpZiAocmV0ID49IDAgJiYgKGRpciAmIF9TSU9DX1JFQUQpKSB7Ci0JCSAgICBpZiAoZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tjaGFubmVsXQotCQkJPT0gQUM5N19SRUdWQUxfVU5LTk9XTikKLQkJCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF0KLQkJCSAgICA9IGFjOTdfZ2V0X21peGVyX3NjYWxlZCAoZGV2LCBjaGFubmVsKTsKLQkJICAgIHJldCA9IGRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF07Ci0JCX0KLQkgICAgfQotCX0KLQlicmVhazsKLSAgICB9Ci0KLSAgICBpZiAocmV0IDwgMCkKLQlyZXR1cm4gcmV0OwotICAgIGVsc2UKLQlyZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpOwotfQotCi1FWFBPUlRfU1lNQk9MKGFjOTdfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKGFjOTdfc2V0X3ZhbHVlcyk7Ci1FWFBPUlRfU1lNQk9MKGFjOTdfcHV0X3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woYWM5N19taXhlcl9pb2N0bCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTcuaCBiL3NvdW5kL29zcy9hYzk3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODM3YTkuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FjOTcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogYWM5Ny5oIAotICogCi0gKiBkZWZpbml0aW9ucyBmb3IgdGhlIEFDOTcsIEludGVsJ3MgQXVkaW8gQ29kZWMgOTcgU3BlYwotICogYWxzbyBpbmNsdWRlcyBzdXBwb3J0IGZvciBhIGdlbmVyaWMgQUM5NyBpbnRlcmZhY2UKLSAqLwotCi0jaWZuZGVmIF9BQzk3X0hfCi0jZGVmaW5lIF9BQzk3X0hfCi0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0jaW5jbHVkZSAic291bmRfY2FsbHMuaCIKLQotI2RlZmluZSAgQUM5N19SRVNFVCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLy8KLSNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8gIDB4MDAwMiAgICAgIC8vIExpbmUgT3V0Ci0jZGVmaW5lICBBQzk3X0hFQURQSE9ORV9WT0wgICAgICAweDAwMDQgICAgICAvLyAKLSNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9NT05PICAgIDB4MDAwNiAgICAgIC8vIFRBRCBPdXRwdXQKLSNkZWZpbmUgIEFDOTdfTUFTVEVSX1RPTkUgICAgICAgIDB4MDAwOCAgICAgIC8vCi0jZGVmaW5lICBBQzk3X1BDQkVFUF9WT0wgICAgICAgICAweDAwMGEgICAgICAvLyBub25lCi0jZGVmaW5lICBBQzk3X1BIT05FX1ZPTCAgICAgICAgICAweDAwMGMgICAgICAvLyBUQUQgSW5wdXQgKG1vbm8pCi0jZGVmaW5lICBBQzk3X01JQ19WT0wgICAgICAgICAgICAweDAwMGUgICAgICAvLyBNSUMgSW5wdXQgKG1vbm8pCi0jZGVmaW5lICBBQzk3X0xJTkVJTl9WT0wgICAgICAgICAweDAwMTAgICAgICAvLyBMaW5lIElucHV0IChzdGVyZW8pCi0jZGVmaW5lICBBQzk3X0NEX1ZPTCAgICAgICAgICAgICAweDAwMTIgICAgICAvLyBDRCBJbnB1dCAoc3RlcmVvKQotI2RlZmluZSAgQUM5N19WSURFT19WT0wgICAgICAgICAgMHgwMDE0ICAgICAgLy8gbm9uZQotI2RlZmluZSAgQUM5N19BVVhfVk9MICAgICAgICAgICAgMHgwMDE2ICAgICAgLy8gQXV4IElucHV0IChzdGVyZW8pCi0jZGVmaW5lICBBQzk3X1BDTU9VVF9WT0wgICAgICAgICAweDAwMTggICAgICAvLyBXYXZlIE91dHB1dCAoc3RlcmVvKQotI2RlZmluZSAgQUM5N19SRUNPUkRfU0VMRUNUICAgICAgMHgwMDFhICAgICAgLy8KLSNkZWZpbmUgIEFDOTdfUkVDT1JEX0dBSU4gICAgICAgIDB4MDAxYwotI2RlZmluZSAgQUM5N19SRUNPUkRfR0FJTl9NSUMgICAgMHgwMDFlCi0jZGVmaW5lICBBQzk3X0dFTkVSQUxfUFVSUE9TRSAgICAweDAwMjAKLSNkZWZpbmUgIEFDOTdfM0RfQ09OVFJPTCAgICAgICAgIDB4MDAyMgotI2RlZmluZSAgQUM5N19NT0RFTV9SQVRFICAgICAgICAgMHgwMDI0Ci0jZGVmaW5lICBBQzk3X1BPV0VSX0NPTlRST0wgICAgICAweDAwMjYKLQotLyogcmVnaXN0ZXJzIDB4MDAyOCAtIDB4MDA1OCBhcmUgcmVzZXJ2ZWQgKi8KLQotLyogQUMnOTcgMi4wICovCi0jZGVmaW5lIEFDOTdfRVhURU5ERURfSUQJMHgwMDI4CS8qIEV4dGVuZGVkIEF1ZGlvIElEICovCi0jZGVmaW5lIEFDOTdfRVhURU5ERURfU1RBVFVTCTB4MDAyQQkvKiBFeHRlbmRlZCBBdWRpbyBTdGF0dXMgKi8KLSNkZWZpbmUgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgMHgwMDJDICAvKiBQQ00gRnJvbnQgREFDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19QQ01fU1VSUl9EQUNfUkFURSAgMHgwMDJFICAvKiBQQ00gU3Vycm91bmQgREFDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19QQ01fTEZFX0RBQ19SQVRFICAgMHgwMDMwICAvKiBQQ00gTEZFIERBQyBSYXRlICovCi0jZGVmaW5lIEFDOTdfUENNX0xSX0FEQ19SQVRFCTB4MDAzMgkvKiBQQ00gTFIgREFDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19QQ01fTUlDX0FEQ19SQVRFICAgMHgwMDM0ICAvKiBQQ00gTUlDIEFEQyBSYXRlICovCi0jZGVmaW5lIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIgIDB4MDAzNiAgLyogQ2VudGVyICsgTEZFIE1hc3RlciBWb2x1bWUgKi8KLSNkZWZpbmUgQUM5N19TVVJST1VORF9NQVNURVIgICAgMHgwMDM4ICAvKiBTdXJyb3VuZCAoUmVhcikgTWFzdGVyIFZvbHVtZSAqLwotI2RlZmluZSBBQzk3X1JFU0VSVkVEXzNBCTB4MDAzQQkvKiBSZXNlcnZlZCAqLwotLyogcmFuZ2UgMHgzYy0weDU4IC0gTU9ERU0gKi8KLQotLyogcmVnaXN0ZXJzIDB4MDA1YSAtIDB4MDA3YSBhcmUgdmVuZG9yIHJlc2VydmVkICovCi0KLSNkZWZpbmUgIEFDOTdfVkVORE9SX0lEMSAgICAgICAgIDB4MDA3YwotI2RlZmluZSAgQUM5N19WRU5ET1JfSUQyICAgICAgICAgMHgwMDdlCi0KLS8qIHZvbHVtZSBjb250cm9sIGJpdCBkZWZpbmVzICovCi0KLSNkZWZpbmUgQUM5N19NVVRFICAgICAgICAgICAgICAgIDB4ODAwMAotI2RlZmluZSBBQzk3X01JQ0JPT1NUICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIEFDOTdfTEVGVFZPTCAgICAgICAgICAgICAweDNmMDAKLSNkZWZpbmUgQUM5N19SSUdIVFZPTCAgICAgICAgICAgIDB4MDAzZgotCi0vKiByZWNvcmQgbXV4IGRlZmluZXMgKi8KLQotI2RlZmluZSBBQzk3X1JFQ01VWF9NSUMgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIEFDOTdfUkVDTVVYX0NEICAgICAgICAgICAweDAxMDEKLSNkZWZpbmUgQUM5N19SRUNNVVhfVklERU8gICAgICAgIDB4MDIwMiAgICAgIC8qIG5vdCB1c2VkICovCi0jZGVmaW5lIEFDOTdfUkVDTVVYX0FVWCAgICAgICAgICAweDAzMDMgICAgICAKLSNkZWZpbmUgQUM5N19SRUNNVVhfTElORSAgICAgICAgIDB4MDQwNCAgICAgIAotI2RlZmluZSBBQzk3X1JFQ01VWF9TVEVSRU9fTUlYICAgMHgwNTA1Ci0jZGVmaW5lIEFDOTdfUkVDTVVYX01PTk9fTUlYICAgICAweDA2MDYKLSNkZWZpbmUgQUM5N19SRUNNVVhfUEhPTkUgICAgICAgIDB4MDcwNwotCi0KLS8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBiaXQgZGVmaW5lcyAqLwotCi0jZGVmaW5lIEFDOTdfR1BfTFBCSyAgICAgICAgICAgICAweDAwODAgICAgICAvKiBMb29wYmFjayBtb2RlICovCi0jZGVmaW5lIEFDOTdfR1BfTVMgICAgICAgICAgICAgICAweDAxMDAgICAgICAvKiBNaWMgU2VsZWN0IDA9TWljMSwgMT1NaWMyICovCi0jZGVmaW5lIEFDOTdfR1BfTUlYICAgICAgICAgICAgICAweDAyMDAgICAgICAvKiBNb25vIG91dHB1dCBzZWxlY3QgMD1NaXgsIDE9TWljICovCi0jZGVmaW5lIEFDOTdfR1BfUkxCSyAgICAgICAgICAgICAweDA0MDAgICAgICAvKiBSZW1vdGUgTG9vcGJhY2sgLSBNb2RlbSBsaW5lIGNvZGVjICovCi0jZGVmaW5lIEFDOTdfR1BfTExCSyAgICAgICAgICAgICAweDA4MDAgICAgICAvKiBMb2NhbCBMb29wYmFjayAtIE1vZGVtIExpbmUgY29kZWMgKi8KLSNkZWZpbmUgQUM5N19HUF9MRCAgICAgICAgICAgICAgIDB4MTAwMCAgICAgIC8qIExvdWRuZXNzIDE9b24gKi8KLSNkZWZpbmUgQUM5N19HUF8zRCAgICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIDNEIEVuaGFuY2VtZW50IDE9b24gKi8KLSNkZWZpbmUgQUM5N19HUF9TVCAgICAgICAgICAgICAgIDB4NDAwMCAgICAgIC8qIFN0ZXJlbyBFbmhhbmNlbWVudCAxPW9uICovCi0jZGVmaW5lIEFDOTdfR1BfUE9QICAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBQY20gT3V0IFBhdGgsIDA9cHJlIDNELCAxPXBvc3QgM0QgKi8KLQotCi0vKiBwb3dlcmRvd24gY29udHJvbCBhbmQgc3RhdHVzIGJpdCBkZWZpbmVzICovCi0KLS8qIHN0YXR1cyAqLwotI2RlZmluZSBBQzk3X1BXUl9NRE0gICAgICAgICAgICAgMHgwMDEwICAgICAgLyogTW9kZW0gc2VjdGlvbiByZWFkeSAqLwotI2RlZmluZSBBQzk3X1BXUl9SRUYgICAgICAgICAgICAgMHgwMDA4ICAgICAgLyogVnJlZiBub21pbmFsICovCi0jZGVmaW5lIEFDOTdfUFdSX0FOTCAgICAgICAgICAgICAweDAwMDQgICAgICAvKiBBbmFsb2cgc2VjdGlvbiByZWFkeSAqLwotI2RlZmluZSBBQzk3X1BXUl9EQUMgICAgICAgICAgICAgMHgwMDAyICAgICAgLyogREFDIHNlY3Rpb24gcmVhZHkgKi8KLSNkZWZpbmUgQUM5N19QV1JfQURDICAgICAgICAgICAgIDB4MDAwMSAgICAgIC8qIEFEQyBzZWN0aW9uIHJlYWR5ICovCi0KLS8qIGNvbnRyb2wgKi8KLSNkZWZpbmUgQUM5N19QV1JfUFIwICAgICAgICAgICAgIDB4MDEwMCAgICAgIC8qIEFEQyBhbmQgTXV4IHBvd2VyZG93biAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjEgICAgICAgICAgICAgMHgwMjAwICAgICAgLyogREFDIHBvd2VyZG93biAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjIgICAgICAgICAgICAgMHgwNDAwICAgICAgLyogT3V0cHV0IG1peGVyIHBvd2VyZG93biAoVnJlZiBvbikgKi8KLSNkZWZpbmUgQUM5N19QV1JfUFIzICAgICAgICAgICAgIDB4MDgwMCAgICAgIC8qIE91dHB1dCBtaXhlciBwb3dlcmRvd24gKFZyZWYgb2ZmKSAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjQgICAgICAgICAgICAgMHgxMDAwICAgICAgLyogQUMtbGluayBwb3dlcmRvd24gKi8KLSNkZWZpbmUgQUM5N19QV1JfUFI1ICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIEludGVybmFsIENsayBkaXNhYmxlICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSNiAgICAgICAgICAgICAweDQwMDAgICAgICAvKiBIUCBhbXAgcG93ZXJkb3duICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSNyAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBNb2RlbSBvZmYgLSBpZiBzdXBwb3J0ZWQgKi8KLQotLyogdXNlZnVsIHBvd2VyIHN0YXRlcyAqLwotI2RlZmluZSBBQzk3X1BXUl9EMCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLyogZXZlcnl0aGluZyBvbiAqLwotI2RlZmluZSBBQzk3X1BXUl9EMSAgICAgICAgICAgICAgQUM5N19QV1JfUFIwfEFDOTdfUFdSX1BSMXxBQzk3X1BXUl9QUjQKLSNkZWZpbmUgQUM5N19QV1JfRDIgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKLSNkZWZpbmUgQUM5N19QV1JfRDMgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKLSNkZWZpbmUgQUM5N19QV1JfQU5MT0ZGICAgICAgICAgIEFDOTdfUFdSX1BSMnxBQzk3X1BXUl9QUjMgIC8qIGFuYWxvZyBzZWN0aW9uIG9mZiAqLwotCi0vKiBUb3RhbCBudW1iZXIgb2YgZGVmaW5lZCByZWdpc3RlcnMuICAqLwotI2RlZmluZSBBQzk3X1JFR19DTlQgNjQKLQotLyogR2VuZXJpYyBBQzk3IG1peGVyIGludGVyZmFjZS4gKi8KLQotLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZS4gKi8KLXN0cnVjdCBhYzk3X2h3aW50Ci17Ci0gICAgLyogUGVyZm9ybSBhbnkgaGFyZHdhcmUtc3BlY2lmaWMgcmVzZXQgYW5kIGluaXRpYWxpemF0aW9uLiAgUmV0dXJucwotICAgICAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCi0gICAgaW50ICgqcmVzZXRfZGV2aWNlKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldik7Ci0KLSAgICAvKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIFJFRy4gIFRoZSBjYWxsZXIKLSAgICAgICBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXNpcmVkIGNvbnRlbnRzIGFyZSBhdmFpbGFibGUgaW4KLSAgICAgICB0aGUgY2FjaGUgZmlyc3QsIGlmIGFwcGxpY2FibGUuIFJldHVybnMgYSBwb3NpdGl2ZSB1bnNpZ25lZCB2YWx1ZQotICAgICAgIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgdGhlIHJlZ2lzdGVyLCBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICAgY29kZS4gICovCi0gICAgaW50ICgqcmVhZF9yZWcpIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcpOwotCi0gICAgLyogV3JpdGVzIFZBTFVFIHRvIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhCi0gICAgICAgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCi0gICAgaW50ICgqd3JpdGVfcmVnKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpOwotCi0gICAgLyogSGFyZHdhcmUtc3BlY2lmaWMgaW5mb3JtYXRpb24uICovCi0gICAgdm9pZCAqZHJpdmVyX3ByaXZhdGU7Ci0KLSAgICAvKiBUaHJlZSBPU1MgbWFza3MuICovCi0gICAgaW50IG1peGVyX2Rldm1hc2s7Ci0gICAgaW50IG1peGVyX3N0ZXJlb21hc2s7Ci0gICAgaW50IG1peGVyX3JlY21hc2s7Ci0KLSAgICAvKiBUaGUgbWl4ZXIgY2FjaGUuIFRoZSBpbmRpY2VzIGNvcnJlc3BvbmQgdG8gdGhlIEFDOTcgaGFyZHdhcmUgcmVnaXN0ZXIKLSAgICAgICBudW1iZXIgLyAyLCBzaW5jZSB0aGUgcmVnaXN0ZXIgbnVtYmVycyBhcmUgYWx3YXlzIGFuIGV2ZW4gbnVtYmVyLgotCi0gICAgICAgVW5rbm93biB2YWx1ZXMgYXJlIHNldCB0byAtMTsgdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzIGNvbnRhaW4gYQotICAgICAgIC0yLiAgKi8KLSAgICBpbnQgbGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X1JFR19DTlRdOwotCi0gICAgLyogQSBjYWNoZSBvZiB2YWx1ZXMgd3JpdHRlbiB2aWEgT1NTOyB3ZSBuZWVkIHRoZXNlIHNvIHdlIGNhbiByZXR1cm4KLSAgICAgICB0aGUgdmFsdWVzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSB0aGUgdXNlci4KLQotICAgICAgIFdoeSB0aGUgb3JpZ2luYWwgdXNlciB2YWx1ZXM/ICBCZWNhdXNlIHRoZSByZWFsLXdvcmxkIGhhcmR3YXJlCi0gICAgICAgaGFzIGxlc3MgcHJlY2lzaW9uLCBhbmQgc29tZSBleGlzdGluZyBhcHBsaWNhdGlvbnMgYXNzdW1lIHRoYXQKLSAgICAgICB0aGV5IHdpbGwgZ2V0IGJhY2sgdGhlIGV4YWN0IHZhbHVlIHRoYXQgdGhleSB3cm90ZSAoYXVtaXgpLgotCi0gICAgICAgQSAtMSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBubyB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuIHRvIHRoaXMgbWl4ZXIKLSAgICAgICBjaGFubmVsIHZpYSBPU1MuICAqLwotICAgIGludCBsYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdOwotfTsKLQotLyogVmFsdWVzIHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgY2FjaGUuICAqLwotI2RlZmluZSBBQzk3X1JFR1ZBTF9VTktOT1dOIC0xCi0jZGVmaW5lIEFDOTdfUkVHX1VOU1VQUE9SVEVEIC0yCi0KLXN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QKLXsKLSAgICAvKiBNaXhlciBjaGFubmVsIHRvIHNldC4gIExpc3QgaXMgdGVybWluYXRlZCBieSBhIHZhbHVlIG9mIC0xLiAgKi8KLSAgICBpbnQgb3NzX2NoYW5uZWw7Ci0gICAgLyogVGhlIHNjYWxlZCB2YWx1ZSB0byBzZXQgaXQgdG87IHZhbHVlcyBnZW5lcmFsbHkgcmFuZ2UgZnJvbSAwLTEwMC4gKi8KLSAgICB1bmlvbiB7Ci0Jc3RydWN0IHsKLQkgICAgdTggbGVmdCwgcmlnaHQ7Ci0JfSBzdGVyZW87Ci0JdTggbW9ubzsKLSAgICB9IHZhbHVlOwotfTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgYWM5NyBtaXhlciBieSByZXNldHRpbmcgaXQuICAqLwotZXh0ZXJuIGludCBhYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpOwotCi0vKiBTZXRzIHRoZSBtaXhlciBERVYgdG8gdGhlIHZhbHVlcyBpbiBWQUxVRV9MSVNULiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCi0gICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLwotZXh0ZXJuIGludCBhYzk3X3NldF92YWx1ZXMgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsCi0JCQkgICAgc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdCAqdmFsdWVfbGlzdCk7Ci0KLS8qIFdyaXRlcyB0aGUgc3BlY2lmaWVkIFZBTFVFIHRvIHRoZSBBQzk3IHJlZ2lzdGVyIFJFRyBpbiB0aGUgbWl4ZXIuCi0gICBUYWtlcyBjYXJlIG9mIHNldHRpbmcgdGhlIGxhc3Qtd3JpdHRlbiBjYWNoZSBhcyB3ZWxsLiAgKi8KLWV4dGVybiBpbnQgYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKTsKLQotLyogRGVmYXVsdCBpb2N0bC4gKi8KLWV4dGVybiBpbnQgYWM5N19taXhlcl9pb2N0bCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgdm9pZCBfX3VzZXIgKiBhcmcpOwotCi0jZW5kaWYKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjaS5jIGIvc291bmQvb3NzL2FjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmZhYzM3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDcxMiArMCwwIEBACi0vKgotICogQXVkaW8gQ29tbWFuZCBJbnRlcmZhY2UgKEFDSSkgZHJpdmVyIChzb3VuZC9hY2kuYykKLSAqCi0gKiBBQ0kgaXMgYSBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1pY3JvY29udHJvbGxlciBvbgotICogc29tZSBzb3VuZCBjYXJkcyBwcm9kdWNlZCBieSBtaXJvLCBlLmcuIHRoZSBtaXJvU09VTkQgUENNMTIgYW5kCi0gKiBQQ00yMC4gVGhlIEFDSSBoYXMgYmVlbiBkZXZlbG9wZWQgZm9yIG1pcm8gYnkgTm9yYmVydG8gUGVsbGljY2kKLSAqIDxwZWxsaWNjaUBob21lLmNvbT4uIFNwZWNpYWwgdGhhbmtzIHRvIGJvdGggaGltIGFuZCBtaXJvIGZvcgotICogcHJvdmlkaW5nIHRoZSBBQ0kgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKiBUaGUgbWFpbiBmdW5jdGlvbiBvZiB0aGUgQUNJIGlzIHRvIGNvbnRyb2wgdGhlIG1peGVyIGFuZCB0byBnZXQgYQotICogcHJvZHVjdCBpZGVudGlmaWNhdGlvbi4gT24gdGhlIFBDTTIwLCBBQ0kgYWxzbyBjb250cm9scyB0aGUgcmFkaW8KLSAqIHR1bmVyIG9uIHRoaXMgY2FyZCwgdGhpcyBpcyBzdXBwb3J0ZWQgaW4gdGhlIFZpZGVvIGZvciBMaW51eCAKLSAqIG1pcm9wY20yMCBkcml2ZXIuCi0gKiAtCi0gKiBUaGlzIGlzIGEgZnVsbGZlYXR1cmVkIGltcGxlbWVudGF0aW9uLiBVbnN1cHBvcnRlZCBmZWF0dXJlcwotICogYXJlIGJ1Z3MuLi4gKDoKLSAqCi0gKiBJdCBpcyBub3QgbG9uZ2VyIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBtYWQxNiBtb2R1bGUgZmlyc3QuIFRoZQotICogdXNlciBpcyBjdXJyZW50bHkgcmVzcG9uc2libGUgdG8gc2V0IHRoZSBtYWQxNiBtaXhlciBjb3JyZWN0bHkuCi0gKgotICogVG8gdG9nZ2xlIHRoZSBzb2xvIG1vZGUgZm9yIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiBqdXN0IHVzZSB0aGUgT1NTCi0gKiByZWNvcmQgc3dpdGNoIGZvciB0aGUgcGNtICgnd2F2ZScpIGNvbnRyb2xsZXIuICAgICAgICAgICBSb2JlcnQKLSAqIC0KLSAqCi0gKiBSZXZpc2lvbiBoaXN0b3J5OgotICoKLSAqICAgMTk5NS0xMS0xMCAgTWFya3VzIEt1aG4gPG1za3VobkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+Ci0gKiAgICAgICAgRmlyc3QgdmVyc2lvbiB3cml0dGVuLgotICogICAxOTk1LTEyLTMxICBNYXJrdXMgS3VobgotICogICAgICAgIFNlY29uZCByZXZpc2lvbiwgZ2VuZXJhbCBjb2RlIGNsZWFudXAuCi0gKiAgIDE5OTYtMDUtMTYJIEhhbm51IFNhdm9sYWluZW4KLSAqCSAgSW50ZWdyYXRlZCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBkcml2ZXIuCi0gKiAgIDE5OTYtMDUtMjggIE1hcmt1cyBLdWhuCi0gKiAgICAgICAgSW5pdGlhbGl6ZSBDUzQyMzFBIG1peGVyLCBtYWtlIEFDSSBmaXJzdCBtaXhlciwKLSAqICAgICAgICB1c2UgbmV3IHByaXZhdGUgbWl4ZXIgQVBJIGZvciBzb2xvIG1vZGUuCi0gKiAgIDE5OTgtMDgtMTggIFJ1dXJkIFJlaXRzbWEgPFIuQS5SZWl0c21hQHdibXQudHVkZWxmdC5ubD4KLSAqCSAgU21hbGwgbW9kaWZpY2F0aW9uIHRvIGV4cG9ydCBBQ0kgZnVuY3Rpb25zIGFuZCAKLSAqCSAgY29tcGxldGUgbW9kdWxhcmlzYXRpb24uCi0gKiAgIDIwMDAtMDYtMjAgIFJvYmVydCBTaWVtZXIgPFJvYmVydC5TaWVtZXJAZ214LmRlPgotICogICAgICAgIERvbid0IGluaXRpYWxpemUgdGhlIENTNDIzMUEgbWl4ZXIgYW55bW9yZSwgc28gdGhlIGNvZGUgaXMKLSAqICAgICAgICB3b3JraW5nIGFnYWluLCBhbmQgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBmaXQgaW4gdG9kYXlzCi0gKiAgICAgICAga2VybmVscy4KLSAqICAgMjAwMC0wOC0yNiAgUm9iZXJ0IFNpZW1lcgotICogICAgICAgIENsZWFuIHVwIGFuZCByZXdyaXRlIGZvciAyLjQueC4gTWF5YmUgaXQncyBTTVAgc2FmZSBub3cuLi4gKDoKLSAqICAgICAgICBpb2N0bCBidWdmaXgsIGFuZCBpbnRlZ3JhdGlvbiBvZiBzb2xvLW1vZGUgaW50byBPU1MtQVBJLAotICogICAgICAgIGFkZGVkIChPU1MtbGltaXRlZCkgZXF1YWxpemVyIHN1cHBvcnQsIHJldHVybiB2YWx1ZSBidWdmaXgsCi0gKiAgICAgICAgY2hhbmdlZCBwYXJhbSBhY2lfcmVzZXQgdG8gcmVzZXQsIG5ldyBwYXJhbXM6IGlkZSwgd3NzLgotICogICAyMDAxLTA0LTIwICBSb2JlcnQgU2llbWVyCi0gKiAgICAgICAgZXZlbiBtb3JlIGNsZWFudXBzLi4uCi0gKiAgIDIwMDEtMTAtMDggIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgotICogICAJICBHZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiwgLmJzcyBvcHRpbWl6YXRpb25zLCB1c2Ugc2V0X2N1cnJlbnRfc3RhdGUKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi1pbnQgYWNpX3BvcnQ7CS8qIGFzIGRldGVybWluZWQgYnkgYml0IDQgaW4gdGhlIE9QVGkgOTI5IE1DNCByZWdpc3RlciAqLwotc3RhdGljIGludCBhY2lfaWRjb2RlWzJdOwkvKiBtYW51ZmFjdHVyZXIgYW5kIHByb2R1Y3QgSUQgKi8KLWludCBhY2lfdmVyc2lvbjsJLyogQUNJIGZpcm13YXJlIHZlcnNpb24JKi8KLQotRVhQT1JUX1NZTUJPTChhY2lfcG9ydCk7Ci1FWFBPUlRfU1lNQk9MKGFjaV92ZXJzaW9uKTsKLQotI2luY2x1ZGUgImFjaS5oIgotCi0KLXN0YXRpYyBpbnQgYWNpX3NvbG87CS8qIHN0YXR1cyBiaXQgb2YgdGhlIGNhcmQgdGhhdCBjYW4ndCBiZQkJKgotCQkJICogY2hlY2tlZCB3aXRoIEFDSSB2ZXJzaW9ucyBwcmlvciB0byAweGIwCSovCi1zdGF0aWMgaW50IGFjaV9hbXA7ICAgLyogc3RhdHVzIGJpdCBmb3IgcG93ZXItYW1wL2xpbmUtb3V0IGxldmVsCi0JCQkgICBidXQgSSBoYXZlIG5vIGRvY3MgYWJvdXQgd2hhdCBpcyB3aGF0Li4uICovCi1zdGF0aWMgaW50IGFjaV9taWNwcmVhbXA9MzsgLyogbWljcm9waG9uZSBwcmVhbXAtbGV2ZWwgdGhhdCBjYW4ndCBiZSAgICAqCi0JCQkgKiBjaGVja2VkIHdpdGggQUNJIHZlcnNpb25zIHByaW9yIHRvIDB4YjAJKi8KLQotc3RhdGljIGludCBtaXhlcl9kZXZpY2U7Ci1zdGF0aWMgc3RydWN0IG11dGV4IGFjaV9tdXRleDsKLQotI2lmZGVmIE1PRFVMRQotc3RhdGljIGludCByZXNldDsKLW1vZHVsZV9wYXJhbShyZXNldCwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJlc2V0LCJXaGVuIHNldCB0byAxLCByZXNldCBhY2kgbWl4ZXIuIik7Ci0jZWxzZQotc3RhdGljIGludCByZXNldCA9IDE7Ci0jZW5kaWYKLQotc3RhdGljIGludCBpZGU9LTE7Ci1tb2R1bGVfcGFyYW0oaWRlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpZGUsIjEgZW5hYmxlLCAwIGRpc2FibGUgaWRlLXBvcnQgLSB1bnRlc3RlZCIKLQkJICIgZGVmYXVsdDogZG8gbm90aGluZyIpOwotc3RhdGljIGludCB3c3M9LTE7Ci1tb2R1bGVfcGFyYW0od3NzLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyh3c3MsImNoYW5nZSBiZXR3ZWVuIEFDSS9XU1MtbWl4ZXI7IHVzZSAwIGFuZCAxIC0gdW50ZXN0ZWQiCi0JCSAiIGRlZmF1bHQ6IGRvIG5vdGhpbmc7IGZvciBQQ00xLXBybyBvbmx5Iik7Ci0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgcHJpbnRfYml0cyh1bnNpZ25lZCBjaGFyIGMpCi17Ci0JaW50IGo7Ci0JcHJpbnRrKEtFUk5fREVCVUcgImFjaTogIik7Ci0KLQlmb3IgKGo9Nzsgaj49MDsgai0tKSB7Ci0JCXByaW50aygiJWQiLCAoYyA+PiBqKSAmIDB4MSk7Ci0JfQotCi0JcHJpbnRrKCJcbiIpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGJ1c3kgd2FpdCBjb2RlIG5vcm1hbGx5IHJlcXVpcmVzIGxlc3MgdGhhbiAxNSBsb29wcyBhbmQKLSAqIHByYWN0aWNhbGx5IGFsd2F5cyBsZXNzIHRoYW4gMTAwIGxvb3BzIG9uIG15IGk0ODYvRFgyIDY2IE1Iei4KLSAqCi0gKiBXYXJuaW5nOiBXYWl0aW5nIG9uIHRoZSBnZW5lcmFsIHN0YXR1cyBmbGFnIGFmdGVyIHJlc2V0aW5nIHRoZSBNVVRFCi0gKiBmdW5jdGlvbiBjYW4gdGFrZSBhIFZFUlkgbG9uZyB0aW1lLCBiZWNhdXNlIHRoZSBQQ00xMiBkb2VzIHNvbWUga2luZAotICogb2YgZmFkZS1pbiBlZmZlY3QuIEZvciB0aGlzIHJlYXNvbiwgYWNjZXNzIHRvIHRoZSBNVVRFIGZ1bmN0aW9uIGhhcwotICogbm90IGJlZW4gaW1wbGVtZW50ZWQgYXQgYWxsLgotICoKLSAqIC0gVGhlIE9TUyBpbnRlcmZhY2UgaGFzIG5vIG11dGUgb3B0aW9uLiBJdCB0YWtlcyBhYm91dCAzIHNlY29uZHMgdG8KLSAqIGZhZGUtaW4gb24gbXkgUENNMjAuIGJ1c3lfd2FpdCgpIGhhbmRsZXMgaXQgZ3JlYXQgbm93Li4uICAgICBSb2JlcnQKLSAqLwotCi1zdGF0aWMgaW50IGJ1c3lfd2FpdCh2b2lkKQotewotCSNkZWZpbmUgTUlOVElNRSA1MDAKLQlsb25nIHRpbWVvdXQ7Ci0JdW5zaWduZWQgY2hhciBieXRlOwotCi0JZm9yICh0aW1lb3V0ID0gMTsgdGltZW91dCA8PSBNSU5USU1FKzMwOyB0aW1lb3V0KyspIHsKLQkJaWYgKCgoYnl0ZT1pbmIoQlVTWV9SRUdJU1RFUikpICYgMSkgPT0gMCkgewotCQkJaWYgKHRpbWVvdXQgPj0gTUlOVElNRSkKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiYWNpOiBHb3QgUkVBRFlGTEFHIGluIHJvdW5kICVsZC5cbiIsIHRpbWVvdXQtTUlOVElNRSk7Ci0JCQlyZXR1cm4gYnl0ZTsKLQkJfQotCQlpZiAodGltZW91dCA+PSBNSU5USU1FKSB7Ci0JCQlsb25nIG91dD0xMCpIWjsKLQkJCXN3aXRjaCAodGltZW91dC1NSU5USU1FKSB7Ci0JCQljYXNlIDAgLi4uIDk6Ci0JCQkJb3V0IC89IDEwOwotCQkJY2FzZSAxMCAuLi4gMTk6Ci0JCQkJb3V0IC89IDEwOwotCQkJY2FzZSAyMCAuLi4gMzA6Ci0JCQkJb3V0IC89IDEwOwotCQkJZGVmYXVsdDoKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dChvdXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXByaW50ayhLRVJOX1dBUk5JTkcgImFjaTogYnVzeV93YWl0KCkgdGltZSBvdXQuXG4iKTsKLQlyZXR1cm4gLUVCVVNZOwotfQotCi0vKiBUaGUgZm91ciBBQ0kgY29tbWFuZCB0eXBlcyBhcmUgZnVja2VkIHVwLiBbLToKLSAqIGltcGxpZWQgaXM6IDF3ICAgICAgLSBzcGVjaWFsIGNhc2UgZm9yIElOSVQKLSAqIHdyaXRlICAgaXM6IDJ3MXIKLSAqIHJlYWQgICAgaXM6IHgoMXcxcikgd2hlcmUgeCBpcyAxIG9yIDIgKDEgQ0hFQ0tfU0lHLCAxIENIRUNLX1NURVIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIFZFUlNJT04sIDIgSURDT0RFKQotICogIHRoZSBjb21tYW5kIGlzIG9ubHkgaW4gdGhlIGZpcnN0IHdyaXRlLCByZXN0IGlzIHByb3RvY29sIG92ZXJoZWFkCi0gKgotICogaW5kZXhlZCBpcyB0ZWNobmljYWxseSBhIHdyaXRlIGFuZCB1c2VkIGZvciBTVEFUVVMKLSAqIGFuZCB0aGUgc3BlY2lhbCBjYXNlIGZvciBUVU5FIGlzOiAzdzFyCi0gKiAKLSAqIEhlcmUgdGhlIG5ldyBnZW5lcmFsIHNoZW1lOiBUVU5FIC0tPiBhY2lfcndfY21kKHgsICB5LCAgeikKLSAqICAgICAgICAgICAgICAgIGluZGV4ZWQgYW5kIHdyaXRlIC0tPiBhY2lfcndfY21kKHgsICB5LCAtMSkKLSAqICAgICAgICAgICBpbXBsaWVkIGFuZCByZWFkICh4PTEpIC0tPiBhY2lfcndfY21kKHgsIC0xLCAtMSkKLSAqCi0gKiBSZWFkICh4Pj0yKSBpcyBub3QgaW1wbGVtZW50ZWQgKG9ubHkgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24pLgotICogVXNlIGFjaV9pZGNvZGVbMl0gYW5kIGFjaV92ZXJzaW9uLi4uICAgICAgICAgICAgICAgICAgICBSb2JlcnQKLSAqLwotCi0vKiBTb21lIG5vdGVzIGZvciBlcnJvciBkZXRlY3Rpb246IHRoZW9yZXRpY2FsbHkgaXQgaXMgcG9zc2libGUuCi0gKiBCdXQgaXQgZG91YmxlcyB0aGUgSS9PLXRyYWZmaWMgZnJvbSB3dyhyKSB0byB3d3dydyhyKSBpbiB0aGUgbm9ybWFsIAotICogY2FzZSBhbmQgZG9lc24ndCBzZWVtIHRvIGJlIGRlc2lnbmVkIGZvciB0aGF0Li4uICAgICAgICBSb2JlcnQKLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBhY2lfcmF3d3JpdGUodW5zaWduZWQgY2hhciBieXRlKQotewotCWlmIChidXN5X3dhaXQoKSA+PSAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgImFjaV9yYXd3cml0ZSglZClcbiIsIGJ5dGUpOwotI2VuZGlmCi0JCW91dGIoYnl0ZSwgQ09NTUFORF9SRUdJU1RFUik7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gLUVCVVNZOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhY2lfcmF3cmVhZCh2b2lkKQotewotCXVuc2lnbmVkIGNoYXIgYnl0ZTsKLQotCWlmIChidXN5X3dhaXQoKSA+PSAwKSB7Ci0JCWJ5dGU9aW5iKFNUQVRVU19SRUdJU1RFUik7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkID0gYWNpX3Jhd3JlYWQoKVxuIiwgYnl0ZSk7Ci0jZW5kaWYKLQkJcmV0dXJuIGJ5dGU7Ci0JfSBlbHNlCi0JCXJldHVybiAtRUJVU1k7Ci19Ci0KLQotaW50IGFjaV9yd19jbWQoaW50IHdyaXRlMSwgaW50IHdyaXRlMiwgaW50IHdyaXRlMykKLXsKLQlpbnQgd3JpdGVbXSA9IHt3cml0ZTEsIHdyaXRlMiwgd3JpdGUzfTsKLQlpbnQgcmVhZCA9IC1FSU5UUiwgaTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFjaV9tdXRleCkpCi0JCWdvdG8gb3V0OwotCi0JZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0JCWlmICh3cml0ZVtpXTwgMCB8fCB3cml0ZVtpXSA+IDI1NSkKLQkJCWJyZWFrOwotCQllbHNlIHsKLQkJCXJlYWQgPSBhY2lfcmF3d3JpdGUod3JpdGVbaV0pOwotCQkJaWYgKHJlYWQgPCAwKQotCQkJCWdvdG8gb3V0X3VwOwotCQl9Ci0JCQotCX0KLQkKLQlyZWFkID0gYWNpX3Jhd3JlYWQoKTsKLW91dF91cDoJbXV0ZXhfdW5sb2NrKCZhY2lfbXV0ZXgpOwotb3V0OglyZXR1cm4gcmVhZDsKLX0KLQotRVhQT1JUX1NZTUJPTChhY2lfcndfY21kKTsKLQotc3RhdGljIGludCBzZXR2b2x1bWUoaW50IF9fdXNlciAqYXJnLCAKLQkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCi17Ci0JaW50IHZvbCwgcmV0LCB1c2Vydm9sLCBidWY7Ci0KLQlfX2dldF91c2VyKHVzZXJ2b2wsIGFyZyk7Ci0KLQkvKiBsZWZ0IGNoYW5uZWwgKi8KLQl2b2wgPSB1c2Vydm9sICYgMHhmZjsKLQlpZiAodm9sID4gMTAwKQotCQl2b2wgPSAxMDA7Ci0Jdm9sID0gU0NBTEUoMTAwLCAweDIwLCB2b2wpOwotCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCi0JCXJldHVybiBidWY7Ci0JcmV0ID0gU0NBTEUoMHgyMCwgMTAwLCB2b2wpOwotCi0KLQkvKiByaWdodCBjaGFubmVsICovCi0Jdm9sID0gKHVzZXJ2b2wgPj4gOCkgJiAweGZmOwotCWlmICh2b2wgPiAxMDApCi0JCXZvbCA9IDEwMDsKLQl2b2wgPSBTQ0FMRSgxMDAsIDB4MjAsIHZvbCk7Ci0JaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCi0JCXJldHVybiBidWY7Ci0JcmV0IHw9IFNDQUxFKDB4MjAsIDEwMCwgdm9sKSA8PCA4OwotIAotCV9fcHV0X3VzZXIocmV0LCBhcmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0dm9sdW1lKGludCBfX3VzZXIgKmFyZywKLQkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCi17Ci0JaW50IHZvbDsKLQlpbnQgYnVmOwotCi0JLyogbGVmdCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQotCQlyZXR1cm4gYnVmOwotCXZvbCA9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCk7Ci0JCi0JLyogcmlnaHQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLCByaWdodF9pbmRleCkpPDApCi0JCXJldHVybiBidWY7Ci0Jdm9sIHw9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCkgPDwgODsKLQotCV9fcHV0X3VzZXIodm9sLCBhcmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIGVxdWFsaXplciBpcyBzb21ld2hhdCBzdHJhbmdlIG9uIHRoZSBBQ0kuIEZyb20gLTEyZEIgdG8gKzEyZEIKLSAqIHdyaXRlOiAgMHhmZi4uZG93bi50by4uMHg4MD09MHgwMC4udXAudG8uLjB4N2YKLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9vc3MyYWNpKHVuc2lnbmVkIGludCB2b2wpCi17Ci0JaW50IGJvb3N0PTA7Ci0JdW5zaWduZWQgaW50IHJldDsKLQotCWlmICh2b2wgPiAxMDApCi0JCXZvbCA9IDEwMDsKLQlpZiAodm9sID4gNTApIHsKLQkJdm9sIC09IDUxOwotCQlib29zdD0xOwotCX0KLQlpZiAoYm9vc3QpCi0JCXJldD1TQ0FMRSg0OSwgMHg3ZSwgdm9sKSsxOwotCWVsc2UKLQkJcmV0PTB4ZmYgLSBTQ0FMRSg1MCwgMHg3Ziwgdm9sKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9hY2kyb3NzKHVuc2lnbmVkIGludCB2b2wpCi17Ci0JaWYgKHZvbCA8IDB4ODApCi0JCXJldHVybiBTQ0FMRSgweDdmLCA1MCwgdm9sKSArIDUwOwotCWVsc2UKLQkJcmV0dXJuIFNDQUxFKDB4N2YsIDUwLCAweGZmLXZvbCk7Ci19Ci0KLQotc3RhdGljIGludCBzZXRlcXVhbGl6ZXIoaW50IF9fdXNlciAqYXJnLCAKLQkJCXVuc2lnbmVkIGNoYXIgbGVmdF9pbmRleCwgdW5zaWduZWQgY2hhciByaWdodF9pbmRleCkKLXsKLQlpbnQgYnVmOwotCXVuc2lnbmVkIGludCB2b2w7Ci0KLQlfX2dldF91c2VyKHZvbCwgYXJnKTsKLQotCS8qIGxlZnQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgZXFfb3NzMmFjaSh2b2wgJiAweGZmKSkpPDApCi0JCXJldHVybiBidWY7Ci0KLQkvKiByaWdodCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgZXFfb3NzMmFjaSgodm9sPj44KSAmIDB4ZmYpKSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQotCS8qIHRoZSBBQ0kgZXF1YWxpemVyIGlzIG1vcmUgcHJlY2lzZSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldGVxdWFsaXplcihpbnQgX191c2VyICphcmcsCi0JCQl1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCi17Ci0JaW50IGJ1ZjsKLQl1bnNpZ25lZCBpbnQgdm9sOwotCi0JLyogbGVmdCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQotCQlyZXR1cm4gYnVmOwotCXZvbCA9IGVxX2FjaTJvc3MoYnVmKTsKLQkKLQkvKiByaWdodCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIHJpZ2h0X2luZGV4KSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQl2b2wgfD0gZXFfYWNpMm9zcyhidWYpIDw8IDg7Ci0KLQlfX3B1dF91c2VyKHZvbCwgYXJnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFjaV9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JaW50IHZvbCwgYnVmOwotCWludCBfX3VzZXIgKnAgPSBhcmc7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MDEsIDB4MDApOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQ0Q6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYywgMHgzNCk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9NSUM6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzOCwgMHgzMCk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MzksIDB4MzEpOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfU1lOVEg6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYiwgMHgzMyk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9QQ006Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYSwgMHgzMik7Ci0JY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9SQURJTyk6IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORTE6ICAvKiBBVVgxIG9yIHJhZGlvICovCi0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzZCwgMHgzNSk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMjogIC8qIEFVWDIgKi8KLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNlLCAweDM2KTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0JBU1M6ICAgLyogc2V0IGJhbmQgb25lIGFuZCB0d28gKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJaWYgKChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NDgsIDB4NDApKSB8fCAKLQkJCSAgICAoYnVmPXNldGVxdWFsaXplcihwLCAweDQ5LCAweDQxKSkpOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRTogLyogc2V0IGJhbmQgc2l4IGFuZCBzZXZlbiAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQlpZiAoKGJ1Zj1zZXRlcXVhbGl6ZXIocCwgMHg0ZCwgMHg0NSkpIHx8IAotCQkJICAgIChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NGUsIDB4NDYpKSk7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU46ICAvKiBNSUMgcHJlLWFtcCAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJX19nZXRfdXNlcih2b2wsIHApOwotCQkJdm9sID0gdm9sICYgMHhmZjsKLQkJCWlmICh2b2wgPiAxMDApCi0JCQkJdm9sID0gMTAwOwotCQkJdm9sID0gU0NBTEUoMTAwLCAzLCB2b2wpOwotCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfV1JJVEVfSUdBSU4sIHZvbCkpPDApCi0JCQkJcmV0dXJuIGJ1ZjsKLQkJCWFjaV9taWNwcmVhbXAgPSB2b2w7Ci0JCQl2b2wgPSBTQ0FMRSgzLCAxMDAsIHZvbCk7Ci0JCQl2b2wgfD0gKHZvbCA8PCA4KTsKLQkJCV9fcHV0X3VzZXIodm9sLCBwKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU46ICAvKiBQb3dlci1hbXAvbGluZS1vdXQgbGV2ZWwgKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdBJyB8fCBhY2lfaWRjb2RlWzFdPT0nQicpIHsKLQkJCV9fZ2V0X3VzZXIoYnVmLCBwKTsKLQkJCWJ1ZiA9IGJ1ZiAmIDB4ZmY7Ci0JCQlpZiAoYnVmID4gNTApCi0JCQkJdm9sID0gMTsKLQkJCWVsc2UKLQkJCQl2b2wgPSAwOwotCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfU0VUX1BPV0VSQU1QLCB2b2wpKTwwKQotCQkJCXJldHVybiBidWY7Ci0JCQlhY2lfYW1wID0gdm9sOwotCQkJaWYgKGFjaV9hbXApCi0JCQkJYnVmID0gKDEwMCB8fCAxMDA8PDgpOwotCQkJZWxzZQotCQkJCWJ1ZiA9IDA7Ci0JCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKLQkJLyogaGFuZGxlIHNvbG8gbW9kZSBjb250cm9sICovCi0JCV9fZ2V0X3VzZXIoYnVmLCBwKTsKLQkJLyogdW5zZXQgc29sbyB3aGVuIFJFQ1NSQyBmb3IgUENNIGlzIHJlcXVlc3RlZCAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJdm9sID0gIShidWYgJiBTT1VORF9NQVNLX1BDTSk7Ci0JCQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKEFDSV9TRVRfU09MT01PREUsIHZvbCkpPDApCi0JCQkJcmV0dXJuIGJ1ZjsKLQkJCWFjaV9zb2xvID0gdm9sOwotCQl9Ci0JCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMik7Ci0JCWlmIChhY2lfaWRjb2RlWzFdID09ICdDJykgLyogUENNMjAgcmFkaW8gKi8KLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1JBRElPOwotCQllbHNlCi0JCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKLQkJaWYgKCFhY2lfc29sbykKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1BDTTsKLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKLQkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfCBTT1VORF9NQVNLX0lHQUlOIHwKLQkJCQlTT1VORF9NQVNLX0JBU1MgIHwgU09VTkRfTUFTS19UUkVCTEUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0InOiAvKiBQQ00xMiAqLwotCQkJYnVmIHw9IChTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19JR0FJTiB8Ci0JCQkJU09VTkRfTUFTS19PR0FJTik7Ci0JCQlicmVhazsKLQkJY2FzZSAnQSc6IC8qIFBDTTEtcHJvICovCi0JCQlidWYgfD0gKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX09HQUlOKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7Ci0JCX0KLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKLQkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfAotCQkJCVNPVU5EX01BU0tfQkFTUyAgfCBTT1VORF9NQVNLX1RSRUJMRSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOwotCQl9Ci0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6Ci0JCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMnwgU09VTkRfTUFTS19QQ00pOwotCQlpZiAoYWNpX2lkY29kZVsxXSA9PSAnQycpIC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gU09VTkRfTUFTS19SQURJTzsKLQkJZWxzZQotCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7Ci0KLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDOgotCQlidWYgPSAoU09VTkRfTUFTS19DRCAgICB8IFNPVU5EX01BU0tfTUlDICAgfCBTT1VORF9NQVNLX0xJTkUgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX0xJTkUyKTsKLQkJLyogZG8gd2UgbmVlZCBhY2lfc29sbyBvciBjYW4gSSBnZXQgaXQgZnJvbSB0aGUgQUNJPyAqLwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQic6IC8qIFBDTTEyICovCi0JCWNhc2UgJ0MnOiAvKiBQQ00yMCByYWRpbyAqLwotCQkJaWYgKGFjaV92ZXJzaW9uID49IDB4YjApIHsKLQkJCQlpZiAoKHZvbD1hY2lfcndfY21kKEFDSV9TVEFUVVMsCi0JCQkJCQkgICAgQUNJX1NfR0VORVJBTCwgLTEpKTwwKQotCQkJCQlyZXR1cm4gdm9sOwotCQkJCWlmICh2b2wgJiAweDIwKQotCQkJCQlidWYgfD0gU09VTkRfTUFTS19QQ007Ci0JCQl9Ci0JCQllbHNlCi0JCQkJaWYgKCFhY2lfc29sbykKLQkJCQkJYnVmIHw9IFNPVU5EX01BU0tfUENNOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlidWYgfD0gU09VTkRfTUFTS19QQ007Ci0JCX0KLQkJaWYgKGFjaV9pZGNvZGVbMV0gPT0gJ0MnKSAvKiBQQ00yMCByYWRpbyAqLwotCQkJYnVmIHw9IFNPVU5EX01BU0tfUkFESU87Ci0JCWVsc2UKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOwotCi0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6Ci0JCV9fcHV0X3VzZXIoMCwgcCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNCwgMHgwMyk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NEOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGEsIDB4MDkpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9NSUM6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNiwgMHgwNSk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkU6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwOCwgMHgwNyk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NZTlRIOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGMsIDB4MGIpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9QQ006Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwZSwgMHgwZCk7Ci0JY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JBRElPKTogLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUxOiAgLyogQVVYMSAqLwotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MTEsIDB4MTApOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9MSU5FMjogIC8qIEFVWDIgKi8KLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDEzLCAweDEyKTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfQkFTUzogICAvKiBnZXQgYmFuZCBvbmUgKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJcmV0dXJuIGdldGVxdWFsaXplcihwLCAweDIzLCAweDIyKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfVFJFQkxFOiAvKiBnZXQgYmFuZCBzZXZlbiAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQlyZXR1cm4gZ2V0ZXF1YWxpemVyKHAsIDB4MmYsIDB4MmUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9JR0FJTjogIC8qIE1JQyBwcmUtYW1wICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQicgfHwgYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQkvKiBhY2lfbWljcHJlYW1wIG9yIEFDST8gKi8KLQkJCWlmIChhY2lfdmVyc2lvbiA+PSAweGIwKSB7Ci0JCQkJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsCi0JCQkJCQkJIEFDSV9TX1JFQURfSUdBSU4pKTwwKQotCQkJCQlyZXR1cm4gYnVmOwotCQkJfQotCQkJZWxzZQotCQkJCWJ1Zj1hY2lfbWljcHJlYW1wOwotCQkJdm9sID0gU0NBTEUoMywgMTAwLCBidWYgPD0gMyA/IGJ1ZiA6IDMpOwotCQkJdm9sIHw9IHZvbCA8PCA4OwotCQkJX19wdXRfdXNlcih2b2wsIHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX09HQUlOOgotCQlpZiAoYWNpX2FtcCkKLQkJCWJ1ZiA9ICgxMDAgfHwgMTAwPDw4KTsKLQkJZWxzZQotCQkJYnVmID0gMDsKLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhY2lfbWl4ZXJfb3BlcmF0aW9ucyA9Ci17Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmlkICAgID0gIkFDSSIsCi0JLmlvY3RsID0gYWNpX21peGVyX2lvY3RsCi19OwotCi0vKgotICogVGhlcmUgaXMgYWxzbyBhbiBpbnRlcm5hbCBtaXhlciBpbiB0aGUgY29kZWMgKENTNDIzMUEgb3IgQUQxODQ1KSwKLSAqIHRoYXQgZGVzZXJ2ZXMgbm8gcHVycG9zZSBpbiBhbiBBQ0kgYmFzZWQgc3lzdGVtIHdoaWNoIHVzZXMgYW4KLSAqIGV4dGVybmFsIEFDSSBjb250cm9sbGVkIHN0ZXJlbyBtaXhlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBjb2RlYwotICogbWl4ZXIgaGFzIHRoZSBBVVgxIGlucHV0IHNlbGVjdGVkIGFzIHRoZSByZWNvcmRpbmcgc291cmNlLCB0aGF0IHRoZQotICogaW5wdXQgZ2FpbiBpcyBzZXQgbmVhciBtYXhpbXVtIGFuZCB0aGF0IHRoZSBvdGhlciBjaGFubmVscyBnb2luZwotICogZnJvbSB0aGUgaW5wdXRzIHRvIHRoZSBjb2RlYyBvdXRwdXQgYXJlIG11dGVkLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGF0dGFjaF9hY2kodm9pZCkKLXsKLQljaGFyICpib2FyZG5hbWU7Ci0JaW50IGksIHJjID0gLUVCVVNZOwotCi0JbXV0ZXhfaW5pdCgmYWNpX211dGV4KTsKLQotCW91dGIoMHhFMywgMHhmOGYpOyAvKiBXcml0ZSBNQUQxNiBwYXNzd29yZCAqLwotCWFjaV9wb3J0ID0gKGluYigweGY5MCkgJiAweDEwKSA/Ci0JCTB4MzQ0OiAweDM1NDsgLyogR2V0IGFjaV9wb3J0IGZyb20gTUM0X1BPUlQgKi8KLQotCWlmICghcmVxdWVzdF9yZWdpb24oYWNpX3BvcnQsIDMsICJzb3VuZCBtaXhlciAoQUNJKSIpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRQotCQkgICAgICAgImFjaTogSS9PIGFyZWEgMHglMDN4LTB4JTAzeCBhbHJlYWR5IHVzZWQuXG4iLAotCQkgICAgICAgYWNpX3BvcnQsIGFjaV9wb3J0KzIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBmb3JjZSBBQ0kgaW50byBhIGtub3duIHN0YXRlICovCi0JcmMgPSAtRUZBVUxUOwotCWZvciAoaT0wOyBpPDM7IGkrKykKLQkJaWYgKGFjaV9yd19jbWQoQUNJX0VSUk9SX09QLCAtMSwgLTEpPDApCi0JCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQotCS8qIG9mZmljaWFsIHRoaXMgaXMgb25lIGFjaSByZWFkIGNhbGw6ICovCi0JcmMgPSAtRUZBVUxUOwotCWlmICgoYWNpX2lkY29kZVswXT1hY2lfcndfY21kKEFDSV9SRUFEX0lEQ09ERSwgLTEsIC0xKSk8MCB8fAotCSAgICAoYWNpX2lkY29kZVsxXT1hY2lfcndfY21kKEFDSV9SRUFEX0lEQ09ERSwgLTEsIC0xKSk8MCkgewotCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIHJlYWQgaWRjb2RlIG9uIDB4JTAzeC5cbiIsCi0JCSAgICAgICBhY2lfcG9ydCk7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCWlmICgoYWNpX3ZlcnNpb249YWNpX3J3X2NtZChBQ0lfUkVBRF9WRVJTSU9OLCAtMSwgLTEpKTwwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWNpOiBGYWlsZWQgdG8gcmVhZCB2ZXJzaW9uIG9uIDB4JTAzeC5cbiIsCi0JCSAgICAgICBhY2lfcG9ydCk7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCWlmIChhY2lfaWRjb2RlWzBdID09ICdtJykgewotCQkvKiBJdCBsb29rcyBsaWtlIGEgbWlybyBzb3VuZCBjYXJkLiAqLwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQSc6Ci0JCQlib2FyZG5hbWUgPSAiUENNMSBwcm8gLyBlYXJseSBQQ00xMiI7Ci0JCQlicmVhazsKLQkJY2FzZSAnQic6Ci0JCQlib2FyZG5hbWUgPSAiUENNMTIiOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0MnOgotCQkJYm9hcmRuYW1lID0gIlBDTTIwIHJhZGlvIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYm9hcmRuYW1lID0gInVua25vd24gbWlybyI7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhY2k6IFdhcm5pbmc6IHVuc3VwcG9ydGVkIGNhcmQhIC0gIgotCQkgICAgICAgIm5vIGhhcmR3YXJlLCBubyBzcGVjcy4uLlxuIik7Ci0JCWJvYXJkbmFtZSA9ICJ1bmtub3duIENhcmRpbmFsIFRlY2hub2xvZ2llcyI7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiPEFDSSAweCUwMngsIGlkICUwMngvJTAyeCBcIiVjLyVjXCIsICglcyk+IGF0IDB4JTAzeFxuIiwKLQkgICAgICAgYWNpX3ZlcnNpb24sCi0JICAgICAgIGFjaV9pZGNvZGVbMF0sIGFjaV9pZGNvZGVbMV0sCi0JICAgICAgIGFjaV9pZGNvZGVbMF0sIGFjaV9pZGNvZGVbMV0sCi0JICAgICAgIGJvYXJkbmFtZSwgYWNpX3BvcnQpOwotCi0JcmMgPSAtRUJVU1k7Ci0JaWYgKHJlc2V0KSB7Ci0JCS8qIGZpcnN0IHdyaXRlKClzIGFmdGVyIHJlc2V0IGZhaWwgd2l0aCBteSBQQ00yMCAqLwotCQlpZiAoYWNpX3J3X2NtZChBQ0lfSU5JVCwgLTEsIC0xKTwwIHx8Ci0JCSAgICBhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1ApPDAgfHwKLQkJICAgIGFjaV9yd19jbWQoQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1AsIEFDSV9FUlJPUl9PUCk8MCkKLQkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIHRoZSBQQ00yMCBpcyBtdXRlZCBhZnRlciByZXNldCAoYW5kIHJlYm9vdCkgKi8KLQlpZiAoYWNpX3J3X2NtZChBQ0lfU0VUX01VVEUsIDB4MDAsIC0xKTwwKQotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQotCWlmIChpZGU+PTApCi0JCWlmIChhY2lfcndfY21kKEFDSV9TRVRfSURFLCAhaWRlLCAtMSk8MCkKLQkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCQotCWlmICh3c3M+PTAgJiYgYWNpX2lkY29kZVsxXT09J0EnKQotCQlpZiAoYWNpX3J3X2NtZChBQ0lfU0VUX1dTUywgISF3c3MsIC0xKTwwKQotCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0KLQltaXhlcl9kZXZpY2UgPSBzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLCBib2FyZG5hbWUsCi0JCQkJCSAgICZhY2lfbWl4ZXJfb3BlcmF0aW9ucywKLQkJCQkJICAgc2l6ZW9mKGFjaV9taXhlcl9vcGVyYXRpb25zKSwgTlVMTCk7Ci0JcmMgPSAwOwotCWlmIChtaXhlcl9kZXZpY2UgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWNpOiBGYWlsZWQgdG8gaW5zdGFsbCBtaXhlci5cbiIpOwotCQlyYyA9IG1peGVyX2RldmljZTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfSAvKiBlbHNlIE1heWJlIGluaXRpYWxpemUgdGhlIENTNDIzMUEgbWl4ZXIgaGVyZS4uLiAqLwotb3V0OglyZXR1cm4gcmM7Ci1vdXRfcmVsZWFzZV9yZWdpb246Ci0JcmVsZWFzZV9yZWdpb24oYWNpX3BvcnQsIDMpOwotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX2FjaSh2b2lkKQotewotCXNvdW5kX3VubG9hZF9taXhlcmRldihtaXhlcl9kZXZpY2UpOwotCXJlbGVhc2VfcmVnaW9uKGFjaV9wb3J0LCAzKTsKLX0KLQotbW9kdWxlX2luaXQoYXR0YWNoX2FjaSk7Ci1tb2R1bGVfZXhpdCh1bmxvYWRfYWNpKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hY2kuaCBiL3NvdW5kL29zcy9hY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxMDJlZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jaWZuZGVmIF9BQ0lfSF8KLSNkZWZpbmUgX0FDSV9IXwotCi1leHRlcm4gaW50IGFjaV9wb3J0OwotZXh0ZXJuIGludCBhY2lfdmVyc2lvbjsJCS8qIEFDSSBmaXJtd2FyZSB2ZXJzaW9uCSovCi1leHRlcm4gaW50IGFjaV9yd19jbWQoaW50IHdyaXRlMSwgaW50IHdyaXRlMiwgaW50IHdyaXRlMyk7Ci0KLSNkZWZpbmUgYWNpX2luZGV4ZWRfY21kKGEsIGIpIGFjaV9yd19jbWQoYSwgYiwgLTEpCi0jZGVmaW5lIGFjaV93cml0ZV9jbWQoYSwgYikgICBhY2lfcndfY21kKGEsIGIsIC0xKQotI2RlZmluZSBhY2lfcmVhZF9jbWQoYSkgICAgICAgYWNpX3J3X2NtZChhLC0xLCAtMSkKLQotI2RlZmluZSBDT01NQU5EX1JFR0lTVEVSICAgIChhY2lfcG9ydCkgICAgICAvKiB3cml0ZSByZWdpc3RlciAqLwotI2RlZmluZSBTVEFUVVNfUkVHSVNURVIgICAgIChhY2lfcG9ydCArIDEpICAvKiByZWFkIHJlZ2lzdGVyICovCi0jZGVmaW5lIEJVU1lfUkVHSVNURVIgICAgICAgKGFjaV9wb3J0ICsgMikgIC8qIGFsc28gdXNlZCBmb3IgcmRzICovCi0KLSNkZWZpbmUgUkRTX1JFR0lTVEVSICAgICAgICBCVVNZX1JFR0lTVEVSCi0KLSNkZWZpbmUgQUNJX1NFVF9NVVRFICAgICAgICAgIDB4MGQKLSNkZWZpbmUgQUNJX1NFVF9QT1dFUkFNUCAgICAgIDB4MGYKLSNkZWZpbmUgQUNJX1NFVF9UVU5FUk1VVEUgICAgIDB4YTMKLSNkZWZpbmUgQUNJX1NFVF9UVU5FUk1PTk8gICAgIDB4YTQKLSNkZWZpbmUgQUNJX1NFVF9JREUgICAgICAgICAgIDB4ZDAKLSNkZWZpbmUgQUNJX1NFVF9XU1MgICAgICAgICAgIDB4ZDEKLSNkZWZpbmUgQUNJX1NFVF9TT0xPTU9ERSAgICAgIDB4ZDIKLSNkZWZpbmUgQUNJX1dSSVRFX0lHQUlOICAgICAgIDB4MDMKLSNkZWZpbmUgQUNJX1dSSVRFX1RVTkUgICAgICAgIDB4YTcKLSNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEVSRU8gIDB4YTgKLSNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEFUSU9OIDB4YTkKLSNkZWZpbmUgQUNJX1JFQURfVkVSU0lPTiAgICAgIDB4ZjEKLSNkZWZpbmUgQUNJX1JFQURfSURDT0RFICAgICAgIDB4ZjIKLSNkZWZpbmUgQUNJX0lOSVQgICAgICAgICAgICAgIDB4ZmYKLSNkZWZpbmUgQUNJX1NUQVRVUyAgICAgICAgICAgIDB4ZjAKLSNkZWZpbmUgICAgIEFDSV9TX0dFTkVSQUwgICAgIDB4MDAKLSNkZWZpbmUgICAgIEFDSV9TX1JFQURfSUdBSU4gIDB4MjEKLSNkZWZpbmUgQUNJX0VSUk9SX09QICAgICAgICAgIDB4ZGYKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbWFjcm8gU0NBTEUgY2FuIGJlIHVzZWQgdG8gc2NhbGUgb25lIGludGVnZXIgdm9sdW1lCi0gKiB2YWx1ZSBpbnRvIGFub3RoZXIgb25lIHVzaW5nIG9ubHkgaW50ZWdlciBhcml0aG1ldGljLiBJZiB0aGUgaW5wdXQKLSAqIHZhbHVlIHggaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8PSB4bWF4LCB0aGVuIHRoZSByZXN1bHQgd2lsbCBiZSBpbgotICogdGhlIHJhbmdlIDAgPD0gU0NBTEUoeG1heCx5bWF4LHgpIDw9IHltYXguCi0gKgotICogVGhpcyBtYWNybyBoYXMgZm9yIGFsbCB4bWF4LCB5bWF4ID4gMCBhbmQgYWxsIDAgPD0geCA8PSB4bWF4IHRoZQotICogZm9sbG93aW5nIG5pY2UgcHJvcGVydGllczoKLSAqCi0gKiAtIFNDQUxFKHhtYXgseW1heCx4bWF4KSA9IHltYXgKLSAqIC0gU0NBTEUoeG1heCx5bWF4LDApID0gMAotICogLSBTQ0FMRSh4bWF4LHltYXgsU0NBTEUoeW1heCx4bWF4LFNDQUxFKHhtYXgseW1heCx4KSkpID0gU0NBTEUoeG1heCx5bWF4LHgpCi0gKgotICogSW4gYWRkaXRpb24sIHRoZSByb3VuZGluZyBlcnJvciBpcyBtaW5pbWFsIGFuZCBuaWNlbHkgZGlzdHJpYnV0ZWQuCi0gKiBUaGUgcHJvb2ZzIGFyZSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSByZWFkZXIuCi0gKi8KLQotI2RlZmluZSBTQ0FMRSh4bWF4LHltYXgseCkgKCgoeCkqKHltYXgpKyh4bWF4KS8yKS8oeG1heCkpCi0KLQotI2VuZGlmICAvKiBfQUNJX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODE2LmMgYi9zb3VuZC9vc3MvYWQxODE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJmMzEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FkMTgxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2OCArMCwwIEBACi0vKgotICoKLSAqIEFEMTgxNiBsb3dsZXZlbCBzb3VuZCBkcml2ZXIgZm9yIExpbnV4IDIuNi4wIGFuZCBhYm92ZQotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIGJ5IFRob3JzdGVuIEtuYWJlIDxsaW51eEB0aG9yc3Rlbi1rbmFiZS5kZT4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgQ1M0MjMyL0FEMTg0OCBkcml2ZXIgQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NgotICoKLSAqCi0gKiB2ZXJzaW9uOiAxLjUKLSAqIHN0YXR1czogYmV0YQotICogZGF0ZTogMjAwMy8wNy8xNQotICoKLSAqIENoYW5nZXM6Ci0gKglPbGVnIERyb2tpbjogU29tZSBjbGVhbnVwIG9mIGxvYWQvdW5sb2FkIGZ1bmN0aW9ucy4JMTk5OC8xMS8yNAotICoJCi0gKglUaG9yc3RlbiBLbmFiZTogYXR0YWNoIGFuZCB1bmxvYWQgcmV3cml0dGVuLCAKLSAqCXNvbWUgYXJndW1lbnQgY2hlY2tzIGFkZGVkCQkJCTE5OTgvMTEvMzAKLSAqCi0gKglUaG9yc3RlbiBLbmFiZTogQnVnZ3kgaXNhIGJyaWRnZSB3b3JrYXJvdW5kIGFkZGVkCTE5OTkvMDEvMTYKLSAqCQotICoJRGF2aWQgTW9ld3MvVGhvcnN0ZW4gS25hYmU6IEludHJvZHVjZWQgb3B0aW9ucyAKLSAqCXBhcmFtZXRlci4gQWRkZWQgc2xpZ2h0bHkgbW9kaWZpZWQgcGF0Y2ggZnJvbSAKLSAqCURhdmlkIE1vZXdzIHRvIGRpc2FibGUgZHNwIGF1ZGlvIHNvdXJjZXMgYnkgc2V0dGluZyAKLSAqCWJpdCAwIG9mIG9wdGlvbnMgcGFyYW1ldGVyLiBUaGlzIHNlZW1zIHRvIGJlCi0gKglyZXF1aXJlZCBieSBzb21lIEF6dGVjaC9OZXdjb20gU0MtMTYgY2FyZHMuCQkxOTk5LzA0LzE4Ci0gKgotICoJQ2hyaXN0b3BoIEhlbGx3aWc6IEFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQuCTIwMDAvMDMvMDMKLSAqCi0gKglDaHJpc3RvcGggSGVsbHdpZzogQWRkZWQgaXNhcG5wIHN1cHBvcnQJCQkyMDAwLzAzLzE1Ci0gKgotICoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvOiBnZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbgkyMDAxLzEwLzA3Ci0gKiAgICAgIAotICogICAgICBUaG9yc3RlbiBLbmFiZTogQ29tcGlsaW5nIHdpdGggQ09ORklHX1BOUCBlbmFibGVkCi0gKgl3b3JrcyBhZ2Fpbi4gSXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSBtb3JlIHRoYW4gb25lIAotICoJQUQxODE2IHNvdW5kIGNhcmQuIFNhbXBsZSByYXRlIG5vdyBtYXkgYmUgY2hhbmdlZCBkdXJpbmcKLSAqCXBsYXliYWNrL2NhcHR1cmUuIHByaW50aygpIHVzZXMgbG9nIGxldmVscyBldmVyeXdoZXJlLgotICoJU01QIGZpeGVzLiBETUEgaGFuZGxpbmcgZml4ZXMuCi0gKglPdGhlciBtaW5vciBjb2RlIGNsZWFudXAuCQkJCTIwMDMvMDcvMTUKLSAqCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLSNkZWZpbmUgREVCVUdOT0lTRSh4KQotCi0jZGVmaW5lIENIRUNLX0ZPUl9QT1dFUiB7IGludCB0aW1lb3V0PTEwMDsgXAotICB3aGlsZSAodGltZW91dCA+IDAgJiYgKGluYihkZXZjLT5iYXNlKSYweDgwKSE9IDB4ODApIHtcCi0gICAgICAgICAgdGltZW91dC0tOyBcCi0gIH0gXAotICBpZiAodGltZW91dD09MCkge1wKLSAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENoZWNrIGZvciBwb3dlciBmYWlsZWQgaW4gJXMgbGluZTogJWRcbiIsX19GSUxFX18sX19MSU5FX18pOyBcCi0gIH0gXAotfQotCi0vKiBzdHJ1Y3R1cmUgdG8gaG9sZCBkZXZpY2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAgIGludCAgICAgICAgICAgIGJhc2U7ICAgICAgICAgIC8qIHNldCBpbiBhdHRhY2ggKi8KLQlpbnQgICAgICAgICAgICBpcnE7Ci0JaW50ICAgICAgICAgICAgZG1hX3BsYXliYWNrOwotICAgICAgICBpbnQgICAgICAgICAgICBkbWFfY2FwdHVyZTsKLSAgCi0JaW50ICAgICAgICAgICAgb3BlbmVkOyAgICAgICAgIC8qIG9wZW4gKi8KLSAgICAgICAgaW50ICAgICAgICAgICAgc3BlZWQ7CQotCWludCAgICAgICAgICAgIGNoYW5uZWxzOwotCWludCAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdDsKLSAgICAgICAgaW50ICAgICAgICAgICAgYXVkaW9fbW9kZTsgCi0gIAotICAgICAgICBpbnQgICAgICAgICAgICByZWNtYXNrOyAgICAgICAgLyogc2V0dXAgKi8KLQl1bnNpZ25lZCBjaGFyICBmb3JtYXRfYml0czsKLQlpbnQgICAgICAgICAgICBzdXBwb3J0ZWRfZGV2aWNlczsKLQlpbnQgICAgICAgICAgICBzdXBwb3J0ZWRfcmVjX2RldmljZXM7Ci0JdW5zaWduZWQgc2hvcnQgbGV2ZWxzW1NPVU5EX01JWEVSX05SREVWSUNFU107Ci0JCQkJCS8qIG1pc2MgKi8KLQlzdHJ1Y3QgcG5wX2RldiAqcG5wZGV2OwkgLyogY29uZmlndXJlZCB2aWEgcG5wICovCi0gICAgICAgIGludCAgICAgICAgICAgIGRldl9ubzsgICAvKiB0aGlzIGlzIHRoZSAjIGluIGF1ZGlvX2RldnMgYW5kIE5PVCAKLQkJCQkgICAgaW4gYWQxODE2X2luZm8gKi8KLQlzcGlubG9ja190CWxvY2s7ICAKLX0gYWQxODE2X2luZm87Ci0KLXN0YXRpYyBpbnQgbnJfYWQxODE2X2RldnM7Ci1zdGF0aWMgaW50IGFkMTgxNl9jbG9ja2ZyZXEgPSAzMzAwMDsKLXN0YXRpYyBpbnQgb3B0aW9uczsKLQotLyogc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMgKi8KLXN0YXRpYyBpbnQgIGFkX2Zvcm1hdF9tYXNrID0KLUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfUzE2X0JFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXOwotCi0vKiBhcnJheSBvZiBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmVzICovCi1zdGF0aWMgYWQxODE2X2luZm8gZGV2X2luZm9bTUFYX0FVRElPX0RFVl07Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBmdW5jdGlvbnMgZm9yIGVhc2llciBhY2Nlc3MgdG8gaW5kZXJlY3QgcmVnaXN0ZXJzICovCi0KLXN0YXRpYyBpbnQgYWRfcmVhZCAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgcmVnKQotewotCWludCByZXN1bHQ7Ci0JCi0JQ0hFQ0tfRk9SX1BPV0VSOwotCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAocmVnICYgMHgzZiksIGRldmMtPmJhc2UrMCk7Ci0JcmVzdWx0ID0gaW5iKGRldmMtPmJhc2UrMik7Ci0JcmVzdWx0Kz0gaW5iKGRldmMtPmJhc2UrMyk8PDg7Ci0JcmV0dXJuIChyZXN1bHQpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkX3dyaXRlIChhZDE4MTZfaW5mbyAqIGRldmMsIGludCByZWcsIGludCBkYXRhKQotewotCUNIRUNLX0ZPUl9QT1dFUjsKLQlvdXRiICgodW5zaWduZWQgY2hhcikgKHJlZyAmIDB4ZmYpLCBkZXZjLT5iYXNlKzApOwotCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAoZGF0YSAmIDB4ZmYpLGRldmMtPmJhc2UrMik7Ci0Jb3V0YiAoKHVuc2lnbmVkIGNoYXIpICgoZGF0YT4+OCkmMHhmZiksZGV2Yy0+YmFzZSszKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBmdW5jdGlvbiBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgc3RydWN0IGF1ZGlvX2RyaXZlciAqLwotCi1zdGF0aWMgdm9pZCBhZDE4MTZfaGFsdF9pbnB1dCAoaW50IGRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlcjsKLQkKLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IGhhbHRfaW5wdXQgY2FsbGVkXG4iKSk7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOyAKLQkKLQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKLQkgICAgICAgIGRpc2FibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hKTsKLQl9Ci0JCi0JYnVmZmVyPWluYihkZXZjLT5iYXNlKzkpOwotCWlmIChidWZmZXIgJiAweDAxKSB7Ci0JCS8qIGRpc2FibGUgY2FwdHVyZSAqLwotCQlvdXRiKGJ1ZmZlciAmIH4weDAxLGRldmMtPmJhc2UrOSk7IAotCX0KLQotCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgewotCSAgICAgICAgZW5hYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSk7Ci0JfQotCi0JLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCW91dGIgKH4weDQwLCBkZXZjLT5iYXNlKzEpOwkKLQkKLQlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX0lOUFVUOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfaGFsdF9vdXRwdXQgKGludCBkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyAgZmxhZ3M7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCQotCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwotCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBoYWx0X291dHB1dCBjYWxsZWQhXG4iKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7IAotCS8qIE11dGUgcGNtIG91dHB1dCAqLwotCWFkX3dyaXRlKGRldmMsIDQsIGFkX3JlYWQoZGV2Yyw0KXwweDgwODApOwotCi0JaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7Ci0JICAgICAgICBkaXNhYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEpOwotCX0KLQotCWJ1ZmZlcj1pbmIoZGV2Yy0+YmFzZSs4KTsKLQlpZiAoYnVmZmVyICYgMHgwMSkgewotCQkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihidWZmZXIgJiB+MHgwMSxkZXZjLT5iYXNlKzgpOyAKLQl9Ci0KLQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKLQkgICAgICAgIGVuYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hKTsKLQl9Ci0KLQkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0Jb3V0YiAoKHVuc2lnbmVkIGNoYXIpfjB4ODAsIGRldmMtPmJhc2UrMSk7CQotCi0JZGV2Yy0+YXVkaW9fbW9kZSAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTgxNl9vdXRwdXRfYmxvY2sgKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCAKLQkJCQkgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGNudDsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBvdXRwdXRfYmxvY2sgY2FsbGVkIGJ1Zj0lbGQgY291bnQ9JWQgZmxhZ3M9JWRcbiIsYnVmLGNvdW50LGludHJmbGFnKSk7Ci0gIAotCWNudCA9IGNvdW50LzQgLSAxOwotICAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JCi0JLyogc2V0IHRyYW5zZmVyIGNvdW50ICovCi0JYWRfd3JpdGUgKGRldmMsIDgsIGNudCAmIDB4ZmZmZik7IAotCQotCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9PVVRQVVQ7IAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkMTgxNl9zdGFydF9pbnB1dCAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwKLQkJCQlpbnQgaW50cmZsYWcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nICBjbnQ7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogc3RhcnRfaW5wdXQgY2FsbGVkIGJ1Zj0lbGQgY291bnQ9JWQgZmxhZ3M9JWRcbiIsYnVmLGNvdW50LGludHJmbGFnKSk7Ci0KLQljbnQgPSBjb3VudC80IC0gMTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQotCS8qIHNldCB0cmFuc2ZlciBjb3VudCAqLwotCWFkX3dyaXRlIChkZXZjLCAxMCwgY250ICYgMHhmZmZmKTsgCi0JZGV2Yy0+YXVkaW9fbW9kZSB8PSBQQ01fRU5BQkxFX0lOUFVUOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IGFkMTgxNl9wcmVwYXJlX2Zvcl9pbnB1dCAoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGZyZXE7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCXVuc2lnbmVkIGNoYXIgZm10X2JpdHM7Ci0JCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBwcmVwYXJlX2Zvcl9pbnB1dCBjYWxsZWQ6IGJzaXplPSVkIGJjb3VudD0lZFxuIixic2l6ZSxiY291bnQpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQlmbXRfYml0cz0gKGRldmMtPmZvcm1hdF9iaXRzJjB4Nyk8PDM7Ci0JCi0JLyogc2V0IG1vbm8vc3RlcmVvIG1vZGUgKi8KLQlpZiAoZGV2Yy0+Y2hhbm5lbHMgPiAxKSB7Ci0JCWZtdF9iaXRzIHw9MHg0OwotCX0KLQkvKiBzZXQgTW9uby9TdGVyZW8gaW4gcGxheWJhY2svY2FwdHVyZSByZWdpc3RlciAqLwotCW91dGIoIChpbmIoZGV2Yy0+YmFzZSs4KSAmIH4weDNDKXxmbXRfYml0cywgZGV2Yy0+YmFzZSs4KTsgCi0Jb3V0YiggKGluYihkZXZjLT5iYXNlKzkpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzkpOwotCi0JZnJlcT0oKHVuc2lnbmVkIGludClkZXZjLT5zcGVlZCozMzAwMCkvYWQxODE2X2Nsb2NrZnJlcTsgCi0KLQkvKiB3cml0ZSBwbGF5YmFjay9jYXB0dXJlIHNwZWVkcyAqLwotCWFkX3dyaXRlIChkZXZjLCAyLCBmcmVxICYgMHhmZmZmKTsJCi0JYWRfd3JpdGUgKGRldmMsIDMsIGZyZXEgJiAweGZmZmYpOwkKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JYWQxODE2X2hhbHRfaW5wdXQoZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZDE4MTZfcHJlcGFyZV9mb3Jfb3V0cHV0IChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgZnJlcTsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JdW5zaWduZWQgY2hhciBmbXRfYml0czsKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogcHJlcGFyZV9mb3Jfb3V0cHV0IGNhbGxlZDogYnNpemU9JWQgYmNvdW50PSVkXG4iLGJzaXplLGJjb3VudCkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JZm10X2JpdHM9IChkZXZjLT5mb3JtYXRfYml0cyYweDcpPDwzOwotCS8qIHNldCBtb25vL3N0ZXJlbyBtb2RlICovCi0JaWYgKGRldmMtPmNoYW5uZWxzID4gMSkgewotCQlmbXRfYml0cyB8PTB4NDsKLQl9Ci0KLQkvKiB3cml0ZSBmb3JtYXQgYml0cyB0byBwbGF5YmFjay9jYXB0dXJlIHJlZ2lzdGVycyAqLwotCW91dGIoIChpbmIoZGV2Yy0+YmFzZSs4KSAmIH4weDNDKXxmbXRfYml0cywgZGV2Yy0+YmFzZSs4KTsgCi0Jb3V0YiggKGluYihkZXZjLT5iYXNlKzkpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzkpOwotICAKLQlmcmVxPSgodW5zaWduZWQgaW50KWRldmMtPnNwZWVkKjMzMDAwKS9hZDE4MTZfY2xvY2tmcmVxOyAKLQkKLQkvKiB3cml0ZSBwbGF5YmFjay9jYXB0dXJlIHNwZWVkcyAqLwotCWFkX3dyaXRlIChkZXZjLCAyLCBmcmVxICYgMHhmZmZmKTsKLQlhZF93cml0ZSAoZGV2YywgMywgZnJlcSAmIDB4ZmZmZik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQkKLQlhZDE4MTZfaGFsdF9vdXRwdXQoZGV2KTsKLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfdHJpZ2dlciAoaW50IGRldiwgaW50IHN0YXRlKSAKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogdHJpZ2dlciBjYWxsZWQhIChkZXZjPSVkLGRldmMtPmJhc2U9JWRcbiIsIGRldmMsIGRldmMtPmJhc2UpKTsKLQotCS8qIG1vZGUgbWF5IGhhdmUgY2hhbmdlZCAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JLyogbWFzayBvdXQgbW9kZXMgbm90IHNwZWNpZmllZCBvbiBvcGVuIGNhbGwgKi8KLQlzdGF0ZSAmPSBkZXZjLT5hdWRpb19tb2RlOyAKLQkJCQkKLQkvKiBzZXR1cCBzb3VuZGNoaXAgdG8gbmV3IGlvLW1vZGUgKi8KLQlpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX0lOUFVUKSB7Ci0JCS8qIGVuYWJsZSBjYXB0dXJlICovCi0JCW91dGIoaW5iKGRldmMtPmJhc2UrOSl8MHgwMSwgZGV2Yy0+YmFzZSs5KTsKLQl9IGVsc2UgewotCQkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihpbmIoZGV2Yy0+YmFzZSs5KSZ+MHgwMSwgZGV2Yy0+YmFzZSs5KTsKLQl9Ci0KLQlpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX09VVFBVVCkgewotCQkvKiBlbmFibGUgcGxheWJhY2sgKi8KLQkJb3V0YihpbmIoZGV2Yy0+YmFzZSs4KXwweDAxLCBkZXZjLT5iYXNlKzgpOwotCQkvKiB1bm11dGUgcGNtIG91dHB1dCAqLwotCQlhZF93cml0ZShkZXZjLCA0LCBhZF9yZWFkKGRldmMsNCkmfjB4ODA4MCk7Ci0JfSBlbHNlIHsKLQkJLyogbXV0ZSBwY20gb3V0cHV0ICovCi0JCWFkX3dyaXRlKGRldmMsIDQsIGFkX3JlYWQoZGV2Yyw0KXwweDgwODApOwotCQkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihpbmIoZGV2Yy0+YmFzZSs4KSZ+MHgwMSwgZGV2Yy0+YmFzZSs4KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLQotLyogaGFsdCBpbnB1dCAmIG91dHB1dCAqLwotc3RhdGljIHZvaWQgYWQxODE2X2hhbHQgKGludCBkZXYpCi17Ci0JYWQxODE2X2hhbHRfaW5wdXQoZGV2KTsKLQlhZDE4MTZfaGFsdF9vdXRwdXQoZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODE2X3Jlc2V0IChpbnQgZGV2KQotewotCWFkMTgxNl9oYWx0IChkZXYpOwotfQotCi0vKiBzZXQgcGxheWJhY2sgc3BlZWQgKi8KLXN0YXRpYyBpbnQgYWQxODE2X3NldF9zcGVlZCAoaW50IGRldiwgaW50IGFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBmcmVxOwotCWludCByZXQ7Ci0KLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQlpZiAoYXJnID09IDApIHsKLQkJcmV0ID0gZGV2Yy0+c3BlZWQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JLyogcmFuZ2UgY2hlY2tpbmcgKi8KLQlpZiAoYXJnIDwgNDAwMCkgewotCQlhcmcgPSA0MDAwOwotCX0KLQlpZiAoYXJnID4gNTUwMDApIHsKLQkJYXJnID0gNTUwMDA7Ci0JfQotCWRldmMtPnNwZWVkID0gYXJnOwotCi0JLyogY2hhbmdlIHNwZWVkIGR1cmluZyBwbGF5YmFjayAqLwotCWZyZXE9KCh1bnNpZ25lZCBpbnQpZGV2Yy0+c3BlZWQqMzMwMDApL2FkMTgxNl9jbG9ja2ZyZXE7IAotCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCi0JYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOwkKLQlhZF93cml0ZSAoZGV2YywgMywgZnJlcSAmIDB4ZmZmZik7CQotCi0JcmV0ID0gZGV2Yy0+c3BlZWQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBhZDE4MTZfc2V0X2JpdHMgKGludCBkZXYsIHVuc2lnbmVkIGludCBhcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0Jc3RhdGljIHN0cnVjdCBmb3JtYXRfdGJsIHsKLQkJaW50ICAgICAgICAgICAgIGZvcm1hdDsKLQkJdW5zaWduZWQgY2hhciAgIGJpdHM7Ci0JfSBmb3JtYXQyYml0c1tdID0gewotCQl7IDAsIDAgfSwKLQkJeyBBRk1UX01VX0xBVywgMSB9LAotCQl7IEFGTVRfQV9MQVcsIDMgfSwKLQkJeyBBRk1UX0lNQV9BRFBDTSwgMCB9LAotCQl7IEFGTVRfVTgsIDAgfSwKLQkJeyBBRk1UX1MxNl9MRSwgMiB9LAotCQl7IEFGTVRfUzE2X0JFLCA2IH0sCi0JCXsgQUZNVF9TOCwgMCB9LAotCQl7IEFGTVRfVTE2X0xFLCAwIH0sCi0JCXsgQUZNVF9VMTZfQkUsIDAgfQotICAJfTsKLQotCWludCAgaSwgbiA9IHNpemVvZiAoZm9ybWF0MmJpdHMpIC8gc2l6ZW9mIChzdHJ1Y3QgZm9ybWF0X3RibCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCS8qIHJldHVybiBjdXJyZW50IGZvcm1hdCAqLwotCWlmIChhcmcgPT0gMCkgewotCSAgCWFyZyA9IGRldmMtPmF1ZGlvX2Zvcm1hdDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gYXJnOwotCX0KLQlkZXZjLT5hdWRpb19mb3JtYXQgPSBhcmc7Ci0KLQkvKiBzZWFyY2ggbWF0Y2hpbmcgZm9ybWF0IGJpdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQlpZiAoZm9ybWF0MmJpdHNbaV0uZm9ybWF0ID09IGFyZykgewotCQkJZGV2Yy0+Zm9ybWF0X2JpdHMgPSBmb3JtYXQyYml0c1tpXS5iaXRzOwotCQkJZGV2Yy0+YXVkaW9fZm9ybWF0ID0gYXJnOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIGFyZzsKLQkJfQotCi0JLyogU3RpbGwgaGFuZ2luZyBoZXJlLiBTb21ldGhpbmcgbXVzdCBiZSB0ZXJyaWJseSB3cm9uZyAqLwotCWRldmMtPmZvcm1hdF9iaXRzID0gMDsKLQlkZXZjLT5hdWRpb19mb3JtYXQgPSBBRk1UX1U4OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4oQUZNVF9VOCk7IAotfQotCi1zdGF0aWMgc2hvcnQgYWQxODE2X3NldF9jaGFubmVscyAoaW50IGRldiwgc2hvcnQgYXJnKQotewotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQotCWlmIChhcmcgIT0gMSAmJiBhcmcgIT0gMikKLQkJcmV0dXJuIGRldmMtPmNoYW5uZWxzOwotCi0JZGV2Yy0+Y2hhbm5lbHMgPSBhcmc7Ci0JcmV0dXJuIGFyZzsKLX0KLQotLyogb3BlbiBkZXZpY2UgKi8KLXN0YXRpYyBpbnQgYWQxODE2X29wZW4gKGludCBkZXYsIGludCBtb2RlKSAKLXsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyAgIGZsYWdzOwotCi0JLyogaXMgZGV2aWNlIG51bWJlciB2YWxpZCA/ICovCi0JaWYgKGRldiA8IDAgfHwgZGV2ID49IG51bV9hdWRpb2RldnMpCi0JCXJldHVybiAtKEVOWElPKTsKLQotCS8qIGdldCBkZXZpY2UgaW5mbyBvZiB0aGlzIGRldiAqLwotCWRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOyAKLQotCS8qIG1ha2UgY2hlY2sgaWYgZGV2aWNlIGFscmVhZHkgb3BlbiBhdG9taWMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0KLQlpZiAoZGV2Yy0+b3BlbmVkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCQlyZXR1cm4gLShFQlVTWSk7Ci0JfQotCi0JLyogbWFyayBkZXZpY2UgYXMgb3BlbiAqLwotCWRldmMtPm9wZW5lZCA9IDE7IAotCi0JZGV2Yy0+YXVkaW9fbW9kZSA9IDA7Ci0JZGV2Yy0+c3BlZWQgPSA4MDAwOwotCWRldmMtPmF1ZGlvX2Zvcm1hdD1BRk1UX1U4OwotCWRldmMtPmNoYW5uZWxzPTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JYWQxODE2X3Jlc2V0KGRldmMtPmRldl9ubyk7IC8qIGhhbHQgYWxsIHBlbmRpbmcgb3V0cHV0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTgxNl9jbG9zZSAoaW50IGRldikgLyogY2xvc2UgZGV2aWNlICovCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0KLQkvKiBoYWx0IGFsbCBwZW5kaW5nIG91dHB1dCAqLwotCWFkMTgxNl9yZXNldChkZXZjLT5kZXZfbm8pOyAKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQlkZXZjLT5vcGVuZWQgPSAwOwotCWRldmMtPmF1ZGlvX21vZGUgPSAwOwotCWRldmMtPnNwZWVkID0gODAwMDsKLQlkZXZjLT5hdWRpb19mb3JtYXQ9QUZNVF9VODsKLQlkZXZjLT5mb3JtYXRfYml0cyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBBdWRpbyBkcml2ZXIgc3RydWN0dXJlICovCi0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIGFkMTgxNl9hdWRpb19kcml2ZXIgPQotewotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCQk9IGFkMTgxNl9vcGVuLAotCS5jbG9zZQkJCT0gYWQxODE2X2Nsb3NlLAotCS5vdXRwdXRfYmxvY2sJCT0gYWQxODE2X291dHB1dF9ibG9jaywKLQkuc3RhcnRfaW5wdXQJCT0gYWQxODE2X3N0YXJ0X2lucHV0LAotCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IGFkMTgxNl9wcmVwYXJlX2Zvcl9pbnB1dCwKLQkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gYWQxODE2X3ByZXBhcmVfZm9yX291dHB1dCwKLQkuaGFsdF9pbwkJPSBhZDE4MTZfaGFsdCwKLQkuaGFsdF9pbnB1dAkJPSBhZDE4MTZfaGFsdF9pbnB1dCwKLQkuaGFsdF9vdXRwdXQJCT0gYWQxODE2X2hhbHRfb3V0cHV0LAotCS50cmlnZ2VyCQk9IGFkMTgxNl90cmlnZ2VyLAotCS5zZXRfc3BlZWQJCT0gYWQxODE2X3NldF9zcGVlZCwKLQkuc2V0X2JpdHMJCT0gYWQxODE2X3NldF9iaXRzLAotCS5zZXRfY2hhbm5lbHMJCT0gYWQxODE2X3NldF9jaGFubmVscywKLX07Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBJbnRlcnJ1cHQgaGFuZGxlciAqLwotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhZDE4MTZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgY2hhcglzdGF0dXM7Ci0JYWQxODE2X2luZm8JKmRldmMgPSAoYWQxODE2X2luZm8gKilkZXZfaWQ7Ci0JCi0JaWYgKGlycSA8IDAgfHwgaXJxID4gMTUpIHsKLQkgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogR290IGJvZ3VzIGludGVycnVwdCAlZFxuIiwgaXJxKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7Ci0KLQkvKiByZWFkIGludGVycnVwdCByZWdpc3RlciAqLwotCXN0YXR1cyA9IGluYiAoZGV2Yy0+YmFzZSsxKTsgCi0JLyogQ2xlYXIgYWxsIGludGVycnVwdCAgKi8KLQlvdXRiICh+c3RhdHVzLCBkZXZjLT5iYXNlKzEpOwkKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogR290IGludGVycnVwdCBzdWJjbGFzcyAlZFxuIixzdGF0dXMpKTsKLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IGludGVycnVwdDogR290IGludGVycnVwdCwgYnV0IG5vIHNvdXJjZS5cbiIpKTsKLQkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JaWYgKGRldmMtPm9wZW5lZCAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfSU5QVVQpICYmIChzdGF0dXMmNjQpKQotCQlETUFidWZfaW5wdXRpbnRyIChkZXZjLT5kZXZfbm8pOwotCi0JaWYgKGRldmMtPm9wZW5lZCAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJiAoc3RhdHVzICYgMTI4KSkKLQkJRE1BYnVmX291dHB1dGludHIgKGRldmMtPmRldl9ubywgMSk7Ci0KLQlzcGluX3VubG9jaygmZGV2Yy0+bG9jayk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIE1peGVyIHN0dWZmICovCi0KLXN0cnVjdCBtaXhlcl9kZWYgewotCXVuc2lnbmVkIGludCByZWdubzogNzsKLQl1bnNpZ25lZCBpbnQgcG9sYXJpdHk6MTsJLyogMD1ub3JtYWwsIDE9cmV2ZXJzZWQgKi8KLQl1bnNpZ25lZCBpbnQgYml0cG9zOjQ7Ci0JdW5zaWduZWQgaW50IG5iaXRzOjQ7Ci19OwotCi1zdGF0aWMgY2hhciBtaXhfY3Z0WzEwMV0gPSB7Ci0JIDAsIDAsIDMsIDcsMTAsMTMsMTYsMTksMjEsMjMsMjYsMjgsMzAsMzIsMzQsMzUsMzcsMzksNDAsNDIsCi0JNDMsNDUsNDYsNDcsNDksNTAsNTEsNTIsNTMsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsCi0JNjUsNjYsNjcsNjgsNjksNzAsNzAsNzEsNzIsNzMsNzMsNzQsNzUsNzUsNzYsNzcsNzcsNzgsNzksNzksCi0JODAsODEsODEsODIsODIsODMsODQsODQsODUsODUsODYsODYsODcsODcsODgsODgsODksODksOTAsOTAsCi0JOTEsOTEsOTIsOTIsOTMsOTMsOTQsOTQsOTUsOTUsOTYsOTYsOTYsOTcsOTcsOTgsOTgsOTgsOTksOTksCi0JMTAwCi19OwotCi10eXBlZGVmIHN0cnVjdCBtaXhlcl9kZWYgbWl4ZXJfZW50OwotCi0vKgotICogTW9zdCBvZiB0aGUgbWl4ZXIgZW50cmllcyB3b3JrIGluIGJhY2t3YXJkcy4gU2V0dGluZyB0aGUgcG9sYXJpdHkgZmllbGQKLSAqIG1ha2VzIHRoZW0gdG8gd29yayBjb3JyZWN0bHkuCi0gKgotICogVGhlIGNoYW5uZWwgbnVtYmVyaW5nIHVzZWQgYnkgaW5kaXZpZHVhbCBzb3VuZGNhcmRzIGlzIG5vdCBmaXhlZC4gU29tZQotICogY2FyZHMgaGF2ZSBhc3NpZ25lZCBkaWZmZXJlbnQgbWVhbmluZ3MgZm9yIHRoZSBBVVgxLCBBVVgyIGFuZCBMSU5FIGlucHV0cy4KLSAqIFRoZSBjdXJyZW50IHZlcnNpb24gZG9lc24ndCB0cnkgdG8gY29tcGVuc2F0ZSB0aGlzLgotICovCi0KLSNkZWZpbmUgTUlYX0VOVChuYW1lLCByZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2wsIHJlZ19yLCBwb2xhX3IsIHBvc19yLCBsZW5fcikJXAotICB7e3JlZ19sLCBwb2xhX2wsIHBvc19sLCBsZW5fbH0sIHtyZWdfciwgcG9sYV9yLCBwb3NfciwgbGVuX3J9fQotCi0KLXN0YXRpYyBtaXhlcl9lbnQgbWl4X2RldmljZXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVsyXSA9IHsKLU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkxNCwgMSwgOCwgNSwJMTQsIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNSwgMSwgOCwgNiwJIDUsIDEsIDAsIDYpLAotTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCSA0LCAxLCA4LCA2LAkgNCwgMSwgMCwgNiksCi1NSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCA4LCA1LAkxOCwgMSwgMCwgNSksCi1NSVhfRU5UKFNPVU5EX01JWEVSX01JQywJMTksIDEsIDgsIDUsCTE5LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCSAJMTUsIDEsIDgsIDUsCTE1LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCTIwLCAwLCA4LCA0LAkyMCwgMCwgMCwgNCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsIAkxNywgMSwgOCwgNSwJMTcsIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMiwJMTYsIDEsIDgsIDUsCTE2LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsICAgICAgMzksIDAsIDksIDQsICAgIDM5LCAxLCAwLCA1KQotfTsKLQotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVmYXVsdF9taXhlcl9sZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Ci17Ci0JMHg0MzQzLAkJLyogTWFzdGVyIFZvbHVtZSAqLwotCTB4MzIzMiwJCS8qIEJhc3MgKi8KLQkweDMyMzIsCQkvKiBUcmVibGUgKi8KLQkweDAwMDAsCQkvKiBGTSAqLwotCTB4NDM0MywJCS8qIFBDTSAqLwotCTB4MDAwMCwJCS8qIFBDIFNwZWFrZXIgKi8KLQkweDAwMDAsCQkvKiBFeHQgTGluZSAqLwotCTB4MDAwMCwJCS8qIE1pYyAqLwotCTB4MDAwMCwJCS8qIENEICovCi0JMHgwMDAwLAkJLyogUmVjb3JkaW5nIG1vbml0b3IgKi8KLQkweDAwMDAsCQkvKiBTQiBQQ00gKi8KLQkweDAwMDAsCQkvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KLQkweDAwMDAsCQkvKiBJbnB1dCBnYWluICovCi0JMHgwMDAwLAkJLyogT3V0cHV0IGdhaW4gKi8KLQkweDAwMDAsCQkvKiBMaW5lMSAqLwotCTB4MDAwMCwJCS8qIExpbmUyICovCi0JMHgwMDAwCQkvKiBMaW5lMyAodXN1YWxseSBsaW5lIGluKSovCi19OwotCi0jZGVmaW5lIExFRlRfQ0hOCTAKLSNkZWZpbmUgUklHSFRfQ0hOCTEKLQotCi0KLXN0YXRpYyBpbnQKLWFkMTgxNl9zZXRfcmVjbWFzayAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgbWFzaykKLXsKLSAgCXVuc2lnbmVkIGxvbmcgCWZsYWdzOwotCXVuc2lnbmVkIGNoYXIgICByZWNkZXY7Ci0JaW50ICAgICAgICAgICAgIGksIG47Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQltYXNrICY9IGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKLQkKLQluID0gMDsKLQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlpZiAobWFzayAmICgxIDw8IGkpKQotCQkJbisrOwotCQotCWlmIChuID09IDApCi0JCW1hc2sgPSBTT1VORF9NQVNLX01JQzsKLQllbHNlIGlmIChuICE9IDEpIHsgLyogVG9vIG1hbnkgZGV2aWNlcyBzZWxlY3RlZCAqLwotCQkvKiBGaWx0ZXIgb3V0IGFjdGl2ZSBzZXR0aW5ncyAqLwotCQltYXNrICY9IH5kZXZjLT5yZWNtYXNrOwkKLQkJCi0JCW4gPSAwOwotCQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgCi0JCQlpZiAobWFzayAmICgxIDw8IGkpKQotCQkJCW4rKzsKLQkJCi0JCWlmIChuICE9IDEpCi0JCQltYXNrID0gU09VTkRfTUFTS19NSUM7Ci0JfQotCQotCXN3aXRjaCAobWFzaykgewotCWNhc2UgU09VTkRfTUFTS19NSUM6Ci0JCXJlY2RldiA9IDU7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNPVU5EX01BU0tfTElORToKLQkJcmVjZGV2ID0gMDsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19DRDoKLQkJcmVjZGV2ID0gMjsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19MSU5FMToKLQkJcmVjZGV2ID0gNDsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19MSU5FMjoKLQkJcmVjZGV2ID0gMzsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19WT0xVTUU6Ci0JCXJlY2RldiA9IDE7Ci0JCWJyZWFrOwotCQkKLQlkZWZhdWx0OgotCQltYXNrID0gU09VTkRfTUFTS19NSUM7Ci0JCXJlY2RldiA9IDU7Ci0JfQotCQotCXJlY2RldiA8PD0gNDsKLQlhZF93cml0ZSAoZGV2YywgMjAsIAotCQkgIChhZF9yZWFkIChkZXZjLCAyMCkgJiAweDhmOGYpIHwgcmVjZGV2IHwgKHJlY2Rldjw8OCkpOwotCi0JZGV2Yy0+cmVjbWFzayA9IG1hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbmdlX2JpdHMgKGludCAqcmVndmFsLCBpbnQgZGV2LCBpbnQgY2huLCBpbnQgbmV3dmFsKQotewotCXVuc2lnbmVkIGNoYXIgICBtYXNrOwotCWludCAgICAgICAgICAgICBzaGlmdDsKLSAgCi0JLyogUmV2ZXJzZSBwb2xhcml0eSovCi0KLQlpZiAobWl4X2RldmljZXNbZGV2XVtjaG5dLnBvbGFyaXR5ID09IDEpIAotCQluZXd2YWwgPSAxMDAgLSBuZXd2YWw7Ci0KLQltYXNrID0gKDEgPDwgbWl4X2RldmljZXNbZGV2XVtjaG5dLm5iaXRzKSAtIDE7Ci0Jc2hpZnQgPSBtaXhfZGV2aWNlc1tkZXZdW2Nobl0uYml0cG9zOwotCS8qIFNjYWxlIGl0ICovCi0JbmV3dmFsID0gKGludCkgKChuZXd2YWwgKiBtYXNrKSArIDUwKSAvIDEwMDsJCi0JLyogQ2xlYXIgYml0cyAqLwotCSpyZWd2YWwgJj0gfihtYXNrIDw8IHNoaWZ0KTsJCi0JLyogU2V0IG5ldyB2YWx1ZSAqLwotCSpyZWd2YWwgfD0gKG5ld3ZhbCAmIG1hc2spIDw8IHNoaWZ0OwkKLX0KLQotc3RhdGljIGludAotYWQxODE2X21peGVyX2dldCAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgZGV2KQotewotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfZ2V0IGNhbGxlZCFcbiIpKTsKLQkKLQkvKiByYW5nZSBjaGVjayArIHN1cHBvcnRlZCBtaXhlciBjaGVjayAqLwotCWlmIChkZXYgPCAwIHx8IGRldiA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgKQotCSAgICAgICAgcmV0dXJuICgtKEVJTlZBTCkpOwotCWlmICghKCgxIDw8IGRldikgJiBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcykpCi0JCXJldHVybiAtKEVJTlZBTCk7Ci0JCi0JcmV0dXJuIGRldmMtPmxldmVsc1tkZXZdOwotfQotCi1zdGF0aWMgaW50Ci1hZDE4MTZfbWl4ZXJfc2V0IChhZDE4MTZfaW5mbyAqIGRldmMsIGludCBkZXYsIGludCB2YWx1ZSkKLXsKLQlpbnQgICBsZWZ0ID0gdmFsdWUgJiAweDAwMDAwMGZmOwotCWludCAgIHJpZ2h0ID0gKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4gODsKLQlpbnQgICByZXR2b2w7Ci0KLQlpbnQgICByZWdvZmZzOwotCWludCAgIHZhbDsKLQlpbnQgICB2YWxtdXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG1peGVyX3NldCBjYWxsZWQhXG4iKSk7Ci0JCi0JaWYgKGRldiA8IDAgfHwgZGV2ID49IFNPVU5EX01JWEVSX05SREVWSUNFUyApCi0JCXJldHVybiAtKEVJTlZBTCk7Ci0KLQlpZiAobGVmdCA+IDEwMCkKLQkJbGVmdCA9IDEwMDsKLQlpZiAobGVmdCA8IDApCi0JCWxlZnQgPSAwOwotCWlmIChyaWdodCA+IDEwMCkKLQkJcmlnaHQgPSAxMDA7Ci0JaWYgKHJpZ2h0IDwgMCkKLQkJcmlnaHQgPSAwOwotCQotCS8qIE1vbm8gY29udHJvbCAqLwotCWlmIChtaXhfZGV2aWNlc1tkZXZdW1JJR0hUX0NITl0ubmJpdHMgPT0gMCkgCi0JCXJpZ2h0ID0gbGVmdDsKLQlyZXR2b2wgPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOwotCQotCS8qIFNjYWxlIGl0ICovCi0JCi0JbGVmdCA9IG1peF9jdnRbbGVmdF07Ci0JcmlnaHQgPSBtaXhfY3Z0W3JpZ2h0XTsKLQotCS8qIHJlamVjdCBhbGwgbWl4ZXJzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLQlpZiAoIShkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGRldikpKQotCQlyZXR1cm4gLShFSU5WQUwpOwotCQotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5uYml0cyA9PSAwKQotCQlyZXR1cm4gLShFSU5WQUwpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBrZWVwIHByZWNpc2Ugdm9sdW1lIGludGVybmFsICovCi0JZGV2Yy0+bGV2ZWxzW2Rldl0gPSByZXR2b2w7Ci0KLQkvKiBTZXQgdGhlIGxlZnQgY2hhbm5lbCAqLwotCXJlZ29mZnMgPSBtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5yZWdubzsKLQl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKLQljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBMRUZUX0NITiwgbGVmdCk7Ci0KLQl2YWxtdXRlPXZhbDsKLQotCS8qIE11dGUgYml0IG1hc2tpbmcgb24gc29tZSByZWdpc3RlcnMgKi8KLQlpZiAoIHJlZ29mZnM9PTUgfHwgcmVnb2Zmcz09MTQgfHwgcmVnb2Zmcz09MTUgfHwKLQkgICAgIHJlZ29mZnM9PTE2IHx8IHJlZ29mZnM9PTE3IHx8IHJlZ29mZnM9PTE4IHx8IAotCSAgICAgcmVnb2Zmcz09MTkgfHwgcmVnb2Zmcz09MzkpIHsKLQkJaWYgKGxlZnQ9PTApCi0JCQl2YWxtdXRlIHw9IDB4ODAwMDsKLQkJZWxzZQotCQkJdmFsbXV0ZSAmPSB+MHg4MDAwOwotCX0KLQlhZF93cml0ZSAoZGV2YywgcmVnb2ZmcywgdmFsbXV0ZSk7IC8qIG11dGUgKi8KLQotCS8qCi0JICogU2V0IHRoZSByaWdodCBjaGFubmVsCi0JICovCi0gCi0JLyogV2FzIGp1c3QgYSBtb25vIGNoYW5uZWwgKi8KLQlpZiAobWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLm5iaXRzID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcmV0dm9sOwkJCi0JfQotCi0JcmVnb2ZmcyA9IG1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5yZWdubzsKLQl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKLQljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBSSUdIVF9DSE4sIHJpZ2h0KTsKLQotCXZhbG11dGU9dmFsOwotCWlmICggcmVnb2Zmcz09NSB8fCByZWdvZmZzPT0xNCB8fCByZWdvZmZzPT0xNSB8fAotCSAgICAgcmVnb2Zmcz09MTYgfHwgcmVnb2Zmcz09MTcgfHwgcmVnb2Zmcz09MTggfHwgCi0JICAgICByZWdvZmZzPT0xOSB8fCByZWdvZmZzPT0zOSkgewotCQlpZiAocmlnaHQ9PTApCi0JCQl2YWxtdXRlIHw9IDB4ODA7Ci0JCWVsc2UKLQkJCXZhbG11dGUgJj0gfjB4ODA7Ci0JfQotCWFkX3dyaXRlIChkZXZjLCByZWdvZmZzLCB2YWxtdXRlKTsgLyogbXV0ZSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAJcmV0dXJuIHJldHZvbDsKLX0KLQotI2RlZmluZSBNSVhFUl9ERVZJQ0VTICggU09VTkRfTUFTS19WT0xVTUUgfCBcCi0JCQlTT1VORF9NQVNLX1NZTlRIIHwgXAotCQkJU09VTkRfTUFTS19QQ00gfCBcCi0JCQlTT1VORF9NQVNLX0xJTkUgfCBcCi0JCQlTT1VORF9NQVNLX0xJTkUxIHwgXAotCQkJU09VTkRfTUFTS19MSU5FMiB8IFwKLQkJCVNPVU5EX01BU0tfTElORTMgfCBcCi0JCQlTT1VORF9NQVNLX01JQyB8IFwKLQkJCVNPVU5EX01BU0tfQ0QgfCBcCi0JCQlTT1VORF9NQVNLX1JFQ0xFViAgXAotCQkJKQotI2RlZmluZSBSRUNfREVWSUNFUyAoIFNPVU5EX01BU0tfTElORTIgfFwKLQkJICAgICAgU09VTkRfTUFTS19MSU5FIHxcCi0JCSAgICAgIFNPVU5EX01BU0tfTElORTEgfFwKLQkJICAgICAgU09VTkRfTUFTS19NSUMgfFwKLQkJICAgICAgU09VTkRfTUFTS19DRCB8XAotCQkgICAgICBTT1VORF9NQVNLX1ZPTFVNRSBcCi0JCSAgICAgICkKLSAgICAgCi1zdGF0aWMgdm9pZAotYWQxODE2X21peGVyX3Jlc2V0IChhZDE4MTZfaW5mbyAqIGRldmMpCi17Ci0JaW50ICBpOwotCi0JZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBNSVhFUl9ERVZJQ0VTOwotCQotCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyA9IFJFQ19ERVZJQ0VTOwotCi0JZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQotCQlpZiAoZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiAoMSA8PCBpKSkKLQkJCWFkMTgxNl9taXhlcl9zZXQgKGRldmMsIGksIGRlZmF1bHRfbWl4ZXJfbGV2ZWxzW2ldKTsKLQlhZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIFNPVU5EX01BU0tfTUlDKTsKLX0KLQotc3RhdGljIGludAotYWQxODE2X21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKLQlpbnQgdmFsOwotCWludCBfX3VzZXIgKnAgPSBhcmc7Ci0gIAotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfaW9jdGwgY2FsbGVkIVxuIikpOwotICAKLQkvKiBNaXhlciBpb2N0bCAqLwotCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgeyAKLQkJCi0JCS8qIHNldCBpb2N0bCAqLwotCQlpZiAoX1NJT0NfRElSIChjbWQpICYgX1NJT0NfV1JJVEUpIHsgCi0JCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpewotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6Ci0JCQkJCi0JCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXZhbD1hZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIHZhbCk7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQlkZWZhdWx0OgotCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlpZiAoKHZhbD1hZDE4MTZfbWl4ZXJfc2V0IChkZXZjLCBjbWQgJiAweGZmLCB2YWwpKTwwKQotCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKLQkJCQllbHNlCi0JCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCX0KLQkJfSBlbHNlIHsgCi0JCQkvKiByZWFkIGlvY3RsICovCi0JCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKLQkJCQkKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQkJCXZhbD1kZXZjLT5yZWNtYXNrOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgotCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlczsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgotCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmIH4oU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19JTUlYKTsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJCQl2YWw9ZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgotCQkJCXZhbD1TT1VORF9DQVBfRVhDTF9JTlBVVDsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgICAgIGlmICgodmFsPWFkMTgxNl9taXhlcl9nZXQgKGRldmMsIGNtZCAmIDB4ZmYpKTwwKQotCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKLQkJCQllbHNlCi0JCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCX0KLQkJfQotCX0gZWxzZQotCQkvKiBub3QgZm9yIG1peGVyICovCi0JCXJldHVybiAtKEVJTlZBTCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogTWl4ZXIgc3RydWN0dXJlICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhZDE4MTZfbWl4ZXJfb3BlcmF0aW9ucyA9IHsKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaWQJPSAiQUQxODE2IiwKLQkubmFtZQk9ICJBRDE4MTYgTWl4ZXIiLAotCS5pb2N0bAk9IGFkMTgxNl9taXhlcl9pb2N0bAotfTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHN0dWZmIGZvciBjYXJkIHJlY29nbml0aW9uLCBpbml0IGFuZCB1bmxvYWRpbmcgUE5QIC4uLiovCi0KLQotLyogY2hlY2sgaWYgQUQxODE2IHByZXNlbnQgYXQgc3BlY2lmaWVkIGh3X2NvbmZpZyBhbmQgcmVnaXN0ZXIgZGV2aWNlIHdpdGggT1MgCi0gKiByZXR1cm4gMSBpZiBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UKLSAqLwotc3RhdGljIGludCBfX2luaXQgYWQxODE2X2luaXRfY2FyZCAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCAKLQlzdHJ1Y3QgcG5wX2RldiAqcG5wKQotewotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gTlVMTDsKLQlpbnQgdG1wOwotCWludCBvc3NfZGV2bm8gPSAtMTsKLQotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogaW5pdGlhbGl6aW5nIGNhcmQ6IGlvPTB4JXgsIGlycT0lZCwgZG1hPSVkLCAiCi0JCQkgImRtYTI9JWQsIGNsb2NrZnJlcT0lZCwgb3B0aW9ucz0lZCBpc2FkbWFidWc9JWQgIgotCQkJICIlc1xuIiwKLQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlLAotCSAgICAgICBod19jb25maWctPmlycSwKLQkgICAgICAgaHdfY29uZmlnLT5kbWEsCi0JICAgICAgIGh3X2NvbmZpZy0+ZG1hMiwKLQkgICAgICAgYWQxODE2X2Nsb2NrZnJlcSwKLQkgICAgICAgb3B0aW9ucywKLQkgICAgICAgaXNhX2RtYV9icmlkZ2VfYnVnZ3ksCi0JICAgICAgIHBucD8iKFBOUCkiOiIiKTsKLQotCS8qIGFkMTgxNl9pbmZvIHN0cnVjdHVyZSByZW1haW5pbmcgPyAqLwotCWlmIChucl9hZDE4MTZfZGV2cyA+PSBNQVhfQVVESU9fREVWKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gbW9yZSBhZDE4MTZfaW5mbyBzdHJ1Y3R1cmVzICIKLQkJCSJsZWZ0XG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGV2YyA9ICZkZXZfaW5mb1tucl9hZDE4MTZfZGV2c107Ci0JZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKLQlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKLQlkZXZjLT5kbWFfcGxheWJhY2s9aHdfY29uZmlnLT5kbWE7Ci0JZGV2Yy0+ZG1hX2NhcHR1cmU9aHdfY29uZmlnLT5kbWEyOwotCWRldmMtPm9wZW5lZCA9IDA7Ci0JZGV2Yy0+cG5wZGV2ID0gcG5wOwotCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKLQotCWlmICghcmVxdWVzdF9yZWdpb24oZGV2Yy0+YmFzZSwgMTYsICJBRDE4MTYgU291bmQiKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEkvTyBwb3J0IDB4JTAzeCBub3QgZnJlZVxuIiwKLQkJCQkgICAgZGV2Yy0+YmFzZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogRXhhbWluaW5nIEFEMTgxNiBhdCBhZGRyZXNzIDB4JTAzeC5cbiIsIAotCQlkZXZjLT5iYXNlKTsKLQkKLQotCS8qIHRlc3RzIGZvciBhZDE4MTYgKi8KLQkvKiBiYXNlKzA6IGJpdCAxIG11c3QgYmUgc2V0IGJ1dCBub3QgMjU1ICovCi0JdG1wPWluYihkZXZjLT5iYXNlKTsKLQlpZiAoICh0bXAmMHg4MCk9PTAgfHwgdG1wPT0yNTUgKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiBvciBjaGlwICIKLQkJCSJpcyBub3QgYWN0aXZlIChUZXN0IDApXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogd3JpdGVzIHRvIGlyZWcgOCBhcmUgY29waWVkIHRvIGlyZWcgOSAqLwotCWFkX3dyaXRlKGRldmMsOCwxMjM0NSk7IAotCWlmIChhZF9yZWFkKGRldmMsOSkhPTEyMzQ1KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDEpXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotICAKLQkvKiB3cml0ZXMgdG8gaXJlZyA4IGFyZSBjb3BpZWQgdG8gaXJlZyA5ICovCi0JYWRfd3JpdGUoZGV2Yyw4LDU0MzIxKTsgCi0JaWYgKGFkX3JlYWQoZGV2Yyw5KSE9NTQzMjEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgMilcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiB3cml0ZXMgdG8gaXJlZyAxMCBhcmUgY29waWVkIHRvIGlyZWcgMTEgKi8KLQlhZF93cml0ZShkZXZjLDEwLDU0MzIxKTsgCi0JaWYgKGFkX3JlYWQoZGV2YywxMSkhPTU0MzIxKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCAzKVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIHdyaXRlcyB0byBpcmVnIDEwIGFyZSBjb3BpZWQgdG8gaXJlZyAxMSAqLwotCWFkX3dyaXRlKGRldmMsMTAsMTIzNDUpOyAKLQlpZiAoYWRfcmVhZChkZXZjLDExKSE9MTIzNDUpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDQpXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogYml0IGluIGJhc2UgKzEgY2Fubm90IGJlIHNldCB0byAxICovCi0JdG1wPWluYihkZXZjLT5iYXNlKzEpOwotCW91dGIoMHhmZixkZXZjLT5iYXNlKzEpOyAKLQlpZiAoaW5iKGRldmMtPmJhc2UrMSkhPXRtcCkgewotCQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCA1KVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLSAgCi0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBBRDE4MTYgKHZlcnNpb24gJWQpIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCFcbiIsCi0JCWFkX3JlYWQoZGV2Yyw0NSkpOwotCi0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCWFkX3dyaXRlKGRldmMsMSwwKTsgICAgIAotCi0JLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0Jb3V0YiAoMCwgZGV2Yy0+YmFzZSsxKTsJCi0KLQkvKiBhbGxvY2F0ZSBpcnEgKi8KLQlpZiAoZGV2Yy0+aXJxIDwgMCB8fCBkZXZjLT5pcnEgPiAxNSkKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JaWYgKHJlcXVlc3RfaXJxKGRldmMtPmlycSwgYWQxODE2X2ludGVycnVwdCwwLAotCQkJIlNvdW5kUG9ydCIsIGRldmMpIDwgMCkJewotCSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBJUlEgaW4gdXNlXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogRE1BIHN0dWZmICovCi0JaWYgKHNvdW5kX2FsbG9jX2RtYSAoZGV2Yy0+ZG1hX3BsYXliYWNrLCAiU291bmQgU3lzdGVtIikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKLQkJCQkgICAgZGV2Yy0+ZG1hX3BsYXliYWNrKTsKLQkJZ290byBvdXRfZnJlZV9pcnE7Ci0JfQotCQotCWlmICggZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiAKLQkgIAlkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spIHsKLQkJaWYgKHNvdW5kX2FsbG9jX2RtYShkZXZjLT5kbWFfY2FwdHVyZSwKLQkJCQkgICAgIlNvdW5kIFN5c3RlbSAoY2FwdHVyZSkiKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKLQkJCQkJICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKLQkJCWdvdG8gb3V0X2ZyZWVfZG1hOwotCQl9Ci0JCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFfERNQV9EVVBMRVg7Ci0JfSBlbHNlIHsKLQkgIAlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IE9ubHkgb25lIERNQSBjaGFubmVsICIKLQkJCSJhdmFpbGFibGUvY29uZmlndXJlZC4gTm8gZHVwbGV4IG9wZXJhdGlvbiBwb3NzaWJsZVxuIik7Ci0JCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFOwotCX0KLQotCWNvbmZfcHJpbnRmMiAoIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAotCQkgICAgICBkZXZjLT5iYXNlLCBkZXZjLT5pcnEsIGRldmMtPmRtYV9wbGF5YmFjaywgCi0JCSAgICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKLQotCS8qIHJlZ2lzdGVyIGRldmljZSAqLwotCWlmICgob3NzX2Rldm5vID0gc291bmRfaW5zdGFsbF9hdWRpb2RydiAoQVVESU9fRFJJVkVSX1ZFUlNJT04sCi0JCQkJCSAgICAgICJBRDE4MTYgYXVkaW8gZHJpdmVyIiwKLQkJCQkJICAgICAgJmFkMTgxNl9hdWRpb19kcml2ZXIsCi0JCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGF1ZGlvX2RyaXZlciksCi0JCQkJCSAgICAgIGRldmMtPmF1ZGlvX21vZGUsCi0JCQkJCSAgICAgIGFkX2Zvcm1hdF9tYXNrLAotCQkJCQkgICAgICBkZXZjLAotCQkJCQkgICAgICBkZXZjLT5kbWFfcGxheWJhY2ssIAotCQkJCQkgICAgICBkZXZjLT5kbWFfY2FwdHVyZSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENhbid0IGluc3RhbGwgc291bmQgZHJpdmVyXG4iKTsKLQkJZ290byBvdXRfZnJlZV9kbWFfMjsKLQl9Ci0KLQotCWFkX3dyaXRlKGRldmMsMzIsMHg4MGYwKTsgLyogc291bmQgc3lzdGVtIG1vZGUgKi8KLQlpZiAob3B0aW9ucyYxKSB7Ci0JICAgICAgICBhZF93cml0ZShkZXZjLDMzLDApOyAvKiBkaXNhYmxlIGFsbCBhdWRpb3NvdXJjZXMgZm9yIGRzcCAqLwotCX0gZWxzZSB7Ci0JICAgICAgICBhZF93cml0ZShkZXZjLDMzLDB4MDNmOCk7IC8qIGVuYWJsZSBhbGwgYXVkaW9zb3VyY2VzIGZvciBkc3AgKi8KLQl9Ci0JYWRfd3JpdGUoZGV2Yyw0LDB4ODA4MCk7ICAvKiBkZWZhdWx0IHZhbHVlcyBmb3Igdm9sdW1lcyAobXV0ZWQpKi8KLQlhZF93cml0ZShkZXZjLDUsMHg4MDgwKTsKLQlhZF93cml0ZShkZXZjLDYsMHg4MDgwKTsKLQlhZF93cml0ZShkZXZjLDcsMHg4MDgwKTsKLQlhZF93cml0ZShkZXZjLDE1LDB4ODg4OCk7Ci0JYWRfd3JpdGUoZGV2YywxNiwweDg4ODgpOwotCWFkX3dyaXRlKGRldmMsMTcsMHg4ODg4KTsKLQlhZF93cml0ZShkZXZjLDE4LDB4ODg4OCk7Ci0JYWRfd3JpdGUoZGV2YywxOSwweGM4ODgpOyAvKiArMjBkYiBtaWMgYWN0aXZlICovCi0JYWRfd3JpdGUoZGV2YywxNCwweDAwMDApOyAvKiBNYXN0ZXIgdm9sdW1lIHVubXV0ZWQgKi8KLQlhZF93cml0ZShkZXZjLDM5LDB4MDA5Zik7IC8qIDNEIGVmZmVjdCBvbiAwJSBwaG9uZSBvdXQgbXV0ZWQgKi8KLQlhZF93cml0ZShkZXZjLDQ0LDB4MDA4MCk7IC8qIGV2ZXJ5dGhpbmcgb24gcG93ZXIsIDNkIGVuYWJsZWQgZm9yIGQvYSAqLwotCW91dGIoMHgxMCxkZXZjLT5iYXNlKzgpOyAvKiBzZXQgZG1hIG1vZGUgKi8KLQlvdXRiKDB4MTAsZGV2Yy0+YmFzZSs5KTsKLSAgCi0JLyogZW5hYmxlIGNhcHR1cmUgKyBwbGF5YmFjayBpbnRlcnJ1cHQgKi8KLQlhZF93cml0ZShkZXZjLDEsMHhjMDAwKTsgCi0JCi0JLyogc2V0IG1peGVyIGRlZmF1bHRzICovCi0JYWQxODE2X21peGVyX3Jlc2V0IChkZXZjKTsgCi0gIAotCS8qIHJlZ2lzdGVyIG1peGVyICovCi0JaWYgKChhdWRpb19kZXZzW29zc19kZXZub10tPm1peGVyX2Rldj1zb3VuZF9pbnN0YWxsX21peGVyKAotCQkJCSAgICAgICBNSVhFUl9EUklWRVJfVkVSU0lPTiwKLQkJCQkgICAgICAgIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAotCQkJCSAgICAgICAmYWQxODE2X21peGVyX29wZXJhdGlvbnMsCi0JCQkJICAgICAgIHNpemVvZiAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAotCQkJCSAgICAgICBkZXZjKSkgPCAwKSB7Ci0JICAJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgaW5zdGFsbCBtaXhlclxuIik7Ci0JfQotCS8qIG1ha2UgYWQxODE2X2luZm8gYWN0aXZlICovCi0JbnJfYWQxODE2X2RldnMrKzsKLQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IGNhcmQgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCFcbiIpOwotCXJldHVybiAxOwotCS8qIGVycm9yIGhhbmRsaW5nICovCi1vdXRfZnJlZV9kbWFfMjoKLQlpZiAoZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiBkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spCi0JICAgICAgICBzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7Ci1vdXRfZnJlZV9kbWE6Ci0Jc291bmRfZnJlZV9kbWEoZGV2Yy0+ZG1hX3BsYXliYWNrKTsKLW91dF9mcmVlX2lycToKLQlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOwotb3V0X3JlbGVhc2VfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDE2KTsKLW91dDoKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9jYXJkKGFkMTgxNl9pbmZvICpkZXZjKQotewotCWludCAgbWl4ZXIsIGRldiA9IDA7Ci0JCi0JaWYgKGRldmMgIT0gTlVMTCkgewotCQlwcmludGsoImFkMTgxNjogVW5sb2FkaW5nIGNhcmQgYXQgYWRkcmVzcyAweCUwM3hcbiIsZGV2Yy0+YmFzZSk7Ci0JCQotCQlkZXYgPSBkZXZjLT5kZXZfbm87Ci0JCW1peGVyID0gYXVkaW9fZGV2c1tkZXZdLT5taXhlcl9kZXY7Ci0KLQkJLyogdW5yZWcgbWl4ZXIqLwotCQlpZihtaXhlcj49MCkgewotCQkJc291bmRfdW5sb2FkX21peGVyZGV2KG1peGVyKTsKLQkJfQotCQkvKiB1bnJlZyBhdWRpb2RldiAqLwotCQlzb3VuZF91bmxvYWRfYXVkaW9kZXYoZGV2KTsKLQkJCi0JCS8qIGZyZWUgZG1hIGNoYW5uZWxzICovCi0JCWlmIChkZXZjLT5kbWFfY2FwdHVyZT49MCAmJiAKLQkJICAJZGV2Yy0+ZG1hX2NhcHR1cmUgIT0gZGV2Yy0+ZG1hX3BsYXliYWNrKSB7Ci0JCQlzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7Ci0JCX0KLQkJc291bmRfZnJlZV9kbWEgKGRldmMtPmRtYV9wbGF5YmFjayk7Ci0JCS8qIGZyZWUgaXJxICovCi0JCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7Ci0JCS8qIGZyZWUgaW8gKi8KLQkJcmVsZWFzZV9yZWdpb24gKGRldmMtPmJhc2UsIDE2KTsKLSNpZmRlZiBfX0lTQVBOUF9fCi0JCWlmIChkZXZjLT5wbnBkZXYpIHsKLQkJICAJcG5wX2Rpc2FibGVfZGV2KGRldmMtPnBucGRldik7Ci0JCQlwbnBfZGV2aWNlX2RldGFjaChkZXZjLT5wbnBkZXYpOwotCQl9Ci0jZW5kaWYKLQkJCi0JfSBlbHNlCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gZGV2aWNlL2NhcmQgc3BlY2lmaWVkXG4iKTsKLX0KLQotc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMiA9IC0xOwotCi0jaWZkZWYgX19JU0FQTlBfXwotLyogdXNlIGlzYXBucCBmb3IgY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCBpc2FwbnAJPSAxOwotc3RhdGljIGludCBpc2FwbnBqdW1wOwotbW9kdWxlX3BhcmFtKGlzYXBucCwgYm9vbCwgMCk7Ci1tb2R1bGVfcGFyYW0oaXNhcG5wanVtcCwgaW50LCAwKTsKLSNlbmRpZgotCi1tb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGFkMTgxNl9jbG9ja2ZyZXEsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0ob3B0aW9ucywgaW50LCAwKTsKLQotI2lmZGVmIF9fSVNBUE5QX18KLXN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IGNhcmRfdmVuZG9yLCBjYXJkX2RldmljZTsKLQl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7Ci0JdW5zaWduZWQgc2hvcnQgZnVuY3Rpb247Ci0Jc3RydWN0IGFkMTgxNl9kYXRhICpkYXRhOwotfSBpc2FwbnBfYWQxODE2X2xpc3RbXSBfX2luaXRkYXRhID0gewotCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKLQkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxNTApLCAKLQkJTlVMTCB9LAotCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKLQkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxODApLAotCQlOVUxMIH0sCi0JezB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgaXNhcG5wX2FkMTgxNl9saXN0KTsKLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZChzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsCi0JCQkJCSAgdW5zaWduZWQgc2hvcnQgdmVuZG9yLAotCQkJCQkgIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uKQotewotCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOwotICAJc3RydWN0IHBucF9kZXYgKmNhcmRfZGV2ID0gcG5wX2ZpbmRfZGV2KGNhcmQsIHZlbmRvciwgZnVuY3Rpb24sIE5VTEwpOwotCWlmICghY2FyZF9kZXYpIHJldHVybjsKLQlpZiAocG5wX2RldmljZV9hdHRhY2goY2FyZF9kZXYpIDwgMCkgewotCSAgCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGF0dGFjaCBQblAgZGV2aWNlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocG5wX2FjdGl2YXRlX2RldihjYXJkX2RldikgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGFjdGl2YXRlIFBuUCBkZXZpY2VcbiIpOwotCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7Ci0JCXJldHVybjsKLQl9Ci0JY2ZnLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChjYXJkX2RldiwgMik7Ci0JY2ZnLmlycSA9IHBucF9pcnEoY2FyZF9kZXYsIDApOwotCWNmZy5kbWEgPSBwbnBfaXJxKGNhcmRfZGV2LCAwKTsKLQljZmcuZG1hMiA9IHBucF9pcnEoY2FyZF9kZXYsIDEpOwotCWlmICghYWQxODE2X2luaXRfY2FyZCgmY2ZnLCBjYXJkX2RldikpIHsKLQkgIAlwbnBfZGlzYWJsZV9kZXYoY2FyZF9kZXYpOwotCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZHModm9pZCkKLXsKLQlpbnQgbnJfcG5wX2NmZzsKLQlpbnQgaTsKLQkKLQkvKiBDb3VudCBlbnRyaWVzIGluIGlzYXBucF9hZDE4MTZfbGlzdCAqLwotCWZvciAobnJfcG5wX2NmZyA9IDA7IGlzYXBucF9hZDE4MTZfbGlzdFtucl9wbnBfY2ZnXS5jYXJkX3ZlbmRvciAhPSAwOyAKLQkJbnJfcG5wX2NmZysrKTsKLQkvKiBDaGVjayBhbmQgYWRqdXN0IGlzYXBucGp1bXAgKi8KLQlpZiggaXNhcG5wanVtcCA8IDAgfHwgaXNhcG5wanVtcCA+PSBucl9wbnBfY2ZnKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkiYWQxODE2OiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiAiCi0JCQkiQWRqdXN0ZWQgdG8gMC5cbiIsIG5yX3BucF9jZmctMSk7Ci0JCWlzYXBucGp1bXAgPSAwOwotCX0KLQlmb3IgKGkgPSBpc2FwbnBqdW1wOyBpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF92ZW5kb3IgIT0gMDsgaSsrKSB7Ci0JIAlzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQgPSBOVUxMOwotCQkvKiBpdGVyYXRlIG92ZXIgYWxsIHBucCBjYXJkcyAqLwkJCi0JCXdoaWxlICgoY2FyZCA9IHBucF9maW5kX2NhcmQoaXNhcG5wX2FkMTgxNl9saXN0W2ldLmNhcmRfdmVuZG9yLAotCQkgICAgICAgICAgICAgIAlpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF9kZXZpY2UsIGNhcmQpKSkgCi0JCQlhZDE4MTZfY29uZmlnX3BucF9jYXJkKGNhcmQsIAotCQkJCWlzYXBucF9hZDE4MTZfbGlzdFtpXS52ZW5kb3IsCi0JCQkJaXNhcG5wX2FkMTgxNl9saXN0W2ldLmZ1bmN0aW9uKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyogbW9kdWxlIGluaXRpYWxpemF0aW9uICovCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2FkMTgxNih2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQUQxODE2IHNvdW5kZHJpdmVyICIKLQkJCSAiQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgYnkgVGhvcnN0ZW4gS25hYmUgYW5kICIKLQkJCSAib3RoZXJzXG4iKTsKLSNpZmRlZiBBRDE4MTZfQ0xPQ0sgCi0JLyogc2V0IGFkMTgxNl9jbG9ja2ZyZXEgaWYgc2V0IGR1cmluZyBjb21waWxhdGlvbiAqLwotCWFkMTgxNl9jbG9ja2ZyZXE9QUQxODE2X0NMT0NLOwotI2VuZGlmCi0JaWYgKGFkMTgxNl9jbG9ja2ZyZXE8NTAwMCB8fCBhZDE4MTZfY2xvY2tmcmVxPjEwMDAwMCkgewotCQlhZDE4MTZfY2xvY2tmcmVxPTMzMDAwOwotCX0KLQotI2lmZGVmIF9fSVNBUE5QX18KLQkvKiBjb25maWd1cmUgUG5QIGNhcmRzICovCi0JaWYoaXNhcG5wKSBhZDE4MTZfY29uZmlnX3BucF9jYXJkcygpOwotI2VuZGlmCi0JLyogY29uZmlndXJlIGNhcmQgYnkgbW9kdWxlIHBhcmFtcyAqLwotCWlmIChpbyAhPSAtMSAmJiBpcnEgIT0gLTEgJiYgZG1hICE9IC0xKSB7Ci0JCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOwotCQljZmcuaW9fYmFzZSA9IGlvOwotCQljZmcuaXJxID0gaXJxOwotCQljZmcuZG1hID0gZG1hOwotCQljZmcuZG1hMiA9IGRtYTI7Ci0JCWFkMTgxNl9pbml0X2NhcmQoJmNmZywgTlVMTCk7Ci0JfQotCWlmIChucl9hZDE4MTZfZGV2cyA8PSAwKQotCSAgCXJldHVybiAtRU5PREVWOwotCXJldHVybiAwOwotfQotCi0vKiBtb2R1bGUgY2xlYW51cCAqLwotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYWQxODE2ICh2b2lkKQotewotCWludCAgICAgICAgICBpOwotCWFkMTgxNl9pbmZvICAqZGV2YyA9IE5VTEw7Ci0gIAotCS8qIHJlbW92ZSBhbnkgc291bmRjYXJkICovCi0JZm9yIChpID0gMDsgIGkgPCBucl9hZDE4MTZfZGV2czsgaSsrKSB7Ci0JCWRldmMgPSAmZGV2X2luZm9baV07Ci0JCXVubG9hZF9jYXJkKGRldmMpOwotCX0gICAgIAotCW5yX2FkMTgxNl9kZXZzPTA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBkcml2ZXIgdW5sb2FkZWQhXG4iKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9hZDE4MTYpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9hZDE4MTYpOwotCi0jaWZuZGVmIE1PRFVMRQotLyoga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgZXZhbHVhdGlvbiAqLwotc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWQxODE2KGNoYXIgKnN0cikKLXsKLQkvKiBpbywgaXJxLCBkbWEsIGRtYTIgKi8KLQlpbnQgaW50c1s1XTsKLQkKLQlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQotCWlvCT0gaW50c1sxXTsKLQlpcnEJPSBpbnRzWzJdOwotCWRtYQk9IGludHNbM107Ci0JZG1hMgk9IGludHNbNF07Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImFkMTgxNj0iLCBzZXR1cF9hZDE4MTYpOwotI2VuZGlmCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODg5LmMgYi9zb3VuZC9vc3MvYWQxODg5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzMwYTMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FkMTg4OS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+Ci0gKgotICogIEFuYWxvZyBEZXZpY2VzIDE4ODkgUENJIGF1ZGlvIGRyaXZlciAoQUQxODE5IEFDOTctY29tcGF0aWJsZSBjb2RlYykKLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogICBOb3RlczoKLSAqICAgMS4gT25seSBmbGF0IERNQSBpcyBzdXBwb3J0ZWQ7IHMtZyBpcyBub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdwotICoKLSAqCi08anNtPiB0YXVzcTogQW55d2F5LCB0byBzZXQgdXAgc2FtcGxlIHJhdGVzIGZvciBEIHRvIEEsIHlvdSBqdXN0IHVzZSB0aGUgc2FtcGxlIHJhdGUgb24gdGhlIGNvZGVjLiBGb3IgQSB0byBELCB5b3UgbmVlZCB0byBzZXQgdGhlIGNvZGVjIGFsd2F5cyB0byA0OEsgKHVzaW5nIHRoZSBzcGxpdCBzYW1wbGUgcmF0ZSBmZWF0dXJlIG9uIHRoZSBjb2RlYykgYW5kIHRoZW4gc2V0IHRoZSByZXNhbXBsZXIgb24gdGhlIEFEMTg4OSB0byB0aGUgc2FtcGxlIHJhdGUgeW91IHdhbnQuCi08anNtPiBBbHNvLCB3aGVuIGNoYW5naW5nIHRoZSBzYW1wbGUgcmF0ZSBvbiB0aGUgY29kZWMgeW91IG5lZWQgdG8gcG93ZXIgaXQgZG93biBhbmQgcmUgcG93ZXIgaXQgdXAgZm9yIHRoZSBjaGFuZ2UgdG8gdGFrZSBlZmZlY3QhCi0gKgotICogJElkOiBhZDE4ODkuYyx2IDEuMyAyMDAyLzEwLzE5IDIxOjMxOjQ0IGdydW5kbGVyIEV4cCAkCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiYWQxODg5LmgiCi0KLSNkZWZpbmUgREJHKGZtdCwgYXJnLi4uKSBwcmludGsoZm10LCAjI2FyZykKLSNkZWZpbmUgREVWTkFNRSAiYWQxODg5IgotCi0jZGVmaW5lIE5SX0hXX0NICTQKLSNkZWZpbmUgREFDX1JVTk5JTkcJMQotI2RlZmluZSBBRENfUlVOTklORwkyCi0KLSNkZWZpbmUgVU5ERVJSVU4oZGV2KQkoMCkKLQotI2RlZmluZSBBRDE4ODlfUkVBRFcoZGV2LHJlZykgcmVhZHcoZGV2LT5yZWdiYXNlICsgcmVnKQotI2RlZmluZSBBRDE4ODlfV1JJVEVXKGRldixyZWcsdmFsKSB3cml0ZXcoKHZhbCksIGRldi0+cmVnYmFzZSArIHJlZykKLSNkZWZpbmUgQUQxODg5X1JFQURMKGRldixyZWcpIHJlYWRsKGRldi0+cmVnYmFzZSArIHJlZykKLSNkZWZpbmUgQUQxODg5X1dSSVRFTChkZXYscmVnLHZhbCkgd3JpdGVsKCh2YWwpLCBkZXYtPnJlZ2Jhc2UgKyByZWcpCi0KLS8vbm93IDEwMG1zCi0vKiAjZGVmaW5lIFdBSVRfMTBNUygpCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApICovCi0jZGVmaW5lIFdBSVRfMTBNUygpCWRvIHsgaW50IF9faTsgZm9yIChfX2kgPSAwOyBfX2kgPCAxMDA7IF9faSsrKSB1ZGVsYXkoMTAwMCk7IH0gd2hpbGUoMCkKLQotLyogY3VycmVudGx5IG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBkZXZpY2UgKi8KLXN0YXRpYyBhZDE4ODlfZGV2X3QgKmFkMTg4OV9kZXYgPSBOVUxMOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBoZWxwZXIgcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfc2V0X3dhdl9yYXRlKGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlYyA9IGRldi0+YWM5N19jb2RlYzsKLQotCURCRygiU2V0dGluZyBXQVYgcmF0ZSB0byAlZFxuIiwgcmF0ZSk7Ci0JZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1Zi5yYXRlID0gcmF0ZTsKLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfRFNfV0FTLCByYXRlKTsKLQotCS8qIEN5Y2xlIHRoZSBEQUMgdG8gZW5hYmxlIHRoZSBuZXcgcmF0ZSAqLwotCWFjOTdfY29kZWMtPmNvZGVjX3dyaXRlKGRldi0+YWM5N19jb2RlYywgQUM5N19QT1dFUl9DT05UUk9MLCAweDAyMDApOwotCVdBSVRfMTBNUygpOwotCWFjOTdfY29kZWMtPmNvZGVjX3dyaXRlKGRldi0+YWM5N19jb2RlYywgQUM5N19QT1dFUl9DT05UUk9MLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV9zZXRfd2F2X2ZtdChhZDE4ODlfZGV2X3QgKmRldiwgaW50IGZtdCkKLXsKLQl1MTYgdG1wOwotCi0JREJHKCJTZXR0aW5nIFdBViBmb3JtYXQgdG8gMHgleFxuIiwgZm10KTsKLQotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsKLQlpZiAoZm10ICYgQUZNVF9TMTZfTEUpIHsKLQkJLy90bXAgfD0gMHgwMTAwOyAvKiBzZXQgV0ExNiAqLwotCQl0bXAgfD0gMHgwMzAwOyAvKiBzZXQgV0ExNiBzdGVyZW8gKi8KLQl9IGVsc2UgaWYgKGZtdCAmIEFGTVRfVTgpIHsKLQkJdG1wICY9IH4weDAxMDA7IC8qIGNsZWFyIFdBMTYgKi8KLQl9IAotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV1NNQywgdG1wKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV9zZXRfYWRjX2ZtdChhZDE4ODlfZGV2X3QgKmRldiwgaW50IGZtdCkKLXsKLQl1MTYgdG1wOwotCi0JREJHKCJTZXR0aW5nIEFEQyBmb3JtYXQgdG8gMHgleFxuIiwgZm10KTsKLQotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DKTsKLQlpZiAoZm10ICYgQUZNVF9TMTZfTEUpIHsKLQkJdG1wIHw9IDB4MDEwMDsgLyogc2V0IFdBMTYgKi8KLQl9IGVsc2UgaWYgKGZtdCAmIEFGTVRfVTgpIHsKLQkJdG1wICY9IH4weDAxMDA7IC8qIGNsZWFyIFdBMTYgKi8KLQl9IAotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfUkFNQywgdG1wKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X3N0YXJ0X3dhdihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlpbnQgY250OwotCXUxNiB0bXA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChkbWFidWYtPmRtYV9sZW4pCS8qIERNQSBhbHJlYWR5IGluIGZsaWdodCAqLwotCQlnb3RvIHNraXBfZG1hOwotCi0JLyogc2V0dXAgZG1hICovCi0JY250ID0gZG1hYnVmLT53cl9wdHIgLSBkbWFidWYtPnJkX3B0cjsKLQlpZiAoY250ID09IDApCQkvKiBkb25lIC0gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLwotCQlnb3RvIHNraXBfZG1hOwotCi0JLyogSWYgdGhlIHdyX3B0ciBoYXMgd3JhcHBlZCwgb25seSBtYXAgdG8gdGhlIGVuZCAqLwotCWlmIChjbnQgPCAwKQotCQljbnQgPSBETUFfU0laRSAtIGRtYWJ1Zi0+cmRfcHRyOwotCi0JZG1hYnVmLT5kbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoYWQxODg5X2Rldi0+cGNpLAotCQkJCQlkbWFidWYtPnJhd2J1ZiArIGRtYWJ1Zi0+cmRfcHRyLAotCQkJCQljbnQsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWRtYWJ1Zi0+ZG1hX2xlbiA9IGNudDsKLQlkbWFidWYtPnJlYWR5ID0gMTsKLQotCURCRygiU3RhcnRpbmcgcGxheWJhY2sgYXQgMHglcCBmb3IgJWxkIGJ5dGVzXG4iLCBkbWFidWYtPnJhd2J1ZiArCi0JICAgIGRtYWJ1Zi0+cmRfcHRyLCBkbWFidWYtPmRtYV9sZW4pOwotCi0gICAgICAgIC8qIGxvYWQgdXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgc2V0ICovCi0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWQ0MsIGNudCk7Ci0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWSUNDLCBjbnQpOwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVkNBLCBkbWFidWYtPmRtYV9oYW5kbGUpOwotCi0JLyogVE9ETzogZm9yIG5vdyB3ZSBsb2FkIHRoZSBiYXNlIHJlZ2lzdGVycyB3aXRoIHRoZSBzYW1lIHRoaW5nICovCi0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWQkMsIGNudCk7Ci0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWSUJDLCBjbnQpOwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVkJBLCBkbWFidWYtPmRtYV9oYW5kbGUpOwotCi0JLyogYW5kIHdlJ3JlIG9mZiB0byB0aGUgcmFjZXMuLi4gKi8KLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9DSFNTLCAweDgpOwotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsKLQl0bXAgfD0gMHgwNDAwOyAvKiBzZXQgV0FFTiAqLwotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV1NNQywgdG1wKTsKLQkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOyAvKiBmbHVzaCBwb3N0ZWQgUENJIHdyaXRlICovCi0KLQlkbWFidWYtPmVuYWJsZSB8PSBEQUNfUlVOTklORzsKLQotc2tpcF9kbWE6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfc3RvcF93YXYoYWQxODg5X3N0YXRlX3QgKnN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7Ci0JCXUxNiB0bXA7Ci0JCXVuc2lnbmVkIGxvbmcgY250ID0gZG1hYnVmLT5kbWFfbGVuOwotCi0JCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsKLQkJdG1wICY9IH4weDA0MDA7IC8qIGNsZWFyIFdBRU4gKi8KLQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DLCB0bXApOwotCQkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOyAvKiBmbHVzaCBwb3N0ZWQgUENJIHdyaXRlICovCi0JCXBjaV91bm1hcF9zaW5nbGUoYWQxODg5X2Rldi0+cGNpLCBkbWFidWYtPmRtYV9oYW5kbGUsIAotCQkJCWNudCwgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQkJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOwotCi0JCS8qIHVwZGF0ZSBkbWEgcG9pbnRlcnMgKi8KLQkJZG1hYnVmLT5yZF9wdHIgKz0gY250OwotCQlkbWFidWYtPnJkX3B0ciAmPSAoRE1BX1NJWkUgLSAxKTsKLQotCQlkbWFidWYtPmRtYV9oYW5kbGUgPSAwOwotCQlkbWFidWYtPmRtYV9sZW4gPSAwOwotCQlkbWFidWYtPnJlYWR5ID0gMDsKLQotCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLQotI2lmIDAKLXN0YXRpYyB2b2lkIGFkMTg4OV9zdGFydHN0b3BfYWRjKGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSwgaW50IHN0YXJ0KQotewotCXUxNiB0bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DKTsKLQlpZiAoc3RhcnQpIHsKLQkJc3RhdGUtPmRtYWJ1Zi5lbmFibGUgfD0gQURDX1JVTk5JTkc7Ci0JCXRtcCB8PSAweDAwMDQ7IC8qIHNldCBBREVOICovCi0JfSBlbHNlIHsKLQkJc3RhdGUtPmRtYWJ1Zi5lbmFibGUgJj0gfkFEQ19SVU5OSU5HOwotCQl0bXAgJj0gfjB4MDAwNDsgLyogY2xlYXIgQURFTiAqLwotCX0KLQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMsIHRtcCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBhZDE4ODlfZGV2X3QgKmFkMTg4OV9hbGxvY19kZXYoc3RydWN0IHBjaV9kZXYgKnBjaSkKLXsKLQlhZDE4ODlfZGV2X3QgKmRldjsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JaW50IGk7Ci0KLQlpZiAoKGRldiA9IGt6YWxsb2Moc2l6ZW9mKGFkMTg4OV9kZXZfdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKLQlkZXYtPnBjaSA9IHBjaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBRF9NQVhfU1RBVEVTOyBpKyspIHsKLQkJZGV2LT5zdGF0ZVtpXS5jYXJkID0gZGV2OwotCQltdXRleF9pbml0KCZkZXYtPnN0YXRlW2ldLm11dGV4KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5zdGF0ZVtpXS5kbWFidWYud2FpdCk7Ci0JfQotCi0JLyogYWxsb2NhdGUgZG1hIGJ1ZmZlciAqLwotCi0JZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgewotCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtpXS5kbWFidWY7Ci0JCWRtYWJ1Zi0+cmF3YnVmID0ga21hbGxvYyhETUFfU0laRSwgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKLQkJaWYgKCFkbWFidWYtPnJhd2J1ZikKLQkJCWdvdG8gZXJyX2ZyZWVfZG1hYnVmOwotCQlkbWFidWYtPnJhd2J1Zl9zaXplID0gRE1BX1NJWkU7Ci0JCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IDA7Ci0JCWRtYWJ1Zi0+cmRfcHRyID0gZG1hYnVmLT53cl9wdHIgPSBkbWFidWYtPmRtYV9sZW4gPSAwVUw7Ci0JCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQlkbWFidWYtPnJhdGUgPSA0ODAwMDsKLQl9Ci0JcmV0dXJuIGRldjsKLQotZXJyX2ZyZWVfZG1hYnVmOgotCXdoaWxlICgtLWkgPj0gMCkKLQkJa2ZyZWUoZGV2LT5zdGF0ZVtpXS5kbWFidWYucmF3YnVmKTsKLQlrZnJlZShkZXYpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfZnJlZV9kZXYoYWQxODg5X2Rldl90ICpkZXYpCi17Ci0JaW50IGo7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCi0JaWYgKGRldiA9PSBOVUxMKSAKLQkJcmV0dXJuOwotCi0JaWYgKGRldi0+YWM5N19jb2RlYykKLQkJYWM5N19yZWxlYXNlX2NvZGVjKGRldi0+YWM5N19jb2RlYyk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgQURfTUFYX1NUQVRFUzsgaisrKSB7Ci0JCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW2pdLmRtYWJ1ZjsKLQkJa2ZyZWUoZG1hYnVmLT5yYXdidWYpOwotCX0KLQotCWtmcmVlKGRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfdHJpZ2dlcl9wbGF5YmFjayhhZDE4ODlfZGV2X3QgKmRldikKLXsKLSNpZiAwCi0JdTMyIHZhbDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1ZjsKLSNlbmRpZgotCi0JYWQxODg5X3N0YXJ0X3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfcmVhZF9wcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQljaGFyICpvdXQgPSBwYWdlOwotCWludCBsZW4sIGk7Ci0JYWQxODg5X2Rldl90ICpkZXYgPSBkYXRhOwotCWFkMTg4OV9yZWdfdCByZWdzW10gPSB7Ci0JCXsgIldTTUMiLCBBRF9EU19XU01DLCAxNiB9LAotCQl7ICJSQU1DIiwgQURfRFNfUkFNQywgMTYgfSwKLQkJeyAiV0FEQSIsIEFEX0RTX1dBREEsIDE2IH0sCi0JCXsgIlNZREEiLCBBRF9EU19TWURBLCAxNiB9LAotCQl7ICJXQVMiLCBBRF9EU19XQVMsIDE2IH0sCi0JCXsgIlJFUyIsIEFEX0RTX1JFUywgMTYgfSwKLQkJeyAiQ0NTIiwgQURfRFNfQ0NTLCAxNiB9LAotCQl7ICJBRENCQSIsIEFEX0RNQV9BRENCQSwgMzIgfSwKLQkJeyAiQURDQ0EiLCBBRF9ETUFfQURDQ0EsIDMyIH0sCi0JCXsgIkFEQ0JDIiwgQURfRE1BX0FEQ0JDLCAzMiB9LAotCQl7ICJBRENDQyIsIEFEX0RNQV9BRENDQywgMzIgfSwKLQkJeyAiQURDSUJDIiwgQURfRE1BX0FEQ0lCQywgMzIgfSwKLQkJeyAiQURDSUNDIiwgQURfRE1BX0FEQ0lDQywgMzIgfSwKLQkJeyAiQURDQ1RSTCIsIEFEX0RNQV9BRENDVFJMLCAxNiB9LAotCQl7ICJXQVZCQSIsIEFEX0RNQV9XQVZCQSwgMzIgfSwKLQkJeyAiV0FWQ0EiLCBBRF9ETUFfV0FWQ0EsIDMyIH0sCi0JCXsgIldBVkJDIiwgQURfRE1BX1dBVkJDLCAzMiB9LAotCQl7ICJXQVZDQyIsIEFEX0RNQV9XQVZDQywgMzIgfSwKLQkJeyAiV0FWSUJDIiwgQURfRE1BX1dBVklCQywgMzIgfSwKLQkJeyAiV0FWSUNDIiwgQURfRE1BX1dBVklDQywgMzIgfSwKLQkJeyAiV0FWQ1RSTCIsIEFEX0RNQV9XQVZDVFJMLCAxNiB9LAotCQl7ICJESVNSIiwgQURfRE1BX0RJU1IsIDMyIH0sCi0JCXsgIkNIU1MiLCBBRF9ETUFfQ0hTUywgMzIgfSwKLQkJeyAiSVBDIiwgQURfR1BJT19JUEMsIDE2IH0sCi0JCXsgIk9QIiwgQURfR1BJT19PUCwgMTYgfSwKLQkJeyAiSVAiLCBBRF9HUElPX0lQLCAxNiB9LAotCQl7ICJBQ0lDIiwgQURfQUM5N19BQ0lDLCAxNiB9LAotCQl7ICJBQzk3X1JFU0VUIiwgQURfQUM5N19CQVNFICsgQUM5N19SRVNFVCwgMTYgfSwKLQkJeyAiQUM5N19NQVNURVJfVk9MX1NURVJFTyIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIDE2IH0sCi0JCXsgIkFDOTdfSEVBRFBIT05FX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfSEVBRFBIT05FX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19NQVNURVJfVk9MX01PTk8iLCBBRF9BQzk3X0JBU0UgKyBBQzk3X01BU1RFUl9WT0xfTU9OTywgMTYgfSwKLQkJeyAiQUM5N19NQVNURVJfVE9ORSIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTUFTVEVSX1RPTkUsIDE2IH0sCi0JCXsgIkFDOTdfUENCRUVQX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUENCRUVQX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19QSE9ORV9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1BIT05FX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19NSUNfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19NSUNfVk9MLCAxNiB9LAotCQl7ICJBQzk3X0xJTkVJTl9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X0xJTkVJTl9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfQ0RfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19DRF9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfVklERU9fVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19WSURFT19WT0wsIDE2IH0sCi0JCXsgIkFDOTdfQVVYX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfQVVYX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19QQ01PVVRfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19QQ01PVVRfVk9MLCAxNiB9LAotCQl7ICJBQzk3X1JFQ09SRF9TRUxFQ1QiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1JFQ09SRF9TRUxFQ1QsIDE2IH0sCi0JCXsgIkFDOTdfUkVDT1JEX0dBSU4iLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1JFQ09SRF9HQUlOLCAxNiB9LAotCQl7ICJBQzk3X1JFQ09SRF9HQUlOX01JQyIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUkVDT1JEX0dBSU5fTUlDLCAxNiB9LAotCQl7ICJBQzk3X0dFTkVSQUxfUFVSUE9TRSIsIEFEX0FDOTdfQkFTRSArIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxNiB9LAotCQl7ICJBQzk3XzNEX0NPTlRST0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3XzNEX0NPTlRST0wsIDE2IH0sCi0JCXsgIkFDOTdfTU9ERU1fUkFURSIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTU9ERU1fUkFURSwgMTYgfSwKLQkJeyAiQUM5N19QT1dFUl9DT05UUk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19QT1dFUl9DT05UUk9MLCAxNiB9LAotCQl7IE5VTEwgfQotCX07Ci0KLQlpZiAoZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZm9yIChpID0gMDsgcmVnc1tpXS5uYW1lICE9IDA7IGkrKykKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiJXM6IDB4JTAqeFxuIiwgcmVnc1tpXS5uYW1lLCAKLQkJCXJlZ3NbaV0ud2lkdGggPj4gMiwgCi0JCQkocmVnc1tpXS53aWR0aCA9PSAxNiAKLQkJCSAJPyBBRDE4ODlfUkVBRFcoZGV2LCByZWdzW2ldLm9mZnNldCkKLQkJCQk6IEFEMTg4OV9SRUFETChkZXYsIHJlZ3NbaV0ub2Zmc2V0KSkpOwotCi0JZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgewotCQlvdXQgKz0gc3ByaW50ZihvdXQsICJETUEgc3RhdHVzIGZvciAlczpcbiIsIAotCQkJKGkgPT0gQURfV0FWX1NUQVRFID8gIldBViIgOiAiQURDIikpOyAKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiXHRcdDB4JXAgKElPVkE6IDB4JWxsdSlcbiIsCi0JCQlkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5yYXdidWYsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9oYW5kbGUpOwotCi0JCW91dCArPSBzcHJpbnRmKG91dCwgIlx0cmVhZCBwdHI6IG9mZnNldCAldVxuIiwgCi0JCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLnJkX3B0cik7Ci0JCW91dCArPSBzcHJpbnRmKG91dCwgIlx0d3JpdGUgcHRyOiBvZmZzZXQgJXVcbiIsIAotCQkJKHVuc2lnbmVkIGludClkZXYtPnN0YXRlW2ldLmRtYWJ1Zi53cl9wdHIpOwotCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcdGRtYSBsZW46IG9mZnNldCAldVxuIiwgCi0JCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9sZW4pOwotCX0KLQotCWxlbiA9IG91dCAtIHBhZ2UgLSBvZmY7Ci0JaWYgKGxlbiA8IGNvdW50KSB7Ci0JCSplb2YgPSAxOwotCQlpZiAobGVuIDw9IDApIHJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWxlbiA9IGNvdW50OwotCX0KLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCXJldHVybiBsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotI2lmIDAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhZDE4ODlfZ2V0X2RtYV9hZGRyKGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQl1MzIgb2Zmc2V0OwotCi0JaWYgKCEoZG1hYnVmLT5lbmFibGUgJiAoREFDX1JVTk5JTkcgfCBBRENfUlVOTklORykpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGdldF9kbWFfYWRkciBjYWxsZWQgd2l0aG91dCBkbWEgZW5hYmxlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKLQkJb2Zmc2V0ID0gbGUzMl90b19jcHUoQUQxODg5X1JFQURMKHN0YXRlLT5jYXJkLCBBRF9ETUFfV0FWQkEpKTsKLQllbHNlCi0JCW9mZnNldCA9IGxlMzJfdG9fY3B1KEFEMTg4OV9SRUFETChzdGF0ZS0+Y2FyZCwgQURfRE1BX0FEQ0JBKSk7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSAtICh1bnNpZ25lZCBsb25nKWRtYWJ1Zi0+cmF3YnVmOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfdXBkYXRlX3B0cihhZDE4ODlfZGV2X3QgKmRldiwgaW50IHdha2UpCi17Ci0JYWQxODg5X3N0YXRlX3QgKnN0YXRlOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQl1bnNpZ25lZCBsb25nIGh3cHRyOwotCWludCBkaWZmOwotCi0JLyogY2hlY2sgQURDIGZpcnN0ICovCi0Jc3RhdGUgPSAmZGV2LT5hZGNfc3RhdGU7Ci0JZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKLQkJaHdwdHIgPSBhZDE4ODlfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKLQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOwotCi0JCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKLQkJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOwotCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7Ci0JCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQotCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQotCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCWlmICh3YWtlICYgZG1hYnVmLT5jb3VudCA+PSBkbWFidWYtPmZyYWdzaXplKQotCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAod2FrZSAmIGRtYWJ1Zi0+Y291bnQgPiAwKQotCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCX0KLQl9Ci0KLQkvKiBjaGVjayBEQUMgKi8KLQlzdGF0ZSA9ICZkZXYtPndhdl9zdGF0ZTsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgewotWFhYCi0KLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAvZGV2L2RzcCBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotc3RhdGljIHNzaXplX3QgYWQxODg5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKLQlsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkMTg4OV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAotCWxvZmZfdCAqcHBvcykKLXsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IChhZDE4ODlfZGV2X3QgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JYWQxODg5X3N0YXRlX3QgKnN0YXRlID0gJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXTsKLQl2b2xhdGlsZSBzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0KLQltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwotI2lmIDAKLQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGVycjE7Ci0JfQotI2VuZGlmCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci0KLQkvKiBzdGFydCBmaWxsaW5nIGRtYSBidWZmZXIuLi4uICovCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlsb25nIHJlbTsKLQkJbG9uZyBjbnQgPSBjb3VudDsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlmb3IgKDs7KSB7Ci0JCQlsb25nIHVzZWRfYnl0ZXM7Ci0JCQlsb25nIHRpbWVvdXQ7CS8qIG1heCB0aW1lIGZvciBETUEgaW4gamlmZmllcyAqLwotCi0JCQkvKiBidWZmZXIgaXMgZnVsbCBpZiB3ciBjYXRjaGVzIHVwIHRvIHJkICovCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXVzZWRfYnl0ZXMgPSBkbWFidWYtPndyX3B0ciAtIGRtYWJ1Zi0+cmRfcHRyOwotCQkJdGltZW91dCA9IChkbWFidWYtPmRtYV9sZW4gKiBIWikgLyBkbWFidWYtPnJhdGU7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQkvKiBhZGp1c3QgZm9yIGJ1ZmZlciB3cmFwIGFyb3VuZCAqLwotCQkJdXNlZF9ieXRlcyA9ICh1c2VkX2J5dGVzICsgRE1BX1NJWkUpICYgKERNQV9TSVpFIC0gMSk7Ci0KLQkJCS8qIElmIGF0IGxlYXN0IG9uZSBwYWdlIHVudXNlZCAqLwotCQkJaWYgKHVzZWRfYnl0ZXMgPCAoRE1BX1NJWkUgLSAweDEwMDApKQotCQkJCWJyZWFrOwotCi0JCQkvKiBkbWEgYnVmZmVyIGZ1bGwgKi8KLQotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJcmV0ID0gLUVBR0FJTjsKLQkJCQlnb3RvIGVycjI7Ci0JCQl9Ci0KLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQgKyAxKTsKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIGVycjI7Ci0JCQl9Ci0JCX0KLQotCQkvKiB3YXRjaCBvdXQgZm9yIHdyYXBwaW5nIGFyb3VuZCBzdGF0aWMgYnVmZmVyICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZW0gPSBETUFfU0laRSAtIGRtYWJ1Zi0+d3JfcHRyOwotCQlpZiAoY250ID4gcmVtKQotCQkJY250ID0gcmVtOwotCi0JCXJlbSA9IGRtYWJ1Zi0+d3JfcHRyOwotCi0JCS8qIHVwZGF0ZSBkbWEgcG9pbnRlcnMgKi8KLQkJZG1hYnVmLT53cl9wdHIgKz0gY250OwotCQlkbWFidWYtPndyX3B0ciAmPSBETUFfU0laRSAtIDE7CS8qIHdyYXAgcHRyIGlmIG5lY2Vzc2FyeSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIHRyYW5zZmVyIHVud3JhcHBlZCBjaHVuayAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyByZW0sIGJ1ZmZlciwgY250KSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZXJyMjsKLQkJfQotCi0JCURCRygiV3JpdGluZyAweCVseCBieXRlcyB0byArMHglbHhcbiIsIGNudCwgcmVtKTsKLQotCQkvKiB1cGRhdGUgY291bnRlcnMgKi8KLQkJY291bnQgLT0gY250OwotCQlidWZmZXIgKz0gY250OwotCQlyZXQgKz0gY250OwotCi0JCS8qIHdlIGhhdmUgc29tZXRoaW5nIHRvIHBsYXkgLSBnbyBwbGF5IGl0ISAqLwotCQlhZDE4ODlfdHJpZ2dlcl9wbGF5YmFjayhkZXYpOwotCX0KLQotZXJyMjoKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci1lcnIxOgotCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGFkMTg4OV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotI2lmIDAKLQlhZDE4ODlfZGV2X3QgKmRldiA9IChhZDE4ODlfZGV2X3QgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JYWQxODg5X3N0YXRlX3QgKnN0YXRlID0gTlVMTDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKLQlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXTsKLQkJaWYgKCFzdGF0ZSkgcmV0dXJuIDA7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZVtBRF9BRENfU1RBVEVdOwotCQlpZiAoIXN0YXRlKSByZXR1cm4gMDsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JYWQxODg5X3VwZGF0ZV9wdHIoZGV2LCAwKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW1dBVl9TVEFURV07Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCWlmIChkbWFidWYtPmNvdW50ID49IChpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCQl9IGVsc2UgewotCQkJaWYgKChpbnQpZG1hYnVmLT5kbWFzaXplID49IGRtYWJ1Zi0+Y291bnQgKyAKLQkJCQkoaW50KWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJfQotCX0KLQotCWlmIChmaWxlIC0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV07Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoaW50KWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0jZW5kaWYKLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCB2YWwgPSAwOwotCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JYXVkaW9fYnVmX2luZm8gYWJpbmZvOwotCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKLQotCURCRygiYWQxODg5X2lvY3RsIGNtZCAweCV4IGFyZyAlbHVcbiIsIGNtZCwgYXJnKTsKLQotCXN3aXRjaCAoY21kKQotCXsKLQljYXNlIE9TU19HRVRWRVJTSU9OOgotCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfUkVTRVQ6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NZTkM6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NQRUVEOgotCQkvKiBzZXQgc2FtcGxpbmcgcmF0ZSAqLwotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodmFsID4gNTQwMCAmJiB2YWwgPCA0ODAwMCkKLQkJewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV0FTLCB2YWwpOwotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19SRVMsIHZhbCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiB1bmRvY3VtZW50ZWQ/ICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQl2YWwgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV1NNQyk7Ci0JCQlpZiAodmFsKSB7Ci0JCQkJdmFsIHw9IDB4MDIwMDsgIC8qIHNldCBXQVNUICovCi0JCQl9IGVsc2UgewotCQkJCXZhbCAmPSB+MHgwMjAwOyAvKiBjbGVhciBXQVNUICovCi0JCQl9Ci0JCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMsIHZhbCk7Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQl2YWwgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfUkFNQyk7Ci0JCQlpZiAodmFsKSB7Ci0JCQkJdmFsIHw9IDB4MDAwMjsgIC8qIHNldCBBRFNUICovCi0JCQl9IGVsc2UgewotCQkJCXZhbCAmPSB+MHgwMDAyOyAvKiBjbGVhciBBRFNUICovCi0JCQl9Ci0JCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMsIHZhbCk7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgotCQlyZXR1cm4gcHV0X3VzZXIoRE1BX1NJWkUsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6Ci0JCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6Ci0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKHZhbCA9PSAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgCi0JCQkJYWQxODg5X3NldF9hZGNfZm10KGRldiwgdmFsKTsKLQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAKLQkJCQlhZDE4ODlfc2V0X3dhdl9mbXQoZGV2LCB2YWwpOwotCQl9IGVsc2UgewotCQkJdmFsID0gQUZNVF9TMTZfTEUgfCBBRk1UX1U4OwotCQl9Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCS8qIHNlbmQgYWxsIGRhdGEgdG8gZGV2aWNlICovCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6Ci0JCS8qIG5vdCBzdXBwb3J0ZWQ7IHVzZXMgZml4ZWQgZnJhZ21lbnQgc2l6ZXMgKi8KLQkJcmV0dXJuIHB1dF91c2VyKERNQV9TSVpFLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6Ci0JY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJLyogc3BhY2UgbGVmdCBpbiBkbWEgYnVmZmVycyAqLwotCQlpZiAoY21kID09IFNORENUTF9EU1BfR0VUT1NQQUNFKQotCQkJZG1hYnVmID0gJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWY7Ci0JCWVsc2UKLQkJCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV0uZG1hYnVmOwotCQlhYmluZm8uZnJhZ21lbnRzID0gMTsKLQkJYWJpbmZvLmZyYWdzdG90YWwgPSAxOwotCQlhYmluZm8uZnJhZ3NpemUgPSBETUFfU0laRTsKLQkJYWJpbmZvLmJ5dGVzID0gRE1BX1NJWkU7Ci0JCXJldHVybiBjb3B5X3RvX3VzZXIocCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7Ci0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgotCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgotCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6Ci0JCWJyZWFrOwotCQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCQlyZXR1cm4gcHV0X3VzZXIoQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dBUyksIHApOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgotCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6Ci0JY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKLQljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIC1FTk9UVFk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JLyogY2hlY2sgbWlub3I7IG9ubHkgc3VwcG9ydCAvZGV2L2RzcCBhdG0gKi8KLQlpZiAoaW1pbm9yKGlub2RlKSAhPSAzKQotCQlyZXR1cm4gLUVOWElPOwotCQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGFkMTg4OV9kZXY7Ci0KLQlhZDE4ODlfc2V0X3dhdl9yYXRlKGFkMTg4OV9kZXYsIDQ4MDAwKTsKLQlhZDE4ODlfc2V0X3dhdl9mbXQoYWQxODg5X2RldiwgQUZNVF9TMTZfTEUpOwotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV0FEQSwgMHgwNDA0KTsgLyogYXR0ZW51YXRpb24gKi8KLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JLyogaWYgd2UgaGF2ZSBzdGF0ZSBmcmVlIGl0IGhlcmUgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5yZWFkCQk9IGFkMTg4OV9yZWFkLAotCS53cml0ZQkJPSBhZDE4ODlfd3JpdGUsCi0JLnBvbGwJCT0gYWQxODg5X3BvbGwsCi0JLmlvY3RsCQk9IGFkMTg4OV9pb2N0bCwKLQkubW1hcAkJPSBhZDE4ODlfbW1hcCwKLQkub3BlbgkJPSBhZDE4ODlfb3BlbiwKLQkucmVsZWFzZQk9IGFkMTg4OV9yZWxlYXNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogL2Rldi9taXhlciBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoYWQxODg5X2Rldi0+YWM5N19jb2RlYy0+ZGV2X21peGVyICE9IGltaW5vcihpbm9kZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYWQxODg5X2Rldi0+YWM5N19jb2RlYzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X21peGVyX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5pb2N0bAkJPSBhZDE4ODlfbWl4ZXJfaW9jdGwsCi0JLm9wZW4JCT0gYWQxODg5X21peGVyX29wZW4sCi0JLnJlbGVhc2UJPSBhZDE4ODlfbWl4ZXJfcmVsZWFzZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEFDOTcgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkIGFkMTg4OV9jb2RlY193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NywgdTggcmVnLCB1MTYgdmFsKQotewotCWFkMTg4OV9kZXZfdCAqZGV2ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOwotCi0JLy9EQkcoIldyaXRpbmcgMHgleCB0byAweCVseFxuIiwgdmFsLCBkZXYtPnJlZ2Jhc2UgKyBBRF9BQzk3X0JBU0UgKyByZWcpOwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9BQzk3X0JBU0UgKyByZWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyB1MTYgYWQxODg5X2NvZGVjX3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmFjOTcsIHU4IHJlZykKLXsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IGFjOTctPnByaXZhdGVfZGF0YTsKLQkvL0RCRygiUmVhZGluZyBmcm9tIDB4JWx4XG4iLCBkZXYtPnJlZ2Jhc2UgKyBBRF9BQzk3X0JBU0UgKyByZWcpOwotCXJldHVybiBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0JBU0UgKyByZWcpOwotfQkKLQotc3RhdGljIGludCBhZDE4ODlfYWM5N19pbml0KGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgaWQpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmFjOTc7Ci0JdTE2IGVpZDsKLQotCWlmICgoYWM5NyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkgCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYWM5Ny0+cHJpdmF0ZV9kYXRhID0gZGV2OwotCWFjOTctPmlkID0gaWQ7Ci0KLQlhYzk3LT5jb2RlY19yZWFkID0gYWQxODg5X2NvZGVjX3JlYWQ7Ci0JYWM5Ny0+Y29kZWNfd3JpdGUgPSBhZDE4ODlfY29kZWNfd3JpdGU7Ci0KLQlpZiAoYWM5N19wcm9iZV9jb2RlYyhhYzk3KSA9PSAwKSB7Ci0JCXByaW50ayhERVZOQU1FICI6IGFjOTdfcHJvYmVfY29kZWMgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQllaWQgPSBhZDE4ODlfY29kZWNfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX0lEKTsKLQlpZiAoZWlkID09IDB4ZmZmZikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERFVk5BTUUgIjogbm8gY29kZWMgYXR0YWNoZWQ/XG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlkZXYtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7Ci0KLQlpZiAoKGFjOTctPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZhZDE4ODlfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogY2Fubm90IHJlZ2lzdGVyIG1peGVyXG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlkZXYtPmFjOTdfY29kZWMgPSBhYzk3OwotCXJldHVybiAwOwotCi1vdXRfZnJlZToKLQlhYzk3X3JlbGVhc2VfY29kZWMoYWM5Nyk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X2FjbGlua19yZXNldChzdHJ1Y3QgcGNpX2RldiAqIHBjaWRldikKLXsKLQl1MTYgc3RhdDsKLQlpbnQgcmV0cnkgPSAyMDA7Ci0JYWQxODg5X2Rldl90ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKLQotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9EU19DQ1MsIDB4ODAwMCk7IC8qIHR1cm4gb24gY2xvY2sgKi8KLQlBRDE4ODlfUkVBRFcoZGV2LCBBRF9EU19DQ1MpOwotCi0JV0FJVF8xME1TKCk7Ci0KLQlzdGF0ID0gQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKTsKLQlzdGF0IHw9IDB4MDAwMjsJCQkJLyogUmVzZXQgRGlzYWJsZSAqLwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9BQzk3X0FDSUMsIHN0YXQpOwotCSh2b2lkKSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0FDSUMpOwkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KLQotCXVkZWxheSgxMCk7Ci0KLQlzdGF0ID0gQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKTsKLQlzdGF0IHw9IDB4MDAwMTsJCQkJLyogSW50ZXJmYWNlIEVuYWJsZSAqLwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9BQzk3X0FDSUMsIHN0YXQpOwotCi0JZG8gewotCQlpZiAoQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKSAmIDB4ODAwMCkJLyogUmVhZHkgKi8KLQkJCWJyZWFrOwotCQlXQUlUXzEwTVMoKTsKLQkJcmV0cnktLTsKLQl9IHdoaWxlIChyZXRyeSA+IDApOwotCi0JaWYgKCFyZXRyeSkgewotCQlwcmludGsoS0VSTl9FUlIgImFkMTg4OV9hY2xpbmtfcmVzZXQ6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCi0JCQkgICAgQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyogVE9ETyByZXNldCBBQzk3IGNvZGVjICovCi0JLyogVE9ETyBzZXQgd2F2ZS9hZGMgcGNpIGN0cmwgc3RhdHVzICovCi0KLQlzdGF0ID0gQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKTsKLQlzdGF0IHw9IDB4MDAwNDsJCQkJLyogQXVkaW8gU3RyZWFtIE91dHB1dCBFbmFibGUgKi8KLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfQUM5N19BQ0lDLCBzdGF0KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogUENJIGludGVyZmFjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBQQ0kgZGV2aWNlIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWQxODg5X2lkX3RibFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9BTkFMT0dfREVWSUNFUywgUENJX0RFVklDRV9JRF9BRDE4ODlKUywgUENJX0FOWV9JRCwgCi0JICBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZylERVZOQU1FIH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZDE4ODlfaWRfdGJsKTsKLQotc3RhdGljIGlycXJldHVybl90IGFkMTg4OV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXUzMiBzdGF0OwotCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWRldl9pZDsKLQotCXN0YXQgPSBBRDE4ODlfUkVBREwoZGV2LCBBRF9ETUFfRElTUik7Ci0KLQkvKiBjbGVhciBJU1IgKi8KLQlBRDE4ODlfV1JJVEVMKGRldiwgQURfRE1BX0RJU1IsIHN0YXQpOwotCi0JaWYgKHN0YXQgJiAweDgpIHsJCS8qIFdBVkkgKi8KLQkJREJHKCJXQVYgaW50ZXJydXB0XG4iKTsKLQkJZGV2LT5zdGF0cy53YXZfaW50cnMrKzsKLQkJaWYgKGRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWYucmVhZHkpIHsKLQkJCWFkMTg4OV9zdG9wX3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsJLyogY2xlYW4gdXAgKi8KLQkJCWFkMTg4OV9zdGFydF93YXYoJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXSk7CS8qIHN0YXJ0IG5ldyAqLwotCQl9Ci0JfQotCi0JaWYgKChzdGF0ICYgMHgyKSAmJiBkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV0uZG1hYnVmLnJlYWR5KSB7IC8qIEFEQ0kgKi8KLQkJREJHKCJBREMgaW50ZXJydXB0XG4iKTsKLQkJZGV2LT5zdGF0cy5hZGNfaW50cnMrKzsKLQl9Ci0JaWYoc3RhdCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X2luaXRjZmcoYWQxODg5X2Rldl90ICpkZXYpCi17Ci0JdTE2IHRtcDE2OwotCXUzMiB0bXAzMjsKLQotCS8qIG1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGJpdHMgYXJlIHNldHVwIHRoZSB3YXkgd2Ugd2FudCAqLwotCXRtcDMyID0gQUQxODg5X1JFQURMKGRldiwgQURfRE1BX1dBVkNUUkwpOwotCXRtcDMyICY9IH4weGZmOyAvKiBmbGF0IGRtYSwgbm8gc2csIG1hc2sgb3V0IHRoZSBpbnRyIGJpdHMgKi8KLQl0bXAzMiB8PSAweDY7ICAvKiBpbnRyIG9uIGNvdW50LCBsb29wICovCi0JQUQxODg5X1dSSVRFTChkZXYsIEFEX0RNQV9XQVZDVFJMLCB0bXAzMik7Ci0KLQkvKiB1bm11dGUuLi4gKi8KLQl0bXAxNiA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0RTX1dBREEpOwotCXRtcDE2ICY9IH4weDgwODA7Ci0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTX1dBREEsIHRtcDE2KTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYWQxODg5X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IGVycjsKLQlhZDE4ODlfZGV2X3QgKmRldjsKLQl1bnNpZ25lZCBsb25nIGJhcjsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfcm9vdCA9IE5VTEw7Ci0KLQlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlwY2lfc2V0X21hc3RlcihwY2lkZXYpOwotCWlmICgoZGV2ID0gYWQxODg5X2FsbG9jX2RldihwY2lkZXYpKSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBkZXYpOwotCWJhciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOwotCQotICAgICAgICBpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBtZW1vcnkgcmVnaW9uIG5vdCBhc3NpZ25lZFxuIik7Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQlpZiAocGNpX3JlcXVlc3RfcmVnaW9uKHBjaWRldiwgMCwgREVWTkFNRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogdW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQlkZXYtPnJlZ2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoYmFyLCBBRF9EU19JT01FTVNJWkUpOwotCWlmICghZGV2LT5yZWdiYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IHVuYWJsZSB0byByZW1hcCBpb21lbVxuIik7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQlpZiAocmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIGFkMTg4OV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBERVZOQU1FLCBkZXYpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogdW5hYmxlIHRvIHJlcXVlc3QgaW50ZXJydXB0XG4iKTsKLQkJZ290byBvdXQzOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiAlcyBhdCAlcCBJUlEgJWRcbiIsCi0JCShjaGFyICopZW50LT5kcml2ZXJfZGF0YSwgZGV2LT5yZWdiYXNlLCBwY2lkZXYtPmlycSk7Ci0KLQlpZiAoYWQxODg5X2FjbGlua19yZXNldChwY2lkZXYpICE9IDApCi0JCWdvdG8gb3V0NDsKLQotCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCi0JaWYgKChkZXYtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmYWQxODg5X2ZvcHMsIC0xKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGNhbm5vdCByZWdpc3RlciAvZGV2L2RzcFxuIik7Ci0JCWdvdG8gb3V0NDsKLQl9Ci0KLQlpZiAoKGVyciA9IGFkMTg4OV9hYzk3X2luaXQoZGV2LCAwKSkgIT0gMCkKLQkJZ290byBvdXQ1OwotCi0JLyogWFhYOiBjbGVhbnVwcyAqLwotCWlmICgoKHByb2Nfcm9vdCA9IHByb2NfbWtkaXIoImRyaXZlci9hZDE4ODkiLCBOVUxMKSkgPT0gTlVMTCkgfHwKLQkgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiYWM5NyIsIFNfSUZSRUd8U19JUlVHTywgcHJvY19yb290LCBhYzk3X3JlYWRfcHJvYywgZGV2LT5hYzk3X2NvZGVjKSA9PSBOVUxMIHx8Ci0JICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImluZm8iLCBTX0lGUkVHfFNfSVJVR08sIHByb2Nfcm9vdCwgYWQxODg5X3JlYWRfcHJvYywgZGV2KSA9PSBOVUxMKSAKLQkJZ290byBvdXQ1OwotCQotCWFkMTg4OV9pbml0Y2ZnKGRldik7Ci0KLQkvL0RCRyhERVZOQU1FICI6IERyaXZlciBpbml0aWFsaXphdGlvbiBkb25lIVxuIik7Ci0KLQlhZDE4ODlfZGV2ID0gZGV2OwotCi0JcmV0dXJuIDA7Ci0KLW91dDU6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2LT5kZXZfYXVkaW8pOwotb3V0NDoKLQlmcmVlX2lycShwY2lkZXYtPmlycSwgZGV2KTsKLW91dDM6Ci0JaW91bm1hcChkZXYtPnJlZ2Jhc2UpOwotb3V0MjoKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGNpZGV2LCAwKTsKLW91dDE6Ci0JYWQxODg5X2ZyZWVfZGV2KGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGFkMTg4OV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKLXsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOwotCi0JaWYgKGRldiA9PSBOVUxMKSByZXR1cm47Ci0JCi0JdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihkZXYtPmFjOTdfY29kZWMtPmRldl9taXhlcik7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2LT5kZXZfYXVkaW8pOwotCWZyZWVfaXJxKHBjaWRldi0+aXJxLCBkZXYpOwotCWlvdW5tYXAoZGV2LT5yZWdiYXNlKTsKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGNpZGV2LCAwKTsKLQotCS8qIGFueSBodyBwcm9ncmFtbWluZyBuZWVkZWQ/ICovCi0JYWQxODg5X2ZyZWVfZGV2KGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgTlVMTCk7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIlJhbmRvbHBoIENodW5nIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEMTg4OSBQQ0kgQXVkaW8iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFkMTg4OV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gREVWTkFNRSwKLQkuaWRfdGFibGUJPSBhZDE4ODlfaWRfdGJsLAotCS5wcm9iZQkJPSBhZDE4ODlfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDE4ODlfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFkMTg4OV9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZDE4ODlfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDE4ODlfZHJpdmVyKTsKLQlyZXR1cm47Ci19Ci0KLW1vZHVsZV9pbml0KGFkMTg4OV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChhZDE4ODlfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTg4OS5oIGIvc291bmQvb3NzL2FkMTg4OS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkxMzc2Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hZDE4ODkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0jaWZuZGVmIF9BRDE4ODlfSF8KLSNkZWZpbmUgX0FEMTg4OV9IXwotCi0jZGVmaW5lIEFEX0RTX1dTTUMJMHgwMAkvKiBETUEgaW5wdXQgd2F2ZS9zeW4gbWl4ZXIgY29udHJvbCAqLwotI2RlZmluZSBBRF9EU19SQU1DCTB4MDIJLyogRE1BIG91dHB1dCByZXNhbXAvQURDIG1peGVyIGNvbnRyb2wgKi8KLSNkZWZpbmUgQURfRFNfV0FEQQkweDA0CS8qIERNQSBpbnB1dCB3YXZlIGF0dGVudWF0aW9uICovCi0jZGVmaW5lIEFEX0RTX1NZREEJMHgwNgkvKiBETUEgaW5wdXQgc3luIGF0dGVudHVhdGlvbiAqLwotI2RlZmluZSBBRF9EU19XQVMJMHgwOAkvKiB3YXZlIGlucHV0IHNhbXBsZSByYXRlICovCi0jZGVmaW5lIEFEX0RTX1JFUwkweDBhCS8qIHJlc2FtcGxlciBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KLSNkZWZpbmUgQURfRFNfQ0NTCTB4MGMJLyogY2hpcCBjb250cm9sL3N0YXR1cyAqLwotCi0jZGVmaW5lIEFEX0RNQV9SRVNCQQkweDQwCS8qIFJFUyBiYXNlIGFkZHIgKi8KLSNkZWZpbmUgQURfRE1BX1JFU0NBCTB4NDQJLyogUkVTIGN1cnJlbnQgYWRkciAqLwotI2RlZmluZSBBRF9ETUFfUkVTQkMJMHg0OAkvKiBSRVMgYmFzZSBjbnQgKi8KLSNkZWZpbmUgQURfRE1BX1JFU0NDCTB4NGMJLyogUkVTIGN1cnJlbnQgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX0FEQ0JBCTB4NTAJLyogQURDICovCi0jZGVmaW5lIEFEX0RNQV9BRENDQQkweDU0Ci0jZGVmaW5lIEFEX0RNQV9BRENCQwkweDU4Ci0jZGVmaW5lIEFEX0RNQV9BRENDQwkweDVjCi0jZGVmaW5lIEFEX0RNQV9TWU5CQQkweDYwCS8qIFNZTiAqLwotI2RlZmluZSBBRF9ETUFfU1lOQ0EJMHg2NAotI2RlZmluZSBBRF9ETUFfU1lOQkMJMHg2OAotI2RlZmluZSBBRF9ETUFfU1lOQ0MJMHg2YwotI2RlZmluZSBBRF9ETUFfV0FWQkEJMHg3MAkvKiBXQVYgKi8KLSNkZWZpbmUgQURfRE1BX1dBVkNBCTB4NzQKLSNkZWZpbmUgQURfRE1BX1dBVkJDCTB4NzgKLSNkZWZpbmUgQURfRE1BX1dBVkNDCTB4N2MKLSNkZWZpbmUgQURfRE1BX1JFU0lDQwkweDgwCS8qIFJFUyBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfUkVTSUJDCTB4ODQJLyogUkVTIGludGVycnVwdCBiYXNlIGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9BRENJQ0MJMHg4OAkvKiBBREMgaW50ZXJydXB0IGN1cnJlbnQgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX0FEQ0lCQwkweDhjCS8qIEFEQyBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfU1lOSUNDCTB4OTAJLyogU1lOIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9TWU5JQkMJMHg5NAkvKiBTWU4gaW50ZXJydXB0IGJhc2UgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX1dBVklDQwkweDk4CS8qIFdBViBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfV0FWSUJDCTB4OWMJLyogV0FWIGludGVycnVwdCBiYXNlIGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9SRVNDVFJMCTB4YTAJLyogUkVTIFBDSSBjb250cm9sL3N0YXR1cyAqLwotI2RlZmluZSBBRF9ETUFfQURDQ1RSTAkweGE4CS8qIEFEQyBQQ0kgY29udHJvbC9zdGF0dXMgKi8KLSNkZWZpbmUgQURfRE1BX1NZTkNUUkwJMHhiMAkvKiBTWU4gUENJIGNvbnRyb2wvc3RhdHVzICovCi0jZGVmaW5lIEFEX0RNQV9XQVZDVFJMCTB4YjgJLyogV0FWIFBDSSBjb250cm9sL3N0YXR1cyAqLwotI2RlZmluZSBBRF9ETUFfRElTUgkweGMwCS8qIFBDSSBETUEgaW50ciBzdGF0dXMgKi8KLSNkZWZpbmUgQURfRE1BX0NIU1MJMHhjNAkvKiBQQ0kgRE1BIGNoYW5uZWwgc3RvcCBzdGF0dXMgKi8KLQotI2RlZmluZSBBRF9HUElPX0lQQwkweGM4CS8qIElPIHBvcnQgY3RybCAqLwotI2RlZmluZSBBRF9HUElPX09QCTB4Y2EJLyogSU8gb3V0cHV0IHN0YXR1cyAqLwotI2RlZmluZSBBRF9HUElPX0lQCTB4Y2MJLyogSU8gaW5wdXQgc3RhdHVzICovCi0KLS8qIEFDOTcgcmVnaXN0ZXJzLCAweDEwMCAtIDB4MTdmOyBzZWUgYWM5Ny5oICovCi0jZGVmaW5lIEFEX0FDOTdfQkFTRSAgICAweDEwMCAgIC8qIGFjOTcgYmFzZSByZWdpc3RlciAqLwotI2RlZmluZSBBRF9BQzk3X0FDSUMJMHgxODAJLyogQUMgTGluayBpbnRlcmZhY2UgY3RybCAqLwotCi0vKiBPUEwzOyBCQVIxICovCi0jZGVmaW5lIEFEX09QTF9NMEFTCTB4MDAJLyogTXVzaWMwIGFkZHJlc3Mvc3RhdHVzICovCi0jZGVmaW5lIEFEX09QTF9NMERBVEEJMHgwMQkvKiBNdXNpYzAgZGF0YSAqLwotI2RlZmluZSBBRF9PUExfTTFBCTB4MDIJLyogTXVzaWMxIGFkZHJlc3MgKi8KLSNkZWZpbmUgQURfT1BMX00xREFUQQkweDAzCS8qIE11c2ljMSBkYXRhICovCi0vKiAweDA0LTB4MGYgcmVzZXJ2ZWQgKi8KLQotLyogTUlESTsgQkFSMiAqLwotI2RlZmluZSBBRF9NSURBCQkweDAwCS8qIE1JREkgZGF0YSAqLwotI2RlZmluZSBBRF9NSVNDCQkweDAxCS8qIE1JREkgc3RhdHVzL2NtZCAqLwotLyogMHgwMi0weGZmIHJlc2VydmVkICovCi0KLSNkZWZpbmUgQURfRFNfSU9NRU1TSVpFCTUxMgotI2RlZmluZSBBRF9PUExfTUVNU0laRQkxNgotI2RlZmluZSBBRF9NSURJX01FTVNJWkUJMTYKLQotI2RlZmluZSBBRF9XQVZfU1RBVEUJMAotI2RlZmluZSBBRF9BRENfU1RBVEUJMQotI2RlZmluZSBBRF9NQVhfU1RBVEVTCTIKLQotI2RlZmluZSBETUFfU0laRQkoMTI4KjEwMjQpCi0KLSNkZWZpbmUgRE1BX0ZMQUdfTUFQUEVECTEKLQotc3RydWN0IGFkMTg4OV9kZXY7Ci0KLXR5cGVkZWYgc3RydWN0IGFkMTg4OV9zdGF0ZSB7Ci0Jc3RydWN0IGFkMTg4OV9kZXYgKmNhcmQ7Ci0KLQltb2RlX3Qgb3Blbl9tb2RlOwotCXN0cnVjdCBkbWFidWYgewotCQl1bnNpZ25lZCBpbnQgcmF0ZTsKLQkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZTsKLQotCQkvKiBidWYgbWFuYWdlbWVudCAqLwotCQlzaXplX3QgcmF3YnVmX3NpemU7Ci0JCXZvaWQgKnJhd2J1ZjsKLQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwkvKiBtYXBwZWQgYWRkcmVzcyAqLwotCQl1bnNpZ25lZCBsb25nIGRtYV9sZW47CS8qIG51bWJlciBvZiBieXRlcyBtYXBwZWQgKi8KLQotCQkvKiBpbmRleGVzIGludG8gcmF3YnVmIGZvciBzZXR0aW5nIHVwIERNQSBlbmdpbmUgKi8KLQkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyByZF9wdHIsIHdyX3B0cjsKLQotCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OyAvKiB0byB3YWl0IGZvciBidWYgc2VydmljaW5nICovCi0KLQkJLyogT1NTIGJpdHMgKi8KLQkJdW5zaWduZWQgaW50IG1hcHBlZDoxOwotCQl1bnNpZ25lZCBpbnQgcmVhZHk6MTsKLQkJdW5zaWduZWQgaW50IG9zc2ZyYWdzaGlmdDsKLQkJaW50IG9zc21heGZyYWdzOwotCQl1bnNpZ25lZCBpbnQgc3ViZGl2aXNpb247Ci0JfSBkbWFidWY7Ci0KLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci19IGFkMTg4OV9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBhZDE4ODlfZGV2IHsKLQl2b2lkIF9faW9tZW0gKnJlZ2Jhc2U7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaTsKLQkKLQlzcGlubG9ja190IGxvY2s7Ci0KLQlpbnQgZGV2X2F1ZGlvOwotCi0JLyogc3RhdGVzOyBvbmUgcGVyIGNoYW5uZWw7IHJpZ2h0IG5vdyBvbmx5IFdBViBhbmQgQURDICovCi0Jc3RydWN0IGFkMTg4OV9zdGF0ZSBzdGF0ZVtBRF9NQVhfU1RBVEVTXTsKLQotCS8qIEFDOTcgY29kZWMgKi8KLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlYzsKLQl1MTYgYWM5N19mZWF0dXJlczsKLQotCS8qIGRlYnVnZ2luZyBzdHVmZiAqLwotCXN0cnVjdCBzdGF0cyB7Ci0JCXVuc2lnbmVkIGludCB3YXZfaW50cnMsIGFkY19pbnRyczsKLQkJdW5zaWduZWQgaW50IGJsb2NrcywgdW5kZXJydW4sIGVycm9yOwotCX0gc3RhdHM7Ci19IGFkMTg4OV9kZXZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODg5X3JlZyB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgb2Zmc2V0OwotCWludCB3aWR0aDsKLX0gYWQxODg5X3JlZ190OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZGxpYl9jYXJkLmMgYi9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWE3YzliLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hZGxpYl9jYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogc291bmQvb3NzL2FkbGliX2NhcmQuYwotICoKLSAqIERldGVjdGlvbiByb3V0aW5lIGZvciB0aGUgQWRMaWIgY2FyZC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3Ci0gKgotICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQotICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQotICogZm9yIG1vcmUgaW5mby4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJvcGwzLmgiCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfYWRsaWJfY2FyZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JaHdfY29uZmlnLT5zbG90c1swXSA9IG9wbDNfaW5pdChod19jb25maWctPmlvX2Jhc2UsIGh3X2NvbmZpZy0+b3NwLCBUSElTX01PRFVMRSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHByb2JlX2FkbGliKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKLXsKLQlyZXR1cm4gb3BsM19kZXRlY3QoaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPm9zcCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKLQotc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7Ci0KLW1vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9hZGxpYih2b2lkKQotewotCWNmZy5pb19iYXNlID0gaW87Ci0KLQlpZiAoY2ZnLmlvX2Jhc2UgPT0gLTEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhZGxpYjogbXVzdCBzcGVjaWZ5IEkvTyBhZGRyZXNzLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAocHJvYmVfYWRsaWIoJmNmZykgPT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JYXR0YWNoX2FkbGliX2NhcmQoJmNmZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYWRsaWIodm9pZCkKLXsKLQlzb3VuZF91bmxvYWRfc3ludGhkZXYoY2ZnLnNsb3RzWzBdKTsKLQkKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9hZGxpYik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX2FkbGliKTsKLQotI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX2FkbGliKGNoYXIgKnN0cikKLXsKLSAgICAgICAgLyogaW8gKi8KLQlpbnQgaW50c1syXTsKLQlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQotCWlvID0gaW50c1sxXTsKLQotCXJldHVybiAxOwotfQotX19zZXR1cCgiYWRsaWI9Iiwgc2V0dXBfYWRsaWIpOwotI2VuZGlmCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0NjF4LmggYi9zb3VuZC9vc3MvY3M0NjF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTQxMzMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2NzNDYxeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MSArMCwwIEBACi0jaWZuZGVmIF9fQ1M0NjFYX0gKLSNkZWZpbmUgX19DUzQ2MVhfSAotCi0vKgotICogIENvcHlyaWdodCAoYykgYnkgQ2lycnVzIExvZ2ljIENvcnBvcmF0aW9uIDxwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KLSAqICBEZWZpbml0aW9ucyBmb3IgQ2lycnVzIExvZ2ljIENTNDYxeCBjaGlwcwotICoKLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgUENJX1ZFTkRPUl9JRF9DSVJSVVMKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DSVJSVVMgICAgICAgICAgICAweDEwMTMKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAgICAgICAgMHg2MDAxCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEyICAgICAgIDB4NjAwMwotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTUKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNSAgICAgICAweDYwMDQKLSNlbmRpZgotCi0vKgotICogIERpcmVjdCByZWdpc3RlcnMKLSAqLwotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSByZWdpc3RlcnMgYWNjZXNzZWQgdmlhIGJhc2UgYWRkcmVzcwotICogIHJlZ2lzdGVyIHplcm8gb24gdGhlIENTNDYxeCBwYXJ0LgotICovCi0jZGVmaW5lIEJBMF9ISVNSCQkJCTB4MDAwMDAwMDAKLSNkZWZpbmUgQkEwX0hTUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQkEwX0hJQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQkEwX0RNU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQkEwX0hTQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTAKLSNkZWZpbmUgQkEwX0hEQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTQKLSNkZWZpbmUgQkEwX0hETVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTgKLSNkZWZpbmUgQkEwX0hEQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUMKLSNkZWZpbmUgQkEwX1BGTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgQkEwX1BGQ1YxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDQKLSNkZWZpbmUgQkEwX1BGQ1YyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDgKLSNkZWZpbmUgQkEwX1BDSUNGRzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgQkEwX1BDSUNGRzA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDQKLSNkZWZpbmUgQkEwX1BDSUNGRzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDgKLSNkZWZpbmUgQkEwX1BDSUNGRzBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMEMKLSNkZWZpbmUgQkEwX1BDSUNGRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTAKLSNkZWZpbmUgQkEwX1BDSUNGRzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTQKLSNkZWZpbmUgQkEwX1BDSUNGRzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTgKLSNkZWZpbmUgQkEwX1BDSUNGRzFDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMUMKLSNkZWZpbmUgQkEwX1BDSUNGRzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMjAKLSNkZWZpbmUgQkEwX1BDSUNGRzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMjQKLSNkZWZpbmUgQkEwX1BDSUNGRzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMjgKLSNkZWZpbmUgQkEwX1BDSUNGRzJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMkMKLSNkZWZpbmUgQkEwX1BDSUNGRzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMzAKLSNkZWZpbmUgQkEwX1BDSUNGRzM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMzQKLSNkZWZpbmUgQkEwX1BDSUNGRzM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMzgKLSNkZWZpbmUgQkEwX1BDSUNGRzNDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzM0MKLSNkZWZpbmUgQkEwX0NMS0NSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgQkEwX0NMS0NSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDQKLSNkZWZpbmUgQkEwX1BMTE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDgKLSNkZWZpbmUgQkEwX1BMTENDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MEMKLSNkZWZpbmUgQkEwX0ZSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTAgCi0jZGVmaW5lIEJBMF9DRkwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDE0Ci0jZGVmaW5lIEJBMF9DRkwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDE4Ci0jZGVmaW5lIEJBMF9TRVJNQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDIwCi0jZGVmaW5lIEJBMF9TRVJNQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDI0Ci0jZGVmaW5lIEJBMF9TRVJDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDI4Ci0jZGVmaW5lIEJBMF9TRVJDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDJDCi0jZGVmaW5lIEJBMF9TRVJDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDMwCi0jZGVmaW5lIEJBMF9TRVJDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDM0Ci0jZGVmaW5lIEJBMF9TRVJDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDM4Ci0jZGVmaW5lIEJBMF9TRVJCU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDNDCi0jZGVmaW5lIEJBMF9TRVJCU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDQwCi0jZGVmaW5lIEJBMF9TRVJCQ00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDQ0Ci0jZGVmaW5lIEJBMF9TRVJCQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDQ4Ci0jZGVmaW5lIEJBMF9TRVJCQ0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDRDCi0jZGVmaW5lIEJBMF9TRVJCV1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDUwCi0jZGVmaW5lIEJBMF9TRVJCUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDU0Ci0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBCQTBfQVNFUl9GQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ1OAotI2VuZGlmCi0jZGVmaW5lIEJBMF9BQ0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDYwCi0jZGVmaW5lIEJBMF9BQ1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDY0Ci0jZGVmaW5lIEJBMF9BQ09TViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDY4Ci0jZGVmaW5lIEJBMF9BQ0NBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDZDCi0jZGVmaW5lIEJBMF9BQ0NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDcwCi0jZGVmaW5lIEJBMF9BQ0lTViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDc0Ci0jZGVmaW5lIEJBMF9BQ1NBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDc4Ci0jZGVmaW5lIEJBMF9BQ1NEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDdDCi0jZGVmaW5lIEJBMF9KU1BUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDgwCi0jZGVmaW5lIEJBMF9KU0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDg0Ci0jZGVmaW5lIEJBMF9KU0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDg4Ci0jZGVmaW5lIEJBMF9KU0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDhDCi0jZGVmaW5lIEJBMF9NSURDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDkwCi0jZGVmaW5lIEJBMF9NSURTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDk0Ci0jZGVmaW5lIEJBMF9NSURXUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDk4Ci0jZGVmaW5lIEJBMF9NSURSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDlDCi0jZGVmaW5lIEJBMF9KU0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEEwCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBCQTBfQVNFUl9NQVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRBNAotI2VuZGlmCi0jZGVmaW5lIEJBMF9DRkdJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEIwCi0jZGVmaW5lIEJBMF9TU1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEI0Ci0jZGVmaW5lIEJBMF9HUElPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEI4Ci0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBCQTBfRUdQSU9EUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRCQwotI2RlZmluZSBCQTBfRUdQSU9QVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRDMAotI2RlZmluZSBCQTBfRUdQSU9UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRDNAotI2RlZmluZSBCQTBfRUdQSU9XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRDOAotI2RlZmluZSBCQTBfRUdQSU9TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRDQwotI2RlZmluZSBCQTBfU0VSQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDREMAotI2RlZmluZSBCQTBfU0VSQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRENAotI2RlZmluZSBCQTBfU0VSQUNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDREOAotI2RlZmluZSBCQTBfQUNDVEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRFMAotI2RlZmluZSBCQTBfQUNTVFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRFNAotI2RlZmluZSBCQTBfQUNPU1YyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRFOAotI2RlZmluZSBCQTBfQUNDQUQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRFQwotI2RlZmluZSBCQTBfQUNDREEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRGMAotI2RlZmluZSBCQTBfQUNJU1YyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRGNAotI2RlZmluZSBCQTBfQUNTQUQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRGOAotI2RlZmluZSBCQTBfQUNTREEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRGQwotI2RlZmluZSBCQTBfSU9UQUMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMAotI2RlZmluZSBCQTBfSU9UQUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNAotI2RlZmluZSBCQTBfSU9UQUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwOAotI2RlZmluZSBCQTBfSU9UQUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwQwotI2RlZmluZSBCQTBfSU9UQUM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMAotI2RlZmluZSBCQTBfSU9UQUM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUxNAotI2RlZmluZSBCQTBfSU9UQUM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUxOAotI2RlZmluZSBCQTBfSU9UQUM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUxQwotI2RlZmluZSBCQTBfSU9UQUM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyMAotI2RlZmluZSBCQTBfSU9UQUM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyNAotI2RlZmluZSBCQTBfSU9UQUMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyOAotI2RlZmluZSBCQTBfSU9UQUMxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyQwotI2RlZmluZSBCQTBfSU9URlIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU0MAotI2RlZmluZSBCQTBfSU9URlIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU0NAotI2RlZmluZSBCQTBfSU9URlIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU0OAotI2RlZmluZSBCQTBfSU9URlIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU0QwotI2RlZmluZSBCQTBfSU9URlI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU1MAotI2RlZmluZSBCQTBfSU9URlI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU1NAotI2RlZmluZSBCQTBfSU9URlI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU1OAotI2RlZmluZSBCQTBfSU9URlI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU1QwotI2RlZmluZSBCQTBfSU9URklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU4MAotI2RlZmluZSBCQTBfSU9UUlJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU4NAotI2RlZmluZSBCQTBfSU9URlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU4OAotI2RlZmluZSBCQTBfSU9UQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU4QwotI2RlZmluZSBCQTBfRFBDSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU5MAotI2RlZmluZSBCQTBfRFBDSUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU5NAotI2RlZmluZSBCQTBfRFBDSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU5OAotI2RlZmluZSBCQTBfUENQQ0lSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAotI2RlZmluZSBCQTBfUENQQ0lHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwNAotI2RlZmluZSBCQTBfUENQQ0lFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwOAotI2RlZmluZSBCQTBfRVBDSVBNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYxMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIG9mZnNldHMgb2YgdGhlIHJlZ2lzdGVycyBhbmQgbWVtb3JpZXMgYWNjZXNzZWQgdmlhCi0gKiAgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIG9uZSBvbiB0aGUgQ1M0NjF4IHBhcnQuCi0gKi8KLSNkZWZpbmUgQkExX1NQX0RNRU0wICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQkExX1NQX0RNRU0xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgQkExX1NQX1BNRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgQkExX1NQX1JFRwkJCQkweDAwMDMwMDAwCi0jZGVmaW5lIEJBMV9TUENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIEJBMV9EUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDA0Ci0jZGVmaW5lIEJBMV9EU1JXUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDA4Ci0jZGVmaW5lIEJBMV9UV1BSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDBDCi0jZGVmaW5lIEJBMV9TUFdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDEwCi0jZGVmaW5lIEJBMV9TUElSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDE0Ci0jZGVmaW5lIEJBMV9GR1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDIwCi0jZGVmaW5lIEJBMV9TUENTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDI4Ci0jZGVmaW5lIEJBMV9TRFNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDJDCi0jZGVmaW5lIEJBMV9GUk1UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDMwCi0jZGVmaW5lIEJBMV9GUkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDM0Ci0jZGVmaW5lIEJBMV9GUlNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDM4Ci0jZGVmaW5lIEJBMV9PTU5JX01FTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEUwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IGludGVycnVwdCBzdGF0dXMKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBISVNSX1ZDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBISVNSX1ZDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBISVNSX1ZDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBISVNSX1ZDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBISVNSX1ZDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBISVNSX1ZDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBISVNSX1ZDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBISVNSX1ZDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBISVNSX1ZDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBISVNSX1ZDOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBISVNSX1ZDOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBISVNSX1ZDMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBISVNSX1ZDMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBISVNSX1ZDMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBISVNSX1ZDMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBISVNSX1ZDMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBISVNSX1ZDMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBISVNSX0lOVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBISVNSX0lOVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBISVNSX0RNQUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBISVNSX0ZST1ZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBISVNSX01JREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotI2lmZGVmIE5PX0NTNDYxMgotI2RlZmluZSBISVNSX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkUwMDAwMAotI2Vsc2UKLSNkZWZpbmUgSElTUl9TQklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgSElTUl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZDMDAwMDAKLSNlbmRpZgotI2RlZmluZSBISVNSX0gwUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBISVNSX0lOVEVOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBzaWduYWwgcmVnaXN0ZXIgMC4KLSAqLwotI2RlZmluZSBIU1IwX1ZDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIU1IwX1ZDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBIU1IwX1ZDMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBIU1IwX1ZDMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBIU1IwX1ZDMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBIU1IwX1ZDMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBIU1IwX1ZDMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBIU1IwX1ZDMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBIU1IwX1ZDMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBIU1IwX1ZDMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBIU1IwX1ZDMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBIU1IwX1ZDMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBIU1IwX1ZDMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBIU1IwX1ZDMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBIU1IwX1ZDMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBIU1IwX1ZDMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBIU1IwX1ZDMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBIU1IwX1ZDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBIU1IwX1ZDMzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBIU1IwX1ZDMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBIU1IwX1ZDMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBIU1IwX1ZDMzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBIU1IwX1ZDMzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBIU1IwX1ZDMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBIU1IwX1ZDMzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBIU1IwX1ZDNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBpbnRlcnJ1cHQgY29udHJvbAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhJQ1JfSUVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEhJQ1JfQ0hHTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBETUEgc3RhdHVzIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIERNU1JfSFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIERNU1JfSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIERNU1JfU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIERNU1JfU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IERNQSBzb3VyY2UgYWRkcmVzcwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhTQVJfSE9TVF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhTQVJfRFNQX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEhTQVJfTUVNSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIEhTQVJfTUVNSURfU1BfRE1FTTAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhTQVJfTUVNSURfU1BfRE1FTTEgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEhTQVJfTUVNSURfU1BfUE1FTSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEhTQVJfTUVNSURfU1BfREVCVUcgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIEhTQVJfTUVNSURfT01OSV9NRU0gICAgICAgICAgICAgICAgICAgICAweDAwMEUwMDAwCi0jZGVmaW5lIEhTQVJfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEhTQVJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IERNQSBkZXN0aW5hdGlvbiBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSERBUl9IT1NUX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgSERBUl9EU1BfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSERBUl9NRU1JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgSERBUl9NRU1JRF9TUF9ETUVNMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSERBUl9NRU1JRF9TUF9ETUVNMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgSERBUl9NRU1JRF9TUF9QTUVNICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSERBUl9NRU1JRF9TUF9ERUJVRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgSERBUl9NRU1JRF9PTU5JX01FTSAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKLSNkZWZpbmUgSERBUl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSERBUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSERNUl9BQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEYwMDAKLSNkZWZpbmUgSERNUl9BQ184XzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgSERNUl9BQ19NX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgSERNUl9BQ19CX0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgSERNUl9BQ19TX1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSERDUl9DT1VOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRkYKLSNkZWZpbmUgSERDUl9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgSERDUl9PUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgSERDUl9XQkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgSERDUl9XQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfMTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfMzJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfNjRfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfMTI4X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfMjU2X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgIDB4MDUwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfNTEyX0RXT1JEUyAgICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDAKLSNkZWZpbmUgSERDUl9ETVNfMTAyNF9EV09SRFMgICAgICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKLSNkZWZpbmUgSERDUl9ESCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfMTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfMzJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfNjRfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfMTI4X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfMjU2X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgIDB4NTAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfNTEyX0RXT1JEUyAgICAgICAgICAgICAgICAgICAgIDB4NjAwMDAwMDAKLSNkZWZpbmUgSERDUl9TTVNfMTAyNF9EV09SRFMgICAgICAgICAgICAgICAgICAgIDB4NzAwMDAwMDAKLSNkZWZpbmUgSERDUl9TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSERDUl9DT1VOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgY29udHJvbAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFBGTUNfQzFTU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFGCi0jZGVmaW5lIFBGTUNfQzFFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFBGTUNfQzFSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIFBGTUNfQzJTU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUYwMDAwCi0jZGVmaW5lIFBGTUNfQzJFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIFBGTUNfQzJSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIFBGTUNfQzFTU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBGTUNfQzJTU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBQRk1DX0JVU19HUkFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQRk1DX0dSQU5UX0FGVEVSX1JFUSAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBQRk1DX1RSQU5TQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBQRk1DX0RXT1JEX1RSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBQRk1DX1NMQVZFX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBQRk1DX1NMQVZFX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBQRk1DX1BSRUVNUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBQRk1DX0RJU0NPTk5FQ1RfUkVUUlkgICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBQRk1DX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBQRk1DX0JVU19PV05FUlNISVAgICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBQRk1DX1RSQU5TQUNUSU9OX0xBRyAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgUEZNQ19QQ0lfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIFBGTUNfU0VSSUFMX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBQRk1DX1NQX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgdmFsdWUgMQotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFBGQ1YxX1BDMVZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIFBGQ1YxX1BDMVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyIHZhbHVlIDIKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQRkNWMl9QQzJWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBQRkNWMl9QQzJWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY2xvY2sgY29udHJvbCByZWdpc3RlciAxLgotICovCi0jZGVmaW5lIENMS0NSMV9PU0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIENMS0NSMV9PU0NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIENMS0NSMV9QTExTU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDCi0jZGVmaW5lIENMS0NSMV9QTExTU19TRVJJQUwgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIENMS0NSMV9QTExTU19DUllTVEFMICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIENMS0NSMV9QTExTU19QQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIENMS0NSMV9QTExTU19SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDCi0jZGVmaW5lIENMS0NSMV9QTExQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIENMS0NSMV9TV0NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIENMS0NSMV9QTExPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyIDIuCi0gKi8KLSNkZWZpbmUgQ0xLQ1IyX1BESVZTX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgQ0xLQ1IyX1BESVZTXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQ0xLQ1IyX1BESVZTXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQ0xLQ1IyX1BESVZTXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQ0xLQ1IyX1BESVZTXzcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKLSNkZWZpbmUgQ0xLQ1IyX1BESVZTXzggICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQ0xLQ1IyX1BESVZTXzE2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBMTCBtdWx0aXBsaWVyIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFBMTE1fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIFBMTE1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQTEwgY2FwYWNpdG9yIGNvZWZmaWNpZW50Ci0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgUExMQ0NfQ0RSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKLSNpZm5kZWYgTk9fQ1M0NjEwCi0jZGVmaW5lIFBMTENDX0NEUl8yNDBfMzUwX01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBMTENDX0NEUl8xODRfMjY1X01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFBMTENDX0NEUl8xNDRfMjA1X01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFBMTENDX0NEUl8xMTFfMTYwX01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIFBMTENDX0NEUl84N18xMjNfTUhaICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFBMTENDX0NEUl82N185Nl9NSFogICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1Ci0jZGVmaW5lIFBMTENDX0NEUl81Ml83NF9NSFogICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIFBMTENDX0NEUl80NV81OF9NSFogICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZW5kaWYKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFBMTENDX0NEUl8yNzFfMzk4X01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBMTENDX0NEUl8yMjdfMzMwX01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFBMTENDX0NEUl8xNjdfMjM5X01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFBMTENDX0NEUl8xNTBfMjE1X01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIFBMTENDX0NEUl8xMDdfMTU0X01IWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFBMTENDX0NEUl85OF8xNDBfTUhaICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1Ci0jZGVmaW5lIFBMTENDX0NEUl83M18xMDRfTUhaICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIFBMTENDX0NEUl82M185MF9NSFogICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZW5kaWYKLSNkZWZpbmUgUExMQ0NfTFBGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjgKLSNpZm5kZWYgTk9fQ1M0NjEwCi0jZGVmaW5lIFBMTENDX0xQRl8yMzg1MF82MDAwMF9LSFogICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBMTENDX0xQRl83OTYwXzI2MjkwX0tIWiAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFBMTENDX0xQRl80MTYwXzEwOTgwX0tIWiAgICAgICAgICAgICAgICAweDAwMDAwMDE4Ci0jZGVmaW5lIFBMTENDX0xQRl8xNzQwXzQ1ODBfS0haICAgICAgICAgICAgICAgICAweDAwMDAwMDM4Ci0jZGVmaW5lIFBMTENDX0xQRl83MjRfMTkxMF9LSFogICAgICAgICAgICAgICAgICAweDAwMDAwMDc4Ci0jZGVmaW5lIFBMTENDX0xQRl8zMTdfNzk4X0tIWiAgICAgICAgICAgICAgICAgICAweDAwMDAwMEY4Ci0jZW5kaWYKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFBMTENDX0xQRl8yNTU4MF82NDUzMF9LSFogICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBMTENDX0xQRl8xNDM2MF8zNzI3MF9LSFogICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFBMTENDX0xQRl82MTAwXzE2MDIwX0tIWiAgICAgICAgICAgICAgICAweDAwMDAwMDE4Ci0jZGVmaW5lIFBMTENDX0xQRl8yNTQwXzY2OTBfS0haICAgICAgICAgICAgICAgICAweDAwMDAwMDM4Ci0jZGVmaW5lIFBMTENDX0xQRl8xMDUwXzI3ODBfS0haICAgICAgICAgICAgICAgICAweDAwMDAwMDc4Ci0jZGVmaW5lIFBMTENDX0xQRl80NTBfMTE2MF9LSFogICAgICAgICAgICAgICAgICAweDAwMDAwMEY4Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZlYXR1cmUgcmVwb3J0aW5nIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEZSUl9GQUJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEZSUl9NQVNLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFDCi0jaWZkZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEZSUl9DRk9QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEUwCi0jZWxzZQotI2RlZmluZSBGUlJfQ0ZPUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMEZFMAotI2VuZGlmCi0jZGVmaW5lIEZSUl9DRk9QX05PVF9EVkQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEZSUl9DRk9QX0EzRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEZSUl9DRk9QXzEyOF9QSU4gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBGUlJfQ0ZPUF9DUzQyODAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2VuZGlmCi0jZGVmaW5lIEZSUl9GQUJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEZSUl9NQVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEZSUl9DRk9QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBjb25maWd1cmF0aW9uIGxvYWQgMQotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIENGTDFfQ0xPQ0tfU09VUkNFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIENGTDFfQ0xPQ0tfU09VUkNFX0NTNDIzWCAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIENGTDFfQ0xPQ0tfU09VUkNFX0FDOTcgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIENGTDFfQ0xPQ0tfU09VUkNFX0NSWVNUQUwgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIENGTDFfQ0xPQ0tfU09VUkNFX0RVQUxfQUM5NyAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIENGTDFfVkFMSURfREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBjb25maWd1cmF0aW9uIGxvYWQgMgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIENGTDJfVkFMSURfREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBtYXN0ZXIgY29udHJvbAotICogIHJlZ2lzdGVyIDEuCi0gKi8KLSNkZWZpbmUgU0VSTUMxX01TUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSTUMxX1BUQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEUKLSNkZWZpbmUgU0VSTUMxX1BUQ19DUzQyM1ggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSTUMxX1BUQ19BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU0VSTUMxX1BUQ19EQUMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU0VSTUMxX1BMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgU0VSTUMxX1hMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IG1hc3RlciBjb250cm9sCi0gKiAgcmVnaXN0ZXIgMi4KLSAqLwotI2RlZmluZSBTRVJNQzJfTFJPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJNQzJfTUNPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJNQzJfTUNESVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgMSBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQzFfU08xRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQzFfU08xRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEUKLSNkZWZpbmUgU0VSQzFfU08xRl9DUzQyM1ggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSQzFfU08xRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU0VSQzFfU08xRl9EQUMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU0VSQzFfU08xRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDIgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkMyX1NJMUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkMyX1NJMUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFCi0jZGVmaW5lIFNFUkMyX1NJMUZfQ1M0MjNYICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkMyX1NJMUZfQUM5NyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUkMyX1NJMUZfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUkMyX1NJMUZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAzIGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJDM19TTzJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDM19TTzJGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBTRVJDM19TTzJGX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJDM19TTzJGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNCBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQzRfU08zRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQzRfU08zRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgU0VSQzRfU08zRl9EQUMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSQzRfU08zRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDUgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkM1X1NJMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkM1X1NJMkZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIFNFUkM1X1NJMkZfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkM1X1NJMkZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciBzYW1wbGUKLSAqICBwb2ludGVyIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkJTUF9GU1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIFNFUkJTUF9GU1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciBzdGF0dXMKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCU1RfUlJEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJCU1RfV0JTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IgY29tbWFuZAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkJDTV9SREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkJDTV9XUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgU0VSQkFEX0ZBRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLSNlbHNlCi0jZGVmaW5lIFNFUkJBRF9GQURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMUZGCi0jZW5kaWYKLSNkZWZpbmUgU0VSQkFEX0ZBRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yCi0gKiAgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCQ0ZfSEJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3Igd3JpdGUKLSAqICBwb3J0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkJXUF9GV0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEZGRkZGCi0jZGVmaW5lIFNFUkJXUF9GV0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciByZWFkCi0gKiAgcG9ydCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCUlBfRlJEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGRkZGRgotI2RlZmluZSBTRVJCUlBfRlJEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgYXN5bmMgRklGTyBhZGRyZXNzIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBU0VSX0ZBRERSX0ExX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFGRgotI2RlZmluZSBBU0VSX0ZBRERSX0VOMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBBU0VSX0ZBRERSX0EyX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMUZGMDAwMAotI2RlZmluZSBBU0VSX0ZBRERSX0VOMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBBU0VSX0ZBRERSX0ExX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBU0VSX0ZBRERSX0EyX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDQ1RMX1JTVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDQ1RMX0VTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDQ1RMX1ZGUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDQ1RMX0RDViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDQ1RMX0NSVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDQ1RMX0FTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ0NUTF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ1NUU19DUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ1NUU19WU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNTVFNfV0tVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBvdXRwdXQgc2xvdCB2YWxpZAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDT1NWX1NMVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDT1NWX1NMVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDT1NWX1NMVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDT1NWX1NMVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDT1NWX1NMVjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDT1NWX1NMVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFDT1NWX1NMVjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDT1NWX1NMVjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDT1NWX1NMVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFDT1NWX1NMVjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgYWRkcmVzcwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDQ0FEX0NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCi0jZGVmaW5lIEFDQ0FEX0NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgZGF0YSByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ0NEQV9DRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBBQ0NEQV9DRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBpbnB1dCBzbG90IHZhbGlkCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNJU1ZfSVNWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNJU1ZfSVNWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQUNJU1ZfSVNWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNJU1ZfSVNWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNJU1ZfSVNWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQUNJU1ZfSVNWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQUNJU1ZfSVNWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgQUNJU1ZfSVNWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgQUNJU1ZfSVNWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQUNJU1ZfSVNWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGFkZHJlc3MKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ1NBRF9TSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBBQ1NBRF9TSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgZGF0YSByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ1NEQV9TRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBBQ1NEQV9TRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgcG9sbC90cmlnZ2VyCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSlNQVF9DQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSlNQVF9DQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSlNQVF9DQlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSlNQVF9DQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSlNQVF9CQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSlNQVF9CQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSlNQVF9CQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSlNQVF9CQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSlNDVExfU1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgSlNDVExfU1BfU0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSlNDVExfU1BfTUVESVVNX1NMT1cgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSlNDVExfU1BfTUVESVVNX0ZBU1QgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSlNDVExfU1BfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgSlNDVExfQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIGNvb3JkaW5hdGUgcGFpciAxCi0gKiAgcmVhZGJhY2sgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSlNDMV9ZMVZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSlNDMV9YMVZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgSlNDMV9ZMVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSlNDMV9YMVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBjb29yZGluYXRlIHBhaXIgMgotICogIHJlYWRiYWNrIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTQzJfWTJWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEpTQzJfWDJWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCi0jZGVmaW5lIEpTQzJfWTJWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEpTQzJfWDJWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIE1JRENSX1RYRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCS8qIEVuYWJsZSB0cmFuc21pdHRpbmcuICovCi0jZGVmaW5lIE1JRENSX1JYRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIEVuYWJsZSByZWNlaXZpbmcuICovCi0jZGVmaW5lIE1JRENSX1JJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CS8qIEludGVycnVwdCB1cG9uIHR4IHJlYWR5LiAqLwotI2RlZmluZSBNSURDUl9USUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAkvKiBJbnRlcnJ1cHQgdXBvbiByeCByZWFkeS4gKi8KLSNkZWZpbmUgTUlEQ1JfTUxCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAJLyogRW5hYmxlIG1pZGkgbG9vcGJhY2suICovCi0jZGVmaW5lIE1JRENSX01SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCS8qIFJlc2V0IGludGVyZmFjZS4gKi8KLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgc3RhdHVzIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIE1JRFNSX1RCRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCS8qIFR4IEZJRk8gaXMgZnVsbC4gKi8KLSNkZWZpbmUgTUlEU1JfUkJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIJLyogUnggRklGTyBpcyBlbXB0eS4gKi8KLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgd3JpdGUgcG9ydCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBNSURXUF9NV0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotI2RlZmluZSBNSURXUF9NV0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSByZWFkIHBvcnQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgTUlEUlBfTVJEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgTUlEUlBfTVJEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIEdQSU8gcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSlNJT19EQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSlNJT19EQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSlNJT19EQlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSlNJT19EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSlNJT19BWE9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSlNJT19BWU9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSlNJT19CWE9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSlNJT19CWU9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIG1hc3RlciBhc3luYy9zeW5jIHNlcmlhbAotICogIHBvcnQgZW5hYmxlIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBU0VSX01BU1RFUl9NRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBjb25maWd1cmF0aW9uIGludGVyZmFjZQotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIENGR0lfQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIENGR0lfRE9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIENGR0lfRElOX0VFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIENGR0lfRUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzdWJzeXN0ZW0gSUQgYW5kIHZlbmRvciBJRAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNTVklEX1ZJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIFNTVklEX1NJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCi0jZGVmaW5lIFNTVklEX1ZJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNTVklEX1NJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgR1BJTyBwaW4gaW50ZXJmYWNlIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEdQSU9SX1ZPTEROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEdQSU9SX1ZPTFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEdQSU9SX1NJMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEdQSU9SX1NJMk9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBkaXJlY3Rpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRUdQSU9EUl9HUE9FMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRUdQSU9EUl9HUE9FMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRUdQSU9EUl9HUE9FMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUdQSU9EUl9HUE9FMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRUdQSU9EUl9HUE9FNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUdQSU9EUl9HUE9FNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUdQSU9EUl9HUE9FNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRUdQSU9EUl9HUE9FNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgRUdQSU9EUl9HUE9FOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW4gcG9sYXJpdHkvCi0gKiAgdHlwZSByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgRUdQSU9QVFJfR1BQVDggICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW4gc3RpY2t5Ci0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPVFJfR1BTMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPVFJfR1BTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPVFJfR1BTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPVFJfR1BTMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPVFJfR1BTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPVFJfR1BTNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPVFJfR1BTNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPVFJfR1BTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPVFJfR1BTOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluZyB3YWtldXAKLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRUdQSU9XUl9HUFcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRUdQSU9XUl9HUFcxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRUdQSU9XUl9HUFcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUdQSU9XUl9HUFczICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRUdQSU9XUl9HUFc0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUdQSU9XUl9HUFc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUdQSU9XUl9HUFc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRUdQSU9XUl9HUFc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgRUdQSU9XUl9HUFc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW4gc3RhdHVzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPU1JfR1BTMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPU1JfR1BTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPU1JfR1BTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPU1JfR1BTMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPU1JfR1BTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPU1JfR1BTNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPU1JfR1BTNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPU1JfR1BTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPU1JfR1BTOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDYgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBTRVJDNl9BU0RPMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA3IGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgU0VSQzdfQVNESTJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQzdfUE9TSUxCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU0VSQzdfU0lQT0xCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU0VSQzdfU09TSUxCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgU0VSQzdfU0lTT0xCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgQUMgbGluawotICogIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFNFUkFDQ19DT0RFQ19UWVBFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkFDQ19DT0RFQ19UWVBFXzFfMDMgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkFDQ19DT0RFQ19UWVBFXzJfMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkFDQ19UV09fQ09ERUNTICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUkFDQ19NRE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUkFDQ19IU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29udHJvbCByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ0NUTDJfUlNUTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ0NUTDJfRVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ0NUTDJfVkZSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ0NUTDJfRENWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ0NUTDJfQ1JXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ0NUTDJfQVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ1NUUzJfQ1JEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ1NUUzJfVlNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IG91dHB1dCBzbG90IHZhbGlkCi0gKiAgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNPU1YyX1NMVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNPU1YyX1NMVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQUNPU1YyX1NMVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNPU1YyX1NMVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNPU1YyX1NMVjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQUNPU1YyX1NMVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQUNPU1YyX1NMVjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgQUNPU1YyX1NMVjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgQUNPU1YyX1NMVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQUNPU1YyX1NMVjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb21tYW5kIGFkZHJlc3MKLSAqICByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ0NBRDJfQ0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBBQ0NBRDJfQ0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgZGF0YSByZWdpc3RlcgotICogIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDQ0RBMl9DRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEFDQ0RBMl9DRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBpbnB1dCBzbG90IHZhbGlkCi0gKiAgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNJU1YyX0lTVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNJU1YyX0lTVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQUNJU1YyX0lTVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNJU1YyX0lTVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNJU1YyX0lTVjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQUNJU1YyX0lTVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQUNJU1YyX0lTVjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgQUNJU1YyX0lTVjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgQUNJU1YyX0lTVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQUNJU1YyX0lTVjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgYWRkcmVzcwotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDU0FEMl9TSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCi0jZGVmaW5lIEFDU0FEMl9TSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGRhdGEgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNTREEyX1NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgQUNTREEyX1NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgYWRkcmVzcyBhbmQgY29udHJvbAotICogIHJlZ2lzdGVycyAoYWxsIDEyKS4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9UQUNfU0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSU9UQUNfTVNLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgSU9UQUNfSU9EQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDAKLSNkZWZpbmUgSU9UQUNfSU9EQ18xNl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSU9UQUNfSU9EQ18xMF9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgSU9UQUNfSU9EQ18xMl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgSU9UQUNfV1NQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgSU9UQUNfUlNQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgSU9UQUNfV1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSU9UQUNfV0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSU9UQUNfUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSU9UQUNfU0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSU9UQUNfTVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGZhc3QgcmVhZCByZWdpc3RlcnMKLSAqICAoYWxsIDgpLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RGUl9EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBJT1RGUl9BX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAotI2RlZmluZSBJT1RGUl9SX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRjAwMDAwMAotI2RlZmluZSBJT1RGUl9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJT1RGUl9WTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBJT1RGUl9EX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJT1RGUl9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSU9URlJfUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIEZJRk8gcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVEZJRk9fQkFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzRkZGCi0jZGVmaW5lIElPVEZJRk9fU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwRkYwMDAwCi0jZGVmaW5lIElPVEZJRk9fT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIElPVEZJRk9fU1BJT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIElPVEZJRk9fQkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElPVEZJRk9fU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCByZXRyeSByZWFkIGRhdGEKLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9UUlJEX0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSU9UUlJEX1JEViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSU9UUlJEX0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgRklGTyBwb2ludGVyCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVEZQX0NBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzRkZGCi0jZGVmaW5lIElPVEZQX1BBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRkYwMDAwCi0jZGVmaW5lIElPVEZQX0NBX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElPVEZQX1BBX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RDUl9JVEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBJT1RDUl9IUlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBJT1RDUl9TUlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBJT1RDUl9EVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBJT1RDUl9ERkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBJT1RDUl9ERFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBJT1RDUl9KVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBJT1RDUl9QUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkaXJlY3QgUENJIGRhdGEgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIERQQ0lEX0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIERQQ0lEX0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGRpcmVjdCBQQ0kgYWRkcmVzcyByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRFBDSUFfQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgRFBDSUFfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGlyZWN0IFBDSSBjb21tYW5kIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBEUENJQ19DX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBEUENJQ19DX0lPUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBEUENJQ19DX0lPV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBEUENJQ19CRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgcmVxdWVzdCByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgUENQQ0lSX1JEQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKLSNkZWZpbmUgUENQQ0lSX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDcwMDAKLSNkZWZpbmUgUENQQ0lSX1JFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgUENQQ0lSX1JEQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUENQQ0lSX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDL1BDSSBncmFudCByZWdpc3Rlci4KLSAqLyAKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFBDUENJR19HRENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIFBDUENJR19WTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIFBDUENJR19HRENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDL1BDSSBtYXN0ZXIgZW5hYmxlCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFBDUENJRU5fRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIFBDSSBwb3dlcgotICogIG1hbmFnZW1lbnQgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRVBDSVBNQ19HV1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRVBDSVBNQ19GU1BDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNlbmRpZiAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNQIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU1BDUl9SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU1BDUl9TVFBGUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU1BDUl9SVU5GUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU1BDUl9USUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgU1BDUl9EUlFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgU1BDUl9SU1RTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgU1BDUl9PUkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFNQQ1JfUENJSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFNQQ1JfT0lOVEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFNQQ1JfQ1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGRlYnVnIGluZGV4IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIERSRUdfUkVHSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCi0jZGVmaW5lIERSRUdfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIERSRUdfUkdCS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzAwCi0jZGVmaW5lIERSRUdfVFJBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jaWYgIWRlZmluZWQoTk9fQ1M0NjEyKQotI2lmICFkZWZpbmVkKE5PX0NTNDYxNSkKLSNkZWZpbmUgRFJFR19UUkFQWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNlbmRpZgotI2VuZGlmCi0jZGVmaW5lIERSRUdfUkVHSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIERSRUdfUkdCS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIERSRUdfUkdCS19SRUdJRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzdGCi0jZGVmaW5lIERSRUdfUkVHSURfUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIERSRUdfUkVHSURfUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDExCi0jZGVmaW5lIERSRUdfUkVHSURfUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyCi0jZGVmaW5lIERSRUdfUkVHSURfUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEzCi0jZGVmaW5lIERSRUdfUkVHSURfUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0Ci0jZGVmaW5lIERSRUdfUkVHSURfUjUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE1Ci0jZGVmaW5lIERSRUdfUkVHSURfUjYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE2Ci0jZGVmaW5lIERSRUdfUkVHSURfUjcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3Ci0jZGVmaW5lIERSRUdfUkVHSURfUjggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4Ci0jZGVmaW5lIERSRUdfUkVHSURfUjkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE5Ci0jZGVmaW5lIERSRUdfUkVHSURfUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFBCi0jZGVmaW5lIERSRUdfUkVHSURfUkIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFCCi0jZGVmaW5lIERSRUdfUkVHSURfUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFDCi0jZGVmaW5lIERSRUdfUkVHSURfUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFECi0jZGVmaW5lIERSRUdfUkVHSURfUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFFCi0jZGVmaW5lIERSRUdfUkVHSURfUkYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFGCi0jZGVmaW5lIERSRUdfUkVHSURfUkFfQlVTX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIERSRUdfUkVHSURfUkFfQlVTX0hJR0ggICAgICAgICAgICAgICAgICAweDAwMDAwMDM4Ci0jZGVmaW5lIERSRUdfUkVHSURfWUJVU19MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDUwCi0jZGVmaW5lIERSRUdfUkVHSURfWUJVU19ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDU4Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8wICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAxCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAyCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8zICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAzCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF80ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTA0Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF81ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTA1Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF82ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTA2Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF83ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTA3Ci0jZGVmaW5lIERSRUdfUkVHSURfSU5ESVJFQ1RfQUREUkVTUyAgICAgICAgICAgICAweDAwMDAwMTBFCi0jZGVmaW5lIERSRUdfUkVHSURfVE9QX09GX1NUQUNLICAgICAgICAgICAgICAgICAweDAwMDAwMTBGCi0jaWYgIWRlZmluZWQoTk9fQ1M0NjEyKQotI2lmICFkZWZpbmVkKE5PX0NTNDYxNSkKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTAKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzkgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTEKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEwICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTIKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzExICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTMKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTQKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEzICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTUKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE0ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTYKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE1ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTcKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE2ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTgKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE3ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTkKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUEKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE5ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUIKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIwICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUMKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIxICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUQKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUUKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIzICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUYKLSNlbmRpZgotI2VuZGlmCi0jZGVmaW5lIERSRUdfUkVHSURfUlNBMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIERSRUdfUkVHSURfUlNBMF9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAxCi0jZGVmaW5lIERSRUdfUkVHSURfUlNBMV9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAyCi0jZGVmaW5lIERSRUdfUkVHSURfUlNBMV9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAzCi0jZGVmaW5lIERSRUdfUkVHSURfUlNBMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA0Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNBMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA1Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNJMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA2Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNJMF9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA3Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNJMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA4Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNJMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA5Ci0jZGVmaW5lIERSRUdfUkVHSURfU0FHVVNUQVRVUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjBBCi0jZGVmaW5lIERSRUdfUkVHSURfUlNDT05GSUcwMV9MT1cgICAgICAgICAgICAgICAweDAwMDAwMjBCCi0jZGVmaW5lIERSRUdfUkVHSURfUlNDT05GSUcwMV9ISUdIICAgICAgICAgICAgICAweDAwMDAwMjBDCi0jZGVmaW5lIERSRUdfUkVHSURfUlNDT05GSUcyM19MT1cgICAgICAgICAgICAgICAweDAwMDAwMjBECi0jZGVmaW5lIERSRUdfUkVHSURfUlNDT05GSUcyM19ISUdIICAgICAgICAgICAgICAweDAwMDAwMjBFCi0jZGVmaW5lIERSRUdfUkVHSURfUlNETUEwMUUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjBGCi0jZGVmaW5lIERSRUdfUkVHSURfUlNETUEyM0UgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjEwCi0jZGVmaW5lIERSRUdfUkVHSURfUlNEMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjExCi0jZGVmaW5lIERSRUdfUkVHSURfUlNEMF9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjEyCi0jZGVmaW5lIERSRUdfUkVHSURfUlNEMV9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjEzCi0jZGVmaW5lIERSRUdfUkVHSURfUlNEMV9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE0Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNEMl9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE1Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNEMl9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE2Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNEM19MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE3Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNEM19ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE4Ci0jZGVmaW5lIERSRUdfUkVHSURfU1JBUl9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjFBCi0jZGVmaW5lIERSRUdfUkVHSURfU1JBUl9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjFCCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjFDCi0jZGVmaW5lIERSRUdfUkVHSURfQ1VSUkVOVF9ETUFfU1RSRUFNICAgICAgICAgICAweDAwMDAwMjFECi0jZGVmaW5lIERSRUdfUkVHSURfTkVYVF9ETUFfU1RSRUFNICAgICAgICAgICAgICAweDAwMDAwMjFFCi0jZGVmaW5lIERSRUdfUkVHSURfQ1BVX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDX01PREUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAxCi0jZGVmaW5lIERSRUdfUkVHSURfU1RBQ0tfQU5EX1JFUEVBVCAgICAgICAgICAgICAweDAwMDAwMzAyCi0jZGVmaW5lIERSRUdfUkVHSURfSU5ERVgwICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA0Ci0jZGVmaW5lIERSRUdfUkVHSURfSU5ERVgxICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA1Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzBfMyAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzRfNyAgICAgICAgICAgICAgICAweDAwMDAwNDA0Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzhfMTEgICAgICAgICAgICAgICAweDAwMDAwNDA4Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzEyXzE1ICAgICAgICAgICAgICAweDAwMDAwNDBDCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzE2XzE5ICAgICAgICAgICAgICAweDAwMDAwNDEwCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzIwXzIzICAgICAgICAgICAgICAweDAwMDAwNDE0Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzI0XzI3ICAgICAgICAgICAgICAweDAwMDAwNDE4Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzI4XzMxICAgICAgICAgICAgICAweDAwMDAwNDFDCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzMyXzM1ICAgICAgICAgICAgICAweDAwMDAwNDIwCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzM2XzM5ICAgICAgICAgICAgICAweDAwMDAwNDI0Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzQwXzQzICAgICAgICAgICAgICAweDAwMDAwNDI4Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzQ0XzQ3ICAgICAgICAgICAgICAweDAwMDAwNDJDCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzQ4XzUxICAgICAgICAgICAgICAweDAwMDAwNDMwCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzUyXzU1ICAgICAgICAgICAgICAweDAwMDAwNDM0Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzU2XzU5ICAgICAgICAgICAgICAweDAwMDAwNDM4Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzYwXzYzICAgICAgICAgICAgICAweDAwMDAwNDNDCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzY0XzY3ICAgICAgICAgICAgICAweDAwMDAwNDQwCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzY4XzcxICAgICAgICAgICAgICAweDAwMDAwNDQ0Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzcyXzc1ICAgICAgICAgICAgICAweDAwMDAwNDQ4Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzc2Xzc5ICAgICAgICAgICAgICAweDAwMDAwNDRDCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzgwXzgzICAgICAgICAgICAgICAweDAwMDAwNDUwCi0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzg0Xzg3ICAgICAgICAgICAgICAweDAwMDAwNDU0Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzg4XzkxICAgICAgICAgICAgICAweDAwMDAwNDU4Ci0jZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzkyXzk1ICAgICAgICAgICAgICAweDAwMDAwNDVDCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9TRUxFQ1QgICAgICAgICAgICAgICAgICAweDAwMDAwNTAwCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8wICAgICAgICAgICAgICAgICAweDAwMDAwNTAwCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xICAgICAgICAgICAgICAgICAweDAwMDAwNTAxCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yICAgICAgICAgICAgICAgICAweDAwMDAwNTAyCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8zICAgICAgICAgICAgICAgICAweDAwMDAwNTAzCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV80ICAgICAgICAgICAgICAgICAweDAwMDAwNTA0Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV81ICAgICAgICAgICAgICAgICAweDAwMDAwNTA1Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV82ICAgICAgICAgICAgICAgICAweDAwMDAwNTA2Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV83ICAgICAgICAgICAgICAgICAweDAwMDAwNTA3Ci0jaWYgIWRlZmluZWQoTk9fQ1M0NjEyKQotI2lmICFkZWZpbmVkKE5PX0NTNDYxNSkKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzggICAgICAgICAgICAgICAgIDB4MDAwMDA1MTAKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzkgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTEKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEwICAgICAgICAgICAgICAgIDB4MDAwMDA1MTIKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzExICAgICAgICAgICAgICAgIDB4MDAwMDA1MTMKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEyICAgICAgICAgICAgICAgIDB4MDAwMDA1MTQKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEzICAgICAgICAgICAgICAgIDB4MDAwMDA1MTUKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE0ICAgICAgICAgICAgICAgIDB4MDAwMDA1MTYKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE1ICAgICAgICAgICAgICAgIDB4MDAwMDA1MTcKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE2ICAgICAgICAgICAgICAgIDB4MDAwMDA1MTgKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE3ICAgICAgICAgICAgICAgIDB4MDAwMDA1MTkKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE4ICAgICAgICAgICAgICAgIDB4MDAwMDA1MUEKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE5ICAgICAgICAgICAgICAgIDB4MDAwMDA1MUIKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIwICAgICAgICAgICAgICAgIDB4MDAwMDA1MUMKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIxICAgICAgICAgICAgICAgIDB4MDAwMDA1MUQKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIyICAgICAgICAgICAgICAgIDB4MDAwMDA1MUUKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIzICAgICAgICAgICAgICAgIDB4MDAwMDA1MUYKLSNlbmRpZgotI2VuZGlmCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MwX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAwCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MxX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAxCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MyX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAyCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MzX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAzCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MwX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjA0Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MxX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjA1Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MyX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjA2Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MzX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjA3Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MwX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjA4Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MxX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjA5Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MyX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBBCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MzX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBCCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MwX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBDCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MxX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBECi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MyX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBFCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MzX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBGCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MwX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjEwCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MxX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjExCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MyX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjEyCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MzX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjEzCi0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MwX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjE0Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MxX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjE1Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MyX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjE2Ci0jZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MzX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjE3Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNIT1VUX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwNjIwCi0jZGVmaW5lIERSRUdfUkVHSURfUlNIT1VUX01JRCAgICAgICAgICAgICAgICAgICAweDAwMDAwNjI4Ci0jZGVmaW5lIERSRUdfUkVHSURfUlNIT1VUX0hJR0ggICAgICAgICAgICAgICAgICAweDAwMDAwNjMwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBETUEgc3RyZWFtIHJlcXVlc3RvciB3cml0ZQotICovCi0jZGVmaW5lIERTUldQX0RTUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIERTUldQX0RTUl9CR19SUSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIERTUldQX0RTUl9QUklPUklUWV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIERTUldQX0RTUl9QUklPUklUWV8wICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERTUldQX0RTUl9QUklPUklUWV8xICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIERTUldQX0RTUl9QUklPUklUWV8yICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIERTUldQX0RTUl9QUklPUklUWV8zICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIERTUldQX0RTUl9SUV9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSB0cmFwIHdyaXRlIHBvcnQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgVFdQUl9UV19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgVFdQUl9UV19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHN0YWNrIHBvaW50ZXIgd3JpdGUKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTUFdSX1NUS1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBTUFdSX1NUS1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgaW50ZXJydXB0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNQSVJfRlJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNQSVJfRE9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNQSVJfR1BJMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNQSVJfR1BJMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNQSVJfSVAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFNQSVJfSVAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFNQSVJfSVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFNQSVJfSVAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmdW5jdGlvbmFsIGdyb3VwIDEgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRkdSMV9GMVNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgRkdSMV9GMVNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNQIGNsb2NrIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTUENTX0ZSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTUENTX0RPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTUENTX0dQSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTUENTX0dQSTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBTUENTX0lQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBTUENTX0lQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBTUENTX0lQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBTUENTX0lQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBTUENTX1NQUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBTUENTX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBTUENTX0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBTUENTX09SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBTUENTX0lSUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBTUENTX0ZHTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRTAwMAotI2RlZmluZSBTUENTX0ZHTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNQIERNQSByZXF1ZXN0b3Igc3RhdHVzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0RTUl9EQ1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgU0RTUl9EQ1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU0RTUl9EQ1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZyYW1lIHRpbWVyIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEZSTVRfRlRWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEZSTVRfRlRWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmcmFtZSB0aW1lciBjdXJyZW50IGNvdW50Ci0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRlJDQ19GQ0NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgRlJDQ19GQ0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZyYW1lIHRpbWVyIHNhdmUgY291bnQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBGUlNDX0ZDU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBGUlNDX0ZDU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSB2YXJpb3VzIGZsYWdzIHN0b3JlZCBpbiB0aGUgc2NhdHRlci9nYXRoZXIKLSAqICBkZXNjcmlwdG9ycy4KLSAqLwotI2RlZmluZSBETUFfU0dfTkVYVF9FTlRSWV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMEZGOAotI2RlZmluZSBETUFfU0dfU0FNUExFX0VORF9NQVNLICAgICAgICAgICAgICAgICAgMHgwRkZGMDAwMAotI2RlZmluZSBETUFfU0dfU0FNUExFX0VORF9GTEFHICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBETUFfU0dfTE9PUF9FTkRfRkxBRyAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBETUFfU0dfU0lHTkFMX0VORF9GTEFHICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBETUFfU0dfU0lHTkFMX1BBR0VfRkxBRyAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBETUFfU0dfTkVYVF9FTlRSWV9TSElGVCAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBETUFfU0dfU0FNUExFX0VORF9TSElGVCAgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgZmllbGRzIHdpdGhpbiB0aGUgb24tY2hpcCBnZW5lcmljCi0gKiAgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfQ09OVFJPTDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQ09OVFJPTDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBETUFfUlFfU09VUkNFX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBETUFfUlFfREVTVElOQVRJT05fQUREUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBETUFfUlFfTkVYVF9QQUdFX0FERFIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBETUFfUlFfTkVYVF9QQUdFX1NHREVTQyAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNAotI2RlZmluZSBETUFfUlFfTE9PUF9TVEFSVF9BRERSICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBETUFfUlFfUE9TVF9MT09QX0FERFIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQwotI2RlZmluZSBETUFfUlFfUEFHRV9NQVBfQUREUiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZmlyc3QgY29udHJvbCB3b3JkIG9mIHRoZQotICogIG9uLWNoaXAgZ2VuZXJpYyBETUEgcmVxdWVzdG9yLgotICovCi0jZGVmaW5lIERNQV9SUV9DMV9DT1VOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0ZGCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUSU5BVElPTl9TQ0FUVEVSICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfR0FUSEVSICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ET05FX0ZMQUcgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIERNQV9SUV9DMV9PUFRJTUlaRV9TVEFURSAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TQU1QTEVfRU5EX1NUQVRFX01BU0sgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9GVUxMX1BBR0UgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9CRUZPUkVfU0FNUExFX0VORCAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9QQUdFX01BUF9FUlJPUiAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9BVF9TQU1QTEVfRU5EICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9MT09QX0VORF9TVEFURV9NQVNLICAgICAgICAgICAweDAwMEMwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9OT1RfTE9PUF9FTkQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9CRUZPUkVfTE9PUF9FTkQgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV8yUEFHRV9MT09QX0JFR0lOICAgICAgICAgICAgICAweDAwMDgwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9MT09QX0JFR0lOICAgICAgICAgICAgICAgICAgICAweDAwMEMwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9QQUdFX01BUF9NQVNLICAgICAgICAgICAgICAgICAweDAwMzAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9QTV9OT05FX1BFTkRJTkcgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9QTV9ORVhUX1BFTkRJTkcgICAgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9QTV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9QTV9MT09QX05FWFRfUEVORElORyAgICAgICAgICAweDAwMzAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9XUklURUJBQ0tfREVTVF9GTEFHICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9XUklURUJBQ0tfU1JDX0ZMQUcgICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAweDA3MDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX0xJTkVBUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX01PRDE2ICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX01PRDMyICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX01PRDY0ICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX01PRDEyOCAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX01PRDI1NiAgICAgICAgICAgICAgICAgICAweDA1MDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX01PRDUxMiAgICAgICAgICAgICAgICAgICAweDA2MDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX01PRDEwMjQgICAgICAgICAgICAgICAgICAweDA3MDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9ERVNUX09OX0hPU1QgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfU0laRV9NQVNLICAgICAgICAgICAgICAweDcwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTElORUFSICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTU9EMTYgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTU9EMzIgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTU9ENjQgICAgICAgICAgICAgICAgICAweDMwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTU9EMTI4ICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTU9EMjU2ICAgICAgICAgICAgICAgICAweDUwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTU9ENTEyICAgICAgICAgICAgICAgICAweDYwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfTU9EMTAyNCAgICAgICAgICAgICAgICAweDcwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9TT1VSQ0VfT05fSE9TVCAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMV9DT1VOVF9TSElGVCAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZWNvbmQgY29udHJvbCB3b3JkIG9mIHRoZQotICogIG9uLWNoaXAgZ2VuZXJpYyBETUEgcmVxdWVzdG9yLgotICovCi0jZGVmaW5lIERNQV9SUV9DMl9WSVJUVUFMX0NIQU5ORUxfTUFTSyAgICAgICAgICAweDAwMDAwMDNGCi0jZGVmaW5lIERNQV9SUV9DMl9WSVJUVUFMX1NJR05BTF9NQVNLICAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIERNQV9SUV9DMl9OT19WSVJUVUFMX1NJR05BTCAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9TSUdOQUxfRVZFUllfRE1BICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIERNQV9SUV9DMl9TSUdOQUxfU09VUkNFX1BJTkdQT05HICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIERNQV9SUV9DMl9TSUdOQUxfREVTVF9QSU5HUE9ORyAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIERNQV9SUV9DMl9BVURJT19DT05WRVJUX01BU0sgICAgICAgICAgICAweDAwMDBGMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9BQ19OT05FICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9BQ184X1RPXzE2X0JJVCAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9BQ19NT05PX1RPX1NURVJFTyAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9BQ19FTkRJQU5fQ09OVkVSVCAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIERNQV9SUV9DMl9BQ19TSUdORURfQ09OVkVSVCAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIERNQV9SUV9DMl9MT09QX0VORF9NQVNLICAgICAgICAgICAgICAgICAweDBGRkYwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9MT09QX01BU0sgICAgICAgICAgICAgICAgICAgICAweDMwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9OT19MT09QICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9PTkVfUEFHRV9MT09QICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9UV09fUEFHRV9MT09QICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9NVUxUSV9QQUdFX0xPT1AgICAgICAgICAgICAgICAweDMwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9TSUdOQUxfTE9PUF9CQUNLICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9TSUdOQUxfUE9TVF9CRUdJTl9QQUdFICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DMl9WSVJUVUFMX0NIQU5ORUxfU0hJRlQgICAgICAgICAwCi0jZGVmaW5lIERNQV9SUV9DMl9MT09QX0VORF9TSElGVCAgICAgICAgICAgICAgICAxNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB3b3JkcwotICogIG9mIHRoZSBvbi1jaGlwIGdlbmVyaWMgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfU0RfQUREUkVTU19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBETUFfUlFfU0RfTUVNT1JZX0lEX01BU0sgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAotI2RlZmluZSBETUFfUlFfU0RfU1BfUEFSQU1fQUREUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfU0RfU1BfU0FNUExFX0FERFIgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBETUFfUlFfU0RfU1BfUFJPR1JBTV9BRERSICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBETUFfUlFfU0RfU1BfREVCVUdfQUREUiAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBETUFfUlFfU0RfT01OSU1FTV9BRERSICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAotI2RlZmluZSBETUFfUlFfU0RfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBETUFfUlFfU0RfRVJST1JfRkxBRyAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBETUFfUlFfU0RfQUREUkVTU19TSElGVCAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGFnZSBtYXAgYWRkcmVzcyB3b3JkIG9mIHRoZQotICogIG9uLWNoaXAgZ2VuZXJpYyBETUEgcmVxdWVzdG9yLgotICovCi0jZGVmaW5lIERNQV9SUV9QTUFfTE9PUF9USElSRF9QQUdFX0VOVFJZX01BU0sgICAweDAwMDAwRkY4Ci0jZGVmaW5lIERNQV9SUV9QTUFfUEFHRV9UQUJMRV9NQVNLICAgICAgICAgICAgICAweEZGRkZGMDAwCi0jZGVmaW5lIERNQV9SUV9QTUFfTE9PUF9USElSRF9QQUdFX0VOVFJZX1NISUZUICAzCi0jZGVmaW5lIERNQV9SUV9QTUFfUEFHRV9UQUJMRV9TSElGVCAgICAgICAgICAgICAxMgotCi0jZGVmaW5lIEJBMV9WQVJJREVDX0JVRl8xICAgICAgIDB4MDAwCi0KLSNkZWZpbmUgQkExX1BEVEMgICAgICAgICAgICAgICAgMHgwYzAgICAgLyogQkExX1BMQVlfRE1BX1RSQU5TQUNUSU9OX0NPVU5UX1JFRyAqLwotI2RlZmluZSBCQTFfUEZJRSAgICAgICAgICAgICAgICAweDBjNCAgICAvKiBCQTFfUExBWV9GT1JNQVRfJl9JTlRFUlJVUFRfRU5BQkxFX1JFRyAqLwotI2RlZmluZSBCQTFfUEJBICAgICAgICAgICAgICAgICAweDBjOCAgICAvKiBCQTFfUExBWV9CVUZGRVJfQUREUkVTUyAqLwotI2RlZmluZSBCQTFfUFZPTCAgICAgICAgICAgICAgICAweDBmOCAgICAvKiBCQTFfUExBWV9WT0xVTUVfUkVHICovCi0jZGVmaW5lIEJBMV9QU1JDICAgICAgICAgICAgICAgIDB4Mjg4ICAgIC8qIEJBMV9QTEFZX1NBTVBMRV9SQVRFX0NPUlJFQ1RJT05fUkVHICovCi0jZGVmaW5lIEJBMV9QQ1RMICAgICAgICAgICAgICAgIDB4MmE0ICAgIC8qIEJBMV9QTEFZX0NPTlRST0xfUkVHICovCi0jZGVmaW5lIEJBMV9QUEkgICAgICAgICAgICAgICAgIDB4MmI0ICAgIC8qIEJBMV9QTEFZX1BIQVNFX0lOQ1JFTUVOVF9SRUcgKi8KLQotI2RlZmluZSBCQTFfQ0NUTCAgICAgICAgICAgICAgICAweDA2NCAgICAvKiBCQTFfQ0FQVFVSRV9DT05UUk9MX1JFRyAqLwotI2RlZmluZSBCQTFfQ0lFICAgICAgICAgICAgICAgICAweDEwNCAgICAvKiBCQTFfQ0FQVFVSRV9JTlRFUlJVUFRfRU5BQkxFX1JFRyAqLwotI2RlZmluZSBCQTFfQ0JBICAgICAgICAgICAgICAgICAweDEwYyAgICAvKiBCQTFfQ0FQVFVSRV9CVUZGRVJfQUREUkVTUyAqLwotI2RlZmluZSBCQTFfQ1NSQyAgICAgICAgICAgICAgICAweDJjOCAgICAvKiBCQTFfQ0FQVFVSRV9TQU1QTEVfUkFURV9DT1JSRUNUSU9OX1JFRyAqLwotI2RlZmluZSBCQTFfQ0NJICAgICAgICAgICAgICAgICAweDJkOCAgICAvKiBCQTFfQ0FQVFVSRV9DT0VGRklDSUVOVF9JTkNSRU1FTlRfUkVHICovCi0jZGVmaW5lIEJBMV9DRCAgICAgICAgICAgICAgICAgIDB4MmUwICAgIC8qIEJBMV9DQVBUVVJFX0RFTEFZX1JFRyAqLwotI2RlZmluZSBCQTFfQ1BJICAgICAgICAgICAgICAgICAweDJmNCAgICAvKiBCQTFfQ0FQVFVSRV9QSEFTRV9JTkNSRU1FTlRfUkVHICovCi0jZGVmaW5lIEJBMV9DVk9MICAgICAgICAgICAgICAgIDB4MmY4ICAgIC8qIEJBMV9DQVBUVVJFX1ZPTFVNRV9SRUcgKi8KLQotI2RlZmluZSBCQTFfQ0ZHMSAgICAgICAgICAgICAgICAweDEzNCAgICAvKiBCQTFfQ0FQVFVSRV9GUkFNRV9HUk9VUF8xX1JFRyAqLwotI2RlZmluZSBCQTFfQ0ZHMiAgICAgICAgICAgICAgICAweDEzOCAgICAvKiBCQTFfQ0FQVFVSRV9GUkFNRV9HUk9VUF8yX1JFRyAqLwotI2RlZmluZSBCQTFfQ0NTVCAgICAgICAgICAgICAgICAweDEzYyAgICAvKiBCQTFfQ0FQVFVSRV9DT05TVEFOVF9SRUcgKi8KLSNkZWZpbmUgQkExX0NTUEIgICAgICAgICAgICAgICAgMHgzNDAgICAgLyogQkExX0NBUFRVUkVfU1BCX0FERFJFU1MgKi8KLQotLyoKLSAqCi0gKi8KLQotI2RlZmluZSBDUzQ2MVhfTU9ERV9PVVRQVVQJKDE8PDApCSAvKiBNSURJIFVBUlQgLSBvdXRwdXQgKi8gCi0jZGVmaW5lIENTNDYxWF9NT0RFX0lOUFVUCSgxPDwxKQkgLyogTUlESSBVQVJUIC0gaW5wdXQgKi8KLQotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLwotLy8gVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIG9mZnNldHMgb2YgdGhlIEFDOTcgc2hhZG93IHJlZ2lzdGVycywgd2hpY2ggYXBwZWFyCi0vLyBhcyBhIHZpcnR1YWwgZXh0ZW5zaW9uIHRvIHRoZSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgemVybyBtZW1vcnkgcmFuZ2UuCi0vLwotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lIEFDOTdfUkVHX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdFTAotI2RlZmluZSBBQzk3X0NPREVDX05VTUJFUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMzAwMEwKLQotI2RlZmluZSBCQTBfQUM5N19SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMEwKLSNkZWZpbmUgQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDJMCi0jZGVmaW5lIEJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUgICAgICAgICAgICAgICAweDAwMDAxMDA0TAotI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8gICAgICAgICAgICAgMHgwMDAwMTAwNkwKLSNkZWZpbmUgQkEwX0FDOTdfTUFTVEVSX1RPTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDhMCi0jZGVmaW5lIEJBMF9BQzk3X1BDX0JFRVBfVk9MVU1FICAgICAgICAgICAgICAgICAweDAwMDAxMDBBTAotI2RlZmluZSBCQTBfQUM5N19QSE9ORV9WT0xVTUUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwQ0wKLSNkZWZpbmUgQkEwX0FDOTdfTUlDX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMEVMCi0jZGVmaW5lIEJBMF9BQzk3X0xJTkVfSU5fVk9MVU1FICAgICAgICAgICAgICAgICAweDAwMDAxMDEwTAotI2RlZmluZSBCQTBfQUM5N19DRF9WT0xVTUUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxMkwKLSNkZWZpbmUgQkEwX0FDOTdfVklERU9fVk9MVU1FICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTRMCi0jZGVmaW5lIEJBMF9BQzk3X0FVWF9WT0xVTUUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDE2TAotI2RlZmluZSBCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAxOEwKLSNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX1NFTEVDVCAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMUFMCi0jZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9HQUlOICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDFDTAotI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfR0FJTl9NSUMgICAgICAgICAgICAgICAgMHgwMDAwMTAxRUwKLSNkZWZpbmUgQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFICAgICAgICAgICAgICAgIDB4MDAwMDEwMjBMCi0jZGVmaW5lIEJBMF9BQzk3XzNEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDIyTAotI2RlZmluZSBCQTBfQUM5N19NT0RFTV9SQVRFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyNEwKLSNkZWZpbmUgQkEwX0FDOTdfUE9XRVJET1dOICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjZMCi0jZGVmaW5lIEJBMF9BQzk3X0VYVF9BVURJT19JRCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI4TAotI2RlZmluZSBCQTBfQUM5N19FWFRfQVVESU9fUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMTAyQUwKLSNkZWZpbmUgQkEwX0FDOTdfUENNX0ZST05UX0RBQ19SQVRFICAgICAgICAgICAgIDB4MDAwMDEwMkNMCi0jZGVmaW5lIEJBMF9BQzk3X1BDTV9TVVJSX0RBQ19SQVRFICAgICAgICAgICAgICAweDAwMDAxMDJFTAotI2RlZmluZSBCQTBfQUM5N19QQ01fTEZFX0RBQ19SQVRFICAgICAgICAgICAgICAgMHgwMDAwMTAzMEwKLSNkZWZpbmUgQkEwX0FDOTdfUENNX0xSX0FEQ19SQVRFICAgICAgICAgICAgICAgIDB4MDAwMDEwMzJMCi0jZGVmaW5lIEJBMF9BQzk3X01JQ19BRENfUkFURSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDM0TAotI2RlZmluZSBCQTBfQUM5N182Q0hfVk9MX0NfTEZFICAgICAgICAgICAgICAgICAgMHgwMDAwMTAzNkwKLSNkZWZpbmUgQkEwX0FDOTdfNkNIX1ZPTF9TVVJST1VORCAgICAgICAgICAgICAgIDB4MDAwMDEwMzhMCi0jZGVmaW5lIEJBMF9BQzk3X1JFU0VSVkVEXzNBICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDNBTAotI2RlZmluZSBCQTBfQUM5N19FWFRfTU9ERU1fSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAzQ0wKLSNkZWZpbmUgQkEwX0FDOTdfRVhUX01PREVNX1BPV0VSICAgICAgICAgICAgICAgIDB4MDAwMDEwM0VMCi0jZGVmaW5lIEJBMF9BQzk3X0xJTkUxX0NPREVDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDQwTAotI2RlZmluZSBCQTBfQUM5N19MSU5FMl9DT0RFQ19SQVRFICAgICAgICAgICAgICAgMHgwMDAwMTA0MkwKLSNkZWZpbmUgQkEwX0FDOTdfSEFORFNFVF9DT0RFQ19SQVRFICAgICAgICAgICAgIDB4MDAwMDEwNDRMCi0jZGVmaW5lIEJBMF9BQzk3X0xJTkUxX0NPREVDX0xFVkVMICAgICAgICAgICAgICAweDAwMDAxMDQ2TAotI2RlZmluZSBCQTBfQUM5N19MSU5FMl9DT0RFQ19MRVZFTCAgICAgICAgICAgICAgMHgwMDAwMTA0OEwKLSNkZWZpbmUgQkEwX0FDOTdfSEFORFNFVF9DT0RFQ19MRVZFTCAgICAgICAgICAgIDB4MDAwMDEwNEFMCi0jZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX0NPTkZJRyAgICAgICAgICAgICAgICAweDAwMDAxMDRDTAotI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9UWVBFICAgICAgICAgICAgICAgICAgMHgwMDAwMTA0RUwKLSNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fU1RJQ0tZICAgICAgICAgICAgICAgIDB4MDAwMDEwNTBMCi0jZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1dBS0VVUCAgICAgICAgICAgICAgICAweDAwMDAxMDUyTAotI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9TVEFUVVMgICAgICAgICAgICAgICAgMHgwMDAwMTA1NEwKLSNkZWZpbmUgQkEwX0FDOTdfTUlTQ19NT0RFTV9BRkVfU1RBVCAgICAgICAgICAgIDB4MDAwMDEwNTZMCi0jZGVmaW5lIEJBMF9BQzk3X1JFU0VSVkVEXzU4ICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDU4TAotI2RlZmluZSBCQTBfQUM5N19DUllTVEFMX1JFVl9OX0ZBQl9JRCAgICAgICAgICAgMHgwMDAwMTA1QUwKLSNkZWZpbmUgQkEwX0FDOTdfVEVTVF9BTkRfTUlTQ19DVFJMICAgICAgICAgICAgIDB4MDAwMDEwNUNMCi0jZGVmaW5lIEJBMF9BQzk3X0FDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDVFTAotI2RlZmluZSBCQTBfQUM5N19NSVNDX0NSWVNUQUxfQ09OVFJPTCAgICAgICAgICAgMHgwMDAwMTA2MEwKLSNkZWZpbmUgQkEwX0FDOTdfTElORTFfSFlQUklEX0NUUkwgICAgICAgICAgICAgIDB4MDAwMDEwNjJMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82NCAgICAgICAgICAgICAweDAwMDAxMDY0TAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNjYgICAgICAgICAgICAgMHgwMDAwMTA2NkwKLSNkZWZpbmUgQkEwX0FDOTdfU1BESUZfQ09OVFJPTCAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNjhMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82QSAgICAgICAgICAgICAweDAwMDAxMDZBTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkMgICAgICAgICAgICAgMHgwMDAwMTA2Q0wKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZFICAgICAgICAgICAgIDB4MDAwMDEwNkVMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83MCAgICAgICAgICAgICAweDAwMDAxMDcwTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzIgICAgICAgICAgICAgMHgwMDAwMTA3MkwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzc0ICAgICAgICAgICAgIDB4MDAwMDEwNzRMCi0jZGVmaW5lIEJBMF9BQzk3X0NBTF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDc2TAotI2RlZmluZSBCQTBfQUM5N19DQUxfREFUQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA3OEwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzdBICAgICAgICAgICAgIDB4MDAwMDEwN0FMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9JRDEgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDdDTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfSUQyICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA3RUwKLSNlbmRpZgkJCQkvKiBfX0NTNDYxWF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0NjF4X2ltYWdlLmggYi9zb3VuZC9vc3MvY3M0NjF4X2ltYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzVhNDYuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2NzNDYxeF9pbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAiQ1dDSU1BR0UuSCItLSBGb3IgQ1M0NlhYLiBWZXIgMS4wNAotICogICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIChjKSBDaXJydXMgTG9naWMgQ29ycC4KLSAqICAgICAgVmVyc2lvbiAxLjA0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaWZuZGVmIF9fQ1NfSU1BR0VfSAotI2RlZmluZSBfX0NTX0lNQUdFX0gKLQotI2RlZmluZSBDTEVBUl9fQ09VTlQgICAgIDMKLSNkZWZpbmUgRklMTF9fQ09VTlQgICAgICA0Ci0jZGVmaW5lIEJBMV9fRFdPUkRfU0laRSAgMTMqMTAyNCs1MTIKLQotc3RhdGljIHN0cnVjdAotewotICAgICAgICB1bnNpZ25lZCBCQTFfX0Rlc3RCeXRlT2Zmc2V0OwotICAgICAgICB1bnNpZ25lZCBCQTFfX1NvdXJjZVNpemU7Ci19IENsclN0YXRbQ0xFQVJfX0NPVU5UXSA9eyB7MHgwMDAwMDAwMCwgMHgwMDAwMzAwMCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMTAwMDAsIDB4MDAwMDM4MDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDIwMDAwLCAweDAwMDA3MDAwIH0gfTsKLQotc3RhdGljIHUzMiBGaWxsQXJyYXkxW109ewotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMjAwMDQwLDB4MDAwMDgwMTAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHg4MDAwMDAwMSwweDAwMDAwMDAxLDB4MDAwNjAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDkwMDA4MCwweDAwMDAwMTczLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMTAsMHgwMDgwMDAwMCwweDAwOTAwMDAwLAotMHhmMmMwMDAwZiwweDAwMDAwMjAwLDB4MDAwMDAwMDAsMHgwMDAxMDYwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDMzMDMwMGMyLAotMHgwNjAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDgwMDAsMHg4MDAwODAwMCwKLTB4M2ZjMDAwMGYsMHgwMDAwMDMwMSwweDAwMDEwNDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwYjAwMDAwLDB4MDBkMDgwNmQsMHgzMzA0ODBjMywKLTB4MDQ4MDAwMDAsMHgwMDAwMDAwMSwweDAwODAwMDAxLDB4MDAwMGZmZmYsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDY2YTA2MDAsMHgwNjM1MDA3MCwweDAwMDA5MjlkLDB4OTI5ZDkyOWQsCi0weDAwMDAwMDAwLDB4MDAwMDczNWEsMHgwMDAwMDYwMCwweDAwMDAwMDAwLAotMHg5MjlkNzM1YSwweDAwMDAwMDAwLDB4MDAwMTAwMDAsMHg3MzVhNzM1YSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA4MDRmLDB4MDAwMDAwYzMsCi0weDA1MDAwMDAwLDB4MDBhMDAwMTAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDA3MDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDgwLDB4MDBhMDAwMDAsMHgwMDAwODA5YSwweDAwMDAwMGMyLAotMHgwNzQwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDgwMDAsMHhmZmZmZmZmZiwKLTB4MDBjODAwMjgsMHgwMDAwNTU1NSwweDAwMDAwMDAwLDB4MDAwMTA3YTAsCi0weDAwYzgwMDI4LDB4MDAwMDAwYzIsMHgwNjgwMDAwMCwweDAwMDAwMDAwLAotMHgwNmUwMDA4MCwweDAwMzAwMDAwLDB4MDAwMDgwYmIsMHgwMDAwMDBjOSwKLTB4MDdhMDAwMDAsMHgwNDAwMDAwMCwweDgwMDA4MDAwLDB4ZmZmZmZmZmYsCi0weDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDAwNzgwLAotMHgwMGM4MDAyOCwweDAwMDAwMGM1LDB4ZmY4MDAwMDAsMHgwMDAwMDAwMCwKLTB4MDA2NDAwODAsMHgwMGMwMDAwMCwweDAwMDA4MTk3LDB4MDAwMDAwYzksCi0weDA3ODAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA1ZSwweDAwMDAwMGMxLAotMHgwMDAwMDAwMCwweDAwODAwMDAwLDB4ODAwMDgwMDAsMHg4MDAwODAwMCwKLTB4MDAwMjAwMDAsMHgwMDAwZmZmZiwweDAwMDAwMDAwLDB4MDAwMDAwMDB9OwotCi1zdGF0aWMgdTMyIEZpbGxBcnJheTJbXT17Ci0weDkyOWQwNjAwLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQwMDAwLAotMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwKLTB4OTI5ZDkyOWQsMHgwMDEwMDYzNSwweDA2MGIwMTNmLDB4MDAwMDAwMDQsCi0weDAwMDAwMDAxLDB4MDA3YTAwMDIsMHgwMDAwMDAwMCwweDA2NmUwNjEwLAotMHgwMTA1OTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwKLTB4OTI5ZDkyOWQsMHhhNDMxYWM3NSwweDAwMDE3MzVhLDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweDczNWEwMDUxLAotMHgwMDAwMDAwMCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwKLTB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHgwMDAwMDAwMCwweDA2NDAwMTM2LAotMHgwMDAwMjcwZiwweDAwMDEwMDAwLDB4MDA3YTAwMDAsMHgwMDAwMDAwMCwKLTB4MDY4ZTA2NDUsMHgwMTA1OTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHhhNDMxYWM3NSwweDAwMDE3MzVhLAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4NzM1YTAxMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9OwotCi1zdGF0aWMgdTMyIEZpbGxBcnJheTNbXT17Ci0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEwMDA0fTsKLQotc3RhdGljIHUzMiBGaWxsQXJyYXk0W109ewotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMDE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDExNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMTk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDI5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMzE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwZmUxOWUsMHgwMDAwMTAwMywweDAwMDljNzMwLDB4MDAwMDEwMDMsCi0weDAwMDhlMTljLDB4MDAwMDEwMDMsMHgwMDAwODNjMSwweDAwMDkzMDQwLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMDk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDE5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMjE3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDMxNzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMzk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDBhNzMwLDB4MDAwMDEwMDgsMHgwMDBlMjczMCwweDAwMDAxMDAyLAotMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKLTB4MDAwMGE3MzEsMHgwMDAwMTAwMiwweDAwMDBhNzMxLDB4MDAwMDEwMDIsCi0weDAwMDBhNzMxLDB4MDAwMDEwMDIsMHgwMDAwYTczMSwweDAwMDAxMDAyLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwZjYxOWMsMHgwMDAwMTAwMywKLTB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwweDAwMDAwMDM3LDB4MDAwMDEwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDBjMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAzNzNjLDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDBlZTE5YywweDAwMDAxMDAzLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMzcsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDI3M2MsMHgwMDAwMTAwMCwKLTB4MDAwMDAwMzMsMHgwMDAwMTAwMCwweDAwMGU2NzllLDB4MDAwMDEwMDMsCi0weDAwMDA3NzA1LDB4MDAwMDE0MDAsMHgwMDBhYzcxZSwweDAwMDAxMDAzLAotMHgwMDA4N2ZjMSwweDAwMGMzYmUwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMzcsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE3MzAsMHgwMDAwMTAwMywKLTB4MDAwMDAwMzMsMHgwMDAwMTAwMCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCi0weDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwYzAwMDAsCi0weDAwMDAwMDMyLDB4MDAwMDEwMDAsMHgwMDAwMjczZCwweDAwMDAxMDAwLAotMHgwMDA0YTczMCwweDAwMDAxMDAzLDB4MDAwMDBmNDEsMHgwMDA5NzE0MCwKLTB4MDAwMGE4NDEsMHgwMDA5YjI0MCwweDAwMDBhMGMxLDB4MDAwOWYwNDAsCi0weDAwMDFjNjQxLDB4MDAwOTM1NDAsMHgwMDAxY2VjMSwweDAwMDliNWMwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMWJmMDUsMHgwMDAzZmM0MCwKLTB4MDAwMDI3MjUsMHgwMDBhYTQwMCwweDAwMDEzNzA1LDB4MDAwOTNhMDAsCi0weDAwMDAwMDJlLDB4MDAwOWQ2YzAsMHgwMDAzODYzMCwweDAwMDAxMDA0LAotMHgwMDA0ZWYwYSwweDAwMGViNzg1LDB4MDAwM2ZjOGEsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDBjNzBlMCwweDAwMDdkMTgyLDB4MDAwMmM2NDAsCi0weDAwMDAwNjMwLDB4MDAwMDEwMDQsMHgwMDA3OTliOCwweDAwMDJjNmMwLAotMHgwMDAzMTcwNSwweDAwMDkyMjQwLDB4MDAwMzlmMDUsMHgwMDA5MzJjMCwKLTB4MDAwMzUyMGEsMHgwMDAwMDAwMCwweDAwMDQwNzMxLDB4MDAwMDEwMGIsCi0weDAwMDEwNzA1LDB4MDAwYjIwYzAsMHgwMDAwMDAwMCwweDAwMGViYTQ0LAotMHgwMDAzMjEwOCwweDAwMGM2MGM0LDB4MDAwNjUyMDgsMHgwMDBjMjkxNywKLTB4MDAwNDA2YjAsMHgwMDAwMTAwNywweDAwMDEyZjA1LDB4MDAwMzY4ODAsCi0weDAwMDI4MThlLDB4MDAwYzAwMDAsMHgwMDA0NDEwYSwweDAwMDAwMDAwLAotMHgwMDA0MDYzMCwweDAwMDAxMDA3LDB4MDAwMjk3MDUsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAzZmMxLDB4MDAwM2ZjNDAsCi0weDAwMDAzN2MxLDB4MDAwOTFiNDAsMHgwMDAwM2ZjMSwweDAwMDkxMWMwLAotMHgwMDAwMzdjMSwweDAwMDk1N2MwLDB4MDAwMDNmYzEsMHgwMDA5NTFjMCwKLTB4MDAwMDM3YzEsMHgwMDAwMDAwMCwweDAwMDAzZmMxLDB4MDAwOTkxYzAsCi0weDAwMDAzN2MxLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDlkMWMwLAotMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMWNjYzEsMHgwMDA5MTVjMCwKLTB4MDAwMWM0NDEsMHgwMDA5ZDgwMCwweDAwMDljZGMxLDB4MDAwOTEyNDAsCi0weDAwMDFjNTQxLDB4MDAwOTFkMDAsMHgwMDA5Y2ZjMSwweDAwMDk1MjQwLAotMHgwMDAxYzc0MSwweDAwMDk1YzgwLDB4MDAwZThjYTksMHgwMDA5OTI0MCwKLTB4MDAwZTg1YWQsMHgwMDA5NTY0MCwweDAwMDY5Y2E5LDB4MDAwOTlkODAsCi0weDAwMGU5NTJkLDB4MDAwOTk2NDAsMHgwMDBlYWNhOSwweDAwMDlkNmMwLAotMHgwMDBlYTVhZCwweDAwMDkxYTQwLDB4MDAwNmJjYTksMHgwMDA5ZGU4MCwKLTB4MDAwZWI1MmQsMHgwMDA5NWE0MCwweDAwMGVjY2E5LDB4MDAwOTlhYzAsCi0weDAwMGVjNWFkLDB4MDAwOWRhNDAsMHgwMDBlZGNhOSwweDAwMDlkMzAwLAotMHgwMDBhNmUwYSwweDAwMDAxMDAwLDB4MDAwZWQ1MmQsMHgwMDA5MWU0MCwKLTB4MDAwZWVjYTksMHgwMDA5NWVjMCwweDAwMGVlNWFkLDB4MDAwOTllNDAsCi0weDAwMDZmY2E5LDB4MDAwMDI1MDAsMHgwMDBmYjIwOCwweDAwMGM1OWEwLAotMHgwMDBlZjUyZCwweDAwMDlkZTQwLDB4MDAwNjhjYTksMHgwMDA5MTJjMSwKLTB4MDAwNjgzYWQsMHgwMDA5NTI0MSwweDAwMDIwZjA1LDB4MDAwOTkxYzEsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA4NmY4OCwweDAwMDAxMDAwLAotMHgwMDA5Y2Y4MSwweDAwMGI1MzQwLDB4MDAwOWM3MDEsMHgwMDBiOTJjMCwKLTB4MDAwOWRlODEsMHgwMDBiZDMwMCwweDAwMDlkNjAxLDB4MDAwYjE3MDAsCi0weDAwMDFmZDgxLDB4MDAwYjlkODAsMHgwMDA5ZjUwMSwweDAwMGI1N2MwLAotMHgwMDBhMGY4MSwweDAwMGJkNzQwLDB4MDAwMjA3MDEsMHgwMDBiNWM4MCwKLTB4MDAwYTE2ODEsMHgwMDBiOTdjMCwweDAwMDIxNjAxLDB4MDAwMDI1MDAsCi0weDAwMGEwNzAxLDB4MDAwYjliNDAsMHgwMDBhMGY4MSwweDAwMGIxYmMwLAotMHgwMDAyMTY4MSwweDAwMDAyZDAwLDB4MDAwMjBmODEsMHgwMDBiZDgwMCwKLTB4MDAwYTA3MDEsMHgwMDBiNWJjMCwweDAwMDIxNjAxLDB4MDAwMDM1MDAsCi0weDAwMGEwZjgxLDB4MDAwYjVmNDAsMHgwMDBhMDcwMSwweDAwMGJkYmMwLAotMHgwMDAyMTY4MSwweDAwMDAzZDAwLDB4MDAwMjBmODEsMHgwMDBiMWQwMCwKLTB4MDAwYTA3MDEsMHgwMDBiMWZjMCwweDAwMDIxNjAxLDB4MDAwMjA1MDAsCi0weDAwMDIwZjgxLDB4MDAwYjEzNDEsMHgwMDBhMDcwMSwweDAwMGI5ZmMwLAotMHgwMDAyMTY4MSwweDAwMDIwZDAwLDB4MDAwMjBmODEsMHgwMDBiZGU4MCwKLTB4MDAwYTA3MDEsMHgwMDBiZGZjMCwweDAwMDIxNjAxLDB4MDAwMjE1MDAsCi0weDAwMDIwZjgxLDB4MDAwYjkzNDEsMHgwMDAyMDcwMSwweDAwMGI1M2MxLAotMHgwMDAyMTY4MSwweDAwMDIxZDAwLDB4MDAwYTBmODEsMHgwMDBkMDM4MCwKLTB4MDAwMGI2MDEsMHgwMDBiMTVjMCwweDAwMDA3YjAxLDB4MDAwMDAwMDAsCi0weDAwMDA3YjgxLDB4MDAwYmQxYzAsMHgwMDAwN2IwMSwweDAwMDAwMDAwLAotMHgwMDAwN2I4MSwweDAwMGI5MWMwLDB4MDAwMDdiMDEsMHgwMDBiNTdjMCwKLTB4MDAwMDdiODEsMHgwMDBiNTFjMCwweDAwMDA3YjAxLDB4MDAwYjFiNDAsCi0weDAwMDA3YjgxLDB4MDAwYjExYzAsMHgwMDA4N2IwMSwweDAwMGMzZGMwLAotMHgwMDA3ZTQ4OCwweDAwMGQ3ZTQ1LDB4MDAwMDAwMDAsMHgwMDBkN2E0NCwKLTB4MDAwN2U0OGEsMHgwMDAwMDAwMCwweDAwMDExZjA1LDB4MDAwODQwODAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTcwNSwweDAwMGIzNTQwLAotMHgwMDAwOGEwMSwweDAwMGJmMDQwLDB4MDAwMDcwODEsMHgwMDBiYjVjMCwKLTB4MDAwNTU0ODgsMHgwMDAwMDAwMCwweDAwMDBkNDgyLDB4MDAwM2ZjNDAsCi0weDAwMDNmYzg4LDB4MDAwMDAwMDAsMHgwMDAxZTQwMSwweDAwMGIzYTAwLAotMHgwMDAxZWM4MSwweDAwMGJkNmMwLDB4MDAwNGVmMDgsMHgwMDBlYjc4NCwKLTB4MDAwYzg2YjAsMHgwMDAwMTAwNywweDAwMDA4MjgxLDB4MDAwYmIyNDAsCi0weDAwMDBiODAxLDB4MDAwYjcxNDAsMHgwMDAwNzg4OCwweDAwMDAwMDAwLAotMHgwMDAwMDczYywweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDU1Mjg4LDB4MDAwYzU1NWMsCi0weDAwMDU1MjhhLDB4MDAwYzAwMDAsMHgwMDA5ZmE4OCwweDAwMGM1ZDAwLAotMHgwMDAwZmE4OCwweDAwMDAwMDAwLDB4MDAwMDAwMzIsMHgwMDAwMTAwMCwKLTB4MDAwMDA3M2QsMHgwMDAwMTAwMCwweDAwMDdmMTg4LDB4MDAwYzAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA4YzAxYywweDAwMDAxMDAzLAotMHgwMDAwMjcwNSwweDAwMDAxMDA4LDB4MDAwOGIyMDEsMHgwMDBjMTM5MiwKLTB4MDAwMGJhMDEsMHgwMDAwMDAwMCwweDAwMDA4NzMxLDB4MDAwMDE0MDAsCi0weDAwMDRjMTA4LDB4MDAwZmUwYzQsMHgwMDA1NzQ4OCwweDAwMDAwMDAwLAotMHgwMDBhNjM4OCwweDAwMDAxMDAxLDB4MDAwOGIzMzQsMHgwMDBiYzE0MSwKLTB4MDAwMzAyMGUsMHgwMDAwMDAwMCwweDAwMDg4NmIwLDB4MDAwMDEwMDgsCi0weDAwMDAzNjI1LDB4MDAwYzVkZmEsMHgwMDBhNjM4YSwweDAwMDAxMDAxLAotMHgwMDA4MDIwZSwweDAwMDAxMDAyLDB4MDAwOGE2YjAsMHgwMDAwMTAwOCwKLTB4MDAwN2YzMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAyNzI1LDB4MDAwYThjNDAsMHgwMDAwMDBhZSwweDAwMDAwMDAwLAotMHgwMDBkODYzMCwweDAwMDAxMDA4LDB4MDAwMDAwMDAsMHgwMDBjNzRlMCwKLTB4MDAwN2QxODIsMHgwMDAyZDY0MCwweDAwMGE4NjMwLDB4MDAwMDEwMDgsCi0weDAwMDc5OWI4LDB4MDAwMmQ2YzAsMHgwMDAwNzQ4YSwweDAwMGMzZWM1LAotMHgwMDA3NDIwYSwweDAwMGMwMDAwLDB4MDAwNjIyMDgsMHgwMDBjNDExNywKLTB4MDAwNzA2MzAsMHgwMDAwMTAwOSwweDAwMDAwMDAwLDB4MDAwYzAwMDAsCi0weDAwMDEwMjJlLDB4MDAwMDAwMDAsMHgwMDAzYTYzMCwweDAwMDAxMDA5LAotMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMzYsMHgwMDAwMTAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAyYTczMCwweDAwMDAxMDA4LDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMzcsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMmE3MzAsMHgwMDAwMTAwOCwKLTB4MDAwMDAwMzMsMHgwMDAwMTAwMCwweDAwMDJhNzA1LDB4MDAwMDEwMDgsCi0weDAwMDA3YTAxLDB4MDAwYzAwMDAsMHgwMDBlNjI4OCwweDAwMGQ1NTBhLAotMHgwMDA2NDI4YSwweDAwMDAwMDAwLDB4MDAwNjA3MzAsMHgwMDAwMTAwYSwKLTB4MDAwMDAwMDAsMHgwMDBjMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDdhYWIwLDB4MDAwMzQ4ODAsMHgwMDA3OGZiMCwweDAwMDAxMDBiLAotMHgwMDA1NzQ4OCwweDAwMDAwMDAwLDB4MDAwMzNiOTQsMHgwMDA4MTE0MCwKLTB4MDAwMTgzYWUsMHgwMDAwMDAwMCwweDAwMDc4NmIwLDB4MDAwMDEwMGIsCi0weDAwMDIyZjA1LDB4MDAwYzM1NDUsMHgwMDAwZWI4YSwweDAwMDAwMDAwLAotMHgwMDA0MjczMSwweDAwMDAxMDAzLDB4MDAwN2FhYjAsMHgwMDAzNDg4MCwKLTB4MDAwNDhmYjAsMHgwMDAwMTAwYSwweDAwMDU3NDg4LDB4MDAwMDAwMDAsCi0weDAwMDMzYjk0LDB4MDAwODExNDAsMHgwMDAxODNhZSwweDAwMDAwMDAwLAotMHgwMDA4MDZiMCwweDAwMDAxMDBiLDB4MDAwMjJmMDUsMHgwMDAwMDAwMCwKLTB4MDAwMDc0MDEsMHgwMDA5MTE0MCwweDAwMDQ4ZjA1LDB4MDAwOTUxYzAsCi0weDAwMDQyNzMxLDB4MDAwMDEwMDMsMHgwMDAwNDczZCwweDAwMDAxMDAwLAotMHgwMDBmMTliMCwweDAwMGJiYzQ3LDB4MDAwODAwMDAsMHgwMDBiZmZjNywKLTB4MDAwZmUxOWUsMHgwMDAwMTAwMywweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDhlMTljLDB4MDAwMDEwMDMsMHgwMDAwODNjMSwweDAwMDkzMDQwLAotMHgwMDAwMGY0MSwweDAwMDk3MTQwLDB4MDAwMGE4NDEsMHgwMDA5YjI0MCwKLTB4MDAwMGEwYzEsMHgwMDA5ZjA0MCwweDAwMDFjNjQxLDB4MDAwOTM1NDAsCi0weDAwMDFjZWMxLDB4MDAwOWI1YzAsMHgwMDAwMDAwMCwweDAwMGZkYzQ0LAotMHgwMDA1NTIwOCwweDAwMDAwMDAwLDB4MDAwMTA3MDUsMHgwMDBhMjg4MCwKLTB4MDAwMGEyM2EsMHgwMDA5M2EwMCwweDAwMDNmYzhhLDB4MDAwZGY2YzUsCi0weDAwMDRlZjBhLDB4MDAwYzAwMDAsMHgwMDAxMmYwNSwweDAwMDM2ODgwLAotMHgwMDA2NTMwOCwweDAwMGMyOTk3LDB4MDAwZDg2YjAsMHgwMDAwMTAwYSwKLTB4MDAwNDQxMGEsMHgwMDBkNDBjNywweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDgwNzMwLDB4MDAwMDEwMDQsMHgwMDA1NmYwYSwweDAwMGVhMTA1LAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwKLTB4MDAwZjE5YjAsMHgwMDBiYmM0NywweDAwMDgwMDAwLDB4MDAwYmZmYzcsCi0weDAwMDAyNzNkLDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMGViYTQ0LAotMHgwMDA0OGYwNSwweDAwMDBmNDQwLDB4MDAwMDc0MDEsMHgwMDAwZjdjMCwKLTB4MDAwMDA3MzQsMHgwMDAwMTAwMCwweDAwMDEwNzA1LDB4MDAwYTY4ODAsCi0weDAwMDA2YTg4LDB4MDAwYzc1YzQsMHgwMDAwMDAwMCwweDAwMGU1MDg0LAotMHgwMDAwMDAwMCwweDAwMGViYTQ0LDB4MDAwODc0MDEsMHgwMDBlNDc4MiwKLTB4MDAwMDA3MzQsMHgwMDAwMTAwMCwweDAwMDEwNzA1LDB4MDAwYTY4ODAsCi0weDAwMDA2YTg4LDB4MDAwYzc1YzQsMHgwMDA3YzEwOCwweDAwMGMwMDAwLAotMHgwMDA3ZTcyMSwweDAwMGJlZDQwLDB4MDAwMDVmMjUsMHgwMDBiYWRjMCwKLTB4MDAwM2JhOTcsMHgwMDBiZWI4MCwweDAwMDY1NTkwLDB4MDAwYjJlMDAsCi0weDAwMDMzMjE3LDB4MDAwMDNlYzAsMHgwMDA2NTU5MCwweDAwMGI4ZTQwLAotMHgwMDAzZWQ4MCwweDAwMDQ5MWMwLDB4MDAwNzNmYjAsMHgwMDA3NGM4MCwKLTB4MDAwMjgzYTAsMHgwMDAwMTAwYywweDAwMGVlMzg4LDB4MDAwNDI5NzAsCi0weDAwMDA4MzAxLDB4MDAwMjFlZjIsMHgwMDBiOGYxNCwweDAwMDAwMDBmLAotMHgwMDBjNGQ4ZCwweDAwMDAwMDFiLDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwKLTB4MDAwMDMyYWMsMHgwMDBjMzkxNiwweDAwMDRlZGMyLDB4MDAwNzRjODAsCi0weDAwMDc4ODk4LDB4MDAwMDEwMDAsMHgwMDAzODg5NCwweDAwMDAwMDMyLAotMHgwMDBjNGQ4ZCwweDAwMDkyZTFiLDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwKLTB4MDAwNGVkYzIsMHgwMDBjMTk1NiwweDAwMDA3MjJjLDB4MDAwMzRhMDAsCi0weDAwMDQxNzA1LDB4MDAwOWVkNDAsMHgwMDA1ODczMCwweDAwMDAxNDAwLAotMHgwMDBkNzQ4OCwweDAwMGMzYTAwLDB4MDAwNDhmMDUsMHgwMDAwMDAwMH07Ci0KLXN0YXRpYyBzdHJ1Y3QKLXsgICB1MzIgT2Zmc2V0OwotICAgIHUzMiBTaXplOwotICAgIHUzMiAqcEZpbGw7Ci19IEZpbGxTdGF0W0ZJTExfX0NPVU5UXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAwMDAwMCwgc2l6ZW9mKEZpbGxBcnJheTEpLCBGaWxsQXJyYXkxfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAwMTgwMCwgc2l6ZW9mKEZpbGxBcnJheTIpLCBGaWxsQXJyYXkyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAxMzdmMCwgc2l6ZW9mKEZpbGxBcnJheTMpLCBGaWxsQXJyYXkzfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAyMDAwMCwgc2l6ZW9mKEZpbGxBcnJheTQpLCBGaWxsQXJyYXk0fQotICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eC5jIGIvc291bmQvb3NzL2NzNDZ4eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTFmMGQ5Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9jczQ2eHguYworKysgL2Rldi9udWxsCkBAIC0xLDU0NDQgKzAsMCBAQAotLyoKLSAqCUNyeXN0YWwgU291bmRGdXNpb24gQ1M0Nnh4IGRyaXZlcgotICoKLSAqCUNvcHlyaWdodCAxOTk4LTIwMDEgQ2lycnVzIExvZ2ljIENvcnBvcmF0aW9uIDxwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAqCQkJCQkJPHR3b2xsZXJAY3J5c3RhbC5jaXJydXMuY29tPgotICoJQ29weXJpZ2h0IDE5OTktMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Ci0gKglDb3B5cmlnaHQgMjAwMCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgotICoKLSAqCVRoZSBjb3JlIG9mIHRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIHRoZSBBTFNBIHByb2plY3QgZHJpdmVyIGJ5IAotICoJSmFyb3NsYXYuIFBsZWFzZSBzZW5kIEphcm9zbGF2IHRoZSBjcmVkaXQgZm9yIHRoZSBkcml2ZXIgYW5kIAotICoJcmVwb3J0IGJ1Z3MgaW4gdGhpcyBwb3J0IHRvIDxhbGFuQHJlZGhhdC5jb20+Ci0gKgotICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKglDdXJyZW50IG1haW50YWluZXJzOgotICoJCUNpcnJ1cyBMb2dpYyBDb3Jwb3JhdGlvbiwgVGhvbWFzIFdvbGxlciAodHcpCi0gKgkJCTx0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAqCQlOaWxzIEZhZXJiZXIgKG5mKQotICoJCQk8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4KLSAqCQlUaGFua3MgdG8gRGF2aWQgUG9sbGFyZCBmb3IgdGVzdGluZy4KLSAqCi0gKglDaGFuZ2VzOgotICoJMjAwMDA5MDktbmYJQ2hhbmdlZCBjc19yZWFkLCBjc193cml0ZSBhbmQgZHJhaW5fZGFjCi0gKgkyMDAwMTAyNS10dwlTZXBhcmF0ZSBQbGF5YmFjay9DYXB0dXJlIHN0cnVjdHMgYW5kIGJ1ZmZlcnMuCi0gKgkJCUFkZGVkIFNjYXR0ZXIvR2F0aGVyIHN1cHBvcnQgZm9yIFBsYXliYWNrLgotICoJCQlBZGRlZCBDYXB0dXJlLgotICoJMjAwMDEwMjctbmYJUG9ydCB0byBrZXJuZWwgMi40LjAtdGVzdDksIHNvbWUgY2xlYW4tdXBzCi0gKgkJCVN0YXJ0IG9mIHBvd2VybWFuYWdlbWVudCBzdXBwb3J0IChDUzQ2WFhfUE0pLgotICoJMjAwMDExMjgtdHcJQWRkIG1vZHVsZSBwYXJtIGZvciBkZWZhdWx0IGJ1ZmZlciBvcmRlci4KLSAqCQkJYWRkZWQgRE1BX0dGUCBmbGFnIHRvIGttYWxsb2MgZG1hIGJ1ZmZlciBhbGxvY3MuCi0gKgkJCWJhY2tmaWxsIHNpbGVuY2UgdG8gZWxpbWluYXRlIHN0dXR0ZXJpbmcgb24KLSAqCQkJdW5kZXJydW5zLgotICoJMjAwMDEyMDEtdHcJYWRkIHJlc3luY2luZyBvZiBzd3B0ciBvbiB1bmRlcnJ1bnMuCi0gKgkyMDAwMTIwNS10dy1uZglmaXhlZCBHRVRPU1BBQ0UgaW9jdGwoKSBhZnRlciBvcGVuKCkKLSAqCTIwMDEwMTEzLXR3CXBhdGNoIGZyb20gSGFucyBHcm9ibGVyIGdlbmVyYWwgY2xlYW51cC4KLSAqCTIwMDEwMTE3LXR3CTIuNC4wIHBjaSBjbGVhbnVwLCB3cmFwcGVyIGNvZGUgZm9yIDIuMi4xNi0yLjQuMAotICoJMjAwMTAxMTgtdHcJYmFzaWMgUE0gc3VwcG9ydCBmb3IgMi4yLjE2KyBhbmQgMi40LjAvMi40LjIuCi0gKgkyMDAxMDIyOC1kaAlwYXRjaCBmcm9tIERhdmlkIEh1Z2dpbnMgLSBjc191cGRhdGVfcHRyIHJlY3Vyc2lvbi4KLSAqCTIwMDEwNDA5LXR3CWFkZCBoZXJjdWxlcyBnYW1lIHRoZWF0cmUgWFAgYW1wIGNvZGUuCi0gKgkyMDAxMDQyMC10dwljbGVhbnVwIHBvd2VyZG93bi91cCBjb2RlLgotICoJMjAwMTA1MjEtdHcJZWxpbWluYXRlIHBvcHMsIGFuZCBmaXhlcyBmb3IgcG93ZXJkb3duLgotICoJMjAwMTA1MjUtdHcJYWRkZWQgZml4ZXMgZm9yIHRoaW5rcGFkcyB3aXRoIHBvd2VyZG93biBsb2dpYy4KLSAqCTIwMDEwNzIzLXNoICAgICBwYXRjaCBmcm9tIEhvcm1zIChTaW1vbiBIb3JtYW4pIC0KLSAqCSAgICAgICAgICAgICAgICBTT1VORF9QQ01fUkVBRF9CSVRTIHJldHVybnMgYml0cyBhcyBzZXQgaW4gZHJpdmVyCi0gKgkgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYSBsb2dpY2FsIG9yIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuCi0gKgkgICAgICAgICAgICAgICAgVmFyaW91cyBpb2N0bHMgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBkZXZpY2UKLSAqCSAgICAgICAgICAgICAgICBpcyBvcGVuIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgYnV0IG5vdCBib3RoIGJldHRlci4KLSAqCi0gKglTdGF0dXM6Ci0gKglQbGF5YmFjay9DYXB0dXJlIHN1cHBvcnRlZCBmcm9tIDhrLTQ4ay4KLSAqCTE2Qml0IFNpZ25lZCBMRSAmIDhCaXQgVW5zaWduZWQsIHdpdGggTW9ubyBvciBTdGVyZW8gc3VwcG9ydGVkLgotICoKLSAqCUFQTS9QTSAtIDIuMi54IEFQTSBpcyBlbmFibGVkIGFuZCBmdW5jdGlvbmluZyBmaW5lLiBBUE0gY2FuIGFsc28KLSAqCWJlIGVuYWJsZWQgZm9yIDIuNC54IGJ5IG1vZGlmeWluZyB0aGUgQ1M0NlhYX0FDUElfU1VQUE9SVCBtYWNybwotICoJZGVmaW5pdGlvbi4KLSAqCi0gKiAgICAgIEhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCAtIHRoZSBFR1BJTzIgcGluIGNvbnRyb2xzIHRoZSBleHRlcm5hbCBBbXAsCi0gKglzbywgdXNlIHRoZSBkcmFpbi9wb2xhcml0eSB0byBlbmFibGUuICAKLSAqCWhlcmN1bGVzX2VncGlvX2Rpc2FibGUgc2V0IHRvIDEsIHdpbGwgZm9yY2UgYSAwIHRvIEVHUElPRFIuCi0gKgotICoJVlRCIFNhbnRhIENydXogLSB0aGUgR1BJTzcvR1BJTzggb24gdGhlIFNlY29uZGFyeSBDb2RlYyBjb250cm9sCi0gKgl0aGUgZXh0ZXJuYWwgYW1wbGlmaWVyIGZvciB0aGUgImJhY2siIHNwZWFrZXJzLCBzaW5jZSB3ZSBkbyBub3QKLSAqCXN1cHBvcnQgdGhlIHNlY29uZGFyeSBjb2RlYyB0aGVuIHRoaXMgZXh0ZXJuYWwgYW1wIGlzIGFsc28gbm90Ci0gKgl0dXJuZWQgb24uCi0gKi8KLSAKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiY3M0Nnh4cG0uaCIKLSNpbmNsdWRlICJjczQ2eHhfd3JhcHBlci0yNC5oIgotI2luY2x1ZGUgImNzNDYxeC5oIgotCi0vKiBNSURJIGJ1ZmZlciBzaXplcyAqLwotI2RlZmluZSBDU19NSURJSU5CVUYgIDUwMAotI2RlZmluZSBDU19NSURJT1VUQlVGIDUwMAotCi0jZGVmaW5lIEFEQ19SVU5OSU5HCTEKLSNkZWZpbmUgREFDX1JVTk5JTkcJMgotCi0jZGVmaW5lIENTX0ZNVF8xNkJJVAkxCQkvKiBUaGVzZSBhcmUgZml4ZWQgaW4gZmFjdCAqLwotI2RlZmluZSBDU19GTVRfU1RFUkVPCTIKLSNkZWZpbmUgQ1NfRk1UX01BU0sJMwotCi0jZGVmaW5lIENTX1RZUEVfQURDCTEKLSNkZWZpbmUgQ1NfVFlQRV9EQUMJMgotCi0jZGVmaW5lIENTX1RSVUUgCTEKLSNkZWZpbmUgQ1NfRkFMU0UgCTAKLQotI2RlZmluZSBDU19JTkNfVVNFX0NPVU5UKG0pIChhdG9taWNfaW5jKG0pKQotI2RlZmluZSBDU19ERUNfVVNFX0NPVU5UKG0pIChhdG9taWNfZGVjKG0pKQotI2RlZmluZSBDU19ERUNfQU5EX1RFU1QobSkgKGF0b21pY19kZWNfYW5kX3Rlc3QobSkpCi0jZGVmaW5lIENTX0lOX1VTRShtKSAoYXRvbWljX3JlYWQobSkgIT0gMCkKLQotI2RlZmluZSBDU19EQkdCUkVBS1BPSU5UIHtfX2FzbV9fKCJJTlQgJDMiKTt9Ci0vKgotICoJQ1M0NjF4IGRlZmluaXRpb25zCi0gKi8KLSAKLSNkZWZpbmUgQ1M0NjFYX0JBMF9TSVpFCQkweDIwMDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9EQVRBMF9TSVpFCTB4MzAwMAotI2RlZmluZSBDUzQ2MVhfQkExX0RBVEExX1NJWkUJMHgzODAwCi0jZGVmaW5lIENTNDYxWF9CQTFfUFJHX1NJWkUJMHg3MDAwCi0jZGVmaW5lIENTNDYxWF9CQTFfUkVHX1NJWkUJMHgwMTAwCi0KLSNkZWZpbmUgR09GX1BFUl9TRUMJMjAwCi0KLSNkZWZpbmUgQ1NERUJVR19JTlRFUkZBQ0UgMQotI2RlZmluZSBDU0RFQlVHIDEKLS8qCi0gKiBUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgY29tcGlsYXRpb24gYnkgdXNpbmcgMS8wIHJlc3BlY3RpdmVseSBmb3IgQ1NERUJVRwotICoKLSAqCi0gKiBDU0RFQlVHIGlzIHVzdWFsIG1vZGUgaXMgc2V0IHRvIDEsIHRoZW4gdXNlIHRoZQotICogY3NfZGVidWdsZXZlbCBhbmQgY3NfZGVidWdtYXNrIHRvIHR1cm4gb24gb3Igb2ZmIGRlYnVnZ2luZy4KLSAqIERlYnVnIGxldmVsIG9mIDEgaGFzIGJlZW4gZGVmaW5lZCB0byBiZSBrZXJuZWwgZXJyb3JzIGFuZCBpbmZvCi0gKiB0aGF0IHNob3VsZCBiZSBwcmludGVkIG9uIGFueSByZWxlYXNlZCBkcml2ZXIuCi0gKi8KLSNpZiBDU0RFQlVHCi0jZGVmaW5lIENTX0RCR09VVChtYXNrLGxldmVsLHgpIGlmICgoY3NfZGVidWdsZXZlbCA+PSAobGV2ZWwpKSAmJiAoKG1hc2spICYgY3NfZGVidWdtYXNrKSkge3g7fQotI2Vsc2UKLSNkZWZpbmUgQ1NfREJHT1VUKG1hc2ssbGV2ZWwseCkgCi0jZW5kaWYKLS8qCi0gKiBjc19kZWJ1Z21hc2sgYXJlYXMKLSAqLwotI2RlZmluZSBDU19JTklUCSAJMHgwMDAwMDAwMQkJLyogaW5pdGlhbGl6YXRpb24gYW5kIHByb2JlIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBDU19FUlJPUiAJMHgwMDAwMDAwMgkJLyogdG1wIGRlYnVnZ2luZyBiaXQgcGxhY2Vob2xkZXIgKi8KLSNkZWZpbmUgQ1NfSU5URVJSVVBUCTB4MDAwMDAwMDQJCS8qIGludGVycnVwdCBoYW5kbGVyIChzZXBhcmF0ZSBmcm9tIGFsbCBvdGhlcikgKi8KLSNkZWZpbmUgQ1NfRlVOQ1RJT04gCTB4MDAwMDAwMDgJCS8qIGVudGVyL2xlYXZlIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBDU19XQVZFX1dSSVRFIAkweDAwMDAwMDEwCQkvKiB3cml0ZSBpbmZvcm1hdGlvbiBmb3Igd2F2ZSAqLwotI2RlZmluZSBDU19XQVZFX1JFQUQgCTB4MDAwMDAwMjAJCS8qIHJlYWQgaW5mb3JtYXRpb24gZm9yIHdhdmUgKi8KLSNkZWZpbmUgQ1NfTUlESV9XUklURSAJMHgwMDAwMDA0MAkJLyogd3JpdGUgaW5mb3JtYXRpb24gZm9yIG1pZGkgKi8KLSNkZWZpbmUgQ1NfTUlESV9SRUFEIAkweDAwMDAwMDgwCQkvKiByZWFkIGluZm9ybWF0aW9uIGZvciBtaWRpICovCi0jZGVmaW5lIENTX01QVTQwMV9XUklURSAweDAwMDAwMTAwCQkvKiB3cml0ZSBpbmZvcm1hdGlvbiBmb3IgbXB1NDAxICovCi0jZGVmaW5lIENTX01QVTQwMV9SRUFEIAkweDAwMDAwMjAwCQkvKiByZWFkIGluZm9ybWF0aW9uIGZvciBtcHU0MDEgKi8KLSNkZWZpbmUgQ1NfT1BFTgkJMHgwMDAwMDQwMAkJLyogYWxsIG9wZW4gZnVuY3Rpb25zIGluIHRoZSBkcml2ZXIgKi8KLSNkZWZpbmUgQ1NfUkVMRUFTRQkweDAwMDAwODAwCQkvKiBhbGwgcmVsZWFzZSBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlciAqLwotI2RlZmluZSBDU19QQVJNUwkweDAwMDAxMDAwCQkvKiBmdW5jdGlvbmFsIGFuZCBvcGVyYXRpb25hbCBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIENTX0lPQ1RMCTB4MDAwMDIwMDAJCS8qIGlvY3RsIChub24tbWl4ZXIpICovCi0jZGVmaW5lIENTX1BNCQkweDAwMDA0MDAwCQkvKiBQTSAqLwotI2RlZmluZSBDU19UTVAJCTB4MTAwMDAwMDAJCS8qIHRtcCBkZWJ1ZyBtYXNrIGJpdCAqLwotCi0jZGVmaW5lIENTX0lPQ1RMX0NNRF9TVVNQRU5ECTB4MQkvLyBzdXNwZW5kCi0jZGVmaW5lIENTX0lPQ1RMX0NNRF9SRVNVTUUJMHgyCS8vIHJlc3VtZQotCi0jaWYgQ1NERUJVRwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3NfZGVidWdsZXZlbCA9IDE7CQkJLyogbGV2ZWxzIHJhbmdlIGZyb20gMS05ICovCi1tb2R1bGVfcGFyYW0oY3NfZGVidWdsZXZlbCwgdWxvbmcsIDA2NDQpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3NfZGVidWdtYXNrID0gQ1NfSU5JVCB8IENTX0VSUk9SOwkvKiB1c2UgQ1NfREJHT1VUIHdpdGggdmFyaW91cyBtYXNrIHZhbHVlcyAqLwotbW9kdWxlX3BhcmFtKGNzX2RlYnVnbWFzaywgdWxvbmcsIDA2NDQpOwotI2VuZGlmCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBoZXJjdWxlc19lZ3Bpb19kaXNhYmxlOyAgLyogaWYgbm9uLXplcm8gc2V0IGFsbCBFR1BJTyB0byAwICovCi1tb2R1bGVfcGFyYW0oaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSwgdWxvbmcsIDApOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5pdGRlbGF5ID0gNzAwOyAgLyogUE0gZGVsYXkgaW4gbWlsbGlzZWNzICovCi1tb2R1bGVfcGFyYW0oaW5pdGRlbGF5LCB1bG9uZywgMCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwb3dlcmRvd24gPSAtMTsgIC8qIHR1cm4gb24vb2ZmIHBvd2VyZG93biBwcm9jZXNzaW5nIGluIGRyaXZlciAqLwotbW9kdWxlX3BhcmFtKHBvd2VyZG93biwgdWxvbmcsIDApOwotI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSIDMKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7Ci1tb2R1bGVfcGFyYW0oZGVmYXVsdG9yZGVyLCB1bG9uZywgMCk7Ci0KLXN0YXRpYyBpbnQgZXh0ZXJuYWxfYW1wOwotbW9kdWxlX3BhcmFtKGV4dGVybmFsX2FtcCwgYm9vbCwgMCk7Ci1zdGF0aWMgaW50IHRoaW5rcGFkOwotbW9kdWxlX3BhcmFtKHRoaW5rcGFkLCBib29sLCAwKTsKLQotLyoKLSogc2V0IHRoZSBwb3dlcmRvd24gbW9kdWxlIHBhcm0gdG8gMCB0byBkaXNhYmxlIGFsbCAKLSogcG93ZXJkb3duLiBhbHNvIHNldCB0aGlua3BhZCB0byAxIHRvIGRpc2FibGUgcG93ZXJkb3duLCAKLSogYnV0IGFsc28gdG8gZW5hYmxlIHRoZSBjbGtydW4gZnVuY3Rpb25hbGl0eS4KLSovCi1zdGF0aWMgdW5zaWduZWQgY3NfcG93ZXJkb3duID0gMTsKLXN0YXRpYyB1bnNpZ25lZCBjc19sYXB0b3Bfd2FpdCA9IDE7Ci0KLS8qIEFuIGluc3RhbmNlIG9mIHRoZSA0NjEwIGNoYW5uZWwgKi8KLXN0cnVjdCBjc19jaGFubmVsIAotewotCWludCB1c2VkOwotCWludCBudW07Ci0Jdm9pZCAqc3RhdGU7Ci19OwotCi0jZGVmaW5lIENTNDZYWF9NQUpPUl9WRVJTSU9OICIxIgotI2RlZmluZSBDUzQ2WFhfTUlOT1JfVkVSU0lPTiAiMjgiCi0KLSNpZmRlZiBfX2lhNjRfXwotI2RlZmluZSBDUzQ2WFhfQVJDSAkgICAgIAkiNjQiCS8vYXJjaGl0ZWN0dXJlIGtleQotI2Vsc2UKLSNkZWZpbmUgQ1M0NlhYX0FSQ0gJICAgICAJIjMyIgkvL2FyY2hpdGVjdHVyZSBrZXkKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjczQ2eHhfZGV2cyA9IHsgJmNzNDZ4eF9kZXZzLCAmY3M0Nnh4X2RldnMgfTsKLQotLyogbWFnaWMgbnVtYmVycyB0byBwcm90ZWN0IG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgQ1NfQ0FSRF9NQUdJQwkJMHg0MzUyNTU1MyAvKiAiQ1JVUyIgKi8KLSNkZWZpbmUgQ1NfU1RBVEVfTUFHSUMJCTB4NGM0ZjQ3NDkgLyogIkxPR0kiICovCi0jZGVmaW5lIE5SX0hXX0NICQkzCi0KLS8qIG1heGludW0gbnVtYmVyIG9mIEFDOTcgY29kZWNzIGNvbm5lY3RlZCwgQUM5NyAyLjAgZGVmaW5lZCA0ICovCi0jZGVmaW5lIE5SX0FDOTcJCTIKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2hpZnRbXSA9IHsgMCwgMSwgMSwgMiB9OwotCi0vKiAic29mdHdhcmUiIG9yIHZpcnR1YWwgY2hhbm5lbCwgYW4gaW5zdGFuY2Ugb2Ygb3BlbmVkIC9kZXYvZHNwICovCi1zdHJ1Y3QgY3Nfc3RhdGUgewotCXVuc2lnbmVkIGludCBtYWdpYzsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCi0KLQkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KLQlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7Ci0KLQkvKiBmaWxlIG1vZGUgKi8KLQltb2RlX3Qgb3Blbl9tb2RlOwotCi0JLyogdmlydHVhbCBjaGFubmVsIG51bWJlciAqLwotCWludCB2aXJ0OwotCQotCXN0cnVjdCBkbWFidWYgewotCQkvKiB3YXZlIHNhbXBsZSBzdHVmZiAqLwotCQl1bnNpZ25lZCBpbnQgcmF0ZTsKLQkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZTsKLQotCQkvKiBoYXJkd2FyZSBjaGFubmVsICovCi0JCXN0cnVjdCBjc19jaGFubmVsICpjaGFubmVsOwotCQlpbnQgcHJpbmdidWY7CQkvKiBTb2Z0d2FyZSByaW5nIHNsb3QgKi8KLQkJdm9pZCAqcGJ1ZjsJCS8qIDRLIGhhcmR3YXJlIERNQSBidWZmZXIgKi8KLQotCQkvKiBPU1MgYnVmZmVyIG1hbmFnZW1lbnQgc3R1ZmYgKi8KLQkJdm9pZCAqcmF3YnVmOwotCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7Ci0JCXVuc2lnbmVkIGJ1Zm9yZGVyOwotCQl1bnNpZ25lZCBudW1mcmFnOwotCQl1bnNpZ25lZCBmcmFnc2hpZnQ7Ci0JCXVuc2lnbmVkIGRpdmlzb3I7Ci0JCXVuc2lnbmVkIHR5cGU7Ci0JCXZvaWQgKnRtcGJ1ZmY7CQkJLyogdG1wIGJ1ZmZlciBmb3Igc2FtcGxlIGNvbnZlcnNpb25zICovCi0JCWRtYV9hZGRyX3QgZG1hYWRkcjsKLQkJZG1hX2FkZHJfdCBkbWFhZGRyX3RtcGJ1ZmY7Ci0JCXVuc2lnbmVkIGJ1Zm9yZGVyX3RtcGJ1ZmY7CS8qIExvZyBiYXNlIDIgb2Ygc2l6ZSBpbiBieXRlcy4uICovCi0KLQkJLyogb3VyIGJ1ZmZlciBhY3RzIGxpa2UgYSBjaXJjdWxhciByaW5nICovCi0JCXVuc2lnbmVkIGh3cHRyOwkJLyogd2hlcmUgZG1hIGxhc3Qgc3RhcnRlZCwgdXBkYXRlZCBieSB1cGRhdGVfcHRyICovCi0JCXVuc2lnbmVkIHN3cHRyOwkJLyogd2hlcmUgZHJpdmVyIGxhc3QgY2xlYXIvZmlsbGVkLCB1cGRhdGVkIGJ5IHJlYWQvd3JpdGUgKi8KLQkJaW50IGNvdW50OwkJLyogYnl0ZXMgdG8gYmUgY29tc3VtZWQgb3IgYmVlbiBnZW5lcmF0ZWQgYnkgZG1hIG1hY2hpbmUgKi8KLQkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIGRtYWVkIGJ5IGhhcmR3YXJlICovCi0JCXVuc2lnbmVkIGJsb2NrczsJLyogdG90YWwgYmxvY2tzICovCi0KLQkJdW5zaWduZWQgZXJyb3I7CQkvKiBudW1iZXIgb2Ygb3Zlci91bmRlcnJ1bnMgKi8KLQkJdW5zaWduZWQgdW5kZXJydW47CS8qIHVuZGVycnVuIHBlbmRpbmcgYmVmb3JlIG5leHQgd3JpdGUgaGFzIG9jY3VycmVkICovCi0JCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CS8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLwotCi0JCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KLQkJdW5zaWduZWQgZnJhZ3NpemU7Ci0JCXVuc2lnbmVkIGRtYXNpemU7Ci0JCXVuc2lnbmVkIGZyYWdzYW1wbGVzOwotCi0JCS8qIE9TUyBzdHVmZiAqLwotCQl1bnNpZ25lZCBtYXBwZWQ6MTsKLQkJdW5zaWduZWQgcmVhZHk6MTsKLQkJdW5zaWduZWQgZW5kY2xlYXJlZDoxOwotCQl1bnNpZ25lZCBTR29rOjE7Ci0JCXVuc2lnbmVkIHVwZGF0ZV9mbGFnOwotCQl1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7Ci0JCWludCBvc3NtYXhmcmFnczsKLQkJdW5zaWduZWQgc3ViZGl2aXNpb247Ci0JfSBkbWFidWY7Ci0JLyogR3VhcmQgYWdhaW5zdCBtbWFwL3dyaXRlL3JlYWQgcmFjZXMgKi8KLQlzdHJ1Y3QgbXV0ZXggc2VtOwotfTsKLQotc3RydWN0IGNzX2NhcmQgewotCXN0cnVjdCBjc19jaGFubmVsIGNoYW5uZWxbMl07Ci0JdW5zaWduZWQgaW50IG1hZ2ljOwotCi0JLyogV2Uga2VlcCBjczQ2MXggY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLwotCXN0cnVjdCBjc19jYXJkICpuZXh0OwotCi0JLyogVGhlIGNzNDYxeCBoYXMgYSBjZXJ0YWluIGFtb3VudCBvZiBjcm9zcyBjaGFubmVsIGludGVyYWN0aW9uCi0JICAgc28gd2UgdXNlIGEgc2luZ2xlIHBlciBjYXJkIGxvY2sgKi8KLQlzcGlubG9ja190IGxvY2s7Ci0JCi0JLyogS2VlcCBBQzk3IHNhbmUgKi8KLQlzcGlubG9ja190IGFjOTdfbG9jazsKLQotCS8qIG1peGVyIHVzZSBjb3VudCAqLwotCWF0b21pY190IG1peGVyX3VzZV9jbnQ7Ci0KLQkvKiBQQ0kgZGV2aWNlIHN0dWZmICovCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0JdW5zaWduZWQgaW50IHBjdGwsIGNjdGw7CS8qIEhhcmR3YXJlIERNQSBmbGFnIHNldHMgKi8KLQotCS8qIHNvdW5kY29yZSBzdHVmZiAqLwotCWludCBkZXZfYXVkaW87Ci0JaW50IGRldl9taWRpOwotCi0JLyogc3RydWN0dXJlcyBmb3IgYWJzdHJhY3Rpb24gb2YgaGFyZHdhcmUgZmFjaWxpdGllcywgY29kZWNzLCBiYW5rcyBhbmQgY2hhbm5lbHMqLwotCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjW05SX0FDOTddOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGVzWzJdOwotCi0JdTE2IGFjOTdfZmVhdHVyZXM7Ci0JCi0JaW50IGFtcGxpZmllcjsJCQkvKiBBbXBsaWZpZXIgY29udHJvbCAqLwotCXZvaWQgKCphbXBsaWZpZXJfY3RybCkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKLQl2b2lkICgqYW1wX2luaXQpKHN0cnVjdCBjc19jYXJkICopOwotCQotCWludCBhY3RpdmU7CQkJLyogQWN0aXZlIGNsb2NraW5nICovCi0Jdm9pZCAoKmFjdGl2ZV9jdHJsKShzdHJ1Y3QgY3NfY2FyZCAqLCBpbnQpOwotCQotCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLwotCXVuc2lnbmVkIGxvbmcgYmEwX2FkZHI7Ci0JdW5zaWduZWQgbG9uZyBiYTFfYWRkcjsKLQl1MzIgaXJxOwotCQotCS8qIG1hcHBpbmdzICovCi0Jdm9pZCBfX2lvbWVtICpiYTA7Ci0JdW5pb24KLQl7Ci0JCXN0cnVjdAotCQl7Ci0JCQl1OCBfX2lvbWVtICpkYXRhMDsKLQkJCXU4IF9faW9tZW0gKmRhdGExOwotCQkJdTggX19pb21lbSAqcG1lbTsKLQkJCXU4IF9faW9tZW0gKnJlZzsKLQkJfSBuYW1lOwotCQl1OCBfX2lvbWVtICppZHhbNF07Ci0JfSBiYTE7Ci0JCi0JLyogRnVuY3Rpb24gc3VwcG9ydCAqLwotCXN0cnVjdCBjc19jaGFubmVsICooKmFsbG9jX3BjbV9jaGFubmVsKShzdHJ1Y3QgY3NfY2FyZCAqKTsKLQlzdHJ1Y3QgY3NfY2hhbm5lbCAqKCphbGxvY19yZWNfcGNtX2NoYW5uZWwpKHN0cnVjdCBjc19jYXJkICopOwotCXZvaWQgKCpmcmVlX3BjbV9jaGFubmVsKShzdHJ1Y3QgY3NfY2FyZCAqLCBpbnQgY2hhbik7Ci0KLQkvKiAvZGV2L21pZGkgc3R1ZmYgKi8KLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBpcmQsIGl3ciwgaWNudDsKLQkJdW5zaWduZWQgb3JkLCBvd3IsIG9jbnQ7Ci0JCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKLQkJd2FpdF9xdWV1ZV9oZWFkX3QgaXdhaXQ7Ci0JCXdhaXRfcXVldWVfaGVhZF90IG93YWl0OwotCQlzcGlubG9ja190IGxvY2s7Ci0JCXVuc2lnbmVkIGNoYXIgaWJ1ZltDU19NSURJSU5CVUZdOwotCQl1bnNpZ25lZCBjaGFyIG9idWZbQ1NfTUlESU9VVEJVRl07Ci0JCW1vZGVfdCBvcGVuX21vZGU7Ci0JCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwotCX0gbWlkaTsKLQlzdHJ1Y3QgY3M0Nnh4X3BtIHBtOwotfTsKLQotc3RhdGljIGludCBjc19vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGNzX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgY3NfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJdW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIGludCBjc19oYXJkd2FyZV9pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKTsKLXN0YXRpYyBpbnQgY3M0Nnh4X3Bvd2VydXAoc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgY3M0NjF4X3Bvd2VyZG93bihzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHR5cGUsIGludCBzdXNwZW5kZmxhZyk7Ci1zdGF0aWMgdm9pZCBjczQ2MXhfY2xlYXJfc2VyaWFsX0ZJRk9zKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgdHlwZSk7Ci0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGNzNDZ4eF9zdXNwZW5kX3RibChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCBjczQ2eHhfcmVzdW1lX3RibChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KTsKLSNlbmRpZgotCi0jaWYgQ1NERUJVRwotCi0vKiBERUJVRyBST1VUSU5FUyAqLwotCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMIAlfU0lPV1IoJ00nLDEyMCwgaW50KQotI2RlZmluZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCAJX1NJT1dSKCdNJywxMjEsIGludCkKLSNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSyAJX1NJT1dSKCdNJywxMjIsIGludCkKLSNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSyAJX1NJT1dSKCdNJywxMjMsIGludCkKLSNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfQVBNCSAJX1NJT1dSKCdNJywxMjQsIGludCkKLQotc3RhdGljIHZvaWQgcHJpbnRpb2N0bCh1bnNpZ25lZCBpbnQgeCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyIHZpZHg7Ci0JLyogdGhlc2UgdmFsdWVzIGFyZSBpbmNvcnJlY3QgZm9yIHRoZSBhYzk3IGRyaXZlciwgZml4LgotICAgICAgICAgKiBJbmRleCBvZiBtaXh0YWJsZTFbXSBtZW1iZXIgaXMgRGV2aWNlIElEIAotICAgICAgICAgKiBhbmQgbXVzdCBiZSA8PSBTT1VORF9NSVhFUl9OUkRFVklDRVMuCi0gICAgICAgICAqIFZhbHVlIG9mIGFycmF5IG1lbWJlciBpcyBpbmRleCBpbnRvIHMtPm1peC52b2xbXQotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWl4dGFibGUxW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7Ci0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX1BDTV0gICAgID0gMSwgICAvKiB2b2ljZSAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9MSU5FMV0gICA9IDIsICAgLyogQVVYICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX0NEXSAgICAgID0gMywgICAvKiBDRCAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9MSU5FXSAgICA9IDQsICAgLyogTGluZSAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9TWU5USF0gICA9IDUsICAgLyogRk0gKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTUlDXSAgICAgPSA2LCAgIC8qIE1pYyAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9TUEVBS0VSXSA9IDcsICAgLyogU3BlYWtlciAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9SRUNMRVZdICA9IDgsICAgLyogUmVjb3JkaW5nIGxldmVsICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX1ZPTFVNRV0gID0gOSAgICAvKiBNYXN0ZXIgVm9sdW1lICovCi0gICAgICAgIH07Ci0gICAgICAgIAotICAgIHN3aXRjaCAoeCkgewotCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6ICIpICk7Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDogIikgKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSzogIikgKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBPU1NfR0VUVkVSU0lPTjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIk9TU19HRVRWRVJTSU9OOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NZTkM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NZTkM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVREVVBMRVg6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQ0FQUzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUkVTRVQ6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NQRUVEOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1RFUkVPOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMUzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VURk1UUzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IAotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRGTVQ6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfUE9TVDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUE9TVDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFRSSUdHRVI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPU1BBQ0U6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX05PTkJMT0NLOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT0RFTEFZOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1BUUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRCTEtTSVpFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NVQkRJVklERTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX1JBVEU6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9CSVRTOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1dSSVRFX0ZJTFRFUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNZTkNSTzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfRklMVEVSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEUxOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEUyOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEUzOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEU0OiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEU1OiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9JTkZPOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfSU5GTzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfT0xEX01JWEVSX0lORk86Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9PTERfTUlYRVJfSU5GTzogIikgKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc3dpdGNoIChfSU9DX05SKHgpKSB7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfVk9MVU1FOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9TUEVBS0VSOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9TUEVBS0VSOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNMRVY6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1JFQ0xFVjogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfTUlDOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9NSUM6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9TWU5USDogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUkVDU1JDOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9ERVZNQVNLOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNNQVNLOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfU1RFUkVPREVWUzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ0FQUzoiKSApOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpID0gX0lPQ19OUih4KTsKLQkJCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkgewotCQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiVU5LTk9XTiBJT0NUTDogMHglLjh4IE5SPSVkICIseCxpKSApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JT0NUTCBBQzl4OiAweCUuOHggTlI9JWQgIiwKLQkJCQkJCQl4LGkpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLSAgICB9Ci0gICAgQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoImNvbW1hbmQgPSAweCV4IElPQ19OUj0lZFxuIix4LCBfSU9DX05SKHgpKSApOwotfQotI2VuZGlmCi0KLS8qCi0gKiAgY29tbW9uIEkvTyByb3V0aW5lcwotICovCi0KLXN0YXRpYyB2b2lkIGNzNDYxeF9wb2tlKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2YWwpCi17Ci0Jd3JpdGVsKHZhbCwgY29kZWMtPmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXSArIChyZWcgJiAweGZmZmYpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjczQ2MXhfcGVlayhzdHJ1Y3QgY3NfY2FyZCAqY29kZWMsIHVuc2lnbmVkIGxvbmcgcmVnKQotewotCXJldHVybiByZWFkbChjb2RlYy0+YmExLmlkeFsocmVnID4+IDE2KSAmIDNdICsgKHJlZyAmIDB4ZmZmZikpOwotfQotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcG9rZUJBMChzdHJ1Y3QgY3NfY2FyZCAqY29kZWMsIHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCXdyaXRlbCh2YWwsIGNvZGVjLT5iYTAgKyByZWcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzNDYxeF9wZWVrQkEwKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcpCi17Ci0JcmV0dXJuIHJlYWRsKGNvZGVjLT5iYTAgKyByZWcpOwotfQotCi0KLXN0YXRpYyB1MTYgY3NfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKTsKLXN0YXRpYyB2b2lkIGNzX2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IGRhdGEpOwotCi1zdGF0aWMgc3RydWN0IGNzX2NoYW5uZWwgKmNzX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWlmIChjYXJkLT5jaGFubmVsWzFdLnVzZWQgPT0gMSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2FyZC0+Y2hhbm5lbFsxXS51c2VkID0gMTsKLQljYXJkLT5jaGFubmVsWzFdLm51bSA9IDE7Ci0JcmV0dXJuICZjYXJkLT5jaGFubmVsWzFdOwotfQotCi1zdGF0aWMgc3RydWN0IGNzX2NoYW5uZWwgKmNzX2FsbG9jX3JlY19wY21fY2hhbm5lbChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpZiAoY2FyZC0+Y2hhbm5lbFswXS51c2VkID09IDEpCi0JCXJldHVybiBOVUxMOwotCWNhcmQtPmNoYW5uZWxbMF0udXNlZCA9IDE7Ci0JY2FyZC0+Y2hhbm5lbFswXS5udW0gPSAwOwotCXJldHVybiAmY2FyZC0+Y2hhbm5lbFswXTsKLX0KLQotc3RhdGljIHZvaWQgY3NfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5uZWwpCi17Ci0JY2FyZC0+Y2hhbm5lbFtjaGFubmVsXS5zdGF0ZSA9IE5VTEw7Ci0JY2FyZC0+Y2hhbm5lbFtjaGFubmVsXS51c2VkID0gMDsKLX0KLQotLyoKLSAqIHNldHVwIGEgZGl2aXNvciB2YWx1ZSB0byBoZWxwIHdpdGggY29udmVyc2lvbiBmcm9tCi0gKiAxNmJpdCBTdGVyZW8sIGRvd24gdG8gOGJpdCBzdGVyZW8vbW9ubyBvciAxNmJpdCBtb25vLgotICogYXNzaWduIGEgZGl2aXNvciBvZiAxIGlmIHVzaW5nIDE2Yml0IFN0ZXJlbyBhcyB0aGF0IGlzCi0gKiB0aGUgb25seSBmb3JtYXQgdGhhdCB0aGUgc3RhdGljIGltYWdlIHdpbGwgY2FwdHVyZS4KLSAqLwotc3RhdGljIHZvaWQgY3Nfc2V0X2Rpdmlzb3Ioc3RydWN0IGRtYWJ1ZiAqZG1hYnVmKQotewotCWlmIChkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9EQUMpCi0JCWRtYWJ1Zi0+ZGl2aXNvciA9IDE7Ci0JZWxzZSBpZiAoIShkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmCi0JICAgIChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkpCi0JCWRtYWJ1Zi0+ZGl2aXNvciA9IDI7Ci0JZWxzZSBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgJiYKLQkgICAgIShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkpCi0JCWRtYWJ1Zi0+ZGl2aXNvciA9IDI7Ci0JZWxzZSBpZiAoIShkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmCi0JICAgICEoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKQotCQlkbWFidWYtPmRpdmlzb3IgPSA0OwotCWVsc2UKLQkJZG1hYnVmLT5kaXZpc29yID0gMTsKLQotCUNTX0RCR09VVChDU19QQVJNUyB8IENTX0ZVTkNUSU9OLCA4LCBwcmludGsoCi0JCSJjczQ2eHg6IGNzX3NldF9kaXZpc29yKCktICVzICVkXG4iLAotCQkJKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0FEQykgPyAiQURDIiA6ICJEQUMiLCAKLQkJCWRtYWJ1Zi0+ZGl2aXNvcikgKTsKLX0KLQotLyoKLSogbXV0ZSBzb21lIG9mIHRoZSBtb3JlIHByZXZhbGVudCByZWdpc3RlcnMgdG8gYXZvaWQgcG9wcGluZy4KLSovCi1zdGF0aWMgdm9pZCBjc19tdXRlKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgc3RhdGUpIAotewotCXN0cnVjdCBhYzk3X2NvZGVjICpkZXYgPSBjYXJkLT5hYzk3X2NvZGVjWzBdOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX211dGUoKSsgJXNcbiIsCi0JCShzdGF0ZSA9PSBDU19UUlVFKSA/ICJNdXRpbmciIDogIlVuTXV0aW5nIikpOwotCi0JaWYgKHN0YXRlID09IENTX1RSVUUpIHsKLQkvKgotCSogZml4IHBvcHMgd2hlbiBwb3dlcmluZyB1cCBvbiB0aGlua3BhZHMKLQkqLwotCQljYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KCBkZXYsIAotCQkJCSh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FKTsgCi0JCWNhcmQtPnBtLnUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAKLQkJCQkodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSk7IAotCQljYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubyA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAKLQkJCQkodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PKTsgCi0JCWNhcmQtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkJKHU4KUJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FKTsKLQkJCQotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FLCAweDgwMDApOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCAweDgwMDApOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8sIDB4ODAwMCk7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FLCAweDgwMDApOwotCX0gZWxzZSB7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUsIGNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZSk7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsIGNhcmQtPnBtLnUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSk7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTywgY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8pOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19wY21fb3V0X3ZvbHVtZSk7Ci0JfQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19tdXRlKCktXG4iKSk7Ci19Ci0KLS8qIHNldCBwbGF5YmFjayBzYW1wbGUgcmF0ZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjc19zZXRfZGFjX3JhdGUoc3RydWN0IGNzX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQotewkKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQl1bnNpZ25lZCBpbnQgdG1wMSwgdG1wMjsKLQl1bnNpZ25lZCBpbnQgcGhpSW5jcjsKLQl1bnNpZ25lZCBpbnQgY29ycmVjdGlvblBlckdPRiwgY29ycmVjdGlvblBlclNlYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfc2V0X2RhY19yYXRlKCkrICVkXG4iLHJhdGUpICk7Ci0KLQkvKgotCSAqICBDb21wdXRlIHRoZSB2YWx1ZXMgdXNlZCB0byBkcml2ZSB0aGUgYWN0dWFsIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCi0JICogIFRoZSBmb2xsb3dpbmcgZm9ybXVsYXMgYXJlIGJlaW5nIGNvbXB1dGVkLCB1c2luZyBpbmxpbmUgYXNzZW1ibHkKLQkgKiAgc2luY2Ugd2UgbmVlZCB0byB1c2UgNjQgYml0IGFyaXRobWV0aWMgdG8gY29tcHV0ZSB0aGUgdmFsdWVzOgotCSAqCi0JICogIHBoaUluY3IgPSBmbG9vcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKLQkgKiAgY29ycmVjdGlvblBlckdPRiA9IGZsb29yKChGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyKSAvCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT0ZfUEVSX1NFQykKLSAgICAgICAgICogIHVsQ29ycmVjdGlvblBlclNlYyA9IEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IgLU0KLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDICogY29ycmVjdGlvblBlckdPRgotCSAqCi0JICogIGkuZS4KLQkgKgotCSAqICBwaGlJbmNyOm90aGVyID0gZGl2aWRlbmQ6cmVtYWluZGVyKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQotCSAqICBjb3JyZWN0aW9uUGVyR09GOmNvcnJlY3Rpb25QZXJTZWMgPQotCSAqICAgICAgZGl2aWRlbmQ6cmVtYWluZGVyKHVsT3RoZXIgLyBHT0ZfUEVSX1NFQykKLQkgKi8KLQl0bXAxID0gcmF0ZSA8PCAxNjsKLQlwaGlJbmNyID0gdG1wMSAvIDQ4MDAwOwotCXRtcDEgLT0gcGhpSW5jciAqIDQ4MDAwOwotCXRtcDEgPDw9IDEwOwotCXBoaUluY3IgPDw9IDEwOwotCXRtcDIgPSB0bXAxIC8gNDgwMDA7Ci0JcGhpSW5jciArPSB0bXAyOwotCXRtcDEgLT0gdG1wMiAqIDQ4MDAwOwotCWNvcnJlY3Rpb25QZXJHT0YgPSB0bXAxIC8gR09GX1BFUl9TRUM7Ci0JdG1wMSAtPSBjb3JyZWN0aW9uUGVyR09GICogR09GX1BFUl9TRUM7Ci0JY29ycmVjdGlvblBlclNlYyA9IHRtcDE7Ci0KLQkvKgotCSAqICBGaWxsIGluIHRoZSBTYW1wbGVSYXRlQ29udmVydGVyIGNvbnRyb2wgYmxvY2suCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JY3M0NjF4X3Bva2Uoc3RhdGUtPmNhcmQsIEJBMV9QU1JDLAotCSAgKChjb3JyZWN0aW9uUGVyU2VjIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgKGNvcnJlY3Rpb25QZXJHT0YgJiAweEZGRkYpKTsKLQljczQ2MXhfcG9rZShzdGF0ZS0+Y2FyZCwgQkExX1BQSSwgcGhpSW5jcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlkbWFidWYtPnJhdGUgPSByYXRlOwotCQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9kYWNfcmF0ZSgpLSAlZFxuIixyYXRlKSApOwotCXJldHVybiByYXRlOwotfQotCi0vKiBzZXQgcmVjb3JkaW5nIHNhbXBsZSByYXRlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzX3NldF9hZGNfcmF0ZShzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXVuc2lnbmVkIGludCBwaGlJbmNyLCBjb2VmZkluY3IsIHRtcDEsIHRtcDI7Ci0JdW5zaWduZWQgaW50IGNvcnJlY3Rpb25QZXJHT0YsIGNvcnJlY3Rpb25QZXJTZWMsIGluaXRpYWxEZWxheTsKLQl1bnNpZ25lZCBpbnQgZnJhbWVHcm91cExlbmd0aCwgY250OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfc2V0X2FkY19yYXRlKCkrICVkXG4iLHJhdGUpICk7Ci0KLQkvKgotCSAqICBXZSBjYW4gb25seSBkZWNpbWF0ZSBieSB1cCB0byBhIGZhY3RvciBvZiAxLzl0aCB0aGUgaGFyZHdhcmUgcmF0ZS4KLQkgKiAgQ29ycmVjdCB0aGUgdmFsdWUgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHN0cmF5IG91dHNpZGUgdGhhdCBsaW1pdC4KLQkgKi8KLQlpZiAoKHJhdGUgKiA5KSA8IDQ4MDAwKQotCQlyYXRlID0gNDgwMDAgLyA5OwotCi0JLyoKLQkgKiAgV2UgY2Fubm90IGNhcHR1cmUgYXQgYXQgcmF0ZSBncmVhdGVyIHRoYW4gdGhlIElucHV0IFJhdGUgKDQ4MDAwKS4KLQkgKiAgUmV0dXJuIGFuIGVycm9yIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzdHJheSBvdXRzaWRlIHRoYXQgbGltaXQuCi0JICovCi0JaWYgKHJhdGUgPiA0ODAwMCkKLQkJcmF0ZSA9IDQ4MDAwOwotCi0JLyoKLQkgKiAgQ29tcHV0ZSB0aGUgdmFsdWVzIHVzZWQgdG8gZHJpdmUgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLgotCSAqICBUaGUgZm9sbG93aW5nIGZvcm11bGFzIGFyZSBiZWluZyBjb21wdXRlZCwgdXNpbmcgaW5saW5lIGFzc2VtYmx5Ci0JICogIHNpbmNlIHdlIG5lZWQgdG8gdXNlIDY0IGJpdCBhcml0aG1ldGljIHRvIGNvbXB1dGUgdGhlIHZhbHVlczoKLQkgKgotCSAqICAgICBjb2VmZkluY3IgPSAtZmxvb3IoKEZzLG91dCAqIDJeMjMpIC8gRnMsaW4pCi0JICogICAgIHBoaUluY3IgPSBmbG9vcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKLQkgKiAgICAgY29ycmVjdGlvblBlckdPRiA9IGZsb29yKChGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyKSAvCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDKQotCSAqICAgICBjb3JyZWN0aW9uUGVyU2VjID0gRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jciAtCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDICogY29ycmVjdGlvblBlckdPRgotCSAqICAgICBpbml0aWFsRGVsYXkgPSBjZWlsKCgyNCAqIEZzLGluKSAvIEZzLG91dCkKLQkgKgotCSAqIGkuZS4KLQkgKgotCSAqICAgICBjb2VmZkluY3IgPSBuZWcoZGl2aWRlbmQoKEZzLG91dCAqIDJeMjMpIC8gRnMsaW4pKQotCSAqICAgICBwaGlJbmNyOnVsT3RoZXIgPSBkaXZpZGVuZDpyZW1haW5kZXIoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCi0JICogICAgIGNvcnJlY3Rpb25QZXJHT0Y6Y29ycmVjdGlvblBlclNlYyA9Ci0JICogCSAgICBkaXZpZGVuZDpyZW1haW5kZXIodWxPdGhlciAvIEdPRl9QRVJfU0VDKQotCSAqICAgICBpbml0aWFsRGVsYXkgPSBkaXZpZGVuZCgoKDI0ICogRnMsaW4pICsgRnMsb3V0IC0gMSkgLyBGcyxvdXQpCi0JICovCi0JdG1wMSA9IHJhdGUgPDwgMTY7Ci0JY29lZmZJbmNyID0gdG1wMSAvIDQ4MDAwOwotCXRtcDEgLT0gY29lZmZJbmNyICogNDgwMDA7Ci0JdG1wMSA8PD0gNzsKLQljb2VmZkluY3IgPDw9IDc7Ci0JY29lZmZJbmNyICs9IHRtcDEgLyA0ODAwMDsKLQljb2VmZkluY3IgXj0gMHhGRkZGRkZGRjsKLQljb2VmZkluY3IrKzsKLQl0bXAxID0gNDgwMDAgPDwgMTY7Ci0JcGhpSW5jciA9IHRtcDEgLyByYXRlOwotCXRtcDEgLT0gcGhpSW5jciAqIHJhdGU7Ci0JdG1wMSA8PD0gMTA7Ci0JcGhpSW5jciA8PD0gMTA7Ci0JdG1wMiA9IHRtcDEgLyByYXRlOwotCXBoaUluY3IgKz0gdG1wMjsKLQl0bXAxIC09IHRtcDIgKiByYXRlOwotCWNvcnJlY3Rpb25QZXJHT0YgPSB0bXAxIC8gR09GX1BFUl9TRUM7Ci0JdG1wMSAtPSBjb3JyZWN0aW9uUGVyR09GICogR09GX1BFUl9TRUM7Ci0JY29ycmVjdGlvblBlclNlYyA9IHRtcDE7Ci0JaW5pdGlhbERlbGF5ID0gKCg0ODAwMCAqIDI0KSArIHJhdGUgLSAxKSAvIHJhdGU7Ci0KLQkvKgotCSAqICBGaWxsIGluIHRoZSBWYXJpRGVjaW1hdGUgY29udHJvbCBibG9jay4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DU1JDLAotCQkoKGNvcnJlY3Rpb25QZXJTZWMgPDwgMTYpICYgMHhGRkZGMDAwMCkgfCAoY29ycmVjdGlvblBlckdPRiAmIDB4RkZGRikpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ0ksIGNvZWZmSW5jcik7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NELAotCQkoKChCQTFfVkFSSURFQ19CVUZfMSArIChpbml0aWFsRGVsYXkgPDwgMikpIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgMHg4MCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NQSSwgcGhpSW5jcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiAgRmlndXJlIG91dCB0aGUgZnJhbWUgZ3JvdXAgbGVuZ3RoIGZvciB0aGUgd3JpdGUgYmFjayB0YXNrLiAgQmFzaWNhbGx5LAotCSAqICB0aGlzIGlzIGp1c3QgdGhlIGZhY3RvcnMgb2YgMjQwMDAgKDJeNiozKjVeMykgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4KLQkgKiAgdGhlIG91dHB1dCBzYW1wbGUgcmF0ZS4KLQkgKi8KLQlmcmFtZUdyb3VwTGVuZ3RoID0gMTsKLQlmb3IgKGNudCA9IDI7IGNudCA8PSA2NDsgY250ICo9IDIpIHsKLQkJaWYgKCgocmF0ZSAvIGNudCkgKiBjbnQpICE9IHJhdGUpCi0JCQlmcmFtZUdyb3VwTGVuZ3RoICo9IDI7Ci0JfQotCWlmICgoKHJhdGUgLyAzKSAqIDMpICE9IHJhdGUpIHsKLQkJZnJhbWVHcm91cExlbmd0aCAqPSAzOwotCX0KLQlmb3IgKGNudCA9IDU7IGNudCA8PSAxMjU7IGNudCAqPSA1KSB7Ci0JCWlmICgoKHJhdGUgLyBjbnQpICogY250KSAhPSByYXRlKSAKLQkJCWZyYW1lR3JvdXBMZW5ndGggKj0gNTsKLSAgICAgICAgfQotCi0JLyoKLQkgKiBGaWxsIGluIHRoZSBXcml0ZUJhY2sgY29udHJvbCBibG9jay4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DRkcxLCBmcmFtZUdyb3VwTGVuZ3RoKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0ZHMiwgKDB4MDA4MDAwMDAgfCBmcmFtZUdyb3VwTGVuZ3RoKSk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDU1QsIDB4MDAwMEZGRkYpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DU1BCLCAoKDY1NTM2ICogcmF0ZSkgLyAyNDAwMCkpOwotCWNzNDYxeF9wb2tlKGNhcmQsIChCQTFfQ1NQQiArIDQpLCAweDAwMDBGRkZGKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JZG1hYnVmLT5yYXRlID0gcmF0ZTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19zZXRfYWRjX3JhdGUoKS0gJWRcbiIscmF0ZSkgKTsKLQlyZXR1cm4gcmF0ZTsKLX0KLQotLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHBsYXliYWNrICovIAotc3RhdGljIHZvaWQgY3NfcGxheV9zZXR1cChzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0bXAsIENvdW50LCBwbGF5Rm9ybWF0OwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcGxheV9zZXR1cCgpK1xuIikgKTsKLSAgICAgICAgY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BWT0wsIDB4ODAwMDgwMDApOwotICAgICAgICBpZiAoIWRtYWJ1Zi0+U0dvaykKLSAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQkEsIHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cGJ1ZikpOwotICAgIAotICAgICAgICBDb3VudCA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBwbGF5Rm9ybWF0PWNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRklFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgJj0gfkRNQV9SUV9DMl9BQ19NT05PX1RPX1NURVJFTzsgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENvdW50ICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwbGF5Rm9ybWF0IHw9IERNQV9SUV9DMl9BQ19NT05PX1RPX1NURVJFTzsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwbGF5Rm9ybWF0ICY9IH4oRE1BX1JRX0MyX0FDXzhfVE9fMTZfQklUICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRE1BX1JRX0MyX0FDX1NJR05FRF9DT05WRVJUKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDb3VudCAqPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcGxheUZvcm1hdCB8PSAoRE1BX1JRX0MyX0FDXzhfVE9fMTZfQklUICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IERNQV9SUV9DMl9BQ19TSUdORURfQ09OVkVSVCk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QRklFLCBwbGF5Rm9ybWF0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRFRDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHRtcCAmPSAweGZmZmZmZTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QRFRDLCB0bXAgfCAtLUNvdW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wbGF5X3NldHVwKCktXG4iKSApOwotfQotCi1zdGF0aWMgc3RydWN0IEluaXRTdHJ1Y3QKLXsKLSAgICB1MzIgb2ZmOwotICAgIHUzMiB2YWw7Ci19IEluaXRBcnJheVtdID0geyB7MHgwMDAwMDA0MCwgMHgzZmMwMDAwZn0sCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDA0YywgMHgwNDgwMDAwMH0sCi0KLSAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGIzLCAweDAwMDAwNzgwfSwKLSAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGI3LCAweDAwMDAwMDAwfSwKLSAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGJjLCAweDA3ODAwMDAwfSwKLQotICAgICAgICAgICAgICAgICAgezB4MDAwMDAwY2QsIDB4MDA4MDAwMDB9LAotICAgICAgICAgICAgICAgIH07Ci0KLS8qCi0gKiAiU2V0Q2FwdHVyZVNQVmFsdWVzKCkiIC0tIEluaXRpYWxpemUgcmVjb3JkIHRhc2sgdmFsdWVzIGJlZm9yZSBlYWNoCi0gKiAJY2FwdHVyZSBzdGFydHVwLiAgCi0gKi8KLXN0YXRpYyB2b2lkIFNldENhcHR1cmVTUFZhbHVlcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQl1bnNpZ25lZCBpLCBvZmZzZXQ7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoImNzNDZ4eDogU2V0Q2FwdHVyZVNQVmFsdWVzKCkrXG4iKSApOwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoSW5pdEFycmF5KSAvIHNpemVvZihzdHJ1Y3QgSW5pdFN0cnVjdCk7IGkrKykgewotCQlvZmZzZXQgPSBJbml0QXJyYXlbaV0ub2ZmKjQ7IC8qIDhiaXQgdG8gMzJiaXQgb2Zmc2V0IHZhbHVlICovCi0JCWNzNDYxeF9wb2tlKGNhcmQsIG9mZnNldCwgSW5pdEFycmF5W2ldLnZhbCApOwotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50aygiY3M0Nnh4OiBTZXRDYXB0dXJlU1BWYWx1ZXMoKS1cbiIpICk7Ci19Ci0KLS8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciByZWNvcmRpbmcgKi8KLXN0YXRpYyB2b2lkIGNzX3JlY19zZXR1cChzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWNfc2V0dXAoKStcbiIpKTsKLQlTZXRDYXB0dXJlU1BWYWx1ZXMoY2FyZCk7Ci0KLQkvKgotCSAqIHNldCB0aGUgYXR0ZW51YXRpb24gdG8gMGRCIAotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DVk9MLCAweDgwMDA4MDAwKTsKLQotCS8qCi0JICogc2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjYXB0dXJlIGJ1ZmZlciBpbnRvIHRoZSBTUAotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQkEsIHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cmF3YnVmKSk7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWNfc2V0dXAoKS1cbiIpICk7Ci19Ci0KLQotLyogZ2V0IGN1cnJlbnQgcGxheWJhY2svcmVjb3JkaW5nIGRtYSBidWZmZXIgcG9pbnRlciAoYnl0ZSBvZmZzZXQgZnJvbSBMQkEpLAotICAgY2FsbGVkIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KLSAgIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjc19nZXRfZG1hX2FkZHIoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQl1MzIgb2Zmc2V0OwotCQotCWlmICggKCEoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykpICYmCi0JICAgICAoIShkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSApICkKLQl7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKAotCQkJImNzNDZ4eDogRVJST1IgY3NfZ2V0X2RtYV9hZGRyKCk6IG5vdCBlbmFibGVkIFxuIikgKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQkKLQkvKgotCSAqIGdyYW51bGFyaXR5IGlzIGJ5dGUgYm91bmRhcnksIGdvb2QgcGFydC4KLQkgKi8KLQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKLQkJb2Zmc2V0ID0gY3M0NjF4X3BlZWsoc3RhdGUtPmNhcmQsIEJBMV9QQkEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQllbHNlIC8qIEFEQ19SVU5OSU5HIG11c3QgYmUgc2V0ICovCi0JCW9mZnNldCA9IGNzNDYxeF9wZWVrKHN0YXRlLT5jYXJkLCBCQTFfQ0JBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOSwgCi0JCXByaW50aygiY3M0Nnh4OiBjc19nZXRfZG1hX2FkZHIoKSAlZFxuIixvZmZzZXQpICk7Ci0Jb2Zmc2V0ID0gKHUzMilidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylvZmZzZXQpIC0gKHUzMilkbWFidWYtPnJhd2J1ZjsKLQlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOCwgCi0JCXByaW50aygiY3M0Nnh4OiBjc19nZXRfZG1hX2FkZHIoKS0gJWRcbiIsb2Zmc2V0KSApOwotCXJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3luY19kbWFfcHRycyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQkKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiByZXN5bmNfZG1hX3B0cnMoKSsgXG4iKSApOwotCWlmIChzdGF0ZSkgewotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJZG1hYnVmLT5od3B0cj1kbWFidWYtPnN3cHRyID0gMDsKLQkJZG1hYnVmLT5wcmluZ2J1ZiA9IDA7Ci0JfQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHJlc3luY19kbWFfcHRycygpLSBcbiIpICk7Ci19Ci0JCi0vKiBTdG9wIHJlY29yZGluZyAobG9jayBoZWxkKSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9hZGMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXVuc2lnbmVkIGludCB0bXA7Ci0JCi0JZG1hYnVmLT5lbmFibGUgJj0gfkFEQ19SVU5OSU5HOwotCQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DQ1RMKTsKLQl0bXAgJj0gMHhGRkZGMDAwMDsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NUTCwgdG1wICk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0b3BfYWRjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0b3BfYWRjKCkrIFxuIikgKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlfX3N0b3BfYWRjKHN0YXRlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0b3BfYWRjKCktIFxuIikgKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWlmICghKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpICYmIAotCSAgICAgKChkbWFidWYtPm1hcHBlZCB8fCBkbWFidWYtPmNvdW50IDwgKHNpZ25lZClkbWFidWYtPmRtYXNpemUpIAotCSAgICAgICAmJiBkbWFidWYtPnJlYWR5KSAmJiAKLQkgICAgICAgKChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB8fCAKLQkgICAgICAgIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9SRVNVTUVEKSkgKQotCXsKLQkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7Ci0JCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DQ1RMKTsKLQkJdG1wICY9IDB4RkZGRjAwMDA7Ci0JCXRtcCB8PSBjYXJkLT5jY3RsOwotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygKLQkJCSJjczQ2eHg6IHN0YXJ0X2FkYygpIHBva2UgMHgleCBcbiIsdG1wKSApOwotCQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NUTCwgdG1wKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi0vKiBzdG9wIHBsYXliYWNrIChsb2NrIGhlbGQpICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zdG9wX2RhYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCWRtYWJ1Zi0+ZW5hYmxlICY9IH5EQUNfUlVOTklORzsKLQkKLQl0bXA9Y3M0NjF4X3BlZWsoY2FyZCwgQkExX1BDVEwpOwotCXRtcCY9MHhGRkZGOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQ1RMLCB0bXApOwotfQotCi1zdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2RhYygpKyBcbiIpICk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JX19zdG9wX2RhYyhzdGF0ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2RhYygpLSBcbiIpICk7Ci19CQotCi1zdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHRtcDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0YXJ0X2RhYygpKyBcbiIpICk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSAmJiAKLQkgICAgKChkbWFidWYtPm1hcHBlZCB8fCBkbWFidWYtPmNvdW50ID4gMCkgJiYgZG1hYnVmLT5yZWFkeSkgJiYKLQkgICAgICAgKChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB8fCAKLQkgICAgICAgIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9SRVNVTUVEKSkgKQotCXsKLQkJZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7Ci0JCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKLQkJdG1wICY9IDB4RkZGRjsKLQkJdG1wIHw9IGNhcmQtPnBjdGw7Ci0JCUNTX0RCR09VVChDU19QQVJNUywgNiwgcHJpbnRrKAotCQkgICAgImNzNDZ4eDogc3RhcnRfZGFjKCkgcG9rZSBjYXJkPSVwIHRtcD0weCUuMDh4IGFkZHI9JXAgXG4iLAotCQkgICAgY2FyZCwgKHVuc2lnbmVkKXRtcCwgCi0JCSAgICBjYXJkLT5iYTEuaWR4WyhCQTFfUENUTCA+PiAxNikgJiAzXSsoQkExX1BDVEwmMHhmZmZmKSApICk7Ci0JCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQ1RMLCB0bXApOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RhcnRfZGFjKCktIFxuIikgKTsKLX0KLQotI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQotCi0vKgotICogYWxsb2NhdGUgRE1BIGJ1ZmZlciwgcGxheWJhY2sgYW5kIHJlY29yZGluZyBidWZmZXJzIGFyZSBzZXBhcmF0ZS4KLSAqLwotc3RhdGljIGludCBhbGxvY19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQotCXN0cnVjdCBjc19jYXJkICpjYXJkPXN0YXRlLT5jYXJkOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXZvaWQgKnJhd2J1ZiA9IE5VTEw7Ci0Jdm9pZCAqdG1wYnVmZiA9IE5VTEw7Ci0JaW50IG9yZGVyOwotCXN0cnVjdCBwYWdlICptYXAsICptYXBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBkZjsKLQkKLQlkbWFidWYtPnJlYWR5ICA9IGRtYWJ1Zi0+bWFwcGVkID0gMDsKLQlkbWFidWYtPlNHb2sgPSAwOwotLyoKLSogY2hlY2sgZm9yIG9yZGVyIHdpdGhpbiBsaW1pdHMsIGJ1dCBkbyBub3Qgb3ZlcndyaXRlIHZhbHVlLgotKi8KLQlpZiAoKGRlZmF1bHRvcmRlciA+IDEpICYmIChkZWZhdWx0b3JkZXIgPCAxMikpCi0JCWRmID0gZGVmYXVsdG9yZGVyOwotCWVsc2UKLQkJZGYgPSAyOwkKLQotCWZvciAob3JkZXIgPSBkZjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQotCQlpZiAoKHJhd2J1ZiA9ICh2b2lkICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoCi0JCQljYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsICZkbWFidWYtPmRtYWFkZHIpKSkKLQkJCSAgICBicmVhazsKLQlpZiAoIXJhd2J1ZikgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgotCQkJImNzNDZ4eDogYWxsb2NfZG1hYnVmKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSByYXdidWZcbiIpKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWRtYWJ1Zi0+YnVmb3JkZXIgPSBvcmRlcjsKLQlkbWFidWYtPnJhd2J1ZiA9IHJhd2J1ZjsKLQkvLyBOb3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSB0aGUgCi0JLy8gcmVtYXBfcGZuX3JhbmdlKCkgaW4gY3M0Nnh4X21tYXAgZG9lc24ndCB3b3JrLgotCS8vIDEuIGdldCBpbmRleCB0byBsYXN0IHBhZ2UgaW4gbWVtX21hcCBhcnJheSBmb3IgcmF3YnVmLgotCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIAotCQkoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7Ci0KLQkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgotCWZvciAobWFwID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCi0JCWNzNHhfbWVtX21hcF9yZXNlcnZlKG1hcCk7Ci0KLQlDU19EQkdPVVQoQ1NfUEFSTVMsIDksIHByaW50aygiY3M0Nnh4OiBhbGxvY19kbWFidWYoKTogYWxsb2NhdGVkICVsZCAob3JkZXIgPSAlZCkgYnl0ZXMgYXQgJXBcbiIsCi0JICAgICAgIFBBR0VfU0laRSA8PCBvcmRlciwgb3JkZXIsIHJhd2J1ZikgKTsKLQotLyoKLSogIG9ubHkgYWxsb2NhdGUgdGhlIGNvbnZlcnNpb24gYnVmZmVyIGZvciB0aGUgQURDCi0qLwotCWlmIChkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9EQUMpIHsKLQkJZG1hYnVmLT50bXBidWZmID0gTlVMTDsKLQkJZG1hYnVmLT5idWZvcmRlcl90bXBidWZmID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotLyoKLSAqIG5vdyB0aGUgdGVtcCBidWZmZXIgZm9yIDE2LzggY29udmVyc2lvbnMKLSAqLwotCi0JdG1wYnVmZiA9ICh2b2lkICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAotCQljYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsICZkbWFidWYtPmRtYWFkZHJfdG1wYnVmZik7Ci0KLQlpZiAoIXRtcGJ1ZmYpCi0JCXJldHVybiAtRU5PTUVNOwotCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKCJjczQ2eHg6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAotCSAgICAgICBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCB0bXBidWZmKSApOwotCi0JZG1hYnVmLT50bXBidWZmID0gdG1wYnVmZjsKLQlkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYgPSBvcmRlcjsKLQkKLQkvLyBOb3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSB0aGUgCi0JLy8gcmVtYXBfcGZuX3JhbmdlKCkgaW4gY3M0Nnh4X21tYXAgZG9lc24ndCB3b3JrLgotCS8vIDEuIGdldCBpbmRleCB0byBsYXN0IHBhZ2UgaW4gbWVtX21hcCBhcnJheSBmb3IgcmF3YnVmLgotCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnRtcGJ1ZmYgKyAKLQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpIC0gMSk7Ci0KLQkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgotCWZvciAobWFwID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQotCQljczR4X21lbV9tYXBfcmVzZXJ2ZShtYXApOwotCXJldHVybiAwOwotfQotCi0vKiBmcmVlIERNQSBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IHBhZ2UgKm1hcCwgKm1hcGVuZDsKLQotCWlmIChkbWFidWYtPnJhd2J1ZikgewotCQkvLyBVbmRvIHByb2dfZG1hYnVmKCkncyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAKLQkJbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgCi0JCQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOwotCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQotCQkJY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShtYXApOwotCQlmcmVlX2RtYWJ1ZihzdGF0ZS0+Y2FyZCwgZG1hYnVmKTsKLQl9Ci0KLQlpZiAoZG1hYnVmLT50bXBidWZmKSB7Ci0JCS8vIFVuZG8gcHJvZ19kbWFidWYoKSdzIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkIAotCQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmICsKLQkJCQkoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKLQkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCi0JCQljczR4X21lbV9tYXBfdW5yZXNlcnZlKG1hcCk7Ci0JCWZyZWVfZG1hYnVmMihzdGF0ZS0+Y2FyZCwgZG1hYnVmKTsKLQl9Ci0KLQlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7Ci0JZG1hYnVmLT50bXBidWZmID0gTlVMTDsKLQlkbWFidWYtPm1hcHBlZCA9IGRtYWJ1Zi0+cmVhZHkgPSAwOwotCWRtYWJ1Zi0+U0dvayA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19wcm9nX2RtYWJ1ZihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotICAgICAgICBzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBhbGxvY2F0ZWRfcGFnZXMsIGFsbG9jYXRlZF9ieXRlczsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyLCBmbXQ9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgKnB0bXAgPSAodW5zaWduZWQgbG9uZyAqKSBkbWFidWYtPnBidWY7ICAgICAgICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgU0dhcnJheVs5XSwgblNHcGFnZXM9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCByZXQ7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpKyBcbiIpKTsKLS8qCi0gKiBjaGVjayBmb3IgQ0FQVFVSRSBhbmQgdXNlIG9ubHkgbm9uLXNnIGZvciBpbml0aWFsIHJlbGVhc2UKLSAqLwotCWlmIChkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9BREMpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKSBBRENcbiIpKTsKLQkJLyogCi0JCSAqIGFkZCBpbiBub24tc2cgc3VwcG9ydCBmb3IgY2FwdHVyZS4KLQkJICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCS8qIGFkZCBjb2RlIHRvIHJlc2V0IHRoZSByYXdidWYgbWVtb3J5LiBUUlcgKi8KLQkJcmVzeW5jX2RtYV9wdHJzKHN0YXRlKTsKLQkJZG1hYnVmLT50b3RhbF9ieXRlcyA9IGRtYWJ1Zi0+YmxvY2tzID0gMDsKLQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZXJyb3IgPSBkbWFidWYtPnVuZGVycnVuID0gMDsKLQotCQlkbWFidWYtPlNHb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogYWxsb2NhdGUgRE1BIGJ1ZmZlciBpZiBub3QgYWxsb2NhdGVkIHlldCAqLwotCQlpZiAoIWRtYWJ1Zi0+cmF3YnVmIHx8ICFkbWFidWYtPnRtcGJ1ZmYpCi0JCQlpZiAoKHJldCA9IGFsbG9jX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCXJldHVybiByZXQ7IAotCS8qCi0JICogc3RhdGljIGltYWdlIG9ubHkgc3VwcG9ydHMgMTZCaXQgc2lnbmVkLCBzdGVyZW8gLSBoYXJkIGNvZGUgZm10Ci0JICovCi0JCWZtdCA9IENTX0ZNVF8xNkJJVCB8IENTX0ZNVF9TVEVSRU87Ci0KLQkJZG1hYnVmLT5udW1mcmFnID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAyMDQ4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gMjA0OCA+PiBzYW1wbGVfc2hpZnRbZm10XTsgICAgCi0JCWRtYWJ1Zi0+ZG1hc2l6ZSA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlkbWFidWYtPmZyYWdzaGlmdCA9IDExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIChmbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCi0JCSAgICAgICBkbWFidWYtPmRtYXNpemUpOwotICAgICAgICAJbWVtc2V0KGRtYWJ1Zi0+dG1wYnVmZiwgKGZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCi0JCQlQQUdFX1NJWkU8PGRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZik7ICAgICAgCi0KLQkJLyoKLQkJICogICAgICBOb3cgc2V0IHVwIHRoZSByaW5nCi0JCSAqLwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQljc19yZWNfc2V0dXAoc3RhdGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIHNldCB0aGUgcmVhZHkgZmxhZyBmb3IgdGhlIGRtYSBidWZmZXIgKi8KLQkJZG1hYnVmLT5yZWFkeSA9IDE7Ci0KLQkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoCi0JCQkiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpOiBDQVBUVVJFIHJhdGU9JWQgZm10PTB4JXggbnVtZnJhZz0lZCAiCi0JCQkiZnJhZ3NpemU9JWQgZG1hc2l6ZT0lZFxuIiwKLQkJCSAgICBkbWFidWYtPnJhdGUsIGRtYWJ1Zi0+Zm10LCBkbWFidWYtPm51bWZyYWcsCi0JCQkgICAgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5kbWFzaXplKSApOwotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCktIDAgXG4iKSk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKSB7Ci0JLyoKLQkgKiBNdXN0IGJlIERBQwotCSAqLwotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpIERBQ1xuIikpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmVzeW5jX2RtYV9wdHJzKHN0YXRlKTsKLQkJZG1hYnVmLT50b3RhbF9ieXRlcyA9IGRtYWJ1Zi0+YmxvY2tzID0gMDsKLQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZXJyb3IgPSBkbWFidWYtPnVuZGVycnVuID0gMDsKLQotCQlkbWFidWYtPlNHb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogYWxsb2NhdGUgRE1BIGJ1ZmZlciBpZiBub3QgYWxsb2NhdGVkIHlldCAqLwotCQlpZiAoIWRtYWJ1Zi0+cmF3YnVmKQotCQkJaWYgKChyZXQgPSBhbGxvY19kbWFidWYoc3RhdGUpKSkKLQkJCQlyZXR1cm4gcmV0OwotCi0JCWFsbG9jYXRlZF9wYWdlcyA9IDEgPDwgZG1hYnVmLT5idWZvcmRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWFsbG9jYXRlZF9ieXRlcyA9IGFsbG9jYXRlZF9wYWdlcypQQUdFX1NJWkU7ICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkJICAgIAotCQlpZiAoYWxsb2NhdGVkX3BhZ2VzIDwgMikgewotCQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoCi0JCQkgICAgImNzNDZ4eDogcHJvZ19kbWFidWYoKSBFcnJvcjogYWxsb2NhdGVkX3BhZ2VzIHRvbyBzbWFsbCAoJWQpXG4iLAotCQkJCSh1bnNpZ25lZClhbGxvY2F0ZWRfcGFnZXMpKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCQkJCQkJCQkJICAgIAotCQkvKiBVc2UgYWxsIHRoZSBwYWdlcyBhbGxvY2F0ZWQsIGZyYWdzaXplIDRrLiAqLwotCQkvKiBVc2UgJ3BidWYnIGZvciBTL0cgcGFnZSBtYXAgdGFibGUuICovCi0JCWRtYWJ1Zi0+U0dvayA9IDE7ICAgICAgICAgICAvKiBVc2UgUy9HLiAqLwotCi0JCW5TR3BhZ2VzID0gYWxsb2NhdGVkX2J5dGVzLzQwOTY7ICAgIC8qIFMvRyBwYWdlcyBhbHdheXMgNGsuICovCi0JCQkJCQkJCQkJICAgIAotCQkgICAgIC8qIFNldCB1cCBTL0cgdmFyaWFibGVzLiAqLwotCQkqcHRtcCA9IHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cmF3YnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkqKHB0bXAgKyAxKSA9IDB4MDAwMDAwMDg7Ci0JCWZvciAodG1wMSA9IDE7IHRtcDEgPCBuU0dwYWdlczsgdG1wMSsrKSB7Ci0JCQkqKHB0bXAgKyAyICogdG1wMSkgPSB2aXJ0X3RvX2J1cygoZG1hYnVmLT5yYXdidWYpICsgNDA5NiAqIHRtcDEpOwotCQkJaWYgKHRtcDEgPT0gblNHcGFnZXMgLSAxKQotCQkJCXRtcDIgPSAweGJmZmYwMDAwOwotCQkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJdG1wMiA9IDB4ODAwMDAwMDAgKyA4ICogKHRtcDEgKyAxKTsKLQkJCSoocHRtcCArIDIgKiB0bXAxICsgMSkgPSB0bXAyOwotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlTR2FycmF5WzBdID0gMHg4MmMwMjAwZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlTR2FycmF5WzFdID0gMHhmZmZmMDAwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlTR2FycmF5WzJdID0gKnB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlTR2FycmF5WzNdID0gMHgwMDAxMDYwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlTR2FycmF5WzRdID0gKihwdG1wKzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlTR2FycmF5WzVdID0gMHg4MDAwMDAxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlTR2FycmF5WzZdID0gKnB0bXA7Ci0JCVNHYXJyYXlbN10gPSAqKHB0bXArMik7Ci0JCVNHYXJyYXlbOF0gPSAodmlydF90b19idXMoZG1hYnVmLT5wYnVmKSAmIDB4ZmZmZjAwMCkgfCAweDEwOwotCi0JCWlmIChkbWFidWYtPlNHb2spIHsKLQkJCWRtYWJ1Zi0+bnVtZnJhZyA9IG5TR3BhZ2VzOwotCQkJZG1hYnVmLT5mcmFnc2l6ZSA9IDQwOTY7Ci0JCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gNDA5NiA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwotCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMjsKLQkJCWRtYWJ1Zi0+ZG1hc2l6ZSA9IGRtYWJ1Zi0+bnVtZnJhZyAqIDQwOTY7Ci0JCX0gZWxzZSB7Ci0JCQlTR2FycmF5WzBdID0gMHhmMmMwMDAwZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVNHYXJyYXlbMV0gPSAweDAwMDAwMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJU0dhcnJheVsyXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlTR2FycmF5WzNdID0gMHgwMDAxMDYwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVNHYXJyYXlbNF09U0dhcnJheVs1XT1TR2FycmF5WzZdPVNHYXJyYXlbN109U0dhcnJheVs4XSA9IDA7IAotCQkJZG1hYnVmLT5udW1mcmFnID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlkbWFidWYtPmZyYWdzaXplID0gMjA0ODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSAyMDQ4ID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07ICAgIAotCQkJZG1hYnVmLT5kbWFzaXplID0gNDA5NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlkbWFidWYtPmZyYWdzaGlmdCA9IDExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJfQotCQlmb3IgKHRtcDEgPSAwOyB0bXAxIDwgc2l6ZW9mKFNHYXJyYXkpIC8gNDsgdG1wMSsrKQotCQkJY3M0NjF4X3Bva2Uoc3RhdGUtPmNhcmQsIEJBMV9QRFRDK3RtcDEgKiA0LCBTR2FycmF5W3RtcDFdKTsKLQotCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwKLQkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7Ci0KLQkJLyoKLQkJICogICAgICBOb3cgc2V0IHVwIHRoZSByaW5nCi0JCSAqLwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQljc19wbGF5X3NldHVwKHN0YXRlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCi0JCWRtYWJ1Zi0+cmVhZHkgPSAxOwotCi0JCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJImNzNDZ4eDogcHJvZ19kbWFidWYoKTogUExBWUJBQ0sgcmF0ZT0lZCBmbXQ9MHgleCBudW1mcmFnPSVkICIKLQkJCSJmcmFnc2l6ZT0lZCBkbWFzaXplPSVkXG4iLAotCQkJICAgIGRtYWJ1Zi0+cmF0ZSwgZG1hYnVmLT5mbXQsIGRtYWJ1Zi0+bnVtZnJhZywKLQkJCSAgICBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpICk7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKS0gXG4iKSk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCktIEludmFsaWQgVHlwZSAlZFxuIiwKLQkJCWRtYWJ1Zi0+dHlwZSkpOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCWludCByZXQ7Ci0JCi0JbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JcmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQkKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBjc19jbGVhcl90YWlsKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci19Ci0KLXN0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUsIGludCBub25ibG9jaykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1zdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgdG1vOwotCWludCBjb3VudDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpKyBcbiIpKTsKLQlpZiAoZG1hYnVmLT5tYXBwZWQgfHwgIWRtYWJ1Zi0+cmVhZHkpCi0JewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKS0gMCwgbm90IHJlYWR5XG4iKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKLQlmb3IgKDs7KSB7Ci0JCS8qIEl0IHNlZW1zIHRoYXQgd2UgaGF2ZSB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFCi0JCSAgIGV2ZXJ5IHRpbWUgdG8gbWFrZSB0aGUgcHJvY2VzcyByZWFsbHkgZ28gdG8gc2xlZXAgKi8KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoY291bnQgPD0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCi0JCWlmIChub25ibG9jaykgewotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKLQkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwotCQl0bW8gKz0gKDIwNDgqSFopL2RtYWJ1Zi0+cmF0ZTsKLQkJCi0JCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8pewotCQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGRyYWluX2RhYywgZG1hIHRpbWVvdXQ/ICVkXG4iLCBjb3VudCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpLSAtRVJFU1RBUlRTWVNcbiIpKTsKLQkJLyoKLQkJKiBzZXQgdG8gc2lsZW5jZSBhbmQgbGV0IHRoYXQgY2xlYXIgdGhlIGZpZm9zLgotCQkqLwotCQljczQ2MXhfY2xlYXJfc2VyaWFsX0ZJRk9zKGNhcmQsIENTX1RZUEVfREFDKTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQl9Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKS0gMFxuIikpOwotCXJldHVybiAwOwotfQotCi0KLS8qIHVwZGF0ZSBidWZmZXIgbWFuYW5nZW1lbnQgcG9pbnRlcnMsIGVzcGVjaWFsbHksIGRtYWJ1Zi0+Y291bnQgYW5kIGRtYWJ1Zi0+aHdwdHIgKi8KLXN0YXRpYyB2b2lkIGNzX3VwZGF0ZV9wdHIoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCB3YWtlKQotewotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXVuc2lnbmVkIGh3cHRyOwotCWludCBkaWZmOwotCi0JLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgQURDICovCi0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JaWYgKHN0YXRlKSB7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgewotCQkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KLQkJCWh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKLQotCQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOwotCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoCi0JCQkJImNzNDZ4eDogY3NfdXBkYXRlX3B0cigpKyBBREMgaHdwdHI9JWQgZGlmZj0lZFxuIiwgCi0JCQkJaHdwdHIsZGlmZikgKTsKLQkJCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKLQkJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKLQkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKLQkJCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQotCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7Ci0KLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQotCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50ID4gMCkKLQkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJCX0KLQkJfQotCX0KLQotLyoKLSAqIE5vdyB0aGUgREFDCi0gKi8KLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQlpZiAoc3RhdGUpIHsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIERBQyAqLwotCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgewotCQkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KLQkJCWh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKLQotCQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOwotCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoCi0JCQkJImNzNDZ4eDogY3NfdXBkYXRlX3B0cigpKyBEQUMgaHdwdHI9JWQgZGlmZj0lZFxuIiwgCi0JCQkJaHdwdHIsZGlmZikgKTsKLQkJCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKLQkJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKLQkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJCQkvKgotCQkJCSAqIG90aGVyIGRyaXZlcnMgdXNlIGZyYWdzaXplLCBidXQgZG9uJ3Qgc2VlIGFueSBzZW5zZQotCQkJCSAqIGluIHRoYXQsIHNpbmNlIGRtYXNpemUgaXMgdGhlIGJ1ZmZlciBhc2tlZCBmb3IKLQkJCQkgKiB2aWEgbW1hcC4KLQkJCQkgKi8KLQkJCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKLQkJCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmRtYXNpemUtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOwotCQkJCS8qCi0JCQkJICogYmFja2ZpbGwgd2l0aCBzaWxlbmNlIGFuZCBjbGVhciBvdXQgdGhlIGxhc3QgCi0JCQkJICogImRpZmYiIG51bWJlciBvZiBieXRlcy4KLQkJCQkgKi8KLQkJCQlpZiAoaHdwdHIgPj0gZGlmZikgewotCQkJCQltZW1zZXQoZG1hYnVmLT5yYXdidWYgKyBod3B0ciAtIGRpZmYsIAotCQkJCQkJKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLCBkaWZmKTsKLQkJCQl9IGVsc2UgewotCQkJCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIAotCQkJCQkJKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLAotCQkJCQkJKHVuc2lnbmVkKWh3cHRyKTsKLQkJCQkJbWVtc2V0KChjaGFyICopZG1hYnVmLT5yYXdidWYgKyAKLQkJCQkJCQlkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRpZmYsCi0JCQkJCQkoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAotCQkJCQkJZGlmZiAtIGh3cHRyKTsgCi0JCQkJfQotCi0JCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8IGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKLQkJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCi0JCQkJCSAgImNzNDZ4eDogRVJST1IgREFDIGNvdW50PDAgb3IgY291bnQgPiBkbWFzaXplICglZClcbiIsCi0JCQkJCSAgCWRtYWJ1Zi0+Y291bnQpKTsKLQkJCQkJLyogCi0JCQkJCSogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCByZXNldCB0aGUKLQkJCQkJKiBjb3VudCBvZiBieXRlcyB3cml0dGVuIGJhY2sgdG8gMC4KLQkJCQkJKi8KLQkJCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKQotCQkJCQkJZG1hYnVmLT51bmRlcnJ1biA9IDE7Ci0JCQkJCWRtYWJ1Zi0+Y291bnQgPSAwOwotCQkJCQlkbWFidWYtPmVycm9yKys7Ci0JCQkJfQotCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKWRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpCi0JCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQotLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyEgKi8KLXN0YXRpYyB2b2lkIGNzX2hhbmRsZV9taWRpKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotICAgICAgICB1bnNpZ25lZCBjaGFyIGNoOwotICAgICAgICBpbnQgd2FrZTsKLSAgICAgICAgdW5zaWduZWQgdGVtcDE7Ci0KLSAgICAgICAgd2FrZSA9IDA7Ci0gICAgICAgIHdoaWxlICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsICBCQTBfTUlEU1IpICYgTUlEU1JfUkJFKSkgewotICAgICAgICAgICAgICAgIGNoID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX01JRFJQKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5pY250IDwgQ1NfTUlESUlOQlVGKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlidWZbY2FyZC0+bWlkaS5pd3JdID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLml3ciA9IChjYXJkLT5taWRpLml3ciArIDEpICUgQ1NfTUlESUlOQlVGOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pY250Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdha2UgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3YWtlKQotICAgICAgICAgICAgICAgIHdha2VfdXAoJmNhcmQtPm1pZGkuaXdhaXQpOwotICAgICAgICB3YWtlID0gMDsKLSAgICAgICAgd2hpbGUgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgIEJBMF9NSURTUikgJiBNSURTUl9UQkYpICYmIGNhcmQtPm1pZGkub2NudCA+IDApIHsKLSAgICAgICAgICAgICAgICB0ZW1wMSA9ICggY2FyZC0+bWlkaS5vYnVmW2NhcmQtPm1pZGkub3JkXSApICYgMHgwMDAwMDBmZjsKLSAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEV1AsdGVtcDEpOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub3JkID0gKGNhcmQtPm1pZGkub3JkICsgMSkgJSBDU19NSURJT1VUQlVGOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub2NudC0tOwotICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgPCBDU19NSURJT1VUQlVGLTE2KQotICAgICAgICAgICAgICAgICAgICAgICAgd2FrZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdha2UpCi0gICAgICAgICAgICAgICAgd2FrZV91cCgmY2FyZC0+bWlkaS5vd2FpdCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBjc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZGV2X2lkOwotCS8qIFNpbmdsZSBjaGFubmVsIGNhcmQgKi8KLQlzdHJ1Y3QgY3Nfc3RhdGUgKnJlY3N0YXRlID0gY2FyZC0+Y2hhbm5lbFswXS5zdGF0ZTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnBsYXlzdGF0ZSA9IGNhcmQtPmNoYW5uZWxbMV0uc3RhdGU7Ci0JdTMyIHN0YXR1czsKLQotCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDksIHByaW50aygiY3M0Nnh4OiBjc19pbnRlcnJ1cHQoKSsgXG4iKSk7Ci0KLQlzcGluX2xvY2soJmNhcmQtPmxvY2spOwotCi0Jc3RhdHVzID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0hJU1IpOwotCQotCWlmICgoc3RhdHVzICYgMHg3ZmZmZmZmZikgPT0gMCkgewotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9DSEdNfEhJQ1JfSUVWKTsKLQkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CS8qIE1pZ2h0IGJlIElSUV9OT05FLi4gKi8KLQl9Ci0JCi0JLyoKLQkgKiBjaGVjayBmb3IgcGxheWJhY2sgb3IgY2FwdHVyZSBpbnRlcnJ1cHQgb25seQotCSAqLwotCWlmICgoKHN0YXR1cyAmIEhJU1JfVkMwKSAmJiBwbGF5c3RhdGUgJiYgcGxheXN0YXRlLT5kbWFidWYucmVhZHkpIHx8Ci0JICAgICgoKHN0YXR1cyAmIEhJU1JfVkMxKSAmJiByZWNzdGF0ZSAmJiByZWNzdGF0ZS0+ZG1hYnVmLnJlYWR5KSkpIHsKLQkJQ1NfREJHT1VUKENTX0lOVEVSUlVQVCwgOCwgcHJpbnRrKAotCQkJImNzNDZ4eDogY3NfaW50ZXJydXB0KCkgaW50ZXJydXB0IGJpdChzKSBzZXQgKDB4JXgpXG4iLHN0YXR1cykpOwotCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCX0KLQotICAgICAgICBpZiAoc3RhdHVzICYgSElTUl9NSURJKQotICAgICAgICAgICAgICAgIGNzX2hhbmRsZV9taWRpKGNhcmQpOwotCQotIAkvKiBjbGVhciAnZW0gKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9DSEdNfEhJQ1JfSUVWKTsKLQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7Ci0JQ1NfREJHT1VUKENTX0lOVEVSUlVQVCwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzX2ludGVycnVwdCgpLSBcbiIpKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzc2l6ZV90IGNzX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgICAgICBzc2l6ZV90IHJldDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgdW5zaWduZWQgcHRyOwotICAgICAgICBpbnQgY250OwotCi0gICAgICAgIGlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIHB0ciA9IGNhcmQtPm1pZGkuaXJkOwotICAgICAgICAgICAgICAgIGNudCA9IENTX01JRElJTkJVRiAtIHB0cjsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5pY250IDwgY250KQotICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gY2FyZC0+bWlkaS5pY250OwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoY250ID4gY291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBjb3VudDsKLSAgICAgICAgICAgICAgICBpZiAoY250IDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjYXJkLT5taWRpLml3YWl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGJ1ZmZlciwgY2FyZC0+bWlkaS5pYnVmICsgcHRyLCBjbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcHRyID0gKHB0ciArIGNudCkgJSBDU19NSURJSU5CVUY7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IHB0cjsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmljbnQgLT0gY250OwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjb3VudCAtPSBjbnQ7Ci0gICAgICAgICAgICAgICAgYnVmZmVyICs9IGNudDsKLSAgICAgICAgICAgICAgICByZXQgKz0gY250OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgY3NfbWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgICAgICBzc2l6ZV90IHJldDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgdW5zaWduZWQgcHRyOwotICAgICAgICBpbnQgY250OwotCi0gICAgICAgIGlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgcHRyID0gY2FyZC0+bWlkaS5vd3I7Ci0gICAgICAgICAgICAgICAgY250ID0gQ1NfTUlESU9VVEJVRiAtIHB0cjsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5vY250ICsgY250ID4gQ1NfTUlESU9VVEJVRikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IENTX01JRElPVVRCVUYgLSBjYXJkLT5taWRpLm9jbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNudCA8PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY3NfaGFuZGxlX21pZGkoY2FyZCk7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGlmIChjbnQgPiBjb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IGNvdW50OwotICAgICAgICAgICAgICAgIGlmIChjbnQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm1pZGkub3dhaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihjYXJkLT5taWRpLm9idWYgKyBwdHIsIGJ1ZmZlciwgY250KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHB0ciA9IChwdHIgKyBjbnQpICUgQ1NfTUlESU9VVEJVRjsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub3dyID0gcHRyOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub2NudCArPSBjbnQ7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGNvdW50IC09IGNudDsKLSAgICAgICAgICAgICAgICBidWZmZXIgKz0gY250OwotICAgICAgICAgICAgICAgIHJldCArPSBjbnQ7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjc19oYW5kbGVfbWlkaShjYXJkKTsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzX21pZGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0gICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfV1JJVEUpCi0gICAgICAgICAgICAgICAgcG9sbF93YWl0KGZpbGUsICZjYXJkLT5taWRpLm93YWl0LCB3YWl0KTsKLSAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKQotICAgICAgICAgICAgICAgIHBvbGxfd2FpdChmaWxlLCAmY2FyZC0+bWlkaS5pd2FpdCwgd2FpdCk7Ci0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfUkVBRCkgewotICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLmljbnQgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfV1JJVEUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5vY250IDwgQ1NfTUlESU9VVEJVRikKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0gICAgICAgIH0KLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICByZXR1cm4gbWFzazsKLX0KLQotCi1zdGF0aWMgaW50IGNzX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICAgICAgdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBOVUxMOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7Ci0JCWlmIChjYXJkLT5kZXZfbWlkaSA9PSBtaW5vcikKLQkJCWJyZWFrOwotCX0KLQotCWlmIChlbnRyeSA9PSAmY3M0Nnh4X2RldnMpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghY2FyZCkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCAyLCBwcmludGsoS0VSTl9JTkZPCi0JCQkiY3M0Nnh4OiBjczQ2eHhfbWlkaV9vcGVuKCk6IEVycm9yIC0gdW5hYmxlIHRvIGZpbmQgY2FyZCBzdHJ1Y3RcbiIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0gICAgICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0gICAgICAgIC8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLwotICAgICAgICBtdXRleF9sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICB3aGlsZSAoY2FyZC0+bWlkaS5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjYXJkLT5taWRpLm9wZW5fd2FpdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKLSAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICB9Ci0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKLSAgICAgICAgaWYgKCEoY2FyZC0+bWlkaS5vcGVuX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpIHsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9yZCA9IGNhcmQtPm1pZGkub3dyID0gY2FyZC0+bWlkaS5vY250ID0gMDsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKLSAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIDB4MDAwMDAwMGYpOyAgICAgICAgICAgIC8qIEVuYWJsZSB4bWl0LCByY3YuICovCi0gICAgICAgICAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfSUVWIHwgSElDUl9DSEdNKTsgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaXJkID0gY2FyZC0+bWlkaS5pd3IgPSBjYXJkLT5taWRpLmljbnQgPSAwOwotICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vcmQgPSBjYXJkLT5taWRpLm93ciA9IGNhcmQtPm1pZGkub2NudCA9IDA7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPm1pZGkubG9jaywgZmxhZ3MpOwotICAgICAgICBjYXJkLT5taWRpLm9wZW5fbW9kZSB8PSAoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpOwotICAgICAgICBtdXRleF91bmxvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgY3NfbWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGNvdW50LCB0bW87Ci0KLSAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0gICAgICAgICAgICAgICAgYWRkX3dhaXRfcXVldWUoJmNhcmQtPm1pZGkub3dhaXQsICZ3YWl0KTsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNhcmQtPm1pZGkub2NudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPm1pZGkubG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDw9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLSAgICAgICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtbyA9IChjb3VudCAqIEhaKSAvIDMxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gOiAxKSAmJiB0bW8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJjczQ2eHg6IG1pZGkgdGltZWQgb3V0Pz9cbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmY2FyZC0+bWlkaS5vd2FpdCwgJndhaXQpOwotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotICAgICAgICB9Ci0gICAgICAgIG11dGV4X2xvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgIGNhcmQtPm1pZGkub3Blbl9tb2RlICY9ICh+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSk7Ci0gICAgICAgIG11dGV4X3VubG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgd2FrZV91cCgmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqICAgTWlkaSBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgotICovCi1zdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3NfbWlkaV9mb3BzID0gewotCUNTX09XTkVSCUNTX1RISVNfTU9EVUxFCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWQJCT0gY3NfbWlkaV9yZWFkLAotCS53cml0ZQkJPSBjc19taWRpX3dyaXRlLAotCS5wb2xsCQk9IGNzX21pZGlfcG9sbCwKLQkub3BlbgkJPSBjc19taWRpX29wZW4sCi0JLnJlbGVhc2UJPSBjc19taWRpX3JlbGVhc2UsCi19OwotCi0vKgotICoKLSAqIENvcHlTYW1wbGVzIGNvcGllcyAxNi1iaXQgc3RlcmVvIHNpZ25lZCBzYW1wbGVzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUKLSAqIGRlc3RpbmF0aW9uLCBwb3NzaWJseSBjb252ZXJ0aW5nIGRvd24gdG8gdW5zaWduZWQgOC1iaXQgYW5kL29yIG1vbm8uCi0gKiBjb3VudCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgdG8gd3JpdGUuCi0gKgotICogIEFyZ3VtZW50czoKLSAqCi0gKiAgZHN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlci4KLSAqICBzcmMgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGEgc291cmNlIGJ1ZmZlcgotICogIGNvdW50ICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCi0gKiAgZm10ICAgICAgICAgICAgIC0gQ1NfRk1UXzE2QklUIGFuZC9vciBDU19GTVRfU1RFUkVPIGJpdHMKLSAqICBkbWFidWYgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkbWEgYnVmZmVyIHN0cnVjdHVyZQotICoKLSAqIE5PVEVTOiBvbmx5IGNhbGwgdGhpcyByb3V0aW5lIGlmIHRoZSBvdXRwdXQgZGVzaXJlZCBpcyBub3QgMTYgU2lnbmVkIFN0ZXJlbwotICogCQotICoKLSAqLwotc3RhdGljIHZvaWQgQ29weVNhbXBsZXMoY2hhciAqZHN0LCBjaGFyICpzcmMsIGludCBjb3VudCwgdW5zaWduZWQgZm10LCAKLQkJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmKQotewotICAgIHMzMiBzMzJBdWRpb1NhbXBsZTsKLSAgICBzMTYgKnBzU3JjID0gKHMxNiAqKXNyYzsKLSAgICBzMTYgKnBzRHN0ID0gKHMxNiAqKWRzdDsKLSAgICB1OCAqcHVjRHN0ID0gKHU4ICopZHN0OwotCi0gICAgQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENvcHlTYW1wbGVzKCkrICIpICk7Ci0gICAgQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgOCwgcHJpbnRrKEtFUk5fSU5GTwotCSIgZHN0PSVwIHNyYz0lcCBjb3VudD0lZCBmbXQ9MHgleFxuIiwKLQlkc3Qsc3JjLGNvdW50LGZtdCkgKTsKLQotICAgIC8qCi0gICAgICogU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXMgOC1iaXQgdW5zaWduZWQgc3RlcmVvLgotICAgICAqLwotICAgIGlmICgoZm10ICYgQ1NfRk1UX1NURVJFTykgJiYgIShmbXQgJiBDU19GTVRfMTZCSVQpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCi0JICogc3RlcmVvIHVzaW5nIHJvdW5kaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOwotCWNvdW50ID0gY291bnQgLyAyOwotICAgICAgICB3aGlsZSAoY291bnQtLSkKLSAgICAgICAgICAgICoocHVjRHN0KyspID0gKHU4KSgoKHMxNikoKnBzU3JjKyspICsgKHMxNikweDgwMDApID4+IDgpOwotICAgIH0KLSAgICAvKgotICAgICAqIFNlZSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgb3V0cHV0IGF0IDgtYml0IHVuc2lnbmVkIG1vbm8uCi0gICAgICovCi0gICAgZWxzZSBpZiAoIShmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAhKGZtdCAmIENTX0ZNVF8xNkJJVCkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCBlYWNoIDE2LWJpdCBzaWduZWQgc3RlcmVvIHNhbXBsZSB0byA4LWJpdCB1bnNpZ25lZCAKLQkgKiBtb25vIHVzaW5nIGF2ZXJhZ2luZyBhbmQgcm91bmRpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwc1NyYyA9IChzMTYgKilzcmM7Ci0JY291bnQgPSBjb3VudCAvIDI7Ci0gICAgICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JICAgIHMzMkF1ZGlvU2FtcGxlID0gKCgqcHNTcmMpICsgKCoocHNTcmMgKyAxKSkpIC8gMiArIChzMzIpMHg4MDsKLQkgICAgaWYgKHMzMkF1ZGlvU2FtcGxlID4gMHg3ZmZmKQotCSAgICAJczMyQXVkaW9TYW1wbGUgPSAweDdmZmY7Ci0gICAgICAgICAgICAqKHB1Y0RzdCsrKSA9ICh1OCkoKChzMTYpczMyQXVkaW9TYW1wbGUgKyAoczE2KTB4ODAwMCkgPj4gOCk7Ci0JICAgIHBzU3JjICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhdCAxNi1iaXQgc2lnbmVkIG1vbm8uCi0gICAgICovCi0gICAgZWxzZSBpZiAoIShmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAoZm10ICYgQ1NfRk1UXzE2QklUKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDE2LWJpdCBzaWduZWQgCi0JICogbW9ubyB1c2luZyBhdmVyYWdpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwc1NyYyA9IChzMTYgKilzcmM7Ci0JY291bnQgPSBjb3VudCAvIDI7Ci0gICAgICAgIHdoaWxlIChjb3VudC0tKSB7Ci0gICAgICAgICAgICAqKHBzRHN0KyspID0gKHMxNikoKCpwc1NyYykgKyAoKihwc1NyYyArIDEpKSkgLyAyOwotCSAgICBwc1NyYyArPSAyOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICogY3NfY29weV90b191c2VyKCkKLSAqIHJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQgY29weV90b191c2VyLCB0byBhbGxvdyBmb3IgYSBjb252ZXJzaW9uIGZyb20KLSAqIDE2IGJpdCB0byA4IGJpdCBhbmQgZnJvbSBzdGVyZW8gdG8gbW9ubywgaWYgdGhlIHJlY29yZCBjb252ZXJzaW9uIGlzIGFjdGl2ZS4gIAotICogVGhlIGN1cnJlbnQgQ1M0Nnh4L0NTNDI4MCBzdGF0aWMgaW1hZ2Ugb25seSByZWNvcmRzIGluIDE2Yml0IHVuc2lnbmVkIFN0ZXJlbywgCi0gKiBzbyB3ZSBjb252ZXJ0IGZyb20gYW55IG9mIHRoZSBvdGhlciBmb3JtYXQgY29tYmluYXRpb25zLgotICovCi1zdGF0aWMgdW5zaWduZWQgY3NfY29weV90b191c2VyKAotCXN0cnVjdCBjc19zdGF0ZSAqcywgCi0Jdm9pZCBfX3VzZXIgKmRlc3QsIAotCXZvaWQgKmh3c3JjLCAKLQl1bnNpZ25lZCBjbnQsIAotCXVuc2lnbmVkICpjb3BpZWQpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnMtPmRtYWJ1ZjsKLQl2b2lkICpzcmMgPSBod3NyYzsgIC8qIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGRlc3RpbmF0aW9uIGJ1ZmZlciBhZGRyICovCi0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDYsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjc19jb3B5X3RvX3VzZXIoKSsgZm10PTB4JXggY250PSVkIGRlc3Q9JXBcbiIsCi0JCWRtYWJ1Zi0+Zm10LCh1bnNpZ25lZCljbnQsZGVzdCkgKTsKLQotCWlmIChjbnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQlpZiAoIWNudCkgewotCQkqY29waWVkID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChkbWFidWYtPmRpdmlzb3IgIT0gMSkgewotCQlpZiAoIWRtYWJ1Zi0+dG1wYnVmZikgewotCQkJKmNvcGllZCA9IGNudCAvIGRtYWJ1Zi0+ZGl2aXNvcjsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJQ29weVNhbXBsZXMoKGNoYXIgKilkbWFidWYtPnRtcGJ1ZmYsIChjaGFyICopaHdzcmMsIGNudCwgCi0JCQlkbWFidWYtPmZtdCwgZG1hYnVmKTsKLQkJc3JjID0gZG1hYnVmLT50bXBidWZmOwotCQljbnQgPSBjbnQvZG1hYnVmLT5kaXZpc29yOwotCX0KLSAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihkZXN0LCBzcmMsIGNudCkpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9FUlIgCi0JCQkiY3M0Nnh4OiBjc19jb3B5X3RvX3VzZXIoKS0gZmF1bHQgZGVzdD0lcCBzcmM9JXAgY250PSVkXG4iLAotCQkJCWRlc3Qsc3JjLGNudCkpOwotCQkqY29waWVkID0gMDsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCSpjb3BpZWQgPSBjbnQ7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19jb3B5X3RvX3VzZXIoKS0gY29waWVkIGJ5dGVzIGlzICVkIFxuIixjbnQpKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgY29waWVkIHRvCi0gICB0aGUgdXNlcidzIGJ1ZmZlci4gIGl0IGlzIGZpbGxlZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLwotc3RhdGljIHNzaXplX3QgY3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0Jc3NpemVfdCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc3dwdHI7Ci0JaW50IGNudDsKLQl1bnNpZ25lZCBjb3BpZWQgPSAwOwotCi0JQ1NfREJHT1VUKENTX1dBVkVfUkVBRCB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzX3JlYWQoKSsgJXpkXG4iLGNvdW50KSApOwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmICghc3RhdGUpCi0JCXJldHVybiAtRU5PREVWOwotCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCi0JaWYgKGRtYWJ1Zi0+bWFwcGVkKQotCQlyZXR1cm4gLUVOWElPOwotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCQotCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQlnb3RvIG91dDI7Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQl3aGlsZSAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkgewotCQkJc2NoZWR1bGUoKTsKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKLQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7Ci0JCWlmIChkbWFidWYtPmNvdW50IDwgY250KQotCQkJY250ID0gZG1hYnVmLT5jb3VudDsKLQkJaWYgKGNudCA8PSAwKQotCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChjbnQgPiAoY291bnQgKiBkbWFidWYtPmRpdmlzb3IpKQotCQkJY250ID0gY291bnQgKiBkbWFidWYtPmRpdmlzb3I7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJLyogYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kIHdhaXQgZm9yIGRhdGEgdG8gYmUKLQkJCSAgIHJlY29yZGVkICovCi0JCQlzdGFydF9hZGMoc3RhdGUpOwotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FQUdBSU47Ci0JCQkJZ290byBvdXQ7Ci0gCQkJfQotCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVOWElPOwotCQkJCWdvdG8gb3V0OwotCQkJfQotIAkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJfcmVhZCgpIGNvcHlfdG8gY250PSVkIGNvdW50PSV6ZCAiLCBjbnQsY291bnQpICk7Ci0JCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiIC5kbWFzaXplPSVkIC5jb3VudD0lZCBidWZmZXI9JXAgcmV0PSV6ZFxuIiwKLQkJCWRtYWJ1Zi0+ZG1hc2l6ZSxkbWFidWYtPmNvdW50LGJ1ZmZlcixyZXQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjc19jb3B5X3RvX3VzZXIoc3RhdGUsIGJ1ZmZlciwgCi0JCQkoY2hhciAqKWRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGNudCwgJmNvcGllZCkpIHsKLQkJCWlmICghcmV0KQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotICAgICAgICAgICAgICAgIHN3cHRyID0gKHN3cHRyICsgY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKLSAgICAgICAgICAgICAgICBkbWFidWYtPmNvdW50IC09IGNudDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY291bnQgLT0gY29waWVkOwotICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjb3BpZWQ7Ci0gICAgICAgICAgICAgICAgcmV0ICs9IGNvcGllZDsKLSAgICAgICAgICAgICAgICBzdGFydF9hZGMoc3RhdGUpOwotCX0KLW91dDoKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci1vdXQyOgotCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFEIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoImNzNDZ4eDogY3NfcmVhZCgpLSAlemRcbiIscmV0KSApOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGRtYSB0bwotICAgdGhlIHNvdW5kY2FyZC4gIGl0IGlzIGRyYWluZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBmaWxsZWQgYnkgdGhpcyBsb29wLiAqLwotc3RhdGljIHNzaXplX3QgY3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXNzaXplX3QgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc3dwdHI7Ci0JaW50IGNudDsKLQotCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfRlVOQ1RJT04sIDQsCi0JCXByaW50aygiY3M0Nnh4OiBjc193cml0ZSBjYWxsZWQsIGNvdW50ID0gJXpkXG4iLCBjb3VudCkgKTsKLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQlpZiAoIXN0YXRlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCi0JbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCXJldCA9IC1FTlhJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBfX3Byb2dfZG1hYnVmKHN0YXRlKSkpCi0JCWdvdG8gb3V0OwotCWFkZF93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKLQlyZXQgPSAwOwotLyoKLSogU3RhcnQgdGhlIGxvb3AgdG8gcmVhZCBmcm9tIHRoZSB1c2VyJ3MgYnVmZmVyIGFuZCB3cml0ZSB0byB0aGUgZG1hIGJ1ZmZlci4KLSogY2hlY2sgZm9yIFBNIGV2ZW50cyBhbmQgdW5kZXJydW4vb3ZlcnJ1biBpbiB0aGUgbG9vcC4KLSovCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQl3aGlsZSAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkgewotCQkJc2NoZWR1bGUoKTsKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChkbWFidWYtPmNvdW50IDwgMCkgewotCQkJLyogYnVmZmVyIHVuZGVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tIHNsZWVwX29uX3RpbWVvdXQsCi0JCQkgICByZXN5bmMgaHdwdHIgYW5kIHN3cHRyICovCi0JCQlkbWFidWYtPmNvdW50ID0gMDsKLQkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwotCQl9Ci0JCWlmIChkbWFidWYtPnVuZGVycnVuKSB7Ci0JCQlkbWFidWYtPnVuZGVycnVuID0gMDsKLQkJCWRtYWJ1Zi0+aHdwdHIgPSBjc19nZXRfZG1hX2FkZHIoc3RhdGUpOwotCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7Ci0JCX0KLQotCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7Ci0JCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwotCQlpZiAoZG1hYnVmLT5jb3VudCArIGNudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKLQkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+Y291bnQ7Ci0JCWlmIChjbnQgPD0gMCkKLQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoY250ID4gY291bnQpCi0JCQljbnQgPSBjb3VudDsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQkvKiBidWZmZXIgaXMgZnVsbCwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCB3YWl0IGZvciBkYXRhIHRvIGJlCi0JCQkgICBwbGF5ZWQgKi8KLQkJCXN0YXJ0X2RhYyhzdGF0ZSk7Ci0JCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVBR0FJTjsKLQkJCQlnb3RvIG91dDsKLSAJCQl9Ci0JCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCQkJc2NoZWR1bGUoKTsKLSAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gb3V0OwotIAkJCX0KLQkJCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FTlhJTzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLSAJCQljb250aW51ZTsKLSAJCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgewotCQkJaWYgKCFyZXQpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7Ci0JCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKLQkJZG1hYnVmLT5jb3VudCArPSBjbnQ7Ci0JCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7Ci0JCQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX0VSUk9SLCAyLCBwcmludGsoCi0JCQkgICAgImNzNDZ4eDogY3Nfd3JpdGUoKSBkLT5jb3VudCA+IGRtYXNpemUgLSByZXNldHRpbmdcbiIpKTsKLQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7Ci0JCX0KLQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQljb3VudCAtPSBjbnQ7Ci0JCWJ1ZmZlciArPSBjbnQ7Ci0JCXJldCArPSBjbnQ7Ci0JCXN0YXJ0X2RhYyhzdGF0ZSk7Ci0JfQotb3V0OgotCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX0ZVTkNUSU9OLCAyLCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzX3dyaXRlKCktIHJldD0lemRcbiIsIHJldCkpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcG9sbCgpKyBcbiIpKTsKLQlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEKSkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKLQkJfQotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKLQkJfQotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JY3NfdXBkYXRlX3B0cihjYXJkLCBDU19GQUxTRSk7Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCQl9Ci0JfQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQkgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChzaWduZWQpZG1hYnVmLT5kbWFzaXplID49IGRtYWJ1Zi0+Y291bnQgCi0JCQkJCSsgKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQotCQkJCSAgICBtYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BvbGwoKS0gKDB4JXgpIFxuIiwKLQkJbWFzaykpOwotCXJldHVybiBtYXNrOwotfQotCi0vKgotICoJV2UgbGV0IHVzZXJzIG1tYXAgdGhlIHJpbmcgYnVmZmVyLiBJdHMgbm90IHRoZSByZWFsIERNQSBidWZmZXIgYnV0Ci0gKgl0aGF0IHNpZGUgb2YgdGhlIGNvZGUgaXMgaGlkZGVuIGluIHRoZSBJUlEgaGFuZGxpbmcuIFdlIGRvIGEgc29mdHdhcmUKLSAqCWVtdWxhdGlvbiBvZiBETUEgZnJvbSBhIDY0SyBvciBzbyBidWZmZXIgaW50byBhIDJLIEZJRk8uIAotICoJKHRoZSBoYXJkd2FyZSBwcm9iYWJseSBkZXNlcnZlcyBhIG1vYW4gaGVyZSBidXQgQ3J5c3RhbCBzZW5kIG1lIG5pY2UKLSAqCXRveXMgOykpLgotICovCi0gCi1zdGF0aWMgaW50IGNzX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1BBUk1TLCAyLCBwcmludGsoImNzNDZ4eDogY3NfbW1hcCgpKyBmaWxlPSVwICVzICVzXG4iLCAKLQkJZmlsZSwgdm1hLT52bV9mbGFncyAmIFZNX1dSSVRFID8gIlZNX1dSSVRFIiA6ICIiLAotCQl2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCA/ICJWTV9SRUFEIiA6ICIiKSApOwotCi0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgewotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKAotCQkJICAiY3M0Nnh4OiBjc19tbWFwKCkgVk1fV1JJVEUgLSBzdGF0ZSBUUlVFIHByb2dfZG1hYnVmIERBQ1xuIikgKTsKLQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSAhPSAwKQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZiAoc3RhdGUpIHsKLQkJCUNTX0RCR09VVChDU19PUEVOLCAyLCBwcmludGsoCi0JCQkgICJjczQ2eHg6IGNzX21tYXAoKSBWTV9SRUFEIC0gc3RhdGUgVFJVRSBwcm9nX2RtYWJ1ZiBBRENcbiIpICk7Ci0JCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkgIT0gMCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JfSBlbHNlIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoCi0JCSAgImNzNDZ4eDogY3NfbW1hcCgpIHJldHVybiAtRUlOVkFMXG4iKSApOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLS8qCi0gKiBGb3Igbm93IE9OTFkgc3VwcG9ydCBwbGF5YmFjaywgYnV0IHNlZW1zIGxpa2UgdGhlIG9ubHkgd2F5IHRvIHVzZQotICogbW1hcCgpIGlzIHRvIG9wZW4gYW4gRkQgd2l0aCBSRFdSLCBqdXN0IHJlYWQgb3IganVzdCB3cml0ZSBhY2Nlc3MKLSAqIGRvZXMgbm90IGZ1bmN0aW9uLCBnZXQgYW4gZXJyb3IgYmFjayBmcm9tIHRoZSBrZXJuZWwuCi0gKiBBbHNvLCBRdWFrZUlJSSBvcGVucyB3aXRoIFJEV1IhICBTbywgdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcKLSAqIHRvIG5lZWRpbmcgcmVhZC93cml0ZSBhY2Nlc3MgbWFwcGluZy4gIFNvLCBhbGxvdyByZWFkL3dyaXRlIGJ1dCAKLSAqIHVzZSB0aGUgREFDIG9ubHkuCi0gKi8KLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsgIAotCWlmICghc3RhdGUpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JaWYgKGNzNHhfcGdvZmYodm1hKSAhPSAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCi0JQ1NfREJHT1VUKENTX1BBUk1TLCAyLCBwcmludGsoImNzNDZ4eDogY3NfbW1hcCgpOiBzaXplPSVkXG4iLCh1bnNpZ25lZClzaXplKSApOwotCi0JaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKLQkJCSAgICAgdmlydF90b19waHlzKGRtYWJ1Zi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAotCQkJICAgICBzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXQ7Ci0JfQotCWRtYWJ1Zi0+bWFwcGVkID0gMTsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKS1cbiIpICk7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQlyZXR1cm4gcmV0OwkKLX0KLQotc3RhdGljIGludCBjc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYXVkaW9fYnVmX2luZm8gYWJpbmZvOwotCWNvdW50X2luZm8gY2luZm87Ci0JaW50IHZhbCwgdmFsc2F2ZSwgcmV0OwotCWludCBtYXBwZWQgPSAwOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBfX3VzZXIgKnAgPSBhcmdwOwotCi0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JaWYgKHN0YXRlKSB7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQltYXBwZWQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgZG1hYnVmLT5tYXBwZWQ7Ci0JfQotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCWlmIChzdGF0ZSkgewotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJbWFwcGVkIHw9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgZG1hYnVmLT5tYXBwZWQ7Ci0JfQotCQkKLSNpZiBDU0RFQlVHCi0JcHJpbnRpb2N0bChjbWQpOwotI2VuZGlmCi0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgT1NTX0dFVFZFUlNJT046Ci0JCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKLQljYXNlIFNORENUTF9EU1BfUkVTRVQ6Ci0JCS8qIEZJWE1FOiBzcGluX2xvY2sgPyAqLwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOwotCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7Ci0JCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOwotCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKLQkJCQlkbWFidWYtPmJsb2NrcyA9IDA7Ci0JCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7Ci0JCQkJcmVzeW5jX2RtYV9wdHJzKHN0YXRlKTsKLQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7Ci0JCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwotCQkJCWRtYWJ1Zi0+YmxvY2tzID0gMDsKLQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJfQotCQl9Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgMiwgcHJpbnRrKCJjczQ2eHg6IERTUF9SRVNFVCgpLVxuIikgKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX1NZTkM6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCXJldHVybiBkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX1NQRUVEOiAvKiBzZXQgc2FtcGxlIHJhdGUgKi8KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHZhbCA+PSAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJCWlmIChzdGF0ZSkgewotCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJY3Nfc2V0X2FkY19yYXRlKHN0YXRlLCB2YWwpOwotCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJCWlmIChzdGF0ZSkgewotCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJY3Nfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOwotCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCX0KLQkJCX0KLQkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoCi0JCQkgICAgImNzNDZ4eDogY3NfaW9jdGwoKSBEU1BfU1BFRUQgJXMgJXMgJWRcbiIsCi0JCQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiREFDIiA6ICIiLAotCQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiQURDIiA6ICIiLAotCQkJCWRtYWJ1Zi0+cmF0ZSApICk7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1NURVJFTzogLyogc2V0IHN0ZXJlbyBvciBtb25vIGNoYW5uZWwgKi8KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCWlmICh2YWwpCi0JCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87Ci0JCQkJZWxzZQotCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX1NURVJFTzsKLQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoCi0JCQkJICAgICJjczQ2eHg6IERTUF9TVEVSRU8oKSBEQUMgJXNcbiIsCi0JCQkJICAgIChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8KLQkJCQkJIlNURVJFTyI6Ik1PTk8iKSApOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCWlmICh2YWwpCi0JCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87Ci0JCQkJZWxzZQotCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX1NURVJFTzsKLQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoCi0JCQkJICAgICJjczQ2eHg6IERTUF9TVEVSRU8oKSBBREMgJXNcbiIsCi0JCQkJICAgIChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8KLQkJCQkJIlNURVJFTyI6Ik1PTk8iKSApOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQlyZXR1cm4gdmFsOwotCQkJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCXJldHVybiB2YWw7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUvZG1hYnVmLT5kaXZpc29yLCAKLQkJCQkJCXApOwotCQkJfQotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgb2Ygc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQqLwotCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1U4LCBwKTsKLQljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3Qgc2FtcGxlIGZvcm1hdCAqLwotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKAotCQkgICAgImNzNDZ4eDogY3NfaW9jdGwoKSBEU1BfU0VURk1UICVzICVzICVzICVzXG4iLAotCQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiREFDIiA6ICIiLAotCQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJBREMiIDogIiIsCi0JCQl2YWwgPT0gQUZNVF9TMTZfTEUgPyAiMTZCaXQgU2lnbmVkIiA6ICIiLAotCQkJdmFsID09IEFGTVRfVTggPyAiOEJpdCBVbnNpZ25lZCIgOiAiIikgKTsKLQkJdmFsc2F2ZSA9IHZhbDsKLQkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7Ci0JCQlpZiAodmFsPT1BRk1UX1MxNl9MRSB8fCB2YWw9PUFGTVRfVTgpIHsKLQkJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQkJCWlmIChzdGF0ZSkgewotCQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQotCQkJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF8xNkJJVDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UXzE2QklUOwotCQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCQkJCQlyZXR1cm4gcmV0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJCXZhbCA9IHZhbHNhdmU7Ci0JCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKLQkJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfMTZCSVQ7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF8xNkJJVDsKLQkJCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfRVJST1IsIDIsIHByaW50aygKLQkJCQkgICAgImNzNDZ4eDogRFNQX1NFVEZNVCgpIFVuc3VwcG9ydGVkIGZvcm1hdCAoMHgleClcbiIsCi0JCQkJCXZhbHNhdmUpICk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCQlpZiAoc3RhdGUpCi0JCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJfSBlbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQkJaWYgKHN0YXRlKQotCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCX0KLQkJfQotCQlpZiAoZG1hYnVmKSB7Ci0JCQlpZiAoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpCi0JCQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9VOCwgcCk7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHZhbCAhPSAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCWlmICh2YWwgPiAxKQotCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKLQkJCQkJZWxzZQotCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87Ci0JCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJCWlmIChwcm9nX2RtYWJ1ZihzdGF0ZSkpCi0JCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJCWlmIChzdGF0ZSkgewotCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJaWYgKHZhbCA+IDEpCi0JCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOwotCQkJCQllbHNlCi0JCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX1NURVJFTzsKLQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQkJaWYgKHByb2dfZG1hYnVmKHN0YXRlKSkKLQkJCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPyAyIDogMSwKLQkJCQlwKTsKLQljYXNlIFNORENUTF9EU1BfUE9TVDoKLQkJLyoKLQkJICogVGhlcmUgd2lsbCBiZSBhIGxvbmdlciB0aGFuIG5vcm1hbCBwYXVzZSBpbiB0aGUgZGF0YS4KLQkJICogc28uLi4gZG8gbm90aGluZywgYmVjYXVzZSB0aGVyZSBpcyBub3RoaW5nIHRoYXQgd2UgY2FuIGRvLgotCQkgKi8KLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gdmFsOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gdmFsOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwotCQkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKLQkJCQlkbWFidWYtPm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCQkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKLQkJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwotCQkvKgotCQkgKiBmb3IgbW1hcCB3ZSBhbHdheXMgaGF2ZSB0b3RhbCBzcGFjZSBhdmFpbGFibGUKLQkJICovCi0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpCi0JCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplOwotCQkJZWxzZQotCQkJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+Y291bnQ7Ci0KLQkJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKLQkJfQotCQlyZXR1cm4gLUVOT0RFVjsKLQljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQkJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemUvZG1hYnVmLT5kaXZpc29yOwotCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5jb3VudC9kbWFidWYtPmRpdmlzb3I7Ci0JCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+bnVtZnJhZzsKLQkJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKLQkJfQotCQlyZXR1cm4gLUVOT0RFVjsKLQljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6Ci0JCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX1JFQUxUSU1FfERTUF9DQVBfVFJJR0dFUnxEU1BfQ0FQX01NQVAsCi0JCQkgICAgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6Ci0JCXZhbCA9IDA7Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgMiwgcHJpbnRrKCJjczQ2eHg6IERTUF9HRVRUUklHR0VSKCkrXG4iKSApOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCi0JCQkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKLQkJCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOwotCQkJfQotCQl9Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgMiwgcHJpbnRrKCJjczQ2eHg6IERTUF9HRVRUUklHR0VSKCktIHZhbD0weCV4XG4iLHZhbCkgKTsKLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6Ci0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7Ci0JCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCXN0YXJ0X2FkYyhzdGF0ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7Ci0JCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCXN0YXJ0X2RhYyhzdGF0ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7Ci0JCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMvZG1hYnVmLT5kaXZpc29yOwotCQkJY2luZm8uYmxvY2tzID0gZG1hYnVmLT5jb3VudC9kbWFidWYtPmRpdmlzb3IgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7Ci0JCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyL2RtYWJ1Zi0+ZGl2aXNvcjsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gLUVOT0RFVjsKLQljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQkJY2luZm8uYmxvY2tzID0gKGNpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0KSAKLQkJCQkJCQktIGRtYWJ1Zi0+YmxvY2tzOwotCQkJCUNTX0RCR09VVChDU19QQVJNUywgOCwgCi0JCQkJCXByaW50aygidG90YWxfYnl0ZXM9JWQgYmxvY2tzPSVkIGRtYWJ1Zi0+YmxvY2tzPSVkXG4iLCAKLQkJCQkJY2luZm8uYnl0ZXMsY2luZm8uYmxvY2tzLGRtYWJ1Zi0+YmxvY2tzKSApOwotCQkJCWRtYWJ1Zi0+YmxvY2tzID0gY2luZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7Ci0JCQl9IGVsc2UgewotCQkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7Ci0JCQl9Ci0JCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOwotCi0JCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJCSAgICAiY3M0Nnh4OiBHRVRPUFRSIGJ5dGVzPSVkIGJsb2Nrcz0lZCBwdHI9JWRcbiIsCi0JCQkJY2luZm8uYnl0ZXMsY2luZm8uYmxvY2tzLGNpbmZvLnB0cikgKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gLUVOT0RFVjsKLQljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7Ci0JCQl2YWwgPSBkbWFidWYtPmNvdW50OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJfSBlbHNlCi0JCQl2YWwgPSAwOwotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWVsc2UgCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQllbHNlIAotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPyAyIDogMSwKLQkJCQlwKTsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQllbHNlIAotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSA/IAotCQkJICAJQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKLQotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQljYXNlIFNORENUTF9EU1BfTUFQSU5CVUY6Ci0JY2FzZSBTTkRDVExfRFNQX01BUE9VVEJVRjoKLQljYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgotCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKLQljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi0KLS8qCi0gKglBTVAgY29udHJvbCAtIG51bGwgQU1QCi0gKi8KLSAKLXN0YXRpYyB2b2lkIGFtcF9ub25lKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQotewkKLX0KLQotLyoKLSAqCUNyeXN0YWwgRUFQRCBtb2RlCi0gKi8KLSAKLXN0YXRpYyB2b2lkIGFtcF92b3lldHJhKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQotewotCS8qIE1hbmFnZSB0aGUgRUFQRCBiaXQgb24gdGhlIENyeXN0YWwgNDI5NyAKLQkgICBhbmQgdGhlIEFuYWxvZyBBRDE4ODUgKi8KLQkgICAKLQlpbnQgb2xkID0gY2FyZC0+YW1wbGlmaWVyOwotCQotCWNhcmQtPmFtcGxpZmllcis9Y2hhbmdlOwotCWlmIChjYXJkLT5hbXBsaWZpZXIgJiYgIW9sZCkgewotCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvbiAqLwotCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCAgQUM5N19QT1dFUl9DT05UUk9MLCAKLQkJCWNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgfAotCQkJCTB4ODAwMCk7Ci0JfSBlbHNlIGlmKG9sZCAmJiAhY2FyZC0+YW1wbGlmaWVyKSB7Ci0JCS8qIFR1cm4gdGhlIEVBUEQgYW1wIG9mZiAqLwotCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCAgQUM5N19QT1dFUl9DT05UUk9MLCAKLQkJCWNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJgotCQkJCX4weDgwMDApOwotCX0KLX0KLQotCQkgICAgICAgCi0vKgotICoJR2FtZSBUaGVhdHJlIFhQIGNhcmQgLSBFR1BJT1syXSBpcyB1c2VkIHRvIGVuYWJsZSB0aGUgZXh0ZXJuYWwgYW1wLgotICovCi0gCi1zdGF0aWMgdm9pZCBhbXBfaGVyY3VsZXMoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFuZ2UpCi17Ci0JaW50IG9sZCA9IGNhcmQtPmFtcGxpZmllcjsKLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplZC5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQljYXJkLT5hbXBsaWZpZXIrPWNoYW5nZTsKLQlpZiAoKGNhcmQtPmFtcGxpZmllciAmJiAhb2xkKSAmJiAhKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUpKSB7Ci0JCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGFtcF9oZXJjdWxlcygpIGV4dGVybmFsIGFtcCBlbmFibGVkXG4iKSk7Ci0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT0RSLCAKLQkJCUVHUElPRFJfR1BPRTIpOyAgICAgLyogZW5hYmxlIEVHUElPMiBvdXRwdXQgKi8KLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPUFRSLCAKLQkJCUVHUElPUFRSX0dQUFQyKTsgICAvKiBvcGVuLWRyYWluIG9uIG91dHB1dCAqLwotCX0gZWxzZSBpZiAob2xkICYmICFjYXJkLT5hbXBsaWZpZXIpIHsKLQkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgZXh0ZXJuYWwgYW1wIGRpc2FibGVkXG4iKSk7Ci0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT0RSLCAwKTsgLyogZGlzYWJsZSAqLwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9QVFIsIDApOyAvKiBkaXNhYmxlICovCi0JfQotfQotCi0vKgotICoJSGFuZGxlIHRoZSBDTEtSVU4gb24gYSB0aGlua3BhZC4gV2UgbXVzdCBkaXNhYmxlIENMS1JVTiBzdXBwb3J0Ci0gKgl3aGVuZXZlciB3ZSBuZWVkIHRvIGJlYXQgb24gdGhlIGNoaXAuCi0gKgotICoJVGhlIG9yaWdpbmFsIGlkZWEgYW5kIGNvZGUgZm9yIHRoaXMgaGFjayBjb21lcyBmcm9tIERhdmlkIEthaXNlciBhdAotICoJTGludXhjYXJlLiBQZXJoYXBzIG9uZSBkYXkgQ3J5c3RhbCB3aWxsIGRvY3VtZW50IHRoZWlyIGNoaXBzIHdlbGwKLSAqCWVub3VnaCB0byBtYWtlIHRoZW0gdXNlZnVsLgotICovCi0gCi1zdGF0aWMgdm9pZCBjbGtydW5faGFjayhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqYWNwaV9kZXY7Ci0JdTE2IGNvbnRyb2w7Ci0JdTggcHA7Ci0JdW5zaWduZWQgbG9uZyBwb3J0OwotCWludCBvbGQgPSBjYXJkLT5hY3RpdmU7Ci0JCi0JY2FyZC0+YWN0aXZlKz1jaGFuZ2U7Ci0JCi0JYWNwaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCk7Ci0JaWYgKGFjcGlfZGV2ID09IE5VTEwpCi0JCXJldHVybjsJCS8qIE5vdCBhIHRoaW5rcGFkIHRoYXRzIGZvciBzdXJlICovCi0KLQkvKiBGaW5kIHRoZSBjb250cm9sIHBvcnQgKi8JCQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFjcGlfZGV2LCAweDQxLCAmcHApOwotCXBvcnQgPSBwcCA8PCA4OwotCi0JLyogUmVhZCBBQ1BJIHBvcnQgKi8JCi0JY29udHJvbCA9IGludyhwb3J0ICsgMHgxMCk7Ci0KLQkvKiBGbGlwIENMS1JVTiBvZmYgd2hpbGUgcnVubmluZyAqLwotCWlmICghY2FyZC0+YWN0aXZlICYmIG9sZCkgewotCQlDU19EQkdPVVQoQ1NfUEFSTVMgLCA5LCBwcmludGsoIEtFUk5fSU5GTwotCQkJImNzNDZ4eDogY2xrcnVuKCkgZW5hYmxlIGNsa3J1biAtIGNoYW5nZT0lZCBhY3RpdmU9JWRcbiIsCi0JCQkJY2hhbmdlLGNhcmQtPmFjdGl2ZSkpOwotCQlvdXR3KGNvbnRyb2x8MHgyMDAwLCBwb3J0KzB4MTApOwotCX0gZWxzZSB7Ci0JLyoKLQkqIHNvbWV0aW1lcyBvbiBhIHJlc3VtZSB0aGUgYml0IGlzIHNldCwgc28gYWx3YXlzIHJlc2V0IHRoZSBiaXQuCi0JKi8KLQkJQ1NfREJHT1VUKENTX1BBUk1TICwgOSwgcHJpbnRrKCBLRVJOX0lORk8KLQkJCSJjczQ2eHg6IGNsa3J1bigpIGRpc2FibGUgY2xrcnVuIC0gY2hhbmdlPSVkIGFjdGl2ZT0lZFxuIiwKLQkJCQljaGFuZ2UsY2FyZC0+YWN0aXZlKSk7Ci0JCW91dHcoY29udHJvbCZ+MHgyMDAwLCBwb3J0KzB4MTApOwotCX0KLQlwY2lfZGV2X3B1dChhY3BpX2Rldik7Ci19Ci0KLQkKLXN0YXRpYyBpbnQgY3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlID0gTlVMTDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgICAgICB1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfT1BFTiB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpKyBmaWxlPSVwICVzICVzXG4iLAotCQlmaWxlLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJGTU9ERV9XUklURSIgOiAiIiwKLQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJGTU9ERV9SRUFEIiA6ICIiKSApOwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7Ci0KLQkJaWYgKCEoKGNhcmQtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpKQotCQkJYnJlYWs7Ci0JfQotCWlmIChlbnRyeSA9PSAmY3M0Nnh4X2RldnMpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghY2FyZCkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCAyLCBwcmludGsoS0VSTl9JTkZPCi0JCQkiY3M0Nnh4OiBjc19vcGVuKCk6IEVycm9yIC0gdW5hYmxlIHRvIGZpbmQgYXVkaW8gY2FyZCBzdHJ1Y3RcbiIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyoKLQkgKiBoYXJkY29kZSBzdGF0ZVswXSBmb3IgY2FwdHVyZSwgWzFdIGZvciBwbGF5YmFjawotCSAqLwotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCkgRk1PREVfUkVBRFxuIikgKTsKLQkJaWYgKGNhcmQtPnN0YXRlc1swXSA9PSBOVUxMKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXSA9Ci0JCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGNzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoc3RhdGUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCW11dGV4X2luaXQoJnN0YXRlLT5zZW0pOwotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlkbWFidWYtPnBidWYgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JCQlpZiAoZG1hYnVmLT5wYnVmID09IE5VTEwpIHsKLQkJCQlrZnJlZShzdGF0ZSk7Ci0JCQkJY2FyZC0+c3RhdGVzWzBdID0gTlVMTDsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpOwotCQkJCi0JCWlmIChkbWFidWYtPmNoYW5uZWwgPT0gTlVMTCkgewotCQkJa2ZyZWUoY2FyZC0+c3RhdGVzWzBdKTsKLQkJCWNhcmQtPnN0YXRlc1swXSA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCS8qIE5vdyB0dXJuIG9uIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KLQkJc3RhdGUtPmNhcmQgPSBjYXJkOwotCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsIDEpOwotCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsIDEpOwotCQkKLQkJaWYgKCh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9BREMpKSkgewotCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCBvZiBBREMgZmFpbGVkICgweCV4KVxuIiwgdG1wKSk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCi0JCWRtYWJ1Zi0+Y2hhbm5lbC0+c3RhdGUgPSBzdGF0ZTsKLQkJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCi0JCXN0YXRlLT52aXJ0ID0gMDsKLQkJc3RhdGUtPm1hZ2ljID0gQ1NfU1RBVEVfTUFHSUM7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7Ci0JCW11dGV4X2luaXQoJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKLQotCQltdXRleF9sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0KLQkJLyogc2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdC4gQWNjb3JkaW5nIHRvIE9TUyBQcm9ncmFtbWVyJ3MgR3VpZGUgIC9kZXYvZHNwCi0JCSAgIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgd2l0aCBzYW1wbGUgcmF0ZSA4a0h6IGFuZAotCQkgICAvZGV2L2RzcFcgd2lsbCBhY2NlcHQgMTYtYml0cyBzYW1wbGUgKi8KLQotCQkvKiBEZWZhdWx0IGlucHV0IGlzIDhiaXQgbW9ubyAqLwotCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX01BU0s7Ci0JCWRtYWJ1Zi0+dHlwZSA9IENTX1RZUEVfQURDOwotCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDA7Ci0JCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgID0gMDsKLQkJZG1hYnVmLT5zdWJkaXZpc2lvbiAgPSAwOwotCQljc19zZXRfYWRjX3JhdGUoc3RhdGUsIDgwMDApOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCi0JCXN0YXRlLT5vcGVuX21vZGUgfD0gRk1PREVfUkVBRDsKLQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JfQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSBGTU9ERV9XUklURVxuIikgKTsKLQkJaWYgKGNhcmQtPnN0YXRlc1sxXSA9PSBOVUxMKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXSA9Ci0JCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGNzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoc3RhdGUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCW11dGV4X2luaXQoJnN0YXRlLT5zZW0pOwotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlkbWFidWYtPnBidWYgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JCQlpZiAoZG1hYnVmLT5wYnVmID09IE5VTEwpIHsKLQkJCQlrZnJlZShzdGF0ZSk7Ci0JCQkJY2FyZC0+c3RhdGVzWzFdID0gTlVMTDsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWRtYWJ1Zi0+Y2hhbm5lbCA9IGNhcmQtPmFsbG9jX3BjbV9jaGFubmVsKGNhcmQpOwotCQkJCi0JCWlmIChkbWFidWYtPmNoYW5uZWwgPT0gTlVMTCkgewotCQkJa2ZyZWUoY2FyZC0+c3RhdGVzWzFdKTsKLQkJCWNhcmQtPnN0YXRlc1sxXSA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCS8qIE5vdyB0dXJuIG9uIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KLQkJc3RhdGUtPmNhcmQgPSBjYXJkOwotCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsIDEpOwotCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsIDEpOwotCi0JCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfREFDKSkpIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAgb2YgREFDIGZhaWxlZCAoMHgleClcbiIsIHRtcCkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJCi0JCWRtYWJ1Zi0+Y2hhbm5lbC0+c3RhdGUgPSBzdGF0ZTsKLQkJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCi0JCXN0YXRlLT52aXJ0ID0gMTsKLQkJc3RhdGUtPm1hZ2ljID0gQ1NfU1RBVEVfTUFHSUM7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7Ci0JCW11dGV4X2luaXQoJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKLQotCQltdXRleF9sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0KLQkJLyogc2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdC4gQWNjb3JkaW5nIHRvIE9TUyBQcm9ncmFtbWVyJ3MgR3VpZGUgIC9kZXYvZHNwCi0JCSAgIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgd2l0aCBzYW1wbGUgcmF0ZSA4a0h6IGFuZAotCQkgICAvZGV2L2RzcFcgd2lsbCBhY2NlcHQgMTYtYml0cyBzYW1wbGUgKi8KLQotCQkvKiBEZWZhdWx0IG91dHB1dCBpcyA4Yml0IG1vbm8uICovCi0JCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfTUFTSzsKLQkJZG1hYnVmLT50eXBlID0gQ1NfVFlQRV9EQUM7Ci0JCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKLQkJZG1hYnVmLT5vc3NtYXhmcmFncyAgPSAwOwotCQlkbWFidWYtPnN1YmRpdmlzaW9uICA9IDA7Ci0JCWNzX3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7Ci0JCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0KLQkJc3RhdGUtPm9wZW5fbW9kZSB8PSBGTU9ERV9XUklURTsKLQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCXJldHVybiByZXQ7Ci0JfQotCUNTX0RCR09VVChDU19PUEVOIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCktIDBcbiIpKTsKLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgY3NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCUNTX0RCR09VVChDU19SRUxFQVNFIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCkrIGZpbGU9JXAgJXMgJXNcbiIsCi0JCWZpbGUsIGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkZNT0RFX1dSSVRFIiA6ICIiLAotCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEID8gIkZNT0RFX1JFQUQiIDogIiIpKTsKLQotCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JaWYgKHN0YXRlKSB7Ci0JCWlmICgoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKSAmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKLQkJCUNTX0RCR09VVChDU19SRUxFQVNFLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpIEZNT0RFX1dSSVRFXG4iKSk7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCWNzX2NsZWFyX3RhaWwoc3RhdGUpOwotCQkJZHJhaW5fZGFjKHN0YXRlLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0JCQkvKiBzdG9wIERNQSBzdGF0ZSBtYWNoaW5lIGFuZCBmcmVlIERNQSBidWZmZXJzL2NoYW5uZWxzICovCi0JCQltdXRleF9sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQlkZWFsbG9jX2RtYWJ1ZihzdGF0ZSk7Ci0JCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXN0YXRlLT5kbWFidWYucGJ1Zik7Ci0KLQkJCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fbXV0ZXggKi8KLQkJCW11dGV4X3VubG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQkJc3RhdGUtPmNhcmQtPnN0YXRlc1tzdGF0ZS0+dmlydF0gPSBOVUxMOwotCQkJc3RhdGUtPm9wZW5fbW9kZSAmPSAofmZpbGUtPmZfbW9kZSkgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7Ci0KLQkJCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMsIENTX0ZBTFNFKSkpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJCSJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkgcG93ZXJkb3duIERBQyBmYWlsdXJlICgweCV4KVxuIix0bXApICk7Ci0JCQl9Ci0KLQkJCS8qIE5vdyB0dXJuIG9mZiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCi0JCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKLQkJCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOwotCQkJa2ZyZWUoc3RhdGUpOwotCQl9Ci0JfQotCi0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JaWYgKHN0YXRlKSB7Ci0JCWlmICgoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1JFQUQpICYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9SRUFEXG4iKSk7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCW11dGV4X2xvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCWRlYWxsb2NfZG1hYnVmKHN0YXRlKTsKLQkJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLCBkbWFidWYtPmNoYW5uZWwtPm51bSk7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpc3RhdGUtPmRtYWJ1Zi5wYnVmKTsKLQotCQkJLyogd2UncmUgY292ZXJlZCBieSB0aGUgb3Blbl9tdXRleCAqLwotCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCQlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7Ci0JCQlzdGF0ZS0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKLQotCQkJaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0FEQywgQ1NfRkFMU0UpKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gQURDIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKLQkJCX0KLQotCQkJLyogTm93IHR1cm4gb2ZmIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KLQkJCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOwotCQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7Ci0JCQlrZnJlZShzdGF0ZSk7Ci0JCX0KLQl9Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpLSAwXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50cG0oc3RydWN0IGNzX2NhcmQgKnMpCi17Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInBtIHN0cnVjdDpcbiIpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiZmxhZ3M6MHgleCB1MzJDTEtDUjFfU0FWRTogMCV4IHUzMlNTUE1WYWx1ZTogMHgleFxuIiwKLQkJKHVuc2lnbmVkKXMtPnBtLmZsYWdzLHMtPnBtLnUzMkNMS0NSMV9TQVZFLHMtPnBtLnUzMlNTUE1WYWx1ZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJQUExWQ3ZhbHVlOiAweCV4IHUzMlBQUlZDdmFsdWU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMlBQTFZDdmFsdWUscy0+cG0udTMyUFBSVkN2YWx1ZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJGTUxWQ3ZhbHVlOiAweCV4IHUzMkZNUlZDdmFsdWU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkZNTFZDdmFsdWUscy0+cG0udTMyRk1SVkN2YWx1ZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJHUElPUnZhbHVlOiAweCV4IHUzMkpTQ1RMdmFsdWU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkdQSU9SdmFsdWUscy0+cG0udTMySlNDVEx2YWx1ZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJTU0NSOiAweCV4IHUzMlNSQ1NBOiAweCV4XG4iLAotCQlzLT5wbS51MzJTU0NSLHMtPnBtLnUzMlNSQ1NBKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRhY0FTUjogMHgleCB1MzJBZGNBU1I6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkRhY0FTUixzLT5wbS51MzJBZGNBU1IpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRGFjU1I6IDB4JXggdTMyQWRjU1I6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkRhY1NSLHMtPnBtLnUzMkFkY1NSKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMk1JRENSX1NhdmU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMk1JRENSX1NhdmUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19wb3dlcmRvd246IDB4JXggX2dlbmVyYWxfcHVycG9zZSAweCV4XG4iLAotCQlzLT5wbS51MzJBQzk3X3Bvd2VyZG93bixzLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X21hc3Rlcl92b2x1bWU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X2hlYWRwaG9uZV92b2x1bWU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubzogMHgleFxuIiwKLQkJcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8pKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19wY21fb3V0X3ZvbHVtZTogMHgleFxuIiwKLQkJcy0+cG0udTMyQUM5N19wY21fb3V0X3ZvbHVtZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJkbWFidWZfc3dwdHJfcGxheTogMHgleCBkbWFidWZfY291bnRfcGxheTogJWRcbiIsCi0JCXMtPnBtLmRtYWJ1Zl9zd3B0cl9wbGF5LHMtPnBtLmRtYWJ1Zl9jb3VudF9wbGF5KSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImRtYWJ1Zl9zd3B0cl9jYXB0dXJlOiAweCV4IGRtYWJ1Zl9jb3VudF9jYXB0dXJlOiAlZFxuIiwKLQkJcy0+cG0uZG1hYnVmX3N3cHRyX2NhcHR1cmUscy0+cG0uZG1hYnVmX2NvdW50X2NhcHR1cmUpKTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgU3VzcGVuZCAtIHNhdmUgdGhlIGFjOTcgcmVncywgbXV0ZSB0aGUgb3V0cHV0cyBhbmQgcG93ZXIgZG93biB0aGUgcGFydC4gIAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNzNDZ4eF9hYzk3X3N1c3BlbmQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IENvdW50LGk7Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmRldj1jYXJkLT5hYzk3X2NvZGVjWzBdOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19zdXNwZW5kKCkrXG4iKSk7Ci0KLQlpZiAoY2FyZC0+c3RhdGVzWzFdKSB7Ci0JCXN0b3BfZGFjKGNhcmQtPnN0YXRlc1sxXSk7Ci0JCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMV0pOwotCX0KLQlpZiAoY2FyZC0+c3RhdGVzWzBdKSB7Ci0JCXN0b3BfYWRjKGNhcmQtPnN0YXRlc1swXSk7Ci0JCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMF0pOwotCX0KLQotCWZvciAoQ291bnQgPSAweDIsIGkgPSAwOyAoQ291bnQgPD0gQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSkKLQkJCSYmIChpIDwgQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyk7Ci0JCQlDb3VudCArPSAyLCBpKyspIHsKLQkJY2FyZC0+cG0uYWM5N1tpXSA9IGNzX2FjOTdfZ2V0KGRldiwgQkEwX0FDOTdfUkVTRVQgKyBDb3VudCk7Ci0JfQotLyoKLSogU2F2ZSB0aGUgYWM5NyB2b2x1bWUgcmVnaXN0ZXJzIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcG93ZXJkb3duIHN0YXRlLgotKiBOb3csIG11dGUgdGhlIGFsbCB0aGUgb3V0cHV0cyAobWFzdGVyLCBoZWFkcGhvbmUsIGFuZCBtb25vKSwgYXMgd2VsbAotKiBhcyB0aGUgUENNIHZvbHVtZSwgaW4gcHJlcGFyYXRpb24gZm9yIHBvd2VyaW5nIGRvd24gdGhlIGVudGlyZSBwYXJ0LgotCWNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZSA9ICh1MzIpY3NfYWM5N19nZXQoIGRldiwgCi0JCQkodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSk7IAotCWNhcmQtPnBtLnUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAKLQkJCSh1OClCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FKTsgCi0JY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PKTsgCi0JY2FyZC0+cG0udTMyQUM5N19wY21fb3V0X3ZvbHVtZSA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAKLQkJCSh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSk7Ci0qLyAKLS8qCi0qIG11dGUgdGhlIG91dHB1dHMKLSovCi0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgMHg4MDAwKTsKLQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCAweDgwMDApOwotCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTywgMHg4MDAwKTsKLQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgMHg4MDAwKTsKLQotLyoKLSogc2F2ZSB0aGUgcmVnaXN0ZXJzIHRoYXQgY2F1c2UgcG9wcwotKi8KLQljYXJkLT5wbS51MzJBQzk3X3Bvd2VyZG93biA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAodTgpQUM5N19QT1dFUl9DT05UUk9MKTsgCi0JY2FyZC0+cG0udTMyQUM5N19nZW5lcmFsX3B1cnBvc2UgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgKHU4KUJBMF9BQzk3X0dFTkVSQUxfUFVSUE9TRSk7IAotLyoKLSogQW5kIHBvd2VyIGRvd24gZXZlcnl0aGluZyBvbiB0aGUgQUM5NyBjb2RlYy4KLSogd2VsbCwgZm9yIG5vdywgb25seSBwb3dlciBkb3duIHRoZSBEQUMvQURDIGFuZCBNSVhFUiBWUkVGT04gY29tcG9uZW50cy4gCi0qIHRyb3VibGUgd2l0aCByZW1vdmluZyBWUkVGLgotKi8KLQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKLQkJCUNTX1BPV0VSX01JWFZPTiwgQ1NfVFJVRSkpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjczQ2eHhfYWM5N19zdXNwZW5kKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSk7Ci0JfQotCi0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpLVxuIikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgUmVzdW1lIC0gcG93ZXIgdXAgdGhlIHBhcnQgYW5kIHJlc3RvcmUgaXRzIHJlZ2lzdGVycy4uICAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjczQ2eHhfYWM5N19yZXN1bWUoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IENvdW50LGk7Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmRldj1jYXJkLT5hYzk3X2NvZGVjWzBdOwotCi0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfcmVzdW1lKCkrXG4iKSk7Ci0KLS8qCi0qIEZpcnN0LCB3ZSByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgVGhpcwotKiBjb250YWlucyB0aGUgbWljIHNlbGVjdCAobWljMSBvciBtaWMyKSBhbmQgaWYgd2UgcmVzdG9yZSB0aGlzIGFmdGVyCi0qIHdlIHJlc3RvcmUgdGhlIG1pYyB2b2x1bWUvYm9vc3Qgc3RhdGUgYW5kIG1pYzIgd2FzIHNlbGVjdGVkIGF0Ci0qIHN1c3BlbmQgdGltZSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGJyaWVmIHBlcmlvZCBvZiB0aW1lIHdoZXJlIG1pYzEKLSogaXMgc2VsZWN0ZWQgd2l0aCB0aGUgdm9sdW1lL2Jvb3N0IHNldHRpbmdzIGZvciBtaWMyLCBjYXVzaW5nCi0qIGFjb3VzdGljIGZlZWRiYWNrLiAgU28gd2UgcmVzdG9yZSB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyCi0qIGZpcnN0LCB0aGVyZWJ5IGdldHRpbmcgdGhlIGNvcnJlY3QgbWljIHNlbGVjdGVkIGJlZm9yZSB3ZSByZXN0b3JlCi0qIHRoZSBtaWMgdm9sdW1lL2Jvb3N0LgotKi8KLQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UsIAotCQkodTE2KWNhcmQtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlKTsKLS8qCi0qIE5vdywgd2hpbGUgdGhlIG91dHB1dHMgYXJlIHN0aWxsIG11dGVkLCByZXN0b3JlIHRoZSBzdGF0ZSBvZiBwb3dlcgotKiBvbiB0aGUgQUM5NyBwYXJ0LgotKi8KLQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QT1dFUkRPV04sICh1MTYpY2FyZC0+cG0udTMyQUM5N19wb3dlcmRvd24pOwotCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwotLyoKLSogUmVzdG9yZSBqdXN0IHRoZSBmaXJzdCBzZXQgb2YgcmVnaXN0ZXJzLCBmcm9tIHJlZ2lzdGVyIG51bWJlcgotKiAweDAyIHRvIHRoZSByZWdpc3RlciBudW1iZXIgdGhhdCB1bEhpZ2hlc3RSZWdUb1Jlc3RvcmUgc3BlY2lmaWVzLgotKi8KLQlmb3IgKENvdW50ID0gMHgyLCBpPTA7IChDb3VudCA8PSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKSAmJgotCQkJKGkgPCBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsgQ291bnQgKz0gMiwgaSsrKSB7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KShCQTBfQUM5N19SRVNFVCArIENvdW50KSwgKHUxNiljYXJkLT5wbS5hYzk3W2ldKTsKLQl9Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIHRvIGluaXQgdGhlIGFtcGxpZmllciAqLwotCWlmIChjYXJkLT5hbXBfaW5pdCkKLQkJY2FyZC0+YW1wX2luaXQoY2FyZCk7Ci0gICAgICAgIAotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3Jlc3VtZSgpLVxuIikpOwotfQotCi0KLXN0YXRpYyBpbnQgY3M0Nnh4X3Jlc3RhcnRfcGFydChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50ayggImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpK1xuIikpOwotCWlmIChjYXJkLT5zdGF0ZXNbMV0pIHsKLQkJZG1hYnVmID0gJmNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmOwotCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1sxXSk7Ci0JCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCWlmIChfX3Byb2dfZG1hYnVmKGNhcmQtPnN0YXRlc1sxXSkpIHsKLQkJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCAKLQkJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLSAoLTEpIHByb2dfZG1hYnVmKCkgZGFjIGVycm9yXG4iKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJY3Nfc2V0X2RhY19yYXRlKGNhcmQtPnN0YXRlc1sxXSwgZG1hYnVmLT5yYXRlKTsKLQl9Ci0JaWYgKGNhcmQtPnN0YXRlc1swXSkgewotCQlkbWFidWYgPSAmY2FyZC0+c3RhdGVzWzBdLT5kbWFidWY7Ci0JCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzBdKTsKLQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJaWYgKF9fcHJvZ19kbWFidWYoY2FyZC0+c3RhdGVzWzBdKSkgewotCQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDEsIAotCQkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfcmVzdGFydF9wYXJ0KCktICgtMSkgcHJvZ19kbWFidWYoKSBhZGMgZXJyb3JcbiIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQljc19zZXRfYWRjX3JhdGUoY2FyZC0+c3RhdGVzWzBdLCBkbWFidWYtPnJhdGUpOwotCX0KLQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fUkVTVU1FRDsKLQlpZiAoY2FyZC0+c3RhdGVzWzBdKQotCQlzdGFydF9hZGMoY2FyZC0+c3RhdGVzWzBdKTsKLQlpZiAoY2FyZC0+c3RhdGVzWzFdKQotCQlzdGFydF9kYWMoY2FyZC0+c3RhdGVzWzFdKTsKLQotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9JRExFOwotCWNhcmQtPnBtLmZsYWdzICY9IH4oQ1M0NlhYX1BNX1NVU1BFTkRJTkcgfCBDUzQ2WFhfUE1fU1VTUEVOREVEIAotCQkJfCBDUzQ2WFhfUE1fUkVTVU1JTkcgfCBDUzQ2WFhfUE1fUkVTVU1FRCk7Ci0JaWYgKGNhcmQtPnN0YXRlc1swXSkKLQkJd2FrZV91cCgmY2FyZC0+c3RhdGVzWzBdLT5kbWFidWYud2FpdCk7Ci0JaWYgKGNhcmQtPnN0YXRlc1sxXSkKLQkJd2FrZV91cCgmY2FyZC0+c3RhdGVzWzFdLT5kbWFidWYud2FpdCk7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50ayggImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLVxuIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcmVzZXQoc3RydWN0IGNzX2NhcmQgKmNhcmQpOwotc3RhdGljIHZvaWQgY3M0NjF4X3Byb2Nfc3RvcChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7Ci1zdGF0aWMgaW50IGNzNDZ4eF9zdXNwZW5kKHN0cnVjdCBjc19jYXJkICpjYXJkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9zdXNwZW5kKCkrIGZsYWdzPTB4JXggcz0lcFxuIiwKLQkJCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncyxjYXJkKSk7Ci0vKgotKiBjaGVjayB0aGUgY3VycmVudCBzdGF0ZSwgb25seSBzdXNwZW5kIGlmIElETEUKLSovCi0JaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpIHsKLQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDIsIAotCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9zdXNwZW5kKCkgdW5hYmxlIHRvIHN1c3BlbmQsIG5vdCBJRExFXG4iKSk7Ci0JCXJldHVybiAxOwotCX0KLQljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX0lETEU7Ci0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1NVU1BFTkRJTkc7Ci0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLDEpOwotCQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRklFKTsKLQl0bXAgJj0gfjB4MDAwMGYwM2Y7Ci0JdG1wIHw9ICAweDAwMDAwMDEwOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QRklFLCB0bXApOwkvKiBwbGF5YmFjayBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NJRSk7Ci0JdG1wICY9IH4weDAwMDAwMDNmOwotCXRtcCB8PSAgMHgwMDAwMDAxMTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0lFLCB0bXApOwkvKiBjYXB0dXJlIGludGVycnVwdCBkaXNhYmxlICovCi0KLQkvKgotICAgICAgICAgKiAgU3RvcCBwbGF5YmFjayBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BDVEwpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQ1RMLCB0bXAgJiAweDAwMDBmZmZmKTsKLQotCS8qCi0gICAgICAgICAqICBTdG9wIGNhcHR1cmUgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DQ1RMKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NUTCwgdG1wICYgMHhmZmZmMDAwMCk7Ci0KLQlpZiAoY2FyZC0+c3RhdGVzWzFdKSB7Ci0JCWNhcmQtPnBtLmRtYWJ1Zl9zd3B0cl9wbGF5ID0gY2FyZC0+c3RhdGVzWzFdLT5kbWFidWYuc3dwdHI7Ci0JCWNhcmQtPnBtLmRtYWJ1Zl9jb3VudF9wbGF5ID0gY2FyZC0+c3RhdGVzWzFdLT5kbWFidWYuY291bnQ7Ci0JfQotCWlmIChjYXJkLT5zdGF0ZXNbMF0pIHsKLQkJY2FyZC0+cG0uZG1hYnVmX3N3cHRyX2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5zd3B0cjsKLQkJY2FyZC0+cG0uZG1hYnVmX2NvdW50X2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5jb3VudDsKLQl9Ci0KLQljczQ2eHhfYWM5N19zdXNwZW5kKGNhcmQpOwotCi0JLyoKLSAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCi0gICAgICAgICAqLwotCWNzNDYxeF9yZXNldChjYXJkKTsKLQotCWNzNDYxeF9wcm9jX3N0b3AoY2FyZCk7Ci0KLQkvKgotCSAqICBQb3dlciBkb3duIHRoZSBEQUMgYW5kIEFEQy4gIEZvciBub3cgbGVhdmUgdGhlIG90aGVyIGFyZWFzIG9uLgotCSAqLwotCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMzAwKTsKLQotCS8qCi0JICogIFBvd2VyIGRvd24gdGhlIFBMTC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKLQotCS8qCi0JICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAotCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOwotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwtMSk7Ci0KLQljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX1NVU1BFTkRJTkc7Ci0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1NVU1BFTkRFRDsKLQotCXByaW50cG0oY2FyZCk7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpLSBmbGFncz0weCV4XG4iLAotCQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpbnQgaTsKLQotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCkrIGZsYWdzPTB4JXhcbiIsCi0JCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MpKTsKLQlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9TVVNQRU5ERUQpKSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAyLCAKLQkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCkgdW5hYmxlIHRvIHJlc3VtZSwgbm90IFNVU1BFTkRFRFxuIikpOwotCQlyZXR1cm4gMTsKLQl9Ci0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1JFU1VNSU5HOwotCWNhcmQtPnBtLmZsYWdzICY9IH5DUzQ2WFhfUE1fU1VTUEVOREVEOwotCXByaW50cG0oY2FyZCk7Ci0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgMSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCWlmIChjc19oYXJkd2FyZV9pbml0KGNhcmQpICE9IDApIHsKLQkJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCA0LCBwcmludGsoCi0JCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBFUlJPUiBpbiBjc19oYXJkd2FyZV9pbml0KClcbiIpKTsKLQkJCW1kZWxheSgxMCAqIGNzX2xhcHRvcF93YWl0KTsKLQkJCWNzNDYxeF9yZXNldChjYXJkKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlpZiAoaSA+PSA0KSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCBwcmludGsoCi0JCQkiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCktIGNzX2hhcmR3YXJlX2luaXQoKSBmYWlsZWQsIHJldHJpZWQgJWQgdGltZXMuXG4iLGkpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNzNDZ4eF9yZXN0YXJ0X3BhcnQoY2FyZCkpIHsKLQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDQsIHByaW50aygKLQkJCSJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKTogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpIHJldHVybmVkIGVycm9yXG4iKSk7Ci0JfQotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCktIGZsYWdzPTB4JXhcbiIsCi0JCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncykpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3M0NjF4X2ZvcHMgPSB7Ci0JQ1NfT1dORVIJQ1NfVEhJU19NT0RVTEUKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSBjc19yZWFkLAotCS53cml0ZQkJPSBjc193cml0ZSwKLQkucG9sbAkJPSBjc19wb2xsLAotCS5pb2N0bAkJPSBjc19pb2N0bCwKLQkubW1hcAkJPSBjc19tbWFwLAotCS5vcGVuCQk9IGNzX29wZW4sCi0JLnJlbGVhc2UJPSBjc19yZWxlYXNlLAotfTsKLQotLyogV3JpdGUgQUM5NyBjb2RlYyByZWdpc3RlcnMgKi8KLQotCi1zdGF0aWMgdTE2IF9jc19hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKLQlpbnQgY291bnQsbG9vcGNudDsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCXUxNiByZXQ7Ci0JCi0JLyoKLQkgKiAgMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKLQkgKiAgMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoICAgIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcgCi0JICogIDMuIFdyaXRlIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGggZm9yIGluaXRpYXRpbmcgdGhlIHdyaXRlCi0JICogIDQuIFJlYWQgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAotCSAqICA1LiBpZiBEQ1Ygbm90IGNsZWFyZWQsIGJyZWFrIGFuZCByZXR1cm4gZXJyb3IKLQkgKiAgNi4gUmVhZCBBQ1NUUyA9IFN0YXR1cyBSZWdpc3RlciA9IDQ2NGgsIGNoZWNrIFZTVFMgYml0Ci0JICovCi0KLQljczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTREEpOwotCi0JLyoKLQkgKiAgU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDYxeCB0byBzZW5kIHRoZQotCSAqICBhcHByb3ByaWF0ZSBjb21tYW5kIHRvIHRoZSBBQzk3IHRvIHBlcmZvcm0gdGhlIHJlYWQuCi0JICogIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAotCSAqICBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKLQkgKiAgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaAotCSAqICBzZXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCi0JICogIHNldCBDUlcgLSBSZWFkIGNvbW1hbmQKLQkgKiAgc2V0IFZGUk0gLSB2YWxpZCBmcmFtZSBlbmFibGVkCi0JICogIHNldCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCi0JICogIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0Ci0JICovCi0KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDQUQsIHJlZyk7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ0RBLCAwKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX0RDViB8IEFDQ1RMX0NSVyB8Ci0JCQkJCSAgICAgQUNDVExfVkZSTSB8IEFDQ1RMX0VTWU4gfAotCQkJCQkgICAgIEFDQ1RMX1JTVE4pOwotCi0KLQkvKgotCSAqICBXYWl0IGZvciB0aGUgcmVhZCB0byBvY2N1ci4KLQkgKi8KLQlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKLQkJbG9vcGNudCA9IDIwMDA7Ci0JZWxzZQotCQlsb29wY250ID0gNTAwICogY3NfbGFwdG9wX3dhaXQ7Ci0gCWxvb3BjbnQgKj0gY3NfbGFwdG9wX3dhaXQ7Ci0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbG9vcGNudDsgY291bnQrKykgewotCQkvKgotCQkgKiAgRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgotCSAJICovCi0JCXVkZWxheSgxMCAqIGNzX2xhcHRvcF93YWl0KTsKLQkJLyoKLQkJICogIE5vdywgY2hlY2sgdG8gc2VlIGlmIHRoZSByZWFkIGhhcyBjb21wbGV0ZWQuCi0JCSAqICBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMTdoCi0JCSAqLwotCQlpZiAoIShjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSkKLQkJCWJyZWFrOwotCX0KLQotCS8qCi0JICogIE1ha2Ugc3VyZSB0aGUgcmVhZCBjb21wbGV0ZWQuCi0JICovCi0JaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJImNzNDZ4eDogQUMnOTcgcmVhZCBwcm9ibGVtIChBQ0NUTF9EQ1YpLCByZWcgPSAweCV4IHJldHVybmluZyAweGZmZmZcbiIsIHJlZykpOwotCQlyZXR1cm4gMHhmZmZmOwotCX0KLQotCS8qCi0JICogIFdhaXQgZm9yIHRoZSB2YWxpZCBzdGF0dXMgYml0IHRvIGdvIGFjdGl2ZS4KLQkgKi8KLQotCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQotCQlsb29wY250ID0gMjAwMDsKLQllbHNlCi0JCWxvb3BjbnQgPSAxMDAwOwotIAlsb29wY250ICo9IGNzX2xhcHRvcF93YWl0OwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BjbnQ7IGNvdW50KyspIHsKLQkJLyoKLQkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyLgotCQkgKiAgQUNTVFMgPSBTdGF0dXMgUmVnaXN0ZXIgPSA0NjRoCi0JCSAqICBWU1RTIC0gVmFsaWQgU3RhdHVzCi0JCSAqLwotCQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU1RTKSAmIEFDU1RTX1ZTVFMpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOwotCX0KLQkKLQkvKgotCSAqICBNYWtlIHN1cmUgd2UgZ290IHZhbGlkIHN0YXR1cy4KLQkgKi8KLQlpZiAoISgodG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU1RTKSkgJiBBQ1NUU19WU1RTKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkiY3M0Nnh4OiBBQyc5NyByZWFkIHByb2JsZW0gKEFDU1RTX1ZTVFMpLCByZWcgPSAweCV4IHZhbD0weCV4IDB4ZmZmZiBcbiIsIAotCQkJCXJlZywgdG1wKSk7Ci0JCXJldHVybiAweGZmZmY7Ci0JfQotCi0JLyoKLQkgKiAgUmVhZCB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBBQzk3IHJlZ2lzdGVyLgotCSAqICBBQ1NEQSA9IFN0YXR1cyBEYXRhIFJlZ2lzdGVyID0gNDc0aAotCSAqLwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgOSwgcHJpbnRrKEtFUk5fSU5GTwotCQkiY3M0Nnh4OiBjc19hYzk3X2dldCgpIHJlZyA9IDB4JXgsIHZhbCA9IDB4JXgsIEJBMF9BQ0NBRCA9IDB4JXhcbiIsIAotCQkJcmVnLCBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTREEpLAotCQkJY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ0FEKSkpOwotCXJldCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NEQSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHUxNiBjc19hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpCi17Ci0JdTE2IHJldDsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOwotCQotCXNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKLQlyZXQgPSBfY3NfYWM5N19nZXQoZGV2LCByZWcpOwotCXNwaW5fdW5sb2NrKCZjYXJkLT5hYzk3X2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzX2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IHZhbCkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOwotCWludCBjb3VudDsKLQlpbnQgdmFsMiA9IDA7Ci0JCi0Jc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOwotCQotCWlmIChyZWcgPT0gQUM5N19DRF9WT0wpCi0JCXZhbDIgPSBfY3NfYWM5N19nZXQoZGV2LCBBQzk3X0NEX1ZPTCk7Ci0KLQkvKgotCSAqICAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcwotCSAqICAyLiBXcml0ZSBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGggICAgZm9yIGRhdGEgdG8gd3JpdGUgdG8gQUM5NwotCSAqICAzLiBXcml0ZSBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoIGZvciBpbml0aWF0aW5nIHRoZSB3cml0ZQotCSAqICA0LiBSZWFkIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKLQkgKiAgNS4gaWYgRENWIG5vdCBjbGVhcmVkLCBicmVhayBhbmQgcmV0dXJuIGVycm9yCi0JICovCi0KLQkvKgotCSAqICBTZXR1cCB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgQ1M0NjF4IHRvIHNlbmQgdGhlCi0JICogIGFwcHJvcHJpYXRlIGNvbW1hbmQgdG8gdGhlIEFDOTcgdG8gcGVyZm9ybSB0aGUgcmVhZC4KLQkgKiAgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoCi0JICogIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaAotCSAqICBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoCi0JICogIHNldCBEQ1YgLSB3aWxsIGNsZWFyIHdoZW4gcHJvY2VzcyBjb21wbGV0ZWQKLQkgKiAgcmVzZXQgQ1JXIC0gV3JpdGUgY29tbWFuZAotCSAqICBzZXQgVkZSTSAtIHZhbGlkIGZyYW1lIGVuYWJsZWQKLQkgKiAgc2V0IEVTWU4gLSBBU1lOQyBnZW5lcmF0aW9uIGVuYWJsZWQKLQkgKiAgc2V0IFJTVE4gLSBBUlNUIyBpbmFjdGl2ZSwgQUM5NyBjb2RlYyBub3QgcmVzZXQKLSAgICAgICAgICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ0FELCByZWcpOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NEQSwgdmFsKTsKLQljczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgMCB8IEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCBBQ0NUTF9EQ1YgfCBBQ0NUTF9WRlJNIHwKLQkJCQkgICAgICAgICAgICAgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDA7IGNvdW50KyspIHsKLQkJLyoKLQkJICogIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KLQkJICovCi0JCXVkZWxheSgxMCAqIGNzX2xhcHRvcF93YWl0KTsKLQkJLyoKLQkJICogIE5vdywgY2hlY2sgdG8gc2VlIGlmIHRoZSB3cml0ZSBoYXMgY29tcGxldGVkLgotCQkgKiAgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDA3aAotCQkgKi8KLQkJaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikpCi0JCQlicmVhazsKLQl9Ci0JLyoKLQkgKiAgTWFrZSBzdXJlIHRoZSB3cml0ZSBjb21wbGV0ZWQuCi0JICovCi0JaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJImNzNDZ4eDogQUMnOTcgd3JpdGUgcHJvYmxlbSwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpKTsKLQl9Ci0KLQlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKLQotCS8qCi0JICoJQWRqdXN0IHBvd2VyIGlmIHRoZSBtaXhlciBpcyBzZWxlY3RlZC9kZXNlbGVjdGVkIGFjY29yZGluZwotCSAqCXRvIHRoZSBDRC4KLQkgKgotCSAqCUlGIHRoZSBDRCBpcyBhIHZhbGlkIGlucHV0IHNvdXJjZSAobWl4ZXIgb3IgZGlyZWN0KSBBTkQKLQkgKgkJdGhlIENEIGlzIG5vdCBtdXRlZCBUSEVOIHBvd2VyIGlzIG5lZWRlZAotCSAqCi0JICoJV2UgZG8gdHdvIHRoaW5ncy4gV2hlbiByZWNvcmQgc2VsZWN0IGNoYW5nZXMgdGhlIGlucHV0IHRvCi0JICoJYWRkL3JlbW92ZSB0aGUgQ0Qgd2UgYWRqdXN0IHRoZSBwb3dlciBjb3VudCBpZiB0aGUgQ0QgaXMKLQkgKgl1bm11dGVkLgotCSAqCi0JICoJV2hlbiB0aGUgQ0QgbXV0ZSBjaGFuZ2VzIHdlIGFkanVzdCB0aGUgcG93ZXIgbGV2ZWwgaWYgdGhlCi0JICoJQ0Qgd2FzIGEgdmFsaWQgaW5wdXQuCi0JICoKLQkgKiAgICAgIFdlIGFsc28gY2hlY2sgZm9yIENEIHZvbHVtZSAhPSAwLCBhcyB0aGUgQ0QgbXV0ZSBpc24ndAotCSAqICAgICAgbm9ybWFsbHkgdHdlYWtlZCBmcm9tIHVzZXJzcGFjZS4KLQkgKi8KLQkgCi0JLyogQ0QgbXV0ZSBjaGFuZ2UgPyAqLwotCQotCWlmIChyZWcgPT0gQUM5N19DRF9WT0wpIHsKLQkJLyogTXV0ZSBiaXQgY2hhbmdlID8gKi8KLQkJaWYgKCh2YWwyXnZhbCkgJiAweDgwMDAgfHwKLQkJICAgICgodmFsMiA9PSAweDFmMWYgfHwgdmFsID09IDB4MWYxZikgJiYgdmFsMiAhPSB2YWwpKSB7Ci0JCQkvKiBUaGlzIGlzIGEgaGFjayBidXQgaXRzIGNsZWFuZXIgdGhhbiB0aGUgYWx0ZXJuYXRpdmVzLgotCQkJICAgUmlnaHQgbm93IGNhcmQtPmFjOTdfY29kZWNbMF0gbWlnaHQgYmUgTlVMTCBhcyB3ZSBhcmUKLQkJCSAgIHN0aWxsIGRvaW5nIGNvZGVjIHNldHVwLiBUaGlzIGRvZXMgYW4gZWFybHkgYXNzaWdubWVudAotCQkJICAgdG8gYXZvaWQgdGhlIHByb2JsZW0gaWYgaXQgb2NjdXJzICovCi0JCQkgICAKLQkJCWlmIChjYXJkLT5hYzk3X2NvZGVjWzBdID09IE5VTEwpCi0JCQkJY2FyZC0+YWM5N19jb2RlY1swXSA9IGRldjsKLQkJCQkKLQkJCS8qIE11dGUgb24gKi8KLQkJCWlmICh2YWwgJiAweDgwMDAgfHwgdmFsID09IDB4MWYxZikKLQkJCQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAtMSk7Ci0JCQllbHNlIHsgLyogTXV0ZSBvZmYgcG93ZXIgb24gKi8KLQkJCQlpZiAoY2FyZC0+YW1wX2luaXQpCi0JCQkJCWNhcmQtPmFtcF9pbml0KGNhcmQpOwotCQkJCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIDEpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKiBPU1MgL2Rldi9taXhlciBmaWxlIG9wZXJhdGlvbiBtZXRob2RzICovCi0KLXN0YXRpYyBpbnQgY3Nfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCA0LAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3Nfb3Blbl9taXhkZXYoKStcbiIpKTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQotCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgotCQkJICAgIGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikKLQkJCQlnb3RvIG1hdGNoOwotCX0KLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiB8IENTX0VSUk9SLCAyLAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfb3Blbl9taXhkZXYoKS0gLUVOT0RFVlxuIikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0gbWF0Y2g6Ci0JaWYgKCFjYXJkLT5hYzk3X2NvZGVjW2ldKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOwotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKLQlpZiAoIUNTX0lOX1VTRSgmY2FyZC0+bWl4ZXJfdXNlX2NudCkpIHsKLQkJaWYgKCh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9NSVhWT04pKSkgewotCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBjc19vcGVuX21peGRldigpIHBvd2VydXAgZmFpbHVyZSAoMHgleClcbiIsIHRtcCkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0JY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgMSk7Ci0JQ1NfSU5DX1VTRV9DT1VOVCgmY2FyZC0+bWl4ZXJfdXNlX2NudCk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgNCwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX29wZW5fbWl4ZGV2KCktIDBcbiIpKTsKLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgY3NfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDQsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpK1xuIikpOwotCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykKLQl7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCi0JCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmCi0JCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQotCQkJCWdvdG8gbWF0Y2g7Ci0JfQotCWlmICghY2FyZCkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOIHwgQ1NfRVJST1IsIDIsCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9vcGVuX21peGRldigpLSAtRU5PREVWXG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLW1hdGNoOgotCWlmICghQ1NfREVDX0FORF9URVNUKCZjYXJkLT5taXhlcl91c2VfY250KSkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAotCQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCktIG5vIHBvd2VyZG93biwgdXNlY250PjBcbiIpKTsKLQkJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOwotCQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAtMSk7Ci0JCXJldHVybiAwOwotCX0KLS8qCi0qIG9rLCBubyBvdXRzdGFuZGluZyBtaXhlciBvcGVucywgc28gcG93ZXJkb3duLgotKi8KLQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfTUlYVk9OLCBDU19GQUxTRSkpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpIHBvd2VyZG93biBNSVhWT04gZmFpbHVyZSAoMHgleClcbiIsIHRtcCkpOwotCQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7Ci0JCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAtMSk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgNCwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCktIDBcbiIpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjc19pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCXVuc2lnbmVkIGxvbmcgX191c2VyICpwID0gKGxvbmcgX191c2VyICopYXJnOwotI2lmIENTREVCVUdfSU5URVJGQUNFCi0gICAgICAgIGludCB2YWw7Ci0KLQlpZiAoCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSykgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLKSB8fAotCQkoY21kID09IFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMKSB8fAotCQkoY21kID09IFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMKSB8fAotCQkoY21kID09IFNPVU5EX01JWEVSX0NTX0FQTSkpIHsKLQkJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOgotCQkJcmV0dXJuIHB1dF91c2VyKGNzX2RlYnVnbWFzaywgcCk7Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6Ci0JCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdsZXZlbCwgcCk7Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSzoKLQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJY3NfZGVidWdtYXNrID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6Ci0JCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWNzX2RlYnVnbGV2ZWwgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBTT1VORF9NSVhFUl9DU19BUE06Ci0JCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmICh2YWwgPT0gQ1NfSU9DVExfQ01EX1NVU1BFTkQpIHsKLQkJCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKLQkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJCQkJY3M0Nnh4X3N1c3BlbmQoY2FyZCwgUE1TR19PTik7Ci0JCQkJfQotCi0JCQl9IGVsc2UgaWYgKHZhbCA9PSBDU19JT0NUTF9DTURfUkVTVU1FKSB7Ci0JCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7Ci0JCQkJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7Ci0JCQkJCWNzNDZ4eF9yZXN1bWUoY2FyZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgImNzNDZ4eDogbWl4ZXJfaW9jdGwoKTogaW52YWxpZCBBUE0gY21kICglZClcbiIsCi0JCQkJCXZhbCkpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogbWl4ZXJfaW9jdGwoKTogRVJST1IgdW5rbm93biBkZWJ1ZyBjbWRcbiIpKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotI2VuZGlmCi0JcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOwotfQotCi1zdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3NfbWl4ZXJfZm9wcyA9IHsKLQlDU19PV05FUglDU19USElTX01PRFVMRQotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5pb2N0bAkJPSBjc19pb2N0bF9taXhkZXYsCi0JLm9wZW4JCT0gY3Nfb3Blbl9taXhkZXYsCi0JLnJlbGVhc2UJPSBjc19yZWxlYXNlX21peGRldiwKLX07Ci0KLS8qIEFDOTcgY29kZWMgaW5pdGlhbGlzYXRpb24uICovCi1zdGF0aWMgaW50IF9faW5pdCBjc19hYzk3X2luaXQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IG51bV9hYzk3ID0gMDsKLQlpbnQgcmVhZHlfMm5kID0gMDsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7Ci0JdTE2IGVpZDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpK1xuIikgKTsKLQotCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IE5SX0FDOTc7IG51bV9hYzk3KyspIHsKLQkJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzIHdpbGwgYmUgZmlsbGVkCi0JCSAgIGluIGFjOTdfcHJvYmVfY29kZWMgKi8KLQkJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0JCWNvZGVjLT5pZCA9IG51bV9hYzk3OwotCi0JCWNvZGVjLT5jb2RlY19yZWFkID0gY3NfYWM5N19nZXQ7Ci0JCWNvZGVjLT5jb2RlY193cml0ZSA9IGNzX2FjOTdfc2V0OwotCQotCQlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkgewotCQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKS0gY29kZWMgbnVtYmVyICVkIG5vdCBmb3VuZFxuIiwKLQkJCQkJbnVtX2FjOTcpICk7Ci0JCQljYXJkLT5hYzk3X2NvZGVjW251bV9hYzk3XSA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgZm91bmQgY29kZWMgJWRcbiIsbnVtX2FjOTcpKTsKLQotCQllaWQgPSBjc19hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7Ci0JCQotCQlpZiAoZWlkID09IDB4RkZGRikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M0Nnh4OiBjb2RlYyAlZCBub3QgcHJlc2VudFxuIixudW1fYWM5Nyk7Ci0JCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCWNhcmQtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7Ci0JCQkKLQkJaWYgKChjb2RlYy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmNzX21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogY291bGRuJ3QgcmVnaXN0ZXIgbWl4ZXIhXG4iKTsKLQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7Ci0JCQlicmVhazsKLQkJfQotCQljYXJkLT5hYzk3X2NvZGVjW251bV9hYzk3XSA9IGNvZGVjOwotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKSBhYzk3X2NvZGVjWyVkXSBzZXQgdG8gJXBcbiIsCi0JCQkJKHVuc2lnbmVkIGludCludW1fYWM5NywKLQkJCQljb2RlYykpOwotCQkvKiBpZiB0aGVyZSBpcyBubyBzZWNvbmRhcnkgY29kZWMgYXQgYWxsLCBkb24ndCBwcm9iZSBhbnkgbW9yZSAqLwotCQlpZiAoIXJlYWR5XzJuZCkKLQkJewotCQkJbnVtX2FjOTcgKz0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpLSAlZFxuIiwgKHVuc2lnbmVkIGludCludW1fYWM5NykpOwotCXJldHVybiBudW1fYWM5NzsKLX0KLQotLyoKLSAqIGxvYWQgdGhlIHN0YXRpYyBpbWFnZSBpbnRvIHRoZSBEU1AKLSAqLwotI2luY2x1ZGUgImNzNDYxeF9pbWFnZS5oIgotc3RhdGljIHZvaWQgY3M0NjF4X2Rvd25sb2FkX2ltYWdlKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotICAgIHVuc2lnbmVkIGksIGosIHRlbXAxLCB0ZW1wMiwgb2Zmc2V0LCBjb3VudDsKLSAgICB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnBCQTEgPSBpb3JlbWFwKGNhcmQtPmJhMV9hZGRyLCAweDQwMDAwKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQ0xFQVJfX0NPVU5UOyBpKyspIHsKLSAgICAgICAgb2Zmc2V0ID0gQ2xyU3RhdFtpXS5CQTFfX0Rlc3RCeXRlT2Zmc2V0OwotICAgICAgICBjb3VudCAgPSBDbHJTdGF0W2ldLkJBMV9fU291cmNlU2l6ZTsKLSAgICAgICAgZm9yICh0ZW1wMSA9IG9mZnNldDsgdGVtcDEgPCAob2Zmc2V0ICsgY291bnQpOyB0ZW1wMSArPSA0KQotICAgICAgICAgICAgICB3cml0ZWwoMCwgcEJBMSt0ZW1wMSk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEZJTExfX0NPVU5UOyBpKyspIHsKLSAgICAgICAgdGVtcDIgPSBGaWxsU3RhdFtpXS5PZmZzZXQ7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAoRmlsbFN0YXRbaV0uU2l6ZSkgLyA0OyBqKyspIHsKLSAgICAgICAgICAgIHRlbXAxID0gKEZpbGxTdGF0W2ldKS5wRmlsbFtqXTsKLSAgICAgICAgICAgIHdyaXRlbCh0ZW1wMSwgcEJBMSt0ZW1wMiArIGogKiA0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpb3VubWFwKHBCQTEpOwotfQotCi0vKgotICogIENoaXAgcmVzZXQKLSAqLwotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcmVzZXQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IGlkeDsKLQotCS8qCi0JICogIFdyaXRlIHRoZSByZXNldCBiaXQgb2YgdGhlIFNQIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1NQQ1IsIFNQQ1JfUlNUU1ApOwotCi0JLyoKLQkgKiAgV3JpdGUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1NQQ1IsIFNQQ1JfRFJRRU4pOwotCi0JLyoKLQkgKiAgQ2xlYXIgdGhlIHRyYXAgcmVnaXN0ZXJzLgotCSAqLwotCWZvciAoaWR4ID0gMDsgaWR4IDwgODsgaWR4KyspIHsKLQkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0RSRUcsIERSRUdfUkVHSURfVFJBUF9TRUxFQ1QgKyBpZHgpOwotCQljczQ2MXhfcG9rZShjYXJkLCBCQTFfVFdQUiwgMHhGRkZGKTsKLQl9Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0RSRUcsIDApOwotCi0JLyoKLQkgKiAgU2V0IHRoZSBmcmFtZSB0aW1lciB0byByZWZsZWN0IHRoZSBudW1iZXIgb2YgY3ljbGVzIHBlciBmcmFtZS4KLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfRlJNVCwgMHhhZGYpOwotfQotCi1zdGF0aWMgdm9pZCBjczQ2MXhfY2xlYXJfc2VyaWFsX0ZJRk9zKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgdHlwZSkKLXsKLQlpbnQgaWR4LCBsb29wLCBzdGFydGZpZm89MCwgZW5kZmlmbz0wLCBwb3dlcmRvd24xID0gMDsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JLyoKLQkgKiAgU2VlIGlmIHRoZSBkZXZpY2VzIGFyZSBwb3dlcmVkIGRvd24uICBJZiBzbywgd2UgbXVzdCBwb3dlciB0aGVtIHVwIGZpcnN0Ci0JICogIG9yIHRoZXkgd2lsbCBub3QgcmVzcG9uZC4KLQkgKi8KLQlpZiAoISgodG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0NMS0NSMSkpICYgQ0xLQ1IxX1NXQ0UpKSB7Ci0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCB8IENMS0NSMV9TV0NFKTsKLQkJcG93ZXJkb3duMSA9IDE7Ci0JfQotCi0JLyoKLQkgKiAgV2Ugd2FudCB0byBjbGVhciBvdXQgdGhlIHNlcmlhbCBwb3J0IEZJRk9zIHNvIHdlIGRvbid0IGVuZCB1cCBwbGF5aW5nCi0JICogIHdoYXRldmVyIHJhbmRvbSBnYXJiYWdlIGhhcHBlbnMgdG8gYmUgaW4gdGhlbS4gIFdlIGZpbGwgdGhlIHNhbXBsZSBGSUZPUwotCSAqICB3aXRoIHplcm8gKHNpbGVuY2UpLgotICAgICAgICAgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQldQLCAwKTsKLQotCS8qCi0JKiBDaGVjayBmb3Igd2hpY2ggRklGTyBsb2NhdGlvbnMgdG8gY2xlYXIsIGlmIHdlIGFyZSBjdXJyZW50bHkKLQkqIHBsYXlpbmcgb3IgY2FwdHVyaW5nIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBwdXQgaW4gMTI4IGJ5dGVzIG9mCi0JKiAibm9pc2UiLgotCSAqLwotCWlmICh0eXBlICYgQ1NfVFlQRV9EQUMpIHsKLQkJc3RhcnRmaWZvID0gMTI4OwotCQllbmRmaWZvID0gMjU2OwotCX0KLQlpZiAodHlwZSAmIENTX1RZUEVfQURDKSB7Ci0JCXN0YXJ0ZmlmbyA9IDA7Ci0JCWlmICghZW5kZmlmbykKLQkJCWVuZGZpZm8gPSAxMjg7Ci0JfQotCS8qCi0JICogIEZpbGwgc2FtcGxlIEZJRk8gbG9jYXRpb25zICgyNTYgbG9jYXRpb25zIHRvdGFsKS4KLQkgKi8KLQlmb3IgKGlkeCA9IHN0YXJ0ZmlmbzsgaWR4IDwgZW5kZmlmbzsgaWR4KyspIHsKLQkJLyoKLQkJICogIE1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgRklGTyB3cml0ZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KLQkJICovCi0JCWZvciAobG9vcCA9IDA7IGxvb3AgPCA1OyBsb29wKyspIHsKLQkJCXVkZWxheSg1MCk7Ci0JCQlpZiAoIShjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfU0VSQlNUKSAmIFNFUkJTVF9XQlNZKSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX1NFUkJTVCkgJiBTRVJCU1RfV0JTWSkgewotCQkJaWYgKHBvd2VyZG93bjEpCi0JCQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsKLQkJfQotCQkvKgotCQkgKiAgV3JpdGUgdGhlIHNlcmlhbCBwb3J0IEZJRk8gaW5kZXguCi0JCSAqLwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQkFELCBpZHgpOwotCQkvKgotCQkgKiAgVGVsbCB0aGUgc2VyaWFsIHBvcnQgdG8gbG9hZCB0aGUgbmV3IHZhbHVlIGludG8gdGhlIEZJRk8gbG9jYXRpb24uCi0JCSAqLwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQkNNLCBTRVJCQ01fV1JDKTsKLQl9Ci0JLyoKLQkgKiAgTm93LCBpZiB3ZSBwb3dlcmVkIHVwIHRoZSBkZXZpY2VzLCB0aGVuIHBvd2VyIHRoZW0gYmFjayBkb3duIGFnYWluLgotCSAqICBUaGlzIGlzIGtpbmRhIHVnbHksIGJ1dCBzaG91bGQgbmV2ZXIgaGFwcGVuLgotCSAqLwotCWlmIChwb3dlcmRvd24xKQotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOwotfQotCi0KLXN0YXRpYyBpbnQgY3M0NjF4X3Bvd2VyZG93bihzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHR5cGUsIGludCBzdXNwZW5kZmxhZykKLXsKLQlpbnQgY291bnQ7Ci0JdW5zaWduZWQgaW50IHRtcD0wLG11dGVkPTA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgdHlwZT0weCV4XG4iLHR5cGUpKTsKLQlpZiAoIWNzX3Bvd2VyZG93biAmJiAhc3VzcGVuZGZsYWcpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIERJU0FCTEVEIGV4aXRpbmdcbiIpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgcG93ZXJkb3duIHJlZz0weCV4XG4iLHRtcCkpOwotLyoKLSogaWYgcG93ZXJpbmcgZG93biBvbmx5IHRoZSBWUkVGLCBhbmQgbm90IHBvd2VyaW5nIGRvd24gdGhlIERBQy9BREMsCi0qIHRoZW4gZG8gbm90IHBvd2VyIGRvd24gdGhlIFZSRUYsIFVOTEVTUyBib3RoIHRoZSBEQUMgYW5kIEFEQyBhcmUgbm90Ci0qIGN1cnJlbnRseSBwb3dlcmVkIGRvd24uICBJZiBwb3dlcmluZyBkb3duIERBQyBhbmQgQURDLCB0aGVuCi0qIGl0IGlzIHBvc3NpYmxlIHRvIHBvd2VyIGRvd24gdGhlIFZSRUYgKE9OKS4KLSovCi0JaWYgKCgodHlwZSAmIENTX1BPV0VSX01JWFZPTikgJiYKLQkJICghKHR5cGUgJiBDU19QT1dFUl9BREMpIHx8ICghKHR5cGUgJiBDU19QT1dFUl9EQUMpKSkpCi0JICAgICAgJiYgCi0JCSgodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikgfHwKLQkJICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSkpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpLSAwICB1bmFibGUgdG8gcG93ZXJkb3duLiB0bXA9MHgleFxuIix0bXApKTsKLQkJcmV0dXJuIDA7Ci0JfQotLyoKLSogZm9yIG5vdywgYWx3YXlzIGtlZXAgcG93ZXIgdG8gdGhlIG1peGVyIGJsb2NrLgotKiBub3Qgc3VyZSB3aHkgaXQncyBhIHByb2JsZW0gYnV0IGl0IHNlZW1zIHRvIGJlIGlmIHdlIHBvd2VyIG9mZi4KLSovCi0JdHlwZSAmPSB+Q1NfUE9XRVJfTUlYVk9OOwotCXR5cGUgJj0gfkNTX1BPV0VSX01JWFZPRkY7Ci0KLQkvKgotCSAqICBQb3dlciBkb3duIGluZGljYXRlZCBhcmVhcy4KLQkgKi8KLQlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpIHsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIE1JWFZPRkZcbiIpKTsKLQkJLyoKLQkJICogIFBvd2VyIGRvd24gdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRjsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gTUlYVk9GRiBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPTikgewotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgTUlYVk9OXG4iKSk7Ci0JCS8qCi0JCSAqICBQb3dlciBkb3duIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXApOwotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VyZG93biBNSVhWT04gZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9BREMpIHsKLQkJLyoKLQkJICogIFBvd2VyIGRvd24gdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBBRENcbiIpKTsKLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXApOwotCi0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJkb3duIEFEQyBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZSAmIENTX1BPV0VSX0RBQykgewotCQkvKgotCQkgKiAgUG93ZXIgZG93biB0aGUgREFDIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBEQUNcbiIpKTsKLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXApOwotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VyZG93biBEQUMgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQlpZiAobXV0ZWQpCi0JCWNzX211dGUoY2FyZCwgQ1NfRkFMU0UpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpLSAwIHRtcD0weCV4XG4iLHRtcCkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNzNDZ4eF9wb3dlcnVwKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQlpbnQgY291bnQ7Ci0JdW5zaWduZWQgaW50IHRtcCA9IDAsIG11dGVkID0gMDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgdHlwZT0weCV4XG4iLHR5cGUpKTsKLQkvKgotCSogY2hlY2sgZm9yIFZSRUYgYW5kIHBvd2VydXAgaWYgbmVlZCB0by4KLQkqLwotCWlmICh0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKQotCQl0eXBlIHw9IENTX1BPV0VSX01JWFZPRkY7Ci0JaWYgKHR5cGUgJiAoQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDKSkKLQkJdHlwZSB8PSBDU19QT1dFUl9NSVhWT04gfCBDU19QT1dFUl9NSVhWT0ZGOwotCi0JLyoKLQkgKiAgUG93ZXIgdXAgaW5kaWNhdGVkIGFyZWFzLgotCSAqLwotCWlmICh0eXBlICYgQ1NfUE9XRVJfTUlYVk9GRikgewotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPRkZcbiIpKTsKLQkJLyoKLQkJICogIFBvd2VyIHVwIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VydXAgTUlYVk9GRiBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZih0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKSB7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgTUlYVk9OXG4iKSk7Ci0JCS8qCi0JCSAqICBQb3dlciB1cCB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT047Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VydXAgTUlYVk9OIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWlmICh0eXBlICYgQ1NfUE9XRVJfQURDKSB7Ci0JCS8qCi0JCSAqICBQb3dlciB1cCB0aGUgQURDIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBBRENcbiIpKTsKLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7Ci0KLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIEFEQyBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZSAmIENTX1BPV0VSX0RBQykgewotCQkvKgotCQkgKiAgUG93ZXIgdXAgdGhlIERBQyBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIERBQ1xuIikpOwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSkgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfREFDOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIERBQyBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCWlmIChtdXRlZCkKLQkJY3NfbXV0ZShjYXJkLCBDU19GQUxTRSk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpLSAwIHRtcD0weCV4XG4iLHRtcCkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcHJvY19zdGFydChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpbnQgY250OwotCi0JLyoKLQkgKiAgU2V0IHRoZSBmcmFtZSB0aW1lciB0byByZWZsZWN0IHRoZSBudW1iZXIgb2YgY3ljbGVzIHBlciBmcmFtZS4KLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfRlJNVCwgMHhhZGYpOwotCS8qCi0JICogIFR1cm4gb24gdGhlIHJ1biwgcnVuIGF0IGZyYW1lLCBhbmQgRE1BIGVuYWJsZSBiaXRzIGluIHRoZSBsb2NhbCBjb3B5IG9mCi0JICogIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX1JVTiB8IFNQQ1JfUlVORlIgfCBTUENSX0RSUUVOKTsKLQkvKgotCSAqICBXYWl0IHVudGlsIHRoZSBydW4gYXQgZnJhbWUgYml0IHJlc2V0cyBpdHNlbGYgaW4gdGhlIFNQIGNvbnRyb2wKLQkgKiAgcmVnaXN0ZXIuCi0JICovCi0JZm9yIChjbnQgPSAwOyBjbnQgPCAyNTsgY250KyspIHsKLQkJdWRlbGF5KDUwKTsKLQkJaWYgKCEoY3M0NjF4X3BlZWsoY2FyZCwgQkExX1NQQ1IpICYgU1BDUl9SVU5GUikpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoY3M0NjF4X3BlZWsoY2FyZCwgQkExX1NQQ1IpICYgU1BDUl9SVU5GUikKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M0Nnh4OiBTUENSX1JVTkZSIG5ldmVyIHJlc2V0XG4iKTsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Byb2Nfc3RvcChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQkvKgotCSAqICBUdXJuIG9mZiB0aGUgcnVuLCBydW4gYXQgZnJhbWUsIGFuZCBETUEgZW5hYmxlIGJpdHMgaW4gdGhlIGxvY2FsIGNvcHkgb2YKLQkgKiAgdGhlIFNQIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1NQQ1IsIDApOwotfQotCi1zdGF0aWMgaW50IGNzX2hhcmR3YXJlX2luaXQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKLQl1bnNpZ25lZCBpbnQgdG1wLGNvdW50OwotCQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzX2hhcmR3YXJlX2luaXQoKStcbiIpICk7Ci0JLyogCi0JICogIEZpcnN0LCBibGFzdCB0aGUgY2xvY2sgY29udHJvbCByZWdpc3RlciB0byB6ZXJvIHNvIHRoYXQgdGhlIFBMTCBzdGFydHMKLSAgICAgICAgICogIG91dCBpbiBhIGtub3duIHN0YXRlLCBhbmQgYmxhc3QgdGhlIG1hc3RlciBzZXJpYWwgcG9ydCBjb250cm9sIHJlZ2lzdGVyCi0gICAgICAgICAqICB0byB6ZXJvIHNvIHRoYXQgdGhlIHNlcmlhbCBwb3J0cyBhbHNvIHN0YXJ0IG91dCBpbiBhIGtub3duIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgMCk7Ci0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJNQzEsIDApOwotCi0JLyoKLQkgKiAgSWYgd2UgYXJlIGluIEFDOTcgbW9kZSwgdGhlbiB3ZSBtdXN0IHNldCB0aGUgcGFydCB0byBhIGhvc3QgY29udHJvbGxlZAotICAgICAgICAgKiAgQUMtbGluay4gIE90aGVyd2lzZSwgd2Ugd29uJ3QgYmUgYWJsZSB0byBicmluZyB1cCB0aGUgbGluay4KLSAgICAgICAgICovICAgICAgICAKLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkFDQywgU0VSQUNDX0hTUCB8IFNFUkFDQ19DT0RFQ19UWVBFXzFfMDMpOwkvKiAxLjAzIGNhcmQgKi8KLSAgICAgICAgLyogY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkFDQywgU0VSQUNDX0hTUCB8IFNFUkFDQ19DT0RFQ19UWVBFXzJfMCk7ICovIC8qIDIuMDAgY2FyZCAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBEcml2ZSB0aGUgQVJTVCMgcGluIGxvdyBmb3IgYSBtaW5pbXVtIG9mIDF1UyAoYXMgZGVmaW5lZCBpbiB0aGUgQUM5NwotICAgICAgICAgKiAgc3BlYykgYW5kIHRoZW4gZHJpdmUgaXQgaGlnaC4gIFRoaXMgaXMgZG9uZSBmb3Igbm9uIEFDOTcgbW9kZXMgc2luY2UKLSAgICAgICAgICogIHRoZXJlIG1pZ2h0IGJlIGxvZ2ljIGV4dGVybmFsIHRvIHRoZSBDUzQ2MXggdGhhdCB1c2VzIHRoZSBBUlNUIyBsaW5lCi0gICAgICAgICAqICBmb3IgYSByZXNldC4KLSAgICAgICAgICovCi0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgMSk7Ci0gICAgICAgIHVkZWxheSg1MCk7Ci0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgMCk7Ci0gICAgICAgIHVkZWxheSg1MCk7Ci0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfUlNUTik7Ci0KLQkvKgotCSAqICBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaGVyZSBpcyB0byBlbmFibGUgc3luYyBnZW5lcmF0aW9uLiAgQXMgc29vbgotCSAqICBhcyB3ZSBzdGFydCByZWNlaXZpbmcgYml0IGNsb2NrLCB3ZSdsbCBzdGFydCBwcm9kdWNpbmcgdGhlIFNZTkMKLQkgKiAgc2lnbmFsLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOwotCi0JLyoKLQkgKiAgTm93IHdhaXQgZm9yIGEgc2hvcnQgd2hpbGUgdG8gYWxsb3cgdGhlIEFDOTcgcGFydCB0byBzdGFydAotCSAqICBnZW5lcmF0aW5nIGJpdCBjbG9jayAoc28gd2UgZG9uJ3QgdHJ5IHRvIHN0YXJ0IHRoZSBQTEwgd2l0aG91dCBhbgotCSAqICBpbnB1dCBjbG9jaykuCi0JICovCi0JbWRlbGF5KDUgKiBjc19sYXB0b3Bfd2FpdCk7CQkvKiAxIHNob3VsZCBiZSBlbm91Z2ggPz8gKGFuZCBwaWdzIG1pZ2h0IGZseSkgKi8KLQotCS8qCi0JICogIFNldCB0aGUgc2VyaWFsIHBvcnQgdGltaW5nIGNvbmZpZ3VyYXRpb24sIHNvIHRoYXQKLQkgKiAgdGhlIGNsb2NrIGNvbnRyb2wgY2lyY3VpdCBnZXRzIGl0cyBjbG9jayBmcm9tIHRoZSBjb3JyZWN0IHBsYWNlLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJNQzEsIFNFUk1DMV9QVENfQUM5Nyk7Ci0KLQkvKgotCSogVGhlIHBhcnQgc2VlbXMgdG8gbm90IGJlIHJlYWR5IGZvciBhIHdoaWxlIGFmdGVyIGEgcmVzdW1lLgotCSogc28sIGlmIHdlIGFyZSByZXN1bWluZywgdGhlbiB3YWl0IGZvciA3MDAgbWlscy4gIE5vdGUgdGhhdCA2MDAgbWlscwotCSogaXMgbm90IGVub3VnaCBmb3Igc29tZSBwbGF0Zm9ybXMhIHRlc3RlZCBvbiBhbiBJQk0gVGhpbmtwYWRzIGFuZCAKLQkqIHJlZmVyZW5jZSBjYXJkcy4KLQkqLwotCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQotCQltZGVsYXkoaW5pdGRlbGF5KTsKLQkvKgotCSAqICBXcml0ZSB0aGUgc2VsZWN0ZWQgY2xvY2sgY29udHJvbCBzZXR1cCB0byB0aGUgaGFyZHdhcmUuICBEbyBub3QgdHVybiBvbgotCSAqICBTV0NFIHlldCAoaWYgcmVxdWVzdGVkKSwgc28gdGhhdCB0aGUgZGV2aWNlcyBjbG9ja2VkIGJ5IHRoZSBvdXRwdXQgb2YKLQkgKiAgUExMIGFyZSBub3QgY2xvY2tlZCB1bnRpbCB0aGUgUExMIGlzIHN0YWJsZS4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfUExMQ0MsIFBMTENDX0xQRl8xMDUwXzI3ODBfS0haIHwgUExMQ0NfQ0RSXzczXzEwNF9NSFopOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9QTExNLCAweDNhKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IyLCBDTEtDUjJfUERJVlNfOCk7Ci0KLQkvKgotCSAqICBQb3dlciB1cCB0aGUgUExMLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIENMS0NSMV9QTExQKTsKLQotCS8qCi0gICAgICAgICAqICBXYWl0IHVudGlsIHRoZSBQTEwgaGFzIHN0YWJpbGl6ZWQuCi0JICovCi0JbWRlbGF5KDUgKiBjc19sYXB0b3Bfd2FpdCk7CQkvKiBBZ2FpbiAxIHNob3VsZCBiZSBlbm91Z2ggPz8gKi8KLQotCS8qCi0JICogIFR1cm4gb24gY2xvY2tpbmcgb2YgdGhlIGNvcmUgc28gdGhhdCB3ZSBjYW4gc2V0dXAgdGhlIHNlcmlhbCBwb3J0cy4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSB8IENMS0NSMV9TV0NFOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Ci0KLQkvKgotCSAqICBGaWxsIHRoZSBzZXJpYWwgcG9ydCBGSUZPcyB3aXRoIHNpbGVuY2UuCi0JICovCi0JY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhjYXJkLENTX1RZUEVfREFDIHwgQ1NfVFlQRV9BREMpOwotCi0JLyoKLQkgKiAgU2V0IHRoZSBzZXJpYWwgcG9ydCBGSUZPIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgRklGTy4KLQkgKi8KLQkvKiBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQlNQLCAwKTsgKi8KLQotCS8qCi0JICogIFdyaXRlIHRoZSBzZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uIHRvIHRoZSBwYXJ0LiAgVGhlIG1hc3RlcgotCSAqICBlbmFibGUgYml0IGlzIG5vdCBzZXQgdW50aWwgYWxsIG90aGVyIHZhbHVlcyBoYXZlIGJlZW4gd3JpdHRlbi4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQzEsIFNFUkMxX1NPMUZfQUM5NyB8IFNFUkMxX1NPMUVOKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQzIsIFNFUkMyX1NJMUZfQUM5NyB8IFNFUkMxX1NPMUVOKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcgfCBTRVJNQzFfTVNQRSk7Ci0KLQotCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogU2hvdWxkbnQgYmUgbmVlZGVkID8/ICovCi0JCi0vKgotKiBJZiB3ZSBhcmUgcmVzdW1pbmcgdW5kZXIgMi4yLnggdGhlbiB3ZSBjYW5ub3Qgc2NoZWR1bGUgYSB0aW1lb3V0LAotKiBzbyBqdXN0IHNwaW4gdGhlIENQVS4KLSovCi0JaWYgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHsKLQkvKgotCSAqIFdhaXQgZm9yIHRoZSBjYXJkIHJlYWR5IHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNhcmQuCi0JICovCi0JCWVuZF90aW1lID0gamlmZmllcyArIDMgKiAoSFogPj4gMik7Ci0JCWRvIHsKLQkJLyoKLQkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB3ZSd2ZSBzZWVuIGEgQ09ERUMgUkVBRFkKLQkJICogIHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNhcmQuCi0JCSAqLwotCQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKQotCQkJCWJyZWFrOwotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7Ci0JCS8vIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KLQkJCXVkZWxheSgyNSAqIGNzX2xhcHRvcF93YWl0KTsKLQotCQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgTWFrZSBzdXJlIENPREVDIGlzIFJFQURZLgotCSAqLwotCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKLQkJCSJjczQ2eHg6IGNyZWF0ZSAtIG5ldmVyIHJlYWQgY2FyZCByZWFkeSBmcm9tIEFDJzk3XG4iKSk7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgIAotCQkJImNzNDZ4eDogcHJvYmFibHkgbm90IGEgYnVnLCB0cnkgdXNpbmcgdGhlIENTNDIzMiBkcml2ZXIsXG4iKSk7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgIAotCQkJImNzNDZ4eDogb3IgdHVybiBvZmYgYW55IGF1dG9tYXRpYyBQb3dlciBNYW5hZ2VtZW50IHN1cHBvcnQgaW4gdGhlIEJJT1MuXG4iKSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qCi0JICogIEFzc2VydCB0aGUgdmFpZCBmcmFtZSBzaWduYWwgc28gdGhhdCB3ZSBjYW4gc3RhcnQgc2VuZGluZyBjb21tYW5kcwotCSAqICB0byB0aGUgQUM5NyBjYXJkLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfVkZSTSB8IEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKLQotCWlmIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB7Ci0JLyoKLQkgKiAgV2FpdCB1bnRpbCB3ZSd2ZSBzYW1wbGVkIGlucHV0IHNsb3RzIDMgYW5kIDQgYXMgdmFsaWQsIG1lYW5pbmcgdGhhdAotCSAqICB0aGUgY2FyZCBpcyBwdW1waW5nIEFEQyBkYXRhIGFjcm9zcyB0aGUgQUMtbGluay4KLQkgKi8KLQkJZW5kX3RpbWUgPSBqaWZmaWVzICsgMyAqIChIWiA+PiAyKTsKLQkJZG8gewotCQkJLyoKLQkJCSAqICBSZWFkIHRoZSBpbnB1dCBzbG90IHZhbGlkIHJlZ2lzdGVyIGFuZCBzZWUgaWYgaW5wdXQgc2xvdHMgMyBhbmQKLQkJCSAqICA0IGFyZSB2YWxpZCB5ZXQuCi0JCQkgKi8KLQkJCWlmICgoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDSVNWKSAmIChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpID09IChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpCi0JCQkJYnJlYWs7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwotCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kX3RpbWUpKTsKLQl9IGVsc2UgewotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50KyspIHsKLQkJLy8gRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgotCQkJdWRlbGF5KDI1ICogY3NfbGFwdG9wX3dhaXQpOwotCi0JCQlpZiAoKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSA9PSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCS8qCi0JICogIE1ha2Ugc3VyZSBpbnB1dCBzbG90cyAzIGFuZCA0IGFyZSB2YWxpZC4gIElmIG5vdCwgdGhlbiByZXR1cm4KLQkgKiAgYW4gZXJyb3IuCi0JICovCi0JaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgIT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IGNyZWF0ZSAtIG5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qCi0JICogIE5vdywgYXNzZXJ0IHZhbGlkIGZyYW1lIGFuZCB0aGUgc2xvdCAzIGFuZCA0IHZhbGlkIGJpdHMuICBUaGlzIHdpbGwKLQkgKiAgY29tbWVuc2UgdGhlIHRyYW5zZmVyIG9mIGRpZ2l0YWwgYXVkaW8gZGF0YSB0byB0aGUgQUM5NyBjYXJkLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ09TViwgQUNPU1ZfU0xWMyB8IEFDT1NWX1NMVjQpOwotCi0JLyoKLQkgKiAgVHVybiBvZmYgdGhlIFByb2Nlc3NvciBieSB0dXJuaW5nIG9mZiB0aGUgc29mdHdhcmUgY2xvY2sgZW5hYmxlIGZsYWcgaW4gCi0JICogIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCS8qIHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpICYgfkNMS0NSMV9TV0NFOyAqLwotCS8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7ICovCi0KLQkvKgotICAgICAgICAgKiAgUmVzZXQgdGhlIHByb2Nlc3Nvci4KLSAgICAgICAgICovCi0JY3M0NjF4X3Jlc2V0KGNhcmQpOwotCi0JLyoKLSAgICAgICAgICogIERvd25sb2FkIHRoZSBpbWFnZSB0byB0aGUgcHJvY2Vzc29yLgotCSAqLwotCQotCWNzNDYxeF9kb3dubG9hZF9pbWFnZShjYXJkKTsKLQotCS8qCi0gICAgICAgICAqICBTdG9wIHBsYXliYWNrIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7Ci0JY2FyZC0+cGN0bCA9IHRtcCAmIDB4ZmZmZjAwMDA7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCAmIDB4MDAwMGZmZmYpOwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgY2FwdHVyZSBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOwotCWNhcmQtPmNjdGwgPSB0bXAgJiAweDAwMDBmZmZmOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKLQotCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLwotCWlmIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB7Ci0JCWlmIChjc19hYzk3X2luaXQoY2FyZCkgPD0gMCkgewotCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKSBmYWlsdXJlXG4iKSk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0gZWxzZSB7Ci0JCWNzNDZ4eF9hYzk3X3Jlc3VtZShjYXJkKTsKLQl9Ci0JCi0JY3M0NjF4X3Byb2Nfc3RhcnQoY2FyZCk7Ci0KLQkvKgotCSAqICBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgcGFydC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9JRVYgfCBISUNSX0NIR00pOwotCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BGSUUpOwotCXRtcCAmPSB+MHgwMDAwZjAzZjsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGVuYWJsZSAqLwotCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NJRSk7Ci0JdG1wICY9IH4weDAwMDAwMDNmOwotCXRtcCB8PSAgMHgwMDAwMDAwMTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0lFLCB0bXApOwkvKiBjYXB0dXJlIGludGVycnVwdCBlbmFibGUgKi8JCi0KLQkvKgotCSAqICBJZiBJRExFIHRoZW4gUG93ZXIgZG93biB0aGUgcGFydC4gIFdlIHdpbGwgcG93ZXIgY29tcG9uZW50cyB1cCAKLQkgKiAgd2hlbiB3ZSBuZWVkIHRoZW0uICAKLQkgKi8KLQlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewotCQlpZiAoIWNzX3Bvd2VyZG93bikgewotCQkJaWYgKCh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJCQlDU19QT1dFUl9NSVhWT04pKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcnVwKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8Ci0JCQkJCUNTX1BPV0VSX01JWFZPTiwgQ1NfRkFMU0UpKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCX0KLQl9Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3NfaGFyZHdhcmVfaW5pdCgpLSAwXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgbm93LCB0aGV5IGFyZSBkZWZlcmVkIAotICAgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5IG9wZW4vcmVhZC93cml0ZS9pb2N0bC9tbWFwKSAqLwotICAgCi0vKgotICoJQ2FyZCBzdWJpZCB0YWJsZQotICovCi0gCi1zdHJ1Y3QgY3NfY2FyZF90eXBlCi17Ci0JdTE2IHZlbmRvcjsKLQl1MTYgaWQ7Ci0JY2hhciAqbmFtZTsKLQl2b2lkICgqYW1wKShzdHJ1Y3QgY3NfY2FyZCAqLCBpbnQpOwotCXZvaWQgKCphbXBfaW5pdCkoc3RydWN0IGNzX2NhcmQgKik7Ci0Jdm9pZCAoKmFjdGl2ZSkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3NfY2FyZF90eXBlIGNhcmRzW10gPSB7Ci0JewotCQkudmVuZG9yCT0gMHgxNDg5LAotCQkuaWQJPSAweDcwMDEsCi0JCS5uYW1lCT0gIkdlbml1cyBTb3VuZG1ha2VyIDEyOCB2YWx1ZSIsCi0JCS5hbXAJPSBhbXBfbm9uZSwKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4NTA1MywKLQkJLmlkCT0gMHgzMzU3LAotCQkubmFtZQk9ICJWb3lldHJhIiwKLQkJLmFtcAk9IGFtcF92b3lldHJhLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxMDcxLAotCQkuaWQJPSAweDYwMDMsCi0JCS5uYW1lCT0gIk1pdGFjIE1JNjAyMC8yMSIsCi0JCS5hbXAJPSBhbXBfdm95ZXRyYSwKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTRBRiwKLQkJLmlkCT0gMHgwMDUwLAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweDAwNTAsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4MDA1MSwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHgwMDUyLAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweDAwNTMsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4MDA1NCwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHhhMDEwLAotCQkubmFtZQk9ICJIZXJjdWxlcyBGb3J0aXNzaW1vIElJIiwKLQkJLmFtcAk9IGFtcF9ub25lLAotCX0sCi0JLyogTm90IHN1cmUgaWYgdGhlIDU3MCBuZWVkcyB0aGUgY2xrcnVuIGhhY2sgKi8KLQl7Ci0JCS52ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX0lCTSwKLQkJLmlkCT0gMHgwMTMyLAotCQkubmFtZQk9ICJUaGlua3BhZCA1NzAiLAotCQkuYW1wCT0gYW1wX25vbmUsCi0JCS5hY3RpdmUJPSBjbGtydW5faGFjaywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfSUJNLAotCQkuaWQJPSAweDAxNTMsCi0JCS5uYW1lCT0gIlRoaW5rcGFkIDYwMFgvQTIwL1QyMCIsCi0JCS5hbXAJPSBhbXBfbm9uZSwKLQkJLmFjdGl2ZQk9IGNsa3J1bl9oYWNrLAotCX0sCi0JewotCQkudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9JQk0sCi0JCS5pZAk9IDB4MTAxMCwKLQkJLm5hbWUJPSAiVGhpbmtwYWQgNjAwRSAodW5zdXBwb3J0ZWQpIiwKLQl9LAotCXsKLQkJLm5hbWUJPSAiQ2FyZCB3aXRob3V0IFNTSUQgc2V0IiwKLQl9LAotCXsgMCwgfSwKLX07Ci0KLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBKYXJvc2xhdiBLeXNlbGEsIDxwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ3J5c3RhbCBTb3VuZEZ1c2lvbiBBdWRpbyBTdXBwb3J0Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGNzNDZ4eF9iYW5uZXJbXSA9IEtFUk5fSU5GTyAiQ3J5c3RhbCA0MjgwLzQ2eHggKyBBQzk3IEF1ZGlvLCB2ZXJzaW9uICIgQ1M0NlhYX01BSk9SX1ZFUlNJT04gIi4iIENTNDZYWF9NSU5PUl9WRVJTSU9OICIuIiBDUzQ2WFhfQVJDSCAiLCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iOwotc3RhdGljIGNvbnN0IGNoYXIgZm5kbXNnW10gPSBLRVJOX0lORk8gImNzNDZ4eDogRm91bmQgJWQgYXVkaW8gZGV2aWNlKHMpLlxuIjsKLQotc3RhdGljIGludCBfX2RldmluaXQgY3M0Nnh4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAotCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQotewotCWludCBpLCBqOwotCXUxNiBzc19jYXJkLCBzc192ZW5kb3I7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQ7Ci0JZG1hX2FkZHJfdCBkbWFfbWFzazsKLQlzdHJ1Y3QgY3NfY2FyZF90eXBlICpjcCA9ICZjYXJkc1swXTsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBwcm9iZSgpK1xuIikpOwotCi0JZG1hX21hc2sgPSAweGZmZmZmZmZmOwkvKiB0aGlzIGVuYWJsZXMgcGxheWJhY2sgYW5kIHJlY29yZGluZyAqLwotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkgewotCQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKLQkJCSAiY3M0Nnh4OiBwY2lfZW5hYmxlX2RldmljZSgpIGZhaWxlZFxuIikpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUlNSQ0lTTUVNT1JZUkVHSU9OKHBjaV9kZXYsIDApIHx8Ci0JICAgICFSU1JDSVNNRU1PUllSRUdJT04ocGNpX2RldiwgMSkpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKLQkJCSAiY3M0Nnh4OiBwcm9iZSgpLSBNZW1vcnkgcmVnaW9uIG5vdCBhc3NpZ25lZFxuIikpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChwY2lfZGV2LT5pcnEgPT0gMCkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgotCQkJICJjczQ2eHg6IHByb2JlKCkgSVJRIG5vdCBhc3NpZ25lZFxuIikpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghcGNpX2RtYV9zdXBwb3J0ZWQocGNpX2RldiwgMHhmZmZmZmZmZikpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKLQkJICAgICAgImNzNDZ4eDogcHJvYmUoKSBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIikpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmc3NfdmVuZG9yKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmc3NfY2FyZCk7Ci0KLQlpZiAoKGNhcmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3NfY2FyZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWNhcmQtPmJhMF9hZGRyID0gUlNSQ0FERFJFU1MocGNpX2RldiwgMCk7Ci0JY2FyZC0+YmExX2FkZHIgPSBSU1JDQUREUkVTUyhwY2lfZGV2LCAxKTsKLQljYXJkLT5wY2lfZGV2ID0gcGNpX2RldjsKLQljYXJkLT5pcnEgPSBwY2lfZGV2LT5pcnE7Ci0JY2FyZC0+bWFnaWMgPSBDU19DQVJEX01BR0lDOwotCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+YWM5N19sb2NrKTsKLQotCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwotCi0JcHJpbnRrKGNzNDZ4eF9iYW5uZXIpOwotCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogQ2FyZCBmb3VuZCBhdCAweCUwOGx4IGFuZCAweCUwOGx4LCBJUlEgJWRcbiIsCi0JICAgICAgIGNhcmQtPmJhMF9hZGRyLCBjYXJkLT5iYTFfYWRkciwgY2FyZC0+aXJxKTsKLQotCWNhcmQtPmFsbG9jX3BjbV9jaGFubmVsID0gY3NfYWxsb2NfcGNtX2NoYW5uZWw7Ci0JY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsID0gY3NfYWxsb2NfcmVjX3BjbV9jaGFubmVsOwotCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBjc19mcmVlX3BjbV9jaGFubmVsOwotCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gYW1wX25vbmU7Ci0JY2FyZC0+YWN0aXZlX2N0cmwgPSBhbXBfbm9uZTsKLQotCXdoaWxlIChjcC0+bmFtZSkKLQl7Ci0JCWlmIChjcC0+dmVuZG9yID09IHNzX3ZlbmRvciAmJiBjcC0+aWQgPT0gc3NfY2FyZCkgewotCQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwgPSBjcC0+YW1wOwotCQkJaWYgKGNwLT5hY3RpdmUpCi0JCQkJY2FyZC0+YWN0aXZlX2N0cmwgPSBjcC0+YWN0aXZlOwotCQkJaWYgKGNwLT5hbXBfaW5pdCkKLQkJCQljYXJkLT5hbXBfaW5pdCA9IGNwLT5hbXBfaW5pdDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNwKys7Ci0JfQotCWlmIChjcC0+bmFtZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogVW5rbm93biBjYXJkICglMDRYOiUwNFgpIGF0IDB4JTA4bHgvMHglMDhseCwgSVJRICVkXG4iLAotCQkJc3NfdmVuZG9yLCBzc19jYXJkLCBjYXJkLT5iYTBfYWRkciwgY2FyZC0+YmExX2FkZHIsICBjYXJkLT5pcnEpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogJXMgKCUwNFg6JTA0WCkgYXQgMHglMDhseC8weCUwOGx4LCBJUlEgJWRcbiIsCi0JCQljcC0+bmFtZSwgc3NfdmVuZG9yLCBzc19jYXJkLCBjYXJkLT5iYTBfYWRkciwgY2FyZC0+YmExX2FkZHIsIGNhcmQtPmlycSk7Ci0JfQotCQotCWlmIChjYXJkLT5hbXBsaWZpZXJfY3RybCA9PSBOVUxMKSB7Ci0JCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gYW1wX25vbmU7Ci0JCWNhcmQtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7Ci0JfQkJCi0KLQlpZiAoZXh0ZXJuYWxfYW1wID09IDEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBDcnlzdGFsIEVBUEQgc3VwcG9ydCBmb3JjZWQgb24uXG4iKTsKLQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwgPSBhbXBfdm95ZXRyYTsKLQl9Ci0KLQlpZiAodGhpbmtwYWQgPT0gMSkgewotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IEFjdGl2YXRpbmcgQ0xLUlVOIGhhY2sgZm9yIFRoaW5rcGFkLlxuIik7Ci0JCWNhcmQtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7Ci0JfQotLyoKLSogVGhlIHRoaW5rcGFkcyBkb24ndCB3b3JrIHdlbGwgd2l0aG91dCBydW50aW1lIHVwZGF0aW5nIG9uIHRoZWlyIGtlcm5lbCAKLSogZGVsYXkgdmFsdWVzIChvciBhbnkgbGFwdG9wIHdpdGggdmFyaWFibGUgQ1BVIHNwZWVkcyByZWFsbHkpLgotKiBzbywganVzdCB0byBiZSBzYWZlIHNldCB0aGUgaW5pdCBkZWxheSB0byAyMTAwLiAgRWxpbWluYXRlcwotKiBmYWlsdXJlcyBvbiBUMjEgVGhpbmtwYWRzLiAgcmVtb3ZlIHRoaXMgY29kZSB3aGVuIHRoZSB1ZGVsYXkKLSogYW5kIG1kZWxheSBrZXJuZWwgY29kZSBpcyByZXBsYWNlZCBieSBhIHBtIHRpbWVyLCBvciB0aGUgZGVsYXlzCi0qIHdvcmsgd2VsbCBmb3IgYmF0dGVyeSBhbmQvb3IgQUMgcG93ZXIgYm90aC4KLSovCi0JaWYgKGNhcmQtPmFjdGl2ZV9jdHJsID09IGNsa3J1bl9oYWNrKSB7Ci0JCWluaXRkZWxheSA9IDIxMDA7Ci0JCWNzX2xhcHRvcF93YWl0ID0gNTsKLQl9Ci0JaWYgKChjYXJkLT5hY3RpdmVfY3RybCA9PSBjbGtydW5faGFjaykgJiYgIShwb3dlcmRvd24gPT0gMSkpIHsKLS8qCi0qIGZvciBzb21lIGN1cnJlbnRseSB1bmtub3duIHJlYXNvbiwgcG93ZXJpbmcgZG93biB0aGUgREFDIGFuZCBBREMgY29tcG9uZW50Ci0qIGJsb2NrcyBvbiB0aGlua3BhZHMgY2F1c2VzIHNvbWUgZnVua3kgYmVoYXZpb3IuLi4gZGlzdG9vcnJydGlvbiBhbmQgYWM5NyAKLSogY29kZWMgYWNjZXNzIHByb2JsZW1zLiAgcHJvYmFibHkgdGhlIHNlcmlhbCBjbG9jayBiZWNvbWVzIHVuc3luY2VkLiAKLSogYWRkZWQgY29kZSB0byBzeW5jIHRoZSBjaGlwcyBiYWNrIHVwLCBidXQgb25seSBoZWxwZWQgYWJvdXQgNzAlIHRoZSB0aW1lLgotKi8KLQkJY3NfcG93ZXJkb3duID0gMDsKLQl9Ci0JaWYgKHBvd2VyZG93biA9PSAwKQotCQljc19wb3dlcmRvd24gPSAwOwotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIDEpOwotCi0JLyogY2xhaW0gb3VyIGlvc3BhY2UgYW5kIGlycSAqLwotCQotCWNhcmQtPmJhMCA9IGlvcmVtYXBfbm9jYWNoZShjYXJkLT5iYTBfYWRkciwgQ1M0NjFYX0JBMF9TSVpFKTsKLQljYXJkLT5iYTEubmFtZS5kYXRhMCA9IGlvcmVtYXBfbm9jYWNoZShjYXJkLT5iYTFfYWRkciArIEJBMV9TUF9ETUVNMCwgQ1M0NjFYX0JBMV9EQVRBMF9TSVpFKTsKLQljYXJkLT5iYTEubmFtZS5kYXRhMSA9IGlvcmVtYXBfbm9jYWNoZShjYXJkLT5iYTFfYWRkciArIEJBMV9TUF9ETUVNMSwgQ1M0NjFYX0JBMV9EQVRBMV9TSVpFKTsKLQljYXJkLT5iYTEubmFtZS5wbWVtID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX1BNRU0sIENTNDYxWF9CQTFfUFJHX1NJWkUpOwotCWNhcmQtPmJhMS5uYW1lLnJlZyA9IGlvcmVtYXBfbm9jYWNoZShjYXJkLT5iYTFfYWRkciArIEJBMV9TUF9SRUcsIENTNDYxWF9CQTFfUkVHX1NJWkUpOwotCQotCUNTX0RCR09VVChDU19JTklULCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjYXJkPSVwIGNhcmQtPmJhMD0lcFxuIixjYXJkLGNhcmQtPmJhMCkgKTsKLQlDU19EQkdPVVQoQ1NfSU5JVCwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY2FyZC0+YmExPSVwICVwICVwICVwXG4iLAotCQkJY2FyZC0+YmExLm5hbWUuZGF0YTAsCi0JCQljYXJkLT5iYTEubmFtZS5kYXRhMSwKLQkJCWNhcmQtPmJhMS5uYW1lLnBtZW0sCi0JCQljYXJkLT5iYTEubmFtZS5yZWcpICk7Ci0KLQlpZiAoY2FyZC0+YmEwID09IDAgfHwgY2FyZC0+YmExLm5hbWUuZGF0YTAgPT0gMCB8fAotCQljYXJkLT5iYTEubmFtZS5kYXRhMSA9PSAwIHx8IGNhcmQtPmJhMS5uYW1lLnBtZW0gPT0gMCB8fAotCQljYXJkLT5iYTEubmFtZS5yZWcgPT0gMCkKLQkJZ290byBmYWlsMjsKLQkJCi0JaWYgKHJlcXVlc3RfaXJxKGNhcmQtPmlycSwgJmNzX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJjczQ2eHgiLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwgY2FyZC0+aXJxKTsKLQkJZ290byBmYWlsMjsKLQl9Ci0JLyogcmVnaXN0ZXIgL2Rldi9kc3AgKi8KLQlpZiAoKGNhcmQtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmY3M0NjF4X2ZvcHMsIC0xKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiB1bmFibGUgdG8gcmVnaXN0ZXIgZHNwXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotICAgICAgICAvKiByZWdpc3RlciAvZGV2L21pZGkgKi8KLSAgICAgICAgaWYgKChjYXJkLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmNzX21pZGlfZm9wcywgLTEpKSA8IDApCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byByZWdpc3RlciBtaWRpXG4iKTsKLSAgICAgICAgICAgICAgICAKLQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fSURMRTsKLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCWlmIChjc19oYXJkd2FyZV9pbml0KGNhcmQpICE9IDApIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiwgNCwgcHJpbnRrKAotCQkJCSJjczQ2eHg6IEVSUk9SIGluIGNzX2hhcmR3YXJlX2luaXQoKS4uLiByZXRyeWluZ1xuIikpOwotCQkJZm9yIChqID0gMDsgaiA8IE5SX0FDOTc7IGorKykKLQkJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tqXSAhPSBOVUxMKSB7Ci0JCQkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tqXS0+ZGV2X21peGVyKTsKLQkJCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTdfY29kZWNbal0pOwotCQkJCX0KLQkJCW1kZWxheSgxMCAqIGNzX2xhcHRvcF93YWl0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlpZihpID49IDQpIHsKLQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDEsIHByaW50aygKLQkJCSJjczQ2eHg6IGNzNDZ4eF9wcm9iZSgpLSBjc19oYXJkd2FyZV9pbml0KCkgZmFpbGVkLCByZXRyaWVkICVkIHRpbWVzLlxuIixpKSk7Ci0gICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+ZGV2X21pZGkpCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX21pZGkoY2FyZC0+ZGV2X21pZGkpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLQl9Ci0KLSAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOwotICAgICAgICBtdXRleF9pbml0KCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5taWRpLml3YWl0KTsKLSAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5vd2FpdCk7Ci0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9NSURDUiwgTUlEQ1JfTVJTVCk7ICAgCi0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9NSURDUiwgMCk7ICAgCi0KLQkvKiAKLQkqIENoZWNrIGlmIHdlIGhhdmUgdG8gaW5pdCB0aGUgYW1wbGlmaWVyLCBidXQgcHJvYmFibHkgYWxyZWFkeSBkb25lCi0JKiBzaW5jZSB0aGUgQ0QgbG9naWMgaW4gdGhlIGFjOTcgaW5pdCBjb2RlIHdpbGwgdHVybiBvbiB0aGUgZXh0IGFtcC4KLQkqLwotCWlmIChjcC0+YW1wX2luaXQpCi0JCWNwLT5hbXBfaW5pdChjYXJkKTsKLSAgICAgICAgY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOwotCi0JUENJX1NFVF9EUklWRVJfREFUQShwY2lfZGV2LCBjYXJkKTsKLQlQQ0lfU0VUX0RNQV9NQVNLKHBjaV9kZXYsIGRtYV9tYXNrKTsKLQlsaXN0X2FkZCgmY2FyZC0+bGlzdCwgJmNzNDZ4eF9kZXZzKTsKLQotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBwbS5mbGFncz0weCV4IGNhcmQ9JXBcbiIsCi0JCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncyxjYXJkKSk7Ci0KLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPCi0JCSJjczQ2eHg6IHByb2JlKCktIGRldmljZSBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5XG4iKSk7Ci0gICAgICAgIHJldHVybiAwOwotCi1mYWlsOgotCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci1mYWlsMjoKLQlpZiAoY2FyZC0+YmEwKQotCQlpb3VubWFwKGNhcmQtPmJhMCk7Ci0JaWYgKGNhcmQtPmJhMS5uYW1lLmRhdGEwKQotCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGEwKTsKLQlpZiAoY2FyZC0+YmExLm5hbWUuZGF0YTEpCi0JCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTEpOwotCWlmIChjYXJkLT5iYTEubmFtZS5wbWVtKQotCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLnBtZW0pOwotCWlmIChjYXJkLT5iYTEubmFtZS5yZWcpCi0JCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucmVnKTsKLQlrZnJlZShjYXJkKTsKLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCi0JCSJjczQ2eHg6IHByb2JlKCktIG5vIGRldmljZSBhbGxvY2F0ZWRcbiIpKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0gLy8gcHJvYmVfY3M0Nnh4Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDZ4eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBQQ0lfR0VUX0RSSVZFUl9EQVRBKHBjaV9kZXYpOwotCWludCBpOwotCXVuc2lnbmVkIGludCB0bXA7Ci0JCi0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkgImNzNDZ4eDogY3M0Nnh4X3JlbW92ZSgpK1xuIikpOwotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKLQkKLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7Ci0JdG1wICY9IH4weDAwMDBmMDNmOwotCXRtcCB8PSAgMHgwMDAwMDAxMDsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGRpc2FibGUgKi8KLQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOwotCXRtcCAmPSB+MHgwMDAwMDAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMTE7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7Ci0KLQkvKgotICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOwotCi0JLyoKLSAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCi0gICAgICAgICAqLwotCWNzNDYxeF9yZXNldChjYXJkKTsKLQotCWNzNDYxeF9wcm9jX3N0b3AoY2FyZCk7Ci0KLQkvKgotCSAqICBQb3dlciBkb3duIHRoZSBEQUMgYW5kIEFEQy4gIFdlIHdpbGwgcG93ZXIgdGhlbSB1cCAoaWYpIHdoZW4gd2UgbmVlZAotCSAqICB0aGVtLgotCSAqLwotCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19UUlVFKSkpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7Ci0JfQotCi0JLyoKLQkgKiAgUG93ZXIgZG93biB0aGUgUExMLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIDApOwotCi0JLyoKLQkgKiAgVHVybiBvZmYgdGhlIFByb2Nlc3NvciBieSB0dXJuaW5nIG9mZiB0aGUgc29mdHdhcmUgY2xvY2sgZW5hYmxlIGZsYWcgaW4gCi0JICogIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpICYgfkNMS0NSMV9TV0NFOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Ci0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLC0xKTsKLQotCS8qIGZyZWUgaGFyZHdhcmUgcmVzb3VyY2VzICovCi0JZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKLQlpb3VubWFwKGNhcmQtPmJhMCk7Ci0JaW91bm1hcChjYXJkLT5iYTEubmFtZS5kYXRhMCk7Ci0JaW91bm1hcChjYXJkLT5iYTEubmFtZS5kYXRhMSk7Ci0JaW91bm1hcChjYXJkLT5iYTEubmFtZS5wbWVtKTsKLQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLnJlZyk7Ci0JCi0JLyogdW5yZWdpc3RlciBhdWRpbyBkZXZpY2VzICovCi0JZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKLQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCkgewotCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIpOwotCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTdfY29kZWNbaV0pOwotCQl9Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKLSAgICAgICAgaWYgKGNhcmQtPmRldl9taWRpKQotICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfbWlkaShjYXJkLT5kZXZfbWlkaSk7Ci0JbGlzdF9kZWwoJmNhcmQtPmxpc3QpOwotCWtmcmVlKGNhcmQpOwotCVBDSV9TRVRfRFJJVkVSX0RBVEEocGNpX2RldixOVUxMKTsKLQotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KLQkJICJjczQ2eHg6IGNzNDZ4eF9yZW1vdmUoKS06IHJlbW92ZSBzdWNjZXNzZnVsXG4iKSk7Ci19Ci0KLWVudW0gewotCUNTNDZYWF80NjEwID0gMCwKLQlDUzQ2WFhfNDYxMiwgIAkvKiBzYW1lIGFzIDQ2MzAgKi8KLQlDUzQ2WFhfNDYxNSwgIAkvKiBzYW1lIGFzIDQ2MjQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczQ2eHhfcGNpX3RibFtdID0gewotCXsKLQkJLnZlbmRvcgkgICAgID0gUENJX1ZFTkRPUl9JRF9DSVJSVVMsCi0JCS5kZXZpY2UJICAgICA9IFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAsCi0JCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IENTNDZYWF80NjEwLAotCX0sCi0JewotCQkudmVuZG9yCSAgICAgPSBQQ0lfVkVORE9SX0lEX0NJUlJVUywKLQkJLmRldmljZQkgICAgID0gUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMiwKLQkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gQ1M0NlhYXzQ2MTIsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJICAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAotCQkuZGV2aWNlCSAgICAgPSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1LAotCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBDUzQ2WFhfNDYxNSwKLQl9LAotCXsgMCwgfSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczQ2eHhfcGNpX3RibCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjczQ2eHhfcGNpX2RyaXZlciA9IHsKLQkubmFtZQkgID0gImNzNDZ4eCIsCi0JLmlkX3RhYmxlID0gY3M0Nnh4X3BjaV90YmwsCi0JLnByb2JlCSAgPSBjczQ2eHhfcHJvYmUsCi0JLnJlbW92ZQkgID0gX19kZXZleGl0X3AoY3M0Nnh4X3JlbW92ZSksCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgID0gY3M0Nnh4X3N1c3BlbmRfdGJsLAotCS5yZXN1bWUJICA9IGNzNDZ4eF9yZXN1bWVfdGJsLAotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBjczQ2eHhfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgcnRuID0gMDsKLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjczQ2eHhfaW5pdF9tb2R1bGUoKSsgXG4iKSk7Ci0JcnRuID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3M0Nnh4X3BjaV9kcml2ZXIpOwotCi0JaWYgKHJ0biA9PSAtRU5PREVWKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayggCi0JCQkiY3M0Nnh4OiBVbmFibGUgdG8gZGV0ZWN0IHZhbGlkIGNzNDZ4eCBkZXZpY2VcbiIpKTsKLQl9Ci0KLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X2luaXRfbW9kdWxlKCktICglZClcbiIscnRuKSk7Ci0JcmV0dXJuIHJ0bjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNzNDZ4eF9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3M0Nnh4X3BjaV9kcml2ZXIpOwotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjbGVhbnVwX2NzNDZ4eCgpIGZpbmlzaGVkXG4iKSk7Ci19Ci0KLW1vZHVsZV9pbml0KGNzNDZ4eF9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChjczQ2eHhfY2xlYW51cF9tb2R1bGUpOwotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGNzNDZ4eF9zdXNwZW5kX3RibChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKnMgPSBQQ0lfR0VUX0RSSVZFUl9EQVRBKHBjaWRldik7Ci0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDIsIAotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9zdXNwZW5kX3RibCByZXF1ZXN0XG4iKSk7Ci0JY3M0Nnh4X3N1c3BlbmQocywgc3RhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNzNDZ4eF9yZXN1bWVfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKnMgPSBQQ0lfR0VUX0RSSVZFUl9EQVRBKHBjaWRldik7Ci0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDIsIAotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9yZXN1bWVfdGJsIHJlcXVlc3RcbiIpKTsKLQljczQ2eHhfcmVzdW1lKHMpOwotCXJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0Nnh4X3dyYXBwZXItMjQuaCBiL3NvdW5kL29zcy9jczQ2eHhfd3JhcHBlci0yNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhlMDExLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9jczQ2eHhfd3JhcHBlci0yNC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAiY3M0Nnh4X3dyYXBwZXIuYyIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCi0qCi0qICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCi0qICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCi0qICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KLSoKLSogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0qICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0qICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qCi0qICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKgotKiAwMS8xMS8yMDAxIHRydyAtIG5ldyBmaWxlIGZyb20gY3M0MjgxIHdyYXBwZXIgY29kZS4gCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0NTNDZYWF9XUkFQUEVSMjRfSAotI2RlZmluZSBfX0NTNDZYWF9XUkFQUEVSMjRfSAotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2RlZmluZSBDU19PV05FUiAub3duZXIgPQotI2RlZmluZSBDU19USElTX01PRFVMRSBUSElTX01PRFVMRSwKLXN0YXRpYyBpbmxpbmUgdm9pZCBjczQ2eHhfbnVsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KSB7IHJldHVybjsgfQotI2RlZmluZSBjczR4X21lbV9tYXBfcmVzZXJ2ZShwYWdlKSBTZXRQYWdlUmVzZXJ2ZWQocGFnZSkKLSNkZWZpbmUgY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShwYWdlKSBDbGVhclBhZ2VSZXNlcnZlZChwYWdlKQotCi0jZGVmaW5lIGZyZWVfZG1hYnVmKGNhcmQsIGRtYWJ1ZikgXAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoKGNhcmQpLT5wY2lfZGV2LCBcCi0JCQkgICAgUEFHRV9TSVpFIDw8IChkbWFidWYpLT5idWZvcmRlciwgXAotCQkJICAgIChkbWFidWYpLT5yYXdidWYsIChkbWFidWYpLT5kbWFhZGRyKTsKLSNkZWZpbmUgZnJlZV9kbWFidWYyKGNhcmQsIGRtYWJ1ZikgXAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoKGNhcmQpLT5wY2lfZGV2LCBcCi0JCQkJICAgIFBBR0VfU0laRSA8PCAoZG1hYnVmKS0+YnVmb3JkZXJfdG1wYnVmZiwgXAotCQkJCSAgICAoZG1hYnVmKS0+dG1wYnVmZiwgKGRtYWJ1ZiktPmRtYWFkZHJfdG1wYnVmZik7Ci0jZGVmaW5lIGNzNHhfcGdvZmYodm1hKSAoKHZtYSktPnZtX3Bnb2ZmKQotCi0jZGVmaW5lIFJTUkNJU0lPUkVHSU9OKGRldixudW0pICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLnN0YXJ0ICE9IDAgJiYgXAotCSAoKGRldiktPnJlc291cmNlWyhudW0pXS5mbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pCi0jZGVmaW5lIFJTUkNJU01FTU9SWVJFR0lPTihkZXYsbnVtKSAoKGRldiktPnJlc291cmNlWyhudW0pXS5zdGFydCAhPSAwICYmIFwKLQkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSkKLSNkZWZpbmUgUlNSQ0FERFJFU1MoZGV2LG51bSkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uc3RhcnQpCi0jZGVmaW5lIFBDSV9HRVRfRFJJVkVSX0RBVEEgcGNpX2dldF9kcnZkYXRhCi0jZGVmaW5lIFBDSV9TRVRfRFJJVkVSX0RBVEEgcGNpX3NldF9kcnZkYXRhCi0jZGVmaW5lIFBDSV9TRVRfRE1BX01BU0socGNpZGV2LG1hc2spIHBjaWRldi0+ZG1hX21hc2sgPSBtYXNrCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eHBtLmggYi9zb3VuZC9vc3MvY3M0Nnh4cG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMmI2ZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvY3M0Nnh4cG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgImNzNDZ4eHBtLmgiIC0tICBDaXJydXMgTG9naWMtQ3J5c3RhbCBDUzQ2WFggbGludXggYXVkaW8gZHJpdmVyLgotKgotKiAgICAgIENvcHlyaWdodCAoQykgMjAwMCwyMDAxICBDaXJydXMgTG9naWMgQ29ycC4gIAotKiAgICAgICAgICAgIC0tIHRvbSB3b2xsZXIgKHR3b2xsZXJAY3J5c3RhbC5jaXJydXMuY29tKSBvcgotKiAgICAgICAgICAgICAgIChwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSkuCi0qCi0qICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0qICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLSogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKgotKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSoKLSogMTIvMjIvMDAgdHJ3IC0gbmV3IGZpbGUuIAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19DUzQ2WFhQTV9ICi0jZGVmaW5lIF9fQ1M0NlhYUE1fSAotCi0jZGVmaW5lIENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUgMHgyNgotI2RlZmluZSBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTIChDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFLzItMSkKLQotLyogUE0gc3RhdGUgZGVmaW50aW9ucyAqLwotI2RlZmluZSBDUzQ2WFhfUE1fTk9UX1JFR0lTVEVSRUQJMHgxMDAwCi0jZGVmaW5lIENTNDZYWF9QTV9JRExFCQkJMHgwMDAxCi0jZGVmaW5lIENTNDZYWF9QTV9TVVNQRU5ESU5HCQkweDAwMDIKLSNkZWZpbmUgQ1M0NlhYX1BNX1NVU1BFTkRFRAkJMHgwMDA0Ci0jZGVmaW5lIENTNDZYWF9QTV9SRVNVTUlORwkJMHgwMDA4Ci0jZGVmaW5lIENTNDZYWF9QTV9SRVNVTUVECQkweDAwMTAKLQotI2RlZmluZSBDU19QT1dFUl9EQUMJCQkweDAwMDEKLSNkZWZpbmUgQ1NfUE9XRVJfQURDCQkJMHgwMDAyCi0jZGVmaW5lIENTX1BPV0VSX01JWFZPTgkJCTB4MDAwNAotI2RlZmluZSBDU19QT1dFUl9NSVhWT0ZGCQkweDAwMDgKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX09OCTB4ZjAwMCAgLyogYWx3YXlzIG9uIGJpdHMgKGludmVydGVkKSAqLwotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDCTB4MDEwMAotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDCTB4MDIwMAotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OCTB4MDQwMAotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRgkweDA4MDAKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTgkweDAwMDEKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTgkweDAwMDIKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTgkweDAwMDQKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04gMHgwMDA4Ci0KLXN0cnVjdCBjczQ2eHhfcG0gewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHUzMkNMS0NSMV9TQVZFLHUzMlNTUE1WYWx1ZSx1MzJQUExWQ3ZhbHVlLHUzMlBQUlZDdmFsdWU7Ci0JdTMyIHUzMkZNTFZDdmFsdWUsdTMyRk1SVkN2YWx1ZSx1MzJHUElPUnZhbHVlLHUzMkpTQ1RMdmFsdWUsdTMyU1NDUjsKLQl1MzIgdTMyU1JDU0EsdTMyRGFjQVNSLHUzMkFkY0FTUix1MzJEYWNTUix1MzJBZGNTUix1MzJNSURDUl9TYXZlOwotCXUzMiB1MzJTU1BNX0JJVFM7Ci0JdTMyIGFjOTdbQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHU107Ci0JdTMyIHUzMkFDOTdfbWFzdGVyX3ZvbHVtZSwgdTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lLCB1MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubzsKLQl1MzIgdTMyQUM5N19wY21fb3V0X3ZvbHVtZSwgdTMyQUM5N19wb3dlcmRvd24sIHUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlOwotCXUzMiB1MzJod3B0cl9wbGF5YmFjayx1MzJod3B0cl9jYXB0dXJlOwotCXVuc2lnbmVkIGRtYWJ1Zl9zd3B0cl9wbGF5OwotCWludCBkbWFidWZfY291bnRfcGxheTsKLQl1bnNpZ25lZCBkbWFidWZfc3dwdHJfY2FwdHVyZTsKLQlpbnQgZG1hYnVmX2NvdW50X2NhcHR1cmU7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxLzgwMTAuaCBiL3NvdW5kL29zcy9lbXUxMGsxLzgwMTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjNmM0Mi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS84MDEwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgODAxMC5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTktMjAwMSBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZQkJICAgIEF1dGhvcgkgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLQkJICAgIC0tLS0tLQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3gJICAgIENsZWFuZWQgb2YgOGJpdCBjaGFycywgRE9TCi0gKgkJCQkJICAgIGxpbmUgZW5kaW5ncwotICogICAgIERlY2VtYmVyIDgsIDE5OTkgICAgIEpvbiBUYXlsb3IJICAgIEFkZGVkIGxvdHMgb2YgbmV3IHJlZ2lzdGVyIGluZm8KLSAqICAgICBNYXkgMTYsIDIwMDEgICAgICAgICBEYW5pZWwgQmVydHJhbmQgQWRkZWQgdW5vZmZpY2lhbCBEQkcgcmVnaXN0ZXIgaW5mbwotICogICAgIE9jdC1Ob3YgMjAwMSAgICAgICAgIEQuQi4gICAgICAgICAgICBBZGRlZCB1bm9mZmljaWFsIEF1ZGlneSByZWdpc3RlcnMgCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotCi0jaWZuZGVmIF84MDEwX0gKLSNkZWZpbmUgXzgwMTBfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotLy8gRHJpdmVyIHZlcnNpb246Ci0jZGVmaW5lIE1BSk9SX1ZFUiAwCi0jZGVmaW5lIE1JTk9SX1ZFUiAyMAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4yMGEiCi0KLQotLy8gQXVkaWd5IHNwZWNpZnkgcmVnaXN0ZXJzIGFyZSBwcmVmaXhlZCB3aXRoICdBXycKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFBDSSBmdW5jdGlvbiAwIHJlZ2lzdGVycywgYWRkcmVzcyA9IDx2YWw+ICsgUENJQkFTRTAJCQkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBQVFIJCQkweDAwCQkvKiBJbmRleGVkIHJlZ2lzdGVyIHNldCBwb2ludGVyIHJlZ2lzdGVyCSovCi0JCQkJCQkvKiBOT1RFOiBUaGUgQ0hBTk5FTE5VTSBhbmQgQUREUkVTUyB3b3JkcyBjYW4JKi8KLQkJCQkJCS8qIGJlIG1vZGlmaWVkIGluZGVwZW5kZW50bHkgb2YgZWFjaCBvdGhlci4JKi8KLSNkZWZpbmUgUFRSX0NIQU5ORUxOVU1fTUFTSwkweDAwMDAwMDNmCS8qIEZvciBlYWNoIHBlci1jaGFubmVsIHJlZ2lzdGVyLCBpbmRpY2F0ZXMgdGhlCSovCi0JCQkJCQkvKiBjaGFubmVsIG51bWJlciBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUJCSovCi0JCQkJCQkvKiBhY2Nlc3NlZC4gIEZvciBub24gcGVyLWNoYW5uZWwgcmVnaXN0ZXJzIHRoZQkqLwotCQkJCQkJLyogdmFsdWUgc2hvdWxkIGJlIHNldCB0byB6ZXJvLgkJCSovCi0jZGVmaW5lIFBUUl9BRERSRVNTX01BU0sJMHgwN2ZmMDAwMAkvKiBSZWdpc3RlciBpbmRleAkJCQkqLwotCi0jZGVmaW5lIERBVEEJCQkweDA0CQkvKiBJbmRleGVkIHJlZ2lzdGVyIHNldCBkYXRhIHJlZ2lzdGVyCQkqLwotCi0jZGVmaW5lIElQUgkJCTB4MDgJCS8qIEdsb2JhbCBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcgkJKi8KLQkJCQkJCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyBieSB3cml0aW5nIGEgMSB0bwkqLwotCQkJCQkJLyogdGhlIHJlbGV2YW50IGJpdHMgYW5kIHplcm8gdG8gdGhlIG90aGVyIGJpdHMJKi8KLQotLyogVGhlIG5leHQgdHdvIGludGVycnVwdHMgYXJlIGZvciB0aGUgbWlkaSBwb3J0IG9uIHRoZSBBdWRpZ3kgRHJpdmUgKEFfTVBVMSkJCQkqLwotI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTIJMHgxMDAwMDAwMAkvKiBNSURJIFVBUlQgdHJhbnNtaXQgYnVmZmVyIGVtcHR5CQkqLwotI2RlZmluZSBBX0lQUl9NSURJUkVDVkJVRkVNUFRZMgkweDA4MDAwMDAwCS8qIE1JREkgVUFSVCByZWNlaXZlIGJ1ZmZlciBlbXB0eQkJKi8KLQotI2RlZmluZSBJUFJfU0FNUExFUkFURVRSQUNLRVIJMHgwMTAwMDAwMAkvKiBTYW1wbGUgcmF0ZSB0cmFja2VyIGxvY2sgc3RhdHVzIGNoYW5nZQkqLwotI2RlZmluZSBJUFJfRlhEU1AJCTB4MDA4MDAwMDAJLyogRW5hYmxlIEZYIERTUCBpbnRlcnJ1cHRzCQkJKi8KLSNkZWZpbmUgSVBSX0ZPUkNFSU5UCQkweDAwNDAwMDAwCS8qIEZvcmNlIFNvdW5kIEJsYXN0ZXIgaW50ZXJydXB0CQkqLwotI2RlZmluZSBJUFJfUENJRVJST1IJCTB4MDAyMDAwMDAJLyogUENJIGJ1cyBlcnJvcgkJCQkqLwotI2RlZmluZSBJUFJfVk9MSU5DUgkJMHgwMDEwMDAwMAkvKiBWb2x1bWUgaW5jcmVtZW50IGJ1dHRvbiBwcmVzc2VkCQkqLwotI2RlZmluZSBJUFJfVk9MREVDUgkJMHgwMDA4MDAwMAkvKiBWb2x1bWUgZGVjcmVtZW50IGJ1dHRvbiBwcmVzc2VkCQkqLwotI2RlZmluZSBJUFJfTVVURQkJMHgwMDA0MDAwMAkvKiBNdXRlIGJ1dHRvbiBwcmVzc2VkCQkJCSovCi0jZGVmaW5lIElQUl9NSUNCVUZGVUxMCQkweDAwMDIwMDAwCS8qIE1pY3JvcGhvbmUgYnVmZmVyIGZ1bGwJCQkqLwotI2RlZmluZSBJUFJfTUlDQlVGSEFMRkZVTEwJMHgwMDAxMDAwMAkvKiBNaWNyb3Bob25lIGJ1ZmZlciBoYWxmIGZ1bGwJCQkqLwotI2RlZmluZSBJUFJfQURDQlVGRlVMTAkJMHgwMDAwODAwMAkvKiBBREMgYnVmZmVyIGZ1bGwJCQkJKi8KLSNkZWZpbmUgSVBSX0FEQ0JVRkhBTEZGVUxMCTB4MDAwMDQwMDAJLyogQURDIGJ1ZmZlciBoYWxmIGZ1bGwJCQkJKi8KLSNkZWZpbmUgSVBSX0VGWEJVRkZVTEwJCTB4MDAwMDIwMDAJLyogRWZmZWN0cyBidWZmZXIgZnVsbAkJCQkqLwotI2RlZmluZSBJUFJfRUZYQlVGSEFMRkZVTEwJMHgwMDAwMTAwMAkvKiBFZmZlY3RzIGJ1ZmZlciBoYWxmIGZ1bGwJCQkqLwotI2RlZmluZSBJUFJfR1BTUERJRlNUQVRVU0NIQU5HRQkweDAwMDAwODAwCS8qIEdQU1BESUYgY2hhbm5lbCBzdGF0dXMgY2hhbmdlCQkqLwotI2RlZmluZSBJUFJfQ0RST01TVEFUVVNDSEFOR0UJMHgwMDAwMDQwMAkvKiBDRC1ST00gY2hhbm5lbCBzdGF0dXMgY2hhbmdlCQkJKi8KLSNkZWZpbmUgSVBSX0lOVEVSVkFMVElNRVIJMHgwMDAwMDIwMAkvKiBJbnRlcnZhbCB0aW1lciB0ZXJtaW5hbCBjb3VudAkJKi8KLSNkZWZpbmUgSVBSX01JRElUUkFOU0JVRkVNUFRZCTB4MDAwMDAxMDAJLyogTUlESSBVQVJUIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KLSNkZWZpbmUgSVBSX01JRElSRUNWQlVGRU1QVFkJMHgwMDAwMDA4MAkvKiBNSURJIFVBUlQgcmVjZWl2ZSBidWZmZXIgZW1wdHkJCSovCi0jZGVmaW5lIElQUl9DSEFOTkVMTE9PUAkJMHgwMDAwMDA0MAkvKiBPbmUgb3IgbW9yZSBjaGFubmVsIGxvb3AgaW50ZXJydXB0cyBwZW5kaW5nCSovCi0jZGVmaW5lIElQUl9DSEFOTkVMTlVNQkVSTUFTSwkweDAwMDAwMDNmCS8qIFdoZW4gSVBSX0NIQU5ORUxMT09QIGlzIHNldCwgaW5kaWNhdGVzIHRoZQkqLwotCQkJCQkJLyogSGlnaGVzdCBzZXQgY2hhbm5lbCBpbiBDTElQTCBvciBDTElQSC4gIFdoZW4JKi8KLQkJCQkJCS8qIElQIGlzIHdyaXR0ZW4gd2l0aCBDTCBzZXQsIHRoZSBiaXQgaW4gQ0xJUEwJKi8KLQkJCQkJCS8qIG9yIENMSVBIIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENJTiB2YWx1ZSAJKi8KLQkJCQkJCS8qIHdyaXR0ZW4gd2lsbCBiZSBjbGVhcmVkLgkJCSovCi0jZGVmaW5lIEFfSVBSX01JRElUUkFOU0JVRkVNUFRZMQlJUFJfTUlESVRSQU5TQlVGRU1QVFkJLyogTUlESSBVQVJUIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KLSNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTEJSVBSX01JRElSRUNWQlVGRU1QVFkJLyogTUlESSBVQVJUIHJlY2VpdmUgYnVmZmVyIGVtcHR5CQkqLwotCi0KLQotI2RlZmluZSBJTlRFCQkJMHgwYwkJLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlcgkJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTFNCX01BU0sJMHhjMDAwMDAwMAkvKiBWaXJ0dWFsIFNvdW5kYmxhc3RlciBJL08gcG9ydCBjYXB0dXJlCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTFNCXzIyMAkweDAwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDIyMC0weDIyZgkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yNDAJMHg0MDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyNDAJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTFNCXzI2MAkweDgwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDI2MAkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjgwCTB4YzAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjgwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfTUFTSwkweDMwMDAwMDAwCS8qIFZpcnR1YWwgTVBVIEkvTyBwb3J0IGNhcHR1cmUJCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzAwCTB4MDAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzAwLTB4MzAxCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTE1QVV8zMTAJMHgxMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgzMTAJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTE1QVV8zMjAJMHgyMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgzMjAJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTE1QVV8zMzAJMHgzMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgzMzAJCSovCi0jZGVmaW5lIElOVEVfTUFTVEVSRE1BRU5BQkxFCTB4MDgwMDAwMDAJLyogTWFzdGVyIERNQSBlbXVsYXRpb24gYXQgMHgwMDAtMHgwMGYJCSovCi0jZGVmaW5lIElOVEVfU0xBVkVETUFFTkFCTEUJMHgwNDAwMDAwMAkvKiBTbGF2ZSBETUEgZW11bGF0aW9uIGF0IDB4MGMwLTB4MGRmCQkqLwotI2RlZmluZSBJTlRFX01BU1RFUlBJQ0VOQUJMRQkweDAyMDAwMDAwCS8qIE1hc3RlciBQSUMgZW11bGF0aW9uIGF0IDB4MDIwLTB4MDIxCQkqLwotI2RlZmluZSBJTlRFX1NMQVZFUElDRU5BQkxFCTB4MDEwMDAwMDAJLyogU2xhdmUgUElDIGVtdWxhdGlvbiBhdCAweDBhMC0weDBhMQkJKi8KLSNkZWZpbmUgSU5URV9WU0JFTkFCTEUJCTB4MDA4MDAwMDAJLyogRW5hYmxlIHZpcnR1YWwgU291bmRibGFzdGVyCQkJKi8KLSNkZWZpbmUgSU5URV9BRExJQkVOQUJMRQkweDAwNDAwMDAwCS8qIEVuYWJsZSBBZExpYiBlbXVsYXRpb24gYXQgMHgzODgtMHgzOGIJKi8KLSNkZWZpbmUgSU5URV9NUFVFTkFCTEUJCTB4MDAyMDAwMDAJLyogRW5hYmxlIHZpcnR1YWwgTVBVCQkJCSovCi0jZGVmaW5lIElOVEVfRk9SQ0VJTlQJCTB4MDAxMDAwMDAJLyogQ29udGludW91c2x5IGFzc2VydCBJTlRBTgkJCSovCi0KLSNkZWZpbmUgSU5URV9NUkhBTkRFTkFCTEUJMHgwMDA4MDAwMAkvKiBFbmFibGUgdGhlICJNci4gSGFuZCIgbG9naWMJCQkqLwotCQkJCQkJLyogTk9URTogVGhlcmUgaXMgbm8gcmVhc29uIHRvIHVzZSB0aGlzIHVuZGVyCSovCi0JCQkJCQkvKiBMaW51eCwgYW5kIGl0IHdpbGwgY2F1c2Ugb2RkIGhhcmR3YXJlIAkqLwotCQkJCQkJLyogYmVoYXZpb3IgYW5kIHBvc3NpYmx5IHJhbmRvbSBzZWdmYXVsdHMgYW5kCSovCi0JCQkJCQkvKiBsb2NrdXBzIGlmIGVuYWJsZWQuCQkJCSovCi0KLS8qIFRoZSBuZXh0IHR3byBpbnRlcnJ1cHRzIGFyZSBmb3IgdGhlIG1pZGkgcG9ydCBvbiB0aGUgQXVkaWd5IERyaXZlIChBX01QVTEpCQkJKi8KLSNkZWZpbmUgQV9JTlRFX01JRElUWEVOQUJMRTIJMHgwMDAyMDAwMAkvKiBFbmFibGUgTUlESSB0cmFuc21pdC1idWZmZXItZW1wdHkgaW50ZXJydXB0cwkqLwotI2RlZmluZSBBX0lOVEVfTUlESVJYRU5BQkxFMgkweDAwMDEwMDAwCS8qIEVuYWJsZSBNSURJIHJlY2VpdmUtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KLQotCi0jZGVmaW5lIElOVEVfU0FNUExFUkFURVRSQUNLRVIJMHgwMDAwMjAwMAkvKiBFbmFibGUgc2FtcGxlIHJhdGUgdHJhY2tlciBpbnRlcnJ1cHRzCSovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIGJpdCBtdXN0IGFsd2F5cyBiZSBlbmFibGVkICAgICAgIAkqLwotI2RlZmluZSBJTlRFX0ZYRFNQRU5BQkxFCTB4MDAwMDEwMDAJLyogRW5hYmxlIEZYIERTUCBpbnRlcnJ1cHRzCQkJKi8KLSNkZWZpbmUgSU5URV9QQ0lFUlJPUkVOQUJMRQkweDAwMDAwODAwCS8qIEVuYWJsZSBQQ0kgYnVzIGVycm9yIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfVk9MSU5DUkVOQUJMRQkweDAwMDAwNDAwCS8qIEVuYWJsZSB2b2x1bWUgaW5jcmVtZW50IGJ1dHRvbiBpbnRlcnJ1cHRzCSovCi0jZGVmaW5lIElOVEVfVk9MREVDUkVOQUJMRQkweDAwMDAwMjAwCS8qIEVuYWJsZSB2b2x1bWUgZGVjcmVtZW50IGJ1dHRvbiBpbnRlcnJ1cHRzCSovCi0jZGVmaW5lIElOVEVfTVVURUVOQUJMRQkJMHgwMDAwMDEwMAkvKiBFbmFibGUgbXV0ZSBidXR0b24gaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9NSUNCVUZFTkFCTEUJMHgwMDAwMDA4MAkvKiBFbmFibGUgbWljcm9waG9uZSBidWZmZXIgaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9BRENCVUZFTkFCTEUJMHgwMDAwMDA0MAkvKiBFbmFibGUgQURDIGJ1ZmZlciBpbnRlcnJ1cHRzCQkJKi8KLSNkZWZpbmUgSU5URV9FRlhCVUZFTkFCTEUJMHgwMDAwMDAyMAkvKiBFbmFibGUgRWZmZWN0cyBidWZmZXIgaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9HUFNQRElGRU5BQkxFCTB4MDAwMDAwMTAJLyogRW5hYmxlIEdQU1BESUYgc3RhdHVzIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfQ0RTUERJRkVOQUJMRQkweDAwMDAwMDA4CS8qIEVuYWJsZSBDRFNQRElGIHN0YXR1cyBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX0lOVEVSVkFMVElNRVJFTkIJMHgwMDAwMDAwNAkvKiBFbmFibGUgaW50ZXJ2YWwgdGltZXIgaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9NSURJVFhFTkFCTEUJMHgwMDAwMDAwMgkvKiBFbmFibGUgTUlESSB0cmFuc21pdC1idWZmZXItZW1wdHkgaW50ZXJydXB0cwkqLwotI2RlZmluZSBJTlRFX01JRElSWEVOQUJMRQkweDAwMDAwMDAxCS8qIEVuYWJsZSBNSURJIHJlY2VpdmUtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KLQotLyogVGhlIG5leHQgdHdvIGludGVycnVwdHMgYXJlIGZvciB0aGUgbWlkaSBwb3J0IG9uIHRoZSBBdWRpZ3kgKEFfTVBVMikJKi8KLSNkZWZpbmUgQV9JTlRFX01JRElUWEVOQUJMRTEgIAlJTlRFX01JRElUWEVOQUJMRQotI2RlZmluZSBBX0lOVEVfTUlESVJYRU5BQkxFMQlJTlRFX01JRElSWEVOQUJMRQotCi0jZGVmaW5lIFdDCQkJMHgxMAkJLyogV2FsbCBDbG9jayByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBXQ19TQU1QTEVDT1VOVEVSX01BU0sJMHgwM0ZGRkZDMAkvKiBTYW1wbGUgcGVyaW9kcyBlbGFwc2VkIHNpbmNlIHJlc2V0CQkqLwotI2RlZmluZSBXQ19TQU1QTEVDT1VOVEVSCTB4MTQwNjAwMTAKLSNkZWZpbmUgV0NfQ1VSUkVOVENIQU5ORUwJMHgwMDAwMDAzRgkvKiBDaGFubmVsIFswLi42M10gY3VycmVudGx5IGJlaW5nIHNlcnZpY2VkCSovCi0JCQkJCQkvKiBOT1RFOiBFYWNoIGNoYW5uZWwgdGFrZXMgMS82NHRoIG9mIGEgc2FtcGxlCSovCi0JCQkJCQkvKiBwZXJpb2QgdG8gYmUgc2VydmljZWQuCQkJKi8KLQotI2RlZmluZSBIQ0ZHCQkJMHgxNAkJLyogSGFyZHdhcmUgY29uZmlnIHJlZ2lzdGVyCQkJKi8KLQkJCQkJCS8qIE5PVEU6IFRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2UgdGhlIGxlZ2FjeQkqLwotCQkJCQkJLyogU291bmRCbGFzdGVyIGVtdWxhdGlvbiBzdHVmZiBkZXNjcmliZWQgYmVsb3cJKi8KLQkJCQkJCS8qIHVuZGVyIExpbnV4LCBhbmQgYWxsIGtpbmRzIG9mIHdlaXJkIGhhcmR3YXJlCSovCi0JCQkJCQkvKiBiZWhhdmlvciBjYW4gcmVzdWx0IGlmIHlvdSB0cnkuICBEb24ndC4JKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX01BU0sJMHhlMDAwMDAwMAkvKiBMZWdhY3kgZnVuY3Rpb24gbnVtYmVyIAkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19NUFUJMHgwMDAwMDAwMAkvKiBMZWdhY3kgTVBVCSAJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX1NCCTB4NDAwMDAwMDAJLyogTGVnYWN5IFNCCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfQUQJMHg2MDAwMDAwMAkvKiBMZWdhY3kgQUQJCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19NUElDCTB4ODAwMDAwMDAJLyogTGVnYWN5IE1QSUMJCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19NRE1BCTB4YTAwMDAwMDAJLyogTGVnYWN5IE1ETUEJCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19TUENJCTB4YzAwMDAwMDAJLyogTGVnYWN5IFNQQ0kJCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19TRE1BCTB4ZTAwMDAwMDAJLyogTGVnYWN5IFNETUEJCQkJCSovCi0jZGVmaW5lIEhDRkdfSU9DQVBUVVJFQUREUgkweDFmMDAwMDAwCS8qIFRoZSA0IExTQnMgb2YgdGhlIGNhcHR1cmVkIEkvTyBhZGRyZXNzLgkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWVdSSVRFCTB4MDA4MDAwMDAJLyogMSA9IHdyaXRlLCAwID0gcmVhZCAJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lXT1JECQkweDAwNDAwMDAwCS8qIDEgPSB3b3JkLCAwID0gYnl0ZSAJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lJTlQJCTB4MDAyMDAwMDAJLyogMSA9IGxlZ2FjeSBldmVudCBjYXB0dXJlZC4gV3JpdGUgMSB0byBjbGVhci4JKi8KLQkJCQkJCS8qIE5PVEU6IFRoZSByZXN0IG9mIHRoZSBiaXRzIGluIHRoaXMgcmVnaXN0ZXIJKi8KLQkJCQkJCS8qIF9hcmVfIHJlbGV2YW50IHVuZGVyIExpbnV4LgkJCSovCi0jZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfTUFTSwkweDAwMDcwMDAwCS8qIENPREVDIGZvcm1hdAkJCQkJKi8KLSNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9BQzk3CTB4MDAwMDAwMDAJLyogQUM5NyBDT0RFQyBmb3JtYXQgLS0gUHJpbWFyeSBPdXRwdXQJCSovCi0jZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfSTJTCTB4MDAwMTAwMDAJLyogSTJTIENPREVDIGZvcm1hdCAtLSBTZWNvbmRhcnkgKFJlYXIpIE91dHB1dAkqLwotI2RlZmluZSBIQ0ZHX0dQSU5QVVQwCQkweDAwMDA0MDAwCS8qIEV4dGVybmFsIHBpbjExMgkJCQkqLwotI2RlZmluZSBIQ0ZHX0dQSU5QVVQxCQkweDAwMDAyMDAwCS8qIEV4dGVybmFsIHBpbjExMAkJCQkqLwotCi0jZGVmaW5lIEhDRkdfR1BPVVRQVVRfTUFTSwkweDAwMDAxYzAwCS8qIEV4dGVybmFsIHBpbnMgd2hpY2ggbWF5IGJlIGNvbnRyb2xsZWQJKi8KLSNkZWZpbmUgSENGR19HUE9VVDAJCTB4MDAwMDEwMDAJLyogc2V0IHRvIGVuYWJsZSBkaWdpdGFsIG91dCBvbiA1LjEgY2FyZHMJKi8KLQotI2RlZmluZSBIQ0ZHX0pPWUVOQUJMRSAgICAgIAkweDAwMDAwMjAwCS8qIEludGVybmFsIGpveXN0aWNrIGVuYWJsZSAgICAJCQkqLwotI2RlZmluZSBIQ0ZHX1BIQVNFVFJBQ0tFTkFCTEUJMHgwMDAwMDEwMAkvKiBQaGFzZSB0cmFja2luZyBlbmFibGUJCQkqLwotCQkJCQkJLyogMSA9IEZvcmNlIGFsbCAzIGFzeW5jIGRpZ2l0YWwgaW5wdXRzIHRvIHVzZQkqLwotCQkJCQkJLyogdGhlIHNhbWUgYXN5bmMgc2FtcGxlIHJhdGUgdHJhY2tlciAoWlZJREVPKQkqLwotI2RlZmluZSBIQ0ZHX0FDM0VOQUJMRV9NQVNLCTB4MHgwMDAwZTAJLyogQUMzIGFzeW5jIGlucHV0IGNvbnRyb2wgLSBOb3QgaW1wbGVtZW50ZWQJKi8KLSNkZWZpbmUgSENGR19BQzNFTkFCTEVfWlZJREVPCTB4MDAwMDAwODAJLyogQ2hhbm5lbHMgMCBhbmQgMSByZXBsYWNlIFpWSURFTwkJKi8KLSNkZWZpbmUgSENGR19BQzNFTkFCTEVfQ0RTUERJRgkweDAwMDAwMDQwCS8qIENoYW5uZWxzIDAgYW5kIDEgcmVwbGFjZSBDRFNQRElGCQkqLwotI2RlZmluZSBIQ0ZHX0FDM0VOQUJMRV9HUFNQRElGICAweDAwMDAwMDIwICAgICAgLyogQ2hhbm5lbHMgMCBhbmQgMSByZXBsYWNlIEdQU1BESUYgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSENGR19BVVRPTVVURQkJMHgwMDAwMDAxMAkvKiBXaGVuIHNldCwgdGhlIGFzeW5jIHNhbXBsZSByYXRlIGNvbnZlcnRvcnMJKi8KLQkJCQkJCS8qIHdpbGwgYXV0b21hdGljYWxseSBtdXRlIHRoZWlyIG91dHB1dCB3aGVuCSovCi0JCQkJCQkvKiB0aGV5IGFyZSBub3QgcmF0ZS1sb2NrZWQgdG8gdGhlIGV4dGVybmFsCSovCi0JCQkJCQkvKiBhc3luYyBhdWRpbyBzb3VyY2UgIAkJCQkqLwotI2RlZmluZSBIQ0ZHX0xPQ0tTT1VORENBQ0hFCTB4MDAwMDAwMDgJLyogMSA9IENhbmNlbCBidXN0bWFzdGVyIGFjY2Vzc2VzIHRvIHNvdW5kY2FjaGUgKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgc2hvdWxkIGdlbmVyYWxseSBuZXZlciBiZSB1c2VkLiAgCSovCi0jZGVmaW5lIEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLCTB4MDAwMDAwMDQJLyogMSA9IENhbmNlbCBidXN0bWFzdGVyIGFjY2Vzc2VzIHRvIHRhbmtjYWNoZQkqLwotCQkJCQkJLyogTk9URTogVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG5ldmVyIGJlIHVzZWQuICAJKi8KLSNkZWZpbmUgSENGR19MT0NLVEFOS0NBQ0hFCTB4MDEwMjAwMTQKLSNkZWZpbmUgSENGR19NVVRFQlVUVE9ORU5BQkxFCTB4MDAwMDAwMDIJLyogMSA9IE1hc3RlciBtdXRlIGJ1dHRvbiBzZXRzIEFVRElPRU5BQkxFID0gMC4JKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgaXMgYSAnY2hlYXAnIHdheSB0byBpbXBsZW1lbnQgYQkqLwotCQkJCQkJLyogbWFzdGVyIG11dGUgZnVuY3Rpb24gb24gdGhlIG11dGUgYnV0dG9uLCBhbmQJKi8KLQkJCQkJCS8qIGluIGdlbmVyYWwgc2hvdWxkIG5vdCBiZSB1c2VkIHVubGVzcyBhIG1vcmUJKi8KLQkJCQkJCS8qIHNvcGhpc3RpY2F0ZWQgbWFzdGVyIG11dGUgZnVuY3Rpb24gaGFzIG5vdAkqLwotCQkJCQkJLyogYmVlbiB3cml0dGVuLiAgICAgICAJCQkJKi8KLSNkZWZpbmUgSENGR19BVURJT0VOQUJMRQkweDAwMDAwMDAxCS8qIDAgPSBDT0RFQ3MgdHJhbnNtaXQgemVyby12YWx1ZWQgc2FtcGxlcwkqLwotCQkJCQkJLyogU2hvdWxkIGJlIHNldCB0byAxIHdoZW4gdGhlIEVNVTEwSzEgaXMJKi8KLQkJCQkJCS8qIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQuCQkJKi8KLQotLy9Gb3IgQXVkaWd5LCBNUFUgcG9ydCBtb3ZlIHRvIDB4NzAtMHg3NCBwdHIgcmVnaXN0ZXIKLQotI2RlZmluZSBNVURBVEEJCQkweDE4CQkvKiBNUFU0MDEgZGF0YSByZWdpc3RlciAoOCBiaXRzKSAgICAgICAJCSovCi0KLSNkZWZpbmUgTVVDTUQJCQkweDE5CQkvKiBNUFU0MDEgY29tbWFuZCByZWdpc3RlciAoOCBiaXRzKSAgICAJCSovCi0jZGVmaW5lIE1VQ01EX1JFU0VUCQkweGZmCQkvKiBSRVNFVCBjb21tYW5kCQkJCSovCi0jZGVmaW5lIE1VQ01EX0VOVEVSVUFSVE1PREUJMHgzZgkJLyogRW50ZXJfVUFSVF9tb2RlIGNvbW1hbmQJCQkqLwotCQkJCQkJLyogTk9URTogQWxsIG90aGVyIGNvbW1hbmRzIGFyZSBpZ25vcmVkCQkqLwotCi0jZGVmaW5lIE1VU1RBVAkJCU1VQ01ECQkvKiBNUFU0MDEgc3RhdHVzIHJlZ2lzdGVyICg4IGJpdHMpICAgICAJCSovCi0jZGVmaW5lIE1VU1RBVF9JUkRZTgkJMHg4MAkJLyogMCA9IE1JREkgZGF0YSBvciBjb21tYW5kIEFDSwkJCSovCi0jZGVmaW5lIE1VU1RBVF9PUkRZTgkJMHg0MAkJLyogMCA9IE1VREFUQSBjYW4gYWNjZXB0IGEgY29tbWFuZCBvciBkYXRhCSovCi0KLSNkZWZpbmUgQV9JT0NGRwkJCTB4MTgJCS8qIEdQSU8gb24gQXVkaWd5IGNhcmQgKDE2Yml0cykJCQkqLwotI2RlZmluZSBBX0dQSU5QVVRfTUFTSwkJMHhmZjAwCi0jZGVmaW5lIEFfR1BPVVRQVVRfTUFTSwkJMHgwMGZmCi0KLSNkZWZpbmUgVElNRVIJCQkweDFhCQkvKiBUaW1lciB0ZXJtaW5hbCBjb3VudCByZWdpc3RlciAoMTYtYml0KQkqLwotCQkJCQkJLyogTk9URTogQWZ0ZXIgdGhlIHJhdGUgaXMgY2hhbmdlZCwgYSBtYXhpbXVtCSovCi0JCQkJCQkvKiBvZiAxMDI0IHNhbXBsZSBwZXJpb2RzIHNob3VsZCBiZSBhbGxvd2VkCSovCi0JCQkJCQkvKiBiZWZvcmUgdGhlIG5ldyByYXRlIGlzIGd1YXJhbnRlZWQgYWNjdXJhdGUuCSovCi0jZGVmaW5lIFRJTUVSX1JBVEVfTUFTSwkJMHgwM2ZmCQkvKiBUaW1lciBpbnRlcnJ1cHQgcmF0ZSBpbiBzYW1wbGUgcGVyaW9kcwkqLwotCQkJCQkJLyogMCA9PSAxMDI0IHBlcmlvZHMsIFsxLi40XSBhcmUgbm90IHVzZWZ1bAkqLwotCi0jZGVmaW5lIEFDOTdEQVRBCQkweDFjCQkvKiBBQzk3IHJlZ2lzdGVyIHNldCBkYXRhIHJlZ2lzdGVyICgxNiBiaXQpCSovCi0KLSNkZWZpbmUgQUM5N0FERFJFU1MJCTB4MWUJCS8qIEFDOTcgcmVnaXN0ZXIgc2V0IGFkZHJlc3MgcmVnaXN0ZXIgKDggYml0KQkqLwotI2RlZmluZSBBQzk3QUREUkVTU19SRUFEWQkweDgwCQkvKiBSZWFkLW9ubHkgYml0LCByZWZsZWN0cyBDT0RFQyBSRUFEWSBzaWduYWwJKi8KLSNkZWZpbmUgQUM5N0FERFJFU1NfQUREUkVTUwkweDdmCQkvKiBBZGRyZXNzIG9mIGluZGV4ZWQgQUM5NyByZWdpc3RlcgkJKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRW11MTBrMSBwb2ludGVyLW9mZnNldCByZWdpc3RlciBzZXQsIGFjY2Vzc2VkIHRocm91Z2ggdGhlIFBUUiBhbmQgREFUQSByZWdpc3RlcnMJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIENQRgkJCTB4MDAJCS8qIEN1cnJlbnQgcGl0Y2ggYW5kIGZyYWN0aW9uIHJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgQ1BGX0NVUlJFTlRQSVRDSF9NQVNLCTB4ZmZmZjAwMDAJLyogQ3VycmVudCBwaXRjaCAobGluZWFyLCAweDQwMDAgPT0gdW5pdHkgcGl0Y2ggc2hpZnQpIAkqLwotI2RlZmluZSBDUEZfQ1VSUkVOVFBJVENICTB4MTAxMDAwMDAKLSNkZWZpbmUgQ1BGX1NURVJFT19NQVNLCQkweDAwMDA4MDAwCS8qIDEgPSBFdmVuIGNoYW5uZWwgaW50ZXJsZWF2ZSwgb2RkIGNoYW5uZWwgbG9ja2VkCSovCi0jZGVmaW5lIENQRl9TVE9QX01BU0sJCTB4MDAwMDQwMDAJLyogMSA9IEN1cnJlbnQgcGl0Y2ggZm9yY2VkIHRvIDAJCQkqLwotI2RlZmluZSBDUEZfRlJBQ0FERFJFU1NfTUFTSwkweDAwMDAzZmZmCS8qIExpbmVhciBmcmFjdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgY2hhbm5lbAkqLwotCi0jZGVmaW5lIFBUUlgJCQkweDAxCQkvKiBQaXRjaCB0YXJnZXQgYW5kIHNlbmQgQS9CIGFtb3VudHMgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIFBUUlhfUElUQ0hUQVJHRVRfTUFTSwkweGZmZmYwMDAwCS8qIFBpdGNoIHRhcmdldCBvZiBzcGVjaWZpZWQgY2hhbm5lbAkJCSovCi0jZGVmaW5lIFBUUlhfUElUQ0hUQVJHRVQJMHgxMDEwMDAwMQotI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9BX01BU0sgMHgwMDAwZmYwMAkvKiBMaW5lYXIgbGV2ZWwgb2YgY2hhbm5lbCBvdXRwdXQgc2VudCB0byBGWCBzZW5kIGJ1cyBBCSovCi0jZGVmaW5lIFBUUlhfRlhTRU5EQU1PVU5UX0EJMHgwODA4MDAwMQotI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9CX01BU0sgMHgwMDAwMDBmZgkvKiBMaW5lYXIgbGV2ZWwgb2YgY2hhbm5lbCBvdXRwdXQgc2VudCB0byBGWCBzZW5kIGJ1cyBCCSovCi0jZGVmaW5lIFBUUlhfRlhTRU5EQU1PVU5UX0IJMHgwODAwMDAwMQotCi0jZGVmaW5lIENWQ0YJCQkweDAyCQkvKiBDdXJyZW50IHZvbHVtZSBhbmQgZmlsdGVyIGN1dG9mZiByZWdpc3RlcgkJKi8KLSNkZWZpbmUgQ1ZDRl9DVVJSRU5UVk9MX01BU0sJMHhmZmZmMDAwMAkvKiBDdXJyZW50IGxpbmVhciB2b2x1bWUgb2Ygc3BlY2lmaWVkIGNoYW5uZWwJCSovCi0jZGVmaW5lIENWQ0ZfQ1VSUkVOVFZPTAkJMHgxMDEwMDAwMgotI2RlZmluZSBDVkNGX0NVUlJFTlRGSUxURVJfTUFTSwkweDAwMDBmZmZmCS8qIEN1cnJlbnQgZmlsdGVyIGN1dG9mZiBmcmVxdWVuY3kgb2Ygc3BlY2lmaWVkIGNoYW5uZWwJKi8KLSNkZWZpbmUgQ1ZDRl9DVVJSRU5URklMVEVSCTB4MTAwMDAwMDIKLQotI2RlZmluZSBWVEZUCQkJMHgwMwkJLyogVm9sdW1lIHRhcmdldCBhbmQgZmlsdGVyIGN1dG9mZiB0YXJnZXQgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgVlRGVF9WT0xVTUVUQVJHRVRfTUFTSwkweGZmZmYwMDAwCS8qIFZvbHVtZSB0YXJnZXQgb2Ygc3BlY2lmaWVkIGNoYW5uZWwJCQkqLwotI2RlZmluZSBWVEZUX0ZJTFRFUlRBUkdFVF9NQVNLCTB4MDAwMGZmZmYJLyogRmlsdGVyIGN1dG9mZiB0YXJnZXQgb2Ygc3BlY2lmaWVkIGNoYW5uZWwJCSovCi0KLSNkZWZpbmUgWjEJCQkweDA1CQkvKiBGaWx0ZXIgZGVsYXkgbWVtb3J5IDEgcmVnaXN0ZXIJCQkqLwotCi0jZGVmaW5lIFoyCQkJMHgwNAkJLyogRmlsdGVyIGRlbGF5IG1lbW9yeSAyIHJlZ2lzdGVyCQkJKi8KLQotI2RlZmluZSBQU1NUCQkJMHgwNgkJLyogU2VuZCBDIGFtb3VudCBhbmQgbG9vcCBzdGFydCBhZGRyZXNzIHJlZ2lzdGVyCSovCi0jZGVmaW5lIFBTU1RfRlhTRU5EQU1PVU5UX0NfTUFTSyAweGZmMDAwMDAwCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEMJKi8KLQotI2RlZmluZSBQU1NUX0ZYU0VOREFNT1VOVF9DCTB4MDgxODAwMDYKLQotI2RlZmluZSBQU1NUX0xPT1BTVEFSVEFERFJfTUFTSwkweDAwZmZmZmZmCS8qIExvb3Agc3RhcnQgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwJCSovCi0jZGVmaW5lIFBTU1RfTE9PUFNUQVJUQUREUgkweDE4MDAwMDA2Ci0KLSNkZWZpbmUgRFNMCQkJMHgwNwkJLyogU2VuZCBEIGFtb3VudCBhbmQgbG9vcCBzdGFydCBhZGRyZXNzIHJlZ2lzdGVyCSovCi0jZGVmaW5lIERTTF9GWFNFTkRBTU9VTlRfRF9NQVNLCTB4ZmYwMDAwMDAJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgRAkqLwotCi0jZGVmaW5lIERTTF9GWFNFTkRBTU9VTlRfRAkweDA4MTgwMDA3Ci0KLSNkZWZpbmUgRFNMX0xPT1BFTkRBRERSX01BU0sJMHgwMGZmZmZmZgkvKiBMb29wIGVuZCBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAkJKi8KLSNkZWZpbmUgRFNMX0xPT1BFTkRBRERSCQkweDE4MDAwMDA3Ci0KLSNkZWZpbmUgQ0NDQQkJCTB4MDgJCS8qIEZpbHRlciBRLCBpbnRlcnAuIFJPTSwgYnl0ZSBzaXplLCBjdXIuIGFkZHIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ0NDQV9SRVNPTkFOQ0UJCTB4ZjAwMDAwMDAJLyogTG93cGFzcyBmaWx0ZXIgcmVzb25hbmNlIChRKSBoZWlnaHQJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTU1BU0sJMHgwZTAwMDAwMAkvKiBTZWxlY3RzIHBhc3NiYW5kIG9mIGludGVycG9sYXRpb24gUk9NCQkqLwotCQkJCQkJLyogMSA9PSBmdWxsIGJhbmQsIDcgPT0gbG93cGFzcwkJCQkqLwotCQkJCQkJLyogUk9NIDAgaXMgdXNlZCB3aGVuIHBpdGNoIHNoaWZ0aW5nIGRvd253YXJkIG9yIGxlc3MJKi8KLQkJCQkJCS8qIHRoZW4gMyBzZW1pdG9uZXMgdXB3YXJkLiAgSW5jcmVhc2luZ2x5IGhpZ2hlciBST00JKi8KLQkJCQkJCS8qIG51bWJlcnMgYXJlIHVzZWQsIHR5cGljYWxseSBpbiBzdGVwcyBvZiAzIHNlbWl0b25lcywJKi8KLQkJCQkJCS8qIGFzIHVwd2FyZCBwaXRjaCBzaGlmdGluZyBpcyBwZXJmb3JtZWQuCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV8wCTB4MDAwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDAJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMQkweDAyMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAxCQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzIJMHgwNDAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMgkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV8zCTB4MDYwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDMJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fNAkweDA4MDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSA0CQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzUJMHgwYTAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNQkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV82CTB4MGMwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDYJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fNwkweDBlMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSA3CQkJCSovCi0jZGVmaW5lIENDQ0FfOEJJVFNFTEVDVAkJMHgwMTAwMDAwMAkvKiAxID0gU291bmQgbWVtb3J5IGZvciB0aGlzIGNoYW5uZWwgdXNlcyA4LWJpdCBzYW1wbGVzCSovCi0jZGVmaW5lIENDQ0FfQ1VSUkFERFJfTUFTSwkweDAwZmZmZmZmCS8qIEN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbAkJKi8KLSNkZWZpbmUgQ0NDQV9DVVJSQUREUgkJMHgxODAwMDAwOAotCi0jZGVmaW5lIENDUgkJCTB4MDkJCS8qIENhY2hlIGNvbnRyb2wgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUJMHgwNzE5MDAwOQotI2RlZmluZSBDQ1JfQ0FDSEVJTlZBTElEU0laRV9NQVNLCTB4ZmUwMDAwMDAJLyogTnVtYmVyIG9mIGludmFsaWQgc2FtcGxlcyBjYWNoZSBmb3IgdGhpcyBjaGFubmVsICAgIAkqLwotI2RlZmluZSBDQ1JfQ0FDSEVMT09QRkxBRwkweDAxMDAwMDAwCS8qIDEgPSBDYWNoZSBoYXMgYSBsb29wIHNlcnZpY2UgcGVuZGluZwkJCSovCi0jZGVmaW5lIENDUl9JTlRFUkxFQVZFRFNBTVBMRVMJMHgwMDgwMDAwMAkvKiAxID0gQSBjYWNoZSBzZXJ2aWNlIHdpbGwgZmV0Y2ggaW50ZXJsZWF2ZWQgc2FtcGxlcwkqLwotI2RlZmluZSBDQ1JfV09SRFNJWkVEU0FNUExFUwkweDAwNDAwMDAwCS8qIDEgPSBBIGNhY2hlIHNlcnZpY2Ugd2lsbCBmZXRjaCB3b3JkIHNpemVkIHNhbXBsZXMJKi8KLSNkZWZpbmUgQ0NSX1JFQURBRERSRVNTCQkweDA2MTAwMDA5Ci0jZGVmaW5lIENDUl9SRUFEQUREUkVTU19NQVNLCTB4MDAzZjAwMDAJLyogTG9jYXRpb24gb2YgY2FjaGUganVzdCBiZXlvbmQgY3VycmVudCBjYWNoZSBzZXJ2aWNlCSovCi0jZGVmaW5lIENDUl9MT09QSU5WQUxTSVpFCTB4MDAwMGZlMDAJLyogTnVtYmVyIG9mIGludmFsaWQgc2FtcGxlcyBpbiBjYWNoZSBwcmlvciB0byBsb29wCSovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIGlzIHZhbGlkIG9ubHkgaWYgQ0FDSEVMT09QRkxBRyBpcyBzZXQJKi8KLSNkZWZpbmUgQ0NSX0xPT1BGTEFHCQkweDAwMDAwMTAwCS8qIFNldCBmb3IgYSBzaW5nbGUgc2FtcGxlIHBlcmlvZCB3aGVuIGEgbG9vcCBvY2N1cnMJKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFTE9PUEFERFJISQkweDAwMDAwMGZmCS8qIERTTF9MT09QU1RBUlRBRERSJ3MgaGkgYnl0ZSBpZiBDQUNIRUxPT1BGTEFHIGlzIHNldAkqLwotCi0jZGVmaW5lIENMUAkJCTB4MGEJCS8qIENhY2hlIGxvb3AgcmVnaXN0ZXIgKHZhbGlkIGlmIENDUl9DQUNIRUxPT1BGTEFHID0gMSkgKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgcmVnaXN0ZXIgaXMgbm9ybWFsbHkgbm90IHVzZWQJCSovCi0jZGVmaW5lIENMUF9DQUNIRUxPT1BBRERSCTB4MDAwMGZmZmYJLyogQ2FjaGUgbG9vcCBhZGRyZXNzIChEU0xfTE9PUFNUQVJUQUREUiBbMC4uMTVdKQkqLwotCi0jZGVmaW5lIEZYUlQJCQkweDBiCQkvKiBFZmZlY3RzIHNlbmQgcm91dGluZyByZWdpc3RlcgkJCSovCi0JCQkJCQkvKiBOT1RFOiBJdCBpcyBpbGxlZ2FsIHRvIGFzc2lnbiB0aGUgc2FtZSByb3V0aW5nIHRvCSovCi0JCQkJCQkvKiB0d28gZWZmZWN0cyBzZW5kcy4JCQkJCSovCi0jZGVmaW5lIEZYUlRfQ0hBTk5FTEEJCTB4MDAwZjAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgQQkqLwotI2RlZmluZSBGWFJUX0NIQU5ORUxCCQkweDAwZjAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEIJKi8KLSNkZWZpbmUgRlhSVF9DSEFOTkVMQwkJMHgwZjAwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBDCSovCi0jZGVmaW5lIEZYUlRfQ0hBTk5FTEQJCTB4ZjAwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRAkqLwotCi0jZGVmaW5lIE1BUEEJCQkweDBjCQkvKiBDYWNoZSBtYXAgQQkJCQkJCSovCi0KLSNkZWZpbmUgTUFQQgkJCTB4MGQJCS8qIENhY2hlIG1hcCBCCQkJCQkJKi8KLQotI2RlZmluZSBNQVBfUFRFX01BU0sJCTB4ZmZmZmUwMDAJLyogVGhlIDE5IE1TQnMgb2YgdGhlIFBURSBpbmRleGVkIGJ5IHRoZSBQVEkJCSovCi0jZGVmaW5lIE1BUF9QVElfTUFTSwkJMHgwMDAwMWZmZgkvKiBUaGUgMTMgYml0IGluZGV4IHRvIG9uZSBvZiB0aGUgODE5MiBQVEUgZHdvcmRzICAgICAgCSovCi0KLSNkZWZpbmUgRU5WVk9MCQkJMHgxMAkJLyogVm9sdW1lIGVudmVsb3BlIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEVOVlZPTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2Ygdm9sdW1lIGVudmVsb3BlIHN0YXRlIHZhcmlhYmxlCSovICAKLQkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJICAgICAgIAkJCSovCi0KLSNkZWZpbmUgQVRLSExEViAJCTB4MTEJCS8qIFZvbHVtZSBlbnZlbG9wZSBob2xkIGFuZCBhdHRhY2sgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIEFUS0hMRFZfUEhBU0UwCQkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UJCQkJKi8KLSNkZWZpbmUgQVRLSExEVl9IT0xEVElNRV9NQVNLCTB4MDAwMDdmMDAJLyogRW52ZWxvcGUgaG9sZCB0aW1lICgxMjctbiA9PSBuKjg4LjJtc2VjKQkJKi8KLSNkZWZpbmUgQVRLSExEVl9BVFRBQ0tUSU1FX01BU0sJMHgwMDAwMDA3ZgkvKiBFbnZlbG9wZSBhdHRhY2sgdGltZSwgbG9nIGVuY29kZWQJCQkqLwotCQkJCQkJLyogMCA9IGluZmluaXRlLCAxID0gMTAuOW1zZWMsIC4uLiAweDdmID0gNS41bXNlYwkqLwotCi0jZGVmaW5lIERDWVNVU1YgCQkweDEyCQkvKiBWb2x1bWUgZW52ZWxvcGUgc3VzdGFpbiBhbmQgZGVjYXkgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIERDWVNVU1ZfUEhBU0UxX01BU0sJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlLCAxID0gYmVnaW4gcmVsZWFzZSBwaGFzZQkqLwotI2RlZmluZSBEQ1lTVVNWX1NVU1RBSU5MRVZFTF9NQVNLIDB4MDAwMDdmMDAJLyogMTI3ID0gZnVsbCwgMCA9IG9mZiwgMC43NWRCIGluY3JlbWVudHMJCSovCi0jZGVmaW5lIERDWVNVU1ZfQ0hBTk5FTEVOQUJMRV9NQVNLIDB4MDAwMDAwODAJLyogMSA9IEluaGliaXQgZW52ZWxvcGUgZW5naW5lIGZyb20gd3JpdGluZyB2YWx1ZXMgaW4JKi8KLQkJCQkJCS8qIHRoaXMgY2hhbm5lbCBhbmQgZnJvbSB3cml0aW5nIHRvIHBpdGNoLCBmaWx0ZXIgYW5kCSovCi0JCQkJCQkvKiB2b2x1bWUgdGFyZ2V0cy4JCQkJCSovCi0jZGVmaW5lIERDWVNVU1ZfREVDQVlUSU1FX01BU0sJMHgwMDAwMDA3ZgkvKiBWb2x1bWUgZW52ZWxvcGUgZGVjYXkgdGltZSwgbG9nIGVuY29kZWQgICAgIAkJKi8KLQkJCQkJCS8qIDAgPSA0My43bXNlYywgMSA9IDIxLjhtc2VjLCAweDdmID0gMjJtc2VjCQkqLwotCi0jZGVmaW5lIExGT1ZBTDEgCQkweDEzCQkvKiBNb2R1bGF0aW9uIExGTyB2YWx1ZQkJCQkJKi8KLSNkZWZpbmUgTEZPVkFMX01BU0sJCTB4MDAwMGZmZmYJLyogQ3VycmVudCB2YWx1ZSBvZiBtb2R1bGF0aW9uIExGTyBzdGF0ZSB2YXJpYWJsZQkqLwotCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkJCQkqLwotCi0jZGVmaW5lIEVOVlZBTAkJCTB4MTQJCS8qIE1vZHVsYXRpb24gZW52ZWxvcGUgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRU5WVkFMX01BU0sJCTB4MDAwMGZmZmYJLyogQ3VycmVudCB2YWx1ZSBvZiBtb2R1bGF0aW9uIGVudmVsb3BlIHN0YXRlIHZhcmlhYmxlIAkqLwotCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkJCQkqLwotCi0jZGVmaW5lIEFUS0hMRE0JCQkweDE1CQkvKiBNb2R1bGF0aW9uIGVudmVsb3BlIGhvbGQgYW5kIGF0dGFjayByZWdpc3RlcgkJKi8KLSNkZWZpbmUgQVRLSExETV9QSEFTRTAJCTB4MDAwMDgwMDAJLyogMCA9IEJlZ2luIGF0dGFjayBwaGFzZQkJCQkqLwotI2RlZmluZSBBVEtITERNX0hPTERUSU1FCTB4MDAwMDdmMDAJLyogRW52ZWxvcGUgaG9sZCB0aW1lICgxMjctbiA9PSBuKjQybXNlYykJCSovCi0jZGVmaW5lIEFUS0hMRE1fQVRUQUNLVElNRQkweDAwMDAwMDdmCS8qIEVudmVsb3BlIGF0dGFjayB0aW1lLCBsb2cgZW5jb2RlZAkJCSovCi0JCQkJCQkvKiAwID0gaW5maW5pdGUsIDEgPSAxMW1zZWMsIC4uLiAweDdmID0gNS41bXNlYwkJKi8KLQotI2RlZmluZSBEQ1lTVVNNCQkJMHgxNgkJLyogTW9kdWxhdGlvbiBlbnZlbG9wZSBkZWNheSBhbmQgc3VzdGFpbiByZWdpc3RlcgkqLwotI2RlZmluZSBEQ1lTVVNNX1BIQVNFMV9NQVNLCTB4MDAwMDgwMDAJLyogMCA9IEJlZ2luIGF0dGFjayBwaGFzZSwgMSA9IGJlZ2luIHJlbGVhc2UgcGhhc2UJKi8KLSNkZWZpbmUgRENZU1VTTV9TVVNUQUlOTEVWRUxfTUFTSyAweDAwMDA3ZjAwCS8qIDEyNyA9IGZ1bGwsIDAgPSBvZmYsIDAuNzVkQiBpbmNyZW1lbnRzCQkqLwotI2RlZmluZSBEQ1lTVVNNX0RFQ0FZVElNRV9NQVNLCTB4MDAwMDAwN2YJLyogRW52ZWxvcGUgZGVjYXkgdGltZSwgbG9nIGVuY29kZWQJCQkqLwotCQkJCQkJLyogMCA9IDQzLjdtc2VjLCAxID0gMjEuOG1zZWMsIDB4N2YgPSAyMm1zZWMJCSovCi0KLSNkZWZpbmUgTEZPVkFMMiAJCTB4MTcJCS8qIFZpYnJhdG8gTEZPIHJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBMRk9WQUwyX01BU0sJCTB4MDAwMGZmZmYJLyogQ3VycmVudCB2YWx1ZSBvZiB2aWJyYXRvIExGTyBzdGF0ZSB2YXJpYWJsZSAJCSovCi0JCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CQkJCSovCi0KLSNkZWZpbmUgSVAJCQkweDE4CQkvKiBJbml0aWFsIHBpdGNoIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIElQX01BU0sJCQkweDAwMDBmZmZmCS8qIEV4cG9uZW50aWFsIGluaXRpYWwgcGl0Y2ggc2hpZnQJCQkqLwotCQkJCQkJLyogNCBiaXRzIG9mIG9jdGF2ZSwgMTIgYml0cyBvZiBmcmFjdGlvbmFsIG9jdGF2ZQkqLwotI2RlZmluZSBJUF9VTklUWQkJMHgwMDAwZTAwMAkvKiBVbml0eSBwaXRjaCBzaGlmdAkJCQkJKi8KLQotI2RlZmluZSBJRkFUTgkJCTB4MTkJCS8qIEluaXRpYWwgZmlsdGVyIGN1dG9mZiBhbmQgYXR0ZW51YXRpb24gcmVnaXN0ZXIJKi8KLSNkZWZpbmUgSUZBVE5fRklMVEVSQ1VUT0ZGX01BU0sJMHgwMDAwZmYwMAkvKiBJbml0aWFsIGZpbHRlciBjdXRvZmYgZnJlcXVlbmN5IGluIGV4cG9uZW50aWFsIHVuaXRzCSovCi0JCQkJCQkvKiA2IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgc2VtaXRvbmVzCQkqLwotCQkJCQkJLyogMiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBmcmFjdGlvbnMJCSovCi0jZGVmaW5lIElGQVROX0ZJTFRFUkNVVE9GRgkweDA4MDgwMDE5Ci0jZGVmaW5lIElGQVROX0FUVEVOVUFUSU9OX01BU0sJMHgwMDAwMDBmZgkvKiBJbml0aWFsIGF0dGVudWF0aW9uIGluIDAuMzc1ZEIgc3RlcHMJCQkqLwotI2RlZmluZSBJRkFUTl9BVFRFTlVBVElPTgkweDA4MDAwMDE5Ci0KLQotI2RlZmluZSBQRUZFCQkJMHgxYQkJLyogUGl0Y2ggZW52ZWxvcGUgYW5kIGZpbHRlciBlbnZlbG9wZSBhbW91bnQgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgUEVGRV9QSVRDSEFNT1VOVF9NQVNLCTB4MDAwMGZmMDAJLyogUGl0Y2ggZW52bG9wZSBhbW91bnQJCQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBvbmUgb2N0YXZlIHBlYWsgZXh0cmVtZXMJKi8KLSNkZWZpbmUgUEVGRV9QSVRDSEFNT1VOVAkweDA4MDgwMDFhCi0jZGVmaW5lIFBFRkVfRklMVEVSQU1PVU5UX01BU0sJMHgwMDAwMDBmZgkvKiBGaWx0ZXIgZW52bG9wZSBhbW91bnQJCQkJKi8KLQkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIHNpeCBvY3RhdmVzIHBlYWsgZXh0cmVtZXMgKi8KLSNkZWZpbmUgUEVGRV9GSUxURVJBTU9VTlQJMHgwODAwMDAxYQotI2RlZmluZSBGTU1PRAkJCTB4MWIJCS8qIFZpYnJhdG8vZmlsdGVyIG1vZHVsYXRpb24gZnJvbSBMRk8gcmVnaXN0ZXIJCSovCi0jZGVmaW5lIEZNTU9EX01PRFZJQlJBVE8JMHgwMDAwZmYwMAkvKiBWaWJyYXRvIExGTyBtb2R1bGF0aW9uIGRlcHRoCQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBvbmUgb2N0YXZlIGV4dHJlbWVzCSovCi0jZGVmaW5lIEZNTU9EX01PRklMVEVSCQkweDAwMDAwMGZmCS8qIEZpbHRlciBMRk8gbW9kdWxhdGlvbiBkZXB0aAkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gdGhyZWUgb2N0YXZlIGV4dHJlbWVzCSovCi0KLQotI2RlZmluZSBUUkVNRlJRIAkJMHgxYwkJLyogVHJlbW9sbyBhbW91bnQgYW5kIG1vZHVsYXRpb24gTEZPIGZyZXF1ZW5jeSByZWdpc3RlcgkqLwotI2RlZmluZSBUUkVNRlJRX0RFUFRICQkweDAwMDBmZjAwCS8qIFRyZW1vbG8gZGVwdGgJCQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsIHdpdGggKy8tIDEyZEIgZXh0cmVtZXMJKi8KLSNkZWZpbmUgVFJFTUZSUV9GUkVRVUVOQ1kJMHgwMDAwMDBmZgkvKiBUcmVtb2xvIExGTyBmcmVxdWVuY3kJCQkJKi8KLQkJCQkJCS8qID8/SHogc3RlcHMsIG1heGltdW0gb2YgPz8gSHouCQkJKi8KLQotI2RlZmluZSBGTTJGUlEyIAkJMHgxZAkJLyogVmlicmF0byBhbW91bnQgYW5kIHZpYnJhdG8gTEZPIGZyZXF1ZW5jeSByZWdpc3RlcgkqLwotI2RlZmluZSBGTTJGUlEyX0RFUFRICQkweDAwMDBmZjAwCS8qIFZpYnJhdG8gTEZPIHZpYnJhdG8gZGVwdGgJCQkJKi8KLQkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIG9uZSBvY3RhdmUgZXh0cmVtZXMJKi8KLSNkZWZpbmUgRk0yRlJRMl9GUkVRVUVOQ1kJMHgwMDAwMDBmZgkvKiBWaWJyYXRvIExGTyBmcmVxdWVuY3kJCQkJKi8KLQkJCQkJCS8qIDAuMDM5SHogc3RlcHMsIG1heGltdW0gb2YgOS44NSBIei4JCQkqLwotCi0jZGVmaW5lIFRFTVBFTlYgCQkweDFlCQkvKiBUZW1wb3J5IGVudmVsb3BlIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFRFTVBFTlZfTUFTSwkJMHgwMDAwZmZmZgkvKiAxNi1iaXQgdmFsdWUJCQkJCQkqLwotCQkJCQkJLyogTk9URTogQWxsIGNoYW5uZWxzIGNvbnRhaW4gaW50ZXJuYWwgdmFyaWFibGVzOyBkbwkqLwotCQkJCQkJLyogbm90IHdyaXRlIHRvIHRoZXNlIGxvY2F0aW9ucy4JCQkqLwotCi0jZGVmaW5lIENEMAkJCTB4MjAJCS8qIENhY2hlIGRhdGEgMCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDEJCQkweDIxCQkvKiBDYWNoZSBkYXRhIDEgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0QyCQkJMHgyMgkJLyogQ2FjaGUgZGF0YSAyIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEMwkJCTB4MjMJCS8qIENhY2hlIGRhdGEgMyByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDQJCQkweDI0CQkvKiBDYWNoZSBkYXRhIDQgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q1CQkJMHgyNQkJLyogQ2FjaGUgZGF0YSA1IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENENgkJCTB4MjYJCS8qIENhY2hlIGRhdGEgNiByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDcJCQkweDI3CQkvKiBDYWNoZSBkYXRhIDcgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q4CQkJMHgyOAkJLyogQ2FjaGUgZGF0YSA4IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEOQkJCTB4MjkJCS8qIENhY2hlIGRhdGEgOSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREEJCQkweDJhCQkvKiBDYWNoZSBkYXRhIEEgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RCCQkJMHgyYgkJLyogQ2FjaGUgZGF0YSBCIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEQwkJCTB4MmMJCS8qIENhY2hlIGRhdGEgQyByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREQJCQkweDJkCQkvKiBDYWNoZSBkYXRhIEQgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RFCQkJMHgyZQkJLyogQ2FjaGUgZGF0YSBFIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENERgkJCTB4MmYJCS8qIENhY2hlIGRhdGEgRiByZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIFBUQgkJCTB4NDAJCS8qIFBhZ2UgdGFibGUgYmFzZSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQVEJfTUFTSwkJMHhmZmZmZjAwMAkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlIHRhYmxlIGluIGhvc3QgbWVtb3J5CSovCi0KLSNkZWZpbmUgVENCCQkJMHg0MQkJLyogVGFuayBjYWNoZSBiYXNlIHJlZ2lzdGVyICAgIAkJCQkqLwotI2RlZmluZSBUQ0JfTUFTSwkJMHhmZmZmZjAwMAkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBib3R0b20gb2YgaG9zdCBiYXNlZCBUUkFNCSovCi0KLSNkZWZpbmUgQURDQ1IJCQkweDQyCQkvKiBBREMgc2FtcGxlIHJhdGUvc3RlcmVvIGNvbnRyb2wgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIEFEQ0NSX1JDSEFORU5BQkxFCTB4MDAwMDAwMTAJLyogRW5hYmxlcyByaWdodCBjaGFubmVsIGZvciB3cml0aW5nIHRvIHRoZSBob3N0ICAgICAgIAkqLwotI2RlZmluZSBBRENDUl9MQ0hBTkVOQUJMRQkweDAwMDAwMDA4CS8qIEVuYWJsZXMgbGVmdCBjaGFubmVsIGZvciB3cml0aW5nIHRvIHRoZSBob3N0CQkqLwotCQkJCQkJLyogTk9URTogVG8gZ3VhcmFudGVlIHBoYXNlIGNvaGVyZW5jeSwgYm90aCBjaGFubmVscwkqLwotCQkJCQkJLyogbXVzdCBiZSBkaXNhYmxlZCBwcmlvciB0byBlbmFibGluZyBib3RoIGNoYW5uZWxzLgkqLwotI2RlZmluZSBBX0FEQ0NSX1JDSEFORU5BQkxFCTB4MDAwMDAwMjAKLSNkZWZpbmUgQV9BRENDUl9MQ0hBTkVOQUJMRQkweDAwMDAwMDEwCi0KLSNkZWZpbmUgQV9BRENDUl9TQU1QTEVSQVRFX01BU0sgMHgwMDAwMDAwRiAgICAgIC8qIEF1ZGlneSBzYW1wbGUgcmF0ZSBjb252ZXJ0b3Igb3V0cHV0IHJhdGUJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfTUFTSwkweDAwMDAwMDA3CS8qIFNhbXBsZSByYXRlIGNvbnZlcnRvciBvdXRwdXQgcmF0ZQkJCSovCi0KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV80OAkweDAwMDAwMDAwCS8qIDQ4a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzQ0CTB4MDAwMDAwMDEJLyogNDQuMWtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8zMgkweDAwMDAwMDAyCS8qIDMya0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzI0CTB4MDAwMDAwMDMJLyogMjRrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMjIJMHgwMDAwMDAwNAkvKiAyMi4wNWtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8xNgkweDAwMDAwMDA1CS8qIDE2a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzExCTB4MDAwMDAwMDYJLyogMTEuMDI1a0h6IHNhbXBsZSByYXRlCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfOAkweDAwMDAwMDA3CS8qIDhrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0KLSNkZWZpbmUgQV9BRENDUl9TQU1QTEVSQVRFXzEyCTB4MDAwMDAwMDYJLyogMTJrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV8xMQkweDAwMDAwMDA3CS8qIDExLjAyNWtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfOAkweDAwMDAwMDA4CS8qIDhrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0KLSNkZWZpbmUgRlhXQwkJCTB4NDMJCS8qIEZYIG91dHB1dCB3cml0ZSBjaGFubmVscyByZWdpc3RlcgkJCSovCi0JCQkJCQkvKiBXaGVuIHNldCwgZWFjaCBiaXQgZW5hYmxlcyB0aGUgd3JpdGluZyBvZiB0aGUJKi8KLQkJCQkJCS8qIGNvcnJlc3BvbmRpbmcgRlggb3V0cHV0IGNoYW5uZWwgKGludGVybmFsIHJlZ2lzdGVycyAgKi8KLQkJCQkJCS8qIDB4MjAtMHgzZikgaW50byBob3N0IG1lbW9yeS4gVGhpcyBtb2RlIG9mIHJlY29yZGluZwkqLwotCQkJCQkJLyogaXMgMTZiaXQsIDQ4S0h6IG9ubHkuIEFsbCAzMgljaGFubmVscyBjYW4gYmUgZW5hYmxlZCAqLwotCQkJCQkJLyogc2ltdWx0YW5lb3VzbHkuCQkJCQkqLwotI2RlZmluZSBUQ0JTCQkJMHg0NAkJLyogVGFuayBjYWNoZSBidWZmZXIgc2l6ZSByZWdpc3RlcgkJCSovCi0jZGVmaW5lIFRDQlNfTUFTSwkJMHgwMDAwMDAwNwkvKiBUYW5rIGNhY2hlIGJ1ZmZlciBzaXplIGZpZWxkCQkJCSovCi0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfMTZLCTB4MDAwMDAwMDAKLSNkZWZpbmUgVENCU19CVUZGU0laRV8zMksJMHgwMDAwMDAwMQotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzY0SwkweDAwMDAwMDAyCi0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfMTI4SwkweDAwMDAwMDAzCi0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfMjU2SwkweDAwMDAwMDA0Ci0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfNTEySwkweDAwMDAwMDA1Ci0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfMTAyNEsJMHgwMDAwMDAwNgotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzIwNDhLCTB4MDAwMDAwMDcKLQotI2RlZmluZSBNSUNCQQkJCTB4NDUJCS8qIEFDOTcgbWljcm9waG9uZSBidWZmZXIgYWRkcmVzcyByZWdpc3RlcgkJKi8KLSNkZWZpbmUgTUlDQkFfTUFTSwkJMHhmZmZmZjAwMAkvKiAyMCBiaXQgYmFzZSBhZGRyZXNzCQkJCQkqLwotCi0jZGVmaW5lIEFEQ0JBCQkJMHg0NgkJLyogQURDIGJ1ZmZlciBhZGRyZXNzIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEFEQ0JBX01BU0sJCTB4ZmZmZmYwMDAJLyogMjAgYml0IGJhc2UgYWRkcmVzcwkJCQkJKi8KLQotI2RlZmluZSBGWEJBCQkJMHg0NwkJLyogRlggQnVmZmVyIEFkZHJlc3MgKi8KLSNkZWZpbmUgRlhCQV9NQVNLCQkweGZmZmZmMDAwCS8qIDIwIGJpdCBiYXNlIGFkZHJlc3MJCQkJCSovCi0KLSNkZWZpbmUgTUlDQlMJCQkweDQ5CQkvKiBNaWNyb3Bob25lIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJKi8KLQotI2RlZmluZSBBRENCUwkJCTB4NGEJCS8qIEFEQyBidWZmZXIgc2l6ZSByZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIEZYQlMJCQkweDRiCQkvKiBGWCBidWZmZXIgc2l6ZSByZWdpc3RlcgkJCQkqLwotCi0vKiBUaGUgZm9sbG93aW5nIG1hc2sgdmFsdWVzIGRlZmluZSB0aGUgc2l6ZSBvZiB0aGUgQURDLCBNSVggYW5kIEZYIGJ1ZmZlcnMgaW4gYnl0ZXMgKi8KLSNkZWZpbmUgQURDQlNfQlVGU0laRV9OT05FCTB4MDAwMDAwMDAKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8zODQJMHgwMDAwMDAwMQotI2RlZmluZSBBRENCU19CVUZTSVpFXzQ0OAkweDAwMDAwMDAyCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNTEyCTB4MDAwMDAwMDMKLSNkZWZpbmUgQURDQlNfQlVGU0laRV82NDAJMHgwMDAwMDAwNAotI2RlZmluZSBBRENCU19CVUZTSVpFXzc2OAkweDAwMDAwMDA1Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfODk2CTB4MDAwMDAwMDYKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xMDI0CTB4MDAwMDAwMDcKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xMjgwCTB4MDAwMDAwMDgKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xNTM2CTB4MDAwMDAwMDkKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xNzkyCTB4MDAwMDAwMGEKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8yMDQ4CTB4MDAwMDAwMGIKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8yNTYwCTB4MDAwMDAwMGMKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8zMDcyCTB4MDAwMDAwMGQKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8zNTg0CTB4MDAwMDAwMGUKLSNkZWZpbmUgQURDQlNfQlVGU0laRV80MDk2CTB4MDAwMDAwMGYKLSNkZWZpbmUgQURDQlNfQlVGU0laRV81MTIwCTB4MDAwMDAwMTAKLSNkZWZpbmUgQURDQlNfQlVGU0laRV82MTQ0CTB4MDAwMDAwMTEKLSNkZWZpbmUgQURDQlNfQlVGU0laRV83MTY4CTB4MDAwMDAwMTIKLSNkZWZpbmUgQURDQlNfQlVGU0laRV84MTkyCTB4MDAwMDAwMTMKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xMDI0MAkweDAwMDAwMDE0Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTIyODgJMHgwMDAwMDAxNQotI2RlZmluZSBBRENCU19CVUZTSVpFXzE0MzY2CTB4MDAwMDAwMTYKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xNjM4NAkweDAwMDAwMDE3Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjA0ODAJMHgwMDAwMDAxOAotI2RlZmluZSBBRENCU19CVUZTSVpFXzI0NTc2CTB4MDAwMDAwMTkKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8yODY3MgkweDAwMDAwMDFhCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzI3NjgJMHgwMDAwMDAxYgotI2RlZmluZSBBRENCU19CVUZTSVpFXzQwOTYwCTB4MDAwMDAwMWMKLSNkZWZpbmUgQURDQlNfQlVGU0laRV80OTE1MgkweDAwMDAwMDFkCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNTczNDQJMHgwMDAwMDAxZQotI2RlZmluZSBBRENCU19CVUZTSVpFXzY1NTM2CTB4MDAwMDAwMWYKLQotCi0jZGVmaW5lIENEQ1MJCQkweDUwCQkvKiBDRC1ST00gZGlnaXRhbCBjaGFubmVsIHN0YXR1cyByZWdpc3RlcgkqLwotCi0jZGVmaW5lIEdQU0NTCQkJMHg1MQkJLyogR2VuZXJhbCBQdXJwb3NlIFNQRElGIGNoYW5uZWwgc3RhdHVzIHJlZ2lzdGVyKi8KLQotI2RlZmluZSBEQkcJCQkweDUyCQkvKiBETyBOT1QgUFJPR1JBTSBUSElTIFJFR0lTVEVSISEhIE1BWSBERVNUUk9ZIENISVAgKi8KLQotLyogZGVmaW5pdGlvbnMgZm9yIGRlYnVnIHJlZ2lzdGVyIC0gdGFrZW4gZnJvbSB0aGUgYWxzYSBkcml2ZXJzICovCi0jZGVmaW5lIERCR19aQyAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAgICAgICAvKiB6ZXJvIHRyYW0gY291bnRlciAqLwotI2RlZmluZSBEQkdfU0FUVVJBVElPTl9PQ0NVUkVEICAweDAyMDAwMDAwICAgICAgLyogc2F0dXJhdGlvbiBjb250cm9sICovCi0jZGVmaW5lIERCR19TQVRVUkFUSU9OX0FERFIgICAgIDB4MDFmZjAwMDAgICAgICAvKiBzYXR1cmF0aW9uIGFkZHJlc3MgKi8KLSNkZWZpbmUgREJHX1NJTkdMRV9TVEVQICAgICAgICAgMHgwMDAwODAwMCAgICAgIC8qIHNpbmdsZSBzdGVwIG1vZGUgKi8KLSNkZWZpbmUgREJHX1NURVAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAgICAgIC8qIHN0YXJ0IHNpbmdsZSBzdGVwICovCi0jZGVmaW5lIERCR19DT05ESVRJT05fQ09ERSAgICAgIDB4MDAwMDNlMDAgICAgICAvKiBjb25kaXRpb24gY29kZSAqLwotI2RlZmluZSBEQkdfU0lOR0xFX1NURVBfQUREUiAgICAweDAwMDAwMWZmICAgICAgLyogc2luZ2xlIHN0ZXAgYWRkcmVzcyAqLwotCi0KLSNkZWZpbmUgUkVHNTMJCQkweDUzCQkvKiBETyBOT1QgUFJPR1JBTSBUSElTIFJFR0lTVEVSISEhIE1BWSBERVNUUk9ZIENISVAgKi8KLQotI2RlZmluZSBBX0RCRwkJCSAweDUzCi0jZGVmaW5lIEFfREJHX1NJTkdMRV9TVEVQCSAweDAwMDIwMDAwCS8qIFNldCB0byB6ZXJvIHRvIHN0YXJ0IGRzcCAqLwotI2RlZmluZSBBX0RCR19aQwkJIDB4NDAwMDAwMDAJLyogemVybyB0cmFtIGNvdW50ZXIgKi8KLSNkZWZpbmUgQV9EQkdfU1RFUF9BRERSCQkgMHgwMDAwMDNmZgotI2RlZmluZSBBX0RCR19TQVRVUkFUSU9OX09DQ1VSRUQgMHgyMDAwMDAwMAotI2RlZmluZSBBX0RCR19TQVRVUkFUSU9OX0FERFIJIDB4MGZmYzAwMDAKLQotI2RlZmluZSBTUENTMAkJCTB4NTQJCS8qIFNQRElGIG91dHB1dCBDaGFubmVsIFN0YXR1cyAwIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgU1BDUzEJCQkweDU1CQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMSByZWdpc3RlcgkqLwotCi0jZGVmaW5lIFNQQ1MyCQkJMHg1NgkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDIgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBTUENTX0NMS0FDQ1lNQVNLCTB4MzAwMDAwMDAJLyogQ2xvY2sgYWNjdXJhY3kJCQkJKi8KLSNkZWZpbmUgU1BDU19DTEtBQ0NZXzEwMDBQUE0JMHgwMDAwMDAwMAkvKiAxMDAwIHBhcnRzIHBlciBtaWxsaW9uCQkJKi8KLSNkZWZpbmUgU1BDU19DTEtBQ0NZXzUwUFBNCTB4MTAwMDAwMDAJLyogNTAgcGFydHMgcGVyIG1pbGxpb24JCQkJKi8KLSNkZWZpbmUgU1BDU19DTEtBQ0NZX1ZBUklBQkxFCTB4MjAwMDAwMDAJLyogVmFyaWFibGUgYWNjdXJhY3kJCQkJKi8KLSNkZWZpbmUgU1BDU19TQU1QTEVSQVRFTUFTSwkweDBmMDAwMDAwCS8qIFNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfNDQJMHgwMDAwMDAwMAkvKiA0NC4xa0h6IHNhbXBsZSByYXRlCQkJCSovCi0jZGVmaW5lIFNQQ1NfU0FNUExFUkFURV80OAkweDAyMDAwMDAwCS8qIDQ4a0h6IHNhbXBsZSByYXRlCQkJCSovCi0jZGVmaW5lIFNQQ1NfU0FNUExFUkFURV8zMgkweDAzMDAwMDAwCS8qIDMya0h6IHNhbXBsZSByYXRlCQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTU1BU0sJMHgwMGYwMDAwMAkvKiBDaGFubmVsIG51bWJlcgkJCQkqLwotI2RlZmluZSBTUENTX0NIQU5ORUxOVU1fVU5TUEVDCTB4MDAwMDAwMDAJLyogVW5zcGVjaWZpZWQgY2hhbm5lbCBudW1iZXIJCQkqLwotI2RlZmluZSBTUENTX0NIQU5ORUxOVU1fTEVGVAkweDAwMTAwMDAwCS8qIExlZnQgY2hhbm5lbAkJCQkJKi8KLSNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX1JJR0hUCTB4MDAyMDAwMDAJLyogUmlnaHQgY2hhbm5lbAkJCQkqLwotI2RlZmluZSBTUENTX1NPVVJDRU5VTU1BU0sJMHgwMDBmMDAwMAkvKiBTb3VyY2UgbnVtYmVyCQkJCSovCi0jZGVmaW5lIFNQQ1NfU09VUkNFTlVNX1VOU1BFQwkweDAwMDAwMDAwCS8qIFVuc3BlY2lmaWVkIHNvdXJjZSBudW1iZXIJCQkqLwotI2RlZmluZSBTUENTX0dFTkVSQVRJT05TVEFUVVMJMHgwMDAwODAwMAkvKiBPcmlnaW5hbGl0eSBmbGFnIChzZWUgSUVDLTk1OCBzcGVjKQkJKi8KLSNkZWZpbmUgU1BDU19DQVRFR09SWUNPREVNQVNLCTB4MDAwMDdmMDAJLyogQ2F0ZWdvcnkgY29kZSAoc2VlIElFQy05NTggc3BlYykJCSovCi0jZGVmaW5lIFNQQ1NfTU9ERU1BU0sJCTB4MDAwMDAwYzAJLyogTW9kZSAoc2VlIElFQy05NTggc3BlYykJCQkqLwotI2RlZmluZSBTUENTX0VNUEhBU0lTTUFTSwkweDAwMDAwMDM4CS8qIEVtcGhhc2lzCQkJCQkqLwotI2RlZmluZSBTUENTX0VNUEhBU0lTX05PTkUJMHgwMDAwMDAwMAkvKiBObyBlbXBoYXNpcwkJCQkJKi8KLSNkZWZpbmUgU1BDU19FTVBIQVNJU181MF8xNQkweDAwMDAwMDA4CS8qIDUwLzE1IHVzZWMgMiBjaGFubmVsCQkJCSovCi0jZGVmaW5lIFNQQ1NfQ09QWVJJR0hUCQkweDAwMDAwMDA0CS8qIENvcHlyaWdodCBhc3NlcnRlZCBmbGFnIC0tIGRvIG5vdCBtb2RpZnkJKi8KLSNkZWZpbmUgU1BDU19OT1RBVURJT0RBVEEJMHgwMDAwMDAwMgkvKiAwID0gRGlnaXRhbCBhdWRpbywgMSA9IG5vdCBhdWRpbwkJKi8KLSNkZWZpbmUgU1BDU19QUk9GRVNTSU9OQUwJMHgwMDAwMDAwMQkvKiAwID0gQ29uc3VtZXIgKElFQy05NTgpLCAxID0gcHJvIChBRVMzLTE5OTIpCSovCi0KLS8qIFRoZSAzMi1iaXQgQ0xJeCBhbmQgU09MeCByZWdpc3RlcnMgYWxsIGhhdmUgb25lIGJpdCBwZXIgY2hhbm5lbCBjb250cm9sL3N0YXR1cyAgICAgIAkJKi8KLSNkZWZpbmUgQ0xJRUwJCQkweDU4CQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IGVuYWJsZSBsb3cgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBDTElFSAkJCTB4NTkJCS8qIENoYW5uZWwgbG9vcCBpbnRlcnJ1cHQgZW5hYmxlIGhpZ2ggcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBDTElQTAkJCTB4NWEJCS8qIENoYW5uZWwgbG9vcCBpbnRlcnJ1cHQgcGVuZGluZyBsb3cgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBDTElQSAkJCTB4NWIJCS8qIENoYW5uZWwgbG9vcCBpbnRlcnJ1cHQgcGVuZGluZyBoaWdoIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgU09MRUwJCQkweDVjCQkvKiBTdG9wIG9uIGxvb3AgZW5hYmxlIGxvdyByZWdpc3RlcgkJKi8KLQotI2RlZmluZSBTT0xFSAkJCTB4NWQJCS8qIFN0b3Agb24gbG9vcCBlbmFibGUgaGlnaCByZWdpc3RlcgkJKi8KLQotI2RlZmluZSBTUEJZUEFTUwkJMHg1ZQkJLyogU1BESUYgQllQQVNTIG1vZGUgcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUEJZUEFTU19FTkFCTEUJCTB4MDAwMDAwMDEJLyogRW5hYmxlIFNQRElGIGJ5cGFzcyBtb2RlCQkJKi8KLQotI2RlZmluZSBBQzk3U0xPVAkJMHg1ZgkJLyogYWRkaXRpb25hbCBBQzk3IHNsb3RzIGVuYWJsZSBiaXRzICovCi0jZGVmaW5lIEFDOTdTTE9UX0NOVFIJCTB4MTAJCS8qIENlbnRlciBlbmFibGUgKi8KLSNkZWZpbmUgQUM5N1NMT1RfTEZFCQkweDIwCQkvKiBMRkUgZW5hYmxlICovCi0KLSNkZWZpbmUgQ0RTUkNTCQkJMHg2MAkJLyogQ0QtUk9NIFNhbXBsZSBSYXRlIENvbnZlcnRlciBzdGF0dXMgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBHUFNSQ1MJCQkweDYxCQkvKiBHZW5lcmFsIFB1cnBvc2UgU1BESUYgc2FtcGxlIHJhdGUgY3Z0IHN0YXR1cyAqLwotCi0jZGVmaW5lIFpWU1JDUwkJCTB4NjIJCS8qIFpWaWRlbyBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgc3RhdHVzCQkqLwotCQkJCQkJLyogTk9URTogVGhpcyBvbmUgaGFzIG5vIFNQRElGTE9DS0VEIGZpZWxkCSovCi0JCQkJCQkvKiBBc3N1bWVzIHNhbXBsZSBsb2NrCQkJCSovCi0KLS8qIFRoZXNlIHRocmVlIGJpdGZpZWxkcyBhcHBseSB0byBDRFNSQ1MsIEdQU1JDUywgYW5kIChleGNlcHQgYXMgbm90ZWQpIFpWU1JDUy4JCQkqLwotI2RlZmluZSBTUkNTX1NQRElGTE9DS0VECTB4MDIwMDAwMDAJLyogU1BESUYgc3RyZWFtIGxvY2tlZAkJCQkqLwotI2RlZmluZSBTUkNTX1JBVEVMT0NLRUQJCTB4MDEwMDAwMDAJLyogU2FtcGxlIHJhdGUgbG9ja2VkCQkJCSovCi0jZGVmaW5lIFNSQ1NfRVNUU0FNUExFUkFURQkweDAwMDdmZmZmCS8qIERvIG5vdCBtb2RpZnkgdGhpcyBmaWVsZC4JCQkqLwotCi0KLS8qIE5vdGUgdGhhdCB0aGVzZSB2YWx1ZXMgY2FuIHZhcnkgKy8tIGJ5IGEgc21hbGwgYW1vdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNSQ1NfU1BESUZSQVRFXzQ0CTB4MDAwM2FjZDkKLSNkZWZpbmUgU1JDU19TUERJRlJBVEVfNDgJMHgwMDA0MDAwMAotI2RlZmluZSBTUkNTX1NQRElGUkFURV85NgkweDAwMDgwMDAwCi0KLSNkZWZpbmUgTUlDSURYICAgICAgICAgICAgICAgICAgMHg2MyAgICAgICAgICAgIC8qIE1pY3JvcGhvbmUgcmVjb3JkaW5nIGJ1ZmZlciBpbmRleCByZWdpc3RlciAgICovCi0jZGVmaW5lIE1JQ0lEWF9NQVNLICAgICAgICAgICAgIDB4MDAwMGZmZmYgICAgICAvKiAxNi1iaXQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNSUNJRFhfSURYCQkweDEwMDAwMDYzCi0KLSNkZWZpbmUgQV9BRENJRFgJCTB4NjMKLSNkZWZpbmUgQV9BRENJRFhfSURYCQkweDEwMDAwMDYzCi0KLSNkZWZpbmUgQURDSURYCQkJMHg2NAkJLyogQURDIHJlY29yZGluZyBidWZmZXIgaW5kZXggcmVnaXN0ZXIJCSovCi0jZGVmaW5lIEFEQ0lEWF9NQVNLCQkweDAwMDBmZmZmCS8qIDE2IGJpdCBpbmRleCBmaWVsZAkJCQkqLwotI2RlZmluZSBBRENJRFhfSURYCQkweDEwMDAwMDY0Ci0KLSNkZWZpbmUgRlhJRFgJCQkweDY1CQkvKiBGWCByZWNvcmRpbmcgYnVmZmVyIGluZGV4IHJlZ2lzdGVyCQkqLwotI2RlZmluZSBGWElEWF9NQVNLCQkweDAwMDBmZmZmCS8qIDE2LWJpdCB2YWx1ZQkJCQkJKi8KLSNkZWZpbmUgRlhJRFhfSURYCQkweDEwMDAwMDY1Ci0KLS8qIFRoaXMgaXMgdGhlIE1QVSBwb3J0IG9uIHRoZSBjYXJkICh2aWEgdGhlIGdhbWUgcG9ydCkJCQkJCQkqLwotI2RlZmluZSBBX01VREFUQTEJCTB4NzAKLSNkZWZpbmUgQV9NVUNNRDEJCTB4NzEKLSNkZWZpbmUgQV9NVVNUQVQxCQlBX01VQ01EMQotCi0vKiBUaGlzIGlzIHRoZSBNUFUgcG9ydCBvbiB0aGUgQXVkaWd5IERyaXZlIAkJCQkJCQkqLwotI2RlZmluZSBBX01VREFUQTIJCTB4NzIKLSNkZWZpbmUgQV9NVUNNRDIJCTB4NzMKLSNkZWZpbmUgQV9NVVNUQVQyCQlBX01VQ01EMgkKLQotLyogVGhlIG5leHQgdHdvIGFyZSB0aGUgQXVkaWd5IGVxdWl2YWxlbnQgb2YgRlhXQwkJCQkJCSovCi0vKiB0aGUgQXVkaWd5IGNhbiByZWNvcmQgYW55IG91dHB1dCAoMTZiaXQsIDQ4a0h6LCB1cCB0byA2NCBjaGFubmVsIHNpbXVsdGFuZW91c2x5KSAJCSovCi0vKiBFYWNoIGJpdCBzZWxlY3RzIGEgY2hhbm5lbCBmb3IgcmVjb3JkaW5nICovCi0jZGVmaW5lIEFfRlhXQzEJCQkweDc0ICAgICAgICAgICAgLyogU2VsZWN0cyAweDdmLTB4NjAgZm9yIEZYIHJlY29yZGluZyAgICAgICAgICAgKi8KLSNkZWZpbmUgQV9GWFdDMgkJCTB4NzUJCS8qIFNlbGVjdHMgMHg5Zi0weDgwIGZvciBGWCByZWNvcmRpbmcgICAgICAgICAgICovCi0KLSNkZWZpbmUgQV9TUERJRl9TQU1QTEVSQVRFCTB4NzYJCS8qIFNldCB0aGUgc2FtcGxlIHJhdGUgb2YgU1BESUYgb3V0cHV0CQkqLwotI2RlZmluZSBBX1NQRElGXzQ4MDAwCQkweDAwMDAwMDgwCi0jZGVmaW5lIEFfU1BESUZfNDQxMDAJCTB4MDAwMDAwMDAKLSNkZWZpbmUgQV9TUERJRl85NjAwMAkJMHgwMDAwMDA0MAotCi0jZGVmaW5lIEFfRlhSVDIJCQkweDdjCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMRQkJMHgwMDAwMDAzZgkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBFCSovCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMRgkJMHgwMDAwM2YwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBGCSovCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMRwkJMHgwMDNmMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBHCSovCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMSAkJMHgzZjAwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBICSovCi0KLSNkZWZpbmUgQV9TRU5EQU1PVU5UUwkJMHg3ZAotI2RlZmluZSBBX0ZYU0VOREFNT1VOVF9FX01BU0sJMHhmZjAwMDAwMAotI2RlZmluZSBBX0ZYU0VOREFNT1VOVF9GX01BU0sJMHgwMGZmMDAwMAotI2RlZmluZSBBX0ZYU0VOREFNT1VOVF9HX01BU0sJMHgwMDAwZmYwMAotI2RlZmluZSBBX0ZYU0VOREFNT1VOVF9IX01BU0sJMHgwMDAwMDBmZgotCi0vKiBUaGUgc2VuZCBhbW91bnRzIGZvciB0aGlzIG9uZSBhcmUgdGhlIHNhbWUgYXMgdXNlZCB3aXRoIHRoZSBlbXUxMGsxICovCi0jZGVmaW5lIEFfRlhSVDEJCQkweDdlCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMQQkJMHgwMDAwMDAzZgotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEIJCTB4MDAwMDNmMDAKLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxDCQkweDAwM2YwMDAwCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMRAkJMHgzZjAwMDAwMAotCi0KLS8qIEVhY2ggRlggZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGlzIDMyIGJpdHMgaW4gbGVuZ3RoLCBhbGwgYml0cyBhcmUgdXNlZAkJCSovCi0jZGVmaW5lIEZYR1BSRUdCQVNFCQkweDEwMAkJLyogRlggZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBiYXNlICAgICAgIAkqLwotI2RlZmluZSBBX0ZYR1BSRUdCQVNFCQkweDQwMAkJLyogQXVkaWd5IEdQUnMsIDB4NDAwIHRvIDB4NWZmCQkJKi8KLS8qIFRhbmsgYXVkaW8gZGF0YSBpcyBsb2dhcml0aG1pY2FsbHkgY29tcHJlc3NlZCBkb3duIHRvIDE2IGJpdHMgYmVmb3JlIHdyaXRpbmcgdG8gVFJBTSBhbmQgaXMJKi8KLS8qIGRlY29tcHJlc3NlZCBiYWNrIHRvIDIwIGJpdHMgb24gYSByZWFkLiAgVGhlcmUgYXJlIGEgdG90YWwgb2YgMTYwIGxvY2F0aW9ucywgdGhlIGxhc3QgMzIJKi8KLS8qIGxvY2F0aW9ucyBhcmUgZm9yIGV4dGVybmFsIFRSQU0uIAkJCQkJCQkJKi8KLSNkZWZpbmUgVEFOS01FTURBVEFSRUdCQVNFCTB4MjAwCQkvKiBUYW5rIG1lbW9yeSBkYXRhIHJlZ2lzdGVycyBiYXNlICAgICAJCSovCi0jZGVmaW5lIFRBTktNRU1EQVRBUkVHX01BU0sJMHgwMDBmZmZmZgkvKiAyMCBiaXQgdGFuayBhdWRpbyBkYXRhIGZpZWxkCQkJKi8KLQotLyogQ29tYmluZWQgYWRkcmVzcyBmaWVsZCBhbmQgbWVtb3J5IG9wY29kZSBvciBmbGFnIGZpZWxkLiAgMTYwIGxvY2F0aW9ucywgbGFzdCAzMiBhcmUgZXh0ZXJuYWwJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdCQVNFCTB4MzAwCQkvKiBUYW5rIG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVycyBiYXNlCQkqLwotI2RlZmluZSBUQU5LTUVNQUREUlJFR19BRERSX01BU0sgMHgwMDBmZmZmZgkvKiAyMCBiaXQgdGFuayBhZGRyZXNzIGZpZWxkCQkJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfQ0xFQVIJMHgwMDgwMDAwMAkvKiBDbGVhciB0YW5rIG1lbW9yeQkJCQkqLwotI2RlZmluZSBUQU5LTUVNQUREUlJFR19BTElHTgkweDAwNDAwMDAwCS8qIEFsaWduIHJlYWQgb3Igd3JpdGUgcmVsYXRpdmUgdG8gdGFuayBhY2Nlc3MJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfV1JJVEUJMHgwMDIwMDAwMAkvKiBXcml0ZSB0byB0YW5rIG1lbW9yeQkJCQkqLwotI2RlZmluZSBUQU5LTUVNQUREUlJFR19SRUFECTB4MDAxMDAwMDAJLyogUmVhZCBmcm9tIHRhbmsgbWVtb3J5CQkJKi8KLQotI2RlZmluZSBNSUNST0NPREVCQVNFCQkweDQwMAkJLyogTWljcm9jb2RlIGRhdGEgYmFzZSBhZGRyZXNzCQkJKi8KLQotLyogRWFjaCBEU1AgbWljcm9jb2RlIGluc3RydWN0aW9uIGlzIG1hcHBlZCBpbnRvIDIgZG91Ymxld29yZHMgCQkJCQkqLwotLyogTk9URTogV2hlbiB3cml0aW5nLCBhbHdheXMgd3JpdGUgdGhlIExPIGRvdWJsZXdvcmQgZmlyc3QuICBSZWFkcyBjYW4gYmUgaW4gZWl0aGVyIG9yZGVyLgkqLwotI2RlZmluZSBMT1dPUkRfT1BYX01BU0sJCTB4MDAwZmZjMDAJLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZCBYCQkJKi8KLSNkZWZpbmUgTE9XT1JEX09QWV9NQVNLCQkweDAwMDAwM2ZmCS8qIEluc3RydWN0aW9uIG9wZXJhbmQgWQkJCSovCi0jZGVmaW5lIEhJV09SRF9PUENPREVfTUFTSwkweDAwZjAwMDAwCS8qIEluc3RydWN0aW9uIG9wY29kZQkJCQkqLwotI2RlZmluZSBISVdPUkRfUkVTVUxUX01BU0sJMHgwMDBmZmMwMAkvKiBJbnN0cnVjdGlvbiByZXN1bHQJCQkJKi8KLSNkZWZpbmUgSElXT1JEX09QQV9NQVNLCQkweDAwMDAwM2ZmCS8qIEluc3RydWN0aW9uIG9wZXJhbmQgQQkJCSovCi0KLQotLyogQXVkaWd5IFNvdW5kY2FyZCBoYXZlIGEgZGlmZmVyZW50IGluc3RydWN0aW9uIGZvcm1hdCAqLwotI2RlZmluZSBBVURJR1lfQ09ERUJBU0UJCTB4NjAwCi0jZGVmaW5lIEFfTE9XT1JEX09QWV9NQVNLCTB4MDAwMDA3ZmYJCQotI2RlZmluZSBBX0xPV09SRF9PUFhfTUFTSwkweDAwN2ZmMDAwCi0jZGVmaW5lIEFfSElXT1JEX09QQ09ERV9NQVNLCTB4MGYwMDAwMDAKLSNkZWZpbmUgQV9ISVdPUkRfUkVTVUxUX01BU0sJMHgwMDdmZjAwMAotI2RlZmluZSBBX0hJV09SRF9PUEFfTUFTSwkweDAwMDAwN2ZmCi0KLQotI2VuZGlmIC8qIF84MDEwX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL01ha2VmaWxlIGIvc291bmQvb3NzL2VtdTEwazEvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWY5Y2MuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBDcmVhdGl2ZSBMYWJzIEVNVTEwSzEgCi0jCi0jIDEyIEFwciAyMDAwIFJ1aSBTb3VzYQotCi1vYmotJChDT05GSUdfU09VTkRfRU1VMTBLMSkgKz0gZW11MTBrMS5vCi0KLWVtdTEwazEtb2JqcyA6PSBhdWRpby5vIGNhcmRtaS5vIGNhcmRtby5vIGNhcmR3aS5vIGNhcmR3by5vIGVjYXJkLm8gXAotICAgICAgICAgICAgICAgIGVmeG1nci5vIGVtdWFkeG1nLm8gaHdhY2Nlc3MubyBpcnFtZ3IubyBtYWluLm8gbWlkaS5vIFwKLSAgICAgICAgICAgICAgICBtaXhlci5vIHBhc3N0aHJvdWdoLm8gcmVjbWdyLm8gdGltZXIubyB2b2ljZW1nci5vCi0KLWlmZGVmIERFQlVHCi0gICAgRVhUUkFfQ0ZMQUdTICs9IC1ERU1VMTBLMV9ERUJVRwotZW5kaWYKLQotaWZkZWYgQ09ORklHX01JRElfRU1VMTBLMQotICAgIEVYVFJBX0NGTEFHUyArPSAtREVNVTEwSzFfU0VRVUVOQ0VSCi1lbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uYyBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWVhMjEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE1OTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgYXVkaW8uYyAtLSAvZGV2L2RzcCBpbnRlcmZhY2UgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OQkgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAgdHlwZXMvbGVha3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICJjYXJkd28uaCIKLSNpbmNsdWRlICJjYXJkd2kuaCIKLSNpbmNsdWRlICJyZWNtZ3IuaCIKLSNpbmNsdWRlICJpcnFtZ3IuaCIKLSNpbmNsdWRlICJhdWRpby5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLQotc3RhdGljIHZvaWQgY2FsY3VsYXRlX29mcmFnKHN0cnVjdCB3b2luc3QgKik7Ci1zdGF0aWMgdm9pZCBjYWxjdWxhdGVfaWZyYWcoc3RydWN0IHdpaW5zdCAqKTsKLQotc3RhdGljIHZvaWQgZW11MTBrMV93YXZlb3V0X2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSk7Ci1zdGF0aWMgdm9pZCBlbXUxMGsxX3dhdmVpbl9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpOwotCi0vKiBBdWRpbyBmaWxlIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBzc2l6ZV90IGVtdTEwazFfYXVkaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0Jc3NpemVfdCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEQoMywgImVtdTEwazFfYXVkaW9fcmVhZCgpLCBidWZmZXI9JXAsIGNvdW50PSVkXG4iLCBidWZmZXIsICh1MzIpIGNvdW50KTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHdpaW5zdC0+bW1hcHBlZCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpZiAod2lpbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgewotCQljYWxjdWxhdGVfaWZyYWcod2lpbnN0KTsKLQotCQl3aGlsZSAoZW11MTBrMV93YXZlaW5fb3Blbih3YXZlX2RldikgPCAwKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQkJCXJldHVybiAtRUFHQUlOOwotCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3YXZlX2Rldi0+Y2FyZC0+b3Blbl93YWl0KTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQl1MzIgYnl0ZXN0b2NvcHk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCSAgICAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX0lOUFVUKSkKLQkJCWVtdTEwazFfd2F2ZWluX3N0YXJ0KHdhdmVfZGV2KTsKLQotCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7Ci0JCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlEUEQoMywgImJ5dGVzdG9jb3B5IC0tPiAlZFxuIiwgYnl0ZXN0b2NvcHkpOwotCi0JCWlmICgoYnl0ZXN0b2NvcHkgPj0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKLQkJICAgIHx8IChieXRlc3RvY29weSA+PSBjb3VudCkpIHsKLQkJCWludCByYzsKLQotCQkJYnl0ZXN0b2NvcHkgPSBtaW5fdCh1MzIsIGJ5dGVzdG9jb3B5LCBjb3VudCk7Ci0KLQkJCXJjID0gZW11MTBrMV93YXZlaW5feGZlcmRhdGEod2lpbnN0LAotCQkJCQkJICAgICAodTggX191c2VyICopYnVmZmVyLAotCQkJCQkJICAgICAmYnl0ZXN0b2NvcHkpOwotCQkJaWYgKHJjKQotCQkJCXJldHVybiByYzsKLQotCQkJY291bnQgLT0gYnl0ZXN0b2NvcHk7Ci0JCQlidWZmZXIgKz0gYnl0ZXN0b2NvcHk7Ci0JCQlyZXQgKz0gYnl0ZXN0b2NvcHk7Ci0JCX0KLQotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQkJICAgIHx8ICghKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9JTlBVVCkpKQotCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVBR0FJTik7Ci0KLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndpaW5zdC0+d2FpdF9xdWV1ZSk7Ci0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlyZXR1cm4gKHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUyk7Ci0KLQkJfQotCX0KLQotCURQRCgzLCAiYnl0ZXMgY29waWVkIC0+ICVkXG4iLCAodTMyKSByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgZW11MTBrMV9hdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3NpemVfdCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRCgzLCAiZW11MTBrMV9hdWRpb193cml0ZSgpLCBidWZmZXI9JXAsIGNvdW50PSVkXG4iLCBidWZmZXIsICh1MzIpIGNvdW50KTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAod29pbnN0LT5tbWFwcGVkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQkvLyBUaGlzIGlzIGZvciBlbXUxMGsxIHJldnMgbGVzcyB0aGFuIDcsIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0cmFtCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDEpIHsKLQkJaW50IHI7Ci0JCQotCQl3b2luc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSBQVF9CTE9DS1NJWkVfTE9HMjsKLQkJd29pbnN0LT5idWZmZXIubnVtZnJhZ3MgPSBQVF9CTE9DS0NPVU5UOwotCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKLQkJCi0JCXIgPSBlbXUxMGsxX3B0X3dyaXRlKGZpbGUsIGJ1ZmZlciwgY291bnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JaWYgKHdvaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKLQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7Ci0KLQkJd2hpbGUgKGVtdTEwazFfd2F2ZW91dF9vcGVuKHdhdmVfZGV2KSA8IDApIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCQkJcmV0dXJuIC1FQUdBSU47Ci0KLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndhdmVfZGV2LT5jYXJkLT5vcGVuX3dhaXQpOwotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXQgPSAwOwotCWlmIChjb3VudCAlIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2FtcGxlKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCi0JY291bnQgLz0gd29pbnN0LT5udW1fdm9pY2VzOwotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQl1MzIgYnl0ZXN0b2NvcHk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0JCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCURQRCgzLCAiYnl0ZXN0b2NvcHkgLS0+ICVkXG4iLCBieXRlc3RvY29weSk7Ci0KLQkJaWYgKChieXRlc3RvY29weSA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKQotCQkgICAgfHwgKGJ5dGVzdG9jb3B5ID49IGNvdW50KSkgewotCi0JCQlieXRlc3RvY29weSA9IG1pbl90KHUzMiwgYnl0ZXN0b2NvcHksIGNvdW50KTsKLQotCQkJZW11MTBrMV93YXZlb3V0X3hmZXJkYXRhKHdvaW5zdCwgKHU4IF9fdXNlciAqKSBidWZmZXIsICZieXRlc3RvY29weSk7Ci0KLQkJCWNvdW50IC09IGJ5dGVzdG9jb3B5OwotCQkJYnVmZmVyICs9IGJ5dGVzdG9jb3B5ICogd29pbnN0LT5udW1fdm9pY2VzOwotCQkJcmV0ICs9IGJ5dGVzdG9jb3B5ICogd29pbnN0LT5udW1fdm9pY2VzOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQl3b2luc3QtPnRvdGFsX2NvcGllZCArPSBieXRlc3RvY29weTsKLQotCQkJaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJCSAgICAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkKLQkJCSAgICAmJiAod29pbnN0LT50b3RhbF9jb3BpZWQgPj0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkpCi0JCQkJZW11MTBrMV93YXZlb3V0X3N0YXJ0KHdhdmVfZGV2KTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQkJICAgIHx8ICghKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpKSkKLQkJCQlyZXR1cm4gKHJldCA/IHJldCA6IC1FQUdBSU4pOwotCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3b2luc3QtPndhaXRfcXVldWUpOwotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRVJFU1RBUlRTWVMpOwotCQl9Ci0JfQotCi0JRFBEKDMsICJieXRlcyBjb3BpZWQgLT4gJWRcbiIsICh1MzIpIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfYXVkaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IE5VTEw7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gTlVMTDsKLQlpbnQgdmFsID0gMDsKLQl1MzIgYnl0ZXN0b2NvcHk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7Ci0KLQlEUEYoNCwgImVtdTEwazFfYXVkaW9faW9jdGwoKVxuIik7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCXdvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPU1NfR0VUVkVSU0lPTjoKLQkJRFBGKDIsICJPU1NfR0VUVkVSU0lPTjpcbiIpOwotCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfUkVTRVQ6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9SRVNFVDpcbiIpOwotCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyA9IFBDTV9FTkFCTEVfT1VUUFVUIHwgUENNX0VOQUJMRV9JTlBVVDsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQkJfQotCi0JCQl3b2luc3QtPm1tYXBwZWQgPSAwOwotCQkJd29pbnN0LT50b3RhbF9jb3BpZWQgPSAwOwotCQkJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSAwOwotCQkJd29pbnN0LT5ibG9ja3MgPSAwOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlaW5fY2xvc2Uod2F2ZV9kZXYpOwotCQkJfQotCi0JCQl3aWluc3QtPm1tYXBwZWQgPSAwOwotCQkJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCA9IDA7Ci0JCQl3aWluc3QtPmJsb2NrcyA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NZTkM6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TWU5DOlxuIik7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQotCQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkJCQl3aGlsZSAoKHdvaW5zdC0+dG90YWxfcGxheWVkIDwgd29pbnN0LT50b3RhbF9jb3BpZWQpCi0JCQkJCSAgICAgICAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd29pbnN0LT53YWl0X3F1ZXVlKTsKLQkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJfQotCQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCQl9Ci0KLQkJCXdvaW5zdC0+bW1hcHBlZCA9IDA7Ci0JCQl3b2luc3QtPnRvdGFsX2NvcGllZCA9IDA7Ci0JCQl3b2luc3QtPnRvdGFsX3BsYXllZCA9IDA7Ci0JCQl3b2luc3QtPmJsb2NrcyA9IDA7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCQllbXUxMGsxX3dhdmVpbl9jbG9zZSh3YXZlX2Rldik7Ci0JCQl9Ci0KLQkJCXdpaW5zdC0+bW1hcHBlZCA9IDA7Ci0JCQl3aWluc3QtPnRvdGFsX3JlY29yZGVkID0gMDsKLQkJCXdpaW5zdC0+YmxvY2tzID0gMDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU0VURFVQTEVYOlxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9HRVRDQVBTOlxuIik7Ci0JCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfAotCQkJCURTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCB8Ci0JCQkJRFNQX0NBUF9DT1BST0N8IERTUF9DQVBfTVVMVEksIHApOwotCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NQRUVEOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgInZhbCBpcyAlZFxuIiwgdmFsKTsKLQotCQlpZiAodmFsID4gMCkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7Ci0JCQkJZm9ybWF0LnNhbXBsaW5ncmF0ZSA9IHZhbDsKLQotCQkJCWlmIChlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlEUEQoMiwgInNldCByZWNvcmRpbmcgc2FtcGxpbmcgcmF0ZSAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCWZvcm1hdCA9IHdvaW5zdC0+Zm9ybWF0OwotCQkJCWZvcm1hdC5zYW1wbGluZ3JhdGUgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7Ci0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCURQRCgyLCAic2V0IHBsYXliYWNrIHNhbXBsaW5nIHJhdGUgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQl9IGVsc2UgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TVEVSRU86XG4iKTsKLQotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURQRCgyLCAiIHZhbCBpcyAlZFxuIiwgdmFsKTsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlmb3JtYXQgPSB3aWluc3QtPmZvcm1hdDsKLQkJCWZvcm1hdC5jaGFubmVscyA9IHZhbCA/IDIgOiAxOwotCi0JCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgLSAxOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBzdGVyZW8gLT4gJWRcbiIsIHZhbCk7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJZm9ybWF0ID0gd29pbnN0LT5mb3JtYXQ7Ci0JCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKLQotCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVscyAtIDE7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlEUEQoMiwgInNldCBwbGF5YmFjayBzdGVyZW8gLT4gJWRcbiIsIHZhbCk7Ci0JCX0KLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKLQkJRFBGKDIsICJTTkRDVExfRFNQX0NIQU5ORUxTOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgIiB2YWwgaXMgJWRcbiIsIHZhbCk7Ci0KLQkJaWYgKHZhbCA+IDApIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OwotCQkJCWZvcm1hdC5jaGFubmVscyA9IHZhbDsKLQotCQkJCWlmIChlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJRFBEKDIsICJzZXQgcmVjb3JkaW5nIG51bWJlciBvZiBjaGFubmVscyAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCWZvcm1hdCA9IHdvaW5zdC0+Zm9ybWF0OwotCQkJCWZvcm1hdC5jaGFubmVscyA9IHZhbDsKLQotCQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJRFBEKDIsICJzZXQgcGxheWJhY2sgbnVtYmVyIG9mIGNoYW5uZWxzIC0+ICVkXG4iLCB2YWwpOwotCQkJfQotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOwotCQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHM7Ci0KLQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9HRVRGTVRTOlxuIik7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQl2YWwgPSBBRk1UX1MxNl9MRTsKLQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXZhbCA9IEFGTVRfUzE2X0xFIHwgQUZNVF9VODsKLQkJCWlmIChlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJndhdmVfZGV2LT5jYXJkLT5tZ3IsCi0JCQkJCQkgICAgIHdhdmVfZGV2LT5jYXJkLT5wdC5wYXRjaF9uYW1lLCAKLQkJCQkJCSAgICAgd2F2ZV9kZXYtPmNhcmQtPnB0LmVuYWJsZV9ncHJfbmFtZSkgPj0gMCkKLQkJCQl2YWwgfD0gQUZNVF9BQzM7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBTYW1lIGFzIFNORENUTF9EU1BfU0FNUExFU0laRSAqLwotCQlEUEYoMiwgIlNORENUTF9EU1BfU0VURk1UOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgIiB2YWwgaXMgJWRcbiIsIHZhbCk7Ci0KLQkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3aWluc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuaWQgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmlkOwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJRFBEKDIsICJzZXQgcmVjb3JkaW5nIGZvcm1hdCAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCWZvcm1hdCA9IHdvaW5zdC0+Zm9ybWF0OwotCQkJCWZvcm1hdC5pZCA9IHZhbDsKLQotCQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmlkOwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJRFBEKDIsICJzZXQgcGxheWJhY2sgZm9ybWF0IC0+ICVkXG4iLCB2YWwpOwotCQkJfQotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmlkOwotCQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuaWQ7Ci0KLQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWw7Ci0JCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWw7Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7Ci0JCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOwotCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOwotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgotCQlEUEYoMiwgIlNPVU5EX1BDTV9XUklURV9GSUxURVI6IG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6Ci0JCURQRigyLCAiU09VTkRfUENNX1JFQURfRklMVEVSOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TRVRTWU5DUk86IG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9HRVRUUklHR0VSOlxuIik7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKSkKLQkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX0lOUFVUKSkKLQkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOwotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TRVRUUklHR0VSOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7Ci0JCQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgfD0gUENNX0VOQUJMRV9PVVRQVVQ7Ci0JCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pCi0JCQkJCWVtdTEwazFfd2F2ZW91dF9zdGFydCh3YXZlX2Rldik7Ci0JCQl9IGVsc2UgewotCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKLQkJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJCQkJZW11MTBrMV93YXZlb3V0X3N0b3Aod2F2ZV9kZXYpOwotCQkJfQotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7Ci0JCQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQkJCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikKLQkJCQkJZW11MTBrMV93YXZlaW5fc3RhcnQod2F2ZV9kZXYpOwotCQkJfSBlbHNlIHsKLQkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyAmPSB+UENNX0VOQUJMRV9JTlBVVDsKLQkJCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJCQkJZW11MTBrMV93YXZlaW5fc3RvcCh3YXZlX2Rldik7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKLQkJewotCQkJYXVkaW9fYnVmX2luZm8gaW5mbzsKLQotCQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVE9TUEFDRTpcbiIpOwotCi0JCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0JCQkJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQkJCQlpbmZvLmJ5dGVzID0gYnl0ZXN0b2NvcHk7Ci0JCQl9IGVsc2UgewotCQkJCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOwotCQkJCWluZm8uYnl0ZXMgPSB3b2luc3QtPmJ1ZmZlci5zaXplOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWluZm8uYnl0ZXMgKj0gd29pbnN0LT5udW1fdm9pY2VzOwotCQkJaW5mby5mcmFnc2l6ZSA9IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgKiB3b2luc3QtPm51bV92b2ljZXM7Ci0JCQlpbmZvLmZyYWdzdG90YWwgPSB3b2luc3QtPmJ1ZmZlci5udW1mcmFncyAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCWluZm8uZnJhZ21lbnRzID0gaW5mby5ieXRlcyAvIGluZm8uZnJhZ3NpemU7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgotCQl7Ci0JCQlhdWRpb19idWZfaW5mbyBpbmZvOwotCi0JCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUSVNQQUNFOlxuIik7Ci0KLQkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKLQkJCQllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7Ci0JCQkJaW5mby5ieXRlcyA9IGJ5dGVzdG9jb3B5OwotCQkJfSBlbHNlIHsKLQkJCQljYWxjdWxhdGVfaWZyYWcod2lpbnN0KTsKLQkJCQlpbmZvLmJ5dGVzID0gMDsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpbmZvLmZyYWdzdG90YWwgPSB3aWluc3QtPmJ1ZmZlci5udW1mcmFnczsKLQkJCWluZm8uZnJhZ21lbnRzID0gaW5mby5ieXRlcyAvIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCQlpbmZvLmZyYWdzaXplID0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKLQkJRFBGKDIsICJTTkRDVExfRFNQX05PTkJMT0NLOlxuIik7Ci0KLQkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6Ci0JCURQRig0LCAiU05EQ1RMX0RTUF9HRVRPREVMQVk6XG4iKTsKLQotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0JCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOwotCQkJdmFsID0gd29pbnN0LT5idWZmZXIuc2l6ZSAtIGJ5dGVzdG9jb3B5OwotCQl9IGVsc2UKLQkJCXZhbCA9IDA7Ci0KLQkJdmFsICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKLQkJewotCQkJY291bnRfaW5mbyBjaW5mbzsKLQotCQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVElQVFI6IFxuIik7Ci0KLQkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOwotCQkJCWNpbmZvLnB0ciA9IHdpaW5zdC0+YnVmZmVyLmh3X3BvczsKLQkJCQljaW5mby5ieXRlcyA9IGNpbmZvLnB0ciArIHdpaW5zdC0+dG90YWxfcmVjb3JkZWQgLSB3aWluc3QtPnRvdGFsX3JlY29yZGVkICUgd2lpbnN0LT5idWZmZXIuc2l6ZTsKLQkJCQljaW5mby5ibG9ja3MgPSBjaW5mby5ieXRlcyAvIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgLSB3aWluc3QtPmJsb2NrczsKLQkJCQl3aWluc3QtPmJsb2NrcyA9IGNpbmZvLmJ5dGVzIC8gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2luZm8ucHRyID0gMDsKLQkJCQljaW5mby5ieXRlcyA9IDA7Ci0JCQkJY2luZm8uYmxvY2tzID0gMDsKLQkJCX0KLQotCQkJaWYgKHdpaW5zdC0+bW1hcHBlZCkKLQkJCQl3aWluc3QtPmJ1ZmZlci5ieXRlc3RvY29weSAlPSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6Ci0JCXsKLQkJCWNvdW50X2luZm8gY2luZm87Ci0KLQkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRPUFRSOlxuIik7Ci0KLQkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTiB8fCAKLQkJCSAgICAoKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDEpICYmIHdhdmVfZGV2LT5jYXJkLT5wdC5zdGF0ZSkpIHsKLQkJCQlpbnQgbnVtX2ZyYWdtZW50czsKLQotCQkJCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSB7Ci0JCQkJCWVtdTEwazFfcHRfd2F2ZW91dF91cGRhdGUod2F2ZV9kZXYpOwotCQkJCQljaW5mby5ieXRlcyA9IHdvaW5zdC0+dG90YWxfcGxheWVkOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQkJCQkJY2luZm8uYnl0ZXMgPSB3b2luc3QtPnRvdGFsX3BsYXllZDsKLQkJCQl9Ci0KLQkJCQljaW5mby5wdHIgPSB3b2luc3QtPmJ1ZmZlci5od19wb3M7Ci0JCQkJbnVtX2ZyYWdtZW50cyA9IGNpbmZvLmJ5dGVzIC8gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQkJCQljaW5mby5ibG9ja3MgPSBudW1fZnJhZ21lbnRzIC0gd29pbnN0LT5ibG9ja3M7Ci0JCQkJd29pbnN0LT5ibG9ja3MgPSBudW1fZnJhZ21lbnRzOwotCi0JCQkJY2luZm8uYnl0ZXMgKj0gd29pbnN0LT5udW1fdm9pY2VzOwotCQkJCWNpbmZvLnB0ciAqPSB3b2luc3QtPm51bV92b2ljZXM7Ci0JCQl9IGVsc2UgewotCQkJCWNpbmZvLnB0ciA9IDA7Ci0JCQkJY2luZm8uYnl0ZXMgPSAwOwotCQkJCWNpbmZvLmJsb2NrcyA9IDA7Ci0JCQl9Ci0KLQkJCWlmICh3b2luc3QtPm1tYXBwZWQpCi0JCQkJd29pbnN0LT5idWZmZXIuZnJlZV9ieXRlcyAlPSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9HRVRCTEtTSVpFOlxuIik7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOwotCQkJdmFsID0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQljYWxjdWxhdGVfaWZyYWcod2lpbnN0KTsKLQkJCXZhbCA9IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfUE9TVDoKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkgICAgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpCi0JCQkgICAgJiYgKHdvaW5zdC0+dG90YWxfY29waWVkID4gMCkpCi0JCQkJZW11MTBrMV93YXZlb3V0X3N0YXJ0KHdhdmVfZGV2KTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TVUJESVZJREU6IG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU0VURlJBR01FTlQ6XG4iKTsKLQotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURQRCgyLCAidmFsIGlzICUjeFxuIiwgdmFsKTsKLQotCQlpZiAodmFsID09IDApCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCS8qIGRpZ2l0YWwgcGFzcy10aHJvdWdoIGZyYWdtZW50IGNvdW50IGFuZCBzaXplIGFyZSBmaXhlZCB2YWx1ZXMgKi8KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOIHx8ICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsJLyogdG9vIGxhdGUgdG8gY2hhbmdlICovCi0KLQkJCXdvaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKLQkJCXdvaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pCi0JCQkJcmV0dXJuIC1FSU5WQUw7CS8qIHRvbyBsYXRlIHRvIGNoYW5nZSAqLwotCi0JCQl3aWluc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7Ci0JCQl3aWluc3QtPmJ1ZmZlci5udW1mcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9DT1BSX0xPQUQ6Ci0JCXsKLQkJCWNvcHJfYnVmZmVyICpidWY7Ci0JCQl1MzIgaTsKLQotCQkJRFBGKDQsICJTTkRDVExfQ09QUl9MT0FEOlxuIik7Ci0KLQkJCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKGNvcHJfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWJ1ZikKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgcCwgc2l6ZW9mKGNvcHJfYnVmZmVyKSkpIHsKLQkJCQlrZnJlZSAoYnVmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQotCQkJaWYgKChidWYtPmNvbW1hbmQgIT0gQ01EX1JFQUQpICYmIChidWYtPmNvbW1hbmQgIT0gQ01EX1dSSVRFKSkgewotCQkJCWtmcmVlIChidWYpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlpZiAoYnVmLT5jb21tYW5kID09IENNRF9XUklURSkgewotCQkJCQotI2lmZGVmIERCR0VNVQotCQkJCWlmICgoYnVmLT5vZmZzIDwgMCkgfHwgKGJ1Zi0+b2ZmcyArIGJ1Zi0+bGVuID4gMHhlMDApIHx8IChidWYtPmxlbiA+IDEwMDApKSB7Ci0jZWxzZQotCQkJCWlmICgoKGJ1Zi0+b2ZmcyA8IDB4MTAwKSB8fCAoYnVmLT5vZmZzICsgYnVmLT5sZW4gPiAod2F2ZV9kZXYtPmNhcmQtPmlzX2F1ZGlneSA/IDB4ZTAwIDogMHg4MDApKSB8fCAoYnVmLT5sZW4gPiAxMDAwKQotCQkJCSkgJiYgISgKLQkJCQkJLy9hbnkgcmVnaXN0ZXIgYWxsb3dlZCByYXcgYWNjZXNzIHRvIHVzZXJzIGdvZXMgaGVyZToKLQkJCQkJKGJ1Zi0+b2ZmcyA9PSBEQkcgfHwKLQkJCQkJICBidWYtPm9mZnMgPT0gQV9EQkcpCi0JCQkJCSYmIChidWYtPmxlbiA9PSAxKSkpIHsKLSNlbmRpZgkJCi0JCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChidWYtPm9mZnMgPCAwKSB8fCAoYnVmLT5vZmZzICsgYnVmLT5sZW4gPiAweGUwMCkgfHwgKGJ1Zi0+bGVuID4gMTAwMCkpIHsKLQkJCQkJa2ZyZWUoYnVmKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJfQkJCQotCQkJCQotCQkJaWYgKCgodW5zaWduZWQpYnVmLT5mbGFncykgPiAweDNmKQotCQkJCWJ1Zi0+ZmxhZ3MgPSAwOwotCi0JCQlpZiAoYnVmLT5jb21tYW5kID09IENNRF9SRUFEKSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bGVuOyBpKyspCi0JCQkJCSgodTMyICopIGJ1Zi0+ZGF0YSlbaV0gPSBzYmxpdmVfcmVhZHB0cih3YXZlX2Rldi0+Y2FyZCwgYnVmLT5vZmZzICsgaSwgYnVmLT5mbGFncyk7Ci0KLQkJCQlpZiAoY29weV90b191c2VyKHAsIGJ1Ziwgc2l6ZW9mKGNvcHJfYnVmZmVyKSkpIHsKLQkJCQkJa2ZyZWUoYnVmKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5sZW47IGkrKykKLQkJCQkJc2JsaXZlX3dyaXRlcHRyKHdhdmVfZGV2LT5jYXJkLCBidWYtPm9mZnMgKyBpLCBidWYtPmZsYWdzLCAoKHUzMiAqKSBidWYtPmRhdGEpW2ldKTsKLQkJCX0KLQotCQkJa2ZyZWUgKGJ1Zik7Ci0JCQlicmVhazsKLQkJfQotCi0JZGVmYXVsdDoJCS8qIERlZmF1bHQgaXMgdW5yZWNvZ25pemVkIGNvbW1hbmQgKi8KLQkJRFBEKDIsICJkZWZhdWx0OiAlI3hcbiIsIGNtZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwYWdlICplbXUxMGsxX21tX25vcGFnZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQlzdHJ1Y3QgcGFnZSAqZG1hcGFnZTsKLQl1bnNpZ25lZCBsb25nIHBnb2ZmOwotCWludCByZCwgd3I7Ci0KLQlEUEYoMywgImVtdTEwazFfbW1fbm9wYWdlKClcbiIpOwotCURQRCgzLCAiYWRkcjogJSNseFxuIiwgYWRkcmVzcyk7Ci0KLQlpZiAoYWRkcmVzcyA+IHZtYS0+dm1fZW5kKSB7Ci0JCURQRigxLCAiRVhJVCwgcmV0dXJuaW5nIE5PUEFHRV9TSUdCVVNcbiIpOwotCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsgLyogRGlzYWxsb3cgbXJlbWFwICovCi0JfQotCi0JcGdvZmYgPSB2bWEtPnZtX3Bnb2ZmICsgKChhZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCk7Ci0JaWYgKHdvaW5zdCAhPSBOVUxMKQotCQl3ciA9IHdvaW5zdC0+bW1hcHBlZDsKLQllbHNlCi0JCXdyID0gMDsKLQotCWlmICh3aWluc3QgIT0gTlVMTCkKLQkJcmQgPSB3aWluc3QtPm1tYXBwZWQ7Ci0JZWxzZQotCQlyZCA9IDA7Ci0KLQkvKiBpZiBmdWxsLWR1cGxleCAocmVhZCt3cml0ZSkgYW5kIHdlIGhhdmUgdHdvIHNldHMgb2YgYnVmcywKLQkqIHRoZW4gdGhlIHBsYXliYWNrIGJ1ZmZlcnMgY29tZSBmaXJzdCwgc2V6IHNvdW5kY2FyZC5jICovCi0JaWYgKHdyKSB7Ci0JCWlmIChwZ29mZiA+PSB3b2luc3QtPmJ1ZmZlci5wYWdlcykgewotCQkJcGdvZmYgLT0gd29pbnN0LT5idWZmZXIucGFnZXM7Ci0JCQlkbWFwYWdlID0gdmlydF90b19wYWdlICgodTggKikgd2lpbnN0LT5idWZmZXIuYWRkciArIHBnb2ZmICogUEFHRV9TSVpFKTsKLQkJfSBlbHNlCi0JCQlkbWFwYWdlID0gdmlydF90b19wYWdlICh3b2luc3QtPnZvaWNlWzBdLm1lbS5hZGRyW3Bnb2ZmXSk7Ci0JfSBlbHNlIHsKLQkJZG1hcGFnZSA9IHZpcnRfdG9fcGFnZSAoKHU4ICopIHdpaW5zdC0+YnVmZmVyLmFkZHIgKyBwZ29mZiAqIFBBR0VfU0laRSk7Ci0JfQotCi0JZ2V0X3BhZ2UgKGRtYXBhZ2UpOwotCi0JRFBEKDMsICJwYWdlOiAlI2x4XG4iLCAodW5zaWduZWQgbG9uZykgZG1hcGFnZSk7Ci0JaWYgKHR5cGUpCi0JCSp0eXBlID0gVk1fRkFVTFRfTUlOT1I7Ci0JcmV0dXJuIGRtYXBhZ2U7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZW11MTBrMV9tbV9vcHMgPSB7Ci0JLm5vcGFnZSAgICAgICAgID0gZW11MTBrMV9tbV9ub3BhZ2UsCi19OwotCi1zdGF0aWMgaW50IGVtdTEwazFfYXVkaW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBtYXhfcGFnZXMsIG5fcGFnZXMsIHBnb2Zmc2V0OwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IE5VTEw7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX2F1ZGlvX21tYXAoKVxuIik7Ci0KLQltYXhfcGFnZXMgPSAwOwotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKLQkJd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogTm8gbSdtYXBwaW5nIHBvc3NpYmxlIGZvciBtdWx0aWNoYW5uZWwgKi8KLQkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIAlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICh3b2luc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKSB7Ci0JCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKLQotCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9vcGVuKHdhdmVfZGV2KSA8IDApIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlFUlJPUigpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQkJd29pbnN0LT5tbWFwcGVkID0gMTsKLQkJbWF4X3BhZ2VzICs9IHdvaW5zdC0+YnVmZmVyLnBhZ2VzOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKLQkJd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCWlmICh3aWluc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKSB7Ci0JCQljYWxjdWxhdGVfaWZyYWcod2lpbnN0KTsKLQotCQkJaWYgKGVtdTEwazFfd2F2ZWluX29wZW4od2F2ZV9kZXYpIDwgMCkgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCUVSUk9SKCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0KLQotCQl3aWluc3QtPm1tYXBwZWQgPSAxOwotCQltYXhfcGFnZXMgKz0gd2lpbnN0LT5idWZmZXIucGFnZXM7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCW5fcGFnZXMgPSAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXBnb2Zmc2V0ID0gdm1hLT52bV9wZ29mZjsKLQotCURQRCgyLCAidm1hX3N0YXJ0OiAlI2x4LCB2bWFfZW5kOiAlI2x4LCB2bWFfb2Zmc2V0OiAlbGRcbiIsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBwZ29mZnNldCk7Ci0JRFBEKDIsICJuX3BhZ2VzOiAlbGQsIG1heF9wYWdlczogJWxkXG4iLCBuX3BhZ2VzLCBtYXhfcGFnZXMpOwotCi0JaWYgKHBnb2Zmc2V0ICsgbl9wYWdlcyA+IG1heF9wYWdlcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOwotCXZtYS0+dm1fb3BzID0gJmVtdTEwazFfbW1fb3BzOwotCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gd2F2ZV9kZXY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9hdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXY7Ci0KLQlEUEYoMiwgImVtdTEwazFfYXVkaW9fb3BlbigpXG4iKTsKLQotCS8qIENoZWNrIGZvciBjb3JyZWN0IGRldmljZSB0byBvcGVuICovCi0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZW11MTBrMV9kZXZzKSB7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11MTBrMV9jYXJkLCBsaXN0KTsKLQotCQlpZiAoISgoY2FyZC0+YXVkaW9fZGV2IF4gbWlub3IpICYgfjB4ZikgfHwgISgoY2FyZC0+YXVkaW9fZGV2MSBeIG1pbm9yKSAmIH4weGYpKQotCQkJZ290byBtYXRjaDsKLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLQotbWF0Y2g6Ci0KLQl3YXZlX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQotCWlmICh3YXZlX2RldiA9PSBOVUxMKSB7IAotCQlFUlJPUigpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl3YXZlX2Rldi0+Y2FyZCA9IGNhcmQ7Ci0Jd2F2ZV9kZXYtPndpaW5zdCA9IE5VTEw7Ci0Jd2F2ZV9kZXYtPndvaW5zdCA9IE5VTEw7Ci0Jd2F2ZV9kZXYtPmVuYWJsZWJpdHMgPSBQQ01fRU5BQkxFX09VVFBVVCB8IFBDTV9FTkFCTEVfSU5QVVQ7CS8qIERlZmF1bHQgKi8KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCS8qIFJlY29yZGluZyAqLwotCQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3Q7Ci0KLQkJaWYgKCh3aWluc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd2lpbnN0KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJCUVSUk9SKCk7Ci0JCQlrZnJlZSh3YXZlX2Rldik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCXdpaW5zdC0+cmVjc3JjID0gY2FyZC0+d2F2ZWluLnJlY3NyYzsKLSAgICAgICAgICAgICAgICB3aWluc3QtPmZ4d2MgPSBjYXJkLT53YXZlaW4uZnh3YzsKLQotCQlzd2l0Y2ggKHdpaW5zdC0+cmVjc3JjKSB7Ci0JCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCQkJd2lpbnN0LT5mb3JtYXQuaWQgPSBBRk1UX1MxNl9MRTsKLQkJCXdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDgwMDA7Ci0JCQl3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCQl3aWluc3QtPmZvcm1hdC5pZCA9IEFGTVRfUzE2X0xFOwotCQkJd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlID0gODAwMDsKLQkJCXdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQl3aWluc3QtPmZvcm1hdC5jaGFubmVscyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBXQVZFUkVDT1JEX0ZYOgotCQkJd2lpbnN0LT5mb3JtYXQuaWQgPSBBRk1UX1MxNl9MRTsKLQkJCXdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDQ4MDAwOwotCQkJd2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCXdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID0gaHdlaWdodDMyKHdpaW5zdC0+Znh3Yyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWtmcmVlKHdhdmVfZGV2KTsKLQkJCWtmcmVlKHdpaW5zdCk7Ci0JCQlCVUcoKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJd2lpbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOwotCi0JCXdpaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IDA7Ci0JCXdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgPSAwOwotCQl3aWluc3QtPmJ1ZmZlci5udW1mcmFncyA9IDA7Ci0KLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmd2lpbnN0LT53YWl0X3F1ZXVlKTsKLQotCQl3aWluc3QtPm1tYXBwZWQgPSAwOwotCQl3aWluc3QtPnRvdGFsX3JlY29yZGVkID0gMDsKLQkJd2lpbnN0LT5ibG9ja3MgPSAwOwotCQlzcGluX2xvY2tfaW5pdCgmd2lpbnN0LT5sb2NrKTsKLQkJdGFza2xldF9pbml0KCZ3aWluc3QtPnRpbWVyLnRhc2tsZXQsIGVtdTEwazFfd2F2ZWluX2JoLCAodW5zaWduZWQgbG9uZykgd2F2ZV9kZXYpOwotCQl3YXZlX2Rldi0+d2lpbnN0ID0gd2lpbnN0OwotCQllbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQod2F2ZV9kZXYsICZ3aWluc3QtPmZvcm1hdCk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0cnVjdCB3b2luc3QgKndvaW5zdDsKLQkJaW50IGk7Ci0KLQkJaWYgKCh3b2luc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd29pbnN0KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJCUVSUk9SKCk7Ci0JCQlrZnJlZSh3YXZlX2Rldik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCWlmICh3YXZlX2Rldi0+d2lpbnN0ICE9IE5VTEwpIHsKLQkJCXdvaW5zdC0+Zm9ybWF0ID0gd2F2ZV9kZXYtPndpaW5zdC0+Zm9ybWF0OwotCQl9IGVsc2UgewotCQkJd29pbnN0LT5mb3JtYXQuaWQgPSBBRk1UX1U4OwotCQkJd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlID0gODAwMDsKLQkJCXdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID0gODsKLQkJCXdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID0gMTsKLQkJfQotCi0JCXdvaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKLQotCQl3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplID0gMDsKLQkJd29pbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gMDsKLQkJd29pbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAwOwotCQl3b2luc3QtPmRldmljZSA9IChjYXJkLT5hdWRpb19kZXYxID09IG1pbm9yKTsKLQkJd29pbnN0LT50aW1lci5zdGF0ZSA9IFRJTUVSX1NUQVRFX1VOSU5TVEFMTEVEOwotCQl3b2luc3QtPm51bV92b2ljZXMgPSAxOwotCQlmb3IgKGkgPSAwOyBpIDwgV0FWRU9VVF9NQVhWT0lDRVM7IGkrKykgewotCQkJd29pbnN0LT52b2ljZVtpXS51c2FnZSA9IFZPSUNFX1VTQUdFX0ZSRUU7Ci0JCQl3b2luc3QtPnZvaWNlW2ldLm1lbS5lbXVwYWdlaW5kZXggPSAtMTsKLQkJfQotCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndvaW5zdC0+d2FpdF9xdWV1ZSk7Ci0KLQkJd29pbnN0LT5tbWFwcGVkID0gMDsKLQkJd29pbnN0LT50b3RhbF9jb3BpZWQgPSAwOwotCQl3b2luc3QtPnRvdGFsX3BsYXllZCA9IDA7Ci0JCXdvaW5zdC0+YmxvY2tzID0gMDsKLQkJc3Bpbl9sb2NrX2luaXQoJndvaW5zdC0+bG9jayk7Ci0JCXRhc2tsZXRfaW5pdCgmd29pbnN0LT50aW1lci50YXNrbGV0LCBlbXUxMGsxX3dhdmVvdXRfYmgsICh1bnNpZ25lZCBsb25nKSB3YXZlX2Rldik7Ci0JCXdhdmVfZGV2LT53b2luc3QgPSB3b2luc3Q7Ci0JCWVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZ3b2luc3QtPmZvcm1hdCk7Ci0JfQotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgd2F2ZV9kZXY7Ci0KLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9hdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQotCURQRigyLCAiZW11MTBrMV9hdWRpb19yZWxlYXNlKClcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlpZih3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaD09MikKLQkJCWNhcmQtPnB0LnN0YXRlPVBUX1NUQVRFX1BMQVlJTkc7Ci0JCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCAmJiBjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSl7Ci0JCQlzcGluX2xvY2soJmNhcmQtPnB0LmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgZW11MTBrMV9wdF9zdG9wKGNhcmQpOwotCQkJc3Bpbl91bmxvY2soJmNhcmQtPnB0LmxvY2spOwotCQl9Ci0JCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkgewotCQkJCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCQkJCQl3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpCi0JCQkJCSAgICAgICAmJiAod29pbnN0LT50b3RhbF9wbGF5ZWQgPCB3b2luc3QtPnRvdGFsX2NvcGllZCkpIHsKLQkJCQkJCURQRig0LCAiQnVmZmVyIGhhc24ndCBiZWVuIHRvdGFsbHkgcGxheWVkLCBzbGVlcC4uLi5cbiIpOwotCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3b2luc3QtPndhaXRfcXVldWUpOwotCQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkvKiByZW1vdmUgdGhlIHRhc2tsZXQgKi8KLQkJdGFza2xldF9raWxsKCZ3b2luc3QtPnRpbWVyLnRhc2tsZXQpOwotCQlrZnJlZSh3YXZlX2Rldi0+d29pbnN0KTsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJZW11MTBrMV93YXZlaW5fY2xvc2Uod2F2ZV9kZXYpOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXRhc2tsZXRfa2lsbCgmd2lpbnN0LT50aW1lci50YXNrbGV0KTsKLQkJa2ZyZWUod2F2ZV9kZXYtPndpaW5zdCk7Ci0JfQotCi0Ja2ZyZWUod2F2ZV9kZXYpOwotCi0JaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmNhcmQtPm9wZW5fd2FpdCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FyZC0+b3Blbl93YWl0KTsKLQotCXJldHVybiAwOwotfQotCi0vKiBGSVhNRSBzb3J0IG91dCBwb2xsKCkgKyBtbWFwKCkgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW11MTBrMV9hdWRpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQl1MzIgYnl0ZXN0b2NvcHk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRig0LCAiZW11MTBrMV9hdWRpb19wb2xsKClcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQlwb2xsX3dhaXQoZmlsZSwgJndvaW5zdC0+d2FpdF9xdWV1ZSwgd2FpdCk7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJcG9sbF93YWl0KGZpbGUsICZ3aWluc3QtPndhaXRfcXVldWUsIHdhaXQpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQkJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQotCQkJaWYgKGJ5dGVzdG9jb3B5ID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCi0JCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJfSBlbHNlCi0JCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOwotCQkJZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUod2lpbnN0LCAmYnl0ZXN0b2NvcHkpOwotCi0JCQlpZiAoYnl0ZXN0b2NvcHkgPj0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKLQkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIHZvaWQgY2FsY3VsYXRlX29mcmFnKHN0cnVjdCB3b2luc3QgKndvaW5zdCkKLXsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKLQl1MzIgZnJhZ3NpemU7Ci0KLQlpZiAoYnVmZmVyLT5mcmFnbWVudF9zaXplKQotCQlyZXR1cm47Ci0KLQlpZiAoIWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0KSB7Ci0JCWZyYWdzaXplID0gKHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUgKiB3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgKiBXQVZFT1VUX0RFRkFVTFRGUkFHTEVOKSAvIDEwMDAgLSAxOwotCi0JCXdoaWxlIChmcmFnc2l6ZSkgewotCQkJZnJhZ3NpemUgPj49IDE7Ci0JCQlidWZmZXItPm9zc2ZyYWdzaGlmdCsrOwotCQl9Ci0JfQotCi0JaWYgKGJ1ZmZlci0+b3NzZnJhZ3NoaWZ0IDwgV0FWRU9VVF9NSU5GUkFHU0hJRlQpCi0JCWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0ID0gV0FWRU9VVF9NSU5GUkFHU0hJRlQ7Ci0KLQlidWZmZXItPmZyYWdtZW50X3NpemUgPSAxIDw8IGJ1ZmZlci0+b3NzZnJhZ3NoaWZ0OwotCi0Jd2hpbGUgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIFdBVkVPVVRfTUlORlJBR1MgPiBXQVZFT1VUX01BWEJVRlNJWkUpCi0JCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+Pj0gMTsKLQotCS8qIG5vdyB3ZSBhcmUgc3VyZSB0aGF0OgotCSAoMl5XQVZFT1VUX01JTkZSQUdTSElGVCkgPD0gKGZyYWdtZW50X3NpemUgPSAyXm4pIDw9IChXQVZFT1VUX01BWEJVRlNJWkUgLyBXQVZFT1VUX01JTkZSQUdTKQotCSovCi0KLQlpZiAoIWJ1ZmZlci0+bnVtZnJhZ3MpIHsKLQkJdTMyIG51bWZyYWdzOwotCi0JCW51bWZyYWdzID0gKHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUgKiB3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgKiBXQVZFT1VUX0RFRkFVTFRCVUZMRU4pIC8KLQkJCSAgIChidWZmZXItPmZyYWdtZW50X3NpemUgKiAxMDAwKSAtIDE7Ci0KLQkJYnVmZmVyLT5udW1mcmFncyA9IDE7Ci0KLQkJd2hpbGUgKG51bWZyYWdzKSB7Ci0JCQludW1mcmFncyA+Pj0gMTsKLQkJCWJ1ZmZlci0+bnVtZnJhZ3MgPDw9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyA8IFdBVkVPVVRfTUlORlJBR1MpCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSBXQVZFT1VUX01JTkZSQUdTOwotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgKiBidWZmZXItPmZyYWdtZW50X3NpemUgPiBXQVZFT1VUX01BWEJVRlNJWkUpCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSBXQVZFT1VUX01BWEJVRlNJWkUgLyBidWZmZXItPmZyYWdtZW50X3NpemU7Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyA8IFdBVkVPVVRfTUlORlJBR1MpCi0JCUJVRygpOwotCi0JYnVmZmVyLT5zaXplID0gYnVmZmVyLT5mcmFnbWVudF9zaXplICogYnVmZmVyLT5udW1mcmFnczsKLQlidWZmZXItPnBhZ2VzID0gYnVmZmVyLT5zaXplIC8gUEFHRV9TSVpFICsgKChidWZmZXItPnNpemUgJSBQQUdFX1NJWkUpID8gMSA6IDApOwotCi0JRFBEKDIsICIgY2FsY3VsYXRlZCBwbGF5YmFjayBmcmFnbWVudF9zaXplIC0+ICVkXG4iLCBidWZmZXItPmZyYWdtZW50X3NpemUpOwotCURQRCgyLCAiIGNhbGN1bGF0ZWQgcGxheWJhY2sgbnVtZnJhZ3MgLT4gJWRcbiIsIGJ1ZmZlci0+bnVtZnJhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVfaWZyYWcoc3RydWN0IHdpaW5zdCAqd2lpbnN0KQotewotCXN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIgPSAmd2lpbnN0LT5idWZmZXI7Ci0JdTMyIGZyYWdzaXplLCBidWZzaXplLCBzaXplWzRdOwotCWludCBpLCBqOwotCi0JaWYgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFidWZmZXItPm9zc2ZyYWdzaGlmdCkgewotCQlmcmFnc2l6ZSA9ICh3aWluc3QtPmZvcm1hdC5ieXRlc3BlcnNlYyAqIFdBVkVJTl9ERUZBVUxURlJBR0xFTikgLyAxMDAwIC0gMTsKLQotCQl3aGlsZSAoZnJhZ3NpemUpIHsKLQkJCWZyYWdzaXplID4+PSAxOwotCQkJYnVmZmVyLT5vc3NmcmFnc2hpZnQrKzsKLQkJfQotCX0KLQotCWlmIChidWZmZXItPm9zc2ZyYWdzaGlmdCA8IFdBVkVJTl9NSU5GUkFHU0hJRlQpCi0JCWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0ID0gV0FWRUlOX01JTkZSQUdTSElGVDsKLQotCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA9IDEgPDwgYnVmZmVyLT5vc3NmcmFnc2hpZnQ7Ci0KLQl3aGlsZSAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogV0FWRUlOX01JTkZSQUdTID4gV0FWRUlOX01BWEJVRlNJWkUpCi0JCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+Pj0gMTsKLQotCS8qIG5vdyB3ZSBhcmUgc3VyZSB0aGF0OgotCSAgICgyXldBVkVJTl9NSU5GUkFHU0hJRlQpIDw9IChmcmFnbWVudF9zaXplID0gMl5uKSA8PSAoV0FWRUlOX01BWEJVRlNJWkUgLyBXQVZFSU5fTUlORlJBR1MpCi0gICAgICAgICovCi0KLQotCWlmICghYnVmZmVyLT5udW1mcmFncykKLQkJYnVmZmVyLT5udW1mcmFncyA9ICh3aWluc3QtPmZvcm1hdC5ieXRlc3BlcnNlYyAqIFdBVkVJTl9ERUZBVUxUQlVGTEVOKSAvIChidWZmZXItPmZyYWdtZW50X3NpemUgKiAxMDAwKSAtIDE7Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyA8IFdBVkVJTl9NSU5GUkFHUykKLQkJYnVmZmVyLT5udW1mcmFncyA9IFdBVkVJTl9NSU5GUkFHUzsKLQotCWlmIChidWZmZXItPm51bWZyYWdzICogYnVmZmVyLT5mcmFnbWVudF9zaXplID4gV0FWRUlOX01BWEJVRlNJWkUpCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSBXQVZFSU5fTUFYQlVGU0laRSAvIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZTsKLQotCWlmIChidWZmZXItPm51bWZyYWdzIDwgV0FWRUlOX01JTkZSQUdTKQotCQlCVUcoKTsKLQotCWJ1ZnNpemUgPSBidWZmZXItPmZyYWdtZW50X3NpemUgKiBidWZmZXItPm51bWZyYWdzOwotCi0JLyogdGhlIGJ1ZmZlciBzaXplIGZvciByZWNvcmRpbmcgaXMgcmVzdHJpY3RlZCB0byBjZXJ0YWluIHZhbHVlcywgYWRqdXN0IGl0IG5vdyAqLwotCWlmIChidWZzaXplID49IDB4MTAwMDApIHsKLQkJYnVmZmVyLT5zaXplID0gMHgxMDAwMDsKLQkJYnVmZmVyLT5zaXplcmVndmFsID0gMHgxZjsKLQl9IGVsc2UgewotCQlidWZmZXItPnNpemUgPSAwOwotCQlzaXplWzBdID0gMzg0OwotCQlzaXplWzFdID0gNDQ4OwotCQlzaXplWzJdID0gNTEyOwotCQlzaXplWzNdID0gNjQwOwotCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotCQkJCWlmIChidWZzaXplID49IHNpemVbal0pIHsKLQkJCQkJYnVmZmVyLT5zaXplID0gc2l6ZVtqXTsKLQkJCQkJc2l6ZVtqXSAqPSAyOwotCQkJCQlidWZmZXItPnNpemVyZWd2YWwgPSBpICogNCArIGogKyAxOwotCQkJCX0gZWxzZQotCQkJCQlnb3RvIGV4aXRsb29wOwotCSAgICAgIGV4aXRsb29wOgotCQlpZiAoYnVmZmVyLT5zaXplID09IDApIHsKLQkJCWJ1ZmZlci0+c2l6ZSA9IDM4NDsKLQkJCWJ1ZmZlci0+c2l6ZXJlZ3ZhbCA9IDB4MDE7Ci0JCX0KLQl9Ci0KLQkvKiBhZGp1c3QgdGhlIGZyYWdtZW50IHNpemUgc28gdGhhdCBidWZmZXIgc2l6ZSBpcyBhbiBpbnRlZ2VyIG11bHRpcGxlICovCi0Jd2hpbGUgKGJ1ZmZlci0+c2l6ZSAlIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSkKLQkJYnVmZmVyLT5mcmFnbWVudF9zaXplID4+PSAxOwotCi0JYnVmZmVyLT5udW1mcmFncyA9IGJ1ZmZlci0+c2l6ZSAvIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZTsKLQlidWZmZXItPnBhZ2VzID0gIGJ1ZmZlci0+c2l6ZSAvIFBBR0VfU0laRSArICgoYnVmZmVyLT5zaXplICUgUEFHRV9TSVpFKSA/IDEgOiAwKTsKLQotCURQRCgyLCAiIGNhbGN1bGF0ZWQgcmVjb3JkaW5nIGZyYWdtZW50X3NpemUgLT4gJWRcbiIsIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSk7Ci0JRFBEKDIsICIgY2FsY3VsYXRlZCByZWNvcmRpbmcgbnVtZnJhZ3MgLT4gJWRcbiIsIGJ1ZmZlci0+bnVtZnJhZ3MpOwotCURQRCgyLCAiIGJ1ZmZlciBzaXplIHJlZ2lzdGVyIC0+ICUjMDR4XG4iLCBidWZmZXItPnNpemVyZWd2YWwpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX3dhdmVpbl9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSByZWZkYXRhOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0JdTMyIGJ5dGVzdG9jb3B5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXdpaW5zdCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCEod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7Ci0JZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUod2lpbnN0LCAmYnl0ZXN0b2NvcHkpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoYnl0ZXN0b2NvcHkgPj0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgewotCSAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJndpaW5zdC0+d2FpdF9xdWV1ZSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndpaW5zdC0+d2FpdF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCURQRCgzLCAiTm90IGVub3VnaCB0cmFuc2ZlciBzaXplLCAlZFxuIiwgYnl0ZXN0b2NvcHkpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX3dhdmVvdXRfYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgcmVmZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXUzMiBieXRlc3RvY29weTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCF3b2luc3QpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7Ci0KLQlpZiAod29pbnN0LT5idWZmZXIuZmlsbF9zaWxlbmNlKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQllbXUxMGsxX3dhdmVvdXRfZmlsbHNpbGVuY2Uod29pbnN0KTsKLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoYnl0ZXN0b2NvcHkgPj0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgewotCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmd29pbnN0LT53YWl0X3F1ZXVlKSkKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmd29pbnN0LT53YWl0X3F1ZXVlKTsKLQl9IGVsc2UKLQkJRFBEKDMsICJOb3QgZW5vdWdoIHRyYW5zZmVyIHNpemUgLT4gJWRcbiIsIGJ5dGVzdG9jb3B5KTsKLQotCXJldHVybjsKLX0KLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX2F1ZGlvX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5yZWFkCQk9IGVtdTEwazFfYXVkaW9fcmVhZCwKLQkud3JpdGUJCT0gZW11MTBrMV9hdWRpb193cml0ZSwKLQkucG9sbAkJPSBlbXUxMGsxX2F1ZGlvX3BvbGwsCi0JLmlvY3RsCQk9IGVtdTEwazFfYXVkaW9faW9jdGwsCi0JLm1tYXAJCT0gZW11MTBrMV9hdWRpb19tbWFwLAotCS5vcGVuCQk9IGVtdTEwazFfYXVkaW9fb3BlbiwKLQkucmVsZWFzZQk9IGVtdTEwazFfYXVkaW9fcmVsZWFzZSwKLX07CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5oIGIvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlZTgxYi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgYXVkaW8uYyAtLSAvZGV2L2RzcCBpbnRlcmZhY2UgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OQkgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAgdHlwZXMvbGVha3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX0FVRElPX0gKLSNkZWZpbmUgX0FVRElPX0gKLQotc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZQotewotICAgICAgICBzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotICAgICAgICBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3Q7Ci0gICAgICAgIHN0cnVjdCB3b2luc3QgKndvaW5zdDsKLSAgICAgICAgdTE2IGVuYWJsZWJpdHM7Ci19OwotCi0jZW5kaWYgLyogX0FVRElPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Njc0ZjguLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MzIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgc2JsaXZlX21pLmMgLSBNSURJIFVBUlQgaW5wdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbiB1cAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJjYXJkbWkuaCIKLSNpbmNsdWRlICJpcnFtZ3IuaCIKLQotCi1zdGF0aWMgaW50IGVtdTEwazFfbXB1aW5fY2FsbGJhY2soc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHUzMiBtc2csIHVuc2lnbmVkIGxvbmcgZGF0YSwgdTMyIGJ5dGVzdmFsaWQpOwotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlSW5pdChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqKTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVFbnRyeShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlUGFyc2Uoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZUtleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVWZWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUyQnl0ZUtleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMktleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMyhzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM0tleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM1ZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzRXhOb3JtKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNSZWFsKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLQotCi1zdGF0aWMgc3RydWN0IHsKLQlpbnQgKCpGbikgKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLX0gbWlkaXN0YXRlZm5bXSA9IHsKLQotCXsKLQlzYmxpdmVfbWlTdGF0ZVBhcnNlfSwgewotCXNibGl2ZV9taVN0YXRlM0J5dGV9LAkvKiAweDhuLCAweDluLCAweEFuLCAweEJuLCAweEVuICovCi0JewotCXNibGl2ZV9taVN0YXRlM0J5dGVLZXl9LAkvKiBCeXRlIDEgICAgICAgICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlM0J5dGVWZWx9LAkvKiBCeXRlIDIgICAgICAgICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlMkJ5dGV9LAkvKiAweENuLCAweERuICAgICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlMkJ5dGVLZXl9LAkvKiBCeXRlIDEgICAgICAgICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMn0sCS8qIDB4RjEgLCAweEYzICAgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNDb21tb24yS2V5fSwJLyogMHhGMSAsIDB4RjMsIEJ5dGUgMSAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjN9LAkvKiAweEYyICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM0tleX0sCS8qIDB4RjIgLCBCeXRlIDEgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNDb21tb24zVmVsfSwJLyogMHhGMiAsIEJ5dGUgMiAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0V4Tm9ybX0sCS8qIDB4RjAsIDB4RjcsIE5vcm1hbCBtb2RlICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNSZWFsfQkvKiAweEY0IC0gMHhGNiAsMHhGOCAtIDB4RkYgICAgICovCi19OwotCi0KLS8qIEluc3RhbGxzIHRoZSBJUlEgaGFuZGxlciBmb3IgdGhlIE1QVSBpbiBwb3J0ICAgICAgICAgICAgICAgICAqLwotCi0vKiBhbmQgaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotaW50IGVtdTEwazFfbXB1aW5fb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAqb3BlbmluZm8pCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9vcGVuXG4iKTsKLQotCWlmICghKGNhcmRfbXB1aW4tPnN0YXR1cyAmIEZMQUdTX0FWQUlMQUJMRSkpCi0JCXJldHVybiAtMTsKLQotCS8qIENvcHkgb3BlbiBpbmZvIGFuZCBtYXJrIGNoYW5uZWwgYXMgaW4gdXNlICovCi0JY2FyZF9tcHVpbi0+b3BlbmluZm8gPSAqb3BlbmluZm87Ci0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19BVkFJTEFCTEU7CS8qIGNsZWFyICovCi0JY2FyZF9tcHVpbi0+c3RhdHVzIHw9IEZMQUdTX1JFQURZOwkvKiBzZXQgKi8KLQljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX01JRE1fU1RBUlRFRDsJLyogY2xlYXIgKi8KLQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gTlVMTDsKLQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOwotCWNhcmRfbXB1aW4tPnFoZWFkID0gMDsKLQljYXJkX21wdWluLT5xdGFpbCA9IDA7Ci0KLQlzYmxpdmVfbWlTdGF0ZUluaXQoY2FyZF9tcHVpbik7Ci0KLQllbXUxMGsxX21wdV9yZXNldChjYXJkKTsKLQllbXUxMGsxX21wdV9hY3F1aXJlKGNhcmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX21wdWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9jbG9zZSgpXG4iKTsKLQotCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGlucHV0IFN5c0V4IGJ1ZmZlcnMgKi8KLQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSAhPSBOVUxMKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBEaXNhYmxlIFJYIGludGVycnVwdCAqLwotCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKLQotCWVtdTEwazFfbXB1X3JlbGVhc2UoY2FyZCk7Ci0KLQljYXJkX21wdWluLT5zdGF0dXMgfD0gRkxBR1NfQVZBSUxBQkxFOwkvKiBzZXQgKi8KLQljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX01JRE1fU1RBUlRFRDsJLyogY2xlYXIgKi8KLQotCXJldHVybiAwOwotfQotCi0vKiBBZGRzIE1JREkgYnVmZmVyIHRvIGxvY2FsIHF1ZXVlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotaW50IGVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgc3RydWN0IG1pZGlfaGRyICptaWRpaGRyKQotewotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdWluX2FkZF9idWZmZXIoKVxuIik7Ci0KLQkvKiBVcGRhdGUgTUlESSBidWZmZXIgZmxhZ3MgKi8KLQltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0lOUVVFVUU7CS8qIHNldCAqLwotCW1pZGloZHItPmZsYWdzICY9IH5NSURJQlVGX0RPTkU7CS8qIGNsZWFyICovCi0KLQlpZiAoKG1pZGlxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfcXVldWUpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotCQkvKiBNZXNzYWdlIGxvc3QgKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotCW1pZGlxLT5uZXh0ID0gTlVMTDsKLQltaWRpcS0+cXR5cGUgPSAxOwotCW1pZGlxLT5sZW5ndGggPSBtaWRpaGRyLT5idWZmZXJsZW5ndGg7Ci0JbWlkaXEtPnNpemVMZWZ0ID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOwotCW1pZGlxLT5taWRpYnl0ZSA9IG1pZGloZHItPmRhdGE7Ci0JbWlkaXEtPnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaWhkcjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKSB7Ci0JCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcTsKLQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gbWlkaXE7Ci0JfSBlbHNlIHsKLQkJKGNhcmRfbXB1aW4tPmxhc3RtaWRpcSktPm5leHQgPSBtaWRpcTsKLQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gbWlkaXE7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZpcnN0IHNldCB0aGUgVGltZSBTdGFtcCBpZiBNSURJIElOIGhhcyBub3Qgc3RhcnRlZC4gICAgICAgICAqLwotCi0vKiBUaGVuIGVuYWJsZSBSWCBJcnEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotaW50IGVtdTEwazFfbXB1aW5fc3RhcnQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOwotCXU4IGR1bW15OwotCi0JRFBGKDIsICJlbXUxMGsxX21wdWluX3N0YXJ0KClcbiIpOwotCi0JLyogU2V0IHRpbWVzdGFtcCBpZiBub3Qgc2V0ICovCi0JaWYgKGNhcmRfbXB1aW4tPnN0YXR1cyAmIEZMQUdTX01JRE1fU1RBUlRFRCkgewotCQlEUEYoMiwgIlRpbWUgU3RhbXAgbm90IGNoYW5nZWRcbiIpOwotCX0gZWxzZSB7Ci0JCXdoaWxlICghZW11MTBrMV9tcHVfcmVhZF9kYXRhKGNhcmQsICZkdW1teSkpOwotCi0JCWNhcmRfbXB1aW4tPnN0YXR1cyB8PSBGTEFHU19NSURNX1NUQVJURUQ7CS8qIHNldCAqLwotCi0JCS8qIFNldCBuZXcgdGltZSBzdGFtcCAqLwotCQljYXJkX21wdWluLT50aW1lc3RhcnQgPSAoamlmZmllcyAqIDEwMDApIC8gSFo7Ci0JCURQRCgyLCAiTmV3IFRpbWUgU3RhbXAgPSAlZFxuIiwgY2FyZF9tcHVpbi0+dGltZXN0YXJ0KTsKLQotCQljYXJkX21wdWluLT5xaGVhZCA9IDA7Ci0JCWNhcmRfbXB1aW4tPnF0YWlsID0gMDsKLQotCQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRGlzYWJsZSB0aGUgUlggSXJxLiAgSWYgYSBwYXJ0aWFsIHJlY29yZGVkIGJ1ZmZlciAgICAgICAgICAgICovCi0KLS8qIGV4aXN0LCBzZW5kIGl0IHVwIHRvIElNSURJIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1pbnQgZW11MTBrMV9tcHVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9zdG9wKClcbiIpOwotCi0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOwotCi0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7CS8qIGNsZWFyICovCi0KLQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQkJaWYgKG1pZGlxICE9IE5VTEwpIHsKLQkJCWlmIChtaWRpcS0+c2l6ZUxlZnQgPT0gbWlkaXEtPmxlbmd0aCkKLQkJCQltaWRpcSA9IE5VTEw7Ci0JCQllbHNlIHsKLQkJCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0JCQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkKLQkJCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQkJCX0KLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAobWlkaXEpIHsKLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0VSUk9SLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOwotCQkJa2ZyZWUobWlkaXEpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIERpc2FibGUgdGhlIFJYIElycS4gIElmIGFueSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBleGlzdCwgc2VuZCBpdCB1cCB0byBJTUlESSBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLWludCBlbXUxMGsxX21wdWluX3Jlc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fcmVzZXQoKVxuIik7Ci0KLQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7Ci0KLQl3aGlsZSAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQotCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IG1pZGlxLT5sZW5ndGgpCi0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdEQVRBLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOwotCQllbHNlCi0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQotCQlrZnJlZShtaWRpcSk7Ci0JfQotCi0JY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX01JRE1fU1RBUlRFRDsKLQotCXJldHVybiAwOwotfQotCi0vKiBQYXNzZXMgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQgICAgICAgICAgKi8KLQotLyogdmlhIElSUSAmIERQQyBjYWxsYmFja3MgdG8gUmluZyAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50IGVtdTEwazFfbXB1aW5fY2FsbGJhY2soc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHUzMiBtc2csIHVuc2lnbmVkIGxvbmcgZGF0YSwgdTMyIGJ5dGVzdmFsaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0aW1laW47Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCXVuc2lnbmVkIGxvbmcgY2FsbGJhY2tfbXNnWzNdOwotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQotCS8qIENhbGxlZCBkdXJpbmcgSVNSLiBUaGUgZGF0YSAmIGNvZGUgdG91Y2hlZCBhcmU6Ci0JICogMS4gY2FyZF9tcHVpbgotCSAqIDIuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLQkgKi8KLQotCXRpbWVpbiA9IGNhcmRfbXB1aW4tPnRpbWVpbjsKLQlpZiAoY2FyZF9tcHVpbi0+dGltZXN0YXJ0IDw9IHRpbWVpbikKLQkJY2FsbGJhY2tfbXNnWzBdID0gdGltZWluIC0gY2FyZF9tcHVpbi0+dGltZXN0YXJ0OwotCWVsc2UKLQkJY2FsbGJhY2tfbXNnWzBdID0gKH4weDBMIC0gY2FyZF9tcHVpbi0+dGltZXN0YXJ0KSArIHRpbWVpbjsKLQotCWlmIChtc2cgPT0gSUNBUkRNSURJX0lOREFUQSB8fCBtc2cgPT0gSUNBUkRNSURJX0lOREFUQUVSUk9SKSB7Ci0JCWNhbGxiYWNrX21zZ1sxXSA9IGRhdGE7Ci0JCWNhbGxiYWNrX21zZ1syXSA9IGJ5dGVzdmFsaWQ7Ci0JCURQRCgyLCAiZW11MTBrMV9tcHVpbl9jYWxsYmFjazogbWlkaW1zZyA9ICUjbHhcbiIsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCW1pZGlxID0gKHN0cnVjdCBtaWRpX3F1ZXVlICopIGRhdGE7Ci0JCW1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIG1pZGlxLT5yZWZkYXRhOwotCi0JCWNhbGxiYWNrX21zZ1sxXSA9IG1pZGlxLT5sZW5ndGggLSBtaWRpcS0+c2l6ZUxlZnQ7Ci0JCWNhbGxiYWNrX21zZ1syXSA9IG1pZGlxLT5yZWZkYXRhOwotCQltaWRpaGRyLT5mbGFncyAmPSB+TUlESUJVRl9JTlFVRVVFOwotCQltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0RPTkU7Ci0KLQkJbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IG1pZGlxLT5sZW5ndGggLSBtaWRpcS0+c2l6ZUxlZnQ7Ci0JfQotCi0JLyogTm90aWZ5IGNsaWVudCB0aGF0IFN5c2V4IGJ1ZmZlciBoYXMgYmVlbiBzZW50ICovCi0JZW11MTBrMV9taWRpX2NhbGxiYWNrKG1zZywgY2FyZF9tcHVpbi0+b3BlbmluZm8ucmVmZGF0YSwgY2FsbGJhY2tfbXNnKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfbXB1aW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQotewotCXU4IGRhdGE7Ci0JdW5zaWduZWQgaWR4OwotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gKHN0cnVjdCBlbXUxMGsxX21wdWluICopIHJlZmRhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXdoaWxlIChjYXJkX21wdWluLT5xaGVhZCAhPSBjYXJkX21wdWluLT5xdGFpbCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCQlpZHggPSBjYXJkX21wdWluLT5xaGVhZDsKLQkJZGF0YSA9IGNhcmRfbXB1aW4tPm1pZGlxW2lkeF0uZGF0YTsKLQkJY2FyZF9tcHVpbi0+dGltZWluID0gY2FyZF9tcHVpbi0+bWlkaXFbaWR4XS50aW1laW47Ci0JCWlkeCA9IChpZHggKyAxKSAlIE1JRElJTl9NQVhfQlVGRkVSX1NJWkU7Ci0JCWNhcmRfbXB1aW4tPnFoZWFkID0gaWR4OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJc2JsaXZlX21pU3RhdGVFbnRyeShjYXJkX21wdWluLCBkYXRhKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qIElSUSBjYWxsYmFjayBoYW5kbGVyIHJvdXRpbmUgZm9yIHRoZSBNUFUgaW4gcG9ydCAqLwotCi1pbnQgZW11MTBrMV9tcHVpbl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdW5zaWduZWQgaWR4OwotCXVuc2lnbmVkIGNvdW50OwotCXU4IE1QVUl2YWx1ZTsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOwotCi0JLyogSVJRIHNlcnZpY2Ugcm91dGluZS4gVGhlIGRhdGEgYW5kIGNvZGUgdG91Y2hlZCBhcmU6Ci0JICogMS4gY2FyZF9tcHVpbgotCSAqLwotCi0JY291bnQgPSAwOwotCWlkeCA9IGNhcmRfbXB1aW4tPnF0YWlsOwotCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKGVtdTEwazFfbXB1X3JlYWRfZGF0YShjYXJkLCAmTVBVSXZhbHVlKSA8IDApIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJKytjb3VudDsKLQkJCWNhcmRfbXB1aW4tPm1pZGlxW2lkeF0uZGF0YSA9IE1QVUl2YWx1ZTsKLQkJCWNhcmRfbXB1aW4tPm1pZGlxW2lkeF0udGltZWluID0gKGppZmZpZXMgKiAxMDAwKSAvIEhaOwotCQkJaWR4ID0gKGlkeCArIDEpICUgTUlESUlOX01BWF9CVUZGRVJfU0laRTsKLQkJfQotCX0KLQotCWlmIChjb3VudCkgewotCQljYXJkX21wdWluLT5xdGFpbCA9IGlkeDsKLQotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjYXJkX21wdWluLT50YXNrbGV0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAgIFN1cHBvcnRpbmcgZnVuY3Rpb25zIGZvciBNaWRpLUluIEludGVycHJldGF0aW9uIFN0YXRlIE1hY2hpbmUgICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gKi8KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVJbml0KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluKQotewotCWNhcmRfbXB1aW4tPnN0YXR1cyA9IDA7CS8qIEZvciBNSURJIHJ1bm5pbmcgc3RhdHVzICovCi0JY2FyZF9tcHVpbi0+ZnN0YXR1cyA9IDA7CS8qIEZvciAweEZuIHN0YXR1cyBvbmx5ICovCi0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOwotCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IFNUSU5fUEFSU0U7Ci0JY2FyZF9tcHVpbi0+ZGF0YSA9IDA7Ci0JY2FyZF9tcHVpbi0+dGltZXN0YXJ0ID0gMDsKLQljYXJkX21wdWluLT50aW1laW4gPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvICovCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlRW50cnkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JcmV0dXJuIG1pZGlzdGF0ZWZuW2NhcmRfbXB1aW4tPmN1cnN0YXRlXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVBhcnNlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXN3aXRjaCAoZGF0YSAmIDB4ZjApIHsKLQljYXNlIDB4ODA6Ci0JY2FzZSAweDkwOgotCWNhc2UgMHhBMDoKLQljYXNlIDB4QjA6Ci0JY2FzZSAweEUwOgotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEU7Ci0JCWJyZWFrOwotCi0JY2FzZSAweEMwOgotCWNhc2UgMHhEMDoKLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzJCWVRFOwotCQlicmVhazsKLQotCWNhc2UgMHhGMDoKLQkJLyogU3lzdGVtIG1lc3NhZ2VzIGRvIG5vdCBhZmZlY3QgdGhlIHByZXZpb3VzIHJ1bm5pbmcgc3RhdHVzISAqLwotCQlzd2l0Y2ggKGRhdGEgJiAweDBmKSB7Ci0JCWNhc2UgMHgwOgotCQkJY2FyZF9tcHVpbi0+bGFzdHN0YXRlID0gY2FyZF9tcHVpbi0+Y3Vyc3RhdGU7Ci0JCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0VYX05PUk07Ci0KLQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JCQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCQkJCSptaWRpcS0+bWlkaWJ5dGUgPSBkYXRhOwotCQkJCS0tbWlkaXEtPnNpemVMZWZ0OwotCQkJCSsrbWlkaXEtPm1pZGlieXRlOwotCQkJfQotCi0JCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotCi0JCWNhc2UgMHg3OgotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIDB4ZjcsIDApOwotCQkJcmV0dXJuIC0xOwotCi0JCWNhc2UgMHgyOgotCQkJY2FyZF9tcHVpbi0+bGFzdHN0YXRlID0gY2FyZF9tcHVpbi0+Y3Vyc3RhdGU7Ci0JCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8zOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDE6Ci0JCWNhc2UgMHgzOgotCQkJY2FyZF9tcHVpbi0+bGFzdHN0YXRlID0gY2FyZF9tcHVpbi0+Y3Vyc3RhdGU7Ci0JCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8yOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qIGluY2x1ZGVzIDB4RjQgLSAweEY2LCAweEY4IC0gMHhGRiAqLwotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlEUEYoMiwgIkJVRzogZGVmYXVsdCBjYXNlIGhpdFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gbWlkaXN0YXRlZm5bY2FyZF9tcHVpbi0+Y3Vyc3RhdGVdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JdTggdGVtcCA9IGRhdGEgJiAweGYwOwotCi0JaWYgKHRlbXAgPCAweDgwKSB7Ci0JCXJldHVybiBtaWRpc3RhdGVmbltTVElOXzNCWVRFX0tFWV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0JfSBlbHNlIGlmICh0ZW1wIDw9IDB4ZTAgJiYgdGVtcCAhPSAweGMwICYmIHRlbXAgIT0gMHhkMCkgewotCQljYXJkX21wdWluLT5zdGF0dXMgPSBkYXRhOwotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEVfS0VZOwotCi0JCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci0JfQotCi0JcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fUEFSU0VdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi0vKiBieXRlIDEgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXRhID4gMHg3ZikgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgZGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7Ci0JCXRtcCA9ICgodW5zaWduZWQgbG9uZykgZGF0YSkgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmRhdGEgPSBkYXRhOwotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8zQllURV9WRUw7Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVWZWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi0vKiBieXRlIDIgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXRhID4gMHg3ZikgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgZGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7Ci0JCXRtcCA9ICgodW5zaWduZWQgbG9uZykgZGF0YSkgPDwgODsKLQkJdG1wIHw9IGNhcmRfbXB1aW4tPmRhdGE7Ci0JCXRtcCA9IHRtcCA8PCA4OwotCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFOwotCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCXRtcCA9IHRtcCA8PCA4OwotCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKLQotCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JdTggdGVtcCA9IGRhdGEgJiAweGYwOwotCi0JaWYgKCh0ZW1wID09IDB4YzApIHx8ICh0ZW1wID09IDB4ZDApKSB7Ci0JCWNhcmRfbXB1aW4tPnN0YXR1cyA9IGRhdGE7Ci0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURV9LRVk7Ci0KLQkJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLQl9Ci0KLQlpZiAodGVtcCA8IDB4ODApCi0JCXJldHVybiBtaWRpc3RhdGVmbltTVElOXzJCWVRFX0tFWV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9QQVJTRV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUyQnl0ZUtleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMSAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9QQVJTRTsKLQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JCXRtcCA9IHRtcCA8PCA4OwotCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzJCWVRFOwotCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCXRtcCA9IHRtcCA8PCA4OwotCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOwotCi0JZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCB0bXAsIDIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCWNhcmRfbXB1aW4tPmZzdGF0dXMgPSBkYXRhOwotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9TWVNfQ09NTU9OXzJfS0VZOwotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi0vKiBieXRlIDEgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXRhID4gMHg3ZikgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgZGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JCXRtcCA9IHRtcCA8PCA4OwotCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCXRtcCA9IHRtcCA8PCA4OwotCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMyhzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQljYXJkX21wdWluLT5mc3RhdHVzID0gZGF0YTsKLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8zX0tFWTsKLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAxICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0JCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5kYXRhID0gZGF0YTsKLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8zX1ZFTDsKLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAyICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0JCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5kYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOwotCi0JZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCB0bXAsIDMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNFeE5vcm0oc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoZGF0YSA+IDB4N2YpICYmIChkYXRhICE9IDB4ZjcpKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBEYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCi0JCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0KLQkJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQkJCSptaWRpcS0+bWlkaWJ5dGUgPSBkYXRhOwotCQkJLS1taWRpcS0+c2l6ZUxlZnQ7Ci0JCQkrK21pZGlxLT5taWRpYnl0ZTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkKLQkJCQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0VSUk9SLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOwotCi0JCQlrZnJlZShtaWRpcSk7Ci0JCX0KLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQkJKm1pZGlxLT5taWRpYnl0ZSA9IGRhdGE7Ci0JCS0tbWlkaXEtPnNpemVMZWZ0OwotCQkrK21pZGlxLT5taWRpYnl0ZTsKLQl9Ci0KLQlpZiAoZGF0YSA9PSAweGY3KSB7Ci0JCS8qIEVuZCBvZiBTeXNleCBidWZmZXIgKi8KLQkJLyogU2VuZCBkb3duIHRoZSBidWZmZXIgKi8KLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQotCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCi0JCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdEQVRBLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOwotCi0JCQlrZnJlZShtaWRpcSk7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0KLQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCi0JCWlmIChtaWRpcS0+c2l6ZUxlZnQgPT0gMCkgewotCQkJLyogU3BlY2lhbCBjYXNlICovCi0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCi0JCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdEQVRBLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOwotCi0JCQlrZnJlZShtaWRpcSk7Ci0KLQkJCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzUmVhbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIGRhdGEsIDEpOwotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMmMyNDEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBzYmxpdmVfbWkuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9DQVJETUlfSAotI2RlZmluZSBfQ0FSRE1JX0gKLQotI2luY2x1ZGUgImljYXJkbWlkLmgiCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLXR5cGVkZWYgZW51bQotewotCVNUSU5fUEFSU0UgPSAwLAotCVNUSU5fM0JZVEUsICAgICAgICAgICAgICAgICAgICAgLyogMHg4MCwgMHg5MCwgMHhBMCwgMHhCMCwgMHhFMCAqLwotCVNUSU5fM0JZVEVfS0VZLCAgICAgICAgICAgICAgICAgLyogQnl0ZSAxICovCi0JU1RJTl8zQllURV9WRUwsICAgICAgICAgICAgICAgICAvKiBCeXRlIDEgKi8KLQlTVElOXzJCWVRFLCAgICAgICAgICAgICAgICAgICAgIC8qIDB4QzAsIDB4RDAgKi8KLQlTVElOXzJCWVRFX0tFWSwgICAgICAgICAgICAgICAgIC8qIEJ5dGUgMSAqLwotCVNUSU5fU1lTX0NPTU1PTl8yLCAgICAgICAgICAgICAgLyogMHhGMSwgMHhGMyAgKi8KLQlTVElOX1NZU19DT01NT05fMl9LRVksCi0JU1RJTl9TWVNfQ09NTU9OXzMsICAgICAgICAgICAgICAvKiAweEYyICovCi0JU1RJTl9TWVNfQ09NTU9OXzNfS0VZLAotCVNUSU5fU1lTX0NPTU1PTl8zX1ZFTCwKLQlTVElOX1NZU19FWF9OT1JNLCAgICAgICAgICAgICAgIC8qIDB4RjAsIE5vcm1hbCBtb2RlICovCi0JU1RJTl9TWVNfUkVBTAotfSBtaWRpX2luX3N0YXRlOwotCi0KLS8qIGZsYWdzIGZvciBjYXJkIE1JREkgaW4gb2JqZWN0ICovCi0jZGVmaW5lIEZMQUdTX01JRE1fU1RBUlRFRCAgICAgICAgICAweDAwMDAxMDAwICAgICAgLy8gRGF0YSBoYXMgc3RhcnRlZCB0byBjb21lIGluIGFmdGVyIE1pZG0gU3RhcnQKLSNkZWZpbmUgTUlESUlOX01BWF9CVUZGRVJfU0laRSAgICAgIDIwMCAgICAgICAgICAgICAvLyBEZWZpbml0aW9uIGZvciBzdHJ1Y3QgZW11MTBrMV9tcHVpbgotCi1zdHJ1Y3QgbWlkaV9kYXRhCi17Ci0JdTggZGF0YTsKLQl1MzIgdGltZWluOwotfTsKLQotc3RydWN0IGVtdTEwazFfbXB1aW4KLXsKLQlzcGlubG9ja190ICAgICAgICBsb2NrOwotCXN0cnVjdCBtaWRpX3F1ZXVlICpmaXJzdG1pZGlxOwotCXN0cnVjdCBtaWRpX3F1ZXVlICpsYXN0bWlkaXE7Ci0JdW5zaWduZWQgICAgICAgICAgcWhlYWQsIHF0YWlsOwotCXN0cnVjdCBtaWRpX2RhdGEgIG1pZGlxW01JRElJTl9NQVhfQlVGRkVSX1NJWkVdOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwotCXN0cnVjdCBtaWRpX29wZW5pbmZvICAgIG9wZW5pbmZvOwotCi0JLyogRm9yIE1JREkgc3RhdGUgbWFjaGluZSAqLwotCXU4ICAgICAgICAgICAgICBzdGF0dXM7ICAgICAgICAvKiBGb3IgTUlESSBydW5uaW5nIHN0YXR1cyAqLwotCXU4ICAgICAgICAgICAgICBmc3RhdHVzOyAgICAgICAvKiBGb3IgMHhGbiBzdGF0dXMgb25seSAqLwotCW1pZGlfaW5fc3RhdGUgICBjdXJzdGF0ZTsKLQltaWRpX2luX3N0YXRlICAgbGFzdHN0YXRlOwotCXUzMiAgICAgICAgICAgICB0aW1lc3RhcnQ7Ci0JdTMyICAgICAgICAgICAgIHRpbWVpbjsKLQl1OCAgICAgICAgICAgICAgZGF0YTsKLX07Ci0KLWludCBlbXUxMGsxX21wdWluX29wZW4oc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAqKTsKLWludCBlbXUxMGsxX21wdWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci1pbnQgZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHN0cnVjdCBtaWRpX2hkciAqKTsKLWludCBlbXUxMGsxX21wdWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci1pbnQgZW11MTBrMV9tcHVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci1pbnQgZW11MTBrMV9tcHVpbl9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotCi1pbnQgZW11MTBrMV9tcHVpbl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci12b2lkIGVtdTEwazFfbXB1aW5fYmgodW5zaWduZWQgbG9uZyk7Ci0KLSNlbmRpZiAgLyogX0NBUkRNSV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGNjNzVkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZG1vLmMgLSBNSURJIFVBUlQgb3V0cHV0IEhBTCBmb3IgZW11MTBrMSBkcml2ZXIgCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImNhcmRtby5oIgotI2luY2x1ZGUgImlycW1nci5oIgotCi0vKiBJbnN0YWxscyB0aGUgSVJRIGhhbmRsZXIgZm9yIHRoZSBNUFUgb3V0IHBvcnQgICAgICAgICAgICAgICAqCi0gKiBhbmQgaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotaW50IGVtdTEwazFfbXB1b3V0X29wZW4oc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IG1pZGlfb3BlbmluZm8gKm9wZW5pbmZvKQotewotCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1b3V0X29wZW4oKVxuIik7Ci0KLQlpZiAoIShjYXJkX21wdW91dC0+c3RhdHVzICYgRkxBR1NfQVZBSUxBQkxFKSkKLQkJcmV0dXJuIC0xOwotCi0JLyogQ29weSBvcGVuIGluZm8gYW5kIG1hcmsgY2hhbm5lbCBhcyBpbiB1c2UgKi8KLQljYXJkX21wdW91dC0+aW50ciA9IDA7Ci0JY2FyZF9tcHVvdXQtPm9wZW5pbmZvID0gKm9wZW5pbmZvOwotCWNhcmRfbXB1b3V0LT5zdGF0dXMgJj0gfkZMQUdTX0FWQUlMQUJMRTsKLQljYXJkX21wdW91dC0+bGFzdHN0YXR1cyA9IDB4ODA7Ci0JY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPSBOVUxMOwotCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBOVUxMOwotCi0JZW11MTBrMV9tcHVfcmVzZXQoY2FyZCk7Ci0JZW11MTBrMV9tcHVfYWNxdWlyZShjYXJkKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV9tcHVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9tcHVvdXRfY2xvc2UoKVxuIik7Ci0KLQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJVFhFTkFCTEUgOiBJTlRFX01JRElUWEVOQUJMRSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSAhPSBOVUxMKSB7Ci0JCW1pZGlxID0gY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXE7Ci0JCW1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIG1pZGlxLT5yZWZkYXRhOwotCi0JCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0KLQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlrZnJlZShtaWRpcSk7Ci0JfQotCi0JY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQllbXUxMGsxX21wdV9yZWxlYXNlKGNhcmQpOwotCi0JY2FyZF9tcHVvdXQtPnN0YXR1cyB8PSBGTEFHU19BVkFJTEFCTEU7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHRoZXJlIGlzbid0IGVub3VnaCBidWZmZXIgc3BhY2UsIHJlamVjdCBNaWRpIEJ1ZmZlci4gICAgICoKLSogT3RoZXJ3aXNlLCBkaXNhYmxlIFRYLCBjcmVhdGUgb2JqZWN0IHRvIGhvbGQgTWlkaSAgICAgICAgICAgICoKLSogIHVmZmVyLCB1cGRhdGUgYnVmZmVyIGZsYWdzIGFuZCBvdGhlciBwYXJhbWV0ZXJzICAgICAgICAgICAgICoKLSogYmVmb3JlIGVuYWJsaW5nIFRYIGFnYWluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKClcbiIpOwotCi0JaWYgKGNhcmRfbXB1b3V0LT5zdGF0ZSA9PSBDQVJETUlESU9VVF9TVEFURV9TVVNQRU5EKQotCQlyZXR1cm4gMDsKLQotCW1pZGloZHItPmZsYWdzIHw9IE1JRElCVUZfSU5RVUVVRTsKLQltaWRpaGRyLT5mbGFncyAmPSB+TUlESUJVRl9ET05FOwotCi0JaWYgKChtaWRpcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX3F1ZXVlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJLyogTWVzc2FnZSBsb3N0ICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQltaWRpcS0+bmV4dCA9IE5VTEw7Ci0JbWlkaXEtPnF0eXBlID0gMTsKLQltaWRpcS0+bGVuZ3RoID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOwotCW1pZGlxLT5zaXplTGVmdCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKLQltaWRpcS0+bWlkaWJ5dGUgPSBtaWRpaGRyLT5kYXRhOwotCi0JbWlkaXEtPnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaWhkcjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID09IE5VTEwpIHsKLQkJY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPSBtaWRpcTsKLQkJY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IG1pZGlxOwotCX0gZWxzZSB7Ci0JCShjYXJkX21wdW91dC0+bGFzdG1pZGlxKS0+bmV4dCA9IG1pZGlxOwotCQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gbWlkaXE7Ci0JfQotCi0JY2FyZF9tcHVvdXQtPmludHIgPSAwOwotCi0JZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJVFhFTkFCTEUgOiBJTlRFX01JRElUWEVOQUJMRSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV9tcHVvdXRfYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSAoc3RydWN0IGVtdTEwazFfY2FyZCAqKSByZWZkYXRhOwotCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7Ci0JaW50IGNCeXRlU2VudCA9IDA7Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCXN0cnVjdCBtaWRpX3F1ZXVlICpkb25lcSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpIHsKLQkJbWlkaXEgPSBjYXJkX21wdW91dC0+Zmlyc3RtaWRpcTsKLQotCQl3aGlsZSAoY0J5dGVTZW50IDwgNCAmJiBtaWRpcS0+c2l6ZUxlZnQpIHsKLQkJCWlmIChlbXUxMGsxX21wdV93cml0ZV9kYXRhKGNhcmQsICptaWRpcS0+bWlkaWJ5dGUpIDwgMCkgewotCQkJCURQRigyLCAiZW11MTBrMV9tcHVvdXREcGNDYWxsYmFjayBlcnJvciEhXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKytjQnl0ZVNlbnQ7Ci0JCQkJLS1taWRpcS0+c2l6ZUxlZnQ7Ci0JCQkJKyttaWRpcS0+bWlkaWJ5dGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IDApIHsKLQkJCWlmIChkb25lcSA9PSBOVUxMKQotCQkJCWRvbmVxID0gbWlkaXE7Ci0JCQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCQl9IGVsc2UKLQkJCWJyZWFrOwotCX0KLQotCWlmIChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9PSBOVUxMKQotCQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gTlVMTDsKLQotCWlmIChkb25lcSAhPSBOVUxMKSB7Ci0JCXdoaWxlIChkb25lcSAhPSBjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSkgewotCQkJdW5zaWduZWQgbG9uZyBjYWxsYmFja19tc2dbM107Ci0KLQkJCW1pZGlxID0gZG9uZXE7Ci0JCQlkb25lcSA9IG1pZGlxLT5uZXh0OwotCi0JCQlpZiAobWlkaXEtPnF0eXBlKSB7Ci0JCQkJY2FsbGJhY2tfbXNnWzBdID0gMDsKLQkJCQljYWxsYmFja19tc2dbMV0gPSBtaWRpcS0+bGVuZ3RoOwotCQkJCWNhbGxiYWNrX21zZ1syXSA9IG1pZGlxLT5yZWZkYXRhOwotCi0JCQkJZW11MTBrMV9taWRpX2NhbGxiYWNrKElDQVJETUlESV9PVVRMT05HREFUQSwgY2FyZF9tcHVvdXQtPm9wZW5pbmZvLnJlZmRhdGEsIGNhbGxiYWNrX21zZyk7Ci0JCQl9IGVsc2UgaWYgKCgodTgpIG1pZGlxLT5yZWZkYXRhKSA8IDB4RjAgJiYgKCh1OCkgbWlkaXEtPnJlZmRhdGEpID4gMHg3RikKLQkJCQljYXJkX21wdW91dC0+bGFzdHN0YXR1cyA9ICh1OCkgbWlkaXEtPnJlZmRhdGE7Ci0KLQkJCWtmcmVlKG1pZGlxKTsKLQkJfQotCX0KLQotCWlmICgoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkgfHwgY0J5dGVTZW50KSB7Ci0JCWNhcmRfbXB1b3V0LT5pbnRyID0gMDsKLQkJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJVFhFTkFCTEUgOiBJTlRFX01JRElUWEVOQUJMRSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotaW50IGVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OwotCi0JRFBGKDQsICJlbXUxMGsxX21wdW91dF9pcnFoYW5kbGVyXG4iKTsKLQotCWNhcmRfbXB1b3V0LT5pbnRyID0gMTsKLQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJVFhFTkFCTEUgOiBJTlRFX01JRElUWEVOQUJMRSk7Ci0KLQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjYXJkX21wdW91dC0+dGFza2xldCk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5oIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjZlYjMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkbW8uaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294CSAgICBjbGVhbmVkIHVwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9DQVJETU9fSAotI2RlZmluZSBfQ0FSRE1PX0gKLQotI2luY2x1ZGUgImljYXJkbWlkLmgiCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNkZWZpbmUgQ0FSRE1JRElPVVRfU1RBVEVfREVGQVVMVCAgICAweDAwMDAwMDAwCi0jZGVmaW5lIENBUkRNSURJT1VUX1NUQVRFX1NVU1BFTkQgICAgMHgwMDAwMDAwMQotCi1zdHJ1Y3QgZW11MTBrMV9tcHVvdXQKLXsKLQl1MzIJCQlzdGF0dXM7Ci0JdTMyCQkJc3RhdGU7Ci0Jdm9sYXRpbGUgaW50CQlpbnRyOwotCXN0cnVjdCBtaWRpX3F1ZXVlCSpmaXJzdG1pZGlxOwotCXN0cnVjdCBtaWRpX3F1ZXVlCSpsYXN0bWlkaXE7Ci0JdTgJCQlsYXN0c3RhdHVzOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJdGFza2xldDsKLQlzcGlubG9ja190CQlsb2NrOwotCXN0cnVjdCBtaWRpX29wZW5pbmZvCW9wZW5pbmZvOwotfTsKLQotaW50IGVtdTEwazFfbXB1b3V0X29wZW4oc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAqKTsKLWludCBlbXUxMGsxX21wdW91dF9jbG9zZShzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgbWlkaV9oZHIgKik7Ci0KLWludCBlbXUxMGsxX21wdW91dF9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci12b2lkIGVtdTEwazFfbXB1b3V0X2JoKHVuc2lnbmVkIGxvbmcpOwotCi0jZW5kaWYgIC8qIF9DQVJETU9fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwZDFiZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkd2kuYyAtIFBDTSBpbnB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAidGltZXIuaCIKLSNpbmNsdWRlICJyZWNtZ3IuaCIKLSNpbmNsdWRlICJhdWRpby5oIgotI2luY2x1ZGUgImNhcmR3aS5oIgotCi0vKioKLSAqIHF1ZXJ5X2Zvcm1hdCAtIHJldHVybnMgYSB2YWxpZCBzb3VuZCBmb3JtYXQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdmFsaWQgc291bmQgZm9ybWF0IGFzIGNsb3NlCi0gKiB0byB0aGUgcmVxdWVzdGVkIG9uZSBhcyBwb3NzaWJsZS4gCi0gKi8KLXN0YXRpYyB2b2lkIHF1ZXJ5X2Zvcm1hdChpbnQgcmVjc3JjLCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKndhdmVfZm10KQotewotCi0Jc3dpdGNoIChyZWNzcmMpIHsKLQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQotCQlpZiAoKHdhdmVfZm10LT5jaGFubmVscyAhPSAxKSAmJiAod2F2ZV9mbXQtPmNoYW5uZWxzICE9IDIpKQotCQkJd2F2ZV9mbXQtPmNoYW5uZWxzID0gMjsKLQotCQlpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHhCQjgwICsgMHhBQzQ0KSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHhCQjgwOwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweEFDNDQgKyAweDdEMDApIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweEFDNDQ7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4N0QwMCArIDB4NURDMCkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4N0QwMDsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHg1REMwICsgMHg1NjIyKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHg1REMwOwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDU2MjIgKyAweDNFODApIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDU2MjI7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4M0U4MCArIDB4MkIxMSkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4M0U4MDsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHgyQjExICsgMHgxRjQwKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHgyQjExOwotCQllbHNlCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHgxRjQwOwotCi0JCXN3aXRjaCAod2F2ZV9mbXQtPmlkKSB7Ci0JCWNhc2UgQUZNVF9TMTZfTEU6Ci0JCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCWJyZWFrOwotCQljYXNlIEFGTVRfVTg6Ci0JCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSA4OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl3YXZlX2ZtdC0+aWQgPSBBRk1UX1MxNl9MRTsKLQkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJYnJlYWs7Ci0JCX0KLQotCQlicmVhazsKLQotCS8qIHRoZXNlIGNhbid0IGJlIGNoYW5nZWQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzICovCi0JY2FzZSBXQVZFUkVDT1JEX01JQzoKLQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWwgPSB3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPj4gMzsKLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgPSB3YXZlX2ZtdC0+Y2hhbm5lbHMgKiB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOwotCXdhdmVfZm10LT5ieXRlc3BlcnNlYyA9IHdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSAqIHdhdmVfZm10LT5zYW1wbGluZ3JhdGU7Ci0Jd2F2ZV9mbXQtPmJ5dGVzcGVydm9pY2VzYW1wbGUgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGU7Ci19Ci0KLXN0YXRpYyBpbnQgYWxsb2NfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCi17Ci0JYnVmZmVyLT5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgYnVmZmVyLT5zaXplICogYnVmZmVyLT5jb3YsCi0JCQkJCSAgICAmYnVmZmVyLT5kbWFfaGFuZGxlKTsKLQlpZiAoYnVmZmVyLT5hZGRyID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQotewotCWlmIChidWZmZXItPmFkZHIgIT0gTlVMTCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBidWZmZXItPnNpemUgKiBidWZmZXItPmNvdiwKLQkJCQkgICAgYnVmZmVyLT5hZGRyLCBidWZmZXItPmRtYV9oYW5kbGUpOwotfQotCi1pbnQgZW11MTBrMV93YXZlaW5fb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQlzdHJ1Y3Qgd2lpbnN0ICoqd2lpbnN0X3RtcCA9IE5VTEw7Ci0JdTE2IGRlbGF5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZWluX29wZW4oKVxuIik7Ci0KLQlzd2l0Y2ggKHdpaW5zdC0+cmVjc3JjKSB7Ci0JY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0JCXdpaW5zdF90bXAgPSAmY2FyZC0+d2F2ZWluLmFjOTc7Ci0JCWJyZWFrOwotCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCXdpaW5zdF90bXAgPSAmY2FyZC0+d2F2ZWluLm1pYzsKLQkJYnJlYWs7Ci0JY2FzZSBXQVZFUkVDT1JEX0ZYOgotCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5meDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCp3aWluc3RfdG1wICE9IE5VTEwpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JKndpaW5zdF90bXAgPSB3aWluc3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JLyogaGFuZGxlIDggYml0IHJlY29yZGluZyAqLwotCWlmICh3aWluc3QtPmZvcm1hdC5ieXRlc3BlcmNoYW5uZWwgPT0gMSkgewotCQlpZiAod2lpbnN0LT5idWZmZXIuc2l6ZSA+IDB4ODAwMCkgewotCQkJd2lpbnN0LT5idWZmZXIuc2l6ZSA9IDB4ODAwMDsKLQkJCXdpaW5zdC0+YnVmZmVyLnNpemVyZWd2YWwgPSAweDFmOwotCQl9IGVsc2UKLQkJCXdpaW5zdC0+YnVmZmVyLnNpemVyZWd2YWwgKz0gNDsKLQotCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAyOwotCX0gZWxzZQotCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAxOwotCi0JaWYgKGFsbG9jX2J1ZmZlcihjYXJkLCAmd2lpbnN0LT5idWZmZXIpIDwgMCkgewotCQlFUlJPUigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZW11MTBrMV9zZXRfcmVjb3JkX3NyYyhjYXJkLCB3aWluc3QpOwotCi0JZW11MTBrMV9yZXNldF9yZWNvcmQoY2FyZCwgJndpaW5zdC0+YnVmZmVyKTsKLQotCXdpaW5zdC0+YnVmZmVyLmh3X3BvcyA9IDA7Ci0Jd2lpbnN0LT5idWZmZXIucG9zID0gMDsKLQl3aWluc3QtPmJ1ZmZlci5ieXRlc3RvY29weSA9IDA7Ci0KLQlkZWxheSA9ICg0ODAwMCAqIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIC8gd2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWM7Ci0KLQllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndpaW5zdC0+dGltZXIsIGRlbGF5IC8gMik7Ci0KLQl3aWluc3QtPnN0YXRlID0gV0FWRV9TVEFURV9PUEVOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlaW5fY2xvc2Uoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV93YXZlaW5fY2xvc2UoKVxuIik7Ci0KLQllbXUxMGsxX3dhdmVpbl9zdG9wKHdhdmVfZGV2KTsKLQotCWVtdTEwazFfdGltZXJfdW5pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyKTsKLQotCWZyZWVfYnVmZmVyKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCXN3aXRjaCAod2F2ZV9kZXYtPndpaW5zdC0+cmVjc3JjKSB7Ci0JY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0JCWNhcmQtPndhdmVpbi5hYzk3ID0gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQVZFUkVDT1JEX01JQzoKLQkJY2FyZC0+d2F2ZWluLm1pYyA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJY2FyZC0+d2F2ZWluLmZ4ID0gTlVMTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQl3aWluc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlaW5fc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZWluX3N0YXJ0KClcbiIpOwotCi0JZW11MTBrMV9zdGFydF9yZWNvcmQoY2FyZCwgJndpaW5zdC0+YnVmZmVyKTsKLQllbXUxMGsxX3RpbWVyX2VuYWJsZSh3YXZlX2Rldi0+Y2FyZCwgJndpaW5zdC0+dGltZXIpOwotCi0Jd2lpbnN0LT5zdGF0ZSB8PSBXQVZFX1NUQVRFX1NUQVJURUQ7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlaW5fc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQotCURQRigyLCAiZW11MTBrMV93YXZlaW5fc3RvcCgpXG4iKTsKLQotCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKQotCQlyZXR1cm47Ci0KLQllbXUxMGsxX3RpbWVyX2Rpc2FibGUoY2FyZCwgJndpaW5zdC0+dGltZXIpOwotCWVtdTEwazFfc3RvcF9yZWNvcmQoY2FyZCwgJndpaW5zdC0+YnVmZmVyKTsKLQotCXdpaW5zdC0+c3RhdGUgJj0gfldBVkVfU1RBVEVfU1RBUlRFRDsKLX0KLQotaW50IGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldiwgc3RydWN0IHdhdmVfZm9ybWF0ICpmb3JtYXQpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0JdTE2IGRlbGF5OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoKVxuIik7Ci0KLQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJcmV0dXJuIC0xOwotCi0JcXVlcnlfZm9ybWF0KHdpaW5zdC0+cmVjc3JjLCBmb3JtYXQpOwotCi0JaWYgKCh3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgIT0gZm9ybWF0LT5zYW1wbGluZ3JhdGUpCi0JICAgIHx8ICh3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCAhPSBmb3JtYXQtPmJpdHNwZXJjaGFubmVsKQotCSAgICB8fCAod2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgIT0gZm9ybWF0LT5jaGFubmVscykpIHsKLQotCQl3aWluc3QtPmZvcm1hdCA9ICpmb3JtYXQ7Ci0KLQkJaWYgKHdpaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpCi0JCQlyZXR1cm4gMDsKLQotCQl3aWluc3QtPmJ1ZmZlci5zaXplICo9IHdpaW5zdC0+YnVmZmVyLmNvdjsKLQotCQlpZiAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJjaGFubmVsID09IDEpIHsKLQkJCXdpaW5zdC0+YnVmZmVyLmNvdiA9IDI7Ci0JCQl3aWluc3QtPmJ1ZmZlci5zaXplIC89IHdpaW5zdC0+YnVmZmVyLmNvdjsKLQkJfSBlbHNlCi0JCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAxOwotCi0JCWVtdTEwazFfdGltZXJfdW5pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyKTsKLQotCQlkZWxheSA9ICg0ODAwMCAqIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIC8gd2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWM7Ci0KLQkJZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyLCBkZWxheSAvIDIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHN0cnVjdCB3aWluc3QgKndpaW5zdCwgdTMyICogc2l6ZSkKLXsKLQlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOwotCi0JKnNpemUgPSBidWZmZXItPmJ5dGVzdG9jb3B5OwotCi0JaWYgKHdpaW5zdC0+bW1hcHBlZCkKLQkJcmV0dXJuOwotCi0JaWYgKCpzaXplID4gYnVmZmVyLT5zaXplKSB7Ci0JCSpzaXplID0gYnVmZmVyLT5zaXplOwotCQlidWZmZXItPnBvcyA9IGJ1ZmZlci0+aHdfcG9zOwotCQlidWZmZXItPmJ5dGVzdG9jb3B5ID0gYnVmZmVyLT5zaXplOwotCQlEUEYoMSwgImJ1ZmZlciBvdmVycnVuXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9ibG9jayh1OCBfX3VzZXIgKmRzdCwgdTggKiBzcmMsIHUzMiBzdHIsIHUzMiBsZW4sIHU4IGNvdikKLXsKLQlpZiAoY292ID09IDEpIHsKLQkJaWYgKF9fY29weV90b191c2VyKGRzdCwgc3JjICsgc3RyLCBsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfSBlbHNlIHsKLQkJdTggYnl0ZTsKLQkJdTMyIGk7Ci0KLQkJc3JjICs9IDEgKyAyICogc3RyOwotCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJYnl0ZSA9IHNyY1syICogaV0gXiAweDgwOwotCQkJaWYgKF9fY29weV90b191c2VyKGRzdCArIGksICZieXRlLCAxKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV93YXZlaW5feGZlcmRhdGEoc3RydWN0IHdpaW5zdCAqd2lpbnN0LCB1OCBfX3VzZXIgKmRhdGEsIHUzMiAqIHNpemUpCi17Ci0Jc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKLQl1MzIgc2l6ZXRvY29weSwgc2l6ZXRvY29weV9ub3csIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCXNpemV0b2NvcHkgPSBtaW5fdCh1MzIsIGJ1ZmZlci0+c2l6ZSwgKnNpemUpOwotCSpzaXplID0gc2l6ZXRvY29weTsKLQotCWlmICghc2l6ZXRvY29weSkKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0Jc3RhcnQgPSBidWZmZXItPnBvczsKLQlidWZmZXItPnBvcyArPSBzaXpldG9jb3B5OwotCWJ1ZmZlci0+cG9zICU9IGJ1ZmZlci0+c2l6ZTsKLQlidWZmZXItPmJ5dGVzdG9jb3B5IC09IHNpemV0b2NvcHk7Ci0Jc2l6ZXRvY29weV9ub3cgPSBidWZmZXItPnNpemUgLSBzdGFydDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHNpemV0b2NvcHkgPiBzaXpldG9jb3B5X25vdykgewotCQlzaXpldG9jb3B5IC09IHNpemV0b2NvcHlfbm93OwotCi0JCXJldCA9IGNvcHlfYmxvY2soZGF0YSwgYnVmZmVyLT5hZGRyLCBzdGFydCwgc2l6ZXRvY29weV9ub3csCi0JCQkJIGJ1ZmZlci0+Y292KTsKLQkJaWYgKHJldCA9PSAwKQotCQkJcmV0ID0gY29weV9ibG9jayhkYXRhICsgc2l6ZXRvY29weV9ub3csIGJ1ZmZlci0+YWRkciwgMCwKLQkJCQkJIHNpemV0b2NvcHksIGJ1ZmZlci0+Y292KTsKLQl9IGVsc2UgewotCQlyZXQgPSBjb3B5X2Jsb2NrKGRhdGEsIGJ1ZmZlci0+YWRkciwgc3RhcnQsIHNpemV0b2NvcHksCi0JCQkJIGJ1ZmZlci0+Y292KTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpCi17Ci0JdTMyIGh3X3BvczsKLQl1MzIgZGlmZjsKLQotCS8qIFRoZXJlIGlzIG5vIGFjdHVhbCBzdGFydCB5ZXQgKi8KLQlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkgewotCQlod19wb3MgPSB3aWluc3QtPmJ1ZmZlci5od19wb3M7Ci0JfSBlbHNlIHsKLQkJLyogaHdfcG9zIGluIGJ5dGUgdW5pdHMgKi8KLQkJaHdfcG9zID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgd2lpbnN0LT5idWZmZXIuaWR4cmVnLCAwKSAvIHdpaW5zdC0+YnVmZmVyLmNvdjsKLQl9Ci0KLQlkaWZmID0gKHdpaW5zdC0+YnVmZmVyLnNpemUgKyBod19wb3MgLSB3aWluc3QtPmJ1ZmZlci5od19wb3MpICUgd2lpbnN0LT5idWZmZXIuc2l6ZTsKLQl3aWluc3QtPnRvdGFsX3JlY29yZGVkICs9IGRpZmY7Ci0Jd2lpbnN0LT5idWZmZXIuYnl0ZXN0b2NvcHkgKz0gZGlmZjsKLQotCXdpaW5zdC0+YnVmZmVyLmh3X3BvcyA9IGh3X3BvczsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjAyOWIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkd2kuaCAtLSBoZWFkZXIgZmlsZSBmb3IgY2FyZCB3YXZlIGlucHV0IGZ1bmN0aW9ucwotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpZm5kZWYgX0NBUkRXSV9ICi0jZGVmaW5lIF9DQVJEV0lfSAotCi0jaW5jbHVkZSAiaWNhcmR3YXYuaCIKLSNpbmNsdWRlICJhdWRpby5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0KLXN0cnVjdCB3YXZlaW5fYnVmZmVyIHsKLQl1MTYgb3NzZnJhZ3NoaWZ0OwotICAgICAgICB1MzIgZnJhZ21lbnRfc2l6ZTsKLSAgICAgICAgdTMyIG51bWZyYWdzOwotCXUzMiBod19wb3M7CQkvKiBoYXJkd2FyZSBjdXJzb3IgcG9zaXRpb24gKi8KLQl1MzIgcG9zOwkJLyogc29mdHdhcmUgY3Vyc29yIHBvc2l0aW9uICovCi0JdTMyIGJ5dGVzdG9jb3B5OwkvKiBieXRlcyBvZiByZWNvcmRlZCBkYXRhIGF2YWlsYWJsZSAqLwotCXUzMiBzaXplOwotCXUzMiBwYWdlczsKLQl1MzIgc2l6ZXJlZzsKLQl1MzIgc2l6ZXJlZ3ZhbDsKLSAgICAgICAgdTMyIGFkZHJyZWc7Ci0gICAgICAgIHUzMiBpZHhyZWc7Ci0gICAgICAgIHUzMiBhZGNjdGw7Ci0Jdm9pZCAqYWRkcjsKLQl1OCBjb3Y7Ci0JZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwkKLX07Ci0KLXN0cnVjdCB3aWluc3QKLXsKLQl1OCBzdGF0ZTsKLQlzdHJ1Y3QgZW11X3RpbWVyIHRpbWVyOwotCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0Jc3RydWN0IHdhdmVpbl9idWZmZXIgYnVmZmVyOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7Ci0JdTggbW1hcHBlZDsKLQl1MzIgdG90YWxfcmVjb3JkZWQ7CS8qIHRvdGFsIGJ5dGVzIHJlYWQoKSBmcm9tIGRldmljZSAqLwotCXUzMiBibG9ja3M7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXU4IHJlY3NyYzsKLQl1MTYgZnh3YzsKLX07Ci0KLSNkZWZpbmUgV0FWRUlOX01BWEJVRlNJWkUJNjU1MzYKLSNkZWZpbmUgV0FWRUlOX01JTkJVRlNJWkUJMzY4Ci0KLSNkZWZpbmUgV0FWRUlOX0RFRkFVTFRGUkFHTEVOCTEwMCAKLSNkZWZpbmUgV0FWRUlOX0RFRkFVTFRCVUZMRU4JMTAwMAotCi0jZGVmaW5lIFdBVkVJTl9NSU5GUkFHU0hJRlQJOCAKLSNkZWZpbmUgV0FWRUlOX01JTkZSQUdTCQkyCi0KLWludCBlbXUxMGsxX3dhdmVpbl9vcGVuKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUoc3RydWN0IHdpaW5zdCAqLCB1MzIgKik7Ci1pbnQgZW11MTBrMV93YXZlaW5feGZlcmRhdGEoc3RydWN0IHdpaW5zdCAqLCB1OCBfX3VzZXIgKiwgdTMyICopOwotaW50IGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICosIHN0cnVjdCB3YXZlX2Zvcm1hdCAqKTsKLXZvaWQgZW11MTBrMV93YXZlaW5fdXBkYXRlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHdpaW5zdCAqKTsKLQotCi0jZW5kaWYgLyogX0NBUkRXSV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRhY2E0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGNhcmR3by5jIC0gUENNIG91dHB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgInZvaWNlbWdyLmgiCi0jaW5jbHVkZSAiY2FyZHdvLmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLQotc3RhdGljIHUzMiBzYW1wbGVyYXRlX3RvX2xpbmVhcnBpdGNoKHUzMiBzYW1wbGluZ3JhdGUpCi17Ci0Jc2FtcGxpbmdyYXRlID0gKHNhbXBsaW5ncmF0ZSA8PCA4KSAvIDM3NTsKLQlyZXR1cm4gKHNhbXBsaW5ncmF0ZSA+PiAxKSArIChzYW1wbGluZ3JhdGUgJiAxKTsKLX0KLQotc3RhdGljIHZvaWQgcXVlcnlfZm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2LCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKndhdmVfZm10KQotewotCWludCBpLCBqLCBkb19wYXNzdGhyb3VnaCA9IDAsIGlzX2FjMyA9IDA7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0KLQlpZiAoKHdhdmVfZm10LT5jaGFubmVscyA+IDIpICYmICh3YXZlX2ZtdC0+aWQgIT0gQUZNVF9TMTZfTEUpICYmICh3YXZlX2ZtdC0+aWQgIT0gQUZNVF9VOCkpCi0JCXdhdmVfZm10LT5jaGFubmVscyA9IDI7Ci0KLQlpZiAoKHdhdmVfZm10LT5jaGFubmVscyA8IDEpIHx8ICh3YXZlX2ZtdC0+Y2hhbm5lbHMgPiBXQVZFT1VUX01BWFZPSUNFUykpCi0JCXdhdmVfZm10LT5jaGFubmVscyA9IDI7Ci0KLQlpZiAod2F2ZV9mbXQtPmNoYW5uZWxzID09IDIpCi0JCXdvaW5zdC0+bnVtX3ZvaWNlcyA9IDE7Ci0JZWxzZQotCQl3b2luc3QtPm51bV92b2ljZXMgPSB3YXZlX2ZtdC0+Y2hhbm5lbHM7Ci0KLQlpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAweDJlZTAwKQotCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHgyZWUwMDsKLQotCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDA7Ci0JZG9fcGFzc3Rocm91Z2ggPSBpc19hYzMgPSAwOwotCi0JaWYgKGNhcmQtPnB0LnNlbGVjdGVkKQotCQlkb19wYXNzdGhyb3VnaCA9IDE7Ci0KLQlzd2l0Y2ggKHdhdmVfZm10LT5pZCkgewotCWNhc2UgQUZNVF9TMTZfTEU6Ci0JCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQlicmVhazsKLQljYXNlIEFGTVRfVTg6Ci0JCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9BQzM6Ci0JCWRvX3Bhc3N0aHJvdWdoID0gMTsKLQkJaXNfYWMzID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJd2F2ZV9mbXQtPmlkID0gQUZNVF9TMTZfTEU7Ci0JCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQlicmVhazsKLQl9CQotCWlmIChkb19wYXNzdGhyb3VnaCkgewotCQkvKiBjdXJyZW50bHkgb25seSBvbmUgd2F2ZW91dCBpbnN0YW5jZSBtYXkgdXNlIHBhc3MtdGhyb3VnaCAqLwotCQlpZiAod29pbnN0LT5zdGF0ZSAhPSBXQVZFX1NUQVRFX0NMT1NFRCB8fCAKLQkJICAgIGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFIHx8Ci0JCSAgICAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSAhPSA0ODAwMCAmJiAhaXNfYWMzKSkgewotCQkJRFBGKDIsICJ1bmFibGUgdG8gc2V0IHBhc3MtdGhyb3VnaCBtb2RlXG4iKTsKLQkJfSBlbHNlIGlmIChVU0VfUFRfTUVUSE9EMSkgewotCQkJaSA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLCBjYXJkLT5wdC5pbnRyX2dwcl9uYW1lKTsKLQkJCWogPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwgY2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lKTsKLQkJCWlmIChpIDwgMCB8fCBqIDwgMCkKLQkJCQlEUEYoMiwgInVuYWJsZSB0byBzZXQgcGFzcy10aHJvdWdoIG1vZGVcbiIpOwotCQkJZWxzZSB7Ci0JCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDQ4MDAwOwotCQkJCXdhdmVfZm10LT5jaGFubmVscyA9IDI7Ci0JCQkJY2FyZC0+cHQucG9zX2dwciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLAotCQkJCQkJCQkJICAgIGNhcmQtPnB0LnBvc19ncHJfbmFtZSk7Ci0JCQkJd2F2ZV9mbXQtPnBhc3N0aHJvdWdoID0gMTsKLQkJCQljYXJkLT5wdC5pbnRyX2dwciA9IGk7Ci0JCQkJY2FyZC0+cHQuZW5hYmxlX2dwciA9IGo7Ci0JCQkJY2FyZC0+cHQuc3RhdGUgPSBQVF9TVEFURV9JTkFDVElWRTsKLQkJCQotCQkJCURQRCgyLCAiaXNfYWMzIGlzICVkXG4iLCBpc19hYzMpOwotCQkJCWNhcmQtPnB0LmFjM2RhdGEgPSBpc19hYzM7Ci0JCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQl9Ci0JCX1lbHNlewotCQkJRFBGKDIsICJVc2luZyBQYXNzdGhyb3VnaCBNZXRob2QgMlxuIik7Ci0JCQljYXJkLT5wdC5lbmFibGVfZ3ByID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIGNhcmQtPnB0LnBhdGNoX25hbWUsCi0JCQkJCQkJCSAgICAgICBjYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUpOwotCQkJd2F2ZV9mbXQtPnBhc3N0aHJvdWdoID0gMjsKLQkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQl9Ci0JfQotCi0Jd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbCA9IHdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA+PiAzOwotCXdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSA9IHdhdmVfZm10LT5jaGFubmVscyAqIHdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWw7Ci0Jd2F2ZV9mbXQtPmJ5dGVzcGVyc2VjID0gd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlICogd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZTsKLQotCWlmICh3YXZlX2ZtdC0+Y2hhbm5lbHMgPT0gMikKLQkJd2F2ZV9mbXQtPmJ5dGVzcGVydm9pY2VzYW1wbGUgPSB3YXZlX2ZtdC0+Y2hhbm5lbHMgKiB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOwotCWVsc2UKLQkJd2F2ZV9mbXQtPmJ5dGVzcGVydm9pY2VzYW1wbGUgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOwotfQotCi1zdGF0aWMgaW50IGdldF92b2ljZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHVuc2lnbmVkIGludCB2b2ljZW51bSkKLXsKLQlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSA9ICZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXTsKLQotCS8qIEFsbG9jYXRlIHZvaWNlcyBoZXJlLCBpZiBubyB2b2ljZXMgYXZhaWxhYmxlLCByZXR1cm4gZXJyb3IuICovCi0KLQl2b2ljZS0+dXNhZ2UgPSBWT0lDRV9VU0FHRV9QTEFZQkFDSzsKLQotCXZvaWNlLT5mbGFncyA9IDA7Ci0KLQlpZiAod29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgPT0gMikKLQkJdm9pY2UtPmZsYWdzIHw9IFZPSUNFX0ZMQUdTX1NURVJFTzsKLQotCWlmICh3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9PSAxNikKLQkJdm9pY2UtPmZsYWdzIHw9IFZPSUNFX0ZMQUdTXzE2QklUOwotCi0JaWYgKGVtdTEwazFfdm9pY2VfYWxsb2MoY2FyZCwgdm9pY2UpIDwgMCkgewotCQl2b2ljZS0+dXNhZ2UgPSBWT0lDRV9VU0FHRV9GUkVFOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHBpdGNoICovCi0Jdm9pY2UtPmluaXRpYWxfcGl0Y2ggPSAodTE2KSAoc3JUb1BpdGNoKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSkgPj4gOCk7Ci0Jdm9pY2UtPnBpdGNoX3RhcmdldCA9IHNhbXBsZXJhdGVfdG9fbGluZWFycGl0Y2god29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlKTsKLQotCURQRCgyLCAiSW5pdGlhbCBwaXRjaCAtLT4gJSN4XG4iLCB2b2ljZS0+aW5pdGlhbF9waXRjaCk7Ci0KLQl2b2ljZS0+c3RhcnRsb29wID0gKHZvaWNlLT5tZW0uZW11cGFnZWluZGV4IDw8IDEyKSAvCi0JIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0Jdm9pY2UtPmVuZGxvb3AgPSB2b2ljZS0+c3RhcnRsb29wICsgd29pbnN0LT5idWZmZXIuc2l6ZSAvIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0Jdm9pY2UtPnN0YXJ0ID0gdm9pY2UtPnN0YXJ0bG9vcDsKLQotCQotCXZvaWNlLT5wYXJhbXNbMF0udm9sdW1lX3RhcmdldCA9IDB4ZmZmZjsKLQl2b2ljZS0+cGFyYW1zWzBdLmluaXRpYWxfZmMgPSAweGZmOwotCXZvaWNlLT5wYXJhbXNbMF0uaW5pdGlhbF9hdHRuID0gMHgwMDsKLQl2b2ljZS0+cGFyYW1zWzBdLmJ5YW1wbF9lbnZfc3VzdGFpbiA9IDB4N2Y7Ci0Jdm9pY2UtPnBhcmFtc1swXS5ieWFtcGxfZW52X2RlY2F5ID0gMHg3ZjsKLQotCQotCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKLQkJaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDIpIHsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nICA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nICA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BUXTsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYSA9IDB4ZmY7Ci0JCQl2b2ljZS0+cGFyYW1zWzFdLnNlbmRfZGNiYSA9IDB4ZmYwMDsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9oZ2ZlID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2hnZmU9MDsKLQkJfSBlbHNlIHsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9kY2JhID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9MRUZUXTsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9oZ2ZlID0gY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9MRUZUXTsKLQkJCXZvaWNlLT5wYXJhbXNbMV0uc2VuZF9kY2JhID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9SSUdIVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzFdLnNlbmRfaGdmZSA9IGNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfUklHSFRdOwotCi0JCQlpZiAod29pbnN0LT5kZXZpY2UpIHsKLQkJCQkvLyAvZGV2L2RwczEKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ00xXTsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNMV07Ci0JCQl9IGVsc2UgewotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nICA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nICA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV07Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTV07Ci0JCQl9Ci0JCX0KLQkJCi0JCXZvaWNlLT5wYXJhbXNbMV0udm9sdW1lX3RhcmdldCA9IDB4ZmZmZjsKLQkJdm9pY2UtPnBhcmFtc1sxXS5pbml0aWFsX2ZjID0gMHhmZjsKLQkJdm9pY2UtPnBhcmFtc1sxXS5pbml0aWFsX2F0dG4gPSAweDAwOwotCQl2b2ljZS0+cGFyYW1zWzFdLmJ5YW1wbF9lbnZfc3VzdGFpbiA9IDB4N2Y7Ci0JCXZvaWNlLT5wYXJhbXNbMV0uYnlhbXBsX2Vudl9kZWNheSA9IDB4N2Y7Ci0JfSBlbHNlIHsKLQkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpIHsKLQkJCS8vIE11bHRpY2hhbm5lbCBwY20KLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9kY2JhPTB4ZmY7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZT0wOwotCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gMHgzZjNmM2YwMCArIGNhcmQtPm1jaGFubmVsX2Z4ICsgdm9pY2VudW07Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gMHgzZjNmM2YzZjsKLQkJCX0gZWxzZSB7Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgPSAweGZmZjAgKyBjYXJkLT5tY2hhbm5lbF9meCArIHZvaWNlbnVtOwotCQkJfQotCQkJCi0JCX0gZWxzZSB7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTU9OT107Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IGNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTU9OT107Ci0KLQkJCWlmICh3b2luc3QtPmRldmljZSkgewotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV07Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTTFdOwotCQkJfSBlbHNlIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV07Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTV07Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlEUEQoMiwgInZvaWNlOiBzdGFydGxvb3A9JSN4LCBlbmRsb29wPSUjeFxuIiwgdm9pY2UtPnN0YXJ0bG9vcCwgdm9pY2UtPmVuZGxvb3ApOwotCi0JZW11MTBrMV92b2ljZV9wbGF5YmFja19zZXR1cCh2b2ljZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfd2F2ZW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOwotCXVuc2lnbmVkIGludCB2b2ljZW51bTsKLQl1MTYgZGVsYXk7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9vcGVuKClcbiIpOwotCi0JZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZW51bSsrKSB7Ci0JCWlmIChlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlcihjYXJkLCAmd29pbnN0LT52b2ljZVt2b2ljZW51bV0ubWVtLCB3b2luc3QtPmJ1ZmZlci5wYWdlcykgPCAwKSB7Ci0JCQlFUlJPUigpOwotCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmIChnZXRfdm9pY2UoY2FyZCwgd29pbnN0LCB2b2ljZW51bSkgPCAwKSB7Ci0JCQlFUlJPUigpOwotCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCWJ1ZmZlci0+ZmlsbF9zaWxlbmNlID0gMDsKLQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOwotCWJ1ZmZlci0+c2lsZW5jZV9wb3MgPSAwOwotCWJ1ZmZlci0+aHdfcG9zID0gMDsKLQlidWZmZXItPmZyZWVfYnl0ZXMgPSB3b2luc3QtPmJ1ZmZlci5zaXplOwotCi0JZGVsYXkgPSAoNDgwMDAgKiB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvCi0JCSAod29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSk7Ci0KLQllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIsIGRlbGF5KTsKLQotCXdvaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX09QRU47Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0JdW5zaWduZWQgaW50IHZvaWNlbnVtOwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfY2xvc2UoKVxuIik7Ci0KLQllbXUxMGsxX3dhdmVvdXRfc3RvcCh3YXZlX2Rldik7Ci0KLQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd29pbnN0LT50aW1lcik7Ci0KLQlmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlbnVtKyspIHsKLQkJZW11MTBrMV92b2ljZV9mcmVlKCZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXSk7Ci0JCWVtdTEwazFfdm9pY2VfZnJlZV9idWZmZXIoY2FyZCwgJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dLm1lbSk7Ci0JfQotCi0Jd29pbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZW91dF9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9zdGFydCgpXG4iKTsKLQotCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAyKSB7Ci0JCWVtdTEwazFfcHRfc2V0dXAod2F2ZV9kZXYpOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgKGNhcmQtPmlzX2F1ZGlneSA/IEFfR1BSX0JBU0UgOiBHUFJfQkFTRSkgKyBwdC0+ZW5hYmxlX2dwciwgMCwgMSk7Ci0JCXB0LT5zdGF0ZSA9IFBUX1NUQVRFX1BMQVlJTkc7Ci0JfQotCi0JLyogQWN0dWFsIHN0YXJ0ICovCi0JZW11MTBrMV92b2ljZXNfc3RhcnQod29pbnN0LT52b2ljZSwgd29pbnN0LT5udW1fdm9pY2VzLCB3b2luc3QtPnRvdGFsX3BsYXllZCk7Ci0KLQllbXUxMGsxX3RpbWVyX2VuYWJsZShjYXJkLCAmd29pbnN0LT50aW1lcik7Ci0KLQl3b2luc3QtPnN0YXRlIHw9IFdBVkVfU1RBVEVfU1RBUlRFRDsKLX0KLQotaW50IGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHN0cnVjdCB3YXZlX2Zvcm1hdCAqZm9ybWF0KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXVuc2lnbmVkIGludCB2b2ljZW51bTsKLQl1MTYgZGVsYXk7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQoKVxuIik7Ci0KLQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJcmV0dXJuIC0xOwotCi0JcXVlcnlfZm9ybWF0KHdhdmVfZGV2LCBmb3JtYXQpOwotCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAhPSBmb3JtYXQtPnNhbXBsaW5ncmF0ZSB8fAotCSAgICB3b2luc3QtPmZvcm1hdC5jaGFubmVscyAhPSBmb3JtYXQtPmNoYW5uZWxzIHx8Ci0JICAgIHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsICE9IGZvcm1hdC0+Yml0c3BlcmNoYW5uZWwpIHsKLQotCQl3b2luc3QtPmZvcm1hdCA9ICpmb3JtYXQ7Ci0KLQkJaWYgKHdvaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpCi0JCQlyZXR1cm4gMDsKLQotCQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd29pbnN0LT50aW1lcik7Ci0KLQkJZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZW51bSsrKSB7Ci0JCQllbXUxMGsxX3ZvaWNlX2ZyZWUoJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dKTsKLQotCQkJaWYgKGdldF92b2ljZShjYXJkLCB3b2luc3QsIHZvaWNlbnVtKSA8IDApIHsKLQkJCQlFUlJPUigpOwotCQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0KLQkJZGVsYXkgPSAoNDgwMDAgKiB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvCi0JCQkgKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUpOwotCi0JCWVtdTEwazFfdGltZXJfaW5zdGFsbChjYXJkLCAmd29pbnN0LT50aW1lciwgZGVsYXkpOwotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZW91dF9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc3RvcCgpXG4iKTsKLQotCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKQotCQlyZXR1cm47Ci0KLQllbXUxMGsxX3RpbWVyX2Rpc2FibGUoY2FyZCwgJndvaW5zdC0+dGltZXIpOwotCi0JLyogU3RvcCBhY3R1YWwgdm9pY2VzICovCi0JZW11MTBrMV92b2ljZXNfc3RvcCh3b2luc3QtPnZvaWNlLCB3b2luc3QtPm51bV92b2ljZXMpOwotCi0JZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCi0Jd29pbnN0LT5zdGF0ZSAmPSB+V0FWRV9TVEFURV9TVEFSVEVEOwotfQotCi0vKioKLSAqIGVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSAtCi0gKgotICogZ2l2ZXMgdGhlIHRvdGFsIGZyZWUgYnl0ZXMgb24gdGhlIHZvaWNlIGJ1ZmZlciwgaW5jbHVkaW5nIHNpbGVuY2UgYnl0ZXMKLSAqIChiYXNpY2FsbHk6IHRvdGFsX2ZyZWVfYnl0ZXMgPSBmcmVlX2J5dGVzICsgc2lsZW5jZV9ieXRlcykuCi0gKgotICovCi12b2lkIGVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHUzMiAqdG90YWxfZnJlZV9ieXRlcykKLXsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKLQlpbnQgcGVuZGluZ19ieXRlczsKLQotCWlmICh3b2luc3QtPm1tYXBwZWQpIHsKLQkJKnRvdGFsX2ZyZWVfYnl0ZXMgPSBidWZmZXItPmZyZWVfYnl0ZXM7Ci0JCXJldHVybjsKLQl9Ci0KLQlwZW5kaW5nX2J5dGVzID0gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5mcmVlX2J5dGVzOwotCi0JYnVmZmVyLT5maWxsX3NpbGVuY2UgPSAocGVuZGluZ19ieXRlcyA8IChzaWduZWQpIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIDIpID8gMSA6IDA7Ci0KLQlpZiAocGVuZGluZ19ieXRlcyA+IChzaWduZWQpIGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgewotCQkqdG90YWxfZnJlZV9ieXRlcyA9IChidWZmZXItPmZyZWVfYnl0ZXMgKyBidWZmZXItPnNpbGVuY2VfYnl0ZXMpOwotCX0gZWxzZSB7Ci0JCSp0b3RhbF9mcmVlX2J5dGVzID0gYnVmZmVyLT5zaXplOwotCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSBwZW5kaW5nX2J5dGVzOwotCQlpZiAocGVuZGluZ19ieXRlcyA8IDApIHsKLQkJCWJ1ZmZlci0+c2lsZW5jZV9wb3MgPSBidWZmZXItPmh3X3BvczsKLQkJCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyA9IDA7Ci0JCQlidWZmZXItPmZyZWVfYnl0ZXMgPSBidWZmZXItPnNpemU7Ci0JCQlEUEYoMSwgImJ1ZmZlciB1bmRlcnJ1blxuIik7Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogY29weV9ibG9jayAtCi0gKgotICogY29waWVzIGEgYmxvY2sgb2YgcGNtIGRhdGEgdG8gYSB2b2ljZSBidWZmZXIuCi0gKiBOb3RpY2UgdGhhdCB0aGUgdm9pY2UgYnVmZmVyIGlzIGFjdHVhbGx5IGEgc2V0IG9mIGRpc2pvaW50ZWQgbWVtb3J5IHBhZ2VzLgotICoKLSAqLwotc3RhdGljIHZvaWQgY29weV9ibG9jayh2b2lkICoqZHN0LCB1MzIgc3RyLCB1OCBfX3VzZXIgKnNyYywgdTMyIGxlbikKLXsKLQl1bnNpZ25lZCBpbnQgcGc7Ci0JdW5zaWduZWQgaW50IHBnb2ZmOwotCXVuc2lnbmVkIGludCBrOwotCi0JcGcgPSBzdHIgLyBQQUdFX1NJWkU7Ci0JcGdvZmYgPSBzdHIgJSBQQUdFX1NJWkU7Ci0KLQlpZiAobGVuID4gUEFHRV9TSVpFIC0gcGdvZmYpIHsKLQkJayA9IFBBR0VfU0laRSAtIHBnb2ZmOwotCQlpZiAoX19jb3B5X2Zyb21fdXNlcigodTggKilkc3RbcGddICsgcGdvZmYsIHNyYywgaykpCi0JCQlyZXR1cm47Ci0JCWxlbiAtPSBrOwotCQl3aGlsZSAobGVuID4gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoX19jb3B5X2Zyb21fdXNlcihkc3RbKytwZ10sIHNyYyArIGssIFBBR0VfU0laRSkpCi0JCQkJcmV0dXJuOwotCQkJayArPSBQQUdFX1NJWkU7Ci0JCQlsZW4gLT0gUEFHRV9TSVpFOwotCQl9Ci0JCWlmIChfX2NvcHlfZnJvbV91c2VyKGRzdFsrK3BnXSwgc3JjICsgaywgbGVuKSkKLQkJCXJldHVybjsKLQotCX0gZWxzZQotCQlfX2NvcHlfZnJvbV91c2VyKCh1OCAqKWRzdFtwZ10gKyBwZ29mZiwgc3JjLCBsZW4pOwotfQotCi0vKioKLSAqIGNvcHlfaWx2X2Jsb2NrIC0KLSAqCi0gKiBjb3BpZXMgYSBibG9jayBvZiBwY20gZGF0YSBjb250YWluaW5nIG4gaW50ZXJsZWF2ZWQgY2hhbm5lbHMgdG8gbiBtb25vIHZvaWNlIGJ1ZmZlcnMuCi0gKiBOb3RpY2UgdGhhdCB0aGUgdm9pY2UgYnVmZmVyIGlzIGFjdHVhbGx5IGEgc2V0IG9mIGRpc2pvaW50ZWQgbWVtb3J5IHBhZ2VzLgotICoKLSAqLwotc3RhdGljIHZvaWQgY29weV9pbHZfYmxvY2soc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1MzIgc3RyLCB1OCBfX3VzZXIgKnNyYywgdTMyIGxlbikgCi17Ci0gICAgICAgIHVuc2lnbmVkIGludCBwZzsKLQl1bnNpZ25lZCBpbnQgcGdvZmY7Ci0JdW5zaWduZWQgaW50IHZvaWNlX251bTsKLQlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSA9IHdvaW5zdC0+dm9pY2U7Ci0KLQlwZyA9IHN0ciAvIFBBR0VfU0laRTsKLQlwZ29mZiA9IHN0ciAlIFBBR0VfU0laRTsKLQotCXdoaWxlIChsZW4pIHsgCi0JCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykgewotCQkJaWYgKF9fY29weV9mcm9tX3VzZXIoKHU4ICopKHZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddKSArIHBnb2ZmLCBzcmMsIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUpKQotCQkJCXJldHVybjsKLQkJCXNyYyArPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCQl9Ci0KLQkJbGVuIC09IHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0KLQkJcGdvZmYgKz0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQkJaWYgKHBnb2ZmID49IFBBR0VfU0laRSkgewotCQkJcGdvZmYgPSAwOwotCQkJcGcrKzsKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBmaWxsX2Jsb2NrIC0KLSAqCi0gKiBmaWxscyBhIHNldCB2b2ljZSBidWZmZXJzIHdpdGggYSBibG9jayBvZiBhIGdpdmVuIHNhbXBsZS4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGZpbGxfYmxvY2soc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1MzIgc3RyLCB1OCBkYXRhLCB1MzIgbGVuKQotewotCXVuc2lnbmVkIGludCBwZzsKLQl1bnNpZ25lZCBpbnQgcGdvZmY7Ci0JdW5zaWduZWQgaW50IHZvaWNlX251bTsKLSAgICAgICAgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSB3b2luc3QtPnZvaWNlOwotCXVuc2lnbmVkIGludCAgazsKLQotCXBnID0gc3RyIC8gUEFHRV9TSVpFOwotCXBnb2ZmID0gc3RyICUgUEFHRV9TSVpFOwotCi0JaWYgKGxlbiA+IFBBR0VfU0laRSAtIHBnb2ZmKSB7Ci0JCWsgPSBQQUdFX1NJWkUgLSBwZ29mZjsKLQkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKQotCQkJbWVtc2V0KCh1OCAqKXZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddICsgcGdvZmYsIGRhdGEsIGspOwotCQlsZW4gLT0gazsKLQkJd2hpbGUgKGxlbiA+IFBBR0VfU0laRSkgewotCQkJcGcrKzsKLQkJCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQkJCQltZW1zZXQodm9pY2Vbdm9pY2VfbnVtXS5tZW0uYWRkcltwZ10sIGRhdGEsIFBBR0VfU0laRSk7Ci0KLQkJCWxlbiAtPSBQQUdFX1NJWkU7Ci0JCX0KLQkJcGcrKzsKLQkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKQotCQkJbWVtc2V0KHZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddLCBkYXRhLCBsZW4pOwotCi0JfSBlbHNlIHsKLQkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKQotCQkJbWVtc2V0KCh1OCAqKXZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddICsgcGdvZmYsIGRhdGEsIGxlbik7Ci0JfQotfQotCi0vKioKLSAqIGVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YSAtCi0gKgotICogY29waWVzIHBjbSBkYXRhIHRvIHRoZSB2b2ljZSBidWZmZXIuIFNpbGVuY2Ugc2FtcGxlcwotICogcHJldmlvdXNseSBhZGRlZCB0byB0aGUgYnVmZmVyIGFyZSBvdmVyd3JpdHRlbi4KLSAqCi0gKi8KLXZvaWQgZW11MTBrMV93YXZlb3V0X3hmZXJkYXRhKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTggX191c2VyICpkYXRhLCB1MzIgKnNpemUpCi17Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7Ci0Jc3RydWN0IHZvaWNlX21lbSAqbWVtID0gJndvaW5zdC0+dm9pY2VbMF0ubWVtOwotCXUzMiBzaXpldG9jb3B5LCBzaXpldG9jb3B5X25vdywgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNpemV0b2NvcHkgPSBtaW5fdCh1MzIsIGJ1ZmZlci0+c2l6ZSwgKnNpemUpOwotCSpzaXplID0gc2l6ZXRvY29weTsKLQotCWlmICghc2l6ZXRvY29weSkKLQkJcmV0dXJuOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQlzdGFydCA9IChidWZmZXItPnNpemUgKyBidWZmZXItPnNpbGVuY2VfcG9zIC0gYnVmZmVyLT5zaWxlbmNlX2J5dGVzKSAlIGJ1ZmZlci0+c2l6ZTsKLQotCWlmIChzaXpldG9jb3B5ID4gYnVmZmVyLT5zaWxlbmNlX2J5dGVzKSB7Ci0JCWJ1ZmZlci0+c2lsZW5jZV9wb3MgKz0gc2l6ZXRvY29weSAtIGJ1ZmZlci0+c2lsZW5jZV9ieXRlczsKLQkJYnVmZmVyLT5mcmVlX2J5dGVzIC09IHNpemV0b2NvcHkgLSBidWZmZXItPnNpbGVuY2VfYnl0ZXM7Ci0JCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyA9IDA7Ci0JfSBlbHNlCi0JCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyAtPSBzaXpldG9jb3B5OwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlzaXpldG9jb3B5X25vdyA9IGJ1ZmZlci0+c2l6ZSAtIHN0YXJ0OwotCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKLQkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKLQkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpIHsKLQkJCWNvcHlfaWx2X2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHlfbm93KTsKLQkJCWNvcHlfaWx2X2Jsb2NrKHdvaW5zdCwgMCwgZGF0YSArIHNpemV0b2NvcHlfbm93ICogd29pbnN0LT5udW1fdm9pY2VzLCBzaXpldG9jb3B5KTsKLQkJfSBlbHNlIHsKLQkJCWNvcHlfYmxvY2sobWVtLT5hZGRyLCBzdGFydCwgZGF0YSwgc2l6ZXRvY29weV9ub3cpOwotCQkJY29weV9ibG9jayhtZW0tPmFkZHIsIDAsIGRhdGEgKyBzaXpldG9jb3B5X25vdywgc2l6ZXRvY29weSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAod29pbnN0LT5udW1fdm9pY2VzID4gMSkKLQkJCWNvcHlfaWx2X2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHkpOwotCQllbHNlCi0JCQljb3B5X2Jsb2NrKG1lbS0+YWRkciwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHkpOwotCX0KLX0KLQotLyoqCi0gKiBlbXUxMGsxX3dhdmVvdXRfZmlsbHNpbGVuY2UgLQotICoKLSAqIGFkZHMgc2FtcGxlcyBvZiBzaWxlbmNlIHRvIHRoZSB2b2ljZSBidWZmZXIgc28gdGhhdCB3ZQotICogZG9uJ3QgbG9vcCBvdmVyIHN0YWxlIHBjbSBkYXRhLgotICoKLSAqLwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfZmlsbHNpbGVuY2Uoc3RydWN0IHdvaW5zdCAqd29pbnN0KQotewotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOwotCXUzMiBzaXpldG9jb3B5LCBzaXpldG9jb3B5X25vdywgc3RhcnQ7Ci0JdTggZmlsbGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNpemV0b2NvcHkgPSBidWZmZXItPmZyYWdtZW50X3NpemU7Ci0KLQlpZiAod29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPT0gMTYpCi0JCWZpbGxkYXRhID0gMHgwMDsKLQllbHNlCi0JCWZpbGxkYXRhID0gMHg4MDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgKz0gc2l6ZXRvY29weTsKLQlidWZmZXItPmZyZWVfYnl0ZXMgLT0gc2l6ZXRvY29weTsKLQlidWZmZXItPnNpbGVuY2VfcG9zICU9IGJ1ZmZlci0+c2l6ZTsKLQlzdGFydCA9IGJ1ZmZlci0+c2lsZW5jZV9wb3M7Ci0JYnVmZmVyLT5zaWxlbmNlX3BvcyArPSBzaXpldG9jb3B5OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0Jc2l6ZXRvY29weV9ub3cgPSBidWZmZXItPnNpemUgLSBzdGFydDsKLQotCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKLQkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKLQkJZmlsbF9ibG9jayh3b2luc3QsIHN0YXJ0LCBmaWxsZGF0YSwgc2l6ZXRvY29weV9ub3cpOwotCQlmaWxsX2Jsb2NrKHdvaW5zdCwgMCwgZmlsbGRhdGEsIHNpemV0b2NvcHkpOwotCX0gZWxzZSB7Ci0JCWZpbGxfYmxvY2sod29pbnN0LCBzdGFydCwgZmlsbGRhdGEsIHNpemV0b2NvcHkpOwotCX0KLX0KLQotLyoqCi0gKiBlbXUxMGsxX3dhdmVvdXRfdXBkYXRlIC0KLSAqCi0gKiB1cGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdm9pY2UgYnVmZmVyIGhhcmR3YXJlIHBvaW50ZXIgKGh3X3BvcykKLSAqIGFuZCB0aGUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgb24gdGhlIGJ1ZmZlciAoZnJlZV9ieXRlcykuCi0gKiBUaGUgZnJlZSBieXRlcyBfZG9uJ3RfIGluY2x1ZGUgc2lsZW5jZSBieXRlcyB0aGF0IG1heSBoYXZlIGJlZW4KLSAqIGFkZGVkIHRvIHRoZSBidWZmZXIuCi0gKgotICovCi12b2lkIGVtdTEwazFfd2F2ZW91dF91cGRhdGUoc3RydWN0IHdvaW5zdCAqd29pbnN0KQotewotCXUzMiBod19wb3M7Ci0JdTMyIGRpZmY7Ci0KLQkvKiBUaGVyZSBpcyBubyBhY3R1YWwgc3RhcnQgeWV0ICovCi0JaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKLQkJaHdfcG9zID0gd29pbnN0LT5idWZmZXIuaHdfcG9zOwotCX0gZWxzZSB7Ci0JCS8qIGh3X3BvcyBpbiBzYW1wbGUgdW5pdHMgKi8KLQkJaHdfcG9zID0gc2JsaXZlX3JlYWRwdHIod29pbnN0LT52b2ljZVswXS5jYXJkLCBDQ0NBX0NVUlJBRERSLCB3b2luc3QtPnZvaWNlWzBdLm51bSk7Ci0KLQkJaWYoaHdfcG9zIDwgd29pbnN0LT52b2ljZVswXS5zdGFydCkKLQkJCWh3X3BvcyArPSB3b2luc3QtPmJ1ZmZlci5zaXplIC8gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSAtIHdvaW5zdC0+dm9pY2VbMF0uc3RhcnQ7Ci0JCWVsc2UKLQkJCWh3X3BvcyAtPSB3b2luc3QtPnZvaWNlWzBdLnN0YXJ0OwotCi0JCWh3X3BvcyAqPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCX0KLQotCWRpZmYgPSAod29pbnN0LT5idWZmZXIuc2l6ZSArIGh3X3BvcyAtIHdvaW5zdC0+YnVmZmVyLmh3X3BvcykgJSB3b2luc3QtPmJ1ZmZlci5zaXplOwotCXdvaW5zdC0+dG90YWxfcGxheWVkICs9IGRpZmY7Ci0Jd29pbnN0LT5idWZmZXIuZnJlZV9ieXRlcyArPSBkaWZmOwotCXdvaW5zdC0+YnVmZmVyLmh3X3BvcyA9IGh3X3BvczsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZWNlODguLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGNhcmR3by5oIC0tIGhlYWRlciBmaWxlIGZvciBjYXJkIHdhdmUgb3V0IGZ1bmN0aW9ucwotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaWZuZGVmIF9DQVJEV09fSAotI2RlZmluZSBfQ0FSRFdPX0gKLQotI2luY2x1ZGUgImljYXJkd2F2LmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICJ2b2ljZW1nci5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0KLS8qIHNldHRpbmcgdGhpcyB0byBvdGhlciB0aGFuIGEgcG93ZXIgb2YgdHdvIG1heSBicmVhayBzb21lIGFwcGxpY2F0aW9ucyAqLwotI2RlZmluZSBXQVZFT1VUX01BWEJVRlNJWkUJTUFYQlVGU0laRQotCi0jZGVmaW5lIFdBVkVPVVRfREVGQVVMVEZSQUdMRU4JMjAgLyogVGltZSB0byBwbGF5IGEgZnJhZ21lbnQgaW4gbXMgKGxhdGVuY3kpICovCi0jZGVmaW5lIFdBVkVPVVRfREVGQVVMVEJVRkxFTgk1MDAgLyogVGltZSB0byBwbGF5IHRoZSBlbnRpcmUgYnVmZmVyIGluIG1zICovCi0KLSNkZWZpbmUgV0FWRU9VVF9NSU5GUkFHU0hJRlQJNiAvKiBNaW5pbXVtIGZyYWdtZW50IHNpemUgaW4gYnl0ZXMgaXMgMl42ICovCi0jZGVmaW5lIFdBVkVPVVRfTUlORlJBR1MJMyAvKiBfZG9uJ3RfIGdvIGJlbGxvdyAzLCBpdCB3b3VsZCBicmVhayBzaWxlbmNlIGZpbGxpbmcgKi8KLSNkZWZpbmUgV0FWRU9VVF9NQVhWT0lDRVMJNgotCi1zdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgewotCXUxNiBvc3NmcmFnc2hpZnQ7Ci0JdTMyIG51bWZyYWdzOwotCXUzMiBmcmFnbWVudF9zaXplOwkvKiBpbiBieXRlcyB1bml0cyAqLwotCXUzMiBzaXplOwkJLyogaW4gYnl0ZXMgdW5pdHMgKi8KLQl1MzIgcGFnZXM7CQkvKiBidWZmZXIgc2l6ZSBpbiBwYWdlIHVuaXRzKi8KLQl1MzIgc2lsZW5jZV9wb3M7CS8qIHNvZnR3YXJlIGN1cnNvciBwb3NpdGlvbiAoaW5jbHVkaW5nIHNpbGVuY2UgYnl0ZXMpICovCi0JdTMyIGh3X3BvczsJCS8qIGhhcmR3YXJlIGN1cnNvciBwb3NpdGlvbiAqLwotCXUzMiBmcmVlX2J5dGVzOwkJLyogZnJlZSBieXRlcyBhdmFpbGFibGUgb24gdGhlIGJ1ZmZlciAobm90IGluY2x1ZGluZyBzaWxlbmNlIGJ5dGVzKSAqLwotCXU4IGZpbGxfc2lsZW5jZTsKLQl1MzIgc2lsZW5jZV9ieXRlczsgICAgICAvKiBzaWxlbmNlIGJ5dGVzIG9uIHRoZSBidWZmZXIgKi8KLX07Ci0KLXN0cnVjdCB3b2luc3QgCi17Ci0JdTggc3RhdGU7Ci0JdTggbnVtX3ZvaWNlczsKLQlzdHJ1Y3QgZW11X3ZvaWNlIHZvaWNlW1dBVkVPVVRfTUFYVk9JQ0VTXTsKLQlzdHJ1Y3QgZW11X3RpbWVyIHRpbWVyOwotCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyIGJ1ZmZlcjsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwotCXU4IG1tYXBwZWQ7Ci0JdTMyIHRvdGFsX2NvcGllZDsJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4oKSB0byB0aGUgYnVmZmVyIChleGNsdWRpbmcgc2lsZW5jZSkgKi8KLQl1MzIgdG90YWxfcGxheWVkOwkvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcGxheWVkIGluY2x1ZGluZyBzaWxlbmNlICovCi0JdTMyIGJsb2NrczsKLQl1OCBkZXZpY2U7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotfTsKLQotaW50IGVtdTEwazFfd2F2ZW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9jbG9zZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHN0cnVjdCB3b2luc3QqLCB1MzIgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YShzdHJ1Y3Qgd29pbnN0KiwgdTggX191c2VyICosIHUzMiAqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHN0cnVjdCB3b2luc3QqKTsKLWludCBlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UqLCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X3VwZGF0ZShzdHJ1Y3Qgd29pbnN0Kik7Ci0KLSNlbmRpZiAvKiBfQ0FSRFdPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWU2MzVmLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBlY2FyZC5jIC0gRS1jYXJkIGluaXRpYWxpemF0aW9uIGNvZGUKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8gCi0KLSNpbmNsdWRlICJlY2FyZC5oIgotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0KLS8qIFByaXZhdGUgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkIGVjYXJkX3NldGFkY2dhaW4oc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZWNhcmRfc3RhdGUgKiwgdTE2KTsKLXN0YXRpYyB2b2lkIGVjYXJkX3dyaXRlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZnVuYyBTZXQgdGhlIGdhaW4gb2YgdGhlIEVDQVJEJ3MgQ1MzMzEwIFRyaW0vZ2FpbiBjb250cm9sbGVyLiAgVGhlCi0gKiB0cmltIHZhbHVlIGNvbnNpc3RzIG9mIGEgMTZiaXQgdmFsdWUgd2hpY2ggaXMgY29tcG9zZWQgb2YgdHdvCi0gKiA4IGJpdCBnYWluL3RyaW0gdmFsdWVzLCBvbmUgZm9yIHRoZSBsZWZ0IGNoYW5uZWwgYW5kIG9uZSBmb3IgdGhlCi0gKiByaWdodCBjaGFubmVsLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBtYXBzIGZyb20gdGhlIEdhaW4vQXR0ZW51YXRpb24KLSAqIHZhbHVlIGluIGRlY2liZWxzIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYml0IHBhdHRlcm4gZm9yIGEgc2luZ2xlCi0gKiBjaGFubmVsLgotICovCi0KLXN0YXRpYyB2b2lkIGVjYXJkX3NldGFkY2dhaW4oc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVjYXJkX3N0YXRlICplY2FyZCwgdTE2IGdhaW4pCi17Ci0JdTMyIGN1cnJiaXQ7Ci0JZWNhcmQtPmFkY19nYWluID0gZ2FpbjsKLQotCS8qIEVuYWJsZSB3cml0aW5nIHRvIHRoZSBUUklNIHJlZ2lzdGVycyAqLwotCWVjYXJkX3dyaXRlKGNhcmQsIGVjYXJkLT5jb250cm9sX2JpdHMgJiB+RUNfVFJJTV9DU04pOwotCi0JLyogRG8gaXQgYWdhaW4gdG8gaW5zdXJlIHRoYXQgd2UgbWVldCBob2xkIHRpbWUgcmVxdWlyZW1lbnRzICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQtPmNvbnRyb2xfYml0cyAmIH5FQ19UUklNX0NTTik7Ci0KLQlmb3IgKGN1cnJiaXQgPSAoMUwgPDwgMTUpOyBjdXJyYml0OyBjdXJyYml0ID4+PSAxKSB7Ci0KLQkJdTMyIHZhbHVlID0gZWNhcmQtPmNvbnRyb2xfYml0cyAmIH4oRUNfVFJJTV9DU058RUNfVFJJTV9TREFUQSk7Ci0KLQkJaWYgKGdhaW4gJiBjdXJyYml0KQotCQkgICAgICB2YWx1ZSB8PSBFQ19UUklNX1NEQVRBOwotCi0JCS8qIENsb2NrIHRoZSBiaXQgKi8KLQkJZWNhcmRfd3JpdGUoY2FyZCwgdmFsdWUpOwotCQllY2FyZF93cml0ZShjYXJkLCB2YWx1ZSB8IEVDX1RSSU1fU0NMSyk7Ci0JCWVjYXJkX3dyaXRlKGNhcmQsIHZhbHVlKTsKLQl9Ci0KLQllY2FyZF93cml0ZShjYXJkLCBlY2FyZC0+Y29udHJvbF9iaXRzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZnVuYyBDbG9jayBiaXRzIGludG8gdGhlIEVjYXJkJ3MgY29udHJvbCBsYXRjaC4gIFRoZSBFY2FyZCB1c2VzIGEKLSAqICBjb250cm9sIGxhdGNoIHdpbGwgaXMgbG9hZGVkIGJpdC1zZXJpYWxseSBieSB0b2dnbGluZyB0aGUgTW9kZW0gY29udHJvbAotICogIGxpbmVzIGZyb20gZnVuY3Rpb24gMiBvbiB0aGUgRTgwMTAuICBUaGlzIGZ1bmN0aW9uIGhpZGVzIHRoZXNlIGRldGFpbHMKLSAqICBhbmQgcHJlc2VudHMgdGhlIGlsbHVzaW9uIHRoYXQgd2UgYXJlIGFjdHVhbGx5IHdyaXRpbmcgdG8gYSBkaXN0aW5jdAotICogIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgdm9pZCBlY2FyZF93cml0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgdmFsdWUpCi17Ci0JdTE2IGNvdW50OwotCXUzMiBkYXRhLCBoY3ZhbHVlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaGN2YWx1ZSA9IGlubChjYXJkLT5pb2Jhc2UgKyBIQ0ZHKSAmIH4oSE9PS05fQklUfEhBTkROX0JJVHxQVUxTRU5fQklUKTsKLQotCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSk7Ci0KLQlmb3IgKGNvdW50ID0gMCA7IGNvdW50IDwgRUNfTlVNX0NPTlRST0xfQklUUzsgY291bnQrKykgewotCQotCQkvKiBTZXQgdXAgdGhlIHZhbHVlICovCi0JCWRhdGEgPSAoKHZhbHVlICYgMHgxKSA/IFBVTFNFTl9CSVQgOiAwKTsKLQkJdmFsdWUgPj49IDE7Ci0KLQkJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgZGF0YSk7Ci0KLQkJLyogQ2xvY2sgdGhlIHNoaWZ0IHJlZ2lzdGVyICovCi0JCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSB8IGRhdGEgfCBIQU5ETl9CSVQpOwotCQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBkYXRhKTsKLQl9Ci0KLQkvKiBMYXRjaCB0aGUgYml0cyAqLwotCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSB8IEhPT0tOX0JJVCk7Ci0Jb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBfX2RldmluaXQgZW11MTBrMV9lY2FyZF9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdTMyIGhjdmFsdWU7Ci0Jc3RydWN0IGVjYXJkX3N0YXRlIGVjYXJkOwotCi0JLyogU2V0IHVwIHRoZSBpbml0aWFsIHNldHRpbmdzICovCi0JZWNhcmQubXV4MF9zZXR0aW5nID0gRUNfREVGQVVMVF9TUERJRjBfU0VMOwotCWVjYXJkLm11eDFfc2V0dGluZyA9IEVDX0RFRkFVTFRfU1BESUYxX1NFTDsKLQllY2FyZC5tdXgyX3NldHRpbmcgPSAwOwotCWVjYXJkLmFkY19nYWluID0gRUNfREVGQVVMVF9BRENfR0FJTjsKLQllY2FyZC5jb250cm9sX2JpdHMgPSBFQ19SQVdfUlVOX01PREUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfU1BESUYwX1NFTEVDVChlY2FyZC5tdXgwX3NldHRpbmcpIHwKLQkJCSAgICAgRUNfU1BESUYxX1NFTEVDVChlY2FyZC5tdXgxX3NldHRpbmcpOwotCi0KLQkvKiBTdGVwIDA6IFNldCB0aGUgY29kZWMgdHlwZSBpbiB0aGUgaGFyZHdhcmUgY29udHJvbCByZWdpc3RlciAKLQkgKiBhbmQgZW5hYmxlIGF1ZGlvIG91dHB1dCAqLwotCWhjdmFsdWUgPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgSENGRyk7Ci0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBoY3ZhbHVlIHwgSENGR19BVURJT0VOQUJMRSB8IEhDRkdfQ09ERUNGT1JNQVRfSTJTKTsKLQotCS8qIFN0ZXAgMTogVHVybiBvZmYgdGhlIGxlZCBhbmQgZGVhc3NlcnQgVFJJTV9DUyAqLwotCWVjYXJkX3dyaXRlKGNhcmQsIEVDX0FEQ0NBTCB8IEVDX0xFRE4gfCBFQ19UUklNX0NTTik7Ci0KLQkvKiBTdGVwIDI6IENhbGlicmF0ZSB0aGUgQURDIGFuZCBEQUMgKi8KLQllY2FyZF93cml0ZShjYXJkLCBFQ19EQUNDQUwgfCBFQ19MRUROIHwgRUNfVFJJTV9DU04pOwotCi0JLyogU3RlcCAzOiBXYWl0IGZvciBhd2hpbGU7IEZJWE1FOiBJcyB0aGlzIGNvcnJlY3Q/ICovCi0KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKLQotCS8qIFN0ZXAgNDogU3dpdGNoIG9mZiB0aGUgREFDIGFuZCBBREMgY2FsaWJyYXRpb24uICBOb3RlCi0JICogVGhhdCBBRENfQ0FMIGlzIGFjdHVhbGx5IGFuIGludmVydGVkIHNpZ25hbCwgc28gd2UgYXNzZXJ0Ci0JICogaXQgaGVyZSB0byBzdG9wIGNhbGlicmF0aW9uLiAgKi8KLQllY2FyZF93cml0ZShjYXJkLCBFQ19BRENDQUwgfCBFQ19MRUROIHwgRUNfVFJJTV9DU04pOwotCi0JLyogU3RlcCA0OiBTd2l0Y2ggaW50byBydW4gbW9kZSAqLwotCWVjYXJkX3dyaXRlKGNhcmQsIGVjYXJkLmNvbnRyb2xfYml0cyk7Ci0KLQkvKiBTdGVwIDU6IFNldCB0aGUgYW5hbG9nIGlucHV0IGdhaW4gKi8KLQllY2FyZF9zZXRhZGNnYWluKGNhcmQsICZlY2FyZCwgZWNhcmQuYWRjX2dhaW4pOwotfQotCi0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmggYi9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FlYWQxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBlY2FyZC5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLyAKLQotI2lmbmRlZiBfRUNBUkRfSAotI2RlZmluZSBfRUNBUkRfSAotCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0vKiBJbiBBMSBTaWxpY29uLCB0aGVzZSBiaXRzIGFyZSBpbiB0aGUgSEMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgSE9PS05fQklUICAgKDFMIDw8IDEyKQotI2RlZmluZSBIQU5ETl9CSVQgICAoMUwgPDwgMTEpCi0jZGVmaW5lIFBVTFNFTl9CSVQgICgxTCA8PCAxMCkKLQotI2RlZmluZSBFQ19HREkxICgxIDw8IDEzKQotI2RlZmluZSBFQ19HREkwICgxIDw8IDE0KQotCi0jZGVmaW5lIEVDX05VTV9DT05UUk9MX0JJVFMgMjAKLQotI2RlZmluZSBFQ19BQzNfREFUQV9TRUxOICAweDAwMDFMCi0jZGVmaW5lIEVDX0VFX0RBVEFfU0VMICAgIDB4MDAwMkwKLSNkZWZpbmUgRUNfRUVfQ05UUkxfU0VMTiAgMHgwMDA0TAotI2RlZmluZSBFQ19FRUNMSyAgICAgICAgICAweDAwMDhMCi0jZGVmaW5lIEVDX0VFQ1MgICAgICAgICAgIDB4MDAxMEwKLSNkZWZpbmUgRUNfRUVTRE8gICAgICAgICAgMHgwMDIwTAotI2RlZmluZSBFQ19UUklNX0NTTgkgIDB4MDA0MEwKLSNkZWZpbmUgRUNfVFJJTV9TQ0xLCSAgMHgwMDgwTAotI2RlZmluZSBFQ19UUklNX1NEQVRBCSAgMHgwMTAwTAotI2RlZmluZSBFQ19UUklNX01VVEVOCSAgMHgwMjAwTAotI2RlZmluZSBFQ19BRENDQUwJICAweDA0MDBMCi0jZGVmaW5lIEVDX0FEQ1JTVE4JICAweDA4MDBMCi0jZGVmaW5lIEVDX0RBQ0NBTAkgIDB4MTAwMEwKLSNkZWZpbmUgRUNfREFDTVVURU4JICAweDIwMDBMCi0jZGVmaW5lIEVDX0xFRE4JCSAgMHg0MDAwTAotCi0jZGVmaW5lIEVDX1NQRElGMF9TRUxfU0hJRlQJMTUKLSNkZWZpbmUgRUNfU1BESUYxX1NFTF9TSElGVAkxNwkKLSNkZWZpbmUgRUNfU1BESUYwX1NFTF9NQVNLCSgweDNMIDw8IEVDX1NQRElGMF9TRUxfU0hJRlQpCi0jZGVmaW5lIEVDX1NQRElGMV9TRUxfTUFTSwkoMHg3TCA8PCBFQ19TUERJRjFfU0VMX1NISUZUKQotI2RlZmluZSBFQ19TUERJRjBfU0VMRUNUKF94KSAoKChfeCkgPDwgRUNfU1BESUYwX1NFTF9TSElGVCkgJiBFQ19TUERJRjBfU0VMX01BU0spCi0jZGVmaW5lIEVDX1NQRElGMV9TRUxFQ1QoX3gpICgoKF94KSA8PCBFQ19TUERJRjFfU0VMX1NISUZUKSAmIEVDX1NQRElGMV9TRUxfTUFTSykKLSNkZWZpbmUgRUNfQ1VSUkVOVF9QUk9NX1ZFUlNJT04gMHgwMSAvKiBTZWxmLWV4cGxhbmF0b3J5LiAgVGhpcyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSBpbmNyZW1lbnRlZCBhbnkgdGltZSB0aGUgRUVQUk9NJ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb3JtYXQgaXMgY2hhbmdlZC4gICovCi0KLSNkZWZpbmUgRUNfRUVQUk9NX1NJWkUJICAgICAgICAweDQwIC8qIEVDQVJEIEVFUFJPTSBoYXMgNjQgMTYtYml0IHdvcmRzICovCi0KLS8qIEFkZHJlc3NlcyBmb3Igc3BlY2lhbCB2YWx1ZXMgc3RvcmVkIGluIHRvIEVFUFJPTSAqLwotI2RlZmluZSBFQ19QUk9NX1ZFUlNJT05fQUREUgkweDIwCS8qIEFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgcHJvbSB2ZXJzaW9uICovCi0jZGVmaW5lIEVDX0JPQVJEUkVWMF9BRERSCTB4MjEJLyogTFNXIG9mIGJvYXJkIHJldiAqLwotI2RlZmluZSBFQ19CT0FSRFJFVjFfQUREUiAJMHgyMgkvKiBNU1cgb2YgYm9hcmQgcmV2ICovIAotCi0jZGVmaW5lIEVDX0xBU1RfUFJPTUZJTEVfQUREUgkweDJmCi0KLSNkZWZpbmUgRUNfU0VSSUFMTlVNX0FERAkweDMwCS8qIEZpcnN0IHdvcmQgb2Ygc2VyaWFsIG51bWJlci4gIFRoZSBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYW4gYmUgdXAgdG8gMzAgY2hhcmFjdGVycyBpbiBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgaXMgc3RvcmVkIGFzIGEgTlVMTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQVNDSUkgc3RyaW5nLiAgQW55IHVudXNlZCBieXRlcyBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsbGVkIHdpdGggemVyb3MgKi8KLSNkZWZpbmUgRUNfQ0hFQ0tTVU1fQUREUgkweDNmICAgIC8qIExvY2F0aW9uIGF0IHdoaWNoIGNoZWNrc3VtIGlzIHN0b3JlZCAqLwotCi0KLQotLyogTW9zdCBvZiB0aGlzIHN0dWZmIGlzIHByZXR0eSBzZWxmLWV2aWRlbnQuICBBY2NvcmRpbmcgdG8gdGhlIGhhcmR3YXJlIAotICogZHVkZXMsIHdlIG5lZWQgdG8gbGVhdmUgdGhlIEFEQ0NBTCBiaXQgbG93IGluIG9yZGVyIHRvIGF2b2lkIGEgREMgCi0gKiBvZmZzZXQgcHJvYmxlbS4gIFdlaXJkLgotICovCi0jZGVmaW5lIEVDX1JBV19SVU5fTU9ERQkoRUNfREFDTVVURU4gfCBFQ19BRENSU1ROIHwgRUNfVFJJTV9NVVRFTiB8IEVDX1RSSU1fQ1NOKQotCi0KLSNkZWZpbmUgRUNfREVGQVVMVF9BRENfR0FJTiAgIDB4QzRDNAotI2RlZmluZSBFQ19ERUZBVUxUX1NQRElGMF9TRUwgMHgwCi0jZGVmaW5lIEVDX0RFRkFVTFRfU1BESUYxX1NFTCAweDQKLQotI2RlZmluZSBIQ19FQSAweDAxTAotCi0vKiBFQ0FSRCBzdGF0ZSBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSBtYWludGFpbnMgdGhlIHN0YXRlCi0gKiBmb3IgdmFyaW91cyBwb3J0aW9ucyBvZiB0aGUgRUNBUkQncyBvbmJvYXJkIGhhcmR3YXJlLgotICovCi1zdHJ1Y3QgZWNhcmRfc3RhdGUgewotCXUzMiBjb250cm9sX2JpdHM7Ci0JdTE2IGFkY19nYWluOwotCXUxNiBtdXgwX3NldHRpbmc7Ci0JdTE2IG11eDFfc2V0dGluZzsKLQl1MTYgbXV4Ml9zZXR0aW5nOwotfTsKLQotdm9pZCBlbXUxMGsxX2VjYXJkX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqKSBfX2RldmluaXQ7Ci0KLSNlbmRpZiAvKiBfRUNBUkRfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1ODY1ZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBlZnhtZ3IuYwotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICJlZnhtZ3IuaCIKLQotaW50IGVtdTEwazFfZmluZF9jb250cm9sX2dwcihzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyLCBjb25zdCBjaGFyICpwYXRjaF9uYW1lLCBjb25zdCBjaGFyICpncHJfbmFtZSkKLXsKLSAgICAgICAgc3RydWN0IGRzcF9wYXRjaCAqcGF0Y2g7Ci0Jc3RydWN0IGRzcF9ycGF0Y2ggKnJwYXRjaDsKLQljaGFyIHNbUEFUQ0hfTkFNRV9TSVpFICsgNF07Ci0JdW5zaWduZWQgbG9uZyAqZ3ByX3VzZWQ7Ci0JaW50IGk7Ci0KLQlEUEQoMiwgImVtdTEwazFfZmluZF9jb250cm9sX2dwcigpOiAlcyAlc1xuIiwgcGF0Y2hfbmFtZSwgZ3ByX25hbWUpOwotCi0JcnBhdGNoID0gJm1nci0+cnBhdGNoOwotCWlmICghc3RyY21wKHJwYXRjaC0+bmFtZSwgcGF0Y2hfbmFtZSkpIHsKLQkJZ3ByX3VzZWQgPSBycGF0Y2gtPmdwcl91c2VkOwotCQlnb3RvIG1hdGNoOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBtZ3ItPmN1cnJlbnRfcGFnZXMgKiBQQVRDSEVTX1BFUl9QQUdFOyBpKyspIHsKLQkJcGF0Y2ggPSBQQVRDSChtZ3IsIGkpOwotCQkJc3ByaW50ZihzLCIlcyIsIHBhdGNoLT5uYW1lKTsKLQotCQlpZiAoIXN0cmNtcChzLCBwYXRjaF9uYW1lKSkgewotCQkJZ3ByX3VzZWQgPSBwYXRjaC0+Z3ByX3VzZWQ7Ci0JCQlnb3RvIG1hdGNoOwotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwotCi0gIG1hdGNoOgotCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BSUzsgaSsrKQotCQlpZiAobWdyLT5ncHJbaV0udHlwZSA9PSBHUFJfVFlQRV9DT05UUk9MICYmCi0JCSAgICB0ZXN0X2JpdChpLCBncHJfdXNlZCkgJiYKLQkJICAgICFzdHJjbXAobWdyLT5ncHJbaV0ubmFtZSwgZ3ByX25hbWUpKQotCQkJcmV0dXJuIGk7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQgZW11MTBrMV9zZXRfY29udHJvbF9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGFkZHIsIHMzMiB2YWwsIGludCBmbGFnKQotewotCXN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IgPSAmY2FyZC0+bWdyOwotCi0JRFBEKDIsICJlbXUxMGsxX3NldF9jb250cm9sX2dwcigpOiAlZCAleFxuIiwgYWRkciwgdmFsKTsKLQotCWlmIChhZGRyIDwgMCB8fCBhZGRyID49IE5VTV9HUFJTKQotCQlyZXR1cm47Ci0KLQkvL2ZpeG1lOiBvbmNlIHBhdGNoIG1hbmFnZXIgaXMgdXAsIHJlbWVtYmVyIHRvIGZpeCB0aGlzIGZvciB0aGUgYXVkaWd5Ci0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9HUFJfQkFTRSArIGFkZHIsIDAsIHZhbCk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZsYWcpCi0JCQl2YWwgKz0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgR1BSX0JBU0UgKyBhZGRyLCAwKTsKLQkJaWYgKHZhbCA+IG1nci0+Z3ByW2FkZHJdLm1heCkKLQkJCXZhbCA9IG1nci0+Z3ByW2FkZHJdLm1heDsKLQkJZWxzZSBpZiAodmFsIDwgbWdyLT5ncHJbYWRkcl0ubWluKQotCQkJdmFsID0gbWdyLT5ncHJbYWRkcl0ubWluOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgR1BSX0JBU0UgKyBhZGRyLCAwLCB2YWwpOwotCX0KLQkKLQkKLX0KLQotLy9UT0RPOiBtYWtlIHRoaXMgY29uZmlndXJhYmxlOgotI2RlZmluZSBWT0xDVFJMX0NIQU5ORUwgU09VTkRfTUlYRVJfVk9MVU1FCi0jZGVmaW5lIFZPTENUUkxfU1RFUF9TSVpFICAgICAgICA1Ci0KLS8vQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIHNldHRpbmcgT1NTIG1peGVyIGNvbnRyb2xzLgotc3RhdGljIHZvaWQgZW11MTBrMV9zZXRfb3NzX3ZvbChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgb3NzX21peGVyLAotCQkJCXVuc2lnbmVkIGludCBsZWZ0LCB1bnNpZ25lZCBpbnQgcmlnaHQpCi17Ci0JZXh0ZXJuIGNoYXIgdm9sdW1lX3BhcmFtc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdOwotCi0JY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX21peGVyXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7Ci0KLQlpZiAoIWNhcmQtPmlzX2FwcykKLQkJY2FyZC0+YWM5Ny0+d3JpdGVfbWl4ZXIoY2FyZC0+YWM5Nywgb3NzX21peGVyLCBsZWZ0LCByaWdodCk7Ci0JCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVswXSwgbGVmdCwKLQkJCSAgICAgICB2b2x1bWVfcGFyYW1zW29zc19taXhlcl0pOwotCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVsxXSwgcmlnaHQsCi0JCQkgICAgICAgdm9sdW1lX3BhcmFtc1tvc3NfbWl4ZXJdKTsKLX0KLQotLy9GSVhNRTogbXV0ZSBzaG91bGQgdW5tdXRlIHdoZW4gcHJlc3NlZCBhIHNlY29uZCB0aW1lCi12b2lkIGVtdTEwazFfbXV0ZV9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IG9zc19jaGFubmVsID0gVk9MQ1RSTF9DSEFOTkVMOwotCWludCBsZWZ0LCByaWdodDsKLQlzdGF0aWMgaW50IHZhbDsKLQotCWlmICh2YWwpIHsKLQkJbGVmdCA9IHZhbCAmIDB4ZmY7Ci0JCXJpZ2h0ID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JCXZhbCA9IDA7Ci0JfSBlbHNlIHsKLQkJdmFsID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdOwotCQlsZWZ0ID0gMDsKLQkJcmlnaHQgPSAwOwotCX0KLQotCWVtdTEwazFfc2V0X29zc192b2woY2FyZCwgb3NzX2NoYW5uZWwsIGxlZnQsIHJpZ2h0KTsKLX0KLQotdm9pZCBlbXUxMGsxX3ZvbGluY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCBvc3NfY2hhbm5lbCA9IFZPTENUUkxfQ0hBTk5FTDsKLQlpbnQgbGVmdCwgcmlnaHQ7Ci0KLQlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdICYgMHhmZjsKLQlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gPj4gOCkgJiAweGZmOwotCi0JaWYgKChsZWZ0ICs9IFZPTENUUkxfU1RFUF9TSVpFKSA+IDEwMCkKLQkJbGVmdCA9IDEwMDsKLQotCWlmICgocmlnaHQgKz0gVk9MQ1RSTF9TVEVQX1NJWkUpID4gMTAwKQotCQlyaWdodCA9IDEwMDsKLQotCWVtdTEwazFfc2V0X29zc192b2woY2FyZCwgb3NzX2NoYW5uZWwsIGxlZnQsIHJpZ2h0KTsKLX0KLQotdm9pZCBlbXUxMGsxX3ZvbGRlY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCBvc3NfY2hhbm5lbCA9IFZPTENUUkxfQ0hBTk5FTDsKLQlpbnQgbGVmdCwgcmlnaHQ7Ci0KLQlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdICYgMHhmZjsKLQlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gPj4gOCkgJiAweGZmOwotCi0JaWYgKChsZWZ0IC09IFZPTENUUkxfU1RFUF9TSVpFKSA8IDApCi0JCWxlZnQgPSAwOwotCi0JaWYgKChyaWdodCAtPSBWT0xDVFJMX1NURVBfU0laRSkgPCAwKQotCQlyaWdodCA9IDA7Ci0KLQllbXUxMGsxX3NldF9vc3Nfdm9sKGNhcmQsIG9zc19jaGFubmVsLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXZvaWQgZW11MTBrMV9zZXRfdm9sdW1lX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgYWRkciwgczMyIHZvbCwgaW50IHNjYWxlKQotewotCXN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IgPSAmY2FyZC0+bWdyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzdGF0aWMgY29uc3QgczMyIGxvZzJsaW5bNF0gPXsgICAgICAgICAgIC8vICBhdHRlbnVhdGlvbiAoZEIpCi0JCTB4N2ZmZmZmZmYsICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIDAuMCAgICAgICAgIAotCQkweDdmZmZmZmZmICogMC44NDA4OTY0MTUyNTM3MTUgLCAvLyAgICAgICAxLjUgICAgICAgICAgCi0JCTB4N2ZmZmZmZmYgKiAwLjcwNzEwNjc4MTE4NjU0OCwgIC8vICAgICAgIDMuMAotCQkweDdmZmZmZmZmICogMC41OTQ2MDM1NTc1MDEzNjEgLCAvLyAgICAgICA0LjUKLQl9OwotCi0JaWYgKGFkZHIgPCAwKQotCQlyZXR1cm47Ci0KLQl2b2wgPSAoMTAwIC0gdm9sICkgKiBzY2FsZSAvIDEwMDsKLQotCS8vIFRoYW5rcyB0byB0aGUgY29tcC5kc3AgbmV3c2dyb3VwIGZvciB0aGlzIG5lYXQgdHJpY2s6Ci0Jdm9sID0gKHZvbCA+PSBzY2FsZSkgPyAwIDogKGxvZzJsaW5bdm9sICYgM10gPj4gKHZvbCA+PiAyKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWdyLT5sb2NrLCBmbGFncyk7Ci0JZW11MTBrMV9zZXRfY29udHJvbF9ncHIoY2FyZCwgYWRkciwgdm9sLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZ3ItPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBlbXUxMGsxX2RzcF9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSkgewotCQl1MzIgYmM7Ci0JCWJjID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgR1BSX0JBU0UgKyBjYXJkLT5wdC5pbnRyX2dwciwgMCk7Ci0JCWlmIChiYyAhPSAwKSB7Ci0JCQlEUEQoMywgInB0IGludGVycnVwdCwgYmMgPSAlZFxuIiwgYmMpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnB0LmxvY2ssIGZsYWdzKTsKLQkJCWNhcmQtPnB0LmJsb2Nrc19wbGF5ZWQgPSBiYzsKLQkJCWlmIChjYXJkLT5wdC5ibG9ja3NfcGxheWVkID49IGNhcmQtPnB0LmJsb2Nrc19jb3BpZWQpIHsKLQkJCQlEUEYoMSwgImJ1ZmZlciB1bmRlcnJ1biBpbiBwYXNzdGhyb3VnaCBwbGF5YmFja1xuIik7Ci0JCQkJZW11MTBrMV9wdF9zdG9wKGNhcmQpOwotCQkJfQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYXJkLT5wdC53YWl0KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnB0LmxvY2ssIGZsYWdzKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmggYi9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0OGU1Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHNibGl2ZV9meC5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpZm5kZWYgX0VGWE1HUl9ICi0jZGVmaW5lIF9FRlhNR1JfSAotCi1zdHJ1Y3QgZW11X2VmeF9pbmZvX3R7Ci0JaW50IG9wY29kZV9zaGlmdDsKLQlpbnQgaGlnaF9vcGVyYW5kX3NoaWZ0OwotCWludCBpbnN0cnVjdGlvbl9zdGFydDsKLQlpbnQgZ3ByX2Jhc2U7Ci0JaW50IG91dHB1dF9iYXNlOwotfTsKLQotCi0jZGVmaW5lIFdSSVRFX0VGWChhLCBiLCBjKSBzYmxpdmVfd3JpdGVwdHIoKGEpLCBlbXVfZWZ4X2luZm9bY2FyZC0+aXNfYXVkaWd5XS5pbnN0cnVjdGlvbl9zdGFydCArIChiKSwgMCwgKGMpKQotCi0jZGVmaW5lIE9QKG9wLCB6LCB3LCB4LCB5KSBcCi0JZG8geyBXUklURV9FRlgoY2FyZCwgKHBjKSAqIDIsICgoeCkgPDwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0uaGlnaF9vcGVyYW5kX3NoaWZ0KSB8ICh5KSk7IFwKLQlXUklURV9FRlgoY2FyZCwgKHBjKSAqIDIgKyAxLCAoKG9wKSA8PCBlbXVfZWZ4X2luZm9bY2FyZC0+aXNfYXVkaWd5XS5vcGNvZGVfc2hpZnQgKSB8ICgoeikgPDwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0uaGlnaF9vcGVyYW5kX3NoaWZ0KSB8ICh3KSk7IFwKLQkrK3BjOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIE5VTV9JTlBVVFMgMHgyMAotI2RlZmluZSBOVU1fT1VUUFVUUyAweDIwCi0jZGVmaW5lIE5VTV9HUFJTIDB4MTAwCi0KLSNkZWZpbmUgQV9OVU1fSU5QVVRTIDB4NjAKLSNkZWZpbmUgQV9OVU1fT1VUUFVUUyAweDYwICAvL2ZpeG1lOiB0aGlzIG1heSBvciBtYXkgbm90IGJlIHRydWUKLSNkZWZpbmUgQV9OVU1fR1BSUyAweDIwMAotCi0jZGVmaW5lIEdQUl9OQU1FX1NJWkUgICAzMgotI2RlZmluZSBQQVRDSF9OQU1FX1NJWkUgMzIKLQotc3RydWN0IGRzcF9ycGF0Y2ggewotCWNoYXIgbmFtZVtQQVRDSF9OQU1FX1NJWkVdOwotCXUxNiBjb2RlX3N0YXJ0OwotCXUxNiBjb2RlX3NpemU7Ci0KLQl1bnNpZ25lZCBsb25nIGdwcl91c2VkW05VTV9HUFJTIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpICsgMV07Ci0JdW5zaWduZWQgbG9uZyBncHJfaW5wdXRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsKLQl1bnNpZ25lZCBsb25nIHJvdXRlW05VTV9PVVRQVVRTXTsKLQl1bnNpZ25lZCBsb25nIHJvdXRlX3ZbTlVNX09VVFBVVFNdOwotfTsKLQotc3RydWN0IGRzcF9wYXRjaCB7Ci0JY2hhciBuYW1lW1BBVENIX05BTUVfU0laRV07Ci0JdTggaWQ7Ci0JdW5zaWduZWQgbG9uZyBpbnB1dDsJLyogYml0bWFwIG9mIHRoZSBsaW5lcyB1c2VkIGFzIGlucHV0cyAqLwotCXVuc2lnbmVkIGxvbmcgb3V0cHV0OwkvKiBiaXRtYXAgb2YgdGhlIGxpbmVzIHVzZWQgYXMgb3V0cHV0cyAqLwotCXUxNiBjb2RlX3N0YXJ0OwotCXUxNiBjb2RlX3NpemU7Ci0KLQl1bnNpZ25lZCBsb25nIGdwcl91c2VkW05VTV9HUFJTIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpICsgMV07CS8qIGJpdG1hcCBvZiB1c2VkIGdwcnMgKi8KLQl1bnNpZ25lZCBsb25nIGdwcl9pbnB1dFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOwotCXU4IHRyYW1sX2lzdGFydDsJLyogc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgaW50ZXJuYWwgdHJhbSBsaW5lcyB1c2VkICovCi0JdTggdHJhbWxfaXNpemU7CQkvKiBudW1iZXIgb2YgaW50ZXJuYWwgdHJhbSBsaW5lcyB1c2VkICovCi0KLQl1OCB0cmFtbF9lc3RhcnQ7Ci0JdTggdHJhbWxfZXNpemU7Ci0KLQl1MTYgdHJhbWJfaXN0YXJ0OyAgICAgICAgLyogc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgaW50ZXJuYWwgdHJhbSBtZW1vcnkgdXNlZCAqLwotCXUxNiB0cmFtYl9pc2l6ZTsgICAgICAgICAvKiBhbW91bnQgb2YgaW50ZXJuYWwgbWVtb3J5IHVzZWQgKi8KLQl1MzIgdHJhbWJfZXN0YXJ0OwotCXUzMiB0cmFtYl9lc2l6ZTsKLX07Ci0KLXN0cnVjdCBkc3BfZ3ByIHsKLQl1OCB0eXBlOwkJCS8qIGdwciB0eXBlLCBTVEFUSUMsIERZTkFNSUMsIElOUFVULCBPVVRQVVQsIENPTlRST0wgKi8KLQljaGFyIG5hbWVbR1BSX05BTUVfU0laRV07CS8qIGdwciB2YWx1ZSwgb25seSB2YWxpZCBmb3IgY29udHJvbCBncHJzICovCi0JczMyIG1pbiwgbWF4OwkJCS8qIHZhbHVlIHJhbmdlIGZvciB0aGlzIGdwciwgb25seSB2YWxpZCBmb3IgY29udHJvbCBncHJzICovCi0JdTggbGluZTsJCQkvKiB3aGljaCBpbnB1dC9vdXRwdXQgbGluZSBpcyB0aGUgZ3ByIGF0dGFjaGVkLCBvbmx5IHZhbGlkIGZvciBpbnB1dC9vdXRwdXQgZ3BycyAqLwotCXU4IHVzYWdlOwotfTsKLQotZW51bSB7Ci0JR1BSX1RZUEVfTlVMTCA9IDAsCi0JR1BSX1RZUEVfSU8sCi0JR1BSX1RZUEVfU1RBVElDLAotCUdQUl9UWVBFX0RZTkFNSUMsCi0JR1BSX1RZUEVfQ09OVFJPTCwKLQlHUFJfVFlQRV9DT05TVEFOVAotfTsKLQotI2RlZmluZSBHUFJfQkFTRSAweDEwMAotI2RlZmluZSBPVVRQVVRfQkFTRSAweDIwCi0KLSNkZWZpbmUgQV9HUFJfQkFTRSAweDQwMAotI2RlZmluZSBBX09VVFBVVF9CQVNFIDB4NjAKLQotI2RlZmluZSBNQVhfUEFUQ0hFU19QQUdFUyAzMgotCi1zdHJ1Y3QgcGF0Y2hfbWFuYWdlciB7Ci0Jdm9pZCAqcGF0Y2hbTUFYX1BBVENIRVNfUEFHRVNdOwotCWludCBjdXJyZW50X3BhZ2VzOwotCXN0cnVjdCBkc3BfcnBhdGNoIHJwYXRjaDsKLQlzdHJ1Y3QgZHNwX2dwciBncHJbTlVNX0dQUlNdOyAgIC8qIGdwciB1c2FnZSB0YWJsZSAqLwotCXNwaW5sb2NrX3QgbG9jazsKLQlzMTYgY3RybF9ncHJbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVsyXTsKLX07Ci0KLSNkZWZpbmUgUEFUQ0hFU19QRVJfUEFHRSAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBkc3BfcGF0Y2gpKQotCi0jZGVmaW5lIFBBVENIKG1nciwgaSkgKChzdHJ1Y3QgZHNwX3BhdGNoICopIChtZ3IpLT5wYXRjaFsoaSkgLyBQQVRDSEVTX1BFUl9QQUdFXSArIChpKSAlIFBBVENIRVNfUEVSX1BBR0UpCi0KLS8qIFBDTSB2b2x1bWUgY29udHJvbCAqLwotI2RlZmluZSBUTVBfUENNX0wgICAgIDB4MTAwIC8vdGVtcCBQQ00gTCAoYWZ0ZXIgdGhlIHZvbCBjb250cm9sKSAgICAgICAKLSNkZWZpbmUgVE1QX1BDTV9SICAgICAweDEwMQotI2RlZmluZSBWT0xfUENNX0wgICAgIDB4MTAyIC8vdm9sIFBDTQotI2RlZmluZSBWT0xfUENNX1IgICAgIDB4MTAzCi0KLS8qIFJvdXRpbmcgcGF0Y2ggKi8KLSNkZWZpbmUgVE1QX0FDX0wgICAgICAweDEwNCAvL3RtcCBhYzk3IG91dAotI2RlZmluZSBUTVBfQUNfUiAgICAgIDB4MTA1Ci0jZGVmaW5lIFRNUF9SRUFSX0wgICAgMHgxMDYgLy9vdXRwdXQgLSBUZW1wIFJlYXIKLSNkZWZpbmUgVE1QX1JFQVJfUiAgICAweDEwNwotI2RlZmluZSBUTVBfRElHSV9MICAgIDB4MTA4IC8vb3V0cHV0IC0gVGVtcCBkaWdpdGFsCi0jZGVmaW5lIFRNUF9ESUdJX1IgICAgMHgxMDkKLSNkZWZpbmUgRFNQX1ZPTF9MICAgICAweDEwYSAvLyBtYWluIGRzcCB2b2x1bWUKLSNkZWZpbmUgRFNQX1ZPTF9SICAgICAweDEwYgotCi0vKiBodyBpbnB1dHMgKi8KLSNkZWZpbmUgUENNX0lOX0wgCTB4MDAKLSNkZWZpbmUgUENNX0lOX1IgCTB4MDEKLQotI2RlZmluZSBQQ00xX0lOX0wgICAgICAgIDB4MDQKLSNkZWZpbmUgUENNMV9JTl9SICAgICAgICAweDA1Ci0vL211dGlsY2hhbm5lbCBwbGF5YmFjayBzdHJlYW0gYXBwZWFyIGhlcmU6Ci0KLSNkZWZpbmUgTVVMVElfRlJPTlRfTAkweDA4Ci0jZGVmaW5lIE1VTFRJX0ZST05UX1IJMHgwOQotI2RlZmluZSBNVUxUSV9SRUFSX0wJMHgwYQotI2RlZmluZSBNVUxUSV9SRUFSX1IJMHgwYgotI2RlZmluZSBNVUxUSV9DRU5URVIJMHgwYwotI2RlZmluZSBNVUxUSV9MRkUJMHgwZAotCi0jZGVmaW5lIEFDOTdfSU5fTAkweDEwCi0jZGVmaW5lIEFDOTdfSU5fUgkweDExCi0jZGVmaW5lIFNQRElGX0NEX0wJMHgxMgotI2RlZmluZSBTUERJRl9DRF9SCTB4MTMKLQotLyogaHcgb3V0cHV0cyAqLwotI2RlZmluZSBBQzk3X0ZST05UX0wJMHgyMAotI2RlZmluZSBBQzk3X0ZST05UX1IJMHgyMQotI2RlZmluZSBESUdJVEFMX09VVF9MCTB4MjIKLSNkZWZpbmUgRElHSVRBTF9PVVRfUgkweDIzCi0jZGVmaW5lIERJR0lUQUxfQ0VOVEVSCTB4MjQKLSNkZWZpbmUgRElHSVRBTF9MRkUJMHgyNQotCi0jZGVmaW5lIEFOQUxPR19SRUFSX0wJMHgyOAotI2RlZmluZSBBTkFMT0dfUkVBUl9SCTB4MjkKLSNkZWZpbmUgQURDX1JFQ19MCTB4MmEKLSNkZWZpbmUgQURDX1JFQ19SCTB4MmIKLQotI2RlZmluZSBBTkFMT0dfQ0VOVEVSCTB4MzEKLSNkZWZpbmUgQU5BTE9HX0xGRQkweDMyCi0KLQotI2RlZmluZSBJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgbm0sIGxuLCBpKQkJXAotZG8gewkJCQkJCQlcCi0JcGF0Y2ggPSBQQVRDSChtZ3IsIHBhdGNoX24pOwkJCVwKLQlzdHJjcHkocGF0Y2gtPm5hbWUsIG5tKTsJCQlcCi0JcGF0Y2gtPmNvZGVfc3RhcnQgPSBwYyAqIDI7CQkJXAotCXBhdGNoLT5pbnB1dCA9ICgxPDwoMHgxZiZsbikpOwkJCVwKLQlwYXRjaC0+b3V0cHV0PSAoMTw8KDB4MWYmbG4pKTsJCQlcCi0JcGF0Y2gtPmlkID0gaTsJCQkJCVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBJTlBVVF9QQVRDSF9FTkQocGF0Y2gpCQkJCVwKLWRvIHsJCQkJCQkJXAotCXBhdGNoLT5jb2RlX3NpemUgPSBwYyAqIDIgLSBwYXRjaC0+Y29kZV9zdGFydDsJXAotCXBhdGNoX24rKzsJCQkJCVwKLX0gd2hpbGUoMCkKLQotCi0jZGVmaW5lIFJPVVRJTkdfUEFUQ0hfU1RBUlQocGF0Y2gsIG5tKQlcCi1kbyB7CQkJCQlcCi0JcGF0Y2ggPSAmbWdyLT5ycGF0Y2g7CQlcCi0Jc3RyY3B5KHBhdGNoLT5uYW1lLCBubSk7CVwKLQlwYXRjaC0+Y29kZV9zdGFydCA9IHBjICogMjsJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIFJPVVRJTkdfUEFUQ0hfRU5EKHBhdGNoKQkJCVwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXBhdGNoLT5jb2RlX3NpemUgPSBwYyAqIDIgLSBwYXRjaC0+Y29kZV9zdGFydDsgICAgICBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgQ09OTkVDVChpbnB1dCwgb3V0cHV0KSBzZXRfYml0KGlucHV0LCAmcnBhdGNoLT5yb3V0ZVsob3V0cHV0KSAtIE9VVFBVVF9CQVNFXSk7Ci0KLSNkZWZpbmUgQ09OTkVDVF9WKGlucHV0LCBvdXRwdXQpIHNldF9iaXQoaW5wdXQsICZycGF0Y2gtPnJvdXRlX3ZbKG91dHB1dCkgLSBPVVRQVVRfQkFTRV0pOwotCi0jZGVmaW5lIE9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgbm0sIGxuLCBpKQkJXAotZG8gewkJCQkJCQlcCi0JcGF0Y2ggPSBQQVRDSChtZ3IsIHBhdGNoX24pOwkJCVwKLQlzdHJjcHkocGF0Y2gtPm5hbWUsIG5tKTsJCQlcCi0JcGF0Y2gtPmNvZGVfc3RhcnQgPSBwYyAqIDI7CQkJXAotCXBhdGNoLT5pbnB1dCA9ICgxPDwoMHgxZiZsbikpOwkJCVwKLQlwYXRjaC0+b3V0cHV0PSAoMTw8KDB4MWYmbG4pKTsJCQlcCi0JcGF0Y2gtPmlkID0gaTsJCQkJCVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKQkJCQlcCi1kbyB7CQkJCQkJCVwKLQlwYXRjaC0+Y29kZV9zaXplID0gcGMgKiAyIC0gcGF0Y2gtPmNvZGVfc3RhcnQ7CVwKLQlwYXRjaF9uKys7CQkJCQlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgR0VUX09VVFBVVF9HUFIocGF0Y2gsIGcsIGxuKQkJCVwKLWRvIHsJCQkJCQkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS50eXBlID0gR1BSX1RZUEVfSU87CVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udXNhZ2UrKzsJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubGluZSA9IGxuOwkJXAotCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7CVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBHRVRfSU5QVVRfR1BSKHBhdGNoLCBnLCBsbikJCQlcCi1kbyB7CQkJCQkJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udHlwZSA9IEdQUl9UWVBFX0lPOwlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLmxpbmUgPSBsbjsJCVwKLQlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX3VzZWQpOwlcCi0Jc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl9pbnB1dCk7CVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBHRVRfRFlOQU1JQ19HUFIocGF0Y2gsIGcpCQkJCVwKLWRvIHsJCQkJCQkJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udHlwZSA9IEdQUl9UWVBFX0RZTkFNSUM7CVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udXNhZ2UrKzsJCQlcCi0Jc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsgICAgICAgICAgCVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIGcsIG5tLCBhLCBiKQkJCVwKLWRvIHsJCQkJCQkJCVwKLQlzdHJjcHkobWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLm5hbWUsIG5tKTsJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udHlwZSA9IEdQUl9UWVBFX0NPTlRST0w7CVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udXNhZ2UrKzsJCQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLm1pbiA9IGE7CQkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5tYXggPSBiOwkJCVwKLQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgZywgMCwgYik7CQkJCVwKLQlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX3VzZWQpOwkJXAotfSB3aGlsZSgwKQotCi0jZW5kaWYgLyogX0VGWE1HUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lbXVhZHhtZy5jIGIvc291bmQvb3NzL2VtdTEwazEvZW11YWR4bWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkMmQ0Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9lbXVhZHhtZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLQotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBlbXVhZHhtZy5jIC0gQWRkcmVzcyBzcGFjZSBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlciAKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0KLS8qIEFsbG9jYXRlcyBlbXUgYWRkcmVzcyBzcGFjZSAqLwotCi1pbnQgZW11MTBrMV9hZGR4bWdyX2FsbG9jKHUzMiBzaXplLCBzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXUxNiAqcGFnZXRhYmxlID0gY2FyZC0+ZW11cGFnZXRhYmxlOwotCXUxNiBpbmRleCA9IDA7Ci0JdTE2IG51bXBhZ2VzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBDb252ZXJ0IGJ5dGVzIHRvIHBhZ2VzICovCi0JbnVtcGFnZXMgPSAoc2l6ZSAvIEVNVVBBR0VTSVpFKSArICgoc2l6ZSAlIEVNVVBBR0VTSVpFKSA/IDEgOiAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaW5kZXggPCAoTUFYUEFHRVMgLSAxKSkgewotCQlpZiAocGFnZXRhYmxlW2luZGV4XSAmIDB4ODAwMCkgewotCQkJLyogVGhpcyBibG9jayBvZiBwYWdlcyBpcyBpbiB1c2UsIGp1bXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGJsb2NrLiAqLwotCQkJaW5kZXggKz0gKHBhZ2V0YWJsZVtpbmRleF0gJiAweDdmZmYpOwotCQl9IGVsc2UgewotCQkJLyogRm91bmQgZnJlZSBibG9jayAqLwotCQkJaWYgKHBhZ2V0YWJsZVtpbmRleF0gPj0gbnVtcGFnZXMpIHsKLQotCQkJCS8qIEJsb2NrIGlzIGxhcmdlIGVub3VnaCAqLwotCi0JCQkJLyogSWYgZnJlZSBibG9jayBpcyBsYXJnZXIgdGhhbiB0aGUgYmxvY2sgcmVxdWVzdGVkCi0JCQkJICogdGhlbiBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGJsb2NrIHJlbWFpbmluZyAqLwotCQkJCWlmIChwYWdldGFibGVbaW5kZXhdID4gbnVtcGFnZXMpCi0JCQkJCXBhZ2V0YWJsZVtpbmRleCArIG51bXBhZ2VzXSA9IHBhZ2V0YWJsZVtpbmRleF0gLSBudW1wYWdlczsKLQotCQkJCXBhZ2V0YWJsZVtpbmRleF0gPSAobnVtcGFnZXMgfCAweDgwMDApOwkvKiBNYXJrIGJsb2NrIGFzIHVzZWQgKi8KLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJCXJldHVybiBpbmRleDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQmxvY2sgdG9vIHNtYWxsLCBqdW1wIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBibG9jayAqLwotCQkJCWluZGV4ICs9IHBhZ2V0YWJsZVtpbmRleF07Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgZW11IGFkZHJlc3Mgc3BhY2UuICovCi0KLXZvaWQgZW11MTBrMV9hZGR4bWdyX2ZyZWUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGluZGV4KQotewotCXUxNiAqcGFnZXRhYmxlID0gY2FyZC0+ZW11cGFnZXRhYmxlOwotCXUxNiBvcmlnc2l6ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAocGFnZXRhYmxlW2luZGV4XSAmIDB4ODAwMCkgewotCQkvKiBCbG9jayBpcyBhbGxvY2F0ZWQgLSBtYXJrIGJsb2NrIGFzIGZyZWUgKi8KLQkJb3JpZ3NpemUgPSBwYWdldGFibGVbaW5kZXhdICYgMHg3ZmZmOwotCQlwYWdldGFibGVbaW5kZXhdID0gb3JpZ3NpemU7Ci0KLQkJLyogSWYgbmV4dCBibG9jayBpcyBmcmVlLCB3ZSBjb25jYXQgYm90aCBibG9ja3MgKi8KLQkJaWYgKCEocGFnZXRhYmxlW2luZGV4ICsgb3JpZ3NpemVdICYgMHg4MDAwKSkKLQkJCXBhZ2V0YWJsZVtpbmRleF0gKz0gcGFnZXRhYmxlW2luZGV4ICsgb3JpZ3NpemVdICYgMHg3ZmZmOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGMxNmE4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgaHdhY2Nlc3MuYyAtLSBIYXJkd2FyZSBhY2Nlc3MgbGF5ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBEZWNlbWJlciA5LCAxOTk5ICAgICBKb24gVGF5bG9yICAgICAgcmV3cm90ZSB0aGUgSS9PIHN1YnN5c3RlbQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiaWNhcmRtaWQuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRnVuY3Rpb24gOiBzclRvUGl0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIElucHV0ICAgIDogc2FtcGxlUmF0ZSAtIHNhbXBsaW5nIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBSZXR1cm4gICA6IHBpdGNoIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogQWJvdXQgICAgOiBjb252ZXJ0IHNhbXBsaW5nIHJhdGUgdG8gcGl0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIE5vdGUgICAgIDogZm9yIDgwMTAsIHNhbXBsaW5nIHJhdGUgaXMgYXQgNDhrSHosIHRoaXMgZnVuY3Rpb24gc2hvdWxkICAgKgotKiAgICAgICAgICAgIGJlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc3JUb1BpdGNoKHUzMiBzYW1wbGVSYXRlKQotewotCWludCBpOwotCi0JLyogRklYTUU6IFRoZXNlIHRhYmxlcyBzaG91bGQgYmUgZGVmaW5lZCBpbiBhIGhlYWRlcmZpbGUgKi8KLQlzdGF0aWMgdTMyIGxvZ01hZ1RhYmxlWzEyOF0gPSB7Ci0JCTB4MDAwMDAsIDB4MDJkZmMsIDB4MDViOWUsIDB4MDg4ZTYsIDB4MGI1ZDYsIDB4MGUyNmYsIDB4MTBlYjMsIDB4MTNhYTIsCi0JCTB4MTY2M2YsIDB4MTkxOGEsIDB4MWJjODQsIDB4MWU3MmUsIDB4MjExOGIsIDB4MjNiOWEsIDB4MjY1NWQsIDB4MjhlZDUsCi0JCTB4MmI4MDMsIDB4MmUwZTgsIDB4MzA5ODUsIDB4MzMxZGIsIDB4MzU5ZWIsIDB4MzgxYjYsIDB4M2E5M2QsIDB4M2QwODEsCi0JCTB4M2Y3ODIsIDB4NDFlNDIsIDB4NDQ0YzEsIDB4NDZiMDEsIDB4NDkxMDEsIDB4NGI2YzQsIDB4NGRjNDksIDB4NTAxOTEsCi0JCTB4NTI2OWUsIDB4NTRiNmYsIDB4NTcwMDYsIDB4NTk0NjMsIDB4NWI4ODgsIDB4NWRjNzQsIDB4NjAwMjksIDB4NjIzYTcsCi0JCTB4NjQ2ZWUsIDB4NjZhMDAsIDB4NjhjZGQsIDB4NmFmODYsIDB4NmQxZmEsIDB4NmY0M2MsIDB4NzE2NGIsIDB4NzM4MjksCi0JCTB4NzU5ZDQsIDB4NzdiNGYsIDB4NzljOWEsIDB4N2JkYjUsIDB4N2RlYTEsIDB4N2ZmNWUsIDB4ODFmZWQsIDB4ODQwNGUsCi0JCTB4ODYwODIsIDB4ODgwODksIDB4OGEwNjQsIDB4OGMwMTQsIDB4OGRmOTgsIDB4OGZlZjEsIDB4OTFlMjAsIDB4OTNkMjYsCi0JCTB4OTVjMDEsIDB4OTdhYjQsIDB4OTk5M2UsIDB4OWI3OWYsIDB4OWQ1ZDksIDB4OWYzZWMsIDB4YTExZDgsIDB4YTJmOWQsCi0JCTB4YTRkM2MsIDB4YTZhYjUsIDB4YTg4MDgsIDB4YWE1MzcsIDB4YWMyNDEsIDB4YWRmMjYsIDB4YWZiZTcsIDB4YjE4ODUsCi0JCTB4YjM1MDAsIDB4YjUxNTcsIDB4YjZkOGMsIDB4Yjg5OWYsIDB4YmE1OGYsIDB4YmMxNWUsIDB4YmRkMGMsIDB4YmY4OTksCi0JCTB4YzE0MDQsIDB4YzJmNTAsIDB4YzRhN2IsIDB4YzY1ODcsIDB4YzgwNzMsIDB4YzliM2YsIDB4Y2I1ZWQsIDB4Y2QwN2MsCi0JCTB4Y2VhZWMsIDB4ZDA1M2YsIDB4ZDFmNzMsIDB4ZDM5OGEsIDB4ZDUzODQsIDB4ZDZkNjAsIDB4ZDg3MjAsIDB4ZGEwYzMsCi0JCTB4ZGJhNGEsIDB4ZGQzYjQsIDB4ZGVkMDMsIDB4ZTA2MzYsIDB4ZTFmNGUsIDB4ZTM4NGEsIDB4ZTUxMmMsIDB4ZTY5ZjMsCi0JCTB4ZTgyOWYsIDB4ZTliMzEsIDB4ZWIzYTksIDB4ZWNjMDgsIDB4ZWU0NGMsIDB4ZWZjNzgsIDB4ZjE0OGEsIDB4ZjJjODMsCi0JCTB4ZjQ0NjMsIDB4ZjVjMmEsIDB4ZjczZGEsIDB4ZjhiNzEsIDB4ZmEyZjAsIDB4ZmJhNTcsIDB4ZmQxYTcsIDB4ZmU4ZGYKLQl9OwotCi0Jc3RhdGljIGNoYXIgbG9nU2xvcGVUYWJsZVsxMjhdID0gewotCQkweDVjLCAweDVjLCAweDViLCAweDVhLCAweDVhLCAweDU5LCAweDU4LCAweDU4LAotCQkweDU3LCAweDU2LCAweDU2LCAweDU1LCAweDU1LCAweDU0LCAweDUzLCAweDUzLAotCQkweDUyLCAweDUyLCAweDUxLCAweDUxLCAweDUwLCAweDUwLCAweDRmLCAweDRmLAotCQkweDRlLCAweDRkLCAweDRkLCAweDRkLCAweDRjLCAweDRjLCAweDRiLCAweDRiLAotCQkweDRhLCAweDRhLCAweDQ5LCAweDQ5LCAweDQ4LCAweDQ4LCAweDQ3LCAweDQ3LAotCQkweDQ3LCAweDQ2LCAweDQ2LCAweDQ1LCAweDQ1LCAweDQ1LCAweDQ0LCAweDQ0LAotCQkweDQzLCAweDQzLCAweDQzLCAweDQyLCAweDQyLCAweDQyLCAweDQxLCAweDQxLAotCQkweDQxLCAweDQwLCAweDQwLCAweDQwLCAweDNmLCAweDNmLCAweDNmLCAweDNlLAotCQkweDNlLCAweDNlLCAweDNkLCAweDNkLCAweDNkLCAweDNjLCAweDNjLCAweDNjLAotCQkweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNhLCAweDNhLCAweDNhLCAweDM5LAotCQkweDM5LCAweDM5LCAweDM5LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM3LAotCQkweDM3LCAweDM3LCAweDM3LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM1LAotCQkweDM1LCAweDM1LCAweDM1LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LAotCQkweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDMyLCAweDMyLCAweDMyLCAweDMyLAotCQkweDMyLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMwLCAweDMwLAotCQkweDMwLCAweDMwLCAweDMwLCAweDJmLCAweDJmLCAweDJmLCAweDJmLCAweDJmCi0JfTsKLQotCWlmIChzYW1wbGVSYXRlID09IDApCi0JCXJldHVybiAwOwkvKiBCYWlsIG91dCBpZiBubyBsZWFkaW5nICIxIiAqLwotCi0Jc2FtcGxlUmF0ZSAqPSAxMTE4NTsJLyogU2NhbGUgNDgwMDAgdG8gMHgyMDAwMjM4MCAqLwotCi0JZm9yIChpID0gMzE7IGkgPiAwOyBpLS0pIHsKLQkJaWYgKHNhbXBsZVJhdGUgJiAweDgwMDAwMDAwKSB7CS8qIERldGVjdCBsZWFkaW5nICIxIiAqLwotCQkJcmV0dXJuICh1MzIpICgoKHMzMikgKGkgLSAxNSkgPDwgMjApICsKLQkJCQkgICAgICBsb2dNYWdUYWJsZVsweDdmICYgKHNhbXBsZVJhdGUgPj4gMjQpXSArCi0JCQkJICAgICAgKDB4N2YgJiAoc2FtcGxlUmF0ZSA+PiAxNykpICogbG9nU2xvcGVUYWJsZVsweDdmICYgKHNhbXBsZVJhdGUgPj4gMjQpXSk7Ci0JCX0KLQkJc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGUgPDwgMTsKLQl9Ci0KLQlEUEYoMiwgInNyVG9QaXRjaDogQlVHIVxuIik7Ci0JcmV0dXJuIDA7CQkvKiBTaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiB3cml0ZS9yZWFkIFBDSSBmdW5jdGlvbiAwIHJlZ2lzdGVycyAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBlbXUxMGsxX3dyaXRlZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAocmVnICYgMHhmZjAwMDAwMCkgewotCQl1MzIgbWFzazsKLQkJdTggc2l6ZSwgb2Zmc2V0OwotCi0JCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7Ci0JCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKLQkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKLQkJZGF0YSA9IChkYXRhIDw8IG9mZnNldCkgJiBtYXNrOwotCQlyZWcgJj0gMHg3ZjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlkYXRhIHw9IGlubChjYXJkLT5pb2Jhc2UgKyByZWcpICYgfm1hc2s7Ci0JCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgcmVnKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgcmVnKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybjsKLX0KLQotI2lmZGVmIERCR0VNVQotdm9pZCBlbXUxMGsxX3dyaXRlZm4wXzIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIGRhdGEsIGludCBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHNpemUgPT0gMzIpCi0JCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgKHJlZyAmIDB4MUYpKTsKLQllbHNlIGlmIChzaXplID09IDE2KQotCQlvdXR3KGRhdGEsIGNhcmQtPmlvYmFzZSArIChyZWcgJiAweDFGKSk7Ci0JZWxzZQotCQlvdXRiKGRhdGEsIGNhcmQtPmlvYmFzZSArIChyZWcgJiAweDFGKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgIC8qICBEQkdFTVUgICovCi0KLXUzMiBlbXUxMGsxX3JlYWRmbjAoc3RydWN0IGVtdTEwazFfY2FyZCAqIGNhcmQsIHUzMiByZWcpCi17Ci0JdTMyIHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKLQkJdTMyIG1hc2s7Ci0JCXU4IHNpemUsIG9mZnNldDsKLQotCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOwotCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7Ci0JCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0JCXJlZyAmPSAweDdmOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyByZWcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJcmV0dXJuICh2YWwgJiBtYXNrKSA+PiBvZmZzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyByZWcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiB2YWw7Ci0JfQotfQotCi12b2lkIGVtdTEwazFfdGltZXJfc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKiBjYXJkLCB1MTYgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlvdXR3KGRhdGEgJiBUSU1FUl9SQVRFX01BU0ssIGNhcmQtPmlvYmFzZSArIFRJTUVSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogd3JpdGUvcmVhZCBFbXUxMGsxIHBvaW50ZXItb2Zmc2V0IHJlZ2lzdGVyIHNldCwgYWNjZXNzZWQgdGhyb3VnaCAgICAgICoKLSogIHRoZSBQVFIgYW5kIERBVEEgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEFfUFRSX0FERFJFU1NfTUFTSyAweDBmZmYwMDAwCi12b2lkIHNibGl2ZV93cml0ZXB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgcmVnLCB1MzIgY2hhbm5lbCwgdTMyIGRhdGEpCi17Ci0JdTMyIHJlZ3B0cjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmVncHRyID0gKChyZWcgPDwgMTYpICYgQV9QVFJfQUREUkVTU19NQVNLKSB8IChjaGFubmVsICYgUFRSX0NIQU5ORUxOVU1fTUFTSyk7Ci0KLQlpZiAocmVnICYgMHhmZjAwMDAwMCkgewotCQl1MzIgbWFzazsKLQkJdTggc2l6ZSwgb2Zmc2V0OwotCi0JCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7Ci0JCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKLQkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKLQkJZGF0YSA9IChkYXRhIDw8IG9mZnNldCkgJiBtYXNrOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOwotCQlkYXRhIHw9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKSAmIH5tYXNrOwotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIERBVEEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7Ci0JCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgREFUQSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9Ci19Ci0KLS8qIC4uLiA6ICBkYXRhLCByZWcsIC4uLiAsIFRBR0xJU1RfRU5EICovCi12b2lkIHNibGl2ZV93cml0ZXB0cl90YWcoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIGNoYW5uZWwsIC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICB1MzIgcmVnOwotCi0JdmFfc3RhcnQoYXJncywgY2hhbm5lbCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCXdoaWxlICgocmVnID0gdmFfYXJnKGFyZ3MsIHUzMikpICE9IFRBR0xJU1RfRU5EKSB7Ci0JCXUzMiBkYXRhID0gdmFfYXJnKGFyZ3MsIHUzMik7Ci0JCXUzMiByZWdwdHIgPSAoKChyZWcgPDwgMTYpICYgQV9QVFJfQUREUkVTU19NQVNLKQotCQkJICAgICAgfCAoY2hhbm5lbCAmIFBUUl9DSEFOTkVMTlVNX01BU0spKTsKLQkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7Ci0JCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7Ci0JCQlpbnQgc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7Ci0JCQl1MzIgbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKLQkJCWRhdGEgPSAoZGF0YSA8PCBvZmZzZXQpICYgbWFzazsKLQotCQkJZGF0YSB8PSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSkgJiB+bWFzazsKLQkJfQotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIERBVEEpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQl2YV9lbmQoYXJncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXUzMiBzYmxpdmVfcmVhZHB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICogY2FyZCwgdTMyIHJlZywgdTMyIGNoYW5uZWwpCi17Ci0JdTMyIHJlZ3B0ciwgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyZWdwdHIgPSAoKHJlZyA8PCAxNikgJiBBX1BUUl9BRERSRVNTX01BU0spIHwgKGNoYW5uZWwgJiBQVFJfQ0hBTk5FTE5VTV9NQVNLKTsKLQotCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7Ci0JCXUzMiBtYXNrOwotCQl1OCBzaXplLCBvZmZzZXQ7Ci0KLQkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKLQkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOwotCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOwotCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlyZXR1cm4gKHZhbCAmIG1hc2spID4+IG9mZnNldDsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKLQkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJcmV0dXJuIHZhbDsKLQl9Ci19Ci0KLXZvaWQgZW11MTBrMV9pcnFfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiBpcnFfbWFzaykKLXsKLQl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwiZW11MTBrMV9pcnFfZW5hYmxlKClcbiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIElOVEUpIHwgaXJxX21hc2s7Ci0gICAgICAgIG91dGwodmFsLCBjYXJkLT5pb2Jhc2UgKyBJTlRFKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuOwotfQotCi12b2lkIGVtdTEwazFfaXJxX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIGlycV9tYXNrKQotewotICAgICAgICB1MzIgdmFsOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgICAgIERQRigyLCJlbXUxMGsxX2lycV9kaXNhYmxlKClcbiIpOwotCi0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIHZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBJTlRFKSAmIH5pcnFfbWFzazsKLSAgICAgICAgb3V0bCh2YWwsIGNhcmQtPmlvYmFzZSArIElOVEUpOwotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIHJldHVybjsKLX0KLQotdm9pZCBlbXUxMGsxX2NsZWFyX3N0b3Bfb25fbG9vcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgdm9pY2VudW0pCi17Ci0JLyogVm9pY2UgaW50ZXJydXB0ICovCi0JaWYgKHZvaWNlbnVtID49IDMyKQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgU09MRUggfCAoKDB4MDEwMCB8ICh2b2ljZW51bSAtIDMyKSkgPDwgMTYpLCAwLCAwKTsKLQllbHNlCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTT0xFTCB8ICgoMHgwMTAwIHwgdm9pY2VudW0pIDw8IDE2KSwgMCwgMCk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHNibGl2ZV93Y3dhaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHdhaXQpCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgdUNvdW50OwotCXUzMiBuZXd0aW1lID0gMCwgY3VydGltZTsKLQotCWN1cnRpbWUgPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgV0NfU0FNUExFQ09VTlRFUik7Ci0Jd2hpbGUgKHdhaXQtLSkgewotCQl1Q291bnQgPSAwOwotCQl3aGlsZSAodUNvdW50KysgPCBUSU1FT1VUKSB7Ci0JCQluZXd0aW1lID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIFdDX1NBTVBMRUNPVU5URVIpOwotCQkJaWYgKG5ld3RpbWUgIT0gY3VydGltZSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmICh1Q291bnQgPj0gVElNRU9VVCkKLQkJCWJyZWFrOwotCi0JCWN1cnRpbWUgPSBuZXd0aW1lOwotCX0KLX0KLQotdTE2IGVtdTEwazFfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOwotCXUxNiBkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0Jb3V0YihyZWcsIGNhcmQtPmlvYmFzZSArIEFDOTdBRERSRVNTKTsKLQlkYXRhID0gaW53KGNhcmQtPmlvYmFzZSArIEFDOTdEQVRBKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBkYXRhOwotfQotCi12b2lkIGVtdTEwazFfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbHVlKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0Jb3V0YihyZWcsIGNhcmQtPmlvYmFzZSArIEFDOTdBRERSRVNTKTsKLQlvdXR3KHZhbHVlLCBjYXJkLT5pb2Jhc2UgKyBBQzk3REFUQSk7Ci0Jb3V0YiggQUM5N19FWFRFTkRFRF9JRCwgY2FyZC0+aW9iYXNlICsgQUM5N0FERFJFU1MpOyAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICBNUFUgYWNjZXNzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBlbXUxMGsxX21wdV93cml0ZV9kYXRhKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHU4IGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQlpZiAoKHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVTVEFULDApICYgTVVTVEFUX09SRFlOKSA9PSAwKSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVURBVEEsIDAsIGRhdGEpOwotCQkJcmV0ID0gMDsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmICgoaW5iKGNhcmQtPmlvYmFzZSArIE1VU1RBVCkgJiBNVVNUQVRfT1JEWU4pID09IDApIHsKLQkJCW91dGIoZGF0YSwgY2FyZC0+aW9iYXNlICsgTVVEQVRBKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBlbXUxMGsxX21wdV9yZWFkX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTggKiBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJaWYgKChzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VU1RBVCwwKSAmIE1VU1RBVF9JUkRZTikgPT0gMCkgewotCQkJKmRhdGEgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VREFUQSwwKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoKGluYihjYXJkLT5pb2Jhc2UgKyBNVVNUQVQpICYgTVVTVEFUX0lSRFlOKSA9PSAwKSB7Ci0JCQkqZGF0YSA9IGluYihjYXJkLT5pb2Jhc2UgKyBNVURBVEEpOwotCQkJcmV0ID0gMDsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGVtdTEwazFfbXB1X3Jlc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdTggc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1X3Jlc2V0KClcbiIpOwotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJaWYgKGNhcmQtPm1wdWFjcWNvdW50ID09IDApIHsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VQ01ELCAwLCBNVUNNRF9SRVNFVCk7Ci0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVDTUQsIDAsIE1VQ01EX1JFU0VUKTsKLQkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVUNNRCwgMCwgTVVDTURfRU5URVJVQVJUTU9ERSk7Ci0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCQkJc3RhdHVzID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVURBVEEsIDApOwotCQkJaWYgKHN0YXR1cyA9PSAweGZlKQotCQkJCXJldHVybiAwOwotCQkJZWxzZQotCQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWlmIChjYXJkLT5tcHVhY3Fjb3VudCA9PSAwKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJb3V0YihNVUNNRF9SRVNFVCwgY2FyZC0+aW9iYXNlICsgTVVDTUQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJb3V0YihNVUNNRF9SRVNFVCwgY2FyZC0+aW9iYXNlICsgTVVDTUQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJb3V0YihNVUNNRF9FTlRFUlVBUlRNT0RFLCBjYXJkLT5pb2Jhc2UgKyBNVUNNRCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlzdGF0dXMgPSBpbmIoY2FyZC0+aW9iYXNlICsgTVVEQVRBKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHN0YXR1cyA9PSAweGZlKQotCQkJCXJldHVybiAwOwotCQkJZWxzZQotCQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLX0KLQotaW50IGVtdTEwazFfbXB1X2FjcXVpcmUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQkvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLwotCSsrY2FyZC0+bXB1YWNxY291bnQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfbXB1X3JlbGVhc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQkvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLwotCS0tY2FyZC0+bXB1YWNxY291bnQ7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmggYi9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWUyN2JkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgaHdhY2Nlc3MuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlCQkgICAgQXV0aG9yCSAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tCQkgICAgLS0tLS0tCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX0hXQUNDRVNTX0gKLSNkZWZpbmUgX0hXQUNDRVNTX0gKLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJlZnhtZ3IuaCIKLSNpbmNsdWRlICJwYXNzdGhyb3VnaC5oIgotI2luY2x1ZGUgIm1pZGkuaCIKLQotI2RlZmluZSBFTVVQQUdFU0laRSAgICAgNDA5NiAgICAgICAgICAgIC8qIGRvbid0IGNoYW5nZSAqLwotI2RlZmluZSBOVU1fRyAgICAgICAgICAgNjQgICAgICAgICAgICAgIC8qIHVzZSBhbGwgY2hhbm5lbHMgKi8KLSNkZWZpbmUgTlVNX0ZYU0VORFMgICAgIDQgICAgICAgICAgICAgICAvKiBkb24ndCBjaGFuZ2UgKi8KLS8qIHNldHRpbmcgdGhpcyB0byBvdGhlciB0aGFuIGEgcG93ZXIgb2YgdHdvIG1heSBicmVhayBzb21lIGFwcGxpY2F0aW9ucyAqLwotI2RlZmluZSBNQVhCVUZTSVpFCTY1NTM2Ci0jZGVmaW5lIE1BWFBBR0VTCTgxOTIgCi0jZGVmaW5lIEJVRk1BWFBBR0VTICAgICAoTUFYQlVGU0laRSAvIFBBR0VfU0laRSkKLQotI2RlZmluZSBGTEFHU19BVkFJTEFCTEUgICAgIDB4MDAwMQotI2RlZmluZSBGTEFHU19SRUFEWSAgICAgICAgIDB4MDAwMgotCi1zdHJ1Y3QgbWVtaGFuZGxlCi17Ci0JZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwotCXZvaWQgKmFkZHI7Ci0JdTMyIHNpemU7Ci19OwotCi0jZGVmaW5lIERFQlVHX0xFVkVMIDIKLQotI2lmZGVmIEVNVTEwSzFfREVCVUcKLSMgZGVmaW5lIERQRChsZXZlbCx4LHkuLi4pIGRvIHtpZihsZXZlbCA8PSBERUJVR19MRVZFTCkgcHJpbnRrKCBLRVJOX05PVElDRSAiZW11MTBrMTogJXM6ICVkOiAiIHggLCBfX0ZJTEVfXyAsIF9fTElORV9fICwgeSApO30gd2hpbGUoMCkKLSMgZGVmaW5lIERQRihsZXZlbCx4KSAgIGRvIHtpZihsZXZlbCA8PSBERUJVR19MRVZFTCkgcHJpbnRrKCBLRVJOX05PVElDRSAiZW11MTBrMTogJXM6ICVkOiAiIHggLCBfX0ZJTEVfXyAsIF9fTElORV9fICk7fSB3aGlsZSgwKQotI2Vsc2UKLSMgZGVmaW5lIERQRChsZXZlbCx4LHkuLi4pIGRvIHsgfSB3aGlsZSAoMCkgLyogbm90IGRlYnVnZ2luZzogbm90aGluZyAqLwotIyBkZWZpbmUgRFBGKGxldmVsLHgpIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZiAvKiBFTVUxMEsxX0RFQlVHICovCi0KLSNkZWZpbmUgRVJST1IoKSBEUEYoMSwiZXJyb3JcbiIpCi0KLS8qIERBVEEgU1RSVUNUVVJFUyAqLwotCi1zdHJ1Y3QgZW11MTBrMV93YXZlb3V0Ci17Ci0JdTMyIHNlbmRfcm91dGluZ1szXTsKLQkvLyBhdWRpZ3kgb25seToKLQl1MzIgc2VuZF9yb3V0aW5nMlszXTsKLQotCXUzMiBzZW5kX2RjYmFbM107Ci0JLy8gYXVkaWd5IG9ubHk6Ci0JdTMyIHNlbmRfaGdmZVszXTsKLX07Ci0jZGVmaW5lIFJPVVRFX1BDTSAwCi0jZGVmaW5lIFJPVVRFX1BUIDEKLSNkZWZpbmUgUk9VVEVfUENNMSAyCi0KLSNkZWZpbmUgU0VORF9NT05PIDAKLSNkZWZpbmUgU0VORF9MRUZUIDEKLSNkZWZpbmUgU0VORF9SSUdIVCAyCi0KLXN0cnVjdCBlbXUxMGsxX3dhdmVpbgotewotICAgICAgICBzdHJ1Y3Qgd2lpbnN0ICphYzk3OwotICAgICAgICBzdHJ1Y3Qgd2lpbnN0ICptaWM7Ci0gICAgICAgIHN0cnVjdCB3aWluc3QgKmZ4OwotCi0gICAgICAgIHU4IHJlY3NyYzsKLSAgICAgICAgdTMyIGZ4d2M7Ci19OwotCi0jZGVmaW5lIENNRF9SRUFEIDEKLSNkZWZpbmUgQ01EX1dSSVRFIDIKLQotc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwgewotICAgICAgICB1MzIgY21kOwotICAgICAgICB1MzIgdmFsWzkwXTsKLX07Ci0KLS8qIGJvZ3VzIGlvY3RscyBudW1iZXJzIHRvIGVzY2FwZSBmcm9tIE9TUyBtaXhlciBsaW1pdGF0aW9ucyAqLwotI2RlZmluZSBDTURfV1JJVEVGTjAgICAgICAgICAgICBfSU9XKCdEJywgMCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9SRUFERk4wCQlfSU9SKCdEJywgMSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfV1JJVEVQVFIJCV9JT1coJ0QnLCAyLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9SRUFEUFRSCQlfSU9SKCdEJywgMywgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfU0VUUkVDU1JDCQlfSU9XKCdEJywgNCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfR0VUUkVDU1JDCQlfSU9SKCdEJywgNSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfR0VUVk9JQ0VQQVJBTQlfSU9SKCdEJywgNiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfU0VUVk9JQ0VQQVJBTQlfSU9XKCdEJywgNywgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfR0VUUEFUQ0gJCV9JT1IoJ0QnLCA4LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9HRVRHUFIJCV9JT1IoJ0QnLCA5LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9HRVRDVExHUFIgICAgICAgICAgIF9JT1IoJ0QnLCAxMCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9TRVRQQVRDSAkJX0lPVygnRCcsIDExLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9TRVRHUFIJCV9JT1coJ0QnLCAxMiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfU0VUQ1RMR1BSCQlfSU9XKCdEJywgMTMsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfU0VUR1BPVVQJCV9JT1coJ0QnLCAxNCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9HRVRHUFIyT1NTCQlfSU9SKCdEJywgMTUsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfU0VUR1BSMk9TUwkJX0lPVygnRCcsIDE2LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1NFVE1DSF9GWAkJX0lPVygnRCcsIDE3LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1NFVFBBU1NUSFJPVUdICV9JT1coJ0QnLCAxOCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9QUklWQVRFM19WRVJTSU9OCV9JT1coJ0QnLCAxOSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9BQzk3X0JPT1NUCQlfSU9XKCdEJywgMjAsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotCi0vL3VwIHRoaXMgbnVtYmVyIHdoZW4gYnJlYWtpbmcgY29tcGF0aWJpbGl0eQotI2RlZmluZSBQUklWQVRFM19WRVJTSU9OIDIKLQotc3RydWN0IGVtdTEwazFfY2FyZCAKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQlzdHJ1Y3QgbWVtaGFuZGxlCXZpcnR1YWxwYWdldGFibGU7Ci0Jc3RydWN0IG1lbWhhbmRsZQl0YW5rbWVtOwotCXN0cnVjdCBtZW1oYW5kbGUJc2lsZW50cGFnZTsKLQotCXNwaW5sb2NrX3QJCWxvY2s7Ci0KLQl1OAkJCXZvaWNldGFibGVbTlVNX0ddOwotCXUxNgkJCWVtdXBhZ2V0YWJsZVtNQVhQQUdFU107Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkCXRpbWVyczsKLQl1MTYJCQl0aW1lcl9kZWxheTsKLQlzcGlubG9ja190CQl0aW1lcl9sb2NrOwotCi0Jc3RydWN0IHBjaV9kZXYJCSpwY2lfZGV2OwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGlvYmFzZTsKLQl1bnNpZ25lZCBsb25nCQlsZW5ndGg7Ci0JdW5zaWduZWQgc2hvcnQJCW1vZGVsOwotCXVuc2lnbmVkIGludCBpcnE7IAotCi0JaW50CWF1ZGlvX2RldjsKLQlpbnQJYXVkaW9fZGV2MTsKLQlpbnQJbWlkaV9kZXY7Ci0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQlpbnQgc2VxX2RldjsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICpzZXFfbWlkaWRldjsKLSNlbmRpZgotCi0Jc3RydWN0IGFjOTdfY29kZWMgKmFjOTc7Ci0JaW50IGFjOTdfc3VwcG9ydGVkX21peGVyczsKLQlpbnQgYWM5N19zdGVyZW9fbWl4ZXJzOwotCi0JLyogTnVtYmVyIG9mIGZpcnN0IGZ4IHZvaWNlIGZvciBtdWx0aWNoYW5uZWwgb3V0cHV0ICovCi0JdTggbWNoYW5uZWxfZng7Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZW91dAl3YXZlb3V0OwotCXN0cnVjdCBlbXUxMGsxX3dhdmVpbgl3YXZlaW47Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0CSptcHVvdXQ7Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4JKm1wdWluOwotCi0Jc3RydWN0IG11dGV4CQlvcGVuX3NlbTsKLQltb2RlX3QJCQlvcGVuX21vZGU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OwotCi0JdTMyCSAgICBtcHVhY3Fjb3VudDsJICAvLyBNcHUgYWNxdWlyZSBjb3VudAotCXUzMgkgICAgaGFzX3Rvc2xpbms7CSAgICAgICAvLyBUT1NMaW5rIGRldGVjdGlvbgotCi0JdTggY2hpcHJldjsgICAgICAgICAgICAgICAgICAgIC8qIENoaXAgcmV2aXNpb24gICAgICAgICAgICAgICAgKi8KLQl1OCBpc19hdWRpZ3k7Ci0JdTggaXNfYXBzOwotCi0Jc3RydWN0IHBhdGNoX21hbmFnZXIgbWdyOwotCXN0cnVjdCBwdF9kYXRhIHB0OwotfTsKLQotaW50IGVtdTEwazFfYWRkeG1ncl9hbGxvYyh1MzIsIHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci12b2lkIGVtdTEwazFfYWRkeG1ncl9mcmVlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgaW50KTsKLQotaW50IGVtdTEwazFfZmluZF9jb250cm9sX2dwcihzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci12b2lkIGVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgaW50ICwgczMyLCBpbnQgKTsKLQotdm9pZCBlbXUxMGsxX3NldF92b2x1bWVfZ3ByKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgaW50LCBzMzIsIGludCk7Ci0KLQotI2RlZmluZSBWT0xfNkJJVCAweDQwCi0jZGVmaW5lIFZPTF81QklUIDB4MjAKLSNkZWZpbmUgVk9MXzRCSVQgMHgxMAotCi0jZGVmaW5lIFRJTUVPVVQgCQkgICAgMTYzODQKLQotdTMyIHNyVG9QaXRjaCh1MzIpOwotCi1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCBlbXUxMGsxX2RldnM7Ci0KLS8qIEhhcmR3YXJlIEFic3RyYWN0aW9uIExheWVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KLQotdm9pZCBlbXUxMGsxX3dyaXRlZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCB1MzIpOwotdm9pZCBlbXUxMGsxX3dyaXRlZm4wXzIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIsIHUzMiwgaW50KTsKLXUzMiBlbXUxMGsxX3JlYWRmbjAoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIpOwotCi12b2lkIGVtdTEwazFfdGltZXJfc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTE2KTsKLQotdm9pZCBzYmxpdmVfd3JpdGVwdHIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIsIHUzMiwgdTMyKTsKLXZvaWQgc2JsaXZlX3dyaXRlcHRyX3RhZyhzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgLi4uKTsKLSNkZWZpbmUgVEFHTElTVF9FTkQJMAotCi11MzIgc2JsaXZlX3JlYWRwdHIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIgLCB1MzIgKTsKLQotdm9pZCBlbXUxMGsxX2lycV9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIpOwotdm9pZCBlbXUxMGsxX2lycV9kaXNhYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLXZvaWQgZW11MTBrMV9jbGVhcl9zdG9wX29uX2xvb3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIpOwotCi0vKiBBQzk3IENvZGVjIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbiAqLwotdTE2IGVtdTEwazFfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICosIHU4KTsKLXZvaWQgZW11MTBrMV9hYzk3X3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICosIHU4LCB1MTYpOwotCi0vKiBNUFUgYWNjZXNzIGZ1bmN0aW9uKi8KLWludCBlbXUxMGsxX21wdV93cml0ZV9kYXRhKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTgpOwotaW50IGVtdTEwazFfbXB1X3JlYWRfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHU4ICopOwotaW50IGVtdTEwazFfbXB1X3Jlc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci1pbnQgZW11MTBrMV9tcHVfYWNxdWlyZShzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1X3JlbGVhc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLQotI2VuZGlmICAvKiBfSFdBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaWNhcmRtaWQuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkbWlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNmVmNDEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvaWNhcmRtaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBpc2JsaXZlX21pZC5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9JQ0FSRE1JRElfSAotI2RlZmluZSBfSUNBUkRNSURJX0gKLQotLyogTUlESSBkZWZpbmVzICovCi0jZGVmaW5lIE1JRElfREFUQV9GSVJTVCAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBNSURJX0RBVEFfTEFTVCAgICAgICAgICAgICAgICAgIDB4N0YKLSNkZWZpbmUgTUlESV9TVEFUVVNfRklSU1QgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIE1JRElfU1RBVFVTX0xBU1QgICAgICAgICAgICAgICAgMHhGRgotCi0vKiBDaGFubmVsIHN0YXR1cyBieXRlcyAqLwotI2RlZmluZSBNSURJX1NUQVRVU19DSEFOTkVMX0ZJUlNUICAgICAgIDB4ODAKLSNkZWZpbmUgTUlESV9TVEFUVVNfQ0hBTk5FTF9MQVNUICAgICAgICAweEUwCi0jZGVmaW5lIE1JRElfU1RBVFVTX0NIQU5ORUxfTUFTSyAgICAgICAgMHhGMAotCi0vKiBDaGFubmVsIHZvaWNlIG1lc3NhZ2VzICovCi0jZGVmaW5lIE1JRElfVk9JQ0VfTk9URV9PRkYgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBNSURJX1ZPSUNFX05PVEVfT04gICAgICAgICAgICAgIDB4OTAKLSNkZWZpbmUgTUlESV9WT0lDRV9QT0xZX1BSRVNTVVJFICAgICAgICAweEEwCi0jZGVmaW5lIE1JRElfVk9JQ0VfQ09OVFJPTF9DSEFOR0UgICAgICAgMHhCMAotI2RlZmluZSBNSURJX1ZPSUNFX1BST0dSQU1fQ0hBTkdFICAgICAgIDB4QzAKLSNkZWZpbmUgTUlESV9WT0lDRV9DSEFOTkVMX1BSRVNTVVJFICAgICAweEQwCi0jZGVmaW5lIE1JRElfVk9JQ0VfUElUQ0hfQkVORCAgICAgICAgICAgMHhFMAotCi0vKiBDaGFubmVsIG1vZGUgbWVzc2FnZXMgKi8KLSNkZWZpbmUgTUlESV9NT0RFX0NIQU5ORUwgICAgICAgICAgICAgICBNSURJX1ZPSUNFX0NPTlRST0xfQ0hBTkdFCi0KLS8qIFN5c3RlbSBzdGF0dXMgYnl0ZXMgKi8KLSNkZWZpbmUgTUlESV9TVEFUVVNfU1lTVEVNX0ZJUlNUICAgICAgICAweEYwCi0jZGVmaW5lIE1JRElfU1RBVFVTX1NZU1RFTV9MQVNUICAgICAgICAgMHhGRgotCi0vKiBTeXN0ZW0gZXhjbHVzaXZlIG1lc3NhZ2VzICovCi0jZGVmaW5lIE1JRElfU1lTRVhfQkVHSU4gICAgICAgICAgICAgICAgMHhGMAotI2RlZmluZSBNSURJX1NZU0VYX0VPWCAgICAgICAgICAgICAgICAgIDB4RjcKLQotLyogU3lzdGVtIGNvbW1vbiBtZXNzYWdlcyAqLwotI2RlZmluZSBNSURJX0NPTU1PTl9UQ1FGICAgICAgICAgICAgICAgIDB4RjEJLyogVGltZSBjb2RlIHF1YXJ0ZXIgZnJhbWUgICovCi0jZGVmaW5lIE1JRElfQ09NTU9OX1NPTkdfUE9TSVRJT04gICAgICAgMHhGMgotI2RlZmluZSBNSURJX0NPTU1PTl9TT05HX1NFTEVDVCAgICAgICAgIDB4RjMKLSNkZWZpbmUgTUlESV9DT01NT05fVU5ERUZJTkVEX0Y0ICAgICAgICAweEY0Ci0jZGVmaW5lIE1JRElfQ09NTU9OX1VOREVGSU5FRF9GNSAgICAgICAgMHhGNQotI2RlZmluZSBNSURJX0NPTU1PTl9UVU5FX1JFUVVFU1QgICAgICAgIDB4RjYKLQotLyogU3lzdGVtIHJlYWwtdGltZSBtZXNzYWdlcyAqLwotI2RlZmluZSBNSURJX1JUSU1FX1RJTUlOR19DTE9DSyAgICAgICAgIDB4RjgKLSNkZWZpbmUgTUlESV9SVElNRV9VTkRFRklORURfRjkgICAgICAgICAweEY5Ci0jZGVmaW5lIE1JRElfUlRJTUVfU1RBUlQgICAgICAgICAgICAgICAgMHhGQQotI2RlZmluZSBNSURJX1JUSU1FX0NPTlRJTlVFICAgICAgICAgICAgIDB4RkIKLSNkZWZpbmUgTUlESV9SVElNRV9TVE9QICAgICAgICAgICAgICAgICAweEZDCi0jZGVmaW5lIE1JRElfUlRJTUVfVU5ERUZJTkVEX0ZEICAgICAgICAgMHhGRAotI2RlZmluZSBNSURJX1JUSU1FX0FDVElWRV9TRU5TSU5HICAgICAgIDB4RkUKLSNkZWZpbmUgTUlESV9SVElNRV9TWVNURU1fUkVTRVQgICAgICAgICAweEZGCi0KLS8qIEZsYWdzIGZvciBmbGFncyBwYXJtIG9mIG1pZGlPdXRDYWNoZVBhdGNoZXMoKSwgbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMoKSAqLwotI2RlZmluZSBNSURJX0NBQ0hFX0FMTCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTUlESV9DQUNIRV9CRVNURklUICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1JRElfQ0FDSEVfUVVFUlkgICAgICAgICAgICAgICAgMwotI2RlZmluZSBNSURJX1VOQ0FDSEUgICAgICAgICAgICAgICAgICAgIDQKLQotLyogRXZlbnQgZGVjbGFyYXRpb25zIGZvciBNUFUgSVJRIENhbGxiYWNrcyAqLwotI2RlZmluZSBJQ0FSRE1JRElfSU5MT05HREFUQSAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogTUlNX0xPTkdEQVRBICovCi0jZGVmaW5lIElDQVJETUlESV9JTkxPTkdFUlJPUiAgICAgICAgICAgMHgwMDAwMDAwMiAvKiBNSU1fTE9OR0VSUk9SICovCi0jZGVmaW5lIElDQVJETUlESV9PVVRMT05HREFUQSAgICAgICAgICAgMHgwMDAwMDAwNCAvKiBNT01fRE9ORSBmb3IgTVBVIE9VVCBidWZmZXIgKi8KLSNkZWZpbmUgSUNBUkRNSURJX0lOREFUQSAgICAgICAgICAgICAgICAweDAwMDAwMDEwIC8qIE1JTV9EQVRBICovCi0jZGVmaW5lIElDQVJETUlESV9JTkRBVEFFUlJPUiAgICAgICAgICAgMHgwMDAwMDAyMCAvKiBNSU1fRVJST1IgKi8KLQotLyogRGVjbGFyYXRpb24gZm9yIGZsYWdzIGluIENBUkRNSURJQlVGRkVSSERSICovCi0vKiBNYWtlIGl0IHRoZSBzYW1lIGFzIE1IRFJfRE9ORSwgTUhEUl9JTlFVRVVFIGluIG1tc3lzdGVtLmggKi8KLSNkZWZpbmUgTUlESUJVRl9ET05FICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIE1JRElCVUZfSU5RVUVVRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotCi0vKiBEZWNsYXJhdGlvbiBmb3IgbXNnIHBhcmFtZXRlciBpbiBtaWRpQ2FsbGJhY2tGbiAqLwotI2RlZmluZSBJQ0FSRE1JRElfT1VUQlVGRkVST0sgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSUNBUkRNSURJX0lOTUlESU9LICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qIERlY2xhcmF0aW9uIGZvciB0ZWNobm9sb2d5IGluIHN0cnVjdCBtaWRpX2NhcHMgKi8KLSNkZWZpbmUgTVRfTUlESVBPUlQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCS8qIEluIG9yaWdpbmFsIE1JRElPVVRDQVBTIHN0cnVjdHVyZSAqLwotI2RlZmluZSBNVF9GTVNZTlRIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogSW4gb3JpZ2luYWwgTUlESU9VVENBUFMgc3RydWN0dXJlICovCi0jZGVmaW5lIE1UX0FXRVNZTlRIICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBNVF9QQ0lTWU5USCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgTVRfUENJU1lOVEg2NCAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIENBUkRNSURJX0FXRU1BU0sgICAgICAgICAgICAgICAgMHgwMDAwRjAwMAotCi1lbnVtIExvY2FsRXJyb3JDb2RlCi17Ci0gICAgICAgIENUU1RBVFVTX05PVEVOQUJMRUQgPSAweDcwMDAsCi0gICAgICAgIENUU1RBVFVTX1JFQURZLAotICAgICAgICBDVFNUQVRVU19CVVNZLAotICAgICAgICBDVFNUQVRVU19EQVRBQVZBSUwsCi0gICAgICAgIENUU1RBVFVTX05PREFUQSwKLSAgICAgICAgQ1RTVEFUVVNfTkVYVF9CWVRFCi19OwotCi0vKiBNSURJIGRhdGEgYmxvY2sgaGVhZGVyICovCi1zdHJ1Y3QgbWlkaV9oZHIKLXsKLQl1OCAqcmVzZXJ2ZWQ7CQkvKiBQb2ludGVyIHRvIG9yaWdpbmFsIGxvY2tlZCBkYXRhIGJsb2NrICovCi0JdTMyIGJ1ZmZlcmxlbmd0aDsJLyogTGVuZ3RoIG9mIGRhdGEgaW4gZGF0YSBibG9jayAqLwotCXUzMiBieXRlc3JlY29yZGVkOwkvKiBVc2VkIGZvciBpbnB1dCBvbmx5ICovCi0JdTMyIHVzZXI7CQkvKiBGb3IgY2xpZW50J3MgdXNlICovCi0JdTMyIGZsYWdzOwkJLyogQXNzb3J0ZWQgZmxhZ3MgKHNlZSBkZWZpbmVzKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogUmVzZXJ2ZWQgZm9yIGRyaXZlciAqLwotCXU4ICpkYXRhOwkJLyogU2Vjb25kIGNvcHkgb2YgZmlyc3QgcG9pbnRlciAqLwotfTsKLQotLyogRW51bWVyYXRpb24gZm9yIFNldENvbnRyb2wgKi8KLWVudW0KLXsKLQlNSURJT0JKVk9MVU1FID0gMHgxLAotCU1JRElRVUVSWUFDVElWRUlOU1QKLX07Ci0KLXN0cnVjdCBtaWRpX3F1ZXVlCi17Ci0Jc3RydWN0IG1pZGlfcXVldWUgICpuZXh0OwotCXUzMiBxdHlwZTsgICAgICAgICAgICAvKiAwID0gc2hvcnQgbWVzc2FnZSwgMSA9IGxvbmcgZGF0YSAqLwotCXUzMiBsZW5ndGg7Ci0JdTMyIHNpemVMZWZ0OwotCXU4ICptaWRpYnl0ZTsKLQl1bnNpZ25lZCBsb25nIHJlZmRhdGE7Ci19OwotCi1zdHJ1Y3QgbWlkaV9vcGVuaW5mbwotewotCXUzMiAgICAgY2JzaXplOwotCXUzMiAgICAgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyAgcmVmZGF0YTsKLQl1MzIgICAgIHN0cmVhbWlkOwotfTsKLQotaW50IGVtdTEwazFfbWlkaV9jYWxsYmFjayh1bnNpZ25lZCBsb25nICwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqKTsKLQotI2VuZGlmIC8qIF9JQ0FSRE1JRElfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaWNhcmR3YXYuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YmU0MDkuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvaWNhcmR3YXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgaWNhcmR3YXYuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaWZuZGVmIF9JQ0FSRFdBVl9ICi0jZGVmaW5lIF9JQ0FSRFdBVl9ICi0KLXN0cnVjdCB3YXZlX2Zvcm1hdCAKLXsKLQlpbnQgaWQ7Ci0JaW50IHNhbXBsaW5ncmF0ZTsKLQl1OCBiaXRzcGVyY2hhbm5lbDsKLQl1OCBjaGFubmVsczsJCS8qIDEgPSBNb25vLCAyID0gU3RlcmVvLCAzLCAuLi4gPSBNdWx0aWNoYW5uZWwgKi8KLQl1OCBieXRlc3BlcmNoYW5uZWw7Ci0JdTggYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQl1OCBieXRlc3BlcnNhbXBsZTsKLQlpbnQgYnl0ZXNwZXJzZWM7Ci0JdTggcGFzc3Rocm91Z2g7Ci19OwotCi0vKiBlbXUxMGsxX3dhdmUgc3RhdGVzICovCi0jZGVmaW5lIFdBVkVfU1RBVEVfT1BFTgkJMHgwMQkKLSNkZWZpbmUgV0FWRV9TVEFURV9TVEFSVEVECTB4MDIKLSNkZWZpbmUgV0FWRV9TVEFURV9DTE9TRUQJMHgwNAotCi0jZW5kaWYgLyogX0lDQVJEV0FWX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5jIGIvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmNlNjMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgaXJxbWdyLmMgLSBJUlEgbWFuYWdlciBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJjYXJkbWkuaCIKLSNpbmNsdWRlICJjYXJkbW8uaCIKLSNpbmNsdWRlICJpcnFtZ3IuaCIKLQotLyogSW50ZXJydXB0IGhhbmRsZXIgKi8KLQotaXJxcmV0dXJuX3QgZW11MTBrMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSAoc3RydWN0IGVtdTEwazFfY2FyZCAqKSBkZXZfaWQ7Ci0JdTMyIGlycXN0YXR1cywgaXJxc3RhdHVzX3RtcDsKLQlpbnQgaGFuZGxlZCA9IDA7Ci0KLQlEUEQoNCwgImVtdTEwazFfaW50ZXJydXB0IGNhbGxlZCwgaXJxID0gICV1XG4iLCBpcnEpOwotCi0JLyoKLQkgKiogTk9URSA6Ci0JICoqIFdlIGRvIGEgJ3doaWxlIGxvb3AnIGhlcmUgY29zIG9uIGNlcnRhaW4gbWFjaGluZXMsIHdpdGggYm90aAotCSAqKiBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIGdvaW5nIG9uIGF0IHRoZSBzYW1lIHRpbWUsIElSUXMgd2lsbAotCSAqKiBzdG9wIGNvbWluZyBpbiBhZnRlciBhIHdoaWxlLiBDaGVja2luZyBJUE5EIGluZGVlZCBzaG93cyB0aGF0Ci0JICoqIHRoZXJlIGFyZSBpbnRlcnJ1cHRzIHBlbmRpbmcgYnV0IHRoZSBQSUMgc2F5cyBubyBJUlFzIHBlbmRpbmcuCi0JICoqIEkgc3VzcGVjdCB0aGF0IHNvbWUgYm9hcmRzIG5lZWQgZWRnZS10cmlnZ2VyZWQgSVJRcyBidXQgYXJlIG5vdAotCSAqKiBnZXR0aW5nIHRoYXQgY29uZGl0aW9uIGlmIHdlIGRvbid0IGNvbXBsZXRlbHkgY2xlYXIgdGhlIElQTkQKLQkgKiogKG1ha2Ugc3VyZSBubyBtb3JlIGludGVycnVwdHMgYXJlIHBlbmRpbmcpLgotCSAqKiAtIEVyaWMKLQkgKi8KLQotCXdoaWxlICgoaXJxc3RhdHVzID0gaW5sKGNhcmQtPmlvYmFzZSArIElQUikpKSB7Ci0JCURQRCg0LCAiaXJxIHN0YXR1cyAlI3hcbiIsIGlycXN0YXR1cyk7Ci0KLQkJaXJxc3RhdHVzX3RtcCA9IGlycXN0YXR1czsKLQotCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9USU1FUikgewotCQkJZW11MTBrMV90aW1lcl9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX1RJTUVSOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfRFNQKSB7Ci0JCQllbXUxMGsxX2RzcF9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX0RTUDsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX01QVUlOKSB7Ci0JCQllbXUxMGsxX21wdWluX2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfTVBVSU47Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9NUFVPVVQpIHsKLQkJCWVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfTVBVT1VUOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElQUl9NVVRFKSB7Ci0JCQllbXUxMGsxX211dGVfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPX5JUFJfTVVURTsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUFJfVk9MSU5DUikgewotCQkJZW11MTBrMV92b2xpbmNyX2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj1+SVBSX1ZPTElOQ1I7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVBSX1ZPTERFQ1IpIHsKLQkJCWVtdTEwazFfdm9sZGVjcl9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9fklQUl9WT0xERUNSOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyl7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IFdhcm5pbmcsIHVuaGFuZGxlZCBpbnRlcnJ1cHQ6ICUjMDh4XG4iLCBpcnFzdGF0dXMpOwotCQkJLy9tYWtlIHN1cmUgYW55IGludGVycnVwdHMgd2UgZG9uJ3QgaGFuZGxlIGFyZSBkaXNhYmxlZDoKLQkJCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgfihJTlRFX01JRElSWEVOQUJMRSB8IElOVEVfTUlESVRYRU5BQkxFIHwgSU5URV9JTlRFUlZBTFRJTUVSRU5CIHwKLQkJCQkJCUlOVEVfVk9MREVDUkVOQUJMRSB8IElOVEVfVk9MSU5DUkVOQUJMRSB8IElOVEVfTVVURUVOQUJMRSB8Ci0JCQkJCQlJTlRFX0ZYRFNQRU5BQkxFKSk7Ci0JCX0KLQotCQkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KLQkJb3V0bChpcnFzdGF0dXNfdG1wLCBjYXJkLT5pb2Jhc2UgKyBJUFIpOwotCQloYW5kbGVkID0gMTsKLQl9Ci0JcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTdjOWNhLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgaXJxLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX0lSUV9ICi0jZGVmaW5lIF9JUlFfSAotCi0vKiBFTVUgSXJxIFR5cGVzICovCi0jZGVmaW5lIElSUVRZUEVfUENJQlVTRVJST1IJSVBSX1BDSUVSUk9SCi0jZGVmaW5lIElSUVRZUEVfTUlYRVJCVVRUT04JKElQUl9WT0xJTkNSIHwgSVBSX1ZPTERFQ1IgfCBJUFJfTVVURSkKLSNkZWZpbmUgSVJRVFlQRV9WT0lDRQkJKElQUl9DSEFOTkVMTE9PUCB8IElQUl9DSEFOTkVMTlVNQkVSTUFTSykKLSNkZWZpbmUgSVJRVFlQRV9SRUNPUkQJCShJUFJfQURDQlVGRlVMTCB8IElQUl9BRENCVUZIQUxGRlVMTCB8IElQUl9NSUNCVUZGVUxMIHwgSVBSX01JQ0JVRkhBTEZGVUxMIHwgSVBSX0VGWEJVRkZVTEwgfCBJUFJfRUZYQlVGSEFMRkZVTEwpCi0jZGVmaW5lIElSUVRZUEVfTVBVT1VUCQkoSVBSX01JRElUUkFOU0JVRkVNUFRZIHwgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkyKSAKLSNkZWZpbmUgSVJRVFlQRV9NUFVJTgkJKElQUl9NSURJUkVDVkJVRkVNUFRZIHwgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTIpCi0jZGVmaW5lIElSUVRZUEVfVElNRVIJCUlQUl9JTlRFUlZBTFRJTUVSCi0jZGVmaW5lIElSUVRZUEVfU1BESUYJCShJUFJfR1BTUERJRlNUQVRVU0NIQU5HRSB8IElQUl9DRFJPTVNUQVRVU0NIQU5HRSkKLSNkZWZpbmUgSVJRVFlQRV9EU1AJCUlQUl9GWERTUAotCi12b2lkIGVtdTEwazFfdGltZXJfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX2RzcF9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci12b2lkIGVtdTEwazFfbXV0ZV9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci12b2lkIGVtdTEwazFfdm9saW5jcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci12b2lkIGVtdTEwazFfdm9sZGVjcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci0KLSNlbmRpZiAvKiBfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21haW4uYyBiL3NvdW5kL29zcy9lbXUxMGsxL21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1ODQxMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcxICswLDAgQEAKLSAvKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBtYWluLmMgLSBDcmVhdGl2ZSBFTVUxMEsxIGF1ZGlvIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHN0dWZmCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIFN1cHBvcnRlZCBkZXZpY2VzOgotICogICAgICAvZGV2L2RzcDogICAgICAgIFN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgT1NTLWNvbXBhdGlibGUKLSAqICAgICAgL2Rldi9kc3AxOiAgICAgICBSb3V0ZXMgdG8gcmVhciBzcGVha2VycyBvbmx5CSAKLSAqICAgICAgL2Rldi9taXhlcjogICAgICBTdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgT1NTLWNvbXBhdGlibGUKLSAqICAgICAgL2Rldi9taWRpOiAgICAgICBSYXcgTUlESSBVQVJUIGRldmljZSwgbW9zdGx5IE9TUy1jb21wYXRpYmxlCi0gKgkvZGV2L3NlcXVlbmNlcjogIFNlcXVlbmNlciBJbnRlcmZhY2UgKHJlcXVpcmVzIHNvdW5kLm8pCi0gKgotICogICAgICBSZXZpc2lvbiBoaXN0b3J5OgotICogICAgICAwLjEgYmV0YSBJbml0aWFsIHJlbGVhc2UKLSAqICAgICAgMC4yIExvd2VyZWQgaW5pdGlhbCBtaXhlciB2b2wuIEltcHJvdmVkIG9uIHN0dXR0ZXJpbmcgd2F2ZSBwbGF5YmFjay4gQWRkZWQgTUlESSBVQVJUIHN1cHBvcnQuCi0gKiAgICAgIDAuMyBGaXhlZCBtaXhlciByb3V0aW5nIGJ1ZywgYWRkZWQgQVBTLCBqb3lzdGljayBzdXBwb3J0LgotICogICAgICAwLjQgQWRkZWQgcmVhci1jaGFubmVsLCBTUERJRiBzdXBwb3J0LgotICoJMC41IFNvdXJjZSBjbGVhbnVwLCBTTVAgZml4ZXMsIG11bHRpb3BlbiBzdXBwb3J0LCA2NCBiaXQgYXJjaCBmaXhlcywKLSAqCSAgICBtb3ZlZCBiaCdzIHRvIHRhc2tsZXRzLCBtb3ZlZCB0byB0aGUgbmV3IFBDSSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gc3R5bGUuCi0gKgkwLjYgTWFrZSB1c2Ugb2YgcGNpX2FsbG9jX2NvbnNpc3RlbnQsIGltcHJvdmUgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgMi4yIGtlcm5lbHMsCi0gKgkgICAgY29kZSByZW9yZ2FuaXphdGlvbiBhbmQgY2xlYW51cC4KLSAqCTAuNyBTdXBwb3J0IGZvciB0aGUgRW11LUFQUy4gQnVnIGZpeGVzIGZvciB2b2ljZSBjYWNoZSBzZXR1cCwgbW1hcGVkIHNvdW5kICsgcG9sbCgpLgotICogICAgICAgICAgU3VwcG9ydCBmb3Igc2V0dGluZyBleHRlcm5hbCBUUkFNIHNpemUuCi0gKiAgICAgIDAuOCBNYWtlIHVzZSBvZiB0aGUga2VybmVsIGFjOTcgaW50ZXJmYWNlLiBTdXBwb3J0IGZvciBhIGRzcCBwYXRjaCBtYW5hZ2VyLgotICogICAgICAwLjkgUmUtZW5hYmxlcyByZWFyIHNwZWFrZXJzIHZvbHVtZSBjb250cm9scwotICogICAgIDAuMTAgSW5pdGlhbGl6ZXMgcmVhciBzcGVha2VyIHZvbHVtZS4KLSAqCSAgICBEeW5hbWljIHBhdGNoIHN0b3JhZ2UgYWxsb2NhdGlvbi4KLSAqCSAgICBOZXcgcHJpdmF0ZSBpb2N0bHMgdG8gY2hhbmdlIGNvbnRyb2wgZ3ByIHZhbHVlcy4KLSAqCSAgICBFbmFibGUgdm9sdW1lIGNvbnRyb2wgaW50ZXJydXB0cy4KLSAqCSAgICBCeSBkZWZhdWx0IGVuYWJsZSBkc3Agcm91dGVzIHRvIGRpZ2l0YWwgb3V0LiAKLSAqICAgICAwLjExIEZpeGVkIGZ4IC8gNCBwcm9ibGVtLgotICogICAgIDAuMTIgSW1wbGVtZW50ZWQgbW1hcGVkIGZvciByZWNvcmRpbmcuCi0gKgkgICAgRml4ZWQgYnVnOiBub3QgdW5yZXNlcnZpbmcgbW1hcGVkIGJ1ZmZlciBwYWdlcy4KLSAqCSAgICBJUlEgaGFuZGxlciBjbGVhbnVwLgotICogICAgIDAuMTMgRml4ZWQgcHJvYmxlbSB3aXRoIGRzcDEKLSAqICAgICAgICAgIFNpbXBsaWZpZWQgZHNwIHBhdGNoIHdyaXRpbmcgKGluc2lkZSB0aGUgZHJpdmVyKQotICoJICAgIEZpeGVkIHNldmVyYWwgYnVncyBmb3VuZCBieSB0aGUgU3RhbmZvcmQgdG9vbHMKLSAqICAgICAwLjE0IE5ldyBjb250cm9sIGdwciB0byBvc3MgbWl4ZXIgbWFwcGluZyBmZWF0dXJlIChDaHJpcyBQdXJuZWxsKQotICogICAgICAgICAgQWRkZWQgQUMzIFBhc3N0aHJvdWdoIFN1cHBvcnQgKEp1aGEgWXJqb2xhKQotICogICAgICAgICAgQWRkZWQgU3VwcG9ydCBmb3IgNS4xIGNhcmRzIChkaWdpdGFsIG91dCBhbmQgdGhlIHRoaXJkIGFuYWxvZyBvdXQpCi0gKiAgICAgMC4xNSBBZGRlZCBTZXF1ZW5jZXIgU3VwcG9ydCAoRGFuaWVsIE1hY2spCi0gKiAgICAgICAgICBTdXBwb3J0IGZvciBtdWx0aWNoYW5uZWwgcGNtIHBsYXliYWNrIChFZHVhcmQgSGFzZW5sZWl0aG5lcikKLSAqICAgICAwLjE2IE1peGVyIGltcHJvdmVtZW50cywgYWRkZWQgb2xkIHRyZWJsZS9iYXNzIHN1cHBvcnQgKERhbmllbCBCZXJ0cmFuZCkKLSAqICAgICAgICAgIFNtYWxsIGNvZGUgZm9ybWF0IGNsZWFudXAuCi0gKiAgICAgICAgICBEZWFkbG9jayBidWcgZml4IGZvciBlbXUxMGsxX3ZvbHh4eF9pcnFoYW5kbGVyKCkuCi0gKiAgICAgMC4xNyBGaXggZm9yIG1peGVyIFNPVU5EX01JWEVSX0lORk8gaW9jdGwuCi0gKgkgICAgRml4IGZvciBISUdITUVNIG1hY2hpbmVzIChlbXUxMGsxIGNhbiBvbmx5IGRvIDMxIGJpdCBidXMgbWFzdGVyKSAKLSAqCSAgICBtaWRpIHBvbGwgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSAqCSAgICBTbWFsbCBtaXhlciBmaXhlcy9jbGVhbnVwcy4KLSAqCSAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciA1LjEgY2FyZHMuCi0gKiAgICAgMC4xOCBGaXggZm9yIHBvc3NpYmxlIGxlYWsgaW4gcGNpX2FsbG9jX2NvbnNpc3RlbnQoKQotICogICAgICAgICAgQ2xlYW5lZCB1cCBwb2xsKCkgZnVuY3Rpb25zIChhdWRpbyBhbmQgbWlkaSkuIERvbid0IHN0YXJ0IGlucHV0LgotICoJICAgIFJlc3RyaWN0IERNQSBwYWdlcyB1c2VkIHRvIDUxMk1pYiByYW5nZS4KLSAqCSAgICBOZXcgQUM5N19CT09TVCBtaXhlciBpb2N0bC4KLSAqICAgIDAuMTlhIEFkZGVkIFN1cHBvcnQgZm9yIEF1ZGlneSBDYXJkcwotICoJICAgIFJlYWwgZml4IGZvciBrZXJuZWwgd2l0aCBoaWdobWVtIHN1cHBvcnQgKGNhc3QgZG1hX2hhbmRsZSB0byB1MzIpLgotICoJICAgIEZpeCByZWNvcmRpbmcgYnVmZmVyaW5nIHBhcmFtZXRlcnMgY2FsY3VsYXRpb24uCi0gKgkgICAgVXNlIHVuc2lnbmVkIGxvbmcgZm9yIHZhcmlhYmxlcyBpbiBiaXQgb3BzLgotICogICAgMC4yMGEgRml4ZWQgcmVjb3JkaW5nIHN0YXJ0dXAKLSAqCSAgICBGaXhlZCB0aW1lciByYXRlIHNldHRpbmcgKGl0J3MgYSAxNi1iaXQgcmVnaXN0ZXIpCi0gKgkwLjIxIENvbnZlcnRlZCBjb2RlIHRvIHVzZSBwY2lfbmFtZSgpIGluc3RlYWQgb2YgYWNjZXNzaW5nIHNsb3RfbmFtZQotICoJICAgIGRpcmVjdGx5IChFdWdlbmUgVGVvKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlc2UgYXJlIG9ubHkgaW5jbHVkZWQgb25jZSBwZXIgbW9kdWxlICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiZWZ4bWdyLmgiCi0jaW5jbHVkZSAiY2FyZHdvLmgiCi0jaW5jbHVkZSAiY2FyZHdpLmgiCi0jaW5jbHVkZSAiY2FyZG1vLmgiCi0jaW5jbHVkZSAiY2FyZG1pLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0jaW5jbHVkZSAiZWNhcmQuaCIKLQotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLSNkZWZpbmUgTUlESV9TWU5USF9OQU1FICJFTVUxMEsxIE1JREkiCi0jZGVmaW5lIE1JRElfU1lOVEhfQ0FQUyBTWU5USF9DQVBfSU5QVVQKLSAKLSNpbmNsdWRlICIuLi9zb3VuZF9jb25maWcuaCIKLSNpbmNsdWRlICIuLi9taWRpX3N5bnRoLmgiCi0KLS8qIHRoaXMgc2hvdWxkIGJlIGluIGRldl90YWJsZS5oICovCi0jZGVmaW5lIFNORENBUkRfRU1VMTBLMSA0NgotI2VuZGlmCi0gCi0KLS8qIHRoZSBlbXUxMGsxIF9zZWVtc18gdG8gb25seSBzdXBwb3J0cyAyOSBiaXQgKDUxMk1pQikgYml0IGJ1cyBtYXN0ZXIgKi8KLSNkZWZpbmUgRU1VMTBLMV9ETUFfTUFTSyBETUFfMjlCSVRfTUFTSwkvKiBETUEgYnVmZmVyIG1hc2sgZm9yIHBjaV9hbGxvY19jb25zaXN0ICovCi0KLSNpZm5kZWYgUENJX1ZFTkRPUl9JRF9DUkVBVElWRQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NSRUFUSVZFIDB4MTEwMgotI2VuZGlmCi0KLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DUkVBVElWRV9FTVUxMEsxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMSAweDAwMDIKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0FVRElHWQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0FVRElHWSAweDAwMDQKLSNlbmRpZgotCi0jZGVmaW5lIEVNVV9BUFNfU1VCSUQJMHg0MDAxMTEwMgotIAotZW51bSB7Ci0JRU1VMTBLMSA9IDAsCi0JQVVESUdZLAotfTsKLQotc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSBfX2RldmluaXRkYXRhID0gewotCSJFTVUxMEsxIiwKLQkiQXVkaWd5IiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlbXUxMGsxX3BjaV90YmxbXSA9IHsKLQl7UENJX1ZFTkRPUl9JRF9DUkVBVElWRSwgUENJX0RFVklDRV9JRF9DUkVBVElWRV9FTVUxMEsxLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBFTVUxMEsxfSwKLQl7UENJX1ZFTkRPUl9JRF9DUkVBVElWRSwgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1ksCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFVRElHWX0sCi0JezAsfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGVtdTEwazFfcGNpX3RibCk7Ci0KLS8qIEdsb2JhbCB2YXIgaW5zdGFudGlhdGlvbiAqLwotCi1MSVNUX0hFQUQoZW11MTBrMV9kZXZzKTsKLQotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9hdWRpb19mb3BzOwotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taXhlcl9mb3BzOwotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taWRpX2ZvcHM7Ci0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgZW11MTBrMV9taWRpX29wZXJhdGlvbnM7Ci0jZW5kaWYKLQotZXh0ZXJuIGlycXJldHVybl90IGVtdTEwazFfaW50ZXJydXB0KGludCwgdm9pZCAqKTsKLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9hdWRpb19pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JLyogQXNzaWduIGRlZmF1bHQgcGxheWJhY2sgdm9pY2UgcGFyYW1ldGVycyAqLwotCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCWNhcmQtPm1jaGFubmVsX2Z4ID0gMDsKLQllbHNlCi0JCWNhcmQtPm1jaGFubmVsX2Z4ID0gODsKLQotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQkvKiBtb25vIHZvaWNlICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTU9OT10gPSAweGZmZmZmZmZmOwotCQljYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX01PTk9dID0gMHgwMDAwZmZmZjsKLQkKLQkJLyogc3RlcmVvIHZvaWNlICovCi0JCS8qIGxlZnQgKi8KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9MRUZUXSA9IDB4MDBmZjAwZmY7Ci0JCWNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTEVGVF0gPSAweDAwMDA3ZjdmOwkKLQkJLyogcmlnaHQgKi8KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9SSUdIVF0gPSAweGZmMDBmZjAwOwotCQljYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX1JJR0hUXSA9IDB4MDAwMDdmN2Y7Ci0KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNXSA9IDB4MDMwMjAxMDA7IC8vIFJlZ3VsYXIgcGNtCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ01dID0gMHgwNzA2MDUwNDsKLQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QVF0gPSAweDNmM2YzZDNjOyAvLyBQYXNzdGhyb3VnaAotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUFRdID0gMHgzZjNmM2YzZjsKLQkJCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTTFdID0gMHgwMzAyMDEwMDsgLy8gU3BhcmUKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTTFdID0gMHgwNzA2MDQwNDsKLQkJCi0JfSBlbHNlIHsKLQkJLyogbW9ubyB2b2ljZSAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX01PTk9dID0gMHgwMDAwZmZmZjsKLQkKLQkJLyogc3RlcmVvIHZvaWNlICovCi0JCS8qIGxlZnQgKi8KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9MRUZUXSA9IDB4MDAwMDAwZmY7Ci0JCS8qIHJpZ2h0ICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfUklHSFRdID0gMHgwMDAwZmYwMDsKLQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dID0gMHgzMjEwOyAvLyBwY20KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUFRdID0gMHgzMjEwOyAvLyBwYXNzdGhyb3VnaAotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ00xXSA9IDB4NzY1NDsgLy8gL2Rldi9kc3AxCi0JfQotCi0JLyogQXNzaWduIGRlZmF1bHQgcmVjb3JkaW5nIHBhcmFtZXRlcnMgKi8KLQkvKiBGSVhNRSAqLwotCWlmIChjYXJkLT5pc19hcHMpCi0JCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0ZYOwotCWVsc2UKLQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfQUM5NzsKLQotCWNhcmQtPndhdmVpbi5meHdjID0gMHgwMDAzOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX2F1ZGlvX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9yZWdpc3Rlcl9kZXZpY2VzKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JY2FyZC0+YXVkaW9fZGV2ID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlbXUxMGsxX2F1ZGlvX2ZvcHMsIC0xKTsKLQlpZiAoY2FyZC0+YXVkaW9fZGV2IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBmaXJzdCBhdWRpbyBkZXZpY2UhXG4iKTsKLQkJZ290byBlcnJfZGV2OwotCX0KLQotCWNhcmQtPmF1ZGlvX2RldjEgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmVtdTEwazFfYXVkaW9fZm9wcywgLTEpOwotCWlmIChjYXJkLT5hdWRpb19kZXYxIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBzZWNvbmQgYXVkaW8gZGV2aWNlIVxuIik7Ci0JCWdvdG8gZXJyX2RldjE7Ci0JfQotCi0JY2FyZC0+YWM5Ny0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmVtdTEwazFfbWl4ZXJfZm9wcywgLTEpOwotCWlmIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIG1peGVyIGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX21peGVyOwotICAgICAgICB9Ci0KLQljYXJkLT5taWRpX2RldiA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmVtdTEwazFfbWlkaV9mb3BzLCAtMSk7Ci0JaWYgKGNhcmQtPm1pZGlfZGV2IDwgMCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIG1pZGkgZGV2aWNlIVxuIik7Ci0JCWdvdG8gZXJyX21pZGk7Ci0gICAgICAgIH0KLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0JY2FyZC0+c2VxX2RldiA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKTsKLQlpZiAoY2FyZC0+c2VxX2RldiA9PSAtMSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZW11MTBrMTogdW5hYmxlIHRvIHJlZ2lzdGVyIHNlcXVlbmNlciBkZXZpY2UhIik7Ci0JZWxzZSB7Ci0JCXN0ZF9taWRpX3N5bnRoLm1pZGlfZGV2ID0gY2FyZC0+c2VxX2RldjsKLQkJbWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdID0gCi0JCQkoc3RydWN0IG1pZGlfb3BlcmF0aW9ucyAqKQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOwotCi0JCWlmIChtaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0gPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ISIpOwotCQkJc291bmRfdW5sb2FkX21pZGlkZXYoY2FyZC0+c2VxX2Rldik7Ci0JCQljYXJkLT5zZXFfZGV2ID0gLTE7Ci0JCQkvKiByZXR1cm4gd2l0aG91dCBlcnJvciAqLwotCQl9IGVsc2UgewotCQkJbWVtY3B5KChjaGFyICopbWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdLCAKLQkJCQkoY2hhciAqKSZlbXUxMGsxX21pZGlfb3BlcmF0aW9ucywgCi0JCQkJc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpKTsKLQkJCW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XS0+ZGV2YyA9IGNhcmQ7Ci0JCQlzZXF1ZW5jZXJfaW5pdCgpOwotCQkJY2FyZC0+c2VxX21pZGlkZXYgPSBOVUxMOwotCQl9Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDA7Ci0KLWVycl9taWRpOgotCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5Ny0+ZGV2X21peGVyKTsKLWVycl9taXhlcjoKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5hdWRpb19kZXYpOwotZXJyX2RldjE6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2KTsKLWVycl9kZXY6Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfdW5yZWdpc3Rlcl9kZXZpY2VzKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQlpZiAoY2FyZC0+c2VxX2RldiA+IC0xKSB7Ci0JCWtmcmVlKG1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSk7Ci0JCW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSA9IE5VTEw7Ci0JCXNvdW5kX3VubG9hZF9taWRpZGV2KGNhcmQtPnNlcV9kZXYpOwotCQljYXJkLT5zZXFfZGV2ID0gLTE7Ci0JfQotI2VuZGlmCi0KLQl1bnJlZ2lzdGVyX3NvdW5kX21pZGkoY2FyZC0+bWlkaV9kZXYpOwotCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5Ny0+ZGV2X21peGVyKTsKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5hdWRpb19kZXYxKTsKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5hdWRpb19kZXYpOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfaW5mb19wcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCSAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGRhdGE7Ci0JaW50IGxlbiA9IDA7Ci0JCi0JaWYgKGNhcmQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIkRyaXZlciBWZXJzaW9uIDogJXNcbiIsIERSSVZFUl9WRVJTSU9OKTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIkNhcmQgdHlwZSAgICAgIDogJXNcbiIsIGNhcmQtPmlzX2FwcyA/ICJBcHMiIDogKGNhcmQtPmlzX2F1ZGlneSA/ICJBdWRpZ3kiIDogIkVtdTEwazEiKSk7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJSZXZpc2lvbiAgICAgICA6ICVkXG4iLCBjYXJkLT5jaGlwcmV2KTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIk1vZGVsICAgICAgICAgIDogJSMwNnhcbiIsIGNhcmQtPm1vZGVsKTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIklPICAgICAgICAgICAgIDogJSMwNmx4LSUjMDZseFxuIiwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pb2Jhc2UgKyBjYXJkLT5sZW5ndGggLSAxKTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIklSUSAgICAgICAgICAgIDogJWRcblxuIiwgY2FyZC0+aXJxKTsKLQkKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIlJlZ2lzdGVyZWQgL2RldiBFbnRyaWVzOlxuIik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICIvZGV2L2RzcCVkXG4iLCBjYXJkLT5hdWRpb19kZXYgLyAxNik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICIvZGV2L2RzcCVkXG4iLCBjYXJkLT5hdWRpb19kZXYxIC8gMTYpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9taXhlciVkXG4iLCBjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgLyAxNik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICIvZGV2L21pZGklZFxuIiwgY2FyZC0+bWlkaV9kZXYgLyAxNik7Ci0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9zZXF1ZW5jZXJcbiIpOwotI2VuZGlmCi0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX3Byb2NfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWNoYXIgc1s0OF07Ci0KLQlpZiAoIXByb2NfbWtkaXIgKCJkcml2ZXIvZW11MTBrMSIsIE5VTEwpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpcmVjdG9yeSBkcml2ZXIvZW11MTBrMVxuIik7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlpZiAoIXByb2NfbWtkaXIgKHMsIE5VTEwpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpcmVjdG9yeSAlc1xuIiwgcyk7Ci0JCWdvdG8gZXJyX2VtdTEwazFfcHJvYzsKLQl9Ci0KLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9pbmZvIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCWlmICghY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAocywgMCwgTlVMTCwgZW11MTBrMV9pbmZvX3Byb2MsIGNhcmQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5ICVzXG4iLCBzKTsKLQkJZ290byBlcnJfZGV2X3Byb2M7Ci0JfQotCi0JaWYgKCFjYXJkLT5pc19hcHMpIHsKLQkJc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvYWM5NyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQkJaWYgKCFjcmVhdGVfcHJvY19yZWFkX2VudHJ5IChzLCAwLCBOVUxMLCBhYzk3X3JlYWRfcHJvYywgY2FyZC0+YWM5NykpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5ICVzXG4iLCBzKTsKLQkJCWdvdG8gZXJyX3Byb2NfYWM5NzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotCi1lcnJfcHJvY19hYzk3OgotCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2luZm8iLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7Ci0KLWVycl9kZXZfcHJvYzoKLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKLQotZXJyX2VtdTEwazFfcHJvYzoKLQlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL2VtdTEwazEiLCBOVUxMKTsKLQotZXJyX291dDoKLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9wcm9jX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQljaGFyIHNbNDhdOwotCi0JaWYgKCFjYXJkLT5pc19hcHMpIHsKLQkJc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvYWM5NyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7Ci0JfQotCi0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvaW5mbyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKLQotCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOwotCQkKLQlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL2VtdTEwazEiLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9taXhlcl9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjICA9IGFjOTdfYWxsb2NfY29kZWMoKTsKLQkKLQlpZihjb2RlYyA9PSBOVUxMKQotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgYWxsb2NhdGUgbWl4ZXJcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JY2FyZC0+YWM5NyA9IGNvZGVjOwotCWNhcmQtPmFjOTctPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0KLQlpZiAoIWNhcmQtPmlzX2FwcykgewotCQljYXJkLT5hYzk3LT5pZCA9IDA7Ci0JCWNhcmQtPmFjOTctPmNvZGVjX3JlYWQgPSBlbXUxMGsxX2FjOTdfcmVhZDsKLSAgICAgICAgCWNhcmQtPmFjOTctPmNvZGVjX3dyaXRlID0gZW11MTBrMV9hYzk3X3dyaXRlOwotCi0JCWlmIChhYzk3X3Byb2JlX2NvZGVjIChjYXJkLT5hYzk3KSA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBwcm9iZSBBQzk3IGNvZGVjXG4iKTsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCQkvKiA1LjE6IEVuYWJsZSB0aGUgYWRkaXRpb25hbCBBQzk3IFNsb3RzIGFuZCB1bm11dGUgZXh0cmEgY2hhbm5lbHMgb24gQUM5NyBjb2RlYyAqLwotCQlpZiAoY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfSUQpICYgMHgwMDgwKXsKLQkJCXByaW50ayhLRVJOX0lORk8gImVtdTEwazE6IFNCTGl2ZSEgNS4xIGNhcmQgZGV0ZWN0ZWRcbiIpOyAKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBQzk3U0xPVCwgMCwgQUM5N1NMT1RfQ05UUiB8IEFDOTdTTE9UX0xGRSk7Ci0JCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU1VSUk9VTkRfTUFTVEVSLCAweDApOwotCQl9Ci0KLQkJLy8gRm9yY2UgNWJpdDoJCSAgICAKLQkJLy9jYXJkLT5hYzk3LT5iaXRfcmVzb2x1dGlvbj01OwotCi0JCS8qIHRoZXNlIHdpbGwgc3RvcmUgdGhlIG9yaWdpbmFsIHZhbHVlcyBhbmQgbmV2ZXIgYmUgbW9kaWZpZWQgKi8KLQkJY2FyZC0+YWM5N19zdXBwb3J0ZWRfbWl4ZXJzID0gY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVyczsKLQkJY2FyZC0+YWM5N19zdGVyZW9fbWl4ZXJzID0gY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVyczsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotIGVycl9vdXQ6Ci0gCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9taXhlcl9jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTcpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX21pZGlfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCByZXQ7Ci0KLQljYXJkLT5tcHVvdXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV9tcHVvdXQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2FyZC0+bXB1b3V0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZW11MTBrMTogVW5hYmxlIHRvIGFsbG9jYXRlIGVtdTEwazFfbXB1b3V0OiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0MTsKLQl9Ci0KLQljYXJkLT5tcHVvdXQtPmludHIgPSAxOwotCWNhcmQtPm1wdW91dC0+c3RhdHVzID0gRkxBR1NfQVZBSUxBQkxFOwotCWNhcmQtPm1wdW91dC0+c3RhdGUgPSBDQVJETUlESU9VVF9TVEFURV9ERUZBVUxUOwotCi0JdGFza2xldF9pbml0KCZjYXJkLT5tcHVvdXQtPnRhc2tsZXQsIGVtdTEwazFfbXB1b3V0X2JoLCAodW5zaWduZWQgbG9uZykgY2FyZCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bXB1b3V0LT5sb2NrKTsKLQotCWNhcmQtPm1wdWluID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfbXB1aW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2FyZC0+bXB1aW4gPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbXUxMGsxOiBVbmFibGUgdG8gYWxsb2NhdGUgZW11MTBrMV9tcHVpbjogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgZ290byBlcnJfb3V0MjsKLQl9Ci0KLQljYXJkLT5tcHVpbi0+c3RhdHVzID0gRkxBR1NfQVZBSUxBQkxFOwotCi0JdGFza2xldF9pbml0KCZjYXJkLT5tcHVpbi0+dGFza2xldCwgZW11MTBrMV9tcHVpbl9iaCwgKHVuc2lnbmVkIGxvbmcpIGNhcmQtPm1wdWluKTsKLQotCXNwaW5fbG9ja19pbml0KCZjYXJkLT5tcHVpbi0+bG9jayk7Ci0KLQkvKiBSZXNldCB0aGUgTVBVIHBvcnQgKi8KLQlpZiAoZW11MTBrMV9tcHVfcmVzZXQoY2FyZCkgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyX291dDM7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXQzOgotCWtmcmVlKGNhcmQtPm1wdWluKTsKLWVycl9vdXQyOgotCWtmcmVlKGNhcmQtPm1wdW91dCk7Ci1lcnJfb3V0MToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX21pZGlfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXRhc2tsZXRfa2lsbCgmY2FyZC0+bXB1b3V0LT50YXNrbGV0KTsKLQlrZnJlZShjYXJkLT5tcHVvdXQpOwotCi0JdGFza2xldF9raWxsKCZjYXJkLT5tcHVpbi0+dGFza2xldCk7Ci0Ja2ZyZWUoY2FyZC0+bXB1aW4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgdm9pY2VfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9HOyBpKyspCi0JCWNhcmQtPnZvaWNldGFibGVbaV0gPSBWT0lDRV9VU0FHRV9GUkVFOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgdGltZXJfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCUlOSVRfTElTVF9IRUFEKCZjYXJkLT50aW1lcnMpOwotCWNhcmQtPnRpbWVyX2RlbGF5ID0gVElNRVJfU1RPUFBFRDsKLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+dGltZXJfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhZGR4bWdyX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl1MzIgY291bnQ7Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhQQUdFUzsgY291bnQrKykKLQkJY2FyZC0+ZW11cGFnZXRhYmxlW2NvdW50XSA9IDA7Ci0KLQkvKiBNYXJrIGZpcnN0IHBhZ2UgYXMgdXNlZCAqLwotCS8qIFRoaXMgcGFnZSBpcyByZXNlcnZlZCBieSB0aGUgZHJpdmVyICovCi0JY2FyZC0+ZW11cGFnZXRhYmxlWzBdID0gMHg4MDAxOwotCWNhcmQtPmVtdXBhZ2V0YWJsZVsxXSA9IE1BWFBBR0VTIC0gMTsKLX0KLQotc3RhdGljIHZvaWQgZnhfY2xlYW51cChzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyKQotewotCWludCBpOwotCWZvcihpID0gMDsgaSA8IG1nci0+Y3VycmVudF9wYWdlczsgaSsrKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG1nci0+cGF0Y2hbaV0pOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBmeF9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciA9ICZjYXJkLT5tZ3I7Ci0Jc3RydWN0IGRzcF9wYXRjaCAqcGF0Y2g7Ci0Jc3RydWN0IGRzcF9ycGF0Y2ggKnJwYXRjaDsKLQlzMzIgbGVmdCwgcmlnaHQ7Ci0JaW50IGk7Ci0JdTMyIHBjID0gMDsKLQl1MzIgcGF0Y2hfbj0wOwotCXN0cnVjdCBlbXVfZWZ4X2luZm9fdCBlbXVfZWZ4X2luZm9bMl09Ci0JCXt7IDIwLCAxMCwgMHg0MDAsIDB4MTAwLCAweDIwIH0sCi0JCSB7IDI0LCAxMiwgMHg2MDAsIDB4NDAwLCAweDYwIH0sCi0JCX07IAotCQkJCi0KLQlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKLQkJbWdyLT5jdHJsX2dwcltpXVswXSA9IC0xOwotCQltZ3ItPmN0cmxfZ3ByW2ldWzFdID0gLTE7Ci0JfQotCi0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQltZ3ItPmN1cnJlbnRfcGFnZXMgPSAoMiArIFBBVENIRVNfUEVSX1BBR0UgLSAxKSAvIFBBVENIRVNfUEVSX1BBR0U7Ci0JZWxzZQotCQkvKiAhISBUaGUgbnVtYmVyIGJlbG93IG11c3QgZXF1YWwgdGhlIG51bWJlciBvZiBwYXRjaGVzLCBjdXJyZW50bHkgMTEgISEgKi8KLQkJbWdyLT5jdXJyZW50X3BhZ2VzID0gKDExICsgUEFUQ0hFU19QRVJfUEFHRSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbWdyLT5jdXJyZW50X3BhZ2VzOyBpKyspIHsKLQkJbWdyLT5wYXRjaFtpXSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAobWdyLT5wYXRjaFtpXSA9PSBOVUxMKSB7Ci0JCQltZ3ItPmN1cnJlbnRfcGFnZXMgPSBpOwotCQkJZnhfY2xlYW51cChtZ3IpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJbWVtc2V0KG1nci0+cGF0Y2hbaV0sIDAsIFBBR0VfU0laRSk7Ci0JfQotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQotCQkJT1AoMHhmLCAweDBjMCwgMHgwYzAsIDB4MGNmLCAweDBjMCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDUxMiA7IGkrKykKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0dQUl9CQVNFK2ksMCwwKTsKLQotCQlwYz0wOwotCi0JCS8vUGNtIGlucHV0IHZvbHVtZQotCQlPUCgwLCAweDQwMiwgMHgwYzAsIDB4NDA2LCAweDAwMCk7Ci0JCU9QKDAsIDB4NDAzLCAweDBjMCwgMHg0MDcsIDB4MDAxKTsKLQotCQkvL0NELURpZ2l0YWwgaW5wdXQgVm9sdW1lCi0JCU9QKDAsIDB4NDA0LCAweDBjMCwgMHg0MGQsIDB4NDIpOwotCQlPUCgwLCAweDQwNSwgMHgwYzAsIDB4NDBmLCAweDQzKTsKLQotCQkvLyBDRCArIFBDTSAKLQkJT1AoNiwgMHg0MDAsIDB4MGMwLCAweDQwMiwgMHg0MDQpOwotCQlPUCg2LCAweDQwMSwgMHgwYzAsIDB4NDAzLCAweDQwNSk7Ci0JCQotCQkvLyBGcm9udCBPdXRwdXQgKyBNYXN0ZXIgVm9sdW1lCi0JCU9QKDAsIDB4NjgsIDB4MGMwLCAweDQwOCwgMHg0MDApOwotCQlPUCgwLCAweDY5LCAweDBjMCwgMHg0MDksIDB4NDAxKTsKLQotCQkvLyBBZGQtaW4gYW5hbG9nIGlucHV0cyBmb3Igb3RoZXIgc3BlYWtlcnMKLQkJT1AoNiwgMHg0MDAsIDB4NDAsIDB4NDAwLCAweGMwKTsKLQkJT1AoNiwgMHg0MDEsIDB4NDEsIDB4NDAxLCAweGMwKTsKLQotCQkvLyBEaWdpdGFsIEZyb250ICsgTWFzdGVyIFZvbHVtZQotCQlPUCgwLCAweDYwLCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKLQkJT1AoMCwgMHg2MSwgMHgwYzAsIDB4NDA5LCAweDQwMSk7Ci0KLQkJLy8gUmVhciBPdXRwdXQgKyBSZWFyIFZvbHVtZQotCQlPUCgwLCAweDA2ZSwgMHgwYzAsIDB4NDE5LCAweDQwMCk7Ci0JCU9QKDAsIDB4MDZmLCAweDBjMCwgMHg0MWEsIDB4NDAxKTsJCQotCi0JCS8vIERpZ2l0YWwgUmVhciBPdXRwdXQgKyBSZWFyIFZvbHVtZQotCQlPUCgwLCAweDA2NiwgMHgwYzAsIDB4NDE5LCAweDQwMCk7Ci0JCU9QKDAsIDB4MDY3LCAweDBjMCwgMHg0MWEsIDB4NDAxKTsJCQotCi0JCS8vIEF1ZGlneSBEcml2ZSwgSGVhZHBob25lIG91dAotCQlPUCg2LCAweDY0LCAweDBjMCwgMHgwYzAsIDB4NDAwKTsKLQkJT1AoNiwgMHg2NSwgMHgwYzAsIDB4MGMwLCAweDQwMSk7Ci0KLQkJLy8gYWM5NyBSZWNvcmRpbmcKLQkJT1AoNiwgMHg3NiwgMHgwYzAsIDB4MGMwLCAweDQwKTsKLQkJT1AoNiwgMHg3NywgMHgwYzAsIDB4MGMwLCAweDQxKTsKLQkJCi0JCS8vIENlbnRlciA9IHN1YiA9IExlZnQvMiArIFJpZ2h0LzIKLQkJT1AoMHhlLCAweDQwMCwgMHg0MDEsIDB4Y2QsIDB4NDAwKTsKLQotCQkvLyBjZW50ZXIvc3ViICBWb2x1bWUgKG1hc3RlcikKLQkJT1AoMCwgMHgwNmEsIDB4MGMwLCAweDQwOCwgMHg0MDApOwotCQlPUCgwLCAweDA2YiwgMHgwYzAsIDB4NDA5LCAweDQwMCk7Ci0KLQkJLy8gRGlnaXRhbCBjZW50ZXIvc3ViICBWb2x1bWUgKG1hc3RlcikKLQkJT1AoMCwgMHgwNjIsIDB4MGMwLCAweDQwOCwgMHg0MDApOwotCQlPUCgwLCAweDA2MywgMHgwYzAsIDB4NDA5LCAweDQwMCk7Ci0KLQkJUk9VVElOR19QQVRDSF9TVEFSVChycGF0Y2gsICJSb3V0aW5nIik7Ci0JCVJPVVRJTkdfUEFUQ0hfRU5EKHJwYXRjaCk7Ci0KLQkJLyogZGVsaW1pdGVyIHBhdGNoICovCi0JCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsKLQkJcGF0Y2gtPmNvZGVfc2l6ZSA9IDA7Ci0KLQkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIDB4NTMsIDAsIDApOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA1MTIgOyBpKyspCi0JCQlPUCg2LCAweDQwLCAweDQwLCAweDQwLCAweDQwKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCi0JCQkJCSAgICBGWEdQUkVHQkFTRSArIGksIDAsCi0JCQkJCSAgICBUQU5LTUVNQUREUlJFR0JBU0UgKyBpLCAwLAotCQkJCQkgICAgVEFHTElTVF9FTkQpOwotCi0JCQotCQlwYyA9IDA7Ci0KLQkJLy9maXJzdCBmcmVlIEdQUiA9IDB4MTFiCi0JCi0JCQotCQkvKiBGWCB2b2x1bWUgY29ycmVjdGlvbiBhbmQgVm9sdW1lIGNvbnRyb2wqLwotCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlBjbSBMIHZvbCIsIDB4MCwgMCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwMCwgMHgwKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwNiwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCQlHRVRfRFlOQU1JQ19HUFIocGF0Y2gsIDB4MTEyKTsKLQotCQlPUCg0LCAweDExMiwgMHg0MCwgUENNX0lOX0wsIDB4NDQpOyAvLyo0CQotCQlPUCgwLCAweDEwMCwgMHgwNDAsIDB4MTEyLCAweDEwNik7ICAvLyp2b2wJCi0JCUlOUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQotCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlBjbSBSIHZvbCIsIDB4MSwgMCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwMSwgMHgxKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwNywgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCQlHRVRfRFlOQU1JQ19HUFIocGF0Y2gsIDB4MTEyKTsKLQotCQlPUCg0LCAweDExMiwgMHg0MCwgUENNX0lOX1IsIDB4NDQpOyAKLQkJT1AoMCwgMHgxMDEsIDB4MDQwLCAweDExMiwgMHgxMDcpOwotCi0JCUlOUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQotCQkvLyBDRC1EaWdpdGFsIEluIFZvbHVtZSBjb250cm9sCQotCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIkNELURpZ2l0YWwgVm9sIEwiLCAweDEyLCAwKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTBjLCAweDEyKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwZCwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIDB4MTBjLCAweDA0MCwgU1BESUZfQ0RfTCwgMHgxMGQpOwotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0JCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiQ0QtRGlnaXRhbCBWb2wgUiIsIDB4MTMsIDApOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMGUsIDB4MTMpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTBmLCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0KLQkJT1AoMCwgMHgxMGUsIDB4MDQwLCBTUERJRl9DRF9SLCAweDEwZik7Ci0JCUlOUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQkJLy9Wb2x1bWUgQ29ycmVjdGlvbiBmb3IgTXVsdGktY2hhbm5lbCBJbnB1dHMJCi0JCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiTXVsdGktQ2hhbm5lbCBHYWluIiwgMHgwOCwgMCk7Ci0JCXBhdGNoLT5pbnB1dD1wYXRjaC0+b3V0cHV0PTB4M0YwMDsKLQotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTMsIE1VTFRJX0ZST05UX0wpOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTQsIE1VTFRJX0ZST05UX1IpOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTUsIE1VTFRJX1JFQVJfTCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNiwgTVVMVElfUkVBUl9SKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE3LCBNVUxUSV9DRU5URVIpOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTgsIE1VTFRJX0xGRSk7Ci0KLQkJT1AoNCwgMHgxMTMsIDB4NDAsIE1VTFRJX0ZST05UX0wsIDB4NDQpOwotCQlPUCg0LCAweDExNCwgMHg0MCwgTVVMVElfRlJPTlRfUiwgMHg0NCk7Ci0JCU9QKDQsIDB4MTE1LCAweDQwLCBNVUxUSV9SRUFSX0wsIDB4NDQpOwotCQlPUCg0LCAweDExNiwgMHg0MCwgTVVMVElfUkVBUl9SLCAweDQ0KTsKLQkJT1AoNCwgMHgxMTcsIDB4NDAsIE1VTFRJX0NFTlRFUiwgMHg0NCk7Ci0JCU9QKDQsIDB4MTE4LCAweDQwLCBNVUxUSV9MRkUsIDB4NDQpOwotCQotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJLy9Sb3V0aW5nIHBhdGNoIHN0YXJ0CQotCQlST1VUSU5HX1BBVENIX1NUQVJUKHJwYXRjaCwgIlJvdXRpbmciKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTAwLCAweDApOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMDEsIDB4MSk7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwYywgMHgxMik7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwZSwgMHgxMyk7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExMywgTVVMVElfRlJPTlRfTCk7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNCwgTVVMVElfRlJPTlRfUik7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNSwgTVVMVElfUkVBUl9MKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE2LCBNVUxUSV9SRUFSX1IpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTcsIE1VTFRJX0NFTlRFUik7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExOCwgTVVMVElfTEZFKTsKLQotCQlHRVRfRFlOQU1JQ19HUFIocnBhdGNoLCAweDEwMik7Ci0JCUdFVF9EWU5BTUlDX0dQUihycGF0Y2gsIDB4MTAzKTsKLQotCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTA0LCAweDgpOwotCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTA1LCAweDkpOwotCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTBhLCAweDIpOwotCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTBiLCAweDMpOwotCQkKLQkJCi0JCS8qIGlucHV0IGJ1ZmZlciAqLwotCQlPUCg2LCAweDEwMiwgQUM5N19JTl9MLCAweDQwLCAweDQwKTsKLQkJT1AoNiwgMHgxMDMsIEFDOTdfSU5fUiwgMHg0MCwgMHg0MCk7Ci0KLQotCQkvKiBEaWdpdGFsIEluICsgUENNICsgTVVMVElfRlJPTlQtPiBBQzk3IG91dCAoZnJvbnQgc3BlYWtlcnMpKi8KLQkJT1AoNiwgQUM5N19GUk9OVF9MLCAweDEwMCwgMHgxMGMsIDB4MTEzKTsKLQotCQlDT05ORUNUKE1VTFRJX0ZST05UX0wsIEFDOTdfRlJPTlRfTCk7Ci0JCUNPTk5FQ1QoUENNX0lOX0wsIEFDOTdfRlJPTlRfTCk7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfTCwgQUM5N19GUk9OVF9MKTsKLQotCQlPUCg2LCBBQzk3X0ZST05UX1IsIDB4MTAxLCAweDEwZSwgMHgxMTQpOwotCi0JCUNPTk5FQ1QoTVVMVElfRlJPTlRfUiwgQUM5N19GUk9OVF9SKTsKLQkJQ09OTkVDVChQQ01fSU5fUiwgQUM5N19GUk9OVF9SKTsKLQkJQ09OTkVDVChTUERJRl9DRF9SLCBBQzk3X0ZST05UX1IpOwotCi0JCS8qIERpZ2l0YWwgSW4gKyBQQ00gKyBBQzk3IEluICsgUENNMSArIE1VTFRJX1JFQVIgLS0+IFJlYXIgQ2hhbm5lbCAqLyAKLQkJT1AoNiwgMHgxMDQsIFBDTTFfSU5fTCwgMHgxMDAsIDB4MTE1KTsKLQkJT1AoNiwgMHgxMDQsIDB4MTA0LCAweDEwYywgMHgxMDIpOwotCi0JCUNPTk5FQ1QoTVVMVElfUkVBUl9MLCBBTkFMT0dfUkVBUl9MKTsKLQkJQ09OTkVDVChBQzk3X0lOX0wsIEFOQUxPR19SRUFSX0wpOwotCQlDT05ORUNUKFBDTV9JTl9MLCBBTkFMT0dfUkVBUl9MKTsKLQkJQ09OTkVDVChTUERJRl9DRF9MLCBBTkFMT0dfUkVBUl9MKTsKLQkJQ09OTkVDVChQQ00xX0lOX0wsIEFOQUxPR19SRUFSX0wpOwotCi0JCU9QKDYsIDB4MTA1LCBQQ00xX0lOX1IsIDB4MTAxLCAweDExNik7Ci0JCU9QKDYsIDB4MTA1LCAweDEwNSwgMHgxMGUsIDB4MTAzKTsKLQotCQlDT05ORUNUKE1VTFRJX1JFQVJfUiwgQU5BTE9HX1JFQVJfUik7Ci0JCUNPTk5FQ1QoQUM5N19JTl9SLCBBTkFMT0dfUkVBUl9SKTsKLQkJQ09OTkVDVChQQ01fSU5fUiwgQU5BTE9HX1JFQVJfUik7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfUiwgQU5BTE9HX1JFQVJfUik7Ci0JCUNPTk5FQ1QoUENNMV9JTl9SLCBBTkFMT0dfUkVBUl9SKTsKLQotCQkvKiBEaWdpdGFsIEluICsgUENNICsgQUM5NyBJbiArIE1VTFRJX0ZST05UIC0tPiBEaWdpdGFsIG91dCAqLwotCQlPUCg2LCAweDEwYiwgMHgxMDAsIDB4MTAyLCAweDEwYyk7Ci0JCU9QKDYsIDB4MTBiLCAweDEwYiwgMHgxMTMsIDB4NDApOwotCi0JCUNPTk5FQ1QoTVVMVElfRlJPTlRfTCwgRElHSVRBTF9PVVRfTCk7Ci0JCUNPTk5FQ1QoUENNX0lOX0wsIERJR0lUQUxfT1VUX0wpOwotCQlDT05ORUNUKEFDOTdfSU5fTCwgRElHSVRBTF9PVVRfTCk7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfTCwgRElHSVRBTF9PVVRfTCk7Ci0KLQkJT1AoNiwgMHgxMGEsIDB4MTAxLCAweDEwMywgMHgxMGUpOwotCQlPUCg2LCAweDEwYiwgMHgxMGIsIDB4MTE0LCAweDQwKTsKLQotCQlDT05ORUNUKE1VTFRJX0ZST05UX1IsIERJR0lUQUxfT1VUX1IpOwotCQlDT05ORUNUKFBDTV9JTl9SLCBESUdJVEFMX09VVF9SKTsKLQkJQ09OTkVDVChBQzk3X0lOX1IsIERJR0lUQUxfT1VUX1IpOwotCQlDT05ORUNUKFNQRElGX0NEX1IsIERJR0lUQUxfT1VUX1IpOwotCi0JCS8qIEFDOTcgSW4gLS0+IEFEQyBSZWNvcmRpbmcgQnVmZmVyICovCi0JCU9QKDYsIEFEQ19SRUNfTCwgMHgxMDIsIDB4NDAsIDB4NDApOwotCi0JCUNPTk5FQ1QoQUM5N19JTl9MLCBBRENfUkVDX0wpOwotCi0JCU9QKDYsIEFEQ19SRUNfUiwgMHgxMDMsIDB4NDAsIDB4NDApOwotCi0JCUNPTk5FQ1QoQUM5N19JTl9SLCBBRENfUkVDX1IpOwotCi0KLQkJLyogZngxMjpBbmFsb2ctQ2VudGVyICovCi0JCU9QKDYsIEFOQUxPR19DRU5URVIsIDB4MTE3LCAweDQwLCAweDQwKTsKLQkJQ09OTkVDVChNVUxUSV9DRU5URVIsIEFOQUxPR19DRU5URVIpOwotCi0JCS8qIGZ4MTE6QW5hbG9nLUxGRSAqLwotCQlPUCg2LCBBTkFMT0dfTEZFLCAweDExOCwgMHg0MCwgMHg0MCk7Ci0JCUNPTk5FQ1QoTVVMVElfTEZFLCBBTkFMT0dfTEZFKTsKLQotCQkvKiBmeDEyOkRpZ2l0YWwtQ2VudGVyICovCi0JCU9QKDYsIERJR0lUQUxfQ0VOVEVSLCAweDExNywgMHg0MCwgMHg0MCk7Ci0JCUNPTk5FQ1QoTVVMVElfQ0VOVEVSLCBESUdJVEFMX0NFTlRFUik7Ci0JCQotCQkvKiBmeDExOkFuYWxvZy1MRkUgKi8KLQkJT1AoNiwgRElHSVRBTF9MRkUsIDB4MTE4LCAweDQwLCAweDQwKTsKLQkJQ09OTkVDVChNVUxUSV9MRkUsIERJR0lUQUxfTEZFKTsKLQkKLQkJUk9VVElOR19QQVRDSF9FTkQocnBhdGNoKTsKLQotCi0JCS8vIFJlYXIgdm9sdW1lIGNvbnRyb2wJCi0JCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBSZWFyIEwiLCAweDgsIDApOwotCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwNCwgMHg4KTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDExOSwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIEFOQUxPR19SRUFSX0wsIDB4MDQwLCAweDEwNCwgMHgxMTkpOwotCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgUmVhciBSIiwgMHg5LCAwKTsKLQkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMDUsIDB4OSk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMWEsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCBBTkFMT0dfUkVBUl9SLCAweDA0MCwgMHgxMDUsIDB4MTFhKTsKLQkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQotCQkvL01hc3RlciB2b2x1bWUgY29udHJvbCBvbiBmcm9udC1kaWdpdGFsCQotCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgTWFzdGVyIEwiLCAweDIsIDEpOwotCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwYSwgMHgyKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwOCwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIERJR0lUQUxfT1VUX0wsIDB4MDQwLCAweDEwYSwgMHgxMDgpOwotCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBNYXN0ZXIgUiIsIDB4MywgMSk7Ci0JCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTBiLCAweDMpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA5LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0KLQkJT1AoMCwgRElHSVRBTF9PVVRfUiwgMHgwNDAsIDB4MTBiLCAweDEwOSk7Ci0JCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJLyogZGVsaW1pdGVyIHBhdGNoICovCi0JCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsKLQkJcGF0Y2gtPmNvZGVfc2l6ZSA9IDA7Ci0KLQkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIERCRywgMCwgMCk7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJm1nci0+bG9jayk7Ci0KLQkvLyBTZXQgdXAgVm9sdW1lIGNvbnRyb2xzLCB0cnkgdG8ga2VlcCB0aGlzIHRoZSBzYW1lIGZvciBib3RoIEF1ZGlneSBhbmQgTGl2ZQotCi0JLy9NYXN0ZXIgdm9sdW1lCi0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9WT0xVTUVdWzBdID0gODsKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1ZPTFVNRV1bMV0gPSA5OwotCi0JbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1ZPTFVNRV0gJiAweGZmOwotCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1ZPTFVNRV0gPj4gOCkgJiAweGZmOwotCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA4LCBsZWZ0LCAxIDw8IGNhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uKTsKLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDksIHJpZ2h0LCAxIDw8IGNhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uKTsKLQotCS8vUmVhciB2b2x1bWUKLQltZ3ItPmN0cmxfZ3ByWyBTT1VORF9NSVhFUl9PR0FJTiBdWzBdID0gMHgxOTsKLQltZ3ItPmN0cmxfZ3ByWyBTT1VORF9NSVhFUl9PR0FJTiBdWzFdID0gMHgxYTsKLQotCWxlZnQgPSByaWdodCA9IDY3OwotCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX09HQUlOXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7Ci0KLQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9IFNPVU5EX01BU0tfT0dBSU47Ci0JY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSBTT1VORF9NQVNLX09HQUlOOwotCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweDE5LCBsZWZ0LCBWT0xfNUJJVCk7Ci0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweDFhLCByaWdodCwgVk9MXzVCSVQpOwotCi0JLy9QQ00gVm9sdW1lCi0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9QQ01dWzBdID0gNjsKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1BDTV1bMV0gPSA3OwotCi0JbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1BDTV0gJiAweGZmOwotCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1BDTV0gPj4gOCkgJiAweGZmOwotCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA2LCBsZWZ0LCBWT0xfNUJJVCk7Ci0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA3LCByaWdodCwgVk9MXzVCSVQpOwotCi0JLy9DRC1EaWdpdGFsIFZvbHVtZQotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfRElHSVRBTDFdWzBdID0gMHhkOwotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfRElHSVRBTDFdWzFdID0gMHhmOwotCi0JbGVmdCA9IHJpZ2h0ID0gNjc7Ci0JY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfRElHSVRBTDFdID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsgCi0KLQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9IFNPVU5EX01BU0tfRElHSVRBTDE7Ci0JY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSBTT1VORF9NQVNLX0RJR0lUQUwxOwotCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweGQsIGxlZnQsIFZPTF81QklUKTsKLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4ZiwgcmlnaHQsIFZPTF81QklUKTsKLQotCi0JLy9oYXJkIHdpcmUgdGhlIGFjOTcncyBwY20sIHBjbSB2b2x1bWUgaXMgZG9uZSBhYm92ZSB1c2luZyBkc3AgY29kZS4KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQkvL2ZvciBBdWRpZ3ksIHdlIG11dGUgaXQgYW5kIHVzZSB0aGUgcGhpbGlwcyA2IGNoYW5uZWwgREFDIGluc3RlYWQKLQkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4ODAwMCk7Ci0JZWxzZQotCQkvL0ZvciB0aGUgTGl2ZSB3ZSBoYXJkd2lyZSBpdCB0byBmdWxsIHZvbHVtZQotCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHgwKTsKLQotCS8vcmVtb3ZlIGl0IGZyb20gdGhlIGFjOTdfY29kZWMncyBjb250cm9sCi0JY2FyZC0+YWM5N19zdXBwb3J0ZWRfbWl4ZXJzICY9IH5TT1VORF9NQVNLX1BDTTsKLQljYXJkLT5hYzk3X3N0ZXJlb19taXhlcnMgJj0gflNPVU5EX01BU0tfUENNOwotCi0JLy9zZXQgSWdhaW4gdG8gMGRCIGJ5IGRlZmF1bHQsIG1heWJlIGNvbnNpZGVyIGhhcmR3aXJpbmcgaXQgaGVyZS4KLQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgQUM5N19SRUNPUkRfR0FJTiwgMHgwMDAwKTsKLQljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9JR0FJTl0gPSAweDEwMTsgCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgaHdfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCBuQ2g7Ci0JdTMyIHBhZ2Vjb3VudDsgLyogdG1wICovCi0JaW50IHJldDsKLQotCS8qIERpc2FibGUgYXVkaW8gYW5kIGxvY2sgY2FjaGUgKi8KLQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfTE9DS1NPVU5EQ0FDSEUgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfTVVURUJVVFRPTkVOQUJMRSk7Ci0KLQkvKiBSZXNldCByZWNvcmRpbmcgYnVmZmVycyAqLwotCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLQkJCSAgICBNSUNCUywgQURDQlNfQlVGU0laRV9OT05FLAotCQkJICAgIE1JQ0JBLCAwLAotCQkJICAgIEZYQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBGWEJBLCAwLAotCQkJICAgIEFEQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgQURDQkEsIDAsCi0JCQkgICAgVEFHTElTVF9FTkQpOwotCi0JLyogRGlzYWJsZSBjaGFubmVsIGludGVycnVwdCAqLwotCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSU5URSwgMCk7Ci0Jc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotCQkJICAgIENMSUVMLCAwLAotCQkJICAgIENMSUVILCAwLAotCQkJICAgIFNPTEVMLCAwLAotCQkJICAgIFNPTEVILCAwLAotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLDAsCi0JCQkJICAgIDB4NWUsMHhmMDAsCi0JCQkJICAgIDB4NWYsMHgzLAotCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0JfQotCi0JLyogSW5pdCBlbnZlbG9wZSBlbmdpbmUgKi8KLQlmb3IgKG5DaCA9IDA7IG5DaCA8IE5VTV9HOyBuQ2grKykgewotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIG5DaCwKLQkJCQkgICAgRENZU1VTViwgMCwKLQkJCQkgICAgSVAsIDAsCi0JCQkJICAgIFZURlQsIDB4ZmZmZiwKLQkJCQkgICAgQ1ZDRiwgMHhmZmZmLAotCQkJCSAgICBQVFJYLCAwLAotCQkJCSAgICAvL0NQRiwgMCwKLQkJCQkgICAgQ0NSLCAwLAotCi0JCQkJICAgIFBTU1QsIDAsCi0JCQkJICAgIERTTCwgMHgxMCwKLQkJCQkgICAgQ0NDQSwgMCwKLQkJCQkgICAgWjEsIDAsCi0JCQkJICAgIFoyLCAwLAotCQkJCSAgICBGWFJULCAweGQwMWMwMDAwLAotCi0JCQkJICAgIEFUS0hMRE0sIDAsCi0JCQkJICAgIERDWVNVU00sIDAsCi0JCQkJICAgIElGQVROLCAweGZmZmYsCi0JCQkJICAgIFBFRkUsIDAsCi0JCQkJICAgIEZNTU9ELCAwLAotCQkJCSAgICBUUkVNRlJRLCAyNCwJLyogMSBIeiAqLwotCQkJCSAgICBGTTJGUlEyLCAyNCwJLyogMSBIeiAqLwotCQkJCSAgICBURU1QRU5WLCAwLAotCi0JCQkJICAgIC8qKiogVGhlc2UgYXJlIGxhc3Qgc28gT0ZGIHByZXZlbnRzIHdyaXRpbmcgKioqLwotCQkJCSAgICBMRk9WQUwyLCAwLAotCQkJCSAgICBMRk9WQUwxLCAwLAotCQkJCSAgICBBVEtITERWLCAwLAotCQkJCSAgICBFTlZWT0wsIDAsCi0JCQkJICAgIEVOVlZBTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBR0xJU1RfRU5EKTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgbkNoLCAwKTsKLQkJLyoKLQkJICBBdWRpZ3kgRlhSVCBpbml0aWFsaXphdGlvbgotCQkgIHJldmVyc2VkIGVuZydkLCBtYXkgbm90IGJlIGFjY3VyYXRlLgotCQkgKi8KLQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLG5DaCwKLQkJCQkJICAgIDB4NGMsMHgwLAotCQkJCQkgICAgMHg0ZCwweDAsCi0JCQkJCSAgICAweDRlLDB4MCwKLQkJCQkJICAgIDB4NGYsMHgwLAotCQkJCQkgICAgQV9GWFJUMSwgMHgzZjNmM2YzZiwKLQkJCQkJICAgIEFfRlhSVDIsIDB4M2YzZjNmM2YsCi0JCQkJCSAgICBBX1NFTkRBTU9VTlRTLCAwLAotCQkJCQkgICAgVEFHTElTVF9FTkQpOwotCQl9Ci0JfQotCQotCi0JLyoKLQkgKiogSW5pdCB0byAweDAyMTA5MjA0IDoKLQkgKiogQ2xvY2sgYWNjdXJhY3kgICAgPSAwICAgICAoMTAwMHBwbSkKLQkgKiogU2FtcGxlIFJhdGUgICAgICAgPSAyICAgICAoNDhrSHopCi0JICoqIEF1ZGlvIENoYW5uZWwgICAgID0gMSAgICAgKExlZnQgb2YgMikKLQkgKiogU291cmNlIE51bWJlciAgICAgPSAwICAgICAoVW5zcGVjaWZpZWQpCi0JICoqIEdlbmVyYXRpb24gU3RhdHVzID0gMSAgICAgKE9yaWdpbmFsIGZvciBDYXQgQ29kZSAxMikKLQkgKiogQ2F0IENvZGUgICAgICAgICAgPSAxMiAgICAoRGlnaXRhbCBTaWduYWwgTWl4ZXIpCi0JICoqIE1vZGUgICAgICAgICAgICAgID0gMCAgICAgKE1vZGUgMCkKLQkgKiogRW1waGFzaXMgICAgICAgICAgPSAwICAgICAoTm9uZSkKLQkgKiogQ1AgICAgICAgICAgICAgICAgPSAxICAgICAoQ29weXJpZ2h0IHVuYXNzZXJ0ZWQpCi0JICoqIEFOICAgICAgICAgICAgICAgID0gMCAgICAgKERpZ2l0YWwgYXVkaW8pCi0JICoqIFAgICAgICAgICAgICAgICAgID0gMCAgICAgKENvbnN1bWVyKQotCSAqLwotCi0Jc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotCi0JCQkgICAgLyogU1BESUYwICovCi0JCQkgICAgU1BDUzAsIChTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IDB4MDAyMDAwMDAwIHwKLQkJCQkgICAgU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfCBTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpLAotCi0JCQkgICAgLyogU1BESUYxICovCi0JCQkgICAgU1BDUzEsIChTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IDB4MDAyMDAwMDAwIHwKLQkJCQkgICAgU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfCBTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpLAotCi0JCQkgICAgLyogU1BESUYyICYgU1BESUYzICovCi0JCQkgICAgU1BDUzIsIChTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IDB4MDAyMDAwMDAwIHwKLQkJCQkgICAgU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfCBTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpLAotCi0JCQkgICAgVEFHTElTVF9FTkQpOwotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSAmJiAoY2FyZC0+Y2hpcHJldiA9PSA0KSkgewotCQkvKiBIYWNrcyBmb3IgQWxpY2UzIHRvIHdvcmsgaW5kZXBlbmRlbnQgb2YgaGFQMTZWIGRyaXZlciAqLwotCQl1MzIgdG1wOwotCi0JCS8vU2V0dXAgU1JDTXVsdGlfSTJTIFNhbXBsaW5nUmF0ZQotCQl0bXAgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBBX1NQRElGX1NBTVBMRVJBVEUsIDApOwotCQl0bXAgJj0gMHhmZmZmZjFmZjsKLQkJdG1wIHw9ICgweDI8PDkpOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9TUERJRl9TQU1QTEVSQVRFLCAwLCB0bXApOwotCi0JCS8qIFNldHVwIFNSQ1NlbCAoRW5hYmxlIFNwZGlmLEkyUyBTUkNNdWx0aSkgKi8KLQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDIwLCAweDYwMDAwMCk7Ci0JCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyNCwgMHgxNCk7Ci0KLQkJLyogU2V0dXAgU1JDTXVsdGkgSW5wdXQgQXVkaW8gRW5hYmxlICovCi0JCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyMCwgMHg2RTAwMDApOwotCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjQsIDB4RkYwMEZGMDApOwotCX0KLQotCXJldCA9IGZ4X2luaXQoY2FyZCk7CQkvKiBpbml0aWFsaXplIGVmZmVjdHMgZW5naW5lICovCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQljYXJkLT50YW5rbWVtLnNpemUgPSAwOwotCi0JY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplID0gTUFYUEFHRVMgKiBzaXplb2YodTMyKTsKLQotCWNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSwgJmNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSk7Ci0JaWYgKGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciA9PSBOVUxMKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyMDsKLQl9Ci0KLQljYXJkLT5zaWxlbnRwYWdlLnNpemUgPSBFTVVQQUdFU0laRTsKLQotCWNhcmQtPnNpbGVudHBhZ2UuYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnNpbGVudHBhZ2Uuc2l6ZSwgJmNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSk7Ci0JaWYgKGNhcmQtPnNpbGVudHBhZ2UuYWRkciA9PSBOVUxMKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlmb3IgKHBhZ2Vjb3VudCA9IDA7IHBhZ2Vjb3VudCA8IE1BWFBBR0VTOyBwYWdlY291bnQrKykKLQkJKCh1MzIgKikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyKVtwYWdlY291bnRdID0gY3B1X3RvX2xlMzIoKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpIHwgcGFnZWNvdW50KTsKLQotCS8qIEluaXQgcGFnZSB0YWJsZSAmIHRhbmsgbWVtb3J5IGJhc2UgcmVnaXN0ZXIgKi8KLQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCi0JCQkgICAgUFRCLCAodTMyKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUsCi0JCQkgICAgVENCLCAwLAotCQkJICAgIFRDQlMsIDAsCi0JCQkgICAgVEFHTElTVF9FTkQpOwotCi0JZm9yIChuQ2ggPSAwOyBuQ2ggPCBOVU1fRzsgbkNoKyspIHsKLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCBuQ2gsCi0JCQkJICAgIE1BUEEsIE1BUF9QVElfTUFTSyB8ICgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSwKLQkJCQkgICAgTUFQQiwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAotCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0JfQotCi0JLyogSG9rYXksIG5vdyBlbmFibGUgdGhlIEFVRCBiaXQgKi8KLQkvKiBFbmFibGUgQXVkaW8gPSAxICovCi0JLyogTXV0ZSBEaXNhYmxlIEF1ZGlvID0gMCAqLwotCS8qIExvY2sgVGFuayBNZW1vcnkgPSAxICovCi0JLyogTG9jayBTb3VuZCBNZW1vcnkgPSAwICovCi0JLyogQXV0byBNdXRlID0gMSAqLwotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJaWYgKGNhcmQtPmNoaXByZXYgPT0gNCkKLQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0FDM0VOQUJMRV9DRFNQRElGIHwgSENGR19BQzNFTkFCTEVfR1BTUERJRiB8IEhDRkdfQVVUT01VVEUgfCBIQ0ZHX0pPWUVOQUJMRSk7Ci0JCWVsc2UKLQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUpOwotCX0gZWxzZSB7Ci0JCWlmIChjYXJkLT5tb2RlbCA9PSAweDIwIHx8IGNhcmQtPm1vZGVsID09IDB4YzQwMCB8fAotCQkgKGNhcmQtPm1vZGVsID09IDB4MjEgJiYgY2FyZC0+Y2hpcHJldiA8IDYpKQotCSAgICAgICAgCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfQVVUT01VVEUpOwotCQllbHNlCi0JCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUpOwotCX0KLQkvKiBFbmFibGUgVm9sX0N0cmwgaXJxcyAqLwotCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBJTlRFX1ZPTElOQ1JFTkFCTEUgfCBJTlRFX1ZPTERFQ1JFTkFCTEUgfCBJTlRFX01VVEVFTkFCTEUgfCBJTlRFX0ZYRFNQRU5BQkxFKTsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kgJiYgKGNhcmQtPmNoaXByZXYgPT0gNCkpIHsKLQkJLyogVW5tdXRlIEFuYWxvZyBub3cuICBTZXQgR1BPNiB0byAxIGZvciBBcG9sbG8uCi0JCSAqIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgaW5pdCBBTGljZTMgSTJTT3V0IGJleW9uZCA0OEtIei4KLQkJICogU28sIHNlcXVlbmNlIGlzIGltcG9ydGFudC4gKi8KLQkJdTMyIHRtcCA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBBX0lPQ0ZHKTsKLQkJdG1wIHw9IDB4MDA0MDsKLQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBBX0lPQ0ZHLCB0bXApOwotCX0KLQkKLQkvKiBGSVhNRTogVE9TTGluayBkZXRlY3Rpb24gKi8KLQljYXJkLT5oYXNfdG9zbGluayA9IDA7Ci0KLQkvKiBJbml0aWFsaXplIGRpZ2l0YWwgcGFzc3Rocm91Z2ggdmFyaWFibGVzICovCi0JY2FyZC0+cHQucG9zX2dwciA9IGNhcmQtPnB0LmludHJfZ3ByID0gY2FyZC0+cHQuZW5hYmxlX2dwciA9IC0xOwotCWNhcmQtPnB0LnNlbGVjdGVkID0gMDsKLQljYXJkLT5wdC5zdGF0ZSA9IFBUX1NUQVRFX0lOQUNUSVZFOwotCWNhcmQtPnB0LnNwY3NfdG9fdXNlID0gMHgwMTsKLQljYXJkLT5wdC5wYXRjaF9uYW1lID0gIkFDM3Bhc3MiOwotCWNhcmQtPnB0LmludHJfZ3ByX25hbWUgPSAiY291bnQiOwotCWNhcmQtPnB0LmVuYWJsZV9ncHJfbmFtZSA9ICJlbmFibGUiOwotCWNhcmQtPnB0LnBvc19ncHJfbmFtZSA9ICJwdHIiOwotCXNwaW5fbG9ja19pbml0KCZjYXJkLT5wdC5sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5wdC53YWl0KTsKLQotLyoJdG1wID0gc2JsaXZlX3JlYWRmbjAoY2FyZCwgSENGRyk7Ci0JaWYgKHRtcCAmIChIQ0ZHX0dQSU5QVVQwIHwgSENGR19HUElOUFVUMSkpIHsKLQkJc2JsaXZlX3dyaXRlZm4wKGNhcmQsIEhDRkcsIHRtcCB8IDB4ODAwKTsKLQotCQl1ZGVsYXkoNTEyKTsKLQotCQlpZiAodG1wICE9IChzYmxpdmVfcmVhZGZuMChjYXJkLCBIQ0ZHKSAmIH4weDgwMCkpIHsKLQkJCWNhcmQtPmhhc190b3NsaW5rID0gMTsKLQkJCXNibGl2ZV93cml0ZWZuMChjYXJkLCBIQ0ZHLCB0bXApOwotCQl9Ci0JfQotKi8KLQlyZXR1cm4gMDsKLQotICBlcnIxOgotCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSk7Ci0gIGVycjA6Ci0JZnhfY2xlYW51cCgmY2FyZC0+bWdyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCS8qIEluaXQgQ2FyZCAqLwotCWlmIChod19pbml0KGNhcmQpIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0Jdm9pY2VfaW5pdChjYXJkKTsKLQl0aW1lcl9pbml0KGNhcmQpOwotCWFkZHhtZ3JfaW5pdChjYXJkKTsKLQotCURQRCgyLCAiICBodyBjb250cm9sIHJlZ2lzdGVyIC0+ICUjeFxuIiwgZW11MTBrMV9yZWFkZm4wKGNhcmQsIEhDRkcpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgY2g7Ci0KLQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIElOVEUsIDApOwotCi0JLyoqIFNodXRkb3duIHRoZSBjaGlwICoqLwotCWZvciAoY2ggPSAwOyBjaCA8IE5VTV9HOyBjaCsrKQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgRENZU1VTViwgY2gsIDApOwotCi0JZm9yIChjaCA9IDA7IGNoIDwgTlVNX0c7IGNoKyspIHsKLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCBjaCwKLQkJCQkgICAgVlRGVCwgMCwKLQkJCQkgICAgQ1ZDRiwgMCwKLQkJCQkgICAgUFRSWCwgMCwKLQkJCQkgICAgLy9DUEYsIDAsCi0JCQkJICAgIFRBR0xJU1RfRU5EKTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgY2gsIDApOwotCX0KLQotCS8qIERpc2FibGUgYXVkaW8gYW5kIGxvY2sgY2FjaGUgKi8KLQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfTE9DS1NPVU5EQ0FDSEUgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfTVVURUJVVFRPTkVOQUJMRSk7Ci0KLQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRCLCAwLAotCi0JCQkgICAgLyogUmVzZXQgcmVjb3JkaW5nIGJ1ZmZlcnMgKi8KLQkJCSAgICBNSUNCUywgQURDQlNfQlVGU0laRV9OT05FLAotCQkJICAgIE1JQ0JBLCAwLAotCQkJICAgIEZYQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBGWEJBLCAwLAotCQkJICAgIEZYV0MsIDAsCi0JCQkgICAgQURDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBBRENCQSwgMCwKLQkJCSAgICBUQ0JTLCAwLAotCQkJICAgIFRDQiwgMCwKLQkJCSAgICBEQkcsIDB4ODAwMCwKLQotCQkJICAgIC8qIERpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHQgKi8KLQkJCSAgICBDTElFTCwgMCwKLQkJCSAgICBDTElFSCwgMCwKLQkJCSAgICBTT0xFTCwgMCwKLQkJCSAgICBTT0xFSCwgMCwKLQkJCSAgICBUQUdMSVNUX0VORCk7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgMCwgQV9EQkcsICBBX0RCR19TSU5HTEVfU1RFUCk7Ci0KLQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUpOwotCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+c2lsZW50cGFnZS5zaXplLCBjYXJkLT5zaWxlbnRwYWdlLmFkZHIsIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSk7Ci0JCi0JaWYoY2FyZC0+dGFua21lbS5zaXplICE9IDApCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dGFua21lbS5zaXplLCBjYXJkLT50YW5rbWVtLmFkZHIsIGNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSk7Ci0KLQkvKiByZWxlYXNlIHBhdGNoIHN0b3JhZ2UgbWVtb3J5ICovCi0JZnhfY2xlYW51cCgmY2FyZC0+bWdyKTsKLX0KLQotLyogRHJpdmVyIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQl1MzIgc3Vic3lzdmlkOwotCWludCByZXQ7Ci0KLQlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBFTVUxMEsxX0RNQV9NQVNLKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI5Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQotCQlyZXR1cm4gLUVJTzsKLQotCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwotCi0JaWYgKChjYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfY2FyZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBvdXQgb2YgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQotCi0JY2FyZC0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOwotCWNhcmQtPmxlbmd0aCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCk7IAotCi0JaWYgKHJlcXVlc3RfcmVnaW9uKGNhcmQtPmlvYmFzZSwgY2FyZC0+bGVuZ3RoLCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogSU8gc3BhY2UgaW4gdXNlXG4iKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycl9yZWdpb247Ci0JfQotCi0JcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGNhcmQpOwotCi0JY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOwotCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2OwotCi0JLyogUmVzZXJ2ZSBJUlEgTGluZSAqLwotCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsIGVtdTEwazFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBJUlEgaW4gdXNlXG4iKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCi0JY2FyZC0+Y2hpcHJldiA9IHBjaV9kZXYtPnJldmlzaW9uOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fSUQsICZjYXJkLT5tb2RlbCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJlbXUxMGsxOiAlcyByZXYgJWQgbW9kZWwgJSMwNHggZm91bmQsIElPIGF0ICUjMDRseC0lIzA0bHgsIElSUSAlZFxuIiwKLQkJY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+Y2hpcHJldiwgY2FyZC0+bW9kZWwsIGNhcmQtPmlvYmFzZSwKLQkJY2FyZC0+aW9iYXNlICsgY2FyZC0+bGVuZ3RoIC0gMSwgY2FyZC0+aXJxKTsKLQotCWlmIChwY2lfaWQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0FVRElHWSkKLQkJY2FyZC0+aXNfYXVkaWd5ID0gMTsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3ZpZCk7Ci0JY2FyZC0+aXNfYXBzID0gKHN1YnN5c3ZpZCA9PSBFTVVfQVBTX1NVQklEKTsKLQotCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKLQltdXRleF9pbml0KCZjYXJkLT5vcGVuX3NlbSk7Ci0JY2FyZC0+b3Blbl9tb2RlID0gMDsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5vcGVuX3dhaXQpOwotCi0JcmV0ID0gZW11MTBrMV9hdWRpb19pbml0KGNhcmQpOwotCWlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBhdWRpbyBkZXZpY2VzXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycl9hdWRpbzsKLSAgICAgICAgfQotCi0JcmV0ID0gZW11MTBrMV9taXhlcl9pbml0KGNhcmQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgQUM5NyBjb2RlY1xuIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJfbWl4ZXI7Ci0JfQotCi0JcmV0ID0gZW11MTBrMV9taWRpX2luaXQoY2FyZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgbWlkaSBkZXZpY2VcbiIpOwotCQlnb3RvIGVycl9taWRpOwotCX0KLQotCXJldCA9IGVtdTEwazFfaW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX2VtdTEwazFfaW5pdDsKLQl9Ci0KLQlpZiAoY2FyZC0+aXNfYXBzKQotCQllbXUxMGsxX2VjYXJkX2luaXQoY2FyZCk7Ci0KLQlyZXQgPSBlbXUxMGsxX3JlZ2lzdGVyX2RldmljZXMoY2FyZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3JlZ2lzdGVyOwotCi0JLyogcHJvYyBlbnRyaWVzIG11c3QgYmUgY3JlYXRlZCBhZnRlciByZWdpc3RlcmluZyBkZXZpY2VzLCBhcwotCSAqIGVtdTEwazFfaW5mb19wcm9jIHByaW50cyBjYXJkLT5hdWRpb19kZXYgJmNvLiAqLwotCXJldCA9IGVtdTEwazFfcHJvY19pbml0KGNhcmQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgcHJvYyBkaXJlY3RvcnlcbiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyX3Byb2M7Ci0JfQotCQotCWxpc3RfYWRkKCZjYXJkLT5saXN0LCAmZW11MTBrMV9kZXZzKTsKLQotCXJldHVybiAwOwotCi1lcnJfcHJvYzoKLQllbXUxMGsxX3VucmVnaXN0ZXJfZGV2aWNlcyhjYXJkKTsKLQotZXJyX3JlZ2lzdGVyOgotCWVtdTEwazFfY2xlYW51cChjYXJkKTsKLQkKLWVycl9lbXUxMGsxX2luaXQ6Ci0JZW11MTBrMV9taWRpX2NsZWFudXAoY2FyZCk7Ci0KLWVycl9taWRpOgotCWVtdTEwazFfbWl4ZXJfY2xlYW51cChjYXJkKTsKLQotZXJyX21peGVyOgotCWVtdTEwazFfYXVkaW9fY2xlYW51cChjYXJkKTsKLQotZXJyX2F1ZGlvOgotCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0KLWVycl9pcnE6Ci0JcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCBjYXJkLT5sZW5ndGgpOwotCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKLQotZXJyX3JlZ2lvbjoKLQlrZnJlZShjYXJkKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlbXUxMGsxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCi0JbGlzdF9kZWwoJmNhcmQtPmxpc3QpOwotCi0JZW11MTBrMV91bnJlZ2lzdGVyX2RldmljZXMoY2FyZCk7Ci0JZW11MTBrMV9jbGVhbnVwKGNhcmQpOwotCWVtdTEwazFfbWlkaV9jbGVhbnVwKGNhcmQpOwotCWVtdTEwazFfbWl4ZXJfY2xlYW51cChjYXJkKTsKLQllbXUxMGsxX3Byb2NfY2xlYW51cChjYXJkKTsKLQllbXUxMGsxX2F1ZGlvX2NsZWFudXAoY2FyZCk7CQotCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0JcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCBjYXJkLT5sZW5ndGgpOwotCWtmcmVlKGNhcmQpOwotCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKLX0KLQotTU9EVUxFX0FVVEhPUigiQmVydHJhbmQgTGVlLCBDYWkgWWluZy4gKEVtYWlsIHRvOiBlbXUxMGsxLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ3JlYXRpdmUgRU1VMTBLMSBQQ0kgQXVkaW8gRHJpdmVyIHYiIERSSVZFUl9WRVJTSU9OICJcbkNvcHlyaWdodCAoQykgMTk5OSBDcmVhdGl2ZSBUZWNobm9sb2d5IEx0ZC4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGVtdTEwazFfcGNpX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiZW11MTBrMSIsCi0JLmlkX3RhYmxlCT0gZW11MTBrMV9wY2lfdGJsLAotCS5wcm9iZQkJPSBlbXUxMGsxX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZW11MTBrMV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZW11MTBrMV9pbml0X21vZHVsZSh2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gIkNyZWF0aXZlIEVNVTEwSzEgUENJIEF1ZGlvIERyaXZlciwgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOwotCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmVtdTEwazFfcGNpX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBlbXUxMGsxX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlbXUxMGsxX3BjaV9kcml2ZXIpOwotCi0JcmV0dXJuOwotfQotCi1tb2R1bGVfaW5pdChlbXUxMGsxX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGVtdTEwazFfY2xlYW51cF9tb2R1bGUpOwotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQotLyogaW4gbWlkaS5jICovCi1leHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwgCi0JCQkJdm9pZCAoKmlucHV0KShpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSksCi0JCQkJdm9pZCAoKm91dHB1dCkoaW50IGRldikpOwotZXh0ZXJuIHZvaWQgZW11MTBrMV9zZXFfbWlkaV9jbG9zZShpbnQgZGV2KTsKLWV4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9vdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpOwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX3N0YXJ0X3JlYWQoaW50IGRldik7Ci1leHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfZW5kX3JlYWQoaW50IGRldik7Ci1leHRlcm4gdm9pZCBlbXUxMGsxX3NlcV9taWRpX2tpY2soaW50IGRldik7Ci1leHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfYnVmZmVyX3N0YXR1cyhpbnQgZGV2KTsKLQotc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgZW11MTBrMV9taWRpX29wZXJhdGlvbnMgPQotewotCVRISVNfTU9EVUxFLAotCXsiRU1VMTBLMSBNSURJIiwgMCwgMCwgU05EQ0FSRF9FTVUxMEsxfSwKLQkmc3RkX21pZGlfc3ludGgsCi0JezB9LAotCWVtdTEwazFfc2VxX21pZGlfb3BlbiwKLQllbXUxMGsxX3NlcV9taWRpX2Nsb3NlLAotCU5VTEwsCi0JZW11MTBrMV9zZXFfbWlkaV9vdXQsCi0JZW11MTBrMV9zZXFfbWlkaV9zdGFydF9yZWFkLAotCWVtdTEwazFfc2VxX21pZGlfZW5kX3JlYWQsCi0JZW11MTBrMV9zZXFfbWlkaV9raWNrLAotCU5VTEwsCi0JZW11MTBrMV9zZXFfbWlkaV9idWZmZXJfc3RhdHVzLAotCU5VTEwKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jIGIvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFlOTkwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYworKysgL2Rldi9udWxsCkBAIC0xLDYxNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBtaWRpLmMgLSAvZGV2L21pZGkgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgImNhcmRtby5oIgotI2luY2x1ZGUgImNhcmRtaS5oIgotI2luY2x1ZGUgIm1pZGkuaCIKLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0jaW5jbHVkZSAiLi4vc291bmRfY29uZmlnLmgiCi0jZW5kaWYKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhtaWRpX3NwaW5sb2NrKTsKLQotc3RhdGljIHZvaWQgaW5pdF9taWRpX2hkcihzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCi17Ci0JbWlkaWhkci0+YnVmZmVybGVuZ3RoID0gTUlESUlOX0JVRkxFTjsKLQltaWRpaGRyLT5ieXRlc3JlY29yZGVkID0gMDsKLQltaWRpaGRyLT5mbGFncyA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWlkaWluX2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYsIHN0cnVjdCBtaWRpX2hkciAqKm1pZGloZHJwdHIpCi17Ci0Jc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOwotCi0JaWYgKChtaWRpaGRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJRVJST1IoKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaW5pdF9taWRpX2hkcihtaWRpaGRyKTsKLQotCW1pZGloZHItPmRhdGEgPSBrbWFsbG9jKE1JRElJTl9CVUZMRU4sIEdGUF9LRVJORUwpOwotCWlmICghbWlkaWhkci0+ZGF0YSkgewotCQlFUlJPUigpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChlbXUxMGsxX21wdWluX2FkZF9idWZmZXIobWlkaV9kZXYtPmNhcmQtPm1wdWluLCBtaWRpaGRyKSA8IDApIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JKm1pZGloZHJwdHIgPSBtaWRpaGRyOwotCWxpc3RfYWRkX3RhaWwoJm1pZGloZHItPmxpc3QsICZtaWRpX2Rldi0+bWlkX2hkcnMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9taWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQotCURQRigyLCAiZW11MTBrMV9taWRpX29wZW4oKVxuIik7Ci0KLQkvKiBDaGVjayBmb3IgY29ycmVjdCBkZXZpY2UgdG8gb3BlbiAqLwotCWxpc3RfZm9yX2VhY2goZW50cnksICZlbXUxMGsxX2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXUxMGsxX2NhcmQsIGxpc3QpOwotCi0JCWlmIChjYXJkLT5taWRpX2RldiA9PSBtaW5vcikKLQkJCWdvdG8gbWF0Y2g7Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLW1hdGNoOgotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0JaWYgKGNhcmQtPnNlcV9taWRpZGV2KQkvKiBjYXJkIGlzIG9wZW5lZCBieSBzZXF1ZW5jZXIgKi8KLQkJcmV0dXJuIC1FQlVTWTsKLSNlbmRpZgotCi0JLyogV2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCi0JbXV0ZXhfbG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCXdoaWxlIChjYXJkLT5vcGVuX21vZGUgJiAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpKSB7Ci0JCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0JCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCX0KLQotCWlmICgobWlkaV9kZXYgPSBrbWFsbG9jKHNpemVvZigqbWlkaV9kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltaWRpX2Rldi0+Y2FyZCA9IGNhcmQ7Ci0JbWlkaV9kZXYtPm1pc3RhdGUgPSBNSURJSU5fU1RBVEVfU1RPUFBFRDsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+b1dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfZGV2LT5pV2FpdCk7Ci0JbWlkaV9kZXYtPmlyZCA9IDA7Ci0JbWlkaV9kZXYtPml3ciA9IDA7Ci0JbWlkaV9kZXYtPmljbnQgPSAwOwotCUlOSVRfTElTVF9IRUFEKCZtaWRpX2Rldi0+bWlkX2hkcnMpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IG1pZGlfb3BlbmluZm8gZHNDYXJkTWlkaU9wZW5JbmZvOwotCQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIxOwotCQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIyOwotCi0JCWRzQ2FyZE1pZGlPcGVuSW5mby5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGlfZGV2OwotCi0JCWlmIChlbXUxMGsxX21wdWluX29wZW4oY2FyZCwgJmRzQ2FyZE1pZGlPcGVuSW5mbykgPCAwKSB7Ci0JCQlFUlJPUigpOwotCQkJa2ZyZWUobWlkaV9kZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKiBBZGQgdHdvIGJ1ZmZlcnMgdG8gcmVjZWl2ZSBzeXNleCBidWZmZXIgKi8KLQkJaWYgKG1pZGlpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LCAmbWlkaWhkcjEpIDwgMCkgewotCQkJa2ZyZWUobWlkaV9kZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQlpZiAobWlkaWluX2FkZF9idWZmZXIobWlkaV9kZXYsICZtaWRpaGRyMikgPCAwKSB7Ci0JCQlsaXN0X2RlbCgmbWlkaWhkcjEtPmxpc3QpOwotCQkJa2ZyZWUobWlkaWhkcjEtPmRhdGEpOwotCQkJa2ZyZWUobWlkaWhkcjEpOwotCQkJa2ZyZWUobWlkaV9kZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RydWN0IG1pZGlfb3BlbmluZm8gZHNDYXJkTWlkaU9wZW5JbmZvOwotCi0JCWRzQ2FyZE1pZGlPcGVuSW5mby5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGlfZGV2OwotCi0JCWlmIChlbXUxMGsxX21wdW91dF9vcGVuKGNhcmQsICZkc0NhcmRNaWRpT3BlbkluZm8pIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCWtmcmVlKG1pZGlfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgbWlkaV9kZXY7Ci0KLQljYXJkLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKTsKLQotCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfbWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JY2FyZCA9IG1pZGlfZGV2LT5jYXJkOwotCURQRigyLCAiZW11MTBrMV9taWRpX3JlbGVhc2UoKVxuIik7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7Ci0KLQkJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgKGNhcmQtPm1wdW91dC0+Zmlyc3RtaWRpcSAhPSBOVUxMKSkgewotCQkJCURQRig0LCAiQ2Fubm90IGNsb3NlIC0gYnVmZmVycyBub3QgZW1wdHlcbiIpOwotCi0JCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmbWlkaV9kZXYtPm9XYWl0KTsKLQotCQkJfQotCQl9Ci0KLQkJZW11MTBrMV9tcHVvdXRfY2xvc2UoY2FyZCk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOwotCi0JCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RBUlRFRCkgewotCQkJZW11MTBrMV9tcHVpbl9zdG9wKGNhcmQpOwotCQkJbWlkaV9kZXYtPm1pc3RhdGUgPSBNSURJSU5fU1RBVEVfU1RPUFBFRDsKLQkJfQotCi0JCWVtdTEwazFfbXB1aW5fcmVzZXQoY2FyZCk7Ci0JCWVtdTEwazFfbXB1aW5fY2xvc2UoY2FyZCk7Ci0KLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZtaWRpX2Rldi0+bWlkX2hkcnMpKSB7Ci0JCQltaWRpaGRyID0gbGlzdF9lbnRyeShtaWRpX2Rldi0+bWlkX2hkcnMubmV4dCwgc3RydWN0IG1pZGlfaGRyLCBsaXN0KTsKLQotCQkJbGlzdF9kZWwobWlkaV9kZXYtPm1pZF9oZHJzLm5leHQpOwotCQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCQlrZnJlZShtaWRpaGRyKTsKLQkJfQotCX0KLQotCWtmcmVlKG1pZGlfZGV2KTsKLQotCW11dGV4X2xvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQljYXJkLT5vcGVuX21vZGUgJj0gfigoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKTsKLQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgZW11MTBrMV9taWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcG9zKQotewotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNzaXplX3QgcmV0ID0gMDsKLQl1MTYgY250OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEQoNCwgImVtdTEwazFfbWlkaV9yZWFkKCksIGNvdW50ICUjeFxuIiwgKHUzMikgY291bnQpOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAobWlkaV9kZXYtPm1pc3RhdGUgPT0gTUlESUlOX1NUQVRFX1NUT1BQRUQpIHsKLQkJaWYgKGVtdTEwazFfbXB1aW5fc3RhcnQobWlkaV9kZXYtPmNhcmQpIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJbWlkaV9kZXYtPm1pc3RhdGUgPSBNSURJSU5fU1RBVEVfU1RBUlRFRDsKLQl9Ci0KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWNudCA9IE1JRElJTl9CVUZMRU4gLSBtaWRpX2Rldi0+aXJkOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKG1pZGlfZGV2LT5pY250IDwgY250KQotCQkJY250ID0gbWlkaV9kZXYtPmljbnQ7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCWlmIChjbnQgPiBjb3VudCkKLQkJCWNudCA9IGNvdW50OwotCi0JCWlmIChjbnQgPD0gMCkgewotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOwotCQkJRFBGKDIsICIgR28gdG8gc2xlZXAuLi5cbiIpOwotCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZtaWRpX2Rldi0+aVdhaXQpOwotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgbWlkaV9kZXYtPmlCdWYgKyBtaWRpX2Rldi0+aXJkLCBjbnQpKSB7Ci0JCQlFUlJPUigpOwotCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7Ci0JCX0KLQotCQltaWRpX2Rldi0+aXJkICs9IGNudDsKLQkJbWlkaV9kZXYtPmlyZCAlPSBNSURJSU5fQlVGTEVOOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJbWlkaV9kZXYtPmljbnQgLT0gY250OwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCQljb3VudCAtPSBjbnQ7Ci0JCWJ1ZmZlciArPSBjbnQ7Ci0JCXJldCArPSBjbnQ7Ci0KLQkJaWYgKG1pZGlfZGV2LT5pY250ID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBlbXUxMGsxX21pZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcG9zKQotewotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBEKDQsICJlbXUxMGsxX21pZGlfd3JpdGUoKSwgY291bnQ9JSN4XG4iLCAodTMyKSBjb3VudCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKChtaWRpaGRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWlkaWhkci0+YnVmZmVybGVuZ3RoID0gY291bnQ7Ci0JbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IDA7Ci0JbWlkaWhkci0+ZmxhZ3MgPSAwOwotCi0JbWlkaWhkci0+ZGF0YSA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghbWlkaWhkci0+ZGF0YSkgewotCQlFUlJPUigpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKG1pZGloZHItPmRhdGEsIGJ1ZmZlciwgY291bnQpKSB7Ci0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKG1pZGlfZGV2LT5jYXJkLCBtaWRpaGRyKSA8IDApIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBlbXUxMGsxX21pZGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JRFBGKDQsICJlbXUxMGsxX21pZGlfcG9sbCgpIGNhbGxlZFxuIik7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCXBvbGxfd2FpdChmaWxlLCAmbWlkaV9kZXYtPm9XYWl0LCB3YWl0KTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQlwb2xsX3dhaXQoZmlsZSwgJm1pZGlfZGV2LT5pV2FpdCwgd2FpdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVEFSVEVEKQotCQkJaWYgKG1pZGlfZGV2LT5pY250ID4gMCkKLQkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIG1hc2s7Ci19Ci0KLWludCBlbXUxMGsxX21pZGlfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBtc2csIHVuc2lnbmVkIGxvbmcgcmVmZGF0YSwgdW5zaWduZWQgbG9uZyAqcG1zZykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIHJlZmRhdGE7Ci0Jc3RydWN0IG1pZGlfaGRyICptaWRpaGRyID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0JRFBGKDQsICJlbXUxMGsxX21pZGlfY2FsbGJhY2soKVxuIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIElDQVJETUlESV9PVVRMT05HREFUQToKLQkJbWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikgcG1zZ1syXTsKLQotCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWlkaV9kZXYtPm9XYWl0KTsKLQotCQlicmVhazsKLQotCWNhc2UgSUNBUkRNSURJX0lOTE9OR0RBVEE6Ci0JCW1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIHBtc2dbMl07Ci0KLQkJZm9yIChpID0gMDsgaSA8IG1pZGloZHItPmJ5dGVzcmVjb3JkZWQ7IGkrKykgewotCQkJbWlkaV9kZXYtPmlCdWZbbWlkaV9kZXYtPml3cisrXSA9IG1pZGloZHItPmRhdGFbaV07Ci0JCQltaWRpX2Rldi0+aXdyICU9IE1JRElJTl9CVUZMRU47Ci0JCX0KLQotCQltaWRpX2Rldi0+aWNudCArPSBtaWRpaGRyLT5ieXRlc3JlY29yZGVkOwotCi0JCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RBUlRFRCkgewotCQkJaW5pdF9taWRpX2hkcihtaWRpaGRyKTsKLQkJCWVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihtaWRpX2Rldi0+Y2FyZC0+bXB1aW4sIG1pZGloZHIpOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtaWRpX2Rldi0+aVdhaXQpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJQ0FSRE1JRElfSU5EQVRBOgotCQl7Ci0JCQl1OCAqcEJ1ZiA9ICh1OCAqKSAmIHBtc2dbMV07Ci0JCQl1MTYgYnl0ZXN2YWxpZCA9IHBtc2dbMl07Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBieXRlc3ZhbGlkOyBpKyspIHsKLQkJCQltaWRpX2Rldi0+aUJ1ZlttaWRpX2Rldi0+aXdyKytdID0gcEJ1ZltpXTsKLQkJCQltaWRpX2Rldi0+aXdyICU9IE1JRElJTl9CVUZMRU47Ci0JCQl9Ci0KLQkJCW1pZGlfZGV2LT5pY250ICs9IGJ5dGVzdmFsaWQ7Ci0JCX0KLQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1pZGlfZGV2LT5pV2FpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoJCS8qIFVua25vd24gbWVzc2FnZSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogTUlESSBmaWxlIG9wZXJhdGlvbnMgKi8KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taWRpX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5yZWFkCQk9IGVtdTEwazFfbWlkaV9yZWFkLAotCS53cml0ZQkJPSBlbXUxMGsxX21pZGlfd3JpdGUsCi0JLnBvbGwJCT0gZW11MTBrMV9taWRpX3BvbGwsCi0JLm9wZW4JCT0gZW11MTBrMV9taWRpX29wZW4sCi0JLnJlbGVhc2UJPSBlbXUxMGsxX21pZGlfcmVsZWFzZSwKLX07Ci0KLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0KLS8qIGZ1bmN0aW9ucyB1c2VkIGZvciBzZXF1ZW5jZXIgYWNjZXNzICovCi0KLWludCBlbXUxMGsxX3NlcV9taWRpX29wZW4oaW50IGRldiwgaW50IG1vZGUsCi0JCQkJdm9pZCAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKLQkJCQl2b2lkICgqb3V0cHV0KSAoaW50IGRldikpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQlzdHJ1Y3QgbWlkaV9vcGVuaW5mbyBkc0NhcmRNaWRpT3BlbkluZm87Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXY7Ci0KLQlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKLQotCWlmIChjYXJkLT5vcGVuX21vZGUpCQkvKiBjYXJkIGlzIG9wZW5lZCBuYXRpdmUgKi8KLQkJcmV0dXJuIC1FQlVTWTsKLQkJCQotCURQRigyLCAiZW11MTBrMV9zZXFfbWlkaV9vcGVuKClcbiIpOwotCQotCWlmICgobWlkaV9kZXYgPSBrbWFsbG9jKHNpemVvZigqbWlkaV9kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltaWRpX2Rldi0+Y2FyZCA9IGNhcmQ7Ci0JbWlkaV9kZXYtPm1pc3RhdGUgPSBNSURJSU5fU1RBVEVfU1RPUFBFRDsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+b1dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfZGV2LT5pV2FpdCk7Ci0JbWlkaV9kZXYtPmlyZCA9IDA7Ci0JbWlkaV9kZXYtPml3ciA9IDA7Ci0JbWlkaV9kZXYtPmljbnQgPSAwOwotCUlOSVRfTElTVF9IRUFEKCZtaWRpX2Rldi0+bWlkX2hkcnMpOwotCi0JZHNDYXJkTWlkaU9wZW5JbmZvLnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaV9kZXY7Ci0KLQlpZiAoZW11MTBrMV9tcHVvdXRfb3BlbihjYXJkLCAmZHNDYXJkTWlkaU9wZW5JbmZvKSA8IDApIHsKLQkJRVJST1IoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JY2FyZC0+c2VxX21pZGlkZXYgPSBtaWRpX2RldjsKLQkJCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV9zZXFfbWlkaV9jbG9zZShpbnQgZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0KLQlEUEYoMiwgImVtdTEwazFfc2VxX21pZGlfY2xvc2UoKVxuIik7Ci0JaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JY2FyZCA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOwotCWVtdTEwazFfbXB1b3V0X2Nsb3NlKGNhcmQpOwotCi0Ja2ZyZWUoY2FyZC0+c2VxX21pZGlkZXYpOwotCWNhcmQtPnNlcV9taWRpZGV2ID0gTlVMTDsKLX0KLQotaW50IGVtdTEwazFfc2VxX21pZGlfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKLQotCWlmICgobWlkaWhkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IDE7Ci0JbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IDA7Ci0JbWlkaWhkci0+ZmxhZ3MgPSAwOwotCi0JbWlkaWhkci0+ZGF0YSA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaWRpaGRyLT5kYXRhKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkqKG1pZGloZHItPmRhdGEpID0gbWlkaV9ieXRlOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihjYXJkLCBtaWRpaGRyKSA8IDApIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAxOwotfQotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9zdGFydF9yZWFkKGludCBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkKGludCBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV9zZXFfbWlkaV9raWNrKGludCBkZXYpCi17Ci19Ci0KLWludCBlbXUxMGsxX3NlcV9taWRpX2J1ZmZlcl9zdGF0dXMoaW50IGRldikKLXsKLQlpbnQgY291bnQ7Ci0Jc3RydWN0IG1pZGlfcXVldWUgKnF1ZXVlOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0KLQlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNvdW50ID0gMDsKLQotCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKLQlxdWV1ZSA9IGNhcmQtPm1wdW91dC0+Zmlyc3RtaWRpcTsKLQotCXdoaWxlIChxdWV1ZSAhPSBOVUxMKSB7Ci0JCWNvdW50Kys7Ci0JCWlmIChxdWV1ZSA9PSBjYXJkLT5tcHVvdXQtPmxhc3RtaWRpcSkKLQkJCWJyZWFrOwotCi0JCXF1ZXVlID0gcXVldWUtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5oIGIvc291bmQvb3NzL2VtdTEwazEvbWlkaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDU5ZWM5Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgbWlkaS5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovIAotCi0jaWZuZGVmIF9NSURJX0gKLSNkZWZpbmUgX01JRElfSAotCi0jZGVmaW5lIEZNT0RFX01JRElfU0hJRlQgMwotI2RlZmluZSBGTU9ERV9NSURJX1JFQUQgIChGTU9ERV9SRUFEIDw8IEZNT0RFX01JRElfU0hJRlQpCi0jZGVmaW5lIEZNT0RFX01JRElfV1JJVEUgKEZNT0RFX1dSSVRFIDw8IEZNT0RFX01JRElfU0hJRlQpCi0KLSNkZWZpbmUgTUlESUlOX1NUQVRFX1NUQVJURUQgMHgwMDAwMDAwMQotI2RlZmluZSBNSURJSU5fU1RBVEVfU1RPUFBFRCAweDAwMDAwMDAyCi0KLSNkZWZpbmUgTUlESUlOX0JVRkxFTiAxMDI0Ci0KLXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXUzMiBtaXN0YXRlOwotCXdhaXRfcXVldWVfaGVhZF90IG9XYWl0OwotCXdhaXRfcXVldWVfaGVhZF90IGlXYWl0OwotCXM4IGlCdWZbTUlESUlOX0JVRkxFTl07Ci0JdTE2IGlyZCwgaXdyLCBpY250OwotCXN0cnVjdCBsaXN0X2hlYWQgbWlkX2hkcnM7Ci19OwotCi0vKiB1bmNvbW1lbnQgbmV4dCBsaW5lIHRvIHVzZSBtaWRpIHBvcnQgb24gQXVkaWd5IGRyaXZlICovCi0vLyNkZWZpbmUgVVNFX0FVRElHWV9EUklWRV9NSURJCi0KLSNpZmRlZiBVU0VfQVVESUdZX0RSSVZFX01JREkKLSNkZWZpbmUgQV9NVURBVEEJQV9NVURBVEEyCi0jZGVmaW5lIEFfTVVDTUQJCUFfTVVDTUQyCi0jZGVmaW5lIEFfTVVTVEFUCUFfTVVDTUQyCi0jZGVmaW5lIEFfSVBSX01JRElUUkFOU0JVRkVNUFRZCUFfSVBSX01JRElUUkFOU0JVRkVNUFRZMgotI2RlZmluZSBBX0lQUl9NSURJUkVDVkJVRkVNUFRZCUFfSVBSX01JRElSRUNWQlVGRU1QVFkyCi0jZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUJQV9JTlRFX01JRElUWEVOQUJMRTIKLSNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRQlBX0lOVEVfTUlESVJYRU5BQkxFMgotI2Vsc2UKLSNkZWZpbmUgQV9NVURBVEEJQV9NVURBVEExCi0jZGVmaW5lIEFfTVVDTUQJCUFfTVVDTUQxCi0jZGVmaW5lIEFfTVVTVEFUCUFfTVVDTUQxCi0jZGVmaW5lIEFfSVBSX01JRElUUkFOU0JVRkVNUFRZCUFfSVBSX01JRElUUkFOU0JVRkVNUFRZMQotI2RlZmluZSBBX0lQUl9NSURJUkVDVkJVRkVNUFRZCUFfSVBSX01JRElSRUNWQlVGRU1QVFkxCi0jZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUJQV9JTlRFX01JRElUWEVOQUJMRTEKLSNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRQlBX0lOVEVfTUlESVJYRU5BQkxFMQotI2VuZGlmCi0KLQotI2VuZGlmIC8qIF9NSURJX0ggKi8KLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWl4ZXIuYyBiL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzgwNWYuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWl4ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBtaXhlci5jIC0gL2Rldi9taXhlciBpbnRlcmZhY2UgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAgc3R1ZmYKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJyZWNtZ3IuaCIKLQotCi1zdGF0aWMgY29uc3QgdTMyIGJhc3NfdGFibGVbNDFdWzVdID0gewotCXsgMHgzZTRmODQ0ZiwgMHg4NGVkNGNjMywgMHgzY2M2OTkyNywgMHg3YjAzNTUzYSwgMHhjNGRhODQ4NiB9LAotCXsgMHgzZTY5YTE3YSwgMHg4NGMyODBmYiwgMHgzY2Q3N2NkNCwgMHg3YjJmMmE2ZiwgMHhjNGIwOGQxZCB9LAotCXsgMHgzZTgyZmY0MiwgMHg4NDk5OTFkNSwgMHgzY2U3NDY2YiwgMHg3YjU5MTdjNiwgMHhjNDg4NjNlZSB9LAotCXsgMHgzZTliYWIzYywgMHg4NDcyNjdmMCwgMHgzY2Y1ZmZlOCwgMHg3YjgxMzU2MCwgMHhjNDYxZjIyYyB9LAotCXsgMHgzZWIzYjI3NSwgMHg4NDRjZWQyOSwgMHgzZDAzYjI5NSwgMHg3YmE3OWExYywgMHhjNDNkMjIzYiB9LAotCXsgMHgzZWNiMjE3NCwgMHg4NDI5MGM4YiwgMHgzZDEwNjcxNCwgMHg3YmNjNWJhMywgMHhjNDE5ZGZhNSB9LAotCXsgMHgzZWUyMDQ0YiwgMHg4NDA2YjI0NCwgMHgzZDFjMjU2MSwgMHg3YmVmOGU3NywgMHhjM2Y4MTcwZiB9LAotCXsgMHgzZWY4NjY5OCwgMHg4M2U1Y2I5NiwgMHgzZDI2ZjRkOCwgMHg3YzExNDYwMCwgMHhjM2Q3YjYyNSB9LAotCXsgMHgzZjBlNTM5MCwgMHg4M2M2NDZjOSwgMHgzZDMwZGMzOSwgMHg3YzMxOTQ5OCwgMHhjM2I4YWI5NyB9LAotCXsgMHgzZjIzZDYwYiwgMHg4M2E4MTMyMSwgMHgzZDM5ZTFhZiwgMHg3YzUwOGI5YywgMHhjMzlhZTcwNCB9LAotCXsgMHgzZjM4Zjg4NCwgMHg4MzhiMjBkMiwgMHgzZDQyMGFkMiwgMHg3YzZlM2I3NSwgMHhjMzdlNThmMSB9LAotCXsgMHgzZjRkYzUyYywgMHg4MzZmNjBlZiwgMHgzZDQ5NWNhYiwgMHg3YzhhYjNhNiwgMHhjMzYyZjJiZSB9LAotCXsgMHgzZjYyNDVlOCwgMHg4MzU0YzU2NSwgMHgzZDRmZGJiOCwgMHg3Y2E2MDJkNiwgMHhjMzQ4YTY5YiB9LAotCXsgMHgzZjc2ODQ1ZiwgMHg4MzNiNDBlYywgMHgzZDU1OGJmMCwgMHg3Y2MwMzZkZiwgMHhjMzJmNjc3YyB9LAotCXsgMHgzZjhhOGEwMywgMHg4MzIyYzZmYiwgMHgzZDVhNzBjNCwgMHg3Y2Q5NWNkNywgMHhjMzE3MjkwYiB9LAotCXsgMHgzZjllNjAxNCwgMHg4MzBiNGJjMywgMHgzZDVlOGQyNSwgMHg3Y2YxODExYSwgMHhjMmZmZGZhNSB9LAotCXsgMHgzZmIyMGZhZSwgMHg4MmY0YzQyMCwgMHgzZDYxZTM3ZiwgMHg3ZDA4YWY1NiwgMHhjMmU5ODA0YSB9LAotCXsgMHgzZmM1YTFjYywgMHg4MmRmMjU5MiwgMHgzZDY0NzVjMywgMHg3ZDFlZjI5NCwgMHhjMmQ0MDA5NiB9LAotCXsgMHgzZmQ5MWY1NSwgMHg4MmNhNjYzMiwgMHgzZDY2NDU2NCwgMHg3ZDM0NTU0MSwgMHhjMmJmNTZiOSB9LAotCXsgMHgzZmVjOTEyMCwgMHg4MmI2N2NhYywgMHgzZDY3NTM1NiwgMHg3ZDQ4ZTEzOCwgMHhjMmFiNzk2ZSB9LAotCXsgMHg0MDAwMDAwMCwgMHg4MmEzNjAzNywgMHgzZDY3YTAxMiwgMHg3ZDVjOWZjOSwgMHhjMjk4NWZlZSB9LAotCXsgMHg0MDEzNzRjNywgMHg4MjkxMDg4YSwgMHgzZDY3MmI5MywgMHg3ZDZmOTljMywgMHhjMjg2MDFmMiB9LAotCXsgMHg0MDI2Zjg1NywgMHg4MjdmNmRkNywgMHgzZDY1ZjU1OSwgMHg3ZDgxZDc3YywgMHhjMjc0NTdhMyB9LAotCXsgMHg0MDNhOTM5ZiwgMHg4MjZlODhjNSwgMHgzZDYzZmM2MywgMHg3ZDkzNjBkNCwgMHhjMjYzNTk5NiB9LAotCXsgMHg0MDRlNGZhZiwgMHg4MjVlNTI2NiwgMHgzZDYxM2YzMiwgMHg3ZGE0M2Q0MiwgMHhjMjUzMDBjNiB9LAotCXsgMHg0MDYyMzViYSwgMHg4MjRlYzQzNCwgMHgzZDVkYmJjMywgMHg3ZGI0NzNkNywgMHhjMjQzNDY4ZSB9LAotCXsgMHg0MDc2NGYxZiwgMHg4MjNmZDgwYywgMHgzZDU5NmY4ZiwgMHg3ZGM0MGI0NCwgMHhjMjM0MjRhMiB9LAotCXsgMHg0MDhhYTU3NiwgMHg4MjMxODgyNCwgMHgzZDU0NTc4NywgMHg3ZGQzMDllMiwgMHhjMjI1OTUwOSB9LAotCXsgMHg0MDlmNDI5NiwgMHg4MjIzY2YwYiwgMHgzZDRlNzAxMiwgMHg3ZGUxNzViNSwgMHhjMjE3OTIxOCB9LAotCXsgMHg0MGI0MzBhMCwgMHg4MjE2YTdhMSwgMHgzZDQ3YjUwNSwgMHg3ZGVmNTQ3NSwgMHhjMjBhMTY3MCB9LAotCXsgMHg0MGM5N2EwYSwgMHg4MjBhMGQxMiwgMHgzZDQwMjFhMSwgMHg3ZGZjYWI4ZCwgMHhjMWZkMWNmNSB9LAotCXsgMHg0MGRmMjlhNiwgMHg4MWZkZmFkNiwgMHgzZDM3YjA4ZCwgMHg3ZTA5ODAyOCwgMHhjMWYwYTBjYSB9LAotCXsgMHg0MGY1NGFiMSwgMHg4MWYyNmNhOSwgMHgzZDJlNWJkMSwgMHg3ZTE1ZDcyYiwgMHhjMWU0OWQ1MiB9LAotCXsgMHg0MTBiZThkYSwgMHg4MWU3NWU4OSwgMHgzZDI0MWNjZSwgMHg3ZTIxYjU0NCwgMHhjMWQ5MGUyNCB9LAotCXsgMHg0MTIzMTA1MSwgMHg4MWRjY2NiMywgMHgzZDE4ZWMzNywgMHg3ZTJkMWVlNiwgMHhjMWNkZWYxMCB9LAotCXsgMHg0MTNhY2RkMCwgMHg4MWQyYjM5ZSwgMHgzZDBjYzIwYSwgMHg3ZTM4MTg0ZSwgMHhjMWMzM2MxMyB9LAotCXsgMHg0MTUzMmVhNywgMHg4MWM5MGZmYiwgMHgzY2ZmOTU4NSwgMHg3ZTQyYTU4YiwgMHhjMWI4ZjE1YSB9LAotCXsgMHg0MTZjNDBjZCwgMHg4MWJmZGViMiwgMHgzY2YxNWQyMSwgMHg3ZTRjY2E3YywgMHhjMWFmMGIzZiB9LAotCXsgMHg0MTg2MTJlYSwgMHg4MWI3MWNkYywgMHgzY2UyMGU4NSwgMHg3ZTU2OGFkMywgMHhjMWE1ODY0MCB9LAotCXsgMHg0MWEwYjQ2NSwgMHg4MWFlYzdjNSwgMHgzY2QxOWU3YywgMHg3ZTVmZWExZSwgMHhjMTljNWYwMyB9LAotCXsgMHg0MWJjMzU3MywgMHg4MWE2ZGNlYSwgMHgzY2MwMDBlOSwgMHg3ZTY4ZWJjMiwgMHhjMTkzOTI1MCB9Ci19OwotCi1zdGF0aWMgY29uc3QgdTMyIHRyZWJsZV90YWJsZVs0MV1bNV0gPSB7Ci0JeyAweDAxMjVjYmE5LCAweGZlZDVkZWJkLCAweDAwNTk5YjZjLCAweDBkMjUwNmRhLCAweGZhODViMzU0IH0sCi0JeyAweDAxNDJmNjdlLCAweGZlYjAzMTYzLCAweDAwNjZjZDBmLCAweDBkMTRjNjlkLCAweGZhOTE0NDczIH0sCi0JeyAweDAxNjMyOGJkLCAweGZlODYwMTU4LCAweDAwNzViN2YyLCAweDBkMDNlYjI3LCAweGZhOWQzMmQyIH0sCi0JeyAweDAxODZiNDM4LCAweGZlNTZjOTgyLCAweDAwODY5MjM0LCAweDBjZjI3MDQ4LCAweGZhYTk3ZmNhIH0sCi0JeyAweDAxYWRmMzU4LCAweGZlMjFmNWZlLCAweDAwOTk5ODQyLCAweDBjZTA1MWMyLCAweGZhYjYyY2E1IH0sCi0JeyAweDAxZDk0OWZhLCAweGZkZTZlMjg3LCAweDAwYWYwZDhkLCAweDBjY2Q4YjRhLCAweGZhYzMzYWE3IH0sCi0JeyAweDAyMDkyNjY5LCAweGZkYTRkOGJmLCAweDAwYzczZDRjLCAweDBjYmExODg0LCAweGZhZDBhYjA3IH0sCi0JeyAweDAyM2UwMjY4LCAweGZkNWIwZTRhLCAweDAwZTI3YjU0LCAweDBjYTVmNTA5LCAweGZhZGU3ZWYyIH0sCi0JeyAweDAyNzg2NDVjLCAweGZkMDhhMmIwLCAweDAxMDEyNTA5LCAweDBjOTExYzYzLCAweGZhZWNiNzg4IH0sCi0JeyAweDAyYjhlMDkxLCAweGZjYWM5ZDFhLCAweDAxMjNhMjYyLCAweDBjN2I4YTE0LCAweGZhZmI1NWRmIH0sCi0JeyAweDAzMDAxYTlhLCAweGZjNDVlOWNlLCAweDAxNGE2NzA5LCAweDBjNjUzOThmLCAweGZiMGE1YWZmIH0sCi0JeyAweDAzNGVjNmQ3LCAweGZiZDM1NzZiLCAweDAxNzVmMzk3LCAweDBjNGUyNjQzLCAweGZiMTljN2U0IH0sCi0JeyAweDAzYTVhYzE1LCAweGZiNTM5M2VlLCAweDAxYTZkNmVkLCAweDBjMzY0Yjk0LCAweGZiMjk5ZDdjIH0sCi0JeyAweDA0MDVhNTYyLCAweGZhYzUyOTY4LCAweDAxZGRhZmFlLCAweDBjMWRhNGUyLCAweGZiMzlkY2E1IH0sCi0JeyAweDA0NmZhM2ZlLCAweGZhMjY3YTY2LCAweDAyMWIyZGRkLCAweDBjMDQyZDhkLCAweGZiNGE4NjMxIH0sCi0JeyAweDA0ZTRiMTdmLCAweGY5NzViZTBmLCAweDAyNjAxNDlmLCAweDBiZTllMGYyLCAweGZiNWI5YWUwIH0sCi0JeyAweDA1NjVmMjIwLCAweGY4YjBmYmU1LCAweDAyYWQzYzI5LCAweDBiY2ViYTczLCAweGZiNmQxYjYwIH0sCi0JeyAweDA1ZjRhNzQ1LCAweGY3ZDYwNzIyLCAweDAzMDM5M2Q0LCAweDBiYjJiNTc4LCAweGZiN2YwODRkIH0sCi0JeyAweDA2OTIzMjM2LCAweGY2ZTI3OWJkLCAweDAzNjQyNDY1LCAweDBiOTVjZDc1LCAweGZiOTE2MjMzIH0sCi0JeyAweDA3NDAxNzEzLCAweGY1ZDNhZWY5LCAweDAzZDAxMjgzLCAweDBiNzdmZGVkLCAweGZiYTQyOTg0IH0sCi0JeyAweDA4MDAwMDAwLCAweGY0YTZiZDg4LCAweDA0NDhhMTYxLCAweDBiNTk0Mjc4LCAweGZiYjc1ZTlmIH0sCi0JeyAweDA4ZDNjMDk3LCAweGYzNTg3MTMxLCAweDA0Y2YzNWE0LCAweDBiMzk5NmM5LCAweGZiY2IwMWNiIH0sCi0JeyAweDA5YmQ1OWEyLCAweGYxZTU0M2Y5LCAweDA1NjU1ODgwLCAweDBiMThmNmIyLCAweGZiZGYxMzMzIH0sCi0JeyAweDBhYmVmZDBmLCAweGYwNDk1NmNhLCAweDA2MGNiYjEyLCAweDBhZjc1ZTJjLCAweGZiZjM5MmU4IH0sCi0JeyAweDBiZGIxMjNlLCAweGVlODA2OTg0LCAweDA2YzczOWZlLCAweDBhZDRjOTYyLCAweGZjMDg4MGRkIH0sCi0JeyAweDBkMTQzYTk0LCAweGVjODVkMjg3LCAweDA3OTZlMTUwLCAweDBhYjEzNGIwLCAweGZjMWRkY2U1IH0sCi0JeyAweDBlNmQ1NjY0LCAweGVhNTQ3NTk4LCAweDA4N2RmMGEwLCAweDBhOGM5Y2I2LCAweGZjMzNhNmFkIH0sCi0JeyAweDBmZTk4YTJhLCAweGU3ZTZiYTM1LCAweDA5N2VkZjgzLCAweDBhNjZmZTViLCAweGZjNDlkZGMyIH0sCi0JeyAweDExOGM0NDIxLCAweGU1MzY4MTNhLCAweDBhOWM2MjQ4LCAweDBhNDA1NmQ3LCAweGZjNjA4MTg1IH0sCi0JeyAweDEzNTk0MjJlLCAweGUyM2QxOWViLCAweDBiZDk2ZWZiLCAweDBhMThhM2JmLCAweGZjNzc5MTJjIH0sCi0JeyAweDE1NTQ5ODJiLCAweGRlZjMzNjQ1LCAweDBkMzk0MmJkLCAweDA5ZWZlMzEyLCAweGZjOGYwYmMxIH0sCi0JeyAweDE3ODJiNjhhLCAweGRiNTBkZWIxLCAweDBlYmY2NzZkLCAweDA5YzYxMzNmLCAweGZjYTZmMDE5IH0sCi0JeyAweDE5ZTg3MTVkLCAweGQ3NGQ2NGZkLCAweDEwNmZiOTk5LCAweDA5OWIzMzM3LCAweGZjYmYzY2Q2IH0sCi0JeyAweDFjOGIwN2I4LCAweGQyZGY1NmFiLCAweDEyNGU2ZWM4LCAweDA5NmY0Mjc0LCAweGZjZDdmMDYwIH0sCi0JeyAweDFmNzAyYjZkLCAweGNkZmM2ZTkyLCAweDE0NjAxYzEwLCAweDA5NDI0MTBiLCAweGZjZjEwOGU1IH0sCi0JeyAweDIyOWUwOTMzLCAweGM4OTk4NWNkLCAweDE2YTliY2ZhLCAweDA5MTQyZmI1LCAweGZkMGE4NDUxIH0sCi0JeyAweDI2MWI1MTE4LCAweGMyYWE4NDA5LCAweDE5MzBiYWI2LCAweDA4ZTUwZmRjLCAweGZkMjQ2MDRkIH0sCi0JeyAweDI5ZWYzZjVkLCAweGJjMjI0ZjI4LCAweDFiZmFmMzk2LCAweDA4YjRlM2FhLCAweGZkM2U5YTNiIH0sCi0JeyAweDJlMjFhNTliLCAweGI0ZjJiYTQ2LCAweDFmMGVjMmQ2LCAweDA4ODNhZTE1LCAweGZkNTkyZjMzIH0sCi0JeyAweDMyYmFmNDRiLCAweGFkMGM3NDI5LCAweDIyNzMwOGEzLCAweDA4NTE3MmViLCAweGZkNzQxYmZkIH0sCi0JeyAweDM3YzQ0NDhiLCAweGE0NWVmNTFkLCAweDI2MmYzMjY3LCAweDA4MWUzNmRjLCAweGZkOGY1ZDE0IH0KLX07Ci0KLQotc3RhdGljIHZvaWQgc2V0X2Jhc3Moc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGwsIGludCByKQotewotCWludCBpOwotCi0JbCA9IChsICogNDAgKyA1MCkgLyAxMDA7Ci0JciA9IChyICogNDAgKyA1MCkgLyAxMDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgKGNhcmQtPmlzX2F1ZGlneSA/IEFfR1BSX0JBU0UgOiBHUFJfQkFTRSkgKyBjYXJkLT5tZ3IuY3RybF9ncHJbU09VTkRfTUlYRVJfQkFTU11bMF0gKyBpLCAwLCBiYXNzX3RhYmxlW2xdW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3RyZWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgbCwgaW50IHIpCi17Ci0JaW50IGk7Ci0KLQlsID0gKGwgKiA0MCArIDUwKSAvIDEwMDsKLQlyID0gKHIgKiA0MCArIDUwKSAvIDEwMDsKLQotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAoY2FyZC0+aXNfYXVkaWd5ID8gQV9HUFJfQkFTRSA6IEdQUl9CQVNFKSArIGNhcmQtPm1nci5jdHJsX2dwcltTT1VORF9NSVhFUl9UUkVCTEVdWzBdICsgaSAsIDAsIHRyZWJsZV90YWJsZVtsXVtpXSk7Ci19Ci0KLWNvbnN0IGNoYXIgdm9sdW1lX3BhcmFtc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdPSB7Ci0vKiBVc2VkIGJ5IHRoZSBhYzk3IGRyaXZlciAqLwotCVtTT1VORF9NSVhFUl9WT0xVTUVdCT0JVk9MXzZCSVQsCi0JW1NPVU5EX01JWEVSX0JBU1NdCT0JVk9MXzRCSVQsCi0JW1NPVU5EX01JWEVSX1RSRUJMRV0JPQlWT0xfNEJJVCwKLQlbU09VTkRfTUlYRVJfUENNXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9TUEVBS0VSXQk9CVZPTF80QklULAotCVtTT1VORF9NSVhFUl9MSU5FXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9NSUNdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0NEXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9BTFRQQ01dCT0JVk9MXzZCSVQsCi0JW1NPVU5EX01JWEVSX0lHQUlOXQk9CVZPTF80QklULAotCVtTT1VORF9NSVhFUl9MSU5FMV0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfUEhPTkVJTl0JPSAJVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX1BIT05FT1VUXQk9IAlWT0xfNkJJVCwKLQlbU09VTkRfTUlYRVJfVklERU9dCT0JVk9MXzVCSVQsCi0vKiBOb3QgdXNlZCBieSB0aGUgYWM5NyBkcml2ZXIgKi8KLQlbU09VTkRfTUlYRVJfU1lOVEhdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0lNSVhdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX1JFQ0xFVl0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfT0dBSU5dCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0xJTkUyXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9MSU5FM10JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfRElHSVRBTDFdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0RJR0lUQUwyXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9ESUdJVEFMM10JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfUkFESU9dCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX01PTklUT1JdCT0JVk9MXzVCSVQKLX07Ci0KLS8qIE1peGVyIGZpbGUgb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCBlbXUxMGsxX3ByaXZhdGVfbWl4ZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwgKmN0bDsKLQlzdHJ1Y3QgZHNwX3BhdGNoICpwYXRjaDsKLQl1MzIgc2l6ZSwgcGFnZTsKLQlpbnQgYWRkciwgc2l6ZV9yZWcsIGksIHJldDsKLQl1bnNpZ25lZCBpbnQgaWQsIGNoOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQotCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTM6Ci0KLQkJY3RsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGN0bCA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGN0bCwgYXJncCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpIHsKLQkJCWtmcmVlKGN0bCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCXJldCA9IDA7Ci0JCXN3aXRjaCAoY3RsLT5jbWQpIHsKLSNpZmRlZiBEQkdFTVUKLQkJY2FzZSBDTURfV1JJVEVGTjA6Ci0JCQllbXUxMGsxX3dyaXRlZm4wXzIoY2FyZCwgY3RsLT52YWxbMF0sIGN0bC0+dmFsWzFdLCBjdGwtPnZhbFsyXSk7Ci0JCQlicmVhazsKLSNlbmRpZgotCQljYXNlIENNRF9XUklURVBUUjoKLSNpZmRlZiBEQkdFTVUKLQkJCWlmIChjdGwtPnZhbFsxXSA+PSAweDQwIHx8IGN0bC0+dmFsWzBdID49IDB4MTAwMCkgewotI2Vsc2UKLQkJCWlmIChjdGwtPnZhbFsxXSA+PSAweDQwIHx8IGN0bC0+dmFsWzBdID49IDB4MTAwMCB8fCAoKGN0bC0+dmFsWzBdIDwgMHgxMDAgKSAmJgotCQkgICAgLy9BbnkgcmVnaXN0ZXIgYWxsb3dlZCByYXcgYWNjZXNzIGdvZXMgaGVyZToKLQkJCQkgICAgIChjdGwtPnZhbFswXSAhPSBBX1NQRElGX1NBTVBMRVJBVEUpICYmIChjdGwtPnZhbFswXSAhPSBBX0RCRykKLQkJCSkKLQkJCQkpIHsKLSNlbmRpZgotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgY3RsLT52YWxbMF0sIGN0bC0+dmFsWzFdLCBjdGwtPnZhbFsyXSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9SRUFERk4wOgotCQkJY3RsLT52YWxbMl0gPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgY3RsLT52YWxbMF0pOwotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfUkVBRFBUUjoKLQkJCWlmIChjdGwtPnZhbFsxXSA+PSAweDQwIHx8IChjdGwtPnZhbFswXSAmIDB4N2ZmKSA+IDB4ZmYpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoKGN0bC0+dmFsWzBdICYgMHg3ZmYpID4gMHgzZikKLQkJCQljdGwtPnZhbFsxXSA9IDB4MDA7Ci0KLQkJCWN0bC0+dmFsWzJdID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgY3RsLT52YWxbMF0sIGN0bC0+dmFsWzFdKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVFJFQ1NSQzoKLQkJCXN3aXRjaCAoY3RsLT52YWxbMF0pIHsKLQkJCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCQkJCWlmIChjYXJkLT5pc19hcHMpIHsKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfQUM5NzsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBXQVZFUkVDT1JEX01JQzoKLQkJCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9NSUM7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9GWDsKLQkJCQljYXJkLT53YXZlaW4uZnh3YyA9IGN0bC0+dmFsWzFdICYgMHhmZmZmOwotCi0JCQkJaWYgKCFjYXJkLT53YXZlaW4uZnh3YykKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRSRUNTUkM6Ci0JCQljdGwtPnZhbFswXSA9IGNhcmQtPndhdmVpbi5yZWNzcmM7Ci0JCQljdGwtPnZhbFsxXSA9IGNhcmQtPndhdmVpbi5meHdjOwotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0dFVFZPSUNFUEFSQU06Ci0JCQljdGwtPnZhbFswXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzBdOwotCQkJY3RsLT52YWxbMV0gPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVswXTsKLQotCQkJY3RsLT52YWxbMl0gPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1sxXTsKLQkJCWN0bC0+dmFsWzNdID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMV07Ci0KLQkJCWN0bC0+dmFsWzRdID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMl07Ci0JCQljdGwtPnZhbFs1XSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzJdOwotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUVk9JQ0VQQVJBTToKLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzBdID0gY3RsLT52YWxbMF07Ci0JCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVswXSA9IGN0bC0+dmFsWzFdOwotCi0JCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1sxXSA9IGN0bC0+dmFsWzJdOwotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMV0gPSBjdGwtPnZhbFszXTsKLQotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMl0gPSBjdGwtPnZhbFs0XTsKLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzJdID0gY3RsLT52YWxbNV07Ci0KLQkJCWJyZWFrOwotCQkKLQkJY2FzZSBDTURfU0VUTUNIX0ZYOgotCQkJY2FyZC0+bWNoYW5uZWxfZnggPSBjdGwtPnZhbFswXSAmIDB4MDAwZjsKLQkJCWJyZWFrOwotCQkKLQkJY2FzZSBDTURfR0VUUEFUQ0g6Ci0JCQlpZiAoY3RsLT52YWxbMF0gPT0gMCkgewotCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNhcmQtPm1nci5ycGF0Y2gsIHNpemVvZihzdHJ1Y3QgZHNwX3JwYXRjaCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcmV0ID0gLUVGQVVMVDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChjdGwtPnZhbFswXSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRSA+PSBjYXJkLT5tZ3IuY3VycmVudF9wYWdlcykgewotCQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIFBBVENIKCZjYXJkLT5tZ3IsIGN0bC0+dmFsWzBdIC0gMSksIHNpemVvZihzdHJ1Y3QgZHNwX3BhdGNoKSkpCi0JCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0dFVEdQUjoKLQkJCWlkID0gY3RsLT52YWxbMF07Ci0KLQkJCWlmIChpZCA+IE5VTV9HUFJTKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2FyZC0+bWdyLmdwcltpZF0sIHNpemVvZihzdHJ1Y3QgZHNwX2dwcikpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0dFVENUTEdQUjoKLQkJCWFkZHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgKGNoYXIgKikgY3RsLT52YWwsICYoKGNoYXIgKikgY3RsLT52YWwpW1BBVENIX05BTUVfU0laRV0pOwotCQkJY3RsLT52YWxbMF0gPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBhZGRyLCAwKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVFBBVENIOgotCQkJaWYgKGN0bC0+dmFsWzBdID09IDApCi0JCQkJbWVtY3B5KCZjYXJkLT5tZ3IucnBhdGNoLCAmY3RsLT52YWxbMV0sIHNpemVvZihzdHJ1Y3QgZHNwX3JwYXRjaCkpOwotCQkJZWxzZSB7Ci0JCQkJcGFnZSA9IChjdGwtPnZhbFswXSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRTsKLQkJCQlpZiAocGFnZSA+IE1BWF9QQVRDSEVTX1BBR0VTKSB7Ci0JCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChwYWdlID49IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzKSB7Ci0JCQkJCWZvciAoaSA9IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzOyBpIDwgcGFnZSArIDE7IGkrKykgewotCQkJCSAgICAgICAgICAgICAgICBjYXJkLT5tZ3IucGF0Y2hbaV0gPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJCQkJCWlmKGNhcmQtPm1nci5wYXRjaFtpXSA9PSBOVUxMKSB7Ci0JCQkJCQkJY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMgPSBpOwotCQkJCQkJCXJldCA9IC1FTk9NRU07Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQltZW1zZXQoY2FyZC0+bWdyLnBhdGNoW2ldLCAwLCBQQUdFX1NJWkUpOwotCQkJCQl9Ci0JCQkJCWNhcmQtPm1nci5jdXJyZW50X3BhZ2VzID0gcGFnZSArIDE7Ci0JCQkJfQotCi0JCQkJcGF0Y2ggPSBQQVRDSCgmY2FyZC0+bWdyLCBjdGwtPnZhbFswXSAtIDEpOwotCi0JCQkJbWVtY3B5KHBhdGNoLCAmY3RsLT52YWxbMV0sIHNpemVvZihzdHJ1Y3QgZHNwX3BhdGNoKSk7Ci0KLQkJCQlpZiAocGF0Y2gtPmNvZGVfc2l6ZSA9PSAwKSB7Ci0JCQkJCWZvcihpID0gcGFnZSArIDE7IGkgPCBjYXJkLT5tZ3IuY3VycmVudF9wYWdlczsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjYXJkLT5tZ3IucGF0Y2hbaV0pOwotCi0JCQkJCWNhcmQtPm1nci5jdXJyZW50X3BhZ2VzID0gcGFnZSArIDE7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUR1BSOgotCQkJaWYgKGN0bC0+dmFsWzBdID4gTlVNX0dQUlMpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQltZW1jcHkoJmNhcmQtPm1nci5ncHJbY3RsLT52YWxbMF1dLCAmY3RsLT52YWxbMV0sIHNpemVvZihzdHJ1Y3QgZHNwX2dwcikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUQ1RMR1BSOgotCQkJYWRkciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCAoY2hhciAqKSBjdGwtPnZhbCwgKGNoYXIgKikgY3RsLT52YWwgKyBQQVRDSF9OQU1FX1NJWkUpOwotCQkJZW11MTBrMV9zZXRfY29udHJvbF9ncHIoY2FyZCwgYWRkciwgKigoczMyICopKChjaGFyICopIGN0bC0+dmFsICsgMiAqIFBBVENIX05BTUVfU0laRSkpLCAwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVEdQT1VUOgotCQkJaWYgKCAoKGN0bC0+dmFsWzBdID4gMikgJiYgKCFjYXJkLT5pc19hdWRpZ3kpKQotCQkJICAgICB8fCAoY3RsLT52YWxbMF0gPiAxNSkgfHwgY3RsLT52YWxbMV0gPiAxKSB7Ci0JCQkJcmV0PSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgKDEgPDwgMjQpIHwgKChjdGwtPnZhbFswXSkgPDwgMTYpIHwgQV9JT0NGRywgY3RsLT52YWxbMV0pOwotCQkJZWxzZQotCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgKDEgPDwgMjQpIHwgKCgoY3RsLT52YWxbMF0pICsgMTApIDw8IDE2KSB8IEhDRkcsIGN0bC0+dmFsWzFdKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0dFVEdQUjJPU1M6Ci0JCQlpZCA9IGN0bC0+dmFsWzBdOwotCQkJY2ggPSBjdGwtPnZhbFsxXTsKLQotCQkJaWYgKGlkID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCBjaCA+PSAyKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY3RsLT52YWxbMl0gPSBjYXJkLT5tZ3IuY3RybF9ncHJbaWRdW2NoXTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVEdQUjJPU1M6Ci0JCQlpZCA9IGN0bC0+dmFsWzBdOwotCQkJLyogMCA9PSBsZWZ0LCAxID09IHJpZ2h0ICovCi0JCQljaCA9IGN0bC0+dmFsWzFdOwotCQkJYWRkciA9IGN0bC0+dmFsWzJdOwotCi0JCQlpZiAoaWQgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8IGNoID49IDIpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXJkLT5tZ3IuY3RybF9ncHJbaWRdW2NoXSA9IGFkZHI7Ci0KLQkJCWlmIChjYXJkLT5pc19hcHMpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChhZGRyID49IDApIHsKLQkJCQl1bnNpZ25lZCBpbnQgc3RhdGUgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF07Ci0KLQkJCQlpZiAoY2ggPT0gMSkgewotCQkJCQlzdGF0ZSA+Pj0gODsKLQkJCQkJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSAoMSA8PCBpZCk7Ci0JCQkJfQotCi0JCQkJY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSAoMSA8PCBpZCk7Ci0KLQkJCQlpZiAoaWQgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSB7Ci0JCQkJCXNldF90cmVibGUoY2FyZCwgY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdICYgMHhmZiwgKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSA+PiA4KSAmIDB4ZmYpOwotCQkJCX0gZWxzZSBpZiAoaWQgPT0gU09VTkRfTUlYRVJfQkFTUykgewotCQkJCQlzZXRfYmFzcyhjYXJkLCBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gJiAweGZmLCAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdID4+IDgpICYgMHhmZik7Ci0JCQkJfSBlbHNlCi0JCQkJCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgYWRkciwgc3RhdGUgJiAweGZmLAotCQkJCQkJCSAgICAgICB2b2x1bWVfcGFyYW1zW2lkXSk7Ci0JCQl9IGVsc2UgewotCQkJCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgJj0gfigxIDw8IGlkKTsKLQkJCQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9IGNhcmQtPmFjOTdfc3RlcmVvX21peGVyczsKLQotCQkJCWlmIChjaCA9PSAwKSB7Ci0JCQkJCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgJj0gfigxIDw8IGlkKTsKLQkJCQkJY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSBjYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnM7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUUEFTU1RIUk9VR0g6Ci0JCQljYXJkLT5wdC5zZWxlY3RlZCA9IGN0bC0+dmFsWzBdID8gMSA6IDA7Ci0JCQlpZiAoY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpCi0JCQkJYnJlYWs7Ci0KLQkJCWNhcmQtPnB0LnNwY3NfdG9fdXNlID0gY3RsLT52YWxbMF0gJiAweDA3OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfUFJJVkFURTNfVkVSU0lPTjoKLQkJCWN0bC0+dmFsWzBdID0gUFJJVkFURTNfVkVSU0lPTjsJLy9wcml2YXRlMyB2ZXJzaW9uCi0JCQljdGwtPnZhbFsxXSA9IE1BSk9SX1ZFUjsJLy9tYWpvciBkcml2ZXIgdmVyc2lvbgotCQkJY3RsLT52YWxbMl0gPSBNSU5PUl9WRVI7CS8vbWlub3IgZHJpdmVyIHZlcnNpb24KLQkJCWN0bC0+dmFsWzNdID0gY2FyZC0+aXNfYXVkaWd5OwkvLzE9Y2FyZCBpcyBhdWRpZ3kKLQotCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJCQljdGwtPnZhbFs0XT1lbXUxMGsxX3JlYWRmbjAoY2FyZCwgMHgxOCk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfQUM5N19CT09TVDoKLQkJCWlmIChjdGwtPnZhbFswXSkKLQkJCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHgwKTsJCi0JCQllbHNlCi0JCQkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4MDgwOCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWtmcmVlKGN0bCk7Ci0JCXJldHVybiByZXQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNDoKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNpemUsIGFyZ3AsIHNpemVvZihzaXplKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgIkV4dGVybmFsIHRyYW0gc2l6ZSAlI3hcbiIsIHNpemUpOwotCi0JCWlmIChzaXplID4gMHgxZmZmZmYpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzaXplX3JlZyA9IDA7Ci0KLQkJaWYgKHNpemUgIT0gMCkgewotCQkJc2l6ZSA9IChzaXplIC0gMSkgPj4gMTQ7Ci0KLQkJCXdoaWxlIChzaXplKSB7Ci0JCQkJc2l6ZSA+Pj0gMTsKLQkJCQlzaXplX3JlZysrOwotCQkJfQotCi0JCQlzaXplID0gMHg0MDAwIDw8IHNpemVfcmVnOwotCQl9Ci0KLQkJRFBEKDIsICJFeHRlcm5hbCB0cmFtIHNpemUgJSN4ICUjeFxuIiwgc2l6ZSwgc2l6ZV9yZWcpOwotCi0JCWlmIChzaXplICE9IGNhcmQtPnRhbmttZW0uc2l6ZSkgewotCQkJaWYgKGNhcmQtPnRhbmttZW0uc2l6ZSA+IDApIHsKLQkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkdfTE9DS1RBTktDQUNIRSwgMSk7Ci0KLQkJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsIFRDQiwgMCwgVENCUywgMCwgVEFHTElTVF9FTkQpOwotCi0JCQkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT50YW5rbWVtLnNpemUsIGNhcmQtPnRhbmttZW0uYWRkciwgY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlKTsKLQotCQkJCWNhcmQtPnRhbmttZW0uc2l6ZSA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChzaXplICE9IDApIHsKLQkJCQljYXJkLT50YW5rbWVtLmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBzaXplLCAmY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlKTsKLQkJCQlpZiAoY2FyZC0+dGFua21lbS5hZGRyID09IE5VTEwpCi0JCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQkJY2FyZC0+dGFua21lbS5zaXplID0gc2l6ZTsKLQotCQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwgVENCLCAodTMyKSBjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUsIFRDQlMsKHUzMikgc2l6ZV9yZWcsIFRBR0xJU1RfRU5EKTsKLQotCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGR19MT0NLVEFOS0NBQ0hFLCAwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX2RzcF9taXhlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgb3NzX21peGVyLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl1bnNpZ25lZCBpbnQgbGVmdCwgcmlnaHQ7Ci0JaW50IHZhbDsKLQlpbnQgc2NhbGU7Ci0KLQljYXJkLT5hYzk3LT5tb2RjbnQrKzsKLQotCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkvKiBjbGVhbnNlIGlucHV0IGEgbGl0dGxlICovCi0JcmlnaHQgPSAoKHZhbCA+PiA4KSAgJiAweGZmKTsKLQlsZWZ0ID0gKHZhbCAgJiAweGZmKTsKLQotCWlmIChyaWdodCA+IDEwMCkgcmlnaHQgPSAxMDA7Ci0JaWYgKGxlZnQgPiAxMDApIGxlZnQgPSAxMDA7Ci0KLQljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfbWl4ZXJdID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKLQlpZiAob3NzX21peGVyID09IFNPVU5EX01JWEVSX1RSRUJMRSkgewotCQlzZXRfdHJlYmxlKGNhcmQsIGxlZnQsIHJpZ2h0KTsKLQkJcmV0dXJuIDA7Ci0JfSBpZiAob3NzX21peGVyID09IFNPVU5EX01JWEVSX0JBU1MpIHsKLQkJc2V0X2Jhc3MoY2FyZCwgbGVmdCwgcmlnaHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAob3NzX21peGVyID09IFNPVU5EX01JWEVSX1ZPTFVNRSkKLQkJc2NhbGUgPSAxIDw8IGNhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uOwotCWVsc2UKLQkJc2NhbGUgPSB2b2x1bWVfcGFyYW1zW29zc19taXhlcl07Ci0KLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzBdLCBsZWZ0LCBzY2FsZSk7Ci0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVsxXSwgcmlnaHQsIHNjYWxlKTsKLQotCWlmIChjYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnMgJiAoMSA8PCBvc3NfbWl4ZXIpKQotCQljYXJkLT5hYzk3LT53cml0ZV9taXhlcihjYXJkLT5hYzk3LCBvc3NfbWl4ZXIsIGxlZnQsIHJpZ2h0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgb3NzX21peGVyID0gX0lPQ19OUihjbWQpOwotCQotCXJldCA9IC1FSU5WQUw7Ci0JaWYgKCFjYXJkLT5pc19hcHMpIHsKLQkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7Ci0JCQltaXhlcl9pbmZvIGluZm87Ci0KLQkJCXN0cmxjcHkoaW5mby5pZCwgY2FyZC0+YWM5Ny0+bmFtZSwgc2l6ZW9mKGluZm8uaWQpKTsKLQotCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJCQlzdHJsY3B5KGluZm8ubmFtZSwgIkF1ZGlneSAtIEVtdTEwazEiLCBzaXplb2YoaW5mby5uYW1lKSk7Ci0JCQllbHNlCi0JCQkJc3RybGNweShpbmZvLm5hbWUsICJDcmVhdGl2ZSBTQkxpdmUgLSBFbXUxMGsxIiwgc2l6ZW9mKGluZm8ubmFtZSkpOwotCQkJCQotCQkJaW5mby5tb2RpZnlfY291bnRlciA9IGNhcmQtPmFjOTctPm1vZGNudDsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWlmICgoX1NJT0NfRElSKGNtZCkgPT0gKF9TSU9DX1dSSVRFfF9TSU9DX1JFQUQpKSAmJiBvc3NfbWl4ZXIgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTKQotCQkJcmV0ID0gZW11MTBrMV9kc3BfbWl4ZXIoY2FyZCwgb3NzX21peGVyLCBhcmcpOwotCQllbHNlCi0JCQlyZXQgPSBjYXJkLT5hYzk3LT5taXhlcl9pb2N0bChjYXJkLT5hYzk3LCBjbWQsIGFyZyk7Ci0JfQotCQotCWlmIChyZXQgPCAwKQotCQlyZXQgPSBlbXUxMGsxX3ByaXZhdGVfbWl4ZXIoY2FyZCwgY21kLCBhcmcpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX21peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQotCURQRig0LCAiZW11MTBrMV9taXhlcl9vcGVuKClcbiIpOwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtdTEwazFfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdTEwazFfY2FyZCwgbGlzdCk7Ci0KLQkJaWYgKGNhcmQtPmFjOTctPmRldl9taXhlciA9PSBtaW5vcikKLQkJCWdvdG8gbWF0Y2g7Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICAgIG1hdGNoOgotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCURQRig0LCAiZW11MTBrMV9taXhlcl9yZWxlYXNlKClcbiIpOwotCXJldHVybiAwOwotfQotCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWl4ZXJfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLmlvY3RsCQk9IGVtdTEwazFfbWl4ZXJfaW9jdGwsCi0JLm9wZW4JCT0gZW11MTBrMV9taXhlcl9vcGVuLAotCS5yZWxlYXNlCT0gZW11MTBrMV9taXhlcl9yZWxlYXNlLAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDIxZDQzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgcGFzc3Rocm91Z2guYyAtLSBFbXUxMGsxIGRpZ2l0YWwgcGFzc3Rocm91Z2gKLSAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEp1aGEgWXJq9mzkIDxqeXJqb2xhQGNjLmh1dC5maT4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE1heSAxNSwgMjAwMQkgICAgSnVoYSBZcmr2bOQJICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiY2FyZHdvLmgiCi0jaW5jbHVkZSAiY2FyZHdpLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0KLXN0YXRpYyB2b2lkIHB0X3B1dHNhbXBsZXMoc3RydWN0IHB0X2RhdGEgKnB0LCB1MTYgKnB0ciwgdTE2IGxlZnQsIHUxNiByaWdodCkKLXsKLQl1bnNpZ25lZCBpbnQgaWR4OwotCi0JcHRyW3B0LT5jb3B5cHRyXSA9IGxlZnQ7Ci0JaWR4ID0gcHQtPmNvcHlwdHIgKyBQVF9TQU1QTEVTLzI7Ci0JaWR4ICU9IFBUX1NBTVBMRVM7Ci0JcHRyW2lkeF0gPSByaWdodDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHRfY2FuX3dyaXRlKHN0cnVjdCBwdF9kYXRhICpwdCkKLXsKLQlyZXR1cm4gcHQtPmJsb2Nrc19jb3BpZWQgPCBwdC0+YmxvY2tzX3BsYXllZCArIDg7Ci19Ci0KLXN0YXRpYyBpbnQgcHRfd2FpdF9mb3Jfd3JpdGUoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZWRldiwgaW50IG5vbmJsb2NrKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlZGV2LT5jYXJkOwotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKLQotCWlmIChub25ibG9jayAmJiAhcHRfY2FuX3dyaXRlKHB0KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0Jd2hpbGUgKCFwdF9jYW5fd3JpdGUocHQpICYmIHB0LT5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSkgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwdC0+d2FpdCk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JfQotCWlmIChwdC0+c3RhdGUgPT0gUFRfU1RBVEVfSU5BQ1RJVkUpCi0JCXJldHVybiAtRUFHQUlOOwotCQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB0X3B1dGJsb2NrKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2LCB1MTYgKmJsb2NrLCBpbnQgbm9uYmxvY2spCi17Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCXUxNiAqcHRyID0gKHUxNiAqKSBjYXJkLT50YW5rbWVtLmFkZHI7Ci0JaW50IGkgPSAwLCByOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyID0gcHRfd2FpdF9mb3Jfd3JpdGUod2F2ZV9kZXYsIG5vbmJsb2NrKTsKLQlpZiAociA8IDApCi0JCXJldHVybiByOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKGkgPCBQVF9CTE9DS1NBTVBMRVMpIHsKLQkJcHRfcHV0c2FtcGxlcyhwdCwgcHRyLCBibG9ja1syKmldLCBibG9ja1syKmkrMV0pOwotCQlpZiAocHQtPmNvcHlwdHIgPT0gMCkKLQkJCXB0LT5jb3B5cHRyID0gUFRfU0FNUExFUzsKLQkJcHQtPmNvcHlwdHItLTsKLQkJaSsrOwotCX0KLQl3b2luc3QtPnRvdGFsX2NvcGllZCArPSBQVF9CTE9DS1NJWkU7Ci0JcHQtPmJsb2Nrc19jb3BpZWQrKzsKLQlpZiAocHQtPmJsb2Nrc19jb3BpZWQgPj0gNCAmJiBwdC0+c3RhdGUgIT0gUFRfU1RBVEVfUExBWUlORykgewotCQlEUEYoMiwgImFjdGl2YXRpbmcgZGlnaXRhbCBwYXNzLXRocm91Z2ggcGxheWJhY2tcbiIpOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgR1BSX0JBU0UgKyBwdC0+ZW5hYmxlX2dwciwgMCwgMSk7Ci0JCXB0LT5zdGF0ZSA9IFBUX1NUQVRFX1BMQVlJTkc7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnB0LmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfcHRfc2V0dXAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0JdTMyIGJpdHM7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJcHQtPm9sZF9zcGNzW2ldID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgU1BDUzAgKyBpLCAwKTsKLQkJaWYgKHB0LT5zcGNzX3RvX3VzZSAmICgxIDw8IGkpKSB7Ci0JCQlEUEQoMiwgInVzaW5nIFMvUERJRiBwb3J0ICVkXG4iLCBpKTsKLQkJCWJpdHMgPSBTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IFNQQ1NfU0FNUExFUkFURV80OCB8Ci0JCQkJU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfCBTUENTX0dFTkVSQVRJT05TVEFUVVMgfAotCQkJCTB4MDAwMDEyMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVDsKLQkJCWlmIChwdC0+YWMzZGF0YSkKLQkJCQliaXRzIHw9IFNQQ1NfTk9UQVVESU9EQVRBOwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNQQ1MwICsgaSwgMCwgYml0cyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXNzaXplX3QgZW11MTBrMV9wdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0JaW50IG5vbmJsb2NrLCBpLCByLCBibG9ja3MsIGJsb2Nrc19jb3BpZWQsIGJ5dGVzX2NvcGllZCA9IDA7Ci0KLQlEUEQoMywgImVtdTEwazFfcHRfd3JpdGUoKTogJWQgYnl0ZXNcbiIsIGNvdW50KTsKLQkKLQlub25ibG9jayA9IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLOwotCQotCWlmIChjYXJkLT50YW5rbWVtLnNpemUgPCBQVF9TQU1QTEVTKjIpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChwdC0+c3RhdGUgPT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKLQkJRFBGKDIsICJidWZwdHIgaW5pdFxuIik7Ci0JCXB0LT5wbGF5cHRyID0gUFRfU0FNUExFUy0xOwotCQlwdC0+Y29weXB0ciA9IFBUX0lOSVRQVFI7Ci0JCXB0LT5ibG9ja3NfcGxheWVkID0gcHQtPmJsb2Nrc19jb3BpZWQgPSAwOwotCQltZW1zZXQoY2FyZC0+dGFua21lbS5hZGRyLCAwLCBjYXJkLT50YW5rbWVtLnNpemUpOwotCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9BQ1RJVkFURUQ7Ci0JCXB0LT5idWYgPSBrbWFsbG9jKFBUX0JMT0NLU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCXB0LT5wcmVwZW5kX3NpemUgPSAwOwotCQlpZiAocHQtPmJ1ZiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWVtdTEwazFfcHRfc2V0dXAod2F2ZV9kZXYpOwotCX0KLQlpZiAocHQtPnByZXBlbmRfc2l6ZSkgewotCQlpbnQgbmVlZGVkID0gUFRfQkxPQ0tTSVpFIC0gcHQtPnByZXBlbmRfc2l6ZTsKLQotCQlEUEQoMywgInByZXBlbmQgc2l6ZSAlZCwgcHJlcGVuZGluZyAlZCBieXRlc1xuIiwgcHQtPnByZXBlbmRfc2l6ZSwgbmVlZGVkKTsKLQkJaWYgKGNvdW50IDwgbmVlZGVkKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIocHQtPmJ1ZiArIHB0LT5wcmVwZW5kX3NpemUsCi0JCQkJCSAgIGJ1ZmZlciwgY291bnQpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHQtPnByZXBlbmRfc2l6ZSArPSBjb3VudDsKLQkJCURQRCgzLCAicHJlcGVuZCBzaXplIG5vdyAlZFxuIiwgcHQtPnByZXBlbmRfc2l6ZSk7Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYgKyBwdC0+cHJlcGVuZF9zaXplLCBidWZmZXIsIG5lZWRlZCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJciA9IHB0X3B1dGJsb2NrKHdhdmVfZGV2LCAodTE2ICopIHB0LT5idWYsIG5vbmJsb2NrKTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gcjsKLQkJYnl0ZXNfY29waWVkICs9IG5lZWRlZDsKLQkJcHQtPnByZXBlbmRfc2l6ZSA9IDA7Ci0JfQotCWJsb2NrcyA9IChjb3VudC1ieXRlc19jb3BpZWQpL1BUX0JMT0NLU0laRTsKLQlibG9ja3NfY29waWVkID0gMDsKLQl3aGlsZSAoYmxvY2tzID4gMCkgewotCQl1MTYgX191c2VyICpidWZwdHIgPSAodTE2IF9fdXNlciAqKSBidWZmZXIgKyAoYnl0ZXNfY29waWVkLzIpOwotCQlpZiAoY29weV9mcm9tX3VzZXIocHQtPmJ1ZiwgYnVmcHRyLCBQVF9CTE9DS1NJWkUpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXIgPSBwdF9wdXRibG9jayh3YXZlX2RldiwgKHUxNiAqKXB0LT5idWYsIG5vbmJsb2NrKTsKLQkJaWYgKHIpIHsKLQkJCWlmIChieXRlc19jb3BpZWQpCi0JCQkJcmV0dXJuIGJ5dGVzX2NvcGllZDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcjsKLQkJfQotCQlieXRlc19jb3BpZWQgKz0gUFRfQkxPQ0tTSVpFOwotCQlibG9ja3MtLTsKLQkJYmxvY2tzX2NvcGllZCsrOwotCX0KLQlpID0gY291bnQgLSBieXRlc19jb3BpZWQ7Ci0JaWYgKGkpIHsKLQkJcHQtPnByZXBlbmRfc2l6ZSA9IGk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihwdC0+YnVmLCBidWZmZXIgKyBieXRlc19jb3BpZWQsIGkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJ5dGVzX2NvcGllZCArPSBpOwotCQlEUEQoMywgImZpbGxpbmcgcHJlcGVuZCBidWZmZXIgd2l0aCAlZCBieXRlcyIsIGkpOwotCX0KLQlyZXR1cm4gYnl0ZXNfY29waWVkOwotfQotCi12b2lkIGVtdTEwazFfcHRfc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKLQlpbnQgaTsKLQotCWlmIChwdC0+c3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKLQkJRFBGKDIsICJkaWdpdGFsIHBhc3MtdGhyb3VnaCBzdG9wcGVkXG4iKTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgcHQtPmVuYWJsZV9ncHIsIDAsIDApOwotCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHQtPnNwY3NfdG9fdXNlICYgKDEgPDwgaSkpCi0JCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNQQ1MwICsgaSwgMCwgcHQtPm9sZF9zcGNzW2ldKTsKLQkJfQotCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9JTkFDVElWRTsKLQkJa2ZyZWUocHQtPmJ1Zik7Ci0JfQotfQotCi12b2lkIGVtdTEwazFfcHRfd2F2ZW91dF91cGRhdGUoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmd2F2ZV9kZXYtPmNhcmQtPnB0OwotCXUzMiBwb3M7Ci0KLQlpZiAocHQtPnN0YXRlID09IFBUX1NUQVRFX1BMQVlJTkcgJiYgcHQtPnBvc19ncHIgPj0gMCkgewotCQlwb3MgPSBzYmxpdmVfcmVhZHB0cih3YXZlX2Rldi0+Y2FyZCwgR1BSX0JBU0UgKyBwdC0+cG9zX2dwciwgMCk7Ci0JCWlmIChwb3MgPiBQVF9CTE9DS1NBTVBMRVMpCi0JCQlwb3MgPSBQVF9CTE9DS1NBTVBMRVM7Ci0JCXBvcyA9IDQgKiAoUFRfQkxPQ0tTQU1QTEVTIC0gcG9zKTsKLQl9IGVsc2UKLQkJcG9zID0gMDsKLQl3b2luc3QtPnRvdGFsX3BsYXllZCA9IHB0LT5ibG9ja3NfcGxheWVkICogd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSArIHBvczsKLQl3b2luc3QtPmJ1ZmZlci5od19wb3MgPSBwb3M7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5oIGIvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwY2M5Ny4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgcGFzc3Rocm91Z2guaCAtLSBFbXUxMGsxIGRpZ2l0YWwgcGFzc3Rocm91Z2ggaGVhZGVyIGZpbGUKLSAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEp1aGEgWXJq9mzkIDxqeXJqb2xhQGNjLmh1dC5maT4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE1heSAxNSwgMjAwMQkgICAgSnVoYSBZcmr2bOQgICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9QQVNTVEhST1VHSF9ICi0jZGVmaW5lIF9QQVNTVEhST1VHSF9ICi0KLSNpbmNsdWRlICJhdWRpby5oIgotCi0vKiBudW1iZXIgb2YgMTYtYml0IHN0ZXJlbyBzYW1wbGVzIGluIFhUUkFNIGJ1ZmZlciAqLwotI2RlZmluZSBQVF9TQU1QTEVTIDB4ODAwMAotI2RlZmluZSBQVF9CTE9DS1NBTVBMRVMgMHg0MDAKLSNkZWZpbmUgUFRfQkxPQ0tTSVpFIChQVF9CTE9DS1NBTVBMRVMqNCkKLSNkZWZpbmUgUFRfQkxPQ0tTSVpFX0xPRzIgMTIKLSNkZWZpbmUgUFRfQkxPQ0tDT1VOVCAoUFRfU0FNUExFUy9QVF9CTE9DS1NBTVBMRVMpCi0jZGVmaW5lIFBUX0lOSVRQVFIgKFBUX1NBTVBMRVMvMi0xKQotCi0jZGVmaW5lIFBUX1NUQVRFX0lOQUNUSVZFIDAKLSNkZWZpbmUgUFRfU1RBVEVfQUNUSVZBVEVEIDEKLSNkZWZpbmUgUFRfU1RBVEVfUExBWUlORyAyCi0KLS8qIHBhc3N0aHJvdWdoIHN0cnVjdCAqLwotc3RydWN0IHB0X2RhdGEKLXsKLQl1OAlzZWxlY3RlZCwgc3RhdGUsIHNwY3NfdG9fdXNlOwotCWludAlpbnRyX2dwciwgZW5hYmxlX2dwciwgcG9zX2dwcjsKLQl1MzIJYmxvY2tzX3BsYXllZCwgYmxvY2tzX2NvcGllZCwgb2xkX3NwY3NbM107Ci0JdTMyCXBsYXlwdHIsIGNvcHlwdHI7Ci0JdTMyCXByZXBlbmRfc2l6ZTsKLQl1OAkqYnVmOwotCXU4CWFjM2RhdGE7Ci0KLQljaGFyCSpwYXRjaF9uYW1lLCAqaW50cl9ncHJfbmFtZSwgKmVuYWJsZV9ncHJfbmFtZSwgKnBvc19ncHJfbmFtZTsKLQotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotfTsKLQotLyoKLSAgUGFzc3Rocm91Z2ggY2FuIGJlIGRvbmUgaW4gdHdvIG1ldGhvZHM6Ci0KLSAgTWV0aG9kIDEgOiB0cmFtCi0gICAgIEluIG9yaWdpbmFsIGVtdTEwazEsIHdlIGNvdWxkbid0IGJ5cGFzcyB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVycy4gRXZlbiBhdCA0OGtIegotICAgICAodGhlIGludGVybmFsIHNhbXBsZSByYXRlIG9mIHRoZSBlbXUxMGsxKSB0aGUgc2FtcGxlcyB3b3VsZCBnZXQgbWVzc2VkIHVwLgotICAgICBUbyBvdmVyIGNvbWUgdGhpcywgc2FtcGxlcyBhcmUgY29waWVkIGludG8gdGhlIHRyYW0gYW5kIGEgc3BlY2lhbCBkc3AgcGF0Y2ggY29waWVzCi0gICAgIHRoZSBzYW1wbGVzIG91dCBhbmQgZ2VuZXJhdGVzIGludGVycnVwdHMgd2hlbiBhIGJsb2NrIGhhcyBmaW5uaXNoZWQgcGxheWluZy4KLQotICBNZXRob2QgMiA6IEludGVycG9sYXRvciBieXBhc3MKLQotICAgICBDcmVhdGl2ZSBmaXhlZCB0aGUgc2FtcGxlIHJhdGUgY29udmVydCBwcm9ibGVtIGluIGVtdTEwazEgcmV2IDcgYW5kIGhpZ2hlcgotICAgICAoaW5jbHVkaW5nIHRoZSBlbXUxMGsyIChhdWRpZ3kpKS4gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSByZWd1bGFyLCBhbmQgbXVjaCBzaW1wbGVyCi0gICAgIHBsYXliYWNrIG1ldGhvZC4gCi0KLQotICBJbiBib3RoIG1ldGhvZHMsIGRzcCBjb2RlIGlzIHVzZWQgdG8gbXV4IGF1ZGlvIGFuZCBwYXNzdGhyb3VnaC4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHNwZGlmCi0gIGRvZXNuJ3QgcmVjZWl2ZSBhdWRpbyBhbmQgcGFzdGhyb3VnaCBkYXRhIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBzcGRpZiBmbGFnIFNQQ1NfTk9UQVVESU9EQVRBCi0gIGlzIHNldCB0byB0ZWxsIAotCi0gKi8KLQotLy8gZW11MTBrMSByZXZzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA3IGNhbiB1c2UgbWV0aG9kMgotCi0jZGVmaW5lIFVTRV9QVF9NRVRIT0QyICAoY2FyZC0+aXNfYXVkaWd5KQotI2RlZmluZSBVU0VfUFRfTUVUSE9EMQkhVVNFX1BUX01FVEhPRDIKLQotc3NpemVfdCBlbXUxMGsxX3B0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOwotCi1pbnQgZW11MTBrMV9wdF9zZXR1cChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldik7Ci12b2lkIGVtdTEwazFfcHRfc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKTsKLXZvaWQgZW11MTBrMV9wdF93YXZlb3V0X3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldik7Ci0KLSNlbmRpZiAvKiBfUEFTU1RIUk9VR0hfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlNTYxOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICByZWNtZ3IuYyAtLSBSZWNvcmRpbmcgbWFuYWdlciBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJyZWNtZ3IuaCIKLQotdm9pZCBlbXUxMGsxX3Jlc2V0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQotewotCURQRigyLCAiZW11MTBrMV9yZXNldF9yZWNvcmQoKVxuIik7Ci0KLQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5zaXplcmVnLCAwLCBBRENCU19CVUZTSVpFX05PTkUpOwotCi0Jc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGJ1ZmZlci0+c2l6ZXJlZywgMCwgYnVmZmVyLT5zaXplcmVndmFsKTsJCi0KLQl3aGlsZSAoc2JsaXZlX3JlYWRwdHIoY2FyZCwgYnVmZmVyLT5pZHhyZWcsIDApKQotCQl1ZGVsYXkoNSk7Ci19Ci0KLXZvaWQgZW11MTBrMV9zdGFydF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlEUEYoMiwgImVtdTEwazFfc3RhcnRfcmVjb3JkKClcbiIpOwotCi0JaWYgKGJ1ZmZlci0+YWRjY3RsKQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQURDQ1IsIDAsIGJ1ZmZlci0+YWRjY3RsKTsKLX0KLQotdm9pZCBlbXUxMGsxX3N0b3BfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCi17Ci0JRFBGKDIsICJlbXUxMGsxX3N0b3BfcmVjb3JkKClcbiIpOwotCi0JLyogRGlzYWJsZSByZWNvcmQgdHJhbnNmZXIgKi8KLQlpZiAoYnVmZmVyLT5hZGNjdGwpCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBRENDUiwgMCwgMCk7Ci19Ci0KLXZvaWQgZW11MTBrMV9zZXRfcmVjb3JkX3NyYyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpCi17Ci0Jc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKLQotCURQRigyLCAiZW11MTBrMV9zZXRfcmVjb3JkX3NyYygpXG4iKTsKLQotCXN3aXRjaCAod2lpbnN0LT5yZWNzcmMpIHsKLQotCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCQlEUEYoMiwgInJlY29yZGluZyBzb3VyY2U6IEFDOTdcbiIpOwotCQlidWZmZXItPnNpemVyZWcgPSBBRENCUzsKLQkJYnVmZmVyLT5hZGRycmVnID0gQURDQkE7Ci0JCWJ1ZmZlci0+aWR4cmVnID0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENJRFhfSURYIDogQURDSURYX0lEWDsKLQotCQlzd2l0Y2ggKHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSkgewotCQljYXNlIDB4QkI4MDoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV80ODsKLQkJCWJyZWFrOwotCQljYXNlIDB4QUM0NDoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV80NDsKLQkJCWJyZWFrOwotCQljYXNlIDB4N0QwMDoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8zMjsKLQkJCWJyZWFrOwotCQljYXNlIDB4NURDMDoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8yNDsKLQkJCWJyZWFrOwotCQljYXNlIDB4NTYyMjoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8yMjsKLQkJCWJyZWFrOwotCQljYXNlIDB4M0U4MDoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8xNjsKLQkJCWJyZWFrOwotCQkvLyBGSVhNRTogYXVkaWd5IHN1cHBvcnRzIDEya0h6IHJlY29yZGluZwotCQkvKgotCQljYXNlID8/Pz86Ci0JCQlidWZmZXItPmFkY2N0bCA9IEFfQURDQ1JfU0FNUExFUkFURV8xMjsKLQkJCWJyZWFrOwotCQkqLwotCQljYXNlIDB4MkIxMToKLQkJCWJ1ZmZlci0+YWRjY3RsID0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENDUl9TQU1QTEVSQVRFXzExIDogQURDQ1JfU0FNUExFUkFURV8xMTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MUY0MDoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENDUl9TQU1QTEVSQVRFXzggOiBBRENDUl9TQU1QTEVSQVRFXzg7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUJVRygpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlidWZmZXItPmFkY2N0bCB8PSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX0xDSEFORU5BQkxFIDogQURDQ1JfTENIQU5FTkFCTEU7Ci0KLQkJaWYgKHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID09IDIpCi0JCQlidWZmZXItPmFkY2N0bCB8PSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1JDSEFORU5BQkxFIDogQURDQ1JfUkNIQU5FTkFCTEU7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCQlEUEYoMiwgInJlY29yZGluZyBzb3VyY2U6IE1JQ1xuIik7Ci0JCWJ1ZmZlci0+c2l6ZXJlZyA9IE1JQ0JTOwotCQlidWZmZXItPmFkZHJyZWcgPSBNSUNCQTsKLQkJYnVmZmVyLT5pZHhyZWcgPSBNSUNJRFhfSURYOwotCQlidWZmZXItPmFkY2N0bCA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBXQVZFUkVDT1JEX0ZYOgotCQlEUEYoMiwgInJlY29yZGluZyBzb3VyY2U6IEZYXG4iKTsKLQkJYnVmZmVyLT5zaXplcmVnID0gRlhCUzsKLQkJYnVmZmVyLT5hZGRycmVnID0gRlhCQTsKLQkJYnVmZmVyLT5pZHhyZWcgPSBGWElEWF9JRFg7Ci0JCWJ1ZmZlci0+YWRjY3RsID0gMDsKLQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgRlhXQywgMCwgd2lpbnN0LT5meHdjKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCURQRCgyLCAiYnVzIGFkZHg6ICUjbHhcbiIsICh1bnNpZ25lZCBsb25nKSBidWZmZXItPmRtYV9oYW5kbGUpOwotCi0Jc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGJ1ZmZlci0+YWRkcnJlZywgMCwgKHUzMilidWZmZXItPmRtYV9oYW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmggYi9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4NzY2YS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgcmVjbWdyLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2lmbmRlZiBfUkVDT1JETUdSX0gKLSNkZWZpbmUgX1JFQ09SRE1HUl9ICi0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgImNhcmR3aS5oIgotCi0vKiBSZWNvcmRpbmcgcmVzb3VyY2VzICovCi0jZGVmaW5lIFdBVkVSRUNPUkRfQUM5NwkJMHgwMQotI2RlZmluZSBXQVZFUkVDT1JEX01JQwkJMHgwMgotI2RlZmluZSBXQVZFUkVDT1JEX0ZYCQkweDAzCi0KLXZvaWQgZW11MTBrMV9yZXNldF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcik7Ci12b2lkIGVtdTEwazFfc3RhcnRfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHdhdmVpbl9idWZmZXIgKik7Ci12b2lkIGVtdTEwazFfc3RvcF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqKTsKLXZvaWQgZW11MTBrMV9zZXRfcmVjb3JkX3NyYyhzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3aWluc3QgKndpaW5zdCk7Ci0KLSNlbmRpZiAvKiBfUkVDT1JETUdSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTBkMzA3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICB0aW1lci5jCi0gKiAgICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIGluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qIDMvNi8yMDAwCUltcHJvdmVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCB0aW1lciBkZWxheXMgIFJ1aSBTb3VzYSAqLwotCi0vKiA0LzMvMjAwMAlJbXBsZW1lbnRlZCB0aW1lciBsaXN0IHVzaW5nIGxpc3QuaCAJICAgICBSdWkgU291c2EgKi8KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImlycW1nci5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0KLS8qIFRyeSB0byBzY2hlZHVsZSBvbmx5IG9uY2UgcGVyIGZyYWdtZW50ICovCi0KLXZvaWQgZW11MTBrMV90aW1lcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdV90aW1lciAqdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQotCXNwaW5fbG9jaygmY2FyZC0+dGltZXJfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7Ci0JCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKLQotCQlpZiAodC0+c3RhdGUgJiBUSU1FUl9TVEFURV9BQ1RJVkUpIHsKLQkJCXQtPmNvdW50Kys7Ci0JCQlpZiAodC0+Y291bnQgPT0gdC0+Y291bnRfbWF4KSB7Ci0JCQkJdC0+Y291bnQgPSAwOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnQtPnRhc2tsZXQpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2soJmNhcmQtPnRpbWVyX2xvY2spOwotCi0JcmV0dXJuOwotfQotCi12b2lkIGVtdTEwazFfdGltZXJfaW5zdGFsbChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lciwgdTE2IGRlbGF5KQotewotCXN0cnVjdCBlbXVfdGltZXIgKnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChkZWxheSA8IDUpCi0JCWRlbGF5ID0gNTsKLQotCXRpbWVyLT5kZWxheSA9IGRlbGF5OwotCXRpbWVyLT5zdGF0ZSA9IFRJTUVSX1NUQVRFX0lOU1RBTExFRDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQl0aW1lci0+Y291bnRfbWF4ID0gdGltZXItPmRlbGF5IC8gKGNhcmQtPnRpbWVyX2RlbGF5IDwgMTAyNCA/IGNhcmQtPnRpbWVyX2RlbGF5IDogMTAyNCk7Ci0JdGltZXItPmNvdW50ID0gdGltZXItPmNvdW50X21heCAtIDE7Ci0KLQlsaXN0X2FkZCgmdGltZXItPmxpc3QsICZjYXJkLT50aW1lcnMpOwotCi0JaWYgKGNhcmQtPnRpbWVyX2RlbGF5ID4gZGVsYXkpIHsKLQkJaWYgKGNhcmQtPnRpbWVyX2RlbGF5ID09IFRJTUVSX1NUT1BQRUQpCi0JCQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgSU5URV9JTlRFUlZBTFRJTUVSRU5CKTsKLQotCQljYXJkLT50aW1lcl9kZWxheSA9IGRlbGF5OwotCQlkZWxheSA9IChkZWxheSA8IDEwMjQgPyBkZWxheSA6IDEwMjQpOwotCi0JCWVtdTEwazFfdGltZXJfc2V0KGNhcmQsIGRlbGF5KTsKLQotCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7Ci0JCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7Ci0KLQkJCXQtPmNvdW50X21heCA9IHQtPmRlbGF5IC8gZGVsYXk7Ci0JCQkvKiBkb24ndCB3YW50IHRvIHRoaW5rIG11Y2gsIGp1c3QgZm9yY2Ugc2NoZWR1bGluZyAKLQkJCSAgIG9uIHRoZSBuZXh0IGludGVycnVwdCAqLwotCQkJdC0+Y291bnQgPSB0LT5jb3VudF9tYXggLSAxOwotCQl9Ci0KLQkJRFBEKDIsICJ0aW1lciByYXRlIC0tPiAldVxuIiwgZGVsYXkpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotdm9pZCBlbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lcikKLXsKLQlzdHJ1Y3QgZW11X3RpbWVyICp0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCXUxNiBkZWxheSA9IFRJTUVSX1NUT1BQRUQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICh0aW1lci0+c3RhdGUgPT0gVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2RlbCgmdGltZXItPmxpc3QpOwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgewotCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7Ci0KLQkJaWYgKHQtPmRlbGF5IDwgZGVsYXkpCi0JCQlkZWxheSA9IHQtPmRlbGF5OwotCX0KLQotCWlmIChjYXJkLT50aW1lcl9kZWxheSAhPSBkZWxheSkgewotCQljYXJkLT50aW1lcl9kZWxheSA9IGRlbGF5OwotCi0JCWlmIChkZWxheSA9PSBUSU1FUl9TVE9QUEVEKQotCQkJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBJTlRFX0lOVEVSVkFMVElNRVJFTkIpOwotCQllbHNlIHsKLQkJCWRlbGF5ID0gKGRlbGF5IDwgMTAyNCA/IGRlbGF5IDogMTAyNCk7Ci0KLQkJCWVtdTEwazFfdGltZXJfc2V0KGNhcmQsIGRlbGF5KTsKLQotCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgewotCQkJCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKLQotCQkJCXQtPmNvdW50X21heCA9IHQtPmRlbGF5IC8gZGVsYXk7Ci0JCQkJdC0+Y291bnQgPSB0LT5jb3VudF9tYXggLSAxOwotCQkJfQotCQl9Ci0KLQkJRFBEKDIsICJ0aW1lciByYXRlIC0tPiAldVxuIiwgZGVsYXkpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCXRpbWVyLT5zdGF0ZSA9IFRJTUVSX1NUQVRFX1VOSU5TVEFMTEVEOwotCi0JcmV0dXJuOwotfQotCi12b2lkIGVtdTEwazFfdGltZXJfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCXRpbWVyLT5zdGF0ZSB8PSBUSU1FUl9TVEFURV9BQ1RJVkU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi12b2lkIGVtdTEwazFfdGltZXJfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQl0aW1lci0+c3RhdGUgJj0gflRJTUVSX1NUQVRFX0FDVElWRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5oIGIvc291bmQvb3NzL2VtdTEwazEvdGltZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1NDNiNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgdGltZXIuaAotICogICAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLSNpZm5kZWYgX1RJTUVSX0gKLSNkZWZpbmUgX1RJTUVSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLQotc3RydWN0IGVtdV90aW1lciAKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7Ci0JdTggc3RhdGU7IAotCXUxNiBjb3VudDsJCQkJLyogY3VycmVudCBudW1iZXIgb2YgaW50ZXJydXB0cyAqLwotCXUxNiBjb3VudF9tYXg7CQkJCS8qIG51bWJlciBvZiBpbnRlcnJ1cHRzIG5lZWRlZCB0byBzY2hlZHVsZSB0aGUgYmggKi8KLQl1MTYgZGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZGVsYXkgKi8KLX07Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqLCB1MTYpOwotdm9pZCBlbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlbXVfdGltZXIgKik7Ci12b2lkIGVtdTEwazFfdGltZXJfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqKTsKLXZvaWQgZW11MTBrMV90aW1lcl9kaXNhYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqKTsKLQotI2RlZmluZSBUSU1FUl9TVE9QUEVEIAkJCTB4ZmZmZiAKLSNkZWZpbmUgVElNRVJfU1RBVEVfSU5TVEFMTEVEIAkJMHgwMQotI2RlZmluZSBUSU1FUl9TVEFURV9BQ1RJVkUJCTB4MDIKLSNkZWZpbmUgVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQgCTB4MDQKLQotI2VuZGlmIC8qIF9USU1FUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5jIGIvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4YjYwMi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHZvaWNlbWdyLmMgLSBWb2ljZSBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgInZvaWNlbWdyLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotCi0jZGVmaW5lIFBJVENIXzQ4MDAwIDB4MDAwMDQwMDAKLSNkZWZpbmUgUElUQ0hfOTYwMDAgMHgwMDAwODAwMAotI2RlZmluZSBQSVRDSF84NTAwMCAweDAwMDA3MTU1Ci0jZGVmaW5lIFBJVENIXzgwNzI2IDB4MDAwMDZiYTIKLSNkZWZpbmUgUElUQ0hfNjc4ODIgMHgwMDAwNWE4MgotI2RlZmluZSBQSVRDSF81NzA4MSAweDAwMDA0YzFjCi0KLXN0YXRpYyB1MzIgZW11MTBrMV9zZWxlY3RfaW50ZXJwcm9tKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsCi0JCQkJICAgIHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQotewotCWlmKHZvaWNlLT5waXRjaF90YXJnZXQ9PVBJVENIXzQ4MDAwKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMDsKLQllbHNlIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ8UElUQ0hfNDgwMDApCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8xOwotCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzk2MDAwKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMDsKLQllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF84NTAwMCkKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzY7Ci0JZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfODA3MjYpCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV81OwotCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzY3ODgyKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fNDsKLQllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF81NzA4MSkKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzM7Ci0JZWxzZSAgCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8yOwotfQotCi0KLS8qKgotICogZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIgLQotICoKLSAqIGFsbG9jYXRlcyB0aGUgbWVtb3J5IGJ1ZmZlciBmb3IgYSB2b2ljZS4gVHdvIHBhZ2UgdGFibGVzIGFyZSBrZXB0IGZvciBlYWNoIGJ1ZmZlci4KLSAqIE9uZSAoZG1hX2hhbmRsZSkga2VlcHMgdHJhY2sgb2YgdGhlIGhvc3QgbWVtb3J5IHBhZ2VzIHVzZWQgYW5kIHRoZSBvdGhlciAodmlydHVhbHBhZ2V0YWJsZSkKLSAqIGlzIHBhc3NlZCB0byB0aGUgZGV2aWNlIHNvIHRoYXQgaXQgY2FuIGRvIERNQSB0byBob3N0IG1lbW9yeS4KLSAqCi0gKi8KLWludCBlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgdm9pY2VfbWVtICptZW0sIHUzMiBwYWdlcykKLXsKLQl1MzIgcGFnZWluZGV4LCBwYWdlY291bnQ7Ci0JdTMyIGJ1c2FkZHg7Ci0JaW50IGk7Ci0KLQlEUEQoMiwgInJlcXVlc3RlZCBwYWdlcyBpczogJWRcbiIsIHBhZ2VzKTsKLQotCWlmICgobWVtLT5lbXVwYWdlaW5kZXggPSBlbXUxMGsxX2FkZHhtZ3JfYWxsb2MocGFnZXMgKiBQQUdFX1NJWkUsIGNhcmQpKSA8IDApCi0JewotCQlEUEYoMSwgImNvdWxkbid0IGFsbG9jYXRlIGVtdTEwazEgYWRkcmVzcyBzcGFjZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBGaWxsIGluIHZpcnR1YWwgbWVtb3J5IHRhYmxlICovCi0JZm9yIChwYWdlY291bnQgPSAwOyBwYWdlY291bnQgPCBwYWdlczsgcGFnZWNvdW50KyspIHsKLQkJaWYgKChtZW0tPmFkZHJbcGFnZWNvdW50XSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSwgJm1lbS0+ZG1hX2hhbmRsZVtwYWdlY291bnRdKSkKLQkJCT09IE5VTEwpIHsKLQkJCW1lbS0+cGFnZXMgPSBwYWdlY291bnQ7Ci0JCQlEUEYoMSwgImNvdWxkbid0IGFsbG9jYXRlIGRtYSBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJRFBEKDIsICJWaXJ0dWFsIEFkZHg6ICVwXG4iLCBtZW0tPmFkZHJbcGFnZWNvdW50XSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRSAvIEVNVVBBR0VTSVpFOyBpKyspIHsKLQkJCWJ1c2FkZHggPSAodTMyKSBtZW0tPmRtYV9oYW5kbGVbcGFnZWNvdW50XSArIGkgKiBFTVVQQUdFU0laRTsKLQotCQkJRFBEKDMsICJCdXMgQWRkeDogJSN4XG4iLCBidXNhZGR4KTsKLQotCQkJcGFnZWluZGV4ID0gbWVtLT5lbXVwYWdlaW5kZXggKyBwYWdlY291bnQgKiBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRSArIGk7Ci0KLQkJCSgodTMyICopIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkcilbcGFnZWluZGV4XSA9IGNwdV90b19sZTMyKChidXNhZGR4ICogMikgfCBwYWdlaW5kZXgpOwotCQl9Ci0JfQotCi0JbWVtLT5wYWdlcyA9IHBhZ2Vjb3VudDsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGVtdTEwazFfdm9pY2VfZnJlZV9idWZmZXIgLQotICoKLSAqIGZyZWVzIHRoZSBtZW1vcnkgYnVmZmVyIGZvciBhIHZvaWNlLgotICovCi12b2lkIGVtdTEwazFfdm9pY2VfZnJlZV9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHZvaWNlX21lbSAqbWVtKQotewotCXUzMiBwYWdlY291bnQsIHBhZ2VpbmRleDsKLQlpbnQgaTsKLQotCWlmIChtZW0tPmVtdXBhZ2VpbmRleCA8IDApCi0JCXJldHVybjsKLQotCWZvciAocGFnZWNvdW50ID0gMDsgcGFnZWNvdW50IDwgbWVtLT5wYWdlczsgcGFnZWNvdW50KyspIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUsCi0JCQkJCW1lbS0+YWRkcltwYWdlY291bnRdLAotCQkJCQltZW0tPmRtYV9oYW5kbGVbcGFnZWNvdW50XSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRSAvIEVNVVBBR0VTSVpFOyBpKyspIHsKLQkJCXBhZ2VpbmRleCA9IG1lbS0+ZW11cGFnZWluZGV4ICsgcGFnZWNvdW50ICogUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkUgKyBpOwotCQkJKCh1MzIgKikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyKVtwYWdlaW5kZXhdID0KLQkJCQljcHVfdG9fbGUzMigoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMikgfCBwYWdlaW5kZXgpOwotCQl9Ci0JfQotCi0JZW11MTBrMV9hZGR4bWdyX2ZyZWUoY2FyZCwgbWVtLT5lbXVwYWdlaW5kZXgpOwotCW1lbS0+ZW11cGFnZWluZGV4ID0gLTE7Ci19Ci0KLWludCBlbXUxMGsxX3ZvaWNlX2FsbG9jKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQotewotCXU4ICp2b2ljZXRhYmxlID0gY2FyZC0+dm9pY2V0YWJsZTsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX3ZvaWNlX2FsbG9jKClcbiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9HOyBpICs9IDIpCi0JCQlpZiAoKHZvaWNldGFibGVbaV0gPT0gVk9JQ0VfVVNBR0VfRlJFRSkgJiYgKHZvaWNldGFibGVbaSArIDFdID09IFZPSUNFX1VTQUdFX0ZSRUUpKSB7Ci0JCQkJdm9pY2V0YWJsZVtpXSA9IHZvaWNlLT51c2FnZTsKLQkJCQl2b2ljZXRhYmxlW2kgKyAxXSA9IHZvaWNlLT51c2FnZTsKLQkJCQlicmVhazsKLQkJCX0KLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0c7IGkrKykKLQkJCWlmICh2b2ljZXRhYmxlW2ldID09IFZPSUNFX1VTQUdFX0ZSRUUpIHsKLQkJCQl2b2ljZXRhYmxlW2ldID0gdm9pY2UtPnVzYWdlOwotCQkJCWJyZWFrOwotCQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChpID49IE5VTV9HKQotCQlyZXR1cm4gLTE7Ci0KLQl2b2ljZS0+Y2FyZCA9IGNhcmQ7Ci0Jdm9pY2UtPm51bSA9IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaSsrKSB7Ci0JCURQRCgyLCAiIHZvaWNlIGFsbG9jYXRlZCAtPiAlZFxuIiwgdm9pY2UtPm51bSArIGkpOwotCi0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGksIElGQVROLCAweGZmZmYsCi0JCQkJCQkJRENZU1VTViwgMCwKLQkJCQkJCQlWVEZULCAweDAwMDBmZmZmLAotCQkJCQkJCVBUUlgsIDAsCi0JCQkJCQkJVEFHTElTVF9FTkQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfdm9pY2VfZnJlZShzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gdm9pY2UtPmNhcmQ7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV92b2ljZV9mcmVlKClcbiIpOwotCi0JaWYgKHZvaWNlLT51c2FnZSA9PSBWT0lDRV9VU0FHRV9GUkVFKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaSsrKSB7Ci0JCURQRCgyLCAiIHZvaWNlIHJlbGVhc2VkIC0+ICVkXG4iLCB2b2ljZS0+bnVtICsgaSk7Ci0KLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaSwgRENZU1VTViwgMCwgCi0JCQkJCQkJVlRGVCwgMHgwMDAwZmZmZiwKLQkJCQkJCQlQVFJYX1BJVENIVEFSR0VULCAwLAotCQkJCQkJCUNWQ0YsIDB4MDAwMGZmZmYsCi0JCQkJCQkJLy9DUEYsIDAsCi0JCQkJCQkJVEFHTElTVF9FTkQpOwotCQkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgdm9pY2UtPm51bSArIGksIDApOwotCX0KLQotCXZvaWNlLT51c2FnZSA9IFZPSUNFX1VTQUdFX0ZSRUU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JY2FyZC0+dm9pY2V0YWJsZVt2b2ljZS0+bnVtXSA9IFZPSUNFX1VTQUdFX0ZSRUU7Ci0KLQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKQotCQljYXJkLT52b2ljZXRhYmxlW3ZvaWNlLT5udW0gKyAxXSA9IFZPSUNFX1VTQUdFX0ZSRUU7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgZW11MTBrMV92b2ljZV9wbGF5YmFja19zZXR1cChzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gdm9pY2UtPmNhcmQ7Ci0JdTMyIHN0YXJ0OwotCWludCBpOwotCi0JRFBGKDIsICJlbXUxMGsxX3ZvaWNlX3BsYXliYWNrX3NldHVwKClcbiIpOwotCi0JaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykgewotCQkvKiBTZXQgc3RlcmVvIGJpdCAqLwotCQlzdGFydCA9IDI4OwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCB2b2ljZS0+bnVtLCBDUEZfU1RFUkVPX01BU0spOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCB2b2ljZS0+bnVtICsgMSwgQ1BGX1NURVJFT19NQVNLKTsKLQl9IGVsc2UgewotCQlzdGFydCA9IDMwOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCB2b2ljZS0+bnVtLCAwKTsKLQl9Ci0KLQlpZighKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTXzE2QklUKSkKLQkJc3RhcnQgKj0gMjsKLQotCXZvaWNlLT5zdGFydCArPSBzdGFydDsKLQotCWZvciAoaSA9IDA7IGkgPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBpKyspIHsKLQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfRlhSVDEsIHZvaWNlLT5udW0gKyBpLCB2b2ljZS0+cGFyYW1zW2ldLnNlbmRfcm91dGluZyk7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9GWFJUMiwgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9yb3V0aW5nMik7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgIEFfU0VOREFNT1VOVFMsIHZvaWNlLT5udW0gKyBpLCB2b2ljZS0+cGFyYW1zW2ldLnNlbmRfaGdmZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgRlhSVCwgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9yb3V0aW5nIDw8IDE2KTsKLQkJfQotCi0JCS8qIFN0b3AgQ0EgKi8KLQkJLyogQXNzdW1wdGlvbiB0aGF0IFBUIGlzIGFscmVhZHkgMCBzbyBubyBoYXJtIG92ZXJ3cml0aW5nICovCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBQVFJYLCB2b2ljZS0+bnVtICsgaSwgKCh2b2ljZS0+cGFyYW1zW2ldLnNlbmRfZGNiYSAmIDB4ZmYpIDw8IDgpCi0JCQkJfCAoKHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9kY2JhICYgMHhmZjAwKSA+PiA4KSk7Ci0KLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaSwKLQkJCQkvKiBDU0wsIFNULCBDQSAqLwotCQkJCSAgICBEU0wsIHZvaWNlLT5lbmRsb29wIHwgKHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9kY2JhICYgMHhmZjAwMDAwMCksCi0JCQkJICAgIFBTU1QsIHZvaWNlLT5zdGFydGxvb3AgfCAoKHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9kY2JhICYgMHgwMGZmMDAwMCkgPDwgOCksCi0JCQkJICAgIENDQ0EsICh2b2ljZS0+c3RhcnQpIHwgIGVtdTEwazFfc2VsZWN0X2ludGVycHJvbShjYXJkLHZvaWNlKSB8Ci0JCQkJICAgICAgICAoKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTXzE2QklUKSA/IDAgOiBDQ0NBXzhCSVRTRUxFQ1QpLAotCQkJCSAgICAvKiBDbGVhciBmaWx0ZXIgZGVsYXkgbWVtb3J5ICovCi0JCQkJICAgIFoxLCAwLAotCQkJCSAgICBaMiwgMCwKLQkJCQkgICAgLyogSW52YWxpZGF0ZSBtYXBzICovCi0JCQkJICAgIE1BUEEsIE1BUF9QVElfTUFTSyB8ICgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSwKLQkJCQkgICAgTUFQQiwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAotCQkJCS8qIG1vZHVsYXRpb24gZW52ZWxvcGUgKi8KLQkJCQkgICAgQ1ZDRiwgMHgwMDAwZmZmZiwKLQkJCQkgICAgVlRGVCwgMHgwMDAwZmZmZiwKLQkJCQkgICAgQVRLSExETSwgMCwKLQkJCQkgICAgRENZU1VTTSwgMHgwMDdmLAotCQkJCSAgICBMRk9WQUwxLCAweDgwMDAsCi0JCQkJICAgIExGT1ZBTDIsIDB4ODAwMCwKLQkJCQkgICAgRk1NT0QsIDAsCi0JCQkJICAgIFRSRU1GUlEsIDAsCi0JCQkJICAgIEZNMkZSUTIsIDAsCi0JCQkJICAgIEVOVlZBTCwgMHg4MDAwLAotCQkJCS8qIHZvbHVtZSBlbnZlbG9wZSAqLwotCQkJCSAgICBBVEtITERWLCAweDdmN2YsCi0JCQkJICAgIEVOVlZPTCwgMHg4MDAwLAotCQkJCS8qIGZpbHRlciBlbnZlbG9wZSAqLwotCQkJCSAgICBQRUZFX0ZJTFRFUkFNT1VOVCwgMHg3ZiwKLQkJCQkvKiBwaXRjaCBlbnZlbG9wZSAqLwotCQkJCSAgICBQRUZFX1BJVENIQU1PVU5ULCAwLCBUQUdMSVNUX0VORCk7Ci0KLQkJdm9pY2UtPnBhcmFtc1tpXS5mY190YXJnZXQgPSAweGZmZmY7Ci0JfQotfQotCi12b2lkIGVtdTEwazFfdm9pY2VzX3N0YXJ0KHN0cnVjdCBlbXVfdm9pY2UgKmZpcnN0X3ZvaWNlLCB1bnNpZ25lZCBpbnQgbnVtX3ZvaWNlcywgaW50IHNldCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gZmlyc3Rfdm9pY2UtPmNhcmQ7Ci0Jc3RydWN0IGVtdV92b2ljZSAqdm9pY2U7Ci0JdW5zaWduZWQgaW50IHZvaWNlbnVtOwotCWludCBqOwotCi0JRFBGKDIsICJlbXUxMGsxX3ZvaWNlc19zdGFydCgpXG4iKTsKLQotCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IG51bV92b2ljZXM7IHZvaWNlbnVtKyspCi0JewotCQl2b2ljZSA9IGZpcnN0X3ZvaWNlICsgdm9pY2VudW07Ci0KLQkJaWYgKCFzZXQpIHsKLQkJCXUzMiBjcmEsIGNjaXMsIGNzLCBzYW1wbGU7Ci0JCQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7Ci0JCQkJY3JhID0gNjQ7Ci0JCQkJY2NpcyA9IDI4OwotCQkJCWNzID0gNDsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JhID0gNjQ7Ci0JCQkJY2NpcyA9IDMwOwotCQkJCWNzID0gMjsKLQkJCX0KLQotCQkJaWYodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfMTZCSVQpIHsKLQkJCQlzYW1wbGUgPSAweDAwMDAwMDAwOwotCQkJfSBlbHNlIHsKLQkJCQlzYW1wbGUgPSAweDgwODA4MDgwOwkJCi0JCQkJY2NpcyAqPSAyOwotCQkJfQotCi0JCQlmb3IoaiA9IDA7IGogPCBjczsgaisrKQotCSAgICAgICAgCSAgICAgICAgc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENEMCArIGosIHZvaWNlLT5udW0sIHNhbXBsZSk7Ci0KLQkJCS8qIFJlc2V0IGNhY2hlICovCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUsIHZvaWNlLT5udW0sIDApOwotCQkJaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykKLQkJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUsIHZvaWNlLT5udW0gKyAxLCAwKTsKLQotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9SRUFEQUREUkVTUywgdm9pY2UtPm51bSwgY3JhKTsKLQotCQkJaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykKLQkJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX1JFQURBRERSRVNTLCB2b2ljZS0+bnVtICsgMSwgY3JhKTsKLQotCQkJLyogRmlsbCBjYWNoZSAqLwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZS0+bnVtLCBjY2lzKTsKLQkJfQotCi0JCWZvciAoaiA9IDA7IGogPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBqKyspIHsKLQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGosCi0JCQkJICAgIElGQVROLCAodm9pY2UtPnBhcmFtc1tqXS5pbml0aWFsX2ZjIDw8IDgpIHwgdm9pY2UtPnBhcmFtc1tqXS5pbml0aWFsX2F0dG4sCi0JCQkJICAgIFZURlQsICh2b2ljZS0+cGFyYW1zW2pdLnZvbHVtZV90YXJnZXQgPDwgMTYpIHwgdm9pY2UtPnBhcmFtc1tqXS5mY190YXJnZXQsCi0JCQkJICAgIENWQ0YsICh2b2ljZS0+cGFyYW1zW2pdLnZvbHVtZV90YXJnZXQgPDwgMTYpIHwgdm9pY2UtPnBhcmFtc1tqXS5mY190YXJnZXQsCi0JCQkJICAgIERDWVNVU1YsICh2b2ljZS0+cGFyYW1zW2pdLmJ5YW1wbF9lbnZfc3VzdGFpbiA8PCA4KSB8IHZvaWNlLT5wYXJhbXNbal0uYnlhbXBsX2Vudl9kZWNheSwKLQkJCQkgICAgVEFHTElTVF9FTkQpOwotCQotCQkJZW11MTBrMV9jbGVhcl9zdG9wX29uX2xvb3AoY2FyZCwgdm9pY2UtPm51bSArIGopOwotCQl9Ci0JfQotCi0KLSAgICAgICAgZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgbnVtX3ZvaWNlczsgdm9pY2VudW0rKykKLQl7Ci0JCXZvaWNlID0gZmlyc3Rfdm9pY2UgKyB2b2ljZW51bTsKLQotCQlmb3IgKGogPSAwOyBqIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaisrKSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgUFRSWF9QSVRDSFRBUkdFVCwgdm9pY2UtPm51bSArIGosIHZvaWNlLT5waXRjaF90YXJnZXQpOwotCi0JCQlpZiAoaiA9PSAwKQotCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEZfQ1VSUkVOVFBJVENILCB2b2ljZS0+bnVtLCB2b2ljZS0+cGl0Y2hfdGFyZ2V0KTsKLQotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIElQLCB2b2ljZS0+bnVtICsgaiwgdm9pY2UtPmluaXRpYWxfcGl0Y2gpOwotCQl9Ci0JfQotfQotCi12b2lkIGVtdTEwazFfdm9pY2VzX3N0b3Aoc3RydWN0IGVtdV92b2ljZSAqZmlyc3Rfdm9pY2UsIGludCBudW1fdm9pY2VzKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBmaXJzdF92b2ljZS0+Y2FyZDsKLQlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZTsKLQl1bnNpZ25lZCBpbnQgdm9pY2VfbnVtOwotCWludCBqOwotCi0JRFBGKDIsICJlbXUxMGsxX3ZvaWNlX3N0b3AoKVxuIik7Ci0KLSAgICAgICAgZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCBudW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQl7Ci0JCXZvaWNlID0gZmlyc3Rfdm9pY2UgKyB2b2ljZV9udW07Ci0KLQkJZm9yIChqID0gMDsgaiA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGorKykgewotCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaiwKLQkJCQkJCVBUUlhfUElUQ0hUQVJHRVQsIDAsCi0JCQkJCQlDUEZfQ1VSUkVOVFBJVENILCAwLAotCQkJCQkJSUZBVE4sIDB4ZmZmZiwKLQkJCQkJCVZURlQsIDB4MDAwMGZmZmYsCi0JCQkJCQlDVkNGLCAweDAwMDBmZmZmLAotCQkJCQkJSVAsIDAsCi0JCQkJCQlUQUdMSVNUX0VORCk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmggYi9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTlhOGNiLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgc2JsaXZlX3ZvaWNlLmggLS0gRU1VIFZvaWNlIFJlc291cmNlIE1hbmFnZXIgaGVhZGVyIGZpbGUKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX1ZPSUNFTUdSX0gKLSNkZWZpbmUgX1ZPSUNFTUdSX0gKLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0KLS8qIHN0cnVjdCBlbXVfdm9pY2UudXNhZ2UgZmxhZ3MgKi8KLSNkZWZpbmUgVk9JQ0VfVVNBR0VfRlJFRQkJMHgwMQotI2RlZmluZSBWT0lDRV9VU0FHRV9NSURJCQkweDAyCi0jZGVmaW5lIFZPSUNFX1VTQUdFX1BMQVlCQUNLCQkweDA0Ci0KLS8qIHN0cnVjdCBlbXVfdm9pY2UuZmxhZ3MgZmxhZ3MgKi8KLSNkZWZpbmUgVk9JQ0VfRkxBR1NfU1RFUkVPCQkweDAyCi0jZGVmaW5lIFZPSUNFX0ZMQUdTXzE2QklUCQkweDA0Ci0KLXN0cnVjdCB2b2ljZV9wYXJhbQotewotCS8qIEZYIGJ1cyBhbW91bnQgc2VuZCAqLwotCi0JdTMyIHNlbmRfcm91dGluZzsKLQkvLyBhdWRpZ3kgb25seToKLQl1MzIgc2VuZF9yb3V0aW5nMjsKLQotCXUzMiBzZW5kX2RjYmE7Ci0JLy8gYXVkaWd5IG9ubHk6Ci0JdTMyIHNlbmRfaGdmZTsKLQotCi0JdTMyIGluaXRpYWxfZmM7Ci0JdTMyIGZjX3RhcmdldDsKLQotCXUzMiBpbml0aWFsX2F0dG47Ci0JdTMyIHZvbHVtZV90YXJnZXQ7Ci0KLQl1MzIgYnlhbXBsX2Vudl9zdXN0YWluOwotCXUzMiBieWFtcGxfZW52X2RlY2F5OwotfTsKLQotc3RydWN0IHZvaWNlX21lbSB7Ci0JaW50IGVtdXBhZ2VpbmRleDsKLQl2b2lkICphZGRyW0JVRk1BWFBBR0VTXTsKLQlkbWFfYWRkcl90IGRtYV9oYW5kbGVbQlVGTUFYUEFHRVNdOwotCXUzMiBwYWdlczsKLX07Ci0KLXN0cnVjdCBlbXVfdm9pY2UKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXU4IHVzYWdlOwkJLyogRnJlZSwgTUlESSwgcGxheWJhY2sgKi8KLQl1OCBudW07CQkJLyogVm9pY2UgSUQgKi8KLQl1OCBmbGFnczsJCS8qIFN0ZXJlby9tb25vLCA4LzE2IGJpdCAqLwotCi0JdTMyIHN0YXJ0bG9vcDsKLQl1MzIgZW5kbG9vcDsKLQl1MzIgc3RhcnQ7Ci0KLQl1MzIgaW5pdGlhbF9waXRjaDsKLQl1MzIgcGl0Y2hfdGFyZ2V0OwotCi0Jc3RydWN0IHZvaWNlX3BhcmFtIHBhcmFtc1syXTsKLQotCXN0cnVjdCB2b2ljZV9tZW0gbWVtOwotfTsKLQotaW50IGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHZvaWNlX21lbSAqLCB1MzIpOwotdm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHZvaWNlX21lbSAqKTsKLWludCBlbXUxMGsxX3ZvaWNlX2FsbG9jKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV92b2ljZSAqKTsKLXZvaWQgZW11MTBrMV92b2ljZV9mcmVlKHN0cnVjdCBlbXVfdm9pY2UgKik7Ci12b2lkIGVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAoc3RydWN0IGVtdV92b2ljZSAqKTsKLXZvaWQgZW11MTBrMV92b2ljZXNfc3RhcnQoc3RydWN0IGVtdV92b2ljZSAqLCB1bnNpZ25lZCBpbnQsIGludCk7Ci12b2lkIGVtdTEwazFfdm9pY2VzX3N0b3Aoc3RydWN0IGVtdV92b2ljZSAqLCBpbnQpOwotCi0jZW5kaWYgLyogX1ZPSUNFTUdSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tcHU0MDEuYyBiL3NvdW5kL29zcy9tcHU0MDEuYwppbmRleCAyNzk2YzBlLi5hNjkwY2E1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvbXB1NDAxLmMKKysrIGIvc291bmQvb3NzL21wdTQwMS5jCkBAIC0xMDAzLDcgKzEwMDMsOCBAQAogCQl9CiAJCWlmICghZGV2Yy0+c2hhcmVkX2lycSkKIAkJewotCQkJaWYgKHJlcXVlc3RfaXJxKGRldmMtPmlycSwgbXB1aW50ciwgMCwgIm1wdTQwMSIsICh2b2lkICopbSkgPCAwKQorCQkJaWYgKHJlcXVlc3RfaXJxKGRldmMtPmlycSwgbXB1aW50ciwgMCwgIm1wdTQwMSIsCisJCQkJCWh3X2NvbmZpZykgPCAwKQogCQkJewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdTQwMTogRmFpbGVkIHRvIGFsbG9jYXRlIElSUSVkXG4iLCBkZXZjLT5pcnEpOwogCQkJCXJldCA9IC1FTk9NRU07CkBAIC0xMTEyLDcgKzExMTMsNyBAQAogCXJldHVybiAwOwogCiBvdXRfaXJxOgotCWZyZWVfaXJxKGRldmMtPmlycSwgKHZvaWQgKiltKTsKKwlmcmVlX2lycShkZXZjLT5pcnEsIGh3X2NvbmZpZyk7CiBvdXRfbWlkaWRldjoKIAlzb3VuZF91bmxvYWRfbWlkaWRldihtKTsKIG91dF9lcnI6CkBAIC0xMjI3LDcgKzEyMjgsNyBAQAogCWlmIChuICE9IC0xKSB7CiAJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7CiAJCWlmIChod19jb25maWctPmFsd2F5c19kZXRlY3QgPT0gMCAmJiBod19jb25maWctPmlycSA+IDApCi0JCQlmcmVlX2lycShod19jb25maWctPmlycSwgKHZvaWQgKiluKTsKKwkJCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBod19jb25maWcpOwogCQlwPW1wdTQwMV9zeW50aF9vcGVyYXRpb25zW25dOwogCQlzb3VuZF91bmxvYWRfbWlkaWRldihuKTsKIAkJc291bmRfdW5sb2FkX3RpbWVyZGV2KGh3X2NvbmZpZy0+c2xvdHNbMl0pOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2LmggYi9zb3VuZC9vc3Mvbm0yNTYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhZGU5MC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3Mvbm0yNTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0jaWZuZGVmIF9OTTI1Nl9IXwotI2RlZmluZSBfTk0yNTZfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlICJhYzk3LmgiCi0KLS8qIFRoZSByZXZpc2lvbnMgdGhhdCB3ZSBjdXJyZW50bHkgaGFuZGxlLiAgKi8KLWVudW0gbm0yNTZyZXYgewotICAgIFJFVl9OTTI1NkFWLCBSRVZfTk0yNTZaWAotfTsKLQotLyogUGVyLWNhcmQgc3RydWN0dXJlLiAqLwotc3RydWN0IG5tMjU2X2luZm8gCi17Ci0gICAgLyogTWFnaWMgbnVtYmVyIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyBzdHJ1Y3QgaXMgdmFsaWQuICovCi0jZGVmaW5lIE5NX01BR0lDX1NJRyAweDU1YWEwMGZmCi0gICAgaW50IG1hZ3NpZzsKLQotICAgIC8qIFJldmlzaW9uIG51bWJlciAqLwotICAgIGVudW0gbm0yNTZyZXYgcmV2OwotCi0gICAgc3RydWN0IGFjOTdfaHdpbnQgbWRldjsKLQotICAgIC8qIE91ciBhdWRpbyBkZXZpY2UgbnVtYmVycy4gKi8KLSAgICBpbnQgZGV2WzJdOwotCi0gICAgLyogVGhlICMgb2YgdGltZXMgZWFjaCBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLiAoU2hvdWxkIG9ubHkgYmUgCi0gICAgICAgMCBvciAxKS4gKi8KLSAgICBpbnQgb3BlbmNudFsyXTsKLQotICAgIC8qIFdlIHVzZSB0d28gZGV2aWNlcywgYmVjYXVzZSB3ZSBjYW4gZG8gc2ltdWx0YW5lb3VzIHBsYXkgYW5kIHJlY29yZC4KLSAgICAgICBUaGlzIGtlZXBzIHRyYWNrIG9mIHdoaWNoIGRldmljZSBpcyBiZWluZyB1c2VkIGZvciB3aGF0IHB1cnBvc2U7Ci0gICAgICAgdGhlc2UgYXJlIHRoZSBhY3R1YWwgZGV2aWNlIG51bWJlcnMuICovCi0gICAgaW50IGRldl9mb3JfcGxheTsKLSAgICBpbnQgZGV2X2Zvcl9yZWNvcmQ7Ci0KLQlzcGlubG9ja190IGxvY2s7Ci0JCi0gICAgLyogVGhlIG1peGVyIGRldmljZS4gKi8KLSAgICBpbnQgbWl4ZXJfb3NzX2RldjsKLQotICAgIC8qIAotICAgICAqIENhbiBvbmx5IGJlIG9wZW5lZCBvbmNlIGZvciBlYWNoIG9wZXJhdGlvbi4gIFRoZXNlIGFyZW4ndCBzZXQKLSAgICAgKiB1bnRpbCBhbiBhY3R1YWwgSS9PIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQ7IHRoaXMgYWxsb3dzIG9uZQotICAgICAqIGRldmljZSB0byBiZSBvcGVuIGZvciByZWFkL3dyaXRlIHdpdGhvdXQgaW5oaWJpdGluZyBJL08gdG8KLSAgICAgKiB0aGUgb3RoZXIgZGV2aWNlLgotICAgICAqLwotICAgIGludCBpc19vcGVuX3BsYXk7Ci0gICAgaW50IGlzX29wZW5fcmVjb3JkOwotCi0gICAgLyogTm9uLXplcm8gaWYgd2UncmUgY3VycmVudGx5IHBsYXlpbmcgYSBzYW1wbGUuICovCi0gICAgaW50IHBsYXlpbmc7Ci0gICAgLyogRGl0dG8gZm9yIHJlY29yZGluZyBhIHNhbXBsZS4gKi8KLSAgICBpbnQgcmVjb3JkaW5nOwotCi0gICAgLyogVGhlIHR3byBtZW1vcnkgcG9ydHMuICAqLwotICAgIHN0cnVjdCBubTI1Nl9wb3J0cyB7Ci0JLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcG9ydC4gKi8KLQl1MzIgcGh5c2FkZHI7Ci0JLyogT3VyIG1hcHBlZC1pbiBwb2ludGVyLiAqLwotCWNoYXIgX19pb21lbSAqcHRyOwotCS8qIFBUUidzIG9mZnNldCB3aXRoaW4gdGhlIHBoeXNpY2FsIHBvcnQuICAqLwotCXUzMiBzdGFydF9vZmZzZXQ7Ci0JLyogQW5kIHRoZSBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgKi8KLQl1MzIgZW5kX29mZnNldDsKLSAgICB9IHBvcnRbMl07Ci0KLSAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvZmZzZXRzIHdpdGhpbiBtZW1vcnkgcG9ydCAxLiAqLwotICAgIHUzMiBjb2VmZkJ1ZjsKLSAgICB1MzIgYWxsQ29lZmZCdWY7Ci0KLSAgICAvKiBSZWNvcmQgYW5kIHBsYXliYWNrIGJ1ZmZlcnMuICovCi0gICAgdTMyIGFidWYxLCBhYnVmMjsKLQotICAgIC8qIE9mZnNldCBvZiB0aGUgQUM5NyBtaXhlciBpbiBtZW1vcnkgcG9ydCAyLiAqLwotICAgIHUzMiBtaXhlcjsKLQotICAgIC8qIE9mZnNldCBvZiB0aGUgbWl4ZXIgc3RhdHVzIHJlZ2lzdGVyIGluIG1lbW9yeSBwb3J0IDIuICAqLwotICAgIHUzMiBtaXhlcl9zdGF0dXNfb2Zmc2V0OwotCi0gICAgLyogTm9uLXplcm8gaWYgd2UgaGF2ZSB3cml0dGVuIGluaXRpYWwgdmFsdWVzIHRvIHRoZSBtaXhlci4gKi8KLSAgICB1OCBtaXhlcl92YWx1ZXNfaW5pdDsKLQotICAgIC8qIAotICAgICAqIFN0YXR1cyBtYXNrIGJpdDsgKCptaXhlcl9zdGF0dXNfbG9jICYgbWl4ZXJfc3RhdHVzX21hc2spID09IDAgbWVhbnMKLSAgICAgKiBpdCdzIHJlYWR5LiAgCi0gICAgICovCi0gICAgdTE2IG1peGVyX3N0YXR1c19tYXNrOwotCi0gICAgLyogVGhlIHNpemVzIG9mIHRoZSBwbGF5YmFjayBhbmQgcmVjb3JkIHJpbmcgYnVmZmVycy4gKi8KLSAgICB1MzIgcGxheWJhY2tCdWZmZXJTaXplOwotICAgIHUzMiByZWNvcmRCdWZmZXJTaXplOwotCi0gICAgLyogQXJlIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgaW4gdGhlIG1lbW9yeSBjYWNoZSBjdXJyZW50PyAqLwotICAgIHU4IGNvZWZmc0N1cnJlbnQ7Ci0KLSAgICAvKiBGb3Igd3JpdGVzLCB0aGUgYW1vdW50IHdlIGxhc3Qgd3JvdGUuICovCi0gICAgdTMyIHJlcXVlc3RlZF9hbXQ7Ci0gICAgLyogVGhlIHN0YXJ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgcGxheWluZy4gKi8KLSAgICB1MzIgY3VyUGxheVBvczsKLQotICAgIC8qIFRoZSBhbW91bnQgb2YgZGF0YSB3ZSB3ZXJlIHJlcXVlc3RlZCB0byByZWNvcmQuICovCi0gICAgdTMyIHJlcXVlc3RlZFJlY0FtdDsKLSAgICAvKiBUaGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50bHktcmVjb3JkaW5nIGJsb2NrLiAqLwotICAgIHUzMiBjdXJSZWNQb3M7Ci0gICAgLyogVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KLSAgICBjaGFyICpyZWNCdWY7Ci0KLSAgICAvKiBPdXIgSVJRIG51bWJlci4gKi8KLSAgICBpbnQgaXJxOwotCi0gICAgLyogQSBmbGFnIGluZGljYXRpbmcgaG93IG1hbnkgdGltZXMgd2UndmUgZ3JhYmJlZCB0aGUgSVJRLiAqLwotICAgIGludCBoYXNfaXJxOwotCi0gICAgLyogVGhlIGNhcmQgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gKi8KLSAgICBpcnFfaGFuZGxlcl90IGludHJvdXRpbmU7Ci0KLSAgICAvKiBDdXJyZW50IGF1ZGlvIGNvbmZpZywgY2FjaGVkLiAqLwotICAgIHN0cnVjdCBzaW5mbyB7Ci0JdTMyIHNhbXBsZXJhdGU7Ci0JdTggYml0czsKLQl1OCBzdGVyZW87Ci0gICAgfSBzaW5mb1syXTsgLyogZ29lcyB3aXRoIGVhY2ggZGV2aWNlICovCi0KLSAgICAvKiBUaGUgY2FyZHMgYXJlIHN0b3JlZCBpbiBhIGNoYWluOyAgdGhpcyBpcyB0aGUgbmV4dCBjYXJkLiAqLwotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpuZXh0X2NhcmQ7Ci19OwotCi0vKiBUaGUgQklPUyBzaWduYXR1cmUuICovCi0jZGVmaW5lIE5NX1NJR05BVFVSRSAweDRlNGQwMDAwCi0vKiBTaWduYXR1cmUgbWFzay4gKi8KLSNkZWZpbmUgTk1fU0lHX01BU0sgMHhmZmZmMDAwMAotCi0vKiBTaXplIG9mIHRoZSBzZWNvbmQgbWVtb3J5IGFyZWEuICovCi0jZGVmaW5lIE5NX1BPUlQyX1NJWkUgNDA5NgotCi0vKiBUaGUgYmFzZSBvZmZzZXQgb2YgdGhlIG1peGVyIGluIHRoZSBzZWNvbmQgbWVtb3J5IGFyZWEuICovCi0jZGVmaW5lIE5NX01JWEVSX09GRlNFVCAweDYwMAotCi0vKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgY29lZmZpY2llbnQgZW50cnkuICovCi0jZGVmaW5lIE5NX01BWF9DT0VGRklDSUVOVCAweDUwMDAKLQotLyogVGhlIGludGVycnVwdCByZWdpc3Rlci4gKi8KLSNkZWZpbmUgTk1fSU5UX1JFRyAweGEwNAotLyogQW5kIGl0cyBiaXRzLiAqLwotI2RlZmluZSBOTV9QTEFZQkFDS19JTlQgMHg0MAotI2RlZmluZSBOTV9SRUNPUkRfSU5UIDB4MTAwCi0jZGVmaW5lIE5NX01JU0NfSU5UXzEgMHg0MDAwCi0jZGVmaW5lIE5NX01JU0NfSU5UXzIgMHgxCi0jZGVmaW5lIE5NX0FDS19JTlQoQ0FSRCwgWCkgbm0yNTZfd3JpdGVQb3J0MTYoKENBUkQpLCAyLCBOTV9JTlRfUkVHLCAoWCkgPDwgMSkKLQotLyogVGhlIEFWJ3MgIm1peGVyIHJlYWR5IiBzdGF0dXMgYml0IGFuZCBsb2NhdGlvbi4gKi8KLSNkZWZpbmUgTk1fTUlYRVJfU1RBVFVTX09GRlNFVCAweGEwNAotI2RlZmluZSBOTV9NSVhFUl9SRUFEWV9NQVNLIDB4MDgwMAotI2RlZmluZSBOTV9NSVhFUl9QUkVTRU5DRSAweGEwNgotI2RlZmluZSBOTV9QUkVTRU5DRV9NQVNLIDB4MDA1MAotI2RlZmluZSBOTV9QUkVTRU5DRV9WQUxVRSAweDAwNDAKLQotLyoKLSAqIEZvciB0aGUgWlguICBJdCB1c2VzIHRoZSBzYW1lIGludGVycnVwdCByZWdpc3RlciwgYnV0IGl0IGhvbGRzIDMyCi0gKiBiaXRzIGluc3RlYWQgb2YgMTYuCi0gKi8KLSNkZWZpbmUgTk0yX1BMQVlCQUNLX0lOVCAweDEwMDAwCi0jZGVmaW5lIE5NMl9SRUNPUkRfSU5UIDB4ODAwMDAKLSNkZWZpbmUgTk0yX01JU0NfSU5UXzEgMHg4Ci0jZGVmaW5lIE5NMl9NSVNDX0lOVF8yIDB4MgotI2RlZmluZSBOTTJfQUNLX0lOVChDQVJELCBYKSBubTI1Nl93cml0ZVBvcnQzMigoQ0FSRCksIDIsIE5NX0lOVF9SRUcsIChYKSkKLQotLyogVGhlIFpYJ3MgIm1peGVyIHJlYWR5IiBzdGF0dXMgYml0IGFuZCBsb2NhdGlvbi4gKi8KLSNkZWZpbmUgTk0yX01JWEVSX1NUQVRVU19PRkZTRVQgMHhhMDYKLSNkZWZpbmUgTk0yX01JWEVSX1JFQURZX01BU0sgMHgwODAwCi0KLS8qIFRoZSBwbGF5YmFjayByZWdpc3RlcnMgc3RhcnQgZnJvbSBoZXJlLiAqLwotI2RlZmluZSBOTV9QTEFZQkFDS19SRUdfT0ZGU0VUIDB4MAotLyogVGhlIHJlY29yZCByZWdpc3RlcnMgc3RhcnQgZnJvbSBoZXJlLiAqLwotI2RlZmluZSBOTV9SRUNPUkRfUkVHX09GRlNFVCAweDIwMAotCi0vKiBUaGUgcmF0ZSByZWdpc3RlciBpcyBsb2NhdGVkIDIgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIGFyZWEuICovCi0jZGVmaW5lIE5NX1JBVEVfUkVHX09GRlNFVCAyCi0KLS8qIE1vbm8vc3RlcmVvIGZsYWcsIG51bWJlciBvZiBiaXRzIG9uIHBsYXliYWNrLCBhbmQgcmF0ZSBtYXNrLiAqLwotI2RlZmluZSBOTV9SQVRFX1NURVJFTyAxCi0jZGVmaW5lIE5NX1JBVEVfQklUU18xNiAyCi0jZGVmaW5lIE5NX1JBVEVfTUFTSyAweGYwCi0KLS8qIFBsYXliYWNrIGVuYWJsZSByZWdpc3Rlci4gKi8KLSNkZWZpbmUgTk1fUExBWUJBQ0tfRU5BQkxFX1JFRyAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4MSkKLSNkZWZpbmUgTk1fUExBWUJBQ0tfRU5BQkxFX0ZMQUcgMQotI2RlZmluZSBOTV9QTEFZQkFDS19PTkVTSE9UIDIKLSNkZWZpbmUgTk1fUExBWUJBQ0tfRlJFRVJVTiA0Ci0KLS8qIE11dGVzIHRoZSBhdWRpbyBvdXRwdXQuICovCi0jZGVmaW5lIE5NX0FVRElPX01VVEVfUkVHIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHgxOCkKLSNkZWZpbmUgTk1fQVVESU9fTVVURV9MRUZUIDB4ODAwMAotI2RlZmluZSBOTV9BVURJT19NVVRFX1JJR0hUIDB4MDA4MAotCi0vKiBSZWNvcmRpbmcgZW5hYmxlIHJlZ2lzdGVyLiAqLwotI2RlZmluZSBOTV9SRUNPUkRfRU5BQkxFX1JFRyAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAwKQotI2RlZmluZSBOTV9SRUNPUkRfRU5BQkxFX0ZMQUcgMQotI2RlZmluZSBOTV9SRUNPUkRfRlJFRVJVTiAyCi0KLSNkZWZpbmUgTk1fUkJVRkZFUl9TVEFSVCAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDQpCi0jZGVmaW5lIE5NX1JCVUZGRVJfRU5EICAgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHgxMCkKLSNkZWZpbmUgTk1fUkJVRkZFUl9XTUFSSyAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweGMpCi0jZGVmaW5lIE5NX1JCVUZGRVJfQ1VSUlAgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHg4KQotCi0jZGVmaW5lIE5NX1BCVUZGRVJfU1RBUlQgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDQpCi0jZGVmaW5lIE5NX1BCVUZGRVJfRU5EICAgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDE0KQotI2RlZmluZSBOTV9QQlVGRkVSX1dNQVJLIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHhjKQotI2RlZmluZSBOTV9QQlVGRkVSX0NVUlJQIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHg4KQotCi0vKiBBIGZldyB0cml2aWFsIHJvdXRpbmVzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCB0aGUgcmVnaXN0ZXJzCi0gICBvbiB0aGUgY2hpcC4gKi8KLQotLyogVGhpcyBpcyBhIGNvbW1vbiBjb2RlIHBvcnRpb24gdXNlZCB0byBmaXggdXAgdGhlIHBvcnQgb2Zmc2V0cy4gKi8KLSNkZWZpbmUgTk1fRklYX1BPUlQgXAotICBpZiAocG9ydCA8IDEgfHwgcG9ydCA+IDIgfHwgY2FyZCA9PSBOVUxMKSBcCi0gICAgICByZXR1cm4gLTE7IFwKLVwKLSAgICBpZiAob2Zmc2V0IDwgY2FyZC0+cG9ydFtwb3J0IC0gMV0uc3RhcnRfb2Zmc2V0IFwKLQl8fCBvZmZzZXQgPj0gY2FyZC0+cG9ydFtwb3J0IC0gMV0uZW5kX29mZnNldCkgeyBcCi0JcHJpbnRrIChLRVJOX0VSUiAiQmFkIGFjY2VzczogcG9ydCAlZCwgb2Zmc2V0IDB4JXhcbiIsIHBvcnQsIG9mZnNldCk7IFwKLQlyZXR1cm4gLTE7IFwKLSAgICB9IFwKLSAgICBvZmZzZXQgLT0gY2FyZC0+cG9ydFtwb3J0IC0gMV0uc3RhcnRfb2Zmc2V0OwotCi0jZGVmaW5lIERFRndyaXRlUG9ydFgoWCwgZnVuYykgXAotc3RhdGljIGlubGluZSBpbnQgbm0yNTZfd3JpdGVQb3J0IyNYIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCxcCi0JCQkJICAgICAgaW50IHBvcnQsIGludCBvZmZzZXQsIGludCB2YWx1ZSlcCi17XAotICAgIHUjI1ggX19pb21lbSAqYWRkcjtcCi1cCi0gICAgaWYgKG5tMjU2X2RlYnVnID4gMSlcCi0gICAgICAgIHByaW50ayAoS0VSTl9ERUJVRyAiV3JpdGluZyAweCV4IHRvICVkOjB4JXhcbiIsIHZhbHVlLCBwb3J0LCBvZmZzZXQpO1wKLVwKLSAgICBOTV9GSVhfUE9SVDtcCi1cCi0gICAgYWRkciA9ICh1IyNYIF9faW9tZW0gKikoY2FyZC0+cG9ydFtwb3J0IC0gMV0ucHRyICsgb2Zmc2V0KTtcCi0gICAgZnVuYyAodmFsdWUsIGFkZHIpO1wKLSAgICByZXR1cm4gMDtcCi19Ci0KLURFRndyaXRlUG9ydFggKDgsIHdyaXRlYikKLURFRndyaXRlUG9ydFggKDE2LCB3cml0ZXcpCi1ERUZ3cml0ZVBvcnRYICgzMiwgd3JpdGVsKQotCi0jZGVmaW5lIERFRnJlYWRQb3J0WChYLCBmdW5jKSBcCi1zdGF0aWMgaW5saW5lIHUjI1ggbm0yNTZfcmVhZFBvcnQjI1ggKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLFwKLQkJCQkJaW50IHBvcnQsIGludCBvZmZzZXQpXAote1wKLSAgICB1IyNYIF9faW9tZW0gKmFkZHI7XAotXAotICAgIE5NX0ZJWF9QT1JUXAotXAotICAgIGFkZHIgPSAodSMjWCBfX2lvbWVtICopKGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCk7XAotICAgIHJldHVybiBmdW5jKGFkZHIpO1wKLX0KLQotREVGcmVhZFBvcnRYICg4LCByZWFkYikKLURFRnJlYWRQb3J0WCAoMTYsIHJlYWR3KQotREVGcmVhZFBvcnRYICgzMiwgcmVhZGwpCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1ubTI1Nl93cml0ZUJ1ZmZlcjggKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCB1OCAqc3JjLCBpbnQgcG9ydCwgaW50IG9mZnNldCwKLQkJICAgICAgaW50IGFtdCkKLXsKLSAgICBOTV9GSVhfUE9SVDsKLSAgICBtZW1jcHlfdG9pbyAoY2FyZC0+cG9ydFtwb3J0IC0gMV0ucHRyICsgb2Zmc2V0LCBzcmMsIGFtdCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1ubTI1Nl9yZWFkQnVmZmVyOCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIHU4ICpkc3QsIGludCBwb3J0LCBpbnQgb2Zmc2V0LAotCQkgICAgIGludCBhbXQpCi17Ci0gICAgTk1fRklYX1BPUlQ7Ci0gICAgbWVtY3B5X2Zyb21pbyAoZHN0LCBjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQsIGFtdCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiB3ZSBzaG91bGQgdXNlIHRoZSBjb2VmZmljaWVudCBjYWNoZS4gKi8KLXN0YXRpYyBpbnQgbm0yNTZfY2FjaGVkQ29lZmZpY2llbnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCk7Ci0KLSNlbmRpZgotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA0Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ubTI1Nl9hdWRpby5jIGIvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Y2QxNTUuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYyICswLDAgQEAKLS8qIAotICogQXVkaW8gZHJpdmVyIGZvciB0aGUgTmVvTWFnaWMgMjU2QVYgYW5kIDI1NlpYIGNoaXBzZXRzIGluIG5hdGl2ZQotICogbW9kZSwgd2l0aCBBQzk3IG1peGVyIHN1cHBvcnQuCi0gKgotICogT3ZlcmFsbCBkZXNpZ24gYW5kIHBhcnRzIG9mIHRoaXMgY29kZSBzdG9sZW4gZnJvbSB2aWRjXyouYyBhbmQKLSAqIHNrZWxldG9uLmMuCi0gKgotICogWWVhaCwgdGhlcmUgYXJlIGEgbG90IG9mIG1hZ2ljIGNvbnN0YW50cyBpbiBoZXJlLiAgWW91IHRlbGwgTUUgd2hhdAotICogdGhleSBhcmUuICBJIGp1c3QgZ2V0IHRoaXMgc3R1ZmYgcHN5Y2hpY2FsbHksIHJlbWVtYmVyPyAKLSAqCi0gKiBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiBieSBzb21lb25lIHdobyB3aXNoZXMgdG8gcmVtYWluIGFub255bW91cy4gCi0gKiBJdCBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gc2hhcmUgYW5kIGVuam95LiAgVHJ5IHRvIG1ha2UgYSBwcm9maXQKLSAqIG9mZiBvZiBpdDsgZ28gb24sIEkgZGFyZSB5b3UuICAKLSAqCi0gKiBDaGFuZ2VzOgotICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KLSAqCQlBZGRlZCBzb21lIF9faW5pdAotICogMTktMDQtMjAwMQlNYXJjdXMgTWVpc3NuZXIgPG1tQGNhbGRlcmEuZGU+Ci0gKgkJUG9ydGVkIHRvIDIuNCBQQ0kgQVBJLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi1zdGF0aWMgaW50IG5tMjU2X2RlYnVnOwotc3RhdGljIGludCBmb3JjZV9sb2FkOwotCi0jaW5jbHVkZSAibm0yNTYuaCIKLSNpbmNsdWRlICJubTI1Nl9jb2VmZi5oIgotCi0vKiAKLSAqIFRoZSBzaXplIG9mIHRoZSBwbGF5YmFjayByZXNlcnZlLiAgV2hlbiB0aGUgcGxheWJhY2sgYnVmZmVyIGhhcyBsZXNzCi0gKiB0aGFuIE5NMjU2X1BMQVlfV01BUktfU0laRSBieXRlcyB0byBvdXRwdXQsIHdlIHJlcXVlc3QgYSBuZXcKLSAqIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUgNTEyCi0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIG5tMjU2X2F1ZGlvX2RyaXZlcjsKLQotc3RhdGljIGludCBubTI1Nl9ncmFiSW50ZXJydXB0IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCk7Ci1zdGF0aWMgaW50IG5tMjU2X3JlbGVhc2VJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBubTI1Nl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgbm0yNTZfaW50ZXJydXB0X3p4IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCi0vKiBUaGVzZSBiZWxvbmcgaW4gbGludXgvcGNpLmguICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTyAweDgwMDUKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlpYX0FVRElPIDB4ODAwNgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTyAweDgwMTYKLQotLyogTGlzdCBvZiBjYXJkcy4gICovCi1zdGF0aWMgc3RydWN0IG5tMjU2X2luZm8gKm5tY2FyZF9saXN0OwotCi0vKiBSZWxlYXNlIHRoZSBtYXBwZWQtaW4gbWVtb3J5IGZvciBDQVJELiAgKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9yZWxlYXNlX3BvcnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKLQlpZiAoY2FyZC0+cG9ydFt4XS5wdHIgIT0gTlVMTCkgewotCSAgICBpb3VubWFwIChjYXJkLT5wb3J0W3hdLnB0cik7Ci0JICAgIGNhcmQtPnBvcnRbeF0ucHRyID0gTlVMTDsKLQl9Ci0gICAgfQotfQotCi0vKiAKLSAqIE1hcCBpbiB0aGUgbWVtb3J5IHBvcnRzIGZvciBDQVJELCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IG1hcHBlZCBpbgotICogYW5kIGhhdmUgYmVlbiBjb25maWd1cmVkLiAgSWYgc3VjY2Vzc2Z1bCwgYSB6ZXJvIHZhbHVlIGlzIHJldHVybmVkOwotICogb3RoZXJ3aXNlIGFueSBwcmV2aW91c2x5IG1hcHBlZC1pbiBhcmVhcyBhcmUgcmVsZWFzZWQgYW5kIGEgbm9uLXplcm8KLSAqIHZhbHVlIGlzIHJldHVybmVkLgotICoKLSAqIFRoaXMgaXMgaW52b2tlZCB0d2ljZSwgb25jZSBmb3IgZWFjaCBwb3J0LiAgSWRlYWxseSBpdCB3b3VsZCBvbmx5IGJlCi0gKiBjYWxsZWQgb25jZSwgYnV0IHdlIG5vdyBuZWVkIHRvIG1hcCBpbiB0aGUgc2Vjb25kIHBvcnQgaW4gb3JkZXIgdG8KLSAqIGNoZWNrIGhvdyBtdWNoIG1lbW9yeSB0aGUgY2FyZCBoYXMgb24gdGhlIDI1NlpYLgotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9yZW1hcF9wb3J0cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0JaWYgKGNhcmQtPnBvcnRbeF0ucHRyID09IE5VTEwgJiYgY2FyZC0+cG9ydFt4XS5lbmRfb2Zmc2V0ID4gMCkgewotCSAgICB1MzIgcGh5c2FkZHIgCi0JCT0gY2FyZC0+cG9ydFt4XS5waHlzYWRkciArIGNhcmQtPnBvcnRbeF0uc3RhcnRfb2Zmc2V0OwotCSAgICB1MzIgc2l6ZSAKLQkJPSBjYXJkLT5wb3J0W3hdLmVuZF9vZmZzZXQgLSBjYXJkLT5wb3J0W3hdLnN0YXJ0X29mZnNldDsKLQotCSAgICBjYXJkLT5wb3J0W3hdLnB0ciA9IGlvcmVtYXBfbm9jYWNoZSAocGh5c2FkZHIsIHNpemUpOwotCQkJCQkJICAKLQkgICAgaWYgKGNhcmQtPnBvcnRbeF0ucHRyID09IE5VTEwpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFVuYWJsZSB0byByZW1hcCBwb3J0ICVkXG4iLCB4ICsgMSk7Ci0JCW5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBMb2NhdGUgdGhlIGNhcmQgaW4gb3VyIGxpc3QuICovCi1zdGF0aWMgc3RydWN0IG5tMjU2X2luZm8gKgotbm0yNTZfZmluZF9jYXJkIChpbnQgZGV2KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkOwotCi0gICAgZm9yIChjYXJkID0gbm1jYXJkX2xpc3Q7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IGNhcmQtPm5leHRfY2FyZCkKLQlpZiAoY2FyZC0+ZGV2WzBdID09IGRldiB8fCBjYXJkLT5kZXZbMV0gPT0gZGV2KQotCSAgICByZXR1cm4gY2FyZDsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICogRGl0dG8sIGJ1dCBmaW5kIHRoZSBjYXJkIHN0cnVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaXhlciBkZXZpY2UgREVWIAotICogaW5zdGVhZC4gCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgbm0yNTZfaW5mbyAqCi1ubTI1Nl9maW5kX2NhcmRfZm9yX21peGVyIChpbnQgZGV2KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkOwotCi0gICAgZm9yIChjYXJkID0gbm1jYXJkX2xpc3Q7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IGNhcmQtPm5leHRfY2FyZCkKLQlpZiAoY2FyZC0+bWl4ZXJfb3NzX2RldiA9PSBkZXYpCi0JICAgIHJldHVybiBjYXJkOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgdXNlY2FjaGU7Ci1zdGF0aWMgaW50IGJ1ZmZlcnRvcDsKLQotLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHVzaW5nIHRoZSBiYW5rIG9mIGNhY2hlZCBjb2VmZmljaWVudHMuICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIHJldHVybiB1c2VjYWNoZTsKLX0KLQotLyogVGhlIGFjdHVhbCByYXRlcyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQuICovCi1zdGF0aWMgaW50IHNhbXBsZXJhdGVzWzldID0gewotICAgIDgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA5OTk5OTk5OQotfTsKLQotLyoKLSAqIFNldCB0aGUgY2FyZCBzYW1wbGVyYXRlLCB3b3JkIHNpemUgYW5kIHN0ZXJlbyBtb2RlIHRvIGNvcnJlc3BvbmQgdG8KLSAqIHRoZSBzZXR0aW5ncyBpbiB0aGUgQ0FSRCBzdHJ1Y3QgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGluIERFVi4KLSAqIFdlIGtlZXAgdHdvIHNlcGFyYXRlIHNldHMgb2YgaW5mb3JtYXRpb24sIG9uZSBmb3IgZWFjaCBkZXZpY2U7IHRoZQotICogaGFyZHdhcmUgaXMgbm90IGFjdHVhbGx5IGNvbmZpZ3VyZWQgdW50aWwgYSByZWFkIG9yIHdyaXRlIGlzCi0gKiBhdHRlbXB0ZWQuCi0gKi8KLQotc3RhdGljIGludAotbm0yNTZfc2V0SW5mbyAoaW50IGRldiwgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgaW50IHg7Ci0gICAgaW50IHc7Ci0gICAgaW50IHRhcmdldHJhdGU7Ci0KLSAgICBpZiAoY2FyZC0+ZGV2WzBdID09IGRldikKLQl3ID0gMDsKLSAgICBlbHNlIGlmIChjYXJkLT5kZXZbMV0gPT0gZGV2KQotCXcgPSAxOwotICAgIGVsc2UKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIHRhcmdldHJhdGUgPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOwotCi0gICAgaWYgKChjYXJkLT5zaW5mb1t3XS5iaXRzICE9IDggJiYgY2FyZC0+c2luZm9bd10uYml0cyAhPSAxNikKLQl8fCB0YXJnZXRyYXRlIDwgc2FtcGxlcmF0ZXNbMF0KLQl8fCB0YXJnZXRyYXRlID4gc2FtcGxlcmF0ZXNbN10pCi0JcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQotCWlmICh0YXJnZXRyYXRlIDwgKChzYW1wbGVyYXRlc1t4XSArIHNhbXBsZXJhdGVzW3ggKyAxXSkgLyAyKSkKLQkgICAgYnJlYWs7Ci0KLSAgICBpZiAoeCA8IDgpIHsKLQl1OCByYXRlYml0cyA9ICgoeCA8PCA0KSAmIE5NX1JBVEVfTUFTSyk7Ci0JaWYgKGNhcmQtPnNpbmZvW3ddLmJpdHMgPT0gMTYpCi0JICAgIHJhdGViaXRzIHw9IE5NX1JBVEVfQklUU18xNjsKLQlpZiAoY2FyZC0+c2luZm9bd10uc3RlcmVvKQotCSAgICByYXRlYml0cyB8PSBOTV9SQVRFX1NURVJFTzsKLQotCWNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGUgPSBzYW1wbGVyYXRlc1t4XTsKLQotCi0JaWYgKGNhcmQtPmRldl9mb3JfcGxheSA9PSBkZXYgJiYgY2FyZC0+cGxheWluZykgewotCSAgICBpZiAobm0yNTZfZGVidWcpCi0JCXByaW50ayAoS0VSTl9ERUJVRyAiU2V0dGluZyBwbGF5IHJhdGViaXRzIHRvIDB4JXhcbiIsCi0JCQlyYXRlYml0cyk7Ci0JICAgIG5tMjU2X2xvYWRDb2VmZmljaWVudCAoY2FyZCwgMCwgeCk7Ci0JICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsCi0JCQkgICAgICBOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgTk1fUkFURV9SRUdfT0ZGU0VULAotCQkJICAgICAgcmF0ZWJpdHMpOwotCX0KLQotCWlmIChjYXJkLT5kZXZfZm9yX3JlY29yZCA9PSBkZXYgJiYgY2FyZC0+cmVjb3JkaW5nKSB7Ci0JICAgIGlmIChubTI1Nl9kZWJ1ZykKLQkJcHJpbnRrIChLRVJOX0RFQlVHICJTZXR0aW5nIHJlY29yZCByYXRlYml0cyB0byAweCV4XG4iLAotCQkJcmF0ZWJpdHMpOwotCSAgICBubTI1Nl9sb2FkQ29lZmZpY2llbnQgKGNhcmQsIDEsIHgpOwotCSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLAotCQkJICAgICAgTk1fUkVDT1JEX1JFR19PRkZTRVQgKyBOTV9SQVRFX1JFR19PRkZTRVQsCi0JCQkgICAgICByYXRlYml0cyk7Ci0JfQotCXJldHVybiAwOwotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIFN0YXJ0IHRoZSBwbGF5IHByb2Nlc3MgZ29pbmcuICovCi1zdGF0aWMgdm9pZAotc3RhcnRQbGF5IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpZiAoISBjYXJkLT5wbGF5aW5nKSB7Ci0JY2FyZC0+cGxheWluZyA9IDE7Ci0JaWYgKG5tMjU2X2dyYWJJbnRlcnJ1cHQgKGNhcmQpID09IDApIHsKLQkgICAgbm0yNTZfc2V0SW5mbyAoY2FyZC0+ZGV2X2Zvcl9wbGF5LCBjYXJkKTsKLQotCSAgICAvKiBFbmFibGUgcGxheWJhY2sgZW5naW5lIGFuZCBpbnRlcnJ1cHRzLiAqLwotCSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCBOTV9QTEFZQkFDS19FTkFCTEVfUkVHLAotCQkJICAgICAgTk1fUExBWUJBQ0tfRU5BQkxFX0ZMQUcgfCBOTV9QTEFZQkFDS19GUkVFUlVOKTsKLQotCSAgICAvKiBFbmFibGUgYm90aCBjaGFubmVscy4gKi8KLQkgICAgbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIE5NX0FVRElPX01VVEVfUkVHLCAweDApOwotCX0KLSAgICB9Ci19Ci0KLS8qIAotICogUmVxdWVzdCBvbmUgY2h1bmsgb2YgQU1UIGJ5dGVzIGZyb20gdGhlIHJlY29yZGluZyBkZXZpY2UuICBXaGVuIHRoZQotICogb3BlcmF0aW9uIGlzIGNvbXBsZXRlLCB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIEJVRkZFUiBhbmQgdGhlCi0gKiBmdW5jdGlvbiBETUFidWZfaW5wdXRpbnRyIHdpbGwgYmUgaW52b2tlZC4KLSAqLwotCi1zdGF0aWMgdm9pZAotbm0yNTZfc3RhcnRSZWNvcmRpbmcgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBjaGFyICpidWZmZXIsIHUzMiBhbXQpCi17Ci0gICAgdTMyIGVuZHBvczsKLSAgICBpbnQgZW5hYmxlRW5naW5lID0gMDsKLSAgICB1MzIgcmluZ3NpemUgPSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplOwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICBpZiAoYW10ID4gKHJpbmdzaXplIC8gMikpIHsKLQkvKgotCSAqIE9mIGNvdXJzZSB0aGlzIHdvbid0IGFjdHVhbGx5IHdvcmsgcmlnaHQsIGJlY2F1c2UgdGhlCi0JICogY2FsbGVyIGlzIGdvaW5nIHRvIGFzc3VtZSB3ZSB3aWxsIGdpdmUgd2hhdCB3ZSBnb3QgYXNrZWQKLQkgKiBmb3IuCi0JICovCi0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFJlYWQgcmVxdWVzdCB0b28gbGFyZ2U6ICVkXG4iLCBhbXQpOwotCWFtdCA9IHJpbmdzaXplIC8gMjsKLSAgICB9Ci0KLSAgICBpZiAoYW10IDwgOCkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBSZWFkIHJlcXVlc3QgdG9vIHNtYWxsOyAlZFxuIiwgYW10KTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotICAgIC8qCi0gICAgICogSWYgd2UncmUgbm90IGN1cnJlbnRseSByZWNvcmRpbmcsIHNldCB1cCB0aGUgc3RhcnQgYW5kIGVuZCByZWdpc3RlcnMKLSAgICAgKiBmb3IgdGhlIHJlY29yZGluZyBlbmdpbmUuCi0gICAgICovCi0gICAgaWYgKCEgY2FyZC0+cmVjb3JkaW5nKSB7Ci0JY2FyZC0+cmVjb3JkaW5nID0gMTsKLQlpZiAobm0yNTZfZ3JhYkludGVycnVwdCAoY2FyZCkgPT0gMCkgewotCSAgICBjYXJkLT5jdXJSZWNQb3MgPSAwOwotCSAgICBubTI1Nl9zZXRJbmZvIChjYXJkLT5kZXZfZm9yX3JlY29yZCwgY2FyZCk7Ci0JICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9SQlVGRkVSX1NUQVJULCBjYXJkLT5hYnVmMik7Ci0JICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9SQlVGRkVSX0VORCwKLQkJCQkgY2FyZC0+YWJ1ZjIgKyByaW5nc2l6ZSk7Ci0KLQkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfQ1VSUlAsCi0JCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zKTsKLQkgICAgZW5hYmxlRW5naW5lID0gMTsKLQl9Ci0JZWxzZSB7Ci0JICAgIC8qIE5vdCBzdXJlIHdoYXQgZWxzZSB0byBkbyBoZXJlLiAgKi8KLQkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogSWYgd2UgaGFwcGVuIHRvIGdvIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGEgYml0IChkdWUgdG8gYQotICAgICAqIGRlbGF5ZWQgaW50ZXJydXB0KSBpdCdzIE9LLiAgU28gbWlnaHQgYXMgd2VsbCBzZXQgdGhlIHdhdGVybWFyawotICAgICAqIHJpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgd2Ugd2FudC4KLSAgICAgKi8KLSAgICBlbmRwb3MgPSBjYXJkLT5hYnVmMiArICgoY2FyZC0+Y3VyUmVjUG9zICsgYW10KSAlIHJpbmdzaXplKTsKLQotICAgIGNhcmQtPnJlY0J1ZiA9IGJ1ZmZlcjsKLSAgICBjYXJkLT5yZXF1ZXN0ZWRSZWNBbXQgPSBhbXQ7Ci0gICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfV01BUkssIGVuZHBvcyk7Ci0gICAgLyogRW5hYmxlIHJlY29yZGluZyBlbmdpbmUgYW5kIGludGVycnVwdHMuICovCi0gICAgaWYgKGVuYWJsZUVuZ2luZSkKLQlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCBOTV9SRUNPUkRfRU5BQkxFX1JFRywKLQkJCSAgICBOTV9SRUNPUkRfRU5BQkxFX0ZMQUcgfCBOTV9SRUNPUkRfRlJFRVJVTik7Ci0KLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLX0KLQotLyogU3RvcCB0aGUgcGxheSBlbmdpbmUuICovCi1zdGF0aWMgdm9pZAotc3RvcFBsYXkgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIC8qIFNodXQgb2ZmIHNvdW5kIGZyb20gYm90aCBjaGFubmVscy4gKi8KLSAgICBubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgTk1fQVVESU9fTVVURV9SRUcsCi0JCSAgICAgICBOTV9BVURJT19NVVRFX0xFRlQgfCBOTV9BVURJT19NVVRFX1JJR0hUKTsKLSAgICAvKiBEaXNhYmxlIHBsYXkgZW5naW5lLiAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1BMQVlCQUNLX0VOQUJMRV9SRUcsIDApOwotICAgIGlmIChjYXJkLT5wbGF5aW5nKSB7Ci0Jbm0yNTZfcmVsZWFzZUludGVycnVwdCAoY2FyZCk7Ci0KLQkvKiBSZXNldCB0aGUgcmVsZXZhbnQgc3RhdGUgYml0cy4gKi8KLQljYXJkLT5wbGF5aW5nID0gMDsKLQljYXJkLT5jdXJQbGF5UG9zID0gMDsKLSAgICB9Ci19Ci0KLS8qIFN0b3AgcmVjb3JkaW5nLiAqLwotc3RhdGljIHZvaWQKLXN0b3BSZWNvcmQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIC8qIERpc2FibGUgcmVjb3JkaW5nIGVuZ2luZS4gKi8KLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCBOTV9SRUNPUkRfRU5BQkxFX1JFRywgMCk7Ci0KLSAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKSB7Ci0Jbm0yNTZfcmVsZWFzZUludGVycnVwdCAoY2FyZCk7Ci0KLQljYXJkLT5yZWNvcmRpbmcgPSAwOwotCWNhcmQtPmN1clJlY1BvcyA9IDA7Ci0gICAgfQotfQotCi0vKgotICogUmluZyBidWZmZXJzLCBtYW4uICBUaGF0J3Mgd2hlcmUgdGhlIGhpcC1ob3AsIHdpbGQtbi13b29seSBhY3Rpb24ncyBhdC4KLSAqIDE5NzI/ICAoV2VsbCwgSSBzdXBwb3NlIGl0IHdhcyBjaGVlcC1uLWVhc3kgdG8gaW1wbGVtZW50LikKLSAqCi0gKiBXcml0ZSBBTVQgYnl0ZXMgb2YgQlVGRkVSIHRvIHRoZSBwbGF5YmFjayByaW5nIGJ1ZmZlciwgYW5kIHN0YXJ0IHRoZQotICogcGxheWJhY2sgZW5naW5lIHJ1bm5pbmcuICBJdCB3aWxsIG9ubHkgYWNjZXB0IHVwIHRvIDEvMiBvZiB0aGUgdG90YWwKLSAqIHNpemUgb2YgdGhlIHJpbmcgYnVmZmVyLiAgTm8gY2hlY2sgaXMgbWFkZSB0aGF0IHdlJ3JlIGFib3V0IHRvIG92ZXJ3cml0ZQotICogdGhlIGN1cnJlbnRseS1wbGF5aW5nIHNhbXBsZS4KLSAqLwotCi1zdGF0aWMgdm9pZAotbm0yNTZfd3JpdGVfYmxvY2sgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBjaGFyICpidWZmZXIsIHUzMiBhbXQpCi17Ci0gICAgdTMyIHJpbmdzaXplID0gY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplOwotICAgIHUzMiBlbmRzdG9wOwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICBpZiAoYW10ID4gKHJpbmdzaXplIC8gMikpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogV3JpdGUgcmVxdWVzdCB0b28gbGFyZ2U6ICVkXG4iLCBhbXQpOwotCWFtdCA9IChyaW5nc2l6ZSAvIDIpOwotICAgIH0KLQotICAgIGlmIChhbXQgPCBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogV3JpdGUgcmVxdWVzdCB0b28gc21hbGw6ICVkXG4iLCBhbXQpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBjYXJkLT5jdXJQbGF5UG9zICU9IHJpbmdzaXplOwotCi0gICAgY2FyZC0+cmVxdWVzdGVkX2FtdCA9IGFtdDsKLQotICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLQotICAgIGlmICgoY2FyZC0+Y3VyUGxheVBvcyArIGFtdCkgPj0gcmluZ3NpemUpIHsKLQl1MzIgcmVtID0gcmluZ3NpemUgLSBjYXJkLT5jdXJQbGF5UG9zOwotCi0Jbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBidWZmZXIsIDEsCi0JCQkgICAgICBjYXJkLT5hYnVmMSArIGNhcmQtPmN1clBsYXlQb3MsCi0JCQkgICAgICByZW0pOwotCWlmIChhbXQgPiByZW0pCi0JICAgIG5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgYnVmZmVyICsgcmVtLCAxLCBjYXJkLT5hYnVmMSwKLQkJCQkgIGFtdCAtIHJlbSk7Ci0gICAgfSAKLSAgICBlbHNlCi0Jbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBidWZmZXIsIDEsCi0JCQkgICAgICBjYXJkLT5hYnVmMSArIGNhcmQtPmN1clBsYXlQb3MsCi0JCQkgICAgICBhbXQpOwotCi0gICAgLyoKLSAgICAgKiBTZXR1cCB0aGUgc3RhcnQtbi1zdG9wLW4tbGltaXQgcmVnaXN0ZXJzLCBhbmQgc3RhcnQgdGhhdCBlbmdpbmUKLSAgICAgKiBnb2luJy4gCi0gICAgICoKLSAgICAgKiBOb3JtYWxseSB3ZSBqdXN0IGxldCBpdCB3cmFwIGFyb3VuZCB0byBhdm9pZCB0aGUgY2xpY2stY2xpY2sKLSAgICAgKiBhY3Rpb24gc2NlbmUuCi0gICAgICovCi0gICAgaWYgKCEgY2FyZC0+cGxheWluZykgewotCS8qIFRoZSBQQlVGRkVSX0VORCByZWdpc3RlciBpbiB0aGlzIGNhc2UgcG9pbnRzIHRvIG9uZSBzYW1wbGUKLQkgICBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLwotCWludCB3ID0gKGNhcmQtPmRldl9mb3JfcGxheSA9PSBjYXJkLT5kZXZbMF0gPyAwIDogMSk7Ci0JaW50IHNhbXBzaXplID0gKGNhcmQtPnNpbmZvW3ddLmJpdHMgPT0gMTYgPyAyIDogMSk7Ci0KLQlpZiAoY2FyZC0+c2luZm9bd10uc3RlcmVvKQotCSAgICBzYW1wc2l6ZSAqPSAyOwotCi0JLyogTmVlZCB0byBzZXQgdGhlIG5vdC1ub3JtYWxseS1jaGFuZ2luZy1yZWdpc3RlcnMgdXAuICovCi0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfU1RBUlQsCi0JCQkgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcyk7Ci0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfRU5ELAotCQkJICAgICBjYXJkLT5hYnVmMSArIHJpbmdzaXplIC0gc2FtcHNpemUpOwotCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX0NVUlJQLAotCQkJICAgICBjYXJkLT5hYnVmMSArIGNhcmQtPmN1clBsYXlQb3MpOwotICAgIH0KLSAgICBlbmRzdG9wID0gKGNhcmQtPmN1clBsYXlQb3MgKyBhbXQgLSBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUpICUgcmluZ3NpemU7Ci0gICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfV01BUkssIGNhcmQtPmFidWYxICsgZW5kc3RvcCk7Ci0KLSAgICBpZiAoISBjYXJkLT5wbGF5aW5nKQotCXN0YXJ0UGxheSAoY2FyZCk7Ci0KLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLX0KLQotLyogIFdlIGp1c3QgZ290IGEgY2FyZCBwbGF5YmFjayBpbnRlcnJ1cHQ7IHByb2Nlc3MgaXQuICAqLwotc3RhdGljIHZvaWQKLW5tMjU2X2dldF9uZXdfYmxvY2sgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIC8qIENoZWNrIHRvIHNlZSBob3cgbXVjaCBnb3QgcGxheWVkIHNvIGZhci4gKi8KLSAgICB1MzIgYW10ID0gbm0yNTZfcmVhZFBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9DVVJSUCkgLSBjYXJkLT5hYnVmMTsKLQotICAgIGlmIChhbXQgPj0gY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFNvdW5kIHBsYXliYWNrIHBvaW50ZXIgaW52YWxpZCFcbiIpOwotCWFtdCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGFtdCA8IGNhcmQtPmN1clBsYXlQb3MpCi0JYW10ID0gKGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZSAtIGNhcmQtPmN1clBsYXlQb3MpICsgYW10OwotICAgIGVsc2UKLQlhbXQgLT0gY2FyZC0+Y3VyUGxheVBvczsKLQotICAgIGlmIChjYXJkLT5yZXF1ZXN0ZWRfYW10ID4gKGFtdCArIE5NMjU2X1BMQVlfV01BUktfU0laRSkpIHsKLQl1MzIgZW5kc3RvcCA9Ci0JICAgIGNhcmQtPmN1clBsYXlQb3MgKyBjYXJkLT5yZXF1ZXN0ZWRfYW10IC0gTk0yNTZfUExBWV9XTUFSS19TSVpFOwotCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX1dNQVJLLCBjYXJkLT5hYnVmMSArIGVuZHN0b3ApOwotICAgIH0gCi0gICAgZWxzZSB7Ci0JY2FyZC0+Y3VyUGxheVBvcyArPSBjYXJkLT5yZXF1ZXN0ZWRfYW10OwotCS8qIEdldCBhIG5ldyBibG9jayB0byB3cml0ZS4gIFRoaXMgd2lsbCBldmVudHVhbGx5IGludm9rZQotCSAgIG5tMjU2X3dyaXRlX2Jsb2NrICgpIG9yIHN0b3BQbGF5ICgpLiAgKi8KLQlETUFidWZfb3V0cHV0aW50ciAoY2FyZC0+ZGV2X2Zvcl9wbGF5LCAxKTsKLSAgICB9Ci19Ci0KLS8qIAotICogUmVhZCB0aGUgbGFzdC1yZWNvcmRlZCBibG9jayBmcm9tIHRoZSByaW5nIGJ1ZmZlciwgY29weSBpdCBpbnRvIHRoZQotICogc2F2ZWQgYnVmZmVyIHBvaW50ZXIsIGFuZCBpbnZva2UgRE1BdWZfaW5wdXRpbnRyKCkgd2l0aCB0aGUgcmVjb3JkaW5nCi0gKiBkZXZpY2UuIAotICovCi0KLXN0YXRpYyB2b2lkCi1ubTI1Nl9yZWFkX2Jsb2NrIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICAvKiBHcmFiIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSByZWNvcmRpbmcgcG9pbnRlci4gKi8KLSAgICB1MzIgY3VycnB0ciA9IG5tMjU2X3JlYWRQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfQ1VSUlApIC0gY2FyZC0+YWJ1ZjI7Ci0gICAgdTMyIGFtdFRvUmVhZCA9IGNhcmQtPnJlcXVlc3RlZFJlY0FtdDsKLSAgICB1MzIgcmluZ3NpemUgPSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplOwotCi0gICAgaWYgKGN1cnJwdHIgPj0gY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBTb3VuZCBidWZmZXIgcmVjb3JkIHBvaW50ZXIgaW52YWxpZCFcbiIpOwotICAgICAgICBjdXJycHRyID0gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoaXMgdGVzdCBpcyBwcm9iYWJseSByZWR1bmRhbnQ7IHdlIHNob3VsZG4ndCBiZSBoZXJlIHVubGVzcwotICAgICAqIGl0J3MgdHJ1ZS4KLSAgICAgKi8KLSAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKSB7Ci0JLyogSWYgd2Ugd3JhcHBlZCBhcm91bmQsIGNvcHkgZXZlcnl0aGluZyBmcm9tIHRoZSBzdGFydCBvZiBvdXIKLQkgICByZWNvcmRpbmcgYnVmZmVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KLQlpZiAoY3VycnB0ciA8IGNhcmQtPmN1clJlY1BvcykgewotCSAgICB1MzIgYW10ID0gbWluIChyaW5nc2l6ZSAtIGNhcmQtPmN1clJlY1BvcywgYW10VG9SZWFkKTsKLQotCSAgICBubTI1Nl9yZWFkQnVmZmVyOCAoY2FyZCwgY2FyZC0+cmVjQnVmLCAxLAotCQkJCSBjYXJkLT5hYnVmMiArIGNhcmQtPmN1clJlY1BvcywKLQkJCQkgYW10KTsKLQkgICAgYW10VG9SZWFkIC09IGFtdDsKLQkgICAgY2FyZC0+Y3VyUmVjUG9zICs9IGFtdDsKLQkgICAgY2FyZC0+cmVjQnVmICs9IGFtdDsKLQkgICAgaWYgKGNhcmQtPmN1clJlY1BvcyA9PSByaW5nc2l6ZSkKLQkJY2FyZC0+Y3VyUmVjUG9zID0gMDsKLQl9Ci0KLQlpZiAoKGNhcmQtPmN1clJlY1BvcyA8IGN1cnJwdHIpICYmIChhbXRUb1JlYWQgPiAwKSkgewotCSAgICB1MzIgYW10ID0gbWluIChjdXJycHRyIC0gY2FyZC0+Y3VyUmVjUG9zLCBhbXRUb1JlYWQpOwotCSAgICBubTI1Nl9yZWFkQnVmZmVyOCAoY2FyZCwgY2FyZC0+cmVjQnVmLCAxLAotCQkJCSBjYXJkLT5hYnVmMiArIGNhcmQtPmN1clJlY1BvcywgYW10KTsKLQkgICAgY2FyZC0+Y3VyUmVjUG9zID0gKChjYXJkLT5jdXJSZWNQb3MgKyBhbXQpICUgcmluZ3NpemUpOwotCX0KLQljYXJkLT5yZWNCdWYgPSBOVUxMOwotCWNhcmQtPnJlcXVlc3RlZFJlY0FtdCA9IDA7Ci0JRE1BYnVmX2lucHV0aW50ciAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQpOwotICAgIH0KLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAKLSAqLwotc3RhdGljIHZvaWQKLW5tMjU2X2luaXRIdyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogUmVzZXQgZXZlcnl0aGluZy4gKi8KLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDAsIDB4MTEpOwotICAgIG5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCAweDIxNCwgMCk7Ci0KLSAgICBzdG9wUmVjb3JkIChjYXJkKTsKLSAgICBzdG9wUGxheSAoY2FyZCk7Ci19Ci0KLS8qIAotICogSGFuZGxlIGEgcG90ZW50aWFsIGludGVycnVwdCBmb3IgdGhlIGRldmljZSByZWZlcnJlZCB0byBieSBERVZfSUQuIAotICoKLSAqIEkgZG9uJ3QgbGlrZSB0aGUgY3V0LW4tcGFzdGUgam9iIGhlcmUgZWl0aGVyIGJldHdlZW4gdGhlIHR3byByb3V0aW5lcywKLSAqIGJ1dCB0aGVyZSBhcmUgc3VmZmljaWVudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gaW50ZXJydXB0IGhhbmRsZXJzCi0gKiB0aGF0IHBhcmFtZXRlcml6aW5nIGl0IGlzbid0IGFsbCB0aGF0IGdyZWF0IGVpdGhlci4gIChDb3VsZCB1c2UgYSBtYWNybywKLSAqIEkgc3VwcG9zZS4uLnl1Y2t5IGJsZWFoLikKLSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QKLW5tMjU2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2X2lkOwotICAgIHUxNiBzdGF0dXM7Ci0gICAgc3RhdGljIGludCBiYWRpbnRyY291bnQ7Ci0gICAgaW50IGhhbmRsZWQgPSAwOwotCi0gICAgaWYgKChjYXJkID09IE5VTEwpIHx8IChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgY2FyZCBwb2ludGVyXG4iKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gbm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgTk1fSU5UX1JFRyk7Ci0KLSAgICAvKiBOb3Qgb3Vycy4gKi8KLSAgICBpZiAoc3RhdHVzID09IDApIHsKLQlpZiAoYmFkaW50cmNvdW50KysgPiAxMDAwKSB7Ci0JICAgIC8qCi0JICAgICAqIEknbSBub3Qgc3VyZSBpZiB0aGUgYmVzdCB0aGluZyBpcyB0byBzdG9wIHRoZSBjYXJkIGZyb20KLQkgICAgICogcGxheWluZyBvciBqdXN0IHJlbGVhc2UgdGhlIGludGVycnVwdCAoYWZ0ZXIgYWxsLCB3ZSdyZSBpbgotCSAgICAgKiBhIGJhZCBzaXR1YXRpb24sIHNvIGRvaW5nIGZhbmN5IHN0dWZmIG1heSBub3QgYmUgc3VjaCBhIGdvb2QKLQkgICAgICogaWRlYSkuCi0JICAgICAqCi0JICAgICAqIEkgd29ycnkgYWJvdXQgdGhlIGNhcmQgZW5naW5lIGNvbnRpbnVpbmcgdG8gcGxheSBub2lzZQotCSAgICAgKiBvdmVyIGFuZCBvdmVyLCBob3dldmVyLS10aGF0IGNvdWxkIGJlY29tZSBhIHZlcnkKLQkgICAgICogb2Jub3hpb3VzIHByb2JsZW0uICBBbmQgd2Uga25vdyB0aGF0IHdoZW4gdGhpcyB1c3VhbGx5Ci0JICAgICAqIGhhcHBlbnMgdGhpbmdzIGFyZSBmYWlybHkgc2FmZSwgaXQganVzdCBtZWFucyB0aGUgdXNlcidzCi0JICAgICAqIGluc2VydGVkIGEgUENNQ0lBIGNhcmQgYW5kIHNvbWVvbmUncyBzcGFtbWluZyB1cyB3aXRoIElSUSA5cy4KLQkgICAgICovCi0KLQkgICAgaGFuZGxlZCA9IDE7Ci0JICAgIGlmIChjYXJkLT5wbGF5aW5nKQotCQlzdG9wUGxheSAoY2FyZCk7Ci0JICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpCi0JCXN0b3BSZWNvcmQgKGNhcmQpOwotCSAgICBiYWRpbnRyY291bnQgPSAwOwotCX0KLQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKLSAgICB9Ci0KLSAgICBiYWRpbnRyY291bnQgPSAwOwotCi0gICAgLyogUmF0aGVyIGJvcmluZzsgY2hlY2sgZm9yIGluZGl2aWR1YWwgaW50ZXJydXB0cyBhbmQgcHJvY2VzcyB0aGVtLiAqLwotCi0gICAgaWYgKHN0YXR1cyAmIE5NX1BMQVlCQUNLX0lOVCkgewotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk1fUExBWUJBQ0tfSU5UOwotCU5NX0FDS19JTlQgKGNhcmQsIE5NX1BMQVlCQUNLX0lOVCk7Ci0KLQlpZiAoY2FyZC0+cGxheWluZykKLQkgICAgbm0yNTZfZ2V0X25ld19ibG9jayAoY2FyZCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NX1JFQ09SRF9JTlQpIHsKLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NX1JFQ09SRF9JTlQ7Ci0JTk1fQUNLX0lOVCAoY2FyZCwgTk1fUkVDT1JEX0lOVCk7Ci0KLQlpZiAoY2FyZC0+cmVjb3JkaW5nKQotCSAgICBubTI1Nl9yZWFkX2Jsb2NrIChjYXJkKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMSkgewotCXU4IGNieXRlOwotCi0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTV9NSVNDX0lOVF8xOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOwotCU5NX0FDS19JTlQgKGNhcmQsIE5NX01JU0NfSU5UXzEpOwotCW5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCBOTV9JTlRfUkVHLCAweDgwMDApOwotCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7Ci0Jbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlIHwgMik7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NX01JU0NfSU5UXzIpIHsKLQl1OCBjYnl0ZTsKLQotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk1fTUlTQ19JTlRfMjsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKLQlOTV9BQ0tfSU5UIChjYXJkLCBOTV9NSVNDX0lOVF8yKTsKLQljYnl0ZSA9IG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHg0MDApOwotCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NDAwLCBjYnl0ZSAmIH4yKTsKLSAgICB9Ci0KLSAgICAvKiBVbmtub3duIGludGVycnVwdC4gKi8KLSAgICBpZiAoc3RhdHVzKSB7Ci0JaGFuZGxlZCA9IDE7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCi0JCXN0YXR1cyk7Ci0JLyogUHJheS4gKi8KLQlOTV9BQ0tfSU5UIChjYXJkLCBzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKLX0KLQotLyoKLSAqIEhhbmRsZSBhIHBvdGVudGlhbCBpbnRlcnJ1cHQgZm9yIHRoZSBkZXZpY2UgcmVmZXJyZWQgdG8gYnkgREVWX0lELgotICogVGhpcyBoYW5kbGVyIGlzIGZvciB0aGUgMjU2WlgsIGFuZCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIG5vbi1aWAotICogcm91dGluZS4KLSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QKLW5tMjU2X2ludGVycnVwdF96eCAoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2X2lkOwotICAgIHUzMiBzdGF0dXM7Ci0gICAgc3RhdGljIGludCBiYWRpbnRyY291bnQ7Ci0gICAgaW50IGhhbmRsZWQgPSAwOwotCi0gICAgaWYgKChjYXJkID09IE5VTEwpIHx8IChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgY2FyZCBwb2ludGVyXG4iKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gbm0yNTZfcmVhZFBvcnQzMiAoY2FyZCwgMiwgTk1fSU5UX1JFRyk7Ci0KLSAgICAvKiBOb3Qgb3Vycy4gKi8KLSAgICBpZiAoc3RhdHVzID09IDApIHsKLQlpZiAoYmFkaW50cmNvdW50KysgPiAxMDAwKSB7Ci0JICAgIHByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBSZWxlYXNpbmcgaW50ZXJydXB0LCBvdmVyIDEwMDAgaW52YWxpZCBpbnRlcnJ1cHRzXG4iKTsKLQkgICAgLyoKLQkgICAgICogSSdtIG5vdCBzdXJlIGlmIHRoZSBiZXN0IHRoaW5nIGlzIHRvIHN0b3AgdGhlIGNhcmQgZnJvbQotCSAgICAgKiBwbGF5aW5nIG9yIGp1c3QgcmVsZWFzZSB0aGUgaW50ZXJydXB0IChhZnRlciBhbGwsIHdlJ3JlIGluCi0JICAgICAqIGEgYmFkIHNpdHVhdGlvbiwgc28gZG9pbmcgZmFuY3kgc3R1ZmYgbWF5IG5vdCBiZSBzdWNoIGEgZ29vZAotCSAgICAgKiBpZGVhKS4KLQkgICAgICoKLQkgICAgICogSSB3b3JyeSBhYm91dCB0aGUgY2FyZCBlbmdpbmUgY29udGludWluZyB0byBwbGF5IG5vaXNlCi0JICAgICAqIG92ZXIgYW5kIG92ZXIsIGhvd2V2ZXItLXRoYXQgY291bGQgYmVjb21lIGEgdmVyeQotCSAgICAgKiBvYm5veGlvdXMgcHJvYmxlbS4gIEFuZCB3ZSBrbm93IHRoYXQgd2hlbiB0aGlzIHVzdWFsbHkKLQkgICAgICogaGFwcGVucyB0aGluZ3MgYXJlIGZhaXJseSBzYWZlLCBpdCBqdXN0IG1lYW5zIHRoZSB1c2VyJ3MKLQkgICAgICogaW5zZXJ0ZWQgYSBQQ01DSUEgY2FyZCBhbmQgc29tZW9uZSdzIHNwYW1taW5nIHVzIHdpdGggCi0JICAgICAqIElSUSA5cy4KLQkgICAgICovCi0KLQkgICAgaGFuZGxlZCA9IDE7Ci0JICAgIGlmIChjYXJkLT5wbGF5aW5nKQotCQlzdG9wUGxheSAoY2FyZCk7Ci0JICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpCi0JCXN0b3BSZWNvcmQgKGNhcmQpOwotCSAgICBiYWRpbnRyY291bnQgPSAwOwotCX0KLQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKLSAgICB9Ci0KLSAgICBiYWRpbnRyY291bnQgPSAwOwotCi0gICAgLyogUmF0aGVyIGJvcmluZzsgY2hlY2sgZm9yIGluZGl2aWR1YWwgaW50ZXJydXB0cyBhbmQgcHJvY2VzcyB0aGVtLiAqLwotCi0gICAgaWYgKHN0YXR1cyAmIE5NMl9QTEFZQkFDS19JTlQpIHsKLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NMl9QTEFZQkFDS19JTlQ7Ci0JTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9QTEFZQkFDS19JTlQpOwotCi0JaWYgKGNhcmQtPnBsYXlpbmcpCi0JICAgIG5tMjU2X2dldF9uZXdfYmxvY2sgKGNhcmQpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgJiBOTTJfUkVDT1JEX0lOVCkgewotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk0yX1JFQ09SRF9JTlQ7Ci0JTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9SRUNPUkRfSU5UKTsKLQotCWlmIChjYXJkLT5yZWNvcmRpbmcpCi0JICAgIG5tMjU2X3JlYWRfYmxvY2sgKGNhcmQpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgJiBOTTJfTUlTQ19JTlRfMSkgewotCXU4IGNieXRlOwotCi0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMTsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKLQlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX01JU0NfSU5UXzEpOwotCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7Ci0Jbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlIHwgMik7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NMl9NSVNDX0lOVF8yKSB7Ci0JdTggY2J5dGU7Ci0KLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NMl9NSVNDX0lOVF8yOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOwotCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfTUlTQ19JTlRfMik7Ci0JY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKLQlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgJiB+Mik7Ci0gICAgfQotCi0gICAgLyogVW5rbm93biBpbnRlcnJ1cHQuICovCi0gICAgaWYgKHN0YXR1cykgewotCWhhbmRsZWQgPSAxOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAotCQlzdGF0dXMpOwotCS8qIFByYXkuICovCi0JTk0yX0FDS19JTlQgKGNhcmQsIHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQotCi0vKiAKLSAqIFJlcXVlc3Qgb3VyIGludGVycnVwdC4KLSAqLwotc3RhdGljIGludAotbm0yNTZfZ3JhYkludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgaWYgKGNhcmQtPmhhc19pcnErKyA9PSAwKSB7Ci0JaWYgKHJlcXVlc3RfaXJxIChjYXJkLT5pcnEsIGNhcmQtPmludHJvdXRpbmUsIElSUUZfU0hBUkVELAotCQkJICJOTTI1Nl9hdWRpbyIsIGNhcmQpIDwgMCkgewotCSAgICBwcmludGsgKEtFUk5fRVJSICJOTTI1NjogY2FuJ3Qgb2J0YWluIElSUSAlZFxuIiwgY2FyZC0+aXJxKTsKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIAotICogUmVsZWFzZSBvdXIgaW50ZXJydXB0LiAKLSAqLwotc3RhdGljIGludAotbm0yNTZfcmVsZWFzZUludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgaWYgKGNhcmQtPmhhc19pcnEgPD0gMCkgewotCXByaW50ayAoS0VSTl9FUlIgIm5tMjU2OiB0b28gbWFueSBjYWxscyB0byByZWxlYXNlSW50ZXJydXB0XG4iKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGNhcmQtPmhhc19pcnEtLTsKLSAgICBpZiAoY2FyZC0+aGFzX2lycSA9PSAwKSB7Ci0JZnJlZV9pcnEgKGNhcmQtPmlycSwgY2FyZCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKgotICogV2FpdHMgZm9yIHRoZSBtaXhlciB0byBiZWNvbWUgcmVhZHkgdG8gYmUgd3JpdHRlbjsgcmV0dXJucyBhIHplcm8gdmFsdWUKLSAqIGlmIGl0IHRpbWVkIG91dC4KLSAqLwotCi1zdGF0aWMgaW50Ci1ubTI1Nl9pc1JlYWR5IChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKLSAgICBpbnQgdDIgPSAxMDsKLSAgICB1MzIgdGVzdGFkZHI7Ci0gICAgdTE2IHRlc3RiOwotICAgIGludCBkb25lID0gMDsKLQotICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gaXNSZWFkeSFcbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHRlc3RhZGRyID0gY2FyZC0+bWl4ZXJfc3RhdHVzX29mZnNldDsKLSAgICB0ZXN0YiA9IGNhcmQtPm1peGVyX3N0YXR1c19tYXNrOwotCi0gICAgLyogCi0gICAgICogTG9vcCBhcm91bmQgd2FpdGluZyBmb3IgdGhlIG1peGVyIHRvIGJlY29tZSByZWFkeS4gCi0gICAgICovCi0gICAgd2hpbGUgKCEgZG9uZSAmJiB0Mi0tID4gMCkgewotCWlmICgobm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgdGVzdGFkZHIpICYgdGVzdGIpID09IDApCi0JICAgIGRvbmUgPSAxOwotCWVsc2UKLQkgICAgdWRlbGF5ICgxMDApOwotICAgIH0KLSAgICByZXR1cm4gZG9uZTsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIEFDOTcgbWl4ZXIgcmVnaXN0ZXIgUkVHLiAgUmV0dXJucyBhIHBvc2l0aXZlCi0gKiB2YWx1ZSBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X3JlYWRBQzk3UmVnIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOwotCi0gICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiByZWFkQUM5N1JlZyFcbiIpOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChyZWcgPCAxMjgpIHsKLQlpbnQgcmVzOwotCi0Jbm0yNTZfaXNSZWFkeSAoZGV2KTsKLQlyZXMgPSBubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCBjYXJkLT5taXhlciArIHJlZyk7Ci0JLyogTWFnaWMgZGVsYXkuICBCbGVhaCB5dWNreS4gICovCi0gICAgICAgIHVkZWxheSAoMTAwMCk7Ci0JcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgZWxzZQotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKiAKLSAqIFdyaXRlcyBWQUxVRSB0byBBQzk3IG1peGVyIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvcgotICogYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAKLSAqLwotc3RhdGljIGludAotbm0yNTZfd3JpdGVBQzk3UmVnIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgIGludCB0cmllcyA9IDI7Ci0gICAgaW50IGRvbmUgPSAwOwotICAgIHUzMiBiYXNlOwotCi0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOwotCi0gICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiB3cml0ZUFDOTdSZWchXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBiYXNlID0gY2FyZC0+bWl4ZXI7Ci0KLSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7Ci0KLSAgICBubTI1Nl9pc1JlYWR5IChkZXYpOwotCi0gICAgLyogV2FpdCBmb3IgdGhlIHdyaXRlIHRvIHRha2UsIHRvby4gKi8KLSAgICB3aGlsZSAoKHRyaWVzLS0gPiAwKSAmJiAhZG9uZSkgewotCW5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCBiYXNlICsgcmVnLCB2YWx1ZSk7Ci0JaWYgKG5tMjU2X2lzUmVhZHkgKGRldikpIHsKLQkgICAgZG9uZSA9IDE7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIH0KLQotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotICAgIHVkZWxheSAoMTAwMCk7Ci0KLSAgICByZXR1cm4gISBkb25lOwotfQotCi0vKiAKLSAqIEluaXRpYWwgcmVnaXN0ZXIgdmFsdWVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIEFDOTcgbWl4ZXIuCi0gKiBXaGlsZSBtb3N0IG9mIHRoZXNlIGFyZSBpZGVudGljYWwgdG8gdGhlIHJlc2V0IHZhbHVlcywgd2UgZG8gdGhpcwotICogc28gdGhhdCB3ZSBoYXZlIG1vc3Qgb2YgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGNhY2hlZC0tdGhpcyBhdm9pZHMKLSAqIHJlYWRpbmcgZnJvbSB0aGUgbWl4ZXIgZGlyZWN0bHkgKHdoaWNoIHNlZW1zIHRvIGJlIHByb2JsZW1hdGljLAotICogcHJvYmFibHkgZHVlIHRvIGlnbm9yYW5jZSkuCi0gKi8KLXN0cnVjdCBpbml0aWFsVmFsdWVzIAotewotICAgIHVuc2lnbmVkIHNob3J0IHBvcnQ7Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsdWU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGluaXRpYWxWYWx1ZXMgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1tdID0gCi17Ci0gICAgeyBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCAweDgwMDAgfSwKLSAgICB7IEFDOTdfSEVBRFBIT05FX1ZPTCwgICAgIDB4ODAwMCB9LAotICAgIHsgQUM5N19NQVNURVJfVk9MX01PTk8sICAgMHgwMDAwIH0sCi0gICAgeyBBQzk3X1BDQkVFUF9WT0wsICAgICAgICAweDAwMDAgfSwKLSAgICB7IEFDOTdfUEhPTkVfVk9MLCAgICAgICAgIDB4MDAwOCB9LAotICAgIHsgQUM5N19NSUNfVk9MLCAgICAgICAgICAgMHg4MDAwIH0sCi0gICAgeyBBQzk3X0xJTkVJTl9WT0wsICAgICAgICAweDg4MDggfSwKLSAgICB7IEFDOTdfQ0RfVk9MLCAgICAgICAgICAgIDB4ODgwOCB9LAotICAgIHsgQUM5N19WSURFT19WT0wsICAgICAgICAgMHg4ODA4IH0sCi0gICAgeyBBQzk3X0FVWF9WT0wsICAgICAgICAgICAweDg4MDggfSwKLSAgICB7IEFDOTdfUENNT1VUX1ZPTCwgICAgICAgIDB4MDgwOCB9LAotICAgIHsgQUM5N19SRUNPUkRfU0VMRUNULCAgICAgMHgwMDAwIH0sCi0gICAgeyBBQzk3X1JFQ09SRF9HQUlOLCAgICAgICAweDBCMEIgfSwKLSAgICB7IEFDOTdfR0VORVJBTF9QVVJQT1NFLCAgIDB4MDAwMCB9LAotICAgIHsgMHhmZmZmLCAweGZmZmYgfQotfTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgQUM5NyBpbnRvIGEga25vd24gc3RhdGUuICAqLwotc3RhdGljIGludAotbm0yNTZfcmVzZXRBQzk3IChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKLSAgICBpbnQgeDsKLQotICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gcmVzZXRBQzk3IVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgLyogUmVzZXQgdGhlIG1peGVyLiAgJ1RpcyBtYWdpYyEgICovCi0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2YzAsIDEpOwotLy8gIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmNjLCAweDg3KTsJLyogVGhpcyBjcmFzaGVzIERlbGwgbGF0aXR1ZGVzICovCi0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2Y2MsIDB4ODApOwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmNjLCAweDApOwotCi0gICAgaWYgKCEgY2FyZC0+bWl4ZXJfdmFsdWVzX2luaXQpIHsKLQlmb3IgKHggPSAwOyBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW3hdLnBvcnQgIT0gMHhmZmZmOyB4KyspIHsKLQkgICAgYWM5N19wdXRfcmVnaXN0ZXIgKGRldiwKLQkJCSAgICAgICBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW3hdLnBvcnQsCi0JCQkgICAgICAgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1t4XS52YWx1ZSk7Ci0JICAgIGNhcmQtPm1peGVyX3ZhbHVlc19pbml0ID0gMTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBoZXJlOyBpdCBqdXN0IHBhc3NlcyB0aGUKLSAqIG1peGVyIGlvY3RsIHRvIHRoZSBBQzk3IGRyaXZlci4KLSAqLwotc3RhdGljIGludAotbm0yNTZfZGVmYXVsdF9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZF9mb3JfbWl4ZXIgKGRldik7Ci0gICAgaWYgKGNhcmQgIT0gTlVMTCkKLQlyZXR1cm4gYWM5N19taXhlcl9pb2N0bCAoJihjYXJkLT5tZGV2KSwgY21kLCBhcmcpOwotICAgIGVsc2UKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIG5tMjU2X21peGVyX29wZXJhdGlvbnMgPSB7Ci0JLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLmlkCT0gIk5lb01hZ2ljIiwKLQkubmFtZQk9ICJOTTI1NkFDOTdNaXhlciIsCi0JLmlvY3RsCT0gbm0yNTZfZGVmYXVsdF9taXhlcl9pb2N0bAotfTsKLQotLyoKLSAqIERlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBPU1MgbWl4ZXIuICBUaGVzZSBhcmUgc2V0IGxhc3QsIGFmdGVyIHRoZQotICogbWl4ZXIgaXMgaW5pdGlhbGl6ZWQuCi0gKgotICogSSAibG92ZSIgQyBzb21ldGltZXMuICBHb3QgYnJhY2VzPwotICovCi1zdGF0aWMgc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdCBtaXhlcl9kZWZhdWx0c1tdID0gewotICAgIHsgU09VTkRfTUlYRVJfVk9MVU1FLCAgeyB7IDg1LCA4NSB9IH0gfSwKLSAgICB7IFNPVU5EX01JWEVSX1NQRUFLRVIsIHsgeyAxMDAgfSB9IH0sCi0gICAgeyBTT1VORF9NSVhFUl9QQ00sICAgICB7IHsgNjUsIDY1IH0gfSB9LAotICAgIHsgU09VTkRfTUlYRVJfQ0QsICAgICAgeyB7IDY1LCA2NSB9IH0gfSwKLSAgICB7IC0xLCAgICAgICAgICAgICAgICAgIHsgIHsgMCwgIDAgfSB9IH0KLX07Ci0KLQotLyogSW5zdGFsbHMgdGhlIEFDOTcgbWl4ZXIgaW50byBDQVJELiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1ubTI1Nl9pbnN0YWxsX21peGVyIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpbnQgbWl4ZXI7Ci0KLSAgICBjYXJkLT5tZGV2LnJlc2V0X2RldmljZSA9IG5tMjU2X3Jlc2V0QUM5NzsKLSAgICBjYXJkLT5tZGV2LnJlYWRfcmVnID0gbm0yNTZfcmVhZEFDOTdSZWc7Ci0gICAgY2FyZC0+bWRldi53cml0ZV9yZWcgPSBubTI1Nl93cml0ZUFDOTdSZWc7Ci0gICAgY2FyZC0+bWRldi5kcml2ZXJfcHJpdmF0ZSA9ICh2b2lkICopY2FyZDsKLQotICAgIGlmIChhYzk3X2luaXQgKCYoY2FyZC0+bWRldikpKQotCXJldHVybiAtMTsKLQotICAgIG1peGVyID0gc291bmRfYWxsb2NfbWl4ZXJkZXYoKTsKLSAgICBpZiAobnVtX21peGVycyA+PSBNQVhfTUlYRVJfREVWKSB7Ci0JcHJpbnRrICgiTk0yNTYgbWl4ZXI6IFVuYWJsZSB0byBhbGxvYyBtaXhlcmRldlxuIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1peGVyX2RldnNbbWl4ZXJdID0gJm5tMjU2X21peGVyX29wZXJhdGlvbnM7Ci0gICAgY2FyZC0+bWl4ZXJfb3NzX2RldiA9IG1peGVyOwotCi0gICAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICBhYzk3X3NldF92YWx1ZXMgKCYoY2FyZC0+bWRldiksIG1peGVyX2RlZmF1bHRzKTsKLQotICAgIHByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemVkIEFDOTcgbWl4ZXJcbiIpOwotICAgIHJldHVybiAwOwotfQotCi0vKiAKLSAqIFNlZSBpZiB0aGUgc2lnbmF0dXJlIGxlZnQgYnkgdGhlIE5NMjU2IEJJT1MgaXMgaW50YWN0OyBpZiBzbywgd2UgdXNlCi0gKiB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzIGFzIHRoZSBlbmQgb2Ygb3VyIGF1ZGlvIGJ1ZmZlciBpbiB0aGUgdmlkZW8KLSAqIFJBTS4KLSAqLwotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQKLW5tMjU2X3BlZWtfZm9yX3NpZyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgdTMyIHBvcnQxb2Zmc2V0IAotCT0gY2FyZC0+cG9ydFswXS5waHlzYWRkciArIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIDB4MDQwMDsKLSAgICAvKiBUaGUgc2lnbmF0dXJlIGlzIGxvY2F0ZWQgMUsgYmVsb3cgdGhlIGVuZCBvZiB2aWRlbyBSQU0uICAqLwotICAgIGNoYXIgX19pb21lbSAqdGVtcCA9IGlvcmVtYXBfbm9jYWNoZSAocG9ydDFvZmZzZXQsIDE2KTsKLSAgICAvKiBEZWZhdWx0IGJ1ZmZlciBlbmQgaXMgNTEyMCBieXRlcyBiZWxvdyB0aGUgdG9wIG9mIFJBTS4gICovCi0gICAgdTMyIGRlZmF1bHRfdmFsdWUgPSBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgLSAweDE0MDA7Ci0gICAgdTMyIHNpZzsKLQotICAgIC8qIEluc3RhbGwgdGhlIGRlZmF1bHQgdmFsdWUgZmlyc3QsIHNvIHdlIGRvbid0IGhhdmUgdG8gcmVwZWF0ZWRseQotICAgICAgIGRvIGl0IGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4gICovCi0gICAgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0ID0gZGVmYXVsdF92YWx1ZTsKLQotICAgIGlmICh0ZW1wID09IE5VTEwpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogVW5hYmxlIHRvIHNjYW4gZm9yIGNhcmQgc2lnbmF0dXJlIGluIHZpZGVvIFJBTVxuIik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBzaWcgPSByZWFkbCAodGVtcCk7Ci0gICAgaWYgKChzaWcgJiBOTV9TSUdfTUFTSykgPT0gTk1fU0lHTkFUVVJFKSB7Ci0JdTMyIHBvaW50ZXIgPSByZWFkbCAodGVtcCArIDQpOwotCi0JLyoKLQkgKiBJZiBpdCdzIG9idmlvdXNseSBpbnZhbGlkLCBkb24ndCB1c2UgaXQgKHRoZSBwb3J0IGFscmVhZHkgaGFzIGEKLQkgKiBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHNldCkuCi0JICovCi0JaWYgKHBvaW50ZXIgIT0gMHhmZmZmZmZmZikKLQkgICAgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0ID0gcG9pbnRlcjsKLQotCXByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogRm91bmQgY2FyZCBzaWduYXR1cmUgaW4gdmlkZW8gUkFNOiAweCV4XG4iLAotCQlwb2ludGVyKTsKLSAgICB9Ci0KLSAgICBpb3VubWFwICh0ZW1wKTsKLX0KLQotLyogCi0gKiBJbnN0YWxsIGEgZHJpdmVyIGZvciB0aGUgUENJIGRldmljZSByZWZlcmVuY2VkIGJ5IFBDSURFVi4KLSAqIFZFUlNUUiBpcyBhIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gc3RyaW5nLgotICovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1ubTI1Nl9pbnN0YWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGVudW0gbm0yNTZyZXYgcmV2LCBjaGFyICp2ZXJzdHIpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQ7Ci0gICAgaW50IHg7Ci0KLSAgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkKLQkgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXJkID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgbm0yNTZfaW5mbyksIEdGUF9LRVJORUwpOwotICAgIGlmIChjYXJkID09IE5VTEwpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1Njogb3V0IG9mIG1lbW9yeSFcbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGNhcmQtPm1hZ3NpZyA9IE5NX01BR0lDX1NJRzsKLSAgICBjYXJkLT5wbGF5aW5nICA9IDA7Ci0gICAgY2FyZC0+cmVjb3JkaW5nID0gMDsKLSAgICBjYXJkLT5yZXYgPSByZXY7Ci0gICAgc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwotCi0gICAgLyogSW5pdCB0aGUgbWVtb3J5IHBvcnQgaW5mby4gICovCi0gICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgewotCWNhcmQtPnBvcnRbeF0ucGh5c2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaWRldiwgeCk7Ci0JY2FyZC0+cG9ydFt4XS5wdHIgPSBOVUxMOwotCWNhcmQtPnBvcnRbeF0uc3RhcnRfb2Zmc2V0ID0gMDsKLQljYXJkLT5wb3J0W3hdLmVuZF9vZmZzZXQgPSAwOwotICAgIH0KLQotICAgIC8qIFBvcnQgMiBpcyBlYXN5LiAgKi8KLSAgICBjYXJkLT5wb3J0WzFdLnN0YXJ0X29mZnNldCA9IDA7Ci0gICAgY2FyZC0+cG9ydFsxXS5lbmRfb2Zmc2V0ID0gTk1fUE9SVDJfU0laRTsKLQotICAgIC8qIFl1Y2suICBCdXQgd2UgaGF2ZSB0byBtYXAgaW4gcG9ydCAyIHNvIHdlIGNhbiBjaGVjayBob3cgbXVjaCBSQU0gdGhlCi0gICAgICAgY2FyZCBoYXMuICAqLwotICAgIGlmIChubTI1Nl9yZW1hcF9wb3J0cyAoY2FyZCkpIHsKLQlrZnJlZSAoY2FyZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogVGhlIE5NMjU2IGhhcyB0d28gbWVtb3J5IHBvcnRzLiAgVGhlIGZpcnN0IHBvcnQgaXMgbm90aGluZwotICAgICAqIG1vcmUgdGhhbiBhIGNodW5rIG9mIHZpZGVvIFJBTSwgd2hpY2ggaXMgdXNlZCBhcyB0aGUgSS9PIHJpbmcKLSAgICAgKiBidWZmZXIuICBUaGUgc2Vjb25kIHBvcnQgaGFzIHRoZSBhY3R1YWwganVpY3kgc3R1ZmYgKGxpa2UgdGhlCi0gICAgICogbWl4ZXIgYW5kIHRoZSBwbGF5YmFjayBlbmdpbmUgY29udHJvbCByZWdpc3RlcnMpLgotICAgICAqLwotCi0gICAgaWYgKGNhcmQtPnJldiA9PSBSRVZfTk0yNTZBVikgewotCS8qIE9rLCB0cnkgdG8gc2VlIGlmIHRoaXMgaXMgYSBub24tQUM5NyB2ZXJzaW9uIG9mIHRoZSBoYXJkd2FyZS4gKi8KLQlpbnQgcHZhbCA9IG5tMjU2X3JlYWRQb3J0MTYgKGNhcmQsIDIsIE5NX01JWEVSX1BSRVNFTkNFKTsKLQlpZiAoKHB2YWwgJiBOTV9QUkVTRU5DRV9NQVNLKSAhPSBOTV9QUkVTRU5DRV9WQUxVRSkgewotCSAgICBpZiAoISBmb3JjZV9sb2FkKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBUaGlzIGRvZXNuJ3QgbG9vayB0byBtZSBsaWtlIHRoZSBBQzk3LWNvbXBhdGlibGUgdmVyc2lvbi5cbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgWW91IGNhbiBmb3JjZSB0aGUgZHJpdmVyIHRvIGxvYWQgYnkgcGFzc2luZyBpbiB0aGUgbW9kdWxlXG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIHBhcmFtZXRlcjpcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgICAgICAgIGZvcmNlX2xvYWQgPSAxXG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiXG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIE1vcmUgbGlrZWx5LCB5b3Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBTQi0xNiBvclxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBDUzQyMzIgZHJpdmVyIGluc3RlYWQuICAoSWYgeW91ciBCSU9TIGhhcyBzZXR0aW5ncyBmb3JcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgSVJRIGFuZC9vciBETUEgZm9yIHRoZSBzb3VuZCBjYXJkLCB0aGlzIGlzICpub3QqIHRoZSBjb3JyZWN0XG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIGRyaXZlciB0byB1c2UuKVxuIik7Ci0JCW5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOwotCQlrZnJlZSAoY2FyZCk7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IEZvcmNpbmcgZHJpdmVyIGxvYWQgYXMgcGVyIHVzZXIgcmVxdWVzdC5cbiIpOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAvKiAgIHByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogQ29uZ3JhdHVsYXRpb25zLiBZb3UncmUgbm90IHJ1bm5pbmcgRXVuaWNlLlxuIikqLzsKLQl9Ci0JY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0ID0gMjU2MCAqIDEwMjQ7Ci0JY2FyZC0+aW50cm91dGluZSA9IG5tMjU2X2ludGVycnVwdDsKLQljYXJkLT5taXhlcl9zdGF0dXNfb2Zmc2V0ID0gTk1fTUlYRVJfU1RBVFVTX09GRlNFVDsKLQljYXJkLT5taXhlcl9zdGF0dXNfbWFzayA9IE5NX01JWEVSX1JFQURZX01BU0s7Ci0gICAgfSAKLSAgICBlbHNlIHsKLQkvKiBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhbnkgcmVsZXZhbnQgZGV0ZWN0IGZvciB0aGUgWlggb3Igbm90LiAgKi8KLQlpZiAobm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweGEwYikgIT0gMCkKLQkgICAgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0ID0gNjE0NCAqIDEwMjQ7Ci0JZWxzZQotCSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSA0MDk2ICogMTAyNDsKLQotCWNhcmQtPmludHJvdXRpbmUgPSBubTI1Nl9pbnRlcnJ1cHRfeng7Ci0JY2FyZC0+bWl4ZXJfc3RhdHVzX29mZnNldCA9IE5NMl9NSVhFUl9TVEFUVVNfT0ZGU0VUOwotCWNhcmQtPm1peGVyX3N0YXR1c19tYXNrID0gTk0yX01JWEVSX1JFQURZX01BU0s7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlcnRvcCA+PSA5ODMwNCAmJiBidWZmZXJ0b3AgPCBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQpCi0JY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0ID0gYnVmZmVydG9wOwotICAgIGVsc2UKLQlubTI1Nl9wZWVrX2Zvcl9zaWcgKGNhcmQpOwotCi0gICAgY2FyZC0+cG9ydFswXS5zdGFydF9vZmZzZXQgPSBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgLSA5ODMwNDsKLQotICAgIHByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogTWFwcGluZyBwb3J0IDEgZnJvbSAweCV4IC0gMHgleFxuIiwKLQkgICAgY2FyZC0+cG9ydFswXS5zdGFydF9vZmZzZXQsIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCk7Ci0KLSAgICBpZiAobm0yNTZfcmVtYXBfcG9ydHMgKGNhcmQpKSB7Ci0Ja2ZyZWUgKGNhcmQpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIFNlZSBpZiB3ZSBjYW4gZ2V0IHRoZSBpbnRlcnJ1cHQuICovCi0KLSAgICBjYXJkLT5pcnEgPSBwY2lkZXYtPmlycTsKLSAgICBjYXJkLT5oYXNfaXJxID0gMDsKLQotICAgIGlmIChubTI1Nl9ncmFiSW50ZXJydXB0IChjYXJkKSAhPSAwKSB7Ci0Jbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0Ja2ZyZWUgKGNhcmQpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIG5tMjU2X3JlbGVhc2VJbnRlcnJ1cHQgKGNhcmQpOwotCi0gICAgLyoKLSAgICAgKglJbml0IHRoZSBib2FyZC4KLSAgICAgKi8KLQotICAgIGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZSA9IDE2Mzg0OwotICAgIGNhcmQtPnJlY29yZEJ1ZmZlclNpemUgPSAxNjM4NDsKLQotICAgIGNhcmQtPmNvZWZmQnVmID0gY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gTk1fTUFYX0NPRUZGSUNJRU5UOwotICAgIGNhcmQtPmFidWYyID0gY2FyZC0+Y29lZmZCdWYgLSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplOwotICAgIGNhcmQtPmFidWYxID0gY2FyZC0+YWJ1ZjIgLSBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemU7Ci0gICAgY2FyZC0+YWxsQ29lZmZCdWYgPSBjYXJkLT5hYnVmMiAtIChOTV9UT1RBTF9DT0VGRl9DT1VOVCAqIDQpOwotCi0gICAgLyogRml4ZWQgc2V0dGluZy4gKi8KLSAgICBjYXJkLT5taXhlciA9IE5NX01JWEVSX09GRlNFVDsKLSAgICBjYXJkLT5taXhlcl92YWx1ZXNfaW5pdCA9IDA7Ci0KLSAgICBjYXJkLT5pc19vcGVuX3BsYXkgPSAwOwotICAgIGNhcmQtPmlzX29wZW5fcmVjb3JkID0gMDsKLQotICAgIGNhcmQtPmNvZWZmc0N1cnJlbnQgPSAwOwotCi0gICAgY2FyZC0+b3BlbmNudFswXSA9IDA7IGNhcmQtPm9wZW5jbnRbMV0gPSAwOwotCi0gICAgLyogUmVhc29uYWJsZSBkZWZhdWx0IHNldHRpbmdzLCBidXQgbGFyZ2VseSB1bm5lY2Vzc2FyeS4gKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0JY2FyZC0+c2luZm9beF0uYml0cyA9IDg7Ci0JY2FyZC0+c2luZm9beF0uc3RlcmVvID0gMDsKLQljYXJkLT5zaW5mb1t4XS5zYW1wbGVyYXRlID0gODAwMDsKLSAgICB9Ci0KLSAgICBubTI1Nl9pbml0SHcgKGNhcmQpOwotCi0gICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgewotCWlmICgoY2FyZC0+ZGV2W3hdID0KLQkgICAgIHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoQVVESU9fRFJJVkVSX1ZFUlNJT04sCi0JCQkJICAgICJOTTI1NiIsICZubTI1Nl9hdWRpb19kcml2ZXIsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSwKLQkJCQkgICAgRE1BX05PRE1BLCBBRk1UX1U4IHwgQUZNVF9TMTZfTEUsCi0JCQkJICAgIE5VTEwsIC0xLCAtMSkpID49IDApIHsKLQkgICAgLyogMUsgbWluaW11bSBidWZmZXIgc2l6ZS4gKi8KLQkgICAgYXVkaW9fZGV2c1tjYXJkLT5kZXZbeF1dLT5taW5fZnJhZ21lbnQgPSAxMDsKLQkgICAgLyogTWF4aW11bSBvZiA4SyBidWZmZXIgc2l6ZS4gKi8KLQkgICAgYXVkaW9fZGV2c1tjYXJkLT5kZXZbeF1dLT5tYXhfZnJhZ21lbnQgPSAxMzsKLQl9Ci0JZWxzZSB7Ci0JICAgIHByaW50ayhLRVJOX0VSUiAiTk0yNTY6IFRvbyBtYW55IFBDTSBkZXZpY2VzIGF2YWlsYWJsZVxuIik7Ci0JICAgIG5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOwotCSAgICBrZnJlZSAoY2FyZCk7Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgICBwY2lfc2V0X2RydmRhdGEocGNpZGV2LGNhcmQpOwotCi0gICAgLyogSW5zZXJ0IHRoZSBjYXJkIGluIHRoZSBsaXN0LiAgKi8KLSAgICBjYXJkLT5uZXh0X2NhcmQgPSBubWNhcmRfbGlzdDsKLSAgICBubWNhcmRfbGlzdCA9IGNhcmQ7Ci0KLSAgICBwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXplZCBOZW9NYWdpYyAlcyBhdWRpbyBpbiBQQ0kgbmF0aXZlIG1vZGVcbiIsCi0JICAgdmVyc3RyKTsKLQotICAgIC8qIAotICAgICAqIEFuZCBvdXIgbWl4ZXIuICAoV2Ugc2hvdWxkIGFsbG93IHN1cHBvcnQgZm9yIG90aGVyIG1peGVycywgbWF5YmUuKQotICAgICAqLwotCi0gICAgbm0yNTZfaW5zdGFsbF9taXhlciAoY2FyZCk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotbm0yNTZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldixjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCi17Ci0gICAgaWYgKHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTykKLQlyZXR1cm4gbm0yNTZfaW5zdGFsbChwY2lkZXYsIFJFVl9OTTI1NkFWLCAiMjU2QVYiKTsKLSAgICBpZiAocGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlpYX0FVRElPKQotCXJldHVybiBubTI1Nl9pbnN0YWxsKHBjaWRldiwgUkVWX05NMjU2WlgsICIyNTZaWCIpOwotICAgIGlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTykKLQlyZXR1cm4gbm0yNTZfaW5zdGFsbChwY2lkZXYsIFJFVl9OTTI1NlpYLCAiMjU2WEwrIik7Ci0gICAgcmV0dXJuIC0xOyAvKiBzaG91bGQgbm90IGNvbWUgaGVyZSAuLi4gKi8KLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0Ci1ubTI1Nl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikgewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICp4Y2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOwotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCpuZXh0X2NhcmQgPSBOVUxMOwotCi0gICAgZm9yIChjYXJkID0gbm1jYXJkX2xpc3Q7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IG5leHRfY2FyZCkgewotCW5leHRfY2FyZCA9IGNhcmQtPm5leHRfY2FyZDsKLQlpZiAoY2FyZCA9PSB4Y2FyZCkgewotCSAgICBzdG9wUGxheSAoY2FyZCk7Ci0JICAgIHN0b3BSZWNvcmQgKGNhcmQpOwotCSAgICBpZiAoY2FyZC0+aGFzX2lycSkKLQkJZnJlZV9pcnEgKGNhcmQtPmlycSwgY2FyZCk7Ci0JICAgIG5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOwotCSAgICBzb3VuZF91bmxvYWRfbWl4ZXJkZXYgKGNhcmQtPm1peGVyX29zc19kZXYpOwotCSAgICBzb3VuZF91bmxvYWRfYXVkaW9kZXYgKGNhcmQtPmRldlswXSk7Ci0JICAgIHNvdW5kX3VubG9hZF9hdWRpb2RldiAoY2FyZC0+ZGV2WzFdKTsKLQkgICAga2ZyZWUgKGNhcmQpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotICAgIGlmIChubWNhcmRfbGlzdCA9PSBjYXJkKQotICAgIAlubWNhcmRfbGlzdCA9IG5leHRfY2FyZDsKLX0KLQotLyoKLSAqIE9wZW4gdGhlIGRldmljZQotICoKLSAqIERFViAgLSBkZXZpY2UKLSAqIE1PREUgLSBtb2RlIHRvIG9wZW4gZGV2aWNlIChsb2dpY2FsIE9SIG9mIE9QRU5fUkVBRCBhbmQgT1BFTl9XUklURSkKLSAqCi0gKiBDYWxsZWQgd2hlbiBvcGVuaW5nIHRoZSBETUFidWYgICAgICAgICAgICAgICAoZG1hYnVmLmM6MjU5KQotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9hdWRpb19vcGVuKGludCBkZXYsIGludCBtb2RlKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotICAgIGludCB3OwotCQotICAgIGlmIChjYXJkID09IE5VTEwpCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoY2FyZC0+ZGV2WzBdID09IGRldikKLQl3ID0gMDsKLSAgICBlbHNlIGlmIChjYXJkLT5kZXZbMV0gPT0gZGV2KQotCXcgPSAxOwotICAgIGVsc2UKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmIChjYXJkLT5vcGVuY250W3ddID4gMCkKLQlyZXR1cm4gLUVCVVNZOwotCi0gICAgLyogTm8gYml0cyBzZXQ/IEh1aD8gKi8KLSAgICBpZiAoISAoKG1vZGUgJiBPUEVOX1JFQUQpIHx8IChtb2RlICYgT1BFTl9XUklURSkpKQotCXJldHVybiAtRUlPOwotCi0gICAgLyoKLSAgICAgKiBJZiBpdCdzIG9wZW4gZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUsIGFuZCB0aGUgY2FyZCdzIGN1cnJlbnRseQotICAgICAqIGJlaW5nIHJlYWQgb3Igd3JpdHRlbiB0bywgdGhlbiBkbyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBoYXMKLSAgICAgKiBhbHJlYWR5IGJlZW4gZG9uZS4gIE90aGVyd2lzZSwgZG9uJ3Qgc3BlY2lmeSBhbnkgbW9kZSB1bnRpbCB0aGUKLSAgICAgKiB1c2VyIGFjdHVhbGx5IHRyaWVzIHRvIGRvIEkvTy4gIChTb21lIHByb2dyYW1zIG9wZW4gdGhlIGRldmljZQotICAgICAqIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLCBidXQgb25seSBhY3R1YWxseSBkbyByZWFkaW5nIG9yIHdyaXRpbmcuKQotICAgICAqLwotCi0gICAgaWYgKChtb2RlICYgT1BFTl9XUklURSkgJiYgKG1vZGUgJiBPUEVOX1JFQUQpKSB7Ci0JaWYgKGNhcmQtPmlzX29wZW5fcGxheSkKLQkgICAgbW9kZSA9IE9QRU5fV1JJVEU7Ci0JZWxzZSBpZiAoY2FyZC0+aXNfb3Blbl9yZWNvcmQpCi0JICAgIG1vZGUgPSBPUEVOX1JFQUQ7Ci0JZWxzZSBtb2RlID0gMDsKLSAgICB9Ci0JCi0gICAgaWYgKG1vZGUgJiBPUEVOX1dSSVRFKSB7Ci0JaWYgKGNhcmQtPmlzX29wZW5fcGxheSA9PSAwKSB7Ci0JICAgIGNhcmQtPmRldl9mb3JfcGxheSA9IGRldjsKLQkgICAgY2FyZC0+aXNfb3Blbl9wbGF5ID0gMTsKLQl9Ci0JZWxzZQotCSAgICByZXR1cm4gLUVCVVNZOwotICAgIH0KLQotICAgIGlmIChtb2RlICYgT1BFTl9SRUFEKSB7Ci0JaWYgKGNhcmQtPmlzX29wZW5fcmVjb3JkID09IDApIHsKLQkgICAgY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPSBkZXY7Ci0JICAgIGNhcmQtPmlzX29wZW5fcmVjb3JkID0gMTsKLQl9Ci0JZWxzZQotCSAgICByZXR1cm4gLUVCVVNZOwotICAgIH0KLQotICAgIGNhcmQtPm9wZW5jbnRbd10rKzsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIENsb3NlIHRoZSBkZXZpY2UKLSAqCi0gKiBERVYgIC0gZGV2aWNlCi0gKgotICogQ2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgRE1BYnVmICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjQ3NykKLSAqICAgICAgYWZ0ZXIgaGFsdF94ZmVyCi0gKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9hdWRpb19jbG9zZShpbnQgZGV2KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCQotICAgIGlmIChjYXJkICE9IE5VTEwpIHsKLQlpbnQgdzsKLQotCWlmIChjYXJkLT5kZXZbMF0gPT0gZGV2KQotCSAgICB3ID0gMDsKLQllbHNlIGlmIChjYXJkLT5kZXZbMV0gPT0gZGV2KQotCSAgICB3ID0gMTsKLQllbHNlCi0JICAgIHJldHVybjsKLQotCWNhcmQtPm9wZW5jbnRbd10tLTsKLQlpZiAoY2FyZC0+b3BlbmNudFt3XSA8PSAwKSB7Ci0JICAgIGNhcmQtPm9wZW5jbnRbd10gPSAwOwotCi0JICAgIGlmIChjYXJkLT5kZXZfZm9yX3BsYXkgPT0gZGV2KSB7Ci0JCXN0b3BQbGF5IChjYXJkKTsKLQkJY2FyZC0+aXNfb3Blbl9wbGF5ID0gMDsKLQkJY2FyZC0+ZGV2X2Zvcl9wbGF5ID0gLTE7Ci0JICAgIH0KLQotCSAgICBpZiAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPT0gZGV2KSB7Ci0JCXN0b3BSZWNvcmQgKGNhcmQpOwotCQljYXJkLT5pc19vcGVuX3JlY29yZCA9IDA7Ci0JCWNhcmQtPmRldl9mb3JfcmVjb3JkID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBTdGFuZGFyZCBpb2N0bCBoYW5kbGVyLiAqLwotc3RhdGljIGludAotbm0yNTZfYXVkaW9faW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLSAgICBpbnQgcmV0OwotICAgIHUzMiBvbGRpbmZvOwotICAgIGludCB3OwotCi0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCA9PSBOVUxMKQotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKGRldiA9PSBjYXJkLT5kZXZbMF0pCi0JdyA9IDA7Ci0gICAgZWxzZQotCXcgPSAxOwotCi0gICAgLyogCi0gICAgICogVGhlIGNvZGUgaGVyZSBpcyBtZXNzeS4gIFRoZXJlIGFyZSBwcm9iYWJseSBiZXR0ZXIgd2F5cyB0byBkbwotICAgICAqIGl0LiAgKEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IHRoZSBBQzk3IG1peGVyIAotICAgICAqIGlzIGRvbmUuKQotICAgICAqLwotICAgIHN3aXRjaCAoY21kKQotCXsKLQljYXNlIFNPVU5EX1BDTV9XUklURV9SQVRFOgotCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCSAgICBpZiAocmV0ICE9IDApIHsKLQkJb2xkaW5mbyA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7Ci0JCWNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGUgPSByZXQ7Ci0JCXJldCA9IG5tMjU2X3NldEluZm8oZGV2LCBjYXJkKTsKLQkJaWYgKHJldCAhPSAwKQotCQkgICAgY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZSA9IG9sZGluZm87Ci0JICAgIH0KLQkgICAgaWYgKHJldCA9PSAwKQotCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOwotCSAgICBicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKLQkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOgotCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCSAgICBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gPSByZXQgPyAxIDogMDsKLQkgICAgcmV0ID0gbm0yNTZfc2V0SW5mbyAoZGV2LCBjYXJkKTsKLQkgICAgaWYgKHJldCA9PSAwKQotCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW87Ci0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMUzoKLQkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkgICAgaWYgKHJldCA8IDEgfHwgcmV0ID4gMykKLQkJcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvICsgMTsKLQkgICAgZWxzZSB7Ci0JCWNhcmQtPnNpbmZvW3ddLnN0ZXJlbyA9IHJldCAtIDE7Ci0JCXJldCA9IG5tMjU2X3NldEluZm8gKGRldiwgY2FyZCk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyArIDE7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgotCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gKyAxOwotCSAgICBicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6Ci0JICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JICAgIGlmIChyZXQgIT0gMCkgewotCQlvbGRpbmZvID0gY2FyZC0+c2luZm9bd10uYml0czsKLQkJY2FyZC0+c2luZm9bd10uYml0cyA9IHJldDsKLQkJcmV0ID0gbm0yNTZfc2V0SW5mbyAoZGV2LCBjYXJkKTsKLQkJaWYgKHJldCAhPSAwKQotCQkgICAgY2FyZC0+c2luZm9bd10uYml0cyA9IG9sZGluZm87Ci0JICAgIH0KLQkgICAgaWYgKHJldCA9PSAwKQotCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5iaXRzOwotCSAgICBicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uYml0czsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICByZXR1cm4gLUVJTlZBTDsKLQl9Ci0gICAgcmV0dXJuIHB1dF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKTsKLX0KLQotLyoKLSAqIEdpdmVuIHRoZSBzb3VuZCBkZXZpY2UgREVWIGFuZCBhbiBhc3NvY2lhdGVkIHBoeXNpY2FsIGJ1ZmZlciBQSFlTQlVGLCAKLSAqIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBidWZmZXIgaW4ga2VybmVsIHNwYWNlLiAKLSAqCi0gKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGV4aXN0IGFzIHBhcnQgb2YgdGhlIHNvdW5kY29yZSByb3V0aW5lcy4KLSAqLwotCi1zdGF0aWMgY2hhciAqCi1ubTI1Nl9nZXRETUFidWZmZXIgKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2J1ZikKLXsKLSAgICBzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKLSAgICBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OwotICAgIGNoYXIgKmRtYV9zdGFydCA9Ci0JKGNoYXIgKikocGh5c2J1ZiAtICh1bnNpZ25lZCBsb25nKWRtYXAtPnJhd19idWZfcGh5cyAKLQkJICsgKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1Zik7Ci0KLSAgICByZXR1cm4gZG1hX3N0YXJ0OwotfQotCi0KLS8qCi0gKiBPdXRwdXQgYSBibG9jayB0byBzb3VuZCBkZXZpY2UKLSAqCi0gKiBkZXYgICAgICAgICAgLSBkZXZpY2UgbnVtYmVyCi0gKiBidWYgICAgICAgICAgLSBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlcgotICogdG90YWxfY291bnQgIC0gdG90YWwgYnl0ZSBjb3VudCBpbiBidWZmZXIKLSAqIGludHJmbGFnICAgICAtIHNldCBpZiB0aGlzIGhhcyBiZWVuIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCAKLSAqCQkJCSAgKHZpYSBETUFidWZfb3V0cHV0aW50cikKLSAqIHJlc3RhcnRfZG1hICAtIHNldCBpZiBlbmdpbmUgbmVlZHMgdG8gYmUgcmUtaW5pdGlhbGlzZWQKLSAqCi0gKiBDYWxsZWQgd2hlbjoKLSAqICAxLiBTdGFydGluZyBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjEzMjcpCi0gKiAgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzoxNTA0KQotICogIDMuIEEgbmV3IGJ1ZmZlciBuZWVkcyB0byBiZSBzZW50IHRvIHRoZSBkZXZpY2UgICAgICAoZG1hYnVmLmM6MTU3OSkKLSAqLwotc3RhdGljIHZvaWQKLW5tMjU2X2F1ZGlvX291dHB1dF9ibG9jayhpbnQgZGV2LCB1bnNpZ25lZCBsb25nIHBoeXNidWYsCi0JCQkJICAgICAgIGludCB0b3RhbF9jb3VudCwgaW50IGludHJmbGFnKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgIT0gTlVMTCkgewotCWNoYXIgKmRtYV9idWYgPSBubTI1Nl9nZXRETUFidWZmZXIgKGRldiwgcGh5c2J1Zik7Ci0JY2FyZC0+aXNfb3Blbl9wbGF5ID0gMTsKLQljYXJkLT5kZXZfZm9yX3BsYXkgPSBkZXY7Ci0Jbm0yNTZfd3JpdGVfYmxvY2sgKGNhcmQsIGRtYV9idWYsIHRvdGFsX2NvdW50KTsKLSAgICB9Ci19Ci0KLS8qIERpdHRvLCBidXQgZG8gcmVjb3JkaW5nIGluc3RlYWQuICAqLwotc3RhdGljIHZvaWQKLW5tMjU2X2F1ZGlvX3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2J1ZiwgaW50IGNvdW50LAotCQkJaW50IGludHJmbGFnKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgIT0gTlVMTCkgewotCWNoYXIgKmRtYV9idWYgPSBubTI1Nl9nZXRETUFidWZmZXIgKGRldiwgcGh5c2J1Zik7Ci0JY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAxOwotCWNhcmQtPmRldl9mb3JfcmVjb3JkID0gZGV2OwotCW5tMjU2X3N0YXJ0UmVjb3JkaW5nIChjYXJkLCBkbWFfYnVmLCBjb3VudCk7Ci0gICAgfQotfQotCi0vKiAKLSAqIFByZXBhcmUgZm9yIGlucHV0dGluZyBzYW1wbGVzIHRvIERFVi4gCi0gKiBFYWNoIHJlcXVlc3RlZCBidWZmZXIgd2lsbCBiZSBCU0laRSBieWVzIGxvbmcsIHdpdGggYSB0b3RhbCBvZgotICogQkNPVU5UIGJ1ZmZlcnMuIAotICovCi0KLXN0YXRpYyBpbnQKLW5tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQotICAgIGlmIChjYXJkID09IE5VTEwpIAotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKGNhcmQtPmlzX29wZW5fcmVjb3JkICYmIGNhcmQtPmRldl9mb3JfcmVjb3JkICE9IGRldikKLQlyZXR1cm4gLUVCVVNZOwotCi0gICAgYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5mbGFncyB8PSBETUFfTk9ETUE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcmVwYXJlIGZvciBvdXRwdXR0aW5nIHNhbXBsZXMgdG8gYGRldicKLSAqCi0gKiBFYWNoIGJ1ZmZlciB0aGF0IHdpbGwgYmUgcGFzc2VkIHdpbGwgYmUgYGJzaXplJyBieXRlcyBsb25nLAotICogd2l0aCBhIHRvdGFsIG9mIGBiY291bnQnIGJ1ZmZlcnMuCi0gKgotICogQ2FsbGVkIHdoZW46Ci0gKiAgMS4gQSB0cmlnZ2VyIGVuYWJsZXMgYXVkaW8gb3V0cHV0ICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzo5NzgpCi0gKiAgMi4gV2UgZ2V0IGEgd3JpdGUgYnVmZmVyIHdpdGhvdXQgZG1hX21vZGUgc2V0dXAgICAgIChkbWFidWYuYzoxMTUyKQotICogIDMuIFdlIHJlc3RhcnQgYSB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6MTMyNCkKLSAqLwotCi1zdGF0aWMgaW50Ci1ubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgPT0gTlVMTCkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmIChjYXJkLT5pc19vcGVuX3BsYXkgJiYgY2FyZC0+ZGV2X2Zvcl9wbGF5ICE9IGRldikKLQlyZXR1cm4gLUVCVVNZOwotCi0gICAgYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZmxhZ3MgfD0gRE1BX05PRE1BOwotICAgIHJldHVybiAwOwotfQotCi0vKiBTdG9wIHRoZSBjdXJyZW50IG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIERFVi4gICovCi1zdGF0aWMgdm9pZAotbm0yNTZfYXVkaW9fcmVzZXQoaW50IGRldikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQotICAgIGlmIChjYXJkICE9IE5VTEwpIHsKLQlpZiAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGRldikKLQkgICAgc3RvcFBsYXkgKGNhcmQpOwotCWlmIChjYXJkLT5kZXZfZm9yX3JlY29yZCA9PSBkZXYpCi0JICAgIHN0b3BSZWNvcmQgKGNhcmQpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotbm0yNTZfYXVkaW9fbG9jYWxfcWxlbihpbnQgZGV2KQotewotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBubTI1Nl9hdWRpb19kcml2ZXIgPQotewotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCQk9IG5tMjU2X2F1ZGlvX29wZW4sCi0JLmNsb3NlCQkJPSBubTI1Nl9hdWRpb19jbG9zZSwKLQkub3V0cHV0X2Jsb2NrCQk9IG5tMjU2X2F1ZGlvX291dHB1dF9ibG9jaywKLQkuc3RhcnRfaW5wdXQJCT0gbm0yNTZfYXVkaW9fc3RhcnRfaW5wdXQsCi0JLmlvY3RsCQkJPSBubTI1Nl9hdWRpb19pb2N0bCwKLQkucHJlcGFyZV9mb3JfaW5wdXQJPSBubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKLQkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAotCS5oYWx0X2lvCQk9IG5tMjU2X2F1ZGlvX3Jlc2V0LAotCS5sb2NhbF9xbGVuCQk9IG5tMjU2X2F1ZGlvX2xvY2FsX3FsZW4sCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbm0yNTZfcGNpX3RibFtdID0gewotCXtQQ0lfVkVORE9SX0lEX05FT01BR0lDLCBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2QVZfQVVESU8sCi0JUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTywKLQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9ORU9NQUdJQywgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlhMX1BMVVNfQVVESU8sCi0JUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMH0sCi0JezAsfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBubTI1Nl9wY2lfdGJsKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbm0yNTZfcGNpX2RyaXZlciA9IHsKLQkubmFtZQkJPSAibm0yNTZfYXVkaW8iLAotCS5pZF90YWJsZQk9IG5tMjU2X3BjaV90YmwsCi0JLnByb2JlCQk9IG5tMjU2X3Byb2JlLAotCS5yZW1vdmUJCT0gbm0yNTZfcmVtb3ZlLAotfTsKLQotbW9kdWxlX3BhcmFtKHVzZWNhY2hlLCBib29sLCAwKTsKLW1vZHVsZV9wYXJhbShidWZmZXJ0b3AsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0obm0yNTZfZGVidWcsIGJvb2wsIDA2NDQpOwotbW9kdWxlX3BhcmFtKGZvcmNlX2xvYWQsIGJvb2wsIDApOwotCi1zdGF0aWMgaW50IF9faW5pdCBkb19pbml0X25tMjU2KHZvaWQpCi17Ci0gICAgcHJpbnRrIChLRVJOX0lORk8gIk5lb01hZ2ljIDI1NkFWLzI1NlpYIGF1ZGlvIGRyaXZlciwgdmVyc2lvbiAxLjFwXG4iKTsKLSAgICByZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbm0yNTZfcGNpX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX25tMjU2ICh2b2lkKQotewotICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbm0yNTZfcGNpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGRvX2luaXRfbm0yNTYpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9ubTI1Nik7Ci0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2X2NvZWZmLmggYi9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjMDdmMy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2OTcgKzAsMCBAQAotI2lmbmRlZiBOTTI1Nl9DT0VGRl9ICi0jZGVmaW5lIE5NMjU2X0NPRUZGX0gKLQotI2RlZmluZSBOTV9UT1RBTF9DT0VGRl9DT1VOVCAweDMxNTgKLQotc3RhdGljIGNoYXIgY29lZmZpY2llbnRzW05NX1RPVEFMX0NPRUZGX0NPVU5UICogNF0gPSB7IAotCTB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QTUsIDB4MDEsIDB4RUYsIDB4RkMsIDB4MjEsCi0JMHgwNSwgMHg4NywgMHhGNywgMHg2MiwgMHgxMSwgMHhFOSwgMHg0NSwgMHg1RSwgMHhGOSwgMHhCNSwgMHgwMSwKLQkweERFLCAweEZGLCAweEE0LCAweEZGLCAweDYwLCAweDAwLCAweENBLCAweEZGLCAweDBELCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsCi0JMHg0QywgMHhGMywgMHhFRCwgMHgyMCwgMHgzRCwgMHgzRCwgMHg0QSwgMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwKLQkweEZELCAweEUxLCAweDAwLCAweEMzLCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweEZELCAweEZGLAotCTB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsCi0JMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywKLQkweEFBLCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDAyLCAweDAwLCAweDA1LAotCTB4MDAsIDB4QzMsIDB4RkYsIDB4RTEsIDB4MDAsIDB4QjEsIDB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsCi0JMHgzRCwgMHgzRCwgMHhFRCwgMHgyMCwgMHg0QywgMHhGMywgMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENBLCAweEZGLAotCTB4NjAsIDB4MDAsIDB4QTQsIDB4RkYsIDB4REUsIDB4RkYsIDB4QjUsIDB4MDEsIDB4NUUsIDB4RjksIDB4RTksCi0JMHg0NSwgMHg2MiwgMHgxMSwgMHg4NywgMHhGNywgMHgyMSwgMHgwNSwgMHhFRiwgMHhGQywgMHhBNSwgMHgwMSwKLQkweDRCLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LAotCTB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsCi0JMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwKLQkweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLAotCTB4Q0EsIDB4MDEsIDB4OTUsIDB4RkMsIDB4RUEsIDB4MDUsIDB4QkIsIDB4RjUsIDB4MjUsIDB4MTcsIDB4M0MsCi0JMHg0MywgMHg4RCwgMHhGNiwgMHg0MywgMHgwMywgMHhGNSwgMHhGRSwgMHgyNiwgMHgwMCwgMHgyMCwgMHgwMCwKLQkweEUyLCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRELCAweEZGLCAweEM1LAotCTB4MDEsIDB4NEMsIDB4RkMsIDB4MjYsIDB4MDcsIDB4QTMsIDB4RjEsIDB4QUIsIDB4MkMsIDB4QkIsIDB4MzMsCi0JMHg4RiwgMHhGMSwgMHhDQSwgMHgwNiwgMHhBNiwgMHhGQywgMHg4NSwgMHgwMSwgMHg2RiwgMHhGRiwgMHgyNCwKLQkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZFLCAweEZGLCAweEQ1LCAweEZGLCAweEJDLCAweDAwLAotCTB4RjAsIDB4RkQsIDB4RUMsIDB4MDQsIDB4RDksIDB4RjMsIDB4QjEsIDB4M0UsIDB4Q0QsIDB4MUUsIDB4QzEsCi0JMHhGMywgMHhBRiwgMHgwNiwgMHg0OSwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLCAweEU5LCAweEZFLCAweDM4LAotCTB4MDEsIDB4NEIsIDB4RkYsIDB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsIDB4MEEsIDB4MkUsIDB4RkEsCi0JMHhERiwgMHgwMywgMHg4QSwgMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweDk4LCAweDAxLCAweDBELCAweEZELAotCTB4RTAsIDB4MDQsIDB4MTQsIDB4RjgsIDB4QzMsIDB4MEYsIDB4ODksIDB4NDYsIDB4NEMsIDB4RkEsIDB4MzgsCi0JMHgwMSwgMHgyNSwgMHgwMCwgMHg3RCwgMHhGRiwgMHg3MywgMHgwMCwgMHhDMiwgMHhGRiwgMHgwRiwgMHgwMCwKLQkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDBGLAotCTB4MDcsIDB4ODQsIDB4RjIsIDB4MjksIDB4MjUsIDB4MUEsIDB4M0EsIDB4NjcsIDB4RjIsIDB4RjYsIDB4MDUsCi0JMHg0MSwgMHhGRCwgMHgyNCwgMHgwMSwgMHhBMSwgMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDE1LCAweDAwLCAweDk3LCAweEZGLCAweDM3LCAweDAxLCAweDIyLCAweEZELCAweDIzLCAweDA2LAotCTB4MkYsIDB4RjIsIDB4MTEsIDB4MzksIDB4N0IsIDB4MjYsIDB4NTAsIDB4RjIsIDB4MUIsIDB4MDcsIDB4MzIsCi0JMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEM4LCAweEZGLCAweDY0LCAweDAwLCAweDlCLCAweEZGLCAweEVFLCAweEZGLCAweDk4LCAweDAxLCAweDkzLAotCTB4RjksIDB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsIDB4QTcsIDB4RjcsIDB4MTIsIDB4MDUsIDB4RjYsIDB4RkMsCi0JMHhBMiwgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwKLQkweDAwLCAweDZBLCAweEZGLCAweDUzLCAweDAxLCAweEE2LCAweEZELCAweEE2LCAweDAzLCAweEExLCAweEZBLAotCTB4REUsIDB4MDgsIDB4NzYsIDB4NDgsIDB4MEMsIDB4RkYsIDB4REUsIDB4RkUsIDB4NzMsIDB4MDEsIDB4QzksCi0JMHhGRSwgMHhDQSwgMHgwMCwgMHhBMCwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEUxLCAweDAxLCAweDUyLCAweEZDLCAweDkzLCAweDA2LCAweDEwLCAweEY0LCAweDc4LAotCTB4MUQsIDB4OTAsIDB4M0YsIDB4M0UsIDB4RjQsIDB4QUEsIDB4MDQsIDB4MTksIDB4RkUsIDB4QTQsIDB4MDAsCi0JMHhFMiwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2OCwKLQkweEZGLCAweDkzLCAweDAxLCAweDkyLCAweEZDLCAweEUyLCAweDA2LCAweDgzLCAweEYxLCAweDhDLCAweDMyLAotCTB4RUQsIDB4MkQsIDB4OTAsIDB4RjEsIDB4MUUsIDB4MDcsIDB4NTcsIDB4RkMsIDB4QkQsIDB4MDEsIDB4NTEsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMiwgMHgwMCwKLQkweDQyLCAweDAwLCAweEM0LCAweEZFLCAweDk0LCAweDAzLCAweDAyLCAweEY2LCAweDg5LCAweDQyLCAweDc2LAotCTB4MTgsIDB4NUMsIDB4RjUsIDB4MTIsIDB4MDYsIDB4ODQsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgwMywgMHgwMSwgMHg1MywKLQkweEZFLCAweDUzLCAweDAyLCAweDM5LCAweEZELCAweEE5LCAweDAyLCAweEYyLCAweDQ4LCAweEI5LCAweDA0LAotCTB4NTQsIDB4RkMsIDB4Q0EsIDB4MDIsIDB4MTYsIDB4RkUsIDB4MjAsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MjAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwgMHhDMywgMHgwMSwKLQkweEE3LCAweEZDLCAweEMwLCAweDA1LCAweDFFLCAweEY2LCAweEQ4LCAweDE1LCAweEU3LCAweDQzLCAweDIwLAotCTB4RjcsIDB4RUYsIDB4MDIsIDB4MjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkUsIDB4MDAsIDB4REQsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OCwgMHhGRiwgMHhDRCwgMHgwMSwgMHg0MywKLQkweEZDLCAweDJBLCAweDA3LCAweEJDLCAweEYxLCAweDY0LCAweDJCLCAweEUzLCAweDM0LCAweEEzLCAweEYxLAotCTB4QUUsIDB4MDYsIDB4QkQsIDB4RkMsIDB4NzcsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHhDQSwgMHhGRiwgMHhENCwgMHgwMCwgMHhDOCwgMHhGRCwKLQkweDJBLCAweDA1LCAweDdELCAweEYzLCAweENBLCAweDNELCAweDIyLCAweDIwLCAweDc2LCAweEYzLCAweEM4LAotCTB4MDYsIDB4NDEsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxNCwgMHgwMCwgMHhBQywgMHhGRiwgMHhBQywgMHgwMCwgMHgwOCwgMHhGRiwgMHhGRCwgMHgwMCwgMHhCNSwKLQkweEZGLCAweDRCLCAweEZELCAweEY0LCAweDQ3LCAweDMwLCAweDBCLCAweEJDLCAweEY5LCAweDE3LCAweDA0LAotCTB4NkUsIDB4RkQsIDB4NkQsIDB4MDEsIDB4NjAsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgyQywgMHgwMCwgMHg1NCwgMHhGRiwgMHg4RCwgMHgwMSwgMHgyNiwgMHhGRCwgMHhBRCwgMHgwNCwKLQkweDgyLCAweEY4LCAweDg3LCAweDBFLCAweEY5LCAweDQ2LCAweDBDLCAweEZCLCAweEQ0LCAweDAwLCAweDVELAotCTB4MDAsIDB4NUUsIDB4RkYsIDB4ODIsIDB4MDAsIDB4QkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywgMHgwMSwgMHgwNywgMHhCRSwKLQkweEYyLCAweEQ2LCAweDIzLCAweDFGLCAweDNCLCAweEE1LCAweEYyLCAweEM1LCAweDA1LCAweDYyLCAweEZELAotCTB4MTAsIDB4MDEsIDB4QUIsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTksCi0JMHgwMCwgMHg4RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHgwNCwgMHhGRCwgMHg0RCwgMHgwNiwgMHgwMCwgMHhGMiwKLQkweEZFLCAweDM3LCAweENCLCAweDI3LCAweDIxLCAweEYyLCAweDIzLCAweDA3LCAweDM0LCAweEZDLCAweERELAotCTB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4Q0UsIDB4RkYsCi0JMHg1NiwgMHgwMCwgMHhCOSwgMHhGRiwgMHhCOCwgMHhGRiwgMHhGNywgMHgwMSwgMHhFMiwgMHhGOCwgMHg4RCwKLQkweDQ1LCAweDQ2LCAweDEyLCAweDNDLCAweEY3LCAweDQzLCAweDA1LCAweERGLCAweEZDLCAweEFDLCAweDAxLAotCTB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzAsCi0JMHhGRiwgMHg0NiwgMHgwMSwgMHhDMywgMHhGRCwgMHg2RCwgMHgwMywgMHgxNCwgMHhGQiwgMHhCRSwgMHgwNywKLQkweEE2LCAweDQ4LCAweEY4LCAweEZGLCAweDcwLCAweEZFLCAweEFFLCAweDAxLCAweEFBLCAweEZFLCAweEQ5LAotCTB4MDAsIDB4OUEsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhERSwgMHgwMSwgMHg1RCwgMHhGQywgMHg3NCwgMHgwNiwgMHg2MywgMHhGNCwgMHgyMywgMHgxQywgMHg2NiwKLQkweDQwLCAweEFBLCAweEY0LCAweDY1LCAweDA0LCAweDQ0LCAweEZFLCAweDhCLCAweDAwLCAweEVFLCAweEZGLAotCTB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4OUYsCi0JMHgwMSwgMHg4MCwgMHhGQywgMHhGNywgMHgwNiwgMHg3RCwgMHhGMSwgMHg1QSwgMHgzMSwgMHgyQywgMHgyRiwKLQkweDgzLCAweEYxLCAweDEzLCAweDA3LCAweDY0LCAweEZDLCAweEIzLCAweDAxLCAweDU3LCAweEZGLCAweDJDLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4NUQsIDB4MDAsCi0JMHg5NSwgMHhGRSwgMHhFMiwgMHgwMywgMHg3RiwgMHhGNSwgMHhDQywgMHg0MSwgMHhDNywgMHgxOSwgMHhGRiwKLQkweEY0LCAweDM3LCAweDA2LCAweDc1LCAweEZDLCAweEQ2LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTAsIDB4RkYsIDB4RjQsIDB4MDAsIDB4NzIsIDB4RkUsIDB4MTgsCi0JMHgwMiwgMHhBQSwgMHhGRCwgMHhBQiwgMHgwMSwgMHhERiwgMHg0OCwgMHhDQSwgMHgwNSwgMHhFMSwgMHhGQiwKLQkweDA1LCAweDAzLCAweEY3LCAweEZELCAweDJFLCAweDAxLCAweDc5LCAweEZGLCAweDIxLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkIsIDB4MDEsIDB4QkEsIDB4RkMsCi0JMHg5NSwgMHgwNSwgMHg4MywgMHhGNiwgMHg4QywgMHgxNCwgMHg4NywgMHg0NCwgMHhCQiwgMHhGNywgMHg5OCwKLQkweDAyLCAweDVBLCAweEZGLCAweEVFLCAweEZGLCAweDNDLCAweDAwLCAweEQ4LCAweEZGLCAweDBBLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDMsIDB4MDEsIDB4M0MsIDB4RkMsIDB4MkEsCi0JMHgwNywgMHhEQywgMHhGMSwgMHgxQSwgMHgyQSwgMHgwNiwgMHgzNiwgMHhCRSwgMHhGMSwgMHg4RSwgMHgwNiwKLQkweEQ1LCAweEZDLCAweDY3LCAweDAxLCAweDdGLCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDAxLAotCTB4MDAsIDB4MDcsIDB4MDAsIDB4QkUsIDB4RkYsIDB4RUEsIDB4MDAsIDB4QTIsIDB4RkQsIDB4NjUsIDB4MDUsCi0JMHgyOCwgMHhGMywgMHhEQiwgMHgzQywgMHg3OCwgMHgyMSwgMHgzMCwgMHhGMywgMHhERiwgMHgwNiwgMHgzQSwKLQkweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLAotCTB4QjIsIDB4RkYsIDB4OUQsIDB4MDAsIDB4MjcsIDB4RkYsIDB4QzMsIDB4MDAsIDB4MUYsIDB4MDAsIDB4NzYsCi0JMHhGQywgMHhBMywgMHg0NywgMHg2MCwgMHgwQywgMHg0QSwgMHhGOSwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRCwKLQkweDc5LCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAotCTB4MDAsIDB4NTgsIDB4RkYsIDB4ODIsIDB4MDEsIDB4M0YsIDB4RkQsIDB4NzgsIDB4MDQsIDB4RjIsIDB4RjgsCi0JMHg1MCwgMHgwRCwgMHg1RSwgMHg0NywgMHhENSwgMHhGQiwgMHg2RiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg0MCwKLQkweEZGLCAweDkxLCAweDAwLCAweEI3LCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RUYsIDB4MDYsIDB4RkMsIDB4RjIsIDB4ODEsCi0JMHgyMiwgMHgxQywgMHgzQywgMHhFQywgMHhGMiwgMHg5MCwgMHgwNSwgMHg4NSwgMHhGRCwgMHhGQiwgMHgwMCwKLQkweEI2LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg1LAotCTB4RkYsIDB4NUIsIDB4MDEsIDB4RTksIDB4RkMsIDB4NzMsIDB4MDYsIDB4RDgsIDB4RjEsIDB4RTUsIDB4MzYsCi0JMHgxOSwgMHgyOSwgMHhGOCwgMHhGMSwgMHgyOSwgMHgwNywgMHgzNywgMHhGQywgMHhEOCwgMHgwMSwgMHg0MiwKLQkweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQzLCAweEZGLCAweDQ3LCAweDAwLAotCTB4RDcsIDB4RkYsIDB4ODIsIDB4RkYsIDB4NTMsIDB4MDIsIDB4MzksIDB4RjgsIDB4RkQsIDB4NDQsIDB4OEQsCi0JMHgxMywgMHhEMywgMHhGNiwgMHg3MiwgMHgwNSwgMHhDQSwgMHhGQywgMHhCNSwgMHgwMSwgMHg0NSwgMHhGRiwKLQkweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDc1LCAweEZGLCAweDM5LAotCTB4MDEsIDB4RTAsIDB4RkQsIDB4MzMsIDB4MDMsIDB4ODcsIDB4RkIsIDB4QTIsIDB4MDYsIDB4Q0IsIDB4NDgsCi0JMHhFQSwgMHgwMCwgMHgwMSwgMHhGRSwgMHhFOSwgMHgwMSwgMHg4QSwgMHhGRSwgMHhFOCwgMHgwMCwgMHg5NSwKLQkweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM4LCAweEZGLCAweERBLCAweDAxLAotCTB4NkEsIDB4RkMsIDB4NTMsIDB4MDYsIDB4QkEsIDB4RjQsIDB4Q0UsIDB4MUEsIDB4MzIsIDB4NDEsIDB4MUYsCi0JMHhGNSwgMHgxRCwgMHgwNCwgMHg3MSwgMHhGRSwgMHg3MSwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGMCwgMHhGRiwKLQkweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVCLCAweEZGLCAweEFCLCAweDAxLCAweDZGLAotCTB4RkMsIDB4MDgsIDB4MDcsIDB4N0UsIDB4RjEsIDB4MjEsIDB4MzAsIDB4NjcsIDB4MzAsIDB4N0QsIDB4RjEsCi0JMHgwNSwgMHgwNywgMHg3MywgMHhGQywgMHhBOCwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA1LCAweDAwLCAweEYyLCAweEZGLCAweEY4LCAweEZGLCAweDc3LCAweDAwLCAweDY3LCAweEZFLAotCTB4MkQsIDB4MDQsIDB4MDQsIDB4RjUsIDB4MDcsIDB4NDEsIDB4MUIsIDB4MUIsIDB4QTYsIDB4RjQsIDB4NUEsCi0JMHgwNiwgMHg2NywgMHhGQywgMHhEQiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEU1LCAweDAwLCAweDkxLCAweEZFLCAweERDLCAweDAxLCAweDFBLAotCTB4RkUsIDB4QjMsIDB4MDAsIDB4QzMsIDB4NDgsIDB4RTEsIDB4MDYsIDB4NkUsIDB4RkIsIDB4NDAsIDB4MDMsCi0JMHhEQSwgMHhGRCwgMHgzQywgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIzLCAweDAxLCAweENGLCAweEZDLCAweDY3LCAweDA1LAotCTB4RUEsIDB4RjYsIDB4NDQsIDB4MTMsIDB4MUUsIDB4NDUsIDB4NUUsIDB4RjgsIDB4M0YsIDB4MDIsIDB4OEUsCi0JMHhGRiwgMHhEMCwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ5LCAweDAxLCAweDM2LCAweEZDLCAweDI4LCAweDA3LCAweDAxLAotCTB4RjIsIDB4Q0UsIDB4MjgsIDB4MjMsIDB4MzcsIDB4RTAsIDB4RjEsIDB4NkIsIDB4MDYsIDB4RUYsIDB4RkMsCi0JMHg1NywgMHgwMSwgMHg4NywgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQiwKLQkweDAwLCAweEI0LCAweEZGLCAweDAwLCAweDAxLCAweDdFLCAweEZELCAweDlDLCAweDA1LCAweERDLCAweEYyLAotCTB4RTQsIDB4M0IsIDB4Q0QsIDB4MjIsIDB4RUUsIDB4RjIsIDB4RjMsIDB4MDYsIDB4MzUsIDB4RkMsIDB4RTYsCi0JMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGRiwKLQkweDhFLCAweDAwLCAweDQ2LCAweEZGLCAweDhBLCAweDAwLCAweDg2LCAweDAwLCAweEE3LCAweEZCLCAweDQ4LAotCTB4NDcsIDB4OTUsIDB4MEQsIDB4RDksIDB4RjgsIDB4ODQsIDB4MDQsIDB4MzksIDB4RkQsIDB4ODUsIDB4MDEsCi0JMHg1NywgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwKLQkweEZGLCAweDc2LCAweDAxLCAweDU5LCAweEZELCAweDQyLCAweDA0LCAweDYzLCAweEY5LCAweDFDLCAweDBDLAotCTB4QjYsIDB4NDcsIDB4QTQsIDB4RkMsIDB4MDcsIDB4MDAsIDB4RDAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4QTAsCi0JMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKLQkweEU2LCAweDAxLCAweDNCLCAweEZDLCAweERBLCAweDA2LCAweDNGLCAweEYzLCAweDJDLCAweDIxLCAweDExLAotCTB4M0QsIDB4M0EsIDB4RjMsIDB4NTgsIDB4MDUsIDB4QUEsIDB4RkQsIDB4RTUsIDB4MDAsIDB4QzEsIDB4RkYsCi0JMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg3RCwgMHhGRiwgMHg2QiwKLQkweDAxLCAweENGLCAweEZDLCAweDk2LCAweDA2LCAweEI3LCAweEYxLCAweEM2LCAweDM1LCAweDY0LCAweDJBLAotCTB4RDQsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0QsIDB4RkMsIDB4RDIsIDB4MDEsIDB4NDUsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgzOSwgMHgwMCwgMHhGNCwgMHhGRiwKLQkweDRFLCAweEZGLCAweEFDLCAweDAyLCAweDk4LCAweEY3LCAweDY1LCAweDQ0LCAweEQ2LCAweDE0LCAweDZDLAotCTB4RjYsIDB4OUYsIDB4MDUsIDB4QjYsIDB4RkMsIDB4QkQsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwgMHgyQiwgMHgwMSwgMHhGRSwKLQkweEZELCAweEY4LCAweDAyLCAweEZCLCAweEZCLCAweDhELCAweDA1LCAweEU1LCAweDQ4LCAweEUzLCAweDAxLAotCTB4OTEsIDB4RkQsIDB4MjUsIDB4MDIsIDB4NkIsIDB4RkUsIDB4RjcsIDB4MDAsIDB4OEYsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENSwgMHgwMSwgMHg3OCwgMHhGQywKLQkweDJGLCAweDA2LCAweDEzLCAweEY1LCAweDdDLCAweDE5LCAweEY3LCAweDQxLCAweDlCLCAweEY1LCAweEQxLAotCTB4MDMsIDB4OUYsIDB4RkUsIDB4NTcsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NSwgMHhGRiwgMHhCNSwgMHgwMSwgMHg2MSwgMHhGQywgMHgxNiwKLQkweDA3LCAweDg1LCAweEYxLCAweEU2LCAweDJFLCAweDlFLCAweDMxLCAweDdELCAweEYxLCAweEYzLCAweDA2LAotCTB4ODQsIDB4RkMsIDB4OUQsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHhGNiwgMHhGRiwgMHhFQiwgMHhGRiwgMHg5MSwgMHgwMCwgMHgzQiwgMHhGRSwgMHg3NSwgMHgwNCwKLQkweDkyLCAweEY0LCAweDM2LCAweDQwLCAweDZFLCAweDFDLCAweDUwLCAweEY0LCAweDdCLCAweDA2LCAweDVCLAotCTB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTgsIDB4MDAsCi0JMHg5QywgMHhGRiwgMHhENiwgMHgwMCwgMHhCMSwgMHhGRSwgMHhBMSwgMHgwMSwgMHg4OSwgMHhGRSwgMHhDMywKLQkweEZGLCAweDlDLCAweDQ4LCAweEZELCAweDA3LCAweEZBLCAweEZBLCAweDdBLCAweDAzLCAweEJDLCAweEZELAotCTB4NDksIDB4MDEsIDB4NkUsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsCi0JMHgwMCwgMHg0OSwgMHhGRiwgMHhBQSwgMHgwMSwgMHhFNCwgMHhGQywgMHgzOCwgMHgwNSwgMHg1NCwgMHhGNywKLQkweEZFLCAweDExLCAweEFBLCAweDQ1LCAweDA5LCAweEY5LCAweEUyLCAweDAxLCAweEM0LCAweEZGLCAweEIzLAotCTB4RkYsIDB4NTksIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHgzRSwgMHhGRiwgMHhERSwgMHgwMSwgMHgzMywgMHhGQywgMHgyMiwgMHgwNywgMHgyQiwgMHhGMiwgMHg4MCwKLQkweDI3LCAweDNCLCAweDM4LCAweDBBLCAweEYyLCAweDQ0LCAweDA2LCAweDBCLCAweEZELCAweDQ1LCAweDAxLAotCTB4OTAsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTksCi0JMHhGRiwgMHgxNSwgMHgwMSwgMHg1QiwgMHhGRCwgMHhEMCwgMHgwNSwgMHg5NywgMHhGMiwgMHhFNiwgMHgzQSwKLQkweDIxLCAweDI0LCAweEIxLCAweEYyLCAweDA0LCAweDA3LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM5LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0YsIDB4MDAsCi0JMHg2NSwgMHhGRiwgMHg1MSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMSwgMHhGQSwgMHhFMSwgMHg0NiwgMHhDRCwKLQkweDBFLCAweDZBLCAweEY4LCAweEI4LCAweDA0LCAweDIwLCAweEZELCAweDkwLCAweDAxLCAweDUzLCAweEZGLAotCTB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NkEsCi0JMHgwMSwgMHg3NCwgMHhGRCwgMHgwQSwgMHgwNCwgMHhENSwgMHhGOSwgMHhFRCwgMHgwQSwgMHgwMywgMHg0OCwKLQkweDdDLCAweEZELCAweDlFLCAweEZGLCAweDBBLCAweDAxLCAweDAxLCAweEZGLCAweEFGLCAweDAwLCAweEFCLAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsCi0JMHg0MiwgMHhGQywgMHhDMywgMHgwNiwgMHg4NywgMHhGMywgMHhENywgMHgxRiwgMHhGRSwgMHgzRCwgMHg5MSwKLQkweEYzLCAweDFELCAweDA1LCAweEQxLCAweEZELCAweENFLCAweDAwLCAweENDLCAweEZGLCAweDAyLCAweDAwLAotCTB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzUsIDB4RkYsIDB4N0EsIDB4MDEsIDB4QjgsCi0JMHhGQywgMHhCNCwgMHgwNiwgMHg5RSwgMHhGMSwgMHhBMiwgMHgzNCwgMHhBRCwgMHgyQiwgMHhCNiwgMHhGMSwKLQkweDI5LCAweDA3LCAweDQ1LCAweEZDLCAweENCLCAweDAxLCAweDQ5LCAweEZGLCAweDMxLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MUIsIDB4RkYsCi0JMHgwMiwgMHgwMywgMHhGRSwgMHhGNiwgMHhDMywgMHg0MywgMHgyMiwgMHgxNiwgMHgwNywgMHhGNiwgMHhDQSwKLQkweDA1LCAweEEzLCAweEZDLCAweEM1LCAweDAxLCAweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4ODAsIDB4RkYsIDB4MUMsIDB4MDEsIDB4MUMsIDB4RkUsIDB4QkQsCi0JMHgwMiwgMHg2RSwgMHhGQywgMHg3RCwgMHgwNCwgMHhGMywgMHg0OCwgMHhFMiwgMHgwMiwgMHgxRiwgMHhGRCwKLQkweDYwLCAweDAyLCAweDRDLCAweEZFLCAweDA2LCAweDAxLCAweDg5LCAweEZGLCAweDFELCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0YsIDB4MDEsIDB4ODgsIDB4RkMsIDB4MDksIDB4MDYsCi0JMHg3MSwgMHhGNSwgMHgyQiwgMHgxOCwgMHhCMiwgMHg0MiwgMHgyMCwgMHhGNiwgMHg4MywgMHgwMywgMHhDRiwKLQkweEZFLCAweDNDLCAweDAwLCAweDE1LCAweDAwLCAweEU2LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLAotCTB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QkYsIDB4MDEsIDB4NTQsIDB4RkMsIDB4MjAsIDB4MDcsIDB4OTQsCi0JMHhGMSwgMHhBNiwgMHgyRCwgMHhEMCwgMHgzMiwgMHg4NSwgMHhGMSwgMHhERCwgMHgwNiwgMHg5NiwgMHhGQywKLQkweDkwLCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZCLAotCTB4RkYsIDB4REYsIDB4RkYsIDB4QTksIDB4MDAsIDB4MTAsIDB4RkUsIDB4QjksIDB4MDQsIDB4MjcsIDB4RjQsCi0JMHg1RSwgMHgzRiwgMHhDMywgMHgxRCwgMHhGRSwgMHhGMywgMHg5OSwgMHgwNiwgMHg1MCwgMHhGQywgMHhFMiwKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LCAweDAwLCAweEEyLCAweEZGLAotCTB4QzcsIDB4MDAsIDB4RDAsIDB4RkUsIDB4NjUsIDB4MDEsIDB4RjYsIDB4RkUsIDB4RDksIDB4RkUsIDB4NkEsCi0JMHg0OCwgMHgxRiwgMHgwOSwgMHg4NywgMHhGQSwgMHhCMywgMHgwMywgMHhBMCwgMHhGRCwgMHg1NiwgMHgwMSwKLQkweDY5LCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRELAotCTB4RkYsIDB4QTAsIDB4MDEsIDB4RkIsIDB4RkMsIDB4MDcsIDB4MDUsIDB4QkYsIDB4RjcsIDB4QkIsIDB4MTAsCi0JMHgyQiwgMHg0NiwgMHhCQiwgMHhGOSwgMHg4MywgMHgwMSwgMHhGQSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg2OCwKLQkweDAwLCAweEM3LCAweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLAotCTB4RTEsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTksIDB4MDcsIDB4NUIsIDB4RjIsIDB4MzAsIDB4MjYsIDB4NEIsCi0JMHgzOSwgMHgzQiwgMHhGMiwgMHgxQSwgMHgwNiwgMHgyOSwgMHhGRCwgMHgzMywgMHgwMSwgMHg5OSwgMHhGRiwKLQkweDE1LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlGLCAweEZGLCAweDI4LAotCTB4MDEsIDB4M0EsIDB4RkQsIDB4MDAsIDB4MDYsIDB4NUEsIDB4RjIsIDB4REYsIDB4MzksIDB4NzMsIDB4MjUsCi0JMHg3OSwgMHhGMiwgMHgxMiwgMHgwNywgMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwKLQkweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEM0LCAweEZGLCAweDcwLCAweDAwLCAweDg0LCAweEZGLAotCTB4MTksIDB4MDAsIDB4NEQsIDB4MDEsIDB4MjIsIDB4RkEsIDB4NzAsIDB4NDYsIDB4MEEsIDB4MTAsIDB4RkMsCi0JMHhGNywgMHhFQiwgMHgwNCwgMHgwOCwgMHhGRCwgMHg5QSwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRSwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDVFLCAweDAxLCAweDkwLAotCTB4RkQsIDB4RDIsIDB4MDMsIDB4NDcsIDB4RkEsIDB4QzMsIDB4MDksIDB4NDgsIDB4NDgsIDB4NUEsIDB4RkUsCi0JMHgzMywgMHhGRiwgMHg0NSwgMHgwMSwgMHhFMiwgMHhGRSwgMHhCRSwgMHgwMCwgMHhBNSwgMHhGRiwgMHgxNiwKLQkweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRCLCAweEZDLAotCTB4QTksIDB4MDYsIDB4RDIsIDB4RjMsIDB4ODEsIDB4MUUsIDB4RTQsIDB4M0UsIDB4RUYsIDB4RjMsIDB4REUsCi0JMHgwNCwgMHhGOSwgMHhGRCwgMHhCNywgMHgwMCwgMHhEOCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwKLQkweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZELCAweEZGLCAweDg4LCAweDAxLCAweEEyLCAweEZDLCAweEQwLAotCTB4MDYsIDB4OEMsIDB4RjEsIDB4NzgsIDB4MzMsIDB4RjIsIDB4MkMsIDB4OUUsIDB4RjEsIDB4MjQsIDB4MDcsCi0JMHg0RSwgMHhGQywgMHhDMywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwKLQkweDAwLCAweEU0LCAweEZGLCAweDFELCAweDAwLCAweDJELCAweDAwLCAweEVBLCAweEZFLCAweDU2LCAweDAzLAotCTB4NkQsIDB4RjYsIDB4MTcsIDB4NDMsIDB4NzAsIDB4MTcsIDB4QTYsIDB4RjUsIDB4RjMsIDB4MDUsIDB4OTEsCi0JMHhGQywgMHhDQywgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweDg2LCAweEZGLCAweDBFLCAweDAxLCAweDNCLCAweEZFLCAweDgyLCAweDAyLCAweEUwLCAweEZDLCAweDczLAotCTB4MDMsIDB4RjYsIDB4NDgsIDB4RTksIDB4MDMsIDB4QUQsIDB4RkMsIDB4OUMsIDB4MDIsIDB4MkQsIDB4RkUsCi0JMHgxNCwgMHgwMSwgMHg4MywgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywKLQkweDAwLCAweDNFLCAweEZGLCAweEM5LCAweDAxLCAweDk5LCAweEZDLCAweEUxLCAweDA1LCAweEQxLCAweEY1LAotCTB4REMsIDB4MTYsIDB4NjUsIDB4NDMsIDB4QUQsIDB4RjYsIDB4MzEsIDB4MDMsIDB4MDAsIDB4RkYsIDB4MjAsCi0JMHgwMCwgMHgyMywgMHgwMCwgMHhFMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwKLQkweDRDLCAweEZGLCAweEM3LCAweDAxLCAweDRBLCAweEZDLCAweDI3LCAweDA3LCAweEE4LCAweEYxLCAweDYyLAotCTB4MkMsIDB4RkQsIDB4MzMsIDB4OTMsIDB4RjEsIDB4QzQsIDB4MDYsIDB4QUIsIDB4RkMsIDB4ODIsIDB4MDEsCi0JMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhEMywKLQkweEZGLCAweEMxLCAweDAwLCAweEU3LCAweEZELCAweEZBLCAweDA0LCAweEM0LCAweEYzLCAweDdFLCAweDNFLAotCTB4MTksIDB4MUYsIDB4QjAsIDB4RjMsIDB4QjUsIDB4MDYsIDB4NDcsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOCwgMHhGRiwgMHhCOCwgMHgwMCwKLQkweEYwLCAweEZFLCAweDJCLCAweDAxLCAweDYzLCAweEZGLCAweEY2LCAweEZELCAweDJDLCAweDQ4LCAweDQ3LAotCTB4MEEsIDB4MTQsIDB4RkEsIDB4RUIsIDB4MDMsIDB4ODQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4NjQsIDB4RkYsCi0JMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MSwgMHhGRiwgMHg5NiwKLQkweDAxLCAweDEzLCAweEZELCAweEQ1LCAweDA0LCAweDJDLCAweEY4LCAweDdELCAweDBGLCAweEEzLCAweDQ2LAotCTB4NzYsIDB4RkEsIDB4MjIsIDB4MDEsIDB4MzIsIDB4MDAsIDB4NzYsIDB4RkYsIDB4NzYsIDB4MDAsIDB4QzEsCi0JMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFNCwgMHgwMSwKLQkweDMyLCAweEZDLCAweDBDLCAweDA3LCAweDkxLCAweEYyLCAweERELCAweDI0LCAweDU0LCAweDNBLCAweDc0LAotCTB4RjIsIDB4RUIsIDB4MDUsIDB4NDksIDB4RkQsIDB4MjAsIDB4MDEsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NSwgMHhGRiwgMHgzQiwgMHgwMSwgMHgxQiwKLQkweEZELCAweDJELCAweDA2LCAweDI0LCAweEYyLCAweEQzLCAweDM4LCAweEM2LCAweDI2LCAweDQ1LCAweEYyLAotCTB4MUQsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwRCwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2MSwgMHgwMCwgMHhBMiwgMHhGRiwgMHhFMiwgMHhGRiwKLQkweEFFLCAweDAxLCAweDZCLCAweEY5LCAweEYyLCAweDQ1LCAweDRBLCAweDExLCAweDhGLCAweEY3LCAweDFELAotCTB4MDUsIDB4RjEsIDB4RkMsIDB4QTQsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwgMHg1MSwgMHgwMSwgMHhBQywgMHhGRCwgMHg5QSwKLQkweDAzLCAweEJBLCAweEZBLCAweDlFLCAweDA4LCAweDgxLCAweDQ4LCAweDQwLCAweEZGLCAweEM2LCAweEZFLAotCTB4ODAsIDB4MDEsIDB4QzIsIDB4RkUsIDB4Q0UsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwgMHg1NSwgMHhGQywgMHg4QywgMHgwNiwKLQkweDIyLCAweEY0LCAweDJDLCAweDFELCAweEMwLCAweDNGLCAweDU1LCAweEY0LCAweDlCLCAweDA0LCAweDIzLAotCTB4RkUsIDB4OUYsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg5NiwgMHgwMSwgMHg4RSwgMHhGQywgMHhFNywgMHgwNiwgMHg4MSwKLQkweEYxLCAweDQ4LCAweDMyLCAweDM0LCAweDJFLCAweDhELCAweEYxLCAweDFDLCAweDA3LCAweDVBLCAweEZDLAotCTB4QkIsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTksCi0JMHhGRiwgMHgwRiwgMHgwMCwgMHg0OCwgMHgwMCwgMHhCOSwgMHhGRSwgMHhBNiwgMHgwMywgMHhFNCwgMHhGNSwKLQkweDYwLCAweDQyLCAweEMxLCAweDE4LCAweDQ3LCAweEY1LCAweDFBLCAweDA2LCAweDgxLCAweEZDLCAweEQyLAotCTB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEIsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHg1QSwgMHhGRSwgMHg0NiwgMHgwMiwgMHg1MiwgMHhGRCwgMHg3MCwgMHgwMiwgMHhFRCwKLQkweDQ4LCAweEY1LCAweDA0LCAweDNCLCAweEZDLCAweEQ3LCAweDAyLCAweDBGLCAweEZFLCAweDIzLCAweDAxLAotCTB4N0UsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCi0JMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywgMHhCNywgMHgwNSwgMHgzNCwgMHhGNiwgMHg4RSwgMHgxNSwKLQkweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLCAweDAyLCAweDMyLCAweEZGLCAweDA0LCAweDAwLCAweDMxLAotCTB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDcsIDB4RkYsCi0JMHhDRSwgMHgwMSwgMHg0MSwgMHhGQywgMHgyQSwgMHgwNywgMHhDMiwgMHhGMSwgMHgxQiwgMHgyQiwgMHgyNSwKLQkweDM1LCAweEE4LCAweEYxLCAweEE3LCAweDA2LCAweEMyLCAweEZDLCAweDc0LCAweDAxLCAweDc4LCAweEZGLAotCTB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4QzcsIDB4RkYsIDB4RDksCi0JMHgwMCwgMHhCRiwgMHhGRCwgMHgzOCwgMHgwNSwgMHg2OSwgMHhGMywgMHg5NiwgMHgzRCwgMHg2RiwgMHgyMCwKLQkweDY2LCAweEYzLCAweENFLCAweDA2LCAweDNGLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUUsIDB4RkYsIDB4QTksIDB4MDAsIDB4MEYsIDB4RkYsCi0JMHhGMCwgMHgwMCwgMHhDRCwgMHhGRiwgMHgxQiwgMHhGRCwgMHhFNCwgMHg0NywgMHg3MywgMHgwQiwgMHhBMiwKLQkweEY5LCAweDIzLCAweDA0LCAweDY4LCAweEZELCAweDcwLCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTUsIDB4RkYsIDB4OEIsIDB4MDEsIDB4MkIsCi0JMHhGRCwgMHhBMSwgMHgwNCwgMHg5QiwgMHhGOCwgMHg0MiwgMHgwRSwgMHgwRiwgMHg0NywgMHgzOCwgMHhGQiwKLQkweEJFLCAweDAwLCAweDZBLCAweDAwLCAweDU4LCAweEZGLCAweDg1LCAweDAwLCAweEJCLCAweEZGLCAweDEwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzQsIDB4RkMsCi0JMHhGRCwgMHgwNiwgMHhDQiwgMHhGMiwgMHg4QSwgMHgyMywgMHg1OCwgMHgzQiwgMHhCNCwgMHhGMiwgMHhCQSwKLQkweDA1LCAweDZBLCAweEZELCAweDBCLCAweDAxLCAweEFFLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEMsIDB4RkYsIDB4NEQsIDB4MDEsIDB4RkUsIDB4RkMsIDB4NTYsCi0JMHgwNiwgMHhGNywgMHhGMSwgMHhCRiwgMHgzNywgMHgxNSwgMHgyOCwgMHgxOCwgMHhGMiwgMHgyNSwgMHgwNywKLQkweDM0LCAweEZDLCAweERDLCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLAotCTB4MDAsIDB4Q0YsIDB4RkYsIDB4NTIsIDB4MDAsIDB4QzAsIDB4RkYsIDB4QUMsIDB4RkYsIDB4MEMsIDB4MDIsCi0JMHhCQywgMHhGOCwgMHg2RCwgMHg0NSwgMHg4RSwgMHgxMiwgMHgyNCwgMHhGNywgMHg0RCwgMHgwNSwgMHhEQiwKLQkweEZDLCAweEFFLCAweDAxLCAweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MjQsIDB4MDAsIDB4NzEsIDB4RkYsIDB4NDMsIDB4MDEsIDB4QzksIDB4RkQsIDB4NjAsIDB4MDMsIDB4MkUsCi0JMHhGQiwgMHg3RSwgMHgwNywgMHhBRiwgMHg0OCwgMHgyRCwgMHgwMCwgMHg1OCwgMHhGRSwgMHhCQiwgMHgwMSwKLQkweEEzLCAweEZFLCAweERELCAweDAwLCAweDk5LCAweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzcsIDB4RkYsIDB4REQsIDB4MDEsIDB4NjAsIDB4RkMsIDB4NkQsIDB4MDYsIDB4NzYsIDB4RjQsCi0JMHhEOCwgMHgxQiwgMHg5NSwgMHg0MCwgMHhDMywgMHhGNCwgMHg1NiwgMHgwNCwgMHg0RSwgMHhGRSwgMHg4NSwKLQkweDAwLCAweEYxLCAweEZGLCAweEY0LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLAotCTB4NjAsIDB4RkYsIDB4QTIsIDB4MDEsIDB4N0MsIDB4RkMsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RjEsIDB4MTUsCi0JMHgzMSwgMHg3MywgMHgyRiwgMHg4MSwgMHhGMSwgMHgxMCwgMHgwNywgMHg2NywgMHhGQywgMHhCMSwgMHgwMSwKLQkweDU4LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAyLAotCTB4MDAsIDB4NjMsIDB4MDAsIDB4OEEsIDB4RkUsIDB4RjMsIDB4MDMsIDB4NjMsIDB4RjUsIDB4QTEsIDB4NDEsCi0JMHgxMiwgMHgxQSwgMHhFQiwgMHhGNCwgMHgzRiwgMHgwNiwgMHg3MiwgMHhGQywgMHhENywgMHgwMSwgMHgzOSwKLQkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkxLCAweEZGLCAweEYxLCAweDAwLAotCTB4NzksIDB4RkUsIDB4MEEsIDB4MDIsIDB4QzMsIDB4RkQsIDB4NzMsIDB4MDEsIDB4REIsIDB4NDgsIDB4MDcsCi0JMHgwNiwgMHhDNywgMHhGQiwgMHgxMiwgMHgwMywgMHhGMSwgMHhGRCwgMHgzMSwgMHgwMSwgMHg3OCwgMHhGRiwKLQkweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQzLCAweEZGLCAweEJBLAotCTB4MDEsIDB4QkYsIDB4RkMsIDB4OEIsIDB4MDUsIDB4OTksIDB4RjYsIDB4NDMsIDB4MTQsIDB4QTksIDB4NDQsCi0JMHhERSwgMHhGNywgMHg4NSwgMHgwMiwgMHg2NSwgMHhGRiwgMHhFNywgMHhGRiwgMHgzRiwgMHgwMCwgMHhENiwKLQkweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQ1LCAweDAxLAotCTB4M0EsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RTMsIDB4RjEsIDB4RDEsIDB4MjksIDB4NDYsIDB4MzYsIDB4QzUsCi0JMHhGMSwgMHg4NywgMHgwNiwgMHhEQSwgMHhGQywgMHg2NCwgMHgwMSwgMHg4MCwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweEJDLCAweEZGLCAweEVGLCAweDAwLCAweDlBLAotCTB4RkQsIDB4NzIsIDB4MDUsIDB4MTYsIDB4RjMsIDB4QTUsIDB4M0MsIDB4QzQsIDB4MjEsIDB4MjEsIDB4RjMsCi0JMHhFNCwgMHgwNiwgMHgzOSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDk5LCAweDAwLCAweDJFLCAweEZGLCAweEI2LCAweDAwLAotCTB4MzYsIDB4MDAsIDB4NDcsIDB4RkMsIDB4OTAsIDB4NDcsIDB4QTQsIDB4MEMsIDB4MzEsIDB4RjksIDB4NUEsCi0JMHgwNCwgMHg0RSwgMHhGRCwgMHg3QywgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweDgwLCAweDAxLCAweDQ1LCAweEZELCAweDZDLAotCTB4MDQsIDB4MEIsIDB4RjksIDB4MEIsIDB4MEQsIDB4NzMsIDB4NDcsIDB4MDIsIDB4RkMsIDB4NTgsIDB4MDAsCi0JMHhBMywgMHgwMCwgMHgzOSwgMHhGRiwgMHg5NCwgMHgwMCwgMHhCNSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM3LCAweEZDLCAweEVCLCAweDA2LAotCTB4MEIsIDB4RjMsIDB4MzUsIDB4MjIsIDB4NTIsIDB4M0MsIDB4RkQsIDB4RjIsIDB4ODQsIDB4MDUsIDB4OEQsCi0JMHhGRCwgMHhGNiwgMHgwMCwgMHhCOCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFELCAweDAwLCAweDgzLCAweEZGLCAweDVFLCAweDAxLCAweEUzLCAweEZDLCAweDdCLCAweDA2LCAweEQwLAotCTB4RjEsIDB4QTUsIDB4MzYsIDB4NjIsIDB4MjksIDB4RUYsIDB4RjEsIDB4MjksIDB4MDcsIDB4MzksIDB4RkMsCi0JMHhENywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhENSwKLQkweEZGLCAweDQ0LCAweDAwLCAweERELCAweEZGLCAweDc3LCAweEZGLCAweDY3LCAweDAyLCAweDE0LCAweEY4LAotCTB4REMsIDB4NDQsIDB4RDUsIDB4MTMsIDB4QkMsIDB4RjYsIDB4N0MsIDB4MDUsIDB4QzUsIDB4RkMsIDB4QjcsCi0JMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwKLQkweDc2LCAweEZGLCAweDM1LCAweDAxLCAweEU3LCAweEZELCAweDI2LCAweDAzLCAweEExLCAweEZCLCAweDY0LAotCTB4MDYsIDB4RDIsIDB4NDgsIDB4MjEsIDB4MDEsIDB4RTgsIDB4RkQsIDB4RjcsIDB4MDEsIDB4ODMsIDB4RkUsCi0JMHhFQywgMHgwMCwgMHg5MywgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwKLQkweEZGLCAweEQ5LCAweDAxLCAweDZELCAweEZDLCAweDRCLCAweDA2LCAweENELCAweEY0LCAweDgzLCAweDFBLAotCTB4NUYsIDB4NDEsIDB4M0EsIDB4RjUsIDB4MEMsIDB4MDQsIDB4N0IsIDB4RkUsIDB4NkMsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhFRiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1QSwgMHhGRiwKLQkweEFELCAweDAxLCAweDZDLCAweEZDLCAweDBDLCAweDA3LCAweDdGLCAweEYxLCAweERDLCAweDJGLCAweEFELAotCTB4MzAsIDB4N0QsIDB4RjEsIDB4MDEsIDB4MDcsIDB4NzYsIDB4RkMsIDB4QTYsIDB4MDEsIDB4NUUsIDB4RkYsCi0JMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMywgMHhGRiwgMHhGNSwgMHhGRiwgMHg3RCwKLQkweDAwLCAweDVELCAweEZFLCAweDNFLCAweDA0LCAweEVBLCAweEY0LCAweEQ5LCAweDQwLCAweDY2LCAweDFCLAotCTB4OTMsIDB4RjQsIDB4NjIsIDB4MDYsIDB4NjQsIDB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5NywgMHhGRiwgMHhFMiwgMHgwMCwgMHg5OCwgMHhGRSwKLQkweENGLCAweDAxLCAweDMzLCAweEZFLCAweDdELCAweDAwLCAweEJCLCAweDQ4LCAweDFGLCAweDA3LCAweDU0LAotCTB4RkIsIDB4NEMsIDB4MDMsIDB4RDMsIDB4RkQsIDB4M0YsIDB4MDEsIDB4NzMsIDB4RkYsIDB4MjMsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMSwgMHgwMSwgMHhEMywKLQkweEZDLCAweDVELCAweDA1LCAweDAxLCAweEY3LCAweEZCLCAweDEyLCAweDNGLCAweDQ1LCAweDgzLCAweEY4LAotCTB4MkEsIDB4MDIsIDB4OUEsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4NEUsIDB4MDAsIDB4RDEsIDB4RkYsIDB4MEMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQSwgMHgwMSwgMHgzNSwgMHhGQywKLQkweDI3LCAweDA3LCAweDA5LCAweEYyLCAweDg1LCAweDI4LCAweDYzLCAweDM3LCAweEU5LCAweEYxLCAweDYzLAotCTB4MDYsIDB4RjUsIDB4RkMsIDB4NTMsIDB4MDEsIDB4ODksIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhCMSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg3NiwgMHhGRCwgMHhBOCwKLQkweDA1LCAweENDLCAweEYyLCAweEFCLCAweDNCLCAweDE4LCAweDIzLCAweEUwLCAweEYyLCAweEY3LCAweDA2LAotCTB4MzUsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsCi0JMHgwMCwgMHhCOSwgMHhGRiwgMHg4QSwgMHgwMCwgMHg0RCwgMHhGRiwgMHg3RCwgMHgwMCwgMHg5QywgMHgwMCwKLQkweDdCLCAweEZCLCAweDMxLCAweDQ3LCAweEQ5LCAweDBELCAweEMwLCAweEY4LCAweDhGLCAweDA0LCAweDM0LAotCTB4RkQsIDB4ODcsIDB4MDEsIDB4NTYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgyOSwgMHgwMCwgMHg1RSwgMHhGRiwgMHg3NCwgMHgwMSwgMHg1RiwgMHhGRCwgMHgzNSwgMHgwNCwgMHg3QywKLQkweEY5LCAweEQ4LCAweDBCLCAweEM5LCAweDQ3LCAweEQ0LCAweEZDLCAweEYwLCAweEZGLCAweERELCAweDAwLAotCTB4MTksIDB4RkYsIDB4QTQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRCwgMHhGQywgMHhENSwgMHgwNiwgMHg0RiwgMHhGMywKLQkweEUwLCAweDIwLCAweDQ1LCAweDNELCAweDRELCAweEYzLCAweDRCLCAweDA1LCAweEIzLCAweEZELCAweEUwLAotCTB4MDAsIDB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsCi0JMHg3QiwgMHhGRiwgMHg2RSwgMHgwMSwgMHhDQSwgMHhGQywgMHg5RCwgMHgwNiwgMHhCMSwgMHhGMSwgMHg4NiwKLQkweDM1LCAweEFFLCAweDJBLCAweENELCAweEYxLCAweDJCLCAweDA3LCAweDNGLCAweEZDLCAweEQxLCAweDAxLAotCTB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4REEsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGQSwgMHhGRiwgMHg0MywgMHhGRiwgMHhCRiwgMHgwMiwgMHg3NSwgMHhGNywgMHg0MiwgMHg0NCwKLQkweDIwLCAweDE1LCAweDU1LCAweEY2LCAweEE5LCAweDA1LCAweEIyLCAweEZDLCAweEJGLCAweDAxLCAweDQxLAotCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0MsIDB4RkYsCi0JMHgyNywgMHgwMSwgMHgwNSwgMHhGRSwgMHhFQiwgMHgwMiwgMHgxNCwgMHhGQywgMHg1MCwgMHgwNSwgMHhFQSwKLQkweDQ4LCAweDFCLCAweDAyLCAweDc4LCAweEZELCAweDMyLCAweDAyLCAweDY0LCAweEZFLCAweEZBLCAweDAwLAotCTB4OEQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDQsCi0JMHgwMSwgMHg3QywgMHhGQywgMHgyNywgMHgwNiwgMHgyOCwgMHhGNSwgMHgzMSwgMHgxOSwgMHgyMSwgMHg0MiwKLQkweEI4LCAweEY1LCAweEMwLCAweDAzLCAweEFBLCAweEZFLCAweDUxLCAweDAwLCAweDBCLCAweDAwLCAweEVBLAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTQsIDB4RkYsIDB4QjcsIDB4MDEsCi0JMHg1RSwgMHhGQywgMHgxOSwgMHgwNywgMHg4OCwgMHhGMSwgMHg5RiwgMHgyRSwgMHhFMywgMHgzMSwgMHg3RSwKLQkweEYxLCAweEVFLCAweDA2LCAweDg4LCAweEZDLCAweDlBLCAweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RTgsIDB4RkYsIDB4OTYsIDB4MDAsIDB4MzEsCi0JMHhGRSwgMHg4NCwgMHgwNCwgMHg3OSwgMHhGNCwgMHgwNywgMHg0MCwgMHhCQSwgMHgxQywgMHgzRSwgMHhGNCwKLQkweDgyLCAweDA2LCAweDU4LCAweEZDLCAweEUwLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MTgsIDB4MDAsIDB4OUQsIDB4RkYsIDB4RDMsIDB4MDAsIDB4QjgsIDB4RkUsIDB4OTMsIDB4MDEsCi0JMHhBMSwgMHhGRSwgMHg4RSwgMHhGRiwgMHg5MiwgMHg0OCwgMHgzRCwgMHgwOCwgMHhFMSwgMHhGQSwgMHg4NiwKLQkweDAzLCAweEI2LCAweEZELCAweDRDLCAweDAxLCAweDZELCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4QTgsIDB4MDEsIDB4RTksIDB4RkMsIDB4MkQsCi0JMHgwNSwgMHg2QiwgMHhGNywgMHhCNiwgMHgxMSwgMHhDOCwgMHg0NSwgMHgzMCwgMHhGOSwgMHhDRCwgMHgwMSwKLQkweEQwLCAweEZGLCAweEFDLCAweEZGLCAweDVDLCAweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLCAweEZELAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsCi0JMHgzNSwgMHhGMiwgMHgzNiwgMHgyNywgMHg3OCwgMHgzOCwgMHgxNCwgMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwKLQkweEZELCAweDQxLCAweDAxLCAweDkyLCAweEZGLCAweDE3LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MTAsIDB4MDAsIDB4QTcsIDB4RkYsIDB4MTksIDB4MDEsIDB4NTMsIDB4RkQsIDB4REIsIDB4MDUsIDB4ODgsCi0JMHhGMiwgMHhBRCwgMHgzQSwgMHg2RCwgMHgyNCwgMHhBNCwgMHhGMiwgMHgwOCwgMHgwNywgMHgzMiwgMHhGQywKLQkweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJGLAotCTB4RkYsIDB4N0IsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NDQsIDB4MDAsIDB4MDEsIDB4MDEsIDB4QjYsIDB4RkEsCi0JMHhDOCwgMHg0NiwgMHgxMywgMHgwRiwgMHg1MSwgMHhGOCwgMHhDNCwgMHgwNCwgMHgxQiwgMHhGRCwgMHg5MiwKLQkweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLAotCTB4NjMsIDB4RkYsIDB4NjcsIDB4MDEsIDB4N0EsIDB4RkQsIDB4RkUsIDB4MDMsIDB4RUUsIDB4RjksIDB4QUEsCi0JMHgwQSwgMHgxNiwgMHg0OCwgMHhBQywgMHhGRCwgMHg4NiwgMHhGRiwgMHgxNywgMHgwMSwgMHhGQSwgMHhGRSwKLQkweEIzLCAweDAwLCAweEFBLCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAotCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDQsIDB4RkMsIDB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsCi0JMHgzMSwgMHgzRSwgMHhBNSwgMHhGMywgMHgwRiwgMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwKLQkweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDczLCAweEZGLAotCTB4N0QsIDB4MDEsIDB4QjMsIDB4RkMsIDB4QkIsIDB4MDYsIDB4OUEsIDB4RjEsIDB4NjAsIDB4MzQsIDB4RjUsCi0JMHgyQiwgMHhCMCwgMHhGMSwgMHgyOCwgMHgwNywgMHg0NywgMHhGQywgMHhDQSwgMHgwMSwgMHg0QSwgMHhGRiwKLQkweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERGLCAweEZGLCAweDI4LCAweDAwLCAweDE3LAotCTB4MDAsIDB4MTAsIDB4RkYsIDB4MTUsIDB4MDMsIDB4REQsIDB4RjYsIDB4OUUsIDB4NDMsIDB4NkMsIDB4MTYsCi0JMHhGMSwgMHhGNSwgMHhEMywgMHgwNSwgMHg5RiwgMHhGQywgMHhDNiwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDE5LCAweDAxLAotCTB4MjMsIDB4RkUsIDB4QjAsIDB4MDIsIDB4ODcsIDB4RkMsIDB4NDEsIDB4MDQsIDB4RjQsIDB4NDgsIDB4MUMsCi0JMHgwMywgMHgwNiwgMHhGRCwgMHg2RSwgMHgwMiwgMHg0NSwgMHhGRSwgMHgwOSwgMHgwMSwgMHg4OCwgMHhGRiwKLQkweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENFLCAweDAxLCAweDhDLAotCTB4RkMsIDB4MDAsIDB4MDYsIDB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsIDB4NDIsIDB4M0YsIDB4RjYsCi0JMHg3MSwgMHgwMywgMHhEOSwgMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwgMHhFNSwgMHhGRiwgMHgwNywKLQkweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLCAweDRGLCAweEZGLCAweEMxLCAweDAxLCAweDUyLCAweEZDLAotCTB4MjIsIDB4MDcsIDB4OTgsIDB4RjEsIDB4NUUsIDB4MkQsIDB4MTMsIDB4MzMsIDB4ODcsIDB4RjEsIDB4RDgsCi0JMHgwNiwgMHg5QiwgMHhGQywgMHg4RCwgMHgwMSwgMHg2QiwgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAzLCAweDAwLCAweEZDLCAweEZGLCAweERDLCAweEZGLCAweEFGLCAweDAwLCAweDA3LCAweEZFLCAweEM4LAotCTB4MDQsIDB4MTAsIDB4RjQsIDB4MkQsIDB4M0YsIDB4MEYsIDB4MUUsIDB4RUQsIDB4RjMsIDB4QTAsIDB4MDYsCi0JMHg0RSwgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwKLQkweDAwLCAweEEzLCAweEZGLCAweEMzLCAweDAwLCAweEQ3LCAweEZFLCAweDU4LCAweDAxLCAweDBGLCAweEZGLAotCTB4QTYsIDB4RkUsIDB4NUQsIDB4NDgsIDB4NjEsIDB4MDksIDB4NkUsIDB4RkEsIDB4QzAsIDB4MDMsIDB4OTksCi0JMHhGRCwgMHg1OSwgMHgwMSwgMHg2OCwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlFLCAweDAxLCAweDAwLCAweEZELCAweEZDLCAweDA0LCAweEQ3LAotCTB4RjcsIDB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsIDB4RTQsIDB4RjksIDB4NkUsIDB4MDEsIDB4MDYsIDB4MDAsCi0JMHg4RSwgMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwKLQkweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE2LCAweDA3LCAweDY3LCAweEYyLAotCTB4RTUsIDB4MjUsIDB4ODcsIDB4MzksIDB4NDcsIDB4RjIsIDB4MTAsIDB4MDYsIDB4MzAsIDB4RkQsIDB4MkYsCi0JMHgwMSwgMHg5QywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMCwKLQkweDlELCAweEZGLCAweDJELCAweDAxLCAweDMzLCAweEZELCAweDBCLCAweDA2LCAweDRELCAweEYyLCAweEE1LAotCTB4MzksIDB4QkYsIDB4MjUsIDB4NkQsIDB4RjIsIDB4MTUsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsCi0JMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNSwgMHhGRiwgMHg2RCwKLQkweDAwLCAweDhCLCAweEZGLCAweDBELCAweDAwLCAweDYzLCAweDAxLCAweEY5LCAweEY5LCAweDU1LCAweDQ2LAotCTB4NTEsIDB4MTAsIDB4RTMsIDB4RjcsIDB4RjcsIDB4MDQsIDB4MDMsIDB4RkQsIDB4OUQsIDB4MDEsIDB4NEUsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwgMHhGRiwKLQkweDVCLCAweDAxLCAweDk2LCAweEZELCAweEM2LCAweDAzLCAweDYxLCAweEZBLCAweDgxLCAweDA5LCAweDU3LAotCTB4NDgsIDB4OEQsIDB4RkUsIDB4MUIsIDB4RkYsIDB4NTIsIDB4MDEsIDB4REIsIDB4RkUsIDB4QzIsIDB4MDAsCi0JMHhBNCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywKLQkweDAxLCAweDRELCAweEZDLCAweEEzLCAweDA2LCAweEU0LCAweEYzLCAweDM2LCAweDFFLCAweDE2LCAweDNGLAotCTB4MDUsIDB4RjQsIDB4Q0YsIDB4MDQsIDB4MDIsIDB4RkUsIDB4QjIsIDB4MDAsIDB4REIsIDB4RkYsIDB4RkMsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwgMHg4QiwgMHgwMSwKLQkweDlELCAweEZDLCAweEQ1LCAweDA2LCAweDg5LCAweEYxLCAweDM1LCAweDMzLCAweDNBLCAweDJELCAweDlBLAotCTB4RjEsIDB4MjMsIDB4MDcsIDB4NTEsIDB4RkMsIDB4QzIsIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNSwgMHhGRiwgMHgxQSwgMHgwMCwgMHgzMywgMHgwMCwgMHhERiwKLQkweEZFLCAweDY4LCAweDAzLCAweDRFLCAweEY2LCAweEVFLCAweDQyLCAweEJCLCAweDE3LCAweDkwLCAweEY1LAotCTB4RkMsIDB4MDUsIDB4OEUsIDB4RkMsIDB4Q0QsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHg4NywgMHhGRiwgMHgwQiwgMHgwMSwgMHg0MiwgMHhGRSwgMHg3NCwgMHgwMiwKLQkweEY5LCAweEZDLCAweDM5LCAweDAzLCAweEY1LCAweDQ4LCAweDI0LCAweDA0LCAweDk0LCAweEZDLCAweEE5LAotCTB4MDIsIDB4MjcsIDB4RkUsIDB4MTgsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRSwgMHhGRiwgMHhDNywgMHgwMSwgMHg5RCwgMHhGQywgMHhEOCwKLQkweDA1LCAweEU3LCAweEY1LCAweDkxLCAweDE2LCAweDg5LCAweDQzLCAweENELCAweEY2LCAweDFFLCAweDAzLAotCTB4MEIsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MjYsIDB4MDAsIDB4RTAsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHg0QiwgMHhGRiwgMHhDOSwgMHgwMSwgMHg0OCwgMHhGQywgMHgyOCwgMHgwNywKLQkweEFELCAweEYxLCAweDE5LCAweDJDLCAweDNGLCAweDM0LCAweDk3LCAweEYxLCAweEJFLCAweDA2LCAweEIwLAotCTB4RkMsIDB4N0YsIDB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhEMCwgMHhGRiwgMHhDNywgMHgwMCwgMHhERSwgMHhGRCwgMHgwOCwgMHgwNSwgMHhCMCwKLQkweEYzLCAweDRBLCAweDNFLCAweDY0LCAweDFGLCAweEEwLCAweEYzLCAweEJCLCAweDA2LCAweDQ1LCAweEZDLAotCTB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTksCi0JMHhGRiwgMHhCNCwgMHgwMCwgMHhGNywgMHhGRSwgMHgxRCwgMHgwMSwgMHg3QSwgMHhGRiwgMHhDNSwgMHhGRCwKLQkweDFELCAweDQ4LCAweDg5LCAweDBBLCAweEZCLCAweEY5LCAweEY4LCAweDAzLCAweDdELCAweEZELCAweDY2LAotCTB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsCi0JMHg1MiwgMHhGRiwgMHg5MywgMHgwMSwgMHgxOCwgMHhGRCwgMHhDOSwgMHgwNCwgMHg0NSwgMHhGOCwgMHgzNiwKLQkweDBGLCAweEJCLCAweDQ2LCAweEExLCAweEZBLCAweDBDLCAweDAxLCAweDNFLCAweDAwLCAweDcwLCAweEZGLAotCTB4N0EsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksCi0JMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwOSwgMHgwNywgMHg5RCwgMHhGMiwgMHg5MiwgMHgyNCwKLQkweDhGLCAweDNBLCAweDgyLCAweEYyLCAweEUxLCAweDA1LCAweDUwLCAweEZELCAweDFCLCAweDAxLCAweEE2LAotCTB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTcsIDB4MDAsIDB4OTMsIDB4RkYsCi0JMHgzRiwgMHgwMSwgMHgxNSwgMHhGRCwgMHgzNiwgMHgwNiwgMHgxOSwgMHhGMiwgMHg5NywgMHgzOCwgMHgxMSwKLQkweDI3LCAweDNCLCAweEYyLCAweDFGLCAweDA3LCAweDMyLCAweEZDLCAweERGLCAweDAxLCAweDNELCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4NUUsIDB4MDAsIDB4QTksCi0JMHhGRiwgMHhENiwgMHhGRiwgMHhDMywgMHgwMSwgMHg0MywgMHhGOSwgMHhENywgMHg0NSwgMHg5MiwgMHgxMSwKLQkweDc3LCAweEY3LCAweDI4LCAweDA1LCAweEVDLCAweEZDLCAweEE3LCAweDAxLCAweDRBLCAweEZGLCAweDJGLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkQsIDB4RkYsIDB4NEUsIDB4MDEsCi0JMHhCMywgMHhGRCwgMHg4RCwgMHgwMywgMHhENCwgMHhGQSwgMHg1RCwgMHgwOCwgMHg4RCwgMHg0OCwgMHg3NCwKLQkweEZGLCAweEFFLCAweEZFLCAweDhELCAweDAxLCAweEJCLCAweEZFLCAweEQxLCAweDAwLCAweDlFLCAweEZGLAotCTB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTAsIDB4MDEsIDB4NTcsCi0JMHhGQywgMHg4NSwgMHgwNiwgMHgzNCwgMHhGNCwgMHhFMCwgMHgxQywgMHhGMCwgMHgzRiwgMHg2RCwgMHhGNCwKLQkweDhDLCAweDA0LCAweDJDLCAweEZFLCAweDk5LCAweDAwLCAweEU3LCAweEZGLCAweEY4LCAweEZGLCAweDA0LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OEEsIDB4RkMsCi0JMHhFQywgMHgwNiwgMHg3RiwgMHhGMSwgMHgwNCwgMHgzMiwgMHg3QiwgMHgyRSwgMHg4QSwgMHhGMSwgMHgxQSwKLQkweDA3LCAweDVELCAweEZDLCAweEI4LCAweDAxLCAweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLAotCTB4MDYsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4NEUsIDB4MDAsIDB4QUYsIDB4RkUsIDB4QjgsCi0JMHgwMywgMHhDNywgMHhGNSwgMHgzOCwgMHg0MiwgMHgwQywgMHgxOSwgMHgzMiwgMHhGNSwgMHgyMywgMHgwNiwKLQkweDdELCAweEZDLCAweEQzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLAotCTB4MDAsIDB4OEQsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NjEsIDB4RkUsIDB4MzksIDB4MDIsIDB4NkIsIDB4RkQsCi0JMHgzNywgMHgwMiwgMHhFQiwgMHg0OCwgMHgzMSwgMHgwNSwgMHgyMSwgMHhGQywgMHhFNCwgMHgwMiwgMHgwOCwKLQkweEZFLCAweDI2LCAweDAxLCAweDdDLCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MzIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4QzAsIDB4MDEsIDB4QUYsIDB4RkMsIDB4QUQsIDB4MDUsIDB4NEEsCi0JMHhGNiwgMHg0NCwgMHgxNSwgMHgyRiwgMHg0NCwgMHg2NCwgMHhGNywgMHhDOSwgMHgwMiwgMHgzRCwgMHhGRiwKLQkweEZFLCAweEZGLCAweDM0LCAweDAwLCAweERCLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMyLAotCTB4MDAsIDB4NDcsIDB4RkYsIDB4RDAsIDB4MDEsIDB4NDAsIDB4RkMsIDB4MkEsIDB4MDcsIDB4Q0EsIDB4RjEsCi0JMHhEMSwgMHgyQSwgMHg2NSwgMHgzNSwgMHhBRSwgMHhGMSwgMHhBMCwgMHgwNiwgMHhDNywgMHhGQywgMHg3MCwKLQkweDAxLCAweDdBLCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDA1LCAweDAwLAotCTB4QzUsIDB4RkYsIDB4REUsIDB4MDAsIDB4QjcsIDB4RkQsIDB4NDUsIDB4MDUsIDB4NTYsIDB4RjMsIDB4NjEsCi0JMHgzRCwgMHhCQSwgMHgyMCwgMHg1NiwgMHhGMywgMHhEMywgMHgwNiwgMHgzRSwgMHhGQywgMHhFNiwgMHgwMSwKLQkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLCAweEFGLCAweEZGLCAweEE1LAotCTB4MDAsIDB4MTYsIDB4RkYsIDB4RTMsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RUIsIDB4RkMsIDB4RDIsIDB4NDcsCi0JMHhCNiwgMHgwQiwgMHg4OSwgMHhGOSwgMHgyRiwgMHgwNCwgMHg2MiwgMHhGRCwgMHg3MiwgMHgwMSwgMHg1RSwKLQkweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU2LCAweEZGLAotCTB4ODgsIDB4MDEsIDB4MzEsIDB4RkQsIDB4OTUsIDB4MDQsIDB4QjQsIDB4RjgsIDB4RkMsIDB4MEQsIDB4MjYsCi0JMHg0NywgMHg2NCwgMHhGQiwgMHhBNywgMHgwMCwgMHg3NywgMHgwMCwgMHg1MSwgMHhGRiwgMHg4OSwgMHgwMCwKLQkweEJBLCAweEZGLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LAotCTB4MDEsIDB4MzQsIDB4RkMsIDB4RjksIDB4MDYsIDB4RDksIDB4RjIsIDB4M0YsIDB4MjMsIDB4OTAsIDB4M0IsCi0JMHhDNCwgMHhGMiwgMHhBRSwgMHgwNSwgMHg3MiwgMHhGRCwgMHgwNywgMHgwMSwgMHhCMCwgMHhGRiwgMHgwQywKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDFBLCAweDAwLCAweDhBLCAweEZGLCAweDUxLCAweDAxLAotCTB4RjgsIDB4RkMsIDB4NUUsIDB4MDYsIDB4RUQsIDB4RjEsIDB4ODIsIDB4MzcsIDB4NjAsIDB4MjgsIDB4MEUsCi0JMHhGMiwgMHgyNiwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweEZELCAweEZGLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDRGLCAweDAwLCAweEM3LCAweEZGLCAweEEwLAotCTB4RkYsIDB4MjAsIDB4MDIsIDB4OTYsIDB4RjgsIDB4NEUsIDB4NDUsIDB4RDcsIDB4MTIsIDB4MEQsIDB4RjcsCi0JMHg1OCwgMHgwNSwgMHhENiwgMHhGQywgMHhCMCwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDQwLCAweDAxLCAweEQwLCAweEZELAotCTB4NTMsIDB4MDMsIDB4NDcsIDB4RkIsIDB4M0YsIDB4MDcsIDB4QjgsIDB4NDgsIDB4NjIsIDB4MDAsIDB4M0YsCi0JMHhGRSwgMHhDOCwgMHgwMSwgMHg5QywgMHhGRSwgMHhFMCwgMHgwMCwgMHg5OCwgMHhGRiwgMHgxOSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERDLCAweDAxLCAweDYzLCAweEZDLCAweDY2LAotCTB4MDYsIDB4ODksIDB4RjQsIDB4OEMsIDB4MUIsIDB4QzMsIDB4NDAsIDB4REQsIDB4RjQsIDB4NDYsIDB4MDQsCi0JMHg1OCwgMHhGRSwgMHg4MCwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweEE1LCAweDAxLCAweDc4LCAweEZDLCAweEZGLCAweDA2LAotCTB4N0QsIDB4RjEsIDB4Q0YsIDB4MzAsIDB4QjgsIDB4MkYsIDB4ODAsIDB4RjEsIDB4MEQsIDB4MDcsIDB4NkEsCi0JMHhGQywgMHhBRSwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwKLQkweEVGLCAweEZGLCAweEZGLCAweEZGLCAweDY5LCAweDAwLCAweDgwLCAweEZFLCAweDA0LCAweDA0LCAweDQ4LAotCTB4RjUsIDB4NzQsIDB4NDEsIDB4NUQsIDB4MUEsIDB4RDcsIDB4RjQsIDB4NDcsIDB4MDYsIDB4NkYsIDB4RkMsCi0JMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MywKLQkweEZGLCAweEVELCAweDAwLCAweDgwLCAweEZFLCAweEZELCAweDAxLCAweERDLCAweEZELCAweDNDLCAweDAxLAotCTB4RDUsIDB4NDgsIDB4NDUsIDB4MDYsIDB4QUUsIDB4RkIsIDB4MUYsIDB4MDMsIDB4RUEsIDB4RkQsIDB4MzQsCi0JMHgwMSwgMHg3NywgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwKLQkweDQ0LCAweEZGLCAweEI4LCAweDAxLCAweEMzLCAweEZDLCAweDgxLCAweDA1LCAweEIwLCAweEY2LCAweEZBLAotCTB4MTMsIDB4Q0MsIDB4NDQsIDB4MDIsIDB4RjgsIDB4NzEsIDB4MDIsIDB4NzEsIDB4RkYsIDB4RTEsIDB4RkYsCi0JMHg0MiwgMHgwMCwgMHhENSwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MywKLQkweEZGLCAweEQ2LCAweDAxLCAweDM5LCAweEZDLCAweDJBLCAweDA3LCAweEVCLCAweEYxLCAweDg3LCAweDI5LAotCTB4ODUsIDB4MzYsIDB4Q0MsIDB4RjEsIDB4N0YsIDB4MDYsIDB4RTAsIDB4RkMsIDB4NjAsIDB4MDEsIDB4ODIsCi0JMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCQSwgMHhGRiwKLQkweEY0LCAweDAwLCAweDkxLCAweEZELCAweDdFLCAweDA1LCAweDA1LCAweEYzLCAweDZFLCAweDNDLCAweDEwLAotCTB4MjIsIDB4MTIsIDB4RjMsIDB4RTksIDB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNSwgMHhGRiwgMHg5NiwgMHgwMCwgMHgzNSwKLQkweEZGLCAweEE5LCAweDAwLCAweDRELCAweDAwLCAweDE5LCAweEZDLCAweDdDLCAweDQ3LCAweEU4LCAweDBDLAotCTB4MTgsIDB4RjksIDB4NjYsIDB4MDQsIDB4NDgsIDB4RkQsIDB4N0UsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QSwgMHhGRiwgMHg3RCwgMHgwMSwKLQkweDRCLCAweEZELCAweDYwLCAweDA0LCAweDI0LCAweEY5LCAweEM2LCAweDBDLCAweDg2LCAweDQ3LCAweDMwLAotCTB4RkMsIDB4NDEsIDB4MDAsIDB4QjAsIDB4MDAsIDB4MzIsIDB4RkYsIDB4OTgsIDB4MDAsIDB4QjQsIDB4RkYsCi0JMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzOCwKLQkweEZDLCAweEU2LCAweDA2LCAweDE5LCAweEYzLCAweEVBLCAweDIxLCAweDhBLCAweDNDLCAweDBFLCAweEYzLAotCTB4NzgsIDB4MDUsIDB4OTYsIDB4RkQsIDB4RjEsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MSwgMHhGRiwgMHg2MiwgMHgwMSwgMHhERCwgMHhGQywKLQkweDgzLCAweDA2LCAweEM5LCAweEYxLCAweDY2LCAweDM2LCAweEFDLCAweDI5LCAweEU3LCAweEYxLCAweDJBLAotCTB4MDcsIDB4M0EsIDB4RkMsIDB4RDUsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHhENiwgMHhGRiwgMHg0MSwgMHgwMCwgMHhFNCwgMHhGRiwgMHg2QiwgMHhGRiwgMHg3QiwKLQkweDAyLCAweEYwLCAweEY3LCAweEJBLCAweDQ0LCAweDFFLCAweDE0LCAweEE1LCAweEY2LCAweDg2LCAweDA1LAotCTB4QzEsIDB4RkMsIDB4QjksIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyMiwgMHgwMCwgMHg3NywgMHhGRiwgMHgzMiwgMHgwMSwgMHhFRCwgMHhGRCwgMHgxOSwgMHgwMywKLQkweEJCLCAweEZCLCAweDI2LCAweDA2LCAweEQ3LCAweDQ4LCAweDU4LCAweDAxLCAweENGLCAweEZELCAweDA0LAotCTB4MDIsIDB4N0QsIDB4RkUsIDB4RUYsIDB4MDAsIDB4OTIsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwgMHgwMSwgMHg3MCwgMHhGQywgMHg0MywgMHgwNiwgMHhFMSwKLQkweEY0LCAweDM4LCAweDFBLCAweDhDLCAweDQxLCAweDU1LCAweEY1LCAweEZDLCAweDAzLCAweDg1LCAweEZFLAotCTB4NjYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsCi0JMHgwMCwgMHg1OSwgMHhGRiwgMHhCMCwgMHgwMSwgMHg2OSwgMHhGQywgMHgwRiwgMHgwNywgMHg4MCwgMHhGMSwKLQkweDk2LCAweDJGLCAweEYyLCAweDMwLCAweDdDLCAweEYxLCAweEZELCAweDA2LCAweDdBLCAweEZDLCAweEEzLAotCTB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjQsIDB4RkYsCi0JMHhGMiwgMHhGRiwgMHg4MywgMHgwMCwgMHg1MywgMHhGRSwgMHg0RSwgMHgwNCwgMHhEMCwgMHhGNCwgMHhBQiwKLQkweDQwLCAweEIyLCAweDFCLCAweDdGLCAweEY0LCAweDY5LCAweDA2LCAweDYyLCAweEZDLCAweERELCAweDAxLAotCTB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTgsIDB4RkYsIDB4REUsCi0JMHgwMCwgMHg5RiwgMHhGRSwgMHhDMiwgMHgwMSwgMHg0QiwgMHhGRSwgMHg0OCwgMHgwMCwgMHhCMywgMHg0OCwKLQkweDVFLCAweDA3LCAweDNCLCAweEZCLCAweDU5LCAweDAzLCAweENELCAweEZELCAweDQyLCAweDAxLCAweDcxLAotCTB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDcsIDB4RkYsCi0JMHhBRiwgMHgwMSwgMHhEOCwgMHhGQywgMHg1MiwgMHgwNSwgMHgxOSwgMHhGNywgMHhCMiwgMHgxMiwgMHg1QywKLQkweDQ1LCAweEE5LCAweEY4LCAweDE2LCAweDAyLCAweEE2LCAweEZGLCAweEMzLCAweEZGLCAweDUxLCAweDAwLAotCTB4RDAsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4NDAsIDB4RkYsIDB4REIsCi0JMHgwMSwgMHgzNSwgMHhGQywgMHgyNSwgMHgwNywgMHgxMywgMHhGMiwgMHgzQSwgMHgyOCwgMHhBMCwgMHgzNywKLQkweEYyLCAweEYxLCAweDVBLCAweDA2LCAweEZCLCAweEZDLCAweDRGLCAweDAxLCAweDhCLCAweEZGLCAweDFBLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4MDksIDB4MDEsCi0JMHg2RSwgMHhGRCwgMHhCNCwgMHgwNSwgMHhCQywgMHhGMiwgMHg3MywgMHgzQiwgMHg2NCwgMHgyMywgMHhEMiwKLQkweEYyLCAweEZCLCAweDA2LCAweDM0LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QkIsIDB4RkYsIDB4ODcsIDB4MDAsIDB4NTQsIDB4RkYsIDB4NzAsCi0JMHgwMCwgMHhCMywgMHgwMCwgMHg0RSwgMHhGQiwgMHgxQSwgMHg0NywgMHgxRiwgMHgwRSwgMHhBOCwgMHhGOCwKLQkweDlCLCAweDA0LCAweDJFLCAweEZELCAweDhBLCAweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4NzEsIDB4MDEsIDB4NjUsIDB4RkQsCi0JMHgyOSwgMHgwNCwgMHg5NiwgMHhGOSwgMHg5NSwgMHgwQiwgMHhEQywgMHg0NywgMHgwMywgMHhGRCwgMHhEOSwKLQkweEZGLCAweEVBLCAweDAwLCAweDEyLCAweEZGLCAweEE3LCAweDAwLCAweEFFLCAweEZGLCAweDE0LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0UsIDB4RkMsIDB4RDAsCi0JMHgwNiwgMHg1RSwgMHhGMywgMHg5NCwgMHgyMCwgMHg3QiwgMHgzRCwgMHg2MCwgMHhGMywgMHgzRSwgMHgwNSwKLQkweEJCLCAweEZELCAweERCLCAweDAwLCAweEM2LCAweEZGLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MjAsIDB4MDAsIDB4NzksIDB4RkYsIDB4NzIsIDB4MDEsIDB4QzQsIDB4RkMsIDB4QTQsIDB4MDYsCi0JMHhBQiwgMHhGMSwgMHg0NiwgMHgzNSwgMHhGNywgMHgyQSwgMHhDNiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MCwKLQkweEZDLCAweENGLCAweDAxLCAweDQ3LCAweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLAotCTB4REIsIDB4RkYsIDB4MzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RDMsIDB4MDIsIDB4NTMsCi0JMHhGNywgMHgxRiwgMHg0NCwgMHg2OSwgMHgxNSwgMHgzRiwgMHhGNiwgMHhCMiwgMHgwNSwgMHhBRCwgMHhGQywKLQkweEMxLCAweDAxLCAweDQxLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLAotCTB4MDAsIDB4N0QsIDB4RkYsIDB4MjQsIDB4MDEsIDB4MEMsIDB4RkUsIDB4REUsIDB4MDIsIDB4MkUsIDB4RkMsCi0JMHgxMywgMHgwNSwgMHhFQywgMHg0OCwgMHg1NCwgMHgwMiwgMHg1RSwgMHhGRCwgMHgzRiwgMHgwMiwgMHg1RCwKLQkweEZFLCAweEZFLCAweDAwLCAweDhDLCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAotCTB4M0IsIDB4RkYsIDB4RDMsIDB4MDEsIDB4N0YsIDB4RkMsIDB4MUYsIDB4MDYsIDB4M0MsIDB4RjUsIDB4RTYsCi0JMHgxOCwgMHg0RCwgMHg0MiwgMHhENSwgMHhGNSwgMHhBRiwgMHgwMywgMHhCNCwgMHhGRSwgMHg0QiwgMHgwMCwKLQkweDBFLCAweDAwLCAweEU5LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDUzLAotCTB4RkYsIDB4QkEsIDB4MDEsIDB4NUIsIDB4RkMsIDB4MUIsIDB4MDcsIDB4OEIsIDB4RjEsIDB4NTgsIDB4MkUsCi0JMHgyNiwgMHgzMiwgMHg4MCwgMHhGMSwgMHhFQSwgMHgwNiwgMHg4QywgMHhGQywgMHg5NywgMHgwMSwgMHg2NiwKLQkweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY4LCAweEZGLCAweEU2LCAweEZGLAotCTB4OUMsIDB4MDAsIDB4MjcsIDB4RkUsIDB4OTQsIDB4MDQsIDB4NjEsIDB4RjQsIDB4RDcsIDB4M0YsIDB4MDYsCi0JMHgxRCwgMHgyQiwgMHhGNCwgMHg4OSwgMHgwNiwgMHg1NiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LCAweDAwLCAweDlFLCAweEZGLCAweENGLCAweDAwLCAweEJGLAotCTB4RkUsIDB4ODYsIDB4MDEsIDB4QkEsIDB4RkUsIDB4NUEsIDB4RkYsIDB4ODYsIDB4NDgsIDB4N0QsIDB4MDgsCi0JMHhDNywgMHhGQSwgMHg5MywgMHgwMywgMHhCMCwgMHhGRCwgMHg0RiwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRCLCAweEZGLCAweEE2LCAweDAxLAotCTB4RUUsIDB4RkMsIDB4MjMsIDB4MDUsIDB4ODMsIDB4RjcsIDB4NkUsIDB4MTEsIDB4RTUsIDB4NDUsIDB4NTcsCi0JMHhGOSwgMHhCOCwgMHgwMSwgMHhEQywgMHhGRiwgMHhBNSwgMHhGRiwgMHg1RiwgMHgwMCwgMHhDQSwgMHhGRiwKLQkweDBELCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNELCAweEZGLCAweERGLCAweDAxLCAweDMyLAotCTB4RkMsIDB4MUUsIDB4MDcsIDB4NDAsIDB4RjIsIDB4RUIsIDB4MjYsIDB4QjUsIDB4MzgsIDB4MUYsIDB4RjIsCi0JMHgzMiwgMHgwNiwgMHgxOCwgMHhGRCwgMHgzRCwgMHgwMSwgMHg5NCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEE0LCAweEZGLCAweDFELCAweDAxLCAweDRDLCAweEZELAotCTB4RTYsIDB4MDUsIDB4N0IsIDB4RjIsIDB4NzEsIDB4M0EsIDB4QjgsIDB4MjQsIDB4OTcsIDB4RjIsIDB4MEIsCi0JMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDBGLCAweDAwLCAweEMwLCAweEZGLCAweDc4LCAweDAwLCAweDczLCAweEZGLCAweDM4LCAweDAwLCAweDE3LAotCTB4MDEsIDB4OEIsIDB4RkEsIDB4QUYsIDB4NDYsIDB4NTksIDB4MEYsIDB4MzksIDB4RjgsIDB4Q0YsIDB4MDQsCi0JMHgxNSwgMHhGRCwgMHg5NSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDI4LCAweDAwLCAweDY0LCAweEZGLCAweDY1LCAweDAxLCAweDgxLCAweEZELCAweEYyLCAweDAzLAotCTB4MDgsIDB4RkEsIDB4NjgsIDB4MEEsIDB4MjUsIDB4NDgsIDB4REUsIDB4RkQsIDB4NkUsIDB4RkYsIDB4MjQsCi0JMHgwMSwgMHhGMywgMHhGRSwgMHhCNiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ2LCAweEZDLCAweEI4LCAweDA2LCAweEE4LAotCTB4RjMsIDB4M0YsIDB4MUYsIDB4NjQsIDB4M0UsIDB4QkEsIDB4RjMsIDB4MDEsIDB4MDUsIDB4RTIsIDB4RkQsCi0JMHhDNCwgMHgwMCwgMHhEMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMywKLQkweDAwLCAweDcxLCAweEZGLCAweDgxLCAweDAxLCAweEFFLCAweEZDLCAweEMxLCAweDA2LCAweDk1LCAweEYxLAotCTB4MUUsIDB4MzQsIDB4M0UsIDB4MkMsIDB4QUIsIDB4RjEsIDB4MjcsIDB4MDcsIDB4NDksIDB4RkMsIDB4QzgsCi0JMHgwMSwgMHg0QiwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMSwgMHhGRiwKLQkweDI1LCAweDAwLCAweDFELCAweDAwLCAweDA1LCAweEZGLCAweDI4LCAweDAzLCAweEJELCAweEY2LCAweDc3LAotCTB4NDMsIDB4QjYsIDB4MTYsIDB4REMsIDB4RjUsIDB4REQsIDB4MDUsIDB4OUIsIDB4RkMsIDB4QzgsIDB4MDEsCi0JMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MywKLQkweEZGLCAweDE2LCAweDAxLCAweDJBLCAweEZFLCAweEEzLCAweDAyLCAweEExLCAweEZDLCAweDA2LCAweDA0LAotCTB4RjUsIDB4NDgsIDB4NTYsIDB4MDMsIDB4RUQsIDB4RkMsIDB4N0IsIDB4MDIsIDB4M0UsIDB4RkUsIDB4MEMsCi0JMHgwMSwgMHg4NiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwKLQkweENDLCAweDAxLCAweDhGLCAweEZDLCAweEY4LCAweDA1LCAweDlCLCAweEY1LCAweDk2LCAweDE3LCAweDAyLAotCTB4NDMsIDB4NUUsIDB4RjYsIDB4NUYsIDB4MDMsIDB4RTQsIDB4RkUsIDB4MzAsIDB4MDAsIDB4MUIsIDB4MDAsCi0JMHhFNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RSwgMHhGRiwgMHhDMywKLQkweDAxLCAweDRGLCAweEZDLCAweDI0LCAweDA3LCAweDlDLCAweEYxLCAweDE3LCAweDJELCAweDU3LCAweDMzLAotCTB4OEEsIDB4RjEsIDB4RDMsIDB4MDYsIDB4OUYsIDB4RkMsIDB4OEEsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjUsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhEOSwgMHhGRiwgMHhCNCwgMHgwMCwKLQkweEZELCAweEZELCAweEQ3LCAweDA0LCAweEZBLCAweEYzLCAweEZDLCAweDNFLCAweDVCLCAweDFFLCAweERCLAotCTB4RjMsIDB4QTYsIDB4MDYsIDB4NEMsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMCwgMHgwMCwgMHhERSwgMHhGRSwgMHg0QiwKLQkweDAxLCAweDI3LCAweEZGLCAweDczLCAweEZFLCAweDRGLCAweDQ4LCAweEEyLCAweDA5LCAweDU0LCAweEZBLAotCTB4Q0MsIDB4MDMsIDB4OTMsIDB4RkQsIDB4NUMsIDB4MDEsIDB4NjcsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5QywgMHgwMSwgMHgwNSwgMHhGRCwKLQkweEYxLCAweDA0LCAweEYwLCAweEY3LCAweDJELCAweDEwLCAweDYxLCAweDQ2LCAweDBELCAweEZBLCAweDU4LAotCTB4MDEsIDB4MTMsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QzQsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgxNCwKLQkweDA3LCAweDczLCAweEYyLCAweDk5LCAweDI1LCAweEMyLCAweDM5LCAweDU0LCAweEYyLCAweDA1LCAweDA2LAotCTB4MzcsIDB4RkQsIDB4MkIsIDB4MDEsIDB4OUUsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwgMHgyQywgMHhGRCwgMHgxNSwgMHgwNiwKLQkweDQxLCAweEYyLCAweDZBLCAweDM5LCAweDBBLCAweDI2LCAweDYxLCAweEYyLCAweDE3LCAweDA3LCAweDMxLAotCTB4RkMsIDB4RTIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhDNiwgMHhGRiwgMHg2OSwgMHgwMCwgMHg5MSwgMHhGRiwgMHgwMCwgMHgwMCwgMHg3OCwgMHgwMSwgMHhEMCwKLQkweEY5LCAweDM5LCAweDQ2LCAweDk4LCAweDEwLCAweENCLCAweEY3LCAweDAyLCAweDA1LCAweEZFLCAweEZDLAotCTB4OUYsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsCi0JMHgwMCwgMHg2OSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg5RCwgMHhGRCwgMHhCOSwgMHgwMywgMHg3QiwgMHhGQSwKLQkweDQwLCAweDA5LCAweDYzLCAweDQ4LCAweEJGLCAweEZFLCAweDAzLCAweEZGLCAweDVGLCAweDAxLCAweEQ0LAotCTB4RkUsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg0RiwgMHhGQywgMHg5QywgMHgwNiwgMHhGNSwgMHhGMywgMHhFQSwKLQkweDFELCAweDQ3LCAweDNGLCAweDFCLCAweEY0LCAweEMxLCAweDA0LCAweDBCLCAweEZFLCAweEFDLCAweDAwLAotCTB4REUsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkEsCi0JMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywgMHhEQiwgMHgwNiwgMHg4NiwgMHhGMSwgMHhGMiwgMHgzMiwKLQkweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLCAweDA3LCAweDUzLCAweEZDLCAweEMwLCAweDAxLCAweDUwLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MTcsIDB4MDAsCi0JMHgzOSwgMHgwMCwgMHhENCwgMHhGRSwgMHg3QSwgMHgwMywgMHgyRiwgMHhGNiwgMHhDNywgMHg0MiwgMHgwNiwKLQkweDE4LCAweDdCLCAweEY1LCAweDA1LCAweDA2LCAweDhBLCAweEZDLCAweENGLCAweDAxLCAweDNDLCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODgsIDB4RkYsIDB4MDcsIDB4MDEsIDB4NDksCi0JMHhGRSwgMHg2NywgMHgwMiwgMHgxMywgMHhGRCwgMHhGRiwgMHgwMiwgMHhGNCwgMHg0OCwgMHg1RiwgMHgwNCwKLQkweDdBLCAweEZDLCAweEI2LCAweDAyLCAweDIwLCAweEZFLCAweDFCLCAweDAxLCAweDgxLCAweEZGLCAweDFGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzYsIDB4MDEsCi0JMHhBMSwgMHhGQywgMHhDRiwgMHgwNSwgMHhGQywgMHhGNSwgMHg0NywgMHgxNiwgMHhCMCwgMHg0MywgMHhFRSwKLQkweEY2LCAweDBDLCAweDAzLCAweDE2LCAweEZGLCAweDE0LCAweDAwLCAweDI5LCAweDAwLCAweERGLCAweEZGLAotCTB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4Q0EsIDB4MDEsIDB4NDYsCi0JMHhGQywgMHgyOSwgMHgwNywgMHhCMywgMHhGMSwgMHhEMSwgMHgyQiwgMHg4MSwgMHgzNCwgMHg5QywgMHhGMSwKLQkweEI4LCAweDA2LCAweEI1LCAweEZDLCAweDdDLCAweDAxLCAweDc0LCAweEZGLCAweDIyLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4Q0MsIDB4MDAsIDB4RDUsIDB4RkQsCi0JMHgxNiwgMHgwNSwgMHg5QiwgMHhGMywgMHgxOCwgMHgzRSwgMHhCMSwgMHgxRiwgMHg4RiwgMHhGMywgMHhDMCwKLQkweDA2LCAweDQzLCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MTUsIDB4MDAsIDB4QUEsIDB4RkYsIDB4QjEsIDB4MDAsIDB4RkUsIDB4RkUsIDB4MTAsIDB4MDEsIDB4OTIsCi0JMHhGRiwgMHg5NCwgMHhGRCwgMHgwRCwgMHg0OCwgMHhDQiwgMHgwQSwgMHhFMiwgMHhGOSwgMHgwNCwgMHgwNCwKLQkweDc3LCAweEZELCAweDY5LCAweDAxLCAweDYyLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTIsIDB4RkYsIDB4OTEsIDB4MDEsIDB4MUUsIDB4RkQsIDB4QkUsIDB4MDQsCi0JMHg1RSwgMHhGOCwgMHhGMCwgMHgwRSwgMHhEMywgMHg0NiwgMHhDQiwgMHhGQSwgMHhGNiwgMHgwMCwgMHg0QiwKLQkweDAwLCAweDY5LCAweEZGLCAweDdELCAweDAwLCAweEJFLCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MDYsIDB4MDcsIDB4QUEsCi0JMHhGMiwgMHg0NiwgMHgyNCwgMHhDOCwgMHgzQSwgMHg5MCwgMHhGMiwgMHhENiwgMHgwNSwgMHg1NywgMHhGRCwKLQkweDE3LCAweDAxLCAweEE4LCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE4LAotCTB4MDAsIDB4OTEsIDB4RkYsIDB4NDMsIDB4MDEsIDB4MEUsIDB4RkQsIDB4NDAsIDB4MDYsIDB4MEYsIDB4RjIsCi0JMHg1QiwgMHgzOCwgMHg1QywgMHgyNywgMHgzMCwgMHhGMiwgMHgyMSwgMHgwNywgMHgzMywgMHhGQywgMHhERSwKLQkweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENDLCAweEZGLAotCTB4NUEsIDB4MDAsIDB4QUYsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MUMsIDB4RjksIDB4QjgsCi0JMHg0NSwgMHhEQSwgMHgxMSwgMHg2MCwgMHhGNywgMHgzMywgMHgwNSwgMHhFNywgMHhGQywgMHhBOSwgMHgwMSwKLQkweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZFLAotCTB4RkYsIDB4NEIsIDB4MDEsIDB4QjksIDB4RkQsIDB4ODAsIDB4MDMsIDB4RUUsIDB4RkEsIDB4MUQsIDB4MDgsCi0JMHg5OCwgMHg0OCwgMHhBOCwgMHhGRiwgMHg5NSwgMHhGRSwgMHg5QSwgMHgwMSwgMHhCNCwgMHhGRSwgMHhENCwKLQkweDAwLCAweDlDLCAweEZGLCAweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAotCTB4REYsIDB4MDEsIDB4NUEsIDB4RkMsIDB4N0UsIDB4MDYsIDB4NDcsIDB4RjQsIDB4OTQsIDB4MUMsIDB4MUYsCi0JMHg0MCwgMHg4NSwgMHhGNCwgMHg3RCwgMHgwNCwgMHgzNiwgMHhGRSwgMHg5MywgMHgwMCwgMHhFQSwgMHhGRiwKLQkweEY3LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDlCLAotCTB4MDEsIDB4ODYsIDB4RkMsIDB4RjEsIDB4MDYsIDB4N0UsIDB4RjEsIDB4QzAsIDB4MzEsIDB4QzIsIDB4MkUsCi0JMHg4NywgMHhGMSwgMHgxNywgMHgwNywgMHg1RiwgMHhGQywgMHhCNiwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyRCwKLQkweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVCLCAweEZGLCAweDA5LCAweDAwLCAweDU0LCAweDAwLAotCTB4QTQsIDB4RkUsIDB4QzksIDB4MDMsIDB4QUEsIDB4RjUsIDB4MEMsIDB4NDIsIDB4NTYsIDB4MTksIDB4MUUsCi0JMHhGNSwgMHgyQiwgMHgwNiwgMHg3QSwgMHhGQywgMHhENCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhFLCAweEZGLCAweEY5LCAweDAwLCAweDY4LCAweEZFLCAweDJDLAotCTB4MDIsIDB4ODQsIDB4RkQsIDB4RkYsIDB4MDEsIDB4RTYsIDB4NDgsIDB4NkUsIDB4MDUsIDB4MDcsIDB4RkMsCi0JMHhGMSwgMHgwMiwgMHgwMSwgMHhGRSwgMHgyOSwgMHgwMSwgMHg3QiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJFLCAweDAxLCAweEI0LCAweEZDLAotCTB4QTQsIDB4MDUsIDB4NjEsIDB4RjYsIDB4RkIsIDB4MTQsIDB4NTMsIDB4NDQsIDB4ODYsIDB4RjcsIDB4QjYsCi0JMHgwMiwgMHg0OSwgMHhGRiwgMHhGNywgMHhGRiwgMHgzNywgMHgwMCwgMHhEOSwgMHhGRiwgMHgwQSwgMHgwMCwKLQkweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ2LCAweEZGLCAweEQxLCAweDAxLCAweDNFLCAweEZDLCAweDJCLAotCTB4MDcsIDB4RDAsIDB4RjEsIDB4ODksIDB4MkEsIDB4QTYsIDB4MzUsIDB4QjQsIDB4RjEsIDB4OTksIDB4MDYsCi0JMHhDRCwgMHhGQywgMHg2RCwgMHgwMSwgMHg3QywgMHhGRiwgMHgxRiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwKLQkweDAwLCAweDA2LCAweDAwLCAweEMyLCAweEZGLCAweEUzLCAweDAwLCAweEFFLCAweEZELCAweDUyLCAweDA1LAotCTB4NDQsIDB4RjMsIDB4MkEsIDB4M0QsIDB4MDYsIDB4MjEsIDB4NDcsIDB4RjMsIDB4RDgsIDB4MDYsIDB4M0MsCi0JMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwKLQkweEIwLCAweEZGLCAweEEyLCAweDAwLCAweDFELCAweEZGLCAweEQ2LCAweDAwLCAweEZDLCAweEZGLCAweEJDLAotCTB4RkMsIDB4QzAsIDB4NDcsIDB4RkEsIDB4MEIsIDB4NzAsIDB4RjksIDB4M0MsIDB4MDQsIDB4NUMsIDB4RkQsCi0JMHg3NSwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwKLQkweDAwLCAweDU3LCAweEZGLCAweDg2LCAweDAxLCAweDM2LCAweEZELCAweDg5LCAweDA0LCAweENELCAweEY4LAotCTB4QjcsIDB4MEQsIDB4M0QsIDB4NDcsIDB4OTEsIDB4RkIsIDB4OTEsIDB4MDAsIDB4ODMsIDB4MDAsIDB4NEEsCi0JMHhGRiwgMHg4QywgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEY1LCAweDA2LCAweEU3LCAweEYyLCAweEYyLAotCTB4MjIsIDB4QzcsIDB4M0IsIDB4RDQsIDB4RjIsIDB4QTIsIDB4MDUsIDB4N0EsIDB4RkQsIDB4MDIsIDB4MDEsCi0JMHhCMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4OCwKLQkweEZGLCAweDU1LCAweDAxLCAweEYyLCAweEZDLCAweDY3LCAweDA2LCAweEU0LCAweEYxLCAweDQ0LCAweDM3LAotCTB4QUEsIDB4MjgsIDB4MDUsIDB4RjIsIDB4MjcsIDB4MDcsIDB4MzYsIDB4RkMsIDB4REEsIDB4MDEsIDB4NDEsCi0JMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhEMiwgMHhGRiwgMHg0QywgMHgwMCwKLQkweENELCAweEZGLCAweDk0LCAweEZGLCAweDM0LCAweDAyLCAweDcwLCAweEY4LCAweDJFLCAweDQ1LCAweDIwLAotCTB4MTMsIDB4RjYsIDB4RjYsIDB4NjIsIDB4MDUsIDB4RDEsIDB4RkMsIDB4QjIsIDB4MDEsIDB4NDYsIDB4RkYsCi0JMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MywgMHhGRiwgMHgzRCwKLQkweDAxLCAweEQ2LCAweEZELCAweDQ2LCAweDAzLCAweDYxLCAweEZCLCAweDAwLCAweDA3LCAweEJGLCAweDQ4LAotCTB4OTgsIDB4MDAsIDB4MjYsIDB4RkUsIDB4RDUsIDB4MDEsIDB4OTUsIDB4RkUsIDB4RTMsIDB4MDAsIDB4OTYsCi0JMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQiwgMHgwMSwKLQkweDY2LCAweEZDLCAweDVFLCAweDA2LCAweDlDLCAweEY0LCAweDQwLCAweDFCLCAweEVGLCAweDQwLCAweEY3LAotCTB4RjQsIDB4MzUsIDB4MDQsIDB4NjIsIDB4RkUsIDB4N0EsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RjIsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHhBNywgMHgwMSwgMHg3NSwKLQkweEZDLCAweDAzLCAweDA3LCAweDdELCAweEYxLCAweDhBLCAweDMwLCAweEZGLCAweDJGLCAweDdFLCAweEYxLAotCTB4MEEsIDB4MDcsIDB4NkUsIDB4RkMsIDB4QUMsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwNSwgMHgwMCwgMHhGMCwgMHhGRiwgMHhGQywgMHhGRiwgMHg2RSwgMHgwMCwgMHg3NiwgMHhGRSwKLQkweDE1LCAweDA0LCAweDJDLCAweEY1LCAweDQ5LCAweDQxLCAweEE5LCAweDFBLCAweEMzLCAweEY0LCAweDRGLAotCTB4MDYsIDB4NkMsIDB4RkMsIDB4RDksIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxQSwgMHgwMCwgMHg5NCwgMHhGRiwgMHhFQSwgMHgwMCwgMHg4NywgMHhGRSwgMHhGMCwgMHgwMSwgMHhGNSwKLQkweEZELCAweDA1LCAweDAxLCAweENFLCAweDQ4LCAweDgzLCAweDA2LCAweDk0LCAweEZCLCAweDJDLCAweDAzLAotCTB4RTQsIDB4RkQsIDB4MzcsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwgMHhGRiwgMHhCNiwgMHgwMSwgMHhDOCwgMHhGQywgMHg3NywgMHgwNSwKLQkweEM3LCAweEY2LCAweEIxLCAweDEzLCAweEVELCAweDQ0LCAweDI2LCAweEY4LCAweDVELCAweDAyLCAweDdELAotCTB4RkYsIDB4REEsIDB4RkYsIDB4NDYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzMywgMHgwMCwgMHg0MiwgMHhGRiwgMHhENywgMHgwMSwgMHgzOCwgMHhGQywgMHgyOSwgMHgwNywgMHhGMywKLQkweEYxLCAweDNFLCAweDI5LCAweEM2LCAweDM2LCAweEQ0LCAweEYxLCAweDc3LCAweDA2LCAweEU2LCAweEZDLAotCTB4NUMsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEEsCi0JMHgwMCwgMHhCNywgMHhGRiwgMHhGOSwgMHgwMCwgMHg4OSwgMHhGRCwgMHg4QSwgMHgwNSwgMHhGNCwgMHhGMiwKLQkweDM3LCAweDNDLCAweDVCLCAweDIyLCAweDAzLCAweEYzLCAweEVELCAweDA2LCAweDM3LCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjYsIDB4RkYsCi0JMHg5MywgMHgwMCwgMHgzQywgMHhGRiwgMHg5RCwgMHgwMCwgMHg2MywgMHgwMCwgMHhFQiwgMHhGQiwgMHg2OSwKLQkweDQ3LCAweDJELCAweDBELCAweEZGLCAweEY4LCAweDcyLCAweDA0LCAweDQyLCAweEZELCAweDgxLCAweDAxLAotCTB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUIsCi0JMHhGRiwgMHg3QSwgMHgwMSwgMHg1MCwgMHhGRCwgMHg1NCwgMHgwNCwgMHgzRCwgMHhGOSwgMHg4MiwgMHgwQywKLQkweDlBLCAweDQ3LCAweDVFLCAweEZDLCAweDJBLCAweDAwLCAweEJELCAweDAwLCAweDJCLCAweEZGLCAweDlCLAotCTB4MDAsIDB4QjMsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhFNiwgMHgwMSwgMHgzQSwgMHhGQywgMHhFMiwgMHgwNiwgMHgyOCwgMHhGMywgMHg5RSwgMHgyMSwgMHhDMCwKLQkweDNDLCAweDFGLCAweEYzLCAweDZDLCAweDA1LCAweDlFLCAweEZELCAweEVELCAweDAwLCAweEJELCAweEZGLAotCTB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODAsIDB4RkYsIDB4NjYsCi0JMHgwMSwgMHhEOCwgMHhGQywgMHg4QiwgMHgwNiwgMHhDMSwgMHhGMSwgMHgyNywgMHgzNiwgMHhGNiwgMHgyOSwKLQkweERGLCAweEYxLCAweDJBLCAweDA3LCAweDNCLCAweEZDLCAweEQ0LCAweDAxLCAweDQ0LCAweEZGLCAweDMyLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4M0UsIDB4MDAsIDB4RUEsIDB4RkYsCi0JMHg2MCwgMHhGRiwgMHg4RiwgMHgwMiwgMHhDRCwgMHhGNywgMHg5OSwgMHg0NCwgMHg2OCwgMHgxNCwgMHg4RSwKLQkweEY2LCAweDkwLCAweDA1LCAweEJDLCAweEZDLCAweEJBLCAweDAxLCAweDQzLCAweEZGLCAweDMyLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzksIDB4RkYsIDB4MkYsIDB4MDEsIDB4RjQsCi0JMHhGRCwgMHgwQywgMHgwMywgMHhENCwgMHhGQiwgMHhFOSwgMHgwNSwgMHhERSwgMHg0OCwgMHg4RiwgMHgwMSwKLQkweEI2LCAweEZELCAweDExLCAweDAyLCAweDc2LCAweEZFLCAweEYyLCAweDAwLCAweDkxLCAweEZGLCAweDFCLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDcsIDB4MDEsIDB4NzMsIDB4RkMsCi0JMHgzQiwgMHgwNiwgMHhGNSwgMHhGNCwgMHhFRCwgMHgxOSwgMHhCNywgMHg0MSwgMHg3MSwgMHhGNSwgMHhFQiwKLQkweDAzLCAweDkwLCAweEZFLCAweDYwLCAweDAwLCAweDA0LCAweDAwLCAweEVELCAweEZGLCAweDA2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsIDB4RkYsIDB4QjIsIDB4MDEsIDB4NjUsIDB4RkMsIDB4MTIsCi0JMHgwNywgMHg4MiwgMHhGMSwgMHg1MCwgMHgyRiwgMHgzOCwgMHgzMSwgMHg3QywgMHhGMSwgMHhGOSwgMHgwNiwKLQkweDdFLCAweEZDLCAweEExLCAweDAxLCAweDYxLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA0LAotCTB4MDAsIDB4RjUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4ODgsIDB4MDAsIDB4NDksIDB4RkUsIDB4NUQsIDB4MDQsCi0JMHhCNywgMHhGNCwgMHg3RCwgMHg0MCwgMHhGRCwgMHgxQiwgMHg2QywgMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwKLQkweEZDLCAweERFLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLAotCTB4OUEsIDB4RkYsIDB4REIsIDB4MDAsIDB4QTYsIDB4RkUsIDB4QjQsIDB4MDEsIDB4NjQsIDB4RkUsIDB4MTIsCi0JMHgwMCwgMHhBQSwgMHg0OCwgMHg5RSwgMHgwNywgMHgyMSwgMHhGQiwgMHg2NiwgMHgwMywgMHhDNiwgMHhGRCwKLQkweDQ1LCAweDAxLCAweDcwLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLAotCTB4MDAsIDB4NDgsIDB4RkYsIDB4QUQsIDB4MDEsIDB4REQsIDB4RkMsIDB4NDgsIDB4MDUsIDB4MzAsIDB4RjcsCi0JMHg2QiwgMHgxMiwgMHg3RCwgMHg0NSwgMHhDRiwgMHhGOCwgMHgwMSwgMHgwMiwgMHhCMiwgMHhGRiwgMHhCRCwKLQkweEZGLCAweDU0LCAweDAwLCAweENFLCAweEZGLCAweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4M0YsIDB4RkYsIDB4REMsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjQsIDB4MDcsIDB4MUMsIDB4RjIsIDB4RjAsCi0JMHgyNywgMHhERiwgMHgzNywgMHhGQiwgMHhGMSwgMHg1MSwgMHgwNiwgMHgwMSwgMHhGRCwgMHg0QiwgMHgwMSwKLQkweDhELCAweEZGLCAweDE5LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLAotCTB4RkYsIDB4MEUsIDB4MDEsIDB4NjYsIDB4RkQsIDB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsCi0JMHhCMCwgMHgyMywgMHhDNCwgMHhGMiwgMHhGRiwgMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJDLCAweEZGLCAweDg0LCAweDAwLAotCTB4NUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzksIDB4MDAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NDcsIDB4NjQsCi0JMHgwRSwgMHg4RiwgMHhGOCwgMHhBNywgMHgwNCwgMHgyOSwgMHhGRCwgMHg4QywgMHgwMSwgMHg1NCwgMHhGRiwKLQkweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDYwLCAweEZGLCAweDZFLAotCTB4MDEsIDB4NkIsIDB4RkQsIDB4MUQsIDB4MDQsIDB4QUYsIDB4RjksIDB4NTEsIDB4MEIsIDB4RUMsIDB4NDcsCi0JMHgzMywgMHhGRCwgMHhDMSwgMHhGRiwgMHhGNywgMHgwMCwgMHgwQywgMHhGRiwgMHhBQSwgMHgwMCwgMHhBRCwKLQkweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAotCTB4NDAsIDB4RkMsIDB4Q0IsIDB4MDYsIDB4NkUsIDB4RjMsIDB4NDksIDB4MjAsIDB4QjAsIDB4M0QsIDB4NzMsCi0JMHhGMywgMHgzMSwgMHgwNSwgMHhDNCwgMHhGRCwgMHhENiwgMHgwMCwgMHhDOCwgMHhGRiwgMHgwMywgMHgwMCwKLQkweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLCAweDc1LCAweDAxLCAweEJGLAotCTB4RkMsIDB4QUIsIDB4MDYsIDB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsIDB4MkIsIDB4QkYsIDB4RjEsCi0JMHgyQSwgMHgwNywgMHg0MiwgMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA5LCAweDAwLCAweERDLCAweEZGLCAweDJGLCAweDAwLCAweDA3LCAweDAwLCAweDJDLCAweEZGLAotCTB4RTYsIDB4MDIsIDB4MzEsIDB4RjcsIDB4RkEsIDB4NDMsIDB4QjMsIDB4MTUsIDB4MjksIDB4RjYsIDB4QkMsCi0JMHgwNSwgMHhBOSwgMHhGQywgMHhDMiwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdFLCAweEZGLCAweDIxLCAweDAxLCAweDEyLCAweEZFLCAweEQxLAotCTB4MDIsIDB4NDcsIDB4RkMsIDB4RDcsIDB4MDQsIDB4RjAsIDB4NDgsIDB4OEQsIDB4MDIsIDB4NDUsIDB4RkQsCi0JMHg0RCwgMHgwMiwgMHg1NiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLCAweEQxLCAweDAxLCAweDgzLCAweEZDLCAweDE2LCAweDA2LAotCTB4NTEsIDB4RjUsIDB4OUIsIDB4MTgsIDB4NzUsIDB4NDIsIDB4RjMsIDB4RjUsIDB4OUQsIDB4MDMsIDB4QkYsCi0JMHhGRSwgMHg0NSwgMHgwMCwgMHgxMSwgMHgwMCwgMHhFOCwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJFLCAweDAwLCAweDUyLCAweEZGLCAweEJDLCAweDAxLCAweDU4LCAweEZDLCAweDFELCAweDA3LCAweDhFLAotCTB4RjEsIDB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsIDB4ODEsIDB4RjEsIDB4RTUsIDB4MDYsIDB4OTAsIDB4RkMsCi0JMHg5NCwgMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGOSwKLQkweEZGLCAweEUzLCAweEZGLCAweEExLCAweDAwLCAweDFFLCAweEZFLCAweEEzLCAweDA0LCAweDQ5LCAweEY0LAotCTB4QTgsIDB4M0YsIDB4NTIsIDB4MUQsIDB4MTksIDB4RjQsIDB4OTAsIDB4MDYsIDB4NTMsIDB4RkMsIDB4RTEsCi0JMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMCwgMHhGRiwKLQkweENDLCAweDAwLCAweEM2LCAweEZFLCAweDc5LCAweDAxLCAweEQyLCAweEZFLCAweDI2LCAweEZGLCAweDdDLAotCTB4NDgsIDB4QkUsIDB4MDgsIDB4QUUsIDB4RkEsIDB4QTAsIDB4MDMsIDB4QTksIDB4RkQsIDB4NTIsIDB4MDEsCi0JMHg2QiwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywKLQkweEZGLCAweEEzLCAweDAxLCAweEYzLCAweEZDLCAweDE4LCAweDA1LCAweDlCLCAweEY3LCAweDI3LCAweDExLAotCTB4MDIsIDB4NDYsIDB4N0YsIDB4RjksIDB4QTMsIDB4MDEsIDB4RTgsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NjMsCi0JMHgwMCwgMHhDOSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwKLQkweEUwLCAweDAxLCAweDMyLCAweEZDLCAweDFDLCAweDA3LCAweDRCLCAweEYyLCAweEEwLCAweDI2LCAweEYyLAotCTB4MzgsIDB4MkEsIDB4RjIsIDB4MjgsIDB4MDYsIDB4MUYsIDB4RkQsIDB4MzksIDB4MDEsIDB4OTYsIDB4RkYsCi0JMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHhBMiwgMHhGRiwgMHgyMiwKLQkweDAxLCAweDQ1LCAweEZELCAweEYxLCAweDA1LCAweDZELCAweEYyLCAweDM4LCAweDNBLCAweDAzLCAweDI1LAotCTB4OEIsIDB4RjIsIDB4MEUsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMiwgMHhGRiwgMHg3NSwgMHgwMCwgMHg3QSwgMHhGRiwKLQkweDJCLCAweDAwLCAweDJELCAweDAxLCAweDYxLCAweEZBLCAweDk3LCAweDQ2LCAweEEwLCAweDBGLCAweDIwLAotCTB4RjgsIDB4REEsIDB4MDQsIDB4MTAsIDB4RkQsIDB4OTcsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg2MiwgMHgwMSwgMHg4NywKLQkweEZELCAweEU1LCAweDAzLCAweDIxLCAweEZBLCAweDI1LCAweDBBLCAweDMzLCAweDQ4LCAweDBGLCAweEZFLAotCTB4NTcsIDB4RkYsIDB4MzEsIDB4MDEsIDB4RUMsIDB4RkUsIDB4QjksIDB4MDAsIDB4QTcsIDB4RkYsIDB4MTUsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0OCwgMHhGQywKLQkweEIyLCAweDA2LCAweEI5LCAweEYzLCAweEYzLCAweDFFLCAweDk4LCAweDNFLCAweENGLCAweEYzLCAweEYzLAotCTB4MDQsIDB4RUIsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MCwgMHhGRiwgMHg4NCwgMHgwMSwgMHhBOSwgMHhGQywgMHhDNywKLQkweDA2LCAweDkxLCAweEYxLCAweERDLCAweDMzLCAweDg3LCAweDJDLCAweEE1LCAweEYxLCAweDI2LCAweDA3LAotCTB4NEIsIDB4RkMsIDB4QzYsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsCi0JMHgwMCwgMHhFMiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgyMywgMHgwMCwgMHhGQSwgMHhGRSwgMHgzQSwgMHgwMywKLQkweDlELCAweEY2LCAweDUwLCAweDQzLCAweDAwLCAweDE3LCAweEM2LCAweEY1LCAweEU2LCAweDA1LCAweDk3LAotCTB4RkMsIDB4QzksIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMywgMHgwMSwgMHgzMSwgMHhGRSwgMHg5NSwgMHgwMiwgMHhCQSwKLQkweEZDLCAweENCLCAweDAzLCAweEY3LCAweDQ4LCAweDkxLCAweDAzLCAweEQzLCAweEZDLCAweDg4LCAweDAyLAotCTB4MzgsIDB4RkUsIDB4MTAsIDB4MDEsIDB4ODUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsCi0JMHgwMCwgMHgzRCwgMHhGRiwgMHhDQiwgMHgwMSwgMHg5MywgMHhGQywgMHhFRiwgMHgwNSwgMHhCMCwgMHhGNSwKLQkweDRCLCAweDE3LCAweDJBLCAweDQzLCAweDdELCAweEY2LCAweDRELCAweDAzLCAweEVGLCAweEZFLCAweDJBLAotCTB4MDAsIDB4MUUsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHg0RCwgMHhGRiwgMHhDNCwgMHgwMSwgMHg0RCwgMHhGQywgMHgyNSwgMHgwNywgMHhBMSwgMHhGMSwgMHhDRSwKLQkweDJDLCAweDk5LCAweDMzLCAweDhFLCAweEYxLCAweENELCAweDA2LCAweEE0LCAweEZDLCAweDg3LCAweDAxLAotCTB4NkUsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RDcsCi0JMHhGRiwgMHhCQSwgMHgwMCwgMHhGNCwgMHhGRCwgMHhFNSwgMHgwNCwgMHhFNCwgMHhGMywgMHhDQSwgMHgzRSwKLQkweEE3LCAweDFFLCAweENBLCAweEYzLCAweEFDLCAweDA2LCAweDRBLCAweEZDLCAweEU0LCAweDAxLCAweDM2LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTYsIDB4RkYsIDB4QkQsIDB4MDAsCi0JMHhFNSwgMHhGRSwgMHgzRSwgMHgwMSwgMHgzRiwgMHhGRiwgMHg0MSwgMHhGRSwgMHg0MSwgMHg0OCwgMHhFNCwKLQkweDA5LCAweDNCLCAweEZBLCAweEQ5LCAweDAzLCAweDhELCAweEZELCAweDVGLCAweDAxLCAweDY2LCAweEZGLAotCTB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEYsIDB4RkYsIDB4OTksCi0JMHgwMSwgMHgwQiwgMHhGRCwgMHhFNiwgMHgwNCwgMHgwOCwgMHhGOCwgMHhFNywgMHgwRiwgMHg3QywgMHg0NiwKLQkweDM3LCAweEZBLCAweDQyLCAweDAxLCAweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDcxLCAweDAwLCAweEMzLAotCTB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTMsIDB4MDEsCi0JMHgzMSwgMHhGQywgMHgxMSwgMHgwNywgMHg3RiwgMHhGMiwgMHg0RSwgMHgyNSwgMHhGRCwgMHgzOSwgMHg2MCwKLQkweEYyLCAweEZCLCAweDA1LCAweDNFLCAweEZELCAweDI2LCAweDAxLCAweEEwLCAweEZGLCAweDEyLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MzUsIDB4MDEsIDB4MjUsCi0JMHhGRCwgMHgxRSwgMHgwNiwgMHgzNSwgMHhGMiwgMHgyRSwgMHgzOSwgMHg1NSwgMHgyNiwgMHg1NiwgMHhGMiwKLQkweDFBLCAweDA3LCAweDMxLCAweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NjYsIDB4MDAsIDB4OTgsIDB4RkYsIDB4RjQsIDB4RkYsCi0JMHg4RSwgMHgwMSwgMHhBNywgMHhGOSwgMHgxRCwgMHg0NiwgMHhERiwgMHgxMCwgMHhCMywgMHhGNywgMHgwRCwKLQkweDA1LCAweEY4LCAweEZDLCAweEExLCAweDAxLCAweDRDLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NkEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4QTMsIDB4RkQsIDB4QUQsCi0JMHgwMywgMHg5NCwgMHhGQSwgMHhGRiwgMHgwOCwgMHg3MCwgMHg0OCwgMHhGMywgMHhGRSwgMHhFQSwgMHhGRSwKLQkweDZDLCAweDAxLCAweENELCAweEZFLCAweEM5LCAweDAwLCAweEExLCAweEZGLCAweDE3LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NTEsIDB4RkMsIDB4OTYsIDB4MDYsCi0JMHgwNywgMHhGNCwgMHg5RSwgMHgxRCwgMHg3NywgMHgzRiwgMHgzMiwgMHhGNCwgMHhCMiwgMHgwNCwgMHgxNSwKLQkweEZFLCAweEE3LCAweDAwLCAweEUwLCAweEZGLCAweEZBLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLAotCTB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4OTEsIDB4MDEsIDB4OTQsIDB4RkMsIDB4RTAsIDB4MDYsIDB4ODQsCi0JMHhGMSwgMHhBRiwgMHgzMiwgMHhDQSwgMHgyRCwgMHg5MiwgMHhGMSwgMHgxRiwgMHgwNywgMHg1NiwgMHhGQywKLQkweEJFLCAweDAxLCAweDUxLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU3LAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4M0YsIDB4MDAsIDB4QzksIDB4RkUsIDB4OEMsIDB4MDMsIDB4MTEsIDB4RjYsCi0JMHg5RSwgMHg0MiwgMHg1MCwgMHgxOCwgMHg2NiwgMHhGNSwgMHgwRCwgMHgwNiwgMHg4NiwgMHhGQywgMHhEMCwKLQkweDAxLCAweDNCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDhBLCAweEZGLAotCTB4MDQsIDB4MDEsIDB4NTAsIDB4RkUsIDB4NUEsIDB4MDIsIDB4MkMsIDB4RkQsIDB4QzYsIDB4MDIsIDB4RjIsCi0JMHg0OCwgMHg5QiwgMHgwNCwgMHg2MSwgMHhGQywgMHhDMywgMHgwMiwgMHgxOSwgMHhGRSwgMHgxRSwgMHgwMSwKLQkweDdGLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLAotCTB4RkYsIDB4QzQsIDB4MDEsIDB4QTUsIDB4RkMsIDB4QzUsIDB4MDUsIDB4MTMsIDB4RjYsIDB4RkQsIDB4MTUsCi0JMHhENCwgMHg0MywgMHgwRiwgMHhGNywgMHhGOSwgMHgwMiwgMHgyMSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgyQywKLQkweDAwLCAweERFLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ5LCAweEZGLAotCTB4Q0MsIDB4MDEsIDB4NDQsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjksIDB4RjEsIDB4ODksIDB4MkIsIDB4QzMsCi0JMHgzNCwgMHhBMCwgMHhGMSwgMHhCMSwgMHgwNiwgMHhCQSwgMHhGQywgMHg3OSwgMHgwMSwgMHg3NiwgMHhGRiwKLQkweDIxLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweENCLCAweEZGLCAweEQxLAotCTB4MDAsIDB4Q0MsIDB4RkQsIDB4MjQsIDB4MDUsIDB4ODcsIDB4RjMsIDB4RTQsIDB4M0QsIDB4RkQsIDB4MUYsCi0JMHg3RiwgMHhGMywgMHhDNiwgMHgwNiwgMHg0MSwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFDLCAweEZGLCAweEFFLCAweDAwLCAweDA1LCAweEZGLAotCTB4MDMsIDB4MDEsIDB4QUEsIDB4RkYsIDB4NjMsIDB4RkQsIDB4RkQsIDB4NDcsIDB4MEUsIDB4MEIsIDB4QzgsCi0JMHhGOSwgMHgxMSwgMHgwNCwgMHg3MSwgMHhGRCwgMHg2QywgMHgwMSwgMHg2MSwgMHhGRiwgMHgyOCwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLCAweDhGLCAweDAxLCAweDIzLAotCTB4RkQsIDB4QjIsIDB4MDQsIDB4NzYsIDB4RjgsIDB4QUEsIDB4MEUsIDB4RUQsIDB4NDYsIDB4RjcsIDB4RkEsCi0JMHhERiwgMHgwMCwgMHg1NywgMHgwMCwgMHg2MiwgMHhGRiwgMHg4MCwgMHgwMCwgMHhCRCwgMHhGRiwgMHgxMCwKLQkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLAotCTB4MDMsIDB4MDcsIDB4QjcsIDB4RjIsIDB4RkMsIDB4MjMsIDB4MDMsIDB4M0IsIDB4OUUsIDB4RjIsIDB4Q0IsCi0JMHgwNSwgMHg1RiwgMHhGRCwgMHgxMiwgMHgwMSwgMHhBQSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDE4LCAweDAwLCAweDhGLCAweEZGLCAweDQ3LCAweDAxLCAweDA4LCAweEZELCAweDQ5LAotCTB4MDYsIDB4MDUsIDB4RjIsIDB4MUQsIDB4MzgsIDB4QTYsIDB4MjcsIDB4MjYsIDB4RjIsIDB4MjMsIDB4MDcsCi0JMHgzMywgMHhGQywgMHhERCwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywKLQkweDAwLCAweENELCAweEZGLCAweDU3LCAweDAwLCAweEI2LCAweEZGLCAweEJFLCAweEZGLCAweEVELCAweDAxLAotCTB4RjUsIDB4RjgsIDB4OUIsIDB4NDUsIDB4MjIsIDB4MTIsIDB4NDgsIDB4RjcsIDB4M0QsIDB4MDUsIDB4RTIsCi0JMHhGQywgMHhBQiwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDI0LCAweDAwLCAweDZGLCAweEZGLCAweDQ4LCAweDAxLCAweEMwLCAweEZELCAweDczLCAweDAzLCAweDA3LAotCTB4RkIsIDB4REQsIDB4MDcsIDB4QTEsIDB4NDgsIDB4REQsIDB4RkYsIDB4N0QsIDB4RkUsIDB4QTcsIDB4MDEsCi0JMHhBRCwgMHhGRSwgMHhEOCwgMHgwMCwgMHg5QiwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLCAweDVDLCAweEZDLCAweDc4LCAweDA2LCAweDVBLCAweEY0LAotCTB4NDksIDB4MUMsIDB4NEUsIDB4NDAsIDB4OUUsIDB4RjQsIDB4NkQsIDB4MDQsIDB4M0YsIDB4RkUsIDB4OEUsCi0JMHgwMCwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwKLQkweDYyLCAweEZGLCAweDlFLCAweDAxLCAweDgyLCAweEZDLCAweEY1LCAweDA2LCAweDdELCAweEYxLCAweDdCLAotCTB4MzEsIDB4MDksIDB4MkYsIDB4ODQsIDB4RjEsIDB4MTUsIDB4MDcsIDB4NjIsIDB4RkMsIDB4QjQsIDB4MDEsCi0JMHg1NiwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwKLQkweDAwLCAweDVBLCAweDAwLCAweDlBLCAweEZFLCAweERBLCAweDAzLCAweDhELCAweEY1LCAweEUxLCAweDQxLAotCTB4QTEsIDB4MTksIDB4MDksIDB4RjUsIDB4MzMsIDB4MDYsIDB4NzcsIDB4RkMsIDB4RDYsIDB4MDEsIDB4M0EsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4RiwgMHhGRiwgMHhGNSwgMHgwMCwKLQkweDZGLCAweEZFLCAweDFFLCAweDAyLCAweDlELCAweEZELCAweEM3LCAweDAxLCAweEUxLCAweDQ4LCAweEFCLAotCTB4MDUsIDB4RUUsIDB4RkIsIDB4RkUsIDB4MDIsIDB4RkIsIDB4RkQsIDB4MkMsIDB4MDEsIDB4N0EsIDB4RkYsCi0JMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCQywKLQkweDAxLCAweEI4LCAweEZDLCAweDlBLCAweDA1LCAweDc3LCAweEY2LCAweEIxLCAweDE0LCAweDc3LCAweDQ0LAotCTB4QTksIDB4RjcsIDB4QTIsIDB4MDIsIDB4NTQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RDgsCi0JMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NSwgMHhGRiwgMHhEMywgMHgwMSwKLQkweDNDLCAweEZDLCAweDJBLCAweDA3LCAweEQ4LCAweEYxLCAweDNGLCAweDJBLCAweEU2LCAweDM1LCAweEJCLAotCTB4RjEsIDB4OTIsIDB4MDYsIDB4RDIsIDB4RkMsIDB4NjksIDB4MDEsIDB4N0UsIDB4RkYsIDB4MUYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwgMHhFOCwgMHgwMCwgMHhBNiwKLQkweEZELCAweDVGLCAweDA1LCAweDMxLCAweEYzLCAweEY2LCAweDNDLCAweDUyLCAweDIxLCAweDM3LCAweEYzLAotCTB4REQsIDB4MDYsIDB4M0IsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyNCwgMHhGRiwgMHhDOSwgMHgwMCwKLQkweDEzLCAweDAwLCAweDhELCAweEZDLCAweEFFLCAweDQ3LCAweDNFLCAweDBDLCAweDU2LCAweEY5LCAweDQ4LAotCTB4MDQsIDB4NTYsIDB4RkQsIDB4NzgsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4MywgMHgwMSwgMHgzQywgMHhGRCwgMHg3RSwKLQkweDA0LCAweEU2LCAweEY4LCAweDcyLCAweDBELCAweDUyLCAweDQ3LCAweEJFLCAweEZCLCAweDdBLCAweDAwLAotCTB4OTAsIDB4MDAsIDB4NDMsIDB4RkYsIDB4OEYsIDB4MDAsIDB4QjcsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhGMSwgMHgwNiwKLQkweEY1LCAweEYyLCAweEE3LCAweDIyLCAweEZGLCAweDNCLCAweEU0LCAweEYyLCAweDk2LCAweDA1LCAweDgxLAotCTB4RkQsIDB4RkQsIDB4MDAsIDB4QjUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxQywgMHgwMCwgMHg4NiwgMHhGRiwgMHg1OSwgMHgwMSwgMHhFQywgMHhGQywgMHg2RiwgMHgwNiwgMHhEQywKLQkweEYxLCAweDA0LCAweDM3LCAweEYzLCAweDI4LCAweEZDLCAweEYxLCAweDI4LCAweDA3LCAweDM3LCAweEZDLAotCTB4RDgsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDMsCi0JMHhGRiwgMHg0OSwgMHgwMCwgMHhENCwgMHhGRiwgMHg4OCwgMHhGRiwgMHg0OSwgMHgwMiwgMHg0QiwgMHhGOCwKLQkweDBELCAweDQ1LCAweDY4LCAweDEzLCAweERGLCAweEY2LCAweDZDLCAweDA1LCAweENDLCAweEZDLCAweEI0LAotCTB4MDEsIDB4NDUsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsCi0JMHg3NCwgMHhGRiwgMHgzQSwgMHgwMSwgMHhERCwgMHhGRCwgMHgzOSwgMHgwMywgMHg3QiwgMHhGQiwgMHhDMSwKLQkweDA2LCAweEM3LCAweDQ4LCAweENGLCAweDAwLCAweDBELCAweEZFLCAweEUzLCAweDAxLCAweDhFLCAweEZFLAotCTB4RTcsIDB4MDAsIDB4OTUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsCi0JMHhGRiwgMHhEQSwgMHgwMSwgMHg2OSwgMHhGQywgMHg1NywgMHgwNiwgMHhBRiwgMHhGNCwgMHhGNSwgMHgxQSwKLQkweDFELCAweDQxLCAweDExLCAweEY1LCAweDI1LCAweDA0LCAweDZDLCAweEZFLCAweDc0LCAweDAwLCAweEY5LAotCTB4RkYsIDB4RjEsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsCi0JMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwKLQkweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLCAweEFBLCAweDAxLCAweDVDLCAweEZGLAotCTB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjEsIDB4RkYsIDB4RjksIDB4RkYsIDB4NzQsCi0JMHgwMCwgMHg2QywgMHhGRSwgMHgyNSwgMHgwNCwgMHgxMSwgMHhGNSwgMHgxRCwgMHg0MSwgMHhGNSwgMHgxQSwKLQkweEFGLCAweEY0LCAweDU3LCAweDA2LCAweDY5LCAweEZDLCAweERBLCAweDAxLCAweDM4LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RTcsIDB4MDAsIDB4OEUsIDB4RkUsCi0JMHhFMywgMHgwMSwgMHgwRCwgMHhGRSwgMHhDRiwgMHgwMCwgMHhDNywgMHg0OCwgMHhDMSwgMHgwNiwgMHg3QiwKLQkweEZCLCAweDM5LCAweDAzLCAweERELCAweEZELCAweDNBLCAweDAxLCAweDc0LCAweEZGLCAweDIzLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsIDB4RkYsIDB4QjQsIDB4MDEsIDB4Q0MsCi0JMHhGQywgMHg2QywgMHgwNSwgMHhERiwgMHhGNiwgMHg2OCwgMHgxMywgMHgwRCwgMHg0NSwgMHg0QiwgMHhGOCwKLQkweDQ5LCAweDAyLCAweDg4LCAweEZGLCAweEQ0LCAweEZGLCAweDQ5LCAweDAwLCAweEQzLCAweEZGLCAweDBCLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MzcsIDB4RkMsCi0JMHgyOCwgMHgwNywgMHhGQywgMHhGMSwgMHhGMywgMHgyOCwgMHgwNCwgMHgzNywgMHhEQywgMHhGMSwgMHg2RiwKLQkweDA2LCAweEVDLCAweEZDLCAweDU5LCAweDAxLCAweDg2LCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLAotCTB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjUsIDB4RkYsIDB4RkQsIDB4MDAsIDB4ODEsIDB4RkQsIDB4OTYsCi0JMHgwNSwgMHhFNCwgMHhGMiwgMHhGRiwgMHgzQiwgMHhBNywgMHgyMiwgMHhGNSwgMHhGMiwgMHhGMSwgMHgwNiwKLQkweDM2LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLAotCTB4MDAsIDB4QjcsIDB4RkYsIDB4OEYsIDB4MDAsIDB4NDMsIDB4RkYsIDB4OTAsIDB4MDAsIDB4N0EsIDB4MDAsCi0JMHhCRSwgMHhGQiwgMHg1MiwgMHg0NywgMHg3MiwgMHgwRCwgMHhFNiwgMHhGOCwgMHg3RSwgMHgwNCwgMHgzQywKLQkweEZELCAweDgzLCAweDAxLCAweDU4LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4NzgsIDB4MDEsIDB4NTYsIDB4RkQsIDB4NDgsIDB4MDQsIDB4NTYsCi0JMHhGOSwgMHgzRSwgMHgwQywgMHhBRSwgMHg0NywgMHg4RCwgMHhGQywgMHgxMywgMHgwMCwgMHhDOSwgMHgwMCwKLQkweDI0LCAweEZGLCAweDlGLCAweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0IsIDB4RkMsIDB4REQsIDB4MDYsIDB4MzcsIDB4RjMsCi0JMHg1MiwgMHgyMSwgMHhGNiwgMHgzQywgMHgzMSwgMHhGMywgMHg1RiwgMHgwNSwgMHhBNiwgMHhGRCwgMHhFOCwKLQkweDAwLCAweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFGLCAweDAwLAotCTB4N0UsIDB4RkYsIDB4NjksIDB4MDEsIDB4RDIsIDB4RkMsIDB4OTIsIDB4MDYsIDB4QkIsIDB4RjEsIDB4RTYsCi0JMHgzNSwgMHgzRiwgMHgyQSwgMHhEOCwgMHhGMSwgMHgyQSwgMHgwNywgMHgzQywgMHhGQywgMHhEMywgMHgwMSwKLQkweDQ1LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ4LCAweEZGLCAweDNBLAotCTB4MDAsIDB4RjEsIDB4RkYsIDB4NTQsIDB4RkYsIDB4QTIsIDB4MDIsIDB4QTksIDB4RjcsIDB4NzcsIDB4NDQsCi0JMHhCMSwgMHgxNCwgMHg3NywgMHhGNiwgMHg5QSwgMHgwNSwgMHhCOCwgMHhGQywgMHhCQywgMHgwMSwgMHg0MiwKLQkweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLAotCTB4MkMsIDB4MDEsIDB4RkIsIDB4RkQsIDB4RkUsIDB4MDIsIDB4RUUsIDB4RkIsIDB4QUIsIDB4MDUsIDB4RTEsCi0JMHg0OCwgMHhDNywgMHgwMSwgMHg5RCwgMHhGRCwgMHgxRSwgMHgwMiwgMHg2RiwgMHhGRSwgMHhGNSwgMHgwMCwKLQkweDhGLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ2LAotCTB4MDEsIDB4NzcsIDB4RkMsIDB4MzMsIDB4MDYsIDB4MDksIDB4RjUsIDB4QTEsIDB4MTksIDB4RTEsIDB4NDEsCi0JMHg4RCwgMHhGNSwgMHhEQSwgMHgwMywgMHg5QSwgMHhGRSwgMHg1QSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywKLQkweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU2LCAweEZGLCAweEI0LCAweDAxLAotCTB4NjIsIDB4RkMsIDB4MTUsIDB4MDcsIDB4ODQsIDB4RjEsIDB4MDksIDB4MkYsIDB4N0IsIDB4MzEsIDB4N0QsCi0JMHhGMSwgMHhGNSwgMHgwNiwgMHg4MiwgMHhGQywgMHg5RSwgMHgwMSwgMHg2MiwgMHhGRiwgMHgyOCwgMHgwMCwKLQkweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDhFLCAweDAwLCAweDNGLAotCTB4RkUsIDB4NkQsIDB4MDQsIDB4OUUsIDB4RjQsIDB4NEUsIDB4NDAsIDB4NDksIDB4MUMsIDB4NUEsIDB4RjQsCi0JMHg3OCwgMHgwNiwgMHg1QywgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDE4LCAweDAwLCAweDlCLCAweEZGLCAweEQ4LCAweDAwLCAweEFELCAweEZFLCAweEE3LCAweDAxLAotCTB4N0QsIDB4RkUsIDB4REQsIDB4RkYsIDB4QTEsIDB4NDgsIDB4REQsIDB4MDcsIDB4MDcsIDB4RkIsIDB4NzMsCi0JMHgwMywgMHhDMCwgMHhGRCwgMHg0OCwgMHgwMSwgMHg2RiwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ5LCAweEZGLCAweEFCLCAweDAxLCAweEUyLCAweEZDLCAweDNELAotCTB4MDUsIDB4NDgsIDB4RjcsIDB4MjIsIDB4MTIsIDB4OUIsIDB4NDUsIDB4RjUsIDB4RjgsIDB4RUQsIDB4MDEsCi0JMHhCRSwgMHhGRiwgMHhCNiwgMHhGRiwgMHg1NywgMHgwMCwgMHhDRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERELCAweDAxLCAweDMzLCAweEZDLCAweDIzLCAweDA3LAotCTB4MjYsIDB4RjIsIDB4QTYsIDB4MjcsIDB4MUQsIDB4MzgsIDB4MDUsIDB4RjIsIDB4NDksIDB4MDYsIDB4MDgsCi0JMHhGRCwgMHg0NywgMHgwMSwgMHg4RiwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDBFLCAweDAwLCAweEFBLCAweEZGLCAweDEyLCAweDAxLCAweDVGLCAweEZELCAweENCLCAweDA1LCAweDlFLAotCTB4RjIsIDB4MDMsIDB4M0IsIDB4RkMsIDB4MjMsIDB4QjcsIDB4RjIsIDB4MDMsIDB4MDcsIDB4MzMsIDB4RkMsCi0JMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRCwKLQkweEZGLCAweDgwLCAweDAwLCAweDYyLCAweEZGLCAweDU3LCAweDAwLCAweERGLCAweDAwLCAweEY3LCAweEZBLAotCTB4RUQsIDB4NDYsIDB4QUEsIDB4MEUsIDB4NzYsIDB4RjgsIDB4QjIsIDB4MDQsIDB4MjMsIDB4RkQsIDB4OEYsCi0JMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwKLQkweDYxLCAweEZGLCAweDZDLCAweDAxLCAweDcxLCAweEZELCAweDExLCAweDA0LCAweEM4LCAweEY5LCAweDBFLAotCTB4MEIsIDB4RkQsIDB4NDcsIDB4NjMsIDB4RkQsIDB4QUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4MDUsIDB4RkYsCi0JMHhBRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKLQkweEZGLCAweEU1LCAweDAxLCAweDQxLCAweEZDLCAweEM2LCAweDA2LCAweDdGLCAweEYzLCAweEZELCAweDFGLAotCTB4RTQsIDB4M0QsIDB4ODcsIDB4RjMsIDB4MjQsIDB4MDUsIDB4Q0MsIDB4RkQsIDB4RDEsIDB4MDAsIDB4Q0IsCi0JMHhGRiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NiwgMHhGRiwKLQkweDc5LCAweDAxLCAweEJBLCAweEZDLCAweEIxLCAweDA2LCAweEEwLCAweEYxLCAweEMzLCAweDM0LCAweDg5LAotCTB4MkIsIDB4QjksIDB4RjEsIDB4MjksIDB4MDcsIDB4NDQsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4NDksIDB4RkYsCi0JMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQywgMHgwMCwgMHgwRCwKLQkweDAwLCAweDIxLCAweEZGLCAweEY5LCAweDAyLCAweDBGLCAweEY3LCAweEQ0LCAweDQzLCAweEZELCAweDE1LAotCTB4MTMsIDB4RjYsIDB4QzUsIDB4MDUsIDB4QTUsIDB4RkMsIDB4QzQsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMSwKLQkweDE5LCAweEZFLCAweEMzLCAweDAyLCAweDYxLCAweEZDLCAweDlCLCAweDA0LCAweEYyLCAweDQ4LCAweEM2LAotCTB4MDIsIDB4MkMsIDB4RkQsIDB4NUEsIDB4MDIsIDB4NTAsIDB4RkUsIDB4MDQsIDB4MDEsIDB4OEEsIDB4RkYsCi0JMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMCwgMHgwMSwgMHg4NiwKLQkweEZDLCAweDBELCAweDA2LCAweDY2LCAweEY1LCAweDUwLCAweDE4LCAweDlFLCAweDQyLCAweDExLCAweEY2LAotCTB4OEMsIDB4MDMsIDB4QzksIDB4RkUsIDB4M0YsIDB4MDAsIDB4MTQsIDB4MDAsIDB4RTcsIDB4RkYsIDB4MDcsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MSwgMHhGRiwgMHhCRSwgMHgwMSwgMHg1NiwgMHhGQywKLQkweDFGLCAweDA3LCAweDkyLCAweEYxLCAweENBLCAweDJELCAweEFGLCAweDMyLCAweDg0LCAweEYxLCAweEUwLAotCTB4MDYsIDB4OTQsIDB4RkMsIDB4OTEsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhFMCwgMHhGRiwgMHhBNywgMHgwMCwgMHgxNSwgMHhGRSwgMHhCMiwKLQkweDA0LCAweDMyLCAweEY0LCAweDc3LCAweDNGLCAweDlFLCAweDFELCAweDA3LCAweEY0LCAweDk2LCAweDA2LAotCTB4NTEsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsCi0JMHgwMCwgMHhBMSwgMHhGRiwgMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwgMHg2QywgMHgwMSwgMHhFQSwgMHhGRSwKLQkweEYzLCAweEZFLCAweDcwLCAweDQ4LCAweEZGLCAweDA4LCAweDk0LCAweEZBLCAweEFELCAweDAzLCAweEEzLAotCTB4RkQsIDB4NTUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMSwgMHgwMSwgMHhGOCwgMHhGQywgMHgwRCwgMHgwNSwgMHhCMywKLQkweEY3LCAweERGLCAweDEwLCAweDFELCAweDQ2LCAweEE3LCAweEY5LCAweDhFLCAweDAxLCAweEY0LCAweEZGLAotCTB4OTgsIDB4RkYsIDB4NjYsIDB4MDAsIDB4QzcsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHgzQywgMHhGRiwgMHhFMSwgMHgwMSwgMHgzMSwgMHhGQywgMHgxQSwgMHgwNywgMHg1NiwgMHhGMiwKLQkweDU1LCAweDI2LCAweDJFLCAweDM5LCAweDM1LCAweEYyLCAweDFFLCAweDA2LCAweDI1LCAweEZELCAweDM1LAotCTB4MDEsIDB4OTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsCi0JMHhBMCwgMHhGRiwgMHgyNiwgMHgwMSwgMHgzRSwgMHhGRCwgMHhGQiwgMHgwNSwgMHg2MCwgMHhGMiwgMHhGRCwKLQkweDM5LCAweDRFLCAweDI1LCAweDdGLCAweEYyLCAweDExLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLAotCTB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzMsIDB4RkYsIDB4NzEsCi0JMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg0MiwgMHgwMSwgMHgzNywgMHhGQSwgMHg3QywgMHg0NiwKLQkweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LCAweDA0LCAweDBCLCAweEZELCAweDk5LCAweDAxLCAweDRGLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsCi0JMHg1RiwgMHgwMSwgMHg4RCwgMHhGRCwgMHhEOSwgMHgwMywgMHgzQiwgMHhGQSwgMHhFNCwgMHgwOSwgMHg0MSwKLQkweDQ4LCAweDQxLCAweEZFLCAweDNGLCAweEZGLCAweDNFLCAweDAxLCAweEU1LCAweEZFLCAweEJELCAweDAwLAotCTB4QTYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsCi0JMHgwMSwgMHg0QSwgMHhGQywgMHhBQywgMHgwNiwgMHhDQSwgMHhGMywgMHhBNywgMHgxRSwgMHhDQSwgMHgzRSwKLQkweEU0LCAweEYzLCAweEU1LCAweDA0LCAweEY0LCAweEZELCAweEJBLCAweDAwLCAweEQ3LCAweEZGLCAweEZFLAotCTB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4ODcsIDB4MDEsCi0JMHhBNCwgMHhGQywgMHhDRCwgMHgwNiwgMHg4RSwgMHhGMSwgMHg5OSwgMHgzMywgMHhDRSwgMHgyQywgMHhBMSwKLQkweEYxLCAweDI1LCAweDA3LCAweDRELCAweEZDLCAweEM0LCAweDAxLCAweDRELCAweEZGLCAweDJGLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MkEsIDB4MDAsIDB4RUYsCi0JMHhGRSwgMHg0RCwgMHgwMywgMHg3RCwgMHhGNiwgMHgyQSwgMHg0MywgMHg0QiwgMHgxNywgMHhCMCwgMHhGNSwKLQkweEVGLCAweDA1LCAweDkzLCAweEZDLCAweENCLCAweDAxLCAweDNELCAweEZGLCAweDM0LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4ODUsIDB4RkYsIDB4MTAsIDB4MDEsIDB4MzgsIDB4RkUsIDB4ODgsIDB4MDIsCi0JMHhEMywgMHhGQywgMHg5MSwgMHgwMywgMHhGNywgMHg0OCwgMHhDQiwgMHgwMywgMHhCQSwgMHhGQywgMHg5NSwKLQkweDAyLCAweDMxLCAweEZFLCAweDEzLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzksIDB4MDEsIDB4OTcsIDB4RkMsIDB4RTYsCi0JMHgwNSwgMHhDNiwgMHhGNSwgMHgwMCwgMHgxNywgMHg1MCwgMHg0MywgMHg5RCwgMHhGNiwgMHgzQSwgMHgwMywKLQkweEZBLCAweEZFLCAweDIzLCAweDAwLCAweDIxLCAweDAwLCAweEUyLCAweEZGLCAweDA4LCAweDAwLCAweEZELAotCTB4RkYsIDB4MzAsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QzYsIDB4MDEsIDB4NEIsIDB4RkMsIDB4MjYsIDB4MDcsCi0JMHhBNSwgMHhGMSwgMHg4NywgMHgyQywgMHhEQywgMHgzMywgMHg5MSwgMHhGMSwgMHhDNywgMHgwNiwgMHhBOSwKLQkweEZDLCAweDg0LCAweDAxLCAweDcwLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDAzLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RDQsIDB4RkYsIDB4QkYsIDB4MDAsIDB4RUIsIDB4RkQsIDB4RjMsIDB4MDQsIDB4Q0YsCi0JMHhGMywgMHg5OCwgMHgzRSwgMHhGMywgMHgxRSwgMHhCOSwgMHhGMywgMHhCMiwgMHgwNiwgMHg0OCwgMHhGQywKLQkweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE1LCAweDAwLCAweEE3LAotCTB4RkYsIDB4QjksIDB4MDAsIDB4RUMsIDB4RkUsIDB4MzEsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MEYsIDB4RkUsCi0JMHgzMywgMHg0OCwgMHgyNSwgMHgwQSwgMHgyMSwgMHhGQSwgMHhFNSwgMHgwMywgMHg4NywgMHhGRCwgMHg2MiwKLQkweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLAotCTB4NTAsIDB4RkYsIDB4OTcsIDB4MDEsIDB4MTAsIDB4RkQsIDB4REEsIDB4MDQsIDB4MjAsIDB4RjgsIDB4QTAsCi0JMHgwRiwgMHg5NywgMHg0NiwgMHg2MSwgMHhGQSwgMHgyRCwgMHgwMSwgMHgyQiwgMHgwMCwgMHg3QSwgMHhGRiwKLQkweDc1LCAweDAwLCAweEMyLCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDNBLAotCTB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEUsIDB4MDcsIDB4OEIsIDB4RjIsIDB4MDMsIDB4MjUsCi0JMHgzOCwgMHgzQSwgMHg2RCwgMHhGMiwgMHhGMSwgMHgwNSwgMHg0NSwgMHhGRCwgMHgyMiwgMHgwMSwgMHhBMiwKLQkweEZGLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk2LCAweEZGLAotCTB4MzksIDB4MDEsIDB4MUYsIDB4RkQsIDB4MjgsIDB4MDYsIDB4MkEsIDB4RjIsIDB4RjIsIDB4MzgsIDB4QTAsCi0JMHgyNiwgMHg0QiwgMHhGMiwgMHgxQywgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzQywgMHhGRiwKLQkweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweEM5LCAweEZGLCAweDYzLCAweDAwLCAweDlGLAotCTB4RkYsIDB4RTgsIDB4RkYsIDB4QTMsIDB4MDEsIDB4N0YsIDB4RjksIDB4MDIsIDB4NDYsIDB4MjcsIDB4MTEsCi0JMHg5QiwgMHhGNywgMHgxOCwgMHgwNSwgMHhGMywgMHhGQywgMHhBMywgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZCLCAweEZGLCAweDUyLCAweDAxLAotCTB4QTksIDB4RkQsIDB4QTAsIDB4MDMsIDB4QUUsIDB4RkEsIDB4QkUsIDB4MDgsIDB4N0MsIDB4NDgsIDB4MjYsCi0JMHhGRiwgMHhEMiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhDNiwgMHhGRSwgMHhDQywgMHgwMCwgMHhBMCwgMHhGRiwKLQkweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUxLCAweDAxLCAweDUzLAotCTB4RkMsIDB4OTAsIDB4MDYsIDB4MTksIDB4RjQsIDB4NTIsIDB4MUQsIDB4QTgsIDB4M0YsIDB4NDksIDB4RjQsCi0JMHhBMywgMHgwNCwgMHgxRSwgMHhGRSwgMHhBMSwgMHgwMCwgMHhFMywgMHhGRiwgMHhGOSwgMHhGRiwgMHgwNCwKLQkweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY3LCAweEZGLCAweDk0LCAweDAxLCAweDkwLCAweEZDLAotCTB4RTUsIDB4MDYsIDB4ODEsIDB4RjEsIDB4NkIsIDB4MzIsIDB4MTEsIDB4MkUsIDB4OEUsIDB4RjEsIDB4MUQsCi0JMHgwNywgMHg1OCwgMHhGQywgMHhCQywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDExLCAweDAwLCAweDQ1LCAweDAwLCAweEJGLCAweEZFLCAweDlELAotCTB4MDMsIDB4RjMsIDB4RjUsIDB4NzUsIDB4NDIsIDB4OUIsIDB4MTgsIDB4NTEsIDB4RjUsIDB4MTYsIDB4MDYsCi0JMHg4MywgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwKLQkweDAwLCAweDhCLCAweEZGLCAweDAxLCAweDAxLCAweDU2LCAweEZFLCAweDRELCAweDAyLCAweDQ1LCAweEZELAotCTB4OEQsIDB4MDIsIDB4RjAsIDB4NDgsIDB4RDcsIDB4MDQsIDB4NDcsIDB4RkMsIDB4RDEsIDB4MDIsIDB4MTIsCi0JMHhGRSwgMHgyMSwgMHgwMSwgMHg3RSwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDMzLCAweDAwLCAweDQwLCAweEZGLCAweEMyLCAweDAxLCAweEE5LCAweEZDLCAweEJDLCAweDA1LCAweDI5LAotCTB4RjYsIDB4QjMsIDB4MTUsIDB4RkEsIDB4NDMsIDB4MzEsIDB4RjcsIDB4RTYsIDB4MDIsIDB4MkMsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHgyRiwgMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwKLQkweDAwLCAweDQ4LCAweEZGLCAweENFLCAweDAxLCAweDQyLCAweEZDLCAweDJBLCAweDA3LCAweEJGLCAweEYxLAotCTB4NDAsIDB4MkIsIDB4MDUsIDB4MzUsIDB4QTYsIDB4RjEsIDB4QUIsIDB4MDYsIDB4QkYsIDB4RkMsIDB4NzUsCi0JMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwKLQkweEM4LCAweEZGLCAweEQ2LCAweDAwLCAweEM0LCAweEZELCAweDMxLCAweDA1LCAweDczLCAweEYzLCAweEIwLAotCTB4M0QsIDB4NDksIDB4MjAsIDB4NkUsIDB4RjMsIDB4Q0IsIDB4MDYsIDB4NDAsIDB4RkMsIDB4RTYsIDB4MDEsCi0JMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBRCwgMHhGRiwgMHhBQSwKLQkweDAwLCAweDBDLCAweEZGLCAweEY3LCAweDAwLCAweEMxLCAweEZGLCAweDMzLCAweEZELCAweEVDLCAweDQ3LAotCTB4NTEsIDB4MEIsIDB4QUYsIDB4RjksIDB4MUQsIDB4MDQsIDB4NkIsIDB4RkQsIDB4NkUsIDB4MDEsIDB4NjAsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NCwgMHhGRiwKLQkweDhDLCAweDAxLCAweDI5LCAweEZELCAweEE3LCAweDA0LCAweDhGLCAweEY4LCAweDY0LCAweDBFLCAweDAyLAotCTB4NDcsIDB4MjIsIDB4RkIsIDB4QzksIDB4MDAsIDB4NjQsIDB4MDAsIDB4NUIsIDB4RkYsIDB4ODQsIDB4MDAsCi0JMHhCQywgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwKLQkweDAxLCAweDMzLCAweEZDLCAweEZGLCAweDA2LCAweEM0LCAweEYyLCAweEIwLCAweDIzLCAweDNCLCAweDNCLAotCTB4QUQsIDB4RjIsIDB4QkYsIDB4MDUsIDB4NjYsIDB4RkQsIDB4MEUsIDB4MDEsIDB4QUMsIDB4RkYsIDB4MEUsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4RCwgMHhGRiwgMHg0QiwgMHgwMSwKLQkweDAxLCAweEZELCAweDUxLCAweDA2LCAweEZCLCAweEYxLCAweERGLCAweDM3LCAweEYwLCAweDI3LCAweDFDLAotCTB4RjIsIDB4MjQsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhDRSwgMHhGRiwgMHg1NCwgMHgwMCwgMHhCRCwgMHhGRiwgMHhCMiwKLQkweEZGLCAweDAxLCAweDAyLCAweENGLCAweEY4LCAweDdELCAweDQ1LCAweDZCLCAweDEyLCAweDMwLCAweEY3LAotCTB4NDgsIDB4MDUsIDB4REQsIDB4RkMsIDB4QUQsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwgMHhGRiwgMHg0NSwgMHgwMSwgMHhDNiwgMHhGRCwKLQkweDY2LCAweDAzLCAweDIxLCAweEZCLCAweDlFLCAweDA3LCAweEFBLCAweDQ4LCAweDEyLCAweDAwLCAweDY0LAotCTB4RkUsIDB4QjQsIDB4MDEsIDB4QTYsIDB4RkUsIDB4REIsIDB4MDAsIDB4OUEsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERSwgMHgwMSwgMHg1RiwgMHhGQywgMHg3MCwKLQkweDA2LCAweDZDLCAweEY0LCAweEZELCAweDFCLCAweDdELCAweDQwLCAweEI3LCAweEY0LCAweDVELCAweDA0LAotCTB4NDksIDB4RkUsIDB4ODgsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHhBMSwgMHgwMSwgMHg3RSwgMHhGQywgMHhGOSwgMHgwNiwKLQkweDdDLCAweEYxLCAweDM4LCAweDMxLCAweDUwLCAweDJGLCAweDgyLCAweEYxLCAweDEyLCAweDA3LCAweDY1LAotCTB4RkMsIDB4QjIsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHhFRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg5MCwgMHhGRSwgMHhFQiwgMHgwMywgMHg3MSwKLQkweEY1LCAweEI3LCAweDQxLCAweEVELCAweDE5LCAweEY1LCAweEY0LCAweDNCLCAweDA2LCAweDczLCAweEZDLAotCTB4RDcsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsCi0JMHhGRiwgMHhGMiwgMHgwMCwgMHg3NiwgMHhGRSwgMHgxMSwgMHgwMiwgMHhCNiwgMHhGRCwgMHg4RiwgMHgwMSwKLQkweERFLCAweDQ4LCAweEU5LCAweDA1LCAweEQ0LCAweEZCLCAweDBDLCAweDAzLCAweEY0LCAweEZELCAweDJGLAotCTB4MDEsIDB4NzksIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHg0MywgMHhGRiwgMHhCQSwgMHgwMSwgMHhCQywgMHhGQywgMHg5MCwgMHgwNSwgMHg4RSwgMHhGNiwgMHg2OCwKLQkweDE0LCAweDk5LCAweDQ0LCAweENELCAweEY3LCAweDhGLCAweDAyLCAweDYwLCAweEZGLCAweEVBLCAweEZGLAotCTB4M0UsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsCi0JMHhGRiwgMHhENCwgMHgwMSwgMHgzQiwgMHhGQywgMHgyQSwgMHgwNywgMHhERiwgMHhGMSwgMHhGNiwgMHgyOSwKLQkweDI3LCAweDM2LCAweEMxLCAweEYxLCAweDhCLCAweDA2LCAweEQ4LCAweEZDLCAweDY2LCAweDAxLCAweDgwLAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QkQsIDB4RkYsCi0JMHhFRCwgMHgwMCwgMHg5RSwgMHhGRCwgMHg2QywgMHgwNSwgMHgxRiwgMHhGMywgMHhDMCwgMHgzQywgMHg5RSwKLQkweDIxLCAweDI4LCAweEYzLCAweEUyLCAweDA2LCAweDNBLCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OUIsIDB4MDAsIDB4MkIsCi0JMHhGRiwgMHhCRCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RSwgMHhGQywgMHg5QSwgMHg0NywgMHg4MiwgMHgwQywKLQkweDNELCAweEY5LCAweDU0LCAweDA0LCAweDUwLCAweEZELCAweDdBLCAweDAxLCAweDVCLCAweEZGLCAweDJBLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4ODEsIDB4MDEsCi0JMHg0MiwgMHhGRCwgMHg3MiwgMHgwNCwgMHhGRiwgMHhGOCwgMHgyRCwgMHgwRCwgMHg2OSwgMHg0NywgMHhFQiwKLQkweEZCLCAweDYzLCAweDAwLCAweDlELCAweDAwLCAweDNDLCAweEZGLCAweDkzLCAweDAwLCAweEI2LCAweEZGLAotCTB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzcsCi0JMHhGQywgMHhFRCwgMHgwNiwgMHgwMywgMHhGMywgMHg1QiwgMHgyMiwgMHgzNywgMHgzQywgMHhGNCwgMHhGMiwKLQkweDhBLCAweDA1LCAweDg5LCAweEZELCAweEY5LCAweDAwLCAweEI3LCAweEZGLCAweDBBLCAweDAwLCAweDAxLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODQsIDB4RkYsIDB4NUMsIDB4MDEsIDB4RTYsIDB4RkMsCi0JMHg3NywgMHgwNiwgMHhENCwgMHhGMSwgMHhDNiwgMHgzNiwgMHgzRSwgMHgyOSwgMHhGMywgMHhGMSwgMHgyOSwKLQkweDA3LCAweDM4LCAweEZDLCAweEQ3LCAweDAxLCAweDQyLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAotCTB4MEIsIDB4MDAsIDB4RDQsIDB4RkYsIDB4NDYsIDB4MDAsIDB4REEsIDB4RkYsIDB4N0QsIDB4RkYsIDB4NUQsCi0JMHgwMiwgMHgyNiwgMHhGOCwgMHhFRCwgMHg0NCwgMHhCMSwgMHgxMywgMHhDNywgMHhGNiwgMHg3NywgMHgwNSwKLQkweEM4LCAweEZDLCAweEI2LCAweDAxLCAweDQ1LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjIsIDB4MDAsIDB4NzYsIDB4RkYsIDB4MzcsIDB4MDEsIDB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsCi0JMHg5NCwgMHhGQiwgMHg4MywgMHgwNiwgMHhDRSwgMHg0OCwgMHgwNSwgMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwKLQkweDAxLCAweDg3LCAweEZFLCAweEVBLCAweDAwLCAweDk0LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLAotCTB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RDksIDB4MDEsIDB4NkMsIDB4RkMsIDB4NEYsIDB4MDYsIDB4QzMsCi0JMHhGNCwgMHhBOSwgMHgxQSwgMHg0OSwgMHg0MSwgMHgyQywgMHhGNSwgMHgxNSwgMHgwNCwgMHg3NiwgMHhGRSwKLQkweDZFLCAweDAwLCAweEZDLCAweEZGLCAweEYwLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJCLAotCTB4MDAsIDB4NUEsIDB4RkYsIDB4QUMsIDB4MDEsIDB4NkUsIDB4RkMsIDB4MEEsIDB4MDcsIDB4N0UsIDB4RjEsCi0JMHhGRiwgMHgyRiwgMHg4QSwgMHgzMCwgMHg3RCwgMHhGMSwgMHgwMywgMHgwNywgMHg3NSwgMHhGQywgMHhBNywKLQkweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYyLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4N0EsIDB4MDAsIDB4NjIsIDB4RkUsIDB4MzUsIDB4MDQsIDB4RjcsIDB4RjQsIDB4RUYsCi0JMHg0MCwgMHg0MCwgMHgxQiwgMHg5QywgMHhGNCwgMHg1RSwgMHgwNiwgMHg2NiwgMHhGQywgMHhEQiwgMHgwMSwKLQkweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLAotCTB4MDAsIDB4OTUsIDB4RkUsIDB4RDUsIDB4MDEsIDB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsCi0JMHgwMCwgMHgwNywgMHg2MSwgMHhGQiwgMHg0NiwgMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywKLQkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLAotCTB4QjIsIDB4MDEsIDB4RDEsIDB4RkMsIDB4NjIsIDB4MDUsIDB4RjYsIDB4RjYsIDB4MjAsIDB4MTMsIDB4MkUsCi0JMHg0NSwgMHg3MCwgMHhGOCwgMHgzNCwgMHgwMiwgMHg5NCwgMHhGRiwgMHhDRCwgMHhGRiwgMHg0QywgMHgwMCwKLQkweEQyLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweERBLAotCTB4MDEsIDB4MzYsIDB4RkMsIDB4MjcsIDB4MDcsIDB4MDUsIDB4RjIsIDB4QUEsIDB4MjgsIDB4NDQsIDB4MzcsCi0JMHhFNCwgMHhGMSwgMHg2NywgMHgwNiwgMHhGMiwgMHhGQywgMHg1NSwgMHgwMSwgMHg4OCwgMHhGRiwgMHgxQiwKLQkweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEIyLCAweEZGLCAweDAyLCAweDAxLAotCTB4N0EsIDB4RkQsIDB4QTIsIDB4MDUsIDB4RDQsIDB4RjIsIDB4QzcsIDB4M0IsIDB4RjIsIDB4MjIsIDB4RTcsCi0JMHhGMiwgMHhGNSwgMHgwNiwgMHgzNSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDExLCAweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLCAweDRBLCAweEZGLCAweDgzLAotCTB4MDAsIDB4OTEsIDB4MDAsIDB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsIDB4MEQsIDB4Q0QsIDB4RjgsCi0JMHg4OSwgMHgwNCwgMHgzNiwgMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweDc1LCAweDAxLCAweDVDLCAweEZELAotCTB4M0MsIDB4MDQsIDB4NzAsIDB4RjksIDB4RkEsIDB4MEIsIDB4QzAsIDB4NDcsIDB4QkMsIDB4RkMsIDB4RkMsCi0JMHhGRiwgMHhENiwgMHgwMCwgMHgxRCwgMHhGRiwgMHhBMiwgMHgwMCwgMHhCMCwgMHhGRiwgMHgxMywgMHgwMCwKLQkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNDLCAweEZDLCAweEQ4LAotCTB4MDYsIDB4NDcsIDB4RjMsIDB4MDYsIDB4MjEsIDB4MkEsIDB4M0QsIDB4NDQsIDB4RjMsIDB4NTIsIDB4MDUsCi0JMHhBRSwgMHhGRCwgMHhFMywgMHgwMCwgMHhDMiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDFGLCAweDAwLCAweDdDLCAweEZGLCAweDZELCAweDAxLCAweENELCAweEZDLCAweDk5LCAweDA2LAotCTB4QjQsIDB4RjEsIDB4QTYsIDB4MzUsIDB4ODksIDB4MkEsIDB4RDAsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0UsCi0JMHhGQywgMHhEMSwgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwKLQkweEQ5LCAweEZGLCAweDM3LCAweDAwLCAweEY3LCAweEZGLCAweDQ5LCAweEZGLCAweEI2LCAweDAyLCAweDg2LAotCTB4RjcsIDB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsIDB4NjEsIDB4RjYsIDB4QTQsIDB4MDUsIDB4QjQsIDB4RkMsCi0JMHhCRSwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwKLQkweDAwLCAweDdCLCAweEZGLCAweDI5LCAweDAxLCAweDAxLCAweEZFLCAweEYxLCAweDAyLCAweDA3LCAweEZDLAotCTB4NkUsIDB4MDUsIDB4RTYsIDB4NDgsIDB4RkYsIDB4MDEsIDB4ODQsIDB4RkQsIDB4MkMsIDB4MDIsIDB4NjgsCi0JMHhGRSwgMHhGOSwgMHgwMCwgMHg4RSwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweDNBLCAweEZGLCAweEQ0LCAweDAxLCAweDdBLCAweEZDLCAweDJCLCAweDA2LCAweDFFLCAweEY1LCAweDU2LAotCTB4MTksIDB4MEMsIDB4NDIsIDB4QUEsIDB4RjUsIDB4QzksIDB4MDMsIDB4QTQsIDB4RkUsIDB4NTQsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NSwKLQkweEZGLCAweEI2LCAweDAxLCAweDVGLCAweEZDLCAweDE3LCAweDA3LCAweDg3LCAweEYxLCAweEMyLCAweDJFLAotCTB4QzAsIDB4MzEsIDB4N0UsIDB4RjEsIDB4RjEsIDB4MDYsIDB4ODYsIDB4RkMsIDB4OUIsIDB4MDEsIDB4NjMsCi0JMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFQSwgMHhGRiwKLQkweDkzLCAweDAwLCAweDM2LCAweEZFLCAweDdELCAweDA0LCAweDg1LCAweEY0LCAweDFGLCAweDQwLCAweDk0LAotCTB4MUMsIDB4NDcsIDB4RjQsIDB4N0UsIDB4MDYsIDB4NUEsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5QywgMHhGRiwgMHhENCwgMHgwMCwgMHhCNCwKLQkweEZFLCAweDlBLCAweDAxLCAweDk1LCAweEZFLCAweEE4LCAweEZGLCAweDk4LCAweDQ4LCAweDFELCAweDA4LAotCTB4RUUsIDB4RkEsIDB4ODAsIDB4MDMsIDB4QjksIDB4RkQsIDB4NEIsIDB4MDEsIDB4NkUsIDB4RkYsIDB4MjUsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBOSwgMHgwMSwKLQkweEU3LCAweEZDLCAweDMzLCAweDA1LCAweDYwLCAweEY3LCAweERBLCAweDExLCAweEI4LCAweDQ1LCAweDFDLAotCTB4RjksIDB4RDgsIDB4MDEsIDB4Q0EsIDB4RkYsIDB4QUYsIDB4RkYsIDB4NUEsIDB4MDAsIDB4Q0MsIDB4RkYsCi0JMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERSwgMHgwMSwgMHgzMywKLQkweEZDLCAweDIxLCAweDA3LCAweDMwLCAweEYyLCAweDVDLCAweDI3LCAweDVCLCAweDM4LCAweDBGLCAweEYyLAotCTB4NDAsIDB4MDYsIDB4MEUsIDB4RkQsIDB4NDMsIDB4MDEsIDB4OTEsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNywgMHgwMSwgMHg1NywgMHhGRCwKLQkweEQ2LCAweDA1LCAweDkwLCAweEYyLCAweEM4LCAweDNBLCAweDQ2LCAweDI0LCAweEFBLCAweEYyLCAweDA2LAotCTB4MDcsIDB4MzIsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RCwgMHgwMCwgMHg2OSwgMHhGRiwgMHg0QiwgMHgwMCwgMHhGNiwKLQkweDAwLCAweENCLCAweEZBLCAweEQzLCAweDQ2LCAweEYwLCAweDBFLCAweDVFLCAweEY4LCAweEJFLCAweDA0LAotCTB4MUUsIDB4RkQsIDB4OTEsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2OSwgMHgwMSwgMHg3NywgMHhGRCwgMHgwNCwgMHgwNCwKLQkweEUyLCAweEY5LCAweENCLCAweDBBLCAweDBELCAweDQ4LCAweDk0LCAweEZELCAweDkyLCAweEZGLCAweDEwLAotCTB4MDEsIDB4RkUsIDB4RkUsIDB4QjEsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0MywgMHhGQywgMHhDMCwgMHgwNiwgMHg4RiwKLQkweEYzLCAweEIxLCAweDFGLCAweDE4LCAweDNFLCAweDlCLCAweEYzLCAweDE2LCAweDA1LCAweEQ1LCAweEZELAotCTB4Q0MsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsCi0JMHgwMCwgMHg3NCwgMHhGRiwgMHg3QywgMHgwMSwgMHhCNSwgMHhGQywgMHhCOCwgMHgwNiwgMHg5QywgMHhGMSwKLQkweDgxLCAweDM0LCAweEQxLCAweDJCLCAweEIzLCAweEYxLCAweDI5LCAweDA3LCAweDQ2LCAweEZDLCAweENBLAotCTB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REYsIDB4RkYsCi0JMHgyOSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNiwgMHhGRiwgMHgwQywgMHgwMywgMHhFRSwgMHhGNiwgMHhCMCwKLQkweDQzLCAweDQ3LCAweDE2LCAweEZDLCAweEY1LCAweENGLCAweDA1LCAweEExLCAweEZDLCAweEM2LCAweDAxLAotCTB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODEsCi0JMHhGRiwgMHgxQiwgMHgwMSwgMHgyMCwgMHhGRSwgMHhCNiwgMHgwMiwgMHg3QSwgMHhGQywgMHg1RiwgMHgwNCwKLQkweEY0LCAweDQ4LCAweEZGLCAweDAyLCAweDEzLCAweEZELCAweDY3LCAweDAyLCAweDQ5LCAweEZFLCAweDA3LAotCTB4MDEsIDB4ODgsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsCi0JMHhDRiwgMHgwMSwgMHg4QSwgMHhGQywgMHgwNSwgMHgwNiwgMHg3QiwgMHhGNSwgMHgwNiwgMHgxOCwgMHhDNywKLQkweDQyLCAweDJGLCAweEY2LCAweDdBLCAweDAzLCAweEQ0LCAweEZFLCAweDM5LCAweDAwLCAweDE3LCAweDAwLAotCTB4RTYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QzAsCi0JMHgwMSwgMHg1MywgMHhGQywgMHgyMSwgMHgwNywgMHg5NiwgMHhGMSwgMHg4MiwgMHgyRCwgMHhGMiwgMHgzMiwKLQkweDg2LCAweEYxLCAweERCLCAweDA2LCAweDk5LCAweEZDLCAweDhFLCAweDAxLCAweDZBLCAweEZGLCAweDI1LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4REUsIDB4RkYsIDB4QUMsIDB4MDAsCi0JMHgwQiwgMHhGRSwgMHhDMSwgMHgwNCwgMHgxQiwgMHhGNCwgMHg0NywgMHgzRiwgMHhFQSwgMHgxRCwgMHhGNSwKLQkweEYzLCAweDlDLCAweDA2LCAweDRGLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTIsIDB4RkYsIDB4QzUsIDB4MDAsIDB4RDQsIDB4RkUsIDB4NUYsCi0JMHgwMSwgMHgwMywgMHhGRiwgMHhCRiwgMHhGRSwgMHg2MywgMHg0OCwgMHg0MCwgMHgwOSwgMHg3QiwgMHhGQSwKLQkweEI5LCAweDAzLCAweDlELCAweEZELCAweDU4LCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEQsIDB4RkYsIDB4OUYsIDB4MDEsIDB4RkUsIDB4RkMsCi0JMHgwMiwgMHgwNSwgMHhDQiwgMHhGNywgMHg5OCwgMHgxMCwgMHgzOSwgMHg0NiwgMHhEMCwgMHhGOSwgMHg3OCwKLQkweDAxLCAweDAwLCAweDAwLCAweDkxLCAweEZGLCAweDY5LCAweDAwLCAweEM2LCAweEZGLCAweDBFLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTcsCi0JMHgwNywgMHg2MSwgMHhGMiwgMHgwQSwgMHgyNiwgMHg2QSwgMHgzOSwgMHg0MSwgMHhGMiwgMHgxNSwgMHgwNiwKLQkweDJDLCAweEZELCAweDMxLCAweDAxLCAweDlCLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MTMsIDB4MDAsIDB4OUUsIDB4RkYsIDB4MkIsIDB4MDEsIDB4MzcsIDB4RkQsIDB4MDUsIDB4MDYsCi0JMHg1NCwgMHhGMiwgMHhDMiwgMHgzOSwgMHg5OSwgMHgyNSwgMHg3MywgMHhGMiwgMHgxNCwgMHgwNywgMHgzMSwKLQkweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLAotCTB4QzQsIDB4RkYsIDB4NkUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MTMsIDB4MDAsIDB4NTgsIDB4MDEsIDB4MEQsCi0JMHhGQSwgMHg2MSwgMHg0NiwgMHgyRCwgMHgxMCwgMHhGMCwgMHhGNywgMHhGMSwgMHgwNCwgMHgwNSwgMHhGRCwKLQkweDlDLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LAotCTB4MDAsIDB4NjcsIDB4RkYsIDB4NUMsIDB4MDEsIDB4OTMsIDB4RkQsIDB4Q0MsIDB4MDMsIDB4NTQsIDB4RkEsCi0JMHhBMiwgMHgwOSwgMHg0RiwgMHg0OCwgMHg3MywgMHhGRSwgMHgyNywgMHhGRiwgMHg0QiwgMHgwMSwgMHhERSwKLQkweEZFLCAweEMwLCAweDAwLCAweEE0LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEMsIDB4RkMsIDB4QTYsIDB4MDYsIDB4REIsIDB4RjMsIDB4NUIsCi0JMHgxRSwgMHhGQywgMHgzRSwgMHhGQSwgMHhGMywgMHhENywgMHgwNCwgMHhGRCwgMHhGRCwgMHhCNCwgMHgwMCwKLQkweEQ5LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZELAotCTB4RkYsIDB4OEEsIDB4MDEsIDB4OUYsIDB4RkMsIDB4RDMsIDB4MDYsIDB4OEEsIDB4RjEsIDB4NTcsIDB4MzMsCi0JMHgxNywgMHgyRCwgMHg5QywgMHhGMSwgMHgyNCwgMHgwNywgMHg0RiwgMHhGQywgMHhDMywgMHgwMSwgMHg0RSwKLQkweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEU0LCAweEZGLCAweDFCLCAweDAwLAotCTB4MzAsIDB4MDAsIDB4RTQsIDB4RkUsIDB4NUYsIDB4MDMsIDB4NUUsIDB4RjYsIDB4MDIsIDB4NDMsIDB4OTYsCi0JMHgxNywgMHg5QiwgMHhGNSwgMHhGOCwgMHgwNSwgMHg4RiwgMHhGQywgMHhDQywgMHgwMSwgMHgzRCwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLCAweDg2LCAweEZGLCAweDBDLCAweDAxLCAweDNFLAotCTB4RkUsIDB4N0IsIDB4MDIsIDB4RUQsIDB4RkMsIDB4NTYsIDB4MDMsIDB4RjUsIDB4NDgsIDB4MDYsIDB4MDQsCi0JMHhBMSwgMHhGQywgMHhBMywgMHgwMiwgMHgyQSwgMHhGRSwgMHgxNiwgMHgwMSwgMHg4MywgMHhGRiwgMHgxRiwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNFLCAweEZGLCAweEM4LCAweDAxLAotCTB4OUIsIDB4RkMsIDB4REQsIDB4MDUsIDB4REMsIDB4RjUsIDB4QjYsIDB4MTYsIDB4NzcsIDB4NDMsIDB4QkQsCi0JMHhGNiwgMHgyOCwgMHgwMywgMHgwNSwgMHhGRiwgMHgxRCwgMHgwMCwgMHgyNSwgMHgwMCwgMHhFMSwgMHhGRiwKLQkweDA4LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRCLCAweEZGLCAweEM4LCAweDAxLCAweDQ5LAotCTB4RkMsIDB4MjcsIDB4MDcsIDB4QUIsIDB4RjEsIDB4M0UsIDB4MkMsIDB4MUUsIDB4MzQsIDB4OTUsIDB4RjEsCi0JMHhDMSwgMHgwNiwgMHhBRSwgMHhGQywgMHg4MSwgMHgwMSwgMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEZGLCAweEM0LCAweDAwLCAweEUyLCAweEZELAotCTB4MDEsIDB4MDUsIDB4QkEsIDB4RjMsIDB4NjQsIDB4M0UsIDB4M0YsIDB4MUYsIDB4QTgsIDB4RjMsIDB4QjgsCi0JMHgwNiwgMHg0NiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDE1LCAweDAwLCAweEE4LCAweEZGLCAweEI2LCAweDAwLCAweEYzLCAweEZFLCAweDI0LCAweDAxLCAweDZFLAotCTB4RkYsIDB4REUsIDB4RkQsIDB4MjUsIDB4NDgsIDB4NjgsIDB4MEEsIDB4MDgsIDB4RkEsIDB4RjIsIDB4MDMsCi0JMHg4MSwgMHhGRCwgMHg2NSwgMHgwMSwgMHg2NCwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDJELCAweDAwLCAweDUxLCAweEZGLCAweDk1LCAweDAxLCAweDE1LCAweEZELCAweENGLCAweDA0LAotCTB4MzksIDB4RjgsIDB4NTksIDB4MEYsIDB4QUYsIDB4NDYsIDB4OEIsIDB4RkEsIDB4MTcsIDB4MDEsIDB4MzgsCi0JMHgwMCwgMHg3MywgMHhGRiwgMHg3OCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBCLCAweDA3LCAweDk3LAotCTB4RjIsIDB4QjgsIDB4MjQsIDB4NzEsIDB4M0EsIDB4N0IsIDB4RjIsIDB4RTYsIDB4MDUsIDB4NEMsIDB4RkQsCi0JMHgxRCwgMHgwMSwgMHhBNCwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwKLQkweDAwLCAweDk0LCAweEZGLCAweDNELCAweDAxLCAweDE4LCAweEZELCAweDMyLCAweDA2LCAweDFGLCAweEYyLAotCTB4QjUsIDB4MzgsIDB4RUIsIDB4MjYsIDB4NDAsIDB4RjIsIDB4MUUsIDB4MDcsIDB4MzIsIDB4RkMsIDB4REYsCi0JMHgwMSwgMHgzRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQSwgMHhGRiwKLQkweDVGLCAweDAwLCAweEE1LCAweEZGLCAweERDLCAweEZGLCAweEI4LCAweDAxLCAweDU3LCAweEY5LCAweEU1LAotCTB4NDUsIDB4NkUsIDB4MTEsIDB4ODMsIDB4RjcsIDB4MjMsIDB4MDUsIDB4RUUsIDB4RkMsIDB4QTYsIDB4MDEsCi0JMHg0QiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywKLQkweEZGLCAweDRGLCAweDAxLCAweEIwLCAweEZELCAweDkzLCAweDAzLCAweEM3LCAweEZBLCAweDdELCAweDA4LAotCTB4ODYsIDB4NDgsIDB4NUEsIDB4RkYsIDB4QkEsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkYsIDB4RkUsIDB4Q0YsCi0JMHgwMCwgMHg5RSwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweEUwLCAweDAxLCAweDU2LCAweEZDLCAweDg5LCAweDA2LCAweDJCLCAweEY0LCAweDA2LCAweDFELCAweEQ3LAotCTB4M0YsIDB4NjEsIDB4RjQsIDB4OTQsIDB4MDQsIDB4MjcsIDB4RkUsIDB4OUMsIDB4MDAsIDB4RTYsIDB4RkYsCi0JMHhGOCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg5NywKLQkweDAxLCAweDhDLCAweEZDLCAweEVBLCAweDA2LCAweDgwLCAweEYxLCAweDI2LCAweDMyLCAweDU4LCAweDJFLAotCTB4OEIsIDB4RjEsIDB4MUIsIDB4MDcsIDB4NUIsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOSwgMHhGRiwgMHgwRSwgMHgwMCwgMHg0QiwgMHgwMCwKLQkweEI0LCAweEZFLCAweEFGLCAweDAzLCAweEQ1LCAweEY1LCAweDRELCAweDQyLCAweEU2LCAweDE4LCAweDNDLAotCTB4RjUsIDB4MUYsIDB4MDYsIDB4N0YsIDB4RkMsIDB4RDMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4QywgMHhGRiwgMHhGRSwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRiwKLQkweDAyLCAweDVFLCAweEZELCAweDU0LCAweDAyLCAweEVDLCAweDQ4LCAweDEzLCAweDA1LCAweDJFLCAweEZDLAotCTB4REUsIDB4MDIsIDB4MEMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4N0QsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhDMSwgMHgwMSwgMHhBRCwgMHhGQywKLQkweEIyLCAweDA1LCAweDNGLCAweEY2LCAweDY5LCAweDE1LCAweDFGLCAweDQ0LCAweDUzLCAweEY3LCAweEQzLAotCTB4MDIsIDB4MzgsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MzMsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NywgMHhGRiwgMHhDRiwgMHgwMSwgMHg0MCwgMHhGQywgMHgyQSwKLQkweDA3LCAweEM2LCAweEYxLCAweEY3LCAweDJBLCAweDQ2LCAweDM1LCAweEFCLCAweEYxLCAweEE0LCAweDA2LAotCTB4QzQsIDB4RkMsIDB4NzIsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsCi0JMHgwMCwgMHgwNCwgMHgwMCwgMHhDNiwgMHhGRiwgMHhEQiwgMHgwMCwgMHhCQiwgMHhGRCwgMHgzRSwgMHgwNSwKLQkweDYwLCAweEYzLCAweDdCLCAweDNELCAweDk0LCAweDIwLCAweDVFLCAweEYzLCAweEQwLCAweDA2LCAweDNFLAotCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsCi0JMHhBRSwgMHhGRiwgMHhBNywgMHgwMCwgMHgxMiwgMHhGRiwgMHhFQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwMywKLQkweEZELCAweERDLCAweDQ3LCAweDk1LCAweDBCLCAweDk2LCAweEY5LCAweDI5LCAweDA0LCAweDY1LCAweEZELAotCTB4NzEsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsCi0JMHgwMCwgMHg1NSwgMHhGRiwgMHg4QSwgMHgwMSwgMHgyRSwgMHhGRCwgMHg5QiwgMHgwNCwgMHhBOCwgMHhGOCwKLQkweDFGLCAweDBFLCAweDFBLCAweDQ3LCAweDRFLCAweEZCLCAweEIzLCAweDAwLCAweDcwLCAweDAwLCAweDU0LAotCTB4RkYsIDB4ODcsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNCwgMHhGQywgMHhGQiwgMHgwNiwgMHhEMiwgMHhGMiwgMHg2NCwKLQkweDIzLCAweDczLCAweDNCLCAweEJDLCAweEYyLCAweEI0LCAweDA1LCAweDZFLCAweEZELCAweDA5LCAweDAxLAotCTB4QUYsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEIsCi0JMHhGRiwgMHg0RiwgMHgwMSwgMHhGQiwgMHhGQywgMHg1QSwgMHgwNiwgMHhGMiwgMHhGMSwgMHhBMCwgMHgzNywKLQkweDNBLCAweDI4LCAweDEzLCAweEYyLCAweDI1LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTEsIDB4MDAsCi0JMHhDMywgMHhGRiwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMiwgMHhBOSwgMHhGOCwgMHg1QywgMHg0NSwgMHhCMiwKLQkweDEyLCAweDE5LCAweEY3LCAweDUyLCAweDA1LCAweEQ4LCAweEZDLCAweEFGLCAweDAxLCAweDQ3LCAweEZGLAotCTB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzEsIDB4RkYsIDB4NDIsCi0JMHgwMSwgMHhDRCwgMHhGRCwgMHg1OSwgMHgwMywgMHgzQiwgMHhGQiwgMHg1RSwgMHgwNywgMHhCMywgMHg0OCwKLQkweDQ4LCAweDAwLCAweDRCLCAweEZFLCAweEMyLCAweDAxLCAweDlGLCAweEZFLCAweERFLCAweDAwLCAweDk4LAotCTB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REQsIDB4MDEsCi0JMHg2MiwgMHhGQywgMHg2OSwgMHgwNiwgMHg3RiwgMHhGNCwgMHhCMiwgMHgxQiwgMHhBQiwgMHg0MCwgMHhEMCwKLQkweEY0LCAweDRFLCAweDA0LCAweDUzLCAweEZFLCAweDgzLCAweDAwLCAweEYyLCAweEZGLCAweEY0LCAweEZGLAotCTB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTMsIDB4MDEsIDB4N0EsCi0JMHhGQywgMHhGRCwgMHgwNiwgMHg3QywgMHhGMSwgMHhGMiwgMHgzMCwgMHg5NiwgMHgyRiwgMHg4MCwgMHhGMSwKLQkweDBGLCAweDA3LCAweDY5LCAweEZDLCAweEIwLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjYsIDB4MDAsIDB4ODUsIDB4RkUsCi0JMHhGQywgMHgwMywgMHg1NSwgMHhGNSwgMHg4QywgMHg0MSwgMHgzOCwgMHgxQSwgMHhFMSwgMHhGNCwgMHg0MywKLQkweDA2LCAweDcwLCAweEZDLCAweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLAotCTB4MUIsIDB4MDAsIDB4OTIsIDB4RkYsIDB4RUYsIDB4MDAsIDB4N0QsIDB4RkUsIDB4MDQsIDB4MDIsIDB4Q0YsCi0JMHhGRCwgMHg1OCwgMHgwMSwgMHhENywgMHg0OCwgMHgyNiwgMHgwNiwgMHhCQiwgMHhGQiwgMHgxOSwgMHgwMywKLQkweEVELCAweEZELCAweDMyLCAweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjksIDB4MDEsIDB4QzEsIDB4RkMsIDB4ODYsIDB4MDUsCi0JMHhBNSwgMHhGNiwgMHgxRSwgMHgxNCwgMHhCQSwgMHg0NCwgMHhGMCwgMHhGNywgMHg3QiwgMHgwMiwgMHg2QiwKLQkweEZGLCAweEU0LCAweEZGLCAweDQxLCAweDAwLCAweEQ2LCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLAotCTB4MzMsIDB4MDAsIDB4NDMsIDB4RkYsIDB4RDUsIDB4MDEsIDB4M0EsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RTcsCi0JMHhGMSwgMHhBQywgMHgyOSwgMHg2NiwgMHgzNiwgMHhDOSwgMHhGMSwgMHg4MywgMHgwNiwgMHhERCwgMHhGQywKLQkweDYyLCAweDAxLCAweDgxLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA4LAotCTB4MDAsIDB4QkIsIDB4RkYsIDB4RjEsIDB4MDAsIDB4OTYsIDB4RkQsIDB4NzgsIDB4MDUsIDB4MEUsIDB4RjMsCi0JMHg4QSwgMHgzQywgMHhFQSwgMHgyMSwgMHgxOSwgMHhGMywgMHhFNiwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwKLQkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI0LCAweEZGLAotCTB4OTgsIDB4MDAsIDB4MzIsIDB4RkYsIDB4QjAsIDB4MDAsIDB4NDEsIDB4MDAsIDB4MzAsIDB4RkMsIDB4ODYsCi0JMHg0NywgMHhDNiwgMHgwQywgMHgyNCwgMHhGOSwgMHg2MCwgMHgwNCwgMHg0QiwgMHhGRCwgMHg3RCwgMHgwMSwKLQkweDVBLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDVBLAotCTB4RkYsIDB4N0UsIDB4MDEsIDB4NDgsIDB4RkQsIDB4NjYsIDB4MDQsIDB4MTgsIDB4RjksIDB4RTgsIDB4MEMsCi0JMHg3QywgMHg0NywgMHgxOSwgMHhGQywgMHg0RCwgMHgwMCwgMHhBOSwgMHgwMCwgMHgzNSwgMHhGRiwgMHg5NiwKLQkweDAwLCAweEI1LCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAotCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkMsIDB4RTksIDB4MDYsIDB4MTIsIDB4RjMsIDB4MTAsIDB4MjIsIDB4NkUsCi0JMHgzQywgMHgwNSwgMHhGMywgMHg3RSwgMHgwNSwgMHg5MSwgMHhGRCwgMHhGNCwgMHgwMCwgMHhCQSwgMHhGRiwKLQkweDA5LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgyLCAweEZGLCAweDYwLAotCTB4MDEsIDB4RTAsIDB4RkMsIDB4N0YsIDB4MDYsIDB4Q0MsIDB4RjEsIDB4ODUsIDB4MzYsIDB4ODcsIDB4MjksCi0JMHhFQiwgMHhGMSwgMHgyQSwgMHgwNywgMHgzOSwgMHhGQywgMHhENiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywKLQkweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQ1LCAweEZGLCAweDQyLCAweDAwLCAweEUxLCAweEZGLAotCTB4NzEsIDB4RkYsIDB4NzEsIDB4MDIsIDB4MDIsIDB4RjgsIDB4Q0MsIDB4NDQsIDB4RkEsIDB4MTMsIDB4QjAsCi0JMHhGNiwgMHg4MSwgMHgwNSwgMHhDMywgMHhGQywgMHhCOCwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDM0LCAweDAxLCAweEVBLAotCTB4RkQsIDB4MUYsIDB4MDMsIDB4QUUsIDB4RkIsIDB4NDUsIDB4MDYsIDB4RDUsIDB4NDgsIDB4M0MsIDB4MDEsCi0JMHhEQywgMHhGRCwgMHhGRCwgMHgwMSwgMHg4MCwgMHhGRSwgMHhFRCwgMHgwMCwgMHg5MywgMHhGRiwgMHgxQiwKLQkweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ4LCAweDAxLCAweDZGLCAweEZDLAotCTB4NDcsIDB4MDYsIDB4RDcsIDB4RjQsIDB4NUQsIDB4MUEsIDB4NzQsIDB4NDEsIDB4NDgsIDB4RjUsIDB4MDQsCi0JMHgwNCwgMHg4MCwgMHhGRSwgMHg2OSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHgwNSwgMHgwMCwKLQkweEZELCAweEZGLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweEFFLCAweDAxLCAweDZBLCAweEZDLCAweDBELAotCTB4MDcsIDB4ODAsIDB4RjEsIDB4QjgsIDB4MkYsIDB4Q0YsIDB4MzAsIDB4N0QsIDB4RjEsIDB4RkYsIDB4MDYsCi0JMHg3OCwgMHhGQywgMHhBNSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwKLQkweDAwLCAweEYzLCAweEZGLCAweEY0LCAweEZGLCAweDgwLCAweDAwLCAweDU4LCAweEZFLCAweDQ2LCAweDA0LAotCTB4REQsIDB4RjQsIDB4QzMsIDB4NDAsIDB4OEMsIDB4MUIsIDB4ODksIDB4RjQsIDB4NjYsIDB4MDYsIDB4NjMsCi0JMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwKLQkweDk4LCAweEZGLCAweEUwLCAweDAwLCAweDlDLCAweEZFLCAweEM4LCAweDAxLCAweDNGLCAweEZFLCAweDYyLAotCTB4MDAsIDB4QjgsIDB4NDgsIDB4M0YsIDB4MDcsIDB4NDcsIDB4RkIsIDB4NTMsIDB4MDMsIDB4RDAsIDB4RkQsCi0JMHg0MCwgMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwKLQkweDAwLCAweDQ3LCAweEZGLCAweEIwLCAweDAxLCAweEQ2LCAweEZDLCAweDU4LCAweDA1LCAweDBELCAweEY3LAotCTB4RDcsIDB4MTIsIDB4NEUsIDB4NDUsIDB4OTYsIDB4RjgsIDB4MjAsIDB4MDIsIDB4QTAsIDB4RkYsIDB4QzcsCi0JMHhGRiwgMHg0RiwgMHgwMCwgMHhEMCwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDQwLCAweEZGLCAweERCLCAweDAxLCAweDM1LCAweEZDLCAweDI2LCAweDA3LCAweDBFLCAweEYyLCAweDYwLAotCTB4MjgsIDB4ODIsIDB4MzcsIDB4RUQsIDB4RjEsIDB4NUUsIDB4MDYsIDB4RjgsIDB4RkMsIDB4NTEsIDB4MDEsCi0JMHg4QSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhCMCwKLQkweEZGLCAweDA3LCAweDAxLCAweDcyLCAweEZELCAweEFFLCAweDA1LCAweEM0LCAweEYyLCAweDkwLCAweDNCLAotCTB4M0YsIDB4MjMsIDB4RDksIDB4RjIsIDB4RjksIDB4MDYsIDB4MzQsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQSwgMHhGRiwgMHg4OSwgMHgwMCwKLQkweDUxLCAweEZGLCAweDc3LCAweDAwLCAweEE3LCAweDAwLCAweDY0LCAweEZCLCAweDI2LCAweDQ3LCAweEZDLAotCTB4MEQsIDB4QjQsIDB4RjgsIDB4OTUsIDB4MDQsIDB4MzEsIDB4RkQsIDB4ODgsIDB4MDEsIDB4NTYsIDB4RkYsCi0JMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RSwgMHhGRiwgMHg3MiwKLQkweDAxLCAweDYyLCAweEZELCAweDJGLCAweDA0LCAweDg5LCAweEY5LCAweEI2LCAweDBCLCAweEQyLCAweDQ3LAotCTB4RUIsIDB4RkMsIDB4RTQsIDB4RkYsIDB4RTMsIDB4MDAsIDB4MTYsIDB4RkYsIDB4QTUsIDB4MDAsIDB4QUYsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwKLQkweDNFLCAweEZDLCAweEQzLCAweDA2LCAweDU2LCAweEYzLCAweEJBLCAweDIwLCAweDYxLCAweDNELCAweDU2LAotCTB4RjMsIDB4NDUsIDB4MDUsIDB4QjcsIDB4RkQsIDB4REUsIDB4MDAsIDB4QzUsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwgMHg3QSwgMHhGRiwgMHg3MCwgMHgwMSwgMHhDNywKLQkweEZDLCAweEEwLCAweDA2LCAweEFFLCAweEYxLCAweDY1LCAweDM1LCAweEQxLCAweDJBLCAweENBLCAweEYxLAotCTB4MkEsIDB4MDcsIDB4NDAsIDB4RkMsIDB4RDAsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzRCwgMHhGRiwKLQkweEM5LCAweDAyLCAweDY0LCAweEY3LCAweDJGLCAweDQ0LCAweDQ0LCAweDE1LCAweDRBLCAweEY2LCAweEFELAotCTB4MDUsIDB4QUYsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QywgMHhGRiwgMHgyNiwgMHgwMSwgMHgwOCwgMHhGRSwgMHhFNCwKLQkweDAyLCAweDIxLCAweEZDLCAweDMxLCAweDA1LCAweEVCLCAweDQ4LCAweDM3LCAweDAyLCAweDZCLCAweEZELAotCTB4MzksIDB4MDIsIDB4NjEsIDB4RkUsIDB4RkMsIDB4MDAsIDB4OEQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RCwgMHhGQywgMHgyMywgMHgwNiwKLQkweDMyLCAweEY1LCAweDBDLCAweDE5LCAweDM4LCAweDQyLCAweEM3LCAweEY1LCAweEI4LCAweDAzLCAweEFGLAotCTB4RkUsIDB4NEUsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyRCwgMHgwMCwgMHg1NCwgMHhGRiwgMHhCOCwgMHgwMSwgMHg1RCwgMHhGQywgMHgxQSwgMHgwNywgMHg4QSwKLQkweEYxLCAweDdCLCAweDJFLCAweDA0LCAweDMyLCAweDdGLCAweEYxLCAweEVDLCAweDA2LCAweDhBLCAweEZDLAotCTB4OTgsIDB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjgsCi0JMHhGRiwgMHhFNywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyQywgMHhGRSwgMHg4QywgMHgwNCwgMHg2RCwgMHhGNCwKLQkweEYwLCAweDNGLCAweEUwLCAweDFDLCAweDM0LCAweEY0LCAweDg1LCAweDA2LCAweDU3LCAweEZDLCAweEUwLAotCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUUsIDB4RkYsCi0JMHhEMSwgMHgwMCwgMHhCQiwgMHhGRSwgMHg4RCwgMHgwMSwgMHhBRSwgMHhGRSwgMHg3NCwgMHhGRiwgMHg4RCwKLQkweDQ4LCAweDVELCAweDA4LCAweEQ0LCAweEZBLCAweDhELCAweDAzLCAweEIzLCAweEZELCAweDRFLCAweDAxLAotCTB4NkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEEsCi0JMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywgMHgyOCwgMHgwNSwgMHg3NywgMHhGNywgMHg5MiwgMHgxMSwKLQkweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLCAweDAxLCAweEQ2LCAweEZGLCAweEE5LCAweEZGLCAweDVFLAotCTB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsCi0JMHhERiwgMHgwMSwgMHgzMiwgMHhGQywgMHgxRiwgMHgwNywgMHgzQiwgMHhGMiwgMHgxMSwgMHgyNywgMHg5NywKLQkweDM4LCAweDE5LCAweEYyLCAweDM2LCAweDA2LCAweDE1LCAweEZELCAweDNGLCAweDAxLCAweDkzLCAweEZGLAotCTB4MTcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MUIsCi0JMHgwMSwgMHg1MCwgMHhGRCwgMHhFMSwgMHgwNSwgMHg4MiwgMHhGMiwgMHg4RiwgMHgzQSwgMHg5MiwgMHgyNCwKLQkweDlELCAweEYyLCAweDA5LCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDM5LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzAsIDB4RkYsIDB4N0EsIDB4MDAsIDB4NzAsIDB4RkYsCi0JMHgzRSwgMHgwMCwgMHgwQywgMHgwMSwgMHhBMSwgMHhGQSwgMHhCQiwgMHg0NiwgMHgzNiwgMHgwRiwgMHg0NSwKLQkweEY4LCAweEM5LCAweDA0LCAweDE4LCAweEZELCAweDkzLCAweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4NjYsIDB4MDEsIDB4N0QsCi0JMHhGRCwgMHhGOCwgMHgwMywgMHhGQiwgMHhGOSwgMHg4OSwgMHgwQSwgMHgxRCwgMHg0OCwgMHhDNSwgMHhGRCwKLQkweDdBLCAweEZGLCAweDFELCAweDAxLCAweEY3LCAweEZFLCAweEI0LCAweDAwLCAweEE5LCAweEZGLCAweDE1LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDUsIDB4RkMsCi0JMHhCQiwgMHgwNiwgMHhBMCwgMHhGMywgMHg2NCwgMHgxRiwgMHg0QSwgMHgzRSwgMHhCMCwgMHhGMywgMHgwOCwKLQkweDA1LCAweERFLCAweEZELCAweEM3LCAweDAwLCAweEQwLCAweEZGLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4N0YsIDB4MDEsIDB4QjAsIDB4RkMsIDB4QkUsCi0JMHgwNiwgMHg5NywgMHhGMSwgMHgzRiwgMHgzNCwgMHgxOSwgMHgyQywgMHhBRCwgMHhGMSwgMHgyOCwgMHgwNywKLQkweDQ4LCAweEZDLCAweEM5LCAweDAxLCAweDRCLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LAotCTB4MDAsIDB4RTAsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MUEsIDB4MDAsIDB4MEIsIDB4RkYsIDB4MUUsIDB4MDMsCi0JMHhDRCwgMHhGNiwgMHg4OSwgMHg0MywgMHg5MSwgMHgxNiwgMHhFNywgMHhGNSwgMHhEOCwgMHgwNSwgMHg5RCwKLQkweEZDLCAweEM3LCAweDAxLCAweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MUYsIDB4MDAsIDB4ODIsIDB4RkYsIDB4MTgsIDB4MDEsIDB4MjcsIDB4RkUsIDB4QTksIDB4MDIsIDB4OTQsCi0JMHhGQywgMHgyNCwgMHgwNCwgMHhGNSwgMHg0OCwgMHgzOSwgMHgwMywgMHhGOSwgMHhGQywgMHg3NCwgMHgwMiwKLQkweDQyLCAweEZFLCAweDBCLCAweDAxLCAweDg3LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LAotCTB4MDAsIDB4M0MsIDB4RkYsIDB4Q0QsIDB4MDEsIDB4OEUsIDB4RkMsIDB4RkMsIDB4MDUsIDB4OTAsIDB4RjUsCi0JMHhCQiwgMHgxNywgMHhFRSwgMHg0MiwgMHg0RSwgMHhGNiwgMHg2OCwgMHgwMywgMHhERiwgMHhGRSwgMHgzMywKLQkweDAwLCAweDFBLCAweDAwLCAweEU1LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLAotCTB4NEYsIDB4RkYsIDB4QzIsIDB4MDEsIDB4NTEsIDB4RkMsIDB4MjMsIDB4MDcsIDB4OUEsIDB4RjEsIDB4M0EsCi0JMHgyRCwgMHgzNSwgMHgzMywgMHg4OSwgMHhGMSwgMHhENSwgMHgwNiwgMHg5RCwgMHhGQywgMHg4QiwgMHgwMSwKLQkweDZDLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZDLCAweEZGLCAweERCLAotCTB4RkYsIDB4QjIsIDB4MDAsIDB4MDIsIDB4RkUsIDB4Q0YsIDB4MDQsIDB4MDUsIDB4RjQsIDB4MTYsIDB4M0YsCi0JMHgzNiwgMHgxRSwgMHhFNCwgMHhGMywgMHhBMywgMHgwNiwgMHg0RCwgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwKLQkweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMyLCAweDAwLAotCTB4REIsIDB4RkUsIDB4NTIsIDB4MDEsIDB4MUIsIDB4RkYsIDB4OEQsIDB4RkUsIDB4NTcsIDB4NDgsIDB4ODEsCi0JMHgwOSwgMHg2MSwgMHhGQSwgMHhDNiwgMHgwMywgMHg5NiwgMHhGRCwgMHg1QiwgMHgwMSwgMHg2OCwgMHhGRiwKLQkweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlELAotCTB4MDEsIDB4MDMsIDB4RkQsIDB4RjcsIDB4MDQsIDB4RTMsIDB4RjcsIDB4NTEsIDB4MTAsIDB4NTUsIDB4NDYsCi0JMHhGOSwgMHhGOSwgMHg2MywgMHgwMSwgMHgwRCwgMHgwMCwgMHg4QiwgMHhGRiwgMHg2RCwgMHgwMCwgMHhDNSwKLQkweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLAotCTB4MzEsIDB4RkMsIDB4MTUsIDB4MDcsIDB4NkQsIDB4RjIsIDB4QkYsIDB4MjUsIDB4QTUsIDB4MzksIDB4NEQsCi0JMHhGMiwgMHgwQiwgMHgwNiwgMHgzMywgMHhGRCwgMHgyRCwgMHgwMSwgMHg5RCwgMHhGRiwgMHgxMywgMHgwMCwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDE0LCAweDAwLCAweDlDLCAweEZGLCAweDJGLCAweDAxLCAweDMwLAotCTB4RkQsIDB4MTAsIDB4MDYsIDB4NDcsIDB4RjIsIDB4ODcsIDB4MzksIDB4RTUsIDB4MjUsIDB4NjcsIDB4RjIsCi0JMHgxNiwgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDBFLCAweDAwLCAweEM2LCAweEZGLCAweDZCLCAweDAwLCAweDhFLCAweEZGLCAweDA2LCAweDAwLAotCTB4NkUsIDB4MDEsIDB4RTQsIDB4RjksIDB4NDgsIDB4NDYsIDB4NzUsIDB4MTAsIDB4RDcsIDB4RjcsIDB4RkMsCi0JMHgwNCwgMHgwMCwgMHhGRCwgMHg5RSwgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLCAweDU5LCAweDAxLCAweDk5LCAweEZELCAweEMwLAotCTB4MDMsIDB4NkUsIDB4RkEsIDB4NjEsIDB4MDksIDB4NUQsIDB4NDgsIDB4QTYsIDB4RkUsIDB4MEYsIDB4RkYsCi0JMHg1OCwgMHgwMSwgMHhENywgMHhGRSwgMHhDMywgMHgwMCwgMHhBMywgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRFLCAweEZDLCAweEEwLCAweDA2LAotCTB4RUQsIDB4RjMsIDB4MEYsIDB4MUUsIDB4MkQsIDB4M0YsIDB4MTAsIDB4RjQsIDB4QzgsIDB4MDQsIDB4MDcsCi0JMHhGRSwgMHhBRiwgMHgwMCwgMHhEQywgMHhGRiwgMHhGQywgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDI1LCAweDAwLCAweDZCLCAweEZGLCAweDhELCAweDAxLCAweDlCLCAweEZDLCAweEQ4LCAweDA2LCAweDg3LAotCTB4RjEsIDB4MTMsIDB4MzMsIDB4NUUsIDB4MkQsIDB4OTgsIDB4RjEsIDB4MjIsIDB4MDcsIDB4NTIsIDB4RkMsCi0JMHhDMSwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNSwKLQkweEZGLCAweDE4LCAweDAwLCAweDM2LCAweDAwLCAweEQ5LCAweEZFLCAweDcxLCAweDAzLCAweDNGLCAweEY2LAotCTB4REIsIDB4NDIsIDB4RTAsIDB4MTcsIDB4ODYsIDB4RjUsIDB4MDAsIDB4MDYsIDB4OEMsIDB4RkMsIDB4Q0UsCi0JMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwKLQkweDA5LCAweDAxLCAweDQ1LCAweEZFLCAweDZFLCAweDAyLCAweDA2LCAweEZELCAweDFDLCAweDAzLCAweEY0LAotCTB4NDgsIDB4NDEsIDB4MDQsIDB4ODcsIDB4RkMsIDB4QjAsIDB4MDIsIDB4MjMsIDB4RkUsIDB4MTksIDB4MDEsCi0JMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwKLQkweEZGLCAweEM2LCAweDAxLCAweDlGLCAweEZDLCAweEQzLCAweDA1LCAweEYxLCAweEY1LCAweDZDLCAweDE2LAotCTB4OUUsIDB4NDMsIDB4REQsIDB4RjYsIDB4MTUsIDB4MDMsIDB4MTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MjgsCi0JMHgwMCwgMHhERiwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwKLQkweENBLCAweDAxLCAweDQ3LCAweEZDLCAweDI4LCAweDA3LCAweEIwLCAweEYxLCAweEY1LCAweDJCLCAweDYwLAotCTB4MzQsIDB4OUEsIDB4RjEsIDB4QkIsIDB4MDYsIDB4QjMsIDB4RkMsIDB4N0QsIDB4MDEsIDB4NzMsIDB4RkYsCi0JMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRiwgMHhGRiwgMHhDOSwKLQkweDAwLCAweERBLCAweEZELCAweDBGLCAweDA1LCAweEE1LCAweEYzLCAweDMxLCAweDNFLCAweDhBLCAweDFGLAotCTB4OTcsIDB4RjMsIDB4QkQsIDB4MDYsIDB4NDQsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBQSwgMHhGRiwgMHhCMywgMHgwMCwgMHhGQSwgMHhGRSwKLQkweDE3LCAweDAxLCAweDg2LCAweEZGLCAweEFDLCAweEZELCAweDE2LCAweDQ4LCAweEFBLCAweDBBLCAweEVFLAotCTB4RjksIDB4RkUsIDB4MDMsIDB4N0EsIDB4RkQsIDB4NjcsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MiwgMHhGRiwgMHg5MiwgMHgwMSwgMHgxQiwKLQkweEZELCAweEM0LCAweDA0LCAweDUxLCAweEY4LCAweDEzLCAweDBGLCAweEM4LCAweDQ2LCAweEI2LCAweEZBLAotCTB4MDEsIDB4MDEsIDB4NDQsIDB4MDAsIDB4NkMsIDB4RkYsIDB4N0IsIDB4MDAsIDB4QkYsIDB4RkYsIDB4MTAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywKLQkweDA4LCAweDA3LCAweEE0LCAweEYyLCAweDZELCAweDI0LCAweEFELCAweDNBLCAweDg4LCAweEYyLCAweERCLAotCTB4MDUsIDB4NTMsIDB4RkQsIDB4MTksIDB4MDEsIDB4QTcsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgxNywgMHgwMCwgMHg5MiwgMHhGRiwgMHg0MSwgMHgwMSwgMHgxMSwgMHhGRCwgMHgzQiwKLQkweDA2LCAweDE0LCAweEYyLCAweDc4LCAweDM4LCAweDM2LCAweDI3LCAweDM1LCAweEYyLCAweDIwLCAweDA3LAotCTB4MzMsIDB4RkMsIDB4REYsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsCi0JMHgwMCwgMHhDQiwgMHhGRiwgMHg1QywgMHgwMCwgMHhBQywgMHhGRiwgMHhEMCwgMHhGRiwgMHhDRCwgMHgwMSwKLQkweDMwLCAweEY5LCAweEM4LCAweDQ1LCAweEI2LCAweDExLCAweDZCLCAweEY3LCAweDJELCAweDA1LCAweEU5LAotCTB4RkMsIDB4QTgsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHg0QywgMHgwMSwgMHhCNiwgMHhGRCwgMHg4NiwgMHgwMywgMHhFMSwKLQkweEZBLCAweDNELCAweDA4LCAweDkyLCAweDQ4LCAweDhFLCAweEZGLCAweEExLCAweEZFLCAweDkzLCAweDAxLAotCTB4QjgsIDB4RkUsIDB4RDMsIDB4MDAsIDB4OUQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1OCwgMHhGQywgMHg4MiwgMHgwNiwgMHgzRSwgMHhGNCwKLQkweEJBLCAweDFDLCAweDA3LCAweDQwLCAweDc5LCAweEY0LCAweDg0LCAweDA0LCAweDMxLCAweEZFLCAweDk2LAotCTB4MDAsIDB4RTgsIDB4RkYsIDB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHg2NCwgMHhGRiwgMHg5QSwgMHgwMSwgMHg4OCwgMHhGQywgMHhFRSwgMHgwNiwgMHg3RSwgMHhGMSwgMHhFMywKLQkweDMxLCAweDlGLCAweDJFLCAweDg4LCAweEYxLCAweDE5LCAweDA3LCAweDVFLCAweEZDLCAweEI3LCAweDAxLAotCTB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MEIsCi0JMHgwMCwgMHg1MSwgMHgwMCwgMHhBQSwgMHhGRSwgMHhDMCwgMHgwMywgMHhCOCwgMHhGNSwgMHgyMSwgMHg0MiwKLQkweDMxLCAweDE5LCAweDI4LCAweEY1LCAweDI3LCAweDA2LCAweDdDLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEQsIDB4RkYsIDB4RkEsIDB4MDAsCi0JMHg2NCwgMHhGRSwgMHgzMiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgxQiwgMHgwMiwgMHhFQSwgMHg0OCwgMHg1MCwKLQkweDA1LCAweDE0LCAweEZDLCAweEVCLCAweDAyLCAweDA1LCAweEZFLCAweDI3LCAweDAxLCAweDdDLCAweEZGLAotCTB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4QkYsCi0JMHgwMSwgMHhCMiwgMHhGQywgMHhBOSwgMHgwNSwgMHg1NSwgMHhGNiwgMHgyMCwgMHgxNSwgMHg0MiwgMHg0NCwKLQkweDc1LCAweEY3LCAweEJGLCAweDAyLCAweDQzLCAweEZGLCAweEZBLCAweEZGLCAweDM2LCAweDAwLCAweERBLAotCTB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsCi0JMHgzRiwgMHhGQywgMHgyQiwgMHgwNywgMHhDRCwgMHhGMSwgMHhBRSwgMHgyQSwgMHg4NiwgMHgzNSwgMHhCMSwKLQkweEYxLCAweDlELCAweDA2LCAweENBLCAweEZDLCAweDZFLCAweDAxLCAweDdCLCAweEZGLCAweDIwLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4QzMsIDB4RkYsIDB4RTAsIDB4MDAsIDB4QjMsCi0JMHhGRCwgMHg0QiwgMHgwNSwgMHg0RCwgMHhGMywgMHg0NSwgMHgzRCwgMHhFMCwgMHgyMCwgMHg0RiwgMHhGMywKLQkweEQ1LCAweDA2LCAweDNELCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MTMsIDB4MDAsIDB4QUYsIDB4RkYsIDB4QTQsIDB4MDAsIDB4MTksIDB4RkYsIDB4REQsIDB4MDAsCi0JMHhGMCwgMHhGRiwgMHhENCwgMHhGQywgMHhDOSwgMHg0NywgMHhEOCwgMHgwQiwgMHg3QywgMHhGOSwgMHgzNSwKLQkweDA0LCAweDVGLCAweEZELCAweDc0LCAweDAxLCAweDVFLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsIDB4ODcsIDB4MDEsIDB4MzQsIDB4RkQsIDB4OEYsCi0JMHgwNCwgMHhDMCwgMHhGOCwgMHhEOSwgMHgwRCwgMHgzMSwgMHg0NywgMHg3QiwgMHhGQiwgMHg5QywgMHgwMCwKLQkweDdELCAweDAwLCAweDRELCAweEZGLCAweDhBLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsCi0JMHhFMCwgMHhGMiwgMHgxOCwgMHgyMywgMHhBQiwgMHgzQiwgMHhDQywgMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwKLQkweEZELCAweDA0LCAweDAxLCAweEIxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLAotCTB4MUEsIDB4MDAsIDB4ODksIDB4RkYsIDB4NTMsIDB4MDEsIDB4RjUsIDB4RkMsIDB4NjMsIDB4MDYsIDB4RTksCi0JMHhGMSwgMHg2MywgMHgzNywgMHg4NSwgMHgyOCwgMHgwOSwgMHhGMiwgMHgyNywgMHgwNywgMHgzNSwgMHhGQywKLQkweERBLCAweDAxLCAweDQwLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLCAweDAwLCAweEQxLAotCTB4RkYsIDB4NEUsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4OUEsIDB4RkYsIDB4MkEsIDB4MDIsIDB4ODMsIDB4RjgsCi0JMHgzRiwgMHg0NSwgMHhGQiwgMHgxMiwgMHgwMSwgMHhGNywgMHg1RCwgMHgwNSwgMHhEMywgMHhGQywgMHhCMSwKLQkweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLAotCTB4NzMsIDB4RkYsIDB4M0YsIDB4MDEsIDB4RDMsIDB4RkQsIDB4NEMsIDB4MDMsIDB4NTQsIDB4RkIsIDB4MUYsCi0JMHgwNywgMHhCQiwgMHg0OCwgMHg3RCwgMHgwMCwgMHgzMywgMHhGRSwgMHhDRiwgMHgwMSwgMHg5OCwgMHhGRSwKLQkweEUyLCAweDAwLCAweDk3LCAweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LAotCTB4RkYsIDB4REMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsCi0JMHhEOSwgMHg0MCwgMHhFQSwgMHhGNCwgMHgzRSwgMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwKLQkweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVFLCAweEZGLAotCTB4QTYsIDB4MDEsIDB4NzYsIDB4RkMsIDB4MDEsIDB4MDcsIDB4N0QsIDB4RjEsIDB4QUQsIDB4MzAsIDB4REMsCi0JMHgyRiwgMHg3RiwgMHhGMSwgMHgwQywgMHgwNywgMHg2QywgMHhGQywgMHhBRCwgMHgwMSwgMHg1QSwgMHhGRiwKLQkweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweDZDLAotCTB4MDAsIDB4N0IsIDB4RkUsIDB4MEMsIDB4MDQsIDB4M0EsIDB4RjUsIDB4NUYsIDB4NDEsIDB4ODMsIDB4MUEsCi0JMHhDRCwgMHhGNCwgMHg0QiwgMHgwNiwgMHg2RCwgMHhGQywgMHhEOSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwKLQkweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDkzLCAweEZGLCAweEVDLCAweDAwLCAweDgzLCAweEZFLAotCTB4RjcsIDB4MDEsIDB4RTgsIDB4RkQsIDB4MjEsIDB4MDEsIDB4RDIsIDB4NDgsIDB4NjQsIDB4MDYsIDB4QTEsCi0JMHhGQiwgMHgyNiwgMHgwMywgMHhFNywgMHhGRCwgMHgzNSwgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLCAweEI3LCAweDAxLCAweEM1LAotCTB4RkMsIDB4N0MsIDB4MDUsIDB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsIDB4NDQsIDB4MTQsIDB4RjgsCi0JMHg2NywgMHgwMiwgMHg3NywgMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwgMHhENSwgMHhGRiwgMHgwQiwKLQkweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ3LCAweDAxLCAweDM5LCAweEZDLAotCTB4MjksIDB4MDcsIDB4RUYsIDB4RjEsIDB4NjIsIDB4MjksIDB4QTUsIDB4MzYsIDB4RDAsIDB4RjEsIDB4N0IsCi0JMHgwNiwgMHhFMywgMHhGQywgMHg1RSwgMHgwMSwgMHg4MywgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDAxLCAweDAwLCAweDA5LCAweDAwLCAweEI4LCAweEZGLCAweEY2LCAweDAwLCAweDhELCAweEZELCAweDg0LAotCTB4MDUsIDB4RkQsIDB4RjIsIDB4NTIsIDB4M0MsIDB4MzUsIDB4MjIsIDB4MEIsIDB4RjMsIDB4RUIsIDB4MDYsCi0JMHgzNywgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwKLQkweDAwLCAweEI1LCAweEZGLCAweDk0LCAweDAwLCAweDM5LCAweEZGLCAweEEzLCAweDAwLCAweDU4LCAweDAwLAotCTB4MDIsIDB4RkMsIDB4NzMsIDB4NDcsIDB4MEIsIDB4MEQsIDB4MEIsIDB4RjksIDB4NkMsIDB4MDQsIDB4NDUsCi0JMHhGRCwgMHg4MCwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDJBLCAweDAwLCAweDVCLCAweEZGLCAweDdDLCAweDAxLCAweDRFLCAweEZELCAweDVBLCAweDA0LCAweDMxLAotCTB4RjksIDB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsIDB4NDcsIDB4RkMsIDB4MzYsIDB4MDAsIDB4QjYsIDB4MDAsCi0JMHgyRSwgMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM5LCAweEZDLCAweEU0LCAweDA2LCAweDIxLCAweEYzLAotCTB4QzQsIDB4MjEsIDB4QTUsIDB4M0MsIDB4MTYsIDB4RjMsIDB4NzIsIDB4MDUsIDB4OUEsIDB4RkQsIDB4RUYsCi0JMHgwMCwgMHhCQywgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweDgwLCAweEZGLCAweDY0LCAweDAxLCAweERBLCAweEZDLCAweDg3LCAweDA2LCAweEM1LCAweEYxLCAweDQ2LAotCTB4MzYsIDB4RDEsIDB4MjksIDB4RTMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0EsIDB4RkMsIDB4RDUsIDB4MDEsCi0JMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhENiwgMHhGRiwgMHgzRiwKLQkweDAwLCAweEU3LCAweEZGLCAweDY1LCAweEZGLCAweDg1LCAweDAyLCAweERFLCAweEY3LCAweEE5LCAweDQ0LAotCTB4NDMsIDB4MTQsIDB4OTksIDB4RjYsIDB4OEIsIDB4MDUsIDB4QkYsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NDMsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OCwgMHhGRiwKLQkweDMxLCAweDAxLCAweEYxLCAweEZELCAweDEyLCAweDAzLCAweEM3LCAweEZCLCAweDA3LCAweDA2LCAweERCLAotCTB4NDgsIDB4NzMsIDB4MDEsIDB4QzMsIDB4RkQsIDB4MEEsIDB4MDIsIDB4NzksIDB4RkUsIDB4RjEsIDB4MDAsCi0JMHg5MSwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhENywKLQkweDAxLCAweDcyLCAweEZDLCAweDNGLCAweDA2LCAweEVCLCAweEY0LCAweDEyLCAweDFBLCAweEExLCAweDQxLAotCTB4NjMsIDB4RjUsIDB4RjMsIDB4MDMsIDB4OEEsIDB4RkUsIDB4NjMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RUUsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1OCwgMHhGRiwgMHhCMSwgMHgwMSwKLQkweDY3LCAweEZDLCAweDEwLCAweDA3LCAweDgxLCAweEYxLCAweDczLCAweDJGLCAweDE1LCAweDMxLCAweDdDLAotCTB4RjEsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RkMsIDB4QTIsIDB4MDEsIDB4NjAsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGMSwgMHhGRiwgMHg4NSwgMHgwMCwgMHg0RSwKLQkweEZFLCAweDU2LCAweDA0LCAweEMzLCAweEY0LCAweDk1LCAweDQwLCAweEQ4LCAweDFCLCAweDc2LCAweEY0LAotCTB4NkQsIDB4MDYsIDB4NjAsIDB4RkMsIDB4REQsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxOSwgMHgwMCwgMHg5OSwgMHhGRiwgMHhERCwgMHgwMCwgMHhBMywgMHhGRSwgMHhCQiwgMHgwMSwKLQkweDU4LCAweEZFLCAweDJELCAweDAwLCAweEFGLCAweDQ4LCAweDdFLCAweDA3LCAweDJFLCAweEZCLCAweDYwLAotCTB4MDMsIDB4QzksIDB4RkQsIDB4NDMsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OCwgMHhGRiwgMHhBRSwgMHgwMSwgMHhEQiwgMHhGQywgMHg0RCwKLQkweDA1LCAweDI0LCAweEY3LCAweDhFLCAweDEyLCAweDZELCAweDQ1LCAweEJDLCAweEY4LCAweDBDLCAweDAyLAotCTB4QUMsIDB4RkYsIDB4QzAsIDB4RkYsIDB4NTIsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwgMHgzNCwgMHhGQywgMHgyNSwgMHgwNywKLQkweDE4LCAweEYyLCAweDE1LCAweDI4LCAweEJGLCAweDM3LCAweEY3LCAweEYxLCAweDU2LCAweDA2LCAweEZFLAotCTB4RkMsIDB4NEQsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgwRCwgMHgwMCwgMHhBRSwgMHhGRiwgMHgwQiwgMHgwMSwgMHg2QSwgMHhGRCwgMHhCQSwgMHgwNSwgMHhCNCwKLQkweEYyLCAweDU4LCAweDNCLCAweDhBLCAweDIzLCAweENCLCAweEYyLCAweEZELCAweDA2LCAweDM0LCAweEZDLAotCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkIsCi0JMHhGRiwgMHg4NSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg2QSwgMHgwMCwgMHhCRSwgMHgwMCwgMHgzOCwgMHhGQiwKLQkweDBGLCAweDQ3LCAweDQyLCAweDBFLCAweDlCLCAweEY4LCAweEExLCAweDA0LCAweDJCLCAweEZELCAweDhCLAotCTB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsCi0JMHg1RiwgMHhGRiwgMHg3MCwgMHgwMSwgMHg2OCwgMHhGRCwgMHgyMywgMHgwNCwgMHhBMiwgMHhGOSwgMHg3MywKLQkweDBCLCAweEU0LCAweDQ3LCAweDFCLCAweEZELCAweENELCAweEZGLCAweEYwLCAweDAwLCAweDBGLCAweEZGLAotCTB4QTksIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCi0JMHhGRiwgMHhFNiwgMHgwMSwgMHgzRiwgMHhGQywgMHhDRSwgMHgwNiwgMHg2NiwgMHhGMywgMHg2RiwgMHgyMCwKLQkweDk2LCAweDNELCAweDY5LCAweEYzLCAweDM4LCAweDA1LCAweEJGLCAweEZELCAweEQ5LCAweDAwLCAweEM3LAotCTB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsIDB4NzgsIDB4RkYsCi0JMHg3NCwgMHgwMSwgMHhDMiwgMHhGQywgMHhBNywgMHgwNiwgMHhBOCwgMHhGMSwgMHgyNSwgMHgzNSwgMHgxQiwKLQkweDJCLCAweEMyLCAweEYxLCAweDJBLCAweDA3LCAweDQxLCAweEZDLCAweENFLCAweDAxLCAweDQ3LCAweEZGLAotCTB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MzEsIDB4MDAsIDB4MDQsCi0JMHgwMCwgMHgzMiwgMHhGRiwgMHhEQywgMHgwMiwgMHg0MiwgMHhGNywgMHgwQiwgMHg0NCwgMHg4RSwgMHgxNSwKLQkweDM0LCAweEY2LCAweEI3LCAweDA1LCAweEFCLCAweEZDLCAweEMxLCAweDAxLCAweDQwLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0UsIDB4RkYsIDB4MjMsIDB4MDEsCi0JMHgwRiwgMHhGRSwgMHhENywgMHgwMiwgMHgzQiwgMHhGQywgMHhGNSwgMHgwNCwgMHhFRCwgMHg0OCwgMHg3MCwKLQkweDAyLCAweDUyLCAweEZELCAweDQ2LCAweDAyLCAweDVBLCAweEZFLCAweEZGLCAweDAwLCAweDhCLCAweEZGLAotCTB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDIsIDB4MDEsIDB4ODEsCi0JMHhGQywgMHgxQSwgMHgwNiwgMHg0NywgMHhGNSwgMHhDMSwgMHgxOCwgMHg2MCwgMHg0MiwgMHhFNCwgMHhGNSwKLQkweEE2LCAweDAzLCAweEI5LCAweEZFLCAweDQ4LCAweDAwLCAweDBGLCAweDAwLCAweEU5LCAweEZGLCAweDA3LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTMsIDB4RkYsIDB4QkIsIDB4MDEsIDB4NUEsIDB4RkMsCi0JMHgxQywgMHgwNywgMHg4RCwgMHhGMSwgMHgzNCwgMHgyRSwgMHg0OCwgMHgzMiwgMHg4MSwgMHhGMSwgMHhFNywKLQkweDA2LCAweDhFLCAweEZDLCAweDk2LCAweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLAotCTB4MDQsIDB4MDAsIDB4RjksIDB4RkYsIDB4RTQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjMsIDB4RkUsIDB4OUIsCi0JMHgwNCwgMHg1NSwgMHhGNCwgMHhDMCwgMHgzRiwgMHgyQywgMHgxRCwgMHgyMiwgMHhGNCwgMHg4QywgMHgwNiwKLQkweDU1LCAweEZDLCAweEUxLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LAotCTB4MDAsIDB4OUYsIDB4RkYsIDB4Q0UsIDB4MDAsIDB4QzIsIDB4RkUsIDB4ODAsIDB4MDEsIDB4QzYsIDB4RkUsCi0JMHg0MCwgMHhGRiwgMHg4MSwgMHg0OCwgMHg5RSwgMHgwOCwgMHhCQSwgMHhGQSwgMHg5QSwgMHgwMywgMHhBQywKLQkweEZELCAweDUxLCAweDAxLCAweDZDLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MkYsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QTQsIDB4MDEsIDB4RjEsIDB4RkMsIDB4MUQsIDB4MDUsIDB4OEYsCi0JMHhGNywgMHg0QSwgMHgxMSwgMHhGMiwgMHg0NSwgMHg2QiwgMHhGOSwgMHhBRSwgMHgwMSwgMHhFMiwgMHhGRiwKLQkweEEyLCAweEZGLCAweDYxLCAweDAwLCAweEM5LCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM1LAotCTB4MDAsIDB4M0QsIDB4RkYsIDB4RTAsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUQsIDB4MDcsIDB4NDUsIDB4RjIsCi0JMHhDNiwgMHgyNiwgMHhEMywgMHgzOCwgMHgyNCwgMHhGMiwgMHgyRCwgMHgwNiwgMHgxQiwgMHhGRCwgMHgzQiwKLQkweDAxLCAweDk1LCAweEZGLCAweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDExLCAweDAwLAotCTB4QTMsIDB4RkYsIDB4MjAsIDB4MDEsIDB4NDksIDB4RkQsIDB4RUIsIDB4MDUsIDB4NzQsIDB4RjIsIDB4NTQsCi0JMHgzQSwgMHhERCwgMHgyNCwgMHg5MSwgMHhGMiwgMHgwQywgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwKLQkweDNBLCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMxLCAweEZGLCAweDc2LAotCTB4MDAsIDB4NzYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4MjIsIDB4MDEsIDB4NzYsIDB4RkEsIDB4QTMsIDB4NDYsCi0JMHg3RCwgMHgwRiwgMHgyQywgMHhGOCwgMHhENSwgMHgwNCwgMHgxMywgMHhGRCwgMHg5NiwgMHgwMSwgMHg1MSwKLQkweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY0LCAweEZGLAotCTB4NjMsIDB4MDEsIDB4ODQsIDB4RkQsIDB4RUIsIDB4MDMsIDB4MTQsIDB4RkEsIDB4NDcsIDB4MEEsIDB4MkMsCi0JMHg0OCwgMHhGNiwgMHhGRCwgMHg2MywgMHhGRiwgMHgyQiwgMHgwMSwgMHhGMCwgMHhGRSwgMHhCOCwgMHgwMCwKLQkweEE4LCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LAotCTB4MDEsIDB4NDcsIDB4RkMsIDB4QjUsIDB4MDYsIDB4QjAsIDB4RjMsIDB4MTksIDB4MUYsIDB4N0UsIDB4M0UsCi0JMHhDNCwgMHhGMywgMHhGQSwgMHgwNCwgMHhFNywgMHhGRCwgMHhDMSwgMHgwMCwgMHhEMywgMHhGRiwgMHhGRiwKLQkweEZGLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcxLCAweEZGLCAweDgyLCAweDAxLAotCTB4QUIsIDB4RkMsIDB4QzQsIDB4MDYsIDB4OTMsIDB4RjEsIDB4RkQsIDB4MzMsIDB4NjIsIDB4MkMsIDB4QTgsCi0JMHhGMSwgMHgyNywgMHgwNywgMHg0QSwgMHhGQywgMHhDNywgMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwKLQkweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUxLCAweEZGLCAweDIzLCAweDAwLCAweDIwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4MzEsIDB4MDMsIDB4QUQsIDB4RjYsIDB4NjUsIDB4NDMsIDB4REMsIDB4MTYsIDB4RDEsIDB4RjUsCi0JMHhFMSwgMHgwNSwgMHg5OSwgMHhGQywgMHhDOSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgzLCAweEZGLCAweDE0LCAweDAxLCAweDJELCAweEZFLAotCTB4OUMsIDB4MDIsIDB4QUQsIDB4RkMsIDB4RTksIDB4MDMsIDB4RjYsIDB4NDgsIDB4NzMsIDB4MDMsIDB4RTAsCi0JMHhGQywgMHg4MiwgMHgwMiwgMHgzQiwgMHhGRSwgMHgwRSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLCAweENDLCAweDAxLCAweDkxLCAweEZDLCAweEYzLAotCTB4MDUsIDB4QTYsIDB4RjUsIDB4NzAsIDB4MTcsIDB4MTcsIDB4NDMsIDB4NkQsIDB4RjYsIDB4NTYsIDB4MDMsCi0JMHhFQSwgMHhGRSwgMHgyRCwgMHgwMCwgMHgxRCwgMHgwMCwgMHhFNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDJGLCAweDAwLCAweDRFLCAweEZGLCAweEMzLCAweDAxLCAweDRFLCAweEZDLCAweDI0LCAweDA3LAotCTB4OUUsIDB4RjEsIDB4RjIsIDB4MkMsIDB4NzgsIDB4MzMsIDB4OEMsIDB4RjEsIDB4RDAsIDB4MDYsIDB4QTIsCi0JMHhGQywgMHg4OCwgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwKLQkweEZELCAweEZGLCAweEQ4LCAweEZGLCAweEI3LCAweDAwLCAweEY5LCAweEZELCAweERFLCAweDA0LCAweEVGLAotCTB4RjMsIDB4RTQsIDB4M0UsIDB4ODEsIDB4MUUsIDB4RDIsIDB4RjMsIDB4QTksIDB4MDYsIDB4NEIsIDB4RkMsCi0JMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNSwKLQkweEZGLCAweEJFLCAweDAwLCAweEUyLCAweEZFLCAweDQ1LCAweDAxLCAweDMzLCAweEZGLCAweDVBLCAweEZFLAotCTB4NDgsIDB4NDgsIDB4QzMsIDB4MDksIDB4NDcsIDB4RkEsIDB4RDIsIDB4MDMsIDB4OTAsIDB4RkQsIDB4NUUsCi0JMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwKLQkweDRGLCAweEZGLCAweDlBLCAweDAxLCAweDA4LCAweEZELCAweEVCLCAweDA0LCAweEZDLCAweEY3LCAweDBBLAotCTB4MTAsIDB4NzAsIDB4NDYsIDB4MjIsIDB4RkEsIDB4NEQsIDB4MDEsIDB4MTksIDB4MDAsIDB4ODQsIDB4RkYsCi0JMHg3MCwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwKLQkweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDEyLCAweDA3LCAweDc5LCAweEYyLCAweDczLCAweDI1LAotCTB4REYsIDB4MzksIDB4NUEsIDB4RjIsIDB4MDAsIDB4MDYsIDB4M0EsIDB4RkQsIDB4MjgsIDB4MDEsIDB4OUYsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNSwgMHgwMCwgMHg5OSwgMHhGRiwKLQkweDMzLCAweDAxLCAweDI5LCAweEZELCAweDFBLCAweDA2LCAweDNCLCAweEYyLCAweDRCLCAweDM5LCAweDMwLAotCTB4MjYsIDB4NUIsIDB4RjIsIDB4MTksIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNywgMHhGRiwgMHg2OCwgMHgwMCwgMHg5NSwKLQkweEZGLCAweEZBLCAweEZGLCAweDgzLCAweDAxLCAweEJCLCAweEY5LCAweDJCLCAweDQ2LCAweEJCLCAweDEwLAotCTB4QkYsIDB4RjcsIDB4MDcsIDB4MDUsIDB4RkIsIDB4RkMsIDB4QTAsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg1NiwgMHgwMSwKLQkweEEwLCAweEZELCAweEIzLCAweDAzLCAweDg3LCAweEZBLCAweDFGLCAweDA5LCAweDZBLCAweDQ4LCAweEQ5LAotCTB4RkUsIDB4RjYsIDB4RkUsIDB4NjUsIDB4MDEsIDB4RDAsIDB4RkUsIDB4QzcsIDB4MDAsIDB4QTIsIDB4RkYsCi0JMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg1MCwKLQkweEZDLCAweDk5LCAweDA2LCAweEZFLCAweEYzLCAweEMzLCAweDFELCAweDVFLCAweDNGLCAweDI3LCAweEY0LAotCTB4QjksIDB4MDQsIDB4MTAsIDB4RkUsIDB4QTksIDB4MDAsIDB4REYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg5MCwgMHgwMSwgMHg5NiwgMHhGQywKLQkweERELCAweDA2LCAweDg1LCAweEYxLCAweEQwLCAweDMyLCAweEE2LCAweDJELCAweDk0LCAweEYxLCAweDIwLAotCTB4MDcsIDB4NTQsIDB4RkMsIDB4QkYsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHhFNiwgMHhGRiwgMHgxNSwgMHgwMCwgMHgzQywgMHgwMCwgMHhDRiwgMHhGRSwgMHg4MywKLQkweDAzLCAweDIwLCAweEY2LCAweEIyLCAweDQyLCAweDJCLCAweDE4LCAweDcxLCAweEY1LCAweDA5LCAweDA2LAotCTB4ODgsIDB4RkMsIDB4Q0YsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsCi0JMHgwMCwgMHg4OSwgMHhGRiwgMHgwNiwgMHgwMSwgMHg0QywgMHhGRSwgMHg2MCwgMHgwMiwgMHgxRiwgMHhGRCwKLQkweEUyLCAweDAyLCAweEYzLCAweDQ4LCAweDdELCAweDA0LCAweDZFLCAweEZDLCAweEJELCAweDAyLCAweDFDLAotCTB4RkUsIDB4MUMsIDB4MDEsIDB4ODAsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNSwgMHgwMSwgMHhBMywgMHhGQywgMHhDQSwgMHgwNSwgMHgwNywKLQkweEY2LCAweDIyLCAweDE2LCAweEMzLCAweDQzLCAweEZFLCAweEY2LCAweDAyLCAweDAzLCAweDFCLCAweEZGLAotCTB4MTEsIDB4MDAsIDB4MkIsIDB4MDAsIDB4REUsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsCi0JMHgwMCwgMHg0OSwgMHhGRiwgMHhDQiwgMHgwMSwgMHg0NSwgMHhGQywgMHgyOSwgMHgwNywgMHhCNiwgMHhGMSwKLQkweEFELCAweDJCLCAweEEyLCAweDM0LCAweDlFLCAweEYxLCAweEI0LCAweDA2LCAweEI4LCAweEZDLCAweDdBLAotCTB4MDEsIDB4NzUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHhDQywgMHhGRiwgMHhDRSwgMHgwMCwgMHhEMSwgMHhGRCwgMHgxRCwgMHgwNSwgMHg5MSwgMHhGMywgMHhGRSwKLQkweDNELCAweEQ3LCAweDFGLCAweDg3LCAweEYzLCAweEMzLCAweDA2LCAweDQyLCAweEZDLCAweEU1LCAweDAxLAotCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUIsIDB4RkYsIDB4QUYsCi0JMHgwMCwgMHgwMSwgMHhGRiwgMHgwQSwgMHgwMSwgMHg5RSwgMHhGRiwgMHg3QywgMHhGRCwgMHgwMywgMHg0OCwKLQkweEVELCAweDBBLCAweEQ1LCAweEY5LCAweDBBLCAweDA0LCAweDc0LCAweEZELCAweDZBLCAweDAxLCAweDYyLAotCTB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsCi0JMHg5MCwgMHgwMSwgMHgyMCwgMHhGRCwgMHhCOCwgMHgwNCwgMHg2QSwgMHhGOCwgMHhDRCwgMHgwRSwgMHhFMSwKLQkweDQ2LCAweEUxLCAweEZBLCAweEVCLCAweDAwLCAweDUxLCAweDAwLCAweDY1LCAweEZGLCAweDdGLCAweDAwLAotCTB4QkUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCi0JMHgwMSwgMHgzMywgMHhGQywgMHgwNCwgMHgwNywgMHhCMSwgMHhGMiwgMHgyMSwgMHgyNCwgMHhFNiwgMHgzQSwKLQkweDk3LCAweEYyLCAweEQwLCAweDA1LCAweDVCLCAweEZELCAweDE1LCAweDAxLCAweEE5LCAweEZGLCAweDBGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OTAsIDB4RkYsIDB4NDUsIDB4MDEsCi0JMHgwQiwgMHhGRCwgMHg0NCwgMHgwNiwgMHgwQSwgMHhGMiwgMHgzQiwgMHgzOCwgMHg4MCwgMHgyNywgMHgyQiwKLQkweEYyLCAweDIyLCAweDA3LCAweDMzLCAweEZDLCAweERFLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4NTksIDB4MDAsIDB4QjMsIDB4RkYsIDB4QzQsCi0JMHhGRiwgMHhFMiwgMHgwMSwgMHgwOSwgMHhGOSwgMHhBQSwgMHg0NSwgMHhGRSwgMHgxMSwgMHg1NCwgMHhGNywKLQkweDM4LCAweDA1LCAweEU0LCAweEZDLCAweEFBLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4NDksIDB4MDEsIDB4QkMsIDB4RkQsCi0JMHg3QSwgMHgwMywgMHhGQSwgMHhGQSwgMHhGRCwgMHgwNywgMHg5QywgMHg0OCwgMHhDMywgMHhGRiwgMHg4OSwKLQkweEZFLCAweEExLCAweDAxLCAweEIxLCAweEZFLCAweEQ2LCAweDAwLCAweDlDLCAweEZGLCAweDE4LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUIsIDB4RkMsIDB4N0IsCi0JMHgwNiwgMHg1MCwgMHhGNCwgMHg2RSwgMHgxQywgMHgzNiwgMHg0MCwgMHg5MiwgMHhGNCwgMHg3NSwgMHgwNCwKLQkweDNCLCAweEZFLCAweDkxLCAweDAwLCAweEVCLCAweEZGLCAweEY2LCAweEZGLCAweDA0LCAweDAwLCAweEZELAotCTB4RkYsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4OUQsIDB4MDEsIDB4ODQsIDB4RkMsIDB4RjMsIDB4MDYsCi0JMHg3RCwgMHhGMSwgMHg5RSwgMHgzMSwgMHhFNiwgMHgyRSwgMHg4NSwgMHhGMSwgMHgxNiwgMHgwNywgMHg2MSwKLQkweEZDLCAweEI1LCAweDAxLCAweDU1LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLAotCTB4RUMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4NTcsIDB4MDAsIDB4OUYsIDB4RkUsIDB4RDEsIDB4MDMsIDB4OUIsCi0JMHhGNSwgMHhGNywgMHg0MSwgMHg3QywgMHgxOSwgMHgxMywgMHhGNSwgMHgyRiwgMHgwNiwgMHg3OCwgMHhGQywKLQkweEQ1LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhGLAotCTB4RkYsIDB4RjcsIDB4MDAsIDB4NkIsIDB4RkUsIDB4MjUsIDB4MDIsIDB4OTEsIDB4RkQsIDB4RTMsIDB4MDEsCi0JMHhFNSwgMHg0OCwgMHg4RCwgMHgwNSwgMHhGQiwgMHhGQiwgMHhGOCwgMHgwMiwgMHhGRSwgMHhGRCwgMHgyQiwKLQkweDAxLCAweDdBLCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLAotCTB4NDIsIDB4RkYsIDB4QkQsIDB4MDEsIDB4QjYsIDB4RkMsIDB4OUYsIDB4MDUsIDB4NkMsIDB4RjYsIDB4RDYsCi0JMHgxNCwgMHg2NSwgMHg0NCwgMHg5OCwgMHhGNywgMHhBQywgMHgwMiwgMHg0RSwgMHhGRiwgMHhGNCwgMHhGRiwKLQkweDM5LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LAotCTB4RkYsIDB4RDIsIDB4MDEsIDB4M0QsIDB4RkMsIDB4MkIsIDB4MDcsIDB4RDQsIDB4RjEsIDB4NjQsIDB4MkEsCi0JMHhDNiwgMHgzNSwgMHhCNywgMHhGMSwgMHg5NiwgMHgwNiwgMHhDRiwgMHhGQywgMHg2QiwgMHgwMSwgMHg3RCwKLQkweEZGLCAweDFGLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA2LCAweDAwLCAweEMxLCAweEZGLAotCTB4RTUsIDB4MDAsIDB4QUEsIDB4RkQsIDB4NTgsIDB4MDUsIDB4M0EsIDB4RjMsIDB4MTEsIDB4M0QsIDB4MkMsCi0JMHgyMSwgMHgzRiwgMHhGMywgMHhEQSwgMHgwNiwgMHgzQiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLCAweEIxLCAweEZGLCAweEEwLCAweDAwLCAweDIwLAotCTB4RkYsIDB4RDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QTQsIDB4RkMsIDB4QjYsIDB4NDcsIDB4MUMsIDB4MEMsCi0JMHg2MywgMHhGOSwgMHg0MiwgMHgwNCwgMHg1OSwgMHhGRCwgMHg3NiwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU3LCAweEZGLCAweDg1LCAweDAxLAotCTB4MzksIDB4RkQsIDB4ODQsIDB4MDQsIDB4RDksIDB4RjgsIDB4OTUsIDB4MEQsIDB4NDgsIDB4NDcsIDB4QTcsCi0JMHhGQiwgMHg4NiwgMHgwMCwgMHg4QSwgMHgwMCwgMHg0NiwgMHhGRiwgMHg4RSwgMHgwMCwgMHhCOCwgMHhGRiwKLQkweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM1LAotCTB4RkMsIDB4RjMsIDB4MDYsIDB4RUUsIDB4RjIsIDB4Q0QsIDB4MjIsIDB4RTQsIDB4M0IsIDB4REMsIDB4RjIsCi0JMHg5QywgMHgwNSwgMHg3RSwgMHhGRCwgMHgwMCwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwKLQkweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDg3LCAweEZGLCAweDU3LCAweDAxLCAweEVGLCAweEZDLAotCTB4NkIsIDB4MDYsIDB4RTAsIDB4RjEsIDB4MjMsIDB4MzcsIDB4Q0UsIDB4MjgsIDB4MDEsIDB4RjIsIDB4MjgsCi0JMHgwNywgMHgzNiwgMHhGQywgMHhEOSwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDBCLCAweDAwLCAweEQyLCAweEZGLCAweDRBLCAweDAwLCAweEQwLCAweEZGLCAweDhFLCAweEZGLCAweDNGLAotCTB4MDIsIDB4NUUsIDB4RjgsIDB4MUUsIDB4NDUsIDB4NDQsIDB4MTMsIDB4RUEsIDB4RjYsIDB4NjcsIDB4MDUsCi0JMHhDRiwgMHhGQywgMHhCMywgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDIzLCAweDAwLCAweDc0LCAweEZGLCAweDNDLCAweDAxLCAweERBLCAweEZELCAweDQwLCAweDAzLAotCTB4NkUsIDB4RkIsIDB4RTEsIDB4MDYsIDB4QzMsIDB4NDgsIDB4QjMsIDB4MDAsIDB4MUEsIDB4RkUsIDB4REMsCi0JMHgwMSwgMHg5MSwgMHhGRSwgMHhFNSwgMHgwMCwgMHg5NiwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLCAweDY3LCAweEZDLCAweDVBLCAweDA2LCAweEE2LAotCTB4RjQsIDB4MUIsIDB4MUIsIDB4MDcsIDB4NDEsIDB4MDQsIDB4RjUsIDB4MkQsIDB4MDQsIDB4NjcsIDB4RkUsCi0JMHg3NywgMHgwMCwgMHhGOCwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwKLQkweDAwLCAweDVDLCAweEZGLCAweEE4LCAweDAxLCAweDczLCAweEZDLCAweDA1LCAweDA3LCAweDdELCAweEYxLAotCTB4NjcsIDB4MzAsIDB4MjEsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDgsIDB4MDcsIDB4NkYsIDB4RkMsIDB4QUIsCi0JMHgwMSwgMHg1QiwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMCwgMHhGRiwKLQkweEZCLCAweEZGLCAweDcxLCAweDAwLCAweDcxLCAweEZFLCAweDFELCAweDA0LCAweDFGLCAweEY1LCAweDMyLAotCTB4NDEsIDB4Q0UsIDB4MUEsIDB4QkEsIDB4RjQsIDB4NTMsIDB4MDYsIDB4NkEsIDB4RkMsIDB4REEsIDB4MDEsCi0JMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NSwgMHhGRiwgMHhFOCwKLQkweDAwLCAweDhBLCAweEZFLCAweEU5LCAweDAxLCAweDAxLCAweEZFLCAweEVBLCAweDAwLCAweENCLCAweDQ4LAotCTB4QTIsIDB4MDYsIDB4ODcsIDB4RkIsIDB4MzMsIDB4MDMsIDB4RTAsIDB4RkQsIDB4MzksIDB4MDEsIDB4NzUsCi0JMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwgMHhGRiwKLQkweEI1LCAweDAxLCAweENBLCAweEZDLCAweDcyLCAweDA1LCAweEQzLCAweEY2LCAweDhELCAweDEzLCAweEZELAotCTB4NDQsIDB4MzksIDB4RjgsIDB4NTMsIDB4MDIsIDB4ODIsIDB4RkYsIDB4RDcsIDB4RkYsIDB4NDcsIDB4MDAsCi0JMHhEMywgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MiwgMHhGRiwgMHhEOCwKLQkweDAxLCAweDM3LCAweEZDLCAweDI5LCAweDA3LCAweEY4LCAweEYxLCAweDE5LCAweDI5LCAweEU1LCAweDM2LAotCTB4RDgsIDB4RjEsIDB4NzMsIDB4MDYsIDB4RTksIDB4RkMsIDB4NUIsIDB4MDEsIDB4ODUsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhCNiwgMHhGRiwgMHhGQiwgMHgwMCwKLQkweDg1LCAweEZELCAweDkwLCAweDA1LCAweEVDLCAweEYyLCAweDFDLCAweDNDLCAweDgxLCAweDIyLCAweEZDLAotCTB4RjIsIDB4RUYsIDB4MDYsIDB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNywgMHhGRiwgMHg5MSwgMHgwMCwgMHg0MCwgMHhGRiwgMHg5NiwKLQkweDAwLCAweDZGLCAweDAwLCAweEQ1LCAweEZCLCAweDVFLCAweDQ3LCAweDUwLCAweDBELCAweEYyLCAweEY4LAotCTB4NzgsIDB4MDQsIDB4M0YsIDB4RkQsIDB4ODIsIDB4MDEsIDB4NTgsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OSwgMHgwMSwgMHg1MywgMHhGRCwKLQkweDRFLCAweDA0LCAweDRBLCAweEY5LCAweDYwLCAweDBDLCAweEEzLCAweDQ3LCAweDc2LCAweEZDLCAweDFGLAotCTB4MDAsIDB4QzMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4OUQsIDB4MDAsIDB4QjIsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQSwgMHhGQywgMHhERiwKLQkweDA2LCAweDMwLCAweEYzLCAweDc4LCAweDIxLCAweERCLCAweDNDLCAweDI4LCAweEYzLCAweDY1LCAweDA1LAotCTB4QTIsIDB4RkQsIDB4RUEsIDB4MDAsIDB4QkUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwgMHhENSwgMHhGQywgMHg4RSwgMHgwNiwKLQkweEJFLCAweEYxLCAweDA2LCAweDM2LCAweDFBLCAweDJBLCAweERDLCAweEYxLCAweDJBLCAweDA3LCAweDNDLAotCTB4RkMsIDB4RDMsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsCi0JMHhEOCwgMHhGRiwgMHgzQywgMHgwMCwgMHhFRSwgMHhGRiwgMHg1QSwgMHhGRiwgMHg5OCwgMHgwMiwgMHhCQiwKLQkweEY3LCAweDg3LCAweDQ0LCAweDhDLCAweDE0LCAweDgzLCAweEY2LCAweDk1LCAweDA1LCAweEJBLCAweEZDLAotCTB4QkIsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsCi0JMHgwMCwgMHg3OSwgMHhGRiwgMHgyRSwgMHgwMSwgMHhGNywgMHhGRCwgMHgwNSwgMHgwMywgMHhFMSwgMHhGQiwKLQkweENBLCAweDA1LCAweERGLCAweDQ4LCAweEFCLCAweDAxLCAweEFBLCAweEZELCAweDE4LCAweDAyLCAweDcyLAotCTB4RkUsIDB4RjQsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHgzOSwgMHhGRiwgMHhENiwgMHgwMSwgMHg3NSwgMHhGQywgMHgzNywgMHgwNiwgMHhGRiwgMHhGNCwgMHhDNywKLQkweDE5LCAweENDLCAweDQxLCAweDdGLCAweEY1LCAweEUyLCAweDAzLCAweDk1LCAweEZFLCAweDVELCAweDAwLAotCTB4MDUsIDB4MDAsIDB4RUQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsCi0JMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywgMHgxMywgMHgwNywgMHg4MywgMHhGMSwgMHgyQywgMHgyRiwKLQkweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LCAweDA2LCAweDgwLCAweEZDLCAweDlGLCAweDAxLCAweDYxLAotCTB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RUUsIDB4RkYsCi0JMHg4QiwgMHgwMCwgMHg0NCwgMHhGRSwgMHg2NSwgMHgwNCwgMHhBQSwgMHhGNCwgMHg2NiwgMHg0MCwgMHgyMywKLQkweDFDLCAweDYzLCAweEY0LCAweDc0LCAweDA2LCAweDVELCAweEZDLCAweERFLCAweDAxLCAweDM3LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsIDB4OUEsIDB4RkYsIDB4RDksIDB4MDAsIDB4QUEsCi0JMHhGRSwgMHhBRSwgMHgwMSwgMHg3MCwgMHhGRSwgMHhGOCwgMHhGRiwgMHhBNiwgMHg0OCwgMHhCRSwgMHgwNywKLQkweDE0LCAweEZCLCAweDZELCAweDAzLCAweEMzLCAweEZELCAweDQ2LCAweDAxLCAweDcwLCAweEZGLCAweDI0LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDgsIDB4RkYsIDB4QUMsIDB4MDEsCi0JMHhERiwgMHhGQywgMHg0MywgMHgwNSwgMHgzQywgMHhGNywgMHg0NiwgMHgxMiwgMHg4RCwgMHg0NSwgMHhFMiwKLQkweEY4LCAweEY3LCAweDAxLCAweEI4LCAweEZGLCAweEI5LCAweEZGLCAweDU2LCAweDAwLCAweENFLCAweEZGLAotCTB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REQsIDB4MDEsIDB4MzQsCi0JMHhGQywgMHgyMywgMHgwNywgMHgyMSwgMHhGMiwgMHhDQiwgMHgyNywgMHhGRSwgMHgzNywgMHgwMCwgMHhGMiwKLQkweDRELCAweDA2LCAweDA0LCAweEZELCAweDQ5LCAweDAxLCAweDhFLCAweEZGLCAweDE5LCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUIsIDB4RkYsIDB4MTAsIDB4MDEsIDB4NjIsIDB4RkQsCi0JMHhDNSwgMHgwNSwgMHhBNSwgMHhGMiwgMHgxRiwgMHgzQiwgMHhENiwgMHgyMywgMHhCRSwgMHhGMiwgMHgwMSwKLQkweDA3LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MTAsIDB4MDAsIDB4QkQsIDB4RkYsIDB4ODIsIDB4MDAsIDB4NUUsIDB4RkYsIDB4NUQsIDB4MDAsIDB4RDQsCi0JMHgwMCwgMHgwQywgMHhGQiwgMHhGOSwgMHg0NiwgMHg4NywgMHgwRSwgMHg4MiwgMHhGOCwgMHhBRCwgMHgwNCwKLQkweDI2LCAweEZELCAweDhELCAweDAxLCAweDU0LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjksIDB4MDAsIDB4NjAsIDB4RkYsIDB4NkQsIDB4MDEsIDB4NkUsIDB4RkQsIDB4MTcsIDB4MDQsCi0JMHhCQywgMHhGOSwgMHgzMCwgMHgwQiwgMHhGNCwgMHg0NywgMHg0QiwgMHhGRCwgMHhCNSwgMHhGRiwgMHhGRCwKLQkweDAwLCAweDA4LCAweEZGLCAweEFDLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4NDEsIDB4RkMsIDB4QzgsIDB4MDYsIDB4NzYsCi0JMHhGMywgMHgyMiwgMHgyMCwgMHhDQSwgMHgzRCwgMHg3RCwgMHhGMywgMHgyQSwgMHgwNSwgMHhDOCwgMHhGRCwKLQkweEQ0LCAweDAwLCAweENBLCAweEZGLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIxLAotCTB4MDAsIDB4NzcsIDB4RkYsIDB4NzcsIDB4MDEsIDB4QkQsIDB4RkMsIDB4QUUsIDB4MDYsIDB4QTMsIDB4RjEsCi0JMHhFMywgMHgzNCwgMHg2NCwgMHgyQiwgMHhCQywgMHhGMSwgMHgyQSwgMHgwNywgMHg0MywgMHhGQywgMHhDRCwKLQkweDAxLCAweDQ4LCAweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERELCAweEZGLAotCTB4MkUsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MjcsIDB4RkYsIDB4RUYsIDB4MDIsIDB4MjAsIDB4RjcsIDB4RTcsCi0JMHg0MywgMHhEOCwgMHgxNSwgMHgxRSwgMHhGNiwgMHhDMCwgMHgwNSwgMHhBNywgMHhGQywgMHhDMywgMHgwMSwKLQkweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdGLAotCTB4RkYsIDB4MjAsIDB4MDEsIDB4MTYsIDB4RkUsIDB4Q0EsIDB4MDIsIDB4NTQsIDB4RkMsIDB4QjksIDB4MDQsCi0JMHhGMiwgMHg0OCwgMHhBOSwgMHgwMiwgMHgzOSwgMHhGRCwgMHg1MywgMHgwMiwgMHg1MywgMHhGRSwgMHgwMywKLQkweDAxLCAweDhBLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLAotCTB4RDEsIDB4MDEsIDB4ODQsIDB4RkMsIDB4MTIsIDB4MDYsIDB4NUMsIDB4RjUsIDB4NzYsIDB4MTgsIDB4ODksCi0JMHg0MiwgMHgwMiwgMHhGNiwgMHg5NCwgMHgwMywgMHhDNCwgMHhGRSwgMHg0MiwgMHgwMCwgMHgxMiwgMHgwMCwKLQkweEU4LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUxLCAweEZGLCAweEJELAotCTB4MDEsIDB4NTcsIDB4RkMsIDB4MUUsIDB4MDcsIDB4OTAsIDB4RjEsIDB4RUQsIDB4MkQsIDB4OEMsIDB4MzIsCi0JMHg4MywgMHhGMSwgMHhFMiwgMHgwNiwgMHg5MiwgMHhGQywgMHg5MywgMHgwMSwgMHg2OCwgMHhGRiwgMHgyNiwKLQkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZBLCAweEZGLCAweEUyLCAweEZGLCAweEE0LCAweDAwLAotCTB4MTksIDB4RkUsIDB4QUEsIDB4MDQsIDB4M0UsIDB4RjQsIDB4OTAsIDB4M0YsIDB4NzgsIDB4MUQsIDB4MTAsCi0JMHhGNCwgMHg5MywgMHgwNiwgMHg1MiwgMHhGQywgMHhFMSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDE3LCAweDAwLCAweEEwLCAweEZGLCAweENBLCAweDAwLCAweEM5LCAweEZFLCAweDczLAotCTB4MDEsIDB4REUsIDB4RkUsIDB4MEMsIDB4RkYsIDB4NzYsIDB4NDgsIDB4REUsIDB4MDgsIDB4QTEsIDB4RkEsCi0JMHhBNiwgMHgwMywgMHhBNiwgMHhGRCwgMHg1MywgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEEyLCAweDAxLCAweEY2LCAweEZDLAotCTB4MTIsIDB4MDUsIDB4QTcsIDB4RjcsIDB4MDMsIDB4MTEsIDB4MTAsIDB4NDYsIDB4OTMsIDB4RjksIDB4OTgsCi0JMHgwMSwgMHhFRSwgMHhGRiwgMHg5QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOCwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLCAweEUxLCAweDAxLCAweDMyLCAweEZDLCAweDFCLAotCTB4MDcsIDB4NTAsIDB4RjIsIDB4N0IsIDB4MjYsIDB4MTEsIDB4MzksIDB4MkYsIDB4RjIsIDB4MjMsIDB4MDYsCi0JMHgyMiwgMHhGRCwgMHgzNywgMHgwMSwgMHg5NywgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDEyLCAweDAwLCAweEExLCAweEZGLCAweDI0LCAweDAxLCAweDQxLCAweEZELCAweEY2LCAweDA1LAotCTB4NjcsIDB4RjIsIDB4MUEsIDB4M0EsIDB4MjksIDB4MjUsIDB4ODQsIDB4RjIsIDB4MEYsIDB4MDcsIDB4MzEsCi0JMHhGQywgMHhFMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwKLQkweEMyLCAweEZGLCAweDczLCAweDAwLCAweDdELCAweEZGLCAweDI1LCAweDAwLCAweDM4LCAweDAxLCAweDRDLAotCTB4RkEsIDB4ODksIDB4NDYsIDB4QzMsIDB4MEYsIDB4MTQsIDB4RjgsIDB4RTAsIDB4MDQsIDB4MEQsIDB4RkQsCi0JMHg5OCwgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywKLQkweDAwLCAweDY1LCAweEZGLCAweDYwLCAweDAxLCAweDhBLCAweEZELCAweERGLCAweDAzLCAweDJFLCAweEZBLAotCTB4MDQsIDB4MEEsIDB4M0EsIDB4NDgsIDB4MjgsIDB4RkUsIDB4NEIsIDB4RkYsIDB4MzgsIDB4MDEsIDB4RTksCi0JMHhGRSwgMHhCQiwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ5LCAweEZDLCAweEFGLCAweDA2LCAweEMxLCAweEYzLCAweENELAotCTB4MUUsIDB4QjEsIDB4M0UsIDB4RDksIDB4RjMsIDB4RUMsIDB4MDQsIDB4RjAsIDB4RkQsIDB4QkMsIDB4MDAsCi0JMHhENSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RiwKLQkweEZGLCAweDg1LCAweDAxLCAweEE2LCAweEZDLCAweENBLCAweDA2LCAweDhGLCAweEYxLCAweEJCLCAweDMzLAotCTB4QUIsIDB4MkMsIDB4QTMsIDB4RjEsIDB4MjYsIDB4MDcsIDB4NEMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4NEQsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMiwgMHhGRiwgMHgyMCwgMHgwMCwKLQkweDI2LCAweDAwLCAweEY1LCAweEZFLCAweDQzLCAweDAzLCAweDhELCAweEY2LCAweDNDLCAweDQzLCAweDI1LAotCTB4MTcsIDB4QkIsIDB4RjUsIDB4RUEsIDB4MDUsIDB4OTUsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4M0QsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwKLQkweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LAotCTB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwKLQkweDNELCAweEZDLCAweEQ2LCAweDA2LCAweDRDLCAweEYzLCAweEVELCAweDIwLCAweDNELCAweDNELCAweDRBLAotCTB4RjMsIDB4NEUsIDB4MDUsIDB4QjEsIDB4RkQsIDB4RTEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDMywgMHhGRiwgMHhFMSwgMHgwMCwgMHhCMSwKLQkweEZELCAweDRFLCAweDA1LCAweDRBLCAweEYzLCAweDNELCAweDNELCAweEVELCAweDIwLCAweDRDLCAweEYzLAotCTB4RDYsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwKLQkweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LAotCTB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0RCwgMHhGRiwgMHhDNSwgMHgwMSwgMHg0QywgMHhGQywgMHgyNiwKLQkweDA3LCAweEEzLCAweEYxLCAweEFCLCAweDJDLCAweEJCLCAweDMzLCAweDhGLCAweEYxLCAweENBLCAweDA2LAotCTB4QTYsIDB4RkMsIDB4ODUsIDB4MDEsIDB4NkYsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhBNiwgMHhGRiwgMHhCQiwgMHgwMCwgMHhFOSwgMHhGRSwgMHgzOCwgMHgwMSwgMHg0QiwgMHhGRiwKLQkweDI4LCAweEZFLCAweDNBLCAweDQ4LCAweDA0LCAweDBBLCAweDJFLCAweEZBLCAweERGLCAweDAzLCAweDhBLAotCTB4RkQsIDB4NjAsIDB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgwRiwgMHgwNywgMHg4NCwKLQkweEYyLCAweDI5LCAweDI1LCAweDFBLCAweDNBLCAweDY3LCAweEYyLCAweEY2LCAweDA1LCAweDQxLCAweEZELAotCTB4MjQsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QzgsCi0JMHhGRiwgMHg2NCwgMHgwMCwgMHg5QiwgMHhGRiwgMHhFRSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg5MywgMHhGOSwKLQkweDEwLCAweDQ2LCAweDAzLCAweDExLCAweEE3LCAweEY3LCAweDEyLCAweDA1LCAweEY2LCAweEZDLCAweEEyLAotCTB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFMSwgMHgwMSwgMHg1MiwgMHhGQywgMHg5MywgMHgwNiwgMHgxMCwgMHhGNCwgMHg3OCwKLQkweDFELCAweDkwLCAweDNGLCAweDNFLCAweEY0LCAweEFBLCAweDA0LCAweDE5LCAweEZFLCAweEE0LCAweDAwLAotCTB4RTIsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTIsCi0JMHgwMCwgMHg0MiwgMHgwMCwgMHhDNCwgMHhGRSwgMHg5NCwgMHgwMywgMHgwMiwgMHhGNiwgMHg4OSwgMHg0MiwKLQkweDc2LCAweDE4LCAweDVDLCAweEY1LCAweDEyLCAweDA2LCAweDg0LCAweEZDLCAweEQxLCAweDAxLCAweDNCLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsCi0JMHhDMywgMHgwMSwgMHhBNywgMHhGQywgMHhDMCwgMHgwNSwgMHgxRSwgMHhGNiwgMHhEOCwgMHgxNSwgMHhFNywKLQkweDQzLCAweDIwLCAweEY3LCAweEVGLCAweDAyLCAweDI3LCAweEZGLCAweDBBLCAweDAwLCAweDJFLCAweDAwLAotCTB4REQsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4RDQsCi0JMHgwMCwgMHhDOCwgMHhGRCwgMHgyQSwgMHgwNSwgMHg3RCwgMHhGMywgMHhDQSwgMHgzRCwgMHgyMiwgMHgyMCwKLQkweDc2LCAweEYzLCAweEM4LCAweDA2LCAweDQxLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTQsIDB4RkYsIDB4OEQsIDB4MDEsCi0JMHgyNiwgMHhGRCwgMHhBRCwgMHgwNCwgMHg4MiwgMHhGOCwgMHg4NywgMHgwRSwgMHhGOSwgMHg0NiwgMHgwQywKLQkweEZCLCAweEQ0LCAweDAwLCAweDVELCAweDAwLCAweDVFLCAweEZGLCAweDgyLCAweDAwLCAweEJELCAweEZGLAotCTB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEUsIDB4RkYsIDB4NDksIDB4MDEsIDB4MDQsCi0JMHhGRCwgMHg0RCwgMHgwNiwgMHgwMCwgMHhGMiwgMHhGRSwgMHgzNywgMHhDQiwgMHgyNywgMHgyMSwgMHhGMiwKLQkweDIzLCAweDA3LCAweDM0LCAweEZDLCAweERELCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzAsIDB4RkYsIDB4NDYsIDB4MDEsIDB4QzMsIDB4RkQsCi0JMHg2RCwgMHgwMywgMHgxNCwgMHhGQiwgMHhCRSwgMHgwNywgMHhBNiwgMHg0OCwgMHhGOCwgMHhGRiwgMHg3MCwKLQkweEZFLCAweEFFLCAweDAxLCAweEFBLCAweEZFLCAweEQ5LCAweDAwLCAweDlBLCAweEZGLCAweDE5LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4OUYsIDB4MDEsIDB4ODAsIDB4RkMsIDB4RjcsCi0JMHgwNiwgMHg3RCwgMHhGMSwgMHg1QSwgMHgzMSwgMHgyQywgMHgyRiwgMHg4MywgMHhGMSwgMHgxMywgMHgwNywKLQkweDY0LCAweEZDLCAweEIzLCAweDAxLCAweDU3LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDFCLAotCTB4MDAsIDB4OTAsIDB4RkYsIDB4RjQsIDB4MDAsIDB4NzIsIDB4RkUsIDB4MTgsIDB4MDIsIDB4QUEsIDB4RkQsCi0JMHhBQiwgMHgwMSwgMHhERiwgMHg0OCwgMHhDQSwgMHgwNSwgMHhFMSwgMHhGQiwgMHgwNSwgMHgwMywgMHhGNywKLQkweEZELCAweDJFLCAweDAxLCAweDc5LCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDMsIDB4MDEsIDB4M0MsIDB4RkMsIDB4MkEsIDB4MDcsIDB4REMsCi0JMHhGMSwgMHgxQSwgMHgyQSwgMHgwNiwgMHgzNiwgMHhCRSwgMHhGMSwgMHg4RSwgMHgwNiwgMHhENSwgMHhGQywKLQkweDY3LCAweDAxLCAweDdGLCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDEzLCAweDAwLCAweEIyLAotCTB4RkYsIDB4OUQsIDB4MDAsIDB4MjcsIDB4RkYsIDB4QzMsIDB4MDAsIDB4MUYsIDB4MDAsIDB4NzYsIDB4RkMsCi0JMHhBMywgMHg0NywgMHg2MCwgMHgwQywgMHg0QSwgMHhGOSwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRCwgMHg3OSwKLQkweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RUYsIDB4MDYsIDB4RkMsIDB4RjIsIDB4ODEsCi0JMHgyMiwgMHgxQywgMHgzQywgMHhFQywgMHhGMiwgMHg5MCwgMHgwNSwgMHg4NSwgMHhGRCwgMHhGQiwgMHgwMCwKLQkweEI2LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEQzLCAweEZGLCAweDQ3LAotCTB4MDAsIDB4RDcsIDB4RkYsIDB4ODIsIDB4RkYsIDB4NTMsIDB4MDIsIDB4MzksIDB4RjgsIDB4RkQsIDB4NDQsCi0JMHg4RCwgMHgxMywgMHhEMywgMHhGNiwgMHg3MiwgMHgwNSwgMHhDQSwgMHhGQywgMHhCNSwgMHgwMSwgMHg0NSwKLQkweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM4LCAweEZGLAotCTB4REEsIDB4MDEsIDB4NkEsIDB4RkMsIDB4NTMsIDB4MDYsIDB4QkEsIDB4RjQsIDB4Q0UsIDB4MUEsIDB4MzIsCi0JMHg0MSwgMHgxRiwgMHhGNSwgMHgxRCwgMHgwNCwgMHg3MSwgMHhGRSwgMHg3MSwgMHgwMCwgMHhGQiwgMHhGRiwKLQkweEYwLCAweEZGLCAweDA1LCAweDAwLCAweDA1LCAweDAwLCAweEYyLCAweEZGLCAweEY4LCAweEZGLCAweDc3LAotCTB4MDAsIDB4NjcsIDB4RkUsIDB4MkQsIDB4MDQsIDB4MDQsIDB4RjUsIDB4MDcsIDB4NDEsIDB4MUIsIDB4MUIsCi0JMHhBNiwgMHhGNCwgMHg1QSwgMHgwNiwgMHg2NywgMHhGQywgMHhEQiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIzLCAweDAxLAotCTB4Q0YsIDB4RkMsIDB4NjcsIDB4MDUsIDB4RUEsIDB4RjYsIDB4NDQsIDB4MTMsIDB4MUUsIDB4NDUsIDB4NUUsCi0JMHhGOCwgMHgzRiwgMHgwMiwgMHg4RSwgMHhGRiwgMHhEMCwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMiwgMHhGRiwKLQkweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEI0LCAweEZGLCAweDAwLCAweDAxLCAweDdFLAotCTB4RkQsIDB4OUMsIDB4MDUsIDB4REMsIDB4RjIsIDB4RTQsIDB4M0IsIDB4Q0QsIDB4MjIsIDB4RUUsIDB4RjIsCi0JMHhGMywgMHgwNiwgMHgzNSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweDc2LCAweDAxLCAweDU5LCAweEZELAotCTB4NDIsIDB4MDQsIDB4NjMsIDB4RjksIDB4MUMsIDB4MEMsIDB4QjYsIDB4NDcsIDB4QTQsIDB4RkMsIDB4MDcsCi0JMHgwMCwgMHhEMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhBMCwgMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwKLQkweEZFLCAweEZGLCAweDFGLCAweDAwLCAweDdELCAweEZGLCAweDZCLCAweDAxLCAweENGLCAweEZDLCAweDk2LAotCTB4MDYsIDB4QjcsIDB4RjEsIDB4QzYsIDB4MzUsIDB4NjQsIDB4MkEsIDB4RDQsIDB4RjEsIDB4MkIsIDB4MDcsCi0JMHgzRCwgMHhGQywgMHhEMiwgMHgwMSwgMHg0NSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLCAweDJCLCAweDAxLCAweEZFLCAweEZELCAweEY4LCAweDAyLAotCTB4RkIsIDB4RkIsIDB4OEQsIDB4MDUsIDB4RTUsIDB4NDgsIDB4RTMsIDB4MDEsIDB4OTEsIDB4RkQsIDB4MjUsCi0JMHgwMiwgMHg2QiwgMHhGRSwgMHhGNywgMHgwMCwgMHg4RiwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJELCAweDAwLCAweDU1LCAweEZGLCAweEI1LCAweDAxLCAweDYxLCAweEZDLCAweDE2LCAweDA3LCAweDg1LAotCTB4RjEsIDB4RTYsIDB4MkUsIDB4OUUsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjMsIDB4MDYsIDB4ODQsIDB4RkMsCi0JMHg5RCwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5QywKLQkweEZGLCAweEQ2LCAweDAwLCAweEIxLCAweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLCAweEZGLAotCTB4OUMsIDB4NDgsIDB4RkQsIDB4MDcsIDB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsIDB4NDksCi0JMHgwMSwgMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLCAweEZDLCAweDIyLCAweDA3LCAweDJCLCAweEYyLCAweDgwLAotCTB4MjcsIDB4M0IsIDB4MzgsIDB4MEEsIDB4RjIsIDB4NDQsIDB4MDYsIDB4MEIsIDB4RkQsIDB4NDUsIDB4MDEsCi0JMHg5MCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwKLQkweDAwLCAweDY1LCAweEZGLCAweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LAotCTB4Q0QsIDB4MEUsIDB4NkEsIDB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsCi0JMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKLQkweEU1LCAweDAxLCAweDQyLCAweEZDLCAweEMzLCAweDA2LCAweDg3LCAweEYzLCAweEQ3LCAweDFGLCAweEZFLAotCTB4M0QsIDB4OTEsIDB4RjMsIDB4MUQsIDB4MDUsIDB4RDEsIDB4RkQsIDB4Q0UsIDB4MDAsIDB4Q0MsIDB4RkYsCi0JMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwKLQkweDAwLCAweDFCLCAweEZGLCAweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LAotCTB4MDcsIDB4RjYsIDB4Q0EsIDB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRiwgMHgwMSwKLQkweDg4LCAweEZDLCAweDA5LCAweDA2LCAweDcxLCAweEY1LCAweDJCLCAweDE4LCAweEIyLCAweDQyLCAweDIwLAotCTB4RjYsIDB4ODMsIDB4MDMsIDB4Q0YsIDB4RkUsIDB4M0MsIDB4MDAsIDB4MTUsIDB4MDAsIDB4RTYsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwKLQkweEZFLCAweEI5LCAweDA0LCAweDI3LCAweEY0LCAweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLAotCTB4OTksIDB4MDYsIDB4NTAsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RCwgMHhGRiwgMHhBMCwgMHgwMSwgMHhGQiwgMHhGQywKLQkweDA3LCAweDA1LCAweEJGLCAweEY3LCAweEJCLCAweDEwLCAweDJCLCAweDQ2LCAweEJCLCAweEY5LCAweDgzLAotCTB4MDEsIDB4RkEsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NjgsIDB4MDAsIDB4QzcsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRiwgMHgyOCwgMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwKLQkweDA2LCAweDVBLCAweEYyLCAweERGLCAweDM5LCAweDczLCAweDI1LCAweDc5LCAweEYyLCAweDEyLCAweDA3LAotCTB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg1RSwgMHgwMSwgMHg5MCwgMHhGRCwgMHhEMiwgMHgwMywKLQkweDQ3LCAweEZBLCAweEMzLCAweDA5LCAweDQ4LCAweDQ4LCAweDVBLCAweEZFLCAweDMzLCAweEZGLCAweDQ1LAotCTB4MDEsIDB4RTIsIDB4RkUsIDB4QkUsIDB4MDAsIDB4QTUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyNCwgMHgwMCwgMHg2RCwgMHhGRiwgMHg4OCwgMHgwMSwgMHhBMiwgMHhGQywgMHhEMCwgMHgwNiwgMHg4QywKLQkweEYxLCAweDc4LCAweDMzLCAweEYyLCAweDJDLCAweDlFLCAweEYxLCAweDI0LCAweDA3LCAweDRFLCAweEZDLAotCTB4QzMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODYsCi0JMHhGRiwgMHgwRSwgMHgwMSwgMHgzQiwgMHhGRSwgMHg4MiwgMHgwMiwgMHhFMCwgMHhGQywgMHg3MywgMHgwMywKLQkweEY2LCAweDQ4LCAweEU5LCAweDAzLCAweEFELCAweEZDLCAweDlDLCAweDAyLCAweDJELCAweEZFLCAweDE0LAotCTB4MDEsIDB4ODMsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsCi0JMHg0QywgMHhGRiwgMHhDNywgMHgwMSwgMHg0QSwgMHhGQywgMHgyNywgMHgwNywgMHhBOCwgMHhGMSwgMHg2MiwKLQkweDJDLCAweEZELCAweDMzLCAweDkzLCAweEYxLCAweEM0LCAweDA2LCAweEFCLCAweEZDLCAweDgyLCAweDAxLAotCTB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTgsIDB4RkYsIDB4QjgsCi0JMHgwMCwgMHhGMCwgMHhGRSwgMHgyQiwgMHgwMSwgMHg2MywgMHhGRiwgMHhGNiwgMHhGRCwgMHgyQywgMHg0OCwKLQkweDQ3LCAweDBBLCAweDE0LCAweEZBLCAweEVCLCAweDAzLCAweDg0LCAweEZELCAweDYzLCAweDAxLCAweDY0LAotCTB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4M0EsIDB4RkYsCi0JMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwQywgMHgwNywgMHg5MSwgMHhGMiwgMHhERCwgMHgyNCwgMHg1NCwKLQkweDNBLCAweDc0LCAweEYyLCAweEVCLCAweDA1LCAweDQ5LCAweEZELCAweDIwLCAweDAxLCAweEEzLCAweEZGLAotCTB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjEsIDB4MDAsIDB4QTIsCi0JMHhGRiwgMHhFMiwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QiwgMHhGOSwgMHhGMiwgMHg0NSwgMHg0QSwgMHgxMSwKLQkweDhGLCAweEY3LCAweDFELCAweDA1LCAweEYxLCAweEZDLCAweEE0LCAweDAxLCAweDRCLCAweEZGLCAweDJGLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTEsIDB4MDEsCi0JMHg1NSwgMHhGQywgMHg4QywgMHgwNiwgMHgyMiwgMHhGNCwgMHgyQywgMHgxRCwgMHhDMCwgMHgzRiwgMHg1NSwKLQkweEY0LCAweDlCLCAweDA0LCAweDIzLCAweEZFLCAweDlGLCAweDAwLCAweEU0LCAweEZGLCAweEY5LCAweEZGLAotCTB4MDQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RTksIDB4RkYsIDB4MEYsIDB4MDAsIDB4NDgsIDB4MDAsIDB4QjksCi0JMHhGRSwgMHhBNiwgMHgwMywgMHhFNCwgMHhGNSwgMHg2MCwgMHg0MiwgMHhDMSwgMHgxOCwgMHg0NywgMHhGNSwKLQkweDFBLCAweDA2LCAweDgxLCAweEZDLCAweEQyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZFLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsIDB4QzEsIDB4MDEsIDB4QUIsIDB4RkMsCi0JMHhCNywgMHgwNSwgMHgzNCwgMHhGNiwgMHg4RSwgMHgxNSwgMHgwQiwgMHg0NCwgMHg0MiwgMHhGNywgMHhEQywKLQkweDAyLCAweDMyLCAweEZGLCAweDA0LCAweDAwLCAweDMxLCAweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLAotCTB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4QzcsIDB4RkYsIDB4RDksIDB4MDAsIDB4QkYsIDB4RkQsIDB4MzgsCi0JMHgwNSwgMHg2OSwgMHhGMywgMHg5NiwgMHgzRCwgMHg2RiwgMHgyMCwgMHg2NiwgMHhGMywgMHhDRSwgMHgwNiwKLQkweDNGLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAotCTB4RkYsIDB4MkMsIDB4MDAsIDB4NTUsIDB4RkYsIDB4OEIsIDB4MDEsIDB4MkIsIDB4RkQsIDB4QTEsIDB4MDQsCi0JMHg5QiwgMHhGOCwgMHg0MiwgMHgwRSwgMHgwRiwgMHg0NywgMHgzOCwgMHhGQiwgMHhCRSwgMHgwMCwgMHg2QSwKLQkweDAwLCAweDU4LCAweEZGLCAweDg1LCAweDAwLCAweEJCLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MTksIDB4MDAsIDB4OEMsIDB4RkYsIDB4NEQsIDB4MDEsIDB4RkUsIDB4RkMsIDB4NTYsIDB4MDYsIDB4RjcsCi0JMHhGMSwgMHhCRiwgMHgzNywgMHgxNSwgMHgyOCwgMHgxOCwgMHhGMiwgMHgyNSwgMHgwNywgMHgzNCwgMHhGQywKLQkweERDLCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI0LAotCTB4MDAsIDB4NzEsIDB4RkYsIDB4NDMsIDB4MDEsIDB4QzksIDB4RkQsIDB4NjAsIDB4MDMsIDB4MkUsIDB4RkIsCi0JMHg3RSwgMHgwNywgMHhBRiwgMHg0OCwgMHgyRCwgMHgwMCwgMHg1OCwgMHhGRSwgMHhCQiwgMHgwMSwgMHhBMywKLQkweEZFLCAweERELCAweDAwLCAweDk5LCAweEZGLCAweDE5LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLAotCTB4NjAsIDB4RkYsIDB4QTIsIDB4MDEsIDB4N0MsIDB4RkMsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RjEsIDB4MTUsCi0JMHgzMSwgMHg3MywgMHgyRiwgMHg4MSwgMHhGMSwgMHgxMCwgMHgwNywgMHg2NywgMHhGQywgMHhCMSwgMHgwMSwKLQkweDU4LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDFCLCAweDAwLCAweDkxLCAweEZGLCAweEYxLAotCTB4MDAsIDB4NzksIDB4RkUsIDB4MEEsIDB4MDIsIDB4QzMsIDB4RkQsIDB4NzMsIDB4MDEsIDB4REIsIDB4NDgsCi0JMHgwNywgMHgwNiwgMHhDNywgMHhGQiwgMHgxMiwgMHgwMywgMHhGMSwgMHhGRCwgMHgzMSwgMHgwMSwgMHg3OCwKLQkweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLAotCTB4RDUsIDB4MDEsIDB4M0EsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RTMsIDB4RjEsIDB4RDEsIDB4MjksIDB4NDYsCi0JMHgzNiwgMHhDNSwgMHhGMSwgMHg4NywgMHgwNiwgMHhEQSwgMHhGQywgMHg2NCwgMHgwMSwgMHg4MCwgMHhGRiwKLQkweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDk5LCAweDAwLCAweDJFLAotCTB4RkYsIDB4QjYsIDB4MDAsIDB4MzYsIDB4MDAsIDB4NDcsIDB4RkMsIDB4OTAsIDB4NDcsIDB4QTQsIDB4MEMsCi0JMHgzMSwgMHhGOSwgMHg1QSwgMHgwNCwgMHg0RSwgMHhGRCwgMHg3QywgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLAotCTB4MzcsIDB4RkMsIDB4RUIsIDB4MDYsIDB4MEIsIDB4RjMsIDB4MzUsIDB4MjIsIDB4NTIsIDB4M0MsIDB4RkQsCi0JMHhGMiwgMHg4NCwgMHgwNSwgMHg4RCwgMHhGRCwgMHhGNiwgMHgwMCwgMHhCOCwgMHhGRiwgMHgwOSwgMHgwMCwKLQkweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEQ1LCAweEZGLCAweDQ0LCAweDAwLCAweERELCAweEZGLCAweDc3LAotCTB4RkYsIDB4NjcsIDB4MDIsIDB4MTQsIDB4RjgsIDB4REMsIDB4NDQsIDB4RDUsIDB4MTMsIDB4QkMsIDB4RjYsCi0JMHg3QywgMHgwNSwgMHhDNSwgMHhGQywgMHhCNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwKLQkweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ5LCAweDAxLCAweDZELCAweEZDLAotCTB4NEIsIDB4MDYsIDB4Q0QsIDB4RjQsIDB4ODMsIDB4MUEsIDB4NUYsIDB4NDEsIDB4M0EsIDB4RjUsIDB4MEMsCi0JMHgwNCwgMHg3QiwgMHhGRSwgMHg2QywgMHgwMCwgMHhGRSwgMHhGRiwgMHhFRiwgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDA1LCAweDAwLCAweEYzLCAweEZGLCAweEY1LCAweEZGLCAweDdELCAweDAwLCAweDVELCAweEZFLCAweDNFLAotCTB4MDQsIDB4RUEsIDB4RjQsIDB4RDksIDB4NDAsIDB4NjYsIDB4MUIsIDB4OTMsIDB4RjQsIDB4NjIsIDB4MDYsCi0JMHg2NCwgMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIxLCAweDAxLCAweEQzLCAweEZDLCAweDVELCAweDA1LAotCTB4MDEsIDB4RjcsIDB4RkIsIDB4MTIsIDB4M0YsIDB4NDUsIDB4ODMsIDB4RjgsIDB4MkEsIDB4MDIsIDB4OUEsCi0JMHhGRiwgMHhDQSwgMHhGRiwgMHg0RSwgMHgwMCwgMHhEMSwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBDLCAweDAwLCAweEIxLCAweEZGLCAweDA0LCAweDAxLCAweDc2LCAweEZELCAweEE4LCAweDA1LCAweENDLAotCTB4RjIsIDB4QUIsIDB4M0IsIDB4MTgsIDB4MjMsIDB4RTAsIDB4RjIsIDB4RjcsIDB4MDYsIDB4MzUsIDB4RkMsCi0JMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwKLQkweDAwLCAweDVFLCAweEZGLCAweDc0LCAweDAxLCAweDVGLCAweEZELCAweDM1LCAweDA0LCAweDdDLCAweEY5LAotCTB4RDgsIDB4MEIsIDB4QzksIDB4NDcsIDB4RDQsIDB4RkMsIDB4RjAsIDB4RkYsIDB4REQsIDB4MDAsIDB4MTksCi0JMHhGRiwgMHhBNCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwKLQkweDdCLCAweEZGLCAweDZFLCAweDAxLCAweENBLCAweEZDLCAweDlELCAweDA2LCAweEIxLCAweEYxLCAweDg2LAotCTB4MzUsIDB4QUUsIDB4MkEsIDB4Q0QsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0YsIDB4RkMsIDB4RDEsIDB4MDEsCi0JMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QywKLQkweEZGLCAweDI3LCAweDAxLCAweDA1LCAweEZFLCAweEVCLCAweDAyLCAweDE0LCAweEZDLCAweDUwLCAweDA1LAotCTB4RUEsIDB4NDgsIDB4MUIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MzIsIDB4MDIsIDB4NjQsIDB4RkUsIDB4RkEsCi0JMHgwMCwgMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NCwgMHhGRiwKLQkweEI3LCAweDAxLCAweDVFLCAweEZDLCAweDE5LCAweDA3LCAweDg4LCAweEYxLCAweDlGLCAweDJFLCAweEUzLAotCTB4MzEsIDB4N0UsIDB4RjEsIDB4RUUsIDB4MDYsIDB4ODgsIDB4RkMsIDB4OUEsIDB4MDEsIDB4NjQsIDB4RkYsCi0JMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5RCwgMHhGRiwgMHhEMywgMHgwMCwgMHhCOCwKLQkweEZFLCAweDkzLCAweDAxLCAweEExLCAweEZFLCAweDhFLCAweEZGLCAweDkyLCAweDQ4LCAweDNELCAweDA4LAotCTB4RTEsIDB4RkEsIDB4ODYsIDB4MDMsIDB4QjYsIDB4RkQsIDB4NEMsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjUsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERiwgMHgwMSwKLQkweDMzLCAweEZDLCAweDIwLCAweDA3LCAweDM1LCAweEYyLCAweDM2LCAweDI3LCAweDc4LCAweDM4LCAweDE0LAotCTB4RjIsIDB4M0IsIDB4MDYsIDB4MTEsIDB4RkQsIDB4NDEsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MTcsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRiwgMHhGRiwgMHg3QiwgMHgwMCwgMHg2QywgMHhGRiwgMHg0NCwKLQkweDAwLCAweDAxLCAweDAxLCAweEI2LCAweEZBLCAweEM4LCAweDQ2LCAweDEzLCAweDBGLCAweDUxLCAweEY4LAotCTB4QzQsIDB4MDQsIDB4MUIsIDB4RkQsIDB4OTIsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NCwgMHhGQywKLQkweEJELCAweDA2LCAweDk3LCAweEYzLCAweDhBLCAweDFGLCAweDMxLCAweDNFLCAweEE1LCAweEYzLCAweDBGLAotCTB4MDUsIDB4REEsIDB4RkQsIDB4QzksIDB4MDAsIDB4Q0YsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhERiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgxNywgMHgwMCwgMHgxMCwgMHhGRiwgMHgxNSwKLQkweDAzLCAweERELCAweEY2LCAweDlFLCAweDQzLCAweDZDLCAweDE2LCAweEYxLCAweEY1LCAweEQzLCAweDA1LAotCTB4OUYsIDB4RkMsIDB4QzYsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRSwgMHgwMSwgMHg4QywgMHhGQywgMHgwMCwgMHgwNiwKLQkweDg2LCAweEY1LCAweEUwLCAweDE3LCAweERCLCAweDQyLCAweDNGLCAweEY2LCAweDcxLCAweDAzLCAweEQ5LAotCTB4RkUsIDB4MzYsIDB4MDAsIDB4MTgsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsCi0JMHhGQywgMHhGRiwgMHhEQywgMHhGRiwgMHhBRiwgMHgwMCwgMHgwNywgMHhGRSwgMHhDOCwgMHgwNCwgMHgxMCwKLQkweEY0LCAweDJELCAweDNGLCAweDBGLCAweDFFLCAweEVELCAweEYzLCAweEEwLCAweDA2LCAweDRFLCAweEZDLAotCTB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsCi0JMHgwMCwgMHg0RSwgMHhGRiwgMHg5RSwgMHgwMSwgMHgwMCwgMHhGRCwgMHhGQywgMHgwNCwgMHhENywgMHhGNywKLQkweDc1LCAweDEwLCAweDQ4LCAweDQ2LCAweEU0LCAweEY5LCAweDZFLCAweDAxLCAweDA2LCAweDAwLCAweDhFLAotCTB4RkYsIDB4NkIsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHg5RCwgMHhGRiwgMHgyRCwgMHgwMSwgMHgzMywgMHhGRCwgMHgwQiwgMHgwNiwgMHg0RCwgMHhGMiwgMHhBNSwKLQkweDM5LCAweEJGLCAweDI1LCAweDZELCAweEYyLCAweDE1LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLAotCTB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsCi0JMHhGRiwgMHg1QiwgMHgwMSwgMHg5NiwgMHhGRCwgMHhDNiwgMHgwMywgMHg2MSwgMHhGQSwgMHg4MSwgMHgwOSwKLQkweDU3LCAweDQ4LCAweDhELCAweEZFLCAweDFCLCAweEZGLCAweDUyLCAweDAxLCAweERCLCAweEZFLCAweEMyLAotCTB4MDAsIDB4QTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsCi0JMHg4QiwgMHgwMSwgMHg5RCwgMHhGQywgMHhENSwgMHgwNiwgMHg4OSwgMHhGMSwgMHgzNSwgMHgzMywgMHgzQSwKLQkweDJELCAweDlBLCAweEYxLCAweDIzLCAweDA3LCAweDUxLCAweEZDLCAweEMyLCAweDAxLCAweDRGLCAweEZGLAotCTB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NDIsCi0JMHhGRSwgMHg3NCwgMHgwMiwgMHhGOSwgMHhGQywgMHgzOSwgMHgwMywgMHhGNSwgMHg0OCwgMHgyNCwgMHgwNCwKLQkweDk0LCAweEZDLCAweEE5LCAweDAyLCAweDI3LCAweEZFLCAweDE4LCAweDAxLCAweDgyLCAweEZGLCAweDFGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QzksIDB4MDEsCi0JMHg0OCwgMHhGQywgMHgyOCwgMHgwNywgMHhBRCwgMHhGMSwgMHgxOSwgMHgyQywgMHgzRiwgMHgzNCwgMHg5NywKLQkweEYxLCAweEJFLCAweDA2LCAweEIwLCAweEZDLCAweDdGLCAweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTksIDB4RkYsIDB4QjQsIDB4MDAsIDB4RjcsIDB4RkUsIDB4MUQsCi0JMHgwMSwgMHg3QSwgMHhGRiwgMHhDNSwgMHhGRCwgMHgxRCwgMHg0OCwgMHg4OSwgMHgwQSwgMHhGQiwgMHhGOSwKLQkweEY4LCAweDAzLCAweDdELCAweEZELCAweDY2LCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsCi0JMHgwOSwgMHgwNywgMHg5RCwgMHhGMiwgMHg5MiwgMHgyNCwgMHg4RiwgMHgzQSwgMHg4MiwgMHhGMiwgMHhFMSwKLQkweDA1LCAweDUwLCAweEZELCAweDFCLCAweDAxLCAweEE2LCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEQsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4NUUsIDB4MDAsIDB4QTksIDB4RkYsIDB4RDYsIDB4RkYsIDB4QzMsCi0JMHgwMSwgMHg0MywgMHhGOSwgMHhENywgMHg0NSwgMHg5MiwgMHgxMSwgMHg3NywgMHhGNywgMHgyOCwgMHgwNSwKLQkweEVDLCAweEZDLCAweEE3LCAweDAxLCAweDRBLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTAsIDB4MDEsIDB4NTcsIDB4RkMsIDB4ODUsIDB4MDYsCi0JMHgzNCwgMHhGNCwgMHhFMCwgMHgxQywgMHhGMCwgMHgzRiwgMHg2RCwgMHhGNCwgMHg4QywgMHgwNCwgMHgyQywKLQkweEZFLCAweDk5LCAweDAwLCAweEU3LCAweEZGLCAweEY4LCAweEZGLCAweDA0LCAweDAwLCAweDA2LCAweDAwLAotCTB4RUEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4NEUsIDB4MDAsIDB4QUYsIDB4RkUsIDB4QjgsIDB4MDMsIDB4QzcsCi0JMHhGNSwgMHgzOCwgMHg0MiwgMHgwQywgMHgxOSwgMHgzMiwgMHhGNSwgMHgyMywgMHgwNiwgMHg3RCwgMHhGQywKLQkweEQzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLAotCTB4MDAsIDB4NDEsIDB4RkYsIDB4QzAsIDB4MDEsIDB4QUYsIDB4RkMsIDB4QUQsIDB4MDUsIDB4NEEsIDB4RjYsCi0JMHg0NCwgMHgxNSwgMHgyRiwgMHg0NCwgMHg2NCwgMHhGNywgMHhDOSwgMHgwMiwgMHgzRCwgMHhGRiwgMHhGRSwKLQkweEZGLCAweDM0LCAweDAwLCAweERCLCAweEZGLCAweDA5LCAweDAwLCAweDAyLCAweDAwLCAweDA1LCAweDAwLAotCTB4QzUsIDB4RkYsIDB4REUsIDB4MDAsIDB4QjcsIDB4RkQsIDB4NDUsIDB4MDUsIDB4NTYsIDB4RjMsIDB4NjEsCi0JMHgzRCwgMHhCQSwgMHgyMCwgMHg1NiwgMHhGMywgMHhEMywgMHgwNiwgMHgzRSwgMHhGQywgMHhFNiwgMHgwMSwKLQkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU2LAotCTB4RkYsIDB4ODgsIDB4MDEsIDB4MzEsIDB4RkQsIDB4OTUsIDB4MDQsIDB4QjQsIDB4RjgsIDB4RkMsIDB4MEQsCi0JMHgyNiwgMHg0NywgMHg2NCwgMHhGQiwgMHhBNywgMHgwMCwgMHg3NywgMHgwMCwgMHg1MSwgMHhGRiwgMHg4OSwKLQkweDAwLCAweEJBLCAweEZGLCAweDExLCAweDAwLCAweEZGLCAweEZGLCAweDFBLCAweDAwLCAweDhBLCAweEZGLAotCTB4NTEsIDB4MDEsIDB4RjgsIDB4RkMsIDB4NUUsIDB4MDYsIDB4RUQsIDB4RjEsIDB4ODIsIDB4MzcsIDB4NjAsCi0JMHgyOCwgMHgwRSwgMHhGMiwgMHgyNiwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwgMHgwMSwgMHg0MCwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDQwLAotCTB4MDEsIDB4RDAsIDB4RkQsIDB4NTMsIDB4MDMsIDB4NDcsIDB4RkIsIDB4M0YsIDB4MDcsIDB4QjgsIDB4NDgsCi0JMHg2MiwgMHgwMCwgMHgzRiwgMHhGRSwgMHhDOCwgMHgwMSwgMHg5QywgMHhGRSwgMHhFMCwgMHgwMCwgMHg5OCwKLQkweEZGLCAweDE5LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweEE1LCAweDAxLAotCTB4NzgsIDB4RkMsIDB4RkYsIDB4MDYsIDB4N0QsIDB4RjEsIDB4Q0YsIDB4MzAsIDB4QjgsIDB4MkYsIDB4ODAsCi0JMHhGMSwgMHgwRCwgMHgwNywgMHg2QSwgMHhGQywgMHhBRSwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwKLQkweEZELCAweEZGLCAweDFCLCAweDAwLCAweDkzLCAweEZGLCAweEVELCAweDAwLCAweDgwLCAweEZFLCAweEZELAotCTB4MDEsIDB4REMsIDB4RkQsIDB4M0MsIDB4MDEsIDB4RDUsIDB4NDgsIDB4NDUsIDB4MDYsIDB4QUUsIDB4RkIsCi0JMHgxRiwgMHgwMywgMHhFQSwgMHhGRCwgMHgzNCwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQzLCAweEZGLCAweEQ2LCAweDAxLCAweDM5LCAweEZDLAotCTB4MkEsIDB4MDcsIDB4RUIsIDB4RjEsIDB4ODcsIDB4MjksIDB4ODUsIDB4MzYsIDB4Q0MsIDB4RjEsIDB4N0YsCi0JMHgwNiwgMHhFMCwgMHhGQywgMHg2MCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDEyLCAweDAwLCAweEI1LCAweEZGLCAweDk2LCAweDAwLCAweDM1LCAweEZGLCAweEE5LCAweDAwLCAweDRELAotCTB4MDAsIDB4MTksIDB4RkMsIDB4N0MsIDB4NDcsIDB4RTgsIDB4MEMsIDB4MTgsIDB4RjksIDB4NjYsIDB4MDQsCi0JMHg0OCwgMHhGRCwgMHg3RSwgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM4LCAweEZDLCAweEU2LCAweDA2LAotCTB4MTksIDB4RjMsIDB4RUEsIDB4MjEsIDB4OEEsIDB4M0MsIDB4MEUsIDB4RjMsIDB4NzgsIDB4MDUsIDB4OTYsCi0JMHhGRCwgMHhGMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwKLQkweEQ2LCAweEZGLCAweDQxLCAweDAwLCAweEU0LCAweEZGLCAweDZCLCAweEZGLCAweDdCLCAweDAyLCAweEYwLAotCTB4RjcsIDB4QkEsIDB4NDQsIDB4MUUsIDB4MTQsIDB4QTUsIDB4RjYsIDB4ODYsIDB4MDUsIDB4QzEsIDB4RkMsCi0JMHhCOSwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwKLQkweDAwLCAweDM5LCAweEZGLCAweEQ4LCAweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLCAweEY0LAotCTB4MzgsIDB4MUEsIDB4OEMsIDB4NDEsIDB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsIDB4NjYsCi0JMHgwMCwgMHgwMSwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGNCwgMHhGRiwKLQkweEYyLCAweEZGLCAweDgzLCAweDAwLCAweDUzLCAweEZFLCAweDRFLCAweDA0LCAweEQwLCAweEY0LCAweEFCLAotCTB4NDAsIDB4QjIsIDB4MUIsIDB4N0YsIDB4RjQsIDB4NjksIDB4MDYsIDB4NjIsIDB4RkMsIDB4REQsIDB4MDEsCi0JMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywKLQkweEZGLCAweEFGLCAweDAxLCAweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLAotCTB4NUMsIDB4NDUsIDB4QTksIDB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsCi0JMHgwMCwgMHhEMCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhBRiwgMHhGRiwKLQkweDA5LCAweDAxLCAweDZFLCAweEZELCAweEI0LCAweDA1LCAweEJDLCAweEYyLCAweDczLCAweDNCLCAweDY0LAotCTB4MjMsIDB4RDIsIDB4RjIsIDB4RkIsIDB4MDYsIDB4MzQsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwKLQkweDAxLCAweDY1LCAweEZELCAweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LAotCTB4MDMsIDB4RkQsIDB4RDksIDB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwgMHg3OSwgMHhGRiwgMHg3MiwgMHgwMSwKLQkweEM0LCAweEZDLCAweEE0LCAweDA2LCAweEFCLCAweEYxLCAweDQ2LCAweDM1LCAweEY3LCAweDJBLCAweEM2LAotCTB4RjEsIDB4MkEsIDB4MDcsIDB4NDAsIDB4RkMsIDB4Q0YsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzEsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywKLQkweEZFLCAweERFLCAweDAyLCAweDJFLCAweEZDLCAweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLAotCTB4NUUsIDB4RkQsIDB4M0YsIDB4MDIsIDB4NUQsIDB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwgMHhCQSwgMHgwMSwgMHg1QiwgMHhGQywKLQkweDFCLCAweDA3LCAweDhCLCAweEYxLCAweDU4LCAweDJFLCAweDI2LCAweDMyLCAweDgwLCAweEYxLCAweEVBLAotCTB4MDYsIDB4OEMsIDB4RkMsIDB4OTcsIDB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxNywgMHgwMCwgMHg5RSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhCRiwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwKLQkweEZFLCAweDVBLCAweEZGLCAweDg2LCAweDQ4LCAweDdELCAweDA4LCAweEM3LCAweEZBLCAweDkzLCAweDAzLAotCTB4QjAsIDB4RkQsIDB4NEYsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHgzRCwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMiwgMHhGQywgMHgxRSwgMHgwNywKLQkweDQwLCAweEYyLCAweEVCLCAweDI2LCAweEI1LCAweDM4LCAweDFGLCAweEYyLCAweDMyLCAweDA2LCAweDE4LAotCTB4RkQsIDB4M0QsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDAsCi0JMHhDMCwgMHhGRiwgMHg3OCwgMHgwMCwgMHg3MywgMHhGRiwgMHgzOCwgMHgwMCwgMHgxNywgMHgwMSwgMHg4QiwKLQkweEZBLCAweEFGLCAweDQ2LCAweDU5LCAweDBGLCAweDM5LCAweEY4LCAweENGLCAweDA0LCAweDE1LCAweEZELAotCTB4OTUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NiwgMHhGQywgMHhCOCwgMHgwNiwgMHhBOCwgMHhGMywKLQkweDNGLCAweDFGLCAweDY0LCAweDNFLCAweEJBLCAweEYzLCAweDAxLCAweDA1LCAweEUyLCAweEZELCAweEM0LAotCTB4MDAsIDB4RDIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTEsIDB4RkYsCi0JMHgyNSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwNSwgMHhGRiwgMHgyOCwgMHgwMywgMHhCRCwgMHhGNiwgMHg3NywKLQkweDQzLCAweEI2LCAweDE2LCAweERDLCAweEY1LCAweERELCAweDA1LCAweDlCLCAweEZDLCAweEM4LCAweDAxLAotCTB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsCi0JMHhGRiwgMHhDQywgMHgwMSwgMHg4RiwgMHhGQywgMHhGOCwgMHgwNSwgMHg5QiwgMHhGNSwgMHg5NiwgMHgxNywKLQkweDAyLCAweDQzLCAweDVFLCAweEY2LCAweDVGLCAweDAzLCAweEU0LCAweEZFLCAweDMwLCAweDAwLCAweDFCLAotCTB4MDAsIDB4RTQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RDksIDB4RkYsCi0JMHhCNCwgMHgwMCwgMHhGRCwgMHhGRCwgMHhENywgMHgwNCwgMHhGQSwgMHhGMywgMHhGQywgMHgzRSwgMHg1QiwKLQkweDFFLCAweERCLCAweEYzLCAweEE2LCAweDA2LCAweDRDLCAweEZDLCAweEUzLCAweDAxLCAweDM2LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUMsCi0JMHgwMSwgMHgwNSwgMHhGRCwgMHhGMSwgMHgwNCwgMHhGMCwgMHhGNywgMHgyRCwgMHgxMCwgMHg2MSwgMHg0NiwKLQkweDBELCAweEZBLCAweDU4LCAweDAxLCAweDEzLCAweDAwLCAweDg3LCAweEZGLCAweDZFLCAweDAwLCAweEM0LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4MzEsIDB4MDEsCi0JMHgyQywgMHhGRCwgMHgxNSwgMHgwNiwgMHg0MSwgMHhGMiwgMHg2QSwgMHgzOSwgMHgwQSwgMHgyNiwgMHg2MSwKLQkweEYyLCAweDE3LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4NTgsIDB4MDEsIDB4OUQsCi0JMHhGRCwgMHhCOSwgMHgwMywgMHg3QiwgMHhGQSwgMHg0MCwgMHgwOSwgMHg2MywgMHg0OCwgMHhCRiwgMHhGRSwKLQkweDAzLCAweEZGLCAweDVGLCAweDAxLCAweEQ0LCAweEZFLCAweEM1LCAweDAwLCAweEEyLCAweEZGLCAweDE2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkEsIDB4RkYsIDB4OEUsIDB4MDEsIDB4OTksIDB4RkMsCi0JMHhEQiwgMHgwNiwgMHg4NiwgMHhGMSwgMHhGMiwgMHgzMiwgMHg4MiwgMHgyRCwgMHg5NiwgMHhGMSwgMHgyMSwKLQkweDA3LCAweDUzLCAweEZDLCAweEMwLCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLAotCTB4MUQsIDB4MDAsIDB4ODgsIDB4RkYsIDB4MDcsIDB4MDEsIDB4NDksIDB4RkUsIDB4NjcsIDB4MDIsIDB4MTMsCi0JMHhGRCwgMHhGRiwgMHgwMiwgMHhGNCwgMHg0OCwgMHg1RiwgMHgwNCwgMHg3QSwgMHhGQywgMHhCNiwgMHgwMiwKLQkweDIwLCAweEZFLCAweDFCLCAweDAxLCAweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4Q0EsIDB4MDEsIDB4NDYsIDB4RkMsIDB4MjksIDB4MDcsCi0JMHhCMywgMHhGMSwgMHhEMSwgMHgyQiwgMHg4MSwgMHgzNCwgMHg5QywgMHhGMSwgMHhCOCwgMHgwNiwgMHhCNSwKLQkweEZDLCAweDdDLCAweDAxLCAweDc0LCAweEZGLCAweDIyLCAweDAwLCAweEZFLCAweEZGLCAweDE1LCAweDAwLAotCTB4QUEsIDB4RkYsIDB4QjEsIDB4MDAsIDB4RkUsIDB4RkUsIDB4MTAsIDB4MDEsIDB4OTIsIDB4RkYsIDB4OTQsCi0JMHhGRCwgMHgwRCwgMHg0OCwgMHhDQiwgMHgwQSwgMHhFMiwgMHhGOSwgMHgwNCwgMHgwNCwgMHg3NywgMHhGRCwKLQkweDY5LCAweDAxLCAweDYyLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MDYsIDB4MDcsIDB4QUEsIDB4RjIsCi0JMHg0NiwgMHgyNCwgMHhDOCwgMHgzQSwgMHg5MCwgMHhGMiwgMHhENiwgMHgwNSwgMHg1NywgMHhGRCwgMHgxNywKLQkweDAxLCAweEE4LCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweENDLCAweEZGLAotCTB4NUEsIDB4MDAsIDB4QUYsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MUMsIDB4RjksIDB4QjgsCi0JMHg0NSwgMHhEQSwgMHgxMSwgMHg2MCwgMHhGNywgMHgzMywgMHgwNSwgMHhFNywgMHhGQywgMHhBOSwgMHgwMSwKLQkweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LAotCTB4RkYsIDB4REYsIDB4MDEsIDB4NUEsIDB4RkMsIDB4N0UsIDB4MDYsIDB4NDcsIDB4RjQsIDB4OTQsIDB4MUMsCi0JMHgxRiwgMHg0MCwgMHg4NSwgMHhGNCwgMHg3RCwgMHgwNCwgMHgzNiwgMHhGRSwgMHg5MywgMHgwMCwgMHhFQSwKLQkweEZGLCAweEY3LCAweEZGLCAweDA0LCAweDAwLCAweDA2LCAweDAwLCAweEVCLCAweEZGLCAweDA5LCAweDAwLAotCTB4NTQsIDB4MDAsIDB4QTQsIDB4RkUsIDB4QzksIDB4MDMsIDB4QUEsIDB4RjUsIDB4MEMsIDB4NDIsIDB4NTYsCi0JMHgxOSwgMHgxRSwgMHhGNSwgMHgyQiwgMHgwNiwgMHg3QSwgMHhGQywgMHhENCwgMHgwMSwgMHgzQSwgMHhGRiwKLQkweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJFLAotCTB4MDEsIDB4QjQsIDB4RkMsIDB4QTQsIDB4MDUsIDB4NjEsIDB4RjYsIDB4RkIsIDB4MTQsIDB4NTMsIDB4NDQsCi0JMHg4NiwgMHhGNywgMHhCNiwgMHgwMiwgMHg0OSwgMHhGRiwgMHhGNywgMHhGRiwgMHgzNywgMHgwMCwgMHhEOSwKLQkweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweDA2LCAweDAwLCAweEMyLCAweEZGLCAweEUzLCAweDAwLAotCTB4QUUsIDB4RkQsIDB4NTIsIDB4MDUsIDB4NDQsIDB4RjMsIDB4MkEsIDB4M0QsIDB4MDYsIDB4MjEsIDB4NDcsCi0JMHhGMywgMHhEOCwgMHgwNiwgMHgzQywgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU3LCAweEZGLCAweDg2LCAweDAxLCAweDM2LAotCTB4RkQsIDB4ODksIDB4MDQsIDB4Q0QsIDB4RjgsIDB4QjcsIDB4MEQsIDB4M0QsIDB4NDcsIDB4OTEsIDB4RkIsCi0JMHg5MSwgMHgwMCwgMHg4MywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4QywgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwKLQkweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDg4LCAweEZGLCAweDU1LCAweDAxLCAweEYyLCAweEZDLAotCTB4NjcsIDB4MDYsIDB4RTQsIDB4RjEsIDB4NDQsIDB4MzcsIDB4QUEsIDB4MjgsIDB4MDUsIDB4RjIsIDB4MjcsCi0JMHgwNywgMHgzNiwgMHhGQywgMHhEQSwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDczLCAweEZGLCAweDNELCAweDAxLCAweEQ2LCAweEZELCAweDQ2LAotCTB4MDMsIDB4NjEsIDB4RkIsIDB4MDAsIDB4MDcsIDB4QkYsIDB4NDgsIDB4OTgsIDB4MDAsIDB4MjYsIDB4RkUsCi0JMHhENSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhFMywgMHgwMCwgMHg5NiwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweEE3LCAweDAxLCAweDc1LCAweEZDLCAweDAzLCAweDA3LAotCTB4N0QsIDB4RjEsIDB4OEEsIDB4MzAsIDB4RkYsIDB4MkYsIDB4N0UsIDB4RjEsIDB4MEEsIDB4MDcsIDB4NkUsCi0JMHhGQywgMHhBQywgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQSwgMHgwMCwKLQkweDk0LCAweEZGLCAweEVBLCAweDAwLCAweDg3LCAweEZFLCAweEYwLCAweDAxLCAweEY1LCAweEZELCAweDA1LAotCTB4MDEsIDB4Q0UsIDB4NDgsIDB4ODMsIDB4MDYsIDB4OTQsIDB4RkIsIDB4MkMsIDB4MDMsIDB4RTQsIDB4RkQsCi0JMHgzNywgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywKLQkweDAwLCAweDQyLCAweEZGLCAweEQ3LCAweDAxLCAweDM4LCAweEZDLCAweDI5LCAweDA3LCAweEYzLCAweEYxLAotCTB4M0UsIDB4MjksIDB4QzYsIDB4MzYsIDB4RDQsIDB4RjEsIDB4NzcsIDB4MDYsIDB4RTYsIDB4RkMsIDB4NUMsCi0JMHgwMSwgMHg4NCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNiwgMHhGRiwKLQkweDkzLCAweDAwLCAweDNDLCAweEZGLCAweDlELCAweDAwLCAweDYzLCAweDAwLCAweEVCLCAweEZCLCAweDY5LAotCTB4NDcsIDB4MkQsIDB4MEQsIDB4RkYsIDB4RjgsIDB4NzIsIDB4MDQsIDB4NDIsIDB4RkQsIDB4ODEsIDB4MDEsCi0JMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywKLQkweEZGLCAweEU2LCAweDAxLCAweDNBLCAweEZDLCAweEUyLCAweDA2LCAweDI4LCAweEYzLCAweDlFLCAweDIxLAotCTB4QzAsIDB4M0MsIDB4MUYsIDB4RjMsIDB4NkMsIDB4MDUsIDB4OUUsIDB4RkQsIDB4RUQsIDB4MDAsIDB4QkQsCi0JMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhENywgMHhGRiwgMHgzRSwgMHgwMCwKLQkweEVBLCAweEZGLCAweDYwLCAweEZGLCAweDhGLCAweDAyLCAweENELCAweEY3LCAweDk5LCAweDQ0LCAweDY4LAotCTB4MTQsIDB4OEUsIDB4RjYsIDB4OTAsIDB4MDUsIDB4QkMsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NDMsIDB4RkYsCi0JMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhENywKLQkweDAxLCAweDczLCAweEZDLCAweDNCLCAweDA2LCAweEY1LCAweEY0LCAweEVELCAweDE5LCAweEI3LCAweDQxLAotCTB4NzEsIDB4RjUsIDB4RUIsIDB4MDMsIDB4OTAsIDB4RkUsIDB4NjAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RUQsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhFRiwgMHhGRiwgMHg4OCwgMHgwMCwKLQkweDQ5LCAweEZFLCAweDVELCAweDA0LCAweEI3LCAweEY0LCAweDdELCAweDQwLCAweEZELCAweDFCLCAweDZDLAotCTB4RjQsIDB4NzAsIDB4MDYsIDB4NUYsIDB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OCwgMHhGRiwgMHhBRCwgMHgwMSwgMHhERCwKLQkweEZDLCAweDQ4LCAweDA1LCAweDMwLCAweEY3LCAweDZCLCAweDEyLCAweDdELCAweDQ1LCAweENGLCAweEY4LAotCTB4MDEsIDB4MDIsIDB4QjIsIDB4RkYsIDB4QkQsIDB4RkYsIDB4NTQsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4MEMsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgwRSwgMHgwMSwgMHg2NiwgMHhGRCwKLQkweEJGLCAweDA1LCAweEFELCAweEYyLCAweDNCLCAweDNCLCAweEIwLCAweDIzLCAweEM0LCAweEYyLCAweEZGLAotCTB4MDYsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg2MCwgMHhGRiwgMHg2RSwgMHgwMSwgMHg2QiwgMHhGRCwgMHgxRCwKLQkweDA0LCAweEFGLCAweEY5LCAweDUxLCAweDBCLCAweEVDLCAweDQ3LCAweDMzLCAweEZELCAweEMxLCAweEZGLAotCTB4RjcsIDB4MDAsIDB4MEMsIDB4RkYsIDB4QUEsIDB4MDAsIDB4QUQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgyMSwgMHgwMCwgMHg3NywgMHhGRiwgMHg3NSwgMHgwMSwgMHhCRiwgMHhGQywgMHhBQiwgMHgwNiwKLQkweEE2LCAweEYxLCAweDA1LCAweDM1LCAweDQwLCAweDJCLCAweEJGLCAweEYxLCAweDJBLCAweDA3LCAweDQyLAotCTB4RkMsIDB4Q0UsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyMCwgMHgwMCwgMHg3RSwgMHhGRiwgMHgyMSwgMHgwMSwgMHgxMiwgMHhGRSwgMHhEMSwgMHgwMiwgMHg0NywKLQkweEZDLCAweEQ3LCAweDA0LCAweEYwLCAweDQ4LCAweDhELCAweDAyLCAweDQ1LCAweEZELCAweDRELCAweDAyLAotCTB4NTYsIDB4RkUsIDB4MDEsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsCi0JMHgwMCwgMHg1MiwgMHhGRiwgMHhCQywgMHgwMSwgMHg1OCwgMHhGQywgMHgxRCwgMHgwNywgMHg4RSwgMHhGMSwKLQkweDExLCAweDJFLCAweDZCLCAweDMyLCAweDgxLCAweEYxLCAweEU1LCAweDA2LCAweDkwLCAweEZDLCAweDk0LAotCTB4MDEsIDB4NjcsIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4RkYsCi0JMHhDQywgMHgwMCwgMHhDNiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhEMiwgMHhGRSwgMHgyNiwgMHhGRiwgMHg3QywKLQkweDQ4LCAweEJFLCAweDA4LCAweEFFLCAweEZBLCAweEEwLCAweDAzLCAweEE5LCAweEZELCAweDUyLCAweDAxLAotCTB4NkIsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsCi0JMHhGRiwgMHhFMCwgMHgwMSwgMHgzMiwgMHhGQywgMHgxQywgMHgwNywgMHg0QiwgMHhGMiwgMHhBMCwgMHgyNiwKLQkweEYyLCAweDM4LCAweDJBLCAweEYyLCAweDI4LCAweDA2LCAweDFGLCAweEZELCAweDM5LCAweDAxLCAweDk2LAotCTB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4NzUsIDB4MDAsCi0JMHg3QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgyRCwgMHgwMSwgMHg2MSwgMHhGQSwgMHg5NywgMHg0NiwgMHhBMCwKLQkweDBGLCAweDIwLCAweEY4LCAweERBLCAweDA0LCAweDEwLCAweEZELCAweDk3LCAweDAxLCAweDUwLCAweEZGLAotCTB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsCi0JMHgwMSwgMHg0OCwgMHhGQywgMHhCMiwgMHgwNiwgMHhCOSwgMHhGMywgMHhGMywgMHgxRSwgMHg5OCwgMHgzRSwKLQkweENGLCAweEYzLCAweEYzLCAweDA0LCAweEVCLCAweEZELCAweEJGLCAweDAwLCAweEQ0LCAweEZGLCAweEZGLAotCTB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjMsIDB4MDAsCi0JMHhGQSwgMHhGRSwgMHgzQSwgMHgwMywgMHg5RCwgMHhGNiwgMHg1MCwgMHg0MywgMHgwMCwgMHgxNywgMHhDNiwKLQkweEY1LCAweEU2LCAweDA1LCAweDk3LCAweEZDLCAweEM5LCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsIDB4Q0IsIDB4MDEsIDB4OTMsCi0JMHhGQywgMHhFRiwgMHgwNSwgMHhCMCwgMHhGNSwgMHg0QiwgMHgxNywgMHgyQSwgMHg0MywgMHg3RCwgMHhGNiwKLQkweDRELCAweDAzLCAweEVGLCAweEZFLCAweDJBLCAweDAwLCAweDFFLCAweDAwLCAweEUzLCAweEZGLCAweDA4LAotCTB4MDAsIDB4MDMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RDcsIDB4RkYsIDB4QkEsIDB4MDAsIDB4RjQsIDB4RkQsCi0JMHhFNSwgMHgwNCwgMHhFNCwgMHhGMywgMHhDQSwgMHgzRSwgMHhBNywgMHgxRSwgMHhDQSwgMHhGMywgMHhBQywKLQkweDA2LCAweDRBLCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEYsIDB4RkYsIDB4OTksIDB4MDEsIDB4MEIsIDB4RkQsIDB4RTYsCi0JMHgwNCwgMHgwOCwgMHhGOCwgMHhFNywgMHgwRiwgMHg3QywgMHg0NiwgMHgzNywgMHhGQSwgMHg0MiwgMHgwMSwKLQkweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDcxLCAweDAwLCAweEMzLCAweEZGLCAweDBGLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MTUsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MzUsIDB4MDEsIDB4MjUsIDB4RkQsIDB4MUUsIDB4MDYsCi0JMHgzNSwgMHhGMiwgMHgyRSwgMHgzOSwgMHg1NSwgMHgyNiwgMHg1NiwgMHhGMiwgMHgxQSwgMHgwNywgMHgzMSwKLQkweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4MjYsIDB4MDAsIDB4NkEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4QTMsIDB4RkQsIDB4QUQsIDB4MDMsIDB4OTQsCi0JMHhGQSwgMHhGRiwgMHgwOCwgMHg3MCwgMHg0OCwgMHhGMywgMHhGRSwgMHhFQSwgMHhGRSwgMHg2QywgMHgwMSwKLQkweENELCAweEZFLCAweEM5LCAweDAwLCAweEExLCAweEZGLCAweDE3LCAweDAwLCAweEZELCAweEZGLCAweDI2LAotCTB4MDAsIDB4NjksIDB4RkYsIDB4OTEsIDB4MDEsIDB4OTQsIDB4RkMsIDB4RTAsIDB4MDYsIDB4ODQsIDB4RjEsCi0JMHhBRiwgMHgzMiwgMHhDQSwgMHgyRCwgMHg5MiwgMHhGMSwgMHgxRiwgMHgwNywgMHg1NiwgMHhGQywgMHhCRSwKLQkweDAxLCAweDUxLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDFELCAweDAwLCAweDhBLCAweEZGLAotCTB4MDQsIDB4MDEsIDB4NTAsIDB4RkUsIDB4NUEsIDB4MDIsIDB4MkMsIDB4RkQsIDB4QzYsIDB4MDIsIDB4RjIsCi0JMHg0OCwgMHg5QiwgMHgwNCwgMHg2MSwgMHhGQywgMHhDMywgMHgwMiwgMHgxOSwgMHhGRSwgMHgxRSwgMHgwMSwKLQkweDdGLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ5LAotCTB4RkYsIDB4Q0MsIDB4MDEsIDB4NDQsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjksIDB4RjEsIDB4ODksIDB4MkIsCi0JMHhDMywgMHgzNCwgMHhBMCwgMHhGMSwgMHhCMSwgMHgwNiwgMHhCQSwgMHhGQywgMHg3OSwgMHgwMSwgMHg3NiwKLQkweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLCAweDE0LCAweDAwLCAweEFDLCAweEZGLCAweEFFLCAweDAwLAotCTB4MDUsIDB4RkYsIDB4MDMsIDB4MDEsIDB4QUEsIDB4RkYsIDB4NjMsIDB4RkQsIDB4RkQsIDB4NDcsIDB4MEUsCi0JMHgwQiwgMHhDOCwgMHhGOSwgMHgxMSwgMHgwNCwgMHg3MSwgMHhGRCwgMHg2QywgMHgwMSwgMHg2MSwgMHhGRiwKLQkweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LAotCTB4MDEsIDB4MzMsIDB4RkMsIDB4MDMsIDB4MDcsIDB4QjcsIDB4RjIsIDB4RkMsIDB4MjMsIDB4MDMsIDB4M0IsCi0JMHg5RSwgMHhGMiwgMHhDQiwgMHgwNSwgMHg1RiwgMHhGRCwgMHgxMiwgMHgwMSwgMHhBQSwgMHhGRiwgMHgwRSwKLQkweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweENELCAweEZGLCAweDU3LCAweDAwLCAweEI2LCAweEZGLAotCTB4QkUsIDB4RkYsIDB4RUQsIDB4MDEsIDB4RjUsIDB4RjgsIDB4OUIsIDB4NDUsIDB4MjIsIDB4MTIsIDB4NDgsCi0JMHhGNywgMHgzRCwgMHgwNSwgMHhFMiwgMHhGQywgMHhBQiwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLCAweDVDLAotCTB4RkMsIDB4NzgsIDB4MDYsIDB4NUEsIDB4RjQsIDB4NDksIDB4MUMsIDB4NEUsIDB4NDAsIDB4OUUsIDB4RjQsCi0JMHg2RCwgMHgwNCwgMHgzRiwgMHhGRSwgMHg4RSwgMHgwMCwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwNCwKLQkweDAwLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLCAweDVBLCAweDAwLCAweDlBLCAweEZFLAotCTB4REEsIDB4MDMsIDB4OEQsIDB4RjUsIDB4RTEsIDB4NDEsIDB4QTEsIDB4MTksIDB4MDksIDB4RjUsIDB4MzMsCi0JMHgwNiwgMHg3NywgMHhGQywgMHhENiwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJDLCAweDAxLCAweEI4LCAweEZDLCAweDlBLAotCTB4MDUsIDB4NzcsIDB4RjYsIDB4QjEsIDB4MTQsIDB4NzcsIDB4NDQsIDB4QTksIDB4RjcsIDB4QTIsIDB4MDIsCi0JMHg1NCwgMHhGRiwgMHhGMSwgMHhGRiwgMHgzQSwgMHgwMCwgMHhEOCwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwKLQkweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLCAweEU4LCAweDAwLCAweEE2LCAweEZELCAweDVGLCAweDA1LAotCTB4MzEsIDB4RjMsIDB4RjYsIDB4M0MsIDB4NTIsIDB4MjEsIDB4MzcsIDB4RjMsIDB4REQsIDB4MDYsIDB4M0IsCi0JMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDJCLCAweDAwLCAweDU4LCAweEZGLCAweDgzLCAweDAxLCAweDNDLCAweEZELCAweDdFLCAweDA0LCAweEU2LAotCTB4RjgsIDB4NzIsIDB4MEQsIDB4NTIsIDB4NDcsIDB4QkUsIDB4RkIsIDB4N0EsIDB4MDAsIDB4OTAsIDB4MDAsCi0JMHg0MywgMHhGRiwgMHg4RiwgMHgwMCwgMHhCNywgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywKLQkweDAwLCAweDg2LCAweEZGLCAweDU5LCAweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLCAweEYxLAotCTB4MDQsIDB4MzcsIDB4RjMsIDB4MjgsIDB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsIDB4RDgsCi0JMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwKLQkweDc0LCAweEZGLCAweDNBLCAweDAxLCAweERELCAweEZELCAweDM5LCAweDAzLCAweDdCLCAweEZCLCAweEMxLAotCTB4MDYsIDB4QzcsIDB4NDgsIDB4Q0YsIDB4MDAsIDB4MEQsIDB4RkUsIDB4RTMsIDB4MDEsIDB4OEUsIDB4RkUsCi0JMHhFNywgMHgwMCwgMHg5NSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywKLQkweEZGLCAweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLAotCTB4NDQsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsCi0JMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NSwgMHhGRiwgMHhFNywgMHgwMCwKLQkweDhFLCAweEZFLCAweEUzLCAweDAxLCAweDBELCAweEZFLCAweENGLCAweDAwLCAweEM3LCAweDQ4LCAweEMxLAotCTB4MDYsIDB4N0IsIDB4RkIsIDB4MzksIDB4MDMsIDB4REQsIDB4RkQsIDB4M0EsIDB4MDEsIDB4NzQsIDB4RkYsCi0JMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwKLQkweDAxLCAweDM3LCAweEZDLCAweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LAotCTB4REMsIDB4RjEsIDB4NkYsIDB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCNywgMHhGRiwgMHg4RiwgMHgwMCwgMHg0MywgMHhGRiwKLQkweDkwLCAweDAwLCAweDdBLCAweDAwLCAweEJFLCAweEZCLCAweDUyLCAweDQ3LCAweDcyLCAweDBELCAweEU2LAotCTB4RjgsIDB4N0UsIDB4MDQsIDB4M0MsIDB4RkQsIDB4ODMsIDB4MDEsIDB4NTgsIDB4RkYsIDB4MkIsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwKLQkweEZDLCAweERELCAweDA2LCAweDM3LCAweEYzLCAweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLAotCTB4NUYsIDB4MDUsIDB4QTYsIDB4RkQsIDB4RTgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHgwQSwgMHgwMCwgMHhEOCwgMHhGRiwgMHgzQSwgMHgwMCwgMHhGMSwgMHhGRiwgMHg1NCwgMHhGRiwKLQkweEEyLCAweDAyLCAweEE5LCAweEY3LCAweDc3LCAweDQ0LCAweEIxLCAweDE0LCAweDc3LCAweEY2LCAweDlBLAotCTB4MDUsIDB4QjgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENiwgMHgwMSwgMHg3NywgMHhGQywgMHgzMywKLQkweDA2LCAweDA5LCAweEY1LCAweEExLCAweDE5LCAweEUxLCAweDQxLCAweDhELCAweEY1LCAweERBLCAweDAzLAotCTB4OUEsIDB4RkUsIDB4NUEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDQsCi0JMHgwMCwgMHhGNiwgMHhGRiwgMHhFRCwgMHhGRiwgMHg4RSwgMHgwMCwgMHgzRiwgMHhGRSwgMHg2RCwgMHgwNCwKLQkweDlFLCAweEY0LCAweDRFLCAweDQwLCAweDQ5LCAweDFDLCAweDVBLCAweEY0LCAweDc4LCAweDA2LCAweDVDLAotCTB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsCi0JMHgzMCwgMHgwMCwgMHg0OSwgMHhGRiwgMHhBQiwgMHgwMSwgMHhFMiwgMHhGQywgMHgzRCwgMHgwNSwgMHg0OCwKLQkweEY3LCAweDIyLCAweDEyLCAweDlCLCAweDQ1LCAweEY1LCAweEY4LCAweEVELCAweDAxLCAweEJFLCAweEZGLAotCTB4QjYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsCi0JMHgwMCwgMHhBQSwgMHhGRiwgMHgxMiwgMHgwMSwgMHg1RiwgMHhGRCwgMHhDQiwgMHgwNSwgMHg5RSwgMHhGMiwKLQkweDAzLCAweDNCLCAweEZDLCAweDIzLCAweEI3LCAweEYyLCAweDAzLCAweDA3LCAweDMzLCAweEZDLCAweEU1LAotCTB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsCi0JMHg2MSwgMHhGRiwgMHg2QywgMHgwMSwgMHg3MSwgMHhGRCwgMHgxMSwgMHgwNCwgMHhDOCwgMHhGOSwgMHgwRSwKLQkweDBCLCAweEZELCAweDQ3LCAweDYzLCAweEZELCAweEFBLCAweEZGLCAweDAzLCAweDAxLCAweDA1LCAweEZGLAotCTB4QUUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzYsCi0JMHhGRiwgMHg3OSwgMHgwMSwgMHhCQSwgMHhGQywgMHhCMSwgMHgwNiwgMHhBMCwgMHhGMSwgMHhDMywgMHgzNCwKLQkweDg5LCAweDJCLCAweEI5LCAweEYxLCAweDI5LCAweDA3LCAweDQ0LCAweEZDLCAweENDLCAweDAxLCAweDQ5LAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0YsIDB4RkYsCi0JMHgxRSwgMHgwMSwgMHgxOSwgMHhGRSwgMHhDMywgMHgwMiwgMHg2MSwgMHhGQywgMHg5QiwgMHgwNCwgMHhGMiwKLQkweDQ4LCAweEM2LCAweDAyLCAweDJDLCAweEZELCAweDVBLCAweDAyLCAweDUwLCAweEZFLCAweDA0LCAweDAxLAotCTB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTEsIDB4RkYsIDB4QkUsCi0JMHgwMSwgMHg1NiwgMHhGQywgMHgxRiwgMHgwNywgMHg5MiwgMHhGMSwgMHhDQSwgMHgyRCwgMHhBRiwgMHgzMiwKLQkweDg0LCAweEYxLCAweEUwLCAweDA2LCAweDk0LCAweEZDLCAweDkxLCAweDAxLCAweDY5LCAweEZGLCAweDI2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4QzksIDB4MDAsIDB4Q0QsIDB4RkUsCi0JMHg2QywgMHgwMSwgMHhFQSwgMHhGRSwgMHhGMywgMHhGRSwgMHg3MCwgMHg0OCwgMHhGRiwgMHgwOCwgMHg5NCwKLQkweEZBLCAweEFELCAweDAzLCAweEEzLCAweEZELCAweDU1LCAweDAxLCAweDZBLCAweEZGLCAweDI2LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsIDB4RTEsIDB4MDEsIDB4MzEsCi0JMHhGQywgMHgxQSwgMHgwNywgMHg1NiwgMHhGMiwgMHg1NSwgMHgyNiwgMHgyRSwgMHgzOSwgMHgzNSwgMHhGMiwKLQkweDFFLCAweDA2LCAweDI1LCAweEZELCAweDM1LCAweDAxLCAweDk4LCAweEZGLCAweDE1LCAweDAwLCAweEZGLAotCTB4RkYsIDB4MEYsIDB4MDAsIDB4QzMsIDB4RkYsIDB4NzEsIDB4MDAsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsCi0JMHg0MiwgMHgwMSwgMHgzNywgMHhGQSwgMHg3QywgMHg0NiwgMHhFNywgMHgwRiwgMHgwOCwgMHhGOCwgMHhFNiwKLQkweDA0LCAweDBCLCAweEZELCAweDk5LCAweDAxLCAweDRGLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLAotCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NEEsIDB4RkMsIDB4QUMsCi0JMHgwNiwgMHhDQSwgMHhGMywgMHhBNywgMHgxRSwgMHhDQSwgMHgzRSwgMHhFNCwgMHhGMywgMHhFNSwgMHgwNCwKLQkweEY0LCAweEZELCAweEJBLCAweDAwLCAweEQ3LCAweEZGLCAweEZFLCAweEZGLCAweDAzLCAweDAwLCAweDA4LAotCTB4MDAsIDB4RTMsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MkEsIDB4MDAsIDB4RUYsIDB4RkUsIDB4NEQsIDB4MDMsCi0JMHg3RCwgMHhGNiwgMHgyQSwgMHg0MywgMHg0QiwgMHgxNywgMHhCMCwgMHhGNSwgMHhFRiwgMHgwNSwgMHg5MywKLQkweEZDLCAweENCLCAweDAxLCAweDNELCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZFLCAweEZGLAotCTB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzksIDB4MDEsIDB4OTcsIDB4RkMsIDB4RTYsIDB4MDUsIDB4QzYsCi0JMHhGNSwgMHgwMCwgMHgxNywgMHg1MCwgMHg0MywgMHg5RCwgMHhGNiwgMHgzQSwgMHgwMywgMHhGQSwgMHhGRSwKLQkweDIzLCAweDAwLCAweDIxLCAweDAwLCAweEUyLCAweEZGLCAweDA4LCAweDAwLCAweDAzLCAweDAwLCAweEZGLAotCTB4RkYsIDB4RDQsIDB4RkYsIDB4QkYsIDB4MDAsIDB4RUIsIDB4RkQsIDB4RjMsIDB4MDQsIDB4Q0YsIDB4RjMsCi0JMHg5OCwgMHgzRSwgMHhGMywgMHgxRSwgMHhCOSwgMHhGMywgMHhCMiwgMHgwNiwgMHg0OCwgMHhGQywgMHhFNCwKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJFLCAweDAwLAotCTB4NTAsIDB4RkYsIDB4OTcsIDB4MDEsIDB4MTAsIDB4RkQsIDB4REEsIDB4MDQsIDB4MjAsIDB4RjgsIDB4QTAsCi0JMHgwRiwgMHg5NywgMHg0NiwgMHg2MSwgMHhGQSwgMHgyRCwgMHgwMSwgMHgyQiwgMHgwMCwgMHg3QSwgMHhGRiwKLQkweDc1LCAweDAwLCAweEMyLCAweEZGLCAweDBGLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk2LAotCTB4RkYsIDB4MzksIDB4MDEsIDB4MUYsIDB4RkQsIDB4MjgsIDB4MDYsIDB4MkEsIDB4RjIsIDB4RjIsIDB4MzgsCi0JMHhBMCwgMHgyNiwgMHg0QiwgMHhGMiwgMHgxQywgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzQywKLQkweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZCLCAweEZGLAotCTB4NTIsIDB4MDEsIDB4QTksIDB4RkQsIDB4QTAsIDB4MDMsIDB4QUUsIDB4RkEsIDB4QkUsIDB4MDgsIDB4N0MsCi0JMHg0OCwgMHgyNiwgMHhGRiwgMHhEMiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhDNiwgMHhGRSwgMHhDQywgMHgwMCwKLQkweEEwLCAweEZGLCAweDE3LCAweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY3LCAweEZGLCAweDk0LAotCTB4MDEsIDB4OTAsIDB4RkMsIDB4RTUsIDB4MDYsIDB4ODEsIDB4RjEsIDB4NkIsIDB4MzIsIDB4MTEsIDB4MkUsCi0JMHg4RSwgMHhGMSwgMHgxRCwgMHgwNywgMHg1OCwgMHhGQywgMHhCQywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRSwKLQkweDAwLCAweEZELCAweEZGLCAweDFELCAweDAwLCAweDhCLCAweEZGLCAweDAxLCAweDAxLCAweDU2LCAweEZFLAotCTB4NEQsIDB4MDIsIDB4NDUsIDB4RkQsIDB4OEQsIDB4MDIsIDB4RjAsIDB4NDgsIDB4RDcsIDB4MDQsIDB4NDcsCi0JMHhGQywgMHhEMSwgMHgwMiwgMHgxMiwgMHhGRSwgMHgyMSwgMHgwMSwgMHg3RSwgMHhGRiwgMHgyMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ4LCAweEZGLCAweENFLCAweDAxLCAweDQyLAotCTB4RkMsIDB4MkEsIDB4MDcsIDB4QkYsIDB4RjEsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MzUsIDB4QTYsIDB4RjEsCi0JMHhBQiwgMHgwNiwgMHhCRiwgMHhGQywgMHg3NSwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDE0LCAweDAwLCAweEFELCAweEZGLCAweEFBLCAweDAwLCAweDBDLCAweEZGLCAweEY3LCAweDAwLAotCTB4QzEsIDB4RkYsIDB4MzMsIDB4RkQsIDB4RUMsIDB4NDcsIDB4NTEsIDB4MEIsIDB4QUYsIDB4RjksIDB4MUQsCi0JMHgwNCwgMHg2QiwgMHhGRCwgMHg2RSwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLCAweEZGLAotCTB4MDYsIDB4QzQsIDB4RjIsIDB4QjAsIDB4MjMsIDB4M0IsIDB4M0IsIDB4QUQsIDB4RjIsIDB4QkYsIDB4MDUsCi0JMHg2NiwgMHhGRCwgMHgwRSwgMHgwMSwgMHhBQywgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywKLQkweDAwLCAweENFLCAweEZGLCAweDU0LCAweDAwLCAweEJELCAweEZGLCAweEIyLCAweEZGLCAweDAxLCAweDAyLAotCTB4Q0YsIDB4RjgsIDB4N0QsIDB4NDUsIDB4NkIsIDB4MTIsIDB4MzAsIDB4RjcsIDB4NDgsIDB4MDUsIDB4REQsCi0JMHhGQywgMHhBRCwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERFLCAweDAxLCAweDVGLCAweEZDLCAweDcwLCAweDA2LCAweDZDLAotCTB4RjQsIDB4RkQsIDB4MUIsIDB4N0QsIDB4NDAsIDB4QjcsIDB4RjQsIDB4NUQsIDB4MDQsIDB4NDksIDB4RkUsCi0JMHg4OCwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFRCwKLQkweEZGLCAweDA0LCAweDAwLCAweDYwLCAweDAwLCAweDkwLCAweEZFLCAweEVCLCAweDAzLCAweDcxLCAweEY1LAotCTB4QjcsIDB4NDEsIDB4RUQsIDB4MTksIDB4RjUsIDB4RjQsIDB4M0IsIDB4MDYsIDB4NzMsIDB4RkMsIDB4RDcsCi0JMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwKLQkweDQzLCAweEZGLCAweEJBLCAweDAxLCAweEJDLCAweEZDLCAweDkwLCAweDA1LCAweDhFLCAweEY2LCAweDY4LAotCTB4MTQsIDB4OTksIDB4NDQsIDB4Q0QsIDB4RjcsIDB4OEYsIDB4MDIsIDB4NjAsIDB4RkYsIDB4RUEsIDB4RkYsCi0JMHgzRSwgMHgwMCwgMHhENywgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhCRCwKLQkweEZGLCAweEVELCAweDAwLCAweDlFLCAweEZELCAweDZDLCAweDA1LCAweDFGLCAweEYzLCAweEMwLCAweDNDLAotCTB4OUUsIDB4MjEsIDB4MjgsIDB4RjMsIDB4RTIsIDB4MDYsIDB4M0EsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwKLQkweDgxLCAweDAxLCAweDQyLCAweEZELCAweDcyLCAweDA0LCAweEZGLCAweEY4LCAweDJELCAweDBELCAweDY5LAotCTB4NDcsIDB4RUIsIDB4RkIsIDB4NjMsIDB4MDAsIDB4OUQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OTMsIDB4MDAsCi0JMHhCNiwgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NCwgMHhGRiwgMHg1QywKLQkweDAxLCAweEU2LCAweEZDLCAweDc3LCAweDA2LCAweEQ0LCAweEYxLCAweEM2LCAweDM2LCAweDNFLCAweDI5LAotCTB4RjMsIDB4RjEsIDB4MjksIDB4MDcsIDB4MzgsIDB4RkMsIDB4RDcsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHgzNywgMHgwMSwKLQkweEU0LCAweEZELCAweDJDLCAweDAzLCAweDk0LCAweEZCLCAweDgzLCAweDA2LCAweENFLCAweDQ4LCAweDA1LAotCTB4MDEsIDB4RjUsIDB4RkQsIDB4RjAsIDB4MDEsIDB4ODcsIDB4RkUsIDB4RUEsIDB4MDAsIDB4OTQsIDB4RkYsCi0JMHgxQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1QSwgMHhGRiwgMHhBQywgMHgwMSwgMHg2RSwKLQkweEZDLCAweDBBLCAweDA3LCAweDdFLCAweEYxLCAweEZGLCAweDJGLCAweDhBLCAweDMwLCAweDdELCAweEYxLAotCTB4MDMsIDB4MDcsIDB4NzUsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFMywgMHgwMCwgMHg5NSwgMHhGRSwgMHhENSwgMHgwMSwKLQkweDI2LCAweEZFLCAweDk4LCAweDAwLCAweEJGLCAweDQ4LCAweDAwLCAweDA3LCAweDYxLCAweEZCLCAweDQ2LAotCTB4MDMsIDB4RDYsIDB4RkQsIDB4M0QsIDB4MDEsIDB4NzMsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEQSwgMHgwMSwgMHgzNiwgMHhGQywgMHgyNywKLQkweDA3LCAweDA1LCAweEYyLCAweEFBLCAweDI4LCAweDQ0LCAweDM3LCAweEU0LCAweEYxLCAweDY3LCAweDA2LAotCTB4RjIsIDB4RkMsIDB4NTUsIDB4MDEsIDB4ODgsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTEsCi0JMHgwMCwgMHhCOSwgMHhGRiwgMHg4QywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4MywgMHgwMCwgMHg5MSwgMHgwMCwKLQkweDkxLCAweEZCLCAweDNELCAweDQ3LCAweEI3LCAweDBELCAweENELCAweEY4LCAweDg5LCAweDA0LCAweDM2LAotCTB4RkQsIDB4ODYsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQywgMHhGQywgMHhEOCwgMHgwNiwgMHg0NywKLQkweEYzLCAweDA2LCAweDIxLCAweDJBLCAweDNELCAweDQ0LCAweEYzLCAweDUyLCAweDA1LCAweEFFLCAweEZELAotCTB4RTMsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDksCi0JMHhGRiwgMHgzNywgMHgwMCwgMHhGNywgMHhGRiwgMHg0OSwgMHhGRiwgMHhCNiwgMHgwMiwgMHg4NiwgMHhGNywKLQkweDUzLCAweDQ0LCAweEZCLCAweDE0LCAweDYxLCAweEY2LCAweEE0LCAweDA1LCAweEI0LCAweEZDLCAweEJFLAotCTB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHgzQSwgMHhGRiwgMHhENCwgMHgwMSwgMHg3QSwgMHhGQywgMHgyQiwgMHgwNiwgMHgxRSwgMHhGNSwgMHg1NiwKLQkweDE5LCAweDBDLCAweDQyLCAweEFBLCAweEY1LCAweEM5LCAweDAzLCAweEE0LCAweEZFLCAweDU0LCAweDAwLAotCTB4MDksIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RUEsCi0JMHhGRiwgMHg5MywgMHgwMCwgMHgzNiwgMHhGRSwgMHg3RCwgMHgwNCwgMHg4NSwgMHhGNCwgMHgxRiwgMHg0MCwKLQkweDk0LCAweDFDLCAweDQ3LCAweEY0LCAweDdFLCAweDA2LCAweDVBLCAweEZDLCAweERGLCAweDAxLCAweDM3LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsCi0JMHhBOSwgMHgwMSwgMHhFNywgMHhGQywgMHgzMywgMHgwNSwgMHg2MCwgMHhGNywgMHhEQSwgMHgxMSwgMHhCOCwKLQkweDQ1LCAweDFDLCAweEY5LCAweEQ4LCAweDAxLCAweENBLCAweEZGLCAweEFGLCAweEZGLCAweDVBLCAweDAwLAotCTB4Q0MsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTcsCi0JMHgwMSwgMHg1NywgMHhGRCwgMHhENiwgMHgwNSwgMHg5MCwgMHhGMiwgMHhDOCwgMHgzQSwgMHg0NiwgMHgyNCwKLQkweEFBLCAweEYyLCAweDA2LCAweDA3LCAweDMyLCAweEZDLCAweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NjksIDB4MDEsCi0JMHg3NywgMHhGRCwgMHgwNCwgMHgwNCwgMHhFMiwgMHhGOSwgMHhDQiwgMHgwQSwgMHgwRCwgMHg0OCwgMHg5NCwKLQkweEZELCAweDkyLCAweEZGLCAweDEwLCAweDAxLCAweEZFLCAweEZFLCAweEIxLCAweDAwLCAweEFBLCAweEZGLAotCTB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzQsIDB4RkYsIDB4N0MsIDB4MDEsIDB4QjUsCi0JMHhGQywgMHhCOCwgMHgwNiwgMHg5QywgMHhGMSwgMHg4MSwgMHgzNCwgMHhEMSwgMHgyQiwgMHhCMywgMHhGMSwKLQkweDI5LCAweDA3LCAweDQ2LCAweEZDLCAweENBLCAweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4MUIsIDB4MDEsIDB4MjAsIDB4RkUsCi0JMHhCNiwgMHgwMiwgMHg3QSwgMHhGQywgMHg1RiwgMHgwNCwgMHhGNCwgMHg0OCwgMHhGRiwgMHgwMiwgMHgxMywKLQkweEZELCAweDY3LCAweDAyLCAweDQ5LCAweEZFLCAweDA3LCAweDAxLCAweDg4LCAweEZGLCAweDFELCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QzAsIDB4MDEsIDB4NTMsIDB4RkMsIDB4MjEsCi0JMHgwNywgMHg5NiwgMHhGMSwgMHg4MiwgMHgyRCwgMHhGMiwgMHgzMiwgMHg4NiwgMHhGMSwgMHhEQiwgMHgwNiwKLQkweDk5LCAweEZDLCAweDhFLCAweDAxLCAweDZBLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweDE2LAotCTB4MDAsIDB4QTIsIDB4RkYsIDB4QzUsIDB4MDAsIDB4RDQsIDB4RkUsIDB4NUYsIDB4MDEsIDB4MDMsIDB4RkYsCi0JMHhCRiwgMHhGRSwgMHg2MywgMHg0OCwgMHg0MCwgMHgwOSwgMHg3QiwgMHhGQSwgMHhCOSwgMHgwMywgMHg5RCwKLQkweEZELCAweDU4LCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTcsIDB4MDcsIDB4NjEsCi0JMHhGMiwgMHgwQSwgMHgyNiwgMHg2QSwgMHgzOSwgMHg0MSwgMHhGMiwgMHgxNSwgMHgwNiwgMHgyQywgMHhGRCwKLQkweDMxLCAweDAxLCAweDlCLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweDBFLCAweDAwLCAweEM0LAotCTB4RkYsIDB4NkUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MTMsIDB4MDAsIDB4NTgsIDB4MDEsIDB4MEQsIDB4RkEsCi0JMHg2MSwgMHg0NiwgMHgyRCwgMHgxMCwgMHhGMCwgMHhGNywgMHhGMSwgMHgwNCwgMHgwNSwgMHhGRCwgMHg5QywKLQkweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEMsIDB4RkMsIDB4QTYsIDB4MDYsIDB4REIsIDB4RjMsIDB4NUIsCi0JMHgxRSwgMHhGQywgMHgzRSwgMHhGQSwgMHhGMywgMHhENywgMHgwNCwgMHhGRCwgMHhGRCwgMHhCNCwgMHgwMCwKLQkweEQ5LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweDA4LCAweDAwLCAweEU0LCAweEZGLCAweDFCLAotCTB4MDAsIDB4MzAsIDB4MDAsIDB4RTQsIDB4RkUsIDB4NUYsIDB4MDMsIDB4NUUsIDB4RjYsIDB4MDIsIDB4NDMsCi0JMHg5NiwgMHgxNywgMHg5QiwgMHhGNSwgMHhGOCwgMHgwNSwgMHg4RiwgMHhGQywgMHhDQywgMHgwMSwgMHgzRCwKLQkweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNFLCAweEZGLAotCTB4QzgsIDB4MDEsIDB4OUIsIDB4RkMsIDB4REQsIDB4MDUsIDB4REMsIDB4RjUsIDB4QjYsIDB4MTYsIDB4NzcsCi0JMHg0MywgMHhCRCwgMHhGNiwgMHgyOCwgMHgwMywgMHgwNSwgMHhGRiwgMHgxRCwgMHgwMCwgMHgyNSwgMHgwMCwKLQkweEUxLCAweEZGLCAweDA4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEZGLCAweEM0LAotCTB4MDAsIDB4RTIsIDB4RkQsIDB4MDEsIDB4MDUsIDB4QkEsIDB4RjMsIDB4NjQsIDB4M0UsIDB4M0YsIDB4MUYsCi0JMHhBOCwgMHhGMywgMHhCOCwgMHgwNiwgMHg0NiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUxLCAweEZGLCAweDk1LCAweDAxLAotCTB4MTUsIDB4RkQsIDB4Q0YsIDB4MDQsIDB4MzksIDB4RjgsIDB4NTksIDB4MEYsIDB4QUYsIDB4NDYsIDB4OEIsCi0JMHhGQSwgMHgxNywgMHgwMSwgMHgzOCwgMHgwMCwgMHg3MywgMHhGRiwgMHg3OCwgMHgwMCwgMHhDMCwgMHhGRiwKLQkweDBGLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk0LCAweEZGLCAweDNELCAweDAxLCAweDE4LAotCTB4RkQsIDB4MzIsIDB4MDYsIDB4MUYsIDB4RjIsIDB4QjUsIDB4MzgsIDB4RUIsIDB4MjYsIDB4NDAsIDB4RjIsCi0JMHgxRSwgMHgwNywgMHgzMiwgMHhGQywgMHhERiwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDRGLCAweDAxLCAweEIwLCAweEZELAotCTB4OTMsIDB4MDMsIDB4QzcsIDB4RkEsIDB4N0QsIDB4MDgsIDB4ODYsIDB4NDgsIDB4NUEsIDB4RkYsIDB4QkEsCi0JMHhGRSwgMHg4NiwgMHgwMSwgMHhCRiwgMHhGRSwgMHhDRiwgMHgwMCwgMHg5RSwgMHhGRiwgMHgxNywgMHgwMCwKLQkweEZELCAweEZGLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk3LCAweDAxLCAweDhDLCAweEZDLCAweEVBLAotCTB4MDYsIDB4ODAsIDB4RjEsIDB4MjYsIDB4MzIsIDB4NTgsIDB4MkUsIDB4OEIsIDB4RjEsIDB4MUIsIDB4MDcsCi0JMHg1QiwgMHhGQywgMHhCQSwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQywKLQkweDAwLCAweDhDLCAweEZGLCAweEZFLCAweDAwLCAweDVELCAweEZFLCAweDNGLCAweDAyLCAweDVFLCAweEZELAotCTB4NTQsIDB4MDIsIDB4RUMsIDB4NDgsIDB4MTMsIDB4MDUsIDB4MkUsIDB4RkMsIDB4REUsIDB4MDIsIDB4MEMsCi0JMHhGRSwgMHgyNCwgMHgwMSwgMHg3RCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDMxLCAweDAwLCAweDQ3LCAweEZGLCAweENGLCAweDAxLCAweDQwLCAweEZDLCAweDJBLCAweDA3LCAweEM2LAotCTB4RjEsIDB4RjcsIDB4MkEsIDB4NDYsIDB4MzUsIDB4QUIsIDB4RjEsIDB4QTQsIDB4MDYsIDB4QzQsIDB4RkMsCi0JMHg3MiwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBRSwKLQkweEZGLCAweEE3LCAweDAwLCAweDEyLCAweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLCAweEZELAotCTB4REMsIDB4NDcsIDB4OTUsIDB4MEIsIDB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsIDB4NzEsCi0JMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM0LCAweEZDLCAweEZCLCAweDA2LCAweEQyLCAweEYyLCAweDY0LAotCTB4MjMsIDB4NzMsIDB4M0IsIDB4QkMsIDB4RjIsIDB4QjQsIDB4MDUsIDB4NkUsIDB4RkQsIDB4MDksIDB4MDEsCi0JMHhBRiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwKLQkweDAwLCAweEMzLCAweEZGLCAweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LAotCTB4QjIsIDB4MTIsIDB4MTksIDB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwKLQkweERELCAweDAxLCAweDYyLCAweEZDLCAweDY5LCAweDA2LCAweDdGLCAweEY0LCAweEIyLCAweDFCLCAweEFCLAotCTB4NDAsIDB4RDAsIDB4RjQsIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkUsIDB4ODMsIDB4MDAsIDB4RjIsIDB4RkYsCi0JMHhGNCwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwKLQkweDAwLCAweDg1LCAweEZFLCAweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLAotCTB4RTEsIDB4RjQsIDB4NDMsIDB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCOSwgMHgwMSwKLQkweEMxLCAweEZDLCAweDg2LCAweDA1LCAweEE1LCAweEY2LCAweDFFLCAweDE0LCAweEJBLCAweDQ0LCAweEYwLAotCTB4RjcsIDB4N0IsIDB4MDIsIDB4NkIsIDB4RkYsIDB4RTQsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RDYsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwKLQkweEZELCAweDc4LCAweDA1LCAweDBFLCAweEYzLCAweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLAotCTB4RTYsIDB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1QSwgMHhGRiwgMHg3RSwgMHgwMSwgMHg0OCwgMHhGRCwKLQkweDY2LCAweDA0LCAweDE4LCAweEY5LCAweEU4LCAweDBDLCAweDdDLCAweDQ3LCAweDE5LCAweEZDLCAweDRELAotCTB4MDAsIDB4QTksIDB4MDAsIDB4MzUsIDB4RkYsIDB4OTYsIDB4MDAsIDB4QjUsIDB4RkYsIDB4MTIsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg2MCwgMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwKLQkweDA2LCAweENDLCAweEYxLCAweDg1LCAweDM2LCAweDg3LCAweDI5LCAweEVCLCAweEYxLCAweDJBLCAweDA3LAotCTB4MzksIDB4RkMsIDB4RDYsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyMiwgMHgwMCwgMHg3NywgMHhGRiwgMHgzNCwgMHgwMSwgMHhFQSwgMHhGRCwgMHgxRiwgMHgwMywKLQkweEFFLCAweEZCLCAweDQ1LCAweDA2LCAweEQ1LCAweDQ4LCAweDNDLCAweDAxLCAweERDLCAweEZELCAweEZELAotCTB4MDEsIDB4ODAsIDB4RkUsIDB4RUQsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QSwgMHhGQywgMHgwRCwgMHgwNywgMHg4MCwKLQkweEYxLCAweEI4LCAweDJGLCAweENGLCAweDMwLCAweDdELCAweEYxLCAweEZGLCAweDA2LCAweDc4LCAweEZDLAotCTB4QTUsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTgsCi0JMHhGRiwgMHhFMCwgMHgwMCwgMHg5QywgMHhGRSwgMHhDOCwgMHgwMSwgMHgzRiwgMHhGRSwgMHg2MiwgMHgwMCwKLQkweEI4LCAweDQ4LCAweDNGLCAweDA3LCAweDQ3LCAweEZCLCAweDUzLCAweDAzLCAweEQwLCAweEZELCAweDQwLAotCTB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHg0MCwgMHhGRiwgMHhEQiwgMHgwMSwgMHgzNSwgMHhGQywgMHgyNiwgMHgwNywgMHgwRSwgMHhGMiwgMHg2MCwKLQkweDI4LCAweDgyLCAweDM3LCAweEVELCAweEYxLCAweDVFLCAweDA2LCAweEY4LCAweEZDLCAweDUxLCAweDAxLAotCTB4OEEsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QkEsIDB4RkYsIDB4ODksCi0JMHgwMCwgMHg1MSwgMHhGRiwgMHg3NywgMHgwMCwgMHhBNywgMHgwMCwgMHg2NCwgMHhGQiwgMHgyNiwgMHg0NywKLQkweEZDLCAweDBELCAweEI0LCAweEY4LCAweDk1LCAweDA0LCAweDMxLCAweEZELCAweDg4LCAweDAxLCAweDU2LAotCTB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCi0JMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMywgMHgwNiwgMHg1NiwgMHhGMywgMHhCQSwgMHgyMCwgMHg2MSwKLQkweDNELCAweDU2LCAweEYzLCAweDQ1LCAweDA1LCAweEI3LCAweEZELCAweERFLCAweDAwLCAweEM1LCAweEZGLAotCTB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDksIDB4MDAsIDB4REIsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzRCwgMHhGRiwgMHhDOSwgMHgwMiwgMHg2NCwgMHhGNywgMHgyRiwgMHg0NCwgMHg0NCwgMHgxNSwKLQkweDRBLCAweEY2LCAweEFELCAweDA1LCAweEFGLCAweEZDLCAweEMwLCAweDAxLCAweDQxLCAweEZGLCAweDMyLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDMsIDB4MDEsCi0JMHg3RCwgMHhGQywgMHgyMywgMHgwNiwgMHgzMiwgMHhGNSwgMHgwQywgMHgxOSwgMHgzOCwgMHg0MiwgMHhDNywKLQkweEY1LCAweEI4LCAweDAzLCAweEFGLCAweEZFLCAweDRFLCAweDAwLCAweDBDLCAweDAwLCAweEVBLCAweEZGLAotCTB4MDYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RTcsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkMsCi0JMHhGRSwgMHg4QywgMHgwNCwgMHg2RCwgMHhGNCwgMHhGMCwgMHgzRiwgMHhFMCwgMHgxQywgMHgzNCwgMHhGNCwKLQkweDg1LCAweDA2LCAweDU3LCAweEZDLCAweEUwLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEEsIDB4RkYsIDB4QTcsIDB4MDEsIDB4RUMsIDB4RkMsCi0JMHgyOCwgMHgwNSwgMHg3NywgMHhGNywgMHg5MiwgMHgxMSwgMHhENywgMHg0NSwgMHg0MywgMHhGOSwgMHhDMywKLQkweDAxLCAweEQ2LCAweEZGLCAweEE5LCAweEZGLCAweDVFLCAweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MUIsIDB4MDEsIDB4NTAsIDB4RkQsIDB4RTEsCi0JMHgwNSwgMHg4MiwgMHhGMiwgMHg4RiwgMHgzQSwgMHg5MiwgMHgyNCwgMHg5RCwgMHhGMiwgMHgwOSwgMHgwNywKLQkweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4NjYsIDB4MDEsIDB4N0QsIDB4RkQsIDB4RjgsIDB4MDMsCi0JMHhGQiwgMHhGOSwgMHg4OSwgMHgwQSwgMHgxRCwgMHg0OCwgMHhDNSwgMHhGRCwgMHg3QSwgMHhGRiwgMHgxRCwKLQkweDAxLCAweEY3LCAweEZFLCAweEI0LCAweDAwLCAweEE5LCAweEZGLCAweDE1LCAweDAwLCAweEZFLCAweEZGLAotCTB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4N0YsIDB4MDEsIDB4QjAsIDB4RkMsIDB4QkUsIDB4MDYsIDB4OTcsCi0JMHhGMSwgMHgzRiwgMHgzNCwgMHgxOSwgMHgyQywgMHhBRCwgMHhGMSwgMHgyOCwgMHgwNywgMHg0OCwgMHhGQywKLQkweEM5LCAweDAxLCAweDRCLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDFGLAotCTB4MDAsIDB4ODIsIDB4RkYsIDB4MTgsIDB4MDEsIDB4MjcsIDB4RkUsIDB4QTksIDB4MDIsIDB4OTQsIDB4RkMsCi0JMHgyNCwgMHgwNCwgMHhGNSwgMHg0OCwgMHgzOSwgMHgwMywgMHhGOSwgMHhGQywgMHg3NCwgMHgwMiwgMHg0MiwKLQkweEZFLCAweDBCLCAweDAxLCAweDg3LCAweEZGLCAweDFFLCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLAotCTB4NEYsIDB4RkYsIDB4QzIsIDB4MDEsIDB4NTEsIDB4RkMsIDB4MjMsIDB4MDcsIDB4OUEsIDB4RjEsIDB4M0EsCi0JMHgyRCwgMHgzNSwgMHgzMywgMHg4OSwgMHhGMSwgMHhENSwgMHgwNiwgMHg5RCwgMHhGQywgMHg4QiwgMHgwMSwKLQkweDZDLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMyLAotCTB4MDAsIDB4REIsIDB4RkUsIDB4NTIsIDB4MDEsIDB4MUIsIDB4RkYsIDB4OEQsIDB4RkUsIDB4NTcsIDB4NDgsCi0JMHg4MSwgMHgwOSwgMHg2MSwgMHhGQSwgMHhDNiwgMHgwMywgMHg5NiwgMHhGRCwgMHg1QiwgMHgwMSwgMHg2OCwKLQkweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLAotCTB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTUsIDB4MDcsIDB4NkQsIDB4RjIsIDB4QkYsIDB4MjUsIDB4QTUsCi0JMHgzOSwgMHg0RCwgMHhGMiwgMHgwQiwgMHgwNiwgMHgzMywgMHhGRCwgMHgyRCwgMHgwMSwgMHg5RCwgMHhGRiwKLQkweDEzLCAweDAwLCAweEZGLCAweEZGLCAweDBFLCAweDAwLCAweEM2LCAweEZGLCAweDZCLCAweDAwLCAweDhFLAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4NkUsIDB4MDEsIDB4RTQsIDB4RjksIDB4NDgsIDB4NDYsIDB4NzUsIDB4MTAsCi0JMHhENywgMHhGNywgMHhGQywgMHgwNCwgMHgwMCwgMHhGRCwgMHg5RSwgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwKLQkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLAotCTB4NEUsIDB4RkMsIDB4QTAsIDB4MDYsIDB4RUQsIDB4RjMsIDB4MEYsIDB4MUUsIDB4MkQsIDB4M0YsIDB4MTAsCi0JMHhGNCwgMHhDOCwgMHgwNCwgMHgwNywgMHhGRSwgMHhBRiwgMHgwMCwgMHhEQywgMHhGRiwgMHhGQywgMHhGRiwKLQkweDAzLCAweDAwLCAweDA3LCAweDAwLCAweEU1LCAweEZGLCAweDE4LCAweDAwLCAweDM2LCAweDAwLCAweEQ5LAotCTB4RkUsIDB4NzEsIDB4MDMsIDB4M0YsIDB4RjYsIDB4REIsIDB4NDIsIDB4RTAsIDB4MTcsIDB4ODYsIDB4RjUsCi0JMHgwMCwgMHgwNiwgMHg4QywgMHhGQywgMHhDRSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM2LCAweDAxLCAweDlGLCAweEZDLAotCTB4RDMsIDB4MDUsIDB4RjEsIDB4RjUsIDB4NkMsIDB4MTYsIDB4OUUsIDB4NDMsIDB4REQsIDB4RjYsIDB4MTUsCi0JMHgwMywgMHgxMCwgMHhGRiwgMHgxNywgMHgwMCwgMHgyOCwgMHgwMCwgMHhERiwgMHhGRiwgMHgwOSwgMHgwMCwKLQkweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENGLCAweEZGLCAweEM5LCAweDAwLCAweERBLCAweEZELCAweDBGLAotCTB4MDUsIDB4QTUsIDB4RjMsIDB4MzEsIDB4M0UsIDB4OEEsIDB4MUYsIDB4OTcsIDB4RjMsIDB4QkQsIDB4MDYsCi0JMHg0NCwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDJELCAweDAwLCAweDUyLCAweEZGLCAweDkyLCAweDAxLCAweDFCLCAweEZELCAweEM0LCAweDA0LAotCTB4NTEsIDB4RjgsIDB4MTMsIDB4MEYsIDB4QzgsIDB4NDYsIDB4QjYsIDB4RkEsIDB4MDEsIDB4MDEsIDB4NDQsCi0JMHgwMCwgMHg2QywgMHhGRiwgMHg3QiwgMHgwMCwgMHhCRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDE3LCAweDAwLCAweDkyLCAweEZGLCAweDQxLCAweDAxLCAweDExLCAweEZELCAweDNCLCAweDA2LCAweDE0LAotCTB4RjIsIDB4NzgsIDB4MzgsIDB4MzYsIDB4MjcsIDB4MzUsIDB4RjIsIDB4MjAsIDB4MDcsIDB4MzMsIDB4RkMsCi0JMHhERiwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwKLQkweDAwLCAweDZELCAweEZGLCAweDRDLCAweDAxLCAweEI2LCAweEZELCAweDg2LCAweDAzLCAweEUxLCAweEZBLAotCTB4M0QsIDB4MDgsIDB4OTIsIDB4NDgsIDB4OEUsIDB4RkYsIDB4QTEsIDB4RkUsIDB4OTMsIDB4MDEsIDB4QjgsCi0JMHhGRSwgMHhEMywgMHgwMCwgMHg5RCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwKLQkweDY0LCAweEZGLCAweDlBLCAweDAxLCAweDg4LCAweEZDLCAweEVFLCAweDA2LCAweDdFLCAweEYxLCAweEUzLAotCTB4MzEsIDB4OUYsIDB4MkUsIDB4ODgsIDB4RjEsIDB4MTksIDB4MDcsIDB4NUUsIDB4RkMsIDB4QjcsIDB4MDEsCi0JMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RCwgMHhGRiwgMHhGQSwKLQkweDAwLCAweDY0LCAweEZFLCAweDMyLCAweDAyLCAweDc4LCAweEZELCAweDFCLCAweDAyLCAweEVBLCAweDQ4LAotCTB4NTAsIDB4MDUsIDB4MTQsIDB4RkMsIDB4RUIsIDB4MDIsIDB4MDUsIDB4RkUsIDB4MjcsIDB4MDEsIDB4N0MsCi0JMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NiwgMHhGRiwKLQkweEQxLCAweDAxLCAweDNGLCAweEZDLCAweDJCLCAweDA3LCAweENELCAweEYxLCAweEFFLCAweDJBLCAweDg2LAotCTB4MzUsIDB4QjEsIDB4RjEsIDB4OUQsIDB4MDYsIDB4Q0EsIDB4RkMsIDB4NkUsIDB4MDEsIDB4N0IsIDB4RkYsCi0JMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMywgMHgwMCwgMHhBRiwgMHhGRiwgMHhBNCwgMHgwMCwgMHgxOSwKLQkweEZGLCAweERELCAweDAwLCAweEYwLCAweEZGLCAweEQ0LCAweEZDLCAweEM5LCAweDQ3LCAweEQ4LCAweDBCLAotCTB4N0MsIDB4RjksIDB4MzUsIDB4MDQsIDB4NUYsIDB4RkQsIDB4NzQsIDB4MDEsIDB4NUUsIDB4RkYsIDB4MjksCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwKLQkweDM1LCAweEZDLCAweEY3LCAweDA2LCAweEUwLCAweEYyLCAweDE4LCAweDIzLCAweEFCLCAweDNCLCAweENDLAotCTB4RjIsIDB4QTgsIDB4MDUsIDB4NzYsIDB4RkQsIDB4MDQsIDB4MDEsIDB4QjEsIDB4RkYsIDB4MEMsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhEMSwgMHhGRiwgMHg0RSwgMHgwMCwgMHhDQSwgMHhGRiwgMHg5QSwKLQkweEZGLCAweDJBLCAweDAyLCAweDgzLCAweEY4LCAweDNGLCAweDQ1LCAweEZCLCAweDEyLCAweDAxLCAweEY3LAotCTB4NUQsIDB4MDUsIDB4RDMsIDB4RkMsIDB4QjEsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQywgMHgwMSwgMHg2NCwgMHhGQywKLQkweDYyLCAweDA2LCAweDkzLCAweEY0LCAweDY2LCAweDFCLCAweEQ5LCAweDQwLCAweEVBLCAweEY0LCAweDNFLAotCTB4MDQsIDB4NUQsIDB4RkUsIDB4N0QsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHgwNSwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHg2QywgMHgwMCwgMHg3QiwgMHhGRSwgMHgwQywKLQkweDA0LCAweDNBLCAweEY1LCAweDVGLCAweDQxLCAweDgzLCAweDFBLCAweENELCAweEY0LCAweDRCLCAweDA2LAotCTB4NkQsIDB4RkMsIDB4RDksIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgzMSwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCNywgMHgwMSwgMHhDNSwgMHhGQywgMHg3QywgMHgwNSwKLQkweEJDLCAweEY2LCAweEQ1LCAweDEzLCAweERDLCAweDQ0LCAweDE0LCAweEY4LCAweDY3LCAweDAyLCAweDc3LAotCTB4RkYsIDB4REQsIDB4RkYsIDB4NDQsIDB4MDAsIDB4RDUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhCOCwgMHhGRiwgMHhGNiwgMHgwMCwgMHg4RCwgMHhGRCwgMHg4NCwgMHgwNSwgMHhGRCwKLQkweEYyLCAweDUyLCAweDNDLCAweDM1LCAweDIyLCAweDBCLCAweEYzLCAweEVCLCAweDA2LCAweDM3LCAweEZDLAotCTB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkEsCi0JMHgwMCwgMHg1QiwgMHhGRiwgMHg3QywgMHgwMSwgMHg0RSwgMHhGRCwgMHg1QSwgMHgwNCwgMHgzMSwgMHhGOSwKLQkweEE0LCAweDBDLCAweDkwLCAweDQ3LCAweDQ3LCAweEZDLCAweDM2LCAweDAwLCAweEI2LCAweDAwLCAweDJFLAotCTB4RkYsIDB4OTksIDB4MDAsIDB4QjMsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHg4MCwgMHhGRiwgMHg2NCwgMHgwMSwgMHhEQSwgMHhGQywgMHg4NywgMHgwNiwgMHhDNSwgMHhGMSwgMHg0NiwKLQkweDM2LCAweEQxLCAweDI5LCAweEUzLCAweEYxLCAweDJBLCAweDA3LCAweDNBLCAweEZDLCAweEQ1LCAweDAxLAotCTB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzgsCi0JMHhGRiwgMHgzMSwgMHgwMSwgMHhGMSwgMHhGRCwgMHgxMiwgMHgwMywgMHhDNywgMHhGQiwgMHgwNywgMHgwNiwKLQkweERCLCAweDQ4LCAweDczLCAweDAxLCAweEMzLCAweEZELCAweDBBLCAweDAyLCAweDc5LCAweEZFLCAweEYxLAotCTB4MDAsIDB4OTEsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTgsIDB4RkYsCi0JMHhCMSwgMHgwMSwgMHg2NywgMHhGQywgMHgxMCwgMHgwNywgMHg4MSwgMHhGMSwgMHg3MywgMHgyRiwgMHgxNSwKLQkweDMxLCAweDdDLCAweEYxLCAweEZCLCAweDA2LCAweDdDLCAweEZDLCAweEEyLCAweDAxLCAweDYwLCAweEZGLAotCTB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTksIDB4RkYsIDB4REQsIDB4MDAsIDB4QTMsCi0JMHhGRSwgMHhCQiwgMHgwMSwgMHg1OCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhBRiwgMHg0OCwgMHg3RSwgMHgwNywKLQkweDJFLCAweEZCLCAweDYwLCAweDAzLCAweEM5LCAweEZELCAweDQzLCAweDAxLCAweDcxLCAweEZGLCAweDI0LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REMsIDB4MDEsCi0JMHgzNCwgMHhGQywgMHgyNSwgMHgwNywgMHgxOCwgMHhGMiwgMHgxNSwgMHgyOCwgMHhCRiwgMHgzNywgMHhGNywKLQkweEYxLCAweDU2LCAweDA2LCAweEZFLCAweEZDLCAweDRELCAweDAxLCAweDhDLCAweEZGLCAweDE5LCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkIsIDB4RkYsIDB4ODUsIDB4MDAsIDB4NTgsIDB4RkYsIDB4NkEsCi0JMHgwMCwgMHhCRSwgMHgwMCwgMHgzOCwgMHhGQiwgMHgwRiwgMHg0NywgMHg0MiwgMHgwRSwgMHg5QiwgMHhGOCwKLQkweEExLCAweDA0LCAweDJCLCAweEZELCAweDhCLCAweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0YsIDB4RkMsCi0JMHhDRSwgMHgwNiwgMHg2NiwgMHhGMywgMHg2RiwgMHgyMCwgMHg5NiwgMHgzRCwgMHg2OSwgMHhGMywgMHgzOCwKLQkweDA1LCAweEJGLCAweEZELCAweEQ5LCAweDAwLCAweEM3LCAweEZGLCAweDA0LCAweDAwLCAweDAyLCAweDAwLAotCTB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MzEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MzIsIDB4RkYsIDB4REMsCi0JMHgwMiwgMHg0MiwgMHhGNywgMHgwQiwgMHg0NCwgMHg4RSwgMHgxNSwgMHgzNCwgMHhGNiwgMHhCNywgMHgwNSwKLQkweEFCLCAweEZDLCAweEMxLCAweDAxLCAweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDIsIDB4MDEsIDB4ODEsIDB4RkMsIDB4MUEsIDB4MDYsCi0JMHg0NywgMHhGNSwgMHhDMSwgMHgxOCwgMHg2MCwgMHg0MiwgMHhFNCwgMHhGNSwgMHhBNiwgMHgwMywgMHhCOSwKLQkweEZFLCAweDQ4LCAweDAwLCAweDBGLCAweDAwLCAweEU5LCAweEZGLCAweDA3LCAweDAwLCAweDA0LCAweDAwLAotCTB4RjksIDB4RkYsIDB4RTQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjMsIDB4RkUsIDB4OUIsIDB4MDQsIDB4NTUsCi0JMHhGNCwgMHhDMCwgMHgzRiwgMHgyQywgMHgxRCwgMHgyMiwgMHhGNCwgMHg4QywgMHgwNiwgMHg1NSwgMHhGQywKLQkweEUxLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJGLAotCTB4MDAsIDB4NEIsIDB4RkYsIDB4QTQsIDB4MDEsIDB4RjEsIDB4RkMsIDB4MUQsIDB4MDUsIDB4OEYsIDB4RjcsCi0JMHg0QSwgMHgxMSwgMHhGMiwgMHg0NSwgMHg2QiwgMHhGOSwgMHhBRSwgMHgwMSwgMHhFMiwgMHhGRiwgMHhBMiwKLQkweEZGLCAweDYxLCAweDAwLCAweEM5LCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDAwLAotCTB4QTMsIDB4RkYsIDB4MjAsIDB4MDEsIDB4NDksIDB4RkQsIDB4RUIsIDB4MDUsIDB4NzQsIDB4RjIsIDB4NTQsCi0JMHgzQSwgMHhERCwgMHgyNCwgMHg5MSwgMHhGMiwgMHgwQywgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwKLQkweDNBLCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY0LAotCTB4RkYsIDB4NjMsIDB4MDEsIDB4ODQsIDB4RkQsIDB4RUIsIDB4MDMsIDB4MTQsIDB4RkEsIDB4NDcsIDB4MEEsCi0JMHgyQywgMHg0OCwgMHhGNiwgMHhGRCwgMHg2MywgMHhGRiwgMHgyQiwgMHgwMSwgMHhGMCwgMHhGRSwgMHhCOCwKLQkweDAwLCAweEE4LCAweEZGLCAweDE1LCAweDAwLCAweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcxLCAweEZGLAotCTB4ODIsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QzQsIDB4MDYsIDB4OTMsIDB4RjEsIDB4RkQsIDB4MzMsIDB4NjIsCi0JMHgyQywgMHhBOCwgMHhGMSwgMHgyNywgMHgwNywgMHg0QSwgMHhGQywgMHhDNywgMHgwMSwgMHg0QywgMHhGRiwKLQkweDMwLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgzLCAweEZGLCAweDE0LAotCTB4MDEsIDB4MkQsIDB4RkUsIDB4OUMsIDB4MDIsIDB4QUQsIDB4RkMsIDB4RTksIDB4MDMsIDB4RjYsIDB4NDgsCi0JMHg3MywgMHgwMywgMHhFMCwgMHhGQywgMHg4MiwgMHgwMiwgMHgzQiwgMHhGRSwgMHgwRSwgMHgwMSwgMHg4NiwKLQkweEZGLCAweDFFLCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLCAweDRFLCAweEZGLCAweEMzLCAweDAxLAotCTB4NEUsIDB4RkMsIDB4MjQsIDB4MDcsIDB4OUUsIDB4RjEsIDB4RjIsIDB4MkMsIDB4NzgsIDB4MzMsIDB4OEMsCi0JMHhGMSwgMHhEMCwgMHgwNiwgMHhBMiwgMHhGQywgMHg4OCwgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNCwgMHgwMCwKLQkweEZELCAweEZGLCAweDE2LCAweDAwLCAweEE1LCAweEZGLCAweEJFLCAweDAwLCAweEUyLCAweEZFLCAweDQ1LAotCTB4MDEsIDB4MzMsIDB4RkYsIDB4NUEsIDB4RkUsIDB4NDgsIDB4NDgsIDB4QzMsIDB4MDksIDB4NDcsIDB4RkEsCi0JMHhEMiwgMHgwMywgMHg5MCwgMHhGRCwgMHg1RSwgMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLAotCTB4MTIsIDB4MDcsIDB4NzksIDB4RjIsIDB4NzMsIDB4MjUsIDB4REYsIDB4MzksIDB4NUEsIDB4RjIsIDB4MDAsCi0JMHgwNiwgMHgzQSwgMHhGRCwgMHgyOCwgMHgwMSwgMHg5RiwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBFLCAweDAwLCAweEM3LCAweEZGLCAweDY4LCAweDAwLCAweDk1LCAweEZGLCAweEZBLCAweEZGLCAweDgzLAotCTB4MDEsIDB4QkIsIDB4RjksIDB4MkIsIDB4NDYsIDB4QkIsIDB4MTAsIDB4QkYsIDB4RjcsIDB4MDcsIDB4MDUsCi0JMHhGQiwgMHhGQywgMHhBMCwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKLQkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDUwLCAweEZDLCAweDk5LCAweDA2LAotCTB4RkUsIDB4RjMsIDB4QzMsIDB4MUQsIDB4NUUsIDB4M0YsIDB4MjcsIDB4RjQsIDB4QjksIDB4MDQsIDB4MTAsCi0JMHhGRSwgMHhBOSwgMHgwMCwgMHhERiwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwKLQkweEU2LCAweEZGLCAweDE1LCAweDAwLCAweDNDLCAweDAwLCAweENGLCAweEZFLCAweDgzLCAweDAzLCAweDIwLAotCTB4RjYsIDB4QjIsIDB4NDIsIDB4MkIsIDB4MTgsIDB4NzEsIDB4RjUsIDB4MDksIDB4MDYsIDB4ODgsIDB4RkMsCi0JMHhDRiwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywKLQkweDAwLCAweDNGLCAweEZGLCAweEM1LCAweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LCAweEY2LAotCTB4MjIsIDB4MTYsIDB4QzMsIDB4NDMsIDB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsIDB4MTEsCi0JMHgwMCwgMHgyQiwgMHgwMCwgMHhERSwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweENDLCAweEZGLCAweENFLCAweDAwLCAweEQxLCAweEZELCAweDFELCAweDA1LCAweDkxLCAweEYzLCAweEZFLAotCTB4M0QsIDB4RDcsIDB4MUYsIDB4ODcsIDB4RjMsIDB4QzMsIDB4MDYsIDB4NDIsIDB4RkMsIDB4RTUsIDB4MDEsCi0JMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywKLQkweEZGLCAweDkwLCAweDAxLCAweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLAotCTB4RTEsIDB4NDYsIDB4RTEsIDB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsCi0JMHgwMCwgMHhCRSwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5MCwgMHhGRiwKLQkweDQ1LCAweDAxLCAweDBCLCAweEZELCAweDQ0LCAweDA2LCAweDBBLCAweEYyLCAweDNCLCAweDM4LCAweDgwLAotCTB4MjcsIDB4MkIsIDB4RjIsIDB4MjIsIDB4MDcsIDB4MzMsIDB4RkMsIDB4REUsIDB4MDEsIDB4M0UsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwKLQkweDAxLCAweEJDLCAweEZELCAweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LAotCTB4QzMsIDB4RkYsIDB4ODksIDB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsCi0JMHhGRiwgMHgxOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg5RCwgMHgwMSwKLQkweDg0LCAweEZDLCAweEYzLCAweDA2LCAweDdELCAweEYxLCAweDlFLCAweDMxLCAweEU2LCAweDJFLCAweDg1LAotCTB4RjEsIDB4MTYsIDB4MDcsIDB4NjEsIDB4RkMsIDB4QjUsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RiwgMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwKLQkweDAyLCAweDkxLCAweEZELCAweEUzLCAweDAxLCAweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLAotCTB4RjgsIDB4MDIsIDB4RkUsIDB4RkQsIDB4MkIsIDB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NSwgMHhGRiwgMHhEMiwgMHgwMSwgMHgzRCwgMHhGQywKLQkweDJCLCAweDA3LCAweEQ0LCAweEYxLCAweDY0LCAweDJBLCAweEM2LCAweDM1LCAweEI3LCAweEYxLCAweDk2LAotCTB4MDYsIDB4Q0YsIDB4RkMsIDB4NkIsIDB4MDEsIDB4N0QsIDB4RkYsIDB4MUYsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHhBMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywKLQkweDAwLCAweEE0LCAweEZDLCAweEI2LCAweDQ3LCAweDFDLCAweDBDLCAweDYzLCAweEY5LCAweDQyLCAweDA0LAotCTB4NTksIDB4RkQsIDB4NzYsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGMywgMHgwNiwKLQkweEVFLCAweEYyLCAweENELCAweDIyLCAweEU0LCAweDNCLCAweERDLCAweEYyLCAweDlDLCAweDA1LCAweDdFLAotCTB4RkQsIDB4MDAsIDB4MDEsIDB4QjQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsCi0JMHhEMiwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg4RSwgMHhGRiwgMHgzRiwgMHgwMiwgMHg1RSwKLQkweEY4LCAweDFFLCAweDQ1LCAweDQ0LCAweDEzLCAweEVBLCAweEY2LCAweDY3LCAweDA1LCAweENGLCAweEZDLAotCTB4QjMsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzOCwgMHhGRiwgMHhEQiwgMHgwMSwgMHg2NywgMHhGQywgMHg1QSwgMHgwNiwgMHhBNiwgMHhGNCwKLQkweDFCLCAweDFCLCAweDA3LCAweDQxLCAweDA0LCAweEY1LCAweDJELCAweDA0LCAweDY3LCAweEZFLCAweDc3LAotCTB4MDAsIDB4RjgsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RjAsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRSwgMHgxRCwgMHgwNCwgMHgxRiwgMHhGNSwgMHgzMiwKLQkweDQxLCAweENFLCAweDFBLCAweEJBLCAweEY0LCAweDUzLCAweDA2LCAweDZBLCAweEZDLCAweERBLCAweDAxLAotCTB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsCi0JMHhGRiwgMHhCNSwgMHgwMSwgMHhDQSwgMHhGQywgMHg3MiwgMHgwNSwgMHhEMywgMHhGNiwgMHg4RCwgMHgxMywKLQkweEZELCAweDQ0LCAweDM5LCAweEY4LCAweDUzLCAweDAyLCAweDgyLCAweEZGLCAweEQ3LCAweEZGLCAweDQ3LAotCTB4MDAsIDB4RDMsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4QjYsIDB4RkYsCi0JMHhGQiwgMHgwMCwgMHg4NSwgMHhGRCwgMHg5MCwgMHgwNSwgMHhFQywgMHhGMiwgMHgxQywgMHgzQywgMHg4MSwKLQkweDIyLCAweEZDLCAweEYyLCAweEVGLCAweDA2LCAweDM2LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4NzksCi0JMHgwMSwgMHg1MywgMHhGRCwgMHg0RSwgMHgwNCwgMHg0QSwgMHhGOSwgMHg2MCwgMHgwQywgMHhBMywgMHg0NywKLQkweDc2LCAweEZDLCAweDFGLCAweDAwLCAweEMzLCAweDAwLCAweDI3LCAweEZGLCAweDlELCAweDAwLCAweEIyLAotCTB4RkYsIDB4MTMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4N0YsIDB4RkYsIDB4NjcsIDB4MDEsCi0JMHhENSwgMHhGQywgMHg4RSwgMHgwNiwgMHhCRSwgMHhGMSwgMHgwNiwgMHgzNiwgMHgxQSwgMHgyQSwgMHhEQywKLQkweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4NzksIDB4RkYsIDB4MkUsIDB4MDEsIDB4RjcsCi0JMHhGRCwgMHgwNSwgMHgwMywgMHhFMSwgMHhGQiwgMHhDQSwgMHgwNSwgMHhERiwgMHg0OCwgMHhBQiwgMHgwMSwKLQkweEFBLCAweEZELCAweDE4LCAweDAyLCAweDcyLCAweEZFLCAweEY0LCAweDAwLCAweDkwLCAweEZGLCAweDFCLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsIDB4RkYsIDB4QjMsIDB4MDEsIDB4NjQsIDB4RkMsCi0JMHgxMywgMHgwNywgMHg4MywgMHhGMSwgMHgyQywgMHgyRiwgMHg1QSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGNywKLQkweDA2LCAweDgwLCAweEZDLCAweDlGLCAweDAxLCAweDYxLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLAotCTB4MTksIDB4MDAsIDB4OUEsIDB4RkYsIDB4RDksIDB4MDAsIDB4QUEsIDB4RkUsIDB4QUUsIDB4MDEsIDB4NzAsCi0JMHhGRSwgMHhGOCwgMHhGRiwgMHhBNiwgMHg0OCwgMHhCRSwgMHgwNywgMHgxNCwgMHhGQiwgMHg2RCwgMHgwMywKLQkweEMzLCAweEZELCAweDQ2LCAweDAxLCAweDcwLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REQsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjMsIDB4MDcsCi0JMHgyMSwgMHhGMiwgMHhDQiwgMHgyNywgMHhGRSwgMHgzNywgMHgwMCwgMHhGMiwgMHg0RCwgMHgwNiwgMHgwNCwKLQkweEZELCAweDQ5LCAweDAxLCAweDhFLCAweEZGLCAweDE5LCAweDAwLCAweEZGLCAweEZGLCAweDEwLCAweDAwLAotCTB4QkQsIDB4RkYsIDB4ODIsIDB4MDAsIDB4NUUsIDB4RkYsIDB4NUQsIDB4MDAsIDB4RDQsIDB4MDAsIDB4MEMsCi0JMHhGQiwgMHhGOSwgMHg0NiwgMHg4NywgMHgwRSwgMHg4MiwgMHhGOCwgMHhBRCwgMHgwNCwgMHgyNiwgMHhGRCwKLQkweDhELCAweDAxLCAweDU0LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4NDEsIDB4RkMsIDB4QzgsIDB4MDYsIDB4NzYsIDB4RjMsCi0JMHgyMiwgMHgyMCwgMHhDQSwgMHgzRCwgMHg3RCwgMHhGMywgMHgyQSwgMHgwNSwgMHhDOCwgMHhGRCwgMHhENCwKLQkweDAwLCAweENBLCAweEZGLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDA5LCAweDAwLCAweERELCAweEZGLAotCTB4MkUsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MjcsIDB4RkYsIDB4RUYsIDB4MDIsIDB4MjAsIDB4RjcsIDB4RTcsCi0JMHg0MywgMHhEOCwgMHgxNSwgMHgxRSwgMHhGNiwgMHhDMCwgMHgwNSwgMHhBNywgMHhGQywgMHhDMywgMHgwMSwKLQkweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLAotCTB4RkYsIDB4RDEsIDB4MDEsIDB4ODQsIDB4RkMsIDB4MTIsIDB4MDYsIDB4NUMsIDB4RjUsIDB4NzYsIDB4MTgsCi0JMHg4OSwgMHg0MiwgMHgwMiwgMHhGNiwgMHg5NCwgMHgwMywgMHhDNCwgMHhGRSwgMHg0MiwgMHgwMCwgMHgxMiwKLQkweDAwLCAweEU4LCAweEZGLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweEZBLCAweEZGLCAweEUyLCAweEZGLAotCTB4QTQsIDB4MDAsIDB4MTksIDB4RkUsIDB4QUEsIDB4MDQsIDB4M0UsIDB4RjQsIDB4OTAsIDB4M0YsIDB4NzgsCi0JMHgxRCwgMHgxMCwgMHhGNCwgMHg5MywgMHgwNiwgMHg1MiwgMHhGQywgMHhFMSwgMHgwMSwgMHgzNiwgMHhGRiwKLQkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEEyLAotCTB4MDEsIDB4RjYsIDB4RkMsIDB4MTIsIDB4MDUsIDB4QTcsIDB4RjcsIDB4MDMsIDB4MTEsIDB4MTAsIDB4NDYsCi0JMHg5MywgMHhGOSwgMHg5OCwgMHgwMSwgMHhFRSwgMHhGRiwgMHg5QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOCwKLQkweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweEExLCAweEZGLCAweDI0LCAweDAxLAotCTB4NDEsIDB4RkQsIDB4RjYsIDB4MDUsIDB4NjcsIDB4RjIsIDB4MUEsIDB4M0EsIDB4MjksIDB4MjUsIDB4ODQsCi0JMHhGMiwgMHgwRiwgMHgwNywgMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDYwLCAweDAxLCAweDhBLAotCTB4RkQsIDB4REYsIDB4MDMsIDB4MkUsIDB4RkEsIDB4MDQsIDB4MEEsIDB4M0EsIDB4NDgsIDB4MjgsIDB4RkUsCi0JMHg0QiwgMHhGRiwgMHgzOCwgMHgwMSwgMHhFOSwgMHhGRSwgMHhCQiwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxNiwKLQkweDAwLCAweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZGLCAweEZGLCAweDg1LCAweDAxLCAweEE2LCAweEZDLAotCTB4Q0EsIDB4MDYsIDB4OEYsIDB4RjEsIDB4QkIsIDB4MzMsIDB4QUIsIDB4MkMsIDB4QTMsIDB4RjEsIDB4MjYsCi0JMHgwNywgMHg0QywgMHhGQywgMHhDNSwgMHgwMSwgMHg0RCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLAotCTB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsCi0JMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LAotCTB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsCi0JMHhGQywgMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LAotCTB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsCi0JMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNSwKLQkweDAwLCAweEMzLCAweEZGLCAweEUxLCAweDAwLCAweEIxLCAweEZELCAweDRFLCAweDA1LCAweDRBLCAweEYzLAotCTB4M0QsIDB4M0QsIDB4RUQsIDB4MjAsIDB4NEMsIDB4RjMsIDB4RDYsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsCi0JMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNELCAweEZDLCAweEQ2LCAweDA2LCAweDRDLCAweEYzLCAweEVELAotCTB4MjAsIDB4M0QsIDB4M0QsIDB4NEEsIDB4RjMsIDB4NEUsIDB4MDUsIDB4QjEsIDB4RkQsIDB4RTEsIDB4MDAsCi0JMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwKLQkweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLAotCTB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsCi0JMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgxNiwgMHgwMCwgMHhBNiwgMHhGRiwgMHhCQiwgMHgwMCwKLQkweEU5LCAweEZFLCAweDM4LCAweDAxLCAweDRCLCAweEZGLCAweDI4LCAweEZFLCAweDNBLCAweDQ4LCAweDA0LAotCTB4MEEsIDB4MkUsIDB4RkEsIDB4REYsIDB4MDMsIDB4OEEsIDB4RkQsIDB4NjAsIDB4MDEsIDB4NjUsIDB4RkYsCi0JMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhDOCwgMHhGRiwgMHg2NCwgMHgwMCwgMHg5QiwKLQkweEZGLCAweEVFLCAweEZGLCAweDk4LCAweDAxLCAweDkzLCAweEY5LCAweDEwLCAweDQ2LCAweDAzLCAweDExLAotCTB4QTcsIDB4RjcsIDB4MTIsIDB4MDUsIDB4RjYsIDB4RkMsIDB4QTIsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMiwgMHgwMCwgMHg0MiwgMHgwMCwKLQkweEM0LCAweEZFLCAweDk0LCAweDAzLCAweDAyLCAweEY2LCAweDg5LCAweDQyLCAweDc2LCAweDE4LCAweDVDLAotCTB4RjUsIDB4MTIsIDB4MDYsIDB4ODQsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHhDQSwgMHhGRiwgMHhENCwgMHgwMCwgMHhDOCwKLQkweEZELCAweDJBLCAweDA1LCAweDdELCAweEYzLCAweENBLCAweDNELCAweDIyLCAweDIwLCAweDc2LCAweEYzLAotCTB4QzgsIDB4MDYsIDB4NDEsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHgwNCwgMHhGRCwKLQkweDRELCAweDA2LCAweDAwLCAweEYyLCAweEZFLCAweDM3LCAweENCLCAweDI3LCAweDIxLCAweEYyLCAweDIzLAotCTB4MDcsIDB4MzQsIDB4RkMsIDB4REQsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwgMHgwMSwgMHg4MCwgMHhGQywgMHhGNywKLQkweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLCAweDgzLCAweEYxLCAweDEzLCAweDA3LAotCTB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwgMHgwNywKLQkweERDLCAweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LCAweEQ1LAotCTB4RkMsIDB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywKLQkweEYyLCAweDgxLCAweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELAotCTB4RkIsIDB4MDAsIDB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHgzOCwgMHhGRiwgMHhEQSwgMHgwMSwgMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwKLQkweENFLCAweDFBLCAweDMyLCAweDQxLCAweDFGLCAweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLAotCTB4MDAsIDB4RkIsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsCi0JMHg0NiwgMHhGRiwgMHhCMywgMHgwMSwgMHhDRiwgMHhGQywgMHg2NywgMHgwNSwgMHhFQSwgMHhGNiwgMHg0NCwKLQkweDEzLCAweDFFLCAweDQ1LCAweDVFLCAweEY4LCAweDNGLCAweDAyLCAweDhFLCAweEZGLCAweEQwLCAweEZGLAotCTB4NEEsIDB4MDAsIDB4RDIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsCi0JMHhGRiwgMHg3NiwgMHgwMSwgMHg1OSwgMHhGRCwgMHg0MiwgMHgwNCwgMHg2MywgMHhGOSwgMHgxQywgMHgwQywKLQkweEI2LCAweDQ3LCAweEE0LCAweEZDLCAweDA3LCAweDAwLCAweEQwLCAweDAwLCAweDIwLCAweEZGLCAweEEwLAotCTB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsCi0JMHgyQiwgMHgwMSwgMHhGRSwgMHhGRCwgMHhGOCwgMHgwMiwgMHhGQiwgMHhGQiwgMHg4RCwgMHgwNSwgMHhFNSwKLQkweDQ4LCAweEUzLCAweDAxLCAweDkxLCAweEZELCAweDI1LCAweDAyLCAweDZCLCAweEZFLCAweEY3LCAweDAwLAotCTB4OEYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4MTgsIDB4MDAsIDB4OUMsIDB4RkYsIDB4RDYsIDB4MDAsIDB4QjEsCi0JMHhGRSwgMHhBMSwgMHgwMSwgMHg4OSwgMHhGRSwgMHhDMywgMHhGRiwgMHg5QywgMHg0OCwgMHhGRCwgMHgwNywKLQkweEZBLCAweEZBLCAweDdBLCAweDAzLCAweEJDLCAweEZELCAweDQ5LCAweDAxLCAweDZFLCAweEZGLCAweDI0LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0YsIDB4MDAsIDB4NjUsIDB4RkYsCi0JMHg1MSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMSwgMHhGQSwgMHhFMSwgMHg0NiwgMHhDRCwgMHgwRSwgMHg2QSwKLQkweEY4LCAweEI4LCAweDA0LCAweDIwLCAweEZELCAweDkwLCAweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MUIsCi0JMHhGRiwgMHgwMiwgMHgwMywgMHhGRSwgMHhGNiwgMHhDMywgMHg0MywgMHgyMiwgMHgxNiwgMHgwNywgMHhGNiwKLQkweENBLCAweDA1LCAweEEzLCAweEZDLCAweEM1LCAweDAxLCAweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4REYsIDB4RkYsIDB4QTksIDB4MDAsIDB4MTAsIDB4RkUsCi0JMHhCOSwgMHgwNCwgMHgyNywgMHhGNCwgMHg1RSwgMHgzRiwgMHhDMywgMHgxRCwgMHhGRSwgMHhGMywgMHg5OSwKLQkweDA2LCAweDUwLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MjgsIDB4MDEsIDB4M0EsIDB4RkQsIDB4MDAsCi0JMHgwNiwgMHg1QSwgMHhGMiwgMHhERiwgMHgzOSwgMHg3MywgMHgyNSwgMHg3OSwgMHhGMiwgMHgxMiwgMHgwNywKLQkweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweEZELAotCTB4RkYsIDB4MjQsIDB4MDAsIDB4NkQsIDB4RkYsIDB4ODgsIDB4MDEsIDB4QTIsIDB4RkMsIDB4RDAsIDB4MDYsCi0JMHg4QywgMHhGMSwgMHg3OCwgMHgzMywgMHhGMiwgMHgyQywgMHg5RSwgMHhGMSwgMHgyNCwgMHgwNywgMHg0RSwKLQkweEZDLCAweEMzLCAweDAxLCAweDRFLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLAotCTB4MzAsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QzcsIDB4MDEsIDB4NEEsIDB4RkMsIDB4MjcsIDB4MDcsIDB4QTgsCi0JMHhGMSwgMHg2MiwgMHgyQywgMHhGRCwgMHgzMywgMHg5MywgMHhGMSwgMHhDNCwgMHgwNiwgMHhBQiwgMHhGQywKLQkweDgyLCAweDAxLCAweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4M0EsIDB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEMsIDB4MDcsIDB4OTEsIDB4RjIsCi0JMHhERCwgMHgyNCwgMHg1NCwgMHgzQSwgMHg3NCwgMHhGMiwgMHhFQiwgMHgwNSwgMHg0OSwgMHhGRCwgMHgyMCwKLQkweDAxLCAweEEzLCAweEZGLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzcsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTUsIDB4RkMsIDB4OEMsIDB4MDYsIDB4MjIsIDB4RjQsIDB4MkMsCi0JMHgxRCwgMHhDMCwgMHgzRiwgMHg1NSwgMHhGNCwgMHg5QiwgMHgwNCwgMHgyMywgMHhGRSwgMHg5RiwgMHgwMCwKLQkweEU0LCAweEZGLCAweEY5LCAweEZGLCAweDA0LCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLAotCTB4RkYsIDB4QzEsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QjcsIDB4MDUsIDB4MzQsIDB4RjYsIDB4OEUsIDB4MTUsCi0JMHgwQiwgMHg0NCwgMHg0MiwgMHhGNywgMHhEQywgMHgwMiwgMHgzMiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgzMSwKLQkweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU1LCAweEZGLAotCTB4OEIsIDB4MDEsIDB4MkIsIDB4RkQsIDB4QTEsIDB4MDQsIDB4OUIsIDB4RjgsIDB4NDIsIDB4MEUsIDB4MEYsCi0JMHg0NywgMHgzOCwgMHhGQiwgMHhCRSwgMHgwMCwgMHg2QSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4NSwgMHgwMCwKLQkweEJCLCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcxLCAweEZGLCAweDQzLAotCTB4MDEsIDB4QzksIDB4RkQsIDB4NjAsIDB4MDMsIDB4MkUsIDB4RkIsIDB4N0UsIDB4MDcsIDB4QUYsIDB4NDgsCi0JMHgyRCwgMHgwMCwgMHg1OCwgMHhGRSwgMHhCQiwgMHgwMSwgMHhBMywgMHhGRSwgMHhERCwgMHgwMCwgMHg5OSwKLQkweEZGLCAweDE5LCAweDAwLCAweDFCLCAweDAwLCAweDkxLCAweEZGLCAweEYxLCAweDAwLCAweDc5LCAweEZFLAotCTB4MEEsIDB4MDIsIDB4QzMsIDB4RkQsIDB4NzMsIDB4MDEsIDB4REIsIDB4NDgsIDB4MDcsIDB4MDYsIDB4QzcsCi0JMHhGQiwgMHgxMiwgMHgwMywgMHhGMSwgMHhGRCwgMHgzMSwgMHgwMSwgMHg3OCwgMHhGRiwgMHgyMiwgMHgwMCwKLQkweDAwLCAweDAwLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDk5LCAweDAwLCAweDJFLCAweEZGLCAweEI2LAotCTB4MDAsIDB4MzYsIDB4MDAsIDB4NDcsIDB4RkMsIDB4OTAsIDB4NDcsIDB4QTQsIDB4MEMsIDB4MzEsIDB4RjksCi0JMHg1QSwgMHgwNCwgMHg0RSwgMHhGRCwgMHg3QywgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDBCLCAweDAwLCAweEQ1LCAweEZGLCAweDQ0LCAweDAwLCAweERELCAweEZGLCAweDc3LCAweEZGLAotCTB4NjcsIDB4MDIsIDB4MTQsIDB4RjgsIDB4REMsIDB4NDQsIDB4RDUsIDB4MTMsIDB4QkMsIDB4RjYsIDB4N0MsCi0JMHgwNSwgMHhDNSwgMHhGQywgMHhCNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDA1LCAweDAwLCAweEYzLCAweEZGLCAweEY1LCAweEZGLCAweDdELCAweDAwLCAweDVELCAweEZFLCAweDNFLAotCTB4MDQsIDB4RUEsIDB4RjQsIDB4RDksIDB4NDAsIDB4NjYsIDB4MUIsIDB4OTMsIDB4RjQsIDB4NjIsIDB4MDYsCi0JMHg2NCwgMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDBDLCAweDAwLCAweEIxLCAweEZGLCAweDA0LCAweDAxLCAweDc2LCAweEZELCAweEE4LCAweDA1LAotCTB4Q0MsIDB4RjIsIDB4QUIsIDB4M0IsIDB4MTgsIDB4MjMsIDB4RTAsIDB4RjIsIDB4RjcsIDB4MDYsIDB4MzUsCi0JMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwKLQkweDIwLCAweDAwLCAweDdCLCAweEZGLCAweDZFLCAweDAxLCAweENBLCAweEZDLCAweDlELCAweDA2LCAweEIxLAotCTB4RjEsIDB4ODYsIDB4MzUsIDB4QUUsIDB4MkEsIDB4Q0QsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0YsIDB4RkMsCi0JMHhEMSwgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyRCwKLQkweDAwLCAweDU0LCAweEZGLCAweEI3LCAweDAxLCAweDVFLCAweEZDLCAweDE5LCAweDA3LCAweDg4LCAweEYxLAotCTB4OUYsIDB4MkUsIDB4RTMsIDB4MzEsIDB4N0UsIDB4RjEsIDB4RUUsIDB4MDYsIDB4ODgsIDB4RkMsIDB4OUEsCi0JMHgwMSwgMHg2NCwgMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDNFLCAweEZGLCAweERGLCAweDAxLCAweDMzLCAweEZDLCAweDIwLCAweDA3LCAweDM1LCAweEYyLCAweDM2LAotCTB4MjcsIDB4NzgsIDB4MzgsIDB4MTQsIDB4RjIsIDB4M0IsIDB4MDYsIDB4MTEsIDB4RkQsIDB4NDEsIDB4MDEsCi0JMHg5MiwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKLQkweEZGLCAweEU1LCAweDAxLCAweDQ0LCAweEZDLCAweEJELCAweDA2LCAweDk3LCAweEYzLCAweDhBLCAweDFGLAotCTB4MzEsIDB4M0UsIDB4QTUsIDB4RjMsIDB4MEYsIDB4MDUsIDB4REEsIDB4RkQsIDB4QzksIDB4MDAsIDB4Q0YsCi0JMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwKLQkweENFLCAweDAxLCAweDhDLCAweEZDLCAweDAwLCAweDA2LCAweDg2LCAweEY1LCAweEUwLCAweDE3LCAweERCLAotCTB4NDIsIDB4M0YsIDB4RjYsIDB4NzEsIDB4MDMsIDB4RDksIDB4RkUsIDB4MzYsIDB4MDAsIDB4MTgsIDB4MDAsCi0JMHhFNSwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5RSwKLQkweDAxLCAweDAwLCAweEZELCAweEZDLCAweDA0LCAweEQ3LCAweEY3LCAweDc1LCAweDEwLCAweDQ4LCAweDQ2LAotCTB4RTQsIDB4RjksIDB4NkUsIDB4MDEsIDB4MDYsIDB4MDAsIDB4OEUsIDB4RkYsIDB4NkIsIDB4MDAsIDB4QzYsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwgMHhGRiwgMHg1QiwgMHgwMSwKLQkweDk2LCAweEZELCAweEM2LCAweDAzLCAweDYxLCAweEZBLCAweDgxLCAweDA5LCAweDU3LCAweDQ4LCAweDhELAotCTB4RkUsIDB4MUIsIDB4RkYsIDB4NTIsIDB4MDEsIDB4REIsIDB4RkUsIDB4QzIsIDB4MDAsIDB4QTQsIDB4RkYsCi0JMHgxNiwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NywgMHhGRiwgMHgwQiwgMHgwMSwgMHg0MiwgMHhGRSwgMHg3NCwKLQkweDAyLCAweEY5LCAweEZDLCAweDM5LCAweDAzLCAweEY1LCAweDQ4LCAweDI0LCAweDA0LCAweDk0LCAweEZDLAotCTB4QTksIDB4MDIsIDB4MjcsIDB4RkUsIDB4MTgsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgxNSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGNywgMHhGRSwgMHgxRCwgMHgwMSwKLQkweDdBLCAweEZGLCAweEM1LCAweEZELCAweDFELCAweDQ4LCAweDg5LCAweDBBLCAweEZCLCAweEY5LCAweEY4LAotCTB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhENiwgMHhGRiwgMHhDMywKLQkweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLCAweDc3LCAweEY3LCAweDI4LCAweDA1LAotCTB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDYsCi0JMHgwMCwgMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwgMHgwMywKLQkweEM3LCAweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LCAweDdELAotCTB4RkMsIDB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHgwNSwgMHgwMCwgMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwKLQkweEYzLCAweDYxLCAweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLAotCTB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsCi0JMHgwMCwgMHg4QSwgMHhGRiwgMHg1MSwgMHgwMSwgMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwKLQkweDgyLCAweDM3LCAweDYwLCAweDI4LCAweDBFLCAweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLAotCTB4MDEsIDB4NDAsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHg1RiwgMHhGRiwgMHhBNSwgMHgwMSwgMHg3OCwgMHhGQywgMHhGRiwgMHgwNiwgMHg3RCwgMHhGMSwgMHhDRiwKLQkweDMwLCAweEI4LCAweDJGLCAweDgwLCAweEYxLCAweDBELCAweDA3LCAweDZBLCAweEZDLCAweEFFLCAweDAxLAotCTB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsCi0JMHhGRiwgMHhENiwgMHgwMSwgMHgzOSwgMHhGQywgMHgyQSwgMHgwNywgMHhFQiwgMHhGMSwgMHg4NywgMHgyOSwKLQkweDg1LCAweDM2LCAweENDLCAweEYxLCAweDdGLCAweDA2LCAweEUwLCAweEZDLCAweDYwLCAweDAxLCAweDgyLAotCTB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhFNiwgMHgwMSwgMHgzOCwgMHhGQywgMHhFNiwgMHgwNiwgMHgxOSwgMHhGMywgMHhFQSwgMHgyMSwgMHg4QSwKLQkweDNDLCAweDBFLCAweEYzLCAweDc4LCAweDA1LCAweDk2LCAweEZELCAweEYxLCAweDAwLCAweEJCLCAweEZGLAotCTB4MDgsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDgsCi0JMHgwMSwgMHg3MCwgMHhGQywgMHg0MywgMHgwNiwgMHhFMSwgMHhGNCwgMHgzOCwgMHgxQSwgMHg4QywgMHg0MSwKLQkweDU1LCAweEY1LCAweEZDLCAweDAzLCAweDg1LCAweEZFLCAweDY2LCAweDAwLCAweDAxLCAweDAwLCAweEVFLAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDcsIDB4RkYsIDB4QUYsIDB4MDEsCi0JMHhEOCwgMHhGQywgMHg1MiwgMHgwNSwgMHgxOSwgMHhGNywgMHhCMiwgMHgxMiwgMHg1QywgMHg0NSwgMHhBOSwKLQkweEY4LCAweDE2LCAweDAyLCAweEE2LCAweEZGLCAweEMzLCAweEZGLCAweDUxLCAweDAwLCAweEQwLCAweEZGLAotCTB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4NzEsIDB4MDEsIDB4NjUsCi0JMHhGRCwgMHgyOSwgMHgwNCwgMHg5NiwgMHhGOSwgMHg5NSwgMHgwQiwgMHhEQywgMHg0NywgMHgwMywgMHhGRCwKLQkweEQ5LCAweEZGLCAweEVBLCAweDAwLCAweDEyLCAweEZGLCAweEE3LCAweDAwLCAweEFFLCAweEZGLCAweDE0LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0QsIDB4RkYsIDB4MjQsIDB4MDEsIDB4MEMsIDB4RkUsCi0JMHhERSwgMHgwMiwgMHgyRSwgMHhGQywgMHgxMywgMHgwNSwgMHhFQywgMHg0OCwgMHg1NCwgMHgwMiwgMHg1RSwKLQkweEZELCAweDNGLCAweDAyLCAweDVELCAweEZFLCAweEZFLCAweDAwLCAweDhDLCAweEZGLCAweDFDLCAweDAwLAotCTB4MTcsIDB4MDAsIDB4OUUsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4QkYsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkEsCi0JMHhGRSwgMHg1QSwgMHhGRiwgMHg4NiwgMHg0OCwgMHg3RCwgMHgwOCwgMHhDNywgMHhGQSwgMHg5MywgMHgwMywKLQkweEIwLCAweEZELCAweDRGLCAweDAxLCAweDZDLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDBGLAotCTB4MDAsIDB4QzAsIDB4RkYsIDB4NzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MTcsIDB4MDEsCi0JMHg4QiwgMHhGQSwgMHhBRiwgMHg0NiwgMHg1OSwgMHgwRiwgMHgzOSwgMHhGOCwgMHhDRiwgMHgwNCwgMHgxNSwKLQkweEZELCAweDk1LCAweDAxLCAweDUxLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDA4LCAweDAwLAotCTB4RTEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MjgsIDB4MDMsIDB4QkQsCi0JMHhGNiwgMHg3NywgMHg0MywgMHhCNiwgMHgxNiwgMHhEQywgMHhGNSwgMHhERCwgMHgwNSwgMHg5QiwgMHhGQywKLQkweEM4LCAweDAxLCAweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAzLCAweDAwLCAweEZELAotCTB4RkYsIDB4RDksIDB4RkYsIDB4QjQsIDB4MDAsIDB4RkQsIDB4RkQsIDB4RDcsIDB4MDQsIDB4RkEsIDB4RjMsCi0JMHhGQywgMHgzRSwgMHg1QiwgMHgxRSwgMHhEQiwgMHhGMywgMHhBNiwgMHgwNiwgMHg0QywgMHhGQywgMHhFMywKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDE0LCAweDAwLAotCTB4OUIsIDB4RkYsIDB4MzEsIDB4MDEsIDB4MkMsIDB4RkQsIDB4MTUsIDB4MDYsIDB4NDEsIDB4RjIsIDB4NkEsCi0JMHgzOSwgMHgwQSwgMHgyNiwgMHg2MSwgMHhGMiwgMHgxNywgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwKLQkweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZBLAotCTB4RkYsIDB4OEUsIDB4MDEsIDB4OTksIDB4RkMsIDB4REIsIDB4MDYsIDB4ODYsIDB4RjEsIDB4RjIsIDB4MzIsCi0JMHg4MiwgMHgyRCwgMHg5NiwgMHhGMSwgMHgyMSwgMHgwNywgMHg1MywgMHhGQywgMHhDMCwgMHgwMSwgMHg1MCwKLQkweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLAotCTB4Q0EsIDB4MDEsIDB4NDYsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjMsIDB4RjEsIDB4RDEsIDB4MkIsIDB4ODEsCi0JMHgzNCwgMHg5QywgMHhGMSwgMHhCOCwgMHgwNiwgMHhCNSwgMHhGQywgMHg3QywgMHgwMSwgMHg3NCwgMHhGRiwKLQkweDIyLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LAotCTB4MDEsIDB4MzIsIDB4RkMsIDB4MDYsIDB4MDcsIDB4QUEsIDB4RjIsIDB4NDYsIDB4MjQsIDB4QzgsIDB4M0EsCi0JMHg5MCwgMHhGMiwgMHhENiwgMHgwNSwgMHg1NywgMHhGRCwgMHgxNywgMHgwMSwgMHhBOCwgMHhGRiwgMHgwRiwKLQkweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLAotCTB4NUEsIDB4RkMsIDB4N0UsIDB4MDYsIDB4NDcsIDB4RjQsIDB4OTQsIDB4MUMsIDB4MUYsIDB4NDAsIDB4ODUsCi0JMHhGNCwgMHg3RCwgMHgwNCwgMHgzNiwgMHhGRSwgMHg5MywgMHgwMCwgMHhFQSwgMHhGRiwgMHhGNywgMHhGRiwKLQkweDA0LCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJFLCAweDAxLCAweEI0LAotCTB4RkMsIDB4QTQsIDB4MDUsIDB4NjEsIDB4RjYsIDB4RkIsIDB4MTQsIDB4NTMsIDB4NDQsIDB4ODYsIDB4RjcsCi0JMHhCNiwgMHgwMiwgMHg0OSwgMHhGRiwgMHhGNywgMHhGRiwgMHgzNywgMHgwMCwgMHhEOSwgMHhGRiwgMHgwQSwKLQkweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU3LCAweEZGLCAweDg2LCAweDAxLCAweDM2LCAweEZELAotCTB4ODksIDB4MDQsIDB4Q0QsIDB4RjgsIDB4QjcsIDB4MEQsIDB4M0QsIDB4NDcsIDB4OTEsIDB4RkIsIDB4OTEsCi0JMHgwMCwgMHg4MywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4QywgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwgMHgwMCwKLQkweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDczLCAweEZGLCAweDNELCAweDAxLCAweEQ2LCAweEZELCAweDQ2LAotCTB4MDMsIDB4NjEsIDB4RkIsIDB4MDAsIDB4MDcsIDB4QkYsIDB4NDgsIDB4OTgsIDB4MDAsIDB4MjYsIDB4RkUsCi0JMHhENSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhFMywgMHgwMCwgMHg5NiwgMHhGRiwgMHgxQSwgMHgwMCwgMHgxQSwKLQkweDAwLCAweDk0LCAweEZGLCAweEVBLCAweDAwLCAweDg3LCAweEZFLCAweEYwLCAweDAxLCAweEY1LCAweEZELAotCTB4MDUsIDB4MDEsIDB4Q0UsIDB4NDgsIDB4ODMsIDB4MDYsIDB4OTQsIDB4RkIsIDB4MkMsIDB4MDMsIDB4RTQsCi0JMHhGRCwgMHgzNywgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwKLQkweEI2LCAweEZGLCAweDkzLCAweDAwLCAweDNDLCAweEZGLCAweDlELCAweDAwLCAweDYzLCAweDAwLCAweEVCLAotCTB4RkIsIDB4NjksIDB4NDcsIDB4MkQsIDB4MEQsIDB4RkYsIDB4RjgsIDB4NzIsIDB4MDQsIDB4NDIsIDB4RkQsCi0JMHg4MSwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHhENywKLQkweEZGLCAweDNFLCAweDAwLCAweEVBLCAweEZGLCAweDYwLCAweEZGLCAweDhGLCAweDAyLCAweENELCAweEY3LAotCTB4OTksIDB4NDQsIDB4NjgsIDB4MTQsIDB4OEUsIDB4RjYsIDB4OTAsIDB4MDUsIDB4QkMsIDB4RkMsIDB4QkEsCi0JMHgwMSwgMHg0MywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNSwgMHhGRiwKLQkweEVGLCAweEZGLCAweDg4LCAweDAwLCAweDQ5LCAweEZFLCAweDVELCAweDA0LCAweEI3LCAweEY0LCAweDdELAotCTB4NDAsIDB4RkQsIDB4MUIsIDB4NkMsIDB4RjQsIDB4NzAsIDB4MDYsIDB4NUYsIDB4RkMsIDB4REUsIDB4MDEsCi0JMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQywKLQkweEZGLCAweDBFLCAweDAxLCAweDY2LCAweEZELCAweEJGLCAweDA1LCAweEFELCAweEYyLCAweDNCLCAweDNCLAotCTB4QjAsIDB4MjMsIDB4QzQsIDB4RjIsIDB4RkYsIDB4MDYsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NywgMHhGRiwKLQkweDc1LCAweDAxLCAweEJGLCAweEZDLCAweEFCLCAweDA2LCAweEE2LCAweEYxLCAweDA1LCAweDM1LCAweDQwLAotCTB4MkIsIDB4QkYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDIsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4NDgsIDB4RkYsCi0JMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MiwgMHhGRiwgMHhCQywKLQkweDAxLCAweDU4LCAweEZDLCAweDFELCAweDA3LCAweDhFLCAweEYxLCAweDExLCAweDJFLCAweDZCLCAweDMyLAotCTB4ODEsIDB4RjEsIDB4RTUsIDB4MDYsIDB4OTAsIDB4RkMsIDB4OTQsIDB4MDEsIDB4NjcsIDB4RkYsIDB4MjYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwgMHhFMCwgMHgwMSwKLQkweDMyLCAweEZDLCAweDFDLCAweDA3LCAweDRCLCAweEYyLCAweEEwLCAweDI2LCAweEYyLCAweDM4LCAweDJBLAotCTB4RjIsIDB4MjgsIDB4MDYsIDB4MUYsIDB4RkQsIDB4MzksIDB4MDEsIDB4OTYsIDB4RkYsIDB4MTYsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0OCwKLQkweEZDLCAweEIyLCAweDA2LCAweEI5LCAweEYzLCAweEYzLCAweDFFLCAweDk4LCAweDNFLCAweENGLCAweEYzLAotCTB4RjMsIDB4MDQsIDB4RUIsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDMsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwgMHhDQiwgMHgwMSwgMHg5MywgMHhGQywKLQkweEVGLCAweDA1LCAweEIwLCAweEY1LCAweDRCLCAweDE3LCAweDJBLCAweDQzLCAweDdELCAweEY2LCAweDRELAotCTB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDgsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwgMHgwMSwgMHgwQiwgMHhGRCwgMHhFNiwKLQkweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LCAweDM3LCAweEZBLCAweDQyLCAweDAxLAotCTB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwgMHgwMywKLQkweDk0LCAweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLCAweDZDLAotCTB4MDEsIDB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MUQsIDB4MDAsCi0JMHg4QSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwKLQkweDAyLCAweEYyLCAweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLAotCTB4MUUsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4QUMsCi0JMHhGRiwgMHhBRSwgMHgwMCwgMHgwNSwgMHhGRiwgMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwKLQkweEZELCAweDQ3LCAweDBFLCAweDBCLCAweEM4LCAweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLAotCTB4MDEsIDB4NjEsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4Q0QsIDB4RkYsCi0JMHg1NywgMHgwMCwgMHhCNiwgMHhGRiwgMHhCRSwgMHhGRiwgMHhFRCwgMHgwMSwgMHhGNSwgMHhGOCwgMHg5QiwKLQkweDQ1LCAweDIyLCAweDEyLCAweDQ4LCAweEY3LCAweDNELCAweDA1LCAweEUyLCAweEZDLCAweEFCLCAweDAxLAotCTB4NDksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsCi0JMHgwMCwgMHg1QSwgMHgwMCwgMHg5QSwgMHhGRSwgMHhEQSwgMHgwMywgMHg4RCwgMHhGNSwgMHhFMSwgMHg0MSwKLQkweEExLCAweDE5LCAweDA5LCAweEY1LCAweDMzLCAweDA2LCAweDc3LCAweEZDLCAweEQ2LCAweDAxLCAweDNBLAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsCi0JMHhFOCwgMHgwMCwgMHhBNiwgMHhGRCwgMHg1RiwgMHgwNSwgMHgzMSwgMHhGMywgMHhGNiwgMHgzQywgMHg1MiwKLQkweDIxLCAweDM3LCAweEYzLCAweERELCAweDA2LCAweDNCLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODYsIDB4RkYsIDB4NTksCi0JMHgwMSwgMHhFQywgMHhGQywgMHg2RiwgMHgwNiwgMHhEQywgMHhGMSwgMHgwNCwgMHgzNywgMHhGMywgMHgyOCwKLQkweEZDLCAweEYxLCAweDI4LCAweDA3LCAweDM3LCAweEZDLCAweEQ4LCAweDAxLCAweDQxLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4QUEsIDB4MDEsCi0JMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwgMHgzMCwgMHg3RSwKLQkweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLCAweEFBLCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MzcsCi0JMHhGQywgMHgyOCwgMHgwNywgMHhGQywgMHhGMSwgMHhGMywgMHgyOCwgMHgwNCwgMHgzNywgMHhEQywgMHhGMSwKLQkweDZGLCAweDA2LCAweEVDLCAweEZDLCAweDU5LCAweDAxLCAweDg2LCAweEZGLCAweDFDLCAweDAwLCAweEZFLAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0IsIDB4RkMsCi0JMHhERCwgMHgwNiwgMHgzNywgMHhGMywgMHg1MiwgMHgyMSwgMHhGNiwgMHgzQywgMHgzMSwgMHhGMywgMHg1RiwKLQkweDA1LCAweEE2LCAweEZELCAweEU4LCAweDAwLCAweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDYsIDB4MDEsIDB4NzcsIDB4RkMsIDB4MzMsCi0JMHgwNiwgMHgwOSwgMHhGNSwgMHhBMSwgMHgxOSwgMHhFMSwgMHg0MSwgMHg4RCwgMHhGNSwgMHhEQSwgMHgwMywKLQkweDlBLCAweEZFLCAweDVBLCAweDAwLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLCAweEZGLAotCTB4RkYsIDB4MzAsIDB4MDAsIDB4NDksIDB4RkYsIDB4QUIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4M0QsIDB4MDUsCi0JMHg0OCwgMHhGNywgMHgyMiwgMHgxMiwgMHg5QiwgMHg0NSwgMHhGNSwgMHhGOCwgMHhFRCwgMHgwMSwgMHhCRSwKLQkweEZGLCAweEI2LCAweEZGLCAweDU3LCAweDAwLCAweENELCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAotCTB4MjgsIDB4MDAsIDB4NjEsIDB4RkYsIDB4NkMsIDB4MDEsIDB4NzEsIDB4RkQsIDB4MTEsIDB4MDQsIDB4QzgsCi0JMHhGOSwgMHgwRSwgMHgwQiwgMHhGRCwgMHg0NywgMHg2MywgMHhGRCwgMHhBQSwgMHhGRiwgMHgwMywgMHgwMSwKLQkweDA1LCAweEZGLCAweEFFLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDIwLAotCTB4MDAsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDEsIDB4MTksIDB4RkUsIDB4QzMsIDB4MDIsIDB4NjEsIDB4RkMsCi0JMHg5QiwgMHgwNCwgMHhGMiwgMHg0OCwgMHhDNiwgMHgwMiwgMHgyQywgMHhGRCwgMHg1QSwgMHgwMiwgMHg1MCwKLQkweEZFLCAweDA0LCAweDAxLCAweDhBLCAweEZGLCAweDFELCAweDAwLCAweDE3LCAweDAwLCAweEExLCAweEZGLAotCTB4QzksIDB4MDAsIDB4Q0QsIDB4RkUsIDB4NkMsIDB4MDEsIDB4RUEsIDB4RkUsIDB4RjMsIDB4RkUsIDB4NzAsCi0JMHg0OCwgMHhGRiwgMHgwOCwgMHg5NCwgMHhGQSwgMHhBRCwgMHgwMywgMHhBMywgMHhGRCwgMHg1NSwgMHgwMSwKLQkweDZBLCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEMzLCAweEZGLCAweDcxLAotCTB4MDAsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4NDIsIDB4MDEsIDB4MzcsIDB4RkEsIDB4N0MsIDB4NDYsCi0JMHhFNywgMHgwRiwgMHgwOCwgMHhGOCwgMHhFNiwgMHgwNCwgMHgwQiwgMHhGRCwgMHg5OSwgMHgwMSwgMHg0RiwKLQkweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDA4LCAweDAwLCAweEUzLCAweEZGLCAweDFFLCAweDAwLAotCTB4MkEsIDB4MDAsIDB4RUYsIDB4RkUsIDB4NEQsIDB4MDMsIDB4N0QsIDB4RjYsIDB4MkEsIDB4NDMsIDB4NEIsCi0JMHgxNywgMHhCMCwgMHhGNSwgMHhFRiwgMHgwNSwgMHg5MywgMHhGQywgMHhDQiwgMHgwMSwgMHgzRCwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweEQ0LCAweEZGLCAweEJGLAotCTB4MDAsIDB4RUIsIDB4RkQsIDB4RjMsIDB4MDQsIDB4Q0YsIDB4RjMsIDB4OTgsIDB4M0UsIDB4RjMsIDB4MUUsCi0JMHhCOSwgMHhGMywgMHhCMiwgMHgwNiwgMHg0OCwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk2LCAweEZGLCAweDM5LCAweDAxLAotCTB4MUYsIDB4RkQsIDB4MjgsIDB4MDYsIDB4MkEsIDB4RjIsIDB4RjIsIDB4MzgsIDB4QTAsIDB4MjYsIDB4NEIsCi0JMHhGMiwgMHgxQywgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwKLQkweEZELCAweEZGLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY3LCAweEZGLCAweDk0LCAweDAxLCAweDkwLAotCTB4RkMsIDB4RTUsIDB4MDYsIDB4ODEsIDB4RjEsIDB4NkIsIDB4MzIsIDB4MTEsIDB4MkUsIDB4OEUsIDB4RjEsCi0JMHgxRCwgMHgwNywgMHg1OCwgMHhGQywgMHhCQywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ4LCAweEZGLCAweENFLCAweDAxLCAweDQyLCAweEZDLAotCTB4MkEsIDB4MDcsIDB4QkYsIDB4RjEsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MzUsIDB4QTYsIDB4RjEsIDB4QUIsCi0JMHgwNiwgMHhCRiwgMHhGQywgMHg3NSwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLCAweEZGLAotCTB4MDYsIDB4QzQsIDB4RjIsIDB4QjAsIDB4MjMsIDB4M0IsIDB4M0IsIDB4QUQsIDB4RjIsIDB4QkYsIDB4MDUsCi0JMHg2NiwgMHhGRCwgMHgwRSwgMHgwMSwgMHhBQywgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERFLCAweDAxLCAweDVGLCAweEZDLCAweDcwLCAweDA2LAotCTB4NkMsIDB4RjQsIDB4RkQsIDB4MUIsIDB4N0QsIDB4NDAsIDB4QjcsIDB4RjQsIDB4NUQsIDB4MDQsIDB4NDksCi0JMHhGRSwgMHg4OCwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDMyLCAweDAwLCAweDQzLCAweEZGLCAweEJBLCAweDAxLCAweEJDLCAweEZDLCAweDkwLCAweDA1LCAweDhFLAotCTB4RjYsIDB4NjgsIDB4MTQsIDB4OTksIDB4NDQsIDB4Q0QsIDB4RjcsIDB4OEYsIDB4MDIsIDB4NjAsIDB4RkYsCi0JMHhFQSwgMHhGRiwgMHgzRSwgMHgwMCwgMHhENywgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwKLQkweDAwLCAweDU5LCAweEZGLCAweDgxLCAweDAxLCAweDQyLCAweEZELCAweDcyLCAweDA0LCAweEZGLCAweEY4LAotCTB4MkQsIDB4MEQsIDB4NjksIDB4NDcsIDB4RUIsIDB4RkIsIDB4NjMsIDB4MDAsIDB4OUQsIDB4MDAsIDB4M0MsCi0JMHhGRiwgMHg5MywgMHgwMCwgMHhCNiwgMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwKLQkweDc2LCAweEZGLCAweDM3LCAweDAxLCAweEU0LCAweEZELCAweDJDLCAweDAzLCAweDk0LCAweEZCLCAweDgzLAotCTB4MDYsIDB4Q0UsIDB4NDgsIDB4MDUsIDB4MDEsIDB4RjUsIDB4RkQsIDB4RjAsIDB4MDEsIDB4ODcsIDB4RkUsCi0JMHhFQSwgMHgwMCwgMHg5NCwgMHhGRiwgMHgxQSwgMHgwMCwgMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFMywKLQkweDAwLCAweDk1LCAweEZFLCAweEQ1LCAweDAxLCAweDI2LCAweEZFLCAweDk4LCAweDAwLCAweEJGLCAweDQ4LAotCTB4MDAsIDB4MDcsIDB4NjEsIDB4RkIsIDB4NDYsIDB4MDMsIDB4RDYsIDB4RkQsIDB4M0QsIDB4MDEsIDB4NzMsCi0JMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHhCOSwgMHhGRiwgMHg4QywgMHgwMCwKLQkweDRBLCAweEZGLCAweDgzLCAweDAwLCAweDkxLCAweDAwLCAweDkxLCAweEZCLCAweDNELCAweDQ3LCAweEI3LAotCTB4MEQsIDB4Q0QsIDB4RjgsIDB4ODksIDB4MDQsIDB4MzYsIDB4RkQsIDB4ODYsIDB4MDEsIDB4NTcsIDB4RkYsCi0JMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgzNywgMHgwMCwgMHhGNywKLQkweEZGLCAweDQ5LCAweEZGLCAweEI2LCAweDAyLCAweDg2LCAweEY3LCAweDUzLCAweDQ0LCAweEZCLCAweDE0LAotCTB4NjEsIDB4RjYsIDB4QTQsIDB4MDUsIDB4QjQsIDB4RkMsIDB4QkUsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MywgMHgwMCwKLQkweDM2LCAweEZFLCAweDdELCAweDA0LCAweDg1LCAweEY0LCAweDFGLCAweDQwLCAweDk0LCAweDFDLCAweDQ3LAotCTB4RjQsIDB4N0UsIDB4MDYsIDB4NUEsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNywgMHgwMSwgMHg1NywKLQkweEZELCAweEQ2LCAweDA1LCAweDkwLCAweEYyLCAweEM4LCAweDNBLCAweDQ2LCAweDI0LCAweEFBLCAweEYyLAotCTB4MDYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NCwgMHhGRiwgMHg3QywgMHgwMSwgMHhCNSwgMHhGQywKLQkweEI4LCAweDA2LCAweDlDLCAweEYxLCAweDgxLCAweDM0LCAweEQxLCAweDJCLCAweEIzLCAweEYxLCAweDI5LAotCTB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwgMHgwMSwgMHg1MywgMHhGQywgMHgyMSwKLQkweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLCAweDg2LCAweEYxLCAweERCLCAweDA2LAotCTB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywgMHgwNywKLQkweDYxLCAweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LCAweDJDLAotCTB4RkQsIDB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwKLQkweEYzLCAweDVCLCAweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELAotCTB4QjQsIDB4MDAsIDB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHgzRSwgMHhGRiwgMHhDOCwgMHgwMSwgMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwKLQkweEI2LCAweDE2LCAweDc3LCAweDQzLCAweEJELCAweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELAotCTB4MDAsIDB4MjUsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsCi0JMHg1MSwgMHhGRiwgMHg5NSwgMHgwMSwgMHgxNSwgMHhGRCwgMHhDRiwgMHgwNCwgMHgzOSwgMHhGOCwgMHg1OSwKLQkweDBGLCAweEFGLCAweDQ2LCAweDhCLCAweEZBLCAweDE3LCAweDAxLCAweDM4LCAweDAwLCAweDczLCAweEZGLAotCTB4NzgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsCi0JMHhGRiwgMHg0RiwgMHgwMSwgMHhCMCwgMHhGRCwgMHg5MywgMHgwMywgMHhDNywgMHhGQSwgMHg3RCwgMHgwOCwKLQkweDg2LCAweDQ4LCAweDVBLCAweEZGLCAweEJBLCAweEZFLCAweDg2LCAweDAxLCAweEJGLCAweEZFLCAweENGLAotCTB4MDAsIDB4OUUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MUMsIDB4MDAsIDB4OEMsIDB4RkYsIDB4RkUsIDB4MDAsCi0JMHg1RCwgMHhGRSwgMHgzRiwgMHgwMiwgMHg1RSwgMHhGRCwgMHg1NCwgMHgwMiwgMHhFQywgMHg0OCwgMHgxMywKLQkweDA1LCAweDJFLCAweEZDLCAweERFLCAweDAyLCAweDBDLCAweEZFLCAweDI0LCAweDAxLCAweDdELCAweEZGLAotCTB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4QUUsIDB4RkYsIDB4QTcsIDB4MDAsIDB4MTIsCi0JMHhGRiwgMHhFQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwMywgMHhGRCwgMHhEQywgMHg0NywgMHg5NSwgMHgwQiwKLQkweDk2LCAweEY5LCAweDI5LCAweDA0LCAweDY1LCAweEZELCAweDcxLCAweDAxLCAweDVGLCAweEZGLCAweDI5LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTEsIDB4MDAsIDB4QzMsIDB4RkYsCi0JMHhBNiwgMHhGRiwgMHgxNiwgMHgwMiwgMHhBOSwgMHhGOCwgMHg1QywgMHg0NSwgMHhCMiwgMHgxMiwgMHgxOSwKLQkweEY3LCAweDUyLCAweDA1LCAweEQ4LCAweEZDLCAweEFGLCAweDAxLCAweDQ3LCAweEZGLCAweDMwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjYsIDB4MDAsIDB4ODUsCi0JMHhGRSwgMHhGQywgMHgwMywgMHg1NSwgMHhGNSwgMHg4QywgMHg0MSwgMHgzOCwgMHgxQSwgMHhFMSwgMHhGNCwKLQkweDQzLCAweDA2LCAweDcwLCAweEZDLCAweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RjEsIDB4MDAsIDB4OTYsIDB4RkQsCi0JMHg3OCwgMHgwNSwgMHgwRSwgMHhGMywgMHg4QSwgMHgzQywgMHhFQSwgMHgyMSwgMHgxOSwgMHhGMywgMHhFNiwKLQkweDA2LCAweDM4LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RkMsIDB4N0YsCi0JMHgwNiwgMHhDQywgMHhGMSwgMHg4NSwgMHgzNiwgMHg4NywgMHgyOSwgMHhFQiwgMHhGMSwgMHgyQSwgMHgwNywKLQkweDM5LCAweEZDLCAweEQ2LCAweDAxLCAweDQzLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweEZELAotCTB4RkYsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkEsIDB4RkMsIDB4MEQsIDB4MDcsCi0JMHg4MCwgMHhGMSwgMHhCOCwgMHgyRiwgMHhDRiwgMHgzMCwgMHg3RCwgMHhGMSwgMHhGRiwgMHgwNiwgMHg3OCwKLQkweEZDLCAweEE1LCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLAotCTB4MzQsIDB4MDAsIDB4NDAsIDB4RkYsIDB4REIsIDB4MDEsIDB4MzUsIDB4RkMsIDB4MjYsIDB4MDcsIDB4MEUsCi0JMHhGMiwgMHg2MCwgMHgyOCwgMHg4MiwgMHgzNywgMHhFRCwgMHhGMSwgMHg1RSwgMHgwNiwgMHhGOCwgMHhGQywKLQkweDUxLCAweDAxLCAweDhBLCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0UsIDB4RkMsIDB4RDMsIDB4MDYsIDB4NTYsIDB4RjMsCi0JMHhCQSwgMHgyMCwgMHg2MSwgMHgzRCwgMHg1NiwgMHhGMywgMHg0NSwgMHgwNSwgMHhCNywgMHhGRCwgMHhERSwKLQkweDAwLCAweEM1LCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAotCTB4M0EsIDB4RkYsIDB4RDMsIDB4MDEsIDB4N0QsIDB4RkMsIDB4MjMsIDB4MDYsIDB4MzIsIDB4RjUsIDB4MEMsCi0JMHgxOSwgMHgzOCwgMHg0MiwgMHhDNywgMHhGNSwgMHhCOCwgMHgwMywgMHhBRiwgMHhGRSwgMHg0RSwgMHgwMCwKLQkweDBDLCAweDAwLCAweEVBLCAweEZGLCAweDA2LCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRBLAotCTB4RkYsIDB4QTcsIDB4MDEsIDB4RUMsIDB4RkMsIDB4MjgsIDB4MDUsIDB4NzcsIDB4RjcsIDB4OTIsIDB4MTEsCi0JMHhENywgMHg0NSwgMHg0MywgMHhGOSwgMHhDMywgMHgwMSwgMHhENiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg1RSwKLQkweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYzLCAweEZGLAotCTB4NjYsIDB4MDEsIDB4N0QsIDB4RkQsIDB4RjgsIDB4MDMsIDB4RkIsIDB4RjksIDB4ODksIDB4MEEsIDB4MUQsCi0JMHg0OCwgMHhDNSwgMHhGRCwgMHg3QSwgMHhGRiwgMHgxRCwgMHgwMSwgMHhGNywgMHhGRSwgMHhCNCwgMHgwMCwKLQkweEE5LCAweEZGLCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgyLCAweEZGLCAweDE4LAotCTB4MDEsIDB4MjcsIDB4RkUsIDB4QTksIDB4MDIsIDB4OTQsIDB4RkMsIDB4MjQsIDB4MDQsIDB4RjUsIDB4NDgsCi0JMHgzOSwgMHgwMywgMHhGOSwgMHhGQywgMHg3NCwgMHgwMiwgMHg0MiwgMHhGRSwgMHgwQiwgMHgwMSwgMHg4NywKLQkweEZGLCAweDFFLCAweDAwLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMyLCAweDAwLCAweERCLCAweEZFLAotCTB4NTIsIDB4MDEsIDB4MUIsIDB4RkYsIDB4OEQsIDB4RkUsIDB4NTcsIDB4NDgsIDB4ODEsIDB4MDksIDB4NjEsCi0JMHhGQSwgMHhDNiwgMHgwMywgMHg5NiwgMHhGRCwgMHg1QiwgMHgwMSwgMHg2OCwgMHhGRiwgMHgyNiwgMHgwMCwKLQkweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEM2LCAweEZGLCAweDZCLCAweDAwLCAweDhFLCAweEZGLCAweDA2LAotCTB4MDAsIDB4NkUsIDB4MDEsIDB4RTQsIDB4RjksIDB4NDgsIDB4NDYsIDB4NzUsIDB4MTAsIDB4RDcsIDB4RjcsCi0JMHhGQywgMHgwNCwgMHgwMCwgMHhGRCwgMHg5RSwgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDA3LCAweDAwLCAweEU1LCAweEZGLCAweDE4LCAweDAwLCAweDM2LCAweDAwLCAweEQ5LCAweEZFLAotCTB4NzEsIDB4MDMsIDB4M0YsIDB4RjYsIDB4REIsIDB4NDIsIDB4RTAsIDB4MTcsIDB4ODYsIDB4RjUsIDB4MDAsCi0JMHgwNiwgMHg4QywgMHhGQywgMHhDRSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENGLCAweEZGLCAweEM5LCAweDAwLCAweERBLCAweEZELCAweDBGLAotCTB4MDUsIDB4QTUsIDB4RjMsIDB4MzEsIDB4M0UsIDB4OEEsIDB4MUYsIDB4OTcsIDB4RjMsIDB4QkQsIDB4MDYsCi0JMHg0NCwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDE3LCAweDAwLCAweDkyLCAweEZGLCAweDQxLCAweDAxLCAweDExLCAweEZELCAweDNCLCAweDA2LAotCTB4MTQsIDB4RjIsIDB4NzgsIDB4MzgsIDB4MzYsIDB4MjcsIDB4MzUsIDB4RjIsIDB4MjAsIDB4MDcsIDB4MzMsCi0JMHhGQywgMHhERiwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDI4LCAweDAwLCAweDY0LCAweEZGLCAweDlBLCAweDAxLCAweDg4LCAweEZDLCAweEVFLCAweDA2LCAweDdFLAotCTB4RjEsIDB4RTMsIDB4MzEsIDB4OUYsIDB4MkUsIDB4ODgsIDB4RjEsIDB4MTksIDB4MDcsIDB4NUUsIDB4RkMsCi0JMHhCNywgMHgwMSwgMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMiwKLQkweDAwLCAweDQ2LCAweEZGLCAweEQxLCAweDAxLCAweDNGLCAweEZDLCAweDJCLCAweDA3LCAweENELCAweEYxLAotCTB4QUUsIDB4MkEsIDB4ODYsIDB4MzUsIDB4QjEsIDB4RjEsIDB4OUQsIDB4MDYsIDB4Q0EsIDB4RkMsIDB4NkUsCi0JMHgwMSwgMHg3QiwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEY3LCAweDA2LCAweEUwLCAweEYyLCAweDE4LAotCTB4MjMsIDB4QUIsIDB4M0IsIDB4Q0MsIDB4RjIsIDB4QTgsIDB4MDUsIDB4NzYsIDB4RkQsIDB4MDQsIDB4MDEsCi0JMHhCMSwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwKLQkweEZGLCAweERDLCAweDAxLCAweDY0LCAweEZDLCAweDYyLCAweDA2LCAweDkzLCAweEY0LCAweDY2LCAweDFCLAotCTB4RDksIDB4NDAsIDB4RUEsIDB4RjQsIDB4M0UsIDB4MDQsIDB4NUQsIDB4RkUsIDB4N0QsIDB4MDAsIDB4RjUsCi0JMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NCwgMHhGRiwKLQkweEI3LCAweDAxLCAweEM1LCAweEZDLCAweDdDLCAweDA1LCAweEJDLCAweEY2LCAweEQ1LCAweDEzLCAweERDLAotCTB4NDQsIDB4MTQsIDB4RjgsIDB4NjcsIDB4MDIsIDB4NzcsIDB4RkYsIDB4REQsIDB4RkYsIDB4NDQsIDB4MDAsCi0JMHhENSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QiwgMHhGRiwgMHg3QywKLQkweDAxLCAweDRFLCAweEZELCAweDVBLCAweDA0LCAweDMxLCAweEY5LCAweEE0LCAweDBDLCAweDkwLCAweDQ3LAotCTB4NDcsIDB4RkMsIDB4MzYsIDB4MDAsIDB4QjYsIDB4MDAsIDB4MkUsIDB4RkYsIDB4OTksIDB4MDAsIDB4QjMsCi0JMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OCwgMHhGRiwgMHgzMSwgMHgwMSwKLQkweEYxLCAweEZELCAweDEyLCAweDAzLCAweEM3LCAweEZCLCAweDA3LCAweDA2LCAweERCLCAweDQ4LCAweDczLAotCTB4MDEsIDB4QzMsIDB4RkQsIDB4MEEsIDB4MDIsIDB4NzksIDB4RkUsIDB4RjEsIDB4MDAsIDB4OTEsIDB4RkYsCi0JMHgxQiwgMHgwMCwgMHgxOSwgMHgwMCwgMHg5OSwgMHhGRiwgMHhERCwgMHgwMCwgMHhBMywgMHhGRSwgMHhCQiwKLQkweDAxLCAweDU4LCAweEZFLCAweDJELCAweDAwLCAweEFGLCAweDQ4LCAweDdFLCAweDA3LCAweDJFLCAweEZCLAotCTB4NjAsIDB4MDMsIDB4QzksIDB4RkQsIDB4NDMsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgxMCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg2QSwgMHgwMCwKLQkweEJFLCAweDAwLCAweDM4LCAweEZCLCAweDBGLCAweDQ3LCAweDQyLCAweDBFLCAweDlCLCAweEY4LCAweEExLAotCTB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhEQywKLQkweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LCAweDM0LCAweEY2LCAweEI3LCAweDA1LAotCTB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwgMHgwNCwKLQkweDU1LCAweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LCAweDU1LAotCTB4RkMsIDB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxMSwgMHgwMCwgMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwKLQkweEYyLCAweDU0LCAweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLAotCTB4RTQsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MjMsCi0JMHgwMCwgMHg3MSwgMHhGRiwgMHg4MiwgMHgwMSwgMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwKLQkweEZELCAweDMzLCAweDYyLCAweDJDLCAweEE4LCAweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LAotCTB4MDEsIDB4NEMsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHg0RSwgMHhGRiwgMHhDMywgMHgwMSwgMHg0RSwgMHhGQywgMHgyNCwgMHgwNywgMHg5RSwgMHhGMSwgMHhGMiwKLQkweDJDLCAweDc4LCAweDMzLCAweDhDLCAweEYxLCAweEQwLCAweDA2LCAweEEyLCAweEZDLCAweDg4LCAweDAxLAotCTB4NkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsCi0JMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgxMiwgMHgwNywgMHg3OSwgMHhGMiwgMHg3MywgMHgyNSwKLQkweERGLCAweDM5LCAweDVBLCAweEYyLCAweDAwLCAweDA2LCAweDNBLCAweEZELCAweDI4LCAweDAxLCAweDlGLAotCTB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCi0JMHhFMiwgMHgwMSwgMHg1MCwgMHhGQywgMHg5OSwgMHgwNiwgMHhGRSwgMHhGMywgMHhDMywgMHgxRCwgMHg1RSwKLQkweDNGLCAweDI3LCAweEY0LCAweEI5LCAweDA0LCAweDEwLCAweEZFLCAweEE5LCAweDAwLCAweERGLCAweEZGLAotCTB4RkIsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzUsCi0JMHgwMSwgMHhBMywgMHhGQywgMHhDQSwgMHgwNSwgMHgwNywgMHhGNiwgMHgyMiwgMHgxNiwgMHhDMywgMHg0MywKLQkweEZFLCAweEY2LCAweDAyLCAweDAzLCAweDFCLCAweEZGLCAweDExLCAweDAwLCAweDJCLCAweDAwLCAweERFLAotCTB4RkYsIDB4MDksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsIDB4OTAsIDB4MDEsCi0JMHgyMCwgMHhGRCwgMHhCOCwgMHgwNCwgMHg2QSwgMHhGOCwgMHhDRCwgMHgwRSwgMHhFMSwgMHg0NiwgMHhFMSwKLQkweEZBLCAweEVCLCAweDAwLCAweDUxLCAweDAwLCAweDY1LCAweEZGLCAweDdGLCAweDAwLCAweEJFLCAweEZGLAotCTB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4NDksIDB4MDEsIDB4QkMsCi0JMHhGRCwgMHg3QSwgMHgwMywgMHhGQSwgMHhGQSwgMHhGRCwgMHgwNywgMHg5QywgMHg0OCwgMHhDMywgMHhGRiwKLQkweDg5LCAweEZFLCAweEExLCAweDAxLCAweEIxLCAweEZFLCAweEQ2LCAweDAwLCAweDlDLCAweEZGLCAweDE4LAotCTB4MDAsIDB4MUMsIDB4MDAsIDB4OEYsIDB4RkYsIDB4RjcsIDB4MDAsIDB4NkIsIDB4RkUsIDB4MjUsIDB4MDIsCi0JMHg5MSwgMHhGRCwgMHhFMywgMHgwMSwgMHhFNSwgMHg0OCwgMHg4RCwgMHgwNSwgMHhGQiwgMHhGQiwgMHhGOCwKLQkweDAyLCAweEZFLCAweEZELCAweDJCLCAweDAxLCAweDdBLCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLAotCTB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QTAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDcsCi0JMHgwMCwgMHhBNCwgMHhGQywgMHhCNiwgMHg0NywgMHgxQywgMHgwQywgMHg2MywgMHhGOSwgMHg0MiwgMHgwNCwKLQkweDU5LCAweEZELCAweDc2LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDBCLAotCTB4MDAsIDB4RDIsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4M0YsIDB4MDIsCi0JMHg1RSwgMHhGOCwgMHgxRSwgMHg0NSwgMHg0NCwgMHgxMywgMHhFQSwgMHhGNiwgMHg2NywgMHgwNSwgMHhDRiwKLQkweEZDLCAweEIzLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDA1LCAweDAwLAotCTB4RjAsIDB4RkYsIDB4RkIsIDB4RkYsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkUsIDB4MUQsIDB4MDQsIDB4MUYsCi0JMHhGNSwgMHgzMiwgMHg0MSwgMHhDRSwgMHgxQSwgMHhCQSwgMHhGNCwgMHg1MywgMHgwNiwgMHg2QSwgMHhGQywKLQkweERBLCAweDAxLCAweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBBLAotCTB4MDAsIDB4QjYsIDB4RkYsIDB4RkIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4OTAsIDB4MDUsIDB4RUMsIDB4RjIsCi0JMHgxQywgMHgzQywgMHg4MSwgMHgyMiwgMHhGQywgMHhGMiwgMHhFRiwgMHgwNiwgMHgzNiwgMHhGQywgMHhFNiwKLQkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAotCTB4N0YsIDB4RkYsIDB4NjcsIDB4MDEsIDB4RDUsIDB4RkMsIDB4OEUsIDB4MDYsIDB4QkUsIDB4RjEsIDB4MDYsCi0JMHgzNiwgMHgxQSwgMHgyQSwgMHhEQywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQywgMHhGQywgMHhEMywgMHgwMSwKLQkweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LAotCTB4RkYsIDB4QjMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4MTMsIDB4MDcsIDB4ODMsIDB4RjEsIDB4MkMsIDB4MkYsCi0JMHg1QSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGNywgMHgwNiwgMHg4MCwgMHhGQywgMHg5RiwgMHgwMSwgMHg2MSwKLQkweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLAotCTB4REQsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjMsIDB4MDcsIDB4MjEsIDB4RjIsIDB4Q0IsIDB4MjcsIDB4RkUsCi0JMHgzNywgMHgwMCwgMHhGMiwgMHg0RCwgMHgwNiwgMHgwNCwgMHhGRCwgMHg0OSwgMHgwMSwgMHg4RSwgMHhGRiwKLQkweDE5LCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LAotCTB4MDEsIDB4NDEsIDB4RkMsIDB4QzgsIDB4MDYsIDB4NzYsIDB4RjMsIDB4MjIsIDB4MjAsIDB4Q0EsIDB4M0QsCi0JMHg3RCwgMHhGMywgMHgyQSwgMHgwNSwgMHhDOCwgMHhGRCwgMHhENCwgMHgwMCwgMHhDQSwgMHhGRiwgMHgwMywKLQkweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLCAweEQxLCAweDAxLAotCTB4ODQsIDB4RkMsIDB4MTIsIDB4MDYsIDB4NUMsIDB4RjUsIDB4NzYsIDB4MTgsIDB4ODksIDB4NDIsIDB4MDIsCi0JMHhGNiwgMHg5NCwgMHgwMywgMHhDNCwgMHhGRSwgMHg0MiwgMHgwMCwgMHgxMiwgMHgwMCwgMHhFOCwgMHhGRiwKLQkweDA3LCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEEyLCAweDAxLCAweEY2LAotCTB4RkMsIDB4MTIsIDB4MDUsIDB4QTcsIDB4RjcsIDB4MDMsIDB4MTEsIDB4MTAsIDB4NDYsIDB4OTMsIDB4RjksCi0JMHg5OCwgMHgwMSwgMHhFRSwgMHhGRiwgMHg5QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOCwgMHhGRiwgMHgwRSwKLQkweDAwLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDYwLCAweDAxLCAweDhBLCAweEZELAotCTB4REYsIDB4MDMsIDB4MkUsIDB4RkEsIDB4MDQsIDB4MEEsIDB4M0EsIDB4NDgsIDB4MjgsIDB4RkUsIDB4NEIsCi0JMHhGRiwgMHgzOCwgMHgwMSwgMHhFOSwgMHhGRSwgMHhCQiwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMCwKLQkweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLAotCTB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsCi0JMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEY0LCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweDAwLCAweDA3LCAweDAzLCAweDE2LCAweDA2LAotCTB4N0MsIDB4MDksIDB4MkEsIDB4MEMsIDB4MkUsIDB4MEQsIDB4MkEsIDB4MEMsIDB4N0MsIDB4MDksIDB4MTYsCi0JMHgwNiwgMHgwNywgMHgwMywgMHhGRiwgMHgwMCwgMHgxQSwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGMiwgMHhGRiwKLQkweEEwLCAweEZGLCAweDcxLCAweEZGLCAweDcxLCAweDAwLCAweDg2LCAweDAzLCAweDczLCAweDA4LCAweDg4LAotCTB4MEQsIDB4NzgsIDB4MTAsIDB4QzksIDB4MEYsIDB4RDUsIDB4MEIsIDB4OEIsIDB4MDYsIDB4MjgsIDB4MDIsCi0JMHhERiwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDMywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQywKLQkweEZGLCAweDgwLCAweEZGLCAweDlBLCAweEZGLCAweDQ2LCAweDAxLCAweDFFLCAweDA1LCAweDVBLCAweDBBLAotCTB4RUQsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QUYsIDB4MEUsIDB4RkQsIDB4MDksIDB4Q0IsIDB4MDQsIDB4MTgsCi0JMHgwMSwgMHg4RSwgMHhGRiwgMHg4NSwgMHhGRiwgMHhFMSwgMHhGRiwgMHhGQywgMHhGRiwgMHhCRCwgMHhGRiwKLQkweDZELCAweEZGLCAweEY2LCAweEZGLCAweDY1LCAweDAyLCAweEU1LCAweDA2LCAweDJCLCAweDBDLCAweEYzLAotCTB4MEYsIDB4NjAsIDB4MTAsIDB4M0IsIDB4MEQsIDB4MTYsIDB4MDgsIDB4M0YsIDB4MDMsIDB4NTAsIDB4MDAsCi0JMHg2RSwgMHhGRiwgMHhBNywgMHhGRiwgMHhGNSwgMHhGRiwgMHhFRiwgMHhGRiwgMHg5QSwgMHhGRiwgMHg3NSwKLQkweEZGLCAweDkxLCAweDAwLCAweEM5LCAweDAzLCAweEM4LCAweDA4LCAweENDLCAweDBELCAweDg5LCAweDEwLAotCTB4OUYsIDB4MEYsIDB4ODUsIDB4MEIsIDB4M0IsIDB4MDYsIDB4RjQsIDB4MDEsIDB4Q0QsIDB4RkYsIDB4NzIsCi0JMHhGRiwgMHhDOSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhENywgMHhGRiwgMHg3QiwgMHhGRiwKLQkweEE1LCAweEZGLCAweDczLCAweDAxLCAweDZBLCAweDA1LCAweEFELCAweDBBLCAweDIxLCAweDBGLCAweEE2LAotCTB4MTAsIDB4NzQsIDB4MEUsIDB4QTksIDB4MDksIDB4ODMsIDB4MDQsIDB4RjAsIDB4MDAsIDB4ODUsIDB4RkYsCi0JMHg4QiwgMHhGRiwgMHhFNSwgMHhGRiwgMHhGQSwgMHhGRiwgMHhCNywgMHhGRiwgMHg2QywgMHhGRiwgMHgwQywKLQkweDAwLCAweDlELCAweDAyLCAweDM3LCAweDA3LCAweDc4LCAweDBDLCAweDE1LCAweDEwLCAweDQ3LCAweDEwLAotCTB4RjMsIDB4MEMsIDB4QzIsIDB4MDcsIDB4MDEsIDB4MDMsIDB4MzUsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUQsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHhFQiwgMHhGRiwgMHg5NCwgMHhGRiwgMHg3QSwgMHhGRiwgMHhCMywgMHgwMCwKLQkweDBELCAweDA0LCAweDFDLCAweDA5LCAweDBELCAweDBFLCAweDk3LCAweDEwLCAweDczLCAweDBGLCAweDM1LAotCTB4MEIsIDB4RUIsIDB4MDUsIDB4QzEsIDB4MDEsIDB4QkQsIDB4RkYsIDB4NzUsIDB4RkYsIDB4Q0UsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMiwgMHhGRiwgMHg3NywgMHhGRiwgMHhCMywgMHhGRiwgMHhBMSwKLQkweDAxLCAweEI3LCAweDA1LCAweEZGLCAweDBBLCAweDUzLCAweDBGLCAweDlFLCAweDEwLCAweDM3LCAweDBFLAotCTB4NTUsIDB4MDksIDB4M0IsIDB4MDQsIDB4Q0IsIDB4MDAsIDB4N0UsIDB4RkYsIDB4OTAsIDB4RkYsIDB4RTksCi0JMHhGRiwgMHhGOCwgMHhGRiwgMHhCMSwgMHhGRiwgMHg2QywgMHhGRiwgMHgyNCwgMHgwMCwgMHhEOCwgMHgwMiwKLQkweDhBLCAweDA3LCAweEMyLCAweDBDLCAweDM0LCAweDEwLCAweDJBLCAweDEwLCAweEFBLCAweDBDLCAweDZGLAotCTB4MDcsIDB4QzQsIDB4MDIsIDB4MUMsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjMsIDB4RkYsIDB4RjksIDB4RkYsCi0JMHhFOCwgMHhGRiwgMHg4RSwgMHhGRiwgMHg4MCwgMHhGRiwgMHhENywgMHgwMCwgMHg1MywgMHgwNCwgMHg3MSwKLQkweDA5LCAweDRDLCAweDBFLCAweEExLCAweDEwLCAweDQzLCAweDBGLCAweEUzLCAweDBBLCAweDlELCAweDA1LAotCTB4OTEsIDB4MDEsIDB4QUUsIDB4RkYsIDB4NzksIDB4RkYsIDB4RDQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhDRCwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDMiwgMHhGRiwgMHhEMiwgMHgwMSwgMHgwNiwgMHgwNiwKLQkweDUwLCAweDBCLCAweDgyLCAweDBGLCAweDkzLCAweDEwLCAweEY4LCAweDBELCAweDAwLCAweDA5LCAweEY2LAotCTB4MDMsIDB4QTcsIDB4MDAsIDB4NzgsIDB4RkYsIDB4OTYsIDB4RkYsIDB4RUMsIDB4RkYsIDB4RjYsIDB4RkYsCi0JMHhBQiwgMHhGRiwgMHg2RCwgMHhGRiwgMHgzRSwgMHgwMCwgMHgxNSwgMHgwMywgMHhERSwgMHgwNywgMHgwQiwKLQkweDBELCAweDUwLCAweDEwLCAweDBBLCAweDEwLCAweDVFLCAweDBDLCAweDFDLCAweDA3LCAweDhBLCAweDAyLAotCTB4MDQsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjksIDB4RkYsIDB4RkIsIDB4RkYsIDB4RTQsIDB4RkYsIDB4ODksCi0JMHhGRiwgMHg4OCwgMHhGRiwgMHhGRCwgMHgwMCwgMHg5QiwgMHgwNCwgMHhDNSwgMHgwOSwgMHg4OCwgMHgwRSwKLQkweEE4LCAweDEwLCAweDEwLCAweDBGLCAweDkxLCAweDBBLCAweDUwLCAweDA1LCAweDY0LCAweDAxLCAweEExLAotCTB4RkYsIDB4N0QsIDB4RkYsIDB4RDksIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzcsIDB4RkYsCi0JMHg3MSwgMHhGRiwgMHhEMywgMHhGRiwgMHgwNSwgMHgwMiwgMHg1NSwgMHgwNiwgMHhBMCwgMHgwQiwgMHhBRCwKLQkweDBGLCAweDg0LCAweDEwLCAweEI2LCAweDBELCAweEFDLCAweDA4LCAweEIzLCAweDAzLCAweDg2LCAweDAwLAotCTB4NzQsIDB4RkYsIDB4OUMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4RjQsIDB4RkYsIDB4QTUsIDB4RkYsIDB4NkYsCi0JMHhGRiwgMHg1QSwgMHgwMCwgMHg1NCwgMHgwMywgMHgzMiwgMHgwOCwgMHg1MiwgMHgwRCwgMHg2OCwgMHgxMCwKLQkweEU2LCAweDBGLCAweDExLCAweDBDLCAweENBLCAweDA2LCAweDUyLCAweDAyLCAweEVGLCAweEZGLCAweDZFLAotCTB4RkYsIDB4QkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4REYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4OTEsIDB4RkYsCi0JMHgyNSwgMHgwMSwgMHhFNCwgMHgwNCwgMHgxOSwgMHgwQSwgMHhDMiwgMHgwRSwgMHhBQSwgMHgxMCwgMHhEQSwKLQkweDBFLCAweDNFLCAweDBBLCAweDA1LCAweDA1LCAweDM4LCAweDAxLCAweDk2LCAweEZGLCAweDgxLCAweEZGLAotCTB4REQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QzEsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RTYsCi0JMHhGRiwgMHgzQSwgMHgwMiwgMHhBNiwgMHgwNiwgMHhFRiwgMHgwQiwgMHhENiwgMHgwRiwgMHg3MSwgMHgxMCwKLQkweDcxLCAweDBELCAweDU3LCAweDA4LCAweDcxLCAweDAzLCAweDY3LCAweDAwLCAweDcwLCAweEZGLCAweEEyLAotCTB4RkYsIDB4RjMsIDB4RkYsIDB4RjEsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NzIsIDB4RkYsIDB4NzgsIDB4MDAsCi0JMHg5NSwgMHgwMywgMHg4NiwgMHgwOCwgMHg5OCwgMHgwRCwgMHg3QywgMHgxMCwgMHhDMCwgMHgwRiwgMHhDMywKLQkweDBCLCAweDc5LCAweDA2LCAweDFDLCAweDAyLCAweERCLCAweEZGLCAweDcwLCAweEZGLCAweEM1LCAweEZGLAotCTB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REIsIDB4RkYsIDB4N0YsIDB4RkYsIDB4OUMsIDB4RkYsIDB4NTAsCi0JMHgwMSwgMHgyRiwgMHgwNSwgMHg2QywgMHgwQSwgMHhGOSwgMHgwRSwgMHhBOSwgMHgxMCwgMHhBMiwgMHgwRSwKLQkweEVBLCAweDA5LCAweEJCLCAweDA0LCAweDBGLCAweDAxLCAweDhDLCAweEZGLCAweDg3LCAweEZGLCAweEUyLAotCTB4RkYsIDB4RkMsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4RkEsIDB4RkYsIDB4NzEsIDB4MDIsCi0JMHhGNywgMHgwNiwgMHgzQywgMHgwQywgMHhGQiwgMHgwRiwgMHg1QiwgMHgxMCwgMHgyQiwgMHgwRCwgMHgwMywKLQkweDA4LCAweDMxLCAweDAzLCAweDRBLCAweDAwLCAweDZFLCAweEZGLCAweEE4LCAweEZGLCAweEY1LCAweEZGLAotCTB4RUUsIDB4RkYsIDB4OTksIDB4RkYsIDB4NzYsIDB4RkYsIDB4OTgsIDB4MDAsIDB4RDgsIDB4MDMsIDB4REIsCi0JMHgwOCwgMHhEQiwgMHgwRCwgMHg4RCwgMHgxMCwgMHg5NiwgMHgwRiwgMHg3MywgMHgwQiwgMHgyOSwgMHgwNiwKLQkweEU4LCAweDAxLCAweEM5LCAweEZGLCAweDcyLCAweEZGLCAweENBLCAweEZGLCAweEZFLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RDYsIDB4RkYsIDB4N0EsIDB4RkYsIDB4QTgsIDB4RkYsIDB4N0QsIDB4MDEsIDB4N0IsIDB4MDUsCi0JMHhCRiwgMHgwQSwgMHgyRCwgMHgwRiwgMHhBNSwgMHgxMCwgMHg2NywgMHgwRSwgMHg5NiwgMHgwOSwgMHg3MywKLQkweDA0LCAweEU3LCAweDAwLCAweDg0LCAweEZGLCAweDhDLCAweEZGLCAweEU2LCAweEZGLCAweEZBLCAweEZGLAotCTB4QjYsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QUEsIDB4MDIsIDB4NEEsIDB4MDcsIDB4ODgsCi0JMHgwQywgMHgxQywgMHgxMCwgMHg0MSwgMHgxMCwgMHhFMywgMHgwQywgMHhBRiwgMHgwNywgMHhGMywgMHgwMiwKLQkweDJGLCAweDAwLCAweDZDLCAweEZGLCAweEFFLCAweEZGLCAweEY3LCAweEZGLCAweEVBLCAweEZGLCAweDkzLAotCTB4RkYsIDB4N0IsIDB4RkYsIDB4QkIsIDB4MDAsIDB4MUMsIDB4MDQsIDB4MkYsIDB4MDksIDB4MUIsIDB4MEUsCi0JMHg5QSwgMHgxMCwgMHg2OCwgMHgwRiwgMHgyMywgMHgwQiwgMHhEQSwgMHgwNSwgMHhCNywgMHgwMSwgMHhCOSwKLQkweEZGLCAweDc2LCAweEZGLCAweEQwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQxLCAweEZGLAotCTB4NzYsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QUMsIDB4MDEsIDB4QzgsIDB4MDUsIDB4MTEsIDB4MEIsIDB4NUUsCi0JMHgwRiwgMHg5QywgMHgxMCwgMHgyOSwgMHgwRSwgMHg0MiwgMHgwOSwgMHgyQywgMHgwNCwgMHhDMiwgMHgwMCwKLQkweDdELCAweEZGLCAweDkyLCAweEZGLCAweEVBLCAweEZGLCAweEY4LCAweEZGLCAweEIwLCAweEZGLCAweDZDLAotCTB4RkYsIDB4MjksIDB4MDAsIDB4RTYsIDB4MDIsIDB4OUQsIDB4MDcsIDB4RDMsIDB4MEMsIDB4M0IsIDB4MTAsCi0JMHgyMywgMHgxMCwgMHg5OSwgMHgwQywgMHg1QywgMHgwNywgMHhCNywgMHgwMiwgMHgxNiwgMHgwMCwgMHg2QywKLQkweEZGLCAweEI0LCAweEZGLCAweEY5LCAweEZGLCAweEU3LCAweEZGLCAweDhELCAweEZGLCAweDgyLCAweEZGLAotCTB4REYsIDB4MDAsIDB4NjMsIDB4MDQsIDB4ODQsIDB4MDksIDB4NTksIDB4MEUsIDB4QTMsIDB4MTAsIDB4MzgsCi0JMHgwRiwgMHhEMSwgMHgwQSwgMHg4QywgMHgwNSwgMHg4NywgMHgwMSwgMHhBQiwgMHhGRiwgMHg3OSwgMHhGRiwKLQkweEQ1LCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweENCLCAweEZGLCAweDczLCAweEZGLCAweEM2LAotCTB4RkYsIDB4REQsIDB4MDEsIDB4MTcsIDB4MDYsIDB4NjIsIDB4MEIsIDB4OEMsIDB4MEYsIDB4OTAsIDB4MTAsCi0JMHhFOSwgMHgwRCwgMHhFRCwgMHgwOCwgMHhFNywgMHgwMywgMHhBMCwgMHgwMCwgMHg3NywgMHhGRiwgMHg5NywKLQkweEZGLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweEE5LCAweEZGLCAweDZELCAweEZGLCAweDQ0LCAweDAwLAotCTB4MjMsIDB4MDMsIDB4RjEsIDB4MDcsIDB4MUIsIDB4MEQsIDB4NTUsIDB4MTAsIDB4MDIsIDB4MTAsIDB4NEQsCi0JMHgwQywgMHgwQSwgMHgwNywgMHg3RSwgMHgwMiwgMHhGRiwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCQSwgMHhGRiwKLQkweEZCLCAweEZGLCAweEUzLCAweEZGLCAweDg4LCAweEZGLCAweDhBLCAweEZGLCAweDA2LCAweDAxLCAweEFCLAotCTB4MDQsIDB4RDgsIDB4MDksIDB4OTUsIDB4MEUsIDB4QTksIDB4MTAsIDB4MDUsIDB4MEYsIDB4N0YsIDB4MEEsCi0JMHg0MCwgMHgwNSwgMHg1QSwgMHgwMSwgMHg5RiwgMHhGRiwgMHg3RSwgMHhGRiwgMHhEQSwgMHhGRiwgMHgwMCwKLQkweDAwLCAweEZFLCAweEZGLCAweEM2LCAweEZGLCAweDcwLCAweEZGLCAweEQ3LCAweEZGLCAweDEwLCAweDAyLAotCTB4NjcsIDB4MDYsIDB4QjEsIDB4MEIsIDB4QjcsIDB4MEYsIDB4ODAsIDB4MTAsIDB4QTcsIDB4MEQsIDB4OTksCi0JMHgwOCwgMHhBNCwgMHgwMywgMHg3RiwgMHgwMCwgMHg3MywgMHhGRiwgMHg5RCwgMHhGRiwgMHhGMCwgMHhGRiwKLQkweEYzLCAweEZGLCAweEEzLCAweEZGLCAweDcwLCAweEZGLCAweDYwLCAweDAwLCAweDYyLCAweDAzLCAweDQ1LAotCTB4MDgsIDB4NjIsIDB4MEQsIDB4NkMsIDB4MTAsIDB4REUsIDB4MEYsIDB4MDAsIDB4MEMsIDB4QjgsIDB4MDYsCi0JMHg0NiwgMHgwMiwgMHhFQSwgMHhGRiwgMHg2RSwgMHhGRiwgMHhDMCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweERFLCAweEZGLCAweDgzLCAweEZGLCAweDk0LCAweEZGLCAweDJGLCAweDAxLCAweEY0LCAweDA0LAotCTB4MkIsIDB4MEEsIDB4Q0UsIDB4MEUsIDB4QUEsIDB4MTAsIDB4Q0UsIDB4MEUsIDB4MkIsIDB4MEEsIDB4RjQsCi0JMHgwNCwgMHgyRiwgMHgwMSwgMHg5NCwgMHhGRiwgMHg4MywgMHhGRiwgMHhERSwgMHhGRiwgMHhGRCwgMHhGRiwKLQkweEMwLCAweEZGLCAweDZFLCAweEZGLCAweEVBLCAweEZGLCAweDQ2LCAweDAyLCAweEI4LCAweDA2LCAweDAwLAotCTB4MEMsIDB4REUsIDB4MEYsIDB4NkMsIDB4MTAsIDB4NjIsIDB4MEQsIDB4NDUsIDB4MDgsIDB4NjIsIDB4MDMsCi0JMHg2MCwgMHgwMCwgMHg3MCwgMHhGRiwgMHhBMywgMHhGRiwgMHhGMywgMHhGRiwgMHhGMCwgMHhGRiwgMHg5RCwKLQkweEZGLCAweDczLCAweEZGLCAweDdGLCAweDAwLCAweEE0LCAweDAzLCAweDk5LCAweDA4LCAweEE3LCAweDBELAotCTB4ODAsIDB4MTAsIDB4QjcsIDB4MEYsIDB4QjEsIDB4MEIsIDB4NjcsIDB4MDYsIDB4MTAsIDB4MDIsIDB4RDcsCi0JMHhGRiwgMHg3MCwgMHhGRiwgMHhDNiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQSwgMHhGRiwKLQkweDdFLCAweEZGLCAweDlGLCAweEZGLCAweDVBLCAweDAxLCAweDQwLCAweDA1LCAweDdGLCAweDBBLCAweDA1LAotCTB4MEYsIDB4QTksIDB4MTAsIDB4OTUsIDB4MEUsIDB4RDgsIDB4MDksIDB4QUIsIDB4MDQsIDB4MDYsIDB4MDEsCi0JMHg4QSwgMHhGRiwgMHg4OCwgMHhGRiwgMHhFMywgMHhGRiwgMHhGQiwgMHhGRiwgMHhCQSwgMHhGRiwgMHg2RCwKLQkweEZGLCAweEZGLCAweEZGLCAweDdFLCAweDAyLCAweDBBLCAweDA3LCAweDRELCAweDBDLCAweDAyLCAweDEwLAotCTB4NTUsIDB4MTAsIDB4MUIsIDB4MEQsIDB4RjEsIDB4MDcsIDB4MjMsIDB4MDMsIDB4NDQsIDB4MDAsIDB4NkQsCi0JMHhGRiwgMHhBOSwgMHhGRiwgMHhGNiwgMHhGRiwgMHhFRCwgMHhGRiwgMHg5NywgMHhGRiwgMHg3NywgMHhGRiwKLQkweEEwLCAweDAwLCAweEU3LCAweDAzLCAweEVELCAweDA4LCAweEU5LCAweDBELCAweDkwLCAweDEwLCAweDhDLAotCTB4MEYsIDB4NjIsIDB4MEIsIDB4MTcsIDB4MDYsIDB4REQsIDB4MDEsIDB4QzYsIDB4RkYsIDB4NzMsIDB4RkYsCi0JMHhDQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhENSwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBQiwKLQkweEZGLCAweDg3LCAweDAxLCAweDhDLCAweDA1LCAweEQxLCAweDBBLCAweDM4LCAweDBGLCAweEEzLCAweDEwLAotCTB4NTksIDB4MEUsIDB4ODQsIDB4MDksIDB4NjMsIDB4MDQsIDB4REYsIDB4MDAsIDB4ODIsIDB4RkYsIDB4OEQsCi0JMHhGRiwgMHhFNywgMHhGRiwgMHhGOSwgMHhGRiwgMHhCNCwgMHhGRiwgMHg2QywgMHhGRiwgMHgxNiwgMHgwMCwKLQkweEI3LCAweDAyLCAweDVDLCAweDA3LCAweDk5LCAweDBDLCAweDIzLCAweDEwLCAweDNCLCAweDEwLCAweEQzLAotCTB4MEMsIDB4OUQsIDB4MDcsIDB4RTYsIDB4MDIsIDB4MjksIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjAsIDB4RkYsCi0JMHhGOCwgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MiwgMHhGRiwgMHg3RCwgMHhGRiwgMHhDMiwgMHgwMCwgMHgyQywKLQkweDA0LCAweDQyLCAweDA5LCAweDI5LCAweDBFLCAweDlDLCAweDEwLCAweDVFLCAweDBGLCAweDExLCAweDBCLAotCTB4QzgsIDB4MDUsIDB4QUMsIDB4MDEsIDB4QjYsIDB4RkYsIDB4NzYsIDB4RkYsIDB4RDEsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHhGRiwgMHg3NiwgMHhGRiwgMHhCOSwgMHhGRiwgMHhCNywgMHgwMSwKLQkweERBLCAweDA1LCAweDIzLCAweDBCLCAweDY4LCAweDBGLCAweDlBLCAweDEwLCAweDFCLCAweDBFLCAweDJGLAotCTB4MDksIDB4MUMsIDB4MDQsIDB4QkIsIDB4MDAsIDB4N0IsIDB4RkYsIDB4OTMsIDB4RkYsIDB4RUEsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHhBRSwgMHhGRiwgMHg2QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGMywgMHgwMiwgMHhBRiwKLQkweDA3LCAweEUzLCAweDBDLCAweDQxLCAweDEwLCAweDFDLCAweDEwLCAweDg4LCAweDBDLCAweDRBLCAweDA3LAotCTB4QUEsIDB4MDIsIDB4MTEsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTYsCi0JMHhGRiwgMHg4QywgMHhGRiwgMHg4NCwgMHhGRiwgMHhFNywgMHgwMCwgMHg3MywgMHgwNCwgMHg5NiwgMHgwOSwKLQkweDY3LCAweDBFLCAweEE1LCAweDEwLCAweDJELCAweDBGLCAweEJGLCAweDBBLCAweDdCLCAweDA1LCAweDdELAotCTB4MDEsIDB4QTgsIDB4RkYsIDB4N0EsIDB4RkYsIDB4RDYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhDQSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDOSwgMHhGRiwgMHhFOCwgMHgwMSwgMHgyOSwgMHgwNiwgMHg3MywKLQkweDBCLCAweDk2LCAweDBGLCAweDhELCAweDEwLCAweERCLCAweDBELCAweERCLCAweDA4LCAweEQ4LCAweDAzLAotCTB4OTgsIDB4MDAsIDB4NzYsIDB4RkYsIDB4OTksIDB4RkYsIDB4RUUsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTgsCi0JMHhGRiwgMHg2RSwgMHhGRiwgMHg0QSwgMHgwMCwgMHgzMSwgMHgwMywgMHgwMywgMHgwOCwgMHgyQiwgMHgwRCwKLQkweDVCLCAweDEwLCAweEZCLCAweDBGLCAweDNDLCAweDBDLCAweEY3LCAweDA2LCAweDcxLCAweDAyLCAweEZBLAotCTB4RkYsIDB4NkQsIDB4RkYsIDB4QkMsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RTIsIDB4RkYsIDB4ODcsIDB4RkYsCi0JMHg4QywgMHhGRiwgMHgwRiwgMHgwMSwgMHhCQiwgMHgwNCwgMHhFQSwgMHgwOSwgMHhBMiwgMHgwRSwgMHhBOSwKLQkweDEwLCAweEY5LCAweDBFLCAweDZDLCAweDBBLCAweDJGLCAweDA1LCAweDUwLCAweDAxLCAweDlDLCAweEZGLAotCTB4N0YsIDB4RkYsIDB4REIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzUsIDB4RkYsIDB4NzAsCi0JMHhGRiwgMHhEQiwgMHhGRiwgMHgxQywgMHgwMiwgMHg3OSwgMHgwNiwgMHhDMywgMHgwQiwgMHhDMCwgMHgwRiwKLQkweDdDLCAweDEwLCAweDk4LCAweDBELCAweDg2LCAweDA4LCAweDk1LCAweDAzLCAweDc4LCAweDAwLCAweDcyLAotCTB4RkYsIDB4OUYsIDB4RkYsIDB4RjEsIDB4RkYsIDB4RjMsIDB4RkYsIDB4QTIsIDB4RkYsIDB4NzAsIDB4RkYsCi0JMHg2NywgMHgwMCwgMHg3MSwgMHgwMywgMHg1NywgMHgwOCwgMHg3MSwgMHgwRCwgMHg3MSwgMHgxMCwgMHhENiwKLQkweDBGLCAweEVGLCAweDBCLCAweEE2LCAweDA2LCAweDNBLCAweDAyLCAweEU2LCAweEZGLCAweDZFLCAweEZGLAotCTB4QzEsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REQsIDB4RkYsIDB4ODEsIDB4RkYsIDB4OTYsCi0JMHhGRiwgMHgzOCwgMHgwMSwgMHgwNSwgMHgwNSwgMHgzRSwgMHgwQSwgMHhEQSwgMHgwRSwgMHhBQSwgMHgxMCwKLQkweEMyLCAweDBFLCAweDE5LCAweDBBLCAweEU0LCAweDA0LCAweDI1LCAweDAxLCAweDkxLCAweEZGLCAweDg0LAotCTB4RkYsIDB4REYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkYsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RUYsIDB4RkYsCi0JMHg1MiwgMHgwMiwgMHhDQSwgMHgwNiwgMHgxMSwgMHgwQywgMHhFNiwgMHgwRiwgMHg2OCwgMHgxMCwgMHg1MiwKLQkweDBELCAweDMyLCAweDA4LCAweDU0LCAweDAzLCAweDVBLCAweDAwLCAweDZGLCAweEZGLCAweEE1LCAweEZGLAotCTB4RjQsIDB4RkYsIDB4RjAsIDB4RkYsIDB4OUMsIDB4RkYsIDB4NzQsIDB4RkYsIDB4ODYsIDB4MDAsIDB4QjMsCi0JMHgwMywgMHhBQywgMHgwOCwgMHhCNiwgMHgwRCwgMHg4NCwgMHgxMCwgMHhBRCwgMHgwRiwgMHhBMCwgMHgwQiwKLQkweDU1LCAweDA2LCAweDA1LCAweDAyLCAweEQzLCAweEZGLCAweDcxLCAweEZGLCAweEM3LCAweEZGLCAweEZFLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4RDksIDB4RkYsIDB4N0QsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NjQsIDB4MDEsCi0JMHg1MCwgMHgwNSwgMHg5MSwgMHgwQSwgMHgxMCwgMHgwRiwgMHhBOCwgMHgxMCwgMHg4OCwgMHgwRSwgMHhDNSwKLQkweDA5LCAweDlCLCAweDA0LCAweEZELCAweDAwLCAweDg4LCAweEZGLCAweDg5LCAweEZGLCAweEU0LCAweEZGLAotCTB4RkIsIDB4RkYsIDB4QjksIDB4RkYsIDB4NkMsIDB4RkYsIDB4MDQsIDB4MDAsIDB4OEEsIDB4MDIsIDB4MUMsCi0JMHgwNywgMHg1RSwgMHgwQywgMHgwQSwgMHgxMCwgMHg1MCwgMHgxMCwgMHgwQiwgMHgwRCwgMHhERSwgMHgwNywKLQkweDE1LCAweDAzLCAweDNFLCAweDAwLCAweDZELCAweEZGLCAweEFCLCAweEZGLCAweEY2LCAweEZGLCAweEVDLAotCTB4RkYsIDB4OTYsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QTcsIDB4MDAsIDB4RjYsIDB4MDMsIDB4MDAsIDB4MDksCi0JMHhGOCwgMHgwRCwgMHg5MywgMHgxMCwgMHg4MiwgMHgwRiwgMHg1MCwgMHgwQiwgMHgwNiwgMHgwNiwgMHhEMiwKLQkweDAxLCAweEMyLCAweEZGLCAweDc0LCAweEZGLCAweENELCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4RDQsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUUsIDB4RkYsIDB4OTEsIDB4MDEsIDB4OUQsIDB4MDUsIDB4RTMsCi0JMHgwQSwgMHg0MywgMHgwRiwgMHhBMSwgMHgxMCwgMHg0QywgMHgwRSwgMHg3MSwgMHgwOSwgMHg1MywgMHgwNCwKLQkweEQ3LCAweDAwLCAweDgwLCAweEZGLCAweDhFLCAweEZGLCAweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIzLAotCTB4RkYsIDB4NkMsIDB4RkYsIDB4MUMsIDB4MDAsIDB4QzQsIDB4MDIsIDB4NkYsIDB4MDcsIDB4QUEsIDB4MEMsCi0JMHgyQSwgMHgxMCwgMHgzNCwgMHgxMCwgMHhDMiwgMHgwQywgMHg4QSwgMHgwNywgMHhEOCwgMHgwMiwgMHgyNCwKLQkweDAwLCAweDZDLCAweEZGLCAweEIxLCAweEZGLCAweEY4LCAweEZGLCAweEU5LCAweEZGLCAweDkwLCAweEZGLAotCTB4N0UsIDB4RkYsIDB4Q0IsIDB4MDAsIDB4M0IsIDB4MDQsIDB4NTUsIDB4MDksIDB4MzcsIDB4MEUsIDB4OUUsCi0JMHgxMCwgMHg1MywgMHgwRiwgMHhGRiwgMHgwQSwgMHhCNywgMHgwNSwgMHhBMSwgMHgwMSwgMHhCMywgMHhGRiwKLQkweDc3LCAweEZGLCAweEQyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENFLCAweEZGLCAweDc1LAotCTB4RkYsIDB4QkQsIDB4RkYsIDB4QzEsIDB4MDEsIDB4RUIsIDB4MDUsIDB4MzUsIDB4MEIsIDB4NzMsIDB4MEYsCi0JMHg5NywgMHgxMCwgMHgwRCwgMHgwRSwgMHgxQywgMHgwOSwgMHgwRCwgMHgwNCwgMHhCMywgMHgwMCwgMHg3QSwKLQkweEZGLCAweDk0LCAweEZGLCAweEVCLCAweEZGLCAweEY3LCAweEZGLCAweEFELCAweEZGLCAweDZELCAweEZGLAotCTB4MzUsIDB4MDAsIDB4MDEsIDB4MDMsIDB4QzIsIDB4MDcsIDB4RjMsIDB4MEMsIDB4NDcsIDB4MTAsIDB4MTUsCi0JMHgxMCwgMHg3OCwgMHgwQywgMHgzNywgMHgwNywgMHg5RCwgMHgwMiwgMHgwQywgMHgwMCwgMHg2QywgMHhGRiwKLQkweEI3LCAweEZGLCAweEZBLCAweEZGLCAweEU1LCAweEZGLCAweDhCLCAweEZGLCAweDg1LCAweEZGLCAweEYwLAotCTB4MDAsIDB4ODMsIDB4MDQsIDB4QTksIDB4MDksIDB4NzQsIDB4MEUsIDB4QTYsIDB4MTAsIDB4MjEsIDB4MEYsCi0JMHhBRCwgMHgwQSwgMHg2QSwgMHgwNSwgMHg3MywgMHgwMSwgMHhBNSwgMHhGRiwgMHg3QiwgMHhGRiwgMHhENywKLQkweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM5LCAweEZGLCAweDcyLCAweEZGLCAweENELCAweEZGLAotCTB4RjQsIDB4MDEsIDB4M0IsIDB4MDYsIDB4ODUsIDB4MEIsIDB4OUYsIDB4MEYsIDB4ODksIDB4MTAsIDB4Q0MsCi0JMHgwRCwgMHhDOCwgMHgwOCwgMHhDOSwgMHgwMywgMHg5MSwgMHgwMCwgMHg3NSwgMHhGRiwgMHg5QSwgMHhGRiwKLQkweEVGLCAweEZGLCAweEY1LCAweEZGLCAweEE3LCAweEZGLCAweDZFLCAweEZGLCAweDUwLCAweDAwLCAweDNGLAotCTB4MDMsIDB4MTYsIDB4MDgsIDB4M0IsIDB4MEQsIDB4NjAsIDB4MTAsIDB4RjMsIDB4MEYsIDB4MkIsIDB4MEMsCi0JMHhFNSwgMHgwNiwgMHg2NSwgMHgwMiwgMHhGNiwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCRCwgMHhGRiwgMHhGQywKLQkweEZGLCAweEUxLCAweEZGLCAweDg1LCAweEZGLCAweDhFLCAweEZGLCAweDE4LCAweDAxLCAweENCLCAweDA0LAotCTB4RkQsIDB4MDksIDB4QUYsIDB4MEUsIDB4QUEsIDB4MTAsIDB4RUQsIDB4MEUsIDB4NUEsIDB4MEEsIDB4MUUsCi0JMHgwNSwgMHg0NiwgMHgwMSwgMHg5QSwgMHhGRiwgMHg4MCwgMHhGRiwgMHhEQywgMHhGRiwgMHgwMCwgMHgwMCwKLQkweEZELCAweEZGLCAweEMzLCAweEZGLCAweDZGLCAweEZGLCAweERGLCAweEZGLCAweDI4LCAweDAyLCAweDhCLAotCTB4MDYsIDB4RDUsIDB4MEIsIDB4QzksIDB4MEYsIDB4NzgsIDB4MTAsIDB4ODgsIDB4MEQsIDB4NzMsIDB4MDgsCi0JMHg4NiwgMHgwMywgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGMiwgMHhGRiwgMHhGMiwKLQkweEZGLCAweEExLCAweEZGLCAweDcxLCAweEZGLCAweDZFLCAweDAwLCAweDdGLCAweDAzLCAweDZBLCAweDA4LAotCTB4ODEsIDB4MEQsIDB4NzYsIDB4MTAsIDB4Q0QsIDB4MEYsIDB4REQsIDB4MEIsIDB4OTQsIDB4MDYsIDB4MkUsCi0JMHgwMiwgMHhFMSwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDMywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweERDLCAweEZGLCAweDgwLCAweEZGLCAweDk4LCAweEZGLCAweDQyLCAweDAxLCAweDE2LCAweDA1LCAweDUwLAotCTB4MEEsIDB4RTcsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QjUsIDB4MEUsIDB4MDYsIDB4MEEsIDB4RDMsIDB4MDQsCi0JMHgxQywgMHgwMSwgMHg4RiwgMHhGRiwgMHg4NSwgMHhGRiwgMHhFMCwgMHhGRiwgMHhGQywgMHhGRiwgMHhCRSwKLQkweEZGLCAweDZELCAweEZGLCAweEYzLCAweEZGLCAweDVFLCAweDAyLCAweERDLCAweDA2LCAweDIzLCAweDBDLAotCTB4RUYsIDB4MEYsIDB4NjMsIDB4MTAsIDB4NDMsIDB4MEQsIDB4MUYsIDB4MDgsIDB4NDYsIDB4MDMsIDB4NTMsCi0JMHgwMCwgMHg2RSwgMHhGRiwgMHhBNiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhFRiwgMHhGRiwgMHg5QiwgMHhGRiwKLQkweDc1LCAweEZGLCAweDhELCAweDAwLCAweEMxLCAweDAzLCAweEJFLCAweDA4LCAweEM0LCAweDBELCAweDg4LAotCTB4MTAsIDB4QTQsIDB4MEYsIDB4OEUsIDB4MEIsIDB4NDMsIDB4MDYsIDB4RjksIDB4MDEsIDB4Q0YsIDB4RkYsCi0JMHg3MSwgMHhGRiwgMHhDOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhGRiwgMHg3QywKLQkweEZGLCAweEE0LCAweEZGLCAweDZFLCAweDAxLCAweDYxLCAweDA1LCAweEEzLCAweDBBLCAweDFDLCAweDBGLAotCTB4QTcsIDB4MTAsIDB4N0IsIDB4MEUsIDB4QjIsIDB4MDksIDB4OEIsIDB4MDQsIDB4RjQsIDB4MDAsIDB4ODYsCi0JMHhGRiwgMHg4QSwgMHhGRiwgMHhFNCwgMHhGRiwgMHhGQSwgMHhGRiwgMHhCOCwgMHhGRiwgMHg2QywgMHhGRiwKLQkweDA5LCAweDAwLCAweDk3LCAweDAyLCAweDJFLCAweDA3LCAweDZGLCAweDBDLCAweDExLCAweDEwLCAweDRBLAotCTB4MTAsIDB4RkIsIDB4MEMsIDB4Q0IsIDB4MDcsIDB4MDcsIDB4MDMsIDB4MzgsIDB4MDAsIDB4NkQsIDB4RkYsCi0JMHhBQywgMHhGRiwgMHhGNywgMHhGRiwgMHhFQywgMHhGRiwgMHg5NSwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRiwKLQkweDAwLCAweDA1LCAweDA0LCAweDEzLCAweDA5LCAweDA2LCAweDBFLCAweDk2LCAweDEwLCAweDc4LCAweDBGLAotCTB4M0UsIDB4MEIsIDB4RjQsIDB4MDUsIDB4QzcsIDB4MDEsIDB4QkYsIDB4RkYsIDB4NzQsIDB4RkYsIDB4Q0UsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMiwgMHhGRiwgMHg3OCwgMHhGRiwgMHhCMSwgMHhGRiwKLQkweDlDLCAweDAxLCAweEFFLCAweDA1LCAweEY2LCAweDBBLCAweDRFLCAweDBGLCAweDlGLCAweDEwLCAweDNFLAotCTB4MEUsIDB4NUUsIDB4MDksIDB4NDMsIDB4MDQsIDB4Q0YsIDB4MDAsIDB4N0YsIDB4RkYsIDB4OTAsIDB4RkYsCi0JMHhFOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhCMiwgMHhGRiwgMHg2QywgMHhGRiwgMHgyMSwgMHgwMCwgMHhEMiwKLQkweDAyLCAweDgxLCAweDA3LCAweEJBLCAweDBDLCAweDMxLCAweDEwLCAweDJFLCAweDEwLCAweEIyLCAweDBDLAotCTB4NzgsIDB4MDcsIDB4Q0IsIDB4MDIsIDB4MUUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjIsIDB4RkYsIDB4RjksCi0JMHhGRiwgMHhFOCwgMHhGRiwgMHg4RiwgMHhGRiwgMHg4MCwgMHhGRiwgMHhEMywgMHgwMCwgMHg0QiwgMHgwNCwKLQkweDY3LCAweDA5LCAweDQ1LCAweDBFLCAweEEwLCAweDEwLCAweDQ4LCAweDBGLCAweEVDLCAweDBBLCAweEE2LAotCTB4MDUsIDB4OTcsIDB4MDEsIDB4QjAsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RDMsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHhDRCwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDMCwgMHhGRiwgMHhDQywgMHgwMSwgMHhGRCwKLQkweDA1LCAweDQ3LCAweDBCLCAweDdELCAweDBGLCAweDk0LCAweDEwLCAweEZGLCAweDBELCAweDBBLCAweDA5LAotCTB4RkUsIDB4MDMsIDB4QUIsIDB4MDAsIDB4NzksIDB4RkYsIDB4OTUsIDB4RkYsIDB4RUMsIDB4RkYsIDB4RjcsCi0JMHhGRiwgMHhBQywgMHhGRiwgMHg2RCwgMHhGRiwgMHgzQiwgMHgwMCwgMHgwRSwgMHgwMywgMHhENSwgMHgwNywKLQkweDAzLCAweDBELCAweDRELCAweDEwLCAweDBFLCAweDEwLCAweDY3LCAweDBDLCAweDI1LCAweDA3LCAweDkxLAotCTB4MDIsIDB4MDcsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjgsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RTQsIDB4RkYsCi0JMHg4OSwgMHhGRiwgMHg4NywgMHhGRiwgMHhGOSwgMHgwMCwgMHg5MywgMHgwNCwgMHhCQywgMHgwOSwgMHg4MiwKLQkweDBFLCAweEE3LCAweDEwLCAweDE2LCAweDBGLCAweDlBLCAweDBBLCAweDU5LCAweDA1LCAweDY5LCAweDAxLAotCTB4QTMsIDB4RkYsIDB4N0MsIDB4RkYsIDB4RDgsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzgsCi0JMHhGRiwgMHg3MSwgMHhGRiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgwMSwgMHg0QywgMHgwNiwgMHg5NywgMHgwQiwKLQkweEE5LCAweDBGLCAweDg2LCAweDEwLCAweEJELCAweDBELCAweEI1LCAweDA4LCAweEJBLCAweDAzLCAweDhBLAotCTB4MDAsIDB4NzQsIDB4RkYsIDB4OUIsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RjQsIDB4RkYsIDB4QTUsIDB4RkYsCi0JMHg2RiwgMHhGRiwgMHg1NywgMHgwMCwgMHg0RCwgMHgwMywgMHgyOSwgMHgwOCwgMHg0QiwgMHgwRCwgMHg2NSwKLQkweDEwLCAweEVCLCAweDBGLCAweDFBLCAweDBDLCAweEQzLCAweDA2LCAweDU4LCAweDAyLCAweEYxLCAweEZGLAotCTB4NkQsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RTAsIDB4RkYsIDB4ODQsIDB4RkYsIDB4OTAsCi0JMHhGRiwgMHgyMSwgMHgwMSwgMHhEQywgMHgwNCwgMHgxMCwgMHgwQSwgMHhCQiwgMHgwRSwgMHhBQSwgMHgxMCwKLQkweEUxLCAweDBFLCAweDQ3LCAweDBBLCAweDBELCAweDA1LCAweDNELCAweDAxLCAweDk3LCAweEZGLCAweDgxLAotCTB4RkYsIDB4REQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QzIsIDB4RkYsIDB4NkYsIDB4RkYsCi0JMHhFNCwgMHhGRiwgMHgzNCwgMHgwMiwgMHg5RCwgMHgwNiwgMHhFNiwgMHgwQiwgMHhEMSwgMHgwRiwgMHg3MywKLQkweDEwLCAweDc5LCAweDBELCAweDYxLCAweDA4LCAweDc4LCAweDAzLCAweDZBLCAweDAwLCAweDcwLCAweEZGLAotCTB4QTEsIDB4RkYsIDB4RjIsIDB4RkYsIDB4RjEsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NzIsIDB4RkYsIDB4NzQsCi0JMHgwMCwgMHg4RSwgMHgwMywgMHg3RCwgMHgwOCwgMHg5MCwgMHgwRCwgMHg3QSwgMHgxMCwgMHhDNCwgMHgwRiwKLQkweENDLCAweDBCLCAweDgyLCAweDA2LCAweDIyLCAweDAyLCAweERELCAweEZGLCAweDZGLCAweEZGLCAweEM0LAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REIsIDB4RkYsIDB4N0YsIDB4RkYsIDB4OUIsIDB4RkYsCi0JMHg0QiwgMHgwMSwgMHgyNiwgMHgwNSwgMHg2MywgMHgwQSwgMHhGMywgMHgwRSwgMHhBQSwgMHgxMCwgMHhBOCwKLQkweDBFLCAweEY0LCAweDA5LCAweEMzLCAweDA0LCAweDEzLCAweDAxLCAweDhELCAweEZGLCAweDg2LCAweEZGLAotCTB4RTEsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NkIsCi0JMHgwMiwgMHhFRSwgMHgwNiwgMHgzNCwgMHgwQywgMHhGNywgMHgwRiwgMHg1RCwgMHgxMCwgMHgzMywgMHgwRCwKLQkweDBELCAweDA4LCAweDM4LCAweDAzLCAweDRELCAweDAwLCAweDZFLCAweEZGLCAweEE3LCAweEZGLCAweEY1LAotCTB4RkYsIDB4RUUsIDB4RkYsIDB4OTksIDB4RkYsIDB4NzYsIDB4RkYsIDB4OTQsIDB4MDAsIDB4RDAsIDB4MDMsCi0JMHhEMSwgMHgwOCwgMHhEMywgMHgwRCwgMHg4QiwgMHgxMCwgMHg5QSwgMHgwRiwgMHg3QywgMHgwQiwgMHgzMiwKLQkweDA2LCAweEVFLCAweDAxLCAweENCLCAweEZGLCAweDcyLCAweEZGLCAweENBLCAweEZGLCAweEZFLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4RDYsIDB4RkYsIDB4N0IsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NzgsIDB4MDEsIDB4NzIsCi0JMHgwNSwgMHhCNiwgMHgwQSwgMHgyNywgMHgwRiwgMHhBNSwgMHgxMCwgMHg2RSwgMHgwRSwgMHhBMCwgMHgwOSwKLQkweDdCLCAweDA0LCAweEVDLCAweDAwLCAweDg1LCAweEZGLCAweDhCLCAweEZGLCAweEU1LCAweEZGLCAweEZBLAotCTB4RkYsIDB4QjYsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QTQsIDB4MDIsIDB4NDEsIDB4MDcsCi0JMHg4MCwgMHgwQywgMHgxOSwgMHgxMCwgMHg0NCwgMHgxMCwgMHhFQiwgMHgwQywgMHhCOSwgMHgwNywgMHhGQSwKLQkweDAyLCAweDMyLCAweDAwLCAweDZELCAweEZGLCAweEFFLCAweEZGLCAweEY3LCAweEZGLCAweEVCLCAweEZGLAotCTB4OTMsIDB4RkYsIDB4N0IsIDB4RkYsIDB4QjcsIDB4MDAsIDB4MTUsIDB4MDQsIDB4MjYsIDB4MDksIDB4MTQsCi0JMHgwRSwgMHg5OCwgMHgxMCwgMHg2RCwgMHgwRiwgMHgyQywgMHgwQiwgMHhFMywgMHgwNSwgMHhCQywgMHgwMSwKLQkweEJCLCAweEZGLCAweDc1LCAweEZGLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQxLAotCTB4RkYsIDB4NzcsIDB4RkYsIDB4QjUsIDB4RkYsIDB4QTYsIDB4MDEsIDB4QzAsIDB4MDUsIDB4MDgsIDB4MEIsCi0JMHg1OCwgMHgwRiwgMHg5RCwgMHgxMCwgMHgzMCwgMHgwRSwgMHg0QiwgMHgwOSwgMHgzNCwgMHgwNCwgMHhDNiwKLQkweDAwLCAweDdELCAweEZGLCAweDkxLCAweEZGLCAweEU5LCAweEZGLCAweEY4LCAweEZGLCAweEIwLCAweEZGLAotCTB4NkMsIDB4RkYsIDB4MjcsIDB4MDAsIDB4REYsIDB4MDIsIDB4OTQsIDB4MDcsIDB4Q0EsIDB4MEMsIDB4MzcsCi0JMHgxMCwgMHgyNywgMHgxMCwgMHhBMSwgMHgwQywgMHg2NSwgMHgwNywgMHhCRSwgMHgwMiwgMHgxOSwgMHgwMCwKLQkweDZDLCAweEZGLCAweEI0LCAweEZGLCAweEY5LCAweEZGLCAweEU3LCAweEZGLCAweDhFLCAweEZGLCAweDgxLAotCTB4RkYsIDB4REIsIDB4MDAsIDB4NUIsIDB4MDQsIDB4N0EsIDB4MDksIDB4NTMsIDB4MEUsIDB4QTIsIDB4MTAsCi0JMHgzRCwgMHgwRiwgMHhEQSwgMHgwQSwgMHg5NSwgMHgwNSwgMHg4QywgMHgwMSwgMHhBRCwgMHhGRiwgMHg3OSwKLQkweEZGLCAweEQ0LCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweENDLCAweEZGLCAweDczLCAweEZGLAotCTB4QzQsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MEUsIDB4MDYsIDB4NTksIDB4MEIsIDB4ODcsIDB4MEYsIDB4OTEsCi0JMHgxMCwgMHhGMCwgMHgwRCwgMHhGNywgMHgwOCwgMHhFRiwgMHgwMywgMHhBMywgMHgwMCwgMHg3OCwgMHhGRiwKLQkweDk3LCAweEZGLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweEFBLCAweEZGLCAweDZELCAweEZGLCAweDQxLAotCTB4MDAsIDB4MUMsIDB4MDMsIDB4RTcsIDB4MDcsIDB4MTMsIDB4MEQsIDB4NTIsIDB4MTAsIDB4MDYsIDB4MTAsCi0JMHg1NiwgMHgwQywgMHgxMywgMHgwNywgMHg4NCwgMHgwMiwgMHgwMiwgMHgwMCwgMHg2RCwgMHhGRiwgMHhCQSwKLQkweEZGLCAweEZCLCAweEZGLCAweEUzLCAweEZGLCAweDg4LCAweEZGLCAweDg5LCAweEZGLCAweDAxLCAweDAxLAotCTB4QTMsIDB4MDQsIDB4Q0UsIDB4MDksIDB4OEYsIDB4MEUsIDB4QTgsIDB4MTAsIDB4MEEsIDB4MEYsIDB4ODgsCi0JMHgwQSwgMHg0OCwgMHgwNSwgMHg1RiwgMHgwMSwgMHhBMCwgMHhGRiwgMHg3RCwgMHhGRiwgMHhEOSwgMHhGRiwKLQkweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM3LCAweEZGLCAweDcwLCAweEZGLCAweEQ1LCAweEZGLCAweDBCLAotCTB4MDIsIDB4NUUsIDB4MDYsIDB4QTksIDB4MEIsIDB4QjIsIDB4MEYsIDB4ODIsIDB4MTAsIDB4QUUsIDB4MEQsCi0JMHhBMiwgMHgwOCwgMHhBQiwgMHgwMywgMHg4MiwgMHgwMCwgMHg3MywgMHhGRiwgMHg5RCwgMHhGRiwgMHhGMCwKLQkweEZGLCAweEYzLCAweEZGLCAweEE0LCAweEZGLCAweDZGLCAweEZGLCAweDVELCAweDAwLCAweDVCLCAweDAzLAotCTB4M0IsIDB4MDgsIDB4NUEsIDB4MEQsIDB4NkEsIDB4MTAsIDB4RTIsIDB4MEYsIDB4MDksIDB4MEMsIDB4QzEsCi0JMHgwNiwgMHg0QywgMHgwMiwgMHhFQywgMHhGRiwgMHg2RSwgMHhGRiwgMHhDMCwgMHhGRiwgMHhGQywgMHhGRiwKLQkweERGLCAweEZGLCAweDgzLCAweEZGLCAweDkzLCAweEZGLCAweDJBLCAweDAxLCAweEVDLCAweDA0LCAweDIyLAotCTB4MEEsIDB4QzgsIDB4MEUsIDB4QUIsIDB4MTAsIDB4RDQsIDB4MEUsIDB4MzUsIDB4MEEsIDB4RkQsIDB4MDQsCi0JMHgzMywgMHgwMSwgMHg5NSwgMHhGRiwgMHg4MiwgMHhGRiwgMHhERSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEMxLCAweEZGLCAweDZFLCAweEZGLCAweEU4LCAweEZGLCAweDQwLCAweDAyLCAweEFGLCAweDA2LAotCTB4RjcsIDB4MEIsIDB4REEsIDB4MEYsIDB4NkYsIDB4MTAsIDB4NkEsIDB4MEQsIDB4NEUsIDB4MDgsIDB4NkEsCi0JMHgwMywgMHg2NCwgMHgwMCwgMHg3MCwgMHhGRiwgMHhBMywgMHhGRiwgMHhGMywgMHhGRiwgMHhGMSwgMHhGRiwKLQkweDlFLCAweEZGLCAweDcyLCAweEZGLCAweDdCLCAweDAwLCAweDlDLCAweDAzLCAweDkwLCAweDA4LCAweDlGLAotCTB4MEQsIDB4N0UsIDB4MTAsIDB4QkIsIDB4MEYsIDB4QkEsIDB4MEIsIDB4NzAsIDB4MDYsIDB4MTYsIDB4MDIsCi0JMHhEOSwgMHhGRiwgMHg3MCwgMHhGRiwgMHhDNSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQSwKLQkweEZGLCAweDdFLCAweEZGLCAweDlELCAweEZGLCAweDU1LCAweDAxLCAweDM3LCAweDA1LCAweDc1LCAweDBBLAotCTB4RkYsIDB4MEUsIDB4QTksIDB4MTAsIDB4OUMsIDB4MEUsIDB4RTEsIDB4MDksIDB4QjMsIDB4MDQsIDB4MEEsCi0JMHgwMSwgMHg4QiwgMHhGRiwgMHg4NywgMHhGRiwgMHhFMiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhCQiwgMHhGRiwKLQkweDZELCAweEZGLCAweEZELCAweEZGLCAweDc3LCAweDAyLCAweDAxLCAweDA3LCAweDQ1LCAweDBDLCAweEZGLAotCTB4MEYsIDB4NTgsIDB4MTAsIDB4MjMsIDB4MEQsIDB4RkEsIDB4MDcsIDB4MkEsIDB4MDMsIDB4NDcsIDB4MDAsCi0JMHg2RSwgMHhGRiwgMHhBOSwgMHhGRiwgMHhGNSwgMHhGRiwgMHhFRCwgMHhGRiwgMHg5OCwgMHhGRiwgMHg3NywKLQkweEZGLCAweDlDLCAweDAwLCAweERGLCAweDAzLCAweEU0LCAweDA4LCAweEUyLCAweDBELCAweDhFLCAweDEwLAotCTB4OTEsIDB4MEYsIDB4NkIsIDB4MEIsIDB4MjAsIDB4MDYsIDB4RTMsIDB4MDEsIDB4QzgsIDB4RkYsIDB4NzMsCi0JMHhGRiwgMHhDQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhENSwgMHhGRiwgMHg3QSwgMHhGRiwKLQkweEFBLCAweEZGLCAweDgyLCAweDAxLCAweDgzLCAweDA1LCAweEM4LCAweDBBLCAweDMyLCAweDBGLCAweEE0LAotCTB4MTAsIDB4NjAsIDB4MEUsIDB4OEQsIDB4MDksIDB4NkIsIDB4MDQsIDB4RTMsIDB4MDAsIDB4ODMsIDB4RkYsCi0JMHg4RCwgMHhGRiwgMHhFNiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhCNSwgMHhGRiwgMHg2QywgMHhGRiwgMHgxNCwKLQkweDAwLCAweEIxLCAweDAyLCAweDUzLCAweDA3LCAweDkxLCAweDBDLCAweDIwLCAweDEwLCAweDNFLCAweDEwLAotCTB4REIsIDB4MEMsIDB4QTYsIDB4MDcsIDB4RUMsIDB4MDIsIDB4MkMsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QUYsCi0JMHhGRiwgMHhGOCwgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MiwgMHhGRiwgMHg3QywgMHhGRiwgMHhCRSwgMHgwMCwKLQkweDI0LCAweDA0LCAweDM4LCAweDA5LCAweDIyLCAweDBFLCAweDlCLCAweDEwLCAweDYzLCAweDBGLCAweDFBLAotCTB4MEIsIDB4RDEsIDB4MDUsIDB4QjEsIDB4MDEsIDB4QjgsIDB4RkYsIDB4NzYsIDB4RkYsIDB4RDAsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHhGRiwgMHg3NiwgMHhGRiwgMHhCOCwgMHhGRiwgMHhCMSwKLQkweDAxLCAweEQxLCAweDA1LCAweDFBLCAweDBCLCAweDYzLCAweDBGLCAweDlCLCAweDEwLCAweDIyLCAweDBFLAotCTB4MzgsIDB4MDksIDB4MjQsIDB4MDQsIDB4QkUsIDB4MDAsIDB4N0MsIDB4RkYsIDB4OTIsIDB4RkYsIDB4RUEsCi0JMHhGRiwgMHhGOCwgMHhGRiwgMHhBRiwgMHhGRiwgMHg2QywgMHhGRiwgMHgyQywgMHgwMCwgMHhFQywgMHgwMiwKLQkweEE2LCAweDA3LCAweERCLCAweDBDLCAweDNFLCAweDEwLCAweDIwLCAweDEwLCAweDkxLCAweDBDLCAweDUzLAotCTB4MDcsIDB4QjEsIDB4MDIsIDB4MTQsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4RkEsIDB4RkYsCi0JMHhFNiwgMHhGRiwgMHg4RCwgMHhGRiwgMHg4MywgMHhGRiwgMHhFMywgMHgwMCwgMHg2QiwgMHgwNCwgMHg4RCwKLQkweDA5LCAweDYwLCAweDBFLCAweEE0LCAweDEwLCAweDMyLCAweDBGLCAweEM4LCAweDBBLCAweDgzLCAweDA1LAotCTB4ODIsIDB4MDEsIDB4QUEsIDB4RkYsIDB4N0EsIDB4RkYsIDB4RDUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhDQiwgMHhGRiwgMHg3MywgMHhGRiwgMHhDOCwgMHhGRiwgMHhFMywgMHgwMSwgMHgyMCwgMHgwNiwKLQkweDZCLCAweDBCLCAweDkxLCAweDBGLCAweDhFLCAweDEwLCAweEUyLCAweDBELCAweEU0LCAweDA4LCAweERGLAotCTB4MDMsIDB4OUMsIDB4MDAsIDB4NzcsIDB4RkYsIDB4OTgsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RjUsIDB4RkYsCi0JMHhBOSwgMHhGRiwgMHg2RSwgMHhGRiwgMHg0NywgMHgwMCwgMHgyQSwgMHgwMywgMHhGQSwgMHgwNywgMHgyMywKLQkweDBELCAweDU4LCAweDEwLCAweEZGLCAweDBGLCAweDQ1LCAweDBDLCAweDAxLCAweDA3LCAweDc3LCAweDAyLAotCTB4RkQsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkIsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RTIsIDB4RkYsIDB4ODcsCi0JMHhGRiwgMHg4QiwgMHhGRiwgMHgwQSwgMHgwMSwgMHhCMywgMHgwNCwgMHhFMSwgMHgwOSwgMHg5QywgMHgwRSwKLQkweEE5LCAweDEwLCAweEZGLCAweDBFLCAweDc1LCAweDBBLCAweDM3LCAweDA1LCAweDU1LCAweDAxLCAweDlELAotCTB4RkYsIDB4N0UsIDB4RkYsIDB4REEsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzUsIDB4RkYsCi0JMHg3MCwgMHhGRiwgMHhEOSwgMHhGRiwgMHgxNiwgMHgwMiwgMHg3MCwgMHgwNiwgMHhCQSwgMHgwQiwgMHhCQiwKLQkweDBGLCAweDdFLCAweDEwLCAweDlGLCAweDBELCAweDkwLCAweDA4LCAweDlDLCAweDAzLCAweDdCLCAweDAwLAotCTB4NzIsIDB4RkYsIDB4OUUsIDB4RkYsIDB4RjEsIDB4RkYsIDB4RjMsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NzAsCi0JMHhGRiwgMHg2NCwgMHgwMCwgMHg2QSwgMHgwMywgMHg0RSwgMHgwOCwgMHg2QSwgMHgwRCwgMHg2RiwgMHgxMCwKLQkweERBLCAweDBGLCAweEY3LCAweDBCLCAweEFGLCAweDA2LCAweDQwLCAweDAyLCAweEU4LCAweEZGLCAweDZFLAotCTB4RkYsIDB4QzEsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REUsIDB4RkYsIDB4ODIsIDB4RkYsCi0JMHg5NSwgMHhGRiwgMHgzMywgMHgwMSwgMHhGRCwgMHgwNCwgMHgzNSwgMHgwQSwgMHhENCwgMHgwRSwgMHhBQiwKLQkweDEwLCAweEM4LCAweDBFLCAweDIyLCAweDBBLCAweEVDLCAweDA0LCAweDJBLCAweDAxLCAweDkzLCAweEZGLAotCTB4ODMsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QzAsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RUMsCi0JMHhGRiwgMHg0QywgMHgwMiwgMHhDMSwgMHgwNiwgMHgwOSwgMHgwQywgMHhFMiwgMHgwRiwgMHg2QSwgMHgxMCwKLQkweDVBLCAweDBELCAweDNCLCAweDA4LCAweDVCLCAweDAzLCAweDVELCAweDAwLCAweDZGLCAweEZGLCAweEE0LAotCTB4RkYsIDB4RjMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4OUQsIDB4RkYsIDB4NzMsIDB4RkYsIDB4ODIsIDB4MDAsCi0JMHhBQiwgMHgwMywgMHhBMiwgMHgwOCwgMHhBRSwgMHgwRCwgMHg4MiwgMHgxMCwgMHhCMiwgMHgwRiwgMHhBOSwKLQkweDBCLCAweDVFLCAweDA2LCAweDBCLCAweDAyLCAweEQ1LCAweEZGLCAweDcwLCAweEZGLCAweEM3LCAweEZGLAotCTB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDksIDB4RkYsIDB4N0QsIDB4RkYsIDB4QTAsIDB4RkYsIDB4NUYsCi0JMHgwMSwgMHg0OCwgMHgwNSwgMHg4OCwgMHgwQSwgMHgwQSwgMHgwRiwgMHhBOCwgMHgxMCwgMHg4RiwgMHgwRSwKLQkweENFLCAweDA5LCAweEEzLCAweDA0LCAweDAxLCAweDAxLCAweDg5LCAweEZGLCAweDg4LCAweEZGLCAweEUzLAotCTB4RkYsIDB4RkIsIDB4RkYsIDB4QkEsIDB4RkYsIDB4NkQsIDB4RkYsIDB4MDIsIDB4MDAsIDB4ODQsIDB4MDIsCi0JMHgxMywgMHgwNywgMHg1NiwgMHgwQywgMHgwNiwgMHgxMCwgMHg1MiwgMHgxMCwgMHgxMywgMHgwRCwgMHhFNywKLQkweDA3LCAweDFDLCAweDAzLCAweDQxLCAweDAwLCAweDZELCAweEZGLCAweEFBLCAweEZGLCAweEY2LCAweEZGLAotCTB4RUQsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QTMsIDB4MDAsIDB4RUYsIDB4MDMsIDB4RjcsCi0JMHgwOCwgMHhGMCwgMHgwRCwgMHg5MSwgMHgxMCwgMHg4NywgMHgwRiwgMHg1OSwgMHgwQiwgMHgwRSwgMHgwNiwKLQkweEQ3LCAweDAxLCAweEM0LCAweEZGLCAweDczLCAweEZGLCAweENDLCAweEZGLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RDQsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUQsIDB4RkYsIDB4OEMsIDB4MDEsIDB4OTUsIDB4MDUsCi0JMHhEQSwgMHgwQSwgMHgzRCwgMHgwRiwgMHhBMiwgMHgxMCwgMHg1MywgMHgwRSwgMHg3QSwgMHgwOSwgMHg1QiwKLQkweDA0LCAweERCLCAweDAwLCAweDgxLCAweEZGLCAweDhFLCAweEZGLCAweEU3LCAweEZGLCAweEY5LCAweEZGLAotCTB4QjQsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTksIDB4MDAsIDB4QkUsIDB4MDIsIDB4NjUsIDB4MDcsIDB4QTEsCi0JMHgwQywgMHgyNywgMHgxMCwgMHgzNywgMHgxMCwgMHhDQSwgMHgwQywgMHg5NCwgMHgwNywgMHhERiwgMHgwMiwKLQkweDI3LCAweDAwLCAweDZDLCAweEZGLCAweEIwLCAweEZGLCAweEY4LCAweEZGLCAweEU5LCAweEZGLCAweDkxLAotCTB4RkYsIDB4N0QsIDB4RkYsIDB4QzYsIDB4MDAsIDB4MzQsIDB4MDQsIDB4NEIsIDB4MDksIDB4MzAsIDB4MEUsCi0JMHg5RCwgMHgxMCwgMHg1OCwgMHgwRiwgMHgwOCwgMHgwQiwgMHhDMCwgMHgwNSwgMHhBNiwgMHgwMSwgMHhCNSwKLQkweEZGLCAweDc3LCAweEZGLCAweEQxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLAotCTB4NzUsIDB4RkYsIDB4QkIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4RTMsIDB4MDUsIDB4MkMsIDB4MEIsIDB4NkQsCi0JMHgwRiwgMHg5OCwgMHgxMCwgMHgxNCwgMHgwRSwgMHgyNiwgMHgwOSwgMHgxNSwgMHgwNCwgMHhCNywgMHgwMCwKLQkweDdCLCAweEZGLCAweDkzLCAweEZGLCAweEVCLCAweEZGLCAweEY3LCAweEZGLCAweEFFLCAweEZGLCAweDZELAotCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkEsIDB4MDIsIDB4QjksIDB4MDcsIDB4RUIsIDB4MEMsIDB4NDQsIDB4MTAsCi0JMHgxOSwgMHgxMCwgMHg4MCwgMHgwQywgMHg0MSwgMHgwNywgMHhBNCwgMHgwMiwgMHgwRSwgMHgwMCwgMHg2QywKLQkweEZGLCAweEI2LCAweEZGLCAweEZBLCAweEZGLCAweEU1LCAweEZGLCAweDhCLCAweEZGLCAweDg1LCAweEZGLAotCTB4RUMsIDB4MDAsIDB4N0IsIDB4MDQsIDB4QTAsIDB4MDksIDB4NkUsIDB4MEUsIDB4QTUsIDB4MTAsIDB4MjcsCi0JMHgwRiwgMHhCNiwgMHgwQSwgMHg3MiwgMHgwNSwgMHg3OCwgMHgwMSwgMHhBNywgMHhGRiwgMHg3QiwgMHhGRiwKLQkweEQ2LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweENBLCAweEZGLCAweDcyLCAweEZGLCAweENCLAotCTB4RkYsIDB4RUUsIDB4MDEsIDB4MzIsIDB4MDYsIDB4N0MsIDB4MEIsIDB4OUEsIDB4MEYsIDB4OEIsIDB4MTAsCi0JMHhEMywgMHgwRCwgMHhEMSwgMHgwOCwgMHhEMCwgMHgwMywgMHg5NCwgMHgwMCwgMHg3NiwgMHhGRiwgMHg5OSwKLQkweEZGLCAweEVFLCAweEZGLCAweEY1LCAweEZGLCAweEE3LCAweEZGLCAweDZFLCAweEZGLCAweDRELCAweDAwLAotCTB4MzgsIDB4MDMsIDB4MEQsIDB4MDgsIDB4MzMsIDB4MEQsIDB4NUQsIDB4MTAsIDB4RjcsIDB4MEYsIDB4MzQsCi0JMHgwQywgMHhFRSwgMHgwNiwgMHg2QiwgMHgwMiwgMHhGOCwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCQywgMHhGRiwKLQkweEZDLCAweEZGLCAweEUxLCAweEZGLCAweDg2LCAweEZGLCAweDhELCAweEZGLCAweDEzLCAweDAxLCAweEMzLAotCTB4MDQsIDB4RjQsIDB4MDksIDB4QTgsIDB4MEUsIDB4QUEsIDB4MTAsIDB4RjMsIDB4MEUsIDB4NjMsIDB4MEEsCi0JMHgyNiwgMHgwNSwgMHg0QiwgMHgwMSwgMHg5QiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhEQiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweEZELCAweEZGLCAweEM0LCAweEZGLCAweDZGLCAweEZGLCAweERELCAweEZGLCAweDIyLCAweDAyLAotCTB4ODIsIDB4MDYsIDB4Q0MsIDB4MEIsIDB4QzQsIDB4MEYsIDB4N0EsIDB4MTAsIDB4OTAsIDB4MEQsIDB4N0QsCi0JMHgwOCwgMHg4RSwgMHgwMywgMHg3NCwgMHgwMCwgMHg3MiwgMHhGRiwgMHg5RiwgMHhGRiwgMHhGMSwgMHhGRiwKLQkweEYyLCAweEZGLCAweEExLCAweEZGLCAweDcwLCAweEZGLCAweDZBLCAweDAwLCAweDc4LCAweDAzLCAweDYxLAotCTB4MDgsIDB4NzksIDB4MEQsIDB4NzMsIDB4MTAsIDB4RDEsIDB4MEYsIDB4RTYsIDB4MEIsIDB4OUQsIDB4MDYsCi0JMHgzNCwgMHgwMiwgMHhFNCwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDMiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweERELCAweEZGLCAweDgxLCAweEZGLCAweDk3LCAweEZGLCAweDNELCAweDAxLCAweDBELCAweDA1LAotCTB4NDcsIDB4MEEsIDB4RTEsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QkIsIDB4MEUsIDB4MTAsIDB4MEEsIDB4REMsCi0JMHgwNCwgMHgyMSwgMHgwMSwgMHg5MCwgMHhGRiwgMHg4NCwgMHhGRiwgMHhFMCwgMHhGRiwgMHhGQywgMHhGRiwKLQkweEJFLCAweEZGLCAweDZELCAweEZGLCAweEYxLCAweEZGLCAweDU4LCAweDAyLCAweEQzLCAweDA2LCAweDFBLAotCTB4MEMsIDB4RUIsIDB4MEYsIDB4NjUsIDB4MTAsIDB4NEIsIDB4MEQsIDB4MjksIDB4MDgsIDB4NEQsIDB4MDMsCi0JMHg1NywgMHgwMCwgMHg2RiwgMHhGRiwgMHhBNSwgMHhGRiwgMHhGNCwgMHhGRiwgMHhFRiwgMHhGRiwgMHg5QiwKLQkweEZGLCAweDc0LCAweEZGLCAweDhBLCAweDAwLCAweEJBLCAweDAzLCAweEI1LCAweDA4LCAweEJELCAweDBELAotCTB4ODYsIDB4MTAsIDB4QTksIDB4MEYsIDB4OTcsIDB4MEIsIDB4NEMsIDB4MDYsIDB4RkYsIDB4MDEsIDB4RDEsCi0JMHhGRiwgMHg3MSwgMHhGRiwgMHhDOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhGRiwKLQkweDdDLCAweEZGLCAweEEzLCAweEZGLCAweDY5LCAweDAxLCAweDU5LCAweDA1LCAweDlBLCAweDBBLCAweDE2LAotCTB4MEYsIDB4QTcsIDB4MTAsIDB4ODIsIDB4MEUsIDB4QkMsIDB4MDksIDB4OTMsIDB4MDQsIDB4RjksIDB4MDAsCi0JMHg4NywgMHhGRiwgMHg4OSwgMHhGRiwgMHhFNCwgMHhGRiwgMHhGQiwgMHhGRiwgMHhCOCwgMHhGRiwgMHg2QywKLQkweEZGLCAweDA3LCAweDAwLCAweDkxLCAweDAyLCAweDI1LCAweDA3LCAweDY3LCAweDBDLCAweDBFLCAweDEwLAotCTB4NEQsIDB4MTAsIDB4MDMsIDB4MEQsIDB4RDUsIDB4MDcsIDB4MEUsIDB4MDMsIDB4M0IsIDB4MDAsIDB4NkQsCi0JMHhGRiwgMHhBQywgMHhGRiwgMHhGNywgMHhGRiwgMHhFQywgMHhGRiwgMHg5NSwgMHhGRiwgMHg3OSwgMHhGRiwKLQkweEFCLCAweDAwLCAweEZFLCAweDAzLCAweDBBLCAweDA5LCAweEZGLCAweDBELCAweDk0LCAweDEwLCAweDdELAotCTB4MEYsIDB4NDcsIDB4MEIsIDB4RkQsIDB4MDUsIDB4Q0MsIDB4MDEsIDB4QzAsIDB4RkYsIDB4NzQsIDB4RkYsCi0JMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEMywgMHhGRiwgMHg3OCwgMHhGRiwgMHhCMCwKLQkweEZGLCAweDk3LCAweDAxLCAweEE2LCAweDA1LCAweEVDLCAweDBBLCAweDQ4LCAweDBGLCAweEEwLCAweDEwLAotCTB4NDUsIDB4MEUsIDB4NjcsIDB4MDksIDB4NEIsIDB4MDQsIDB4RDMsIDB4MDAsIDB4ODAsIDB4RkYsIDB4OEYsCi0JMHhGRiwgMHhFOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhCMiwgMHhGRiwgMHg2QywgMHhGRiwgMHgxRSwgMHgwMCwKLQkweENCLCAweDAyLCAweDc4LCAweDA3LCAweEIyLCAweDBDLCAweDJFLCAweDEwLCAweDMxLCAweDEwLCAweEJBLAotCTB4MEMsIDB4ODEsIDB4MDcsIDB4RDIsIDB4MDIsIDB4MjEsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjIsIDB4RkYsCi0JMHhGOSwgMHhGRiwgMHhFOCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg3RiwgMHhGRiwgMHhDRiwgMHgwMCwgMHg0MywKLQkweDA0LCAweDVFLCAweDA5LCAweDNFLCAweDBFLCAweDlGLCAweDEwLCAweDRFLCAweDBGLCAweEY2LCAweDBBLAotCTB4QUUsIDB4MDUsIDB4OUMsIDB4MDEsIDB4QjEsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RDIsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHhDRSwgMHhGRiwgMHg3NCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhDNywgMHgwMSwKLQkweEY0LCAweDA1LCAweDNFLCAweDBCLCAweDc4LCAweDBGLCAweDk2LCAweDEwLCAweDA2LCAweDBFLCAweDEzLAotCTB4MDksIDB4MDUsIDB4MDQsIDB4QUYsIDB4MDAsIDB4NzksIDB4RkYsIDB4OTUsIDB4RkYsIDB4RUMsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHhBQywgMHhGRiwgMHg2RCwgMHhGRiwgMHgzOCwgMHgwMCwgMHgwNywgMHgwMywgMHhDQiwKLQkweDA3LCAweEZCLCAweDBDLCAweDRBLCAweDEwLCAweDExLCAweDEwLCAweDZGLCAweDBDLCAweDJFLCAweDA3LAotCTB4OTcsIDB4MDIsIDB4MDksIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjgsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTQsCi0JMHhGRiwgMHg4QSwgMHhGRiwgMHg4NiwgMHhGRiwgMHhGNCwgMHgwMCwgMHg4QiwgMHgwNCwgMHhCMiwgMHgwOSwKLQkweDdCLCAweDBFLCAweEE3LCAweDEwLCAweDFDLCAweDBGLCAweEEzLCAweDBBLCAweDYxLCAweDA1LCAweDZFLAotCTB4MDEsIDB4QTQsIDB4RkYsIDB4N0MsIDB4RkYsIDB4RDgsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhDOCwgMHhGRiwgMHg3MSwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGOSwgMHgwMSwgMHg0MywgMHgwNiwgMHg4RSwKLQkweDBCLCAweEE0LCAweDBGLCAweDg4LCAweDEwLCAweEM0LCAweDBELCAweEJFLCAweDA4LCAweEMxLCAweDAzLAotCTB4OEQsIDB4MDAsIDB4NzUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RjQsIDB4RkYsIDB4QTYsCi0JMHhGRiwgMHg2RSwgMHhGRiwgMHg1MywgMHgwMCwgMHg0NiwgMHgwMywgMHgxRiwgMHgwOCwgMHg0MywgMHgwRCwKLQkweDYzLCAweDEwLCAweEVGLCAweDBGLCAweDIzLCAweDBDLCAweERDLCAweDA2LCAweDVFLCAweDAyLCAweEYzLAotCTB4RkYsIDB4NkQsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RTAsIDB4RkYsIDB4ODUsIDB4RkYsCi0JMHg4RiwgMHhGRiwgMHgxQywgMHgwMSwgMHhEMywgMHgwNCwgMHgwNiwgMHgwQSwgMHhCNSwgMHgwRSwgMHhBQSwKLQkweDEwLCAweEU3LCAweDBFLCAweDUwLCAweDBBLCAweDE2LCAweDA1LCAweDQyLCAweDAxLCAweDk4LCAweEZGLAotCTB4ODAsIDB4RkYsIDB4REMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NkYsCi0JMHhGRiwgMHhFMSwgMHhGRiwgMHgyRSwgMHgwMiwgMHg5NCwgMHgwNiwgMHhERCwgMHgwQiwgMHhDRCwgMHgwRiwKLQkweDc2LCAweDEwLCAweDgxLCAweDBELCAweDZBLCAweDA4LCAweDdGLCAweDAzLCAweDZFLCAweDAwLCAweDcxLAotCTB4RkYsIDB4QTEsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTUsIDB4MDAsIDB4RDEsIDB4RkYsCi0JMHg4QiwgMHhGRSwgMHhCQywgMHhGRCwgMHhFMSwgMHgwMCwgMHg4NCwgMHgwOSwgMHhCMCwgMHgxMywgMHg0NywKLQkweDE4LCAweEIwLCAweDEzLCAweDg0LCAweDA5LCAweEUxLCAweDAwLCAweEJDLCAweEZELCAweDhCLCAweEZFLAotCTB4RDEsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4REEsIDB4MDAsIDB4MzAsCi0JMHgwMCwgMHg1RCwgMHhGQywgMHhCMywgMHhGQywgMHgzNSwgMHgwQSwgMHhDMiwgMHgxQywgMHgyNCwgMHgyMCwKLQkweDQ4LCAweDEwLCAweDVELCAweEZGLCAweDc0LCAweEZCLCAweDNBLCAweEZGLCAweEZCLCAweDAwLCAweDQyLAotCTB4MDAsIDB4RjgsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RjMsIDB4MDAsIDB4QUQsIDB4RkYsCi0JMHhDNSwgMHhGQiwgMHgxMSwgMHhGRSwgMHhBRiwgMHgwRCwgMHhFRiwgMHgxRSwgMHg2OCwgMHgxRSwgMHhCQywKLQkweDBDLCAweEE3LCAweEZELCAweEVBLCAweEZCLCAweEQzLCAweEZGLCAweEVFLCAweDAwLCAweDI0LCAweDAwLAotCTB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NEMsIDB4MDAsIDB4RkIsIDB4MDAsIDB4MEMsIDB4RkYsIDB4NUYsCi0JMHhGQiwgMHhFOCwgMHhGRiwgMHgzRCwgMHgxMSwgMHg3RSwgMHgyMCwgMHgxMywgMHgxQywgMHg0QywgMHgwOSwKLQkweDZBLCAweEZDLCAweDhDLCAweEZDLCAweDRFLCAweDAwLCAweEQxLCAweDAwLCAweDBFLCAweDAwLCAweEZELAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4NzIsIDB4MDAsIDB4RUMsIDB4MDAsIDB4NTUsIDB4RkUsIDB4M0QsIDB4RkIsCi0JMHgzNywgMHgwMiwgMHhCRSwgMHgxNCwgMHg1RCwgMHgyMSwgMHg0MCwgMHgxOSwgMHgxOCwgMHgwNiwgMHhBMiwKLQkweEZCLCAweDQ3LCAweEZELCAweEE3LCAweDAwLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkMsIDB4RkYsIDB4OUIsIDB4MDAsIDB4QzAsIDB4MDAsIDB4OTIsIDB4RkQsIDB4NzMsCi0JMHhGQiwgMHhGMiwgMHgwNCwgMHgwRSwgMHgxOCwgMHg4MSwgMHgyMSwgMHgwQywgMHgxNiwgMHgzNywgMHgwMywKLQkweDQ3LCAweEZCLCAweDBCLCAweEZFLCAweERGLCAweDAwLCAweDgyLCAweDAwLCAweEY5LCAweEZGLCAweEZFLAotCTB4RkYsIDB4MDgsIDB4MDAsIDB4QzMsIDB4MDAsIDB4NzQsIDB4MDAsIDB4RDIsIDB4RkMsIDB4MTAsIDB4RkMsCi0JMHgwOCwgMHgwOCwgMHgwQSwgMHgxQiwgMHhFOSwgMHgyMCwgMHg5QSwgMHgxMiwgMHhCRSwgMHgwMCwgMHg0OSwKLQkweEZCLCAweEM4LCAweEZFLCAweEY5LCAweDAwLCAweDVBLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLAotCTB4MUIsIDB4MDAsIDB4RTQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MjQsIDB4RkMsIDB4MUUsIDB4RkQsIDB4NjUsCi0JMHgwQiwgMHg5NCwgMHgxRCwgMHg5RCwgMHgxRiwgMHgwRCwgMHgwRiwgMHhCOCwgMHhGRSwgMHg5NiwgMHhGQiwKLQkweDcyLCAweEZGLCAweEY5LCAweDAwLCAweDM3LCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RjgsIDB4MDAsIDB4NzgsIDB4RkYsIDB4OUIsIDB4RkIsIDB4QTYsIDB4RkUsIDB4RTksIDB4MEUsCi0JMHg4RCwgMHgxRiwgMHhBQSwgMHgxRCwgMHg4NywgMHgwQiwgMHgyQiwgMHhGRCwgMHgxRSwgMHhGQywgMHgwMiwKLQkweDAwLCAweEU1LCAweDAwLCAweDFDLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDU4LCAweDAwLAotCTB4RjksIDB4MDAsIDB4Q0YsIDB4RkUsIDB4NEEsIDB4RkIsIDB4QTcsIDB4MDAsIDB4NzcsIDB4MTIsIDB4RTAsCi0JMHgyMCwgMHgyNiwgMHgxQiwgMHgyOCwgMHgwOCwgMHgxOCwgMHhGQywgMHhDQiwgMHhGQywgMHg3MSwgMHgwMCwKLQkweEM1LCAweDAwLCAweDA4LCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDgwLCAweDAwLCAweEUxLAotCTB4MDAsIDB4MTMsIDB4RkUsIDB4NDUsIDB4RkIsIDB4MUQsIDB4MDMsIDB4RUIsIDB4MTUsIDB4N0YsIDB4MjEsCi0JMHgyRCwgMHgxOCwgMHgwRSwgMHgwNSwgMHg3NywgMHhGQiwgMHg4QiwgMHhGRCwgMHhCRSwgMHgwMCwgMHg5RCwKLQkweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEE5LCAweDAwLAotCTB4QUEsIDB4MDAsIDB4NEYsIDB4RkQsIDB4OUQsIDB4RkIsIDB4RkEsIDB4MDUsIDB4MjIsIDB4MTksIDB4NjIsCi0JMHgyMSwgMHhFMCwgMHgxNCwgMHg1MCwgMHgwMiwgMHgzRSwgMHhGQiwgMHg0RSwgMHhGRSwgMHhFQiwgMHgwMCwKLQkweDczLCAweDAwLCAweEY3LCAweEZGLCAweEZFLCAweEZGLCAweDBELCAweDAwLCAweEQwLCAweDAwLCAweDUyLAotCTB4MDAsIDB4OTMsIDB4RkMsIDB4NjAsIDB4RkMsIDB4MkMsIDB4MDksIDB4RkEsIDB4MUIsIDB4OEEsIDB4MjAsCi0JMHg2MCwgMHgxMSwgMHhGRCwgMHhGRiwgMHg1QywgMHhGQiwgMHgwNiwgMHhGRiwgMHhGQiwgMHgwMCwgMHg0RCwKLQkweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDIzLCAweDAwLCAweEVELCAweDAwLCAweEQ5LCAweEZGLAotCTB4RUYsIDB4RkIsIDB4OTgsIDB4RkQsIDB4OTksIDB4MEMsIDB4NTQsIDB4MUUsIDB4MDIsIDB4MUYsIDB4RDIsCi0JMHgwRCwgMHgyMCwgMHhGRSwgMHhDMCwgMHhGQiwgMHhBNywgMHhGRiwgMHhGNCwgMHgwMCwgMHgyRCwgMHgwMCwKLQkweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDQxLCAweDAwLCAweEZCLCAweDAwLCAweDQxLCAweEZGLCAweDc4LAotCTB4RkIsIDB4NEEsIDB4RkYsIDB4MjUsIDB4MTAsIDB4MTYsIDB4MjAsIDB4REEsIDB4MUMsIDB4NTYsIDB4MEEsCi0JMHhCRSwgMHhGQywgMHg1NiwgMHhGQywgMHgyQywgMHgwMCwgMHhEQiwgMHgwMCwgMHgxNCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEY3LCAweEZGLCAweDY2LCAweDAwLCAweEY0LCAweDAwLCAweDhGLCAweEZFLCAweDNGLCAweEZCLAotCTB4NzUsIDB4MDEsIDB4QUUsIDB4MTMsIDB4MkMsIDB4MjEsIDB4MkEsIDB4MUEsIDB4MEQsIDB4MDcsIDB4RDQsCi0JMHhGQiwgMHgwQywgMHhGRCwgMHg4RiwgMHgwMCwgMHhCNywgMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweEZBLCAweEZGLCAweDhFLCAweDAwLCAweEQxLCAweDAwLCAweENGLCAweEZELCAweDU4LAotCTB4RkIsIDB4MTAsIDB4MDQsIDB4MTAsIDB4MTcsIDB4OEEsIDB4MjEsIDB4MTAsIDB4MTcsIDB4MTAsIDB4MDQsCi0JMHg1OCwgMHhGQiwgMHhDRiwgMHhGRCwgMHhEMSwgMHgwMCwgMHg4RSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDAzLCAweDAwLCAweEI3LCAweDAwLCAweDhGLCAweDAwLCAweDBDLCAweEZELCAweEQ0LCAweEZCLAotCTB4MEQsIDB4MDcsIDB4MkEsIDB4MUEsIDB4MkMsIDB4MjEsIDB4QUUsIDB4MTMsIDB4NzUsIDB4MDEsIDB4M0YsCi0JMHhGQiwgMHg4RiwgMHhGRSwgMHhGNCwgMHgwMCwgMHg2NiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDE0LCAweDAwLCAweERCLCAweDAwLCAweDJDLCAweDAwLCAweDU2LCAweEZDLCAweEJFLCAweEZDLCAweDU2LAotCTB4MEEsIDB4REEsIDB4MUMsIDB4MTYsIDB4MjAsIDB4MjUsIDB4MTAsIDB4NEEsIDB4RkYsIDB4NzgsIDB4RkIsCi0JMHg0MSwgMHhGRiwgMHhGQiwgMHgwMCwgMHg0MSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgyRCwKLQkweDAwLCAweEY0LCAweDAwLCAweEE3LCAweEZGLCAweEMwLCAweEZCLCAweDIwLCAweEZFLCAweEQyLCAweDBELAotCTB4MDIsIDB4MUYsIDB4NTQsIDB4MUUsIDB4OTksIDB4MEMsIDB4OTgsIDB4RkQsIDB4RUYsIDB4RkIsIDB4RDksCi0JMHhGRiwgMHhFRCwgMHgwMCwgMHgyMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0RCwgMHgwMCwKLQkweEZCLCAweDAwLCAweDA2LCAweEZGLCAweDVDLCAweEZCLCAweEZELCAweEZGLCAweDYwLCAweDExLCAweDhBLAotCTB4MjAsIDB4RkEsIDB4MUIsIDB4MkMsIDB4MDksIDB4NjAsIDB4RkMsIDB4OTMsIDB4RkMsIDB4NTIsIDB4MDAsCi0JMHhEMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGNywgMHhGRiwgMHg3MywgMHgwMCwgMHhFQiwKLQkweDAwLCAweDRFLCAweEZFLCAweDNFLCAweEZCLCAweDUwLCAweDAyLCAweEUwLCAweDE0LCAweDYyLCAweDIxLAotCTB4MjIsIDB4MTksIDB4RkEsIDB4MDUsIDB4OUQsIDB4RkIsIDB4NEYsIDB4RkQsIDB4QUEsIDB4MDAsIDB4QTksCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHg5RCwgMHgwMCwKLQkweEJFLCAweDAwLCAweDhCLCAweEZELCAweDc3LCAweEZCLCAweDBFLCAweDA1LCAweDJELCAweDE4LCAweDdGLAotCTB4MjEsIDB4RUIsIDB4MTUsIDB4MUQsIDB4MDMsIDB4NDUsIDB4RkIsIDB4MTMsIDB4RkUsIDB4RTEsIDB4MDAsCi0JMHg4MCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwOCwgMHgwMCwgMHhDNSwgMHgwMCwgMHg3MSwKLQkweDAwLCAweENCLCAweEZDLCAweDE4LCAweEZDLCAweDI4LCAweDA4LCAweDI2LCAweDFCLCAweEUwLCAweDIwLAotCTB4NzcsIDB4MTIsIDB4QTcsIDB4MDAsIDB4NEEsIDB4RkIsIDB4Q0YsIDB4RkUsIDB4RjksIDB4MDAsIDB4NTgsCi0JMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxQywgMHgwMCwgMHhFNSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweDFFLCAweEZDLCAweDJCLCAweEZELCAweDg3LCAweDBCLCAweEFBLCAweDFELCAweDhELCAweDFGLCAweEU5LAotCTB4MEUsIDB4QTYsIDB4RkUsIDB4OUIsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RjgsIDB4MDAsIDB4MzYsIDB4MDAsCi0JMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzNywgMHgwMCwgMHhGOSwgMHgwMCwgMHg3MiwgMHhGRiwgMHg5NiwKLQkweEZCLCAweEI4LCAweEZFLCAweDBELCAweDBGLCAweDlELCAweDFGLCAweDk0LCAweDFELCAweDY1LCAweDBCLAotCTB4MUUsIDB4RkQsIDB4MjQsIDB4RkMsIDB4MDYsIDB4MDAsIDB4RTQsIDB4MDAsIDB4MUIsIDB4MDAsIDB4RkMsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHg1QSwgMHgwMCwgMHhGOSwgMHgwMCwgMHhDOCwgMHhGRSwgMHg0OSwgMHhGQiwKLQkweEJFLCAweDAwLCAweDlBLCAweDEyLCAweEU5LCAweDIwLCAweDBBLCAweDFCLCAweDA4LCAweDA4LCAweDEwLAotCTB4RkMsIDB4RDIsIDB4RkMsIDB4NzQsIDB4MDAsIDB4QzMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhGOSwgMHhGRiwgMHg4MiwgMHgwMCwgMHhERiwgMHgwMCwgMHgwQiwgMHhGRSwgMHg0NywgMHhGQiwgMHgzNywKLQkweDAzLCAweDBDLCAweDE2LCAweDgxLCAweDIxLCAweDBFLCAweDE4LCAweEYyLCAweDA0LCAweDczLCAweEZCLAotCTB4OTIsIDB4RkQsIDB4QzAsIDB4MDAsIDB4OUIsIDB4MDAsIDB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHgwMCwgMHhBNywgMHgwMCwgMHg0NywgMHhGRCwgMHhBMiwgMHhGQiwKLQkweDE4LCAweDA2LCAweDQwLCAweDE5LCAweDVELCAweDIxLCAweEJFLCAweDE0LCAweDM3LCAweDAyLCAweDNELAotCTB4RkIsIDB4NTUsIDB4RkUsIDB4RUMsIDB4MDAsIDB4NzIsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgwRSwgMHgwMCwgMHhEMSwgMHgwMCwgMHg0RSwgMHgwMCwgMHg4QywgMHhGQywgMHg2QSwgMHhGQywgMHg0QywKLQkweDA5LCAweDEzLCAweDFDLCAweDdFLCAweDIwLCAweDNELCAweDExLCAweEU4LCAweEZGLCAweDVGLCAweEZCLAotCTB4MEMsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NEMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHhFRSwgMHgwMCwgMHhEMywgMHhGRiwgMHhFQSwgMHhGQiwgMHhBNywgMHhGRCwgMHhCQywgMHgwQywKLQkweDY4LCAweDFFLCAweEVGLCAweDFFLCAweEFGLCAweDBELCAweDExLCAweEZFLCAweEM1LCAweEZCLCAweEFELAotCTB4RkYsIDB4RjMsIDB4MDAsIDB4MkMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDIsIDB4MDAsCi0JMHhGQiwgMHgwMCwgMHgzQSwgMHhGRiwgMHg3NCwgMHhGQiwgMHg1RCwgMHhGRiwgMHg0OCwgMHgxMCwgMHgyNCwKLQkweDIwLCAweEMyLCAweDFDLCAweDM1LCAweDBBLCAweEIzLCAweEZDLCAweDVELCAweEZDLCAweDMwLCAweDAwLAotCTB4REEsIDB4MDAsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjcsIDB4MDAsIDB4RjMsCi0JMHgwMCwgMHg4OCwgMHhGRSwgMHgzRSwgMHhGQiwgMHg4QywgMHgwMSwgMHhEMCwgMHgxMywgMHgzMywgMHgyMSwKLQkweDBELCAweDFBLCAweEVFLCAweDA2LCAweENELCAweEZCLCAweDEzLCAweEZELCAweDkyLCAweDAwLCAweEI2LAotCTB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RkYsIDB4OTAsIDB4MDAsCi0JMHhDRiwgMHgwMCwgMHhDNywgMHhGRCwgMHg1QiwgMHhGQiwgMHgyQiwgMHgwNCwgMHgzMSwgMHgxNywgMHg4QSwKLQkweDIxLCAweEYwLCAweDE2LCAweEY0LCAweDAzLCAweDU2LCAweEZCLCAweEQ2LCAweEZELCAweEQzLCAweDAwLAotCTB4OEQsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4QjksIDB4MDAsIDB4OEMsCi0JMHgwMCwgMHgwNSwgMHhGRCwgMHhEQiwgMHhGQiwgMHgyQywgMHgwNywgMHg0NywgMHgxQSwgMHgyNSwgMHgyMSwKLQkweDhCLCAweDEzLCAweDVELCAweDAxLCAweDQwLCAweEZCLCAweDk3LCAweEZFLCAweEY1LCAweDAwLCAweDY0LAotCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTUsIDB4MDAsIDB4REMsIDB4MDAsIDB4MjcsIDB4MDAsCi0JMHg1MCwgMHhGQywgMHhDQSwgMHhGQywgMHg3OCwgMHgwQSwgMHhGMiwgMHgxQywgMHgwNywgMHgyMCwgMHgwMiwKLQkweDEwLCAweDM3LCAweEZGLCAweDdCLCAweEZCLCAweDQ3LCAweEZGLCAweEZCLCAweDAwLCAweDQwLCAweDAwLAotCTB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MkUsIDB4MDAsIDB4RjUsIDB4MDAsIDB4QTIsIDB4RkYsIDB4QkIsCi0JMHhGQiwgMHgzMSwgMHhGRSwgMHhGNSwgMHgwRCwgMHgxNCwgMHgxRiwgMHgzRiwgMHgxRSwgMHg3NywgMHgwQywKLQkweDhBLCAweEZELCAweEY1LCAweEZCLCAweERFLCAweEZGLCAweEVDLCAweDAwLCAweDIyLCAweDAwLCAweEZCLAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4NEUsIDB4MDAsIDB4RkIsIDB4MDAsIDB4RkYsIDB4RkUsIDB4NTksIDB4RkIsCi0JMHgxMSwgMHgwMCwgMHg4MywgMHgxMSwgMHg5NiwgMHgyMCwgMHhFMCwgMHgxQiwgMHgwQiwgMHgwOSwgMHg1NiwKLQkweEZDLCAweDk5LCAweEZDLCAweDU2LCAweDAwLCAweENFLCAweDAwLCAweDBELCAweDAwLCAweEZFLCAweEZGLAotCTB4RjgsIDB4RkYsIDB4NzUsIDB4MDAsIDB4RUEsIDB4MDAsIDB4NDcsIDB4RkUsIDB4M0UsIDB4RkIsIDB4NjksCi0JMHgwMiwgMHgwMiwgMHgxNSwgMHg2NiwgMHgyMSwgMHgwNCwgMHgxOSwgMHhEQywgMHgwNSwgMHg5OCwgMHhGQiwKLQkweDU2LCAweEZELCAweEFELCAweDAwLCAweEE4LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4OUUsIDB4MDAsIDB4QkMsIDB4MDAsIDB4ODMsIDB4RkQsIDB4N0IsIDB4RkIsCi0JMHgyQiwgMHgwNSwgMHg0QywgMHgxOCwgMHg3QywgMHgyMSwgMHhDQSwgMHgxNSwgMHgwMywgMHgwMywgMHg0NCwKLQkweEZCLCAweDFBLCAweEZFLCAweEUyLCAweDAwLCAweDdFLCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLAotCTB4MDksIDB4MDAsIDB4QzYsIDB4MDAsIDB4NkQsIDB4MDAsIDB4QzMsIDB4RkMsIDB4MjAsIDB4RkMsIDB4NDksCi0JMHgwOCwgMHg0MSwgMHgxQiwgMHhENiwgMHgyMCwgMHg1NCwgMHgxMiwgMHg5MiwgMHgwMCwgMHg0QywgMHhGQiwKLQkweEQ2LCAweEZFLCAweEZBLCAweDAwLCAweDU3LCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFELAotCTB4MDAsIDB4RTYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTgsIDB4RkMsIDB4MzgsIDB4RkQsIDB4QTksIDB4MEIsCi0JMHhDMCwgMHgxRCwgMHg3QywgMHgxRiwgMHhDNiwgMHgwRSwgMHg5NSwgMHhGRSwgMHg5RiwgMHhGQiwgMHg3RSwKLQkweEZGLCAweEY4LCAweDAwLCAweDM1LCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDM4LCAweDAwLAotCTB4RjksIDB4MDAsIDB4NkMsIDB4RkYsIDB4OTIsIDB4RkIsIDB4QzksIDB4RkUsIDB4MkYsIDB4MEYsIDB4QUQsCi0JMHgxRiwgMHg3RCwgMHgxRCwgMHg0MiwgMHgwQiwgMHgxMiwgMHhGRCwgMHgyQSwgMHhGQywgMHgwQiwgMHgwMCwKLQkweEUzLCAweDAwLCAweDFBLCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDVCLCAweDAwLCAweEY4LAotCTB4MDAsIDB4QzEsIDB4RkUsIDB4NDcsIDB4RkIsIDB4RDQsIDB4MDAsIDB4QkMsIDB4MTIsIDB4RjMsIDB4MjAsCi0JMHhFRiwgMHgxQSwgMHhFOSwgMHgwNywgMHgwOCwgMHhGQywgMHhEOSwgMHhGQywgMHg3OCwgMHgwMCwgMHhDMiwKLQkweDAwLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEY5LCAweEZGLCAweDgzLCAweDAwLCAweERELCAweDAwLAotCTB4MDQsIDB4RkUsIDB4NDksIDB4RkIsIDB4NTIsIDB4MDMsIDB4MkQsIDB4MTYsIDB4ODMsIDB4MjEsIDB4RUYsCi0JMHgxNywgMHhENSwgMHgwNCwgMHg2RiwgMHhGQiwgMHg5QSwgMHhGRCwgMHhDMywgMHgwMCwgMHg5QSwgMHgwMCwKLQkweEZDLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEFELCAweDAwLCAweEE0LAotCTB4MDAsIDB4NDAsIDB4RkQsIDB4QTgsIDB4RkIsIDB4MzYsIDB4MDYsIDB4NUUsIDB4MTksIDB4NTgsIDB4MjEsCi0JMHg5QywgMHgxNCwgMHgxRSwgMHgwMiwgMHgzRCwgMHhGQiwgMHg1RCwgMHhGRSwgMHhFRCwgMHgwMCwgMHg3MCwKLQkweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEQyLCAweDAwLCAweDRBLCAweDAwLAotCTB4ODUsIDB4RkMsIDB4NzQsIDB4RkMsIDB4NkQsIDB4MDksIDB4MkQsIDB4MUMsIDB4NzIsIDB4MjAsIDB4MUEsCi0JMHgxMSwgMHhENCwgMHhGRiwgMHg2MSwgMHhGQiwgMHgxMywgMHhGRiwgMHhGQywgMHgwMCwgMHg0QSwgMHgwMCwKLQkweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI1LCAweDAwLCAweEVGLCAweDAwLCAweENFLCAweEZGLCAweEU0LAotCTB4RkIsIDB4QjUsIDB4RkQsIDB4REUsIDB4MEMsIDB4N0MsIDB4MUUsIDB4REQsIDB4MUUsIDB4OEMsIDB4MEQsCi0JMHgwMSwgMHhGRSwgMHhDQSwgMHhGQiwgMHhCMywgMHhGRiwgMHhGMywgMHgwMCwgMHgyQiwgMHgwMCwgMHhGQSwKLQkweEZGLCAweEY4LCAweEZGLCAweDQ0LCAweDAwLCAweEZCLCAweDAwLCAweDM0LCAweEZGLCAweDcxLCAweEZCLAotCTB4NzEsIDB4RkYsIDB4NkIsIDB4MTAsIDB4MzIsIDB4MjAsIDB4QTksIDB4MUMsIDB4MTMsIDB4MEEsIDB4QTgsCi0JMHhGQywgMHg2MywgMHhGQywgMHgzNSwgMHgwMCwgMHhEOSwgMHgwMCwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweEY3LCAweEZGLCAweDY5LCAweDAwLCAweEYyLCAweDAwLCAweDgxLCAweEZFLCAweDNFLCAweEZCLCAweEE0LAotCTB4MDEsIDB4RjIsIDB4MTMsIDB4M0EsIDB4MjEsIDB4RjAsIDB4MTksIDB4Q0YsIDB4MDYsIDB4QzcsIDB4RkIsCi0JMHgxQiwgMHhGRCwgMHg5NiwgMHgwMCwgMHhCNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweEZCLCAweEZGLCAweDkyLCAweDAwLCAweENELCAweDAwLCAweEMwLCAweEZELCAweDVFLCAweEZCLAotCTB4NDcsIDB4MDQsIDB4NTEsIDB4MTcsIDB4OEEsIDB4MjEsIDB4RDAsIDB4MTYsIDB4RDksIDB4MDMsIDB4NTMsCi0JMHhGQiwgMHhERSwgMHhGRCwgMHhENSwgMHgwMCwgMHg4QiwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweDA0LCAweDAwLCAweEJBLCAweDAwLCAweDg5LCAweDAwLCAweEZELCAweEZDLCAweEUyLCAweEZCLCAweDRCLAotCTB4MDcsIDB4NjMsIDB4MUEsIDB4MUQsIDB4MjEsIDB4NjksIDB4MTMsIDB4NDYsIDB4MDEsIDB4NDEsIDB4RkIsCi0JMHg5RSwgMHhGRSwgMHhGNSwgMHgwMCwgMHg2MywgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNiwKLQkweDAwLCAweERELCAweDAwLCAweDIzLCAweDAwLCAweDQ5LCAweEZDLCAweEQ1LCAweEZDLCAweDk5LCAweDBBLAotCTB4MDksIDB4MUQsIDB4RjksIDB4MUYsIDB4REYsIDB4MEYsIDB4MjQsIDB4RkYsIDB4N0YsIDB4RkIsIDB4NEQsCi0JMHhGRiwgMHhGQiwgMHgwMCwgMHgzRiwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweEY1LCAweDAwLCAweDlDLCAweEZGLCAweEI2LCAweEZCLCAweDQxLCAweEZFLCAweDE3LCAweDBFLCAweDI2LAotCTB4MUYsIDB4MkIsIDB4MUUsIDB4NTQsIDB4MEMsIDB4N0MsIDB4RkQsIDB4RkEsIDB4RkIsIDB4RTMsIDB4RkYsCi0JMHhFQiwgMHgwMCwgMHgyMSwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1MCwgMHgwMCwgMHhGQiwKLQkweDAwLCAweEY4LCAweEZFLCAweDU3LCAweEZCLCAweDI2LCAweDAwLCAweEE2LCAweDExLCAweEExLCAweDIwLAotCTB4QzYsIDB4MUIsIDB4RUEsIDB4MDgsIDB4NEQsIDB4RkMsIDB4QTAsIDB4RkMsIDB4NUEsIDB4MDAsIDB4Q0QsCi0JMHgwMCwgMHgwQywgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3NywgMHgwMCwgMHhFOSwgMHgwMCwKLQkweDNGLCAweEZFLCAweDNGLCAweEZCLCAweDgyLCAweDAyLCAweDIzLCAweDE1LCAweDZCLCAweDIxLCAweEU1LAotCTB4MTgsIDB4QkUsIDB4MDUsIDB4OTMsIDB4RkIsIDB4NUUsIDB4RkQsIDB4QUYsIDB4MDAsIDB4QTYsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhBMCwgMHgwMCwgMHhCOSwKLQkweDAwLCAweDdDLCAweEZELCAweDgwLCAweEZCLCAweDQ4LCAweDA1LCAweDZCLCAweDE4LCAweDc5LCAweDIxLAotCTB4QTksIDB4MTUsIDB4RTksIDB4MDIsIDB4NDMsIDB4RkIsIDB4MjEsIDB4RkUsIDB4RTMsIDB4MDAsIDB4N0QsCi0JMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhDNywgMHgwMCwgMHg2OSwgMHgwMCwKLQkweEJDLCAweEZDLCAweDI5LCAweEZDLCAweDY5LCAweDA4LCAweDVDLCAweDFCLCAweENDLCAweDIwLCAweDMyLAotCTB4MTIsIDB4N0MsIDB4MDAsIDB4NEUsIDB4RkIsIDB4REQsIDB4RkUsIDB4RkEsIDB4MDAsIDB4NTYsIDB4MDAsCi0JMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhFNywgMHgwMCwgMHhGOCwgMHhGRiwgMHgxMiwKLQkweEZDLCAweDQ1LCAweEZELCAweENCLCAweDBCLCAweEQ2LCAweDFELCAweDZDLCAweDFGLCAweEEzLCAweDBFLAotCTB4ODQsIDB4RkUsIDB4QTQsIDB4RkIsIDB4ODQsIDB4RkYsIDB4RjcsIDB4MDAsIDB4MzQsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHhGOCwgMHhGRiwgMHgzQSwgMHgwMCwgMHhGQSwgMHgwMCwgMHg2NiwgMHhGRiwgMHg4RSwgMHhGQiwKLQkweERCLCAweEZFLCAweDUzLCAweDBGLCAweEJELCAweDFGLCAweDY2LCAweDFELCAweDIxLCAweDBCLCAweDA1LAotCTB4RkQsIDB4MzAsIDB4RkMsIDB4MTAsIDB4MDAsIDB4RTIsIDB4MDAsIDB4MTksIDB4MDAsIDB4RkMsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHg1RCwgMHgwMCwgMHhGOCwgMHgwMCwgMHhCQSwgMHhGRSwgMHg0NiwgMHhGQiwgMHhFQSwKLQkweDAwLCAweERGLCAweDEyLCAweEZDLCAweDIwLCAweEQzLCAweDFBLCAweEM5LCAweDA3LCAweDAwLCAweEZDLAotCTB4RTAsIDB4RkMsIDB4N0IsIDB4MDAsIDB4QzAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksCi0JMHhGRiwgMHg4NSwgMHgwMCwgMHhEQywgMHgwMCwgMHhGQywgMHhGRCwgMHg0QSwgMHhGQiwgMHg2QywgMHgwMywKLQkweDRFLCAweDE2LCAweDg1LCAweDIxLCAweENGLCAweDE3LCAweEI4LCAweDA0LCAweDZDLCAweEZCLCAweEEyLAotCTB4RkQsIDB4QzUsIDB4MDAsIDB4OTgsIDB4MDAsIDB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMSwgMHgwMCwgMHhBRSwgMHgwMCwgMHhBMSwgMHgwMCwgMHgzOCwgMHhGRCwgMHhBRSwgMHhGQiwgMHg1NCwKLQkweDA2LCAweDdDLCAweDE5LCAweDUzLCAweDIxLCAweDdCLCAweDE0LCAweDA1LCAweDAyLCAweDNELCAweEZCLAotCTB4NjQsIDB4RkUsIDB4RUUsIDB4MDAsIDB4NkYsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MEYsCi0JMHgwMCwgMHhENCwgMHgwMCwgMHg0NiwgMHgwMCwgMHg3RSwgMHhGQywgMHg3RSwgMHhGQywgMHg4RSwgMHgwOSwKLQkweDQ2LCAweDFDLCAweDY2LCAweDIwLCAweEY3LCAweDEwLCAweEMwLCAweEZGLCAweDY0LCAweEZCLCAweDFBLAotCTB4RkYsIDB4RkMsIDB4MDAsIDB4NDksIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjYsIDB4MDAsCi0JMHhGMCwgMHgwMCwgMHhDOSwgMHhGRiwgMHhERiwgMHhGQiwgMHhDNCwgMHhGRCwgMHgwMSwgMHgwRCwgMHg5MCwKLQkweDFFLCAweENBLCAweDFFLCAweDY5LCAweDBELCAweEYxLCAweEZELCAweENGLCAweEZCLCAweEI4LCAweEZGLAotCTB4RjIsIDB4MDAsIDB4MjksIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NDUsIDB4MDAsIDB4RkMsCi0JMHgwMCwgMHgyRCwgMHhGRiwgMHg2RCwgMHhGQiwgMHg4NCwgMHhGRiwgMHg4RSwgMHgxMCwgMHgzRiwgMHgyMCwKLQkweDkxLCAweDFDLCAweEYyLCAweDA5LCAweDlELCAweEZDLCAweDZBLCAweEZDLCAweDM5LCAweDAwLCAweEQ3LAotCTB4MDAsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NkEsIDB4MDAsIDB4RjEsIDB4MDAsCi0JMHg3QSwgMHhGRSwgMHgzRCwgMHhGQiwgMHhCQywgMHgwMSwgMHgxNCwgMHgxNCwgMHg0MSwgMHgyMSwgMHhENCwKLQkweDE5LCAweEIwLCAweDA2LCAweEMwLCAweEZCLCAweDIyLCAweEZELCAweDk5LCAweDAwLCAweEIzLCAweDAwLAotCTB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RkYsIDB4OTMsIDB4MDAsIDB4Q0IsCi0JMHgwMCwgMHhCOCwgMHhGRCwgMHg2MSwgMHhGQiwgMHg2MywgMHgwNCwgMHg3MSwgMHgxNywgMHg4OSwgMHgyMSwKLQkweEIwLCAweDE2LCAweEJELCAweDAzLCAweDUxLCAweEZCLCAweEU2LCAweEZELCAweEQ3LCAweDAwLCAweDhBLAotCTB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsIDB4QkMsIDB4MDAsIDB4ODYsIDB4MDAsCi0JMHhGNiwgMHhGQywgMHhFOSwgMHhGQiwgMHg2QSwgMHgwNywgMHg4MCwgMHgxQSwgMHgxNSwgMHgyMSwgMHg0NywKLQkweDEzLCAweDJGLCAweDAxLCAweDQyLCAweEZCLCAweEE1LCAweEZFLCAweEY2LCAweDAwLCAweDYxLCAweDAwLAotCTB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTYsIDB4MDAsIDB4REYsIDB4MDAsIDB4MUUsIDB4MDAsIDB4NDMsCi0JMHhGQywgMHhFMSwgMHhGQywgMHhCQiwgMHgwQSwgMHgyMSwgMHgxRCwgMHhFQSwgMHgxRiwgMHhCQywgMHgwRiwKLQkweDEyLCAweEZGLCAweDgyLCAweEZCLCAweDU0LCAweEZGLCAweEZBLCAweDAwLCAweDNELCAweDAwLCAweEY4LAotCTB4RkYsIDB4RjksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RjYsIDB4MDAsIDB4OTYsIDB4RkYsIDB4QjEsIDB4RkIsCi0JMHg1MSwgMHhGRSwgMHgzQSwgMHgwRSwgMHgzOCwgMHgxRiwgMHgxNiwgMHgxRSwgMHgzMiwgMHgwQywgMHg2RSwKLQkweEZELCAweDAwLCAweEZDLCAweEU4LCAweEZGLCAweEVBLCAweDAwLCAweDIwLCAweDAwLCAweEZCLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RkIsIDB4MDAsIDB4RjEsIDB4RkUsIDB4NTQsIDB4RkIsIDB4M0IsCi0JMHgwMCwgMHhDOSwgMHgxMSwgMHhBRCwgMHgyMCwgMHhBQywgMHgxQiwgMHhDQSwgMHgwOCwgMHg0NCwgMHhGQywKLQkweEE3LCAweEZDLCAweDVFLCAweDAwLCAweENDLCAweDAwLCAweDBCLCAweDAwLCAweEZFLCAweEZGLCAweEY4LAotCTB4RkYsIDB4NzgsIDB4MDAsIDB4RTcsIDB4MDAsIDB4MzgsIDB4RkUsIDB4NDAsIDB4RkIsIDB4OUIsIDB4MDIsCi0JMHg0NSwgMHgxNSwgMHg2RiwgMHgyMSwgMHhDNywgMHgxOCwgMHhBMSwgMHgwNSwgMHg4RSwgMHhGQiwgMHg2NSwKLQkweEZELCAweEIyLCAweDAwLCAweEE1LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4QTIsIDB4MDAsIDB4QjcsIDB4MDAsIDB4NzQsIDB4RkQsIDB4ODQsIDB4RkIsIDB4NjYsCi0JMHgwNSwgMHg4QSwgMHgxOCwgMHg3NiwgMHgyMSwgMHg4NywgMHgxNSwgMHhDRiwgMHgwMiwgMHg0MSwgMHhGQiwKLQkweDI5LCAweEZFLCAweEU1LCAweDAwLCAweDdCLCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBBLAotCTB4MDAsIDB4QzksIDB4MDAsIDB4NjYsIDB4MDAsIDB4QjUsIDB4RkMsIDB4MzIsIDB4RkMsIDB4ODksIDB4MDgsCi0JMHg3NywgMHgxQiwgMHhDMiwgMHgyMCwgMHgwRiwgMHgxMiwgMHg2NiwgMHgwMCwgMHg1MCwgMHhGQiwgMHhFNCwKLQkweEZFLCAweEZBLCAweDAwLCAweDU0LCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFFLCAweDAwLAotCTB4RTgsIDB4MDAsIDB4RjMsIDB4RkYsIDB4MEMsIDB4RkMsIDB4NTMsIDB4RkQsIDB4RUQsIDB4MEIsIDB4RUIsCi0JMHgxRCwgMHg1QSwgMHgxRiwgMHg4MCwgMHgwRSwgMHg3MywgMHhGRSwgMHhBOCwgMHhGQiwgMHg4QSwgMHhGRiwKLQkweEY3LCAweDAwLCAweDMyLCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDNCLCAweDAwLCAweEZBLAotCTB4MDAsIDB4NjAsIDB4RkYsIDB4OEEsIDB4RkIsIDB4RUQsIDB4RkUsIDB4NzYsIDB4MEYsIDB4Q0MsIDB4MUYsCi0JMHg0RiwgMHgxRCwgMHhGRiwgMHgwQSwgMHhGOSwgMHhGQywgMHgzNiwgMHhGQywgMHgxNSwgMHgwMCwgMHhFMSwKLQkweDAwLCAweDE4LCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDVFLCAweDAwLCAweEY3LCAweDAwLAotCTB4QjMsIDB4RkUsIDB4NDQsIDB4RkIsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MDQsIDB4MjEsIDB4QjgsCi0JMHgxQSwgMHhBOSwgMHgwNywgMHhGOCwgMHhGQiwgMHhFNywgMHhGQywgMHg3RiwgMHgwMCwgMHhCRiwgMHgwMCwKLQkweDA2LCAweDAwLCAweEZGLCAweEZGLCAweEY5LCAweEZGLCAweDg2LCAweDAwLCAweERBLCAweDAwLCAweEY1LAotCTB4RkQsIDB4NEMsIDB4RkIsIDB4ODcsIDB4MDMsIDB4NkUsIDB4MTYsIDB4ODYsIDB4MjEsIDB4QjAsIDB4MTcsCi0JMHg5QywgMHgwNCwgMHg2OCwgMHhGQiwgMHhBOSwgMHhGRCwgMHhDNywgMHgwMCwgMHg5NiwgMHgwMCwgMHhGQiwKLQkweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAxLCAweDAwLCAweEIwLCAweDAwLCAweDlGLCAweDAwLAotCTB4MzEsIDB4RkQsIDB4QjQsIDB4RkIsIDB4NzMsIDB4MDYsIDB4OTksIDB4MTksIDB4NEQsIDB4MjEsIDB4NTksCi0JMHgxNCwgMHhFRCwgMHgwMSwgMHgzRCwgMHhGQiwgMHg2QiwgMHhGRSwgMHhFRiwgMHgwMCwgMHg2RCwgMHgwMCwKLQkweEY3LCAweEZGLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEQ1LCAweDAwLCAweDQyLCAweDAwLCAweDc3LAotCTB4RkMsIDB4ODgsIDB4RkMsIDB4QUYsIDB4MDksIDB4NUYsIDB4MUMsIDB4NTksIDB4MjAsIDB4RDQsIDB4MTAsCi0JMHhBQywgMHhGRiwgMHg2NywgMHhGQiwgMHgyMCwgMHhGRiwgMHhGQywgMHgwMCwgMHg0OCwgMHgwMCwgMHhGNywKLQkweEZGLCAweEZBLCAweEZGLCAweDI3LCAweDAwLCAweEYwLCAweDAwLCAweEMzLCAweEZGLCAweEQ5LCAweEZCLAotCTB4RDMsIDB4RkQsIDB4MjQsIDB4MEQsIDB4QTMsIDB4MUUsIDB4QjcsIDB4MUUsIDB4NDYsIDB4MEQsIDB4RTIsCi0JMHhGRCwgMHhENCwgMHhGQiwgMHhCRSwgMHhGRiwgMHhGMSwgMHgwMCwgMHgyOCwgMHgwMCwgMHhGQSwgMHhGRiwKLQkweEY3LCAweEZGLCAweDQ2LCAweDAwLCAweEZDLCAweDAwLCAweDI3LCAweEZGLCAweDZBLCAweEZCLCAweDk4LAotCTB4RkYsIDB4QjEsIDB4MTAsIDB4NEMsIDB4MjAsIDB4NzgsIDB4MUMsIDB4RDEsIDB4MDksIDB4OTMsIDB4RkMsCi0JMHg3MSwgMHhGQywgMHgzRCwgMHgwMCwgMHhENiwgMHgwMCwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywKLQkweEZGLCAweDZDLCAweDAwLCAweEYwLCAweDAwLCAweDcyLCAweEZFLCAweDNELCAweEZCLCAweEQ0LCAweDAxLAotCTB4MzYsIDB4MTQsIDB4NDcsIDB4MjEsIDB4QjYsIDB4MTksIDB4OTEsIDB4MDYsIDB4QkEsIDB4RkIsIDB4MjksCi0JMHhGRCwgMHg5QywgMHgwMCwgMHhCMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweEZCLCAweEZGLCAweDk1LCAweDAwLCAweEM5LCAweDAwLCAweEIxLCAweEZELCAweDY1LCAweEZCLCAweDgwLAotCTB4MDQsIDB4OTAsIDB4MTcsIDB4ODgsIDB4MjEsIDB4OEYsIDB4MTYsIDB4QTIsIDB4MDMsIDB4NEUsIDB4RkIsCi0JMHhFRCwgMHhGRCwgMHhEOSwgMHgwMCwgMHg4OCwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNSwKLQkweDAwLCAweEJELCAweDAwLCAweDgyLCAweDAwLCAweEVGLCAweEZDLCAweEYwLCAweEZCLCAweDhBLCAweDA3LAotCTB4OUMsIDB4MUEsIDB4MEQsIDB4MjEsIDB4MjQsIDB4MTMsIDB4MTgsIDB4MDEsIDB4NDMsIDB4RkIsIDB4QUMsCi0JMHhGRSwgMHhGNywgMHgwMCwgMHg2MCwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNywgMHgwMCwKLQkweEUwLCAweDAwLCAweDFBLCAweDAwLCAweDNELCAweEZDLCAweEVELCAweEZDLCAweERELCAweDBBLCAweDM4LAotCTB4MUQsIDB4REIsIDB4MUYsIDB4OTksIDB4MEYsIDB4RkYsIDB4RkUsIDB4ODYsIDB4RkIsIDB4NUEsIDB4RkYsCi0JMHhGQSwgMHgwMCwgMHgzQywgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGNiwKLQkweDAwLCAweDkwLCAweEZGLCAweEFELCAweEZCLCAweDYyLCAweEZFLCAweDVELCAweDBFLCAweDQ5LCAweDFGLAotCTB4MDEsIDB4MUUsIDB4MTAsIDB4MEMsIDB4NjAsIDB4RkQsIDB4MDYsIDB4RkMsIDB4RUUsIDB4RkYsIDB4RTksCi0JMHgwMCwgMHgxRiwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1MywgMHgwMCwgMHhGQiwgMHgwMCwKLQkweEVCLCAweEZFLCAweDUyLCAweEZCLCAweDUxLCAweDAwLCAweEVDLCAweDExLCAweEI3LCAweDIwLCAweDkxLAotCTB4MUIsIDB4QTksIDB4MDgsIDB4M0IsIDB4RkMsIDB4QUUsIDB4RkMsIDB4NjIsIDB4MDAsIDB4Q0EsIDB4MDAsCi0JMHgwQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3QSwgMHgwMCwgMHhFNiwgMHgwMCwgMHgzMCwKLQkweEZFLCAweDQwLCAweEZCLCAweEI1LCAweDAyLCAweDY2LCAweDE1LCAweDczLCAweDIxLCAweEE5LCAweDE4LAotCTB4ODMsIDB4MDUsIDB4ODksIDB4RkIsIDB4NkQsIDB4RkQsIDB4QjQsIDB4MDAsIDB4QTMsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhBMywgMHgwMCwgMHhCNCwgMHgwMCwKLQkweDZELCAweEZELCAweDg5LCAweEZCLCAweDgzLCAweDA1LCAweEE5LCAweDE4LCAweDczLCAweDIxLCAweDY2LAotCTB4MTUsIDB4QjUsIDB4MDIsIDB4NDAsIDB4RkIsIDB4MzAsIDB4RkUsIDB4RTYsIDB4MDAsIDB4N0EsIDB4MDAsCi0JMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwQiwgMHgwMCwgMHhDQSwgMHgwMCwgMHg2MiwgMHgwMCwgMHhBRSwKLQkweEZDLCAweDNCLCAweEZDLCAweEE5LCAweDA4LCAweDkxLCAweDFCLCAweEI3LCAweDIwLCAweEVDLCAweDExLAotCTB4NTEsIDB4MDAsIDB4NTIsIDB4RkIsIDB4RUIsIDB4RkUsIDB4RkIsIDB4MDAsIDB4NTMsIDB4MDAsIDB4RjcsCi0JMHhGRiwgMHhGQiwgMHhGRiwgMHgxRiwgMHgwMCwgMHhFOSwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwNiwgMHhGQywKLQkweDYwLCAweEZELCAweDEwLCAweDBDLCAweDAxLCAweDFFLCAweDQ5LCAweDFGLCAweDVELCAweDBFLCAweDYyLAotCTB4RkUsIDB4QUQsIDB4RkIsIDB4OTAsIDB4RkYsIDB4RjYsIDB4MDAsIDB4MzEsIDB4MDAsIDB4RjksIDB4RkYsCi0JMHhGOCwgMHhGRiwgMHgzQywgMHgwMCwgMHhGQSwgMHgwMCwgMHg1QSwgMHhGRiwgMHg4NiwgMHhGQiwgMHhGRiwKLQkweEZFLCAweDk5LCAweDBGLCAweERCLCAweDFGLCAweDM4LCAweDFELCAweERELCAweDBBLCAweEVELCAweEZDLAotCTB4M0QsIDB4RkMsIDB4MUEsIDB4MDAsIDB4RTAsIDB4MDAsIDB4MTcsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsCi0JMHhGRiwgMHg2MCwgMHgwMCwgMHhGNywgMHgwMCwgMHhBQywgMHhGRSwgMHg0MywgMHhGQiwgMHgxOCwgMHgwMSwKLQkweDI0LCAweDEzLCAweDBELCAweDIxLCAweDlDLCAweDFBLCAweDhBLCAweDA3LCAweEYwLCAweEZCLCAweEVGLAotCTB4RkMsIDB4ODIsIDB4MDAsIDB4QkQsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsCi0JMHg4OCwgMHgwMCwgMHhEOSwgMHgwMCwgMHhFRCwgMHhGRCwgMHg0RSwgMHhGQiwgMHhBMiwgMHgwMywgMHg4RiwKLQkweDE2LCAweDg4LCAweDIxLCAweDkwLCAweDE3LCAweDgwLCAweDA0LCAweDY1LCAweEZCLCAweEIxLCAweEZELAotCTB4QzksIDB4MDAsIDB4OTUsIDB4MDAsIDB4RkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDIsCi0JMHgwMCwgMHhCMSwgMHgwMCwgMHg5QywgMHgwMCwgMHgyOSwgMHhGRCwgMHhCQSwgMHhGQiwgMHg5MSwgMHgwNiwKLQkweEI2LCAweDE5LCAweDQ3LCAweDIxLCAweDM2LCAweDE0LCAweEQ0LCAweDAxLCAweDNELCAweEZCLCAweDcyLAotCTB4RkUsIDB4RjAsIDB4MDAsIDB4NkMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsCi0JMHhENiwgMHgwMCwgMHgzRCwgMHgwMCwgMHg3MSwgMHhGQywgMHg5MywgMHhGQywgMHhEMSwgMHgwOSwgMHg3OCwKLQkweDFDLCAweDRDLCAweDIwLCAweEIxLCAweDEwLCAweDk4LCAweEZGLCAweDZBLCAweEZCLCAweDI3LCAweEZGLAotCTB4RkMsIDB4MDAsIDB4NDYsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RjEsCi0JMHgwMCwgMHhCRSwgMHhGRiwgMHhENCwgMHhGQiwgMHhFMiwgMHhGRCwgMHg0NiwgMHgwRCwgMHhCNywgMHgxRSwKLQkweEEzLCAweDFFLCAweDI0LCAweDBELCAweEQzLCAweEZELCAweEQ5LCAweEZCLCAweEMzLCAweEZGLCAweEYwLAotCTB4MDAsIDB4MjcsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NDgsIDB4MDAsIDB4RkMsIDB4MDAsCi0JMHgyMCwgMHhGRiwgMHg2NywgMHhGQiwgMHhBQywgMHhGRiwgMHhENCwgMHgxMCwgMHg1OSwgMHgyMCwgMHg1RiwKLQkweDFDLCAweEFGLCAweDA5LCAweDg4LCAweEZDLCAweDc3LCAweEZDLCAweDQyLCAweDAwLCAweEQ1LCAweDAwLAotCTB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NkQsIDB4MDAsIDB4RUYsIDB4MDAsIDB4NkIsCi0JMHhGRSwgMHgzRCwgMHhGQiwgMHhFRCwgMHgwMSwgMHg1OSwgMHgxNCwgMHg0RCwgMHgyMSwgMHg5OSwgMHgxOSwKLQkweDczLCAweDA2LCAweEI0LCAweEZCLCAweDMxLCAweEZELCAweDlGLCAweDAwLCAweEIwLCAweDAwLCAweDAxLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RkYsIDB4OTYsIDB4MDAsIDB4QzcsIDB4MDAsCi0JMHhBOSwgMHhGRCwgMHg2OCwgMHhGQiwgMHg5QywgMHgwNCwgMHhCMCwgMHgxNywgMHg4NiwgMHgyMSwgMHg2RSwKLQkweDE2LCAweDg3LCAweDAzLCAweDRDLCAweEZCLCAweEY1LCAweEZELCAweERBLCAweDAwLCAweDg2LCAweDAwLAotCTB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDAsIDB4QkYsIDB4MDAsIDB4N0YsIDB4MDAsIDB4RTcsCi0JMHhGQywgMHhGOCwgMHhGQiwgMHhBOSwgMHgwNywgMHhCOCwgMHgxQSwgMHgwNCwgMHgyMSwgMHgwMiwgMHgxMywKLQkweDAxLCAweDAxLCAweDQ0LCAweEZCLCAweEIzLCAweEZFLCAweEY3LCAweDAwLCAweDVFLCAweDAwLCAweEY3LAotCTB4RkYsIDB4RkMsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RTEsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MzYsIDB4RkMsCi0JMHhGOSwgMHhGQywgMHhGRiwgMHgwQSwgMHg0RiwgMHgxRCwgMHhDQywgMHgxRiwgMHg3NiwgMHgwRiwgMHhFRCwKLQkweEZFLCAweDhBLCAweEZCLCAweDYwLCAweEZGLCAweEZBLCAweDAwLCAweDNCLCAweDAwLCAweEY4LCAweEZGLAotCTB4RjksIDB4RkYsIDB4MzIsIDB4MDAsIDB4RjcsIDB4MDAsIDB4OEEsIDB4RkYsIDB4QTgsIDB4RkIsIDB4NzMsCi0JMHhGRSwgMHg4MCwgMHgwRSwgMHg1QSwgMHgxRiwgMHhFQiwgMHgxRCwgMHhFRCwgMHgwQiwgMHg1MywgMHhGRCwKLQkweDBDLCAweEZDLCAweEYzLCAweEZGLCAweEU4LCAweDAwLCAweDFFLCAweDAwLCAweEZCLCAweEZGLCAweEY3LAotCTB4RkYsIDB4NTQsIDB4MDAsIDB4RkEsIDB4MDAsIDB4RTQsIDB4RkUsIDB4NTAsIDB4RkIsIDB4NjYsIDB4MDAsCi0JMHgwRiwgMHgxMiwgMHhDMiwgMHgyMCwgMHg3NywgMHgxQiwgMHg4OSwgMHgwOCwgMHgzMiwgMHhGQywgMHhCNSwKLQkweEZDLCAweDY2LCAweDAwLCAweEM5LCAweDAwLCAweDBBLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLAotCTB4N0IsIDB4MDAsIDB4RTUsIDB4MDAsIDB4MjksIDB4RkUsIDB4NDEsIDB4RkIsIDB4Q0YsIDB4MDIsIDB4ODcsCi0JMHgxNSwgMHg3NiwgMHgyMSwgMHg4QSwgMHgxOCwgMHg2NiwgMHgwNSwgMHg4NCwgMHhGQiwgMHg3NCwgMHhGRCwKLQkweEI3LCAweDAwLCAweEEyLCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZFLAotCTB4RkYsIDB4QTUsIDB4MDAsIDB4QjIsIDB4MDAsIDB4NjUsIDB4RkQsIDB4OEUsIDB4RkIsIDB4QTEsIDB4MDUsCi0JMHhDNywgMHgxOCwgMHg2RiwgMHgyMSwgMHg0NSwgMHgxNSwgMHg5QiwgMHgwMiwgMHg0MCwgMHhGQiwgMHgzOCwKLQkweEZFLCAweEU3LCAweDAwLCAweDc4LCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBCLCAweDAwLAotCTB4Q0MsIDB4MDAsIDB4NUUsIDB4MDAsIDB4QTcsIDB4RkMsIDB4NDQsIDB4RkMsIDB4Q0EsIDB4MDgsIDB4QUMsCi0JMHgxQiwgMHhBRCwgMHgyMCwgMHhDOSwgMHgxMSwgMHgzQiwgMHgwMCwgMHg1NCwgMHhGQiwgMHhGMSwgMHhGRSwKLQkweEZCLCAweDAwLCAweDUxLCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDIwLCAweDAwLCAweEVBLAotCTB4MDAsIDB4RTgsIDB4RkYsIDB4MDAsIDB4RkMsIDB4NkUsIDB4RkQsIDB4MzIsIDB4MEMsIDB4MTYsIDB4MUUsCi0JMHgzOCwgMHgxRiwgMHgzQSwgMHgwRSwgMHg1MSwgMHhGRSwgMHhCMSwgMHhGQiwgMHg5NiwgMHhGRiwgMHhGNiwKLQkweDAwLCAweDMwLCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDNELCAweDAwLCAweEZBLCAweDAwLAotCTB4NTQsIDB4RkYsIDB4ODIsIDB4RkIsIDB4MTIsIDB4RkYsIDB4QkMsIDB4MEYsIDB4RUEsIDB4MUYsIDB4MjEsCi0JMHgxRCwgMHhCQiwgMHgwQSwgMHhFMSwgMHhGQywgMHg0MywgMHhGQywgMHgxRSwgMHgwMCwgMHhERiwgMHgwMCwKLQkweDE2LCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDYxLCAweDAwLCAweEY2LCAweDAwLCAweEE1LAotCTB4RkUsIDB4NDIsIDB4RkIsIDB4MkYsIDB4MDEsIDB4NDcsIDB4MTMsIDB4MTUsIDB4MjEsIDB4ODAsIDB4MUEsCi0JMHg2QSwgMHgwNywgMHhFOSwgMHhGQiwgMHhGNiwgMHhGQywgMHg4NiwgMHgwMCwgMHhCQywgMHgwMCwgMHgwNSwKLQkweDAwLCAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweDhBLCAweDAwLCAweEQ3LCAweDAwLCAweEU2LCAweEZELAotCTB4NTEsIDB4RkIsIDB4QkQsIDB4MDMsIDB4QjAsIDB4MTYsIDB4ODksIDB4MjEsIDB4NzEsIDB4MTcsIDB4NjMsCi0JMHgwNCwgMHg2MSwgMHhGQiwgMHhCOCwgMHhGRCwgMHhDQiwgMHgwMCwgMHg5MywgMHgwMCwgMHhGQiwgMHhGRiwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAyLCAweDAwLCAweEIzLCAweDAwLCAweDk5LCAweDAwLCAweDIyLAotCTB4RkQsIDB4QzAsIDB4RkIsIDB4QjAsIDB4MDYsIDB4RDQsIDB4MTksIDB4NDEsIDB4MjEsIDB4MTQsIDB4MTQsCi0JMHhCQywgMHgwMSwgMHgzRCwgMHhGQiwgMHg3QSwgMHhGRSwgMHhGMSwgMHgwMCwgMHg2QSwgMHgwMCwgMHhGNywKLQkweEZGLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEQ3LCAweDAwLCAweDM5LCAweDAwLCAweDZBLCAweEZDLAotCTB4OUQsIDB4RkMsIDB4RjIsIDB4MDksIDB4OTEsIDB4MUMsIDB4M0YsIDB4MjAsIDB4OEUsIDB4MTAsIDB4ODQsCi0JMHhGRiwgMHg2RCwgMHhGQiwgMHgyRCwgMHhGRiwgMHhGQywgMHgwMCwgMHg0NSwgMHgwMCwgMHhGNywgMHhGRiwKLQkweEZBLCAweEZGLCAweDI5LCAweDAwLCAweEYyLCAweDAwLCAweEI4LCAweEZGLCAweENGLCAweEZCLCAweEYxLAotCTB4RkQsIDB4NjksIDB4MEQsIDB4Q0EsIDB4MUUsIDB4OTAsIDB4MUUsIDB4MDEsIDB4MEQsIDB4QzQsIDB4RkQsCi0JMHhERiwgMHhGQiwgMHhDOSwgMHhGRiwgMHhGMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywKLQkweEZGLCAweDQ5LCAweDAwLCAweEZDLCAweDAwLCAweDFBLCAweEZGLCAweDY0LCAweEZCLCAweEMwLCAweEZGLAotCTB4RjcsIDB4MTAsIDB4NjYsIDB4MjAsIDB4NDYsIDB4MUMsIDB4OEUsIDB4MDksIDB4N0UsIDB4RkMsIDB4N0UsCi0JMHhGQywgMHg0NiwgMHgwMCwgMHhENCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwKLQkweDZGLCAweDAwLCAweEVFLCAweDAwLCAweDY0LCAweEZFLCAweDNELCAweEZCLCAweDA1LCAweDAyLCAweDdCLAotCTB4MTQsIDB4NTMsIDB4MjEsIDB4N0MsIDB4MTksIDB4NTQsIDB4MDYsIDB4QUUsIDB4RkIsIDB4MzgsIDB4RkQsCi0JMHhBMSwgMHgwMCwgMHhBRSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQywKLQkweEZGLCAweDk4LCAweDAwLCAweEM1LCAweDAwLCAweEEyLCAweEZELCAweDZDLCAweEZCLCAweEI4LCAweDA0LAotCTB4Q0YsIDB4MTcsIDB4ODUsIDB4MjEsIDB4NEUsIDB4MTYsIDB4NkMsIDB4MDMsIDB4NEEsIDB4RkIsIDB4RkMsCi0JMHhGRCwgMHhEQywgMHgwMCwgMHg4NSwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMCwKLQkweEMwLCAweDAwLCAweDdCLCAweDAwLCAweEUwLCAweEZDLCAweDAwLCAweEZDLCAweEM5LCAweDA3LCAweEQzLAotCTB4MUEsIDB4RkMsIDB4MjAsIDB4REYsIDB4MTIsIDB4RUEsIDB4MDAsIDB4NDYsIDB4RkIsIDB4QkEsIDB4RkUsCi0JMHhGOCwgMHgwMCwgMHg1RCwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxOSwgMHgwMCwgMHhFMiwKLQkweDAwLCAweDEwLCAweDAwLCAweDMwLCAweEZDLCAweDA1LCAweEZELCAweDIxLCAweDBCLCAweDY2LCAweDFELAotCTB4QkQsIDB4MUYsIDB4NTMsIDB4MEYsIDB4REIsIDB4RkUsIDB4OEUsIDB4RkIsIDB4NjYsIDB4RkYsIDB4RkEsCi0JMHgwMCwgMHgzQSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGNywgMHgwMCwKLQkweDg0LCAweEZGLCAweEE0LCAweEZCLCAweDg0LCAweEZFLCAweEEzLCAweDBFLCAweDZDLCAweDFGLCAweEQ2LAotCTB4MUQsIDB4Q0IsIDB4MEIsIDB4NDUsIDB4RkQsIDB4MTIsIDB4RkMsIDB4RjgsIDB4RkYsIDB4RTcsIDB4MDAsCi0JMHgxRCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1NiwgMHgwMCwgMHhGQSwgMHgwMCwgMHhERCwKLQkweEZFLCAweDRFLCAweEZCLCAweDdDLCAweDAwLCAweDMyLCAweDEyLCAweENDLCAweDIwLCAweDVDLCAweDFCLAotCTB4NjksIDB4MDgsIDB4MjksIDB4RkMsIDB4QkMsIDB4RkMsIDB4NjksIDB4MDAsIDB4QzcsIDB4MDAsIDB4MDksCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3RCwgMHgwMCwgMHhFMywgMHgwMCwgMHgyMSwgMHhGRSwKLQkweDQzLCAweEZCLCAweEU5LCAweDAyLCAweEE5LCAweDE1LCAweDc5LCAweDIxLCAweDZCLCAweDE4LCAweDQ4LAotCTB4MDUsIDB4ODAsIDB4RkIsIDB4N0MsIDB4RkQsIDB4QjksIDB4MDAsIDB4QTAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhBNiwgMHgwMCwgMHhBRiwgMHgwMCwgMHg1RSwKLQkweEZELCAweDkzLCAweEZCLCAweEJFLCAweDA1LCAweEU1LCAweDE4LCAweDZCLCAweDIxLCAweDIzLCAweDE1LAotCTB4ODIsIDB4MDIsIDB4M0YsIDB4RkIsIDB4M0YsIDB4RkUsIDB4RTksIDB4MDAsIDB4NzcsIDB4MDAsIDB4RjgsCi0JMHhGRiwgMHhGRSwgMHhGRiwgMHgwQywgMHgwMCwgMHhDRCwgMHgwMCwgMHg1QSwgMHgwMCwgMHhBMCwgMHhGQywKLQkweDRELCAweEZDLCAweEVBLCAweDA4LCAweEM2LCAweDFCLCAweEExLCAweDIwLCAweEE2LCAweDExLCAweDI2LAotCTB4MDAsIDB4NTcsIDB4RkIsIDB4RjgsIDB4RkUsIDB4RkIsIDB4MDAsIDB4NTAsIDB4MDAsIDB4RjcsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHgyMSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMywgMHhGRiwgMHhGQSwgMHhGQiwgMHg3QywKLQkweEZELCAweDU0LCAweDBDLCAweDJCLCAweDFFLCAweDI2LCAweDFGLCAweDE3LCAweDBFLCAweDQxLCAweEZFLAotCTB4QjYsIDB4RkIsIDB4OUMsIDB4RkYsIDB4RjUsIDB4MDAsIDB4MkYsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsCi0JMHhGRiwgMHgzRiwgMHgwMCwgMHhGQiwgMHgwMCwgMHg0RCwgMHhGRiwgMHg3RiwgMHhGQiwgMHgyNCwgMHhGRiwKLQkweERGLCAweDBGLCAweEY5LCAweDFGLCAweDA5LCAweDFELCAweDk5LCAweDBBLCAweEQ1LCAweEZDLCAweDQ5LAotCTB4RkMsIDB4MjMsIDB4MDAsIDB4REQsIDB4MDAsIDB4MTYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsCi0JMHg2MywgMHgwMCwgMHhGNSwgMHgwMCwgMHg5RSwgMHhGRSwgMHg0MSwgMHhGQiwgMHg0NiwgMHgwMSwgMHg2OSwKLQkweDEzLCAweDFELCAweDIxLCAweDYzLCAweDFBLCAweDRCLCAweDA3LCAweEUyLCAweEZCLCAweEZELCAweEZDLAotCTB4ODksIDB4MDAsIDB4QkEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEIsCi0JMHgwMCwgMHhENSwgMHgwMCwgMHhERSwgMHhGRCwgMHg1MywgMHhGQiwgMHhEOSwgMHgwMywgMHhEMCwgMHgxNiwKLQkweDhBLCAweDIxLCAweDUxLCAweDE3LCAweDQ3LCAweDA0LCAweDVFLCAweEZCLCAweEMwLCAweEZELCAweENELAotCTB4MDAsIDB4OTIsIDB4MDAsIDB4RkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHhCNCwgMHgwMCwgMHg5NiwgMHgwMCwgMHgxQiwgMHhGRCwgMHhDNywgMHhGQiwgMHhDRiwgMHgwNiwgMHhGMCwKLQkweDE5LCAweDNBLCAweDIxLCAweEYyLCAweDEzLCAweEE0LCAweDAxLCAweDNFLCAweEZCLCAweDgxLCAweEZFLAotCTB4RjIsIDB4MDAsIDB4NjksIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RDksCi0JMHgwMCwgMHgzNSwgMHgwMCwgMHg2MywgMHhGQywgMHhBOCwgMHhGQywgMHgxMywgMHgwQSwgMHhBOSwgMHgxQywKLQkweDMyLCAweDIwLCAweDZCLCAweDEwLCAweDcxLCAweEZGLCAweDcxLCAweEZCLCAweDM0LCAweEZGLCAweEZCLAotCTB4MDAsIDB4NDQsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RjMsIDB4MDAsCi0JMHhCMywgMHhGRiwgMHhDQSwgMHhGQiwgMHgwMSwgMHhGRSwgMHg4QywgMHgwRCwgMHhERCwgMHgxRSwgMHg3QywKLQkweDFFLCAweERFLCAweDBDLCAweEI1LCAweEZELCAweEU0LCAweEZCLCAweENFLCAweEZGLCAweEVGLCAweDAwLAotCTB4MjUsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RkMsIDB4MDAsIDB4MTMsCi0JMHhGRiwgMHg2MSwgMHhGQiwgMHhENCwgMHhGRiwgMHgxQSwgMHgxMSwgMHg3MiwgMHgyMCwgMHgyRCwgMHgxQywKLQkweDZELCAweDA5LCAweDc0LCAweEZDLCAweDg1LCAweEZDLCAweDRBLCAweDAwLCAweEQyLCAweDAwLCAweDBGLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NzAsIDB4MDAsIDB4RUQsIDB4MDAsIDB4NUQsIDB4RkUsCi0JMHgzRCwgMHhGQiwgMHgxRSwgMHgwMiwgMHg5QywgMHgxNCwgMHg1OCwgMHgyMSwgMHg1RSwgMHgxOSwgMHgzNiwKLQkweDA2LCAweEE4LCAweEZCLCAweDQwLCAweEZELCAweEE0LCAweDAwLCAweEFELCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RkYsIDB4OUEsIDB4MDAsIDB4QzMsIDB4MDAsIDB4OUEsCi0JMHhGRCwgMHg2RiwgMHhGQiwgMHhENSwgMHgwNCwgMHhFRiwgMHgxNywgMHg4MywgMHgyMSwgMHgyRCwgMHgxNiwKLQkweDUyLCAweDAzLCAweDQ5LCAweEZCLCAweDA0LCAweEZFLCAweERELCAweDAwLCAweDgzLCAweDAwLCAweEY5LAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4QzIsIDB4MDAsIDB4NzgsIDB4MDAsIDB4RDksIDB4RkMsCi0JMHgwOCwgMHhGQywgMHhFOSwgMHgwNywgMHhFRiwgMHgxQSwgMHhGMywgMHgyMCwgMHhCQywgMHgxMiwgMHhENCwKLQkweDAwLCAweDQ3LCAweEZCLCAweEMxLCAweEZFLCAweEY4LCAweDAwLCAweDVCLCAweDAwLCAweEY3LCAweEZGLAotCTB4RkMsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RTMsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MkEsIDB4RkMsIDB4MTIsCi0JMHhGRCwgMHg0MiwgMHgwQiwgMHg3RCwgMHgxRCwgMHhBRCwgMHgxRiwgMHgyRiwgMHgwRiwgMHhDOSwgMHhGRSwKLQkweDkyLCAweEZCLCAweDZDLCAweEZGLCAweEY5LCAweDAwLCAweDM4LCAweDAwLCAweEY4LCAweEZGLCAweEY5LAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RjgsIDB4MDAsIDB4N0UsIDB4RkYsIDB4OUYsIDB4RkIsIDB4OTUsIDB4RkUsCi0JMHhDNiwgMHgwRSwgMHg3QywgMHgxRiwgMHhDMCwgMHgxRCwgMHhBOSwgMHgwQiwgMHgzOCwgMHhGRCwgMHgxOCwKLQkweEZDLCAweEZELCAweEZGLCAweEU2LCAweDAwLCAweDFELCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLAotCTB4NTcsIDB4MDAsIDB4RkEsIDB4MDAsIDB4RDYsIDB4RkUsIDB4NEMsIDB4RkIsIDB4OTIsIDB4MDAsIDB4NTQsCi0JMHgxMiwgMHhENiwgMHgyMCwgMHg0MSwgMHgxQiwgMHg0OSwgMHgwOCwgMHgyMCwgMHhGQywgMHhDMywgMHhGQywKLQkweDZELCAweDAwLCAweEM2LCAweDAwLCAweDA5LCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdFLAotCTB4MDAsIDB4RTIsIDB4MDAsIDB4MUEsIDB4RkUsIDB4NDQsIDB4RkIsIDB4MDMsIDB4MDMsIDB4Q0EsIDB4MTUsCi0JMHg3QywgMHgyMSwgMHg0QywgMHgxOCwgMHgyQiwgMHgwNSwgMHg3QiwgMHhGQiwgMHg4MywgMHhGRCwgMHhCQywKLQkweDAwLCAweDlFLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4QTgsIDB4MDAsIDB4QUQsIDB4MDAsIDB4NTYsIDB4RkQsIDB4OTgsIDB4RkIsIDB4REMsIDB4MDUsIDB4MDQsCi0JMHgxOSwgMHg2NiwgMHgyMSwgMHgwMiwgMHgxNSwgMHg2OSwgMHgwMiwgMHgzRSwgMHhGQiwgMHg0NywgMHhGRSwKLQkweEVBLCAweDAwLCAweDc1LCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBELCAweDAwLCAweENFLAotCTB4MDAsIDB4NTYsIDB4MDAsIDB4OTksIDB4RkMsIDB4NTYsIDB4RkMsIDB4MEIsIDB4MDksIDB4RTAsIDB4MUIsCi0JMHg5NiwgMHgyMCwgMHg4MywgMHgxMSwgMHgxMSwgMHgwMCwgMHg1OSwgMHhGQiwgMHhGRiwgMHhGRSwgMHhGQiwKLQkweDAwLCAweDRFLCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDIyLCAweDAwLCAweEVDLCAweDAwLAotCTB4REUsIDB4RkYsIDB4RjUsIDB4RkIsIDB4OEEsIDB4RkQsIDB4NzcsIDB4MEMsIDB4M0YsIDB4MUUsIDB4MTQsCi0JMHgxRiwgMHhGNSwgMHgwRCwgMHgzMSwgMHhGRSwgMHhCQiwgMHhGQiwgMHhBMiwgMHhGRiwgMHhGNSwgMHgwMCwKLQkweDJFLCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDQwLCAweDAwLCAweEZCLCAweDAwLCAweDQ3LAotCTB4RkYsIDB4N0IsIDB4RkIsIDB4MzcsIDB4RkYsIDB4MDIsIDB4MTAsIDB4MDcsIDB4MjAsIDB4RjIsIDB4MUMsCi0JMHg3OCwgMHgwQSwgMHhDQSwgMHhGQywgMHg1MCwgMHhGQywgMHgyNywgMHgwMCwgMHhEQywgMHgwMCwgMHgxNSwKLQkweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDY0LCAweDAwLCAweEY1LCAweDAwLCAweDk3LCAweEZFLAotCTB4NDAsIDB4RkIsIDB4NUQsIDB4MDEsIDB4OEIsIDB4MTMsIDB4MjUsIDB4MjEsIDB4NDcsIDB4MUEsIDB4MkMsCi0JMHgwNywgMHhEQiwgMHhGQiwgMHgwNSwgMHhGRCwgMHg4QywgMHgwMCwgMHhCOSwgMHgwMCwgMHgwNCwgMHgwMCwKLQkweEZGLCAweEZGLCAweEZBLCAweEZGLCAweDhELCAweDAwLCAweEQzLCAweDAwLCAweEQ2LCAweEZELCAweDU2LAotCTB4RkIsIDB4RjQsIDB4MDMsIDB4RjAsIDB4MTYsIDB4OEEsIDB4MjEsIDB4MzEsIDB4MTcsIDB4MkIsIDB4MDQsCi0JMHg1QiwgMHhGQiwgMHhDNywgMHhGRCwgMHhDRiwgMHgwMCwgMHg5MCwgMHgwMCwgMHhGQSwgMHhGRiwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDAzLCAweDAwLCAweEI2LCAweDAwLCAweDkyLCAweDAwLCAweDEzLCAweEZELAotCTB4Q0QsIDB4RkIsIDB4RUUsIDB4MDYsIDB4MEQsIDB4MUEsIDB4MzMsIDB4MjEsIDB4RDAsIDB4MTMsIDB4OEMsCi0JMHgwMSwgMHgzRSwgMHhGQiwgMHg4OCwgMHhGRSwgMHhGMywgMHgwMCwgMHg2NywgMHgwMCwgMHhGNywgMHhGRiwKLQkweDA2LCAweDAwLCAweDFELCAweDAwLCAweDAzLCAweEZGLCAweEZFLCAweDAwLCAweEExLCAweDAyLCAweEE2LAotCTB4RjgsIDB4NTYsIDB4MDIsIDB4QTUsIDB4MjgsIDB4QTUsIDB4MjgsIDB4NTYsIDB4MDIsIDB4QTYsIDB4RjgsCi0JMHhBMSwgMHgwMiwgMHhGRSwgMHgwMCwgMHgwMywgMHhGRiwgMHgxRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDIxLCAweDAwLCAweEE2LCAweEZGLCAweDNGLCAweEZGLCAweDBCLCAweDAzLCAweDQyLCAweEZFLAotCTB4M0UsIDB4RjgsIDB4N0YsIDB4MTUsIDB4QUMsIDB4MzAsIDB4N0YsIDB4MTUsIDB4M0UsIDB4RjgsIDB4NDIsCi0JMHhGRSwgMHgwQiwgMHgwMywgMHgzRiwgMHhGRiwgMHhBNiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZBLCAweEZGLCAweENFLCAweEZGLCAweDE0LCAweDAxLCAweDAwLCAweEZELCAweDM1LCAweDA2LCAweEQ1LAotCTB4RjQsIDB4REEsIDB4MTUsIDB4OTIsIDB4NDAsIDB4QUUsIDB4RkUsIDB4RjMsIDB4RkMsIDB4NjgsIDB4MDMsCi0JMHg4NiwgMHhGRCwgMHg1MSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFQywKLQkweEZGLCAweEY5LCAweEZGLCAweEM2LCAweDAwLCAweDU1LCAweEZELCAweDM1LCAweDA2LCAweDkwLCAweEYzLAotCTB4RTUsIDB4MUMsIDB4NkIsIDB4M0QsIDB4NzEsIDB4RkEsIDB4MzQsIDB4RkYsIDB4NDYsIDB4MDIsIDB4RkYsCi0JMHhGRCwgMHgyRCwgMHgwMSwgMHg5MCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhEQiwgMHhGRiwKLQkweDJELCAweDAwLCAweDYwLCAweDAwLCAweEUxLCAweEZELCAweENFLCAweDA1LCAweEVELCAweEYyLCAweEYzLAotCTB4MjMsIDB4MjAsIDB4MzksIDB4MjIsIDB4RjcsIDB4NDQsIDB4MDEsIDB4MUYsIDB4MDEsIDB4ODksIDB4RkUsCi0JMHhGQiwgMHgwMCwgMHg5QywgMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2OCwKLQkweDAwLCAweEU1LCAweEZGLCAweEEwLCAweEZFLCAweEZCLCAweDA0LCAweDBDLCAweEYzLCAweEM1LCAweDJBLAotCTB4RDgsIDB4MzMsIDB4QzksIDB4RjQsIDB4MEIsIDB4MDMsIDB4MDUsIDB4MDAsIDB4MUEsIDB4RkYsIDB4QzEsCi0JMHgwMCwgMHhBRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCNSwgMHhGRiwgMHhBNSwgMHgwMCwKLQkweDVDLCAweEZGLCAweDhDLCAweEZGLCAweEJGLCAweDAzLCAweDA2LCAweEY0LCAweDIyLCAweDMxLCAweEM4LAotCTB4MkQsIDB4NjMsIDB4RjMsIDB4NzYsIDB4MDQsIDB4MDgsIDB4RkYsIDB4QTcsIDB4RkYsIDB4ODQsIDB4MDAsCi0JMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwQywgMHgwMCwgMHhBNCwgMHhGRiwgMHhFMSwgMHgwMCwgMHhDQiwKLQkweEZFLCAweDlCLCAweDAwLCAweDIxLCAweDAyLCAweEVFLCAweEY1LCAweENELCAweDM2LCAweDI0LCAweDI3LAotCTB4RTEsIDB4RjIsIDB4N0EsIDB4MDUsIDB4MzMsIDB4RkUsIDB4MkEsIDB4MDAsIDB4NDcsIDB4MDAsIDB4RDMsCi0JMHhGRiwgMHgwNCwgMHgwMCwgMHgwRiwgMHgwMCwgMHg5NSwgMHhGRiwgMHgxNywgMHgwMSwgMHgzRCwgMHhGRSwKLQkweEJELCAweDAxLCAweDMwLCAweDAwLCAweENDLCAweEY4LCAweDkyLCAweDNCLCAweDJBLCAweDIwLCAweDJFLAotCTB4RjMsIDB4MTIsIDB4MDYsIDB4OEYsIDB4RkQsIDB4OUEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4RTUsIDB4RkYsCi0JMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4QywgMHhGRiwgMHg0MiwgMHgwMSwgMHhCQiwgMHhGRCwgMHhFNCwKLQkweDAyLCAweDAxLCAweEZFLCAweDlDLCAweEZDLCAweDQ1LCAweDNGLCAweDE2LCAweDE5LCAweDJELCAweEY0LAotCTB4NDEsIDB4MDYsIDB4MjEsIDB4RkQsIDB4RjMsIDB4MDAsIDB4RTAsIDB4RkYsIDB4RjQsIDB4RkYsIDB4MDEsCi0JMHgwMCwgMHgxMCwgMHgwMCwgMHg4QiwgMHhGRiwgMHg1RCwgMHgwMSwgMHg0RiwgMHhGRCwgMHhGQiwgMHgwMywKLQkweEIyLCAweEZCLCAweDUzLCAweDAxLCAweEMyLCAweDQxLCAweDI0LCAweDEyLCAweEJBLCAweEY1LCAweDBGLAotCTB4MDYsIDB4RTksIDB4RkMsIDB4MzMsIDB4MDEsIDB4QkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwRCwgMHgwMCwgMHg5MywgMHhGRiwgMHg2MywgMHgwMSwgMHgwNCwgMHhGRCwgMHhFRiwgMHgwNCwgMHg2MiwKLQkweEY5LCAweEQ3LCAweDA2LCAweEYyLCAweDQyLCAweDhELCAweDBCLCAweEIwLCAweEY3LCAweDg3LCAweDA1LAotCTB4RTYsIDB4RkMsIDB4NTgsIDB4MDEsIDB4QTAsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwNywgMHgwMCwgMHhBNSwgMHhGRiwgMHg1MiwgMHgwMSwgMHhFMiwgMHhGQywgMHhBRCwgMHgwNSwKLQkweDM1LCAweEY3LCAweDA4LCAweDBELCAweENCLCAweDQyLCAweDgxLCAweDA1LCAweEU4LCAweEY5LCAweEJCLAotCTB4MDQsIDB4MTIsIDB4RkQsIDB4NjQsIDB4MDEsIDB4OTAsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHhDMiwgMHhGRiwgMHgyNywgMHgwMSwgMHhGMSwgMHhGQywgMHgyMiwgMHgwNiwgMHg1NCwKLQkweEY1LCAweEI4LCAweDEzLCAweDRBLCAweDQxLCAweDI5LCAweDAwLCAweDNDLCAweEZDLCAweEJELCAweDAzLAotCTB4NjYsIDB4RkQsIDB4NTgsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjEsCi0JMHhGRiwgMHhFQiwgMHhGRiwgMHhFMSwgMHgwMCwgMHgzNSwgMHhGRCwgMHg0MCwgMHgwNiwgMHhFNCwgMHhGMywKLQkweEI3LCAweDFBLCAweDg1LCAweDNFLCAweEE2LCAweEZCLCAweDg2LCAweEZFLCAweEEwLCAweDAyLCAweEQ3LAotCTB4RkQsIDB4MzksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RTEsIDB4RkYsCi0JMHgxQywgMHgwMCwgMHg4MiwgMHgwMCwgMHhCMCwgMHhGRCwgMHhGOSwgMHgwNSwgMHgwQywgMHhGMywgMHhDQiwKLQkweDIxLCAweDhGLCAweDNBLCAweDBELCAweEY4LCAweEE5LCAweDAwLCAweDc5LCAweDAxLCAweDVELCAweEZFLAotCTB4MEIsIDB4MDEsIDB4OTgsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4NTUsCi0JMHgwMCwgMHgwRCwgMHgwMCwgMHg2MCwgMHhGRSwgMHg0OCwgMHgwNSwgMHhFQywgMHhGMiwgMHhCNiwgMHgyOCwKLQkweDkxLCAweDM1LCAweDY4LCAweEY1LCAweDg4LCAweDAyLCAweDVBLCAweDAwLCAweEVELCAweEZFLCAweEQ0LAotCTB4MDAsIDB4QTgsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkIsIDB4RkYsIDB4OTIsIDB4MDAsCi0JMHg4NywgMHhGRiwgMHgzRiwgMHhGRiwgMHgyQiwgMHgwNCwgMHhBMSwgMHhGMywgMHgzRCwgMHgyRiwgMHhCOCwKLQkweDJGLCAweEI4LCAweEYzLCAweDExLCAweDA0LCAweDUyLCAweEZGLCAweDdDLCAweEZGLCAweDk3LCAweDAwLAotCTB4QkEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QTksIDB4RkYsIDB4Q0YsIDB4MDAsIDB4RjgsCi0JMHhGRSwgMHg0NCwgMHgwMCwgMHhBQSwgMHgwMiwgMHgzRSwgMHhGNSwgMHgyNCwgMHgzNSwgMHgzQiwgMHgyOSwKLQkweEYyLCAweEYyLCAweDM1LCAweDA1LCAweDcwLCAweEZFLCAweDAzLCAweDAwLCAweDVBLCAweDAwLCAweENELAotCTB4RkYsIDB4MDUsIDB4MDAsIDB4MEUsIDB4MDAsIDB4OTksIDB4RkYsIDB4MDcsIDB4MDEsIDB4NjgsIDB4RkUsCi0JMHg2MywgMHgwMSwgMHhEMCwgMHgwMCwgMHhEMCwgMHhGNywgMHgzNSwgMHgzQSwgMHg1NSwgMHgyMiwgMHgwMiwKLQkweEYzLCAweEVGLCAweDA1LCAweEJDLCAweEZELCAweDdBLCAweDAwLCAweDIwLCAweDAwLCAweERGLCAweEZGLAotCTB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MzYsIDB4MDEsIDB4RTEsIDB4RkQsIDB4OEEsCi0JMHgwMiwgMHhCMiwgMHhGRSwgMHg1NiwgMHhGQiwgMHg0MCwgMHgzRSwgMHg0MiwgMHgxQiwgMHhDRSwgMHhGMywKLQkweDNFLCAweDA2LCAweDNELCAweEZELCAweERCLCAweDAwLCAweEVFLCAweEZGLCAweEYwLCAweEZGLCAweDAxLAotCTB4MDAsIDB4MTEsIDB4MDAsIDB4OEEsIDB4RkYsIDB4NTcsIDB4MDEsIDB4NkQsIDB4RkQsIDB4QTgsIDB4MDMsCi0JMHg2OSwgMHhGQywgMHhDOCwgMHhGRiwgMHgyMCwgMHg0MSwgMHg0MCwgMHgxNCwgMHgzMywgMHhGNSwgMHgyOCwKLQkweDA2LCAweEY1LCAweEZDLCAweDIyLCAweDAxLCAweEM1LCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4MEYsIDB4MDAsIDB4OEYsIDB4RkYsIDB4NjQsIDB4MDEsIDB4MTcsIDB4RkQsIDB4QTksIDB4MDQsIDB4MTYsCi0JMHhGQSwgMHgxMCwgMHgwNSwgMHhCOCwgMHg0MiwgMHg4NywgMHgwRCwgMHgwRCwgMHhGNywgMHhCOSwgMHgwNSwKLQkweEUyLCAweEZDLCAweDUwLCAweDAxLCAweEE3LCAweEZGLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MEEsIDB4MDAsIDB4OUUsIDB4RkYsIDB4NUEsIDB4MDEsIDB4RTgsIDB4RkMsIDB4N0EsIDB4MDUsCi0JMHhEQSwgMHhGNywgMHgxMCwgMHgwQiwgMHhGQiwgMHg0MiwgMHg0QiwgMHgwNywgMHgzNSwgMHhGOSwgMHgwMCwKLQkweDA1LCAweDAwLCAweEZELCAweDYzLCAweDAxLCAweDk0LCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLAotCTB4MDEsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MzcsIDB4MDEsIDB4RTcsIDB4RkMsIDB4MDcsIDB4MDYsIDB4REUsCi0JMHhGNSwgMHg5RiwgMHgxMSwgMHhFNCwgMHg0MSwgMHhCOCwgMHgwMSwgMHg4NCwgMHhGQiwgMHgwRiwgMHgwNCwKLQkweDQ4LCAweEZELCAweDVFLCAweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY1LAotCTB4RkYsIDB4REQsIDB4RkYsIDB4RjksIDB4MDAsIDB4MUIsIDB4RkQsIDB4NDEsIDB4MDYsIDB4NDcsIDB4RjQsCi0JMHg4QiwgMHgxOCwgMHg4MSwgMHgzRiwgMHhGMSwgMHhGQywgMHhENSwgMHhGRCwgMHhGQSwgMHgwMiwgMHhCMiwKLQkweEZELCAweDQ1LCAweDAxLCAweDhDLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU2LCAweEZGLAotCTB4MEMsIDB4MDAsIDB4QTIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4MUEsIDB4MDYsIDB4M0MsIDB4RjMsIDB4OUYsCi0JMHgxRiwgMHhFNiwgMHgzQiwgMHgwRSwgMHhGOSwgMHgwNywgMHgwMCwgMHhENCwgMHgwMSwgMHgzMywgMHhGRSwKLQkweDFCLCAweDAxLCAweDk0LCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ0LCAweEZGLCAweDQzLAotCTB4MDAsIDB4MzMsIDB4MDAsIDB4MjUsIDB4RkUsIDB4ODksIDB4MDUsIDB4RTAsIDB4RjIsIDB4OUMsIDB4MjYsCi0JMHgzMywgMHgzNywgMHgxRSwgMHhGNiwgMHhGRCwgMHgwMSwgMHhCMCwgMHgwMCwgMHhDMCwgMHhGRSwgMHhFNiwKLQkweDAwLCAweEEyLCAweEZGLCAweDBDLCAweDAwLCAweDA3LCAweDAwLCAweEMxLCAweEZGLCAweDdGLCAweDAwLAotCTB4QjIsIDB4RkYsIDB4RjYsIDB4RkUsIDB4OEUsIDB4MDQsIDB4NTEsIDB4RjMsIDB4NDksIDB4MkQsIDB4OTgsCi0JMHgzMSwgMHgyMywgMHhGNCwgMHhBMiwgMHgwMywgMHhBMCwgMHhGRiwgMHg1MSwgMHhGRiwgMHhBQSwgMHgwMCwKLQkweEI0LCAweEZGLCAweDA5LCAweDAwLCAweDBBLCAweDAwLCAweEFFLCAweEZGLCAweEJELCAweDAwLCAweDI1LAotCTB4RkYsIDB4RjEsIDB4RkYsIDB4MkIsIDB4MDMsIDB4QTUsIDB4RjQsIDB4NjgsIDB4MzMsIDB4NDgsIDB4MkIsCi0JMHgxNywgMHhGMywgMHhFNywgMHgwNCwgMHhCMSwgMHhGRSwgMHhEQiwgMHhGRiwgMHg2QywgMHgwMCwgMHhDNywKLQkweEZGLCAweDA2LCAweDAwLCAweDBELCAweDAwLCAweDlFLCAweEZGLCAweEY3LCAweDAwLCAweDk0LCAweEZFLAotCTB4MDksIDB4MDEsIDB4NkEsIDB4MDEsIDB4RUIsIDB4RjYsIDB4QzEsIDB4MzgsIDB4N0QsIDB4MjQsIDB4RTgsCi0JMHhGMiwgMHhDMSwgMHgwNSwgMHhFRSwgMHhGRCwgMHg1NywgMHgwMCwgMHgzMSwgMHgwMCwgMHhEQSwgMHhGRiwKLQkweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDkxLCAweEZGLCAweDI5LCAweDAxLCAweDA5LCAweEZFLCAweDJGLAotCTB4MDIsIDB4NUYsIDB4RkYsIDB4MjcsIDB4RkEsIDB4MjAsIDB4M0QsIDB4NzAsIDB4MUQsIDB4N0QsIDB4RjMsCi0JMHgzMSwgMHgwNiwgMHg1RSwgMHhGRCwgMHhCRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhFQiwgMHhGRiwgMHgwMiwKLQkweDAwLCAweDExLCAweDAwLCAweDhCLCAweEZGLCAweDRFLCAweDAxLCAweDhFLCAweEZELCAweDUyLCAweDAzLAotCTB4MjAsIDB4RkQsIDB4NTIsIDB4RkUsIDB4NjAsIDB4NDAsIDB4NjMsIDB4MTYsIDB4QjcsIDB4RjQsIDB4MzksCi0JMHgwNiwgMHgwNSwgMHhGRCwgMHgwRiwgMHgwMSwgMHhEMSwgMHhGRiwgMHhGOSwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDEwLCAweDAwLCAweDhELCAweEZGLCAweDYyLCAweDAxLCAweDJFLCAweEZELCAweDVFLCAweDA0LCAweENDLAotCTB4RkEsIDB4NUIsIDB4MDMsIDB4NUUsIDB4NDIsIDB4OEUsIDB4MEYsIDB4NzEsIDB4RjYsIDB4RTQsIDB4MDUsCi0JMHhFMiwgMHhGQywgMHg0NSwgMHgwMSwgMHhBRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDBCLCAweDAwLCAweDk5LCAweEZGLCAweDYwLCAweDAxLCAweEYyLCAweEZDLCAweDQwLCAweDA1LAotCTB4ODUsIDB4RjgsIDB4MjYsIDB4MDksIDB4MEMsIDB4NDMsIDB4MjYsIDB4MDksIDB4ODUsIDB4RjgsIDB4NDAsCi0JMHgwNSwgMHhGMiwgMHhGQywgMHg2MCwgMHgwMSwgMHg5OSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDA0LCAweDAwLCAweEFGLCAweEZGLCAweDQ1LCAweDAxLCAweEUyLCAweEZDLCAweEU0LCAweDA1LCAweDcxLAotCTB4RjYsIDB4OEUsIDB4MEYsIDB4NUUsIDB4NDIsIDB4NUIsIDB4MDMsIDB4Q0MsIDB4RkEsIDB4NUUsIDB4MDQsCi0JMHgyRSwgMHhGRCwgMHg2MiwgMHgwMSwgMHg4RCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwKLQkweEZGLCAweEQxLCAweEZGLCAweDBGLCAweDAxLCAweDA1LCAweEZELCAweDM5LCAweDA2LCAweEI3LCAweEY0LAotCTB4NjMsIDB4MTYsIDB4NjAsIDB4NDAsIDB4NTIsIDB4RkUsIDB4MjAsIDB4RkQsIDB4NTIsIDB4MDMsIDB4OEUsCi0JMHhGRCwgMHg0RSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFQiwgMHhGRiwKLQkweEZELCAweEZGLCAweEJGLCAweDAwLCAweDVFLCAweEZELCAweDMxLCAweDA2LCAweDdELCAweEYzLCAweDcwLAotCTB4MUQsIDB4MjAsIDB4M0QsIDB4MjcsIDB4RkEsIDB4NUYsIDB4RkYsIDB4MkYsIDB4MDIsIDB4MDksIDB4RkUsCi0JMHgyOSwgMHgwMSwgMHg5MSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhEQSwgMHhGRiwgMHgzMSwKLQkweDAwLCAweDU3LCAweDAwLCAweEVFLCAweEZELCAweEMxLCAweDA1LCAweEU4LCAweEYyLCAweDdELCAweDI0LAotCTB4QzEsIDB4MzgsIDB4RUIsIDB4RjYsIDB4NkEsIDB4MDEsIDB4MDksIDB4MDEsIDB4OTQsIDB4RkUsIDB4RjcsCi0JMHgwMCwgMHg5RSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDNywgMHhGRiwgMHg2QywgMHgwMCwKLQkweERCLCAweEZGLCAweEIxLCAweEZFLCAweEU3LCAweDA0LCAweDE3LCAweEYzLCAweDQ4LCAweDJCLCAweDY4LAotCTB4MzMsIDB4QTUsIDB4RjQsIDB4MkIsIDB4MDMsIDB4RjEsIDB4RkYsIDB4MjUsIDB4RkYsIDB4QkQsIDB4MDAsCi0JMHhBRSwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCNCwgMHhGRiwgMHhBQSwgMHgwMCwgMHg1MSwKLQkweEZGLCAweEEwLCAweEZGLCAweEEyLCAweDAzLCAweDIzLCAweEY0LCAweDk4LCAweDMxLCAweDQ5LCAweDJELAotCTB4NTEsIDB4RjMsIDB4OEUsIDB4MDQsIDB4RjYsIDB4RkUsIDB4QjIsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QzEsCi0JMHhGRiwgMHgwNywgMHgwMCwgMHgwQywgMHgwMCwgMHhBMiwgMHhGRiwgMHhFNiwgMHgwMCwgMHhDMCwgMHhGRSwKLQkweEIwLCAweDAwLCAweEZELCAweDAxLCAweDFFLCAweEY2LCAweDMzLCAweDM3LCAweDlDLCAweDI2LCAweEUwLAotCTB4RjIsIDB4ODksIDB4MDUsIDB4MjUsIDB4RkUsIDB4MzMsIDB4MDAsIDB4NDMsIDB4MDAsIDB4RDQsIDB4RkYsCi0JMHgwNCwgMHgwMCwgMHgwRiwgMHgwMCwgMHg5NCwgMHhGRiwgMHgxQiwgMHgwMSwgMHgzMywgMHhGRSwgMHhENCwKLQkweDAxLCAweDA3LCAweDAwLCAweDBFLCAweEY5LCAweEU2LCAweDNCLCAweDlGLCAweDFGLCAweDNDLCAweEYzLAotCTB4MUEsIDB4MDYsIDB4ODUsIDB4RkQsIDB4QTIsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MDIsCi0JMHgwMCwgMHgxMSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0NSwgMHgwMSwgMHhCMiwgMHhGRCwgMHhGQSwgMHgwMiwKLQkweEQ1LCAweEZELCAweEYxLCAweEZDLCAweDgxLCAweDNGLCAweDhCLCAweDE4LCAweDQ3LCAweEY0LCAweDQxLAotCTB4MDYsIDB4MUIsIDB4RkQsIDB4RjksIDB4MDAsIDB4REQsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDEsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHg4QiwgMHhGRiwgMHg1RSwgMHgwMSwgMHg0OCwgMHhGRCwgMHgwRiwgMHgwNCwgMHg4NCwKLQkweEZCLCAweEI4LCAweDAxLCAweEU0LCAweDQxLCAweDlGLCAweDExLCAweERFLCAweEY1LCAweDA3LCAweDA2LAotCTB4RTcsIDB4RkMsIDB4MzcsIDB4MDEsIDB4QjgsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsCi0JMHgwMCwgMHg5NCwgMHhGRiwgMHg2MywgMHgwMSwgMHgwMCwgMHhGRCwgMHgwMCwgMHgwNSwgMHgzNSwgMHhGOSwKLQkweDRCLCAweDA3LCAweEZCLCAweDQyLCAweDEwLCAweDBCLCAweERBLCAweEY3LCAweDdBLCAweDA1LCAweEU4LAotCTB4RkMsIDB4NUEsIDB4MDEsIDB4OUUsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwNywgMHgwMCwgMHhBNywgMHhGRiwgMHg1MCwgMHgwMSwgMHhFMiwgMHhGQywgMHhCOSwgMHgwNSwgMHgwRCwKLQkweEY3LCAweDg3LCAweDBELCAweEI4LCAweDQyLCAweDEwLCAweDA1LCAweDE2LCAweEZBLCAweEE5LCAweDA0LAotCTB4MTcsIDB4RkQsIDB4NjQsIDB4MDEsIDB4OEYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhDNSwgMHhGRiwgMHgyMiwgMHgwMSwgMHhGNSwgMHhGQywgMHgyOCwgMHgwNiwgMHgzMywgMHhGNSwKLQkweDQwLCAweDE0LCAweDIwLCAweDQxLCAweEM4LCAweEZGLCAweDY5LCAweEZDLCAweEE4LCAweDAzLCAweDZELAotCTB4RkQsIDB4NTcsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjAsIDB4RkYsCi0JMHhFRSwgMHhGRiwgMHhEQiwgMHgwMCwgMHgzRCwgMHhGRCwgMHgzRSwgMHgwNiwgMHhDRSwgMHhGMywgMHg0MiwKLQkweDFCLCAweDQwLCAweDNFLCAweDU2LCAweEZCLCAweEIyLCAweEZFLCAweDhBLCAweDAyLCAweEUxLCAweEZELAotCTB4MzYsIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REYsIDB4RkYsIDB4MjAsCi0JMHgwMCwgMHg3QSwgMHgwMCwgMHhCQywgMHhGRCwgMHhFRiwgMHgwNSwgMHgwMiwgMHhGMywgMHg1NSwgMHgyMiwKLQkweDM1LCAweDNBLCAweEQwLCAweEY3LCAweEQwLCAweDAwLCAweDYzLCAweDAxLCAweDY4LCAweEZFLCAweDA3LAotCTB4MDEsIDB4OTksIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4NUEsIDB4MDAsCi0JMHgwMywgMHgwMCwgMHg3MCwgMHhGRSwgMHgzNSwgMHgwNSwgMHhGMiwgMHhGMiwgMHgzQiwgMHgyOSwgMHgyNCwKLQkweDM1LCAweDNFLCAweEY1LCAweEFBLCAweDAyLCAweDQ0LCAweDAwLCAweEY4LCAweEZFLCAweENGLCAweDAwLAotCTB4QTksIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkEsIDB4RkYsIDB4OTcsIDB4MDAsIDB4N0MsCi0JMHhGRiwgMHg1MiwgMHhGRiwgMHgxMSwgMHgwNCwgMHhCOCwgMHhGMywgMHhCOCwgMHgyRiwgMHgzRCwgMHgyRiwKLQkweEExLCAweEYzLCAweDJCLCAweDA0LCAweDNGLCAweEZGLCAweDg3LCAweEZGLCAweDkyLCAweDAwLCAweEJCLAotCTB4RkYsIDB4MDgsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RDQsIDB4MDAsIDB4RUQsIDB4RkUsCi0JMHg1QSwgMHgwMCwgMHg4OCwgMHgwMiwgMHg2OCwgMHhGNSwgMHg5MSwgMHgzNSwgMHhCNiwgMHgyOCwgMHhFQywKLQkweEYyLCAweDQ4LCAweDA1LCAweDYwLCAweEZFLCAweDBELCAweDAwLCAweDU1LCAweDAwLCAweENFLCAweEZGLAotCTB4MDUsIDB4MDAsIDB4MEUsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NUQsIDB4RkUsIDB4NzksCi0JMHgwMSwgMHhBOSwgMHgwMCwgMHgwRCwgMHhGOCwgMHg4RiwgMHgzQSwgMHhDQiwgMHgyMSwgMHgwQywgMHhGMywKLQkweEY5LCAweDA1LCAweEIwLCAweEZELCAweDgyLCAweDAwLCAweDFDLCAweDAwLCAweEUxLCAweEZGLCAweDAzLAotCTB4MDAsIDB4MTAsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MzksIDB4MDEsIDB4RDcsIDB4RkQsIDB4QTAsIDB4MDIsCi0JMHg4NiwgMHhGRSwgMHhBNiwgMHhGQiwgMHg4NSwgMHgzRSwgMHhCNywgMHgxQSwgMHhFNCwgMHhGMywgMHg0MCwKLQkweDA2LCAweDM1LCAweEZELCAweEUxLCAweDAwLCAweEVCLCAweEZGLCAweEYxLCAweEZGLCAweDAxLCAweDAwLAotCTB4MTEsIDB4MDAsIDB4OEEsIDB4RkYsIDB4NTgsIDB4MDEsIDB4NjYsIDB4RkQsIDB4QkQsIDB4MDMsIDB4M0MsCi0JMHhGQywgMHgyOSwgMHgwMCwgMHg0QSwgMHg0MSwgMHhCOCwgMHgxMywgMHg1NCwgMHhGNSwgMHgyMiwgMHgwNiwKLQkweEYxLCAweEZDLCAweDI3LCAweDAxLCAweEMyLCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBFLAotCTB4MDAsIDB4OTAsIDB4RkYsIDB4NjQsIDB4MDEsIDB4MTIsIDB4RkQsIDB4QkIsIDB4MDQsIDB4RTgsIDB4RjksCi0JMHg4MSwgMHgwNSwgMHhDQiwgMHg0MiwgMHgwOCwgMHgwRCwgMHgzNSwgMHhGNywgMHhBRCwgMHgwNSwgMHhFMiwKLQkweEZDLCAweDUyLCAweDAxLCAweEE1LCAweEZGLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDksIDB4MDAsIDB4QTAsIDB4RkYsIDB4NTgsIDB4MDEsIDB4RTYsIDB4RkMsIDB4ODcsIDB4MDUsIDB4QjAsCi0JMHhGNywgMHg4RCwgMHgwQiwgMHhGMiwgMHg0MiwgMHhENywgMHgwNiwgMHg2MiwgMHhGOSwgMHhFRiwgMHgwNCwKLQkweDA0LCAweEZELCAweDYzLCAweDAxLCAweDkzLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4QkIsIDB4RkYsIDB4MzMsIDB4MDEsIDB4RTksIDB4RkMsIDB4MEYsIDB4MDYsIDB4QkEsIDB4RjUsCi0JMHgyNCwgMHgxMiwgMHhDMiwgMHg0MSwgMHg1MywgMHgwMSwgMHhCMiwgMHhGQiwgMHhGQiwgMHgwMywgMHg0RiwKLQkweEZELCAweDVELCAweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY0LCAweEZGLAotCTB4RTAsIDB4RkYsIDB4RjMsIDB4MDAsIDB4MjEsIDB4RkQsIDB4NDEsIDB4MDYsIDB4MkQsIDB4RjQsIDB4MTYsCi0JMHgxOSwgMHg0NSwgMHgzRiwgMHg5QywgMHhGQywgMHgwMSwgMHhGRSwgMHhFNCwgMHgwMiwgMHhCQiwgMHhGRCwKLQkweDQyLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweEU1LCAweEZGLCAweDEwLAotCTB4MDAsIDB4OUEsIDB4MDAsIDB4OEYsIDB4RkQsIDB4MTIsIDB4MDYsIDB4MkUsIDB4RjMsIDB4MkEsIDB4MjAsCi0JMHg5MiwgMHgzQiwgMHhDQywgMHhGOCwgMHgzMCwgMHgwMCwgMHhCRCwgMHgwMSwgMHgzRCwgMHhGRSwgMHgxNywKLQkweDAxLCAweDk1LCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQzLCAweEZGLCAweDQ3LCAweDAwLAotCTB4MkEsIDB4MDAsIDB4MzMsIDB4RkUsIDB4N0EsIDB4MDUsIDB4RTEsIDB4RjIsIDB4MjQsIDB4MjcsIDB4Q0QsCi0JMHgzNiwgMHhFRSwgMHhGNSwgMHgyMSwgMHgwMiwgMHg5QiwgMHgwMCwgMHhDQiwgMHhGRSwgMHhFMSwgMHgwMCwKLQkweEE0LCAweEZGLCAweDBDLCAweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLCAweDg0LCAweDAwLCAweEE3LAotCTB4RkYsIDB4MDgsIDB4RkYsIDB4NzYsIDB4MDQsIDB4NjMsIDB4RjMsIDB4QzgsIDB4MkQsIDB4MjIsIDB4MzEsCi0JMHgwNiwgMHhGNCwgMHhCRiwgMHgwMywgMHg4QywgMHhGRiwgMHg1QywgMHhGRiwgMHhBNSwgMHgwMCwgMHhCNSwKLQkweEZGLCAweDA5LCAweDAwLCAweDBBLCAweDAwLCAweEFELCAweEZGLCAweEMxLCAweDAwLCAweDFBLCAweEZGLAotCTB4MDUsIDB4MDAsIDB4MEIsIDB4MDMsIDB4QzksIDB4RjQsIDB4RDgsIDB4MzMsIDB4QzUsIDB4MkEsIDB4MEMsCi0JMHhGMywgMHhGQiwgMHgwNCwgMHhBMCwgMHhGRSwgMHhFNSwgMHhGRiwgMHg2OCwgMHgwMCwgMHhDOSwgMHhGRiwKLQkweDA2LCAweDAwLCAweDBELCAweDAwLCAweDlDLCAweEZGLCAweEZCLCAweDAwLCAweDg5LCAweEZFLCAweDFGLAotCTB4MDEsIDB4NDQsIDB4MDEsIDB4MjIsIDB4RjcsIDB4MjAsIDB4MzksIDB4RjMsIDB4MjMsIDB4RUQsIDB4RjIsCi0JMHhDRSwgMHgwNSwgMHhFMSwgMHhGRCwgMHg2MCwgMHgwMCwgMHgyRCwgMHgwMCwgMHhEQiwgMHhGRiwgMHgwMywKLQkweDAwLCAweDEwLCAweDAwLCAweDkwLCAweEZGLCAweDJELCAweDAxLCAweEZGLCAweEZELCAweDQ2LCAweDAyLAotCTB4MzQsIDB4RkYsIDB4NzEsIDB4RkEsIDB4NkIsIDB4M0QsIDB4RTUsIDB4MUMsIDB4OTAsIDB4RjMsIDB4MzUsCi0JMHgwNiwgMHg1NSwgMHhGRCwgMHhDNiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhFQywgMHhGRiwgMHgwMSwgMHgwMCwKLQkweDExLCAweDAwLCAweDhCLCAweEZGLCAweDUxLCAweDAxLCAweDg2LCAweEZELCAweDY4LCAweDAzLCAweEYzLAotCTB4RkMsIDB4QUUsIDB4RkUsIDB4OTIsIDB4NDAsIDB4REEsIDB4MTUsIDB4RDUsIDB4RjQsIDB4MzUsIDB4MDYsCi0JMHgwMCwgMHhGRCwgMHgxNCwgMHgwMSwgMHhDRSwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwKLQkweDAwLCAweDhELCAweEZGLCAweDYzLCAweDAxLCAweDI4LCAweEZELCAweDcxLCAweDA0LCAweDlFLCAweEZBLAotCTB4QzcsIDB4MDMsIDB4NzksIDB4NDIsIDB4MEIsIDB4MEYsIDB4OTcsIDB4RjYsIDB4REEsIDB4MDUsIDB4RTIsCi0JMHhGQywgMHg0OCwgMHgwMSwgMHhBRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBCLCAweDAwLCAweDlBLCAweEZGLCAweDVGLCAweDAxLCAweEVGLCAweEZDLCAweDRGLCAweDA1LCAweDVBLAotCTB4RjgsIDB4OUYsIDB4MDksIDB4MEEsIDB4NDMsIDB4QUUsIDB4MDgsIDB4QjEsIDB4RjgsIDB4MzAsIDB4MDUsCi0JMHhGNSwgMHhGQywgMHg2MSwgMHgwMSwgMHg5NywgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywKLQkweDAwLCAweEIxLCAweEZGLCAweDQxLCAweDAxLCAweEUzLCAweEZDLCAweEVELCAweDA1LCAweDRDLCAweEY2LAotCTB4MTEsIDB4MTAsIDB4NDIsIDB4NDIsIDB4RjEsIDB4MDIsIDB4RkEsIDB4RkEsIDB4NEIsIDB4MDQsIDB4MzQsCi0JMHhGRCwgMHg2MSwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGOCwgMHhGRiwKLQkweEQ0LCAweEZGLCAweDBBLCAweDAxLCAweDBBLCAweEZELCAweDNDLCAweDA2LCAweDlBLCAweEY0LCAweEVELAotCTB4MTYsIDB4MkEsIDB4NDAsIDB4RjgsIDB4RkQsIDB4NEQsIDB4RkQsIDB4M0MsIDB4MDMsIDB4OTcsIDB4RkQsCi0JMHg0QywgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwMCwKLQkweDAwLCAweEI4LCAweDAwLCAweDY3LCAweEZELCAweDJDLCAweDA2LCAweDZCLCAweEYzLCAweEZDLCAweDFELAotCTB4RDMsIDB4M0MsIDB4REYsIDB4RjksIDB4ODksIDB4RkYsIDB4MTgsIDB4MDIsIDB4MTMsIDB4RkUsIDB4MjYsCi0JMHgwMSwgMHg5MiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhEOSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDRFLCAweDAwLCAweEZCLCAweEZELCAweEI0LCAweDA1LCAweEU0LCAweEYyLCAweDA0LCAweDI1LCAweDVGLAotCTB4MzgsIDB4QjYsIDB4RjYsIDB4OTAsIDB4MDEsIDB4RjMsIDB4MDAsIDB4OUYsIDB4RkUsIDB4RjMsIDB4MDAsCi0JMHg5RiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDNiwgMHhGRiwgMHg3MSwgMHgwMCwgMHhEMSwKLQkweEZGLCAweEMyLCAweEZFLCAweEQxLCAweDA0LCAweDIzLCAweEYzLCAweEM5LCAweDJCLCAweEY1LCAweDMyLAotCTB4ODMsIDB4RjQsIDB4NDksIDB4MDMsIDB4REMsIDB4RkYsIDB4MzAsIDB4RkYsIDB4QjgsIDB4MDAsIDB4QjAsCi0JMHhGRiwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCMywgMHhGRiwgMHhBRSwgMHgwMCwgMHg0NiwgMHhGRiwKLQkweEI0LCAweEZGLCAweDg1LCAweDAzLCAweDQyLCAweEY0LCAweDBFLCAweDMyLCAweENBLCAweDJDLCAweDQxLAotCTB4RjMsIDB4QTUsIDB4MDQsIDB4RTQsIDB4RkUsIDB4QkMsIDB4RkYsIDB4N0EsIDB4MDAsIDB4QzMsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHgwRCwgMHgwMCwgMHhBMSwgMHhGRiwgMHhFQSwgMHgwMCwgMHhCNSwgMHhGRSwgMHhDNiwKLQkweDAwLCAweEQ5LCAweDAxLCAweDRGLCAweEY2LCAweDk5LCAweDM3LCAweDE2LCAweDI2LCAweEUwLCAweEYyLAotCTB4OTgsIDB4MDUsIDB4MTYsIDB4RkUsIDB4M0MsIDB4MDAsIDB4M0YsIDB4MDAsIDB4RDYsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHgwRiwgMHgwMCwgMHg5MywgMHhGRiwgMHgxRiwgMHgwMSwgMHgyOCwgMHhGRSwgMHhFQiwgMHgwMSwKLQkweERELCAweEZGLCAweDUyLCAweEY5LCAweDM2LCAweDNDLCAweDEzLCAweDFGLCAweDRCLCAweEYzLCAweDIwLAotCTB4MDYsIDB4N0IsIDB4RkQsIDB4QTksIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTcsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHgxMSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0NywgMHgwMSwgMHhBOSwgMHhGRCwgMHgxMCwgMHgwMywgMHhBOCwKLQkweEZELCAweDQ3LCAweEZELCAweEJCLCAweDNGLCAweDAxLCAweDE4LCAweDYyLCAweEY0LCAweDQwLCAweDA2LAotCTB4MTUsIDB4RkQsIDB4RkYsIDB4MDAsIDB4REEsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsCi0JMHgwMCwgMHg4QiwgMHhGRiwgMHg1RiwgMHgwMSwgMHg0MSwgMHhGRCwgMHgyMywgMHgwNCwgMHg1NiwgMHhGQiwKLQkweDFGLCAweDAyLCAweDA2LCAweDQyLCAweDE5LCAweDExLCAweDAyLCAweEY2LCAweEZGLCAweDA1LCAweEU1LAotCTB4RkMsIDB4M0IsIDB4MDEsIDB4QjYsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsCi0JMHg5NSwgMHhGRiwgMHg2MiwgMHgwMSwgMHhGQywgMHhGQywgMHgxMCwgMHgwNSwgMHgwOSwgMHhGOSwgMHhDMSwKLQkweDA3LCAweDAzLCAweDQzLCAweDk0LCAweDBBLCAweDA1LCAweEY4LCAweDZDLCAweDA1LCAweEVBLCAweEZDLAotCTB4NUMsIDB4MDEsIDB4OUQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsCi0JMHgwMCwgMHhBOSwgMHhGRiwgMHg0RCwgMHgwMSwgMHhFMSwgMHhGQywgMHhDNCwgMHgwNSwgMHhFNiwgMHhGNiwKLQkweDA4LCAweDBFLCAweEE1LCAweDQyLCAweEExLCAweDA0LCAweDQzLCAweEZBLCAweDk3LCAweDA0LCAweDFELAotCTB4RkQsIDB4NjQsIDB4MDEsIDB4OEYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RkYsCi0JMHhDOCwgMHhGRiwgMHgxRSwgMHgwMSwgMHhGOCwgMHhGQywgMHgyRCwgMHgwNiwgMHgxMywgMHhGNSwgMHhDOCwKLQkweDE0LCAweEYyLCAweDQwLCAweDY5LCAweEZGLCAweDk3LCAweEZDLCAweDkyLCAweDAzLCAweDc1LCAweEZELAotCTB4NTUsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjIsCi0JMHhGRiwgMHhENCwgMHgwMCwgMHg0NSwgMHhGRCwgMHgzQiwgMHgwNiwgMHhCOCwgMHhGMywgMHhDRSwgMHgxQiwKLQkweEZCLCAweDNELCAweDA4LCAweEZCLCAweERFLCAweEZFLCAweDczLCAweDAyLCAweEVCLCAweEZELCAweDMzLAotCTB4MDEsIDB4OEYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REUsIDB4RkYsIDB4MjUsIDB4MDAsCi0JMHg3MSwgMHgwMCwgMHhDOCwgMHhGRCwgMHhFNSwgMHgwNSwgMHhGQSwgMHhGMiwgMHhERiwgMHgyMiwgMHhEQiwKLQkweDM5LCAweDk0LCAweEY3LCAweEY3LCAweDAwLCAweDRDLCAweDAxLCAweDczLCAweEZFLCAweDAzLCAweDAxLAotCTB4OUEsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4Q0MsIDB4RkYsIDB4NUUsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHg4MCwgMHhGRSwgMHgyMywgMHgwNSwgMHhGOSwgMHhGMiwgMHhDMCwgMHgyOSwgMHhCOCwgMHgzNCwKLQkweDE2LCAweEY1LCAweENCLCAweDAyLCAweDJGLCAweDAwLCAweDAzLCAweEZGLCAweENBLCAweDAwLCAweEFBLAotCTB4RkYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QjgsIDB4RkYsIDB4OUIsIDB4MDAsIDB4NzIsIDB4RkYsCi0JMHg2NSwgMHhGRiwgMHhGNiwgMHgwMywgMHhEMSwgMHhGMywgMHgzMSwgMHgzMCwgMHhDMSwgMHgyRSwgMHg4QiwKLQkweEYzLCAweDQ1LCAweDA0LCAweDJELCAweEZGLCAweDkyLCAweEZGLCAweDhELCAweDAwLCAweEJELCAweEZGLAotCTB4MDgsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QTYsIDB4RkYsIDB4RDgsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NkYsCi0JMHgwMCwgMHg2NiwgMHgwMiwgMHg5MywgMHhGNSwgMHhGQiwgMHgzNSwgMHgzMSwgMHgyOCwgMHhFNywgMHhGMiwKLQkweDU5LCAweDA1LCAweDUxLCAweEZFLCAweDE3LCAweDAwLCAweDUwLCAweDAwLCAweEQwLCAweEZGLCAweDA1LAotCTB4MDAsIDB4MEUsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MEYsIDB4MDEsIDB4NTMsIDB4RkUsIDB4OTAsIDB4MDEsCi0JMHg4MSwgMHgwMCwgMHg0QiwgMHhGOCwgMHhFNiwgMHgzQSwgMHgzRiwgMHgyMSwgMHgxNiwgMHhGMywgMHgwMiwKLQkweDA2LCAweEE1LCAweEZELCAweDhBLCAweDAwLCAweDE4LCAweDAwLCAweEUyLCAweEZGLCAweDAyLCAweDAwLAotCTB4MTAsIDB4MDAsIDB4OEQsIDB4RkYsIDB4M0MsIDB4MDEsIDB4Q0UsIDB4RkQsIDB4QjcsIDB4MDIsIDB4NUEsCi0JMHhGRSwgMHhGNywgMHhGQiwgMHhDNiwgMHgzRSwgMHgyQywgMHgxQSwgMHhGQywgMHhGMywgMHg0MSwgMHgwNiwKLQkweDJFLCAweEZELCAweEU3LCAweDAwLCAweEU3LCAweEZGLCAweEYyLCAweEZGLCAweDAxLCAweDAwLCAweDEwLAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4NUEsIDB4MDEsIDB4NUUsIDB4RkQsIDB4RDIsIDB4MDMsIDB4MEUsIDB4RkMsCi0JMHg4QiwgMHgwMCwgMHg3NSwgMHg0MSwgMHgzMiwgMHgxMywgMHg3NSwgMHhGNSwgMHgxQywgMHgwNiwgMHhFRSwKLQkweEZDLCAweDJCLCAweDAxLCAweEMwLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLAotCTB4OTEsIDB4RkYsIDB4NjQsIDB4MDEsIDB4MEQsIDB4RkQsIDB4Q0QsIDB4MDQsIDB4QkIsIDB4RjksIDB4RjIsCi0JMHgwNSwgMHhEOSwgMHg0MiwgMHg4OCwgMHgwQywgMHg1RSwgMHhGNywgMHhBMSwgMHgwNSwgMHhFMywgMHhGQywKLQkweDU0LCAweDAxLCAweEEzLCAweEZGLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LAotCTB4MDAsIDB4QTIsIDB4RkYsIDB4NTYsIDB4MDEsIDB4RTUsIDB4RkMsIDB4OTQsIDB4MDUsIDB4ODcsIDB4RjcsCi0JMHgwQSwgMHgwQywgMHhFNiwgMHg0MiwgMHg2NCwgMHgwNiwgMHg4RSwgMHhGOSwgMHhERSwgMHgwNCwgMHgwOSwKLQkweEZELCAweDY0LCAweDAxLCAweDkyLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4QkQsIDB4RkYsIDB4MkYsIDB4MDEsIDB4RUMsIDB4RkMsIDB4MTYsIDB4MDYsIDB4OTgsIDB4RjUsIDB4QUIsCi0JMHgxMiwgMHg5QywgMHg0MSwgMHhFRSwgMHgwMCwgMHhFMCwgMHhGQiwgMHhFNiwgMHgwMywgMHg1NywgMHhGRCwKLQkweDVCLCAweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEYzLCAweEZGLCAweEU0LAotCTB4RkYsIDB4RUQsIDB4MDAsIDB4MjcsIDB4RkQsIDB4NDEsIDB4MDYsIDB4MTQsIDB4RjQsIDB4QTEsIDB4MTksCi0JMHgwNiwgMHgzRiwgMHg0OSwgMHhGQywgMHgyRSwgMHhGRSwgMHhDRCwgMHgwMiwgMHhDNCwgMHhGRCwgMHgzRiwKLQkweDAxLCAweDhELCAweEZGLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweEUzLCAweEZGLCAweDE0LCAweDAwLAotCTB4OTIsIDB4MDAsIDB4OUEsIDB4RkQsIDB4MEEsIDB4MDYsIDB4MjIsIDB4RjMsIDB4QjQsIDB4MjAsIDB4M0MsCi0JMHgzQiwgMHg4QiwgMHhGOCwgMHg1OCwgMHgwMCwgMHhBNywgMHgwMSwgMHg0OCwgMHhGRSwgMHgxMywgMHgwMSwKLQkweDk2LCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQxLCAweEZGLCAweDRDLCAweDAwLCAweDIwLAotCTB4MDAsIDB4NDIsIDB4RkUsIDB4NkEsIDB4MDUsIDB4RTMsIDB4RjIsIDB4QUIsIDB4MjcsIDB4NjYsIDB4MzYsCi0JMHhDMCwgMHhGNSwgMHg0NCwgMHgwMiwgMHg4NSwgMHgwMCwgMHhENywgMHhGRSwgMHhERCwgMHgwMCwgMHhBNSwKLQkweEZGLCAweDBDLCAweDAwLCAweDA3LCAweDAwLCAweEJFLCAweEZGLCAweDg5LCAweDAwLCAweDlELCAweEZGLAotCTB4MUEsIDB4RkYsIDB4NUUsIDB4MDQsIDB4NzYsIDB4RjMsIDB4NDUsIDB4MkUsIDB4QUEsIDB4MzAsIDB4RUIsCi0JMHhGMywgMHhEQiwgMHgwMywgMHg3OSwgMHhGRiwgMHg2NywgMHhGRiwgMHhBMCwgMHgwMCwgMHhCNywgMHhGRiwKLQkweDA5LCAweDAwLCAweDBCLCAweDAwLCAweEFDLCAweEZGLCAweEM2LCAweDAwLCAweDBFLCAweEZGLCAweDFBLAotCTB4MDAsIDB4RUIsIDB4MDIsIDB4RUYsIDB4RjQsIDB4NDksIDB4MzQsIDB4NDMsIDB4MkEsIDB4MDIsIDB4RjMsCi0JMHgwRiwgMHgwNSwgMHg5MCwgMHhGRSwgMHhFRiwgMHhGRiwgMHg2MywgMHgwMCwgMHhDQSwgMHhGRiwgMHgwNiwKLQkweDAwLCAweDBFLCAweDAwLCAweDlCLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweEZFLCAweDM2LCAweDAxLAotCTB4MUUsIDB4MDEsIDB4NUIsIDB4RjcsIDB4N0UsIDB4MzksIDB4NjksIDB4MjMsIDB4RjMsIDB4RjIsIDB4RDksCi0JMHgwNSwgMHhENCwgMHhGRCwgMHg2OSwgMHgwMCwgMHgyOSwgMHgwMCwgMHhERCwgMHhGRiwgMHgwMywgMHgwMCwKLQkweDEwLCAweDAwLCAweDkwLCAweEZGLCAweDMwLCAweDAxLCAweEY1LCAweEZELCAweDVDLCAweDAyLCAweDA5LAotCTB4RkYsIDB4QkMsIDB4RkEsIDB4QjUsIDB4M0QsIDB4NUEsIDB4MUMsIDB4QTMsIDB4RjMsIDB4MzgsIDB4MDYsCi0JMHg0RCwgMHhGRCwgMHhDRCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhFRCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMSwKLQkweDAwLCAweDhCLCAweEZGLCAweDUzLCAweDAxLCAweDdFLCAweEZELCAweDdELCAweDAzLCAweEM1LCAweEZDLAotCTB4MEIsIDB4RkYsIDB4QzMsIDB4NDAsIDB4NTEsIDB4MTUsIDB4RjQsIDB4RjQsIDB4MzEsIDB4MDYsIDB4RkMsCi0JMHhGQywgMHgxOSwgMHgwMSwgMHhDQiwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwKLQkweDhFLCAweEZGLCAweDYzLCAweDAxLCAweDIyLCAweEZELCAweDg0LCAweDA0LCAweDcxLCAweEZBLCAweDM0LAotCTB4MDQsIDB4OTAsIDB4NDIsIDB4ODksIDB4MEUsIDB4QkUsIDB4RjYsIDB4Q0YsIDB4MDUsIDB4RTEsIDB4RkMsCi0JMHg0QSwgMHgwMSwgMHhBQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwKLQkweDAwLCAweDlCLCAweEZGLCAweDVELCAweDAxLCAweEVDLCAweEZDLCAweDVELCAweDA1LCAweDJGLCAweEY4LAotCTB4MTksIDB4MEEsIDB4MDcsIDB4NDMsIDB4MzcsIDB4MDgsIDB4REQsIDB4RjgsIDB4MjEsIDB4MDUsIDB4RjgsCi0JMHhGQywgMHg2MiwgMHgwMSwgMHg5NiwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwKLQkweEI0LCAweEZGLCAweDNFLCAweDAxLCAweEU0LCAweEZDLCAweEY2LCAweDA1LCAweDI2LCAweEY2LCAweDk1LAotCTB4MTAsIDB4MjYsIDB4NDIsIDB4ODcsIDB4MDIsIDB4MjgsIDB4RkIsIDB4MzcsIDB4MDQsIDB4M0IsIDB4RkQsCi0JMHg2MCwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNywgMHhGRiwgMHhENywKLQkweEZGLCAweDA0LCAweDAxLCAweDBGLCAweEZELCAweDNFLCAweDA2LCAweDdELCAweEY0LCAweDc2LCAweDE3LAotCTB4RjQsIDB4M0YsIDB4OUYsIDB4RkQsIDB4N0IsIDB4RkQsIDB4MjYsIDB4MDMsIDB4QTAsIDB4RkQsIDB4NEEsCi0JMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNCwgMHgwMCwKLQkweEIxLCAweDAwLCAweDcxLCAweEZELCAweDI2LCAweDA2LCAweDVBLCAweEYzLCAweDg4LCAweDFFLCAweDg3LAotCTB4M0MsIDB4OTgsIDB4RjksIDB4QjMsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MUUsIDB4RkUsIDB4MjIsIDB4MDEsCi0JMHg5MywgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhENywgMHhGRiwgMHgzQSwgMHgwMCwgMHg0NSwKLQkweDAwLCAweDA5LCAweEZFLCAweEE3LCAweDA1LCAweEUxLCAweEYyLCAweDhELCAweDI1LCAweEZELCAweDM3LAotCTB4ODIsIDB4RjYsIDB4QjUsIDB4MDEsIDB4REMsIDB4MDAsIDB4QUEsIDB4RkUsIDB4RUUsIDB4MDAsIDB4QTAsCi0JMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDNCwgMHhGRiwgMHg3NiwgMHgwMCwgMHhDNywgMHhGRiwKLQkweEQzLCAweEZFLCAweEJDLCAweDA0LCAweDMxLCAweEYzLCAweDRBLCAweDJDLCAweDgzLCAweDMyLCAweDYxLAotCTB4RjQsIDB4NjgsIDB4MDMsIDB4QzgsIDB4RkYsIDB4M0IsIDB4RkYsIDB4QjMsIDB4MDAsIDB4QjEsIDB4RkYsCi0JMHgwQSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhCMSwgMHhGRiwgMHhCMywgMHgwMCwgMHgzQiwgMHhGRiwgMHhDOCwKLQkweEZGLCAweDY4LCAweDAzLCAweDYxLCAweEY0LCAweDgzLCAweDMyLCAweDRBLCAweDJDLCAweDMxLCAweEYzLAotCTB4QkMsIDB4MDQsIDB4RDMsIDB4RkUsIDB4QzcsIDB4RkYsIDB4NzYsIDB4MDAsIDB4QzQsIDB4RkYsIDB4MDYsCi0JMHgwMCwgMHgwRCwgMHgwMCwgMHhBMCwgMHhGRiwgMHhFRSwgMHgwMCwgMHhBQSwgMHhGRSwgMHhEQywgMHgwMCwKLQkweEI1LCAweDAxLCAweDgyLCAweEY2LCAweEZELCAweDM3LCAweDhELCAweDI1LCAweEUxLCAweEYyLCAweEE3LAotCTB4MDUsIDB4MDksIDB4RkUsIDB4NDUsIDB4MDAsIDB4M0EsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MDQsIDB4MDAsCi0JMHgwRiwgMHgwMCwgMHg5MywgMHhGRiwgMHgyMiwgMHgwMSwgMHgxRSwgMHhGRSwgMHgwMiwgMHgwMiwgMHhCMywKLQkweEZGLCAweDk4LCAweEY5LCAweDg3LCAweDNDLCAweDg4LCAweDFFLCAweDVBLCAweEYzLCAweDI2LCAweDA2LAotCTB4NzEsIDB4RkQsIDB4QjEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDIsIDB4MDAsIDB4MTEsCi0JMHgwMCwgMHg4QiwgMHhGRiwgMHg0QSwgMHgwMSwgMHhBMCwgMHhGRCwgMHgyNiwgMHgwMywgMHg3QiwgMHhGRCwKLQkweDlGLCAweEZELCAweEY0LCAweDNGLCAweDc2LCAweDE3LCAweDdELCAweEY0LCAweDNFLCAweDA2LCAweDBGLAotCTB4RkQsIDB4MDQsIDB4MDEsIDB4RDcsIDB4RkYsIDB4RjcsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsCi0JMHg4QywgMHhGRiwgMHg2MCwgMHgwMSwgMHgzQiwgMHhGRCwgMHgzNywgMHgwNCwgMHgyOCwgMHhGQiwgMHg4NywKLQkweDAyLCAweDI2LCAweDQyLCAweDk1LCAweDEwLCAweDI2LCAweEY2LCAweEY2LCAweDA1LCAweEU0LCAweEZDLAotCTB4M0UsIDB4MDEsIDB4QjQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4OTYsCi0JMHhGRiwgMHg2MiwgMHgwMSwgMHhGOCwgMHhGQywgMHgyMSwgMHgwNSwgMHhERCwgMHhGOCwgMHgzNywgMHgwOCwKLQkweDA3LCAweDQzLCAweDE5LCAweDBBLCAweDJGLCAweEY4LCAweDVELCAweDA1LCAweEVDLCAweEZDLCAweDVELAotCTB4MDEsIDB4OUIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsCi0JMHhBQiwgMHhGRiwgMHg0QSwgMHgwMSwgMHhFMSwgMHhGQywgMHhDRiwgMHgwNSwgMHhCRSwgMHhGNiwgMHg4OSwKLQkweDBFLCAweDkwLCAweDQyLCAweDM0LCAweDA0LCAweDcxLCAweEZBLCAweDg0LCAweDA0LCAweDIyLCAweEZELAotCTB4NjMsIDB4MDEsIDB4OEUsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RkYsIDB4Q0IsCi0JMHhGRiwgMHgxOSwgMHgwMSwgMHhGQywgMHhGQywgMHgzMSwgMHgwNiwgMHhGNCwgMHhGNCwgMHg1MSwgMHgxNSwKLQkweEMzLCAweDQwLCAweDBCLCAweEZGLCAweEM1LCAweEZDLCAweDdELCAweDAzLCAweDdFLCAweEZELCAweDUzLAotCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RkYsIDB4RjUsIDB4RkYsCi0JMHhDRCwgMHgwMCwgMHg0RCwgMHhGRCwgMHgzOCwgMHgwNiwgMHhBMywgMHhGMywgMHg1QSwgMHgxQywgMHhCNSwKLQkweDNELCAweEJDLCAweEZBLCAweDA5LCAweEZGLCAweDVDLCAweDAyLCAweEY1LCAweEZELCAweDMwLCAweDAxLAotCTB4OTAsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjksCi0JMHgwMCwgMHhENCwgMHhGRCwgMHhEOSwgMHgwNSwgMHhGMywgMHhGMiwgMHg2OSwgMHgyMywgMHg3RSwgMHgzOSwKLQkweDVCLCAweEY3LCAweDFFLCAweDAxLCAweDM2LCAweDAxLCAweDdFLCAweEZFLCAweEZGLCAweDAwLCAweDlCLAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4NjMsIDB4MDAsIDB4RUYsIDB4RkYsCi0JMHg5MCwgMHhGRSwgMHgwRiwgMHgwNSwgMHgwMiwgMHhGMywgMHg0MywgMHgyQSwgMHg0OSwgMHgzNCwgMHhFRiwKLQkweEY0LCAweEVCLCAweDAyLCAweDFBLCAweDAwLCAweDBFLCAweEZGLCAweEM2LCAweDAwLCAweEFDLCAweEZGLAotCTB4MEIsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjcsIDB4RkYsIDB4QTAsIDB4MDAsIDB4NjcsIDB4RkYsIDB4NzksCi0JMHhGRiwgMHhEQiwgMHgwMywgMHhFQiwgMHhGMywgMHhBQSwgMHgzMCwgMHg0NSwgMHgyRSwgMHg3NiwgMHhGMywKLQkweDVFLCAweDA0LCAweDFBLCAweEZGLCAweDlELCAweEZGLCAweDg5LCAweDAwLCAweEJFLCAweEZGLCAweDA3LAotCTB4MDAsIDB4MEMsIDB4MDAsIDB4QTUsIDB4RkYsIDB4REQsIDB4MDAsIDB4RDcsIDB4RkUsIDB4ODUsIDB4MDAsCi0JMHg0NCwgMHgwMiwgMHhDMCwgMHhGNSwgMHg2NiwgMHgzNiwgMHhBQiwgMHgyNywgMHhFMywgMHhGMiwgMHg2QSwKLQkweDA1LCAweDQyLCAweEZFLCAweDIwLCAweDAwLCAweDRDLCAweDAwLCAweEQxLCAweEZGLCAweDA0LCAweDAwLAotCTB4MEYsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MTMsIDB4MDEsIDB4NDgsIDB4RkUsIDB4QTcsIDB4MDEsIDB4NTgsCi0JMHgwMCwgMHg4QiwgMHhGOCwgMHgzQywgMHgzQiwgMHhCNCwgMHgyMCwgMHgyMiwgMHhGMywgMHgwQSwgMHgwNiwKLQkweDlBLCAweEZELCAweDkyLCAweDAwLCAweDE0LCAweDAwLCAweEUzLCAweEZGLCAweDAyLCAweDAwLCAweDEwLAotCTB4MDAsIDB4OEQsIDB4RkYsIDB4M0YsIDB4MDEsIDB4QzQsIDB4RkQsIDB4Q0QsIDB4MDIsIDB4MkUsIDB4RkUsCi0JMHg0OSwgMHhGQywgMHgwNiwgMHgzRiwgMHhBMSwgMHgxOSwgMHgxNCwgMHhGNCwgMHg0MSwgMHgwNiwgMHgyNywKLQkweEZELCAweEVELCAweDAwLCAweEU0LCAweEZGLCAweEYzLCAweEZGLCAweDAxLCAweDAwLCAweDEwLCAweDAwLAotCTB4OEIsIDB4RkYsIDB4NUIsIDB4MDEsIDB4NTcsIDB4RkQsIDB4RTYsIDB4MDMsIDB4RTAsIDB4RkIsIDB4RUUsCi0JMHgwMCwgMHg5QywgMHg0MSwgMHhBQiwgMHgxMiwgMHg5OCwgMHhGNSwgMHgxNiwgMHgwNiwgMHhFQywgMHhGQywKLQkweDJGLCAweDAxLCAweEJELCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDkyLAotCTB4RkYsIDB4NjQsIDB4MDEsIDB4MDksIDB4RkQsIDB4REUsIDB4MDQsIDB4OEUsIDB4RjksIDB4NjQsIDB4MDYsCi0JMHhFNiwgMHg0MiwgMHgwQSwgMHgwQywgMHg4NywgMHhGNywgMHg5NCwgMHgwNSwgMHhFNSwgMHhGQywgMHg1NiwKLQkweDAxLCAweEEyLCAweEZGLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLAotCTB4QTMsIDB4RkYsIDB4NTQsIDB4MDEsIDB4RTMsIDB4RkMsIDB4QTEsIDB4MDUsIDB4NUUsIDB4RjcsIDB4ODgsCi0JMHgwQywgMHhEOSwgMHg0MiwgMHhGMiwgMHgwNSwgMHhCQiwgMHhGOSwgMHhDRCwgMHgwNCwgMHgwRCwgMHhGRCwKLQkweDY0LCAweDAxLCAweDkxLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEMwLAotCTB4RkYsIDB4MkIsIDB4MDEsIDB4RUUsIDB4RkMsIDB4MUMsIDB4MDYsIDB4NzUsIDB4RjUsIDB4MzIsIDB4MTMsCi0JMHg3NSwgMHg0MSwgMHg4QiwgMHgwMCwgMHgwRSwgMHhGQywgMHhEMiwgMHgwMywgMHg1RSwgMHhGRCwgMHg1QSwKLQkweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEYyLCAweEZGLCAweEU3LCAweEZGLAotCTB4RTcsIDB4MDAsIDB4MkUsIDB4RkQsIDB4NDEsIDB4MDYsIDB4RkMsIDB4RjMsIDB4MkMsIDB4MUEsIDB4QzYsCi0JMHgzRSwgMHhGNywgMHhGQiwgMHg1QSwgMHhGRSwgMHhCNywgMHgwMiwgMHhDRSwgMHhGRCwgMHgzQywgMHgwMSwKLQkweDhELCAweEZGLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweEUyLCAweEZGLCAweDE4LCAweDAwLCAweDhBLAotCTB4MDAsIDB4QTUsIDB4RkQsIDB4MDIsIDB4MDYsIDB4MTYsIDB4RjMsIDB4M0YsIDB4MjEsIDB4RTYsIDB4M0EsCi0JMHg0QiwgMHhGOCwgMHg4MSwgMHgwMCwgMHg5MCwgMHgwMSwgMHg1MywgMHhGRSwgMHgwRiwgMHgwMSwgMHg5NywKLQkweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweEQwLCAweEZGLCAweDUwLCAweDAwLCAweDE3LCAweDAwLAotCTB4NTEsIDB4RkUsIDB4NTksIDB4MDUsIDB4RTcsIDB4RjIsIDB4MzEsIDB4MjgsIDB4RkIsIDB4MzUsIDB4OTMsCi0JMHhGNSwgMHg2NiwgMHgwMiwgMHg2RiwgMHgwMCwgMHhFMiwgMHhGRSwgMHhEOCwgMHgwMCwgMHhBNiwgMHhGRiwKLQkweDBDLCAweDAwLCAweDA4LCAweDAwLCAweEJELCAweEZGLCAweDhELCAweDAwLCAweDkyLCAweEZGLCAweDJELAotCTB4RkYsIDB4NDUsIDB4MDQsIDB4OEIsIDB4RjMsIDB4QzEsIDB4MkUsIDB4MzEsIDB4MzAsIDB4RDEsIDB4RjMsCi0JMHhGNiwgMHgwMywgMHg2NSwgMHhGRiwgMHg3MiwgMHhGRiwgMHg5QiwgMHgwMCwgMHhCOCwgMHhGRiwgMHgwOCwKLQkweDAwLCAweDBCLCAweDAwLCAweEFBLCAweEZGLCAweENBLCAweDAwLCAweDAzLCAweEZGLCAweDJGLCAweDAwLAotCTB4Q0IsIDB4MDIsIDB4MTYsIDB4RjUsIDB4QjgsIDB4MzQsIDB4QzAsIDB4MjksIDB4RjksIDB4RjIsIDB4MjMsCi0JMHgwNSwgMHg4MCwgMHhGRSwgMHhGOSwgMHhGRiwgMHg1RSwgMHgwMCwgMHhDQywgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDBFLCAweDAwLCAweDlBLCAweEZGLCAweDAzLCAweDAxLCAweDczLCAweEZFLCAweDRDLCAweDAxLCAweEY3LAotCTB4MDAsIDB4OTQsIDB4RjcsIDB4REIsIDB4MzksIDB4REYsIDB4MjIsIDB4RkEsIDB4RjIsIDB4RTUsIDB4MDUsCi0JMHhDOCwgMHhGRCwgMHg3MSwgMHgwMCwgMHgyNSwgMHgwMCwgMHhERSwgMHhGRiwgMHgwMywgMHgwMCwgMHgxMCwKLQkweDAwLCAweDhGLCAweEZGLCAweDMzLCAweDAxLCAweEVCLCAweEZELCAweDczLCAweDAyLCAweERFLCAweEZFLAotCTB4MDgsIDB4RkIsIDB4RkIsIDB4M0QsIDB4Q0UsIDB4MUIsIDB4QjgsIDB4RjMsIDB4M0IsIDB4MDYsIDB4NDUsCi0JMHhGRCwgMHhENCwgMHgwMCwgMHhGMiwgMHhGRiwgMHhFRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMSwgMHgwMCwKLQkweDhBLCAweEZGLCAweDU1LCAweDAxLCAweDc1LCAweEZELCAweDkyLCAweDAzLCAweDk3LCAweEZDLCAweDY5LAotCTB4RkYsIDB4RjIsIDB4NDAsIDB4QzgsIDB4MTQsIDB4MTMsIDB4RjUsIDB4MkQsIDB4MDYsIDB4RjgsIDB4RkMsCi0JMHgxRSwgMHgwMSwgMHhDOCwgMHhGRiwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHg4RiwKLQkweEZGLCAweDY0LCAweDAxLCAweDFELCAweEZELCAweDk3LCAweDA0LCAweDQzLCAweEZBLCAweEExLCAweDA0LAotCTB4QTUsIDB4NDIsIDB4MDgsIDB4MEUsIDB4RTYsIDB4RjYsIDB4QzQsIDB4MDUsIDB4RTEsIDB4RkMsIDB4NEQsCi0JMHgwMSwgMHhBOSwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwKLQkweDlELCAweEZGLCAweDVDLCAweDAxLCAweEVBLCAweEZDLCAweDZDLCAweDA1LCAweDA1LCAweEY4LCAweDk0LAotCTB4MEEsIDB4MDMsIDB4NDMsIDB4QzEsIDB4MDcsIDB4MDksIDB4RjksIDB4MTAsIDB4MDUsIDB4RkMsIDB4RkMsCi0JMHg2MiwgMHgwMSwgMHg5NSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhCNiwKLQkweEZGLCAweDNCLCAweDAxLCAweEU1LCAweEZDLCAweEZGLCAweDA1LCAweDAyLCAweEY2LCAweDE5LCAweDExLAotCTB4MDYsIDB4NDIsIDB4MUYsIDB4MDIsIDB4NTYsIDB4RkIsIDB4MjMsIDB4MDQsIDB4NDEsIDB4RkQsIDB4NUYsCi0JMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNiwgMHhGRiwgMHhEQSwgMHhGRiwKLQkweEZGLCAweDAwLCAweDE1LCAweEZELCAweDQwLCAweDA2LCAweDYyLCAweEY0LCAweDAxLCAweDE4LCAweEJCLAotCTB4M0YsIDB4NDcsIDB4RkQsIDB4QTgsIDB4RkQsIDB4MTAsIDB4MDMsIDB4QTksIDB4RkQsIDB4NDcsIDB4MDEsCi0JMHg4QywgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFNywgMHhGRiwgMHgwOCwgMHgwMCwgMHhBOSwKLQkweDAwLCAweDdCLCAweEZELCAweDIwLCAweDA2LCAweDRCLCAweEYzLCAweDEzLCAweDFGLCAweDM2LCAweDNDLAotCTB4NTIsIDB4RjksIDB4REQsIDB4RkYsIDB4RUIsIDB4MDEsIDB4MjgsIDB4RkUsIDB4MUYsIDB4MDEsIDB4OTMsCi0JMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhENiwgMHhGRiwgMHgzRiwgMHgwMCwgMHgzQywgMHgwMCwKLQkweDE2LCAweEZFLCAweDk4LCAweDA1LCAweEUwLCAweEYyLCAweDE2LCAweDI2LCAweDk5LCAweDM3LCAweDRGLAotCTB4RjYsIDB4RDksIDB4MDEsIDB4QzYsIDB4MDAsIDB4QjUsIDB4RkUsIDB4RUEsIDB4MDAsIDB4QTEsIDB4RkYsCi0JMHgwRCwgMHgwMCwgMHgwNywgMHgwMCwgMHhDMywgMHhGRiwgMHg3QSwgMHgwMCwgMHhCQywgMHhGRiwgMHhFNCwKLQkweEZFLCAweEE1LCAweDA0LCAweDQxLCAweEYzLCAweENBLCAweDJDLCAweDBFLCAweDMyLCAweDQyLCAweEY0LAotCTB4ODUsIDB4MDMsIDB4QjQsIDB4RkYsIDB4NDYsIDB4RkYsIDB4QUUsIDB4MDAsIDB4QjMsIDB4RkYsIDB4MDksCi0JMHgwMCwgMHgwQSwgMHgwMCwgMHhCMCwgMHhGRiwgMHhCOCwgMHgwMCwgMHgzMCwgMHhGRiwgMHhEQywgMHhGRiwKLQkweDQ5LCAweDAzLCAweDgzLCAweEY0LCAweEY1LCAweDMyLCAweEM5LCAweDJCLCAweDIzLCAweEYzLCAweEQxLAotCTB4MDQsIDB4QzIsIDB4RkUsIDB4RDEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHgwRCwgMHgwMCwgMHg5RiwgMHhGRiwgMHhGMywgMHgwMCwgMHg5RiwgMHhGRSwgMHhGMywgMHgwMCwgMHg5MCwKLQkweDAxLCAweEI2LCAweEY2LCAweDVGLCAweDM4LCAweDA0LCAweDI1LCAweEU0LCAweEYyLCAweEI0LCAweDA1LAotCTB4RkIsIDB4RkQsIDB4NEUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDQsIDB4MDAsIDB4MEYsCi0JMHgwMCwgMHg5MiwgMHhGRiwgMHgyNiwgMHgwMSwgMHgxMywgMHhGRSwgMHgxOCwgMHgwMiwgMHg4OSwgMHhGRiwKLQkweERGLCAweEY5LCAweEQzLCAweDNDLCAweEZDLCAweDFELCAweDZCLCAweEYzLCAweDJDLCAweDA2LCAweDY3LAotCTB4RkQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHg4QiwgMHhGRiwgMHg0QywgMHgwMSwgMHg5NywgMHhGRCwgMHgzQywgMHgwMywgMHg0RCwgMHhGRCwgMHhGOCwKLQkweEZELCAweDJBLCAweDQwLCAweEVELCAweDE2LCAweDlBLCAweEY0LCAweDNDLCAweDA2LCAweDBBLCAweEZELAotCTB4MEEsIDB4MDEsIDB4RDQsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OEMsCi0JMHhGRiwgMHg2MSwgMHgwMSwgMHgzNCwgMHhGRCwgMHg0QiwgMHgwNCwgMHhGQSwgMHhGQSwgMHhGMSwgMHgwMiwKLQkweDQyLCAweDQyLCAweDExLCAweDEwLCAweDRDLCAweEY2LCAweEVELCAweDA1LCAweEUzLCAweEZDLCAweDQxLAotCTB4MDEsIDB4QjEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4OTcsIDB4RkYsCi0JMHg2MSwgMHgwMSwgMHhGNSwgMHhGQywgMHgzMCwgMHgwNSwgMHhCMSwgMHhGOCwgMHhBRSwgMHgwOCwgMHgwQSwKLQkweDQzLCAweDlGLCAweDA5LCAweDVBLCAweEY4LCAweDRGLCAweDA1LCAweEVGLCAweEZDLCAweDVGLCAweDAxLAotCTB4OUEsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4QUQsCi0JMHhGRiwgMHg0OCwgMHgwMSwgMHhFMiwgMHhGQywgMHhEQSwgMHgwNSwgMHg5NywgMHhGNiwgMHgwQiwgMHgwRiwKLQkweDc5LCAweDQyLCAweEM3LCAweDAzLCAweDlFLCAweEZBLCAweDcxLCAweDA0LCAweDI4LCAweEZELCAweDYzLAotCTB4MDEsIDB4OEQsIDB4RkYsIDB4MEYsIDB4MDAgCi19OwotCi1zdGF0aWMgdTE2Ci1Db2VmZmljaWVudFNpemVzW10gPSB7Ci0gICAgLyogUGxheWJhY2sgKi8KLSAgICAweDAwQzAsIDB4NTAwMCwgMHgwMDYwLCAweDI4MDAsIDB4MDA0MCwgMHgwMDYwLCAweDE0MDAsIDB4MDAwMCwKLSAgICAvKiBSZWNvcmQgKi8KLSAgICAweDAwMjAsIDB4MTI2MCwgMHgwMDIwLCAweDEyNjAsIDB4MDAwMCwgMHgwMDQwLCAweDEyNjAsIDB4MDAwMCwKLX07Ci0KLSNpZm5kZWYgSlVTVF9EQVRBCi0KLXN0YXRpYyB1MTYKLW5tMjU2X2dldFN0YXJ0T2Zmc2V0ICh1OCB3aGljaCkKLXsKLSAgICB1MTYgb2Zmc2V0ID0gMDsKLQotICAgIHdoaWxlICh3aGljaC0tID4gMCkKLQlvZmZzZXQgKz0gQ29lZmZpY2llbnRTaXplc1t3aGljaF07Ci0KLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZAotbm0yNTZfbG9hZE9uZUNvZWZmaWNpZW50IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgaW50IGRldm51bSwgdTMyIHBvcnQsIAotCQkJICB1MTYgd2hpY2gpCi17Ci0gICAgdTMyIGNvZWZmQnVmID0gKHdoaWNoIDwgOCkgPyBjYXJkLT5jb2VmZkJ1ZiA6IGNhcmQtPmFsbENvZWZmQnVmOwotICAgIHUxNiBvZmZzZXQgPSBubTI1Nl9nZXRTdGFydE9mZnNldCAod2hpY2gpOwotICAgIHUxNiBzaXplID0gQ29lZmZpY2llbnRTaXplc1t3aGljaF07Ci0KLSAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMDsKLQotICAgIGlmIChubTI1Nl9kZWJ1ZykKLQlwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IExvYWRpbmcgY29lZmZpY2llbnQgYnVmZmVyIDB4JXgtMHgleCB3aXRoIGNvZWZmaWNpZW50ICVkLCBzaXplICVkLCBwb3J0IDB4JXhcbiIsCi0JCWNvZWZmQnVmLCBjb2VmZkJ1ZiArIHNpemUgLSAxLCB3aGljaCwgc2l6ZSwgcG9ydCk7Ci0gICAgbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBjb2VmZmljaWVudHMgKyBvZmZzZXQsIDEsIGNvZWZmQnVmLCBzaXplKTsKLSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgcG9ydCArIDAsIGNvZWZmQnVmKTsKLSAgICAvKiA/Pz8gIFJlY29yZCBzZWVtcyB0byBiZWhhdmUgZGlmZmVyZW50bHkgdGhhbiBwbGF5YmFjay4gICovCi0gICAgaWYgKGRldm51bSA9PSAwKQotCXNpemUtLTsKLSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgcG9ydCArIDQsIGNvZWZmQnVmICsgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ubTI1Nl9sb2FkQWxsQ29lZmZpY2llbnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGNvZWZmaWNpZW50cywgMSwgY2FyZC0+YWxsQ29lZmZCdWYsCi0JCQkgIE5NX1RPVEFMX0NPRUZGX0NPVU5UICogNCk7Ci0gICAgY2FyZC0+Y29lZmZzQ3VycmVudCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ubTI1Nl9sb2FkQ29lZmZpY2llbnQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBpbnQgd2hpY2gsIGludCBudW1iZXIpCi17Ci0gICAgc3RhdGljIHUxNiBhZGRyc1szXSA9IHsgMHgxYywgMHgyMWMsIDB4NDA4IH07Ci0gICAgLyogVGhlIGVuYWJsZSByZWdpc3RlciBmb3IgdGhlIHNwZWNpZmllZCBlbmdpbmUuICAqLwotICAgIHUzMiBwb2Zmc2V0ID0gKHdoaWNoID09IDEgPyAweDIwMCA6IDEpOwotCi0gICAgaWYgKG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgcG9mZnNldCkgJiAxKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEVuZ2luZSB3YXMgZW5hYmxlZCB3aGlsZSBsb2FkaW5nIGNvZWZmaWNpZW50cyFcbiIpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBUaGUgcmVjb3JkaW5nIGVuZ2luZSB1c2VzIGNvZWZmaWNpZW50IHZhbHVlcyA4LTE1LiAgKi8KLSAgICBpZiAod2hpY2ggPT0gMSkKLQludW1iZXIgKz0gODsKLQotICAgIGlmICghIG5tMjU2X2NhY2hlZENvZWZmaWNpZW50cyAoY2FyZCkpCi0Jbm0yNTZfbG9hZE9uZUNvZWZmaWNpZW50IChjYXJkLCB3aGljaCwgYWRkcnNbd2hpY2hdLCBudW1iZXIpOwotICAgIGVsc2UgewotCXUzMiBiYXNlID0gY2FyZC0+YWxsQ29lZmZCdWY7Ci0JdTMyIG9mZnNldCA9IG5tMjU2X2dldFN0YXJ0T2Zmc2V0IChudW1iZXIpOwotCXUzMiBlbmRPZmZzZXQgPSBvZmZzZXQgKyBDb2VmZmljaWVudFNpemVzW251bWJlcl07Ci0KLQlpZiAobm0yNTZfZGVidWcpCi0JICAgIHByaW50ayAoS0VSTl9ERUJVRyAibG9hZGluZyBjb2VmZmljaWVudCAlZCBhdCBwb3J0IDB4JXgsIG9mZnNldCAlZCAoMHgleC0weCV4KVxuIiwKLQkJICAgIG51bWJlciwgYWRkcnNbd2hpY2hdLCBvZmZzZXQsIGJhc2UgKyBvZmZzZXQsCi0JCSAgICBiYXNlICsgZW5kT2Zmc2V0IC0gMSk7Ci0KLQlpZiAoISBjYXJkLT5jb2VmZnNDdXJyZW50KQotCSAgICBubTI1Nl9sb2FkQWxsQ29lZmZpY2llbnRzIChjYXJkKTsKLQotCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBhZGRyc1t3aGljaF0sIGJhc2UgKyBvZmZzZXQpOwotCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBhZGRyc1t3aGljaF0gKyA0LCBiYXNlICsgZW5kT2Zmc2V0IC0gMSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogSlVTVF9EQVRBICovCi0KLSNlbmRpZgotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjLWJhc2ljLW9mZnNldDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3BsMy5jIGIvc291bmQvb3NzL29wbDMuYwppbmRleCBmYzI3M2U1Li43NzgxYzEzIDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvb3BsMy5jCisrKyBiL3NvdW5kL29zcy9vcGwzLmMKQEAgLTM0LDcgKzM0LDYgQEAKIAogI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgogCi0jaW5jbHVkZSAib3BsMy5oIgogI2luY2x1ZGUgIm9wbDNfaHcuaCIKIAogI2RlZmluZSBNQVhfVk9JQ0UJMTgKQEAgLTczLDcgKzcyLDYgQEAKIAl1bnNpZ25lZCBjaGFyICAgY21hc2s7CiAKIAlpbnQgICAgICAgICAgICAgaXNfb3BsNDsKLQlpbnQgICAgICAgICAgICAqb3NwOwogfSBvcGxfZGV2aW5mbzsKIAogc3RhdGljIHN0cnVjdCBvcGxfZGV2aW5mbyAqZGV2YyA9IE5VTEw7CkBAIC0xNDQsNyArMTQyLDcgQEAKIAl9CiB9CiAKLWludCBvcGwzX2RldGVjdChpbnQgaW9hZGRyLCBpbnQgKm9zcCkKK3N0YXRpYyBpbnQgb3BsM19kZXRlY3QoaW50IGlvYWRkcikKIHsKIAkvKgogCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZSBGTSBjaGlwIGlzIHByZXNlbnQgYXQgdGhlIGdpdmVuIEkvTyBwb3J0CkBAIC0xODIsNyArMTgwLDYgQEAKIAkJZ290byBjbGVhbnVwX2RldmM7CiAJfQogCi0JZGV2Yy0+b3NwID0gb3NwOwogCWRldmMtPmJhc2UgPSBpb2FkZHI7CiAKIAkvKiBSZXNldCB0aW1lcnMgMSBhbmQgMiAqLwpAQCAtMTEwNSw3ICsxMTAyLDcgQEAKIAkuc2V0dXBfdm9pY2UJPSBvcGwzX3NldHVwX3ZvaWNlCiB9OwogCi1pbnQgb3BsM19pbml0KGludCBpb2FkZHIsIGludCAqb3NwLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3N0YXRpYyBpbnQgb3BsM19pbml0KGludCBpb2FkZHIsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQogewogCWludCBpOwogCWludCBtZTsKQEAgLTExOTQsOSArMTE5MSw2IEBACiAJcmV0dXJuIG1lOwogfQogCi1FWFBPUlRfU1lNQk9MKG9wbDNfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKG9wbDNfZGV0ZWN0KTsKLQogc3RhdGljIGludCBtZTsKIAogc3RhdGljIGludCBpbyA9IC0xOwpAQCAtMTIwOSwxMiArMTIwMywxMiBAQAogCiAJaWYgKGlvICE9IC0xKQkvKiBVc2VyIGxvYWRpbmcgcHVyZSBPUEwzIG1vZHVsZSAqLwogCXsKLQkJaWYgKCFvcGwzX2RldGVjdChpbywgTlVMTCkpCisJCWlmICghb3BsM19kZXRlY3QoaW8pKQogCQl7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCi0JCW1lID0gb3BsM19pbml0KGlvLCBOVUxMLCBUSElTX01PRFVMRSk7CisJCW1lID0gb3BsM19pbml0KGlvLCBUSElTX01PRFVMRSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3BsMy5oIGIvc291bmQvb3NzL29wbDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjOWE0Yi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3Mvb3BsMy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0KLWludCBvcGwzX2RldGVjdCAoaW50IGlvYWRkciwgaW50ICpvc3ApOwotaW50IG9wbDNfaW5pdChpbnQgaW9hZGRyLCBpbnQgKm9zcCwgc3RydWN0IG1vZHVsZSAqb3duZXIpOwotCi12b2lkIGVuYWJsZV9vcGwzX21vZGUoaW50IGxlZnQsIGludCByaWdodCwgaW50IGJvdGgpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDNzYTIuYyBiL3NvdW5kL29zcy9vcGwzc2EyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDA1MWYuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL29wbDNzYTIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjAgKzAsMCBAQAotLyoKLSAqIHNvdW5kL29zcy9vcGwzc2EyLmMKLSAqCi0gKiBBIGxvdyBsZXZlbCBkcml2ZXIgZm9yIFlhbWFoYSBPUEwzLVNBMiBhbmQgU0EzIGNhcmRzLgotICogTk9URTogQWxsIHRyYWNlcyBvZiB0aGUgbmFtZSBPUEwzLVNBeCBoYXZlIG5vdyAoRGVjZW1iZXIgMjAwMCkgYmVlbgotICogICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBkcml2ZXIgY29kZSwgYXMgYW4gZW1haWwgZXhjaGFuZ2Ugd2l0aCBZYW1haGEKLSAqICAgICAgIHByb3ZpZGVkIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBZTUYtNzE5IGlzIGluZGVlZCBqdXN0IGEKLSAqICAgICAgIHJlLWJhZGdlZCA3MTUuCi0gKgotICogQ29weXJpZ2h0IDE5OTgtMjAwMSBTY290dCBNdXJyYXkgPHNjb3R0QHNwaXRlZnVsLm9yZz4KLSAqCi0gKiBPcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBDUzQyMzIgZHJpdmVyIChpbiBjczQyMzIuYykgYnkgSGFubnUgU2F2b2xhaW5lbgotICogYW5kIG90aGVycy4gIE5vdyBpbmNvcnBvcmF0ZXMgY29kZS9pZGVhcyBmcm9tIHBzcy5jLCBhbHNvIGJ5IEhhbm51Ci0gKiBTYXZvbGFpbmVuLiAgQm90aCBvZiB0aG9zZSBmaWxlcyBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgZm9sbG93aW5nCi0gKiBsaWNlbnNlOgotICoKLSAqICJDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3Ci0gKgotICogIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKLSAqICBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCi0gKiAgZm9yIG1vcmUgaW5mby4iCi0gKgotICogQXMgc3VjaCwgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBhYm92ZSBsaWNlbnNlLCB0aGlzIGZpbGUsIG9wbDNzYTIuYywgaXMKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKSBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuCi0gKiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBDaGFuZ2UgSGlzdG9yeQotICogLS0tLS0tLS0tLS0tLS0KLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIE9yaWdpbmFsIGRyaXZlciAoSnVuIDE0LCAxOTk4KQotICogUGF1bCBKLlkuIExhaGFpZSAgICAgICAgQ2hhbmdlZCBwcm9iaW5nIC8gYXR0YWNoIGNvZGUgb3JkZXIKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkZGVkIG1peGVyIHN1cHBvcnQgKERlYyAwMywgMTk5OCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIENoYW5nZWQgZGV0ZWN0aW9uIGNvZGUgdG8gYmUgbW9yZSBmb3JnaXZpbmcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBmb3JjZSBvcHRpb24gYXMgbGFzdCByZXNvcnQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCBpb2N0bCByZXR1cm4gdmFsdWVzLiAoRGVjIDMwLCAxOTk4KQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgU2ltcGxlciBkZXRlY3Rpb24gY29kZSBzaG91bGQgd29yayBhbGwgdGhlIHRpbWUgbm93Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aCB0aGFua3MgdG8gQmVuIEh1dGNoaW5ncyBmb3IgdGhlIGhldXJpc3RpYyksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIG5vdyB1bm5lY2Vzc2FyeSBmb3JjZSBvcHRpb24uIChKYW4gNSwgMTk5OSkKLSAqIENocmlzdG9waCBIZWxsd2lnCSAgIEFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQgKE1hciA0LCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgUmV3b3JrZWQgU0EyIHZlcnN1cyBTQTMgbWl4ZXIgY29kZSwgdXBkYXRlZCBjaGlwc2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGRldGVjdGlvbiBjb2RlIChhZ2FpbiEpLiAoRGVjIDUsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBBZGp1c3RlZCBtYXN0ZXIgdm9sdW1lIG1peGVyIHNjYWxpbmcuIChEZWMgNiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgSm9lbCBZbGlsdW9tYSAoYWthIEJpc3F3aXQpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlZCB3aWRlIG1peGVyIGFuZCBhZGp1c3RlZCBtaWMsIGJhc3MsIHRyZWJsZQotICogICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZy4gKERlYyA2LCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQmFzZWQgb24gYSBwYXRjaCBieSBQZXRlciBFbmdsbWFpZXIsIGludGVncmF0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHltb2RlIGFuZCBsb29wYmFjayBvcHRpb25zLiAoRGVjIDYsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBJbnNwaXJlZCBieSBhIHBhdGNoIGJ5IFBldGVyIEVuZ2xtYWllciwgYW5kIGJhc2VkIG9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0IEFMU0EgZG9lcywgYWRkZWQgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IERNQSBhbmQgSVJRIHNldHRpbmdzLiAoRGVjIDYsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBBZGRlZCBzb21lIG1vcmUgY2hlY2tzIHRvIHRoZSBjYXJkIGRldGVjdGlvbiBjb2RlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gd2hhdCBBTFNBIGRvZXMuIChEZWMgMTIsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBJbnNwaXJlZCBieSBzaW1pbGFyIHBhdGNoZXMgZnJvbSBKb2huIEZyZW1saW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBKaW0gUmFkZm9yZCwgTWlrZSBSb2xpZywgYW5kIEluZ21hciBTdGVlbiwgYWRkZWQgMi40Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICBJU0EgUG5QIEFQSSBzdXBwb3J0LCBtYWlubHkgYmFzZWQgb24gYml0cyBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBzYl9jYXJkLmMgYW5kIGF3ZV93YXZlLmMuIChEZWMgMTIsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBTb21lIHNtYWxsIGNsZWFudXBzIHRvIHRoZSBpbml0IGNvZGUgb3V0cHV0LgotICogICAgICAgICAgICAgICAgICAgICAgICAgKEphbiA3LCAyMDAxKQotICogWndhbmUgTXdhaWthbWJvCSAgIEFkZGVkIFBNIHN1cHBvcnQuIChEZWMgNCAyMDAxKQotICoKLSAqIEFkYW0gQmVsYXkgICAgICAgICAgICAgIENvbnZlcnRlZCBkcml2ZXIgdG8gbmV3IFBuUCBMYXllciAoT2N0IDEyLCAyMDAyKQotICogWndhbmUgTXdhaWthbWJvCSAgIENvZGUsIGRhdGEgc3RydWN0dXJlIGNsZWFudXBzLiAoRmViIDE1IDIwMDIpCi0gKiBad2FuZSBNd2Fpa2FtYm8JICAgRnJlZSByZXNvdXJjZXMgZHVyaW5nIGF1eGlsaWFyeSBkZXZpY2UgcHJvYmUKLSAqIAkJCSAgIGZhaWx1cmVzIChBcHIgMjkgMjAwMikKLSAqICAgCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BucC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiYWQxODQ4LmgiCi0jaW5jbHVkZSAibXB1NDAxLmgiCi0KLSNkZWZpbmUgT1BMM1NBMl9NT0RVTEVfTkFNRQkib3BsM3NhMiIKLSNkZWZpbmUgUEZYCQkJT1BMM1NBMl9NT0RVTEVfTkFNRSAiOiAiCi0KLS8qIFVzZWZ1bCBjb250cm9sIHBvcnQgaW5kZXhlczogKi8KLSNkZWZpbmUgT1BMM1NBMl9QTQkgICAgIDB4MDEKLSNkZWZpbmUgT1BMM1NBMl9TWVNfQ1RSTCAgICAgMHgwMgotI2RlZmluZSBPUEwzU0EyX0lSUV9DT05GSUcgICAweDAzCi0jZGVmaW5lIE9QTDNTQTJfRE1BX0NPTkZJRyAgIDB4MDYKLSNkZWZpbmUgT1BMM1NBMl9NQVNURVJfTEVGVCAgMHgwNwotI2RlZmluZSBPUEwzU0EyX01BU1RFUl9SSUdIVCAweDA4Ci0jZGVmaW5lIE9QTDNTQTJfTUlDICAgICAgICAgIDB4MDkKLSNkZWZpbmUgT1BMM1NBMl9NSVNDICAgICAgICAgMHgwQQotCi0jZGVmaW5lIE9QTDNTQTNfV0lERSAgICAgICAgIDB4MTQKLSNkZWZpbmUgT1BMM1NBM19CQVNTICAgICAgICAgMHgxNQotI2RlZmluZSBPUEwzU0EzX1RSRUJMRSAgICAgICAweDE2Ci0KLS8qIFVzZWZ1bCBjb25zdGFudHM6ICovCi0jZGVmaW5lIERFRkFVTFRfVk9MVU1FIDUwCi0jZGVmaW5lIERFRkFVTFRfTUlDICAgIDUwCi0jZGVmaW5lIERFRkFVTFRfVElNQlJFIDAKLQotLyogUG93ZXIgc2F2aW5nIG1vZGVzICovCi0jZGVmaW5lIE9QTDNTQTJfUE1fTU9ERTAJMHgwMAotI2RlZmluZSBPUEwzU0EyX1BNX01PREUxCTB4MDQJLyogUFNWICovCi0jZGVmaW5lIE9QTDNTQTJfUE1fTU9ERTIJMHgwNQkvKiBQU1YgfCBQRFggKi8KLSNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMwkweDI3CS8qIEFET1dOIHwgUFNWIHwgUEROIHwgUERYICovCi0KLQotLyogRm9yIGNoZWNraW5nIGFnYWluc3Qgd2hhdCB0aGUgY2FyZCByZXR1cm5zOiAqLwotI2RlZmluZSBWRVJTSU9OX1VOS05PV04gMAotI2RlZmluZSBWRVJTSU9OX1lNRjcxMSAgMQotI2RlZmluZSBWRVJTSU9OX1lNRjcxNSAgMgotI2RlZmluZSBWRVJTSU9OX1lNRjcxNUIgMwotI2RlZmluZSBWRVJTSU9OX1lNRjcxNUUgNAotLyogYWxzbyBhc3N1bWluZyB0aGF0IGFueXRoaW5nID4gNCBidXQgPD0gNyBpcyBhIDcxNUUgKi8KLQotLyogQ2hpcHNldCB0eXBlIGNvbnN0YW50cyBmb3IgdXNlIGJlbG93ICovCi0jZGVmaW5lIENISVBTRVRfVU5LTk9XTiAtMQotI2RlZmluZSBDSElQU0VUX09QTDNTQTIgMAotI2RlZmluZSBDSElQU0VUX09QTDNTQTMgMQotc3RhdGljIGNvbnN0IGNoYXIgKkNISVBTRVRfVEFCTEVbXSA9IHsiT1BMMy1TQTIiLCAiT1BMMy1TQTMifTsKLQotI2lmZGVmIENPTkZJR19QTlAKLSNkZWZpbmUgT1BMM1NBMl9DQVJEU19NQVggNAotI2Vsc2UKLSNkZWZpbmUgT1BMM1NBMl9DQVJEU19NQVggMQotI2VuZGlmCi0KLS8qIFRoaXMgc2hvdWxkIGJlIHByZXR0eSBvYnZpb3VzICovCi1zdGF0aWMgaW50IG9wbDNzYTJfY2FyZHNfbnVtOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JLyogZGV2aWNlIHJlc291cmNlcyAqLwotCXVuc2lnbmVkIHNob3J0IGNmZ19wb3J0OwotCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOwotCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21zczsKLQlzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZ19tcHU7Ci0jaWZkZWYgQ09ORklHX1BOUAotCS8qIFBuUCBTdHVmZiAqLwotCXN0cnVjdCBwbnBfZGV2KiBwZGV2OwotCWludCBhY3RpdmF0ZWQ7CQkJLyogV2hldGhlciBzYWlkIGRldmljZXMgaGF2ZSBiZWVuIGFjdGl2YXRlZCAqLwotI2VuZGlmCi0JdW5zaWduZWQgaW50CWNhcmQ7Ci0JaW50CQljaGlwc2V0OwkvKiBXaGF0J3MgbXkgdmVyc2lvbihzKT8gKi8KLQljaGFyCQkqY2hpcHNldF9uYW1lOwotCi0JLyogbWl4ZXIgZGF0YSAqLwotCWludAkJbWl4ZXI7Ci0JdW5zaWduZWQgaW50CXZvbHVtZV9sOwotCXVuc2lnbmVkIGludAl2b2x1bWVfcjsKLQl1bnNpZ25lZCBpbnQJbWljOwotCXVuc2lnbmVkIGludAliYXNzX2w7Ci0JdW5zaWduZWQgaW50CWJhc3NfcjsKLQl1bnNpZ25lZCBpbnQJdHJlYmxlX2w7Ci0JdW5zaWduZWQgaW50CXRyZWJsZV9yOwotCXVuc2lnbmVkIGludAl3aWRlX2w7Ci0JdW5zaWduZWQgaW50CXdpZGVfcjsKLX0gb3BsM3NhMl9zdGF0ZV90Owotc3RhdGljIG9wbDNzYTJfc3RhdGVfdCBvcGwzc2EyX3N0YXRlW09QTDNTQTJfQ0FSRFNfTUFYXTsKLQotCQotCi0vKiBPdXIgcGFyYW1ldGVycyAqLwotc3RhdGljIGludCBfX2luaXRkYXRhIGlvCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgbXNzX2lvCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1X2lvCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMgk9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIHltb2RlCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgbG9vcGJhY2sJPSAtMTsKLQotI2lmZGVmIENPTkZJR19QTlAKLS8qIFBuUCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgaXNhcG5wID0gMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBtdWx0aXBsZSA9IDE7Ci0KLS8qIFdoZXRoZXIgc2FpZCBkZXZpY2VzIGhhdmUgYmVlbiBhY3RpdmF0ZWQgKi8KLXN0YXRpYyBpbnQgb3BsM3NhMl9hY3RpdmF0ZWRbT1BMM1NBMl9DQVJEU19NQVhdOwotI2Vsc2UKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpc2FwbnA7IC8qID0gMCAqLwotc3RhdGljIGludCBfX2luaXRkYXRhIG11bHRpcGxlOyAvKiA9IDAgKi8KLSNlbmRpZgotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1vZHVsZSBmb3IgT1BMMy1TQTIgYW5kIFNBMyBzb3VuZCBjYXJkcyAodXNlcyBBRDE4NDggTVNTIGRyaXZlcikuIik7Ci1NT0RVTEVfQVVUSE9SKCJTY290dCBNdXJyYXkgPHNjb3R0QHNwaXRlZnVsLm9yZz4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotCi1tb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlvLCAiU2V0IEkvTyBiYXNlIG9mIE9QTDMtU0EyIG9yIFNBMyBjYXJkICh1c3VhbGx5IDB4MzcwLiAgQWRkcmVzcyBtdXN0IGJlIGV2ZW4gYW5kIG11c3QgYmUgZnJvbSAweDEwMCB0byAweEZGRSkiKTsKLQotbW9kdWxlX3BhcmFtKG1zc19pbywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MobXNzX2lvLCAiU2V0IE1TUyAoYXVkaW8pIEkvTyBiYXNlICgweDUzMCwgMHhFODAsIG9yIG90aGVyLiBBZGRyZXNzIG11c3QgZW5kIGluIDAgb3IgNCBhbmQgbXVzdCBiZSBmcm9tIDB4NTMwIHRvIDB4RjQ4KSIpOwotCi1tb2R1bGVfcGFyYW0obXB1X2lvLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtcHVfaW8sICJTZXQgTUlESSBJL08gYmFzZSAoMHgzMzAgb3Igb3RoZXIuIEFkZHJlc3MgbXVzdCBiZSBldmVuIGFuZCBtdXN0IGJlIGZyb20gMHgzMDAgdG8gMHgzMzQpIik7Ci0KLW1vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlycSwgIlNldCBNU1MgKGF1ZGlvKSBJUlEgKDUsIDcsIDksIDEwLCAxMSwgMTIpIik7Ci0KLW1vZHVsZV9wYXJhbShkbWEsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRtYSwgIlNldCBNU1MgKGF1ZGlvKSBmaXJzdCBETUEgY2hhbm5lbCAoMCwgMSwgMykiKTsKLQotbW9kdWxlX3BhcmFtKGRtYTIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRtYTIsICJTZXQgTVNTIChhdWRpbykgc2Vjb25kIERNQSBjaGFubmVsICgwLCAxLCAzKSIpOwotCi1tb2R1bGVfcGFyYW0oeW1vZGUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHltb2RlLCAiU2V0IFlhbWFoYSAzRCBlbmhhbmNlbWVudCBtb2RlICgwID0gRGVza3RvcC9Ob3JtYWwsIDEgPSBOb3RlYm9vayBQQyAoMSksIDIgPSBOb3RlYm9vayBQQyAoMiksIDMgPSBIaS1GaSkiKTsKLQotbW9kdWxlX3BhcmFtKGxvb3BiYWNrLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhsb29wYmFjaywgIlNldCBBL0QgaW5wdXQgc291cmNlLiBVc2VmdWwgZm9yIGVjaG8gY2FuY2VsbGF0aW9uICgwID0gTWljIFJjaCAoZGVmYXVsdCksIDEgPSBNb25vIG91dHB1dCBsb29wYmFjaykiKTsKLQotI2lmZGVmIENPTkZJR19QTlAKLW1vZHVsZV9wYXJhbShpc2FwbnAsIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpc2FwbnAsICJXaGVuIHNldCB0byAwLCBJU0EgUG5QIHN1cHBvcnQgd2lsbCBiZSBkaXNhYmxlZCIpOwotCi1tb2R1bGVfcGFyYW0obXVsdGlwbGUsIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtdWx0aXBsZSwgIldoZW4gc2V0IHRvIDAsIHdpbGwgbm90IHNlYXJjaCBmb3IgbXVsdGlwbGUgY2FyZHMiKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBTdGFuZGFyZCByZWFkIGFuZCB3cml0ZSBmdW5jdGlvbnMKLSovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvcGwzc2EyX3dyaXRlKHVuc2lnbmVkIHNob3J0IHBvcnQsCi0JCQkJIHVuc2lnbmVkIGNoYXIgIGluZGV4LAotCQkJCSB1bnNpZ25lZCBjaGFyICBkYXRhKQotewotCW91dGJfcChpbmRleCwgcG9ydCk7Ci0Jb3V0YihkYXRhLCBwb3J0ICsgMSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIG9wbDNzYTJfcmVhZCh1bnNpZ25lZCBzaG9ydCBwb3J0LAotCQkJCXVuc2lnbmVkIGNoYXIgIGluZGV4LAotCQkJCXVuc2lnbmVkIGNoYXIqIGRhdGEpCi17Ci0Jb3V0Yl9wKGluZGV4LCBwb3J0KTsKLQkqZGF0YSA9IGluYihwb3J0ICsgMSk7Ci19Ci0KLQotLyoKLSAqIEFsbCBvZiB0aGUgbWl4ZXIgZnVuY3Rpb25zLi4uCi0gKi8KLQotc3RhdGljIHZvaWQgb3BsM3NhMl9zZXRfdm9sdW1lKG9wbDNzYTJfc3RhdGVfdCogZGV2YywgaW50IGxlZnQsIGludCByaWdodCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBzY2FsZVsxMDFdID0gewotCQkweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBlLCAweDBlLCAweDBlLAotCQkweDBlLCAweDBlLCAweDBlLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBjLAotCQkweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAotCQkweDBiLCAweDBiLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA5LCAweDA5LAotCQkweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAotCQkweDA4LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA2LCAweDA2LCAweDA2LAotCQkweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LAotCQkweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDAzLCAweDAzLCAweDAzLCAweDAzLAotCQkweDAzLCAweDAzLCAweDAzLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAxLAotCQkweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCQkweDAwCi0JfTsKLQl1bnNpZ25lZCBjaGFyIHZvbDsKLQotCXZvbCA9IHNjYWxlW2xlZnRdOwotCi0JLyogSWYgbGV2ZWwgaXMgemVybywgdHVybiBvbiBtdXRlICovCi0JaWYoIWxlZnQpCi0JCXZvbCB8PSAweDgwOwotCi0Jb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBMl9NQVNURVJfTEVGVCwgdm9sKTsKLQotCXZvbCA9IHNjYWxlW3JpZ2h0XTsKLQotCS8qIElmIGxldmVsIGlzIHplcm8sIHR1cm4gb24gbXV0ZSAqLwotCWlmKCFyaWdodCkKLQkJdm9sIHw9IDB4ODA7Ci0KLQlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EyX01BU1RFUl9SSUdIVCwgdm9sKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EyX3NldF9taWMob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGV2ZWwpCi17Ci0JdW5zaWduZWQgY2hhciB2b2wgPSAweDFGOwotCi0JaWYoKGxldmVsID49IDApICYmIChsZXZlbCA8PSAxMDApKQotCQl2b2wgPSAweDFGIC0gKHVuc2lnbmVkIGNoYXIpICgzMiAqIGxldmVsIC8gMTAxKTsKLQotCS8qIElmIGxldmVsIGlzIHplcm8sIHR1cm4gb24gbXV0ZSAqLwotCWlmKCFsZXZlbCkKLQkJdm9sIHw9IDB4ODA7Ci0KLQlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EyX01JQywgdm9sKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EzX3NldF9iYXNzKG9wbDNzYTJfc3RhdGVfdCogZGV2YywgaW50IGxlZnQsIGludCByaWdodCkKLXsKLQl1bnNpZ25lZCBjaGFyIGJhc3M7Ci0KLQliYXNzID0gbGVmdCA/ICgodW5zaWduZWQgY2hhcikgKDggKiBsZWZ0IC8gMTAxKSkgOiAwOyAKLQliYXNzIHw9IChyaWdodCA/ICgodW5zaWduZWQgY2hhcikgKDggKiByaWdodCAvIDEwMSkpIDogMCkgPDwgNDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTNfQkFTUywgYmFzcyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgb3BsM3NhM19zZXRfdHJlYmxlKG9wbDNzYTJfc3RhdGVfdCogZGV2YywgaW50IGxlZnQsIGludCByaWdodCkKLXsJCi0JdW5zaWduZWQgY2hhciB0cmVibGU7Ci0KLQl0cmVibGUgPSBsZWZ0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIGxlZnQgLyAxMDEpKSA6IDA7IAotCXRyZWJsZSB8PSAocmlnaHQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogcmlnaHQgLyAxMDEpKSA6IDApIDw8IDQ7Ci0KLQlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EzX1RSRUJMRSwgdHJlYmxlKTsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQgb3BsM3NhMl9taXhlcl9yZXNldChvcGwzc2EyX3N0YXRlX3QqIGRldmMpCi17Ci0JaWYgKGRldmMpIHsKLQkJb3BsM3NhMl9zZXRfdm9sdW1lKGRldmMsIERFRkFVTFRfVk9MVU1FLCBERUZBVUxUX1ZPTFVNRSk7Ci0JCWRldmMtPnZvbHVtZV9sID0gZGV2Yy0+dm9sdW1lX3IgPSBERUZBVUxUX1ZPTFVNRTsKLQotCQlvcGwzc2EyX3NldF9taWMoZGV2YywgREVGQVVMVF9NSUMpOwotCQlkZXZjLT5taWMgPSBERUZBVUxUX01JQzsKLQotCQlpZiAoZGV2Yy0+Y2hpcHNldCA9PSBDSElQU0VUX09QTDNTQTMpIHsKLQkJCW9wbDNzYTNfc2V0X2Jhc3MoZGV2YywgREVGQVVMVF9USU1CUkUsIERFRkFVTFRfVElNQlJFKTsKLQkJCWRldmMtPmJhc3NfbCA9IGRldmMtPmJhc3NfciA9IERFRkFVTFRfVElNQlJFOwotCQkJb3BsM3NhM19zZXRfdHJlYmxlKGRldmMsIERFRkFVTFRfVElNQlJFLCBERUZBVUxUX1RJTUJSRSk7Ci0JCQlkZXZjLT50cmVibGVfbCA9IGRldmMtPnRyZWJsZV9yID0gREVGQVVMVF9USU1CUkU7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmdfdG9fdm9sX21vbm8odW5zaWduZWQgaW50IHZvbCwgaW50KiB2YWx1ZSkKLXsKLQlpbnQgbGVmdDsKLQkKLQlsZWZ0ID0gdm9sICYgMHgwMGZmOwotCWlmIChsZWZ0ID4gMTAwKQotCQlsZWZ0ID0gMTAwOwotCSp2YWx1ZSA9IGxlZnQ7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGFyZ190b192b2xfc3RlcmVvKHVuc2lnbmVkIGludCB2b2wsIGludCogYWxlZnQsIGludCogYXJpZ2h0KQotewotCWFyZ190b192b2xfbW9ubyh2b2wsIGFsZWZ0KTsKLQlhcmdfdG9fdm9sX21vbm8odm9sID4+IDgsIGFyaWdodCk7Ci19Ci0KLQotc3RhdGljIGlubGluZSBpbnQgcmV0X3ZvbF9tb25vKGludCB2b2wpCi17Ci0JcmV0dXJuICgodm9sIDw8IDgpIHwgdm9sKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGludCByZXRfdm9sX3N0ZXJlbyhpbnQgbGVmdCwgaW50IHJpZ2h0KQotewotCXJldHVybiAoKHJpZ2h0IDw8IDgpIHwgbGVmdCk7Ci19Ci0KLQotc3RhdGljIGludCBvcGwzc2EyX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJldHZhbCwgdmFsdWUsIGNtZGYgPSBjbWQgJiAweGZmOwotCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKLQotCW9wbDNzYTJfc3RhdGVfdCogZGV2YyA9ICZvcGwzc2EyX3N0YXRlW2Rldl07Ci0JCi0Jc3dpdGNoIChjbWRmKSB7Ci0JCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgotCQljYXNlIFNPVU5EX01JWEVSX01JQzoKLQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgotCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6IAotCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6Ci0JCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6IAotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQkKLQlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSAhPSAnTScpCi0JCXJldHVybiAtRUlOVkFMOwotCQkKLQlyZXR2YWwgPSAwOwotCWlmIChfU0lPQ19ESVIgKGNtZCkgJiBfU0lPQ19XUklURSkgewotCQlzd2l0Y2ggKGNtZGYpIHsKLQkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgotCQkJCXJldHZhbCA9IGdldF91c2VyKHZhbHVlLCAodW5zaWduZWQgX191c2VyICopIGFyZyk7Ci0JCQkJaWYgKHJldHZhbCkKLQkJCQkJYnJlYWs7Ci0JCQkJYXJnX3RvX3ZvbF9zdGVyZW8odmFsdWUsICZkZXZjLT52b2x1bWVfbCwgJmRldmMtPnZvbHVtZV9yKTsKLQkJCQlvcGwzc2EyX3NldF92b2x1bWUoZGV2YywgZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKLQkJCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPnZvbHVtZV9sLCBkZXZjLT52b2x1bWVfcik7Ci0JCQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIHApOwotCQkJCWJyZWFrOwotCQkgIAotCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCQkJcmV0dmFsID0gZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKTsKLQkJCQlpZiAocmV0dmFsKQotCQkJCQlicmVhazsKLQkJCQlhcmdfdG9fdm9sX21vbm8odmFsdWUsICZkZXZjLT5taWMpOwotCQkJCW9wbDNzYTJfc2V0X21pYyhkZXZjLCBkZXZjLT5taWMpOwotCQkJCXZhbHVlID0gcmV0X3ZvbF9tb25vKGRldmMtPm1pYyk7Ci0JCQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIHApOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHZhbCA9IC1FSU5WQUw7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIFJldHVybiBwYXJhbWV0ZXJzCi0JCSAqLwotCQlzd2l0Y2ggKGNtZGYpIHsKLQkJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcihTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfTUlDLCBwKTsKLQkJCQlicmVhazsKLQkJICAKLQkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcihTT1VORF9NQVNLX1ZPTFVNRSwgcCk7Ci0JCQkJYnJlYWs7Ci0JCSAgCi0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6Ci0JCQkJLyogTm8gcmVjb3JkaW5nIGRldmljZXMgKi8KLQkJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCBwKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgotCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCBwKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6Ci0JCQkJLyogTm8gcmVjb3JkaW5nIHNvdXJjZSAqLwotCQkJCXJldHZhbCA9IHB1dF91c2VyKDAsIHApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKLQkJCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPnZvbHVtZV9sLCBkZXZjLT52b2x1bWVfcik7Ci0JCQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIHApOwotCQkJCWJyZWFrOwotCQkJICAKLQkJCWNhc2UgU09VTkRfTUlYRVJfTUlDOgotCQkJCXZhbHVlID0gcmV0X3ZvbF9tb25vKGRldmMtPm1pYyk7Ci0JCQkJcHV0X3VzZXIodmFsdWUsIHApOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHZhbCA9IC1FSU5WQUw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qIG9wbDNzYTJfbWl4ZXJfaW9jdGwgZW5kICovCi0KLQotc3RhdGljIGludCBvcGwzc2EzX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQotewotCWludCB2YWx1ZSwgcmV0dmFsLCBjbWRmID0gY21kICYgMHhmZjsKLQotCW9wbDNzYTJfc3RhdGVfdCogZGV2YyA9ICZvcGwzc2EyX3N0YXRlW2Rldl07Ci0KLQlzd2l0Y2ggKGNtZGYpIHsKLQljYXNlIFNPVU5EX01JWEVSX0JBU1M6Ci0JCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+YmFzc19sLCBkZXZjLT5iYXNzX3IpOwotCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgKGludCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgotCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPnRyZWJsZV9sLCBkZXZjLT50cmVibGVfcik7Ci0JCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfRElHSVRBTDE6Ci0JCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+d2lkZV9sLCBkZXZjLT53aWRlX3IpOwotCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgKGludCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR2YWwgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotLyogb3BsM3NhM19taXhlcl9pb2N0bCBlbmQgKi8KLQotCi1zdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgb3BsM3NhMl9taXhlcl9vcGVyYXRpb25zID0KLXsKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaWQJPSAiT1BMMy1TQTIiLAotCS5uYW1lCT0gIllhbWFoYSBPUEwzLVNBMiIsCi0JLmlvY3RsCT0gb3BsM3NhMl9taXhlcl9pb2N0bAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIG9wbDNzYTNfbWl4ZXJfb3BlcmF0aW9ucyA9Ci17Ci0JLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLmlkCT0gIk9QTDMtU0EzIiwKLQkubmFtZQk9ICJZYW1haGEgT1BMMy1TQTMiLAotCS5pb2N0bAk9IG9wbDNzYTNfbWl4ZXJfaW9jdGwKLX07Ci0KLS8qIEVuZCBvZiBtaXhlci1yZWxhdGVkIHN0dWZmICovCi0KLQotLyoKLSAqIENvbXBvbmVudCBwcm9iZSwgYXR0YWNoLCB1bmxvYWQgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhMl9tcHUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQotewotCXVubG9hZF9tcHU0MDEoaHdfY29uZmlnKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYTJfbXNzKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cykKLXsKLQlpbnQgaW5pdGlhbF9taXhlcnM7Ci0KLQlpbml0aWFsX21peGVycyA9IG51bV9taXhlcnM7Ci0JYXR0YWNoX21zX3NvdW5kKGh3X2NvbmZpZywgcG9ydHMsIFRISVNfTU9EVUxFKTsJLyogU2xvdCAwICovCi0JaWYgKGh3X2NvbmZpZy0+c2xvdHNbMF0gIT0gLTEpIHsKLQkJLyogRGlkIHRoZSBNU1MgZHJpdmVyIGluc3RhbGw/ICovCi0JCWlmKG51bV9taXhlcnMgPT0gKGluaXRpYWxfbWl4ZXJzICsgMSkpIHsKLQkJCS8qIFRoZSBNU1MgbWl4ZXIgaXMgaW5zdGFsbGVkLCByZXJvdXRlIG1peGVycyBhcHByb3ByaWF0ZWx5ICovCi0JCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMSwgU09VTkRfTUlYRVJfQ0QpOwotCQkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX1NZTlRIKTsKLQkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUzLCBTT1VORF9NSVhFUl9MSU5FKTsKLQkJfQotCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIk1TUyBtaXhlciBub3QgaW5zdGFsbGVkP1xuIik7Ci0JCX0KLQl9Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhMl9tc3Moc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnKQotewotCXVubG9hZF9tc19zb3VuZChod19jb25maWcpOwotfQotCi0KLXN0YXRpYyBpbnQgX19pbml0IHByb2JlX29wbDNzYTIoc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgY2FyZCkKLXsKLQl1bnNpZ25lZCBjaGFyIG1pc2M7Ci0JdW5zaWduZWQgY2hhciB0bXA7Ci0JdW5zaWduZWQgY2hhciB2ZXJzaW9uOwotCi0JLyoKLQkgKiBUcnkgYW5kIGFsbG9jYXRlIG91ciBJL08gcG9ydCByYW5nZS4KLQkgKi8KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMiwgT1BMM1NBMl9NT0RVTEVfTkFNRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ29udHJvbCBJL08gcG9ydCAlI3ggbm90IGZyZWVcbiIsCi0JCSAgICAgICBod19jb25maWctPmlvX2Jhc2UpOwotCQlnb3RvIG91dF9ub2RldjsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIGlmIHdyaXRpbmcgdG8gdGhlIHJlYWQtb25seSB2ZXJzaW9uIGJpdHMgb2YgdGhlIG1pc2NlbGxhbmVvdXMKLQkgKiByZWdpc3RlciBzdWNjZWVkcyBvciBub3QgKGl0IHNob3VsZCBub3QpLgotCSAqLwotCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgJm1pc2MpOwotCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsIG1pc2MgXiAweDA3KTsKLQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsICZ0bXApOwotCWlmKHRtcCAhPSBtaXNjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIkNvbnRyb2wgSS9PIHBvcnQgJSN4IGlzIG5vdCBhIFlNRjd4eCBjaGlwc2V0IVxuIiwKLQkJICAgICAgIGh3X2NvbmZpZy0+aW9fYmFzZSk7Ci0JCWdvdG8gb3V0X3JlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIGlmIHRoZSBNSUMgcmVnaXN0ZXIgaXMgYWNjZXNzaWJsZS4KLQkgKi8KLQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JQywgJnRtcCk7Ci0Jb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCAweDhhKTsKLQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JQywgJnRtcCk7Ci0JaWYoKHRtcCAmIDB4OWYpICE9IDB4OGEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICBQRlggIkNvbnRyb2wgSS9PIHBvcnQgJSN4IGlzIG5vdCBhIFlNRjd4eCBjaGlwc2V0IVxuIiwKLQkJICAgICAgIGh3X2NvbmZpZy0+aW9fYmFzZSk7Ci0JCWdvdG8gb3V0X3JlZ2lvbjsKLQl9Ci0Jb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCB0bXApOwotCi0JLyoKLQkgKiBEZXRlcm1pbmUgY2hpcHNldCB0eXBlIChTQTIgb3IgU0EzKQotCSAqCi0JICogVGhpcyBpcyBkb25lIGJ5IGxvb2tpbmcgYXQgdGhlIGNoaXBzZXQgdmVyc2lvbiBpbiB0aGUgbG93ZXIgMyBiaXRzCi0JICogb2YgdGhlIG1pc2NlbGxhbmVvdXMgcmVnaXN0ZXIuCi0JICovCi0JdmVyc2lvbiA9IG1pc2MgJiAweDA3OwotCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQ2hpcHNldCB2ZXJzaW9uID0gJSN4XG4iLCB2ZXJzaW9uKTsKLQlzd2l0Y2ggKHZlcnNpb24pIHsKLQkJY2FzZSAwOgotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9VTktOT1dOOwotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgUEZYICJVbmtub3duIFlhbWFoYSBhdWRpbyBjb250cm9sbGVyIHZlcnNpb25cbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWRVJTSU9OX1lNRjcxMToKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMjsKLQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJGb3VuZCBPUEwzLVNBMiAoWU1GNzExKVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFZFUlNJT05fWU1GNzE1OgotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9PUEwzU0EzOwotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgIFBGWCAiRm91bmQgT1BMMy1TQTMgKFlNRjcxNSBvciBZTUY3MTkpXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVkVSU0lPTl9ZTUY3MTVCOgotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9PUEwzU0EzOwotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgIFBGWCAiRm91bmQgT1BMMy1TQTMgKFlNRjcxNUIgb3IgWU1GNzE5QilcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWRVJTSU9OX1lNRjcxNUU6Ci0JCWRlZmF1bHQ6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTM7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgUEZYICJGb3VuZCBPUEwzLVNBMyAoWU1GNzE1RSBvciBZTUY3MTlFKVxuIik7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAob3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ICE9IENISVBTRVRfVU5LTk9XTikgewotCQkvKiBHZW5lcmF0ZSBhIHByZXR0eSBuYW1lICovCi0JCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldF9uYW1lID0gKGNoYXIgKilDSElQU0VUX1RBQkxFW29wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldF07Ci0JCXJldHVybiAwOwotCX0KLQotb3V0X3JlZ2lvbjoKLQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOwotb3V0X25vZGV2OgotCXJldHVybiAtRU5PREVWOwotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfb3BsM3NhMihzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBjYXJkKQotewotCS8qIEluaXRpYWxpemUgSVJRIGNvbmZpZ3VyYXRpb24gdG8gSVJRLUI6IC0sIElSUS1BOiBXU1MrTVBVK09QTDMgKi8KLQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9JUlFfQ09ORklHLCAweDBkKTsKLQotCS8qIEluaXRpYWxpemUgRE1BIGNvbmZpZ3VyYXRpb24gKi8KLQlpZihod19jb25maWctPmRtYTIgPT0gaHdfY29uZmlnLT5kbWEpIHsKLQkJLyogV2FudCBETUEgY29uZmlndXJhdGlvbiBETUEtQjogLSwgRE1BLUE6IFdTUy1QK1dTUy1SICovCi0JCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX0RNQV9DT05GSUcsIDB4MDMpOwotCX0KLQllbHNlIHsKLQkJLyogV2FudCBETUEgY29uZmlndXJhdGlvbiBETUEtQjogV1NTLVIsIERNQS1BOiBXU1MtUCAqLwotCQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9ETUFfQ09ORklHLCAweDIxKTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9vcGwzc2EyX21peGVyKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgaW50IGNhcmQpCi17Ci0Jc3RydWN0IG1peGVyX29wZXJhdGlvbnMqIG1peGVyX29wZXJhdGlvbnM7Ci0Jb3BsM3NhMl9zdGF0ZV90KiBkZXZjID0gJm9wbDNzYTJfc3RhdGVbY2FyZF07Ci0KLQkvKiBJbnN0YWxsIG1hc3RlciBtaXhlciAqLwotCWlmIChkZXZjLT5jaGlwc2V0ID09IENISVBTRVRfT1BMM1NBMykgewotCQltaXhlcl9vcGVyYXRpb25zID0gJm9wbDNzYTNfbWl4ZXJfb3BlcmF0aW9uczsKLQl9Ci0JZWxzZSB7Ci0JCW1peGVyX29wZXJhdGlvbnMgPSAmb3BsM3NhMl9taXhlcl9vcGVyYXRpb25zOwotCX0KLQotCWRldmMtPmNmZ19wb3J0ID0gaHdfY29uZmlnLT5pb19iYXNlOwotCWRldmMtPm1peGVyID0gc291bmRfaW5zdGFsbF9taXhlcihNSVhFUl9EUklWRVJfVkVSU0lPTiwKLQkJCQkJICBtaXhlcl9vcGVyYXRpb25zLT5uYW1lLAotCQkJCQkgIG1peGVyX29wZXJhdGlvbnMsCi0JCQkJCSAgc2l6ZW9mKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSwKLQkJCQkJICBkZXZjKTsKLQlpZihkZXZjLT5taXhlciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IGluc3RhbGwgJXMgbWFzdGVyIG1peGVyXG4iLAotCQkJIG1peGVyX29wZXJhdGlvbnMtPm5hbWUpOwotCX0KLQllbHNlIHsKLQkJCW9wbDNzYTJfbWl4ZXJfcmVzZXQoZGV2Yyk7Ci0KLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgb3BsM3NhMl9jbGVhcl9zbG90cyhzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcpCi17Ci0JaW50IGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJaHdfY29uZmlnLT5zbG90c1tpXSA9IC0xOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb3BsM3NhMl9zZXRfeW1vZGUoc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgeW1vZGUpCi17Ci0JLyoKLQkgKiBTZXQgdGhlIFlhbWFoYSAzRCBlbmhhbmNlbWVudCBtb2RlIChha2EgWW1lcnNpb24pIGlmIGFza2VkIHRvIGFuZAotCSAqIGl0J3Mgc3VwcG9ydGVkLgotCSAqCi0JICogMDogRGVza3RvcCAoYWthIG5vcm1hbCkgICA1LTEyIGNtIHNwZWFrZXJzCi0JICogMTogTm90ZWJvb2sgUEMgbW9kZSAxICAgICAzIGNtIHNwZWFrZXJzCi0JICogMjogTm90ZWJvb2sgUEMgbW9kZSAyICAgICAxLjUgY20gc3BlYWtlcnMKLQkgKiAzOiBIaS1maSAgICAgICAgICAgICAgICAgIDE2LTM4IGNtIHNwZWFrZXJzCi0JICovCi0JaWYoeW1vZGUgPj0gMCAmJiB5bW9kZSA8PSAzKSB7Ci0JCXVuc2lnbmVkIGNoYXIgc3lzX2N0cmw7Ci0KLQkJb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9TWVNfQ1RSTCwgJnN5c19jdHJsKTsKLQkJc3lzX2N0cmwgPSAoc3lzX2N0cmwgJiAweGNmKSB8ICgoeW1vZGUgJiAzKSA8PCA0KTsKLQkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfU1lTX0NUUkwsIHN5c19jdHJsKTsKLQl9Ci0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIm5vdCBzZXR0aW5nIHltb2RlLCBpdCBtdXN0IGJlIG9uZSBvZiAwLDEsMiwzXG4iKTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IG9wbDNzYTJfc2V0X2xvb3BiYWNrKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGxvb3BiYWNrKQotewotCWlmKGxvb3BiYWNrID49IDAgJiYgbG9vcGJhY2sgPD0gMSkgewotCQl1bnNpZ25lZCBjaGFyIG1pc2M7Ci0KLQkJb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCAmbWlzYyk7Ci0JCW1pc2MgPSAobWlzYyAmIDB4ZWYpIHwgKChsb29wYmFjayAmIDEpIDw8IDQpOwotCQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCBtaXNjKTsKLQl9Ci0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIm5vdCBzZXR0aW5nIGxvb3BiYWNrLCBpdCBtdXN0IGJlIGVpdGhlciAwIG9yIDFcbiIpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX29wbDNzYTIoc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgY2FyZCkKLXsKLSAgICAgICAgLyogUmVsZWFzZSBjb250cm9sIHBvcnRzICovCi0JcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKLQotCS8qIFVubG9hZCBtaXhlciAqLwotCWlmKG9wbDNzYTJfc3RhdGVbY2FyZF0ubWl4ZXIgPj0gMCkKLQkJc291bmRfdW5sb2FkX21peGVyZGV2KG9wbDNzYTJfc3RhdGVbY2FyZF0ubWl4ZXIpOwotCi19Ci0KLSNpZmRlZiBDT05GSUdfUE5QCi1zdGF0aWMgc3RydWN0IHBucF9kZXZpY2VfaWQgcG5wX29wbDNzYTJfbGlzdFtdID0gewotCXsuaWQgPSAiWU1IMDAyMSIsIC5kcml2ZXJfZGF0YSA9IDB9LAotCXsuaWQgPSAiIn0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBwbnBfb3BsM3NhMl9saXN0KTsKLQotc3RhdGljIGludCBvcGwzc2EyX3BucF9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQotewotCWludCBjYXJkID0gb3BsM3NhMl9jYXJkc19udW07Ci0KLQkvKiB3ZSBkb24ndCBhY3R1YWxseSB3YW50IHRvIHJldHVybiBhbiBlcnJvciBhcyB0aGUgdXNlciBtYXkgaGF2ZSBzcGVjaWZpZWQKLQkgKiBubyBtdWx0aXBsZSBjYXJkIHNlYXJjaAotCSAqLwotCi0JaWYgKG9wbDNzYTJfY2FyZHNfbnVtID09IE9QTDNTQTJfQ0FSRFNfTUFYKQotCQlyZXR1cm4gMDsKLQlvcGwzc2EyX2FjdGl2YXRlZFtjYXJkXSA9IDE7Ci0KLQkvKiBPdXIgb3duIGNvbmZpZzogKi8KLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pb19iYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2LCA0KTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pcnEgICAgID0gcG5wX2lycShkZXYsIDApOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmRtYSAgICAgPSBwbnBfZG1hKGRldiwgMCk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hMiAgICA9IHBucF9kbWEoZGV2LCAxKTsKLQotCS8qIFRoZSBNU1MgY29uZmlnOiAqLwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5pb19iYXNlICAgICAgPSBwbnBfcG9ydF9zdGFydChkZXYsIDEpOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5pcnEgICAgICAgICAgPSBwbnBfaXJxKGRldiwgMCk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmRtYSAgICAgICAgICA9IHBucF9kbWEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hMiAgICAgICAgID0gcG5wX2RtYShkZXYsIDEpOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5jYXJkX3N1YnR5cGUgPSAxOyAvKiBObyBJUlEgb3IgRE1BIHNldHVwICovCi0KLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaW9fYmFzZSAgICAgICA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMyk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlycSAgICAgICAgICAgPSBwbnBfaXJxKGRldiwgMCk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmRtYSAgICAgICAgICAgPSAtMTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuZG1hMiAgICAgICAgICA9IC0xOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5hbHdheXNfZGV0ZWN0ID0gMTsgLyogSXQncyB0aGVyZSwgc28gdXNlIHNoYXJlZCBJUlFzICovCi0KLQkvKiBDYWxsIG1lIHBhcmFub2lkOiAqLwotCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnKTsKLQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MpOwotCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSk7Ci0KLQlvcGwzc2EyX3N0YXRlW2NhcmRdLnBkZXYgPSBkZXY7Ci0Jb3BsM3NhMl9jYXJkc19udW0rKzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgb3BsM3NhMl9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gIm9wbDNzYTIiLAotCS5pZF90YWJsZQk9IHBucF9vcGwzc2EyX2xpc3QsCi0JLnByb2JlCQk9IG9wbDNzYTJfcG5wX3Byb2JlLAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KLQotLyogRW5kIG9mIGNvbXBvbmVudCBmdW5jdGlvbnMgKi8KLQotLyoKLSAqIEluc3RhbGwgT1BMMy1TQTIgYmFzZWQgY2FyZChzKS4KLSAqCi0gKiBOZWVkIHRvIGhhdmUgYWQxODQ4IGFuZCBtcHU0MDEgbG9hZGVkIHJlYWR5LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X29wbDNzYTIodm9pZCkKLXsKLQlpbnQgY2FyZCwgbWF4OwotCi0JLyogU2FuaXRpemUgaXNhcG5wIGFuZCBtdWx0aXBsZSBzZXR0aW5ncyAqLwotCWlzYXBucCA9IGlzYXBucCAhPSAwID8gMSA6IDA7Ci0JbXVsdGlwbGUgPSBtdWx0aXBsZSAhPSAwID8gMSA6IDA7Ci0KLQltYXggPSAobXVsdGlwbGUgJiYgaXNhcG5wKSA/IE9QTDNTQTJfQ0FSRFNfTUFYIDogMTsKLQotI2lmZGVmIENPTkZJR19QTlAKLQlpZiAoaXNhcG5wKXsKLQkJcG5wX3JlZ2lzdGVyX2RyaXZlcigmb3BsM3NhMl9kcml2ZXIpOwotCQlpZighb3BsM3NhMl9jYXJkc19udW0pewotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5vIFBuUCBjYXJkcyBmb3VuZFxuIik7Ci0JCQlpc2FwbnAgPSAwOwotCQl9Ci0JCW1heCA9IG9wbDNzYTJfY2FyZHNfbnVtOwotCX0KLSNlbmRpZgotCi0JZm9yIChjYXJkID0gMDsgY2FyZCA8IG1heDsgY2FyZCsrKSB7Ci0JCS8qIElmIGEgdXNlciB3YW50cyBhbiBJL08gdGhlbiBhc3N1bWUgdGhleSBtZWFudCBpdCAqLwotCQlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOwotCQlpbnQgYmFzZTsKLQkJCi0JCWlmICghaXNhcG5wKSB7Ci0JCQlpZiAoaW8gPT0gLTEgfHwgaXJxID09IC0xIHx8IGRtYSA9PSAtMSB8fAotCQkJICAgIGRtYTIgPT0gLTEgfHwgbXNzX2lvID09IC0xKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgIFBGWCAiaW8sIG1zc19pbywgaXJxLCBkbWEsIGFuZCBkbWEyIG11c3QgYmUgc2V0XG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCW9wbDNzYTJfY2FyZHNfbnVtKys7Ci0KLQkJCS8qCi0JCQkgKiBPdXIgb3duIGNvbmZpZzoKLQkJCSAqIChOT1RFOiBJUlEgYW5kIERNQSBhcmVuJ3QgdXNlZCwgc28gdGhleSdyZSBzZXQgdG8KLQkJCSAqICBnaXZlIHByZXR0eSBvdXRwdXQgZnJvbSBjb25mX3ByaW50Zi4gOikKLQkJCSAqLwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuaW9fYmFzZSA9IGlvOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuaXJxICAgICA9IGlycTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmRtYSAgICAgPSBkbWE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEyICAgID0gZG1hMjsKLQkKLQkJCS8qIFRoZSBNU1MgY29uZmlnOiAqLwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlvX2Jhc2UgICAgICA9IG1zc19pbzsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5pcnEgICAgICAgICAgPSBpcnE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hICAgICAgICAgID0gZG1hOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmRtYTIgICAgICAgICA9IGRtYTI7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuY2FyZF9zdWJ0eXBlID0gMTsgLyogTm8gSVJRIG9yIERNQSBzZXR1cCAqLwotCi0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaW9fYmFzZSAgICAgICA9IG1wdV9pbzsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pcnEgICAgICAgICAgID0gaXJxOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmRtYSAgICAgICAgICAgPSAtMTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5hbHdheXNfZGV0ZWN0ID0gMTsgLyogVXNlIHNoYXJlZCBJUlFzICovCi0KLQkJCS8qIENhbGwgbWUgcGFyYW5vaWQ6ICovCi0JCQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZyk7Ci0JCQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MpOwotCQkJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1KTsKLQkJfQotCi0JCS8qIEZJWE1FOiBsZWFrICovCi0JCWlmIChwcm9iZV9vcGwzc2EyKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgY2FyZCkpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQliYXNlID0gb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlvX2Jhc2U7Ci0KLQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCA0LCAiV1NTIGNvbmZpZyIpKQotCQkJZ290byBmYWlsZWQ7Ci0KLQkJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihiYXNlICsgNCwgNCwgImFkMTg0OCIpOwotCQlpZiAoIXBvcnRzKQotCQkJZ290byBmYWlsZWQyOwotCi0JCWlmICghcHJvYmVfbXNfc291bmQoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcywgcG9ydHMpKSB7Ci0JCQkvKgotCQkJICogSWYgb25lIG9yIG1vcmUgY2FyZHMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCwgZG9uJ3QKLQkJCSAqIHJldHVybiBhbiBlcnJvciBidXQgcHJpbnQgYSB3YXJuaW5nLiAgTm90ZSwgdGhpcwotCQkJICogc2hvdWxkIG5ldmVyIHJlYWxseSBoYXBwZW4gdW5sZXNzIHRoZSBoYXJkd2FyZSBvcgotCQkJICogSVNBIFBuUCBzY3Jld2VkIHVwLgotCQkJICovCi0JCQlyZWxlYXNlX3JlZ2lvbihiYXNlICsgNCwgNCk7Ci0JCWZhaWxlZDI6Ci0JCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCA0KTsKLQkJZmFpbGVkOgotCQkJcmVsZWFzZV9yZWdpb24ob3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuaW9fYmFzZSwgMik7Ci0KLQkJCWlmIChvcGwzc2EyX2NhcmRzX251bSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgUEZYICJUaGVyZSB3YXMgYSBwcm9ibGVtIHByb2Jpbmcgb25lICIKLQkJCQkgICAgICAgIiBvZiB0aGUgSVNBIFBOUCBjYXJkcywgY29udGludWluZ1xuIik7Ci0JCQkJb3BsM3NhMl9jYXJkc19udW0tLTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJYXR0YWNoX29wbDNzYTIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKTsKLQkJY29uZl9wcmludGYob3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0X25hbWUsICZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZyk7Ci0JCWF0dGFjaF9vcGwzc2EyX21peGVyKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgY2FyZCk7Ci0JCWF0dGFjaF9vcGwzc2EyX21zcygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLCBwb3J0cyk7Ci0KLQkJLyogZXd3dyA9KSAqLwotCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNhcmQgPSBjYXJkOwotCi0JCS8qCi0JCSAqIFNldCB0aGUgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKGFrYSBZbWVyc2lvbikgaWYgYXNrZWQgdG8gYW5kCi0JCSAqIGl0J3Mgc3VwcG9ydGVkLgotCQkgKi8KLQkJaWYgKHltb2RlICE9IC0xKSB7Ci0JCQlpZiAob3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID09IENISVBTRVRfT1BMM1NBMikgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICBQRlggInltb2RlIG5vdCBzdXBwb3J0ZWQgb24gT1BMMy1TQTJcbiIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3BsM3NhMl9zZXRfeW1vZGUoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCB5bW9kZSk7Ci0JCQl9Ci0JCX0KLQotCi0JCS8qIFNldCBBL0QgaW5wdXQgdG8gTW9ubyBsb29wYmFjayBpZiBhc2tlZCB0by4gKi8KLQkJaWYgKGxvb3BiYWNrICE9IC0xKSB7Ci0JCQlvcGwzc2EyX3NldF9sb29wYmFjaygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGxvb3BiYWNrKTsKLQkJfQotCQkKLQkJLyogQXR0YWNoIE1QVSBpZiB3ZSd2ZSBiZWVuIGFza2VkIHRvIGRvIHNvLCBmYWlsdXJlIGlzbid0IGZhdGFsICovCi0JCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaW9fYmFzZSAhPSAtMSkgewotCQkJaW50IGJhc2UgPSBvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaW9fYmFzZTsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7Ci0JCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGJhc2UsIDIsICJtcHU0MDEiKTsKLQkJCWlmICghcG9ydHMpCi0JCQkJZ290byBvdXQ7Ci0JCQlpZiAoIXByb2JlX21wdTQwMSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LCBwb3J0cykpIHsKLQkJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAyKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWlmIChhdHRhY2hfbXB1NDAxKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUsIFRISVNfTU9EVUxFKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBhdHRhY2ggTVBVNDAxXG4iKTsKLQkJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuc2xvdHNbMV0gPSAtMTsKLQkJCX0KLQkJfQotCX0KLQotb3V0OgotCWlmIChpc2FwbnApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIFBGWCAiJWQgUG5QIGNhcmQocykgZm91bmQuXG4iLCBvcGwzc2EyX2NhcmRzX251bSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIFVuaW5zdGFsbCBPUEwzLVNBMiBiYXNlZCBjYXJkKHMpLgotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9vcGwzc2EyKHZvaWQpCi17Ci0JaW50IGNhcmQ7Ci0KLQlmb3IoY2FyZCA9IDA7IGNhcmQgPCBvcGwzc2EyX2NhcmRzX251bTsgY2FyZCsrKSB7Ci0JICAgICAgICBpZiAob3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LnNsb3RzWzFdICE9IC0xKSB7Ci0JCQl1bmxvYWRfb3BsM3NhMl9tcHUoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSk7Ci0gCQl9Ci0JCXVubG9hZF9vcGwzc2EyX21zcygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzKTsKLQkJdW5sb2FkX29wbDNzYTIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKTsKLSNpZmRlZiBDT05GSUdfUE5QCi0JCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmb3BsM3NhMl9kcml2ZXIpOwotI2VuZGlmCi0JfQotfQotCi1tb2R1bGVfaW5pdChpbml0X29wbDNzYTIpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9vcGwzc2EyKTsKLQotI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX29wbDNzYTIoY2hhciAqc3RyKQotewotCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiwuLi4gKi8KLSNpZmRlZiBDT05GSUdfUE5QCi0JaW50IGludHNbMTFdOwotI2Vsc2UKLQlpbnQgaW50c1s5XTsKLSNlbmRpZgotCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7Ci0JCi0JaW8gICAgICAgPSBpbnRzWzFdOwotCWlycSAgICAgID0gaW50c1syXTsKLQlkbWEgICAgICA9IGludHNbM107Ci0JZG1hMiAgICAgPSBpbnRzWzRdOwotCW1zc19pbyAgID0gaW50c1s1XTsKLQltcHVfaW8gICA9IGludHNbNl07Ci0JeW1vZGUgICAgPSBpbnRzWzddOwotCWxvb3BiYWNrID0gaW50c1s4XTsKLSNpZmRlZiBDT05GSUdfUE5QCi0JaXNhcG5wICAgPSBpbnRzWzldOwotCW11bHRpcGxlID0gaW50c1sxMF07Ci0jZW5kaWYKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgib3BsM3NhMj0iLCBzZXR1cF9vcGwzc2EyKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3RyaWRlbnQuYyBiL3NvdW5kL29zcy90cmlkZW50LmMKaW5kZXggM2JjMWY2ZS4uOTZhZGM0NyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3RyaWRlbnQuYworKysgYi9zb3VuZC9vc3MvdHJpZGVudC5jCkBAIC0xMSwxMiArMTEsMTIgQEAKICAqICBCdWlsdCBmcm9tOgogICoJTG93IGxldmVsIGNvZGU6IDxhdWRpb0B0cmlkZW50bWljcm8uY29tPiBmcm9tIEFMU0EKICAqCUZyYW1ld29yazogVGhvbWFzIFNhaWxlciA8c2FpbGVyQGlmZS5lZS5ldGh6LmNoPgotICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPiAgCisgKglFeHRlbmRlZCBieTogWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CiAgKgogICogIEhhY2tlZCB1cCBieToKICAqCUFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPgogICoJT2xsaWUgTGhvIDxvbGxpZUBzaXMuY29tLnR3PiBTaVMgNzAxOCBBdWRpbyBDb3JlIFN1cHBvcnQKLSAqCUNoaW5nLUxpbmcgTGVlIDxjbGluZy1saUBhbGkuY29tLnR3PiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQgCisgKglDaGluZy1MaW5nIExlZSA8Y2xpbmctbGlAYWxpLmNvbS50dz4gQUxpIDU0NTEgQXVkaW8gQ29yZSBTdXBwb3J0CiAgKglNYXR0IFd1IDxtYXR0d3VAYWNlcnNvZnRlY2guY29tLmNuPiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKICAqCVBldGVyIFfDpGNodGxlciA8cHdhZWNodGxlckBsb2V3ZS1rb21wLmRlPiBDeWJlclBybzUwNTAgc3VwcG9ydAogICogICAgICBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KQEAgLTU0LDMzICs1NCwzMyBAQAogICoJYWRhcHQgdG8gbmV3IHBjaSBqb3lzdGljayBhdHRhY2htZW50IGludGVyZmFjZQogICogIHYwLjE0LjEwZgogICogICAgICBKdWx5IDI0IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+Ci0gKiAgICAgIHBhdGNoIGZyb20gRXJpYyBMZW1hciAodmlhIElhbiBTb2Jvcm9mZik6IGluIHN1c3BlbmQgYW5kIHJlc3VtZSwgCi0gKiAgICAgIGZpeCB3cm9uZyBjYXN0IGZyb20gcGNpX2RldiogdG8gc3RydWN0IHRyaWRlbnRfY2FyZCouIAorICogICAgICBwYXRjaCBmcm9tIEVyaWMgTGVtYXIgKHZpYSBJYW4gU29ib3JvZmYpOiBpbiBzdXNwZW5kIGFuZCByZXN1bWUsCisgKiAgICAgIGZpeCB3cm9uZyBjYXN0IGZyb20gcGNpX2RldiogdG8gc3RydWN0IHRyaWRlbnRfY2FyZCouCiAgKiAgdjAuMTQuMTBlCiAgKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KLSAqICAgICAgcmV3cml0ZSB0aGUgRE1BIGJ1ZmZlciBhbGxvY2F0aW9uL2RlYWxsY29hdGlvbiBmdW5jdGlvbnMsIHRvIG1ha2UgaXQgCi0gKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5IAotICogICAgICBvYnRhaW5lZCB3aXRoIHBjaV9hbGxvY19jb25zaXN0ZW50LiBBbHNvIHJlbW92ZSB1bm5lY2Vzc2FyeSAjaWZkZWYgCisgKiAgICAgIHJld3JpdGUgdGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbi9kZWFsbGNvYXRpb24gZnVuY3Rpb25zLCB0byBtYWtlIGl0CisgKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5CisgKiAgICAgIG9idGFpbmVkIHdpdGggcGNpX2FsbG9jX2NvbnNpc3RlbnQuIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZgogICogICAgICBDT05GSUdfUFJPQ19GUyBhbmQgdmFyaW91cyBvdGhlciBjbGVhbnVwcy4KICAqICB2MC4xNC4xMGQKICAqICAgICAgSnVseSAxOSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogICogICAgICBtYWRlIHNldmVyYWwgcHJpbnRrKEtFUk5fTk9USUNFLi4uKSBpbnRvIFRSREJHKC4uLiksIHRvIGF2b2lkIHNwYW1taW5nCi0gKiAgICAgIG15IHN5c2xvZyB3aXRoIGh1bmRyZWRzIG9mIG1lc3NhZ2VzLiAKKyAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuCiAgKiAgdjAuMTQuMTBjCiAgKiAgICAgIEp1bHkgMTYgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICAqICAgICAgQ2xlYW5lZCB1cCBMZWkgSHUncyAwLjQuMTAgZHJpdmVyIHRvIGNvbmZvcm0gdG8gRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQotICogICAgICBhbmQgdGhlIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAKKyAqICAgICAgYW5kIHRoZSBjb2Rpbmcgc3R5bGUgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS4KICAqICB2MC4xNC4xMGIKICAqICAgICAgSnVuZSAyMyAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgotICogICAgICBhZGQgYSBtaXNzaW5nIHVubG9ja19zZXRfZm10LCByZW1vdmUgYSBzdXBlcmZsb3VzIGxvY2svdW5sb2NrIHBhaXIgCi0gKiAgICAgIHdpdGggbm90aGluZyBpbiBiZXR3ZWVuLiAKKyAqICAgICAgYWRkIGEgbWlzc2luZyB1bmxvY2tfc2V0X2ZtdCwgcmVtb3ZlIGEgc3VwZXJmbG91cyBsb2NrL3VubG9jayBwYWlyCisgKiAgICAgIHdpdGggbm90aGluZyBpbiBiZXR3ZWVuLgogICogIHYwLjE0LjEwYQotICogICAgICBKdW5lIDIxIDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+IAotICogICAgICB1c2UgYSBkZWJ1ZyBtYWNybyBpbnN0ZWFkIG9mICNpZmRlZiBDT05GSUdfREVCVUcsIHRyaW0gdG8gODAgY29sdW1ucyAKLSAqICAgICAgcGVyIGxpbmUsIHVzZSAnZG8ge30gd2hpbGUgKDApJyBpbiBzdGF0ZW1lbnQgbWFjcm9zLiAKKyAqICAgICAgSnVuZSAyMSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgorICogICAgICB1c2UgYSBkZWJ1ZyBtYWNybyBpbnN0ZWFkIG9mICNpZmRlZiBDT05GSUdfREVCVUcsIHRyaW0gdG8gODAgY29sdW1ucworICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuCiAgKiAgdjAuMTQuMTAKICAqICAgICAgSnVuZSA2IDIwMDIgTGVpIEh1IDxMZWlfaHVAYWxpLmNvbS50dz4KLSAqICAgICAgcmV3cml0ZSB0aGUgcGFydCB0byByZWFkL3dyaXRlIHJlZ2lzdGVycyBvZiBhdWRpbyBjb2RlYyBmb3IgQWxpNTQ1MSAKKyAqICAgICAgcmV3cml0ZSB0aGUgcGFydCB0byByZWFkL3dyaXRlIHJlZ2lzdGVycyBvZiBhdWRpbyBjb2RlYyBmb3IgQWxpNTQ1MQogICogIHYwLjE0LjllCiAgKiAgICAgIEphbnVhcnkgMiAyMDAyIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4gYWRkZWQgZ2FtZXBvcnQKICAqICAgICAgc3VwcG9ydCB0byBhdm9pZCByZXNvdXJjZSBjb25mbGljdCB3aXRoIHBjaWdhbWUuYwpAQCAtMTExLDcgKzExMSw3IEBACiAgKglTZXQgRUJVRjEgYW5kIEVCVUYyIHRvIHN0aWxsIG1vZGUKICAqCUFkZCBkYzk3L2FjOTcgcmVzZXQgZnVuY3Rpb24KICAqCUZpeCBwb3dlciBtYW5hZ2VtZW50OiBhbGlfcmVzdG9yZV9yZWdzCi0gKiAgdW5yZWxlYXNlZCAKKyAqICB1bnJlbGVhc2VkCiAgKglNYXIgMDkgMjAwMSBNYXR0IFd1CiAgKglBZGQgY2FjaGUgZm9yIGFjOTcgYWNjZXNzCiAgKiAgdjAuMTQuNwpAQCAtMTIwLDcgKzEyMCw3IEBACiAgKglGaXggYnVnOiBhbiBleHRyYSB0YWlsIHdpbGwgYmUgcGxheWVkIHdoZW4gcGxheWluZwogICoJSmFuIDA1IDIwMDEgTWF0dCBXdQogICoJSW1wbGVtZW50IG11bHRpLWNoYW5uZWxzIGFuZCBTL1BESUYgaW4gc3VwcG9ydCBmb3IgQUxpIDE1MzUrCi0gKiAgdjAuMTQuNiAKKyAqICB2MC4xNC42CiAgKglOb3YgMSAyMDAwIENoaW5nLUxpbmcgTGVlCiAgKglGaXggdGhlIGJ1ZyBvZiBtZW1vcnkgbGVhayB3aGVuIHN3aXRjaGluZyA1LjEtY2hhbm5lbHMgdG8gMiBjaGFubmVscy4KICAqCUFkZCBsb2NrIHByb3RlY3Rpb24gaW50byBkeW5hbWljIGNoYW5naW5nIGZvcm1hdCBvZiBkYXRhLgpAQCAtMTM4LDcgKzEzOCw3IEBACiAgKiAgdjAuMTQuMyBNYXkgMTAgMjAwMCBPbGxpZSBMaG8KICAqCWZpeGVkIGEgc21hbGwgYnVnIGluIHRyaWRlbnRfdXBkYXRlX3B0ciwgeG1tcyAxLjAuMSBubyBsb25nZXIgdXNlcyAxMDAlIENQVQogICogIHYwLjE0LjIgTWFyIDI5IDIwMDAgQ2hpbmctTGluZyBMZWUKLSAqCUFkZCBjbGVhciB0byBzaWxlbmNlIGFkdmFuY2UgaW4gdHJpZGVudF91cGRhdGVfcHRyIAorICoJQWRkIGNsZWFyIHRvIHNpbGVuY2UgYWR2YW5jZSBpbiB0cmlkZW50X3VwZGF0ZV9wdHIKICAqCWZpeCBpbnZhbGlkIGRhdGEgb2YgdGhlIGVuZCBvZiB0aGUgc291bmQKICAqICB2MC4xNC4xIE1hciAyNCAyMDAwIENoaW5nLUxpbmcgTGVlCiAgKglBTGkgNTQ1MSBzdXBwb3J0IGFkZGVkLCBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIE8uSy4KQEAgLTE3OCw3ICsxNzgsNyBAQAogICoJU2lTIDcwMTggc3VwcG9ydCBhZGRlZCwgcGxheWJhY2sgTy5LLgogICogIHYwLjAxIEFsYW4gQ294IGV0LiBhbC4KICAqCUluaXRpYWwgUmVsZWFzZSBpbiBrZXJuZWwgMi4zLjMwLCBkb2VzIG5vdCB3b3JrCi0gKiAKKyAqCiAgKiAgVG9EbwogICoJQ2xlYW4gdXAgb2YgbG93IGxldmVsIGNoYW5uZWwgcmVnaXN0ZXIgYWNjZXNzIGNvZGUuIChkb25lKQogICoJRml4IHRoZSBidWcgb24gZG1hIGJ1ZmZlciBtYW5hZ2VtZW50IGluIHVwZGF0ZV9wdHIsIHJlYWQvd3JpdGUsIGRyYWluX2RhYyAoZG9uZSkKQEAgLTMyNiw3ICszMjYsNyBAQAogCiAJCXVuc2lnbmVkIGVycm9yOwkvKiBudW1iZXIgb2Ygb3Zlci91bmRlcnJ1bnMgKi8KICAgICAgICAgICAgICAgICAvKiBwdXQgcHJvY2VzcyBvbiB3YWl0IHF1ZXVlIHdoZW4gbm8gbW9yZSBzcGFjZSBpbiBidWZmZXIgKi8KLQkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsJCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CiAKIAkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLwogCQl1bnNpZ25lZCBmcmFnc2l6ZTsKQEAgLTM1OCw3ICszNTgsNyBAQAogc3RydWN0IHRyaWRlbnRfY2hhbm5lbCB7CiAJaW50IG51bTsgLyogY2hhbm5lbCBudW1iZXIgKi8KIAl1MzIgbGJhOyAvKiBMb29wIEJlZ2luZSBBZGRyZXNzLCB3aGVyZSBkbWEgYnVmZmVyIHN0YXJ0cyAqLwotCXUzMiBlc287IC8qIEVuZCBTYW1wbGUgT2Zmc2V0LCB3ZWhyZSBkbWEgYnVmZmVyIGVuZHMgKi8gCisJdTMyIGVzbzsgLyogRW5kIFNhbXBsZSBPZmZzZXQsIHdlaHJlIGRtYSBidWZmZXIgZW5kcyAqLwogCSAgICAgICAgIC8qIChpbiB0aGUgdW5pdCBvZiBzYW1wbGVzKSAqLwogCXUzMiBkZWx0YTsgLyogZGVsdGEgdmFsdWUsIHNhbXBsZSByYXRlIC8gNDhrIGZvciBwbGF5YmFjaywgKi8KIAkgICAgICAgICAgIC8qIDQ4ay9zYW1wbGUgcmF0ZSBmb3IgcmVjb3JkaW5nICovCkBAIC00MTcsNyArNDE3LDcgQEAKIAkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KIAlpbnQgZGV2X2F1ZGlvOwogCi0JLyogc3RydWN0dXJlcyBmb3IgYWJzdHJhY3Rpb24gb2YgaGFyZHdhcmUgZmFjaWxpdGllcywgY29kZWNzLCAqLyAKKwkvKiBzdHJ1Y3R1cmVzIGZvciBhYnN0cmFjdGlvbiBvZiBoYXJkd2FyZSBmYWNpbGl0aWVzLCBjb2RlY3MsICovCiAJLyogYmFua3MgYW5kIGNoYW5uZWxzICovCiAJc3RydWN0IGFjOTdfY29kZWMgKmFjOTdfY29kZWNbTlJfQUM5N107CiAJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgYmFua3NbTlJfQkFOS1NdOwpAQCAtNDc5LDcgKzQ3OSw3IEBACiBzdGF0aWMgdTE2IHRyaWRlbnRfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpOwogCiBzdGF0aWMgaW50IHRyaWRlbnRfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCB0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCitzdGF0aWMgaW50IHRyaWRlbnRfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogc3RhdGljIHZvaWQgYWxpX2FjOTdfc2V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBzZWNvbmRhcnksIHU4IHJlZywgdTE2IHZhbCk7CkBAIC00OTYsMTAgKzQ5NiwxMCBAQAogc3RhdGljIHZvaWQgYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaCk7CiBzdGF0aWMgdm9pZCBhbGlfc2V0dXBfc3BkaWZfb3V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBmbGFnKTsKIHN0YXRpYyBpbnQgYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsCi0JCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgCi0JCQkgaW50IGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgdW5zaWduZWQgaW50ICpjb3B5X2NvdW50LCAKKwkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwKIAkJCSB1bnNpZ25lZCBpbnQgKnN0YXRlX2NudCk7Ci1zdGF0aWMgaW50IGFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgCitzdGF0aWMgaW50IGFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwKIAkJCQkJICAgICAgIGludCBjaGFuX251bXMpOwogc3RhdGljIHZvaWQgYWxpX2ZyZWVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpOwogCkBAIC03MjIsNyArNzIyLDcgQEAKIAlpZiAoY2hhbm5lbCA8IDMxIHx8IGNoYW5uZWwgPiA2MykKIAkJcmV0dXJuOwogCi0JaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYIHx8IAorCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWCB8fAogCSAgICBjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWCkgewogCQliID0gaW5iKFRSSURfUkVHKGNhcmQsIFQ0RF9SRUNfQ0gpKTsKIAkJaWYgKChiICYgfjB4ODApID09IGNoYW5uZWwpCkBAIC03NDIsNyArNzQyLDcgQEAKIAlpbnQgaWR4OwogCiAJLyogVGhlIGN5YmVycHJvIDUwNTAgaGFzIG9ubHkgMzIgdm9pY2VzIGFuZCBvbmUgYmFuayAqLwotCS8qIC4uIGF0IGxlYXN0IHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIChpZiB5b3Ugd2FudCB0byBjYWxsIHRoYXQgCisJLyogLi4gYXQgbGVhc3QgdGhleSBhcmUgbm90IGRvY3VtZW50ZWQgKGlmIHlvdSB3YW50IHRvIGNhbGwgdGhhdAogCSAqIGNyYXAgZG9jdW1lbnRhdGlvbiksIHBlcmhhcHMgYnJva2VuID8gKi8KIAogCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKQEAgLTgwMiw3ICs4MDIsNyBAQAogCS8qIGVuYWJsZSwgaWYgaXQgd2FzIGRpc2FibGVkICovCiAJaWYgKChwb3J0RGF0ICYgQ1lCRVJfQk1TS19BVUVOWikgIT0gQ1lCRVJfQk1TS19BVUVOWl9FTkFCTEUpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiY3liZXJwcm81MDUwOiBlbmFibGluZyBhdWRpbyBjb250cm9sbGVyXG4iKTsKLQkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUsIAorCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSwKIAkJCSAgICAgcG9ydERhdCB8IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKTsKIAkJLyogY2hlY2sgYWdhaW4gaWYgaGFyZHdhcmUgaXMgZW5hYmxlZCBub3cgKi8KIAkJcG9ydERhdCA9IGN5YmVyX2luaWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUpOwpAQCAtODExLDcgKzgxMSw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiY3liZXJwcm81MDUwOiBpbml0QXVkaW9BY2Nlc3M6IG5vIHN1Y2Nlc3NcbiIpOwogCQlyZXQgPSAtMTsKIAl9IGVsc2UgewotCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0lSUV9FTkFCTEUsIAorCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0lSUV9FTkFCTEUsCiAJCQkgICAgIENZQkVSX0JNU0tfQVVESU9fSU5UX0VOQUJMRSk7CiAJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJmLCAweDAxKTsKIAkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmEsIDB4MjApOwpAQCAtODI3LDcgKzgyNyw3IEBACiAvKiAgY2FsbGVkIHdpdGggc3BpbiBsb2NrIGhlbGQgKi8KIAogc3RhdGljIGludAotdHJpZGVudF9sb2FkX2NoYW5uZWxfcmVnaXN0ZXJzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHUzMiAqIGRhdGEsIAordHJpZGVudF9sb2FkX2NoYW5uZWxfcmVnaXN0ZXJzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHUzMiAqIGRhdGEsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CiAJaW50IGk7CkBAIC04NDUsNyArODQ1LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlvdXRsKGRhdGFbaV0sIFRSSURfUkVHKGNhcmQsIENIQU5ORUxfU1RBUlQgKyA0ICogaSkpOwogCX0KLQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwgCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8CiAJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CiAJCW91dGwoQUxJX0VNT0RfU3RpbGwsIFRSSURfUkVHKGNhcmQsIEFMSV9FQlVGMSkpOwogCQlvdXRsKEFMSV9FTU9EX1N0aWxsLCBUUklEX1JFRyhjYXJkLCBBTElfRUJVRjIpKTsKQEAgLTg4NCw3ICs4ODQsNyBAQAogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CiAJCWRhdGFbMF0gPSAoY2hhbm5lbC0+ZGVsdGEgPDwgMjQpOwotCQlkYXRhWzJdID0gKChjaGFubmVsLT5kZWx0YSA8PCAxNikgJiAweGZmMDAwMDAwKSB8IAorCQlkYXRhWzJdID0gKChjaGFubmVsLT5kZWx0YSA8PCAxNikgJiAweGZmMDAwMDAwKSB8CiAJCQkoY2hhbm5lbC0+ZXNvICYgMHgwMGZmZmZmZik7CiAJCWRhdGFbM10gPSBjaGFubmVsLT5mbV92b2wgJiAweGZmZmY7CiAJCWJyZWFrOwpAQCAtOTg5LDEzICs5ODksMTMgQEAKIAlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKIAkJY2hhbm5lbC0+YXR0cmlidXRlID0gMDsKIAkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewotCQkJaWYgKChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpIHx8IAorCQkJaWYgKChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpIHx8CiAJCQkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfUENNX0lOX0NIQU5ORUwpKQogCQkJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdGF0ZS0+Y2FyZCwgY2hhbm5lbC0+bnVtKTsKLQkJCWVsc2UgaWYgKChpbmwoVFJJRF9SRUcoc3RhdGUtPmNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpIAorCQkJZWxzZSBpZiAoKGlubChUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkKIAkJCQkgICYgQUxJX1NQRElGX09VVF9DSF9FTkFCTEUpCiAJCQkJICYmIChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX09VVF9DSEFOTkVMKSkgewotCQkJCWFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RhdGUtPmNhcmQsIAorCQkJCWFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RhdGUtPmNhcmQsCiAJCQkJCQkgICAgICAgc3RhdGUtPmRtYWJ1Zi5yYXRlKTsKIAkJCQlzdGF0ZS0+ZG1hYnVmLmNoYW5uZWwtPmRlbHRhID0gMHgxMDAwOwogCQkJfQpAQCAtMTA2Myw3ICsxMDYzLDcgQEAKIAogCWNoYW5uZWwtPmxiYSA9IGRtYWJ1Zi0+ZG1hX2hhbmRsZTsKIAljaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9yZWMoZG1hYnVmLT5yYXRlKTsKLQlpZiAoKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSAmJiAKKwlpZiAoKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSAmJgogCSAgICAoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSkgewogCQlyYXRlID0gYWxpX2dldF9zcGRpZl9pbl9yYXRlKGNhcmQpOwogCQlpZiAocmF0ZSA9PSAwKSB7CkBAIC0xMTgwLDggKzExODAsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWlmICgoZG1hYnVmLT5tYXBwZWQgfHwgCi0JICAgICBkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplKSAmJiAKKwlpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8CisJICAgICBkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplKSAmJgogCSAgICBkbWFidWYtPnJlYWR5KSB7CiAJCWRtYWJ1Zi0+ZW5hYmxlIHw9IEFEQ19SVU5OSU5HOwogCQl0cmlkZW50X2VuYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOwpAQCAtMTI2MSw3ICsxMjYxLDcgQEAKIAl2b2lkICpyYXdidWYgPSBOVUxMOwogCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKIAotCWlmICghKHJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgCisJaWYgKCEocmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLAogCQkJCQkgICAgJmRtYWJ1Zi0+ZG1hX2hhbmRsZSkpKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTI3Miw3ICsxMjcyLDcgQEAKIAlkbWFidWYtPnJhd2J1ZiA9IHJhd2J1ZjsKIAlkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7CiAKLQkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSAqLyAKKwkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSAqLwogCS8qIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLwogCXBlbmQgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKTsKIAlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCkBAIC0xMzEwLDcgKzEzMTAsNyBAQAogCQlwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOwogCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKIAkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyLCAKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlciwKIAkJCQkgICAgZG1hYnVmLT5yYXdidWYsIGRtYWJ1Zi0+ZG1hX2hhbmRsZSk7CiAJCWRtYWJ1Zi0+cmF3YnVmID0gTlVMTDsKIAl9CkBAIC0xMzY4LDcgKzEzNjgsNyBAQAogCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPmRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOwogCQkJCQkvKiByZWxlYXNlIHRoZSBhdXhpbGlhcnkgRE1BIGJ1ZmZlcnMgKi8KIAkJCQkJZm9yIChpIC09IDI7IGkgPj0gMDsgaS0tKQotCQkJCQkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZiwgCisJCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLAogCQkJCQkJCSAgICAgICBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CiAJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKIAkJCQkJcmV0dXJuIHJldDsKQEAgLTEzOTgsNyArMTM5OCw3IEBACiAJCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSBkbWFidWYtPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CiAJCWRtYWJ1Zi0+ZG1hc2l6ZSA9IGRtYWJ1Zi0+bnVtZnJhZyA8PCBkbWFidWYtPmZyYWdzaGlmdDsKIAotCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IDAgOiAweDgwLCAKKwkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwKIAkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKQEAgLTE0NTMsNyArMTQ1Myw3IEBACiAJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoc3dwdHIgPT0gMCB8fCBzd3B0ciA9PSBkbWFidWYtPmRtYXNpemUgLyAyIHx8IAorCWlmIChzd3B0ciA9PSAwIHx8IHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIgfHwKIAkgICAgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplKQogCQlyZXR1cm47CiAKQEAgLTE1MTEsNyArMTUxMSw3IEBACiAKIAkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIGRhdGEgaXMgbGVmdCBpbiB0aGUgYnVmZmVyLCB3ZSBoYXZlIHRvIHdhaXQgdW50aWwKIAkJICAgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gd2hlbiBhZGRyZXNzIGVuZ2luZSBpbnRlcnJ1cHRzICovCi0JCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwgCisJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwKIAkJICAgIHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewogCQkJZGlmZiA9IGRtYWJ1Zi0+c3dwdHIgLSB0cmlkZW50X2dldF9kbWFfYWRkcihzdGF0ZSkgKyBkbWFidWYtPmRtYXNpemU7CiAJCQlkaWZmID0gZGlmZiAlIChkbWFidWYtPmRtYXNpemUpOwpAQCAtMTUzMiw3ICsxNTMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgKi8gCisvKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCAqLwogLyogZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLwogc3RhdGljIHZvaWQKIHRyaWRlbnRfdXBkYXRlX3B0cihzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCkBAIC0xNTU5LDExICsxNTU5LDExIEBACiAJCX0gZWxzZSB7CiAJCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7CiAKLQkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCAKKwkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fAogCQkJICAgIGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKLQkJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sICovIAotCQkJCS8qIHdlIGhhdmUgbm8gd2F5IHRvIHJlY292ZXIgaXQgaGVyZSwganVzdCAqLyAKLQkJCQkvKiBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgKi8gCisJCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCAqLworCQkJCS8qIHdlIGhhdmUgbm8gd2F5IHRvIHJlY292ZXIgaXQgaGVyZSwganVzdCAqLworCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLwogCQkJCS8qIGZvcmNlIGh3cHRyIGFuZCBzd3B0ciB0byBzeW5jICovCiAJCQkJX19zdG9wX2FkYyhzdGF0ZSk7CiAJCQkJZG1hYnVmLT5lcnJvcisrOwpAQCAtMTU4Miw3ICsxNTgyLDcgQEAKIAkJfSBlbHNlIHsKIAkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKIAotCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8IAorCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8CiAJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewogCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlcgogCQkJCSAgIGl0IGhlcmUsIGp1c3Qgc3RvcCB0aGUgbWFjaGluZSBhbmQgbGV0IHRoZSBwcm9jZXNzIGZvcmNlIGh3cHRyCkBAIC0xNjA4LDEzICsxNjA4LDEzIEBACiAJCQkJCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CiAJCQkJCQkJY2xlYXJfY250ID0gY2xlYXJfY250IC8gMjsKIAkJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKLQkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwogCQkJCQkJfQogCQkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKQEAgLTE2MjcsMTMgKzE2MjcsMTMgQEAKIAkJCQkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewogCQkJCQkJY2xlYXJfY250ID0gY2xlYXJfY250IC8gMjsKIAkJCQkJCXN3cHRyID0gc3dwdHIgLyAyOwotCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CiAJCQkJCX0KIAkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKQEAgLTE2NjUsNyArMTY2NSw3IEBACiAJCQlpZiAoKHN0YXRlID0gY2FyZC0+c3RhdGVzW2ldKSAhPSBOVUxMKSB7CiAJCQkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogc3B1cmlvdXMgY2hhbm5lbCAiIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyaWRlbnQ6IHNwdXJpb3VzIGNoYW5uZWwgIgogCQkJCSAgICAgICAiaXJxICVkLlxuIiwgY2hhbm5lbCk7CiAJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGNoYW5uZWwpOwogCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbm5lbCk7CkBAIC0xNjk0LDcgKzE2OTQsNyBAQAogCiAJaWYgKG9wdCA9PSAxKSB7CQkvLyBNVVRFCiAJCWR3VGVtcCBePSAweDgwMDA7Ci0JCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIAorCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLAogCQkJICAgICAgIDB4MDIsIGR3VGVtcCk7CiAJfSBlbHNlIGlmIChvcHQgPT0gMikgewkvLyBEb3duCiAJCWlmIChtdXRlKQpAQCAtMTcwNiw3ICsxNzA2LDcgQEAKIAkJZHdUZW1wICY9IDB4ZTBlMDsKIAkJZHdUZW1wIHw9ICh2b2x1bWVbMF0pIHwgKHZvbHVtZVsxXSA8PCA4KTsKIAkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgwMiwgZHdUZW1wKTsKLQkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKKwkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfAogCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKIAl9IGVsc2UgaWYgKG9wdCA9PSA0KSB7CS8vIFVwCiAJCWlmIChtdXRlKQpAQCAtMTcxOCw3ICsxNzE4LDcgQEAKIAkJZHdUZW1wICY9IDB4ZTBlMDsKIAkJZHdUZW1wIHw9ICh2b2x1bWVbMF0pIHwgKHZvbHVtZVsxXSA8PCA4KTsKIAkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgwMiwgZHdUZW1wKTsKLQkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKKwkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfAogCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKIAl9IGVsc2UgewogCQkvKiBOb3RoaW5nIG5lZWRzIGRvaW5nICovCkBAIC0xODAxLDcgKzE4MDEsNyBAQAogCQkJaWYgKChzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSkgIT0gTlVMTCkgewogCQkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CiAJCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImN5YmVyNTA1MDogc3B1cmlvdXMgIiAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeWJlcjUwNTA6IHNwdXJpb3VzICIKIAkJCQkgICAgICAgImNoYW5uZWwgaXJxICVkLlxuIiwgY2hhbm5lbCk7CiAJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGNoYW5uZWwpOwogCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbm5lbCk7CkBAIC0xODM2LDIxICsxODM2LDIxIEBACiAJCQkJYWxpX3F1ZXVlX3Rhc2soY2FyZCwgZ3BpbyAmIDB4MDcpOwogCQl9CiAJCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7Ci0JCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAorCQlvdXRsKGV2ZW50IHwgKFNUX1RBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLAogCQkgICAgIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CiAJCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIAogCS8qIG1hbnVhbGx5IGNsZWFyIGludGVycnVwdCBzdGF0dXMsIGJhZCBoYXJkd2FyZSBkZXNpZ24sIGJsYW1lIFReMiAqLwotCW91dGwoKFNUX1RBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLCAKKwlvdXRsKChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwKIAkgICAgIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CiAJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgKi8gCi0vKiB0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKy8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nICovCisvKiB0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLwogLyogZHJhaW5lZCBieSB0aGlzIGxvb3AuICovCiBzdGF0aWMgc3NpemVfdAogdHJpZGVudF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCkBAIC0xODc4LDggKzE4NzgsOCBAQAogCXdoaWxlIChjb3VudCA+IDApIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CiAJCWlmIChkbWFidWYtPmNvdW50ID4gKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplKSB7Ci0JCQkvKiBidWZmZXIgb3ZlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLyAKLQkJCS8qIHNsZWVwX29uX3RpbWVvdXQsIHJlc3luYyBod3B0ciBhbmQgc3dwdHIsICovIAorCQkJLyogYnVmZmVyIG92ZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8KKwkJCS8qIHNsZWVwX29uX3RpbWVvdXQsIHJlc3luYyBod3B0ciBhbmQgc3dwdHIsICovCiAJCQkvKiBtYWtlIHByb2Nlc3MgZmx1c2ggdGhlIGJ1ZmZlciAqLwogCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKIAkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwpAQCAtMTg5NCw3ICsxODk0LDcgQEAKIAkJCWNudCA9IGNvdW50OwogCQlpZiAoY250IDw9IDApIHsKIAkJCXVuc2lnbmVkIGxvbmcgdG1vOwotCQkJLyogYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAorCQkJLyogYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovCiAJCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHJlY29yZGVkICovCiAJCQlzdGFydF9hZGMoc3RhdGUpOwogCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CkBAIC0xOTA0LDggKzE5MDQsOCBAQAogCQkJfQogCiAJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIHNwYWNlIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCi0JCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCisJCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggc3BhY2UgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLworCQkJLyogd2UgaGF2ZSB0byB3YWl0IHVudGlsIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPICovCiAJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KIAkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CiAJCQl0bW8gPj49IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CkBAIC0yMDA1LDcgKzIwMDUsNyBAQAogCXdoaWxlIChjb3VudCA+IDApIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CiAJCWlmIChkbWFidWYtPmNvdW50IDwgMCkgewotCQkJLyogYnVmZmVyIHVuZGVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAorCQkJLyogYnVmZmVyIHVuZGVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovCiAJCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyICovCiAJCQlkbWFidWYtPmNvdW50ID0gMDsKIAkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwpAQCAtMjAyMCw3ICsyMDIwLDcgQEAKIAkJCWNudCA9IGNvdW50OwogCQlpZiAoY250IDw9IDApIHsKIAkJCXVuc2lnbmVkIGxvbmcgdG1vOwotCQkJLyogYnVmZmVyIGlzIGZ1bGwsIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCisJCQkvKiBidWZmZXIgaXMgZnVsbCwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLwogCQkJLyogd2FpdCBmb3IgZGF0YSB0byBiZSBwbGF5ZWQgKi8KIAkJCXN0YXJ0X2RhYyhzdGF0ZSk7CiAJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKQEAgLTIwMjgsOCArMjAyOCw4IEBACiAJCQkJCXJldCA9IC1FQUdBSU47CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIsICovIAotCQkJLyogd2UgaGF2ZSB0byB3YWl0IHVudGlsIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPICovIAorCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIGRhdGEgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLworCQkJLyogd2UgaGF2ZSB0byB3YWl0IHVudGlsIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPICovCiAJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KIAkJCWxvY2tfc2V0X2ZtdChzdGF0ZSk7CiAJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSAqIDIpOwpAQCAtMjAzNywxNSArMjAzNywxNSBAQAogCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwogCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKIAotCQkJLyogVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIHdoZW4gc2xlZXBfb25fdGltZW91dCAqLyAKLQkJCS8qIHJldHVybnMsIG9uZSBpcyB3aGVuIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgKi8gCi0JCQkvKiBjb3JyZWN0bHkgYW5kIHRoZSBwcm9jZXNzIGlzIHdha2VkIHVwIGJ5IElTUiAqLyAKLQkJCS8qIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoICovIAotCQkJLyogbWVhbnMgdGhhdCBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCAqLyAKLQkJCS8qIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0IGlzIFRPTyBMQVRFICovIAotCQkJLyogZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKi8gCi0JCQkvKiAoc2NoZWR1bGVyIGxhdGVuY3kpIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSAqLyAKLQkJCS8qIGJ1ZmZlciB1bmRlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcyBOT1RISU5HIHdlICovIAorCQkJLyogVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIHdoZW4gc2xlZXBfb25fdGltZW91dCAqLworCQkJLyogcmV0dXJucywgb25lIGlzIHdoZW4gdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCAqLworCQkJLyogY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieSBJU1IgKi8KKwkJCS8qIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoICovCisJCQkvKiBtZWFucyB0aGF0IGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkICovCisJCQkvKiBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdCBpcyBUT08gTEFURSAqLworCQkJLyogZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKi8KKwkJCS8qIChzY2hlZHVsZXIgbGF0ZW5jeSkgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpICovCisJCQkvKiBidWZmZXIgdW5kZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMgTk9USElORyB3ZSAqLwogCQkJLyogY2FuIGRvIHRvIHByZXZlbnQgaXQuICovCiAJCQlpZiAoIWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmZG1hYnVmLT53YWl0LCB0bW8pKSB7CiAJCQkJcHJfZGVidWcoS0VSTl9FUlIgInRyaWRlbnQ6IHBsYXliYWNrIHNjaGVkdWxlICIKQEAgLTIwNTQsOCArMjA1NCw4IEBACiAJCQkJCSBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAogCQkJCQkgZG1hYnVmLT5od3B0ciwgZG1hYnVmLT5zd3B0cik7CiAKLQkJCQkvKiBhIGJ1ZmZlciB1bmRlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5ICovIAotCQkJCS8qIHVudGlsIG5leHQgdGltZSB0aGUgd2hpbGUgbG9vcCBiZWdpbiBhbmQgKi8gCisJCQkJLyogYSBidWZmZXIgdW5kZXJydW4sIHdlIGRlbGF5IHRoZSByZWNvdmVyeSAqLworCQkJCS8qIHVudGlsIG5leHQgdGltZSB0aGUgd2hpbGUgbG9vcCBiZWdpbiBhbmQgKi8KIAkJCQkvKiB3ZSBSRUFMTFkgaGF2ZSBkYXRhIHRvIHBsYXkgKi8KIAkJCX0KIAkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewpAQCAtMjA3OSw3ICsyMDc5LDcgQEAKIAkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewogCQkJY29weV9jb3VudCA9IDA7CiAJCQlzdGF0ZV9jbnQgPSAwOwotCQkJaWYgKGFsaV93cml0ZV81XzEoc3RhdGUsIGJ1ZmZlciwgY250LCAmY29weV9jb3VudCwgCisJCQlpZiAoYWxpX3dyaXRlXzVfMShzdGF0ZSwgYnVmZmVyLCBjbnQsICZjb3B5X2NvdW50LAogCQkJCQkgICZzdGF0ZV9jbnQpID09IC1FRkFVTFQpIHsKIAkJCQlpZiAoc3RhdGVfY250KSB7CiAJCQkJCXN3cHRyID0gKHN3cHRyICsgc3RhdGVfY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKQEAgLTIwOTYsNyArMjA5Niw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBjbnQpKSB7CiAJCQkJaWYgKCFyZXQpCiAJCQkJCXJldCA9IC1FRkFVTFQ7CkBAIC0yMTcyLDcgKzIxNzIsNyBAQAogCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKIAkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCQl9IGVsc2UgewotCQkJaWYgKChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50ICsgCisJCQlpZiAoKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplID49IGRtYWJ1Zi0+Y291bnQgKwogCQkJICAgIChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCiAJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAkJfQpAQCAtMjIyNyw3ICsyMjI3LDcgQEAKIH0KIAogc3RhdGljIGludAotdHJpZGVudF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCit0cmlkZW50X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTIzNDgsNyArMjM0OCw3IEBACiAKIAogCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAqLwotCQlyZXQgPSBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8IAorCQlyZXQgPSBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8CiAJCQkgICAgICAgQUZNVF9VOCwgcCk7CiAJCWJyZWFrOwogCkBAIC0yMzc5LDcgKzIzNzksNyBAQAogCQkJfQogCQl9CiAJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKLQkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKKwkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOgogCQkJICAgICAgIEFGTVRfVTgsIHApOwogCQlicmVhazsKIApAQCAtMjQzOCw3ICsyNDM4LDcgQEAKIAkJCQlzdG9wX2FkYyhzdGF0ZSk7CiAJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CiAJCQkJaWYgKHZhbCA+PSAyKSB7Ci0JCQkJCWlmICghKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgCisJCQkJCWlmICghKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKIAkJCQkJICAgICAgKHZhbCA9PSA2KSkpCiAJCQkJCQl2YWwgPSAyOwogCQkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CkBAIC0yNTA0LDcgKzI1MDQsNyBAQAogCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+bnVtZnJhZzsKIAkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZiAoYWJpbmZvKSkgPyAKKwkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZiAoYWJpbmZvKSkgPwogCQkJLUVGQVVMVCA6IDA7CiAJCWJyZWFrOwogCkBAIC0yNTI0LDcgKzI1MjQsNyBAQAogCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+bnVtZnJhZzsKIAkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZiAoYWJpbmZvKSkgPyAKKwkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZiAoYWJpbmZvKSkgPwogCQkJLUVGQVVMVCA6IDA7CiAJCWJyZWFrOwogCkBAIC0yNTMzLDcgKzI1MzMsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlyZXQgPSBwdXRfdXNlcihEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgCisJCXJldCA9IHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfAogCQkJICAgICAgIERTUF9DQVBfTU1BUCB8IERTUF9DQVBfQklORCwgcCk7CiAJCWJyZWFrOwogCkBAIC0yNTUzLDcgKzI1NTMsNyBAQAogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CiAJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewotCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYKIAkJCQkgICAgKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQogCQkJCQlicmVhazsKIAkJCQlzdGFydF9hZGMoc3RhdGUpOwpAQCAtMjU2Miw3ICsyNTYyLDcgQEAKIAkJfQogCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKIAkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewotCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYKIAkJCQkgICAgKHJldCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkpCiAJCQkJCWJyZWFrOwogCQkJCXN0YXJ0X2RhYyhzdGF0ZSk7CkBAIC0yNTg5LDcgKzI1ODksNyBAQAogCQlpZiAoZG1hYnVmLT5tYXBwZWQpCiAJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAKKwkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8KIAkJCS1FRkFVTFQgOiAwOwogCQlicmVhazsKIApAQCAtMjYxMiw3ICsyNjEyLDcgQEAKIAkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQogCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmZyYWdzaXplIC0gMTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8gCisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/CiAJCQktRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKQEAgLTI2NDEsMTcgKzI2NDEsMTcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgotCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pID8gMiA6IDEsIAorCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pID8gMiA6IDEsCiAJCQkgICAgICAgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6IAorCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6CiAJCQkgICAgICAgQUZNVF9VOCwgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLOgotCQlyZXQgPSBwdXRfdXNlcihEU1BfQklORF9GUk9OVCB8IERTUF9CSU5EX1NVUlIgfCAKKwkJcmV0ID0gcHV0X3VzZXIoRFNQX0JJTkRfRlJPTlQgfCBEU1BfQklORF9TVVJSIHwKIAkJCSAgICAgICBEU1BfQklORF9DRU5URVJfTEZFLCAgcCk7CiAJCWJyZWFrOwogCkBAIC0yNjcxLDEwICsyNjcxLDEwIEBACiAJCX0gZWxzZSB7CiAJCQlkbWFidWYtPnJlYWR5ID0gMDsKIAkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwgCisJCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfAogCQkJCQkJCSAgICAgIFNSQ19FTkFCTEUpOwogCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfU1BDX1BCIHwgCisJCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9TUENfUEIgfAogCQkJCQkJCSAgICAgIFNSQ19FTkFCTEUpOwogCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgfD0gbWFzazJhdHRyW2Zmcyh2YWwpXTsKIAkJfQpAQCAtMjcwMiw2ICsyNzAyLDcgQEAKIAlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZGV2czsKIAlzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSBOVUxMOwogCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLwogCS8qIFRPRE86IHRoZXJlJ3Mgc29tZSByZWR1bmRhY3kgaGVyZSB3cnQgdGhlIGNoZWNrIGJlbG93ICovCkBAIC0yNzY1LDggKzI3NjYsOCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3RhdGU7CiAKLQkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyAqLyAKLQkvKiBHdWlkZSAgL2Rldi9kc3Agc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCAqLyAKKwkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyAqLworCS8qIEd1aWRlICAvZGV2L2RzcCBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sICovCiAJLyogd2l0aCBzYW1wbGUgcmF0ZSA4a0h6IGFuZCAvZGV2L2RzcFcgd2lsbCBhY2NlcHQgMTYtYml0cyBzYW1wbGUgKi8KIAlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKIAkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX01BU0s7CkBAIC0yNzc5LDExICsyNzgwLDEzIEBACiAJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byBub3JtYWwgcGxheWJhY2sgKi8KIAkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gQ0hBTk5FTF9QQjsKIAkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAl9CiAKIAlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkvKiBGSVhNRTogVHJpZGVudCA0ZCBjYW4gb25seSByZWNvcmQgaW4gc2lnbmVkIDE2LWJpdHMgc3RlcmVvLCAqLyAKKwkJLyogRklYTUU6IFRyaWRlbnQgNGQgY2FuIG9ubHkgcmVjb3JkIGluIHNpZ25lZCAxNi1iaXRzIHN0ZXJlbywgKi8KIAkJLyogNDhrSHogc2FtcGxlLCB0byBiZSBkZWFsZWQgd2l0aCBpbiB0cmlkZW50X3NldF9hZGNfcmF0ZSgpID8/ICovCiAJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9NQVNLOwogCQlpZiAoKG1pbm9yICYgMHgwZikgPT0gU05EX0RFVl9EU1AxNikKQEAgLTI3OTQsMTAgKzI3OTcsMTIgQEAKIAkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKIAkJCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgYXR0cmlidXRlIHRvIDB4OGE4MCwgcmVjb3JkIGZyb20KIAkJCSAgIFBDTSBML1IgRklGTyBhbmQgbW9ubyA9IChsZWZ0ICsgcmlnaHQgKyAxKS8yICovCi0JCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8IFBDTV9MUiB8IAorCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCBQQ01fTFIgfAogCQkJCQkJICAgICAgTU9OT19NSVgpOwogCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCXRyaWRlbnRfc2V0X2FkY19yYXRlKHN0YXRlLCA4MDAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCiAJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLwogCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpCkBAIC0zMDIwLDcgKzMwMjUsNyBAQAogCQkJYnJlYWs7CiAJCWlmICh3c2VtYWJpdHMgPT0gMCkgewogCQkgICAgICB1bmxvY2s6Ci0JCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksIAorCQkJb3V0bCgoKHUzMikgKHdjb250cm9sICYgMHgxZWZmKSB8IDB4MDAwMDQwMDApLAogCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTMxMDQsNyArMzEwOSw3IEBACiAJbmNvdW50ID0gMTA7CiAKIAl3aGlsZSAoMSkgewotCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKSAKKwkJaWYgKChpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKSAmIEFMSV9BQzk3X0JVU1lfUkVBRCkKIAkJICAgICE9IDApCiAJCQlicmVhazsKIAkJaWYgKG5jb3VudCA8PSAwKQpAQCAtMzExMiw3ICszMTE3LDcgQEAKIAkJaWYgKG5jb3VudC0tID09IDEpIHsKIAkJCXByX2RlYnVnKCJhbGlfYWM5N19yZWFkIDp0cnkgY2xlYXIgYnVzeSBmbGFnXG4iKTsKIAkJCWF1ZF9yZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKLQkJCW91dGwoKGF1ZF9yZWcgJiAweGZmZmY3ZmZmKSwgCisJCQlvdXRsKChhdWRfcmVnICYgMHhmZmZmN2ZmZiksCiAJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CiAJCX0KIAkJdWRlbGF5KDEwKTsKQEAgLTMxNTksNyArMzE2NCw3IEBACiAKIAl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwogCXdjb250cm9sICY9IDB4ZmYwMDsKLQl3Y29udHJvbCB8PSAoMHg4MTAwIHwgcmVnKTsgLyogYml0IDg9MTogKGFsaTE1MzUgKXJlc2VydmVkLyAqLyAKKwl3Y29udHJvbCB8PSAoMHg4MTAwIHwgcmVnKTsgLyogYml0IDg9MTogKGFsaTE1MzUgKXJlc2VydmVkLyAqLwogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGkxNTM1KyB3cml0ZSAqLwogCW91dGwoKGRhdGEgfCB3Y29udHJvbCksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CiAKQEAgLTMxNzcsNyArMzE4Miw3IEBACiAJCQlicmVhazsKIAkJaWYgKG5jb3VudC0tID09IDEpIHsKIAkJCXByX2RlYnVnKCJhbGlfYWM5N19zZXQgOnRyeSBjbGVhciBidXN5IGZsYWchIVxuIik7Ci0JCQlvdXR3KHdjb250cm9sICYgMHg3ZmZmLCAKKwkJCW91dHcod2NvbnRyb2wgJiAweDdmZmYsCiAJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CiAJCX0KIAkJdWRlbGF5KDEwKTsKQEAgLTMzODIsNyArMzM4Nyw3IEBACiAJYnZhbCB8PSAweDFGOwogCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CiAKLQl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYgCisJd2hpbGUgKCgoUjEgPCAweDBCKSB8fCAoUjEgPiAweDBFKSkgJiYgKFIxICE9IDB4MTIpICYmCiAJICAgICAgIGNvdW50IDw9IDUwMDAwKSB7CiAJCWNvdW50Kys7CiAKQEAgLTM2NjksMTQgKzM2NzQsMTQgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCiAJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDJjXSA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwotCS8vYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDIwXSA9IGlubChUUklEX1JFRyhjYXJkLFQ0RF9TVEFSVF9BKSk7ICAgIAorCS8vYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDIwXSA9IGlubChUUklEX1JFRyhjYXJkLFQ0RF9TVEFSVF9BKSk7CiAJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDIxXSA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfU1RPUF9BKSk7CiAKIAkvL2Rpc2FibGUgYWxsIElSUSBiaXRzCiAJb3V0bChBTElfRElTQUJMRV9BTExfSVJRLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwogCiAJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCi0JCWFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSA9IGFsaV9hYzk3X3JlYWQoY2FyZC0+YWM5N19jb2RlY1swXSwgCisJCWFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSA9IGFsaV9hYzk3X3JlYWQoY2FyZC0+YWM5N19jb2RlY1swXSwKIAkJCQkJCQkgICAgaSAqIDIpOwogCiAJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7CkBAIC0zNjg4LDcgKzM2OTMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBTElfQ0hBTk5FTFM7IGkrKykgewogCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CiAJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCi0JCQlhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSA9IGlubChUUklEX1JFRyhjYXJkLCAKKwkJCWFsaV9yZWdpc3RlcnMuY2hhbm5lbF9yZWdzW2ldW2pdID0gaW5sKFRSSURfUkVHKGNhcmQsCiAJCQkJCQkJCQlqICogNCArIDB4ZTApKTsKIAl9CiAKQEAgLTM3MDcsMTggKzM3MTIsMTggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCiAJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCi0JCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIGkgKiAyLCAKKwkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgaSAqIDIsCiAJCQkgICAgICAgYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBTElfQ0hBTk5FTFM7IGkrKykgewogCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CiAJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCi0JCQlvdXRsKGFsaV9yZWdpc3RlcnMuY2hhbm5lbF9yZWdzW2ldW2pdLCAKKwkJCW91dGwoYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0sCiAJCQkgICAgIFRSSURfUkVHKGNhcmQsIGogKiA0ICsgMHhlMCkpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgewotCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkgfHwgCisJCWlmICgoaSAqIDQgPT0gVDREX01JU0NJTlQpIHx8IChpICogNCA9PSBUNERfU1RPUF9BKSB8fAogCQkgICAgKGkgKiA0ID09IFQ0RF9TVEFSVF9BKSkKIAkJCWNvbnRpbnVlOwogCQlvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbaV0sIFRSSURfUkVHKGNhcmQsIGkgKiA0KSk7CkBAIC0zNzYzLDcgKzM3NjgsNyBAQAogCiAJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwogCi0JaWYgKGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKSAmIAorCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJgogCSAgICAoQUxJX1NQRElGX09VVF9DSF9FTkFCTEUpKSB7CiAJCWlkeCA9IEFMSV9TUERJRl9PVVRfQ0hBTk5FTDsKIAkJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgaWR4KSkpIHsKQEAgLTM3NzQsNyArMzc3OSw3IEBACiAJCX0KIAl9CiAKLQlmb3IgKGlkeCA9IEFMSV9QQ01fT1VUX0NIQU5ORUxfRklSU1Q7IGlkeCA8PSBBTElfUENNX09VVF9DSEFOTkVMX0xBU1Q7IAorCWZvciAoaWR4ID0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9GSVJTVDsgaWR4IDw9IEFMSV9QQ01fT1VUX0NIQU5ORUxfTEFTVDsKIAkgICAgIGlkeCsrKSB7CiAJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CiAJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CkBAIC0zNzg1LDkgKzM3OTAsOSBAQAogCX0KIAogCS8qIG5vIG1vcmUgZnJlZSBjaGFubmVscyBhdmFsaWFibGUgKi8KLSNpZiAwIAorI2lmIDAKIAlwcmludGsoS0VSTl9FUlIgImFsaTogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7Ci0jZW5kaWYgLyogMCAqLyAKKyNlbmRpZiAvKiAwICovCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM4MTIsOSArMzgxNyw5IEBACiAJfQogCiAJLyogbm8gZnJlZSByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLwotI2lmIDAgCisjaWYgMAogCXByaW50ayhLRVJOX0VSUiAiYWxpOiBubyByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBCYW5rIEEuXG4iKTsKLSNlbmRpZiAvKiAwICovIAorI2VuZGlmIC8qIDAgKi8KIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzgzNywxNCArMzg0MiwxNCBAQAogCQlicmVhazsKIAl9CiAKLQkvKiBzZWxlY3Qgc3BkaWZfb3V0ICovIAorCS8qIHNlbGVjdCBzcGRpZl9vdXQgKi8KIAljaF9zdF9zZWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKSAmIEFMSV9TUERJRl9PVVRfQ0hfU1RBVFVTOwogCi0JY2hfc3Rfc2VsIHw9IDB4ODA7CS8qIHNlbGVjdCByaWdodCAqLyAKKwljaF9zdF9zZWwgfD0gMHg4MDsJLyogc2VsZWN0IHJpZ2h0ICovCiAJb3V0YihjaF9zdF9zZWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CiAJb3V0YihzdGF0dXNfcmF0ZSB8IDB4MjAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKIAotCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvKiBzZWxlY3QgbGVmdCAqLyAKKwljaF9zdF9zZWwgJj0gKH4weDgwKTsJLyogc2VsZWN0IGxlZnQgKi8KIAlvdXRiKGNoX3N0X3NlbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKIAlvdXR3KHN0YXR1c19yYXRlIHwgMHgxMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMikpOwogfQpAQCAtMzg4MSwxNCArMzg4NiwxNCBAQAogCX0KIH0KIAotLyogVXBkYXRpbmcgdGhlIHZhbHVlcyBvZiBjb3VudGVycyBvZiBvdGhlcl9zdGF0ZXMnIERNQXMgd2l0aG91dCBsb2NrIAorLyogVXBkYXRpbmcgdGhlIHZhbHVlcyBvZiBjb3VudGVycyBvZiBvdGhlcl9zdGF0ZXMnIERNQXMgd2l0aG91dCBsb2NrCiBwcm90ZWN0aW9uIGlzIG5vIGhhcm0gYmVjYXVzZSBhbGwgRE1BcyBvZiBtdWx0aS1jaGFubmVscyBhbmQgaW50ZXJydXB0CiBkZXBlbmQgb24gYSBtYXN0ZXIgc3RhdGUncyBETUEsIGFuZCBjaGFuZ2luZyB0aGUgY291bnRlcnMgb2YgdGhlIG1hc3Rlcgogc3RhdGUgRE1BIGlzIHByb3RlY3RlZCBieSBhIHNwaW5sb2NrLgogKi8KIHN0YXRpYyBpbnQKLWFsaV93cml0ZV81XzEoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCAKLQkgICAgICBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsIAorYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJICAgICAgaW50IGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgdW5zaWduZWQgaW50ICpjb3B5X2NvdW50LAogCSAgICAgIHVuc2lnbmVkIGludCAqc3RhdGVfY250KQogewogCkBAIC0zOTA0LDEwICszOTA5LDEwIEBACiAKIAlpZiAoKGkgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50KSA+IDApIHsKIAkJaWYgKGkgPT0gMSkgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJCWktLTsKIAkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKQEAgLTM5MTYsMTAgKzM5MjEsMTAgQEAKIAkJCWkgPSBpIC0gKHN0YXRlLT5jaGFuc19udW0gLSBvdGhlcl9kbWFfbnVtcyk7CiAJCWZvciAoOyAoaSA8IG90aGVyX2RtYV9udW1zKSAmJiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCk7IGkrKykgewogCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCQl9CiAJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPT0gMCkKQEAgLTM5MjgsMzkgKzM5MzMsMzkgQEAKIAlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewogCQlsb29wID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gKHN0YXRlLT5jaGFuc19udW0gKiBzYW1wbGVfcyk7CiAJCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwKIAkJCQkJICAgc2FtcGxlX3MgKiAyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zICogMiwgKmNvcHlfY291bnQpOwogCQkJKCpzdGF0ZV9jbnQpICs9IChzYW1wbGVfcyAqIDIpOwogCiAJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAKIAkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAogCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCiAJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCX0KIApAQCAtMzk2OSwxNSArMzk3NCwxNSBAQAogCiAJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCQkJKCpzdGF0ZV9jbnQpICs9IHNhbXBsZV9zOwogCiAJCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCQkJKCpzdGF0ZV9jbnQpICs9IHNhbXBsZV9zOwogCkBAIC0zOTg2LDEyICszOTkxLDEyIEBACiAJCQkJCWxvb3AgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50IC0gZGlmZjsKIAkJCQkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgewogCQkJCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmOwotCQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyAKLQkJCQkJCQkJICAgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsKKwkJCQkJCQkJICAgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCAKLQkJCQkJCQkgICAgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLAorCQkJCQkJCSAgICBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCQkJCX0KIAkJCQl9CkBAIC00MDQ4LDExICs0MDUzLDExIEBACiAJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfT1VUX0NIQU5ORUwpOwogCQlicmVhazsKIAljYXNlICcxJzoKLQkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8IAorCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwKIAkJCQkgICAgQUxJX1NQRElGX09VVF9QQ00pOwogCQlicmVhazsKIAljYXNlICcyJzoKLQkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8IAorCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwKIAkJCQkgICAgQUxJX1NQRElGX09VVF9OT05fUENNKTsKIAkJYnJlYWs7CiAJY2FzZSAnMyc6CkBAIC00MDc3LDcgKzQwODIsNyBAQAogCiAJZm9yIChjYXJkID0gZGV2czsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dCkKIAkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKLQkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYgCisJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmCiAJCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQogCQkJCWdvdG8gbWF0Y2g7CiAKQEAgLTQwOTEsNyArNDA5Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXRyaWRlbnRfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCAKK3RyaWRlbnRfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IChzdHJ1Y3QgYWM5N19jb2RlYyAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC00MTg1LDkgKzQxOTAsOSBAQAogCQkvKiBkaXNhYmxlIEFDOTcgR1BJTyBpbnRlcnJ1cHQgKi8KIAkJb3V0bCgweDAwLCBUUklEX1JFRyhjYXJkLCBTSV9BQzk3X0dQSU8pKTsKIAkJLyogd2hlbiBwb3dlciB1cCB0aGUgQUMgbGluayBpcyBpbiBjb2xkIHJlc2V0IG1vZGUgc28gc3RvcCBpdCAqLwotCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQgfCBTRUNPTkRBUllfSUQsIAorCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQgfCBTRUNPTkRBUllfSUQsCiAJCSAgICAgVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwotCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKi8gCisJCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAqLwogCQkvKiAoZXNwZWNpYWxseSB3aGVuIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29kZWMpICovCiAJCXVkZWxheSgyMDAwKTsKIAkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKQEAgLTQyMDcsOSArNDIxMiw5IEBACiAJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLwogCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOwogCQkvKiB3aGVuIHBvd2VyIHVwLCB0aGUgQUMgbGluayBpcyBpbiBjb2xkIHJlc2V0IG1vZGUsIHNvIHN0b3AgaXQgKi8KLQkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VULCAKKwkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VULAogCQkgICAgIFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKLQkJLyogaXQgdGFrZSBhIGxvbmcgdGltZSB0byByZWNvdmVyIGZyb20gYSBjb2xkIHJlc2V0IChlc3BlY2lhbGx5ICovIAorCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKGVzcGVjaWFsbHkgKi8KIAkJLyogd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLwogCQl1ZGVsYXkoMjAwMCk7CiAJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CkBAIC00MjIxLDcgKzQyMjYsNyBAQAogCQlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJLyogaW5pdGlhbGl6ZSBzb21lIGJhc2ljIGNvZGVjIGluZm9ybWF0aW9uLCBvdGhlciBmaWVsZHMgKi8gCisJCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzICovCiAJCS8qIHdpbGwgYmUgZmlsbGVkIGluIGFjOTdfcHJvYmVfY29kZWMgKi8KIAkJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CiAJCWNvZGVjLT5pZCA9IG51bV9hYzk3OwpAQCAtNDM1Miw4ICs0MzU3LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkZW50X3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkgeyB9CiAjZW5kaWYgLyogU1VQUE9SVF9KT1lTVElDSyAqLwogCi0vKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyICovIAotLyogbm93LCB0aGV5IGFyZSBkZWZlcmVkIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSAqLyAKKy8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgKi8KKy8qIG5vdywgdGhleSBhcmUgZGVmZXJlZCB1bnRpbCAiQUNDRVNTIiB0aW1lIChpbiBwcm9nX2RtYWJ1ZiBjYWxsZWQgYnkgKi8KIC8qIG9wZW4vcmVhZC93cml0ZS9pb2N0bC9tbWFwKSAqLwogc3RhdGljIGludCBfX2RldmluaXQKIHRyaWRlbnRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCkBAIC00Mzc2LDkgKzQzODEsOSBAQAogCWVsc2UKIAkJZG1hX21hc2sgPSBUUklERU5UX0RNQV9NQVNLOwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIGRtYV9tYXNrKSkgewotCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IiAKLQkJICAgICAgICIgJXMgUENJIGJ1c21hc3RlciBETUFcbiIsIAotCQkgICAgICAgcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgPyAKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIKKwkJICAgICAgICIgJXMgUENJIGJ1c21hc3RlciBETUFcbiIsCisJCSAgICAgICBwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSA/CiAJCSAgICAgICAiMzItYml0IiA6ICIzMC1iaXQiKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDQyMiw3ICs0NDI3LDcgQEAKIAogCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAidHJpZGVudDogJXMgZm91bmQgYXQgSU8gMHglMDRseCwgSVJRICVkXG4iLCAKKwlwcmludGsoS0VSTl9JTkZPICJ0cmlkZW50OiAlcyBmb3VuZCBhdCBJTyAweCUwNGx4LCBJUlEgJWRcbiIsCiAJICAgICAgIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQtPmlvYmFzZSwgY2FyZC0+aXJxKTsKIAogCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewpAQCAtNDQ0OSw5ICs0NDU0LDkgQEAKIAogCQkvKiBBZGQgSC9XIFZvbHVtZSBDb250cm9sIEJ5IE1hdHQgV3UgSnVsLiAwNiwgMjAwMSAqLwogCQljYXJkLT5od3ZvbGN0bCA9IDA7Ci0JCXBjaV9kZXZfbTE1MzMgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgCi0JCQkJCQlQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCAKLQkJCQkJCXBjaV9kZXZfbTE1MzMpOworCQlwY2lfZGV2X20xNTMzID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwKKwkJCQkJICAgICAgIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsCisJCQkJCSAgICAgICBwY2lfZGV2X20xNTMzKTsKIAkJcmMgPSAtRU5PREVWOwogCQlpZiAocGNpX2Rldl9tMTUzMyA9PSBOVUxMKQogCQkJZ290byBvdXRfcHJvY19mczsKQEAgLTQ0NjUsNiArNDQ3MCw4IEBACiAJCQliaXRzICY9IDB4YmY7CS8qY2xlYXIgYml0IDYgKi8KIAkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2X20xNTMzLCAweDdiLCBiaXRzKTsKIAkJfQorCQlwY2lfZGV2X3B1dChwY2lfZGV2X20xNTMzKTsKKwogCX0gZWxzZSBpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKIAkJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBjeWJlcl9hbGxvY19wY21fY2hhbm5lbDsKIAkJY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsID0gY3liZXJfYWxsb2NfcGNtX2NoYW5uZWw7CkBAIC00NDgyLDcgKzQ0ODksNyBAQAogCXJjID0gLUVOT0RFVjsKIAlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCAmdHJpZGVudF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCAKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLAogCQkgICAgICAgY2FyZC0+aXJxKTsKIAkJZ290byBvdXRfcHJvY19mczsKIAl9CkBAIC00NTMzLDcgKzQ1NDAsNyBAQAogCQkJCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6IFJ1bm5pbmcgb24gQWxwaGEgc3lzdGVtICIKIAkJCQkgICAgICAgInR5cGUgTmF1dGlsdXNcbiIpOwogCQkJCWFjOTdfZGF0YSA9IGFsaV9hYzk3X2dldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQkJCWFsaV9hYzk3X3NldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wsIAorCQkJCWFsaV9hYzk3X3NldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wsCiAJCQkJCSAgICAgYWM5N19kYXRhIHwgQUxJX0VBUERfUE9XRVJfRE9XTik7CiAJCQl9CiAJCX0KQEAgLTQ1NjYsNyArNDU3Myw3IEBACiAJZGV2cyA9IE5VTEw7CiBvdXRfcmVsZWFzZV9yZWdpb246CiAJcmVsZWFzZV9yZWdpb24oaW9iYXNlLCAyNTYpOwotCXJldHVybiByYzsgCisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQKQEAgLTQ2MzQsOCArNDY0MSw4IEBACiBzdGF0aWMgaW50IF9faW5pdAogdHJpZGVudF9pbml0X21vZHVsZSh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gIlRyaWRlbnQgNERXYXZlL1NpUyA3MDE4L0FMaSA1NDUxLFR2aWEgQ3liZXJQcm8gIiAKLQkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgCisJcHJpbnRrKEtFUk5fSU5GTyAiVHJpZGVudCA0RFdhdmUvU2lTIDcwMTgvQUxpIDU0NTEsVHZpYSBDeWJlclBybyAiCisJICAgICAgICI1MDUwIFBDSSBBdWRpbywgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiCiAJICAgICAgIF9fREFURV9fICJcbiIpOwogCiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRyaWRlbnRfcGNpX2RyaXZlcik7CmRpZmYgLS1naXQgYS91c3IvLmdpdGlnbm9yZSBiL3Vzci8uZ2l0aWdub3JlCmluZGV4IGJlMTg2YTguLjY5YjJlODkgMTAwNjQ0Ci0tLSBhL3Vzci8uZ2l0aWdub3JlCisrKyBiL3Vzci8uZ2l0aWdub3JlCkBAIC01LDMgKzUsNCBAQAogaW5pdHJhbWZzX2RhdGEuY3BpbwogaW5pdHJhbWZzX2RhdGEuY3Bpby5negogaW5pdHJhbWZzX2xpc3QKK2luY2x1ZGUK